@workflow/core 5.0.0-beta.51 → 5.0.0-beta.53

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/runtime.js CHANGED
@@ -33,7 +33,7 @@ import { dehydrateRunError } from './serialization.js';
33
33
  import { remapErrorStack } from './source-map.js';
34
34
  import * as Attribute from './telemetry/semantic-conventions.js';
35
35
  import { bindActiveTraceContext, buildInvocationSpanLinks, getNextTraceCarrier, getSpanKind, getWorkflowTraceMode, isUsableTraceCarrier, trace, withTraceContext, withWorkflowBaggage, } from './telemetry.js';
36
- import { getErrorName, getErrorStack, normalizeUnknownError } from './types.js';
36
+ import { formatErrorCauseChain, getErrorName, getErrorStack, normalizeUnknownError, } from './types.js';
37
37
  import { buildWorkflowSuspensionMessage } from './util.js';
38
38
  import { compileWorkflowBundle, replayWorkflow, resumeWorkflow, } from './workflow.js';
39
39
  export { WorkflowSuspension } from './global.js';
@@ -4092,12 +4092,21 @@ export function workflowEntrypoint(workflowCode, options) {
4092
4092
  workflowRunId: runId,
4093
4093
  errorCode,
4094
4094
  errorName,
4095
- // The console renderer drops `errorStack` on the
4096
- // assumption that the message body carries it, and
4097
- // this message has no body, so without this row the
4098
- // terminal error's text never reaches the console.
4095
+ // This message has no body, so the console
4096
+ // renderer promotes `errorStack` into one and
4097
+ // shows `errorMessage` on its own row when the
4098
+ // throw produced no stack to carry it.
4099
4099
  errorMessage,
4100
4100
  errorStack,
4101
+ // Neither of those reaches a wrapped error's
4102
+ // reason: `TypeError: fetch failed` carries an
4103
+ // empty message by design and a stack of pure
4104
+ // `node:internal/` frames, and the world layer's
4105
+ // own wrappers name the request that failed
4106
+ // rather than what failed about it. Undefined
4107
+ // when there is no cause, so the row disappears
4108
+ // for an ordinary user throw.
4109
+ errorCause: formatErrorCauseChain(terminalError) || undefined,
4101
4110
  });
4102
4111
  // Apply the source-map-remapped stack to the thrown
4103
4112
  // value so that the serialized error preserves it
@@ -4229,4 +4238,4 @@ export function workflowEntrypoint(workflowCode, options) {
4229
4238
  });
4230
4239
  });
4231
4240
  }
4232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUUzQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUVqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsbUNBQW1DLEVBQ25DLCtCQUErQixFQUMvQixtQ0FBbUMsRUFDbkMsNkJBQTZCLEVBQzdCLHdCQUF3QixFQUN4QixjQUFjLEVBQ2Qsb0JBQW9CLEdBQ3JCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUVMLHVCQUF1QixHQUV4QixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFFckIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLGtCQUFrQixFQUVsQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLDBCQUEwQixFQUMxQixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixZQUFZLEdBQ2IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHlCQUF5QixHQUMxQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFdBQVcsR0FFWixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsNEJBQTRCLEVBQzVCLHFCQUFxQixFQUNyQix5QkFBeUIsR0FDMUIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsZ0JBQWdCLEdBRWpCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQXNCLE1BQU0sb0JBQW9CLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxTQUFTLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGNBQWMsR0FHZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUdMLFdBQVcsR0FDWixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxjQUFjLEVBR2QsVUFBVSxFQUNWLGFBQWEsR0FDZCxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxNQUFNLEVBQ04sR0FBRyxHQUlKLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUlYLFVBQVUsRUFDVix1QkFBdUIsRUFDdkIsWUFBWSxFQUdaLFNBQVMsR0FDVixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFLTCxLQUFLLEdBQ04sTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLFFBQVEsR0FFVCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxXQUErQjtJQUNyRCxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3hDLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUMvQyxPQUFPLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsU0FBUyw4QkFBOEIsQ0FBQyxFQUN0QyxLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssRUFDTCxTQUFTLEdBTVY7SUFDQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsRUFBRSxXQUFXLENBQUM7SUFDakQsSUFBSSxDQUFDLGtCQUFrQjtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXRDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7SUFDcEQsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGtCQUFrQixLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDckUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQUssQ0FDYix5REFBeUQsa0JBQWtCLElBQUk7UUFDN0UsNENBQTRDLGtCQUFrQixLQUFLO1FBQ25FLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUscUVBQXFFO1FBQ3JFLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLG1FQUFtRTtRQUNuRSx3RUFBd0U7UUFDeEUsdUNBQXVDLGtCQUFrQixhQUFhO1FBQ3RFLFVBQVUsRUFDWjtRQUNFLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGtCQUFrQjtRQUNsQixrQkFBa0I7UUFDbEIsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFlBQVk7S0FDM0MsQ0FDRixDQUFDO0lBQ0YsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxLQUFLLFVBQVUsK0JBQStCLENBQUMsRUFDN0MsS0FBSyxFQUNMLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxHQU1WO0lBQ0MsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLEVBQUUsWUFBWSxDQUFDO0lBQ2xELElBQUksQ0FBQyxrQkFBa0I7UUFBRSxPQUFPO0lBRWhDLElBQUksbUJBQXVDLENBQUM7SUFDNUMsSUFBSSxDQUFDO1FBQ0gsbUJBQW1CLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDBFQUEwRTtRQUMxRSx1REFBdUQ7UUFDdkQsT0FBTztJQUNULENBQUM7SUFDRCxJQUFJLENBQUMsbUJBQW1CLElBQUksbUJBQW1CLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUN2RSxPQUFPO0lBQ1QsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFLLENBQ2Isb0VBQW9FO1FBQ2xFLGdFQUFnRTtRQUNoRSx1RUFBdUU7UUFDdkUsb0VBQW9FO1FBQ3BFLHdFQUF3RTtRQUN4RSxlQUFlLEVBQ2pCO1FBQ0UsYUFBYSxFQUFFLEtBQUs7UUFDcEIsa0JBQWtCO1FBQ2xCLG1CQUFtQjtLQUNwQixDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxHQUFZO0lBQzdDLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxlQUFlLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxlQUFlLENBQUMsb0JBQW9CLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZO0lBQ3RDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNqRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsRUFDakMsS0FBSyxFQUNMLFdBQVcsRUFDWCxLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxTQUFTLEVBQ1QsVUFBVSxHQVNYO0lBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDOUIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsU0FBUztRQUNULEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0tBQ3hELENBQUMsQ0FBQztJQUVILElBQUksQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFdBQVcsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUMzRSxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUN2QixLQUFLLEVBQ0w7WUFDRSxTQUFTLEVBQUUsWUFBWTtZQUN2QixXQUFXLEVBQUUsb0JBQW9CO1lBQ2pDLFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FDNUIsR0FBRyxFQUNILEtBQUssRUFDTCxNQUFNLGdCQUFnQixFQUFFLEVBQ3hCLFVBQVUsRUFDVixDQUFDLFdBQVcsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDLElBQUksaUNBQWlDLENBQ3JFO2dCQUNELFNBQVM7YUFDVjtTQUNGLEVBQ0QsRUFBRSxTQUFTLEVBQUUsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sT0FBTyxFQUFFLENBQUM7UUFDakIsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ25FLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xDLGFBQWEsQ0FBQyxLQUFLLENBQ2pCLDZEQUE2RCxFQUM3RDtnQkFDRSxhQUFhLEVBQUUsS0FBSztnQkFDcEIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxvQkFBb0I7Z0JBQy9DLEtBQUssRUFBRSxPQUFPLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ3BFLENBQ0YsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxPQUFPLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDRCQUE0QixDQUNuQyxNQUFlLEVBQ2YsS0FBYTtJQUViLHlFQUF5RTtJQUN6RSxnRUFBZ0U7SUFDaEUsMkVBQTJFO0lBQzNFLDZCQUE2QjtJQUM3QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQ2hCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUs7UUFDakIsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLGVBQWU7WUFDOUIsQ0FBQyxDQUFDLFNBQVMsS0FBSyxZQUFZO1lBQzVCLENBQUMsQ0FBQyxTQUFTLEtBQUssZUFBZSxDQUFDLENBQ3JDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FBQyxNQUFlLEVBQUUsS0FBYTtJQUNqRSxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVyRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO1FBQ3pELGFBQWEsRUFBRSxLQUFLO1FBQ3BCLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTO1FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPO0tBQ2xDLENBQUMsQ0FBQztJQUNILE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELG1EQUFtRDtBQUNuRCxTQUFTLGVBQWUsQ0FBQyxHQUFxQixFQUFFLE9BQW9CO0lBQ2xFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxNQUFlO0lBSTNDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNoQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLFFBQVEsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLEtBQUssY0FBYztnQkFDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFDUixLQUFLLGVBQWU7Z0JBQ2xCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNO1lBQ1IsS0FBSyxjQUFjO2dCQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDL0IsTUFBTTtZQUNSLEtBQUssZ0JBQWdCO2dCQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBWUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILFNBQVMsb0JBQW9CLENBQUMsRUFDNUIsVUFBVSxFQUNWLHlCQUF5QixFQUN6QixnQkFBZ0IsR0FBRyxLQUFLLEdBV3pCO0lBQ0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztRQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELElBQUkseUJBQXlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTSxFQUFFLHNDQUFzQztTQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsQ0FBQztBQUVELE1BQU0sc0NBQXNDLEdBQUcsR0FBRyxDQUFDO0FBRW5ELCtFQUErRTtBQUMvRSxTQUFTLCtCQUErQixDQUN0QyxRQUEwQyxFQUMxQyxLQUFhO0lBRWIsT0FBTztRQUNMLHlCQUF5QixFQUFFLEtBQUs7UUFDaEMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FDakMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE1BQU07WUFDTixhQUFhO1lBQ2IsSUFBSTtZQUNKLE1BQU0sRUFDSixNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxzQ0FBc0M7Z0JBQzlELENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNDQUFzQyxDQUFDLEdBQUc7Z0JBQy9ELENBQUMsQ0FBQyxNQUFNO1NBQ2IsQ0FBQyxDQUNIO1FBQ0QsOEJBQThCLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNO0tBQ3hELENBQUM7QUFDSixDQUFDO0FBT0QsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFtQjtJQUMzQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTztRQUNMLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtRQUNsQixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDbkIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUNuQyxLQUFZLEVBQ1osbUJBQTJCO0lBRTNCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7SUFDMUQsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztJQUMzRCxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ25FLElBQUksYUFBYSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBRUQsSUFBSSxhQUFhLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxZQUFvQixFQUNwQixPQUlDO0lBRUQsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFbEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxhQUE0QixFQUFFLEVBQUUsQ0FDL0MsYUFBYSxDQUFDLGtCQUFrQixDQUM5QixjQUFjLEVBQ2QsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUMzQixvRUFBb0U7UUFDcEUscUVBQXFFO1FBQ3JFLCtEQUErRDtRQUMvRCw4REFBOEQ7UUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEMsMENBQTBDO1FBQzFDLHlGQUF5RjtRQUN6RixrRkFBa0Y7UUFDbEYsb0ZBQW9GO1FBQ3BGLE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSx3QkFBd0IsQ0FDNUIsV0FBVyxFQUNYLGFBQWEsQ0FBQyxXQUFXLENBQzFCLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sRUFDSixLQUFLLEVBQ0wsWUFBWSxFQUFFLG9CQUFvQixFQUNsQyxXQUFXLEVBQ1gsTUFBTSxFQUFFLGNBQWMsRUFDdEIsUUFBUSxFQUFFLGdCQUFnQixFQUMxQixnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLDRCQUE0QixFQUM1QixRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVoRCxnRUFBZ0U7UUFDaEUscUVBQXFFO1FBQ3JFLHFFQUFxRTtRQUNyRSxtRUFBbUU7UUFDbkUsRUFBRTtRQUNGLG9DQUFvQztRQUNwQyxxRUFBcUU7UUFDckUsc0RBQXNEO1FBQ3RELG1FQUFtRTtRQUNuRSxtRUFBbUU7UUFDbkUsa0RBQWtEO1FBQ2xELElBQUksY0FBYyxHQUFHLHlCQUF5QixDQUM1QyxnQkFBZ0IsRUFDaEIsY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQ3ZELENBQUM7UUFDRixJQUFJLGNBQWMsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkQsY0FBYyxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBQzFELENBQUM7UUFDRCxJQUNFLGNBQWM7WUFDZCxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEVBQ3BELENBQUM7WUFDRCxtRUFBbUU7WUFDbkUseURBQXlEO1lBQ3pELGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQztRQUNELGlEQUFpRDtRQUNqRCxzRUFBc0U7UUFDdEUsaUVBQWlFO1FBQ2pFLG9FQUFvRTtRQUNwRSxxQ0FBcUM7UUFDckMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7WUFDN0QsQ0FBQyxDQUFDLG9CQUFvQjtZQUN0QixDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUMvQixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsNkJBQTZCO1FBQzdCLDhEQUE4RDtRQUM5RCw0RUFBNEU7UUFDNUUsbUVBQW1FO1FBQ25FLGdFQUFnRTtRQUNoRSxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUU1RCxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixFQUFFLENBQUM7UUFDbkQsSUFBSSxRQUFRLENBQUMsT0FBTyxHQUFHLGtCQUFrQixFQUFFLENBQUM7WUFDMUMsTUFBTSx3QkFBd0IsR0FBRyxhQUFhLENBQzVDLFNBQVMsRUFDVCxlQUFlLENBQUMsdUJBQXVCLENBQ3hDLENBQUM7WUFDRixTQUFTLENBQUMsS0FBSyxDQUNiLDZDQUE2QyxRQUFRLENBQUMsT0FBTyxJQUFJLGtCQUFrQixHQUFHLEVBQ3RGO2dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDekIsU0FBUyxFQUFFLHdCQUF3QixDQUFDLFNBQVM7Z0JBQzdDLGdCQUFnQixFQUFFLHdCQUF3QixDQUFDLFdBQVc7YUFDdkQsQ0FDRixDQUFDO1lBQ0YsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FDeEIsK0NBQStDLFFBQVEsQ0FBQyxPQUFPLElBQUksa0JBQWtCLEdBQUcsQ0FDekYsQ0FBQztnQkFDRixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUN2QixLQUFLLEVBQ0w7b0JBQ0UsU0FBUyxFQUFFLFlBQVk7b0JBQ3ZCLFdBQVcsRUFBRSxvQkFBb0I7b0JBQ2pDLFNBQVMsRUFBRTt3QkFDVCxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FDNUIsR0FBRyxFQUNILEtBQUssRUFDTCxNQUFNLGdCQUFnQixFQUFFLENBQ3pCO3dCQUNELFNBQVMsRUFBRSxlQUFlLENBQUMsdUJBQXVCO3FCQUNuRDtpQkFDRixFQUNELEVBQUUsU0FBUyxFQUFFLENBQ2QsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0QscURBQXFEO29CQUNyRCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsU0FBUyxDQUFDLEtBQUssQ0FDYixzQ0FBc0MsUUFBUSxDQUFDLE9BQU8sc0JBQXNCO29CQUMxRSxrRUFBa0U7b0JBQ2xFLG9FQUFvRTtvQkFDcEUseUVBQXlFO29CQUN6RSwrRUFBK0UsRUFDakY7b0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO29CQUN6QixTQUFTLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYztvQkFDM0QsWUFBWSxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7b0JBQzlELFVBQVUsRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUN6RCxDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsb0VBQW9FO1FBQ3BFLGdFQUFnRTtRQUNoRSxvRUFBb0U7UUFDcEUsaUVBQWlFO1FBQ2pFLG9FQUFvRTtRQUNwRSxpRUFBaUU7UUFDakUsMkNBQTJDO1FBQzNDLHVFQUF1RTtRQUN2RSxpREFBaUQ7UUFDakQsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztRQUV6QyxnRUFBZ0U7UUFDaEUsK0RBQStEO1FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsR0FBb0MsRUFBRSxDQUM3RCxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFL0MsbUVBQW1FO1FBQ25FLGlEQUFpRDtRQUNqRCxNQUFNLFNBQVMsR0FBRyxNQUFNLHdCQUF3QixDQUM5QyxTQUFTLEVBQ1QsWUFBWSxDQUNiLENBQUM7UUFFRix3RUFBd0U7UUFDeEUsc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXhDLCtEQUErRDtRQUMvRCxxREFBcUQ7UUFDckQscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSw2Q0FBNkM7UUFDN0MsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDeEQsMERBQTBEO1FBQzFELHFDQUFxQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxPQUFPLE1BQU0sZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDM0QsT0FBTyxNQUFNLG1CQUFtQixDQUM5QixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQ3RDLEtBQUssSUFBSSxFQUFFO2dCQUNULE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQy9ELFFBQVEsRUFBRSxDQUNYLENBQUM7Z0JBQ0YsZ0VBQWdFO2dCQUNoRSxrRUFBa0U7Z0JBQ2xFLHVEQUF1RDtnQkFDdkQsRUFBRTtnQkFDRixrRUFBa0U7Z0JBQ2xFLCtEQUErRDtnQkFDL0QsOERBQThEO2dCQUM5RCxpRUFBaUU7Z0JBQ2pFLDZEQUE2RDtnQkFDN0QsZ0VBQWdFO2dCQUNoRSxJQUNFLDhCQUE4QixDQUFDO29CQUM3QixLQUFLO29CQUNMLFFBQVE7b0JBQ1IsS0FBSztvQkFDTCxTQUFTO2lCQUNWLENBQUMsRUFDRixDQUFDO29CQUNELE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxnRUFBZ0U7Z0JBQ2hFLDJCQUEyQjtnQkFDM0IsTUFBTSwrQkFBK0IsQ0FBQztvQkFDcEMsS0FBSztvQkFDTCxRQUFRO29CQUNSLEtBQUs7b0JBQ0wsU0FBUztpQkFDVixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxLQUFLLENBQ1Ysb0JBQW9CLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQ3ZELEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQ3BDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDYixJQUFJLEVBQUUsYUFBYSxDQUFDO3dCQUNsQixHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO3dCQUN2QyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7d0JBQzVDLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7d0JBQzVDLEdBQUcsU0FBUyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7d0JBQ3pELEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7d0JBQ25ELEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQzt3QkFDOUMsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO3dCQUNwQyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO3dCQUNqQyxHQUFHLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO3dCQUNwRCxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7cUJBQzFDLENBQUMsQ0FBQztvQkFFSCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLHNCQUFzQixDQUN4RCxLQUFLLEVBQ0wsbUJBQW1CLENBQ3BCLENBQUM7b0JBQ0YsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO29CQUN0QixNQUFNLHNCQUFzQixHQUFHLGdCQUFnQjt3QkFDN0MsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO3dCQUNwRCxDQUFDLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ25DLDZEQUE2RDtvQkFDN0QsOERBQThEO29CQUM5RCwyREFBMkQ7b0JBQzNELHFEQUFxRDtvQkFDckQsaURBQWlEO29CQUNqRCxJQUFJLHVCQUVTLENBQUM7b0JBQ2QsSUFBSSxvQkFBd0MsQ0FBQztvQkFDN0MsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLHNCQUFzQixDQUN2RCxDQUNFLFFBR0MsRUFDRCxFQUFFO3dCQUNGLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQzs0QkFBRSxPQUFPO3dCQUNoRCxJQUFJLG9CQUFvQixLQUFLLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDbkQsb0JBQW9CLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQzs0QkFDN0MsdUJBQXVCLEdBQUcscUJBQXFCLENBQzdDLFlBQVksRUFDWixRQUFRLENBQUMsWUFBWSxDQUN0QixDQUFDOzRCQUNGLHlEQUF5RDs0QkFDekQsS0FBSyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLENBQUM7d0JBQ0QsT0FBTyx1QkFBdUIsQ0FBQztvQkFDakMsQ0FBQyxDQUNGLENBQUM7b0JBQ0YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDOUIsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUNyRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzVCLE9BQU8sTUFBTSxDQUFDO29CQUNoQixDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLGtCQUFrRCxDQUFDO29CQUN2RCxNQUFNLHVCQUF1QixHQUFHLENBQzlCLFFBQWdELEVBQ2hELEVBQUU7d0JBQ0YsSUFBSSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDOzRCQUFFLE9BQU87d0JBQ2hELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOzRCQUN4QixrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUN6QyxhQUFhLENBQUMsS0FBSyxDQUNwQixDQUFDO3dCQUNKLENBQUM7d0JBQ0QsT0FBTyxrQkFBa0IsQ0FBQztvQkFDNUIsQ0FBQyxDQUFDO29CQUNGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUFZLEVBQVEsRUFBRTt3QkFDaEQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLGFBQWEsRUFBRSxDQUFDOzRCQUN0Qyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ3pDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDeEMsQ0FBQzt3QkFDRCxrQkFBa0IsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFDLENBQUMsQ0FBQztvQkFDRiw0REFBNEQ7b0JBQzVELHlEQUF5RDtvQkFDekQsdUJBQXVCO29CQUN2QixNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQ3ZCLElBQU8sRUFDUCxNQUEwQixFQUMxQixFQUFFO3dCQUNGLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDckQsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLFlBQVksRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7d0JBQ3RELE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsZUFBZSxDQUN6RCxXQUFXLEtBQUssU0FBUzs0QkFDdkIsQ0FBQyxDQUFDLFlBQVk7NEJBQ2QsQ0FBQyxDQUFDLEVBQUUsR0FBRyxZQUFZLEVBQUUsV0FBVyxFQUFFLEVBQ3BDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUMzQyxDQUFDO3dCQUNGLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDOzRCQUM5QixpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7d0JBQ3pDLENBQUM7d0JBQ0QsT0FBTyxNQUFNLENBQUM7b0JBQ2hCLENBQUMsQ0FBQztvQkFFRixNQUFNLGVBQWUsR0FBRyxDQUN0QixNQUEwQyxFQUMxQyxJQUVlLEVBQ0gsRUFBRSxDQUNkLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7d0JBQy9DLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQzt3QkFDcEIsUUFBUSxFQUFFLGFBQWEsQ0FBQzs0QkFDdEIsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQzs0QkFDakMsR0FBRyxTQUFTLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDO3lCQUM5QyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDOzRCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0NBQ2xDLFdBQVcsRUFBRSxDQUFDO2dDQUNkLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUM1QixDQUFDLENBQUMsQ0FBQzs0QkFDSCxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksV0FBVyxDQUFDOzRCQUNuRCxPQUFPLE1BQU0sQ0FBQzt3QkFDaEIsQ0FBQztnQ0FBUyxDQUFDOzRCQUNULFFBQVEsRUFBRSxhQUFhLENBQ3JCLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FDM0MsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUVMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBa0JHO29CQUNILE1BQU0sWUFBWSxHQUFHLEdBQXVCLEVBQUUsQ0FDNUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTO3dCQUN6QixDQUFDLENBQUMsRUFBRTt3QkFDSixDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUUxQzs7Ozs7Ozs7Ozs7O3VCQVlHO29CQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FDekIsSUFBd0IsRUFDeEIsTUFBcUMsRUFDakIsRUFBRTt3QkFDdEIsSUFDRSxLQUFLOzRCQUNMLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTzs0QkFDekIsTUFBTSxFQUFFLFdBQVcsS0FBSyxTQUFTOzRCQUNqQyxNQUFNLEVBQUUsYUFBYSxLQUFLLElBQUk7NEJBQzlCLHNCQUFzQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDdEMsQ0FBQzs0QkFDRCxPQUFPLFNBQVMsQ0FBQzt3QkFDbkIsQ0FBQzt3QkFDRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDO29CQUN0QyxDQUFDLENBQUM7b0JBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBa0NHO29CQUNILE1BQU0saUJBQWlCLEdBQUcsQ0FDeEIsVUFBa0IsRUFDbEIsTUFBbUIsRUFDYixFQUFFO3dCQUNSLElBQ0UsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPOzRCQUN6QixRQUFRLENBQUMsTUFBTSxLQUFLLFVBQVU7NEJBQzlCLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUzs0QkFDM0IsTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQ3ZCLENBQUM7NEJBQ0QsT0FBTzt3QkFDVCxDQUFDO3dCQUNELGNBQWMsQ0FBQyxRQUFRLEVBQUU7NEJBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTs0QkFDckIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO3lCQUN0QixDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDO29CQUVGLDJEQUEyRDtvQkFDM0Qsa0NBQWtDO29CQUNsQyxJQUFJLFFBQVEsR0FBbUIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7b0JBRW5ELHVEQUF1RDtvQkFDdkQsa0NBQWtDO29CQUNsQyxJQUFJLFdBQW9DLENBQUM7b0JBQ3pDLDZEQUE2RDtvQkFDN0QsK0RBQStEO29CQUMvRCxJQUFJLGNBQWtDLENBQUM7b0JBQ3ZDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBRTNCLCtEQUErRDtvQkFDL0QsMkRBQTJEO29CQUMzRCw0REFBNEQ7b0JBQzVELDBEQUEwRDtvQkFDMUQseURBQXlEO29CQUN6RCwwREFBMEQ7b0JBQzFELHNEQUFzRDtvQkFDdEQsSUFBSSxzQkFBMkMsQ0FBQztvQkFDaEQsMERBQTBEO29CQUMxRCx1REFBdUQ7b0JBQ3ZELHlEQUF5RDtvQkFDekQsdURBQXVEO29CQUN2RCxzREFBc0Q7b0JBQ3RELHdEQUF3RDtvQkFDeEQsb0NBQW9DO29CQUNwQyxJQUFJLHNCQUEwQyxDQUFDO29CQUMvQyw0REFBNEQ7b0JBQzVELDJEQUEyRDtvQkFDM0QseURBQXlEO29CQUN6RCw0REFBNEQ7b0JBQzVELHFEQUFxRDtvQkFDckQsNERBQTREO29CQUM1RCw0REFBNEQ7b0JBQzVELElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO29CQUMxQix3REFBd0Q7b0JBQ3hELHVEQUF1RDtvQkFDdkQseURBQXlEO29CQUN6RCx5REFBeUQ7b0JBQ3pELDZEQUE2RDtvQkFDN0QsZ0RBQWdEO29CQUNoRCxJQUFJLDJCQUErQyxDQUFDO29CQUVwRCx3REFBd0Q7b0JBQ3hELDZEQUE2RDtvQkFDN0QsOERBQThEO29CQUM5RCwyREFBMkQ7b0JBQzNELDREQUE0RDtvQkFDNUQsOERBQThEO29CQUM5RCx3REFBd0Q7b0JBQ3hELDBEQUEwRDtvQkFDMUQsNERBQTREO29CQUM1RCw2REFBNkQ7b0JBQzdELDREQUE0RDtvQkFDNUQsOERBQThEO29CQUM5RCx5REFBeUQ7b0JBQ3pELDJEQUEyRDtvQkFDM0QsZ0RBQWdEO29CQUNoRCwwREFBMEQ7b0JBQzFELHNEQUFzRDtvQkFDdEQsMkRBQTJEO29CQUMzRCx3REFBd0Q7b0JBQ3hELHlEQUF5RDtvQkFDekQsNERBQTREO29CQUM1RCwrQ0FBK0M7b0JBQy9DLHdEQUF3RDtvQkFDeEQsMkRBQTJEO29CQUMzRCwyREFBMkQ7b0JBQzNELGdEQUFnRDtvQkFDaEQsTUFBTSxLQUFLLEdBQ1QsY0FBYyxFQUFFO3dCQUNoQixRQUFRLEtBQUssU0FBUzt3QkFDdEIsUUFBUSxDQUFDLE9BQU8sS0FBSyxDQUFDO3dCQUN0QixjQUFjLEtBQUssU0FBUzt3QkFDNUIsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDcEIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBRXBELGtEQUFrRDtvQkFDbEQsK0RBQStEO29CQUMvRCw2REFBNkQ7b0JBQzdELDZEQUE2RDtvQkFDN0Qsa0RBQWtEO29CQUNsRCxJQUFJLGVBQTZDLENBQUM7b0JBRWxELGdFQUFnRTtvQkFDaEUsOERBQThEO29CQUM5RCw0REFBNEQ7b0JBQzVELDREQUE0RDtvQkFDNUQsZ0VBQWdFO29CQUNoRSxpRUFBaUU7b0JBQ2pFLG1DQUFtQztvQkFDbkMsTUFBTSxhQUFhLEdBQUcsS0FBSyxJQUFtQixFQUFFO3dCQUM5QyxJQUFJLGVBQWUsRUFBRSxDQUFDOzRCQUNwQixJQUFJLENBQUM7Z0NBQ0gsTUFBTSxlQUFlLENBQUM7NEJBQ3hCLENBQUM7NEJBQUMsTUFBTSxDQUFDO2dDQUNQLGlEQUFpRDs0QkFDbkQsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUMsQ0FBQztvQkFFRixNQUFNLDBCQUEwQixHQUFHLEtBQUssRUFDdEMsR0FBWSxFQUNNLEVBQUU7d0JBQ3BCLE1BQU0sU0FBUyxHQUFHLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsU0FBUzs0QkFBRSxPQUFPLEtBQUssQ0FBQzt3QkFDN0IsTUFBTSxtQkFBbUIsQ0FBQzs0QkFDeEIsS0FBSzs0QkFDTCxXQUFXOzRCQUNYLEtBQUs7NEJBQ0wsU0FBUzs0QkFDVCxHQUFHOzRCQUNILFNBQVM7NEJBQ1QsVUFBVSxFQUFFLDJDQUEyQzt5QkFDeEQsQ0FBQyxDQUFDO3dCQUNILE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUMsQ0FBQztvQkFFRix5REFBeUQ7b0JBQ3pELDZEQUE2RDtvQkFDN0QsMkRBQTJEO29CQUMzRCwwREFBMEQ7b0JBQzFELDZEQUE2RDtvQkFDN0QsMkRBQTJEO29CQUMzRCwwREFBMEQ7b0JBQzFELHlEQUF5RDtvQkFDekQsOERBQThEO29CQUM5RCwyREFBMkQ7b0JBQzNELDZEQUE2RDtvQkFDN0QsNERBQTREO29CQUM1RCwrREFBK0Q7b0JBQy9ELG9DQUFvQztvQkFDcEMsdURBQXVEO29CQUN2RCwyREFBMkQ7b0JBQzNELDREQUE0RDtvQkFDNUQsMERBQTBEO29CQUMxRCw0REFBNEQ7b0JBQzVELDJEQUEyRDtvQkFDM0QsMERBQTBEO29CQUMxRCw0REFBNEQ7b0JBQzVELDBEQUEwRDtvQkFDMUQsMERBQTBEO29CQUMxRCxzREFBc0Q7b0JBQ3RELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztvQkFDN0MsTUFBTSwwQkFBMEIsR0FBRyxDQUNqQyxPQUFlLEVBQ1QsRUFBRTt3QkFDUixJQUFJLGtCQUFrQixDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDaEMsYUFBYSxDQUFDLEtBQUssQ0FDakIsMElBQTBJLEVBQzFJO2dDQUNFLGFBQWEsRUFBRSxLQUFLO2dDQUNwQixPQUFPO2dDQUNQLE9BQU8sRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7NkJBQ2pDLENBQ0YsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUMsQ0FBQztvQkFFRiw0REFBNEQ7b0JBQzVELDREQUE0RDtvQkFDNUQsaURBQWlEO29CQUNqRCwyREFBMkQ7b0JBQzNELE1BQU0sYUFBYSxHQUNqQixLQUFLLElBQW9DLEVBQUUsQ0FBQyxDQUFDO3dCQUMzQyxLQUFLO3dCQUNMLFlBQVksRUFBRSxNQUFNLGdCQUFnQixFQUFFO3dCQUN0QyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7cUJBQ3hCLENBQUMsQ0FBQztvQkFFTCxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQ3BCLFlBQW9CO29CQUNwQjs7Ozs7Ozt1QkFPRztvQkFDSCxZQUE2QyxFQUNJLEVBQUU7d0JBQ25ELDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN2QyxJQUFJLENBQUMsS0FBSzs0QkFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxDQUFDO3dCQUNwRCxNQUFNLFlBQVksQ0FDaEIsS0FBSyxFQUNMLG9CQUFvQixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsRUFDN0MsRUFBRSxHQUFHLENBQUMsTUFBTSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLEVBQy9DLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDaEQsQ0FBQzt3QkFDRixPQUFPLFNBQVMsQ0FBQztvQkFDbkIsQ0FBQyxDQUFDO29CQUVGLDhEQUE4RDtvQkFDOUQsMERBQTBEO29CQUMxRCxJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztvQkFDN0I7Ozs7Ozs7Ozs7dUJBVUc7b0JBQ0gsSUFBSSwyQkFBMkIsR0FLcEIsSUFBSSxDQUFDO29CQUNoQjs7Ozs7Ozs7Ozt1QkFVRztvQkFDSCxNQUFNLCtCQUErQixHQUFHLENBQ3RDLE1BQWUsRUFDVCxFQUFFO3dCQUNSLE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDO3dCQUM3QyxJQUFJLENBQUMsUUFBUTs0QkFBRSxPQUFPO3dCQUN0QiwyQkFBMkIsR0FBRyxJQUFJLENBQUM7d0JBRW5DLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQ3JDLENBQUM7d0JBQ0YsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3pELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUMzRCxNQUFNLE9BQU8sR0FDWCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO3dCQUU1RCxhQUFhLENBQUMsSUFBSSxDQUNoQiwwRUFBMEUsRUFDMUU7NEJBQ0UsYUFBYSxFQUFFLEtBQUs7NEJBQ3BCLE9BQU87NEJBQ1AsS0FBSzs0QkFDTCxPQUFPOzRCQUNQLFlBQVksRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUk7NEJBQy9CLFdBQVcsRUFBRSxXQUFXLENBQUMsSUFBSTs0QkFDN0Isb0JBQW9CLEVBQUUsUUFBUSxDQUFDLE9BQU87NEJBQ3RDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTs0QkFDdkIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNOzRCQUN2QixhQUFhO3lCQUNkLENBQ0YsQ0FBQztvQkFDSixDQUFDLENBQUM7b0JBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBZ0JHO29CQUNILE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsTUFBYyxFQUNkLEtBQWU7b0JBQ2Y7Ozs7Ozs7O3VCQVFHO29CQUNILEVBQUUsVUFBVSxHQUFHLElBQUksS0FBK0IsRUFBRSxFQUMzQyxFQUFFO3dCQUNYLElBQ0Usb0JBQW9COzRCQUNwQixtQ0FBbUMsRUFBRSxFQUNyQyxDQUFDOzRCQUNELE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUM7d0JBQ0Qsb0JBQW9CLEVBQUUsQ0FBQzt3QkFDdkIsMERBQTBEO3dCQUMxRCwwREFBMEQ7d0JBQzFELHVEQUF1RDt3QkFDdkQscURBQXFEO3dCQUNyRCwwREFBMEQ7d0JBQzFELHFEQUFxRDt3QkFDckQsK0NBQStDO3dCQUMvQyxlQUFlLEdBQUcsSUFBSSxDQUFDO3dCQUN2Qiw0REFBNEQ7d0JBQzVELDZEQUE2RDt3QkFDN0QscURBQXFEO3dCQUNyRCwyREFBMkQ7d0JBQzNELDBEQUEwRDt3QkFDMUQsNERBQTREO3dCQUM1RCxNQUFNLEtBQUssR0FDVCxVQUFVLElBQUksb0JBQW9CLEtBQUssQ0FBQzs0QkFDdEMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7NEJBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQ1gsMkRBQTJEO3dCQUMzRCx5REFBeUQ7d0JBQ3pELE1BQU0sU0FBUyxHQUNiLEtBQUssS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7d0JBQ2hELHdEQUF3RDt3QkFDeEQsNERBQTREO3dCQUM1RCwyQkFBMkI7NEJBQ3pCLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUztnQ0FDekIsQ0FBQyxDQUFDO29DQUNFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FDVixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUM5QztvQ0FDRCxPQUFPLEVBQUUsb0JBQW9CO29DQUM3QixNQUFNO29DQUNOLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYTtpQ0FDbkQ7Z0NBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDWCxJQUFJLEtBQUssSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDOzRCQUN6QyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUNoQyxRQUFRLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7d0JBQzVDLENBQUM7NkJBQU0sQ0FBQzs0QkFDTix1REFBdUQ7NEJBQ3ZELHVEQUF1RDs0QkFDdkQsd0RBQXdEOzRCQUN4RCxvREFBb0Q7NEJBQ3BELGlEQUFpRDs0QkFDakQsbURBQW1EOzRCQUNuRCxjQUFjOzRCQUNkLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs0QkFDL0Isa0JBQWtCLEVBQUUsU0FBUyxFQUFFLENBQUM7d0JBQ2xDLENBQUM7d0JBQ0QsYUFBYSxDQUFDLElBQUksQ0FDaEIsZ0VBQWdFLEVBQ2hFOzRCQUNFLGFBQWEsRUFBRSxLQUFLOzRCQUNwQixNQUFNOzRCQUNOLGFBQWE7NEJBQ2Isb0JBQW9COzRCQUNwQixNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWE7eUJBQ25ELENBQ0YsQ0FBQzt3QkFDRixJQUFJLEVBQUUsYUFBYSxDQUFDOzRCQUNsQixnQ0FBZ0MsRUFBRSxvQkFBb0I7eUJBQ3ZELENBQUMsQ0FBQzt3QkFDSCxPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDLENBQUM7b0JBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VCQW9CRztvQkFDSCxNQUFNLDJCQUEyQixHQUFHLEtBQUssRUFDdkMsTUFBYyxFQUNkLEtBQWMsRUFPZCxFQUFFO3dCQUNGLE1BQU0sT0FBTyxHQUFHLENBQUMseUJBQXlCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNyRCxNQUFNLGdCQUFnQixHQUFHLCtCQUErQixFQUFFLENBQUM7d0JBQzNELElBQUksT0FBTyxHQUFHLGdCQUFnQixFQUFFLENBQUM7NEJBQy9CLE9BQU87Z0NBQ0wsU0FBUyxFQUFFLEtBQUs7Z0NBQ2hCLEtBQUssRUFBRSxJQUFJLG9CQUFvQixDQUM3Qiw4Q0FBOEMsZ0JBQWdCLHNCQUFzQixtQ0FBbUMsRUFBRSxtSUFBbUksTUFBTSxNQUFNLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUNoVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FDakI7NkJBQ0YsQ0FBQzt3QkFDSixDQUFDO3dCQUNELGFBQWEsQ0FBQyxJQUFJLENBQ2hCLGdHQUFnRyxFQUNoRzs0QkFDRSxhQUFhLEVBQUUsS0FBSzs0QkFDcEIsTUFBTTs0QkFDTixhQUFhOzRCQUNiLHlCQUF5QixFQUFFLE9BQU87NEJBQ2xDLGdCQUFnQjt5QkFDakIsQ0FDRixDQUFDO3dCQUNGLElBQUksRUFBRSxhQUFhLENBQUM7NEJBQ2xCLHFDQUFxQyxFQUFFLE9BQU87eUJBQy9DLENBQUMsQ0FBQzt3QkFDSCxvREFBb0Q7d0JBQ3BELDZEQUE2RDt3QkFDN0QsNERBQTREO3dCQUM1RCxpREFBaUQ7d0JBQ2pELGdDQUFnQzt3QkFDaEMsT0FBTzs0QkFDTCxTQUFTLEVBQUUsSUFBSTs0QkFDZixNQUFNLEVBQUUsTUFBTSxRQUFRLENBQ3BCLG1DQUFtQyxFQUFFLEVBQ3JDLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLENBQ3ZDO3lCQUNGLENBQUM7b0JBQ0osQ0FBQyxDQUFDO29CQUVGLDBEQUEwRDtvQkFDMUQsMERBQTBEO29CQUMxRCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQzNCLEdBR0MsRUFDRCxnQkFBc0QsRUFDdEQsVUFBZ0MsRUFDSSxFQUFFO3dCQUN0QyxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUMvQixNQUFNLHVCQUF1QixDQUFDOzRCQUM1QixLQUFLOzRCQUNMLEdBQUc7NEJBQ0gsU0FBUzs0QkFDVCxVQUFVLEVBQUUsNEJBQTRCOzRCQUN4QyxVQUFVOzRCQUNWLDRCQUE0QixFQUMxQixLQUFLLENBQUMsNEJBQTRCOzRCQUNwQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQ2hCLFlBQVksRUFDWixXQUFXLEVBQ1gsNEJBQTRCLEVBQUUsVUFBVSxFQUN4QyxZQUFZLEdBQ0UsRUFBRSxFQUFFO2dDQUNsQixNQUFNLFlBQVksQ0FDaEIsS0FBSyxFQUNMLG9CQUFvQixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsRUFDN0M7b0NBQ0UsR0FBRyxDQUFDLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQztvQ0FDN0IsNEJBQTRCLEVBQUUsVUFBVTtpQ0FDekMsRUFDRCxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLENBQzVDLENBQUM7NEJBQ0osQ0FBQzt5QkFDRixDQUFDLENBQUM7d0JBQ0wsSUFBSSxjQUFjOzRCQUFFLElBQUksRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ3hELE9BQU8sT0FBTyxDQUFDO29CQUNqQixDQUFDLENBQUM7b0JBRUYsOERBQThEO29CQUM5RCxnRUFBZ0U7b0JBQ2hFLGdFQUFnRTtvQkFDaEUsMkRBQTJEO29CQUMzRCwyQkFBMkI7b0JBQzNCLElBQUksY0FBYyxJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBQ3ZDLElBQUksQ0FBQzs0QkFDSCx5REFBeUQ7NEJBQ3pELHVEQUF1RDs0QkFDdkQsbURBQW1EOzRCQUNuRCxzREFBc0Q7NEJBQ3RELHVEQUF1RDs0QkFDdkQsc0RBQXNEOzRCQUN0RCxzREFBc0Q7NEJBQ3RELG1EQUFtRDs0QkFDbkQsMkNBQTJDOzRCQUMzQyxFQUFFOzRCQUNGLDJCQUEyQjs0QkFDM0IsRUFBRTs0QkFDRixvREFBb0Q7NEJBQ3BELHlEQUF5RDs0QkFDekQsa0RBQWtEOzRCQUNsRCx1REFBdUQ7NEJBQ3ZELG1EQUFtRDs0QkFDbkQsb0RBQW9EOzRCQUNwRCx5REFBeUQ7NEJBQ3pELG9EQUFvRDs0QkFDcEQsOENBQThDOzRCQUM5QyxtREFBbUQ7NEJBQ25ELHdEQUF3RDs0QkFDeEQsd0JBQXdCOzRCQUN4QixzREFBc0Q7NEJBQ3RELHNEQUFzRDs0QkFDdEQseURBQXlEOzRCQUN6RCx3REFBd0Q7NEJBQ3hELHVEQUF1RDs0QkFDdkQsK0NBQStDOzRCQUMvQyxxREFBcUQ7NEJBQ3JELHVEQUF1RDs0QkFDdkQscURBQXFEOzRCQUNyRCxvREFBb0Q7NEJBQ3BELGlDQUFpQzs0QkFDakMsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLElBRWpDLEVBQUU7Z0NBQ0YsSUFBSSxDQUFDLFNBQVM7b0NBQUUsT0FBTyxJQUFJLENBQUM7Z0NBQzVCLElBQUksQ0FBQztvQ0FDSCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUN2QixLQUFLLEVBQ0w7d0NBQ0UsU0FBUyxFQUFFLGNBQWM7d0NBQ3pCLFdBQVcsRUFBRSxvQkFBb0I7d0NBQ2pDLGFBQWEsRUFBRSxjQUFjO3dDQUM3QixTQUFTLEVBQUU7NENBQ1QsUUFBUSxFQUFFLGdCQUFnQjs0Q0FDMUIsWUFBWTs0Q0FDWiwrQ0FBK0M7NENBQy9DLDJDQUEyQzs0Q0FDM0MsNkNBQTZDOzRDQUM3QyxTQUFTOzRDQUNULEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSzt5Q0FDdkI7cUNBQ0YsRUFDRDt3Q0FDRSxTQUFTO3dDQUNULCtDQUErQzt3Q0FDL0MsK0NBQStDO3dDQUMvQyw2Q0FBNkM7d0NBQzdDLHFDQUFxQzt3Q0FDckMsNkNBQTZDO3dDQUM3QywrQ0FBK0M7d0NBQy9DLGVBQWUsRUFBRSxJQUFJO3FDQUN0QixDQUNGLENBQUM7b0NBQ0YsMkNBQTJDO29DQUMzQyw4Q0FBOEM7b0NBQzlDLElBQUksRUFBRSxhQUFhLENBQ2pCLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsQ0FDbEQsQ0FBQztvQ0FDRixhQUFhLENBQUMsSUFBSSxDQUNoQixrR0FBa0csRUFDbEc7d0NBQ0UsYUFBYSxFQUFFLEtBQUs7d0NBQ3BCLE1BQU0sRUFBRSxjQUFjO3dDQUN0QixRQUFRLEVBQUUsZ0JBQWdCO3FDQUMzQixDQUNGLENBQUM7Z0NBQ0osQ0FBQztnQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29DQUNiLDhDQUE4QztvQ0FDOUMsd0NBQXdDO29DQUN4QyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7d0NBQUUsT0FBTyxJQUFJLENBQUM7b0NBQzdDLGlEQUFpRDtvQ0FDakQsNkNBQTZDO29DQUM3QyxnREFBZ0Q7b0NBQ2hELCtDQUErQztvQ0FDL0Msa0RBQWtEO29DQUNsRCw4QkFBOEI7b0NBQzlCLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7d0NBQUUsT0FBTyxNQUFNLENBQUM7b0NBQzNDLG1EQUFtRDtvQ0FDbkQsb0RBQW9EO29DQUNwRCxxQ0FBcUM7b0NBQ3JDLE1BQU0sR0FBRyxDQUFDO2dDQUNaLENBQUM7Z0NBQ0QsT0FBTyxJQUFJLENBQUM7NEJBQ2QsQ0FBQyxDQUFDOzRCQUNGLHFEQUFxRDs0QkFDckQsdURBQXVEOzRCQUN2RCx1REFBdUQ7NEJBQ3ZELHNEQUFzRDs0QkFDdEQscURBQXFEOzRCQUNyRCx1REFBdUQ7NEJBQ3ZELHlEQUF5RDs0QkFDekQsdURBQXVEOzRCQUN2RCx3REFBd0Q7NEJBQ3hELHdEQUF3RDs0QkFDeEQsc0RBQXNEOzRCQUN0RCxvREFBb0Q7NEJBQ3BELHVEQUF1RDs0QkFDdkQsbURBQW1EOzRCQUNuRCxTQUFTOzRCQUNULElBQUksS0FBOEIsQ0FBQzs0QkFDbkMsSUFBSSxXQUtILENBQUM7NEJBQ0Ysd0RBQXdEOzRCQUN4RCx5REFBeUQ7NEJBQ3pELCtCQUErQjs0QkFDL0IsSUFBSSxFQUFFLGFBQWEsQ0FDakIsU0FBUyxDQUFDLG9CQUFvQixDQUM1QixVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUN4QyxDQUNGLENBQUM7NEJBQ0YsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQ0FDZixxREFBcUQ7Z0NBQ3JELG1EQUFtRDtnQ0FDbkQsdURBQXVEO2dDQUN2RCxxREFBcUQ7Z0NBQ3JELGtEQUFrRDtnQ0FDbEQsNkNBQTZDO2dDQUM3QyxNQUFNLGFBQWEsR0FDakIsU0FBUyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQztvQ0FDL0IsQ0FBQyxDQUFDLE1BQU0scUJBQXFCLEVBQUU7b0NBQy9CLENBQUMsQ0FBRSxJQUFjLENBQUM7Z0NBQ3RCLElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRSxDQUFDO29DQUM3QixhQUFhLENBQUMsS0FBSyxDQUNqQixnREFBZ0QsRUFDaEQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQ3pCLENBQUM7b0NBQ0YsT0FBTztnQ0FDVCxDQUFDO2dDQUNELFdBQVcsR0FBRyxVQUFVLENBQUM7NEJBQzNCLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixNQUFNLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztvQ0FDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFO3dDQUNwQixXQUFXLEVBQUUsTUFBTTtxQ0FDcEIsQ0FBQztvQ0FDRixTQUFTLElBQUksUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDO3dDQUMvQixDQUFDLENBQUMscUJBQXFCLEVBQUU7d0NBQ3pCLENBQUMsQ0FBRSxJQUFjO2lDQUNwQixDQUFDLENBQUM7Z0NBQ0gsSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7b0NBQzdCLGFBQWEsQ0FBQyxLQUFLLENBQ2pCLGdEQUFnRCxFQUNoRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FDekIsQ0FBQztvQ0FDRixPQUFPO2dDQUNULENBQUM7Z0NBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO29DQUNqQyxhQUFhLENBQUMsS0FBSyxDQUNqQixnREFBZ0QsRUFDaEQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQ2pELENBQUM7b0NBQ0YsT0FBTztnQ0FDVCxDQUFDO2dDQUNELHFEQUFxRDtnQ0FDckQsaURBQWlEO2dDQUNqRCxrREFBa0Q7Z0NBQ2xELDJCQUEyQjtnQ0FDM0IsS0FBSyxHQUFHLE9BQXNCLENBQUM7Z0NBQy9CLFdBQVcsR0FBRztvQ0FDWixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7b0NBQ2xDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUM7b0NBQ3JDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUzt3Q0FDbkIsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTt3Q0FDbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQ0FDUCxTQUFTLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO2lDQUNwRCxDQUFDOzRCQUNKLENBQUM7NEJBQ0QsMERBQTBEOzRCQUMxRCx5REFBeUQ7NEJBQ3pELG1EQUFtRDs0QkFDbkQsd0RBQXdEOzRCQUN4RCwrQkFBK0I7NEJBQy9CLElBQ0UsQ0FBQyxNQUFNLGVBQWUsQ0FDcEI7Z0NBQ0UsS0FBSztnQ0FDTCxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7Z0NBQ3RDLFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVzs2QkFDckMsRUFDRCxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7Z0NBQ1gsR0FBRyxDQUFDLE1BQU0sYUFBYSxFQUFFLENBQUM7Z0NBQzFCLE1BQU0sRUFBRSxjQUFjO2dDQUN0QixRQUFRLEVBQUUsZ0JBQWdCO2dDQUMxQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ25DLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQ0FDckMsbURBQW1EO2dDQUNuRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOzZCQUNsRCxDQUFDLENBQ0gsQ0FBQyxLQUFLLFVBQVUsRUFDakIsQ0FBQztnQ0FDRCxPQUFPOzRCQUNULENBQUM7NEJBQ0QsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBRXhELDREQUE0RDs0QkFDNUQsNERBQTREOzRCQUM1RCx1REFBdUQ7NEJBQ3ZELDREQUE0RDs0QkFDNUQsMERBQTBEOzRCQUMxRCxvREFBb0Q7NEJBQ3BELDREQUE0RDs0QkFDNUQsMERBQTBEOzRCQUMxRCw0REFBNEQ7NEJBQzVELDREQUE0RDs0QkFDNUQsMERBQTBEOzRCQUMxRCx5REFBeUQ7NEJBQ3pELHFEQUFxRDs0QkFDckQseURBQXlEOzRCQUN6RCx1REFBdUQ7NEJBQ3ZELHFEQUFxRDs0QkFDckQsd0RBQXdEOzRCQUN4RCxxREFBcUQ7NEJBQ3JELG9EQUFvRDs0QkFDcEQscURBQXFEOzRCQUNyRCx3REFBd0Q7NEJBQ3hELHlEQUF5RDs0QkFDekQsWUFBWTs0QkFDWixJQUFJLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7NEJBQzlDLE1BQU0sWUFBWSxHQUNoQixlQUFlLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxVQUFVO2dDQUM3Qyx3QkFBd0IsQ0FBQzs0QkFDM0IsSUFBSSxRQUFRLENBQUMsT0FBTyxHQUFHLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDbEQsc0JBQXNCO29DQUNwQixzQkFBc0IsQ0FDcEIsTUFBTSxDQUFDLE1BQU0sRUFDYixjQUFjLEVBQ2QsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQzFCLEdBQUcsQ0FBQyxDQUFDOzRCQUNWLENBQUM7NEJBRUQsc0RBQXNEOzRCQUN0RCxzREFBc0Q7NEJBQ3RELGlEQUFpRDs0QkFDakQsbUJBQW1COzRCQUNuQixNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQzs0QkFDeEMsY0FBYyxHQUFHLFNBQVMsQ0FBQzs0QkFFM0Isb0RBQW9EOzRCQUNwRCxzREFBc0Q7NEJBQ3RELGtEQUFrRDs0QkFDbEQsc0NBQXNDOzRCQUN0QyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQ3JCLElBQUksVUFBbUQsQ0FBQzs0QkFDeEQsSUFBSSxDQUFDO2dDQUNILHVEQUF1RDtnQ0FDdkQsdURBQXVEO2dDQUN2RCxtREFBbUQ7Z0NBQ25ELHNEQUFzRDtnQ0FDdEQsc0RBQXNEO2dDQUN0RCxrREFBa0Q7Z0NBQ2xELHNEQUFzRDtnQ0FDdEQsMkNBQTJDO2dDQUMzQyxxREFBcUQ7Z0NBQ3JELGdDQUFnQztnQ0FDaEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUUsQ0FDN0IsV0FBVyxDQUFDO29DQUNWLEtBQUs7b0NBQ0wsYUFBYSxFQUFFLEtBQUs7b0NBQ3BCLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxZQUFZO29DQUM5QyxZQUFZO29DQUNaLGlCQUFpQixFQUFFLFdBQVc7b0NBQzlCLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUyxJQUFJLEtBQUs7b0NBQ3pDLFNBQVM7b0NBQ1QsTUFBTSxFQUFFLGNBQWM7b0NBQ3RCLFFBQVEsRUFBRSxnQkFBZ0I7b0NBQzFCLGNBQWMsRUFBRSxXQUFXLENBQUMsV0FBVztvQ0FDdkMsb0RBQW9EO29DQUNwRCxtREFBbUQ7b0NBQ25ELGlEQUFpRDtvQ0FDakQsb0JBQW9CLEVBQUUsc0JBQXNCO29DQUM1QyxHQUFHLENBQUMsZ0JBQWdCO3dDQUNsQixDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUU7d0NBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUNBQ1IsQ0FBQyxDQUFDO2dDQUNMLFVBQVUsR0FBRyxNQUFNLG1CQUFtQixDQUNwQyxLQUFLLEVBQ0wsY0FBYyxFQUNkLEtBQUssSUFBSSxFQUFFO29DQUNULElBQUksQ0FBQzt3Q0FDSCxPQUFPLE1BQU0saUJBQWlCLEVBQUUsQ0FBQztvQ0FDbkMsQ0FBQztvQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO3dDQUNiLGdEQUFnRDt3Q0FDaEQsMENBQTBDO3dDQUMxQywyQ0FBMkM7d0NBQzNDLHNDQUFzQzt3Q0FDdEMsNENBQTRDO3dDQUM1QywrQ0FBK0M7d0NBQy9DLDhDQUE4Qzt3Q0FDOUMsOENBQThDO3dDQUM5QyxnQ0FBZ0M7d0NBQ2hDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRDQUMzQyxNQUFNLEdBQUcsQ0FBQzt3Q0FDWixDQUFDO3dDQUNELElBQUksQ0FBQyxNQUFNLHFCQUFxQixFQUFFLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQzs0Q0FDL0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsQ0FBQzt3Q0FDbkMsQ0FBQzt3Q0FDRCxPQUFPLE1BQU0saUJBQWlCLEVBQUUsQ0FBQztvQ0FDbkMsQ0FBQztnQ0FDSCxDQUFDLENBQ0YsQ0FBQzs0QkFDSixDQUFDO29DQUFTLENBQUM7Z0NBQ1QsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDOzRCQUN4QixDQUFDOzRCQUNELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQ0FDaEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ3ZELENBQUM7NEJBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dDQUNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQzs0QkFDdkQsQ0FBQzs0QkFFRCx5REFBeUQ7NEJBQ3pELGtEQUFrRDs0QkFDbEQsSUFDRSxVQUFVLENBQUMsSUFBSSxLQUFLLFdBQVc7Z0NBQy9CLFVBQVUsQ0FBQyxhQUFhLEVBQ3hCLENBQUM7Z0NBQ0QsTUFBTSxZQUFZLENBQ2hCLEtBQUssRUFDTCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQzdDO29DQUNFLEtBQUs7b0NBQ0wsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLEVBQUU7b0NBQ3RDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtpQ0FDeEIsQ0FDRixDQUFDO2dDQUNGLE9BQU87NEJBQ1QsQ0FBQzs0QkFFRCxJQUNFLFVBQVUsQ0FBQyxJQUFJLEtBQUssV0FBVztnQ0FDL0IsVUFBVSxDQUFDLElBQUksS0FBSyxRQUFRO2dDQUM1QixVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFDN0IsQ0FBQztnQ0FDRCx1REFBdUQ7Z0NBQ3ZELHlEQUF5RDtnQ0FDekQsMkJBQTJCO2dDQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNsRCxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBRXBDLG9EQUFvRDtnQ0FDcEQsNENBQTRDO2dDQUM1QyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztnQ0FDckQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7Z0NBQ3RELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO29DQUM5QixJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFLENBQUM7d0NBQ25DLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29DQUN0QyxDQUFDO3lDQUFNLElBQ0wsQ0FBQyxDQUFDLFNBQVMsS0FBSyxnQkFBZ0I7d0NBQ2hDLENBQUMsQ0FBQyxTQUFTLEtBQUssYUFBYSxFQUM3QixDQUFDO3dDQUNELGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29DQUN2QyxDQUFDO2dDQUNILENBQUM7Z0NBQ0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7Z0NBQ3JELEtBQUssTUFBTSxFQUFFLElBQUksY0FBYyxFQUFFLENBQUM7b0NBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7d0NBQzdCLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0NBQ3pCLENBQUM7Z0NBQ0gsQ0FBQztnQ0FFRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0NBQzVCLGtEQUFrRDtvQ0FDbEQsZ0RBQWdEO29DQUNoRCxrREFBa0Q7b0NBQ2xELDhDQUE4QztvQ0FDOUMsb0RBQW9EO29DQUNwRCwyQ0FBMkM7b0NBQzNDLGlEQUFpRDtvQ0FDakQsOENBQThDO29DQUM5QyxJQUNFLHdCQUF3QixFQUFFO3dDQUMxQiw0QkFBNEIsQ0FDMUIsTUFBTSxDQUFDLE1BQU0sRUFDYixjQUFjLEVBQ2QsUUFBUSxDQUFDLFNBQVMsQ0FDbkIsRUFDRCxDQUFDO3dDQUNELGFBQWEsQ0FBQyxLQUFLLENBQ2pCLHVGQUF1RixFQUN2RixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FDekIsQ0FBQztvQ0FDSixDQUFDO3lDQUFNLENBQUM7d0NBQ04sZ0RBQWdEO3dDQUNoRCxpREFBaUQ7d0NBQ2pELG9DQUFvQzt3Q0FDcEMsYUFBYSxDQUFDLEtBQUssQ0FDakIseURBQXlELEVBQ3pELEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUN6QixDQUFDO3dDQUNGLE9BQU87b0NBQ1QsQ0FBQztnQ0FDSCxDQUFDO2dDQUVELHdEQUF3RDtnQ0FDeEQsZ0RBQWdEO2dDQUNoRCxhQUFhLENBQUMsS0FBSyxDQUNqQixpRUFBaUUsRUFDakUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQ3pCLENBQUM7Z0NBQ0Ysc0RBQXNEO2dDQUN0RCxrREFBa0Q7Z0NBQ2xELDJEQUEyRDtnQ0FDM0QsTUFBTSxZQUFZLEdBQ2hCLEtBQUs7b0NBQ0wsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTt3Q0FDM0IsV0FBVyxFQUFFLE1BQU07cUNBQ3BCLENBQUMsQ0FBQyxDQUFDO2dDQUNOLHFEQUFxRDtnQ0FDckQscURBQXFEO2dDQUNyRCxzREFBc0Q7Z0NBQ3RELHVEQUF1RDtnQ0FDdkQsdURBQXVEO2dDQUN2RCxtREFBbUQ7Z0NBQ25ELHVEQUF1RDtnQ0FDdkQscURBQXFEO2dDQUNyRCx1REFBdUQ7Z0NBQ3ZELElBQUksMkJBQTJCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0NBQ3JELGFBQWEsQ0FBQyxLQUFLLENBQ2pCLG9FQUFvRSxFQUNwRTt3Q0FDRSxhQUFhLEVBQUUsS0FBSzt3Q0FDcEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO3FDQUM1QixDQUNGLENBQUM7b0NBQ0YsT0FBTztnQ0FDVCxDQUFDO2dDQUNELHdEQUF3RDtnQ0FDeEQsbURBQW1EO2dDQUNuRCxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQ0FDbkMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3hDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLGFBQWEsQ0FDN0MsQ0FBQztnQ0FDRixJQUFJLFdBQW9CLENBQUM7Z0NBQ3pCLElBQUksZUFBZSxFQUFFLENBQUM7b0NBQ3BCLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztnQ0FDaEQsQ0FBQztxQ0FBTSxDQUFDO29DQUNOLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3Q0FDbkQsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixpQkFBaUIsS0FBSyw4QkFBOEIsQ0FDckQsQ0FBQztvQ0FDSixDQUFDO29DQUNELG9EQUFvRDtvQ0FDcEQsdURBQXVEO29DQUN2RCxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTt3Q0FDNUMsV0FBVyxFQUFFLEtBQUs7cUNBQ25CLENBQUMsQ0FBQztvQ0FDSCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7d0NBQ25DLE9BQU87b0NBQ1QsQ0FBQztvQ0FDRCxXQUFXLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztnQ0FDaEMsQ0FBQztnQ0FDRCxXQUFXLEdBQUc7b0NBQ1osR0FBRyxZQUFZO29DQUNmLEtBQUssRUFBRSxXQUFXO29DQUNsQixNQUFNLEVBQUUsU0FBUztvQ0FDakIsTUFBTSxFQUFFLFNBQVM7b0NBQ2pCLEtBQUssRUFBRSxTQUFTO29DQUNoQixXQUFXLEVBQUUsU0FBUztpQ0FDdkIsQ0FBQztnQ0FDRixpQkFBaUIsR0FBRyxXQUFXLENBQUM7NEJBQ2xDLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixPQUFPOzRCQUNULENBQUM7d0JBQ0gsQ0FBQzt3QkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDOzRCQUNiLE1BQU0sU0FBUyxHQUFHLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUNqRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0NBQ2YsTUFBTSxHQUFHLENBQUM7NEJBQ1osQ0FBQzs0QkFDRCxNQUFNLG1CQUFtQixDQUFDO2dDQUN4QixLQUFLO2dDQUNMLFdBQVc7Z0NBQ1gsS0FBSztnQ0FDTCxTQUFTO2dDQUNULEdBQUc7Z0NBQ0gsU0FBUztnQ0FDVCxVQUFVLEVBQ1Isc0RBQXNEOzZCQUN6RCxDQUFDLENBQUM7NEJBQ0gsT0FBTzt3QkFDVCxDQUFDO29CQUNILENBQUM7b0JBRUQsdURBQXVEO29CQUN2RCx1REFBdUQ7b0JBQ3ZELHFEQUFxRDtvQkFDckQsd0RBQXdEO29CQUN4RCxrREFBa0Q7b0JBQ2xELDJEQUEyRDtvQkFDM0Qsb0RBQW9EO29CQUNwRCx5REFBeUQ7b0JBQ3pELHdEQUF3RDtvQkFDeEQsd0RBQXdEO29CQUN4RCx5REFBeUQ7b0JBQ3pELHNEQUFzRDtvQkFDdEQseURBQXlEO29CQUN6RCx3REFBd0Q7b0JBQ3hELHlEQUF5RDtvQkFDekQseURBQXlEO29CQUN6RCwyREFBMkQ7b0JBQzNELHNEQUFzRDtvQkFDdEQsa0NBQWtDO29CQUNsQyxJQUNFLENBQUMsV0FBVzt3QkFDWixTQUFTLEVBQUUsWUFBWSxLQUFLLFNBQVM7d0JBQ3JDLHVEQUF1RDt3QkFDdkQscURBQXFEO3dCQUNyRCx1REFBdUQ7d0JBQ3ZELHNDQUFzQzt3QkFDdEMsS0FBSyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsS0FBSyxJQUFJLEVBQy9DLENBQUM7d0JBQ0QsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO3dCQUNsRCxJQUFJLG1CQUF1QyxDQUFDO3dCQUM1QyxJQUFJLENBQUM7NEJBQ0gsbUJBQW1CLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQ3RELENBQUM7d0JBQUMsTUFBTSxDQUFDOzRCQUNQLG1CQUFtQixHQUFHLFNBQVMsQ0FBQzt3QkFDbEMsQ0FBQzt3QkFDRCxJQUNFLG1CQUFtQixLQUFLLFNBQVM7NEJBQ2pDLG1CQUFtQixLQUFLLGtCQUFrQixFQUMxQyxDQUFDOzRCQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFO2dDQUN0QyxXQUFXLEVBQUUsTUFBTTs2QkFDcEIsQ0FBQyxDQUFDOzRCQUNILElBQ0UsQ0FBQyxNQUFNLGVBQWUsQ0FDcEIsR0FBRyxFQUNILEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztnQ0FDWCxHQUFHLENBQUMsTUFBTSxhQUFhLEVBQUUsQ0FBQztnQ0FDMUIsU0FBUztnQ0FDVCw4Q0FBOEM7Z0NBQzlDLCtDQUErQztnQ0FDL0MsK0NBQStDO2dDQUMvQyw0Q0FBNEM7Z0NBQzVDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7NkJBQ2xELENBQUMsRUFDRixhQUFhLENBQ2QsQ0FBQyxLQUFLLFVBQVUsRUFDakIsQ0FBQztnQ0FDRCxPQUFPOzRCQUNULENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO29CQUVELHFDQUFxQztvQkFDckMsdURBQXVEO29CQUN2RCwwREFBMEQ7b0JBQzFELDJEQUEyRDtvQkFDM0QsMkRBQTJEO29CQUMzRCwyREFBMkQ7b0JBQzNELG9EQUFvRDtvQkFDcEQsbURBQW1EO29CQUNuRCwyREFBMkQ7b0JBQzNELHNEQUFzRDtvQkFDdEQscURBQXFEO29CQUNyRCxzREFBc0Q7b0JBQ3RELHdEQUF3RDtvQkFDeEQsbURBQW1EO29CQUNuRCx3REFBd0Q7b0JBQ3hELHlEQUF5RDtvQkFDekQsb0NBQW9DO29CQUNwQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLElBQ0UsQ0FBQyxXQUFXO3dCQUNaLFNBQVM7d0JBQ1QsU0FBUyxDQUFDLFFBQVEsS0FBSyxTQUFTO3dCQUNoQyxTQUFTLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFDckMsQ0FBQzt3QkFDRCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUM7d0JBQ2xDLDBEQUEwRDt3QkFDMUQsd0RBQXdEO3dCQUN4RCxzREFBc0Q7d0JBQ3RELFNBQVM7d0JBQ1QsSUFBSSxVQUE0QixDQUFDO3dCQUNqQyxJQUFJLENBQUM7NEJBQ0gsVUFBVSxHQUFHLElBQUksSUFBSSxDQUNuQixVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUNyQyxDQUFDO3dCQUNKLENBQUM7d0JBQUMsTUFBTSxDQUFDOzRCQUNQLFVBQVUsR0FBRyxTQUFTLENBQUM7d0JBQ3pCLENBQUM7d0JBQ0QsSUFBSSxDQUFDOzRCQUNILElBQUksRUFBRSxRQUFRLENBQUMscUNBQXFDLEVBQUU7Z0NBQ3BELHVDQUF1QyxFQUFFLElBQUk7NkJBQzlDLENBQUMsQ0FBQzs0QkFDSCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQ2hDLGNBQWMsRUFDZCxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FDdEIsV0FBVyxDQUNUO2dDQUNFLFNBQVMsRUFBRSxlQUFlO2dDQUMxQixXQUFXLEVBQUUsb0JBQW9CO2dDQUNqQyxhQUFhLEVBQUUsZUFBZSxDQUFDLE1BQU07Z0NBQ3JDLFNBQVMsRUFBRTtvQ0FDVCxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7b0NBQzVCLE9BQU8sRUFBRSxlQUFlLENBQUMsT0FBTztpQ0FDakM7NkJBQ0YsRUFDRDtnQ0FDRSxTQUFTO2dDQUNULFVBQVU7Z0NBQ1YsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO2dDQUNsQyxtQkFBbUIsRUFDakIsZUFBZSxDQUFDLGFBQWE7Z0NBQy9CLGFBQWEsRUFBRSxJQUFJO2dDQUNuQixtQkFBbUI7NkJBQ3BCLENBQ0YsQ0FDSixDQUFDOzRCQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDOzRCQUNoQyxXQUFXLEdBQUcsSUFBSSxDQUFDOzRCQUNuQix1REFBdUQ7NEJBQ3ZELG1EQUFtRDs0QkFDbkQsdURBQXVEOzRCQUN2RCx3REFBd0Q7NEJBQ3hELHNEQUFzRDs0QkFDdEQsbURBQW1EOzRCQUNuRCx1Q0FBdUM7NEJBRXZDLHdEQUF3RDs0QkFDeEQscURBQXFEOzRCQUNyRCxrREFBa0Q7NEJBQ2xELHlDQUF5Qzs0QkFDekMsd0RBQXdEOzRCQUN4RCxtQkFBbUI7NEJBQ25CLGtEQUFrRDs0QkFDbEQsdURBQXVEOzRCQUN2RCxpREFBaUQ7NEJBQ2pELHNEQUFzRDs0QkFDdEQscURBQXFEOzRCQUNyRCx3REFBd0Q7NEJBQ3hELG1EQUFtRDs0QkFDbkQsTUFBTSxtQkFBbUIsR0FDdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxTQUFTO2dDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxTQUFTO2dDQUNsQyxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0NBQzFCLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUztnQ0FDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQ0FDeEIsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO2dDQUNyQixNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUs7Z0NBQ3hCLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRO2dDQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUNyQztnQ0FDRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUNyQztnQ0FDRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxTQUFTLEtBQUssZUFBZTtvQ0FDL0IsQ0FBQyxDQUFDLFFBQVEsS0FBSyxlQUFlLENBQUMsUUFBUSxDQUMxQyxDQUFDOzRCQUVKLElBQ0UsbUJBQW1CO2dDQUNuQixNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVM7Z0NBQ3JCLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsQ0FBQztnQ0FDRCxzREFBc0Q7Z0NBQ3RELHFEQUFxRDtnQ0FDckQsdURBQXVEO2dDQUN2RCxtREFBbUQ7Z0NBQ25ELGtEQUFrRDtnQ0FDbEQsZ0RBQWdEO2dDQUNoRCxnQkFBZ0I7Z0NBQ2hCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLO29DQUNqQixDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssZUFBZTt3Q0FDOUIsQ0FBQyxDQUFDLFNBQVMsS0FBSyxZQUFZO3dDQUM1QixDQUFDLENBQUMsU0FBUyxLQUFLLGVBQWUsQ0FBQyxDQUNyQyxDQUFDO2dDQUNGLElBQUksYUFBYSxFQUFFLENBQUM7b0NBQ2xCLGtEQUFrRDtvQ0FDbEQsa0RBQWtEO29DQUNsRCw2Q0FBNkM7b0NBQzdDLHdDQUF3QztvQ0FDeEMsSUFBSSxFQUFFLGFBQWEsQ0FBQzt3Q0FDbEIsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQzVCLGFBQWEsQ0FBQyxTQUFTLEtBQUssZUFBZTs0Q0FDekMsQ0FBQyxDQUFDLFdBQVc7NENBQ2IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEtBQUssWUFBWTtnREFDeEMsQ0FBQyxDQUFDLFFBQVE7Z0RBQ1YsQ0FBQyxDQUFDLFdBQVcsQ0FDbEI7d0NBQ0QsR0FBRyxTQUFTLENBQUMscUJBQXFCLENBQ2hDLHNCQUFzQixDQUN2QjtxQ0FDRixDQUFDLENBQUM7b0NBQ0gsYUFBYSxDQUFDLElBQUksQ0FDaEIsdURBQXVELEVBQ3ZEO3dDQUNFLGFBQWEsRUFBRSxLQUFLO3dDQUNwQixTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVM7cUNBQ25DLENBQ0YsQ0FBQztvQ0FDRixPQUFPO2dDQUNULENBQUM7Z0NBQ0QsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0NBQ3pCLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dDQUNsQyxjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQ0FDbEQsZ0RBQWdEO2dDQUNoRCxrREFBa0Q7Z0NBQ2xELHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQ0FDcEMsSUFBSSxjQUFjLEVBQUUsQ0FBQztvQ0FDbkIsY0FBYyxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7Z0NBQzlDLENBQUM7Z0NBQ0QsUUFBUSxHQUFHO29DQUNULElBQUksRUFBRSxPQUFPO29DQUNiLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtvQ0FDckIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2lDQUN0QixDQUFDO2dDQUNGLGlCQUFpQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0NBQzFDLElBQUksRUFBRSxhQUFhLENBQUM7b0NBQ2xCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29DQUNqRCxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQztvQ0FDakQsR0FBRyxTQUFTLENBQUMscUJBQXFCLENBQ2hDLHNCQUFzQixDQUN2QjtpQ0FDRixDQUFDLENBQUM7NEJBQ0wsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLHFEQUFxRDtnQ0FDckQsaURBQWlEO2dDQUNqRCxvREFBb0Q7Z0NBQ3BELG1EQUFtRDtnQ0FDbkQsc0RBQXNEO2dDQUN0RCxvREFBb0Q7Z0NBQ3BELGlEQUFpRDtnQ0FDakQsYUFBYTtnQ0FDYixJQUFJLEVBQUUsYUFBYSxDQUNqQixTQUFTLENBQUMscUJBQXFCLENBQzdCLHdCQUF3QixDQUN6QixDQUNGLENBQUM7NEJBQ0osQ0FBQzt3QkFDSCxDQUFDO3dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7NEJBQ2IsOENBQThDOzRCQUM5QyxzREFBc0Q7NEJBQ3RELGlEQUFpRDs0QkFDakQsdURBQXVEOzRCQUN2RCx1REFBdUQ7NEJBQ3ZELDRDQUE0Qzs0QkFDNUMsZ0RBQWdEOzRCQUNoRCxJQUNFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0NBQ3pCLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQ3ZCLENBQUM7Z0NBQ0QsYUFBYSxDQUFDLElBQUksQ0FDaEIsdURBQXVELEVBQ3ZELEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUMvQyxDQUFDO2dDQUNGLE9BQU87NEJBQ1QsQ0FBQzs0QkFDRCxJQUFJLE1BQU0sMEJBQTBCLENBQUMsR0FBRyxDQUFDO2dDQUFFLE9BQU87NEJBQ2xELE1BQU0sR0FBRyxDQUFDO3dCQUNaLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxnREFBZ0Q7b0JBQ2hELHdEQUF3RDtvQkFDeEQsMERBQTBEO29CQUMxRCx1Q0FBdUM7b0JBQ3ZDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDakIsMERBQTBEO3dCQUMxRCwwREFBMEQ7d0JBQzFELGtDQUFrQzt3QkFDbEMsNERBQTREO3dCQUM1RCx1REFBdUQ7d0JBQ3ZELDhEQUE4RDt3QkFDOUQsTUFBTSxlQUFlLEdBQUc7NEJBQ3RCLFNBQVMsRUFBRSxhQUFzQjs0QkFDakMsc0RBQXNEOzRCQUN0RCxzREFBc0Q7NEJBQ3RELHlEQUF5RDs0QkFDekQsV0FBVyxFQUNULFFBQVEsRUFBRSxXQUFXLElBQUksb0JBQW9COzRCQUMvQyw4Q0FBOEM7NEJBQzlDLDRDQUE0Qzs0QkFDNUMsK0NBQStDOzRCQUMvQyx1REFBdUQ7NEJBQ3ZELEdBQUcsQ0FBQyxRQUFRO2dDQUNWLENBQUMsQ0FBQztvQ0FDRSxTQUFTLEVBQUU7d0NBQ1QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO3dDQUNyQixZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7d0NBQ25DLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTt3Q0FDbkMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjt3Q0FDM0MsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO3dDQUMvQix1QkFBdUIsRUFDckIsUUFBUSxDQUFDLHVCQUF1QjtxQ0FDbkM7aUNBQ0Y7Z0NBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt5QkFDUixDQUFDO3dCQUNGLElBQUksS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDOzRCQUN0Qix5REFBeUQ7NEJBQ3pELHlEQUF5RDs0QkFDekQsc0RBQXNEOzRCQUN0RCx3REFBd0Q7NEJBQ3hELDJEQUEyRDs0QkFDM0QsNERBQTREOzRCQUM1RCw0REFBNEQ7NEJBQzVELDRDQUE0Qzs0QkFDNUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxtQ0FBbUMsRUFBRTtnQ0FDbEQsbUNBQW1DLEVBQUUsSUFBSTs2QkFDMUMsQ0FBQyxDQUFDOzRCQUNILE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FDaEMsZUFBZTs0QkFDZixtREFBbUQ7NEJBQ25ELCtDQUErQzs0QkFDL0MsZ0RBQWdEOzRCQUNoRCxxREFBcUQ7NEJBQ3JELG9EQUFvRDs0QkFDcEQsa0RBQWtEOzRCQUNsRCxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQ2pDLENBQUM7NEJBQ0YsZUFBZSxHQUFHLGNBQWMsQ0FBQzs0QkFDakMsSUFBSSxDQUFDO2dDQUNILG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dDQUMvQix1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDcEMsQ0FBQzs0QkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dDQUNiLE1BQU0sYUFBYSxFQUFFLENBQUM7Z0NBQ3RCLElBQUksQ0FBQyxDQUFDLE1BQU0sMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29DQUM3QyxNQUFNLEdBQUcsQ0FBQztnQ0FDWixDQUFDO2dDQUNELE9BQU87NEJBQ1QsQ0FBQzs0QkFDRCxrREFBa0Q7NEJBQ2xELHdEQUF3RDs0QkFDeEQsc0RBQXNEOzRCQUN0RCxnREFBZ0Q7NEJBQ2hELHVEQUF1RDs0QkFDdkQsc0RBQXNEOzRCQUN0RCxlQUFlOzRCQUNmLEtBQUssY0FBYztpQ0FDaEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0NBQ1YsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQ0FDMUMsSUFBSSxLQUFLLEtBQUssU0FBUztvQ0FBRSxjQUFjLEdBQUcsS0FBSyxDQUFDOzRCQUNsRCxDQUFDLENBQUM7Z0NBQ0YsZ0RBQWdEO2dDQUNoRCx5REFBeUQ7aUNBQ3hELEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQzs0QkFDbkIsNERBQTREOzRCQUM1RCwyREFBMkQ7NEJBQzNELHVEQUF1RDs0QkFDdkQsMkRBQTJEOzRCQUMzRCwwREFBMEQ7NEJBQzFELCtDQUErQzs0QkFDL0MsUUFBUSxHQUFHO2dDQUNULElBQUksRUFBRSxPQUFPO2dDQUNiLE1BQU0sRUFBRSxFQUFFO2dDQUNWLE1BQU0sRUFBRSxJQUFJOzZCQUNiLENBQUM7NEJBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDdkIsV0FBVyxHQUFHO2dDQUNaLEtBQUs7Z0NBQ0wsTUFBTSxFQUFFLFNBQVM7Z0NBQ2pCLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtnQ0FDbkMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZO2dDQUNuQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVc7Z0NBQ2pDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxnQkFBZ0I7Z0NBQzNDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztnQ0FDckIsd0RBQXdEO2dDQUN4RCx3REFBd0Q7Z0NBQ3hELDBEQUEwRDtnQ0FDMUQseURBQXlEO2dDQUN6RCxtREFBbUQ7Z0NBQ25ELDBEQUEwRDtnQ0FDMUQsdURBQXVEO2dDQUN2RCx5REFBeUQ7Z0NBQ3pELHlEQUF5RDtnQ0FDekQsc0RBQXNEO2dDQUN0RCwwREFBMEQ7Z0NBQzFELHNDQUFzQztnQ0FDdEMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRTtnQ0FDckMsU0FBUyxFQUFFLEdBQUc7Z0NBQ2QsU0FBUyxFQUFFLEdBQUc7Z0NBQ2QsU0FBUyxFQUFFLEdBQUc7NkJBQ2YsQ0FBQzs0QkFDRixpQkFBaUIsR0FBRyxDQUFDLEdBQUcsQ0FBQzs0QkFDekIsc0RBQXNEOzRCQUN0RCw0Q0FBNEM7NEJBQzVDLG9EQUFvRDs0QkFDcEQsNkNBQTZDOzRCQUM3QyxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsQ0FBQzs0QkFDOUIsSUFBSSxFQUFFLGFBQWEsQ0FBQztnQ0FDbEIsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO2dDQUN6QyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQzs2QkFDbEQsQ0FBQyxDQUFDO3dCQUNMLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixJQUFJLENBQUM7Z0NBQ0gsSUFBSSxFQUFFLFFBQVEsQ0FBQyxtQ0FBbUMsRUFBRTtvQ0FDbEQsbUNBQW1DLEVBQUUsS0FBSztpQ0FDM0MsQ0FBQyxDQUFDO2dDQUNILE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FDaEMsYUFBYSxFQUNiLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUN0QixXQUFXLENBQUMsZUFBZSxFQUFFO29DQUMzQixTQUFTO29DQUNULG1CQUFtQjtpQ0FDcEIsQ0FBQyxDQUNMLENBQUM7Z0NBQ0YsSUFBSSxDQUFDO29DQUNILG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29DQUMvQix1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQ0FDcEMsQ0FBQztnQ0FBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO29DQUNwQixJQUFJLENBQUM7d0NBQ0gsTUFBTSxVQUFVLENBQUM7b0NBQ25CLENBQUM7b0NBQUMsTUFBTSxDQUFDO3dDQUNQLDZDQUE2Qzt3Q0FDN0MsdUNBQXVDO29DQUN6QyxDQUFDO29DQUNELE1BQU0sVUFBVSxDQUFDO2dDQUNuQixDQUFDO2dDQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDO2dDQUNoQyxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQ0FDekIsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBQ2xELDJDQUEyQztnQ0FDM0Msc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dDQUNwQyxrREFBa0Q7Z0NBQ2xELGlEQUFpRDtnQ0FDakQsa0RBQWtEO2dDQUNsRCw0QkFBNEI7Z0NBQzVCLElBQUksY0FBYyxFQUFFLENBQUM7b0NBQ25CLGNBQWMsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDO2dDQUM3QyxDQUFDO2dDQUVELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztvQ0FDMUIsTUFBTSxNQUFNLEdBQUc7d0NBQ2IsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO3dDQUMxQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO3FDQUM5QixDQUFDO29DQUNGLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTzt3Q0FDdkIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQzt3Q0FDMUIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dDQUNuQyxDQUFDO2dDQUNELGlCQUFpQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0NBQzFDLElBQUksRUFBRSxhQUFhLENBQUM7b0NBQ2xCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29DQUNqRCxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQztpQ0FDbEQsQ0FBQyxDQUFDO2dDQUVILElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7b0NBQ3BDLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLGdEQUFnRCxFQUNoRDt3Q0FDRSxhQUFhLEVBQUUsS0FBSzt3Q0FDcEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTTtxQ0FDMUIsQ0FDRixDQUFDO29DQUVGLDhFQUE4RTtvQ0FDOUUsK0VBQStFO29DQUMvRSxnRkFBZ0Y7b0NBQ2hGLG1GQUFtRjtvQ0FDbkYsZ0RBQWdEO29DQUVoRCxPQUFPO2dDQUNULENBQUM7Z0NBQ0Qsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7NEJBQ3BDLENBQUM7NEJBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQ0FDYixpREFBaUQ7Z0NBQ2pELElBQ0UsbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQ0FDM0IsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFDdkIsQ0FBQztvQ0FDRCw0Q0FBNEM7b0NBQzVDLDBDQUEwQztvQ0FDMUMsa0RBQWtEO29DQUNsRCwrQ0FBK0M7b0NBQy9DLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLDZDQUE2QyxFQUM3QyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDL0MsQ0FBQztvQ0FDRixPQUFPO2dDQUNULENBQUM7cUNBQU0sQ0FBQztvQ0FDTixJQUFJLENBQUMsQ0FBQyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3Q0FDN0MsTUFBTSxHQUFHLENBQUM7b0NBQ1osQ0FBQztvQ0FDRCxPQUFPO2dDQUNULENBQUM7NEJBQ0gsQ0FBQzt3QkFDSCxDQUFDLENBQUMsbUNBQW1DO29CQUN2QyxDQUFDLENBQUMsd0JBQXdCO29CQUMxQixNQUFNLENBQ0osV0FBVyxFQUNYLDJDQUEyQyxDQUM1QyxDQUFDO29CQUNGLHVEQUF1RDtvQkFDdkQsb0RBQW9EO29CQUNwRCx1REFBdUQ7b0JBQ3ZELDREQUE0RDtvQkFDNUQsMERBQTBEO29CQUMxRCw0REFBNEQ7b0JBQzVELElBQ0UsY0FBYzt3QkFDZCxjQUFjLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFDeEMsQ0FBQzt3QkFDRCxjQUFjLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztvQkFDNUMsQ0FBQztvQkFFRCw2REFBNkQ7b0JBQzdELDJEQUEyRDtvQkFDM0QsNERBQTREO29CQUM1RCw0REFBNEQ7b0JBQzVELHNEQUFzRDtvQkFDdEQsMERBQTBEO29CQUMxRCxpQ0FBaUM7b0JBQ2pDLEVBQUU7b0JBQ0YsMkRBQTJEO29CQUMzRCx5REFBeUQ7b0JBQ3pELDJEQUEyRDtvQkFDM0QsMERBQTBEO29CQUMxRCx5REFBeUQ7b0JBQ3pELDZEQUE2RDtvQkFDN0QsNkRBQTZEO29CQUM3RCwyREFBMkQ7b0JBQzNELGdFQUFnRTtvQkFDaEUseURBQXlEO29CQUN6RCwwREFBMEQ7b0JBQzFELFFBQVE7b0JBQ1IsSUFDRSxDQUFDLE1BQU0sZUFBZSxDQUNwQixXQUFXLEVBQ1gsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUNYLEdBQUcsQ0FBQyxNQUFNLGFBQWEsRUFBRSxDQUFDO3dCQUMxQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ25DLGlEQUFpRDt3QkFDakQsZ0RBQWdEO3dCQUNoRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3FCQUNsRCxDQUFDLEVBQ0YsYUFBYSxDQUNkLENBQUMsS0FBSyxVQUFVLEVBQ2pCLENBQUM7d0JBQ0QsT0FBTztvQkFDVCxDQUFDO29CQUVELDhEQUE4RDtvQkFDOUQsMERBQTBEO29CQUMxRCw0REFBNEQ7b0JBQzVELGlEQUFpRDtvQkFDakQsMkRBQTJEO29CQUMzRCx3REFBd0Q7b0JBQ3hELHdEQUF3RDtvQkFDeEQsMkRBQTJEO29CQUMzRCwyREFBMkQ7b0JBQzNELGtEQUFrRDtvQkFDbEQsSUFBSSxTQUFTLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDOUIsdURBQXVEO3dCQUN2RCx1REFBdUQ7d0JBQ3ZELDZEQUE2RDt3QkFDN0QsNkRBQTZEO3dCQUM3RCw0REFBNEQ7d0JBQzVELHVEQUF1RDt3QkFDdkQsMkRBQTJEO3dCQUMzRCwyREFBMkQ7d0JBQzNELGtEQUFrRDt3QkFDbEQsRUFBRTt3QkFDRixvREFBb0Q7d0JBQ3BELHNEQUFzRDt3QkFDdEQsaURBQWlEO3dCQUNqRCx5REFBeUQ7d0JBQ3pELHVEQUF1RDt3QkFDdkQsUUFBUTt3QkFDUixNQUFNLGdCQUFnQixHQUNwQixTQUFTLENBQUMsUUFBUSxLQUFLLFNBQVM7NEJBQ2hDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUzs0QkFDM0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2xCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsU0FBUyxLQUFLLGVBQWU7Z0NBQy9CLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLFFBQVEsQ0FDcEMsQ0FBQzt3QkFDSixJQUFJLGdCQUFnQixFQUFFLENBQUM7NEJBQ3JCLHlEQUF5RDs0QkFDekQsb0JBQW9CO3dCQUN0QixDQUFDOzZCQUFNLENBQUM7NEJBQ04sMERBQTBEOzRCQUMxRCx5REFBeUQ7NEJBQ3pELDBEQUEwRDs0QkFDMUQsd0RBQXdEOzRCQUN4RCx3REFBd0Q7NEJBQ3hELDhDQUE4Qzs0QkFDOUMscURBQXFEOzRCQUNyRCxJQUFJLFVBQTRCLENBQUM7NEJBQ2pDLElBQUksQ0FBQztnQ0FDSCxVQUFVO29DQUNSLFNBQVMsQ0FBQyxRQUFRLEtBQUssU0FBUzt3Q0FDOUIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7d0NBQzFDLENBQUMsQ0FBQyxTQUFTLENBQUM7NEJBQ2xCLENBQUM7NEJBQUMsTUFBTSxDQUFDO2dDQUNQLFVBQVUsR0FBRyxTQUFTLENBQUM7NEJBQ3pCLENBQUM7NEJBQ0QsSUFBSSxZQUErQixDQUFDOzRCQUNwQyxJQUFJLENBQUM7Z0NBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDdkMsS0FBSyxFQUNMO29DQUNFLFNBQVMsRUFBRSxlQUFlO29DQUMxQixXQUFXLEVBQUUsb0JBQW9CO29DQUNqQyxhQUFhLEVBQUUsU0FBUyxDQUFDLE1BQU07b0NBQy9CLFNBQVMsRUFBRTt3Q0FDVCxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUs7d0NBQ3RCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztxQ0FDM0I7aUNBQ0YsRUFDRDtvQ0FDRSxTQUFTO29DQUNULFVBQVU7b0NBQ1YsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO29DQUM1QixtQkFBbUIsRUFBRSxTQUFTLENBQUMsYUFBYTtpQ0FDN0MsQ0FDRixDQUFDO2dDQUNGLHNEQUFzRDtnQ0FDdEQsdURBQXVEO2dDQUN2RCw4Q0FBOEM7Z0NBQzlDLElBQUksRUFBRSxhQUFhLENBQ2pCLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FDaEQsQ0FBQztnQ0FDRix5REFBeUQ7Z0NBQ3pELDJEQUEyRDtnQ0FDM0QseURBQXlEO2dDQUN6RCwyQkFBMkI7Z0NBQzNCLEVBQUU7Z0NBQ0YsdURBQXVEO2dDQUN2RCwyREFBMkQ7Z0NBQzNELHlEQUF5RDtnQ0FDekQsNERBQTREO2dDQUM1RCx5REFBeUQ7Z0NBQ3pELHNEQUFzRDtnQ0FDdEQsc0RBQXNEO2dDQUN0RCwyQkFBMkI7Z0NBQzNCLDJEQUEyRDtnQ0FDM0QsMkRBQTJEO2dDQUMzRCw2REFBNkQ7Z0NBQzdELDBEQUEwRDtnQ0FDMUQsNERBQTREO2dDQUM1RCx5QkFBeUI7Z0NBQ3pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0NBQzNCLFlBQVksR0FBRyxJQUFJO29DQUNqQixDQUFDLENBQUU7d0NBQ0MsR0FBRyxJQUFJO3dDQUNQLFNBQVMsRUFBRTs0Q0FDVCxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUs7NENBQ3RCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTzt5Q0FDM0I7cUNBQ1E7b0NBQ2IsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDaEIsQ0FBQzs0QkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dDQUNiLDBEQUEwRDtnQ0FDMUQsdURBQXVEO2dDQUN2RCwwREFBMEQ7Z0NBQzFELGFBQWE7Z0NBQ2IsRUFBRTtnQ0FDRiwyREFBMkQ7Z0NBQzNELDBEQUEwRDtnQ0FDMUQsMkRBQTJEO2dDQUMzRCx3REFBd0Q7Z0NBQ3hELDBEQUEwRDtnQ0FDMUQsd0NBQXdDO2dDQUN4QyxJQUNFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0NBQ3pCLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQ3ZCLENBQUM7b0NBQ0QsT0FBTztnQ0FDVCxDQUFDO2dDQUNELHlEQUF5RDtnQ0FDekQseURBQXlEO2dDQUN6RCx5REFBeUQ7Z0NBQ3pELDJEQUEyRDtnQ0FDM0QsMkRBQTJEO2dDQUMzRCx3REFBd0Q7Z0NBQ3hELGdEQUFnRDtnQ0FDaEQsTUFBTSxHQUFHLENBQUM7NEJBQ1osQ0FBQzs0QkFDRCx5REFBeUQ7NEJBQ3pELHlEQUF5RDs0QkFDekQscURBQXFEOzRCQUNyRCx5REFBeUQ7NEJBQ3pELHdEQUF3RDs0QkFDeEQsNERBQTREOzRCQUM1RCw2REFBNkQ7NEJBQzdELDREQUE0RDs0QkFDNUQsaURBQWlEOzRCQUNqRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFlBQVksRUFBRSxDQUFDO2dDQUNoRCxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dDQUNwRCxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFDbkMsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs0QkFDakMsQ0FBQzt3QkFDSCxDQUFDLENBQUMsOEJBQThCO29CQUNsQyxDQUFDO29CQUVELHdEQUF3RDtvQkFDeEQsMERBQTBEO29CQUMxRCx1REFBdUQ7b0JBQ3ZELElBQUksZUFBZSxHQUEyQixJQUFJLENBQUM7b0JBRW5ELDZEQUE2RDtvQkFDN0Qsc0RBQXNEO29CQUN0RCxvREFBb0Q7b0JBQ3BELDREQUE0RDtvQkFDNUQsMERBQTBEO29CQUMxRCx3Q0FBd0M7b0JBQ3hDLEVBQUU7b0JBQ0YsMERBQTBEO29CQUMxRCw2REFBNkQ7b0JBQzdELHNEQUFzRDtvQkFDdEQsMERBQTBEO29CQUMxRCwyREFBMkQ7b0JBQzNELDBEQUEwRDtvQkFDMUQsNkRBQTZEO29CQUM3RCx3REFBd0Q7b0JBQ3hELGtDQUFrQztvQkFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO29CQUUzQyw4Q0FBOEM7b0JBQzlDLHdEQUF3RDtvQkFDeEQsK0NBQStDO29CQUMvQyx3REFBd0Q7b0JBQ3hELHlEQUF5RDtvQkFDekQscURBQXFEO29CQUNyRCx1REFBdUQ7b0JBQ3ZELHlEQUF5RDtvQkFDekQsdURBQXVEO29CQUN2RCx5REFBeUQ7b0JBQ3pELHVEQUF1RDtvQkFDdkQsaURBQWlEO29CQUNqRCxvREFBb0Q7b0JBQ3BELHlDQUF5QztvQkFDekMsRUFBRTtvQkFDRix5REFBeUQ7b0JBQ3pELHVEQUF1RDtvQkFDdkQsbURBQW1EO29CQUNuRCxvREFBb0Q7b0JBQ3BELHFEQUFxRDtvQkFDckQsd0RBQXdEO29CQUN4RCxzREFBc0Q7b0JBQ3RELGtEQUFrRDtvQkFDbEQsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO29CQUV0RCxtQkFBbUI7b0JBQ25CLE9BQU8sSUFBSSxFQUFFLENBQUM7d0JBQ1osYUFBYSxFQUFFLENBQUM7d0JBRWhCLG1EQUFtRDt3QkFDbkQsb0RBQW9EO3dCQUNwRCxrREFBa0Q7d0JBQ2xELHNEQUFzRDt3QkFDdEQsc0JBQXNCO3dCQUN0QixJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDOzRCQUMvQixNQUFNLDJCQUEyQixDQUFDO2dDQUNoQyxLQUFLO2dDQUNMLFlBQVk7Z0NBQ1osU0FBUztnQ0FDVCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87Z0NBQ3pCLE9BQU8sRUFBRSxZQUFZLENBQUMsaUJBQWlCO2dDQUN2QyxZQUFZLEVBQUUsWUFBWSxFQUFFOzZCQUM3QixDQUFDLENBQUM7NEJBQ0gseURBQXlEOzRCQUN6RCx5REFBeUQ7NEJBQ3pELE9BQU87d0JBQ1QsQ0FBQzt3QkFFRCw4QkFBOEI7d0JBQzlCLElBQ0UsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLG1CQUFtQjs0QkFDaEMscUJBQXFCLEVBQ3JCLENBQUM7NEJBQ0QsYUFBYSxDQUFDLElBQUksQ0FDaEIsNENBQTRDLEVBQzVDO2dDQUNFLGFBQWEsRUFBRSxLQUFLO2dDQUNwQixhQUFhO2dDQUNiLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsbUJBQW1COzZCQUM1QyxDQUNGLENBQUM7NEJBQ0YsTUFBTSxZQUFZLENBQ2hCLEtBQUssRUFDTCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQzdDO2dDQUNFLEtBQUs7Z0NBQ0wsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLEVBQUU7Z0NBQ3RDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTs2QkFDeEIsQ0FDRixDQUFDOzRCQUNGLE9BQU87d0JBQ1QsQ0FBQzt3QkFFRCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7d0JBQ3BCLHlEQUF5RDt3QkFDekQsa0RBQWtEO3dCQUNsRCwwREFBMEQ7d0JBQzFELElBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO3dCQUNwQyxJQUFJLENBQUM7NEJBQ0gscUNBQXFDOzRCQUNyQyxxREFBcUQ7NEJBQ3JELHNEQUFzRDs0QkFDdEQsaURBQWlEOzRCQUNqRCxxREFBcUQ7NEJBQ3JELHNEQUFzRDs0QkFDdEQsaURBQWlEOzRCQUNqRCxzREFBc0Q7NEJBQ3RELG9EQUFvRDs0QkFDcEQsa0RBQWtEOzRCQUNsRCxxQ0FBcUM7NEJBQ3JDLEVBQUU7NEJBQ0YscURBQXFEOzRCQUNyRCxtREFBbUQ7NEJBQ25ELGdEQUFnRDs0QkFDaEQsb0RBQW9EOzRCQUNwRCxxREFBcUQ7NEJBQ3JELHFEQUFxRDs0QkFDckQsK0JBQStCOzRCQUMvQixrREFBa0Q7NEJBQ2xELHNEQUFzRDs0QkFDdEQsa0NBQWtDOzRCQUNsQyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dDQUM5QixhQUFhLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFO29DQUM3QyxhQUFhLEVBQUUsS0FBSztvQ0FDcEIsYUFBYTtpQ0FDZCxDQUFDLENBQUM7Z0NBQ0gsZ0RBQWdEO2dDQUNoRCwrQ0FBK0M7Z0NBQy9DLG9EQUFvRDtnQ0FDcEQsZ0RBQWdEO2dDQUNoRCxpREFBaUQ7Z0NBQ2pELFFBQVE7Z0NBQ1IsTUFBTSxhQUFhLEVBQUUsQ0FBQztnQ0FDdEIsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO29DQUNsQyxjQUFjLENBQ1osUUFBUSxFQUNSLE1BQU0scUJBQXFCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDcEQsQ0FBQztvQ0FDRixRQUFRLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0NBQzVDLENBQUM7Z0NBQ0QscURBQXFEO2dDQUNyRCw2Q0FBNkM7Z0NBQzdDLHFEQUFxRDtnQ0FDckQsc0RBQXNEO2dDQUN0RCxtREFBbUQ7Z0NBQ25ELE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUM3QyxpQ0FBaUMsQ0FDbEMsQ0FBQztnQ0FDRixNQUFNLGFBQWEsR0FBRyxNQUFNLHNCQUFzQixDQUFDO29DQUNqRCxZQUFZO29DQUNaLFlBQVk7b0NBQ1osV0FBVztvQ0FDWCxlQUFlLEVBQ2IsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPO3dDQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU07d0NBQ2pCLENBQUMsQ0FBQyxTQUFTO29DQUNmLHVCQUF1QixFQUFFLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTztvQ0FDbEQsa0RBQWtEO29DQUNsRCxrREFBa0Q7b0NBQ2xELGNBQWM7b0NBQ2QsZUFBZSxFQUNiLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTzt3Q0FDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNO3dDQUNqQixDQUFDLENBQUMsU0FBUztvQ0FDZixRQUFRO29DQUNSLFVBQVUsRUFBRSxJQUFJO29DQUNoQixjQUFjO29DQUNkLFNBQVM7b0NBQ1QsZ0JBQWdCO29DQUNoQiw4Q0FBOEM7b0NBQzlDLGtEQUFrRDtvQ0FDbEQsK0NBQStDO29DQUMvQyxpREFBaUQ7b0NBQ2pELGdCQUFnQjtvQ0FDaEIsa0RBQWtEO29DQUNsRCxpREFBaUQ7b0NBQ2pELDZDQUE2QztvQ0FDN0MsK0NBQStDO29DQUMvQyxnREFBZ0Q7b0NBQ2hELDZDQUE2QztvQ0FDN0MseUNBQXlDO29DQUN6Qyx1QkFBdUI7b0NBQ3ZCLGVBQWUsRUFBRSxRQUFRLENBQUMsT0FBTztvQ0FDakMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxTQUFTO29DQUNsQyxTQUFTO2lDQUNWLENBQUMsQ0FBQztnQ0FDSCxJQUFJLGFBQWEsRUFBRSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7b0NBQ2hELHVDQUF1QztvQ0FDdkMsaURBQWlEO29DQUNqRCwyQ0FBMkM7b0NBQzNDLGlEQUFpRDtvQ0FDakQsK0NBQStDO29DQUMvQywyQ0FBMkM7b0NBQzNDLHdDQUF3QztvQ0FDeEMsZ0RBQWdEO29DQUNoRCxPQUFPLE1BQU0sUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQ0FDdEQsQ0FBQztnQ0FDRCxPQUFPOzRCQUNULENBQUM7NEJBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dDQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLHFCQUFxQixDQUN0QyxLQUFLLEVBQ0wsUUFBUSxDQUFDLElBQUksS0FBSyxXQUFXO29DQUMzQixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU07b0NBQ2pCLENBQUMsQ0FBQyxTQUFTLENBQ2QsQ0FBQztnQ0FDRixJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7b0NBQ2xDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7b0NBQy9CLFFBQVEsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztnQ0FDNUMsQ0FBQztxQ0FBTSxDQUFDO29DQUNOLFFBQVEsR0FBRzt3Q0FDVCxHQUFHLElBQUk7d0NBQ1AsSUFBSSxFQUFFLE9BQU87cUNBQ2QsQ0FBQztnQ0FDSixDQUFDOzRCQUNILENBQUM7NEJBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7NEJBRWxDLCtCQUErQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFFakQscURBQXFEOzRCQUNyRCxxREFBcUQ7NEJBQ3JELHVEQUF1RDs0QkFDdkQsc0RBQXNEOzRCQUN0RCxzREFBc0Q7NEJBQ3RELGdEQUFnRDs0QkFDaEQsSUFBSSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0NBQ3hELE9BQU87NEJBQ1QsQ0FBQzs0QkFFRCx5QkFBeUI7NEJBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFDdkIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FDOUIsUUFBUSxDQUFDLE1BQU07aUNBQ1osTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLGdCQUFnQixDQUFDO2lDQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FDL0IsQ0FBQzs0QkFDRixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsTUFBTTtpQ0FDcEMsTUFBTSxDQUNMLENBQ0UsQ0FBQyxFQUkyQixFQUFFLENBQzlCLENBQUMsQ0FBQyxTQUFTLEtBQUssY0FBYztnQ0FDOUIsQ0FBQyxDQUFDLGFBQWEsS0FBSyxTQUFTO2dDQUM3QixDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2dDQUN0QyxHQUFHLElBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFpQixDQUFDLE9BQU8sRUFBRSxDQUNsRDtpQ0FDQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0NBQ1gsU0FBUyxFQUFFLGdCQUF5QjtnQ0FDcEMsV0FBVyxFQUFFLG9CQUFvQjtnQ0FDakMsYUFBYSxFQUFFLENBQUMsQ0FBQyxhQUFhO2dDQUM5QixTQUFTLEVBQUU7b0NBQ1QsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUTtpQ0FDL0I7NkJBQ0YsQ0FBQyxDQUFDLENBQUM7NEJBRU4sS0FBSyxNQUFNLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQ0FDeEMsSUFBSSxDQUFDO29DQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sV0FBVyxDQUFDLFNBQVMsRUFBRTt3Q0FDM0MsU0FBUztxQ0FDVixDQUFDLENBQUM7b0NBQ0gscURBQXFEO29DQUNyRCxzREFBc0Q7b0NBQ3RELHFEQUFxRDtvQ0FDckQsbUJBQW1CO29DQUNuQixFQUFFO29DQUNGLHFEQUFxRDtvQ0FDckQsb0RBQW9EO29DQUNwRCxxREFBcUQ7b0NBQ3JELHNEQUFzRDtvQ0FDdEQsc0RBQXNEO29DQUN0RCxzREFBc0Q7b0NBQ3RELHFEQUFxRDtvQ0FDckQsdUJBQXVCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztnQ0FDcEQsQ0FBQztnQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29DQUNiLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0NBQ2hDLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLGtDQUFrQyxFQUNsQzs0Q0FDRSxhQUFhLEVBQUUsS0FBSzs0Q0FDcEIsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhO3lDQUN2QyxDQUNGLENBQUM7d0NBQ0YsU0FBUztvQ0FDWCxDQUFDO29DQUNELE1BQU0sR0FBRyxDQUFDO2dDQUNaLENBQUM7NEJBQ0gsQ0FBQzs0QkFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQzs0QkFFbEMsbURBQW1EOzRCQUNuRCx3REFBd0Q7NEJBQ3hELHdEQUF3RDs0QkFDeEQsd0RBQXdEOzRCQUN4RCxzREFBc0Q7NEJBQ3RELHdEQUF3RDs0QkFDeEQsc0RBQXNEOzRCQUN0RCxrREFBa0Q7NEJBQ2xELHlEQUF5RDs0QkFDekQsMENBQTBDOzRCQUMxQyx5REFBeUQ7NEJBQ3pELE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxHQUFHLENBQ3pDLFFBQVEsQ0FBQyxNQUFNO2lDQUNaLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQztpQ0FDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQy9CLENBQUM7NEJBQ0YsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUNuRCxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ1osQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQzlCLFNBQVMsQ0FBQyxhQUFhLENBQ3hCLENBQ0osQ0FBQzs0QkFFRixJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDdEMsc0RBQXNEO2dDQUN0RCx1REFBdUQ7Z0NBQ3ZELHVEQUF1RDtnQ0FDdkQscURBQXFEO2dDQUNyRCx1REFBdUQ7Z0NBQ3ZELG9EQUFvRDtnQ0FDcEQsYUFBYTtnQ0FDYixJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQ0FDcEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxxQkFBcUIsQ0FDdEMsS0FBSyxFQUNMLFFBQVEsQ0FBQyxNQUFNLENBQ2hCLENBQUM7b0NBQ0YsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FDekMsSUFBSSxDQUFDLE1BQU07eUNBQ1IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLGdCQUFnQixDQUFDO3lDQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FDL0IsQ0FBQztvQ0FDRixNQUFNLHFCQUFxQixHQUN6QixzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUN6QywyQkFBMkIsQ0FBQyxHQUFHLENBQzdCLFNBQVMsQ0FBQyxhQUFhLENBQ3hCLENBQ0YsQ0FBQztvQ0FFSixJQUFJLHFCQUFxQixFQUFFLENBQUM7d0NBQzFCLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7b0NBQ2pDLENBQUM7eUNBQU0sQ0FBQzt3Q0FDTixRQUFRLEdBQUc7NENBQ1QsR0FBRyxDQUFDLE1BQU0scUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7NENBQ3ZDLElBQUksRUFBRSxPQUFPO3lDQUNkLENBQUM7b0NBQ0osQ0FBQztnQ0FDSCxDQUFDO3FDQUFNLENBQUM7b0NBQ04sUUFBUSxHQUFHO3dDQUNULEdBQUcsQ0FBQyxNQUFNLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dDQUN2QyxJQUFJLEVBQUUsT0FBTztxQ0FDZCxDQUFDO2dDQUNKLENBQUM7NEJBQ0gsQ0FBQzs0QkFFRCx3REFBd0Q7NEJBQ3hELGtEQUFrRDs0QkFDbEQsMERBQTBEOzRCQUMxRCwwREFBMEQ7NEJBQzFELHlEQUF5RDs0QkFDekQsbURBQW1EOzRCQUNuRCw0QkFBNEI7NEJBQzVCLEVBQUU7NEJBQ0YsdURBQXVEOzRCQUN2RCxpREFBaUQ7NEJBQ2pELHNEQUFzRDs0QkFDdEQsSUFBSSxxQkFBcUIsRUFBRSxFQUFFLENBQUM7Z0NBQzVCLE1BQU0sT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsS0FBSyxFQUFFO29DQUM5QyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07b0NBQ3ZCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtpQ0FDeEIsQ0FBQyxDQUFDO2dDQUNILFFBQVEsR0FBRztvQ0FDVCxHQUFHLE9BQU8sQ0FBQyxHQUFHO29DQUNkLElBQUksRUFBRSxPQUFPO2lDQUNkLENBQUM7Z0NBQ0YsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO29DQUM5QixNQUFNLElBQUksc0JBQXNCLENBQzlCLHFCQUFxQixLQUFLLHVCQUF1QixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxXQUFXLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTywrQ0FBK0MsQ0FDeEwsQ0FBQztnQ0FDSixDQUFDOzRCQUNILENBQUM7NEJBRUQseURBQXlEOzRCQUN6RCx5REFBeUQ7NEJBQ3pELG1EQUFtRDs0QkFDbkQsd0RBQXdEOzRCQUN4RCxvQkFBb0I7NEJBQ3BCLElBQUksMkJBQTJCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2dDQUN4RCxPQUFPOzRCQUNULENBQUM7NEJBRUQscURBQXFEOzRCQUNyRCxzREFBc0Q7NEJBQ3RELHlEQUF5RDs0QkFDekQsb0NBQW9DOzRCQUNwQyx1REFBdUQ7NEJBQ3ZELHdEQUF3RDs0QkFDeEQseURBQXlEOzRCQUN6RCxrREFBa0Q7NEJBQ2xELHdEQUF3RDs0QkFDeEQsdURBQXVEOzRCQUN2RCxVQUFVOzRCQUNWLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dDQUNqQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUMvQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUM1QyxDQUFDLENBQ0YsQ0FBQztnQ0FDRixJQUFJLGtCQUFrQixJQUFJLGNBQWMsRUFBRSxDQUFDO29DQUN6QyxNQUFNLElBQUksc0JBQXNCLENBQzlCLGtCQUFrQixFQUNsQixjQUFjLENBQ2YsQ0FBQztnQ0FDSixDQUFDOzRCQUNILENBQUM7NEJBRUQsd0RBQXdEOzRCQUN4RCxxREFBcUQ7NEJBQ3JELHdEQUF3RDs0QkFDeEQsZ0RBQWdEOzRCQUNoRCx1REFBdUQ7NEJBQ3ZELHVEQUF1RDs0QkFDdkQscURBQXFEOzRCQUNyRCwyREFBMkQ7NEJBQzNELHdEQUF3RDs0QkFDeEQsdURBQXVEOzRCQUN2RCx5REFBeUQ7NEJBQ3pELHlEQUF5RDs0QkFDekQsc0RBQXNEOzRCQUN0RCxvQ0FBb0M7NEJBQ3BDLHNCQUFzQixLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUM5QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLFNBQVMsS0FBSyxhQUFhO2dDQUM3QixDQUFDLENBQUMsU0FBUyxLQUFLLGFBQWE7Z0NBQzdCLENBQUMsQ0FBQyxTQUFTLEtBQUssVUFBVTtnQ0FDMUIsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQ3ZCLENBQUM7NEJBRUYsYUFBYSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRTtnQ0FDakQsYUFBYSxFQUFFLEtBQUs7Z0NBQ3BCLGFBQWE7Z0NBQ2IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTTtnQ0FDbEMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFROzZCQUN2RCxDQUFDLENBQUM7NEJBQ0gsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFDekIscURBQXFEOzRCQUNyRCxxREFBcUQ7NEJBQ3JELDBDQUEwQzs0QkFDMUMsbURBQW1EOzRCQUNuRCxnREFBZ0Q7NEJBQ2hELElBQUksY0FBYyxFQUFFLENBQUM7Z0NBQ25CLGNBQWMsQ0FBQyxpQkFBaUIsS0FBSyxXQUFXLENBQUM7NEJBQ25ELENBQUM7NEJBQ0Qsc0RBQXNEOzRCQUN0RCxxREFBcUQ7NEJBQ3JELHVEQUF1RDs0QkFDdkQsdURBQXVEOzRCQUN2RCwwREFBMEQ7NEJBQzFELE1BQU0sa0JBQWtCLEdBQ3RCLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUN2QyxNQUFNLENBQ0osa0JBQWtCLEVBQ2xCLG1EQUFtRCxDQUNwRCxDQUFDOzRCQUNGLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FDL0MsV0FBVyxFQUNYLFFBQVEsQ0FBQyxNQUFNLENBQ2hCLENBQUM7NEJBQ0YsSUFBSSxjQUFjLEdBQXlCLGVBQWU7Z0NBQ3hELENBQUMsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQ0FDeEQsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOzRCQUN2QixtREFBbUQ7NEJBQ25ELHdEQUF3RDs0QkFDeEQsdURBQXVEOzRCQUN2RCxzREFBc0Q7NEJBQ3RELHNEQUFzRDs0QkFDdEQsOEJBQThCOzRCQUM5Qix1QkFBdUI7Z0NBQ3JCLGVBQWUsS0FBSyxJQUFJO29DQUN4QixjQUFjLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQzs0QkFFbkMsSUFBSSxjQUFjLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dDQUNyQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dDQUN2QixNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQ0FDbkQsTUFBTSxDQUNKLFFBQVEsRUFDUixnREFBZ0QsQ0FDakQsQ0FBQztnQ0FDRixjQUFjLEdBQUcsTUFBTSxjQUFjLENBQUM7b0NBQ3BDLFlBQVk7b0NBQ1osV0FBVztvQ0FDWCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07b0NBQ3ZCLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQyxLQUFLO29DQUN4QyxrQkFBa0I7b0NBQ2xCLHVCQUF1QixFQUFFLE1BQU0sUUFBUTtvQ0FDdkMsOENBQThDO29DQUM5QyxnREFBZ0Q7b0NBQ2hELHNEQUFzRDtvQ0FDdEQsZUFBZTtvQ0FDZixpQkFBaUIsRUFBRSxLQUFLLENBQUMsWUFBWTtpQ0FDdEMsQ0FBQyxDQUFDOzRCQUNMLENBQUM7NEJBQ0QsTUFBTSxjQUFjLENBQUM7NEJBRXJCLElBQUksY0FBYyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztnQ0FDeEMsb0RBQW9EO2dDQUNwRCxvREFBb0Q7Z0NBQ3BELG1EQUFtRDtnQ0FDbkQsZUFBZSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0NBQ3pDLE1BQU0sY0FBYyxDQUFDLFVBQVUsQ0FBQzs0QkFDbEMsQ0FBQzs0QkFFRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDOzRCQUNyQyxhQUFhLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFO2dDQUNsRCxhQUFhLEVBQUUsS0FBSztnQ0FDcEIsYUFBYTtnQ0FDYixRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVc7Z0NBQ2xDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUTs2QkFDdkQsQ0FBQyxDQUFDOzRCQUNILHNCQUFzQixDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUVsQyx5REFBeUQ7NEJBQ3pELHVEQUF1RDs0QkFDdkQsMkRBQTJEOzRCQUMzRCxvREFBb0Q7NEJBQ3BELDJEQUEyRDs0QkFDM0Qsa0NBQWtDOzRCQUNsQyxJQUFJLENBQUM7Z0NBQ0gsd0RBQXdEO2dDQUN4RCxzREFBc0Q7Z0NBQ3RELDZDQUE2QztnQ0FDN0MsTUFBTSxhQUFhLEVBQUUsQ0FBQztnQ0FDdEIsTUFBTSxXQUFXLENBQ2Y7b0NBQ0UsU0FBUyxFQUFFLGVBQWU7b0NBQzFCLFdBQVcsRUFBRSxvQkFBb0I7b0NBQ2pDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7aUNBQzlCLEVBQ0QsRUFBRSxTQUFTLEVBQUUsQ0FDZCxDQUFDOzRCQUNKLENBQUM7NEJBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQ0FDYixJQUNFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0NBQzNCLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQ3ZCLENBQUM7b0NBQ0QsYUFBYSxDQUFDLElBQUksQ0FDaEIsOERBQThELEVBQzlELEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUMvQyxDQUFDO29DQUNGLE9BQU87Z0NBQ1QsQ0FBQztnQ0FDRCxNQUFNLEdBQUcsQ0FBQzs0QkFDWixDQUFDOzRCQUVELElBQUksRUFBRSxhQUFhLENBQUM7Z0NBQ2xCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQzs2QkFDNUMsQ0FBQyxDQUFDOzRCQUNILE9BQU87d0JBQ1QsQ0FBQzt3QkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDOzRCQUNiLElBQUksa0JBQWtCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0NBQy9CLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dDQUNsQyxtREFBbUQ7Z0NBQ25ELHVEQUF1RDtnQ0FDdkQsNkJBQTZCO2dDQUM3QixtREFBbUQ7Z0NBQ25ELHNEQUFzRDtnQ0FDdEQsb0RBQW9EO2dDQUNwRCxtREFBbUQ7Z0NBQ25ELGlEQUFpRDtnQ0FDakQsb0RBQW9EO2dDQUNwRCxpREFBaUQ7Z0NBQ2pELGtEQUFrRDtnQ0FDbEQsZ0RBQWdEO2dDQUNoRCwwQ0FBMEM7Z0NBQzFDLG9EQUFvRDtnQ0FDcEQscURBQXFEO2dDQUNyRCxnQ0FBZ0M7Z0NBQ2hDLEVBQUU7Z0NBQ0Ysb0RBQW9EO2dDQUNwRCxrREFBa0Q7Z0NBQ2xELDRDQUE0QztnQ0FDNUMsdURBQXVEO2dDQUN2RCxpREFBaUQ7Z0NBQ2pELG1EQUFtRDtnQ0FDbkQsbURBQW1EO2dDQUNuRCw2Q0FBNkM7Z0NBQzdDLG9EQUFvRDtnQ0FDcEQsK0NBQStDO2dDQUMvQyxvQ0FBb0M7Z0NBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQ0FDakMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDO2dDQUNyRCxzREFBc0Q7Z0NBQ3RELHFEQUFxRDtnQ0FDckQscURBQXFEO2dDQUNyRCxtREFBbUQ7Z0NBQ25ELG1EQUFtRDtnQ0FDbkQsb0JBQW9CO2dDQUNwQixJQUFJLGNBQWMsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO29DQUN4QyxjQUFjLENBQUMsdUJBQXVCO3dDQUNwQyxhQUFhLENBQUM7Z0NBQ2xCLENBQUM7Z0NBQ0QsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTtvQ0FDeEMsYUFBYSxFQUFFLEtBQUs7b0NBQ3BCLGFBQWE7b0NBQ2IsUUFBUSxFQUFFLGdCQUFnQjtvQ0FDMUIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTO29DQUNwQixLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVM7b0NBQ3BCLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUztpQ0FDckIsQ0FBQyxDQUFDO2dDQUNILE1BQU0saUJBQWlCLEdBQ3JCLDhCQUE4QixDQUM1QixHQUFHLENBQUMsU0FBUyxFQUNiLEdBQUcsQ0FBQyxTQUFTLEVBQ2IsR0FBRyxDQUFDLFNBQVMsQ0FDZCxDQUFDO2dDQUNKLElBQUksaUJBQWlCLEVBQUUsQ0FBQztvQ0FDdEIsYUFBYSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dDQUN6QyxDQUFDO2dDQUVELCtDQUErQztnQ0FDL0MsMERBQTBEO2dDQUMxRCxzREFBc0Q7Z0NBQ3RELHlEQUF5RDtnQ0FDekQsd0RBQXdEO2dDQUN4RCxtREFBbUQ7Z0NBQ25ELDhDQUE4QztnQ0FDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dDQUNuQyxNQUFNLENBQ0osUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQ3pCLG9EQUFvRCxDQUNyRCxDQUFDO2dDQUNGLElBQUksZ0JBRUgsQ0FBQztnQ0FDRixJQUFJLENBQUM7b0NBQ0gsZ0JBQWdCLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQzt3Q0FDeEMsVUFBVSxFQUFFLEdBQUc7d0NBQ2YsS0FBSzt3Q0FDTCxHQUFHLEVBQUUsV0FBVzt3Q0FDaEIsSUFBSTt3Q0FDSixTQUFTO3dDQUNULFFBQVE7d0NBQ1IsZUFBZTt3Q0FDZixzQkFBc0I7d0NBQ3RCLCtDQUErQzt3Q0FDL0MsNkNBQTZDO3dDQUM3QyxrREFBa0Q7d0NBQ2xELGlEQUFpRDt3Q0FDakQsa0RBQWtEO3dDQUNsRCxzQ0FBc0M7d0NBQ3RDLFlBQVksRUFBRTs0Q0FDWixTQUFTLEVBQUUsb0JBQW9CLENBQzdCLFlBQVksRUFDWixTQUFTLENBQ1Y7NENBQ0QsZUFBZSxFQUFFLGdCQUFnQjt5Q0FDbEM7d0NBQ0QsOENBQThDO3dDQUM5Qyw2Q0FBNkM7d0NBQzdDLHdDQUF3Qzt3Q0FDeEMsK0NBQStDO3dDQUMvQyw4Q0FBOEM7d0NBQzlDLHdDQUF3Qzt3Q0FDeEMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxTQUFTO3dDQUNsQyw4Q0FBOEM7d0NBQzlDLCtDQUErQzt3Q0FDL0MsOEJBQThCO3dDQUM5Qiw2Q0FBNkM7d0NBQzdDLDhDQUE4Qzt3Q0FDOUMsNkNBQTZDO3dDQUM3QywrQ0FBK0M7d0NBQy9DLHNCQUFzQixFQUFFLElBQUk7cUNBQzdCLENBQUMsQ0FBQztnQ0FDTCxDQUFDO2dDQUFDLE9BQU8sZUFBZSxFQUFFLENBQUM7b0NBQ3pCLHVEQUF1RDtvQ0FDdkQsc0RBQXNEO29DQUN0RCx1REFBdUQ7b0NBQ3ZELHFEQUFxRDtvQ0FDckQsb0RBQW9EO29DQUNwRCxzREFBc0Q7b0NBQ3RELCtCQUErQjtvQ0FDL0IsSUFBSSx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQzt3Q0FDaEQsSUFDRSxzQkFBc0IsQ0FDcEIsbUJBQW1CLEVBQ25CLGVBQWUsQ0FDaEIsRUFDRCxDQUFDOzRDQUNELFNBQVM7d0NBQ1gsQ0FBQzt3Q0FDRCxNQUFNLFVBQVUsR0FDZCxNQUFNLDJCQUEyQixDQUMvQixtQkFBbUIsRUFDbkIsZUFBZSxDQUNoQixDQUFDO3dDQUNKLElBQUksVUFBVSxDQUFDLFNBQVM7NENBQUUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO3dDQUNuRCxpREFBaUQ7d0NBQ2pELDJDQUEyQzt3Q0FDM0MsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDO29DQUN6QixDQUFDO29DQUNELElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7d0NBQ3BDLDRDQUE0Qzt3Q0FDNUMseUNBQXlDO3dDQUN6QyxNQUFNLGVBQWUsQ0FBQztvQ0FDeEIsQ0FBQztvQ0FDRCw2Q0FBNkM7b0NBQzdDLCtDQUErQztvQ0FDL0MsZ0RBQWdEO29DQUNoRCwrQ0FBK0M7b0NBQy9DLGdEQUFnRDtvQ0FDaEQsaURBQWlEO29DQUNqRCw0Q0FBNEM7b0NBQzVDLHlCQUF5QjtvQ0FDekIsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7b0NBQ3BELGFBQWEsQ0FBQyxLQUFLLENBQ2pCLHVFQUF1RSxFQUN2RTt3Q0FDRSxhQUFhLEVBQUUsS0FBSzt3Q0FDcEIsU0FBUzt3Q0FDVCxTQUFTLEVBQUUsZUFBZSxDQUFDLElBQUk7d0NBQy9CLFlBQVksRUFBRSxlQUFlLENBQUMsT0FBTztxQ0FDdEMsQ0FDRixDQUFDO29DQUNGLElBQUksQ0FBQzt3Q0FDSCw0Q0FBNEM7d0NBQzVDLDhDQUE4Qzt3Q0FDOUMsTUFBTSxhQUFhLEVBQUUsQ0FBQzt3Q0FDdEIsTUFBTSxXQUFXLENBQ2Y7NENBQ0UsU0FBUyxFQUFFLFlBQVk7NENBQ3ZCLFdBQVcsRUFBRSxvQkFBb0I7NENBQ2pDLFNBQVMsRUFBRTtnREFDVCxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FDNUIsZUFBZSxFQUNmLEtBQUssRUFDTCxNQUFNLGFBQWEsQ0FBQyxLQUFLLEVBQ3pCLFVBQVUsRUFDVixDQUFDLFdBQVcsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDO29EQUM3QixpQ0FBaUMsQ0FDcEM7Z0RBQ0QsU0FBUzs2Q0FDVjt5Q0FDRixFQUNELEVBQUUsU0FBUyxFQUFFLENBQ2QsQ0FBQztvQ0FDSixDQUFDO29DQUFDLE9BQU8sT0FBTyxFQUFFLENBQUM7d0NBQ2pCLElBQ0UsbUJBQW1CLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQzs0Q0FDL0IsZUFBZSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFDM0IsQ0FBQzs0Q0FDRCxhQUFhLENBQUMsSUFBSSxDQUNoQiwyREFBMkQsRUFDM0Q7Z0RBQ0UsYUFBYSxFQUFFLEtBQUs7Z0RBQ3BCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTzs2Q0FDekIsQ0FDRixDQUFDOzRDQUNGLE9BQU87d0NBQ1QsQ0FBQzt3Q0FDRCxNQUFNLE9BQU8sQ0FBQztvQ0FDaEIsQ0FBQztvQ0FDRCxJQUFJLEVBQUUsYUFBYSxDQUFDO3dDQUNsQixHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7d0NBQ3hDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQzt3Q0FDekMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQzVCLGVBQWUsQ0FBQyxJQUFJLENBQ3JCO3dDQUNELEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUMvQixlQUFlLENBQUMsT0FBTyxDQUN4Qjt3Q0FDRCxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztxQ0FDN0MsQ0FBQyxDQUFDO29DQUNILE9BQU87Z0NBQ1QsQ0FBQztnQ0FDRCxvREFBb0Q7Z0NBQ3BELHdEQUF3RDtnQ0FDeEQsZ0RBQWdEO2dDQUNoRCxzREFBc0Q7Z0NBQ3RELHVEQUF1RDtnQ0FDdkQscURBQXFEO2dDQUNyRCxvREFBb0Q7Z0NBQ3BELHNEQUFzRDtnQ0FDdEQscURBQXFEO2dDQUNyRCxvREFBb0Q7Z0NBQ3BELHVEQUF1RDtnQ0FDdkQsdUNBQXVDO2dDQUN2QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO29DQUM3QixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQztvQ0FDbEMsT0FBTyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBQy9DLENBQUMsQ0FBQyxDQUFDO2dDQUVILE1BQU0saUJBQWlCLEdBQUcsZUFBZTtvQ0FDdkMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO3dDQUNuQixVQUFVLEVBQUUsR0FBRzt3Q0FDZix5QkFBeUIsRUFDdkIsZ0JBQWdCLENBQUMseUJBQXlCO3dDQUM1QywrQ0FBK0M7d0NBQy9DLDZDQUE2Qzt3Q0FDN0MsOENBQThDO3dDQUM5QyxnQkFBZ0IsRUFDZCxnQkFBZ0IsQ0FBQyxzQkFBc0I7NENBQ3ZDLGdCQUFnQixDQUFDLGVBQWU7cUNBQ25DLENBQUM7b0NBQ0osQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQ0FDZCxJQUFJLGlCQUFpQixFQUFFLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztvQ0FDeEMsZUFBZSxHQUFHLElBQUksQ0FBQztnQ0FDekIsQ0FBQztnQ0FDRCxpQkFBaUIsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUM7Z0NBQ3JELElBQ0UsZ0JBQWdCLENBQUMsa0JBQWtCO29DQUNuQywyQkFBMkIsS0FBSyxTQUFTLEVBQ3pDLENBQUM7b0NBQ0QsMkJBQTJCLEdBQUcsaUJBQWlCLENBQUM7Z0NBQ2xELENBQUM7Z0NBQ0QsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTtvQ0FDeEMsYUFBYSxFQUFFLEtBQUs7b0NBQ3BCLFlBQVksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsZUFBZTtvQ0FDMUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxNQUFNO29DQUNsRCxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE9BQU87b0NBQ3JELGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxlQUFlO29DQUNqRCxzQkFBc0IsRUFDcEIsZ0JBQWdCLENBQUMsc0JBQXNCO29DQUN6QyxrQkFBa0IsRUFDaEIsZ0JBQWdCLENBQUMsa0JBQWtCO29DQUNyQyxHQUFHLENBQUMsaUJBQWlCO3dDQUNuQixDQUFDLENBQUM7NENBQ0UsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsTUFBTTtnREFDM0MsQ0FBQyxDQUFDLFVBQVU7Z0RBQ1osQ0FBQyxDQUFDLFFBQVE7eUNBQ2I7d0NBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQ0FDUCxHQUFHLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxLQUFLLEtBQUs7d0NBQ3JDLENBQUMsQ0FBQzs0Q0FDRSx5QkFBeUIsRUFDdkIsaUJBQWlCLENBQUMsTUFBTTt5Q0FDM0I7d0NBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQ0FDUCxHQUFHLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEdBQUcsQ0FBQzt3Q0FDaEQsQ0FBQyxDQUFDLCtCQUErQixDQUM3QixnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFDdEMsZ0JBQWdCLENBQUMseUJBQXlCLENBQzNDO3dDQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7aUNBQ1IsQ0FBQyxDQUFDO2dDQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7bUNBaUNHO2dDQUNILE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsT0FBMEIsRUFDMUIsT0FBeUMsRUFDaEMsRUFBRTtvQ0FDWCxJQUFJLENBQUMsZUFBZTt3Q0FBRSxPQUFPLEtBQUssQ0FBQztvQ0FDbkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDMUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUNsQyxDQUFDO29DQUNGLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO3dDQUFFLE9BQU8sS0FBSyxDQUFDO29DQUNyQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO3dDQUN2QixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0NBQzNCLENBQUM7b0NBQ0QsTUFBTSxpQkFBaUIsR0FDckIsZ0JBQWdCLENBQUMsc0JBQXNCO3dDQUN2QyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO29DQUMvQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3Q0FDdkIsZ0RBQWdEO3dDQUNoRCxrREFBa0Q7d0NBQ2xELCtDQUErQzt3Q0FDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7d0NBQ2xDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQ0FDeEMsQ0FBQztvQ0FDRCxhQUFhLENBQUMsS0FBSyxDQUNqQix5Q0FBeUMsRUFDekM7d0NBQ0UsYUFBYSxFQUFFLEtBQUs7d0NBQ3BCLGFBQWE7d0NBQ2IsT0FBTzt3Q0FDUCxPQUFPLEVBQUUsS0FBSzt3Q0FDZCxjQUFjLEVBQ1osZ0JBQWdCLENBQUMsc0JBQXNCO3dDQUN6QyxnQkFBZ0IsRUFBRSxDQUFDLGlCQUFpQjtxQ0FDckMsQ0FDRixDQUFDO29DQUNGLElBQUksRUFBRSxhQUFhLENBQUM7d0NBQ2xCLG1DQUFtQyxFQUNqQyxnQkFBZ0IsQ0FBQyxJQUFJO3FDQUN4QixDQUFDLENBQUM7b0NBQ0gsT0FBTyxJQUFJLENBQUM7Z0NBQ2QsQ0FBQyxDQUFDO2dDQUVGLG1EQUFtRDtnQ0FDbkQsNENBQTRDO2dDQUM1QyxvREFBb0Q7Z0NBQ3BELG9EQUFvRDtnQ0FDcEQsNENBQTRDO2dDQUM1QyxrREFBa0Q7Z0NBQ2xELHVEQUF1RDtnQ0FDdkQsbURBQW1EO2dDQUNuRCxpREFBaUQ7Z0NBQ2pELG1EQUFtRDtnQ0FDbkQsa0RBQWtEO2dDQUNsRCxvREFBb0Q7Z0NBQ3BELHFEQUFxRDtnQ0FDckQscUJBQXFCO2dDQUNyQixJQUFJLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxDQUFDO29DQUNyQyxJQUNFLHFCQUFxQixDQUNuQixnQkFBZ0IsQ0FBQywwQkFBMEIsRUFDM0MsZUFBZSxDQUNoQixFQUNELENBQUM7d0NBQ0QsU0FBUztvQ0FDWCxDQUFDO29DQUNELE9BQU8sTUFBTSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQzNCLENBQUM7Z0NBRUQsdURBQXVEO2dDQUN2RCx1REFBdUQ7Z0NBQ3ZELHdEQUF3RDtnQ0FDeEQsdURBQXVEO2dDQUN2RCx1REFBdUQ7Z0NBQ3ZELHNEQUFzRDtnQ0FDdEQsa0RBQWtEO2dDQUNsRCxzREFBc0Q7Z0NBQ3RELHVEQUF1RDtnQ0FDdkQsbUJBQW1CO2dDQUNuQixxREFBcUQ7Z0NBQ3JELHVEQUF1RDtnQ0FDdkQsa0RBQWtEO2dDQUNsRCxtREFBbUQ7Z0NBQ25ELDJDQUEyQztnQ0FDM0MsSUFBSSxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29DQUN4QyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7b0NBQ3RDLFNBQVM7Z0NBQ1gsQ0FBQztnQ0FFRCxpREFBaUQ7Z0NBQ2pELHNEQUFzRDtnQ0FDdEQscURBQXFEO2dDQUNyRCxvREFBb0Q7Z0NBQ3BELG9EQUFvRDtnQ0FDcEQscURBQXFEO2dDQUNyRCxvREFBb0Q7Z0NBQ3BELGtEQUFrRDtnQ0FDbEQsbURBQW1EO2dDQUNuRCxtREFBbUQ7Z0NBQ25ELHFEQUFxRDtnQ0FDckQsaURBQWlEO2dDQUNqRCwyQ0FBMkM7Z0NBQzNDLG1EQUFtRDtnQ0FDbkQsaUJBQWlCO2dDQUNqQixJQUNFLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDLElBQUksR0FBRyxDQUFDLEVBQ2xELENBQUM7b0NBQ0Qsb0RBQW9EO29DQUNwRCxnREFBZ0Q7b0NBQ2hELG1EQUFtRDtvQ0FDbkQsK0NBQStDO29DQUMvQyxrREFBa0Q7b0NBQ2xELGlEQUFpRDtvQ0FDakQsaURBQWlEO29DQUNqRCw0QkFBNEI7b0NBQzVCLE1BQU0sZ0JBQWdCLENBQUMsaUJBQWlCLENBQUM7b0NBQ3pDLG1EQUFtRDtvQ0FDbkQsOENBQThDO29DQUM5Qyw4Q0FBOEM7b0NBQzlDLGdEQUFnRDtvQ0FDaEQsZ0RBQWdEO29DQUNoRCxtREFBbUQ7b0NBQ25ELDZDQUE2QztvQ0FDN0MsNENBQTRDO29DQUM1QyxrREFBa0Q7b0NBQ2xELEVBQUU7b0NBQ0YsMkNBQTJDO29DQUMzQywrQ0FBK0M7b0NBQy9DLGdEQUFnRDtvQ0FDaEQsZ0RBQWdEO29DQUNoRCxrREFBa0Q7b0NBQ2xELDBDQUEwQztvQ0FDMUMsZUFBZSxHQUFHLElBQUksQ0FBQztvQ0FDdkIsUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29DQUN0QyxTQUFTO2dDQUNYLENBQUM7Z0NBRUQsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDO2dDQUVuRCw4Q0FBOEM7Z0NBQzlDLHlEQUF5RDtnQ0FDekQsd0RBQXdEO2dDQUN4RCxtREFBbUQ7Z0NBQ25ELDBEQUEwRDtnQ0FDMUQseURBQXlEO2dDQUN6RCx3REFBd0Q7Z0NBQ3hELGdEQUFnRDtnQ0FDaEQseURBQXlEO2dDQUN6RCwwREFBMEQ7Z0NBQzFELGlEQUFpRDtnQ0FDakQsdURBQXVEO2dDQUN2RCxnQkFBZ0I7Z0NBQ2hCLEVBQUU7Z0NBQ0YseUNBQXlDO2dDQUN6Qyx5REFBeUQ7Z0NBQ3pELHFEQUFxRDtnQ0FDckQseURBQXlEO2dDQUN6RCx1REFBdUQ7Z0NBQ3ZELHNEQUFzRDtnQ0FDdEQsdURBQXVEO2dDQUN2RCwyQ0FBMkM7Z0NBQzNDLHlEQUF5RDtnQ0FDekQseURBQXlEO2dDQUN6RCxvREFBb0Q7Z0NBQ3BELHNEQUFzRDtnQ0FDdEQsc0RBQXNEO2dDQUN0RCwwQkFBMEI7Z0NBQzFCLE1BQU0sZUFBZSxHQUNuQixnQkFBZ0IsQ0FBQyxlQUFlLENBQUM7Z0NBQ25DLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQ2xDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FDNUMsQ0FBQztnQ0FFRixtREFBbUQ7Z0NBQ25ELG9EQUFvRDtnQ0FDcEQsbURBQW1EO2dDQUNuRCxpREFBaUQ7Z0NBQ2pELG9EQUFvRDtnQ0FDcEQsZ0RBQWdEO2dDQUNoRCxRQUFRO2dDQUNSLEVBQUU7Z0NBQ0YscURBQXFEO2dDQUNyRCwyQkFBMkI7Z0NBQzNCLEVBQUU7Z0NBQ0YsOENBQThDO2dDQUM5QyxvREFBb0Q7Z0NBQ3BELG1EQUFtRDtnQ0FDbkQsaURBQWlEO2dDQUNqRCx1Q0FBdUM7Z0NBQ3ZDLHlDQUF5QztnQ0FDekMsOENBQThDO2dDQUM5Qyw0Q0FBNEM7Z0NBQzVDLGlEQUFpRDtnQ0FDakQsaURBQWlEO2dDQUNqRCxxREFBcUQ7Z0NBQ3JELHFEQUFxRDtnQ0FDckQsZ0RBQWdEO2dDQUNoRCxtREFBbUQ7Z0NBQ25ELGdEQUFnRDtnQ0FDaEQsOENBQThDO2dDQUM5Qyw0Q0FBNEM7Z0NBQzVDLHFEQUFxRDtnQ0FDckQsbURBQW1EO2dDQUNuRCxvREFBb0Q7Z0NBQ3BELGtEQUFrRDtnQ0FDbEQsNkNBQTZDO2dDQUM3Qyx5Q0FBeUM7Z0NBQ3pDLGdEQUFnRDtnQ0FDaEQsaURBQWlEO2dDQUNqRCxpREFBaUQ7Z0NBQ2pELHNDQUFzQztnQ0FDdEMsaURBQWlEO2dDQUNqRCxrREFBa0Q7Z0NBQ2xELG1EQUFtRDtnQ0FDbkQsc0NBQXNDO2dDQUN0QyxtREFBbUQ7Z0NBQ25ELGdEQUFnRDtnQ0FDaEQscURBQXFEO2dDQUNyRCxxREFBcUQ7Z0NBQ3JELG9EQUFvRDtnQ0FDcEQsK0NBQStDO2dDQUMvQyxrREFBa0Q7Z0NBQ2xELG1EQUFtRDtnQ0FDbkQsRUFBRTtnQ0FDRixzQ0FBc0M7Z0NBQ3RDLG9EQUFvRDtnQ0FDcEQsaURBQWlEO2dDQUNqRCxrREFBa0Q7Z0NBQ2xELDhDQUE4QztnQ0FDOUMsK0NBQStDO2dDQUMvQyxrREFBa0Q7Z0NBQ2xELGtEQUFrRDtnQ0FDbEQsb0JBQW9CO2dDQUNwQixFQUFFO2dDQUNGLDZDQUE2QztnQ0FDN0MsK0NBQStDO2dDQUMvQyxpREFBaUQ7Z0NBQ2pELGtEQUFrRDtnQ0FDbEQseUJBQXlCO2dDQUN6Qiw0Q0FBNEM7Z0NBQzVDLGlDQUFpQztnQ0FDakMsTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO2dDQUM5QyxNQUFNLFVBQVUsR0FBdUIsRUFBRSxDQUFDO2dDQUMxQyxNQUFNLGVBQWUsR0FBRyx3QkFBd0IsRUFBRSxDQUFDO2dDQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0NBQ2pDLE1BQU0sa0JBQWtCLEdBQ3RCLEVBQUUsQ0FBQztnQ0FDTCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztnQ0FDM0IsZ0RBQWdEO2dDQUNoRCxrREFBa0Q7Z0NBQ2xELHVEQUF1RDtnQ0FDdkQsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7Z0NBQzNCLEtBQUssTUFBTSxhQUFhLElBQUksZ0JBQWdCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztvQ0FDdEUsMkJBQTJCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dDQUNqRCxDQUFDO2dDQUNELGtEQUFrRDtnQ0FDbEQsZ0RBQWdEO2dDQUNoRCxtREFBbUQ7Z0NBQ25ELG1EQUFtRDtnQ0FDbkQseUNBQXlDO2dDQUN6QyxFQUFFO2dDQUNGLHNEQUFzRDtnQ0FDdEQscURBQXFEO2dDQUNyRCxpREFBaUQ7Z0NBQ2pELGtEQUFrRDtnQ0FDbEQsaURBQWlEO2dDQUNqRCxtREFBbUQ7Z0NBQ25ELG9EQUFvRDtnQ0FDcEQsOEJBQThCO2dDQUM5QixFQUFFO2dDQUNGLG1EQUFtRDtnQ0FDbkQsMENBQTBDO2dDQUMxQyxvREFBb0Q7Z0NBQ3BELHFEQUFxRDtnQ0FDckQscURBQXFEO2dDQUNyRCxxREFBcUQ7Z0NBQ3JELGtEQUFrRDtnQ0FDbEQsc0RBQXNEO2dDQUN0RCxzQkFBc0I7Z0NBQ3RCLEVBQUU7Z0NBQ0Ysc0RBQXNEO2dDQUN0RCxpREFBaUQ7Z0NBQ2pELGlEQUFpRDtnQ0FDakQsb0RBQW9EO2dDQUNwRCxrREFBa0Q7Z0NBQ2xELG1EQUFtRDtnQ0FDbkQsSUFBSSxtQkFBbUIsR0FDckIsY0FBYyxLQUFLLFNBQVM7b0NBQzVCLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQ0FDNUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNoQixDQUFDLElBQUksRUFBRSxFQUFFLENBQ1AsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzt3Q0FDN0MsZUFBZTt3Q0FDZixxQkFBcUIsQ0FBQyxJQUFJLENBQUM7d0NBQzNCLElBQUksQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FDN0MsQ0FBQztnQ0FDSixLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO29DQUNoQyxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQzt3Q0FDakQsU0FBUztvQ0FDWCxDQUFDO29DQUNELGdEQUFnRDtvQ0FDaEQsa0RBQWtEO29DQUNsRCw2Q0FBNkM7b0NBQzdDLGtEQUFrRDtvQ0FDbEQsOENBQThDO29DQUM5Qyw4Q0FBOEM7b0NBQzlDLGtEQUFrRDtvQ0FDbEQsNENBQTRDO29DQUM1QyxpREFBaUQ7b0NBQ2pELElBQ0UsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUMzQyxJQUFJLENBQUMsYUFBYSxDQUNuQixFQUNELENBQUM7d0NBQ0QsU0FBUztvQ0FDWCxDQUFDO29DQUNELE1BQU0sZUFBZSxHQUNuQixlQUFlLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQ2pELElBQ0UsZUFBZTt3Q0FDZixJQUFJLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQyxTQUFTLEVBQzFDLENBQUM7d0NBQ0QsOENBQThDO3dDQUM5Qyx1Q0FBdUM7d0NBQ3ZDLHFDQUFxQzt3Q0FDckMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dDQUM5QixTQUFTO29DQUNYLENBQUM7b0NBQ0QsbURBQW1EO29DQUNuRCxrREFBa0Q7b0NBQ2xELG1EQUFtRDtvQ0FDbkQsNkNBQTZDO29DQUM3QyxvREFBb0Q7b0NBQ3BELG9DQUFvQztvQ0FDcEMsTUFBTSxvQkFBb0IsR0FBRyxlQUFlO3dDQUMxQyxDQUFDLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQzt3Q0FDaEQsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDTixJQUFJLG9CQUFvQixHQUFHLENBQUMsRUFBRSxDQUFDO3dDQUM3QixrQkFBa0IsRUFBRSxDQUFDO3dDQUNyQixhQUFhLENBQUMsS0FBSyxDQUNqQixnSEFBZ0gsRUFDaEg7NENBQ0UsYUFBYSxFQUFFLEtBQUs7NENBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTs0Q0FDMUIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjOzRDQUNuQyxvQkFBb0I7eUNBQ3JCLENBQ0YsQ0FBQzt3Q0FDRixVQUFVLENBQUMsSUFBSSxDQUNiLFlBQVksQ0FDVixLQUFLLEVBQ0wsb0JBQW9CLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUM3Qzs0Q0FDRSxLQUFLOzRDQUNMLFlBQVk7NENBQ1osV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFO3lDQUN4QixFQUNEOzRDQUNFLFlBQVksRUFBRSxvQkFBb0I7NENBQ2xDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7eUNBQzdDLENBQ0YsQ0FDRixDQUFDO3dDQUNGLFNBQVM7b0NBQ1gsQ0FBQztvQ0FDRCw2Q0FBNkM7b0NBQzdDLGtEQUFrRDtvQ0FDbEQsOENBQThDO29DQUM5Qyw0Q0FBNEM7b0NBQzVDLDBDQUEwQztvQ0FDMUMsNkNBQTZDO29DQUM3QyxpREFBaUQ7b0NBQ2pELGtEQUFrRDtvQ0FDbEQsK0NBQStDO29DQUMvQyxJQUNFLDJCQUEyQixDQUFDLEdBQUcsQ0FDN0IsSUFBSSxDQUFDLGFBQWEsQ0FDbkI7d0NBQ0QsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQ3pCLENBQUM7d0NBQ0Qsa0JBQWtCLEVBQUUsQ0FBQzt3Q0FDckIsU0FBUztvQ0FDWCxDQUFDO29DQUNELDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0NBQ3BELGtEQUFrRDtvQ0FDbEQsa0RBQWtEO29DQUNsRCw4Q0FBOEM7b0NBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CO3dDQUMxQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDO3dDQUN4QyxDQUFDLENBQUMsU0FBUyxDQUFDO29DQUNkLElBQUksZ0JBQWdCLEVBQUUsQ0FBQzt3Q0FDckIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO3dDQUM1QixjQUFjLEdBQUcsU0FBUyxDQUFDO29DQUM3QixDQUFDO29DQUNELFVBQVUsQ0FBQyxJQUFJLENBQ2IsWUFBWSxDQUNWLEtBQUssRUFDTCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQzdDO3dDQUNFLEtBQUs7d0NBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhO3dDQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7d0NBQ3ZCLFlBQVk7d0NBQ1osV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFO3dDQUN2Qiw2Q0FBNkM7d0NBQzdDLDZDQUE2Qzt3Q0FDN0Msa0NBQWtDO3dDQUNsQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsV0FBVyxDQUFDO3dDQUMzQyxHQUFHLENBQUMsZ0JBQWdCOzRDQUNsQixDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRTs0Q0FDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQ0FDUixFQUNEO3dDQUNFLDhDQUE4Qzt3Q0FDOUMsMENBQTBDO3dDQUMxQyw0Q0FBNEM7d0NBQzVDLDBDQUEwQzt3Q0FDMUMsOENBQThDO3dDQUM5QywwQ0FBMEM7d0NBQzFDLGtDQUFrQzt3Q0FDbEMsY0FBYyxFQUFFLDBCQUEwQixDQUN4QyxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsUUFBUSxDQUNkO3FDQUNGLENBQ0YsQ0FDRixDQUFDO2dDQUNKLENBQUM7Z0NBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQ0FDakMsbURBQW1EO29DQUNuRCxvREFBb0Q7b0NBQ3BELG9EQUFvRDtvQ0FDcEQsZ0RBQWdEO29DQUNoRCxvREFBb0Q7b0NBQ3BELGlEQUFpRDtvQ0FDakQsZ0NBQWdDO29DQUNoQyxNQUFNLFdBQVcsR0FDZixnQkFBZ0IsRUFBRSxhQUFhO3dDQUMvQixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsYUFBYTt3Q0FDeEMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxDQUFDO3dDQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUNSLFVBQVUsQ0FBQyxJQUFJLENBQ2IsWUFBWSxDQUNWLEtBQUssRUFDTCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQzdDO3dDQUNFLEtBQUs7d0NBQ0wsWUFBWTt3Q0FDWixXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7d0NBQ3ZCLGdCQUFnQixFQUFFOzRDQUNoQixhQUFhLEVBQ1gsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGFBQWE7NENBQzVDLE9BQU8sRUFBRSxXQUFXO3lDQUNyQjtxQ0FDRixFQUNELDJCQUEyQixDQUN6QixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUNwQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUMxQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQ1YsV0FBVyxDQUNaLENBQ0YsQ0FDRixDQUFDO2dDQUNKLENBQUM7Z0NBQ0QscURBQXFEO2dDQUNyRCx1REFBdUQ7Z0NBQ3ZELG9EQUFvRDtnQ0FDcEQsdURBQXVEO2dDQUN2RCxzREFBc0Q7Z0NBQ3RELHNEQUFzRDtnQ0FDdEQscURBQXFEO2dDQUNyRCxtREFBbUQ7Z0NBQ25ELHNEQUFzRDtnQ0FDdEQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dDQUNsRCwrQ0FBK0M7Z0NBQy9DLHNEQUFzRDtnQ0FDdEQsZ0RBQWdEO2dDQUNoRCw0Q0FBNEM7Z0NBQzVDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztnQ0FFbEMsaURBQWlEO2dDQUNqRCxxREFBcUQ7Z0NBQ3JELGtEQUFrRDtnQ0FDbEQsa0RBQWtEO2dDQUNsRCxvREFBb0Q7Z0NBQ3BELG9EQUFvRDtnQ0FDcEQsbURBQW1EO2dDQUNuRCx5Q0FBeUM7Z0NBQ3pDLHlDQUF5QztnQ0FDekMsd0NBQXdDO2dDQUN4QyxNQUFNLGdCQUFnQixHQUtqQjtvQ0FDSCxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3Q0FDM0IsZ0RBQWdEO3dDQUNoRCxpREFBaUQ7d0NBQ2pELGlEQUFpRDt3Q0FDakQsK0NBQStDO3dDQUMvQyxhQUFhO3dDQUNiLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQzdDLENBQUMsQ0FBQyxhQUFhLENBQ2hCLENBQUM7d0NBQ0YsT0FBTyxLQUFLOzRDQUNWLENBQUMsQ0FBQztnREFDRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWE7Z0RBQzlCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnREFDcEIsZUFBZSxFQUFFLEtBQUs7NkNBQ3ZCOzRDQUNILENBQUMsQ0FBQztnREFDRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWE7Z0RBQzlCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnREFDcEIsYUFBYSxFQUFFLENBQUMsQ0FBQyxlQUFlOzZDQUNqQyxDQUFDO29DQUNSLENBQUMsQ0FBQztvQ0FDRixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3Q0FDaEMsYUFBYSxFQUFFLENBQUMsQ0FBQyxhQUFhO3dDQUM5QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7cUNBQ3JCLENBQUMsQ0FBQztpQ0FDSixDQUFDO2dDQUNGLGlEQUFpRDtnQ0FDakQsa0RBQWtEO2dDQUNsRCw4Q0FBOEM7Z0NBQzlDLCtDQUErQztnQ0FDL0MseURBQXlEO2dDQUN6RCwrQ0FBK0M7Z0NBQy9DLElBQ0Usa0JBQWtCLEdBQUcsQ0FBQztvQ0FDdEIsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUM7b0NBQzdCLGtCQUFrQixHQUFHLENBQUMsRUFDdEIsQ0FBQztvQ0FDRCxJQUFJLEVBQUUsYUFBYSxDQUFDO3dDQUNsQixHQUFHLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUM7NENBQy9CLENBQUMsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQ2xDLGtCQUFrQixDQUFDLE1BQU0sQ0FDMUI7NENBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3Q0FDUCxHQUFHLENBQUMsa0JBQWtCLEdBQUcsQ0FBQzs0Q0FDeEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FDbEMsa0JBQWtCLENBQ25COzRDQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7d0NBQ1AsR0FBRyxDQUFDLGtCQUFrQixHQUFHLENBQUM7NENBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0NBQWdDLENBQ3hDLGtCQUFrQixDQUNuQjs0Q0FDSCxDQUFDLENBQUMsRUFBRSxDQUFDO3FDQUNSLENBQUMsQ0FBQztnQ0FDTCxDQUFDO2dDQUNELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0NBQzNCLGFBQWEsQ0FBQyxLQUFLLENBQ2pCLGlHQUFpRyxFQUNqRzt3Q0FDRSxhQUFhLEVBQUUsS0FBSzt3Q0FDcEIsYUFBYTt3Q0FDYixrQkFBa0I7cUNBQ25CLENBQ0YsQ0FBQztnQ0FDSixDQUFDO2dDQUNELElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29DQUNsQyxhQUFhLENBQUMsSUFBSSxDQUNoQixxSUFBcUksRUFDckk7d0NBQ0UsYUFBYSxFQUFFLEtBQUs7d0NBQ3BCLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQzdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUN2QjtxQ0FDRixDQUNGLENBQUM7Z0NBQ0osQ0FBQztnQ0FFRCxpREFBaUQ7Z0NBQ2pELHFEQUFxRDtnQ0FDckQsc0NBQXNDO2dDQUN0QyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQ0FDbEMsbURBQW1EO29DQUNuRCxtREFBbUQ7b0NBQ25ELG1EQUFtRDtvQ0FDbkQseUNBQXlDO29DQUN6QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7d0NBQ2hCLGlCQUFpQjt3Q0FDakIsZ0JBQWdCLENBQUMsaUJBQWlCO3FDQUNuQyxDQUFDLENBQUM7b0NBQ0gsb0RBQW9EO29DQUNwRCxrREFBa0Q7b0NBQ2xELGtEQUFrRDtvQ0FDbEQsb0RBQW9EO29DQUNwRCw4Q0FBOEM7b0NBQzlDLGdEQUFnRDtvQ0FDaEQsd0NBQXdDO29DQUN4QyxJQUFJLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLENBQUM7d0NBQzVDLElBQ0UscUJBQXFCLENBQ25CLGdCQUFnQixDQUFDLHlCQUF5QixFQUMxQyxjQUFjLENBQ2YsRUFDRCxDQUFDOzRDQUNELFNBQVM7d0NBQ1gsQ0FBQzt3Q0FDRCxnREFBZ0Q7d0NBQ2hELDBCQUEwQjt3Q0FDMUIsT0FBTyxNQUFNLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDM0IsQ0FBQztvQ0FDRCxPQUFPO2dDQUNULENBQUM7Z0NBRUQsb0RBQW9EO2dDQUNwRCw4Q0FBOEM7Z0NBQzlDLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztnQ0FFN0Msb0RBQW9EO2dDQUNwRCx3REFBd0Q7Z0NBQ3hELG1DQUFtQztnQ0FDbkMsRUFBRTtnQ0FDRixvREFBb0Q7Z0NBQ3BELGlEQUFpRDtnQ0FDakQsb0RBQW9EO2dDQUNwRCxzREFBc0Q7Z0NBQ3RELHNEQUFzRDtnQ0FDdEQseURBQXlEO2dDQUN6RCw4QkFBOEI7Z0NBQzlCLGtEQUFrRDtnQ0FDbEQsMERBQTBEO2dDQUMxRCxzREFBc0Q7Z0NBQ3RELHdEQUF3RDtnQ0FDeEQseURBQXlEO2dDQUN6RCxxREFBcUQ7Z0NBQ3JELHNEQUFzRDtnQ0FDdEQsd0RBQXdEO2dDQUN4RCxxREFBcUQ7Z0NBQ3JELGlCQUFpQjtnQ0FDakIsa0RBQWtEO2dDQUNsRCxvREFBb0Q7Z0NBQ3BELHVEQUF1RDtnQ0FDdkQscURBQXFEO2dDQUNyRCx3REFBd0Q7Z0NBQ3hELCtDQUErQztnQ0FDL0MscURBQXFEO2dDQUNyRCxrREFBa0Q7Z0NBQ2xELHVEQUF1RDtnQ0FDdkQsc0RBQXNEO2dDQUN0RCxvREFBb0Q7Z0NBQ3BELG9EQUFvRDtnQ0FDcEQscURBQXFEO2dDQUNyRCx1REFBdUQ7Z0NBQ3ZELGtEQUFrRDtnQ0FDbEQsbURBQW1EO2dDQUNuRCxnREFBZ0Q7Z0NBQ2hELHVEQUF1RDtnQ0FDdkQscURBQXFEO2dDQUNyRCx3REFBd0Q7Z0NBQ3hELHFEQUFxRDtnQ0FDckQsd0RBQXdEO2dDQUN4RCw0Q0FBNEM7Z0NBQzVDLG1EQUFtRDtnQ0FDbkQscURBQXFEO2dDQUNyRCxxQ0FBcUM7Z0NBQ3JDLGdEQUFnRDtnQ0FDaEQsdURBQXVEO2dDQUN2RCx3Q0FBd0M7Z0NBQ3hDLDJCQUEyQjtnQ0FDM0IsRUFBRTtnQ0FDRix1REFBdUQ7Z0NBQ3ZELDBEQUEwRDtnQ0FDMUQsMERBQTBEO2dDQUMxRCwwREFBMEQ7Z0NBQzFELE1BQU0sa0JBQWtCLEdBQ3RCLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRO29DQUNuQyxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUM7b0NBQ25CLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQztvQ0FDbkIsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO29DQUN6QixlQUFlLENBQUMsTUFBTSxLQUFLLENBQUM7b0NBQzVCLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDO29DQUMvQixDQUFDLGdCQUFnQixDQUFDLFdBQVc7b0NBQzdCLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDO2dDQUU5Qix1REFBdUQ7Z0NBQ3ZELHVEQUF1RDtnQ0FDdkQseURBQXlEO2dDQUN6RCxzREFBc0Q7Z0NBQ3RELGtEQUFrRDtnQ0FDbEQscURBQXFEO2dDQUNyRCxvREFBb0Q7Z0NBQ3BELHNEQUFzRDtnQ0FDdEQsbURBQW1EO2dDQUNuRCxzREFBc0Q7Z0NBQ3RELHdEQUF3RDtnQ0FDeEQsd0RBQXdEO2dDQUN4RCxvREFBb0Q7Z0NBQ3BELHdEQUF3RDtnQ0FDeEQsbURBQW1EO2dDQUNuRCwyQ0FBMkM7Z0NBQzNDLHNCQUFzQjtnQ0FDdEIsTUFBTSx1QkFBdUIsR0FDM0IsaUJBQWlCLENBQUMsUUFBUTtvQ0FDMUIsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDO29DQUNqQixnQkFBZ0IsQ0FBQyxhQUFhLENBQUM7Z0NBRWpDLHFEQUFxRDtnQ0FDckQseURBQXlEO2dDQUN6RCxpREFBaUQ7Z0NBQ2pELG9EQUFvRDtnQ0FDcEQsdURBQXVEO2dDQUN2RCxzREFBc0Q7Z0NBQ3RELGtEQUFrRDtnQ0FDbEQsc0RBQXNEO2dDQUN0RCx1REFBdUQ7Z0NBQ3ZELHVEQUF1RDtnQ0FDdkQsa0RBQWtEO2dDQUNsRCxnREFBZ0Q7Z0NBQ2hELGFBQWE7Z0NBQ2IsRUFBRTtnQ0FDRix3REFBd0Q7Z0NBQ3hELHlEQUF5RDtnQ0FDekQsdURBQXVEO2dDQUN2RCwyREFBMkQ7Z0NBQzNELDJEQUEyRDtnQ0FDM0QsMERBQTBEO2dDQUMxRCwyREFBMkQ7Z0NBQzNELG1EQUFtRDtnQ0FDbkQsdURBQXVEO2dDQUN2RCxpQ0FBaUM7Z0NBQ2pDLEVBQUU7Z0NBQ0Ysc0RBQXNEO2dDQUN0RCxxREFBcUQ7Z0NBQ3JELHNEQUFzRDtnQ0FDdEQsdURBQXVEO2dDQUN2RCxzREFBc0Q7Z0NBQ3RELHVEQUF1RDtnQ0FDdkQsdURBQXVEO2dDQUN2RCxvREFBb0Q7Z0NBQ3BELHFEQUFxRDtnQ0FDckQsa0RBQWtEO2dDQUNsRCxzREFBc0Q7Z0NBQ3RELHFEQUFxRDtnQ0FDckQsbURBQW1EO2dDQUNuRCxlQUFlO2dDQUNmLE1BQU0sb0JBQW9CLEdBQ3hCLEtBQUs7b0NBQ0wsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0I7b0NBQ3BDLENBQUMsZ0JBQWdCLENBQUMsV0FBVztvQ0FDN0IsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhO29DQUMvQixDQUFDLGdCQUFnQixDQUFDLHNCQUFzQjtvQ0FDeEMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRO29DQUMzQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztnQ0FFOUIsbURBQW1EO2dDQUNuRCx5REFBeUQ7Z0NBQ3pELDBEQUEwRDtnQ0FDMUQsd0RBQXdEO2dDQUN4RCxzREFBc0Q7Z0NBQ3RELHVEQUF1RDtnQ0FDdkQscURBQXFEO2dDQUNyRCwrQ0FBK0M7Z0NBQy9DLHNEQUFzRDtnQ0FDdEQsK0NBQStDO2dDQUMvQyxpREFBaUQ7Z0NBQ2pELG1EQUFtRDtnQ0FDbkQsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7b0NBQ2pELE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtvQ0FDdkIsc0JBQXNCLEVBQ3BCLHNCQUFzQixLQUFLLElBQUk7b0NBQ2pDLGNBQWMsRUFDWixjQUFjLENBQUMsS0FBSyxDQUFDO3dDQUNyQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7b0NBQzlDLHNCQUFzQjtvQ0FDdEIsUUFBUSxFQUFFLGdCQUFnQjtvQ0FDMUIsaUJBQWlCO29DQUNqQiwyQkFBMkI7b0NBQzNCLG9EQUFvRDtvQ0FDcEQsdURBQXVEO29DQUN2RCxrQkFBa0IsRUFDaEIsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDO3dDQUNqQixnQkFBZ0IsQ0FBQyxXQUFXLEtBQUssU0FBUztvQ0FDNUMsc0JBQXNCLEVBQ3BCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLGFBQWE7b0NBQ3JELEtBQUs7b0NBQ0wsUUFBUSxFQUFFLHVCQUF1QjtpQ0FDbEMsQ0FBQyxDQUFDO2dDQUVILG9EQUFvRDtnQ0FDcEQsNENBQTRDO2dDQUM1Qyw4Q0FBOEM7Z0NBQzlDLDRDQUE0QztnQ0FDNUMsb0RBQW9EO2dDQUNwRCxrREFBa0Q7Z0NBQ2xELG1EQUFtRDtnQ0FDbkQsaURBQWlEO2dDQUNqRCwrQ0FBK0M7Z0NBQy9DLG9EQUFvRDtnQ0FDcEQsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUM7Z0NBQzNDLGNBQWMsR0FBRyxTQUFTLENBQUM7Z0NBRTNCLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQ0FDckIsSUFBSSxXQUVELENBQUM7Z0NBQ0osTUFBTSxxQkFBcUIsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQ2hELENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFO29DQUNmLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRTt3Q0FDZixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQzt3Q0FDbEMsT0FBTyxXQUFXLENBQUM7NENBQ2pCLEtBQUs7NENBQ0wsYUFBYSxFQUFFLEtBQUs7NENBQ3BCLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxZQUFZOzRDQUM5QyxZQUFZOzRDQUNaLGlCQUFpQjs0Q0FDakIsU0FBUzs0Q0FDVCxTQUFTLEVBQUUsYUFBYSxDQUN0QixXQUFXLENBQUMsVUFBVSxFQUN0QixLQUFLLENBQ047NENBQ0QsTUFBTSxFQUFFLENBQUMsQ0FBQyxhQUFhOzRDQUN2QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7NENBQ3BCLGNBQWMsRUFBRSxXQUFXLENBQUMsV0FBVzs0Q0FDdkMsZ0RBQWdEOzRDQUNoRCwrQ0FBK0M7NENBQy9DLDJDQUEyQzs0Q0FDM0MsNENBQTRDOzRDQUM1Qyw4Q0FBOEM7NENBQzlDLDBDQUEwQzs0Q0FDMUMsK0NBQStDOzRDQUMvQywwQ0FBMEM7NENBQzFDLDhDQUE4Qzs0Q0FDOUMseUNBQXlDOzRDQUN6QywyQ0FBMkM7NENBQzNDLDZDQUE2Qzs0Q0FDN0MsK0NBQStDOzRDQUMvQyx1Q0FBdUM7NENBQ3ZDLDBDQUEwQzs0Q0FDMUMsOENBQThDOzRDQUM5Qyw0Q0FBNEM7NENBQzVDLDhDQUE4Qzs0Q0FDOUMsK0NBQStDOzRDQUMvQywwQ0FBMEM7NENBQzFDLDBDQUEwQzs0Q0FDMUMsc0NBQXNDOzRDQUN0QyxvQkFBb0IsRUFDbEIsQ0FBQyxDQUFDLGFBQWEsS0FBSyxTQUFTO2dEQUM3QixDQUFDLENBQUMsZUFBZSxLQUFLLFNBQVM7Z0RBQzdCLENBQUMsQ0FBQyxDQUFDO2dEQUNILENBQUMsQ0FBQyxzQkFBc0IsQ0FDcEIsUUFBUSxDQUFDLE1BQU0sRUFDZixDQUFDLENBQUMsYUFBYSxFQUNmO29EQUNFLElBQUksRUFBRSxTQUFTO29EQUNmLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztpREFDOUIsQ0FDRixHQUFHLENBQUM7NENBQ1gsOENBQThDOzRDQUM5Qyw2Q0FBNkM7NENBQzdDLGtDQUFrQzs0Q0FDbEMsNkNBQTZDOzRDQUM3Qyx5Q0FBeUM7NENBQ3pDLHdDQUF3Qzs0Q0FDeEMsY0FBYzs0Q0FDZCxhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWE7NENBQzlCLDJDQUEyQzs0Q0FDM0MsNENBQTRDOzRDQUM1Qyw0Q0FBNEM7NENBQzVDLCtDQUErQzs0Q0FDL0MsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlOzRDQUNsQyw2Q0FBNkM7NENBQzdDLHVDQUF1Qzs0Q0FDdkMsNkNBQTZDOzRDQUM3QyxxQ0FBcUM7NENBQ3JDLHFDQUFxQzs0Q0FDckMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxTQUFTOzRDQUNsQyw2Q0FBNkM7NENBQzdDLDJDQUEyQzs0Q0FDM0MseUNBQXlDOzRDQUN6Qyx5Q0FBeUM7NENBQ3pDLGlCQUFpQjs0Q0FDakIsb0JBQW9COzRDQUNwQiwyQ0FBMkM7NENBQzNDLDhDQUE4Qzs0Q0FDOUMsOENBQThDOzRDQUM5QyxxQ0FBcUM7NENBQ3JDLHVCQUF1Qjs0Q0FDdkIsZUFBZTs0Q0FDZixHQUFHLENBQUMsU0FBUyxLQUFLLENBQUM7Z0RBQ25CLENBQUMsQ0FBQyxDQUFDLGFBQWEsS0FBSyxTQUFTO29EQUM1QixDQUFDLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQztnREFDbEMsZUFBZTtnREFDYixDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUU7Z0RBQ3JCLENBQUMsQ0FBQyxFQUFFLENBQUM7NENBQ1AsR0FBRyxDQUFDLG1CQUFtQjtnREFDckIsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFO2dEQUN6QyxDQUFDLENBQUMsRUFBRSxDQUFDOzRDQUNQLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxRQUFRLENBQUMsTUFBTTtnREFDdkMsQ0FBQyxDQUFDO29EQUNFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxNQUFNO2lEQUN4QztnREFDSCxDQUFDLENBQUMsRUFBRSxDQUFDOzRDQUNQLHNCQUFzQjt5Q0FDdkIsQ0FBQyxDQUFDO29DQUNMLENBQUMsQ0FBQztvQ0FDRiw4Q0FBOEM7b0NBQzlDLHNDQUFzQztvQ0FDdEMsOEJBQThCO29DQUM5QixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29DQUN4QywyQ0FBMkM7b0NBQzNDLGlEQUFpRDtvQ0FDakQsZ0RBQWdEO29DQUNoRCxpREFBaUQ7b0NBQ2pELCtDQUErQztvQ0FDL0MsZ0NBQWdDO29DQUNoQyxNQUFNLFFBQVEsR0FDWixDQUFDLENBQUMsYUFBYSxLQUFLLFNBQVM7d0NBQzdCLENBQUMsQ0FBQyxlQUFlLEtBQUssU0FBUzt3Q0FDN0IsQ0FBQyxDQUFDLG1CQUFtQixDQUNqQixLQUFLLEVBQ0wsQ0FBQyxDQUFDLGFBQWEsRUFDZixHQUFHLENBQ0o7d0NBQ0gsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO29DQUNaLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDM0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FDM0MsQ0FBQztnQ0FDSixDQUFDLENBQ0YsQ0FBQztnQ0FDRix1REFBdUQ7Z0NBQ3ZELHdEQUF3RDtnQ0FDeEQsd0RBQXdEO2dDQUN4RCx3REFBd0Q7Z0NBQ3hELHVEQUF1RDtnQ0FDdkQsdURBQXVEO2dDQUN2RCx5REFBeUQ7Z0NBQ3pELHVEQUF1RDtnQ0FDdkQsbURBQW1EO2dDQUNuRCxLQUFLLE1BQU0sT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7b0NBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzFCLENBQUM7Z0NBQ0QsSUFBSSxDQUFDO29DQUNILGlEQUFpRDtvQ0FDakQsaURBQWlEO29DQUNqRCwrQ0FBK0M7b0NBQy9DLGtEQUFrRDtvQ0FDbEQsZ0RBQWdEO29DQUNoRCxpREFBaUQ7b0NBQ2pELGdEQUFnRDtvQ0FDaEQsNkNBQTZDO29DQUM3QywrQ0FBK0M7b0NBQy9DLCtDQUErQztvQ0FDL0MsY0FBYztvQ0FDZCxJQUFJLENBQUM7d0NBQ0gsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDOzRDQUNoQixpQkFBaUI7NENBQ2pCLGdCQUFnQixDQUFDLGlCQUFpQjt5Q0FDbkMsQ0FBQyxDQUFDO29DQUNMLENBQUM7b0NBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQzt3Q0FDckIsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7d0NBQ2hELE1BQU0sV0FBVyxDQUFDO29DQUNwQixDQUFDO29DQUNELFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzdCLHFCQUFxQixDQUN0QixDQUFDO2dDQUNKLENBQUM7Z0NBQUMsT0FBTyxPQUFPLEVBQUUsQ0FBQztvQ0FDakIsb0RBQW9EO29DQUNwRCxrREFBa0Q7b0NBQ2xELG9EQUFvRDtvQ0FDcEQsbURBQW1EO29DQUNuRCw4Q0FBOEM7b0NBQzlDLHVEQUF1RDtvQ0FDdkQsK0NBQStDO29DQUMvQyxtREFBbUQ7b0NBQ25ELG9EQUFvRDtvQ0FDcEQsa0RBQWtEO29DQUNsRCxJQUFJLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dDQUN4QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQ3RDLHFCQUFxQixDQUN0QixDQUFDO3dDQUNGLGdEQUFnRDt3Q0FDaEQsb0RBQW9EO3dDQUNwRCxtREFBbUQ7d0NBQ25ELG1EQUFtRDt3Q0FDbkQsb0RBQW9EO3dDQUNwRCxvREFBb0Q7d0NBQ3BELGlCQUFpQjt3Q0FDakIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FDL0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxNQUFNLEtBQUssV0FBVzs0Q0FDOUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXO2dEQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO2dEQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FDcEMsQ0FBQzt3Q0FDRixJQUNFLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUU7NENBQzlDLFVBQVUsRUFBRSxDQUFDLFlBQVk7eUNBQzFCLENBQUMsRUFDRixDQUFDOzRDQUNELDhDQUE4Qzs0Q0FDOUMsb0NBQW9DOzRDQUNwQyxTQUFTO3dDQUNYLENBQUM7d0NBQ0QsOENBQThDO3dDQUM5QywyQ0FBMkM7d0NBQzNDLE1BQU0sVUFBVSxHQUNkLE1BQU0sMkJBQTJCLENBQy9CLGNBQWMsRUFDZCxPQUFPLENBQ1IsQ0FBQzt3Q0FDSixJQUFJLFVBQVUsQ0FBQyxTQUFTOzRDQUFFLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQzt3Q0FDbkQsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDO29DQUN6QixDQUFDO29DQUNELE1BQU0sT0FBTyxDQUFDO2dDQUNoQixDQUFDO3dDQUFTLENBQUM7b0NBQ1QsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dDQUN4QixDQUFDO2dDQUVELG9EQUFvRDtnQ0FDcEQsMkRBQTJEO2dDQUMzRCx3REFBd0Q7Z0NBQ3hELDBEQUEwRDtnQ0FDMUQscURBQXFEO2dDQUNyRCx3REFBd0Q7Z0NBQ3hELHdEQUF3RDtnQ0FDeEQsMERBQTBEO2dDQUMxRCxzREFBc0Q7Z0NBQ3RELDJEQUEyRDtnQ0FDM0QscURBQXFEO2dDQUNyRCxzQkFBc0I7Z0NBQ3RCLE1BQU0sT0FBTyxHQUdQLEVBQUUsQ0FBQztnQ0FDVCxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0NBQzFCLG9EQUFvRDtnQ0FDcEQsd0RBQXdEO2dDQUN4RCx5REFBeUQ7Z0NBQ3pELHFEQUFxRDtnQ0FDckQsa0RBQWtEO2dDQUNsRCxzREFBc0Q7Z0NBQ3RELHVEQUF1RDtnQ0FDdkQsd0RBQXdEO2dDQUN4RCwwREFBMEQ7Z0NBQzFELG1EQUFtRDtnQ0FDbkQsd0RBQXdEO2dDQUN4RCxtREFBbUQ7Z0NBQ25ELHNEQUFzRDtnQ0FDdEQsd0RBQXdEO2dDQUN4RCx1REFBdUQ7Z0NBQ3ZELHFEQUFxRDtnQ0FDckQsMERBQTBEO2dDQUMxRCx5Q0FBeUM7Z0NBQ3pDLElBQUksZUFBbUMsQ0FBQztnQ0FDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29DQUNqRCxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ3pCLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUM5QixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7d0NBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUM7NENBQ1gsSUFBSSxFQUFFLENBQUM7NENBQ1AsWUFBWSxFQUFFLENBQUMsQ0FBQyxjQUFjO3lDQUMvQixDQUFDLENBQUM7b0NBQ0wsQ0FBQzt5Q0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7d0NBQ2xDLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUN4QixlQUFlLElBQUksQ0FBQyxFQUNwQixDQUFDLENBQUMsY0FBYyxDQUNqQixDQUFDO29DQUNKLENBQUM7eUNBQU0sSUFDTCxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVc7d0NBQ3RCLENBQUMsQ0FBQyxhQUFhLEVBQ2YsQ0FBQzt3Q0FDRCxhQUFhLEdBQUcsSUFBSSxDQUFDO29DQUN2QixDQUFDO2dDQUNILENBQUM7Z0NBRUQsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7b0NBQ2xDLGlEQUFpRDtvQ0FDakQsc0RBQXNEO29DQUN0RCxrREFBa0Q7b0NBQ2xELG9EQUFvRDtvQ0FDcEQscURBQXFEO29DQUNyRCxnREFBZ0Q7b0NBQ2hELHNEQUFzRDtvQ0FDdEQscURBQXFEO29DQUNyRCxxREFBcUQ7b0NBQ3JELG9EQUFvRDtvQ0FDcEQsaURBQWlEO29DQUNqRCwrQkFBK0I7b0NBQy9CLEVBQUU7b0NBQ0YsaURBQWlEO29DQUNqRCxpREFBaUQ7b0NBQ2pELGtEQUFrRDtvQ0FDbEQsc0RBQXNEO29DQUN0RCxzREFBc0Q7b0NBQ3RELHlEQUF5RDtvQ0FDekQsbURBQW1EO29DQUNuRCwwQkFBMEI7b0NBQzFCLE9BQU8sTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7Z0NBQ3pDLENBQUM7Z0NBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29DQUN2QixNQUFNLGlCQUFpQixHQUFHLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQztvQ0FDbkQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQ3JDLFlBQVksQ0FDVixLQUFLLEVBQ0wsb0JBQW9CLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUM3Qzt3Q0FDRSxLQUFLO3dDQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTt3Q0FDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO3dDQUN2QixZQUFZLEVBQUUsaUJBQWlCO3dDQUMvQixXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7d0NBQ3ZCLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7cUNBQzVDLEVBQ0Q7d0NBQ0UsWUFBWTt3Q0FDWixzQ0FBc0M7d0NBQ3RDLHlDQUF5Qzt3Q0FDekMsMkNBQTJDO3dDQUMzQyx1Q0FBdUM7d0NBQ3ZDLCtCQUErQjt3Q0FDL0IsRUFBRTt3Q0FDRiw2Q0FBNkM7d0NBQzdDLDRDQUE0Qzt3Q0FDNUMsd0NBQXdDO3dDQUN4Qyw0Q0FBNEM7d0NBQzVDLDZDQUE2Qzt3Q0FDN0MsNkNBQTZDO3dDQUM3Qyw0Q0FBNEM7d0NBQzVDLHlDQUF5Qzt3Q0FDekMsNkNBQTZDO3dDQUM3Qyw0Q0FBNEM7d0NBQzVDLDJDQUEyQzt3Q0FDM0Msd0NBQXdDO3dDQUN4Qyw4Q0FBOEM7d0NBQzlDLDhDQUE4Qzt3Q0FDOUMsMkNBQTJDO3dDQUMzQywyQ0FBMkM7d0NBQzNDLHFDQUFxQzt3Q0FDckMsY0FBYyxFQUFFLDBCQUEwQixDQUN4QyxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsUUFBUSxDQUNkO3FDQUNGLENBQ0YsQ0FDRixDQUNGLENBQUM7Z0NBQ0osQ0FBQztnQ0FFRCwwREFBMEQ7Z0NBQzFELDhCQUE4QjtnQ0FDOUIsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQ0FDbEIsYUFBYSxDQUFDLEtBQUssQ0FDakIsNENBQTRDLEVBQzVDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FDeEMsQ0FBQztvQ0FDRixNQUFNLFlBQVksQ0FDaEIsS0FBSyxFQUNMLG9CQUFvQixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsRUFDN0M7d0NBQ0UsS0FBSzt3Q0FDTCxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsRUFBRTt3Q0FDdEMsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFO3FDQUN4QixDQUNGLENBQUM7b0NBQ0YsT0FBTztnQ0FDVCxDQUFDO2dDQUVELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQ0FDdkIsb0RBQW9EO29DQUNwRCxtREFBbUQ7b0NBQ25ELG9EQUFvRDtvQ0FDcEQsd0RBQXdEO29DQUN4RCxPQUFPO2dDQUNULENBQUM7Z0NBRUQsNENBQTRDO2dDQUM1QywwREFBMEQ7Z0NBQzFELHlEQUF5RDtnQ0FDekQsRUFBRTtnQ0FDRixxREFBcUQ7Z0NBQ3JELHFEQUFxRDtnQ0FDckQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0NBQ2xDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7d0NBQ2xELGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dDQUMzQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPOzRDQUNqQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDOzRDQUM1QixDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7d0NBQ25DLFNBQVM7b0NBQ1gsQ0FBQztnQ0FDSCxDQUFDO2dDQUNELFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDeEMsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLG1EQUFtRDtnQ0FDbkQsa0RBQWtEO2dDQUNsRCx1REFBdUQ7Z0NBQ3ZELG9EQUFvRDtnQ0FDcEQsK0NBQStDO2dDQUMvQyx3REFBd0Q7Z0NBQ3hELHNEQUFzRDtnQ0FDdEQsK0NBQStDO2dDQUMvQyxrREFBa0Q7Z0NBQ2xELHVEQUF1RDtnQ0FDdkQsK0NBQStDO2dDQUMvQyxxREFBcUQ7Z0NBQ3JELG9EQUFvRDtnQ0FDcEQsaURBQWlEO2dDQUNqRCxrREFBa0Q7Z0NBQ2xELGNBQWM7Z0NBQ2QsSUFBSSxhQUFhLEdBQUcsR0FBRyxDQUFDO2dDQUN4QixJQUFJLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29DQUNwQyxJQUFJLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO3dDQUNoRCxTQUFTO29DQUNYLENBQUM7b0NBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSwyQkFBMkIsQ0FDbEQsY0FBYyxFQUNkLEdBQUcsQ0FDSixDQUFDO29DQUNGLElBQUksVUFBVSxDQUFDLFNBQVM7d0NBQUUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO29DQUNuRCxxREFBcUQ7b0NBQ3JELG9EQUFvRDtvQ0FDcEQscURBQXFEO29DQUNyRCxvQ0FBb0M7b0NBQ3BDLGFBQWEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO2dDQUNuQyxDQUFDO2dDQUVELG1EQUFtRDtnQ0FDbkQsZ0RBQWdEO2dDQUNoRCxpREFBaUQ7Z0NBQ2pELGtEQUFrRDtnQ0FDbEQsa0RBQWtEO2dDQUNsRCxtREFBbUQ7Z0NBQ25ELGlEQUFpRDtnQ0FDakQsc0NBQXNDO2dDQUN0QyxxREFBcUQ7Z0NBQ3JELHdEQUF3RDtnQ0FDeEQsa0RBQWtEO2dDQUNsRCxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0NBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQ1osd0ZBQXdGLEVBQ3hGO3dDQUNFLFNBQVMsRUFDUCxHQUFHLFlBQVksS0FBSzs0Q0FDbEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJOzRDQUNWLENBQUMsQ0FBQyxjQUFjO3dDQUNwQixZQUFZLEVBQ1YsR0FBRyxZQUFZLEtBQUs7NENBQ2xCLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTzs0Q0FDYixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQzt3Q0FDakIsZUFBZSxFQUFFLFFBQVEsQ0FBQyxPQUFPO3FDQUNsQyxDQUNGLENBQUM7b0NBQ0YsTUFBTSxHQUFHLENBQUM7Z0NBQ1osQ0FBQztnQ0FFRCxJQUFJLCtCQUFtRCxDQUFDO2dDQUN4RCx1REFBdUQ7Z0NBQ3ZELDBDQUEwQztnQ0FDMUMsSUFBSSxnQkFBZ0IsR0FBNEIsRUFBRSxDQUFDO2dDQUNuRCxJQUFJLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29DQUNsQyxNQUFNLGVBQWUsR0FDbkIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29DQUNyQyxNQUFNLGtCQUFrQixHQUN0Qiw2QkFBNkIsRUFBRSxDQUFDO29DQUNsQyxrREFBa0Q7b0NBQ2xELDhDQUE4QztvQ0FDOUMsb0NBQW9DO29DQUNwQyxrREFBa0Q7b0NBQ2xELHNEQUFzRDtvQ0FDdEQsbURBQW1EO29DQUNuRCxzREFBc0Q7b0NBQ3RELG9DQUFvQztvQ0FDcEMsTUFBTSxrQkFBa0IsR0FBRzt3Q0FDekIsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFFBQVE7NENBQzVCLENBQUMsZ0JBQWdCO2dEQUNmLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztnREFDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dDQUNWLEdBQUcsQ0FBQyxPQUFPO3FDQUNaLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUNuQyxvREFBb0Q7b0NBQ3BELG1EQUFtRDtvQ0FDbkQsa0RBQWtEO29DQUNsRCxtREFBbUQ7b0NBQ25ELGdEQUFnRDtvQ0FDaEQsa0RBQWtEO29DQUNsRCwrQkFBK0I7b0NBQy9CLGdCQUFnQixHQUFHO3dDQUNqQixTQUFTLEVBQUUsZUFBZSxDQUFDLGlCQUFpQjt3Q0FDNUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLE9BQU87d0NBQzlCLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLE9BQU87d0NBQ2pELGtCQUFrQjt3Q0FDbEIsZUFBZTt3Q0FDZixlQUFlLEVBQUUsUUFBUSxDQUFDLE9BQU87d0NBQ2pDLGtCQUFrQjt3Q0FDbEIsYUFBYTt3Q0FDYix1QkFBdUI7d0NBQ3ZCLGFBQWEsRUFBRSxRQUFRLENBQUMsSUFBSTt3Q0FDNUIsY0FBYyxFQUNaLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUzs0Q0FDekIsQ0FBQyxDQUFDLFNBQVM7NENBQ1gsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTTt3Q0FDNUIsbUJBQW1CLEVBQ2pCLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUzs0Q0FDekIsQ0FBQyxDQUFDLFNBQVM7NENBQ1gsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTzt3Q0FDckMsTUFBTSxFQUNKLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTzs0Q0FDdkIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUM7NENBQ2hDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFdBQVc7Z0RBQzdCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTTtnREFDakIsQ0FBQyxDQUFDLFNBQVM7d0NBQ2pCLFlBQVksRUFBRSxTQUFTLEtBQUssU0FBUzt3Q0FDckMsbUJBQW1CLEVBQUUsZ0JBQWdCLEtBQUssU0FBUzt3Q0FDbkQsZ0JBQWdCLEVBQUUsZ0JBQWdCLEtBQUssU0FBUzt3Q0FDaEQsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXO3FDQUN6QyxDQUFDO29DQUVGLElBQUksZUFBZSxJQUFJLGtCQUFrQixFQUFFLENBQUM7d0NBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQ1osK0ZBQStGLEVBQy9GLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUNuRCxDQUFDO3dDQUNGLE1BQU0sWUFBWSxDQUNoQixLQUFLLEVBQ0wsb0JBQW9CLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUM3Qzs0Q0FDRSxLQUFLOzRDQUNMLFlBQVksRUFBRSxNQUFNLGdCQUFnQixFQUFFOzRDQUN0QyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7NENBQ3ZCLGdCQUFnQixFQUFFO2dEQUNoQixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87Z0RBQ3BCLEtBQUssRUFBRSxlQUFlO2dEQUN0QixRQUFRLEVBQUUsa0JBQWtCOzZDQUM3Qjt5Q0FDRixDQUNGLENBQUM7d0NBQ0YsT0FBTztvQ0FDVCxDQUFDO29DQUVELCtCQUErQixHQUFHLGVBQWUsQ0FBQztvQ0FDbEQsYUFBYSxHQUFHLElBQUksc0JBQXNCLENBQ3hDLDRCQUE0QixlQUFlLGdCQUFnQixrQkFBa0IsaURBQWlELEdBQUcsQ0FBQyxPQUFPLDBCQUEwQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsT0FBTyxFQUFFLEVBQ25PLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUNmLENBQUM7Z0NBQ0osQ0FBQztxQ0FBTSxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQ0FDM0Isc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ3BDLENBQUM7Z0NBRUQsNkRBQTZEO2dDQUM3RCxJQUFJLGFBQWEsWUFBWSxLQUFLLEVBQUUsQ0FBQztvQ0FDbkMsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dDQUN6QyxDQUFDO2dDQUVELE1BQU0sZUFBZSxHQUNuQixNQUFNLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dDQUM3QyxNQUFNLFNBQVMsR0FDYixlQUFlLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQ0FDdEQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztnQ0FDN0MsSUFBSSxVQUFVLEdBQ1osZUFBZSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7Z0NBRXhELElBQUksVUFBVSxFQUFFLENBQUM7b0NBQ2YsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7b0NBQ25ELE1BQU0sUUFBUSxHQUNaLFVBQVUsRUFBRSxlQUFlLElBQUksWUFBWSxDQUFDO29DQUM5QyxVQUFVLEdBQUcsZUFBZSxDQUMxQixVQUFVLEVBQ1YsUUFBUSxFQUNSLFlBQVksQ0FDYixDQUFDO2dDQUNKLENBQUM7Z0NBRUQscURBQXFEO2dDQUNyRCxvREFBb0Q7Z0NBQ3BELDRDQUE0QztnQ0FDNUMsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0NBRWxELGFBQWEsQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUU7b0NBQ2xELGtEQUFrRDtvQ0FDbEQsc0NBQXNDO29DQUN0QyxHQUFHLGdCQUFnQjtvQ0FDbkIsYUFBYSxFQUFFLEtBQUs7b0NBQ3BCLFNBQVM7b0NBQ1QsU0FBUztvQ0FDVCxpREFBaUQ7b0NBQ2pELG1EQUFtRDtvQ0FDbkQsb0RBQW9EO29DQUNwRCxtREFBbUQ7b0NBQ25ELFlBQVk7b0NBQ1osVUFBVTtpQ0FDWCxDQUFDLENBQUM7Z0NBRUgsb0RBQW9EO2dDQUNwRCxrREFBa0Q7Z0NBQ2xELGlEQUFpRDtnQ0FDakQsZ0RBQWdEO2dDQUNoRCxrREFBa0Q7Z0NBQ2xELG9EQUFvRDtnQ0FDcEQsaURBQWlEO2dDQUNqRCxnQ0FBZ0M7Z0NBQ2hDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQ0FDcEQsYUFBdUIsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO2dDQUM5QyxDQUFDO2dDQUVELG1EQUFtRDtnQ0FDbkQsa0RBQWtEO2dDQUNsRCxpREFBaUQ7Z0NBQ2pELHlCQUF5QjtnQ0FDekIsRUFBRTtnQ0FDRix1REFBdUQ7Z0NBQ3ZELHNEQUFzRDtnQ0FDdEQsa0RBQWtEO2dDQUNsRCxvREFBb0Q7Z0NBQ3BELCtDQUErQztnQ0FDL0MsOENBQThDO2dDQUM5Qyx3REFBd0Q7Z0NBQ3hELGdCQUFnQjtnQ0FDaEIsSUFBSSxDQUFDO29DQUNILDRDQUE0QztvQ0FDNUMsOENBQThDO29DQUM5QyxNQUFNLGFBQWEsRUFBRSxDQUFDO29DQUN0QixNQUFNLFdBQVcsQ0FDZjt3Q0FDRSxTQUFTLEVBQUUsWUFBWTt3Q0FDdkIsV0FBVyxFQUFFLG9CQUFvQjt3Q0FDakMsU0FBUyxFQUFFOzRDQUNULEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUM1QixhQUFhLEVBQ2IsS0FBSyxFQUNMLE1BQU0sYUFBYSxDQUFDLEtBQUssRUFDekIsVUFBVSxFQUNWLENBQUMsV0FBVyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7Z0RBQzdCLGlDQUFpQyxDQUNwQzs0Q0FDRCxTQUFTO3lDQUNWO3FDQUNGLEVBQ0Q7d0NBQ0UsU0FBUzt3Q0FDVCxHQUFHLENBQUMsK0JBQStCLEtBQUssU0FBUzs0Q0FDL0MsQ0FBQyxDQUFDO2dEQUNFLHFCQUFxQixFQUNuQiwrQkFBK0I7NkNBQ2xDOzRDQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7cUNBQ1IsQ0FDRixDQUFDO2dDQUNKLENBQUM7Z0NBQUMsT0FBTyxPQUFPLEVBQUUsQ0FBQztvQ0FDakIsSUFDRSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO3dDQUMvQixlQUFlLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUMzQixDQUFDO3dDQUNELGFBQWEsQ0FBQyxJQUFJLENBQ2hCLDJEQUEyRCxFQUMzRDs0Q0FDRSxhQUFhLEVBQUUsS0FBSzs0Q0FDcEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO3lDQUN6QixDQUNGLENBQUM7d0NBQ0YsT0FBTztvQ0FDVCxDQUFDO29DQUNELElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3Q0FDbEMsYUFBYSxDQUFDLEtBQUssQ0FDakIsNkRBQTZELEVBQzdEOzRDQUNFLGFBQWEsRUFBRSxLQUFLOzRDQUNwQixTQUFTLEVBQUUsZUFBZSxDQUFDLG9CQUFvQjs0Q0FDL0MsS0FBSyxFQUNILE9BQU8sWUFBWSxLQUFLO2dEQUN0QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU87Z0RBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO3lDQUN0QixDQUNGLENBQUM7d0NBQ0YsT0FBTztvQ0FDVCxDQUFDO29DQUNELE1BQU0sT0FBTyxDQUFDO2dDQUNoQixDQUFDO2dDQUVELElBQUksRUFBRSxhQUFhLENBQUM7b0NBQ2xCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztvQ0FDeEMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO29DQUN6QyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7b0NBQ3pDLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQztvQ0FDL0MsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztpQ0FDbEMsQ0FBQyxDQUFDO2dDQUNILE9BQU87NEJBQ1QsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUNGLENBQUM7SUFFSixJQUFJLGFBQWdFLENBQUM7SUFDckUsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0scUJBQXFCLEdBQ3pCLE9BQU8sT0FBTyxFQUFFLHdCQUF3QixLQUFLLFFBQVE7UUFDbkQsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyx3QkFBd0I7UUFDeEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVoQixPQUFPLGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbkMsZUFBZSxJQUFJLENBQUMsQ0FBQztRQUNyQixNQUFNLGFBQWEsR0FBRyxhQUFhLEtBQUssU0FBUyxDQUFDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLE9BQU8sS0FBSyxDQUNWLHFCQUFxQixFQUNyQjtZQUNFLElBQUksRUFBRSxRQUFRO1lBQ2QsVUFBVSxFQUFFO2dCQUNWLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztnQkFDdEMsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO2dCQUM5QyxHQUFHLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUM7Z0JBQ3RELEdBQUcsU0FBUyxDQUFDLDRCQUE0QixDQUFDLGVBQWUsQ0FBQztnQkFDMUQsR0FBRyxTQUFTLENBQUMsNEJBQTRCLENBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxtQkFBbUIsQ0FDakM7Z0JBQ0QsR0FBRyxDQUFDLHFCQUFxQixLQUFLLFNBQVM7b0JBQ3JDLENBQUMsQ0FBQyxFQUFFO29CQUNKLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDbkUsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDO2FBQ3hEO1NBQ0YsRUFDRCxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDNUQsa0VBQWtFO29CQUNsRSxtRUFBbUU7b0JBQ25FLG1FQUFtRTtvQkFDbkUsaUVBQWlFO29CQUNqRSw0REFBNEQ7b0JBQzVELGtFQUFrRTtvQkFDbEUsRUFBRTtvQkFDRixtRUFBbUU7b0JBQ25FLGdFQUFnRTtvQkFDaEUsc0RBQXNEO29CQUN0RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FDL0IsbUNBQW1DLEVBQ25DLEtBQUssSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQ3ZCLENBQUM7b0JBQ0YsT0FBTyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksUUFBUSxZQUFZLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLEVBQUUsYUFBYSxDQUNqQixTQUFTLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUNsRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsXG4gIFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBvbmNlLCBzZXRXb3JrZmxvd0Jhc2VQYXRoIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgaXNTZWFsZWROb29wRXZlbnQsXG4gIGlzVGVybWluYWxSdW5FdmVudFR5cGUsXG4gIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyxcbiAgdHlwZSBSdW5JbnB1dCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IG1zIGZyb20gJ21zJztcbmltcG9ydCB7IGRlY29kZVRpbWUgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7XG4gIGNsYXNzaWZ5UnVuRXJyb3IsXG4gIGlzUmV0cnlhYmxlV29ybGRFcnJvcixcbiAgaXNXb3JsZENvbnRyYWN0RXJyb3IsXG59IGZyb20gJy4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgdHlwZSBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgUmVwbGF5UGF5bG9hZENhY2hlIH0gZnJvbSAnLi9yZXBsYXktcGF5bG9hZC1jYWNoZS5qcyc7XG5pbXBvcnQgeyBDT01QVVRFX0lOU1RBTkNFX0lEIH0gZnJvbSAnLi9ydW50aW1lL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4RXZlbnRzT3ZlcnJpZGUsXG4gIGdldE1heFF1ZXVlRGVsaXZlcmllcyxcbiAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMsXG4gIGdldFByZWNvbmRpdGlvbk1heFJlaW52b2NhdGlvbnMsXG4gIGdldFByZWNvbmRpdGlvblJlaW52b2tlRGVsYXlTZWNvbmRzLFxuICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcyxcbiAgaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkLFxuICBpc1R1cmJvRW5hYmxlZCxcbiAgaXNWbVJldGVudGlvbkVuYWJsZWQsXG59IGZyb20gJy4vcnVudGltZS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY291bnRTdGVwU3RhcnRlZEV2ZW50cyB9IGZyb20gJy4vcnVudGltZS9jb3VudC1zdGVwLXN0YXJ0ZWQtZXZlbnRzLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRGVwbG95bWVudEFmZmluaXR5T3V0Y29tZSxcbiAgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHksXG4gIHR5cGUgUmVlbnF1ZXVlQXJncyxcbn0gZnJvbSAnLi9ydW50aW1lL2RlcGxveW1lbnQtZ3VhcmQuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIGFwcGVuZEV2ZW50TG9nLFxuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBpbnNlcnRFdmVudEJ5RXZlbnRJZCxcbiAgaXNTbG90R2FwQ2hlY2tFbmFibGVkLFxuICB0eXBlIExvYWRlZEV2ZW50TG9nLFxuICBsb2FkV29ya2Zsb3dSdW5FdmVudHMsXG4gIG1lbW9pemVFbmNyeXB0aW9uS2V5LFxuICBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZCxcbiAgcHJlY29uZGl0aW9uRXZlbnREZWx0YSxcbiAgcXVldWVNZXNzYWdlLFxuICByZXNvbHZlUnVuRW5jcnlwdGlvbktleSxcbiAgcm9vdFJ1bklkRnJvbSxcbiAgcnVuRGlzcGF0Y2hDb250ZXh0LFxuICB0eXBlIFNsb3RTbmFwc2hvdFBhcmFtcyxcbiAgc2V0dGxlRXZlbnRTbG90R2FwLFxuICBzbG90U25hcHNob3RQYXJhbXMsXG4gIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LFxuICB3aXRoSGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCxcbiAgUmVwbGF5QnVkZ2V0LFxufSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LWJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyIH0gZnJvbSAnLi9ydW50aW1lL3JlcGxheS1yZWNvdmVyeS1yZXBvcnRlci5qcyc7XG5pbXBvcnQge1xuICByZXN1bWVUaW1pbmdGb3JNZXNzYWdlLFxuICByZXN1bWVUcmFja2luZ0Zyb21NZXNzYWdlLFxufSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWxhdGVuY3kuanMnO1xuaW1wb3J0IHsgcnVuSWRDcmVhdGVkQXQgfSBmcm9tICcuL3J1bnRpbWUvcnVuLWlkLXRpbWUuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTLFxuICBleGVjdXRlU3RlcCxcbiAgdHlwZSBQcmVjbGFpbWVkSW5saW5lU3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtbGF0ZW5jeS5qcyc7XG5pbXBvcnQge1xuICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5LFxuICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlLFxuICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUsXG4gIHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLW93bmVyc2hpcC5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtc2luZ2xlLWZsaWdodC5qcyc7XG5pbXBvcnQge1xuICBoYW5kbGVTdXNwZW5zaW9uLFxuICB0eXBlIFN1c3BlbnNpb25TZXJpYWxpemF0aW9uQmxvY2tlcixcbn0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyB1c2VRdWlja0pTVm0gfSBmcm9tICcuL3J1bnRpbWUvdm0tbW9kZS5qcyc7XG5pbXBvcnQgeyBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2ggfSBmcm9tICcuL3J1bnRpbWUvd2FpdC1jb250aW51YXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQsIHR5cGUgV29ybGRIYW5kbGVycyB9IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyByZW1hcEVycm9yU3RhY2sgfSBmcm9tICcuL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7XG4gIGJpbmRBY3RpdmVUcmFjZUNvbnRleHQsXG4gIGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyxcbiAgZ2V0TmV4dFRyYWNlQ2FycmllcixcbiAgZ2V0U3BhbktpbmQsXG4gIGdldFdvcmtmbG93VHJhY2VNb2RlLFxuICBpc1VzYWJsZVRyYWNlQ2FycmllcixcbiAgdHJhY2UsXG4gIHdpdGhUcmFjZUNvbnRleHQsXG4gIHdpdGhXb3JrZmxvd0JhZ2dhZ2UsXG59IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldEVycm9yTmFtZSwgZ2V0RXJyb3JTdGFjaywgbm9ybWFsaXplVW5rbm93bkVycm9yIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UgfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHtcbiAgY29tcGlsZVdvcmtmbG93QnVuZGxlLFxuICByZXBsYXlXb3JrZmxvdyxcbiAgcmVzdW1lV29ya2Zsb3csXG4gIHR5cGUgV29ya2Zsb3dSZXN1bWVSZXN1bHQsXG4gIHR5cGUgV29ya2Zsb3dTZXNzaW9uLFxufSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfTtcbmV4cG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHR5cGUgSG9vayxcbiAgdHlwZSBSZXN1bWVkSG9vayxcbiAgcmVzdW1lSG9vayxcbiAgcmVzdW1lV2ViaG9vayxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJztcbmV4cG9ydCB7XG4gIGdldFJ1bixcbiAgUnVuLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW0sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMsXG4gIHR5cGUgV29ya2Zsb3dSdW5Xcml0YWJsZVN0cmVhbU9wdGlvbnMsXG59IGZyb20gJy4vcnVudGltZS9ydW4uanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDYW5jZWxSdW5PcHRpb25zLFxuICBjYW5jZWxSdW4sXG4gIGNhbmNlbFJ1bnMsXG4gIGxpc3RTdHJlYW1zLFxuICB0eXBlIFJlYWRTdHJlYW1PcHRpb25zLFxuICB0eXBlIFJlY3JlYXRlUnVuT3B0aW9ucyxcbiAgdHlwZSBSZWVucXVldWVSdW5PcHRpb25zLFxuICByZWFkU3RyZWFtLFxuICByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZyxcbiAgcmVlbnF1ZXVlUnVuLFxuICB0eXBlIFN0b3BTbGVlcE9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwUmVzdWx0LFxuICB3YWtlVXBSdW4sXG59IGZyb20gJy4vcnVudGltZS9ydW5zLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgU3RhcnRPcHRpb25zLFxuICB0eXBlIFN0YXJ0T3B0aW9uc0Jhc2UsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkLFxuICBzdGFydCxcbn0gZnJvbSAnLi9ydW50aW1lL3N0YXJ0LmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmxkLFxuICBjcmVhdGVXb3JsZEZyb21Nb2R1bGUsXG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICBzZXRXb3JsZCxcbiAgdHlwZSBXb3JsZEZhY3RvcnlNb2R1bGUsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5cbi8qKlxuICogQXBwbHkgdGhlIG9wdGlvbmFsIGNsaWVudC1zaWRlIGV2ZW50LWxpbWl0IG92ZXJyaWRlLlxuICogYFdPUktGTE9XX01BWF9FVkVOVFNfT1ZFUlJJREVgLCB3aGVuIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIsIGNsYW1wcyB0aGVcbiAqIHNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgdG8gYSBzbWFsbGVyIHZhbHVlIHNvIGVuZm9yY2VtZW50IGNhblxuICogYmUgZXhlcmNpc2VkIHdpdGhvdXQgYSBzZXJ2ZXItc2lkZSBjaGFuZ2UuIENsYW1wLWRvd24gb25seTogaXQgbmV2ZXIgcmFpc2VzXG4gKiB0aGUgc2VydmVyJ3MgbGltaXQsIGFuZCBpdCB0YWtlcyBlZmZlY3QgZXZlbiB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBub25lLlxuICogVW5zZXQg4oeSIHNlcnZlciB2YWx1ZSBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGNsYW1wTWF4RXZlbnRzKHNlcnZlclZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdmVycmlkZSA9IGdldE1heEV2ZW50c092ZXJyaWRlKCk7XG4gIGlmIChvdmVycmlkZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc2VydmVyVmFsdWU7XG4gIHJldHVybiBzZXJ2ZXJWYWx1ZSA9PT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUgOiBNYXRoLm1pbihzZXJ2ZXJWYWx1ZSwgb3ZlcnJpZGUpO1xufVxuXG4vKipcbiAqIFJlZnVzZSBhIHF1ZXVlIGRlbGl2ZXJ5IHdob3NlIHJ1biB3YXMgY3JlYXRlZCBpbiBhIGRpZmZlcmVudCBlbnZpcm9ubWVudCB0aGFuXG4gKiB0aGlzIGRlcGxveW1lbnQgcnVucyBpbi5cbiAqXG4gKiBgc3RhcnQoKWAgcGVyZm9ybXMgdHdvIHdyaXRlcyB0aGF0IG11c3QgbGFuZCBpbiB0aGUgc2FtZSB0ZW5hbnQ6IHRoZVxuICogYHJ1bl9jcmVhdGVkYCBldmVudCwgYXR0cmlidXRlZCB0byB3aGF0ZXZlciBlbnZpcm9ubWVudCB0aGUgKmNhbGxlcipcbiAqIGF1dGhlbnRpY2F0ZXMgYXMsIGFuZCB0aGUgcXVldWUgbWVzc2FnZSwgcGlubmVkIHRvIGEgKmRlcGxveW1lbnQqLiBBXG4gKiBtaXNjb25maWd1cmVkIGNhbGxlciBjYW4gc3BsaXQgdGhlbSwgd3JpdGluZyB0aGUgcnVuIHRvIG9uZSBlbnZpcm9ubWVudFxuICogd2hpbGUgYWRkcmVzc2luZyB0aGUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlci4gVGhlIGNvbnN1bWVyIHRoZW5cbiAqIGZpbmRzIG5vIHJ1biB1bmRlciBpdHMgb3duIHRlbmFudCBhbmQgdGhlIGJhY2tlbmQncyByZXNpbGllbnQgc3RhcnRcbiAqIChgcnVuX3N0YXJ0ZWRgIGNyZWF0ZXMgdGhlIHJ1biB3aGVuIGBydW5fY3JlYXRlZGAgd2FzIG5ldmVyIHNlZW4pIG1pbnRzIGFcbiAqIFNFQ09ORCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiB0aGlzIGVudmlyb25tZW50LiBCb3RoIGNvcGllcyBhcmUgcmVhbDogdGhlXG4gKiBjcmVhdG9yJ3Mgc2l0cyBwZW5kaW5nIGZvcmV2ZXIsIHRoaXMgb25lIGV4ZWN1dGVzLCBhbmQgZXZlcnkgc3Vic2VxdWVudFxuICogY3Jvc3MtdGVuYW50IHF1ZXVlIGFjayBmYWlscyB0byBmaW5kIGl0cyBtZXNzYWdlLlxuICpcbiAqIE5vdGhpbmcgZXh0ZXJuYWwgaXMgbmVlZGVkIHRvIGNhdGNoIHRoaXM6IHRoZSBjcmVhdG9yJ3MgZW52aXJvbm1lbnQgcmlkZXMgdGhlXG4gKiBtZXNzYWdlIGluIGBydW5JbnB1dC5lbnZpcm9ubWVudGAgYW5kIHRoaXMgcHJvY2VzcyBhbHJlYWR5IGtub3dzIGl0cyBvd24uIFNvXG4gKiBjb21wYXJlIHRoZW0gYW5kIHN0b3AgQkVGT1JFIGBydW5fc3RhcnRlZGAsIHRoZSB3cml0ZSB0aGF0IHdvdWxkIGNyZWF0ZSB0aGVcbiAqIGZvcmsuIFJlZnVzaW5nIGFmdGVyIGl0IHdvdWxkIGJlIHRvbyBsYXRlLlxuICpcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGNhbGxlciBtdXN0IGFiYW5kb24gdGhlIGRlbGl2ZXJ5LiBTa2lwcGVkIHdoZW5ldmVyXG4gKiBlaXRoZXIgc2lkZSBpcyB1bmtub3duLCB3aGljaCBrZWVwcyBldmVyeSBleGlzdGluZyBzZXR1cCBvbiBpdHMgY3VycmVudFxuICogYmVoYXZpb3I6IHdvcmxkcyB3aXRoIG5vIGVudmlyb25tZW50IGRpbWVuc2lvbiAoYHdvcmxkLWxvY2FsYCxcbiAqIGB3b3JsZC1wb3N0Z3Jlc2ApIGRvbid0IGltcGxlbWVudCBgZ2V0RW52aXJvbm1lbnRgLCBhbmQgcnVucyBzdGFydGVkIGJ5IGFuXG4gKiBvbGRlciBTREsgY2Fycnkgbm8gYGVudmlyb25tZW50YCBmaWVsZC5cbiAqL1xuZnVuY3Rpb24gcmVmdXNlQ3Jvc3NFbnZpcm9ubWVudERlbGl2ZXJ5KHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNyZWF0b3JFbnZpcm9ubWVudCA9IHJ1bklucHV0Py5lbnZpcm9ubWVudDtcbiAgaWYgKCFjcmVhdG9yRW52aXJvbm1lbnQpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjdXJyZW50RW52aXJvbm1lbnQgPSB3b3JsZC5nZXRFbnZpcm9ubWVudD8uKCk7XG4gIGlmICghY3VycmVudEVudmlyb25tZW50IHx8IGN1cnJlbnRFbnZpcm9ubWVudCA9PT0gY3JlYXRvckVudmlyb25tZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgIGBSZWZ1c2luZyB0byBydW4gdGhpcyB3b3JrZmxvdzogaXQgd2FzIGNyZWF0ZWQgaW4gdGhlIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYCArXG4gICAgICBgZW52aXJvbm1lbnQgYnV0IHRoaXMgZGVwbG95bWVudCBydW5zIGluIFwiJHtjdXJyZW50RW52aXJvbm1lbnR9XCIuIGAgK1xuICAgICAgJ0V4ZWN1dGluZyBpdCBoZXJlIHdvdWxkIGNyZWF0ZSBhIHNlY29uZCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiAnICtcbiAgICAgICdib3RoIGVudmlyb25tZW50cyDigJQgb25lIHBlbmRpbmcgZm9yZXZlciwgb25lIHJ1bm5pbmcg4oCUIHNvIHRoZSBxdWV1ZSAnICtcbiAgICAgICdtZXNzYWdlIGlzIGJlaW5nIGRpc2NhcmRlZCB3aXRob3V0IGV4ZWN1dGluZyBhbmQgd2l0aG91dCByZXRyeWluZy4gJyArXG4gICAgICAnVGhlIGNsaWVudCB0aGF0IGNhbGxlZCBzdGFydCgpIHdyb3RlIHRoZSBydW4gdG8gaXRzIG93biBlbnZpcm9ubWVudCAnICtcbiAgICAgICdidXQgYWRkcmVzc2VkIHRoZSBxdWV1ZSBtZXNzYWdlIHRvIGEgZGVwbG95bWVudCBpbiBhbm90aGVyIG9uZS4gQ2hlY2sgJyArXG4gICAgICAndGhhdCB0aGUgZW52aXJvbm1lbnQgdGhhdCBjbGllbnQgYXV0aGVudGljYXRlcyBhcyAoV09SS0ZMT1dfVkVSQ0VMX0VOViAnICtcbiAgICAgIFwiZm9yIENMSSBhbmQgQ0kgY2xpZW50cywgb3IgdGhlIE9JREMgdG9rZW4ncyBlbnZpcm9ubWVudCBpbnNpZGUgYSBcIiArXG4gICAgICAnZGVwbG95bWVudCkgbWF0Y2hlcyB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGRlcGxveW1lbnQgaXQgdGFyZ2V0cy4gVGhlICcgK1xuICAgICAgYHJ1biBpdCBjcmVhdGVkIGlzIHN0aWxsIHBlbmRpbmcgaW4gXCIke2NyZWF0b3JFbnZpcm9ubWVudH1cIiBhbmQgd2lsbCBgICtcbiAgICAgICdub3QgcnVuLicsXG4gICAge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBjcmVhdG9yRW52aXJvbm1lbnQsXG4gICAgICBjdXJyZW50RW52aXJvbm1lbnQsXG4gICAgICBwaW5uZWREZXBsb3ltZW50SWQ6IHJ1bklucHV0Py5kZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMb2cgd2hlbiBhIGBzdGFydCgpYC1lbnF1ZXVlZCBtZXNzYWdlIHBpbm5lZCB0byBvbmUgZGVwbG95bWVudCBpcyBkZWxpdmVyZWRcbiAqIHRvIGEgZGlmZmVyZW50IG9uZS5cbiAqXG4gKiBBIGZpcnN0LWRlbGl2ZXJ5IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXQuZGVwbG95bWVudElkYCAodGhlIGRlcGxveW1lbnRcbiAqIGBzdGFydCgpYCBhZGRyZXNzZWQgaXQgdG8pLCBzbyBjb21wYXJpbmcgdGhhdCBhZ2FpbnN0IHRoaXMgaGFuZGxlcidzIG93blxuICogZGVwbG95bWVudCBkZXRlY3RzIG1pcy1kZWxpdmVyeSBkaXJlY3RseS4gVGhpcyBpcyBhIERJQUdOT1NUSUMsIG5vdCBhIGdhdGU6XG4gKiBpdCB3YXJucyBhbmQgbGV0cyB0aGUgaW52b2NhdGlvbiBwcm9jZWVkLCBkZWxpYmVyYXRlbHkuXG4gKlxuICogV2h5IHRoaXMgb25lIG9ubHkgd2FybnMgd2hpbGUgaXRzIGVudmlyb25tZW50IHNpYmxpbmcgYWJvdmUgcmVmdXNlczogYVxuICogZGlmZmVyaW5nIGRlcGxveW1lbnQgaWQgaXMgbm90IGJ5IGl0c2VsZiBldmlkZW5jZSBvZiB0aGUgZm9yayB3ZSBjYXJlIGFib3V0LlxuICogVGhlIGVudmlyb25tZW50IHBhaXIgaXMgZXhhY3QgKHR3byBuYW1lZCBlbnZpcm9ubWVudHMgdGhhdCBkaXNhZ3JlZSkgYW5kIGl0XG4gKiBpcyB0aGUgZGltZW5zaW9uIHRoZSBydW4ncyB0ZW5hbnQgaXMga2V5ZWQgb24uIERlcGxveW1lbnQgaWRzIGRpc2FncmVlIGZvclxuICogYmVuaWduIHJlYXNvbnMgdG9vOiBgd29ybGQtbG9jYWxgIGRlcml2ZXMgaXRzIGlkIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdlXG4gKiB2ZXJzaW9uIChgZHBsX2xvY2FsQDx2ZXJzaW9uPmApLCBzbyB1cGdyYWRpbmcgdGhlIFNESyBtaWQtcnVuIGNoYW5nZXMgaXQgd2l0aFxuICogbm90aGluZyB3cm9uZy4gUmVmdXNpbmcgb24gdGhhdCBzaWduYWwgd291bGQgc3RyYW5kIGNvcnJlY3QgcnVucywgYW5kXG4gKiByZWZ1c2luZyBiZWZvcmUgYHJ1bl9zdGFydGVkYCBsZWF2ZXMgbm8gc2VydmVyLXNpZGUgcmVjb3JkIHRvIGV4cGxhaW4gd2h5LlxuICogQW55b25lIHRlbXB0ZWQgdG8gcHJvbW90ZSB0aGlzIHRvIGEgaGFyZCBmYWlsdXJlIGhhcyB0byBoYW5kbGUgdGhhdCBmaXJzdC5cbiAqXG4gKiBTa2lwcGVkIHVubGVzcyBCT1RIIGlkcyBhcmUga25vd246IGBnZXREZXBsb3ltZW50SWQoKWAgdGhyb3dzIGluIHdvcmxkcyB0aGF0XG4gKiByZXF1aXJlIGEgZGVwbG95bWVudCBhbmQgaGF2ZSBub25lLCBhbmQgYSByZS1lbnF1ZXVlZCBtZXNzYWdlIGNhcnJpZXMgbm9cbiAqIGBydW5JbnB1dGAgYXQgYWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IHJ1bklucHV0Py5kZXBsb3ltZW50SWQ7XG4gIGlmICghcGlubmVkRGVwbG95bWVudElkKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnREZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFdvcmxkcyB0aGF0IHJlcXVpcmUgYSBkZXBsb3ltZW50IGlkIHRocm93IHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiBUaGF0IGlzXG4gICAgLy8gbm90IGEgbWlzbWF0Y2g6IHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWN1cnJlbnREZXBsb3ltZW50SWQgfHwgY3VycmVudERlcGxveW1lbnRJZCA9PT0gcGlubmVkRGVwbG95bWVudElkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICdRdWV1ZSBtZXNzYWdlIHdhcyBkZWxpdmVyZWQgdG8gYSBkZXBsb3ltZW50IGl0IHdhcyBub3QgcGlubmVkIHRvLiAnICtcbiAgICAgICdUaGUgcnVuIHdhcyBjcmVhdGVkIHRhcmdldGluZyBhIGRpZmZlcmVudCBkZXBsb3ltZW50LCBzbyB0aGlzICcgK1xuICAgICAgJ2ludm9jYXRpb24gbWF5IGJlIHJlcGxheWluZyBhZ2FpbnN0IGNvZGUgdGhlIHJ1biB3YXMgbm90IHN0YXJ0ZWQgb24uICcgK1xuICAgICAgJ0NvbnRpbnVpbmcg4oCUIHRoaXMgaXMgZXhwZWN0ZWQgaWYgdGhlIFdvcmtmbG93IFNESyB2ZXJzaW9uIGNoYW5nZWQgJyArXG4gICAgICAnbWlkLXJ1biBpbiBsb2NhbCBkZXZlbG9wbWVudCwgd2hlcmUgdGhlIGRlcGxveW1lbnQgaWQgaXMgZGVyaXZlZCBmcm9tICcgK1xuICAgICAgJ3RoYXQgdmVyc2lvbi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgcGlubmVkRGVwbG95bWVudElkLFxuICAgICAgY3VycmVudERlcGxveW1lbnRJZCxcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHwgbnVsbCB7XG4gIGlmIChXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG5cbiAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHN0ZXAgZXhlY3V0aW9uIHJlamVjdGVkIGJlY2F1c2UgdGhlIHN0ZXAgZW50aXR5IGRvZXMgbm90IGV4aXN0LFxuICogdGhlIHNpZ25hdHVyZSBvZiBhIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIG1lc3NhZ2Ugd2hvc2UgZGVsaXZlcnkgYmVhdCAob3JcbiAqIG91dGxpdmVkIGEgdHJhbnNpZW50IGZhaWx1cmUgb2YpIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIGBzdGVwX2NyZWF0ZWRgXG4gKiB3cml0ZS4gRXZlcnkgV29ybGQgc3VyZmFjZXMgaXQgYXMgYSBgV29ya2Zsb3dXb3JsZEVycm9yYCBuYW1pbmcgdGhlIG1pc3NpbmdcbiAqIHN0ZXA6IHdvcmxkLXZlcmNlbCBtYXBzIHRoZSBiYWNrZW5kJ3MgNDA0IHRvXG4gKiBgd29ya2Zsb3cgc3RlcCBzdGVwX+KApiBub3QgZm91bmRgLCB3b3JsZC1sb2NhbCBhbmQgd29ybGQtcG9zdGdyZXMgdGhyb3dcbiAqIGBTdGVwIFwic3RlcF/igKZcIiBub3QgZm91bmRgIGRpcmVjdGx5LiBUaGUgbWVzc2FnZSBtYXRjaCBpcyBkZWxpYmVyYXRlbHkgbG9vc2VcbiAqIGFjcm9zcyB0aG9zZSBzaGFwZXM7IHRoZSBzdGF0dXMgY2hlY2sgbmFycm93cyB0aGUgcmVtb3RlIGNhc2Ugd2l0aG91dFxuICogZXhjbHVkaW5nIHRoZSBsb2NhbCBvbmVzICh3aGljaCBjYXJyeSBubyBzdGF0dXMpLlxuICpcbiAqIFVzZWQgb25seSB3aGVuIHRoZSBtZXNzYWdlIGNhcnJpZXMgYHN0ZXBJbnB1dGAsIHNpbmNlIGEgYmFyZSBkaXNwYXRjaFxuICogd2l0aG91dCBhIHBheWxvYWQgaGFzIG5vdGhpbmcgdG8gcmVjb3ZlciBmcm9tLCBhbmQgdGhlIGVycm9yIGtlZXBzXG4gKiBwcm9wYWdhdGluZyBmb3IgcXVldWUtZHJpdmVuIHJlY292ZXJ5IGV4YWN0bHkgYXMgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBpc1N0ZXBNaXNzaW5nRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikpIHJldHVybiBmYWxzZTtcbiAgaWYgKGVyci5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBlcnIuc3RhdHVzICE9PSA0MDQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9zdGVwL2kudGVzdChlcnIubWVzc2FnZSkgJiYgL25vdCBmb3VuZC9pLnRlc3QoZXJyLm1lc3NhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogRXZlbnQgfCB1bmRlZmluZWQge1xuICAvLyBUZXJtaW5hbCBydW4gZXZlbnRzIGFyZSBhbHdheXMgbGFzdCBieSBjb25zdHJ1Y3Rpb24gKG5vIGV2ZW50IGNyZWF0aW9uXG4gIC8vIHN1Y2NlZWRzIGFnYWluc3QgYSB0ZXJtaW5hbCBydW4pLCBidXQgc2NhbiB0aGUgZnVsbCBhcnJheSBmb3JcbiAgLy8gZGVmZW5zZS1pbi1kZXB0aDogYSBXb3JsZC9iYWNrZW5kIG9yZGVyaW5nIGJ1ZyBzaG91bGRuJ3QgbWFrZSB1cyBtaXNzIGFuXG4gIC8vIGFjdHVhbCB0ZXJtaW5hdGlvbiBzaWduYWwuXG4gIHJldHVybiBldmVudHMuZmluZChcbiAgICAoZSkgPT5cbiAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAoZS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGVybWluYWxSdW5FdmVudCA9IGZpbmRSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzLCBydW5JZCk7XG5cbiAgaWYgKCF0ZXJtaW5hbFJ1bkV2ZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUnVuIHJlYWNoZWQgdGVybWluYWwgZXZlbnQsIGV4aXRpbmcnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXZlbnRUeXBlOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50VHlwZSxcbiAgICBldmVudElkOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEhvdyBtYW55IG9mIGBpZHNgIGFyZSBhYnNlbnQgZnJvbSBgcHJlc2VudGAuICovXG5mdW5jdGlvbiBjb3VudE1pc3NpbmdJZHMoaWRzOiBJdGVyYWJsZTxzdHJpbmc+LCBwcmVzZW50OiBTZXQ8c3RyaW5nPik6IG51bWJlciB7XG4gIGxldCBtaXNzaW5nID0gMDtcbiAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICBpZiAoIXByZXNlbnQuaGFzKGlkKSkgbWlzc2luZysrO1xuICB9XG4gIHJldHVybiBtaXNzaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJ1biBoYXMgYSBob29rIGFuZC9vciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5LCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIE9wZW4gd2FpdHMgYmxvY2sgaW5saW5lIGRlbHRhcy4gT3BlbiBob29rcyBhbmQgd2FpdHMgZGlzYWJsZSB0dXJibydzIGZvcmNlZFxuICogb3B0aW1pc3RpYyBzdGFydC4gT3BlbiBob29rcyBhZGRpdGlvbmFsbHkgc3VwcHJlc3Mgb3BlcmF0b3ItZW5hYmxlZFxuICogb3B0aW1pc3RpYyBzdGFydCB1bnRpbCB0aGUgYHN0ZXBfc3RhcnRlZGAgY2xhaW0gc3VjY2VlZHM7IG9wZW4gd2FpdHMgbGVhdmVcbiAqIHRoYXQgZXhwbGljaXQsIGlkZW1wb3RlbmN5LW9ubHkgb3B0LWluIGFsb25lLlxuICpcbiAqIFN0ZXAtYm9keSBgYXR0cl9zZXRgIHdyaXRlcyBhcmUgTk9UIGEgY29uY2VybjogdGhleSBsYW5kIGJlZm9yZSB0aGVcbiAqIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSBhbmQgYXJlIHRoZXJlZm9yZSBhbHJlYWR5IGluc2lkZSB0aGUgcmV0dXJuZWRcbiAqIGRlbHRhLlxuICovXG5mdW5jdGlvbiBvcGVuSG9va0FuZFdhaXRTdGF0ZShldmVudHM6IEV2ZW50W10pOiB7XG4gIG9wZW5Ib29rOiBib29sZWFuO1xuICBvcGVuV2FpdDogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBob29rcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB3YWl0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdob29rX2NyZWF0ZWQnOlxuICAgICAgICBob29rcy5hZGQoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaG9va19kaXNwb3NlZCc6XG4gICAgICAgIGhvb2tzLmRlbGV0ZShldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3YWl0X2NyZWF0ZWQnOlxuICAgICAgICB3YWl0cy5hZGQoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2FpdF9jb21wbGV0ZWQnOlxuICAgICAgICB3YWl0cy5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBvcGVuSG9vazogaG9va3Muc2l6ZSA+IDAsIG9wZW5XYWl0OiB3YWl0cy5zaXplID4gMCB9O1xufVxuXG50eXBlIFJldGVudGlvbkRlY2lzaW9uID1cbiAgfCB7IHJldGFpbjogdHJ1ZSB9XG4gIHwge1xuICAgICAgcmV0YWluOiBmYWxzZTtcbiAgICAgIHJlYXNvbjpcbiAgICAgICAgfCAnZGlzYWJsZWQnXG4gICAgICAgIHwgJ3NlcmlhbGl6YXRpb25fZXhlY3V0ZWRfd29ya2Zsb3dfY29kZSdcbiAgICAgICAgfCAnbm9fcmVwbGF5X2RyaXZlcic7XG4gICAgfTtcblxuLyoqXG4gKiBUaGUgY29tcGxldGUgcmV0YWluZWQtVk0gcG9saWN5IGZvciBhIHN1c3BlbnNpb24gYm91bmRhcnkuXG4gKlxuICogRXZlcnkgc3VzcGVuc2lvbiBwcm9kdWNlciB1c2VzIHRoZSBzdXNwZW5zaW9uLWdlbmVyYXRpb24gZ3VhcmQgd2hlblxuICogc2lnbmFsaW5nLiBPdGhlcndpc2UgYSBzaWduYWwgc2NoZWR1bGVkIGF0IGJvdW5kYXJ5IE4gY291bGQgc3VzcGVuZCB0aGUgVk1cbiAqIGFmdGVyIGl0IGhhcyBhbHJlYWR5IHJlc3VtZWQgaW50byBib3VuZGFyeSBOKzEuIFRoZSBzdHJpY3RseSBvcmRlcmVkIGV2ZW50XG4gKiBsb2cgZGV0ZXJtaW5lcyB3aGljaCBicmFuY2ggcmVzb2x1dGlvbiB3aW5zLiBBIHN0ZXAgb3IgYXR0cmlidXRlIHdyaXRlIGlzXG4gKiByZXF1aXJlZCB0byBkcml2ZSB0aGUgbmV4dCBpbmxpbmUgaXRlcmF0aW9uOyBob29rLSBvciB3YWl0LW9ubHkgc3VzcGVuc2lvbnNcbiAqIHBhcmsgbm9ybWFsbHkuXG4gKlxuICogUmV0YWluaW5nIGFjcm9zcyBhbiBvcGVuIGhvb2sgb3Igd2FpdCBhbHNvIHBlcm1pdHMgYW4gb3V0LW9mLWJhbmQgY29sZCByZXBsYXlcbiAqIHRvIHJhY2UgdGhpcyBpbnZvY2F0aW9uLiBUaGF0IGlzIHNhZmUgb25seSBiZWNhdXNlIGVhY2ggbG9hZGVkIGxvZyBpcyBhXG4gKiBtb25vdG9uZSwgaG9sZS1mcmVlIHByZWZpeDsgcmVwbGF5aW5nIGEgbG9uZ2VyIHByZWZpeCBwcmVzZXJ2ZXMgYWxsIGVhcmxpZXJcbiAqIGNvcnJlbGF0aW9uLUlEIGRyYXdzOyBhbmQgYHN0ZXBfc3RhcnRlZGAgYXRvbWljYWxseSBjaG9vc2VzIG9uZSBvd25lci4gVGhlXG4gKiBnZW5lcmF0aW9uIGd1YXJkIGtlZXBzIGxvc2luZyBzYW1lLWJvdW5kYXJ5IHN1c3BlbnNpb24gc2lnbmFscyBzdGFsZSwgd2hpbGVcbiAqIGEgc3RhbGUtc25hcHNob3QvNDEyIHJlc3RhcnQgZGlzY2FyZHMgdGhlIHJldGFpbmVkIHNlc3Npb24gYW5kIHJlcGxheXMgZnJvbVxuICogdGhlIGF1dGhvcml0YXRpdmUgbG9nLiBBIFdvcmxkIHRoYXQgZXhwb3NlcyBhIG5vbi1wcmVmaXggdmlldyB3b3VsZCB2aW9sYXRlXG4gKiB0aGlzIHBvbGljeSdzIHByZWNvbmRpdGlvbiBhbmQgY291bGQgYmluZCBvbmUgb3JkaW5hbCB0byB0d28gbG9naWNhbCBicmFuY2hlc1xuICogYmVmb3JlIHRoZSBzdGVwLW93bmVyc2hpcCBjbGFpbSBoYXMgYSBjaGFuY2UgdG8gYXJiaXRyYXRlIHRoZW0uXG4gKlxuICogQSBob29rLXdyaXRlIGNvbnRpbnVhdGlvbiBpcyB0aGUgb25lIGJvdW5kYXJ5IHJldGFpbmVkIHdpdGhvdXQgYSBzdGVwIG9yXG4gKiBhdHRyaWJ1dGUgZHJpdmVyLiBUaGUgc3VzcGVuc2lvbiBjb21taXR0ZWQgdGhlIGV2ZW50IGEgaG9vaydzIG93biBhd2FpdGVyIGlzXG4gKiBwYXJrZWQgb24g4oCUIHRoZSBgaG9va19jcmVhdGVkYCBhIGBob29rLmdldENvbmZsaWN0KClgIHdhaXRzIGZvciwgb3IgdGhlXG4gKiBgaG9va19jb25mbGljdGAgYSBjcmVhdGUgd2hvc2UgdG9rZW4gd2FzIGFscmVhZHkgY2xhaW1lZCBjb21taXR0ZWQgaW5zdGVhZCDigJRcbiAqIGFuZCB0aGUgY2FsbGVyIGFkdmFuY2VzIHRoZSB3b3JrZmxvdyBvdmVyIHRoYXQgZXZlbnQgYnkgcmVzdW1pbmcgdGhlIHNlc3Npb25cbiAqIGluIHRoaXMgcHJvY2VzcyByYXRoZXIgdGhhbiByZS1pbnZva2luZyAoc2VlIGBjb250aW51ZU92ZXJIb29rV3JpdGVgIGluIHRoZVxuICogcmVwbGF5IGxvb3ApLCBzbyB0aGUgcnVudGltZSBpdHNlbGYgZHJpdmVzIHRoZSBuZXh0IGl0ZXJhdGlvbi4gT25lIGFybSBmb3JcbiAqIGJvdGggb3V0Y29tZXMgYmVjYXVzZSBpdCBpcyBvbmUgYm91bmRhcnk6IHNhbWUgd3JpdGUsIHNhbWUgZXZlbnQgc2xvdCwgc2FtZVxuICogY29udGludWF0aW9uLiBTdGVwcyBpbiB0aGUgc2FtZSBzdXNwZW5zaW9uIHJpZGUgYWxvbmcgcXVldWVkOiBhbiBhd2FpdGVyXG4gKiBlbXB0aWVzIGBsYXp5SW5saW5lU3RlcHNgIGFuZCB0aGUgY29uZmxpY3QgYnJhbmNoIHJldHVybnMgYmVmb3JlIGFueSBpbmxpbmVcbiAqIGV4ZWN1dGlvbiwgc28gbm90aGluZyB0aGlzIGludm9jYXRpb24gZG9lcyBjYW4gb3JkZXIgdGhlIGNvbnRpbnVhdGlvbiBiZWhpbmRcbiAqIGEgc3RlcCBib2R5LiBUaGUgaG9vayB0aGlzIHN1c3BlbnNpb24ganVzdCBjcmVhdGVkIGlzIGFuIG9wZW4gaG9vayBieVxuICogZGVmaW5pdGlvbiwgYW5kIGlzIG5vIG1vcmUgYSBoYXphcmQgdGhhbiBhbnkgb3RoZXIgb3BlbiBob29rIGhlcmU6IGFcbiAqIGBob29rX3JlY2VpdmVkYCBsYW5kaW5nIG91dCBvZiBiYW5kIGlzIGFic2VudCBmcm9tIHRoZSBsb2cgdGhlIHJlc3VtZSByZWFkc1xuICogZXhhY3RseSBhcyBpdCBpcyBhYnNlbnQgZnJvbSBhIGZldGNoIHRoYXQgcmV0dXJuZWQgYSBtb21lbnQgYmVmb3JlIGl0IOKAlCBhXG4gKiBwcmVmaXgsIG5ldmVyIGEgaG9sZSwgY29ycmVjdGVkIG9uIHRoZSBuZXh0IHdyaXRlLlxuICpcbiAqIFF1aWVzY2VuY2UgYXNzdW1lcyB3b3JrZmxvdyBjb2RlIHN0YXlzIGluc2lkZSB0aGUgc2FuZGJveCdzIGRldGVybWluaXNtXG4gKiBjb250cmFjdC4gRXNjYXBpbmcgdG8gdGhlIGhvc3QgcmVhbG0gKGZvciBleGFtcGxlLCByZWNvdmVyaW5nIGEgaG9zdFxuICogYEZ1bmN0aW9uYCBjb25zdHJ1Y3RvciB0byBzY2hlZHVsZSByZWFsIHRpbWVycykgYWxyZWFkeSBtYWtlcyBvcmRpbmFyeSBjb2xkXG4gKiByZXBsYXkgbm9uZGV0ZXJtaW5pc3RpYyBhbmQgaXMgbm90IGRlZmVuZGVkIGhlcmUuXG4gKlxuICovXG5mdW5jdGlvbiBnZXRSZXRlbnRpb25EZWNpc2lvbih7XG4gIHN1c3BlbnNpb24sXG4gIHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQsXG4gIGhvb2tDb250aW51YXRpb24gPSBmYWxzZSxcbn06IHtcbiAgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uO1xuICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3VzcGVuc2lvbiBjb21taXR0ZWQgdGhlIGV2ZW50IGEgaG9vaydzIG93biBhd2FpdGVyIGlzXG4gICAqIHdhaXRpbmcgb24gYW5kIHRoZSBjYWxsZXIgd2lsbCBjb250aW51ZSBvdmVyIGl0IGluLXByb2Nlc3MsIG1ha2luZyB0aGVcbiAgICogcnVudGltZSB0aGUgcmVwbGF5IGRyaXZlciBmb3IgYSBib3VuZGFyeSB0aGF0IGhhcyBubyBzdGVwIG9yIGF0dHJpYnV0ZVxuICAgKiB3cml0ZSBvZiBpdHMgb3duLiBTZWUgdGhlIHBvbGljeSBhYm92ZS5cbiAgICovXG4gIGhvb2tDb250aW51YXRpb24/OiBib29sZWFuO1xufSk6IFJldGVudGlvbkRlY2lzaW9uIHtcbiAgaWYgKCFpc1ZtUmV0ZW50aW9uRW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuIHsgcmV0YWluOiBmYWxzZSwgcmVhc29uOiAnZGlzYWJsZWQnIH07XG4gIH1cbiAgaWYgKHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQgPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJldGFpbjogZmFsc2UsXG4gICAgICByZWFzb246ICdzZXJpYWxpemF0aW9uX2V4ZWN1dGVkX3dvcmtmbG93X2NvZGUnLFxuICAgIH07XG4gIH1cbiAgaWYgKGhvb2tDb250aW51YXRpb24pIHtcbiAgICByZXR1cm4geyByZXRhaW46IHRydWUgfTtcbiAgfVxuICBpZiAoc3VzcGVuc2lvbi5zdGVwQ291bnQgPT09IDAgJiYgc3VzcGVuc2lvbi5hdHRyaWJ1dGVDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiB7IHJldGFpbjogZmFsc2UsIHJlYXNvbjogJ25vX3JlcGxheV9kcml2ZXInIH07XG4gIH1cbiAgcmV0dXJuIHsgcmV0YWluOiB0cnVlIH07XG59XG5cbmNvbnN0IFNFUklBTElaQVRJT05fQkxPQ0tFUl9MT0dfREVUQUlMX0xJTUlUID0gMTYwO1xuXG4vKiogS2VlcCByZXRlbnRpb24gZGlhZ25vc3RpY3MgdXNlZnVsIHdpdGhvdXQgZW1pdHRpbmcgdW5ib3VuZGVkIGd1ZXN0IGRhdGEuICovXG5mdW5jdGlvbiBzZXJpYWxpemF0aW9uQmxvY2tlckxvZ01ldGFkYXRhKFxuICBibG9ja2VyczogU3VzcGVuc2lvblNlcmlhbGl6YXRpb25CbG9ja2VyW10sXG4gIGNvdW50OiBudW1iZXJcbikge1xuICByZXR1cm4ge1xuICAgIHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQ6IGNvdW50LFxuICAgIHNlcmlhbGl6YXRpb25CbG9ja2VyczogYmxvY2tlcnMubWFwKFxuICAgICAgKHsgc291cmNlLCBjb3JyZWxhdGlvbklkLCBraW5kLCBkZXRhaWwgfSkgPT4gKHtcbiAgICAgICAgc291cmNlLFxuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICBraW5kLFxuICAgICAgICBkZXRhaWw6XG4gICAgICAgICAgZGV0YWlsICYmIGRldGFpbC5sZW5ndGggPiBTRVJJQUxJWkFUSU9OX0JMT0NLRVJfTE9HX0RFVEFJTF9MSU1JVFxuICAgICAgICAgICAgPyBgJHtkZXRhaWwuc2xpY2UoMCwgU0VSSUFMSVpBVElPTl9CTE9DS0VSX0xPR19ERVRBSUxfTElNSVQpfeKApmBcbiAgICAgICAgICAgIDogZGV0YWlsLFxuICAgICAgfSlcbiAgICApLFxuICAgIHNlcmlhbGl6YXRpb25CbG9ja2Vyc1RydW5jYXRlZDogY291bnQgPiBibG9ja2Vycy5sZW5ndGgsXG4gIH07XG59XG5cbnR5cGUgUmVwbGF5RXZlbnRMb2cgPVxuICB8IHsgdHlwZTogJ2xvYWRBbGwnIH1cbiAgfCAoeyB0eXBlOiAncmVhZHknIH0gJiBMb2FkZWRFdmVudExvZylcbiAgfCAoeyB0eXBlOiAnbG9hZEFmdGVyJzsgY3Vyc29yOiBzdHJpbmcgfSAmIExvYWRlZEV2ZW50TG9nKTtcblxuZnVuY3Rpb24gbmV4dEV2ZW50TG9nTG9hZChsb2c6IExvYWRlZEV2ZW50TG9nKTogUmVwbGF5RXZlbnRMb2cge1xuICBpZiAobG9nLmN1cnNvciA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2xvYWRBZnRlcicsXG4gICAgZXZlbnRzOiBsb2cuZXZlbnRzLFxuICAgIGN1cnNvcjogbG9nLmN1cnNvcixcbiAgfTtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGlubGluZS1leGVjdXRpb24gZHVyYXRpb24gZm9yIGEgc2luZ2xlIGhhbmRsZXIgaW52b2NhdGlvbi5cbiAqXG4gKiBPcmRlciBvZiBwcmVjZWRlbmNlOlxuICogMS4gYFdPUktGTE9XX1YyX1RJTUVPVVRfTVNgIGVudiB2YXJcbiAqIDIuIFRpZXJlZCBidWRnZXQgZGVyaXZlZCBmcm9tIGB3b3JsZC5nZXRSdW50aW1lRGVhZGxpbmUoKWBcbiAqIDMuIERlZmF1bHQgb2YgMiBtaW51dGVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gIHdvcmxkOiBXb3JsZCxcbiAgaW52b2NhdGlvblN0YXJ0VGltZTogbnVtYmVyXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByYXdFbnZPdmVycmlkZSA9IHByb2Nlc3MuZW52LldPUktGTE9XX1YyX1RJTUVPVVRfTVM7XG4gIGlmIChyYXdFbnZPdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmIHJhd0Vudk92ZXJyaWRlICE9PSAnJykge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXdFbnZPdmVycmlkZSk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDApIHtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcnVudGltZURlYWRsaW5lID0gYXdhaXQgd29ybGQuZ2V0UnVudGltZURlYWRsaW5lPy4oKTtcbiAgaWYgKHJ1bnRpbWVEZWFkbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGVhZGxpbmVNcyA9IHJ1bnRpbWVEZWFkbGluZS5nZXRUaW1lKCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oZGVhZGxpbmVNcykpIHtcbiAgICAgIGNvbnN0IG1heER1cmF0aW9uTXMgPSBNYXRoLmZsb29yKGRlYWRsaW5lTXMgLSBpbnZvY2F0aW9uU3RhcnRUaW1lKTtcbiAgICAgIGlmIChtYXhEdXJhdGlvbk1zID49IG1zKCcyNW0nKSkge1xuICAgICAgICByZXR1cm4gbXMoJzEwbScpO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4RHVyYXRpb25NcyA+PSBtcygnMTBtJykpIHtcbiAgICAgICAgcmV0dXJuIG1zKCc1bScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtcygnMm0nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHJvdXRlIHdoaWNoIGhhbmRsZXMgd29ya2Zsb3cgZXhlY3V0aW9uIHJlcXVlc3RzLFxuICogZXhlY3V0aW5nIHN0ZXBzIGlubGluZSB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBmdW5jdGlvbiBpbnZvY2F0aW9uc1xuICogYW5kIHF1ZXVlIG92ZXJoZWFkLlxuICpcbiAqIFRoZSBoYW5kbGVyIGxvb3BzOiByZXBsYXkgd29ya2Zsb3cg4oaSIGV4ZWN1dGUgc3RlcCBpbmxpbmUg4oaSIHJlcGxheSDihpIgLi4uXG4gKiB1bnRpbCB0aGUgd29ya2Zsb3cgY29tcGxldGVzLCB0aW1lcyBvdXQsIG9yIGVuY291bnRlcnMgbm9uLXN0ZXAgc3VzcGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHdvcmtmbG93Q29kZSAtIFRoZSB3b3JrZmxvdyBidW5kbGUgY29kZSBjb250YWluaW5nIGFsbCB3b3JrZmxvdyBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBhIFZlcmNlbCBBUEkgcm91dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93RW50cnlwb2ludChcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdD86IG51bWJlcjtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBzZXRXb3JrZmxvd0Jhc2VQYXRoKG9wdGlvbnM/LmJhc2VQYXRoKTtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIFQyIG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93IChzZWUgcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cyk6XG4gICAgICAgIC8vIHRoZSBpbnN0YW50IHRoaXMgY29uc3VtZXIgYmVnYW4sIGJlZm9yZSBtZXNzYWdlIHBhcnNpbmcuIE9ubHkgdXNlZFxuICAgICAgICAvLyB3aGVuIHRoZSBtZXNzYWdlIHR1cm5zIG91dCB0byBjYXJyeSByZXN1bWUgdGltaW5nOyB0YWtpbmcgaXRcbiAgICAgICAgLy8gdW5jb25kaXRpb25hbGx5IGtlZXBzIGl0IGhvbmVzdCBmb3IgdGhlIGRlbGl2ZXJpZXMgdGhhdCBkby5cbiAgICAgICAgY29uc3QgaGFuZGxlckVudGVyZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICAgIHN0ZXBJbnB1dCxcbiAgICAgICAgICBydW5Db250ZXh0LFxuICAgICAgICAgIGhvb2tSZXN1bWVUaW1pbmcsXG4gICAgICAgICAgd2FpdENvbnRpbnVhdGlvbixcbiAgICAgICAgfSA9IFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYS5wYXJzZShtZXNzYWdlXyk7XG5cbiAgICAgICAgLy8gLS0tIEhvb2stcmVzdW1lIFRUUiB0ZWxlbWV0cnkgKHJ1bnRpbWUvcmVzdW1lLWxhdGVuY3kudHMpIC0tLVxuICAgICAgICAvLyBUaHJlYWRlZCB0aHJvdWdoIHRoaXMgaW52b2NhdGlvbiBhbmQgQ09OU1VNRUQgYnkgdGhlIGZpcnN0IGR1cmFibGVcbiAgICAgICAgLy8gc3RlcCB0aGF0IGZvbGxvd3MgdGhlIHJlc3VtcHRpb24sIGNsZWFyZWQgYXQgdGhhdCBwb2ludCBzbyBhIGxhdGVyXG4gICAgICAgIC8vIHN0ZXAsIGEgcmV0cnksIG9yIGEgcmVkZWxpdmVyeSBuZXZlciByZS1yZXBvcnRzIHRoZSBzYW1lIHJlc3VtZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVHdvIGRlbGl2ZXJ5IHNoYXBlcyBjYXJyeSB0aW1pbmc6XG4gICAgICAgIC8vICAtIHRoZSByZXN1bWUncyBvd24gaW52b2NhdGlvbiAobm8gYHN0ZXBJZGApOiB0aGUgcHJvZHVjZXIncyBUMC9UMVxuICAgICAgICAvLyAgICByaWRlIHRoZSBtZXNzYWdlIGFuZCB0aGlzIGhhbmRsZXIncyBlbnRyeSBpcyBUMi5cbiAgICAgICAgLy8gIC0gYSBzdGVwIHRoaXMgaW52b2NhdGlvbiBoYW5kZWQgdG8gYW5vdGhlciBpbnZvY2F0aW9uIChgc3RlcElkYFxuICAgICAgICAvLyAgICBwcmVzZW50KTogdGhlIHJlc3VtaW5nIGludm9jYXRpb24gYWxyZWFkeSBzdGFtcGVkIFQyLi5UNCBvbnRvXG4gICAgICAgIC8vICAgIHRoZSBtZXNzYWdlLCBzbyB0aGV5IGFyZSByZWFkIGJhY2sgdmVyYmF0aW0uXG4gICAgICAgIGxldCByZXN1bWVUcmFja2luZyA9IHJlc3VtZVRyYWNraW5nRnJvbU1lc3NhZ2UoXG4gICAgICAgICAgaG9va1Jlc3VtZVRpbWluZyxcbiAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCAhPT0gdW5kZWZpbmVkID8gJ2Rpc3BhdGNoZWQnIDogJ2lubGluZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nICYmIGluY29taW5nU3RlcElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bWVUcmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zID0gaGFuZGxlckVudGVyZWRBdE1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXN1bWVUcmFja2luZyAmJlxuICAgICAgICAgICFOdW1iZXIuaXNGaW5pdGUocmVzdW1lVHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQSBzdGVwIG1lc3NhZ2UgZnJvbSBhIHByb2R1Y2VyIHRoYXQgZm9yd2FyZGVkIHRpbWluZyB3aXRob3V0IHRoZVxuICAgICAgICAgIC8vIGNvbnN1bWVyIGJvdW5kYXJpZXMuIE5vdGhpbmcgYWRkaXRpdmUgY2FuIGJlIHJlcG9ydGVkLlxuICAgICAgICAgIHJlc3VtZVRyYWNraW5nID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBzdGFydCgpYCBhbHdheXMgYXR0YWNoZXMgYSB0cmFjZSBjYXJyaWVyLCBidXRcbiAgICAgICAgLy8gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkgcmV0dXJucyBge31gIHdoZW4gbm8gT1RFTCBTREsgaXMgcmVnaXN0ZXJlZFxuICAgICAgICAvLyBvciBubyBzcGFuIGlzIGFjdGl2ZSwgc28gdHJlYXQgYW4gZW1wdHkgY2FycmllciB0aGUgc2FtZSBhcyBhblxuICAgICAgICAvLyBhYnNlbnQgb25lIHNvIGxpbmtlZCBtb2RlIGZhbGxzIGJhY2sgdG8gYSBmcmVzaCBvcmlnaW4gaW5zdGVhZCBvZlxuICAgICAgICAvLyBmb3J3YXJkaW5nIGEgdXNlbGVzcyBge31gIGZvcmV2ZXIuXG4gICAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nVHJhY2VDYXJyaWVyKVxuICAgICAgICAgID8gaW5jb21pbmdUcmFjZUNhcnJpZXJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhO1xuICAgICAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uod29ya2Zsb3dQcmVmaXgubGVuZ3RoKTtcblxuICAgICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgICAvLyBFbmZvcmNlIG1heCBkZWxpdmVyeSBsaW1pdCBiZWZvcmUgYW55IGluZnJhc3RydWN0dXJlIGNhbGxzLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJ1bmF3YXkgd29ya2Zsb3dzIGZyb20gY29uc3VtaW5nIGluZmluaXRlIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gICAgICAgIC8vIFNjb3BlZCBsb2dnZXIgZm9yIHRoaXMgcnVuOiBhdHRhY2hlcyBydW5JZC93b3JrZmxvd05hbWUgdG8gZXZlcnlcbiAgICAgICAgLy8gbG9nIGxpbmUgYW5kIGNoaWxkIGxvZ2dlcnMgYmVsb3csIHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgICBjb25zdCBydW5Mb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihydW5JZCwgd29ya2Zsb3dOYW1lKTtcblxuICAgICAgICBjb25zdCBtYXhRdWV1ZURlbGl2ZXJpZXMgPSBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMoKTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLmF0dGVtcHQgPiBtYXhRdWV1ZURlbGl2ZXJpZXMpIHtcbiAgICAgICAgICBjb25zdCBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24gPSBkZXNjcmliZUVycm9yKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgV29ya2Zsb3cgaGFuZGxlciBleGNlZWRlZCBtYXggZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke21heFF1ZXVlRGVsaXZlcmllc30pYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgZXJyb3JDb2RlOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uZXJyb3JDb2RlLFxuICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCBydW5JZCk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IGV4Y2VlZGVkIG1heGltdW0gcXVldWUgZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke21heFF1ZXVlRGVsaXZlcmllc30pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBSdW4gYWxyZWFkeSBmaW5pc2hlZCwgY29uc3VtZSB0aGUgbWVzc2FnZSBzaWxlbnRseVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gbWFyayBydW4gYXMgZmFpbGVkIGFmdGVyICR7bWV0YWRhdGEuYXR0ZW1wdH0gZGVsaXZlcnkgYXR0ZW1wdHMuIGAgK1xuICAgICAgICAgICAgICAgIGBBIHBlcnNpc3RlbnQgZXJyb3IgaXMgcHJldmVudGluZyB0aGUgcnVuIGZyb20gYmVpbmcgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoZSBydW4gd2lsbCByZW1haW4gaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgbWFudWFsbHkgcmVzb2x2ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byBhIHBlcnNpc3RlbnQgb3V0YWdlIG9mIHRoZSB3b3JrZmxvdyBiYWNrZW5kIGAgK1xuICAgICAgICAgICAgICAgIGBvciBhIGJ1ZyBpbiB0aGUgd29ya2Zsb3cgcnVudGltZSBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBXb3JrZmxvdyB0ZWFtLmAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgIGVycm9yU3RhY2s6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gVHJhY2UgY29ycmVsYXRpb24gbW9kZSAtLS1cbiAgICAgICAgLy8gJ2xpbmtlZCcgKGRlZmF1bHQpOiB0aGUgd29ya2Zsb3cuZXhlY3V0ZSBzcGFuIGJlbG93IHN0YXlzIGEgQ0hJTERcbiAgICAgICAgLy8gb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKSBjb250ZXh0LCBzbyBvbmUgaW52b2NhdGlvblxuICAgICAgICAvLyAocm91dGUgaGFuZGxlciwgd29ya2Zsb3cgcmVwbGF5LCBpbmxpbmUgc3RlcHMsIGV2ZW50IHdyaXRlcykgaXMgYVxuICAgICAgICAvLyBzaW5nbGUgYm91bmRlZCB0cmFjZS4gVGhlIHJ1bi1vcmlnaW4gY29udGV4dCB0cmF2ZWxzIGFzIGEgc3BhblxuICAgICAgICAvLyBMSU5LIChub3QgYSBwYXJlbnQpLCBhbmQgcmUtZW5xdWV1ZXMgZm9yd2FyZCB0aGUgb3JpZ2luYWwgY2FycmllclxuICAgICAgICAvLyB1bmNoYW5nZWQsIHNvIGEgKHBvdGVudGlhbGx5IGhvdXJzLWxvbmcpIHJ1biBpcyBuZXZlciBzdGl0Y2hlZFxuICAgICAgICAvLyBpbnRvIG9uZSBnaWFudCB0cmFjZSBhY3Jvc3MgaW52b2NhdGlvbnMuXG4gICAgICAgIC8vICdjb250aW51b3VzJzogbGVnYWN5IGJlaGF2aW9yLCB3aGVyZSB0aGUgcmVzdG9yZWQgcnVuLW9yaWdpbiBjb250ZXh0XG4gICAgICAgIC8vIGJlY29tZXMgdGhlIHBhcmVudCBvZiB0aGlzIGludm9jYXRpb24ncyBzcGFucy5cbiAgICAgICAgY29uc3QgdHJhY2VNb2RlID0gZ2V0V29ya2Zsb3dUcmFjZU1vZGUoKTtcblxuICAgICAgICAvLyBUcmFjZSBjYXJyaWVyIHRvIGF0dGFjaCB0byBtZXNzYWdlcyB0aGlzIGludm9jYXRpb24gZW5xdWV1ZXMuXG4gICAgICAgIC8vIFNlZSBnZXROZXh0VHJhY2VDYXJyaWVyIGZvciB0aGUgbGlua2VkL2NvbnRpbnVvdXMgc2VtYW50aWNzLlxuICAgICAgICBjb25zdCBuZXh0VHJhY2VDYXJyaWVyID0gKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT5cbiAgICAgICAgICBnZXROZXh0VHJhY2VDYXJyaWVyKHRyYWNlTW9kZSwgdHJhY2VDb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFuIGxpbmtzIHRvIHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0IGFuZCAoaW4gbGlua2VkIG1vZGUpXG4gICAgICAgIC8vIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbSB0aGUgdHJhY2UgY2Fycmllci5cbiAgICAgICAgY29uc3Qgc3BhbkxpbmtzID0gYXdhaXQgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzKFxuICAgICAgICAgIHRyYWNlTW9kZSxcbiAgICAgICAgICB0cmFjZUNvbnRleHRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUaGUgcmVwbGF5IGJ1ZGdldCBjb3ZlcnMgb3JjaGVzdHJhdGlvbiB3b3JrIGJldHdlZW4gc3RlcHMsIG5vdCBpbmxpbmVcbiAgICAgICAgLy8gc3RlcCBib2RpZXMuIEl0IGlzIGNoZWNrZWQgYmV0d2VlbiBsb29wIGl0ZXJhdGlvbnM7IHN0ZXAgYm9kaWVzIHVzZVxuICAgICAgICAvLyB0aGUgcGxhdGZvcm0gdGltZW91dCBhbmQgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NUyBndWFyZCBpbnN0ZWFkLlxuICAgICAgICBjb25zdCByZXBsYXlCdWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG5cbiAgICAgICAgLy8gSW4gbGlua2VkIG1vZGUgdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBpcyBOT1QgcmVzdG9yZWQgYXMgdGhlXG4gICAgICAgIC8vIGFjdGl2ZSAocGFyZW50KSBjb250ZXh0OiBwYXNzaW5nIGB1bmRlZmluZWRgIG1ha2VzXG4gICAgICAgIC8vIHdpdGhUcmFjZUNvbnRleHQgYSBwYXNzdGhyb3VnaCwgc28gdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvd1xuICAgICAgICAvLyBzdGF5cyBhIGNoaWxkIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCBhbmQgdGhlXG4gICAgICAgIC8vIHJ1bi1vcmlnaW4gdHJhdmVscyBhcyBhIHNwYW4gbGluayBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBwYXJlbnRUcmFjZUNhcnJpZXIgPVxuICAgICAgICAgIHRyYWNlTW9kZSA9PT0gJ2NvbnRpbnVvdXMnID8gdHJhY2VDb250ZXh0IDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBRdWV1ZS1kZWxpdmVyZWQgaW52b2NhdGlvbjogQ09OU1VNRVIga2luZCwgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIHF1ZXVlLWRlbGl2ZXJlZCBzdGVwLmV4ZWN1dGUgc3Bhbi5cbiAgICAgICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnQ09OU1VNRVInKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUcmFjZUNvbnRleHQocGFyZW50VHJhY2VDYXJyaWVyLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhXb3JrZmxvd0JhZ2dhZ2UoXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCB3b3JrZmxvd05hbWUgfSxcbiAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuZ2V0X3dvcmxkJywgYXN5bmMgKCkgPT5cbiAgICAgICAgICAgICAgICBnZXRXb3JsZCgpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEJvdGggY2hlY2tzIGJlbG93IGxvb2sgYXQgYHJ1bklucHV0YCwgc28gYm90aCBhcmUgbm8tb3BzIG9uIGFcbiAgICAgICAgICAgICAgLy8gcmUtZW5xdWV1ZWQgbWVzc2FnZSAod2hpY2ggY2FycmllcyBub25lKTogdGhleSBvbmx5IGV2ZXIgcnVuIG9uXG4gICAgICAgICAgICAgIC8vIGEgZmlyc3QgZGVsaXZlcnksIHRoZSBvbmUgdGhhdCBjb3VsZCBjcmVhdGUgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gUmV0dXJuaW5nIGFja3MgdGhlIG1lc3NhZ2UuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIG1pc21hdGNoIGlzXG4gICAgICAgICAgICAgIC8vIGJha2VkIGludG8gdGhpcyBtZXNzYWdlLCBzbyBldmVyeSByZWRlbGl2ZXJ5IHdvdWxkIHJlYWNoIHRoZVxuICAgICAgICAgICAgICAvLyBzYW1lIHZlcmRpY3QsIGFuZCB0aHJvd2luZyB3b3VsZCBob3QtbG9vcCB0aGUgaGFuZGxlciB1bnRpbFxuICAgICAgICAgICAgICAvLyBNQVhfUVVFVUVfREVMSVZFUklFUyB3aXRoIHRoZSBzYW1lIGVycm9yIGVhY2ggdGltZS4gSXQgbWF0Y2hlc1xuICAgICAgICAgICAgICAvLyBob3cgdGhlIHJ1bl9zdGFydGVkIHBhdGggYWxyZWFkeSBkaXNjYXJkcyBkZWxpdmVyaWVzIHdob3NlXG4gICAgICAgICAgICAgIC8vIHZlcmRpY3QgY2Fubm90IGNoYW5nZSAoRW50aXR5Q29uZmxpY3RFcnJvciwgUnVuRXhwaXJlZEVycm9yKS5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHJlZnVzZUNyb3NzRW52aXJvbm1lbnREZWxpdmVyeSh7XG4gICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIERpYWdub3N0aWMgb25seS4gU2VlIHRoZSBoZWxwZXIgZm9yIHdoeSB0aGlzIHdhcm5zIGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgLy8gcmVmdXNpbmcgdGhlIGludm9jYXRpb24uXG4gICAgICAgICAgICAgIGF3YWl0IHdhcm5PbkRlcGxveW1lbnRQaW5uaW5nTWlzbWF0Y2goe1xuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHJ1bkxvZ2dlcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICAgICAgICBgd29ya2Zsb3cuZXhlY3V0ZSAke3dvcmtmbG93RGlzcGxheU5hbWUod29ya2Zsb3dOYW1lKX1gLFxuICAgICAgICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdleGVjdXRlX3YyJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKG1ldGFkYXRhLnF1ZXVlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWV0YWRhdGEubWVzc2FnZUlkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3Byb2Nlc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZ2V0UXVldWVPdmVyaGVhZCh7IHJlcXVlc3RlZEF0IH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlUHJvcGFnYXRlZCghIXRyYWNlQ29udGV4dCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlTW9kZSh0cmFjZU1vZGUpLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGludm9jYXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgbm9JbmxpbmVSZXBsYXlBZnRlck1zID0gYXdhaXQgZ2V0TWF4SW5saW5lRHVyYXRpb25NcyhcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBsZXQgbG9vcEl0ZXJhdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlSZWNvdmVyeVJlcG9ydGVyID0gcmVwbGF5RGl2ZXJnZW5jZVxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyKHJlcGxheURpdmVyZ2VuY2UuY291bnQpXG4gICAgICAgICAgICAgICAgICAgIDogUmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5pbmVydCgpO1xuICAgICAgICAgICAgICAgICAgLy8gQ29tcGlsYXRpb24gaXMgdXNlZnVsIG9ubHkgZm9yIHRoZSBOb2RlIFZNLiBXYWl0IHVudGlsIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gcnVuJ3MgZW5naW5lIHNlbGVjdGlvbiBpcyBrbm93biBzbyBRdWlja0pTIGRlbGl2ZXJpZXMgbmV2ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIGFuZCBjYWNoZSBhbiB1bnVzZWQgbm9kZTp2bSBTY3JpcHQuIFRoZSBwcm9taXNlIGlzXG4gICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLXNjb3BlZCBhbmQgcmV1c2VkIGJ5IGV2ZXJ5IGNvbGQgcmVwbGF5O1xuICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGlvbiBzdGlsbCB3YWl0cyBmb3IgYSBmcmVzaCBWTSBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVkV29ya2Zsb3dTY3JpcHRzOlxuICAgICAgICAgICAgICAgICAgICB8IFJldHVyblR5cGU8dHlwZW9mIGNvbXBpbGVXb3JrZmxvd0J1bmRsZT5cbiAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgY29tcGlsZWRXb3JrZmxvd05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0V29ya2Zsb3dDb21waWxlID0gYXdhaXQgYmluZEFjdGl2ZVRyYWNlQ29udGV4dChcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93PzogUGljazxcbiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93TmFtZScgfCAnZXhlY3V0aW9uQ29udGV4dCdcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3cgfHwgdXNlUXVpY2tKU1ZtKHdvcmtmbG93KSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21waWxlZFdvcmtmbG93TmFtZSAhPT0gd29ya2Zsb3cud29ya2Zsb3dOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFdvcmtmbG93TmFtZSA9IHdvcmtmbG93LndvcmtmbG93TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkV29ya2Zsb3dTY3JpcHRzID0gY29tcGlsZVdvcmtmbG93QnVuZGxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93LndvcmtmbG93TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmFsIHJ1bnMgY2FuIHJldHVybiB3aXRob3V0IGF3YWl0aW5nIGNvbXBpbGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjb21waWxlZFdvcmtmbG93U2NyaXB0cy5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlZFdvcmtmbG93U2NyaXB0cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBvbmNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCByZXN1bHQuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5UGF5bG9hZENhY2hlOiBSZXBsYXlQYXlsb2FkQ2FjaGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFJlcGxheVBheWxvYWRDYWNoZSA9IChcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3c/OiBQaWNrPFdvcmtmbG93UnVuLCAnZXhlY3V0aW9uQ29udGV4dCc+XG4gICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvdyB8fCB1c2VRdWlja0pTVm0od29ya2Zsb3cpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVwbGF5UGF5bG9hZENhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXkudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYXlQYXlsb2FkQ2FjaGU7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZVJlcGxheUV2ZW50ID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRSZXBsYXlQYXlsb2FkQ2FjaGUoZXZlbnQuZXZlbnREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFdvcmtmbG93Q29tcGlsZShldmVudC5ldmVudERhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZT8ucHJlcGFyZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAvLyBFdmVyeSB3cml0ZSB0aGlzIGxvb3AgbWFrZXMgY2FycmllcyB0aGUgY3Vyc29yIG9mIHRoZSBsb2dcbiAgICAgICAgICAgICAgICAgIC8vIGl0IHdhcyBjb21wdXRlZCBhZ2FpbnN0LCBhbmQgZm9sZHMgYSBjb21wbGV0ZSByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgaW50byB0aGF0IGxvZy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUV2ZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBDcmVhdGVFdmVudFJlcXVlc3Q+KFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBULFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtc1xuICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbmNlQ3Vyc29yID0gZGVsdGFSZXF1ZXN0Q3Vyc29yKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpdGhTbmFwc2hvdCA9IHsgLi4uc2xvdFNuYXBzaG90KCksIC4uLnBhcmFtcyB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICBzaW5jZUN1cnNvciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHdpdGhTbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLndpdGhTbmFwc2hvdCwgc2luY2VDdXJzb3IgfSxcbiAgICAgICAgICAgICAgICAgICAgICAocCkgPT4gd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwgZGF0YSwgcClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhYnNvcmJDcmVhdGVEZWx0YShzaW5jZUN1cnNvciwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2VSZXBsYXlMb2FkID0gPFQgZXh0ZW5kcyB7IGV2ZW50cz86IEV2ZW50W10gfT4oXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogQXR0cmlidXRlLldvcmtmbG93UmVwbGF5TG9hZFNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgbG9hZDogKFxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUV2ZW50T2JzZXJ2ZXI6IChldmVudDogRXZlbnQpID0+IHZvaWRcbiAgICAgICAgICAgICAgICAgICAgKSA9PiBQcm9taXNlPFQ+XG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPFQ+ID0+XG4gICAgICAgICAgICAgICAgICAgIHRyYWNlKCd3b3JrZmxvdy5yZXBsYXkubG9hZCcsIGFzeW5jIChsb2FkU3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudHNDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgbG9hZFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UmVwbGF5TG9hZFNvdXJjZShzb3VyY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsb2FkKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlUmVwbGF5RXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDb3VudCA9IHJlc3VsdC5ldmVudHM/Lmxlbmd0aCA/PyBldmVudHNDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRTcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNDb3VudChldmVudHNDb3VudClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgc2xvdCBzbmFwc2hvdCBmb3IgYSB3cml0ZSBpc3N1ZWQgZnJvbSB0aGlzIGxvb3A6IGhvd1xuICAgICAgICAgICAgICAgICAgICogbXVjaCBvZiB0aGUgcnVuJ3MgbG9nIHRoZSBkZWNpc2lvbiBiZWhpbmQgaXQgd2FzIG1hZGVcbiAgICAgICAgICAgICAgICAgICAqIGFnYWluc3QuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRXZlcnkgd3JpdGUgZ29lcyB0aHJvdWdoIGhlcmUsIGluY2x1ZGluZyB0aGUgb25lcyB0aGF0IGFza1xuICAgICAgICAgICAgICAgICAgICogZm9yIGFuIGlubGluZSBkZWx0YS4gVGhlIHR3byBhbnN3ZXIgZGlmZmVyZW50IHF1ZXN0aW9ucyBhbmRcbiAgICAgICAgICAgICAgICAgICAqIGEgV29ybGQgaXMgZnJlZSB0byBzZXJ2ZSBib3RoOiB0aGUgY3Vyc29yIHNheXMgd2hlcmUgdG9cbiAgICAgICAgICAgICAgICAgICAqIHN0YXJ0IGxpc3RpbmcgZnJvbSwgdGhlIHNsb3Qgc2F5cyB3aGljaCBldmVudHMgdGhpcyB3cml0ZXJcbiAgICAgICAgICAgICAgICAgICAqIGhhZCBhbHJlYWR5IGRlY2lkZWQgd2l0aG91dC4gV29ybGRzIHRoYXQgdHJlYXQgdGhlIGRlbHRhIGFzXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgYmV0dGVyIGFuc3dlciBpZ25vcmUgdGhlIHNsb3QuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGFrZW4gZnJvbSB3aGF0ZXZlciBpcyBsb2FkZWQsIGluY2x1ZGluZyB0aGUgc3RhbGVcbiAgICAgICAgICAgICAgICAgICAqIGBsb2FkQWZ0ZXJgIHN0YXRlLiBVbmRlcnN0YXRpbmcgaXMgc2FmZTogdGhlIFdvcmxkIHJlcG9ydHNcbiAgICAgICAgICAgICAgICAgICAqIGJhY2sgYSB3aWRlciBzcGFuIHRoYW4gc3RyaWN0bHkgbmVlZGVkLCBhbmRcbiAgICAgICAgICAgICAgICAgICAqIGBtZXJnZVJlcG9ydGVkRXZlbnRzYCBkcm9wcyB3aGF0IHRoZSBsb2cgYWxyZWFkeSBob2xkcy5cbiAgICAgICAgICAgICAgICAgICAqIE92ZXJzdGF0aW5nIGlzIG5vdCwgc28gdGhlcmUgaXMgbm8gZ3Vlc3Npbmcgd2hlbiBub3RoaW5nIGlzXG4gICAgICAgICAgICAgICAgICAgKiBsb2FkZWQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBzbG90U25hcHNob3QgPSAoKTogU2xvdFNuYXBzaG90UGFyYW1zID0+XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICAgICAgICA6IHNsb3RTbmFwc2hvdFBhcmFtcyhldmVudExvZy5ldmVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBjdXJzb3IgdG8gYXNrIGZvciBhbiBpbmxpbmUgZGVsdGEgYWdhaW5zdCwgb3JcbiAgICAgICAgICAgICAgICAgICAqIHVuZGVmaW5lZCB0byBub3QgYXNrLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFR1cmJvIGlzIGV4Y2x1ZGVkIG9uIHB1cnBvc2U6IGl0IGV4aXN0cyB0byBtYWtlIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICogaW52b2NhdGlvbidzIHdyaXRlcyBhcyBjaGVhcCBhcyBwb3NzaWJsZSwgYW5kIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICogbG9hZGVkIGxvZyB0byBleHRlbmQuIFJ1bi10ZXJtaW5hbCB3cml0ZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIG5vdGhpbmcgcmVhZHMgdGhlIGxvZyBhZnRlcndhcmRzLCBzbyB0aGUgZGVsdGFcbiAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGJlIHdvcmsgdGhlIFdvcmxkIGRvZXMgZm9yIG5vIG9uZS4gQSBjYWxsZXIgdGhhdFxuICAgICAgICAgICAgICAgICAgICogc2V0IGl0cyBvd24gYHNpbmNlQ3Vyc29yYCAob3IgYXNrZWQgZm9yIHRoZSBgcnVuX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgKiAvIGBob29rX3JlY2VpdmVkYCBwcmVsb2FkLCB3aGljaCBvd25zIHRoZSBzYW1lIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgKiBmaWVsZHMpIGtlZXBzIHdoYXQgaXQgYXNrZWQgZm9yLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVJlcXVlc3RDdXJzb3IgPSAoXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBDcmVhdGVFdmVudFBhcmFtcyB8IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHR1cmJvIHx8XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5JyB8fFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz8uc2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz8ucHJlbG9hZEV2ZW50cyA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGlzVGVybWluYWxSdW5FdmVudFR5cGUoZGF0YS5ldmVudFR5cGUpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50TG9nLmN1cnNvciA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEZvbGQgYW4gaW5saW5lIGRlbHRhIHJldHVybmVkIGJ5IGBldmVudHMuY3JlYXRlYCBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICogaW4tbWVtb3J5IGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgZGVsdGEgaXMgd2hhdCBgZXZlbnRzLmxpc3QoeyBjdXJzb3I6IHNlbnRDdXJzb3IgfSlgXG4gICAgICAgICAgICAgICAgICAgKiB3b3VsZCBoYXZlIHJldHVybmVkIHJpZ2h0IGFmdGVyIHRoZSB3cml0ZSwgc28gaXQgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICogYmFjayBib3RoIG91ciBvd24gZXZlbnQgYW5kIGFueXRoaW5nIGFub3RoZXIgd3JpdGVyXG4gICAgICAgICAgICAgICAgICAgKiBhcHBlbmRlZCBpbiBiYW5kLiBBYnNvcmJpbmcgaXQgaGVyZSBtZWFucyB0aGUgbmV4dCByZWFkZXJcbiAgICAgICAgICAgICAgICAgICAqIGFscmVhZHkgaGFzIHRoZSBsb2cgYW5kIHRoZSBsb29wJ3MgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgICAqIGBldmVudHMubGlzdGAgZmluZHMgbm90aGluZyBsZWZ0IHRvIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIERlbGliZXJhdGVseSBub3QgYGFic29yYlNraXBwZWRTbG90UmVwb3J0YCwgZXZlbiB0aG91Z2ggdGhlXG4gICAgICAgICAgICAgICAgICAgKiBgaGFzTW9yZWAgaGFsZiBvZiB0aGUgdHdvIHBvbGljaWVzIGNvaW5jaWRlcy4gQSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICogZXh0ZW5kcyB0aGUgdGFpbCBhbmQgY2FycmllcyBhIGN1cnNvciB0aGF0IGhhcyB0byBtb3ZlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAqIGl0LCBzbyBpdCBhcHBlbmRzIHdpdGhvdXQgcmUtc29ydGluZyBhbmQgbmVlZHMgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICogZ3VhcmQgYmVsb3c7IGEgc2tpcHBlZC1zbG90IHJlcG9ydCBpcyBhIHdpbmRvdyBzdHJpY3RseVxuICAgICAgICAgICAgICAgICAgICogYmVsb3cgdGhlIHdyaXRlLCBjYXJyaWVzIG5vIGN1cnNvciwgYW5kIGhhcyB0byBiZSBzb3J0ZWRcbiAgICAgICAgICAgICAgICAgICAqIGJhY2sgaW50byBwbGFjZS4gU2hhcmluZyBhbiBpbXBsZW1lbnRhdGlvbiB3b3VsZCBtZWFuIG9uZVxuICAgICAgICAgICAgICAgICAgICogb2YgdGhlbSBkb2luZyB0aGUgb3RoZXIncyB3b3JrLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIERlY2xpbmluZyBpcyBhbHdheXMgc2FmZSAoYW4gdW5hYnNvcmJlZCBkZWx0YSBpcyBhIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBgZXZlbnRzLmxpc3RgIHJldHVybnMpLCBzbyB0aGUgZ3VhcmRzIGFyZSBmcmVlIHRvXG4gICAgICAgICAgICAgICAgICAgKiBiZSBzdHJpY3Q6XG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogLSBgaGFzTW9yZWAgbWVhbnMgdGhlIFdvcmxkIHRydW5jYXRlZCB0aGUgcGFnZS4gVGFraW5nIGl0XG4gICAgICAgICAgICAgICAgICAgKiAgIHdoaWxlIGFkdmFuY2luZyB0aGUgY3Vyc29yIHRvIHRoZSBwYWdlIGVuZCB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgICogICBmaW5lLCBidXQgdGFraW5nIGl0IGFuZCBOT1QgYWR2YW5jaW5nIHdvdWxkIGR1cGxpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAqICAgYW5kIHRoZSB0cnVuY2F0ZWQgY2FzZSBpcyByYXJlIGVub3VnaCBub3QgdG8gc3BlY2lhbC1jYXNlLlxuICAgICAgICAgICAgICAgICAgICogLSBUaGUgY3Vyc29yIG11c3QgYmUgZXhhY3RseSB3aGVyZSBpdCB3YXMgd2hlbiB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICogICB3ZW50IG91dC4gQ29uY3VycmVudCB3cml0ZXMgZWFjaCBkaWZmIGFnYWluc3QgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICogICB0aGV5IHNhdywgYW5kIGBhcHBlbmRVbmlxdWVFdmVudHNgIGRlbGliZXJhdGVseSBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICogICByZS1zb3J0LCBzbyBhYnNvcmJpbmcgYSBzZWNvbmQgZGVsdGEgY29tcHV0ZWQgZnJvbSBhblxuICAgICAgICAgICAgICAgICAgICogICBvbGRlciBjdXJzb3IgY291bGQgYXBwZW5kIGV2ZW50cyBiZWhpbmQgb25lcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgKiAgIHRha2VuLiBGaXJzdCByZXNwb25zZSBiYWNrIHdpbnM7IHRoZSByZXN0IGFyZSBkcm9wcGVkLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBhYnNvcmJDcmVhdGVEZWx0YSA9IChcbiAgICAgICAgICAgICAgICAgICAgc2VudEN1cnNvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IEV2ZW50UmVzdWx0XG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdyZWFkeScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5jdXJzb3IgIT09IHNlbnRDdXJzb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIGByZWFkeWAgY2FuIHJlcGxheSBvbmNlIHdpdGhvdXQgYSByZWFkLiBUaGUgb3RoZXIgc3RhdGVzXG4gICAgICAgICAgICAgICAgICAvLyBkZXNjcmliZSB0aGUgbmV4dCBsb2FkIGV4YWN0bHkuXG4gICAgICAgICAgICAgICAgICBsZXQgZXZlbnRMb2c6IFJlcGxheUV2ZW50TG9nID0geyB0eXBlOiAnbG9hZEFsbCcgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIHN0YXRlOiBzZXQgYnkgZWl0aGVyIHRoZSBiYWNrZ3JvdW5kIHN0ZXAgcGF0aFxuICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHJ1bl9zdGFydGVkIHNldHVwIGJlbG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlLiBVbmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50IChvbGRlciBzZXJ2ZXJzLCB0dXJibykuXG4gICAgICAgICAgICAgICAgICBsZXQgbWF4RXZlbnRzTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeSAoVFRGUykgc3RhdGUuIFNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cy5cbiAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBpbnZvY2F0aW9uJ3MgRklSU1QgZXZlbnQgc25hcHNob3QgY29udGFpbmVkXG4gICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGJleW9uZCBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZDogYW55dGhpbmcgZWxzZSB3YXNcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gYnkgYW4gZWFybGllciBpbnZvY2F0aW9uLCB3aG9zZSBjb250cmlidXRpb24gdG9cbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUtdG8tZmlyc3Qtc3RlcCAoaW5jbHVkaW5nIHRoZSBxdWV1ZSBob3AgYmFjayBoZXJlKVxuICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGJlIG1lYXN1cmVkIHdhbGwtY2xvY2ssIHNvIFRURlMgaXMgbm90IHJlcG9ydGVkLlxuICAgICAgICAgICAgICAgICAgLy8gU2V0IG9uY2UsIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24ncyBsb2FkZWQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICBsZXQgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIEVwb2NoIG1zIHRoZSBgcnVuX3N0YXJ0ZWRgIHJlc3BvbnNlIHdhcyByZWNlaXZlZC9wYXJzZWRcbiAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBTREs6IGFuY2hvcnMgUlNGUyAocnVuX3N0YXJ0ZWQg4oaSIGZpcnN0IHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgUE9TVCkuIFNldCBvbmNlLCBpbiB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAvLyBhd2FpdGVkLCBzbyB0aGlzIGlzIHN0YW1wZWQgYXQgdGhlIHBvaW50IHRoZSBydW4gaXNcbiAgICAgICAgICAgICAgICAgIC8vIHN5bnRoZXNpemVkIGxvY2FsbHkgaW5zdGVhZCBvZiB0aGUgcmVhbCByZXNwb25zZS4gU2VlXG4gICAgICAgICAgICAgICAgICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJzZnNBbmNob3JNcy5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5TdGFydGVkUmVjZWl2ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBXYWxsLWNsb2NrIG1zIHNwZW50IGNvbW1pdHRpbmcgaG9va19jcmVhdGVkIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzdGVwIHJhbiwgYWNjdW11bGF0ZWQgYWNyb3NzIHN1c3BlbnNpb24gcGFzc2VzXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgc3VidHJhY3RlZCBmcm9tIFRURlMuIEFjY3VtdWxhdG9ycyBoZXJlIHN1cnZpdmUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnQgKGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uLCBvclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZS1ldmVudCByZXN0YXJ0IGJlbG93KSwgc28gYSByZXN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gb3Zlci1jb3VudHMgYnkgdGhlIGFiYW5kb25lZCBwYXNzJ3MgaG9vayB0aW1lLFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgc2xpZ2h0IG92ZXItY291bnQgZWl0aGVyIHJlc3RhcnQgaGFzIGFsd2F5cyBoYWQuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlU3RlcEJsb2NraW5nTXMgPSAwO1xuICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3Qgb2YgdGhlIGFjY3VtdWxhdG9yIGFzIG9mIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyb3RlIHRoZSBydW4ncyBmaXJzdCBhdHRyX3NldCAod2hvc2UgaG9vayBwaGFzZSByYW5cbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdHMgYXR0ciB3cml0ZXMpLiBXaGVuIGEgcHJlLXN0ZXAgc2V0QXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgLy8gZW5kcyB0aGUgVFRGUyBtZWFzdXJlbWVudCBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rXG4gICAgICAgICAgICAgICAgICAvLyB0aW1lIGZyb20gQkVGT1JFIHRoYXQgcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQsIHNpbmNlIGxhdGVyXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHdyaXRlcyBmYWxsIG91dHNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmYXN0LXBhdGhzIHRoZSBmaXJzdCBkZWxpdmVyeSBvZiB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24sIHdoZXJlIGl0IGlzIHByb3ZhYmx5IHNhZmUgdG86IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAsIHNraXAgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzXG4gICAgICAgICAgICAgICAgICAvLyBiZWVuIHdyaXR0ZW4geWV0KSwgYW5kIGZvcmNlIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IChub1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBwZWVyIGhhbmRsZXIgZXhpc3RzIHRvIHJhY2UgdGhlIGNyZWF0ZS1jbGFpbSkuXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuSW5wdXRgIGlzIG9ubHkgcHJlc2VudCBvbiB0aGUgc3RhcnQoKS1lbnF1ZXVlZCBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgLy8gYW5kIGBhdHRlbXB0ID09PSAxYCAoMS1iYXNlZCkgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5OyBgaW5jb21pbmdTdGVwSWRgIHdvdWxkIG1hcmsgYSBiYWNrZ3JvdW5kLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gYW5kIGByZXBsYXlEaXZlcmdlbmNlYCBhIHJlY292ZXJ5IHJlcGxheSwgYm90aFxuICAgICAgICAgICAgICAgICAgLy8gaW5lbGlnaWJsZS4gVGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBzdGFydCBzYWZlIGVuZHMgb25jZSBhIGhvb2sgb3Igd2FpdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAvLyAodGhleSBpbnRyb2R1Y2UgcmVzdW1lIGludm9jYXRpb25zKSwgc28gdHVyYm8gZXhpdHMgYXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgKHNlZSBgZm9yY2VPcHRpbWlzdGljU3RhcnRgKS4gV29ya2Zsb3cgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgaW50cm9kdWNlIG5vIHN1Y2ggaW52b2NhdGlvbiBzb3VyY2U6IHRoZXkgcmVzb2x2ZVxuICAgICAgICAgICAgICAgICAgLy8gdmlhIGFuIGluLXByb2Nlc3MgcmVwbGF5IGFuZCBkb24ndCBlbmQgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWAgaXMgYWxzbyBsb2FkLWJlYXJpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBvd25lcnNoaXA6IG93bmVkLXJlY292ZXJ5IHN0ZXBzIChhIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHN0YW1wZWQgYnkgYSBQUkVWSU9VUyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UpIGNhbiBvbmx5XG4gICAgICAgICAgICAgICAgICAvLyBleGlzdCBvbiBhdHRlbXB0IOKJpSAyLCBzbyB0dXJibyBhbmQgb3duZWQgcmVjb3ZlcnkgYXJlXG4gICAgICAgICAgICAgICAgICAvLyBtdXR1YWxseSBleGNsdXNpdmUuIFRoZSB0dXJibyBgcmVpbnZva2UoKWAgcGF0aHMgKGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0LCB0aHJvdHRsZSBiYWNrb2ZmKSBhY2sgdGhpcyBtZXNzYWdlIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCwgc2FmZSBvbmx5IGJlY2F1c2Ugbm9cbiAgICAgICAgICAgICAgICAgIC8vIG5vbi10ZXJtaW5hbCBzdGVwIGNhbiBiZSBpbmxpbmUtb3duZWQgYnkgdGhlIGFja2VkIGlkXG4gICAgICAgICAgICAgICAgICAvLyB3aGVuIHR1cmJvIGlzIG9uLiBJZiB0dXJibyBldmVyIGVuZ2FnZXMgb24gcmVkZWxpdmVyaWVzLFxuICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgcGF0aHMgbXVzdCBmaXJzdCBjaGVjayBmb3Igb3duZWQgcGVuZGluZyBzdGVwcyBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBgeyB0aW1lb3V0U2Vjb25kcyB9YCByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgdHVyYm8gPVxuICAgICAgICAgICAgICAgICAgICBpc1R1cmJvRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXBsYXlEaXZlcmdlbmNlO1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuV29ya2Zsb3dUdXJibyh0dXJibykpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkIChvciByZWplY3RzIGlmIGl0IGZhaWxlZCkuIFRocmVhZGVkXG4gICAgICAgICAgICAgICAgICAvLyBpbnRvIGhhbmRsZVN1c3BlbnNpb24gYW5kIGV4ZWN1dGVTdGVwIHNvIG5vIHN0ZXAvaG9vay93YWl0XG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByYWNlcyBhaGVhZCBvZiB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAvLyB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blJlYWR5QmFycmllcjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gT3JkZXIgYSB0ZXJtaW5hbCBydW4gd3JpdGUgKHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkKSBhZnRlclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBpbiB0dXJibyBtb2RlLCBzaW5jZSBhIG5vLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBvdGhlcndpc2UgcmVhY2ggcnVuX2NvbXBsZXRlZCBiZWZvcmUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLiBCZXN0LWVmZm9ydDogYSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBvcmRlcmluZyBvbmx5OyBpZiBydW5fc3RhcnRlZCB0cnVseSBmYWlsZWQgdGhlIHRlcm1pbmFsIHdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycy4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0UnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSwgc2VlIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkV29ya2Zsb3dTZXR1cEZhaWx1cmUgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGVycjogdW5rbm93blxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTogJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHdvcmtmbG93IHNldHVwJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSBvcmNoZXN0cmF0b3IuIE91dHNpZGUgdHVyYm8gdGhpcyByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCwgd2hpY2ggbWFrZXMgdGhlIHF1ZXVlIHJlc2NoZWR1bGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIGRlbGl2ZXJ5J3MgbWVzc2FnZS4gSW4gdHVyYm8gdGhhdCBpcyBhIHRyYXA6IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCwgYW5kIG9uIGFzeW5jIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gZ3JhcGhpbGUtd29ya2VyKSBhIHJlc2NoZWR1bGUgY29tZXMgYmFjayBhcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCAxLCBzbyB0dXJibyByZS1lbmdhZ2VzLCBza2lwcyB0aGUgZXZlbnQtbG9nIGxvYWRcbiAgICAgICAgICAgICAgICAgIC8vIGFnYWluLCByZXBsYXlzIGFnYWluc3QgYW4gZW1wdHkgbG9nLCBuZXZlciBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIGludmFyaWFudCBndWFyZDogY29ycmVsYXRpb24gSURzIG9mXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwcyB3aG9zZSBib2RpZXMgdGhpcyBpbnZvY2F0aW9uIGlzIGV4ZWN1dGluZyB1bmRlciBhblxuICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIHN0YW1wIChsYXp5IGlubGluZSArIG93bmVkIHJlY292ZXJ5KSwgd2hpbGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBib2R5IGlzIGluIGZsaWdodC4gQ3Jhc2ggcmVjb3ZlcnkgZGVwZW5kcyBvbiB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIE5PVCBiZWluZyBhY2tlZCB3aGlsZSBzdWNoIGEgc3RlcCBpcyBub24tdGVybWluYWxcbiAgICAgICAgICAgICAgICAgIC8vIChhY2sgPSBoYW5kbGVyIHJldHVybiBvciByZWludm9rZSwgd2hpY2ggYWNrcyArIGVucXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkOiB0aGUgcmVkZWxpdmVyeSBvZiB0aGUgb2xkIGlkIGlzXG4gICAgICAgICAgICAgICAgICAvLyB3aGF0IHJlLWV4ZWN1dGVzIGFuIG9ycGhhbmVkIG93bmVkIHN0ZXApLiBBbGwgZXhlY3V0ZVN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIGFyZSBhd2FpdGVkIGJlZm9yZSBhbnkgYWNrIHBhdGggcnVucywgc28gdGhpcyBzZXRcbiAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5IGF0IGV2ZXJ5IGFjayBieSBjb25zdHJ1Y3Rpb247IHRoZSBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoIGZ1dHVyZSByZWZhY3RvcnMgdGhhdCBicmVhayB0aGF0IG9yZGVyaW5nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbGlnaHRPd25lZFN0ZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcyA9IChcbiAgICAgICAgICAgICAgICAgICAgYWNrUGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluRmxpZ2h0T3duZWRTdGVwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogYWNraW5nIHRoZSB3b3JrZmxvdyBtZXNzYWdlIHdoaWxlIG93bmVkIGlubGluZSBzdGVwcyBhcmUgc3RpbGwgZXhlY3V0aW5nIOKAlCBjcmFzaCByZWNvdmVyeSBmb3IgdGhlc2Ugc3RlcHMgaXMgYnJva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IFsuLi5pbkZsaWdodE93bmVkU3RlcHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIEEgcGxhaW4gb3JjaGVzdHJhdG9yLXJlcGxheSBtZXNzYWdlLiBPbWl0cyBgcnVuSW5wdXRgIChpdFxuICAgICAgICAgICAgICAgICAgLy8gcmUtZW5nYWdlcyB0dXJibyBvbiB0aGUgbmV4dCBkZWxpdmVyeSBhbmQgd2VkZ2VzIHRoZSBydW4sXG4gICAgICAgICAgICAgICAgICAvLyBzZWUgYHJlaW52b2tlYCBiZWxvdykgYW5kIGByZXBsYXlEaXZlcmdlbmNlYCAvXG4gICAgICAgICAgICAgICAgICAvLyBgc2VydmVyRXJyb3JSZXRyeUNvdW50YCAodGhpcyBkZWxpdmVyeSBjaGFpbidzIGJ1ZGdldHMpLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5TWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jICgpOiBQcm9taXNlPFdvcmtmbG93SW52b2tlUGF5bG9hZD4gPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEV4dHJhIGZpZWxkcyB0byBjYXJyeSBvbiB0aGUgbmV3IG1lc3NhZ2UuIE9ubHkgcmVhY2hlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogbmV4dCBpbnZvY2F0aW9uIG9uIHRoZSB0dXJibyBwYXRoOiB3aXRob3V0IHR1cmJvIG5vXG4gICAgICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UgaXMgZW5xdWV1ZWQgYXQgYWxsOiB0aGUgaGFuZGxlciByZXR1cm5zIGFcbiAgICAgICAgICAgICAgICAgICAgICogdmlzaWJpbGl0eSB0aW1lb3V0IGFuZCB0aGUgcXVldWUgcmVkZWxpdmVycyB0aGUgQ1VSUkVOVFxuICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlLCB3aG9zZSBib2R5IChhbmQgdGhlcmVmb3JlIGFueSBjb3VudGVyIG9uIGl0KVxuICAgICAgICAgICAgICAgICAgICAgKiBjYW5ub3QgYmUgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhUGF5bG9hZD86IFBhcnRpYWw8V29ya2Zsb3dJbnZva2VQYXlsb2FkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcygncmVpbnZva2UnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHsgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksIC4uLmV4dHJhUGF5bG9hZCB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBQcmVjb25kaXRpb24gKDQxMikgcmVjb3Zlcnk6IGhvdyBtYW55IHRpbWVzIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gaGFzIHRocm93biBhd2F5IGl0cyByZXBsYXkgYW5kIHN0YXJ0ZWQgb3ZlciBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgbGV0IHByZWNvbmRpdGlvblJlc3RhcnRzID0gMDtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRXZlbnQgaWRzIHRoZSBkaXNjYXJkZWQgcmVwbGF5IGhlbGQsIGtlcHQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAqIGxvYWQgcmVzb2x2ZXMgc28gYSByZXN0YXJ0IGNhbiByZXBvcnQgd2hhdCBpdHMgcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgKiBhY3R1YWxseSBmb3VuZC4gV2l0aG91dCB0aGlzIGEgNDEyIG9ubHkgZXZlciB0ZWxscyB5b3UgdGhhdFxuICAgICAgICAgICAgICAgICAgICogYSByZXN0YXJ0IGhhcHBlbmVkLCB3aGljaCBjb25mbGF0ZXMgdHdvIGRpc3RpbmN0XG4gICAgICAgICAgICAgICAgICAgKiBzaXR1YXRpb25zOiBhIGxvZyB0aGF0IGdyZXcgKGV4cGVjdGVkLCB0aGUgZmVuY2UgZGlkIGl0c1xuICAgICAgICAgICAgICAgICAgICogam9iKSBhbmQgYSBsb2cgdGhhdCBjYW1lIGJhY2sgaWRlbnRpY2FsLCB3aGljaCBtZWFucyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZW5kIGRpc2FncmVlIGFib3V0IHRoZSBjb3VudCBmb3IgdGhlIHNhbWUgc2V0IG9mXG4gICAgICAgICAgICAgICAgICAgKiBldmVudHMgYW5kIHRoZSByZXN0YXJ0IHdpbGwgcmUtZGVyaXZlIHRoZSBzYW1lIHNuYXBzaG90IGFuZFxuICAgICAgICAgICAgICAgICAgICogYmUgcmVqZWN0ZWQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmU6IHtcbiAgICAgICAgICAgICAgICAgICAgaWRzOiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdGFydDogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaW5saW5lLWRlbHRhJyB8ICdmdWxsLXJlbG9hZCc7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFJlcG9ydCB3aGF0IGEgc3RhbGUtc25hcHNob3QgcmVzdGFydCdzIHJlbG9hZCBmb3VuZCwgb25jZVxuICAgICAgICAgICAgICAgICAgICogdGhlIGxvZyB0aGlzIHJlcGxheSB3aWxsIGFjdHVhbGx5IGNvbnN1bWUgaXMgaW4gaGFuZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBgZ3Jld2AgaXMgdGhlIGV4cGVjdGVkIGNhc2UgYW5kIGdpdmVzIDQxMiB2b2x1bWUgYVxuICAgICAgICAgICAgICAgICAgICogZGVub21pbmF0b3IuIGB1bmNoYW5nZWRgIG1lYW5zIHRoZSByZWxvYWQgZGlzYWdyZWVkIHdpdGhcbiAgICAgICAgICAgICAgICAgICAqIHRoZSByZWplY3Rpb24sIHNvIHRoaXMgcmVwbGF5IHJlLWRlcml2ZXMgdGhlIHNhbWUgc25hcHNob3RcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBpcyByZWplY3RlZCBhZ2FpbiB1bnRpbCB0aGUgYnVkZ2V0IGlzIHNwZW50LiBgc2hyYW5rYFxuICAgICAgICAgICAgICAgICAgICogc2hvdWxkIGJlIGltcG9zc2libGU6IGV2ZXJ5IGxvYWQgcGF0aCBvbmx5IGFkZHMgdG8gYSBydW4nc1xuICAgICAgICAgICAgICAgICAgICogbG9nLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRQcmVjb25kaXRpb25SZXN0YXJ0UmVsb2FkID0gKFxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W11cbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlbGluZSA9IHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlbGluZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZGVkSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBjb3VudE1pc3NpbmdJZHMocmVsb2FkZWRJZHMsIGJhc2VsaW5lLmlkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyb3BwZWQgPSBjb3VudE1pc3NpbmdJZHMoYmFzZWxpbmUuaWRzLCByZWxvYWRlZElkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dGNvbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQgPiAwID8gJ3NocmFuaycgOiBhZGRlZCA+IDAgPyAnZ3JldycgOiAndW5jaGFuZ2VkJztcblxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ1Jlc3RhcnRlZCByZXBsYXkgcmVsb2FkZWQgaXRzIGV2ZW50IGxvZyBhZnRlciBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQmVmb3JlOiBiYXNlbGluZS5pZHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0FmdGVyOiByZWxvYWRlZElkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHM6IGJhc2VsaW5lLnJlc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGJhc2VsaW5lLnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogYmFzZWxpbmUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBSZWNvdmVyIGZyb20gYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gYnkgcmVzdGFydGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHJlcGxheSBpbnNpZGUgdGhpcyBpbnZvY2F0aW9uLCByZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHBlci1pbnZvY2F0aW9uIGJ1ZGdldCBpcyBzcGVudCAodGhlIGNhbGxlciB0aGVuIGZhbGxzIGJhY2tcbiAgICAgICAgICAgICAgICAgICAqIHRvIGEgZnJlc2ggaW52b2NhdGlvbikuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogQSA0MTIgbWVhbnMgdGhlIGxvZyB0aGlzIHJlcGxheSBkZXJpdmVkIGl0cyBldmVudHMgZnJvbSB3YXNcbiAgICAgICAgICAgICAgICAgICAqIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgaGFkIGFscmVhZHkgcmVjb3JkZWQuIFRoZVxuICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgd3JpdGUgY2Fubm90IGJlIHJldHJpZWQ6IGNvcnJlbGF0aW9uIGlkc1xuICAgICAgICAgICAgICAgICAgICogYXJlIHBvc2l0aW9uYWwgb3JkaW5hbHMgb2Ygb25lIHNlZWRlZCBzZXF1ZW5jZSwgc28gYSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAqIG92ZXIgdGhlIGNvcnJlY3RlZCBsb2cgbWludHMgYSBkaWZmZXJlbnQgaWQgZm9yIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgKiBsb2dpY2FsIGV2ZW50LCBhbmQgcmUtcG9zdGluZyB0aGlzIG9uZSB3b3VsZCBwZXJzaXN0IGFuXG4gICAgICAgICAgICAgICAgICAgKiBldmVudCBubyBjb3JyZWN0IHJlcGxheSBldmVyIHByb2R1Y2VzLiBUaGUgd2hvbGUgcmVwbGF5IGhhc1xuICAgICAgICAgICAgICAgICAgICogdG8gYmUgcmUtZGVyaXZlZCwgd2hpY2ggdGhlIGxvb3AgZG9lcyBieSBkaXNjYXJkaW5nIGl0c1xuICAgICAgICAgICAgICAgICAgICogY2FjaGVkIGxvZywgc2luY2UgYHJ1bldvcmtmbG93YCB0aGVuIGJ1aWxkcyBhIGZyZXNoIFZNLFxuICAgICAgICAgICAgICAgICAgICogc2VlZCBhbmQgY29ycmVsYXRpb24taWQgc2VxdWVuY2UgZnJvbSB0aGUgcmVsb2FkZWQgZXZlbnRzLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzID0gKFxuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I/OiB1bmtub3duLFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogU2V0IGZhbHNlIHdoZW4gd3JpdGVzIHRoaXMgaW52b2NhdGlvbiBtYWRlIGNvbmN1cnJlbnRseVxuICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIHRoZSByZWplY3RlZCBvbmUgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgNDEyJ3NcbiAgICAgICAgICAgICAgICAgICAgICogZGVsdGE6IHRoZSBXb3JsZCBjb21wdXRlZCB0aGF0IGRlbHRhIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAqIHJlamVjdGVkIHJlcXVlc3QncyBzbmFwc2hvdCwgc28gaXQgY2Fubm90IGNvbnRhaW4gYW5cbiAgICAgICAgICAgICAgICAgICAgICogZXZlbnQgYSBzaWJsaW5nIGNvbW1pdHRlZCBhZnRlcndhcmRzLCBhbmQgbWVyZ2luZyBpdFxuICAgICAgICAgICAgICAgICAgICAgKiB3b3VsZCByZXN0YXJ0IHRoZSByZXBsYXkgb24gYSBsb2cgdGhhdCBpcyBzdGlsbFxuICAgICAgICAgICAgICAgICAgICAgKiBpbmNvbXBsZXRlLiBPbmx5IGEgZnVsbCByZWxvYWQgaXMgYXV0aG9yaXRhdGl2ZSB0aGVuLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgeyBhbGxvd0RlbHRhID0gdHJ1ZSB9OiB7IGFsbG93RGVsdGE/OiBib29sZWFuIH0gPSB7fVxuICAgICAgICAgICAgICAgICAgKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cyA+PVxuICAgICAgICAgICAgICAgICAgICAgIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzKClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzKys7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IHN0YWxlLXNuYXBzaG90IHJlc3RhcnQgaW52YWxpZGF0ZXMgdGhlIHBhcmtlZCBWTTpcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvZyBpdCBjb25zdW1lZCB3YXMgbWlzc2luZyBldmVudHMsIHNvIG9ubHkgYSBmcmVzaFxuICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgb3ZlciB0aGUgY29ycmVjdGVkIGxvZyBpcyBhdXRob3JpdGF0aXZlLiBUaGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsc28gY292ZXJzIHRoZSBzdXNwZW5zaW9uLWNyZWF0ZSA0MTIsIHdoaWNoIGZpcmVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgcmV0ZW50aW9uIGRlY2lzaW9uIChraWxsIHN3aXRjaCArIHN0ZXAtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2F0ZSkgZXZlciByYW4sIGFuZCB0aGUgcnVuX2NvbXBsZXRlZCA0MTIsIHdoZXJlIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkIHNlc3Npb24gbXVzdCBub3QgYmUgcmVzdW1lZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBXb3JsZCBNQVkgcmV0dXJuIHRoZSBldmVudHMgd2Ugd2VyZSBtaXNzaW5nIG9uIHRoZSA0MTIuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRydXN0IGl0IG9ubHkgb24gdGhlIEZJUlNUIHJlc3RhcnQ6IGl0cyBjb21wbGV0ZW5lc3MgcHJvb2ZcbiAgICAgICAgICAgICAgICAgICAgLy8gbGVhbnMgb24gdGhlIGJhY2tlbmQncyBvd24gYm9va2tlZXBpbmcsIHNvIGlmIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXItY291bnRzLCBhIFwiY29tcGxldGVcIiBkZWx0YSBjYW4gc3RpbGwgbGVhdmUgYSBob2xlLlxuICAgICAgICAgICAgICAgICAgICAvLyBCb3VuZGluZyBpdCB0byBvbmUgYXR0ZW1wdCBjYXBzIHRoYXQgYXQgYSBzaW5nbGUgd2FzdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQ7IGV2ZXJ5IGxhdGVyIHJlc3RhcnQgZG9lcyB0aGUgYXV0aG9yaXRhdGl2ZSBsb2FkLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWx0YSAmJiBwcmVjb25kaXRpb25SZXN0YXJ0cyA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwcmVjb25kaXRpb25FdmVudERlbHRhKGVycm9yLCBydW5JZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBkZWx0YSBpcyBvbmx5IHVzYWJsZSBpZiB0aGVyZSBpcyBhIGxvYWRlZCBsb2cgdG8gbWVyZ2VcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgaW50bzsgd2l0aG91dCBvbmUgdGhlIHJlc3RhcnQgbXVzdCBsb2FkIGV2ZXJ5dGhpbmcuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZWREZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgZGVsdGEgIT09IG51bGwgJiYgZXZlbnRMb2cudHlwZSAhPT0gJ2xvYWRBbGwnO1xuICAgICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCB0aGUgc2V0IGJlaW5nIGRpc2NhcmRlZCB3aGlsZSBpdCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kOyB0aGUgY29tcGFyaXNvbiBoYXBwZW5zIG9uY2UgdGhlIG5leHQgbG9hZCByZXNvbHZlcy5cbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lID1cbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkczogbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cy5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydDogcHJlY29uZGl0aW9uUmVzdGFydHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXNlZERlbHRhID8gJ2lubGluZS1kZWx0YScgOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAmJiBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywgZGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE1VU1QgYmUgYSBmdWxsLCBjdXJzb3ItbGVzcyByZWxvYWQuIFRoZSBjdXJzb3IgbGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkIGZyb20gdGhlIGhpZ2hlc3QgZXZlbnQgaWQgdGhpcyByZXBsYXkgaG9sZHMsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdoYXQgYSBzdGFsZSBzbmFwc2hvdCBpcyBtaXNzaW5nIHNpdHMgYmVsb3cgaXQ6IGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90IGFsbG9jYXRlZCBpbnNpZGUgYSBjb25jdXJyZW50IGNvbW1pdCB0YWtlcyBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gdGhpcyByZXBsYXkgaGFkIGFscmVhZHkgcmVhZCBwYXN0LiBBblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsIGxvYWQgc3RhcnRzIGFib3ZlIHRoZSBob2xlIGFuZCBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybnMgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZT8ucmVzZXRTY2FuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZTsgcmVzdGFydGluZyByZXBsYXkgaW4tcHJvY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVzZWREZWx0YSA/ICdpbmxpbmUtZGVsdGEnIDogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVzdGFydHMnOiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBFc2NhbGF0ZSBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiB0aGF0IHN1cnZpdmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICogaW4tcHJvY2VzcyByZXN0YXJ0IGJ1ZGdldCB0byBhIGZyZXNoIGludm9jYXRpb24sIG9yIGdpdmUgdXBcbiAgICAgICAgICAgICAgICAgICAqIG9uIHRoZSBydW4gd2hlbiB0aGUgcGVyLXJ1biBidWRnZXQgaXMgYWxzbyBzcGVudC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgYSBjbG9zdXJlIHZhcmlhYmxlIGFuZCB0aGUgcXVldWUnc1xuICAgICAgICAgICAgICAgICAgICogZGVsaXZlcnkgY291bnQgcmVzdGFydHMgYXQgMSB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgICAgKiBlbnF1ZXVlZCwgc28gYSBydW4gdGhhdCBpcyBwZXJtYW5lbnRseSB1bmFibGUgdG8gY2F0Y2ggdXBcbiAgICAgICAgICAgICAgICAgICAqIHdpdGggaXRzIG93biBldmVudCBsb2cgd291bGQgb3RoZXJ3aXNlIGN5Y2xlIHJlc3RhcnRzIOKGklxuICAgICAgICAgICAgICAgICAgICogcmUtaW52b2tlIOKGkiByZXN0YXJ0cyB3aXRoIG5vIHJ1bi1sZXZlbCBib3VuZC4gVGhlIGNoYWluIGlzXG4gICAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUgY291bnRlZCBvbiB0aGUgbWVzc2FnZSBpdHNlbGYsIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAgICAgICogcmVwbGF5IGRpdmVyZ2VuY2VzIGFyZSwgYW5kIGZhaWxzIHRoZSBydW4gb25jZSBleGhhdXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGNvdW50ZXIgb25seSBhZHZhbmNlcyBvbiBob3BzIHRoYXQgZW5xdWV1ZSBhIG5ldyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgKiAoc2VlIGByZWludm9rZWApLiBBIHJlZGVsaXZlcnktYmFzZWQgaG9wIGtlZXBzIHRoZSBzYW1lIGJvZHlcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBzbyB0aGUgc2FtZSBjb3VudCwgYnV0IGl0IGFsc28ga2VlcHMgYWR2YW5jaW5nXG4gICAgICAgICAgICAgICAgICAgKiBgbWV0YWRhdGEuYXR0ZW1wdGAsIHdoaWNoIHRoZSBtYXgtZGVsaXZlcnkgY2hlY2sgYXQgdGhlIHRvcFxuICAgICAgICAgICAgICAgICAgICogb2YgdGhlIGhhbmRsZXIgYWxyZWFkeSBib3VuZHMsIGFuZCB0aGUgZGVsYXkgYmVsb3cgaXMgd2hhdFxuICAgICAgICAgICAgICAgICAgICogbWFrZXMgdGhhdCBidWRnZXQgc3BhbiByZWFsIHRpbWUgcmF0aGVyIHRoYW4gYmVpbmcgYnVybmVkIGluXG4gICAgICAgICAgICAgICAgICAgKiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiB1bmtub3duXG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogeyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB8IHsgcmVpbnZva2VkOiBmYWxzZTsgZXJyb3I6IEVycm9yIH1cbiAgICAgICAgICAgICAgICAgID4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRlbXB0ID0gKHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnMgPz8gMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZWludm9jYXRpb25zID0gZ2V0UHJlY29uZGl0aW9uTWF4UmVpbnZvY2F0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IG1heFJlaW52b2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBjcmVhdGlvbiB3YXMgcmVqZWN0ZWQgYXMgc3RhbGUgYWZ0ZXIgJHttYXhSZWludm9jYXRpb25zfSByZS1pbnZvY2F0aW9ucyBvZiAke2dldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzKCl9IGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnRzIGVhY2g6IHRoaXMgcnVuIGNhbm5vdCBvYnNlcnZlIGl0cyBvd24gZXZlbnQgbG9nIGNvbXBsZXRlbHkgZW5vdWdoIHRvIG1ha2UgcHJvZ3Jlc3MuIExhc3QgcmVqZWN0aW9uICgke3JlYXNvbn0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiBlcnJvciB9XG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZSBhZnRlciBpbi1wcm9jZXNzIHJlc3RhcnRzOyByZS1pbnZva2luZyBydW4gZm9yIGEgZnJlc2ggcmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zOiBhdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVpbnZvY2F0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVpbnZvY2F0aW9ucyc6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBEZWxheWVkLCB1bmxpa2UgdGhlIG90aGVyIHJlaW52b2tlKCkgY2FsbGVyczogdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVzdGFydHMgYWxyZWFkeSByZWxvYWRlZCB0aGUgbG9nIHNldmVyYWwgdGltZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBjYXRjaGluZyB1cCwgc28gdGhlIHdyaXRlcnMgdGhpcyByZXBsYXkgaXMgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUuIFJldHJ5aW5nIGluc3RhbnRseSBidXJucyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBidWRnZXQgYXQgZnVsbCBzcGVlZC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBhd2FpdCByZWludm9rZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZWNvbmRpdGlvblJlaW52b2tlRGVsYXlTZWNvbmRzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnM6IGF0dGVtcHQgfVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBEZXBsb3ltZW50LWFmZmluaXR5IGd1YXJkLCBzaGFyZWQgYnkgdGhlIHR3byBwYXRocyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIGEgcnVuOiBxdWV1ZWQgc3RlcCBleGVjdXRpb25zIGFuZCBmbG93IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICBjb25zdCBndWFyZERlcGxveW1lbnQgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIHJ1bjogUGljazxcbiAgICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAncnVuSWQnIHwgJ2RlcGxveW1lbnRJZCcgfCAnc3BlY1ZlcnNpb24nXG4gICAgICAgICAgICAgICAgICAgID4sXG4gICAgICAgICAgICAgICAgICAgIHJlZW5xdWV1ZVBheWxvYWQ6ICgpID0+IFByb21pc2U8V29ya2Zsb3dJbnZva2VQYXlsb2FkPixcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcD86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8RGVwbG95bWVudEFmZmluaXR5T3V0Y29tZT4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG91dGNvbWUsIHNwYW5BdHRyaWJ1dGVzIH0gPVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkRGVwbG95bWVudEFmZmluaXR5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudDogZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZVN0b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZC5pc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlOiBhc3luYyAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50OiByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9OiBSZWVucXVldWVBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlZW5xdWV1ZVBheWxvYWQoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50OiByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBkZXBsb3ltZW50SWQsIHNwZWNWZXJzaW9uLCBkZWxheVNlY29uZHMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5BdHRyaWJ1dGVzKSBzcGFuPy5zZXRBdHRyaWJ1dGVzKHNwYW5BdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dGNvbWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIHN0ZXBJZCwgdGhpcyBpcyBhIGJhY2tncm91bmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBFeGVjdXRlIHRoZSBzdGVwLCB0aGVuIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmF0Y2ggYXJlIGRvbmUuIElmIHNvLCByZXBsYXkgaW5saW5lIChzYXZpbmcgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwKS4gSWYgbm90LCByZXR1cm46IHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGljayB1cCB0aGUgcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgaWYgKGluY29taW5nU3RlcElkICYmIGluY29taW5nU3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogdGhlIHByb2R1Y2VyIHBhcmFsbGVsaXplZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCB3cml0ZSB3aXRoIHRoaXMgcXVldWUgcHVibGlzaCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBlbnRpdHkgbWF5IG5vdCBleGlzdCB5ZXQgd2hlbiB0aGlzIGRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXM6IHRoZSBkZWxpdmVyeSBiZWF0IHRoZSB3cml0ZSwgb3IgdGhlIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRyYW5zaWVudGx5IGFuZCB0aGlzIG1lc3NhZ2UgY2FycmllcyB0aGUgb25seVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGlucHV0LiBJZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG1lc3NhZ2UncyBgc3RlcElucHV0YCwga2V5ZWQgYnkgdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlbGF0aW9uIGlkLCBzbyB0aGUgcHJvZHVjZXIncyB3cml0ZSBhbmQgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWVuc3VyZSBjb252ZXJnZSBvbiBleGFjdGx5IG9uZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEludm9rZWQgZnJvbSB0d28gcGxhY2VzOlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIC0gSU4tQkFORCAodGhlIGxvYWQtYmVhcmluZyBwYXRoKTogd2hlbiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGBzdGVwX3N0YXJ0ZWRgIGJlbG93IHJlamVjdHMgd2l0aCBcInN0ZXAgbm90IGZvdW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGV4ZWN1dG9yIGNhdGNoIG1hdGVyaWFsaXplcyB0aGUgc3RlcCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXRyaWVzIG9uY2UsIGFsbCB3aXRoaW4gdGhpcyBkZWxpdmVyeS4gVGhpcyBtdXN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgbm90IHJlbHkgb24gZGVsaXZlcnkgYXR0ZW1wdHM6IHdvcmxkLXZlcmNlbCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgZmFpbHVyZS1yZXRyeSBwYXRoIHJlLWVucXVldWVzIGEgRlJFU0ggbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChhdHRlbXB0IHJlc2V0cyB0byAxKSwgc28gYW4gYXR0ZW1wdC1nYXRlZCByZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIHVucmVhY2hhYmxlIG9uIHRoZSByZXRyeSBjaGFpbiBhbmQgdGhlIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3b3VsZCBzdGFsbCB1bnRpbCB0aGUgT1JJR0lOQUwgbWVzc2FnZSdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgfjMwMHMgdmlzaWJpbGl0eS10aW1lb3V0IHJlZGVsaXZlcnksIG1lYXN1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgZXhhY3RseSBzbyBpbiB0aGUgZHVyYWJlbmNoIHBhcmFsbGVsIHN3ZWVwcyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGlzIHBhdGggZXhpc3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBFQUdFUkxZIG9uIGEgZ2VudWluZSByZWRlbGl2ZXJ5IChhdHRlbXB0ID4gMSk6IGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWRlbGl2ZXJlZCBkaXNwYXRjaCBhbHJlYWR5IGhhZCBpdHMgY3JlYXRlIHJhY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXNvbHZlZCBlaXRoZXIgd2F5LCBzbyBlbnN1cmluZyB1cCBmcm9udCBzYXZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmYWlsZWQtc3RhcnQgcm91bmQgdHJpcCB0aGUgaW4tYmFuZCByZWNvdmVyeSB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG90aGVyd2lzZSBwYXkuIE9uIHRoZSBsZWdhY3kgcHJvbG9ndWUgaXQgb3ZlcmxhcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgcnVuIGZldGNoIChubyB3YWxsLXRpbWUgY29zdCk7IG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZldGNoLWZyZWUgKHJ1bkNvbnRleHQpIHByb2xvZ3VlIGl0IGlzIHRoZSBzb2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgcHJlLXN0ZXAgd3JpdGUgYW5kIHN0aWxsIHRoZSBjaGVhcGVyIHRyYWRlLiBGaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlbGl2ZXJpZXMgc2tpcCBpdDogdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgYWxtb3N0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgYWx3YXlzIGxhbmRzLCBhbmQgYW4gZWFnZXIgZW5zdXJlIHdvdWxkIGJ1cm4gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbmRpdGlvbmFsIHdyaXRlIHBlciBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgICAgICAgICAgICAgICAgICAgICAgJ29rJyB8ICdnb25lJ1xuICAgICAgICAgICAgICAgICAgICAgID4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwSW5wdXQpIHJldHVybiAnb2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZWQgVWludDhBcnJheSBieSBTdGVwRGlzcGF0Y2hJbnB1dFNjaGVtYTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBub24tYmluYXJ5IChtYW5nbGVkKSBwYXlsb2FkIGZhaWxzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBhcnNlIGFib3ZlIGFuZCBuZXZlciByZWFjaGVzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBzdGVwSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFya3MgdGhpcyBjcmVhdGUgYXMgYSBkaXNwYXRjaCByZS1lbnN1cmUgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZ3VhcmQtZW5mb3JjaW5nIGJhY2tlbmQgY2FuIHJlZnVzZSBpdCB3aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZHVjZXIncyB3cml0ZSB3YXMgNDEyLXJlamVjdGVkICh0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHdhcyByZXZva2VkKS4gU3VyZmFjZXMgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvciDihpIgJ2dvbmUnIGJlbG93LCBhY2tpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLiBXb3JsZHMgd2l0aG91dCB0aGUgZ3VhcmQgaWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhU3RlcERpc3BhdGNoOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkZWxpdmVyeSBtYXRlcmlhbGl6ZWQgdGhlIHN0ZXAsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0aW9uIG9mIHRoZSBwcm9kdWNlcidzIHJlY292ZXJ5IHBhdGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlLlN0ZXBSZXNpbGllbnREaXNwYXRjaE1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01hdGVyaWFsaXplZCBzdGVwX2NyZWF0ZWQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSDigJQgdGhlIHByb2R1Y2VyXFx1MjAxOXMgZGlyZWN0IHdyaXRlIGRpZCBub3QgbGFuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21tb24gY2FzZTogdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgKG9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCByZS1lbnN1cmUpIGFscmVhZHkgbGFuZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSByZXR1cm4gJ29rJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGV4ZWN1dGU6IHRoZSBydW4gd2VudCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobWF0Y2hlcyB0aGUgcnVuLXN0YXR1cyBjaGVjayBiZWxvdyksIG9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQtZW5mb3JjaW5nIGJhY2tlbmQgcmV2b2tlZCB0aGlzIGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICg0MTAgYHN0ZXAtZGlzcGF0Y2gtcmV2b2tlZGAsIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHdhcyA0MTItcmVqZWN0ZWQgYW5kIHRoZSByZXBsYXkgcmVzdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYSBjb3JyZWN0ZWQgc2NoZWR1bGUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHJldHVybiAnZ29uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudDogcmV0aHJvdyBzbyB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRlciBhdHRlbXB0IGNvbnZlcmdlcyBpbnN0ZWFkIG9mIGV4ZWN1dGluZyAoYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2luZykgYSBzdGVwIHRoYXQgbWF5IG5vdCBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gaWRlbnRpdHkgZm9yIHRoaXMgZXhlY3V0aW9uLiBBIG1lc3NhZ2Ugc3RhbXBlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYHJ1bkNvbnRleHRgIChpbW11dGFibGUgcnVuIGZpZWxkcyB0aGUgcHJvZHVjZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoZWxkIGF0IGRpc3BhdGNoIHRpbWUpIHNraXBzIHRoZSBibG9ja2luZyBgcnVucy5nZXRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlbHkg4oCUIG9uZSBsZXNzIHJvdW5kIHRyaXAgb24gdGhlIFRUTFMtY3JpdGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQgTiBmZXdlciByZWFkcyBvbiB0aGUgcnVuJ3MgcGFydGl0aW9uIHBlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbi1vdXQgKHZlcmNlbC93b3JrZmxvdyMzNDU2KS4gVGhlIHJ1bi1zdGF0dXMgZWFybHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0IGlzIG5vdCBsb3N0OiBldmVyeSBXb3JsZCByZWplY3RzIGEgYHN0ZXBfc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSBvbiBhIHRlcm1pbmFsIHJ1biAoUnVuRXhwaXJlZCDihpIgZ29uZSwgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIOKGkiBza2lwcGVkKSDigJQgaW5jbHVkaW5nIGEgcmVkZWxpdmVyZWQgc3RhcnQgd2hvc2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHJvdyBzdGlsbCByZWFkcyBgcnVubmluZ2AsIHdoaWNoIHdvcmxkLWxvY2FsIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkLXBvc3RncmVzIHJlamVjdCBhcyBvZiB0aGlzIGNoYW5nZSAocHJldmlvdXNseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgd29ybGQtdmVyY2VsJ3MgcnVuLXN0YXR1cyBmZW5jZSBjb3ZlcmVkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzaGFwZSwgYW5kIHRoZSBib2R5IGNvdWxkIHJlLXJ1biBvbiBhIGZpbmlzaGVkIHJ1bikuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gT2xkZXIgbWVzc2FnZXMgd2l0aG91dCB0aGUgZmllbGQga2VlcCB0aGUgbGVnYWN5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGJnUnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVuSWRlbnRpdHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdD86IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZD86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdoaWNoIHByb2xvZ3VlIHJhbiDigJQgbWFrZXMgYWRvcHRpb24gb2YgdGhlIGZldGNoLWZyZWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIChhbmQgdGhlIHJvdW5kIHRyaXAgaXQgc2F2ZXMpIGRpcmVjdGx5IG9ic2VydmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdmVyc2lvbi1za2V3IHdpbmRvd3MuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5TdGVwRGlzcGF0Y2hQcm9sb2d1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ29udGV4dCA/ICdydW5fY29udGV4dCcgOiAncnVuc19nZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVhZ2VyIHJlZGVsaXZlcnkgcmUtZW5zdXJlIGhhcyBubyBydW4gZmV0Y2ggdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJsYXAgd2l0aCBvbiB0aGlzIHBhdGgg4oCUIGl0IGlzIGtlcHQgYmVjYXVzZSBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJlZCBkaXNwYXRjaCBoYXMgYWxyZWFkeSBoYWQgaXRzIGNyZWF0ZSByYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlZCwgc28gb25lIGNvbmRpdGlvbmFsIHdyaXRlIGhlcmUgaXMgY2hlYXBlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBsZXR0aW5nIHRoZSBiYXJlIHN0YXJ0IGZhaWwgYW5kIHBheWluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluLWJhbmQgcmVjb3ZlcnkncyBleHRyYSBzdGFydCByb3VuZCB0cmlwLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5zdXJlT3V0Y29tZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJbnB1dCAmJiBtZXRhZGF0YS5hdHRlbXB0ID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgZW5zdXJlU3RlcEZyb21NZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgnb2snIGFzIGNvbnN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnN1cmVPdXRjb21lID09PSAnZ29uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkZW50aXR5ID0gcnVuQ29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2ZldGNoZWQsIGVuc3VyZU91dGNvbWVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSW5wdXQgJiYgbWV0YWRhdGEuYXR0ZW1wdCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ29rJyBhcyBjb25zdCksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnN1cmVPdXRjb21lID09PSAnZ29uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZXRjaGVkLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHN0YXR1czogZmV0Y2hlZC5zdGF0dXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcmVzb2x2ZURhdGE6ICdub25lJ2Agc3RyaXBzIGlucHV0L291dHB1dCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm93J3MgdHlwZTsgZXZlcnkgY29uc3VtZXIgaGVyZSByZWFkcyBpZGVudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRzIG9ubHksIGFuZCB0aGUgcmVwbGF5IHN5bnRoZXNpcyBvdmVycmlkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0L291dHB1dCBleHBsaWNpdGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYmdSdW4gPSBmZXRjaGVkIGFzIFdvcmtmbG93UnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRlbnRpdHkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogZmV0Y2hlZC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBmZXRjaGVkLnNwZWNWZXJzaW9uID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihmZXRjaGVkLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBzdGFydGVkQXQ6ICtmZXRjaGVkLnN0YXJ0ZWRBdCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcm9vdFJ1bklkRnJvbShmZXRjaGVkLmF0dHJpYnV0ZXMsIHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvdmVycyBldmVyeSBxdWV1ZWQgc3RlcCBleGVjdXRpb24g4oCUIGZpcnN0IGRpc3BhdGNoIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcy9yZXRyaWVzIGFsaWtlLiBUaGUgcmUtcm91dGUgcGF5bG9hZCBrZWVwc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlJ3Mgc3RlcElucHV0L3J1bkNvbnRleHQgc28gdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGxveW1lbnQncyBjb25zdW1lciByZXRhaW5zIHRoZSByZXNpbGllbnQgcmUtZW5zdXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBmZXRjaC1mcmVlIHByb2xvZ3VlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklkZW50aXR5LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSWRlbnRpdHkuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oc3RlcElucHV0ID8geyBzdGVwSW5wdXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuQ29udGV4dCA/IHsgcnVuQ29udGV4dCB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgdGhlIHJlLXJvdXRlZCBob3AgaW4gdGhlIFRUUiBkZWNvbXBvc2l0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihob29rUmVzdW1lVGltaW5nID8geyBob29rUmVzdW1lVGltaW5nIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1N0YXJ0ZWRBdCA9IHJ1bklkZW50aXR5LnN0YXJ0ZWRBdCA/PyBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgY2VpbGluZyBmb3IgYSBiYWNrZ3JvdW5kZWQgc3RlcC4gYG1ldGFkYXRhLmF0dGVtcHRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCkgaXMgYSBjaGVhcCB1cHBlciBib3VuZCwgYnV0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3Zlci1jb3VudHM6IGEgVGhyb3R0bGVFcnJvciAvIFRvb0Vhcmx5RXJyb3IgKG9yIGFueVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkgdGhhdCBuZXZlciByYW4gdGhlIGJvZHkpIHN0aWxsIGFkdmFuY2VzIGl0LCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRydXN0aW5nIGl0IGRpcmVjdGx5IGNvdWxkIGZhaWwgYSBzdGVwIGFzIFwiZXhjZWVkZWQgbWF4XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllc1wiIGJlZm9yZSB0aGUgYm9keSBldmVyIHJhbiAoYSB1c2VyLXZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWdyZXNzaW9uIHVuZGVyIHRyYW5zaWVudCBiYWNrZW5kIHByZXNzdXJlKS4gVXNlIGl0IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGZhc3QgZ2F0ZTogd2hpbGUgaXQgaXMgYXQgb3IgdW5kZXIgdGhlIGNlaWxpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBjYW5ub3QgYmUgZXhoYXVzdGVkLCBzbyBwcm9jZWVkIHdpdGhvdXQgdG91Y2hpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbG9nLiBPbmx5IG9uY2UgaXQgY3Jvc3NlcyB0aGUgY2VpbGluZyBkbyB3ZSBsb2FkIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nIGFuZCBkZXJpdmUgdGhlIGF1dGhvcml0YXRpdmUgYXR0ZW1wdCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZGVkIGBzdGVwX3N0YXJ0ZWRgIGNvdW50LCBzY29wZWQgdG8gdGhlIGxpZmVjeWNsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgdG90YWwgKGJhcmUgc3RhcnRzIHBsdXMgdGhlIGxhcmdlc3Qgc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXIncyBzdGFydHMpOiB0aHJvdHRsZS90b28tZWFybHkgcmVkZWxpdmVyaWVzIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RhcnQgYXQgYWxsLCByYWNpbmcgaW52b2NhdGlvbnMnIG9uZS1vZmYgc3RhbXBlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZXMgZG9uJ3QgYWNjdW11bGF0ZSAoY291bnRpbmcgdGhlbSBmYWxzZWx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhoYXVzdGVkIGhlYWx0aHkgc3RlcHMsIHNlZSBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXR0ZW1wdHMgYnVybmVkIHVuZGVyIGEgcHJpb3IgaW5saW5lLW93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIHN0aWxsIGNvdW50LCBzbyBhIHN0ZXAgdGhhdCB0aW1lcyBvdXQgdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZCByZWNvdmVyeSBhbmQgdGhlbiB0cmFuc2l0aW9ucyB0byBxdWV1ZWQvYmFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXMgdHJpcHMgdGhlIGNvbWJpbmVkIGNlaWxpbmcuIFRoaXMgc3RpbGwgYm91bmRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dHMsIHdoaWNoIHdyaXRlIG5vIGVycm9yIGZvciB0aGUgcG9zdC1ib2R5IGd1YXJkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQgPSBtZXRhZGF0YS5hdHRlbXB0O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnTWF4UmV0cmllcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGVwRnVuY3Rpb24oaW5jb21pbmdTdGVwTmFtZSk/Lm1heFJldHJpZXMgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IGJnTWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3RvdGFsQXR0ZW1wdHMnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVFRSOiB0aGlzIGRlbGl2ZXJ5IElTIHRoZSBkaXNwYXRjaGVkIG5leHQgc3RlcCBvZiBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1wdGlvbi4gQ29uc3VtZSB0aGUgdHJhY2tpbmcgaGVyZSBzbyB0aGUgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRoaXMgaGFuZGxlciBtYXkgZmFsbCB0aHJvdWdoIHRvIGNhbm5vdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydCBpdCBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1Jlc3VtZVRyYWNraW5nID0gcmVzdW1lVHJhY2tpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSB0aGUgcmVwbGF5IGJ1ZGdldCB3aGlsZSB0aGUgc3RlcCBib2R5IHJ1bnM6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RHVyYXRpb24sIG5vdCBieSB0aGUgcmVwbGF5IHRpbWVvdXQuIFNlZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXlCdWRnZXQgZG9jcyBmb3IgdGhlIGNvbnRyYWN0LlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPj47XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZS1mbGlnaHQ6IGEgZGVsYXllZCBiYWNrc3RvcCAob3IgcmV0cnkpIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBhcnJpdmUgd2hpbGUgYW5vdGhlciBleGVjdXRpb24gb2YgdGhpcyBzYW1lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG1pZC1ib2R5IGluIHRoaXMgcHJvY2VzcywgbW9zdCBpbXBvcnRhbnRseSBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGRzIHdpdGggbm8gaW52b2NhdGlvbiBraWxsIGJvdW5kICh3b3JsZC1sb2NhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSB0aGUgb3duZXJzaGlwIGxlYXNlIGlzIG5vdCBhIGRlYXRoIHByb29mLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvc2VyIGF3YWl0cyB0aGUgd2lubmVyJ3Mgc2V0dGxlbWVudCwgdGhlbiBhY2tzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGV4ZWN1dGluZy4gTm8gb3duZXJNZXNzYWdlSWQgaGVyZTogdGhlIGJhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBvZiBhIHF1ZXVlLWRyaXZlbiBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgY2xlYXJzIGlubGluZSBvd25lcnNoaXAgKHRoZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZS1vd25lZCBmcm9tIHRoaXMgcG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVF1ZXVlZFN0ZXAgPSAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHJ1bklkZW50aXR5LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IGJnU3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcnVuSWRlbnRpdHkucm9vdFJ1bklkID8/IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiBydW5JZGVudGl0eS5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRyeSBjZWlsaW5nOiB0aGUgcXVldWUgZGVsaXZlcnkgY291bnQgYXMgYSBmYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2F0ZSwgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcmVjb3JkZWQgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIChzZWUgYWJvdmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OiBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiZ1Jlc3VtZVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgcmVzdW1lVHJhY2tpbmc6IGJnUmVzdW1lVHJhY2tpbmcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdCA9IGF3YWl0IHJ1blN0ZXBTaW5nbGVGbGlnaHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZVF1ZXVlZFN0ZXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluLWJhbmQgcmVzaWxpZW50IHJlY292ZXJ5OiBhIG1pc3Npbmcgc3RlcCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdGVwSW5wdXQtY2FycnlpbmcgbWVzc2FnZSBtZWFucyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvdXRyYW4gKG9yIG91dGxpdmVkIGEgdHJhbnNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIG9mKSB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIHdyaXRlLiBNYXRlcmlhbGl6ZSB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIHBheWxvYWQgYW5kIHJldHJ5IE9OQ0UsIHdpdGhpbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeS4gU2VlIGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSBmb3Igd2h5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbm5vdCB3YWl0IGZvciBhIHJlZGVsaXZlcnkuIEEgc2Vjb25kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIHByb3BhZ2F0ZXMgYXMgYmVmb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwSW5wdXQgfHwgIWlzU3RlcE1pc3NpbmdFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXdhaXQgZW5zdXJlU3RlcEZyb21NZXNzYWdlKCkpID09PSAnZ29uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIGFzIGNvbnN0IH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZVF1ZXVlZFN0ZXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3RlcCBoYWQgcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMpLCBicmVhayBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdFVudGlsIGZsdXNoIHRoZW0sIHNvIGNhbid0IGNvbnRpbnVlIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0Lmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3NraXBwZWQnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyB0byBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3Vyc29yLWJhc2VkIGxvYWRpbmcgc28gdGhlIG1haW4gbG9vcCBjYW4gY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsbHkgZnJvbSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChsb2FkZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBzdGVwczogYW55IHN0ZXBfY3JlYXRlZCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hdGNoaW5nIHN0ZXBfY29tcGxldGVkIG9yIHN0ZXBfZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBUZXJtaW5hbElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGxvYWRlZC5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBDcmVhdGVkSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFRlcm1pbmFsSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzdGVwQ3JlYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBUZXJtaW5hbElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBJZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ1N0ZXBJZHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBwZW5kaW5nIHN0ZXAgdGhhdCBUSElTIG1lc3NhZ2UgaW5saW5lLW93bnMgKGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlIHN0YW1wZWQgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBhbmQgdGhlbiBjcmFzaGVkIG1pZC1ib2R5KSBtdXN0IGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJlZCBoZXJlOiBvbmx5IHRoZSBvd25pbmcgbWVzc2FnZSBtYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZXhlY3V0ZSBpdCBiZWZvcmUgdGhlIG93bmVyc2hpcCBsZWFzZSBleHBpcmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2FrZSByZXBsYXlzIG1lcmVseSBlbnN1cmUgYSBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wLiBGYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gbG9vcCwgd2hvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggdGFibGUgcm91dGVzIGl0IHRvIG93bmVkIHJlY292ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwSWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lOyBmYWxsaW5nIHRocm91Z2ggdG8gcmVjb3ZlciBhbiBpbmxpbmUgc3RlcCBvd25lZCBieSB0aGlzIG1lc3NhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBzdGVwcyBzdGlsbCBpbiBwcm9ncmVzcy4gUmV0dXJuIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1aW5nOiB0aGUgbGFzdCBoYW5kbGVyIHRvIGNvbXBsZXRlIHdpbGwgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGRvbmUgYW5kIHJlcGxheSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZywgcmV0dXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBzdGVwcyBkb25lOiBmYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gcmVwbGF5IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgc2hhcmVkIHN0YXRlIHNvIHRoZSBsb29wIGNhbiBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSwgcmVwbGF5aW5nIGlubGluZSBhZnRlciBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgcnVuIHJvdyBvbmx5IHdoZW4gY29udGludWluZyBpbnRvIHJlcGxheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBmb3IgZXZlcnkgcXVldWVkIHN0ZXAncyBwcm9sb2d1ZS4gVGhpcyBhbHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgcmVjb3Zlcnkgb2YgYW4gaW5saW5lIHN0ZXAgb3duZWQgYnkgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UnVuUm93ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmdSdW4gPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgc3RhdHVzZXMgb25seTogYSBgcGVuZGluZ2AgcmVhZCBoZXJlIGlzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlIHJvdyAodGhpcyBydW4gaGFzIGNvbXBsZXRlZCBzdGVwcywgc28gaXQgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGVkKSwgYW5kIHVuZGVyIHRoZSBmZXRjaC1mcmVlIHByb2xvZ3VlIHRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNvbXBsZXRlcidzIE9OTFkgc3RhdHVzIHJlYWQg4oCUIHJldHVybmluZyBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd291bGQgc2lsZW50bHkgYWJhbmRvbiB0aGUgZmFuLW91dCdzIGNvbnRpbnVhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSBmaW5hbCBzdGVwX2NvbXBsZXRlZCBpcyB3cml0dGVuLCB0aGUgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgbmV2ZXIgcnVucykuIEZhbGwgdGhyb3VnaCBpbnN0ZWFkOiB0aGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW50aGVzaXplcyBgcnVubmluZ2AgYW5kIHRoZSBuZXh0IGVudGl0eSB3cml0ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmVuY2VkIHNlcnZlci1zaWRlIGlmIHRoZSBydW4gdHJ1bHkgZW5kZWQgbWVhbndoaWxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyhyZXBsYXlSdW5Sb3cuc3RhdHVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgaW5saW5lIHJlcGxheSBhZnRlciBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXBsYXlSdW5Sb3cuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0ZXAgYm9keSBuZWVkcyBubyB3b3JrZmxvdyBWTS4gQ29tcGlsZSBvbmx5IHdoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheWluZywgdXNpbmcgdGhlIGZldGNoZWQgcm93J3MgVk0gc2VsZWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRXb3JrZmxvd0NvbXBpbGUocmVwbGF5UnVuUm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudCA9IGxvYWRlZC5ldmVudHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5SW5wdXQ6IHVua25vd247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUlucHV0ID0gcnVuQ3JlYXRlZEV2ZW50LmV2ZW50RGF0YS5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNMZWdhY3lTcGVjVmVyc2lvbihyZXBsYXlSdW5Sb3cuc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwicnVuX2NyZWF0ZWRcIiBldmVudGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZ2FjeSBydW5zIHByZWRhdGUgdGhlIGV2ZW50LXNvdXJjZWQgcnVuX2NyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YXJpYW50LCBzbyByZXRhaW4gdGhlIHJlc29sdmVkIEdFVCBvbmx5IGZvciB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWdhY3lSdW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWdhY3lSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBsZWdhY3lSdW4uaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVwbGF5UnVuUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcmVwbGF5SW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9IGJnU3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGJhY2tncm91bmQgd29ya2Zsb3cgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgcHJlLWNoZWNrIGZvciB0aGUgbGF6eSBob29rIGZhc3RcbiAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cuIE5ldyBsYXp5LXJlc3VtZSBtZXNzYWdlcyBjYXJyeSB0aGUgcnVuJ3NcbiAgICAgICAgICAgICAgICAgIC8vIHBpbm5lZCBkZXBsb3ltZW50IChgaG9va0lucHV0LmRlcGxveW1lbnRJZGApLCBzbyBhXG4gICAgICAgICAgICAgICAgICAvLyBtaXNyb3V0ZWQgZGVsaXZlcnkgaXMgZGV0ZWN0YWJsZSB3aXRoIGEgY2hlYXAgYW1iaWVudFxuICAgICAgICAgICAgICAgICAgLy8gZGVwbG95bWVudC1pZCBjb21wYXJpc29uIEJFRk9SRSB0aGUgZmFzdCBwYXRoJ3NcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd3JpdGUsIHNvIHRoZSBjb3JyZWN0bHktcm91dGVkIGNvbW1vbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyBwYXlzIG5vIHJ1biBmZXRjaCBhbmQgbm8gbGF0ZW5jeS4gT25seSBhIGRldGVjdGVkXG4gICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaCBmZXRjaGVzIHRoZSBhdXRob3JpdGF0aXZlIHJ1biBhbmQgaGFuZHMgaXQgdG9cbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGlzdGluZyBndWFyZCAod2hpY2ggb3ducyByZS1yb3V0ZS9mYWlsIHBvbGljeSk7XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmUtcm91dGVkIG1lc3NhZ2Uga2VlcHMgdGhlIGNvbXBsZXRlIGBob29rSW5wdXRgLFxuICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgbWF5IGhvbGQgdGhlIG9ubHkgY29weSBvZiB0aGUgcmVzdW1lIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBwaW5uZWQgb3IgYW1iaWVudCBpZCBpcyB1bmF2YWlsYWJsZSAob2xkZXJcbiAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyIG1lc3NhZ2UsIGEgd29ybGQgd2l0aG91dCBkZXBsb3ltZW50IGFmZmluaXR5LFxuICAgICAgICAgICAgICAgICAgLy8gb3IgYSBnZXREZXBsb3ltZW50SWQgZmFpbHVyZSksIGJlaGF2aW9yIGlzIHVuY2hhbmdlZDpcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBhdXRob3JpdGF0aXZlIGd1YXJkIGFmdGVyIHJ1biBzZXR1cCAod2hpY2ggcmVtYWluc1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3RlY3Rpb24gYmVmb3JlIHJlcGxheSBhbmQgc3RlcCBleGVjdXRpb24pIHN0aWxsXG4gICAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgdGhlIGRlbGl2ZXJ5OyB0aGUgZmFzdCBwYXRoJ3Mgd3JpdGUgaXMgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgLy8gcGVyIChydW5JZCwgcmVzdW1lSWQpLCBzbyBhIHByZS1ndWFyZCB3cml0ZSBmcm9tIGFuXG4gICAgICAgICAgICAgICAgICAvLyBvbGRlciBtZXNzYWdlIHN0YXlzIGNvbnZlcmdlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICF3b3JrZmxvd1J1biAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQ/LmRlcGxveW1lbnRJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgZWxpZ2liaWxpdHkgYXMgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHk6IHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgLy8gYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHMgdGhlIGlkcyBsZWdpdGltYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyIChlLmcuIGRwbF9sb2NhbEA8dmVyc2lvbj4pIGFuZCBjb21wYXJpbmcgdGhlbVxuICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCB0cmlnZ2VyIHNwdXJpb3VzIHJ1biBmZXRjaGVzLlxuICAgICAgICAgICAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXM/LmRlcGxveW1lbnRBZmZpbml0eSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IGhvb2tJbnB1dC5kZXBsb3ltZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkICE9PSBwaW5uZWREZXBsb3ltZW50SWRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3J3YXJkZWQgVU5NT0RJRklFRCAoaW4gcGFydGljdWxhciB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBkZWxpdmVyeSdzIGVudHJ5IHRpbWUpIHNvIHRoZSBtaXNyb3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBob3AgaXMgYXR0cmlidXRlZCB0byBgcXVldWVfZGVsaXZlcnlgIGFuZCBUMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZHMgdXAgYmVpbmcgdGhlIGZpbmFsIGNvbnN1bWVyJ3MgZW50cnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0UnVuUmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBMYXp5IGhvb2sgcmVzdW1lIGZhc3QgcGF0aCAtLS1cbiAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBob29rIGRlbGl2ZXJ5IChyZXN1bWVJZCArIGRpZ2VzdCBvbiB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UpIGhvaXN0cyB0aGUgY29uc3VtZXIncyBpZGVtcG90ZW50IGhvb2tfcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlLWVuc3VyZSBhYm92ZSBydW5fc3RhcnRlZCBhbmQgYXNrcyB0aGUgV29ybGQgdG8gcmV0dXJuXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCByZXBsYXkgbG9nIHdpdGggdGhlIHdyaXRlIChwcmVsb2FkRXZlbnRzKS4gQVxuICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGluZyBXb3JsZCBhbnN3ZXJzIHdpdGggdGhlIHJlY29uc3RydWN0ZWQgcnVuLCB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlIHJlcGxheSBsb2csIGFuZCB0aGUgcnVuJ3MgZXZlbnQgY2VpbGluZzpcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgdGhlIGdlbmVyaWMgc2V0dXAgYmVsb3cgd291bGQgc3BlbmQgYVxuICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgUE9TVCBhbmQgYW4gZXZlbnRzLmxpc3Qgb24uIEFueSBvdGhlciByZXN1bHRcbiAgICAgICAgICAgICAgICAgIC8vIChvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVzIHRoZSBwYXJhbSwgb3IgYVxuICAgICAgICAgICAgICAgICAgLy8gcHJlbG9hZCB0aGF0IGZhaWxzIHZhbGlkYXRpb24sIGluY2x1ZGluZyBhIGJvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGhhc01vcmUgcGFnZSkgZmFsbHMgYmFjayB0byB0aGF0IGdlbmVyaWMgc2V0dXA7IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3cml0ZSBpdHNlbGYgaGFzIHN0aWxsIHN1Y2NlZWRlZCBlaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdheSwgc28gdGhlIHJlLWVuc3VyZSBibG9jayBiZWxvdyBpcyBza2lwcGVkIHZpYVxuICAgICAgICAgICAgICAgICAgLy8gYGhvb2tFbnN1cmVkYC4gTmV2ZXIgdGFrZW4gb24gdHVyYm8gKHR1cmJvIGRlbGl2ZXJpZXNcbiAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IHJ1bklucHV0LCBub3QgaG9va0lucHV0KSBvciBhZnRlciB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIGFscmVhZHkgbG9hZGVkIHRoZSBydW4uXG4gICAgICAgICAgICAgICAgICBsZXQgaG9va0Vuc3VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXdvcmtmbG93UnVuICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dCAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucGF5bG9hZERpZ2VzdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9va1Jlc3VtZUlucHV0ID0gaG9va0lucHV0O1xuICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgIC8vIG9jY3VycmVkLCBzYW1lIGRlcml2YXRpb24gYXMgdGhlIHJlLWVuc3VyZSBiZWxvdyAodGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZUlkIGlzIGEgVUxJRCBtaW50ZWQgYnkgcmVzdW1lSG9vaygpIGF0IHJlc3VtZVxuICAgICAgICAgICAgICAgICAgICAvLyB0aW1lKS5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVGltZShob29rUmVzdW1lSW5wdXQucmVzdW1lSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50KCd3b3JrZmxvdy5ob29rX3JlY2VpdmVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ob29rX3JlY2VpdmVkLnByZWxvYWRfZXZlbnRzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlMb2FkID0gdHJhY2VSZXBsYXlMb2FkKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcHJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVwbGF5RXZlbnRPYnNlcnZlcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rUmVzdW1lSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rUmVzdW1lSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tSZXN1bWVJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lUGF5bG9hZERpZ2VzdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va1Jlc3VtZUlucHV0LnBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RXZlbnRPYnNlcnZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheUxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0Vuc3VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHVubGlrZSB0aGUgcmUtZW5zdXJlIGJlbG93LCB0aGlzIGhvaXN0ZWQgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIE5PVCBzZXQgSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZDogaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIG9uIGV2ZXJ5IGZhc3QtcGF0aCByZXN1bWUsIGluY2x1ZGluZyB0aGUgY29tbW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSB3aGVyZSB0aGUgcHJvZHVjZXIncyBkaXJlY3Qgd3JpdGUgYWxyZWFkeSBsYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBjYWxsIG1lcmVseSBjb252ZXJnZWQgb24gaXQsIHNvIGl0IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZWNvdmVyeSBzaWduYWwuIHdvcmtmbG93LnJlc3VtZV9zZXR1cF9zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYmVsb3cpIGRlc2NyaWJlcyB0aGlzIHBhdGggaW5zdGVhZC5cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIGlzIHVzYWJsZSBhcyByZXBsYXkgaW5wdXQgb25seSB3aGVuIGl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVtb25zdHJhYmx5IHRoZSBjb21wbGV0ZSBwaWN0dXJlOiBhIHJlY29uc3RydWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gd2l0aCBhIHN0YXJ0IHRpbWUsIGEgbm9uLWVtcHR5IENPTVBMRVRFIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXNNb3JlIGZhbHNlLCBzaW5jZSB0aGlzIHBhdGggaGFzIG5vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yLWNvbnRpbnVhdGlvbiBtYWNoaW5lcnksIHNvIGEgYm91bmRlZCBwYWdlIG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYmUgdHJ1c3RlZCksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZlcidzIGV2ZW50IGNlaWxpbmcgKHRoaXMgcmVzcG9uc2UgcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCdzIHJvbGUsIHNvIGEgbWlzc2luZyBjZWlsaW5nIHdvdWxkIGxlYXZlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQtbGltaXQgZW5mb3JjZW1lbnQgZGlzYWJsZWQgZm9yIHRoZSBydW4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggcnVuIGxpZmVjeWNsZSBldmVudHMsIHRoZSBjYW5vbmljYWwgZXZlbnQgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGNvbnZlcmdlZCBvbiwgYW5kIHRoZSBob29rX3JlY2VpdmVkIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVEhJUyByZXN1bWUgKHNvIHdlIG5ldmVyIHJlcGxheSBhZ2FpbnN0IGEgbG9nIHRoYXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtaXNzaW5nIHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGRlbGl2ZXJ5KS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2FibGVSZXBsYXlQcmVsb2FkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bi5zdGFydGVkQXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY3Vyc29yICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdC5tYXhFdmVudHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZVJlcGxheVByZWxvYWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4/LnN0YXJ0ZWRBdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlY29uc3RydWN0ZWQgcnVuIGFsd2F5cyByZWFkcyAncnVubmluZycsIGJ1dCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudCBjb21taXR0ZWQgY29uY3VycmVudGx5IHJpZGVzIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGl0c2VsZi4gVGhlIG5vZGUgcmVwbGF5IGxvb3Agd291bGQgY2F0Y2ggaXQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBkaXNwYXRjaGVzIGJlZm9yZSB0aGF0IGNoZWNrLCBzbyBjb25zdW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsaXZlcnkgaGVyZSwgYmVmb3JlIGFueSBlbmdpbmUgcnVucy4gU2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0Y29tZSBhcyB0aGUgcnVuX3N0YXJ0ZWQgcGF0aCdzIG5vbi1ydW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgY2hlY2suXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbEV2ZW50ID0gcmVzdWx0LmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIHN0aWxsIGluaXRpYWxpemVkIHRoaXMgZGVsaXZlcnkgKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGhvdyB0aGUgdGVybWluYWwgc3RhdGUgd2FzIG9ic2VydmVkKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwLXNvdXJjZSBhbmQgdGhlIHJ1bidzIGFjdHVhbCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgYXJlIHJlY29yZGVkIGJlZm9yZSBjb25zdW1pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnY2FuY2VsbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgbGF6eSBob29rIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRXb3JrZmxvd0NvbXBpbGUod29ya2Zsb3dSdW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgPSBjbGFtcE1heEV2ZW50cyhyZXN1bHQubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcnMgUlNGUywgc2VlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcGxheXMgcnVuX3N0YXJ0ZWQncyByb2xlIG9uIHRoaXMgcGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ2hvb2tfcHJlbG9hZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiByZXN1bHQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArcmVzdWx0LnJ1bi5zdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJlc3VsdC5ydW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9va19yZWNlaXZlZF9zdHJlYW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCB3cml0ZSwgbm8gdXNhYmxlIHByZWxvYWQgKENCT1IgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gYW4gb2xkZXIgc2VydmVyLCBhIFdvcmxkIHRoYXQgaWdub3JlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdC1pbiwgYSBib3VuZGVkIGhhc01vcmUgcGFnZSwgb3IgYSBwcmVsb2FkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB2YWxpZGF0aW9uKTogdGFrZSB0aGUgZ2VuZXJpYyBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgYmVsb3cuIEl0cyBwcmVsb2FkIGlzIGxvYWRlZCBhZnRlciB0aGlzIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQsIHNvIHRoZSBjYW5vbmljYWwgaG9va19yZWNlaXZlZCBpcyBwYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB3aGF0ZXZlciBsb2cgdGhhdCBzZXR1cCByZWFkcywgc28gbm8gc3BsaWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX2ZhbGxiYWNrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBjbGFzc2lmaWNhdGlvbiBhcyB0aGUgcmUtZW5zdXJlIGJlbG93OlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gSG9va05vdEZvdW5kIC8gUnVuRXhwaXJlZDogdGhlIHJ1biB3ZW50IHRlcm1pbmFsO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90aGluZyBsZWZ0IHRvIHJlc3VtZSwgY29uc3VtZSB0aGUgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAtIGFueXRoaW5nIGVsc2UgKEVudGl0eUNvbmZsaWN0LCBhIHRydW5jYXRlZCBwcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzdHJlYW0sIHRyYW5zcG9ydCBmYWlsdXJlcyk6IHRyYW5zaWVudC4gUmV0aHJvdyBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIHRoZSBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAocnVuSWQsIHJlc3VtZUlkKSBjbGFpbSBjb252ZXJnZXMgb24gcmV0cnkuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBsYXp5IGhvb2sgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHJlY29yZFdvcmtmbG93U2V0dXBGYWlsdXJlKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gb3IgYnkgdGhlIGxhenkgaG9vayBmYXN0IHBhdGggYWJvdmUuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5OiB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbjogc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGJhY2tncm91bmQgdGhpcyBwdXJlbHkgYXMgYSB3cml0ZSBiYXJyaWVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVhZCBpdHMgcHJlbG9hZGVkIGV2ZW50cywgc28gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGV2ZW50LWxvZyBwcmVsb2FkLiBUaGF0IHRyaW1zIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgcmVxdWVzdCB0aGUgY2hhaW5lZCBmaXJzdCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRzIG9uIChzaG9ydGVuaW5nIHRpbWUtdG8tc2Vjb25kLXN0ZXApIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhc3RlZCBsaXN0K3Jlc29sdmUgaXQgd291bGQgb3RoZXJ3aXNlIGNvbXB1dGUuXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCwgc2tpcFByZWxvYWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyID0gc3RhcnRlZFByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0V29ya2Zsb3dDb21waWxlKHJ1bklucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UmVwbGF5UGF5bG9hZENhY2hlKHJ1bklucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGF3YWl0IHJlY29yZFdvcmtmbG93U2V0dXBGYWlsdXJlKGVycikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gYmFja2dyb3VuZHMgcnVuX3N0YXJ0ZWQsIHNvIHRoZSBub24tdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ25tZW50IGJlbG93IG5ldmVyIHJ1bnMuIFRocmVhZCB0aGUgcGVyLXJ1biBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgb2ZmIHRoZSBiYWNrZ3JvdW5kZWQgcmVzcG9uc2UgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBndWFyZCByZS1jaGVja3MgbWF4RXZlbnRzTGltaXQgZXZlcnkgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiwgc28gYSB2YWx1ZSB0aGF0IGxhbmRzIHNob3J0bHkgYWZ0ZXIgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBlbmZvcmNlcyB3ZWxsIGJlZm9yZSBhIHJ1bmF3YXkgbG9nIGFwcHJvYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2VpbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICB2b2lkIHN0YXJ0ZWRQcm9taXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHIubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQpIG1heEV2ZW50c0xpbWl0ID0gbGltaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBhbiBlYXJseSBmYWlsdXJlIGZyb20gc3VyZmFjaW5nIGFzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmhhbmRsZWRSZWplY3Rpb247IHJ1blJlYWR5QmFycmllciBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdDogbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvZyB5ZXQgb24gYSBmaXJzdCBkZWxpdmVyeSAocnVuX3N0YXJ0ZWQgaXMgc3RpbGwgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQpLiBBbiBlbXB0eSBwcmVsb2FkIHJvdXRlcyBpdGVyYXRpb24gMSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vLWxvYWQgcHJlbG9hZGVkIGJyYW5jaDsgaXRlcmF0aW9uIDIgdGhlbiB0YWtlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwb3N0LXByZWxvYWRlZCBmdWxsIHJlbG9hZCB0byBwaWNrIHVwIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBhIHNwdXJpb3VzIFwiY3Vyc29yIG1pc3NpbmdcIiB3YXJuaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSW5wdXQuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCBhdHRyaWJ1dGVzIGZyb20gc3RhcnQoKSByaWRlIGFsb25nIGluIGBydW5JbnB1dGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGxpdmUgaW4gYHJ1bl9jcmVhdGVkYCdzIGV2ZW50RGF0YSwgbm90IHNlcGFyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXR0cl9zZXRgIGV2ZW50cyksIHNvIHRoZSBzeW50aGVzaXplZCBzbmFwc2hvdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGV2ZW4gdGhvdWdoIHdlIHNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QgT05MWSB3aGlsZSBhdHRyaWJ1dGVzIGFyZSB3cml0ZS1vbmx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW4td29ya2Zsb3cgcmVhZCBBUEkgdG9kYXkgKHNlZSB3b3JrZmxvdy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZFwiKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcmVsb2FkZWQgbG9nIGNhbid0IGRpdmVyZ2Ugb24gYSByZWFkLiBJZiBhIHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBldmVyIGFkZGVkIGl0IE1VU1QgcmVhZCBmcm9tIHRoaXMgc25hcHNob3QsIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGF5aW5nIHJ1bl9jcmVhdGVkL2F0dHJfc2V0IGV2ZW50cywgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibydzIGVtcHR5IGluaXRpYWwgbG9nIHdvdWxkIHN1cmZhY2Ugc2VlZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBge31gIG9uIHRoZSBmaXJzdCBkZWxpdmVyeSBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGBydW5TdGFydGVkUmVjZWl2ZWRBdE1zYCBkZWNsYXJhdGlvbiBhYm92ZTpcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBzeW50aGVzaXplcyB0aGUgcnVuIGJlZm9yZSB0aGUgcmVhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZHMsIHNvIGFuY2hvciBSU0ZTIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCBhbiBhY3R1YWwgcmVzcG9uc2UgaW5zdGFudC5cbiAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlMb2FkID0gdHJhY2VSZXBsYXlMb2FkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAncnVuX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGF5RXZlbnRPYnNlcnZlcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFdmVudChydW5TdGFydGVkRXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUV2ZW50T2JzZXJ2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdvcmtmbG93Q29tcGlsZShydW5JbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UmVwbGF5UGF5bG9hZENhY2hlKHJ1bklucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHNldHVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXBsYXlMb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgc3luY2hyb25vdXMgc2V0dXAgZXJyb3IgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZpbmcgdGhlIGluLWZsaWdodCByZXBsYXkgbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZXR1cEVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVwbGF5TG9hZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gcmVzdWx0LnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ID0gY2xhbXBNYXhFdmVudHMocmVzdWx0Lm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JzIFJTRlMsIHNlZSB0aGUgZGVjbGFyYXRpb24gYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvdmVycyBib3RoIHRoZSBwbGFpbiBzZXF1ZW50aWFsIHJlc3VtZSBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IGZhc3QgcGF0aCdzIGZhbGxiYWNrICh3aG9zZSBob2lzdGVkIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBubyB1c2FibGUgcHJlbG9hZCBhbmQgbGVmdCB3b3JrZmxvd1J1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zZXQsIHNvIGl0IGxhbmRzIGhlcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ3J1bl9zdGFydGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ldmVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbLi4ucmVzdWx0LmV2ZW50c10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gcmVzdWx0Lmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHRFdmVudExvZ0xvYWQobG9hZGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5sb2FkZWQsIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK3Jlc3VsdC5ydW4uc3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhyZXN1bHQucnVuLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ydW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnJ1bi5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZvciBgY2FuY2VsYCwgd2UgYWN0dWFsbHkgd2FudCB0byBwcm9wYWdhdGUgYSBXb3JrZmxvd0NhbmNlbGxlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHdvcmtmbG93IGNvbnRleHQgc28gdGhlIHVzZXIgY2FuIGdyYWNlZnVsbHkgZXhpdC4gdGhpcyBpcyBTSUdURVJNXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXJtb3JlLCB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IG9yIGEgd2F5IHRvIGZvcmNlIGNhbmNlbCBTSUdLSUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgYWN0dWFsbHkgZXhpdCBoZXJlIHdpdGhvdXQgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBhdCBhbGwsIGluIHRoZSBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGlzIGl0c2VsZiBmYWlsaW5nLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0V29ya2Zsb3dDb21waWxlKHdvcmtmbG93UnVuKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB3YXMgY29uY3VycmVudGx5IGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvcjogcnVuIHdhcyBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxlZCBkdXJpbmcgc2V0dXAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvcjogcnVuIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGJvdGggY2FzZXMsIHNraXAgcHJvY2Vzc2luZyB0aGlzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhd2FpdCByZWNvcmRXb3JrZmxvd1NldHVwRmFpbHVyZShlcnIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChub24tdHVyYm8gcnVuX3N0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAoIXdvcmtmbG93UnVuKVxuICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgcmVwbGF5J1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgc2V0dXAgYnJhbmNoIHJhbiwgc28gdGhlIHJ1biBhcnJpdmVkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgc2V0dXAgd2FzIGEgcGxhaW4gZXZlbnQgbG9hZC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQtc3RlcCBmYWxsLXRocm91Z2ggcmVhY2hlcyBoZXJlIHdpdGggYSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWRlZCB0b2RheSwgYW5kIGl0IGNvbnN1bWVzIHRoZSB0cmFja2luZyBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIHRoaXMgaXMgdGhlIGhvbmVzdCBkZWZhdWx0IHJhdGhlciB0aGFuIGEgbGl2ZVxuICAgICAgICAgICAgICAgICAgLy8gcGF0aCwgYW5kIGtlZXBzIHRoZSBkaW1lbnNpb24gdG90YWwgaWYgb25lIGlzIGV2ZXIgYWRkZWQuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZy5zZXR1cFNvdXJjZSA9ICdldmVudF9sb2FkJztcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gQ292ZXJzIGV2ZXJ5IGZsb3cgcmVwbGF5IChpbml0aWFsIHN0YXJ0LCBzdGVwIGNvbXBsZXRpb25zLFxuICAgICAgICAgICAgICAgICAgLy8gaG9vayByZXN1bXB0aW9ucywgd2FpdCBjb21wbGV0aW9ucykgYW5kIHN0b3BzIGJlZm9yZSBhbnlcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgb3IgaW5saW5lIHN0ZXAgZXhlY3V0ZXMgd2hlbiB0aGUgcnVuIGlzIG5vdFxuICAgICAgICAgICAgICAgICAgLy8gcGlubmVkIGhlcmUgKHNlZSBgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHlgKS4gVGhpcyByZW1haW5zXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgQVVUSE9SSVRBVElWRSBwcm90ZWN0aW9uIGJlZm9yZSByZXBsYXkgYW5kIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbi4gYGF3YWl0UnVuUmVhZHlgIG9yZGVycyB0dXJibydzIGBydW5fc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBlaXRoZXIgc3RvcHBpbmcgYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaG9vayByZXN1bWVzIGFyZSBhZGRpdGlvbmFsbHkgcHJlLWNoZWNrZWQgYWJvdmUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBmYXN0IHBhdGg6IGEgbmV3IG1lc3NhZ2UncyBgaG9va0lucHV0LmRlcGxveW1lbnRJZGAgaXNcbiAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmVkIGFnYWluc3QgdGhlIGFtYmllbnQgZGVwbG95bWVudCBpZCBmb3IgZnJlZSwgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBvbmx5IGEgZGV0ZWN0ZWQgbWlzbWF0Y2ggZmV0Y2hlcyB0aGUgYXV0aG9yaXRhdGl2ZSBydW4sXG4gICAgICAgICAgICAgICAgICAvLyBzbyBhIG1pc3JvdXRlZCBtb2Rlcm4gcmVzdW1lIHJlLXJvdXRlcyB3aXRoIHplcm8gZXZlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcy4gT2xkZXIgbWVzc2FnZXMgKG5vIGBob29rSW5wdXQuZGVwbG95bWVudElkYCkgcmVhY2hcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYXN0IHBhdGgncyBpZGVtcG90ZW50IGhvb2tfcmVjZWl2ZWQgd3JpdGUgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIGd1YXJkOyB0aGF0IHdyaXRlIGNvbnZlcmdlcyBwZXIgKHJ1bklkLCByZXN1bWVJZCkgb24gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgZGVwbG95bWVudCwgc28gaXQgaXMgc2FmZSBidXQgaW5jdXJzIHRoZSB3cml0ZS4gRWl0aGVyXG4gICAgICAgICAgICAgICAgICAvLyB3YXkgdGhlIHJlLXJvdXRlZCBtZXNzYWdlIG11c3QgY2FycnkgYGhvb2tJbnB1dGAsIG9yIGFcbiAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB3aG9zZSBwcm9kdWNlciB3cml0ZSBoYWQgbm90IHlldCBsYW5kZWQgd291bGQgYmVcbiAgICAgICAgICAgICAgICAgIC8vIGxvc3QuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tJbnB1dCA/IHsgaG9va0lucHV0IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIHByZS1jaGVjayByZS1yb3V0ZSBhYm92ZTogZm9yd2FyZGVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCwgc28gdGhlIGV4dHJhIGhvcCBpcyBxdWV1ZSBkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihob29rUmVzdW1lVGltaW5nID8geyBob29rUmVzdW1lVGltaW5nIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXRSdW5SZWFkeVxuICAgICAgICAgICAgICAgICAgICApKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gTGVnYWN5IGxhenkgaG9vayByZXN1bWU6IGlkZW1wb3RlbnRseSBlbnN1cmUgdGhlIGV2ZW50IGZyb21cbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBwYXlsb2FkLWJlYXJpbmcgYGhvb2tJbnB1dGAgYmVmb3JlIHJlcGxheSwga2V5ZWQgYnlcbiAgICAgICAgICAgICAgICAgIC8vIGByZXN1bWVJZGAgc28gcmVkZWxpdmVyaWVzIGNvbnZlcmdlIG9uIGV4YWN0bHkgb25lIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgLy8gYGhvb2tJbnB1dGAgbmV2ZXIgcmlkZXMgYSB0dXJibyBmaXJzdC1kZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gKHRoYXQgcGF0aCBjYXJyaWVzIGBydW5JbnB1dGAsIG5vdCBgaG9va0lucHV0YCksIHNvIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcnVucyBvbiB0aGUgbm9ybWFsIGxvYWQtYW5kLXJlcGxheSBwYXRoLiBTa2lwcGVkXG4gICAgICAgICAgICAgICAgICAvLyBlbnRpcmVseSB3aGVuIHRoZSBmYXN0IHBhdGggYWJvdmUgYWxyZWFkeSBlbnN1cmVkIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgKGBob29rRW5zdXJlZGApLCBzdWNjZXNzZnVsbHkgb3IgdmlhIGl0cyBmYWxsYmFjayxcbiAgICAgICAgICAgICAgICAgIC8vIHdob3NlIHJ1bl9zdGFydGVkIHByZWxvYWQgd2FzIGxvYWRlZCBhZnRlciB0aGUgd3JpdGUgYW5kXG4gICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgYWxyZWFkeSBjb250YWlucyB0aGUgY2Fub25pY2FsIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgaWYgKGhvb2tJbnB1dCAmJiAhaG9va0Vuc3VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGVyZiAoT3B0aW9uIEEpOiBpZiB0aGUgcHJvZHVjZXIncyBjb25jdXJyZW50IGRpcmVjdFxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBhbHJlYWR5IGxhbmRlZCBpbiB0aGUgcnVuX3N0YXJ0ZWQgcHJlbG9hZCwgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbm9uaWNhbCBldmVudCBpcyBpbiB0aGUgbG9nIGFuZCB0aGUgcmUtZW5zdXJlIHJvdW5kIHRyaXBcbiAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHVyZSBvdmVyaGVhZC4gU2tpcCBpdCB3aGVuIHRoZSBwcmVsb2FkIGFscmVhZHkgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGBob29rX3JlY2VpdmVkYCB3aXRoIHRoaXMgcmVzdW1lJ3MgcGVyc2lzdGVkIGByZXN1bWVJZGBcbiAgICAgICAgICAgICAgICAgICAgLy8gKHVuaXF1ZSBwZXIgcmVzdW1lLCBzbyB3ZSBuZXZlciBza2lwIG9uIGFuIHVucmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkKS4gQmVzdC1lZmZvcnQ6IHRoZSB3aW4gbGFuZHMgb25seSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWNlcidzIHdyaXRlIGJlYXQgdGhpcyBjb25zdW1lcidzIGxvYWQ7IG90aGVyd2lzZSB3ZVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGlkZW1wb3RlbnQgcmUtZW5zdXJlIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVucmVhY2hhYmxlIGZvciBhdG9taWMgbGF6eSByZXN1bWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIChyZXN1bWVJZCArIGRpZ2VzdCk6IHRob3NlIHNldCBgaG9va0Vuc3VyZWRgIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBob2lzdGVkIGZhc3QgcGF0aCBhYm92ZSAob24gc3VjY2VzcyBBTkQgb24gaXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrKSwgc28gdGhpcyBibG9jayAoYW5kIHRoZSBza2lwIGNoZWNrKSBub3cgb25seVxuICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXMgaG9va0lucHV0IHNoYXBlcyB3aXRob3V0IHRoZSBmdWxsIGlkZW1wb3RlbmN5XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhaXIuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlQcmVsb2FkZWQgPVxuICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5yZXN1bWVJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ2xvYWRBbGwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlc3VtZUlkID09PSBob29rSW5wdXQucmVzdW1lSWRcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeVByZWxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGFscmVhZHkgdmlzaWJsZSBpbiB0aGUgcHJlbG9hZGVkIGxvZzogbm90aGluZyB0b1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBvciBzcGxpY2UuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGF0ZSB0aGUgbWF0ZXJpYWxpemVkIGV2ZW50IHRvIHdoZW4gdGhlIHJlc3VtZSBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9jY3VycmVkLCBub3Qgd2hlbiB0aGlzIHF1ZXVlIGRlbGl2ZXJ5IHJhbi4gYHJlc3VtZUlkYFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBVTElEIG1pbnRlZCBieSBgcmVzdW1lSG9vaygpYCBhdCByZXN1bWUgdGltZSwgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgZW1iZWRkZWQgdGltZXN0YW1wIGlzIHRoZSBob25lc3QgYG9jY3VycmVkQXRgIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIGxhdGVuY3kgYXR0cmlidXRpb24gb2ZmIHRoZSBxdWV1ZSByb3VuZCB0cmlwLiBBXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLVVMSUQgcmVzdW1lSWQgKGxlZ2FjeSAvIHRlc3QpIGxlYXZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCwgc28gdGhlIFdvcmxkIGZhbGxzIGJhY2sgdG8gYGNyZWF0ZWRBdGAuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoZGVjb2RlVGltZShob29rSW5wdXQucmVzdW1lSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuc3VyZWRFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZWQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va0lucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3VtZXItc2lkZSBjb21wbGV0aW9uIG9mIHRoZSByZWNvdmVyeSBwYXRoOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgbWF0ZXJpYWxpemVkIHRoZSBldmVudCBiZWNhdXNlIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgd3JpdGUgaGFkIG5vdCBsYW5kZWQgaW4gdGhlIHByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnQgKHdoZXRoZXIgdGhpcyBjYWxsIGNvbW1pdHRlZCBpdCBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyZ2VkIG9uIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgd3JpdGUpLCBzbyB3ZSBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbnRvIHRoZSBwcmVsb2FkZWQgbG9nIGluc3RlYWQgb2YgZGlzY2FyZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByZWxvYWQgKHNlZSBiZWxvdykuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgYGV2ZW50RGF0YWAgZnJvbSBgaG9va0lucHV0YCByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1c3RpbmcgdGhlIFBPU1QgcmVzcG9uc2UncyBwYXlsb2FkOiB3b3JsZC12ZXJjZWwgcG9zdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd2l0aCBgcmVtb3RlUmVmQmVoYXZpb3I6ICdsYXp5J2AsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgZXZlbnQncyBwYXlsb2FkIGlzIGEgUmVtb3RlUmVmICpkZXNjcmlwdG9yKiwgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VyaWFsaXplZCBieXRlcyByZXBsYXkgbmVlZHMuIGBob29rSW5wdXRgIGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWFsIHRva2VuICsgcGF5bG9hZCBieXRlcyAodGhleSByb2RlIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSksIHNvIHNwbGljZSB0aG9zZSBvbnRvIHRoZSByZXR1cm5lZCBldmVudCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFibGUgZXZlbnRJZC9tZXRhZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZS1lbnN1cmUgYWx3YXlzIHJldHVybnMgYSBgaG9va19yZWNlaXZlZGAgZXZlbnQsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3BsaWNlIGlzIHNhZmUuIFRoZSBjYXN0IGlzIG5lZWRlZCBiZWNhdXNlIHNwcmVhZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJhdyBgRXZlbnRgIHVuaW9uIGFuZCBvdmVycmlkaW5nIGBldmVudERhdGFgIGNvbGxhcHNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYSBub24tYGhvb2tfcmVjZWl2ZWRgIG1lbWJlciAod2hvc2UgYGV2ZW50RGF0YWAgaXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IHNoYXBlKTsgdGhlIG9iamVjdCBpcyBhIGdlbnVpbmUgYGhvb2tfcmVjZWl2ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBieSBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gZW5zdXJlZC5ldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZWRFdmVudCA9IGJhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0lucHV0LnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBob29rSW5wdXQucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBFdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG1hdGNoaW5nIGNvbmN1cnJlbnQgY2xhaW0gKHNhbWUgcmVzdW1lSWQgKyBkaWdlc3QpIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlZCBhcyBzdWNjZXNzIHNlcnZlci1zaWRlIGFuZCBuZXZlciB0aHJvd3MsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBjYXVnaHQgaGVyZSBpcyBhIGdlbnVpbmUgdGVybWluYWwgb3IgdHJhbnNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25kaXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBIb29rTm90Rm91bmQgLyBSdW5FeHBpcmVkOiB0aGUgcHJvZHVjZXIncyBkaXJlY3Qgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgYWxyZWFkeSBlbmRlZCB0aGlzIHJlc3VtZSdzIGVsaWdpYmlsaXR5ICh0aGUgcnVuIHdlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGVybWluYWwpLiBUaGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVzdW1lLCBzbyBjb25zdW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHRoZSBtZXNzYWdlIGFuZCBzdG9wLiBDb250aW51aW5nIHRvIHJlcGxheSB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB3YXN0ZWQgd29yayBhbmQsIHdvcnNlLCB3b3VsZCBhY2sgYSBkZWxpdmVyeSB0aGF0IG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjYXJyeSB0aGUgb25seSBjb3B5IG9mIHRoZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBFbnRpdHlDb25mbGljdCAoYW5kIGFueSBvdGhlciB1bmV4cGVjdGVkIGVycm9yKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlc3VtZUlkIGNvbnN0cmFpbnQgZXhpc3RzIGJ1dCB0aGUgbWF0Y2hpbmcgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90IHlldCBvYnNlcnZhYmxlOiB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCB3cml0ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzdGlsbCBpbiBmbGlnaHQsIG9yIGEgcmVkcml2ZSByYWNlZCB0aGUgY2xhaW0uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdHJhbnNpZW50OiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGF0dGVtcHQgY29udmVyZ2VzIG9uIHRoZSBjb21taXR0ZWQgZXZlbnQgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByZXBsYXlpbmcgKGFuZCBhY2tpbmcpIHdpdGhvdXQgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBwcmVsb2FkZWQgdGhlIGxvZyBCRUZPUkUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSwgc28gaXQgY2Fubm90IGluY2x1ZGUgdGhlIGhvb2tfcmVjZWl2ZWQuIFJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gZGlzY2FyZCB0aGUgcHJlbG9hZCAod2hpY2ggd291bGQgY29zdCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQgdHJpcCBvbiB0aGUgZmlyc3QgcmVwbGF5IGl0ZXJhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGluIHRoZSBjYW5vbmljYWwgZXZlbnQgcmVjb25zdHJ1Y3RlZCBhYm92ZS4gSXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGEgc3RhYmxlIGV2ZW50SWQsIHNvIGBpbnNlcnRFdmVudEJ5RXZlbnRJZGAga2VlcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbiBhc2NlbmRpbmcgZXZlbnRJZCBvcmRlciBhbmQgaXMgaWRlbXBvdGVudCBpZiBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCByZS1vYnNlcnZlcyBpdC4gT25seSB3aGVuIHRoZSBXb3JsZCByZXR1cm5zIG5vIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgZmFsbCBiYWNrIHRvIHJlbG9hZGluZyB0aGUgY29tcGxldGUgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiYgZW5zdXJlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRFdmVudEJ5RXZlbnRJZChldmVudExvZy5ldmVudHMsIGVuc3VyZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlUmVwbGF5RXZlbnQoZW5zdXJlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSAocmUtZW5zdXJlIG5lZWRlZClcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpdmUgVk0gcGFya2VkIGF0IHRoZSBwcmV2aW91cyBib3VuZGFyeSwgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHJldGVudGlvbiBkZWNpc2lvbiBrZXB0IGl0LiBudWxsIOKGkiB0aGlzIGl0ZXJhdGlvbiBjb2xkLVxuICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cy4gSW52b2NhdGlvbi1zY29wZWQ6IGRpZXMgd2l0aCB0aGlzIGRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgbGV0IHJldGFpbmVkU2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEhvb2tzIHdob3NlIGNyZWF0ZSB0aGlzIGludm9jYXRpb24gaGFzIGFscmVhZHkgYW5zd2VyZWQgYnlcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVpbmcgaW4gdGhpcyBwcm9jZXNzIGluc3RlYWQgb2YgcmUtaW52b2tpbmcg4oCUXG4gICAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZSBjcmVhdGUgY29tbWl0dGVkIHRoZSBgaG9va19jcmVhdGVkYCBhXG4gICAgICAgICAgICAgICAgICAvLyBgaG9vay5nZXRDb25mbGljdCgpYCB3YXMgcGFya2VkIG9uIG9yIHRoZSBgaG9va19jb25mbGljdGBcbiAgICAgICAgICAgICAgICAgIC8vIGEgY2xhaW1lZCB0b2tlbiBwcm9kdWNlZC4gT25lIHNldCwgYmVjYXVzZSBhIGhvb2sgdGFrZXNcbiAgICAgICAgICAgICAgICAgIC8vIG9uZSBvZiB0aG9zZSBvdXRjb21lcyBhbmQgbmV2ZXIgYm90aC5cbiAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAvLyBUcmFja2VkIGJ5IGhvb2ssIG5vdCBieSBjb3VudCwgYmVjYXVzZSBhIHJlcGVhdCBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTQU1FIGhvb2sgaXMgdGhlIG9ubHkgc2hhcGUgdGhhdCBjYW5ub3QgbWFrZSBwcm9ncmVzczogdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gaXMgcmVzb2x2ZWQgYnkgYW4gZXZlbnQgdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgY29tbWl0dGVkLCBzbyBhIHBhc3MgdGhhdCBjb21lcyBiYWNrIGFza2luZyBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIG9uZSByYW4gb3ZlciBhIGxvZyB0aGF0IHN0aWxsIGRpZCBub3QgaG9sZCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBldmVudCwgYW5kIGNvbnRpbnVpbmcgYWdhaW4gd291bGQgc3Bpbi4gQSBob29rIHRoYXQgaGFzXG4gICAgICAgICAgICAgICAgICAvLyBub3QgYmVlbiBzZWVuIGhlcmUgYmVmb3JlIGlzIGEgcGFzcyB0aGF0IGdvdCBzb21ld2hlcmUsIHNvXG4gICAgICAgICAgICAgICAgICAvLyBhIHdvcmtmbG93IGNyZWF0aW5nIG9uZSBzdWNoIGhvb2sgYWZ0ZXIgYW5vdGhlciBrZWVwc1xuICAgICAgICAgICAgICAgICAgLy8gY29udGludWluZyBpbi1wcm9jZXNzIGZvciBlYWNoLlxuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGludWVkSG9va0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBTdGVwcyBUSElTIGRlbGl2ZXJ5IGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCBhXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwLWV4ZWN1dGlvbiBtZXNzYWdlIGZvciwgYWNyb3NzIGl0cyByZXBsYXkgcGFzc2VzOlxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHN1c3BlbnNpb24gaGFuZGxlcidzIHJlc2lsaWVudCBwdWJsaXNoZXNcbiAgICAgICAgICAgICAgICAgIC8vIChgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzYCkgcGx1cyB0aGUgZGlzcGF0Y2ggcGFzcydzXG4gICAgICAgICAgICAgICAgICAvLyBvd24gaW1tZWRpYXRlIGVucXVldWVzLiBBIGZhbi1vdXQgdGhhdCBydW5zIHNvbWUgc3RlcHNcbiAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBmYWxscyBiYWNrIGludG8gdGhpcyBsb29wIG9uY2UgdGhleSBmaW5pc2gsXG4gICAgICAgICAgICAgICAgICAvLyByZWxvYWRzIHRoZSBsb2csIGFuZCBmaW5kcyB0aGUgcXVldWVkIHNpYmxpbmdzIHN0aWxsXG4gICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nOyB3aXRob3V0IHRoaXMgc2V0IHRoZSBuZXh0IGRpc3BhdGNoIHBhc3Mgc2VuZHNcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IG9uZSBvZiB0aGVpciBtZXNzYWdlcyBhZ2Fpbi4gVGhlIHF1ZXVlIGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgIC8vIHRoZW0gYnkgaWRlbXBvdGVuY3kga2V5LCBidXQgZWFjaCByZWR1bmRhbnQgc2VuZCBzdGlsbFxuICAgICAgICAgICAgICAgICAgLy8gY29zdHMgYSByb3VuZC10cmlwIG9uIHRoZSBzaGFyZWQgY29ubmVjdGlvbiBwb29sIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gaG9sZHMgdGhlIGludm9jYXRpb24gb3BlbiBwYXN0IGl0cyB1c2VmdWwgd29ya1xuICAgICAgICAgICAgICAgICAgLy8gKG1lYXN1cmVkOiAxOS0yOCByZS1zZW5kcyBwZXIgcGFzcyBvbiBhIDMyLWJyYW5jaFxuICAgICAgICAgICAgICAgICAgLy8gZmFuLW91dCwgfjQwMCBtcyBhZnRlciB0aGUgb3JpZ2luYWxzKS5cbiAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgaW52b2NhdGlvbi1zY29wZWQsIG5ldmVyIGRlcml2ZWQgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGxvZzogYSBgc3RlcF9jcmVhdGVkYCBpbiB0aGUgbG9nIHByb3ZlcyB0aGUgc3RlcCB3YXNcbiAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIG5vdCB0aGF0IGl0cyBtZXNzYWdlIHdhcyBldmVyIHNlbnQgKHRoZVxuICAgICAgICAgICAgICAgICAgLy8gcHVibGlzaGVyIG1heSBoYXZlIGNyYXNoZWQgYmV0d2VlbiB0aGUgdHdvKS4gU28gYVxuICAgICAgICAgICAgICAgICAgLy8gRElGRkVSRU5UIGludm9jYXRpb24gKGNyYXNoLXJlY292ZXJ5IHJlZGVsaXZlcnksIGFcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgd2FrZSkgcmUtZW5xdWV1ZXMgdW5jb25kaXRpb25hbGx5LCBleGFjdGx5XG4gICAgICAgICAgICAgICAgICAvLyBhcyBiZWZvcmUsIGFuZCBvbmx5IGtub3dsZWRnZSBvZiB0aGlzIHByb2Nlc3MncyBvd25cbiAgICAgICAgICAgICAgICAgIC8vIHNlbmRzIGlzIHVzZWQgdG8gc2tpcC4gRGllcyB3aXRoIHRoaXMgZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICBjb25zdCBwdWJsaXNoZWRTdGVwQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTWFpbiByZXBsYXkgbG9vcFxuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbisrO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheS1idWRnZXQgY2hlY2s6IGJhaWwgb3V0IChyZXRyeSBvciBmYWlsKSBpZlxuICAgICAgICAgICAgICAgICAgICAvLyBub24tc3RlcCB0aW1lIHdpdGhpbiB0aGlzIGludm9jYXRpb24gaGFzIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmVkIGJ1ZGdldC4gU3RlcCBib2RpZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVwbGF5QnVkZ2V0LnBhdXNlKCkvcmVzdW1lKCkgYnJhY2tldCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBgZXhlY3V0ZVN0ZXBgIGNhbGwuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYXlCdWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdE1zOiByZXBsYXlCdWRnZXQuY29uZmlndXJlZExpbWl0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzbG90U25hcHNob3Q6IHNsb3RTbmFwc2hvdCgpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIHRlcm1pbmFsIGF0dGVtcHQgcmV0dXJucywgYWZ0ZXIgcnVuX2ZhaWxlZCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmFibGUuIEVhcmxpZXIgYXR0ZW1wdHMgcmVqZWN0IGZvciBxdWV1ZSByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRpbWVvdXQgYmVmb3JlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUgPj1cbiAgICAgICAgICAgICAgICAgICAgICBub0lubGluZVJlcGxheUFmdGVyTXNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGV0aGVyIHRoaXMgcGFzcyB3YXMgc2VydmVkIGJ5IGEgcmV0YWluZWQgVk0gc2Vzc2lvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGF0IHRoZSByZXN1bWUvcmVwbGF5IGRlY2lzaW9uIGJlbG93LCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gYHJldGFpbmVkU2Vzc2lvbmAgaXMgcmVhc3NpZ25lZCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VydmVkQnlSZXRhaW5lZFNlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0gUXVpY2tKUyBWTSBlbmdpbmUgZGlzcGF0Y2ggLS0tXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFF1aWNrSlMgZW5naW5lIChvcHQtaW4gdmlhIFdPUktGTE9XX1ZNPXF1aWNranNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvciBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm0pIGlzIGEgc2VsZi1jb250YWluZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbHRlcm5hdGl2ZSB0byB0aGUgbm9kZTp2bSBpbmxpbmUtcmVwbGF5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGZ1bGwgZXZlbnQgcmVwbGF5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSB3b3JrZmxvdyBjb2RlIGluIGEgUXVpY2tKUyBXQVNNIFZNLCBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyB2aWEgdGhlIHNhbWUgY29tYmluZWQgcm91dGUgKHNvIHRoZXkgaGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXAgYmVsb3cgb24gcmUtZW50cnkpLCBhbmQgbWFuYWdlcyBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQgbGlmZWN5Y2xlIGZvciB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWVzLiBXaGVuIHRoZSBRdWlja0pTIGVuZ2luZSBpcyBpbiBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGRpc3BhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IElOU0lERSB0aGlzIHRyeTogZW5naW5lIGZhaWx1cmVzIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGUgdGhlIGVudHJ5cG9pbnQgKE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBXQVNNIE9PTSBhdCB0aGUgbWVtb3J5IGNlaWxpbmcsIGEgYnVuZGxlLWV2YWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlKSBtdXN0IHJlYWNoIHRoaXMgbG9vcCdzIGNhdGNoIHNvIHRoZXkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NpZmllZCBhbmQgcmVjb3JkZWQgYXMgcnVuX2ZhaWxlZDogb3V0c2lkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdGhleSB3b3VsZCBuYWNrIHRoZSBtZXNzYWdlIGFuZCBidXJuIGFsbCBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcyBiZWZvcmUgZHlpbmcgYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBNQVhfREVMSVZFUklFU19FWENFRURFRC4gVHJhbnNpZW50IHdvcmxkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJldGhyb3cgb3V0IG9mIHRoZSBjYXRjaCBmb3IgcmVkZWxpdmVyeSwgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIG5vZGUtZW5naW5lIHJlcGxheSBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUXVpY2tKU1ZtKHdvcmtmbG93UnVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnVXNpbmcgUXVpY2tKUyBWTSBlbmdpbmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFF1aWNrSlMgZW50cnlwb2ludCBmZXRjaGVzIHRoZSBldmVudCBsb2cgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgZXZlbnRzIGRpcmVjdGx5LCBzbyB3YWl0IGZvciB0aGUgcnVuIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmx5IHN0YXJ0ZWQgZmlyc3Q6IGl0IGRvZXMgbm90IHRocmVhZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHJ1blJlYWR5QmFycmllciB0aGUgd2F5IGhhbmRsZVN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBZnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkLCBldmVudExvZy5jdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbXBvcnQ6IHRoZSBRdWlja0pTIGVudHJ5cG9pbnQncyBpbXBvcnQgY2hhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkcyB0aGUgYmFzZTY0IFdBU00gYmluYXJ5ICsgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH4xLjMgTUIgZGVjb2RlZCBhdCBtb2R1bGUgc2NvcGUpLiBMb2FkaW5nIGl0IGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoYXQgb3V0IG9mIG5vZGUtZW5naW5lIGRlcGxveW1lbnRzIGVudGlyZWx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb25seSB0aGUgb3B0LWluIHBhdGggcGF5cywgb24gZmlyc3QgZGlzcGF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJ1bldvcmtmbG93V2l0aFF1aWNrSlMgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJy4vcnVudGltZS9xdWlja2pzLWVudHJ5cG9pbnQuanMnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVpY2tqc1Jlc3VsdCA9IGF3YWl0IHJ1bldvcmtmbG93V2l0aFF1aWNrSlMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAncmVhZHknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlOiBldmVudExvZy50eXBlID09PSAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVyZSB0aGF0IGxvZyB3YXMgcmVhZCB0bywgc28gdGhlIGVuZ2luZSByZWFkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkIGZyb20gaXQgYW5kIGNhbiBhc2sgZm9yIGFuIGlubGluZSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZ2FpbnN0IGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRDdXJzb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U3Bhbjogc3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0cyB0aGUgZW50cnlwb2ludCByZWNvZ25pemUgaXRzZWxmIGFzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gZm9yIGEgc3BlY2lmaWMgd2FpdCwgc28gYSBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFycml2ZXMgYmVmb3JlIGl0cyB3YWl0IGVsYXBzZXMgcmUtYXJtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIGZyZXNoIGtleSBpbnN0ZWFkIG9mIGxvc2luZyB0aGUgdGltZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRDb250aW51YXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1zdGVwIG93bmVyc2hpcCBwbHVtYmluZzogcmVkZWxpdmVyaWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBkcml2ZSBjcmFzaCByZWNvdmVyeSBmb3Igc3RlcHMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFybGllciBpbnZvY2F0aW9uIGNsYWltZWQgaW5saW5lIChzZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wIHBhc3MgaW4gdGhlIGVudHJ5cG9pbnQncyBsb29wKSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGlkIGlzIHN0YW1wZWQgYXMgYG93bmVyTWVzc2FnZUlkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXIgdG8gdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWlja2pzUmVzdWx0Py50aW1lb3V0U2Vjb25kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBgcmVpbnZva2VgIHJhdGhlciB0aGFuIHJldHVybmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCBkaXJlY3RseTogdW5kZXIgdHVyYm8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAgYW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2hlZHVsZSB3b3VsZCByZS1lbmdhZ2UgdHVyYm8gb24gcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocmVwbGF5aW5nIGFnYWluc3QgYSBzdGFsZSBwcmVsb2FkZWQgbG9nIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWRnaW5nIHRoZSBydW4sIHNlZSB0aGUgcmVpbnZva2UoKSBkb2NzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlKS4gcmVpbnZva2UgZW5xdWV1ZXMgYW4gZXhwbGljaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIHdpdGhvdXQgYHJ1bklucHV0YCBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZShxdWlja2pzUmVzdWx0LnRpbWVvdXRTZWNvbmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywgcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcmVjb25kaXRpb25SZXN0YXJ0UmVsb2FkKGV2ZW50TG9nLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3QgY29uY3VycmVudCBjb21wbGV0aW9uIHZpYSB0aGUgZXZlbnQgbG9nOiBpZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBvdGhlciBoYW5kbGVyIHdyb3RlIGEgdGVybWluYWwgcnVuIGV2ZW50LCBleGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGRvaW5nIHJlcGxheSB3b3JrLiBUaGUgcnVuIGVudGl0eSdzIHN0YXR1cyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSB0aGVzZSBldmVudHMsIHNvIGNoZWNraW5nIHRoZSBsb2cgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVzIHVzIHRoZSBzYW1lIHNpZ25hbCBhcyBhIHJ1bnMuZ2V0KCkgcm91bmQtdHJpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIGV4dHJhIHJlcXVlc3QgcGVyIGxvb3AgaXRlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRMb2cuZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0ZSBlbGFwc2VkIHdhaXRzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdHNUb0NvbXBsZXRlID0gZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApOiBlIGlzIEV4dHJhY3Q8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBldmVudFR5cGU6ICd3YWl0X2NyZWF0ZWQnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPiAmIHsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvcnJlbGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93ID49IChlLmV2ZW50RGF0YS5yZXN1bWVBdCBhcyBEYXRlKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBlLmV2ZW50RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd2FpdEV2ZW50IG9mIHdhaXRzVG9Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZUV2ZW50KHdhaXRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1bXAtYW5kLXJlcG9ydDogZm9sZCB3aGF0IHRoaXMgd3JpdGUgc2tpcHBlZCBvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gdGhlIGxvZywgd2hpY2ggaXMgd2hhdCBgY3JlYXRlRXZlbnRgIHJlYWRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90IHNuYXBzaG90IG9mZiwgc28gZWFjaCByZW1haW5pbmcgd2FpdCBhc2tzIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHNsb3QgYWJvdmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0cnVuY2F0ZWQgY2FzZSBtYXR0ZXJzIHR3aWNlIG92ZXIgaGVyZS4gQmV5b25kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBhY2NvdW50aW5nIGBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVqZWN0cyBpdCBmb3IsIHRoZSBtaXNzaW5nLWNvbXBsZXRpb24gY2hlY2sgYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjaWRlcyBmcm9tIHRoaXMgbG9nIHdoZXRoZXIgdGhlIGhhbmRsZXIgc3RpbGwgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGZldGNoLCBzbyBhIHBhcnRpYWwgcGFnZSB3b3VsZCBtYWtlIHRoZSBsb2cgbG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIGl0IGhvbGRzIGEgY29tcGxldGlvbiB3aG9zZSBwYWdlIGlzIHVucmVhZCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgZmV0Y2ggb24gYSBzbmFwc2hvdCBzaG9ydCBvZiB0aGUgV29ybGQncy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQoZXZlbnRMb2cuZXZlbnRzLCBjcmVhdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhaXQgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZXZlbnQgbGlzdCBhYm92ZSBtYXkgYmUgc3RhbGUgYnkgdGhlIHRpbWUgYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgaXMgY29tbWl0dGVkLCBhbmQgdGhpcyByZXBsYXkgaGFzIHRvIHNlZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24gd2FpdF9jb21wbGV0ZWQgYmVmb3JlIGl0IGNhbiBhZHZhbmNlIHBhc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2xlZXAuIEVhY2ggd3JpdGUgYXNrZWQgdGhlIFdvcmxkIGZvciB0aGUgZGVsdGEgc2luY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdXIgY3Vyc29yIGFuZCBmb2xkZWQgaXQgaW4gKHNlZSBjcmVhdGVFdmVudCksIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nIFdvcmxkIGhhcyBhbHJlYWR5IGhhbmRlZCB0aG9zZSBldmVudHMgYmFja1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gZG8uIE9ubHkgZmV0Y2ggZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpb25zIHN0aWxsIG1pc3NpbmcgbG9jYWxseTogYSBXb3JsZCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlcyBgc2luY2VDdXJzb3JgLCBhIHRydW5jYXRlZCBkZWx0YSwgYSBjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWJzb3JiIHRoYXQgbG9zdCB0aGUgY3Vyc29yIHJhY2UsIG9yIGFuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciwgd2hvc2UgcmVqZWN0aW9uIGNhcnJpZXMgbm8gZGVsdGEuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkc0FmdGVyV3JpdGVzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWlzc2luZ1dhaXRDb21wbGV0aW9ucyA9IHdhaXRzVG9Db21wbGV0ZS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAod2FpdEV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGxldGVkV2FpdElkc0FmdGVyV3JpdGVzLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXNzaW5nV2FpdENvbXBsZXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgb25seSBldmVudHMgYWZ0ZXIgdGhlIG9yaWdpbmFsIHNuYXBzaG90IGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gY29uY3VycmVudCBkdXJhYmxlIGV2ZW50cywgc3VjaCBhcyBob29rX3JlY2VpdmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0aGVpciBvcmRlcmluZyByZWxhdGl2ZSB0byB3YWl0X2NvbXBsZXRlZC4gRmFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBhIGZ1bGwgcmVsb2FkIGZvciBvbGRlciB3b3JsZHMgdGhhdCBjYW5ub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgdXMgYSBzdGFibGUgY3Vyc29yLCBvciBpZiB0aGUgY3Vyc29yIGRlbHRhIGRvZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbmNsdWRlIHRoZSB3YWl0IGNvbXBsZXRpb24gdGhpcyBoYW5kbGVyIGp1c3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy5jdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhd0FsbFdhaXRDb21wbGV0aW9ucyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1dhaXRDb21wbGV0aW9ucy5ldmVyeSgod2FpdEV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdBbGxXYWl0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywgcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcmVwbGF5IHJlYWRzIHRoZSBsb2cgYXMgdGhlIGNvbXBsZXRlIHJlY29yZCBvZiB3aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGhhcHBlbmVkLCBzbyBhIHBvc2l0aW9uIG5vdGhpbmcgb2NjdXBpZXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGV2ZW50IHRoYXQgbmV2ZXIgb2NjdXJyZWQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJyYW5jaCBpdCB3b3VsZCBoYXZlIGRlY2lkZWQgZ2V0cyBkZWNpZGVkIHRoZSBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdheS4gRmFpbGluZyBoZXJlIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBydW4gdGhhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydHMgaXRzIG93biBjb3JydXB0aW9uIGFuZCBvbmUgdGhhdCBzaWxlbnRseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybnMgdGhlIHdyb25nIGFuc3dlci5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEEgaG9sZSB0aGF0IGlzIG1lcmVseSBhIHdyaXRlIG1pZC1jb21taXQgZmlsbHMgaW4gb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgb3duLCBzbyBzZXR0bGVFdmVudFNsb3RHYXAgcmUtcmVhZHMgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29uY2x1ZGluZywgYW5kIGFkb3B0cyB3aGljaGV2ZXIgbG9nIGl0IHNldHRsZWQgb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2xvdEdhcENoZWNrRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgc2V0dGxlRXZlbnRTbG90R2FwKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IGV2ZW50TG9nLmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnNldHRsZWQubG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0bGVkLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBsb2cgZm9yIHJ1biAke3J1bklkfSBoYXMgYSBob2xlIGF0IHNsb3QgJHtzZXR0bGVkLmdhcC5maXJzdE1pc3NpbmdTbG90fTogJHtzZXR0bGVkLmdhcC5taXNzaW5nQ291bnR9IG9mIHRoZSAke3NldHRsZWQuZ2FwLm1heFNsb3R9IHNsb3RzIHVwIHRvIHRoZSBsb2cncyBtYXhpbXVtIGhvbGQgbm8gZXZlbnQuYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRpbmcgZWxhcHNlZCB3YWl0cyByZWZyZXNoZXMgdGhlIGV2ZW50IHNuYXBzaG90LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIG1heSBoYXZlIHdyaXR0ZW4gdGhlIHRlcm1pbmFsIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGFmdGVyIHRoZSBpbml0aWFsIHNuYXBzaG90IGJ1dCBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gT25jZSB0aGUgZXZlbnQgbG9nIHJlY29yZHMgdGhhdCBvdXRjb21lLCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgaXMgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50TG9nLmV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQtbGltaXQgZ3VhcmQ6IGZhaWwgYSBydW5hd2F5IHJ1biBvbmNlIGl0cyBsb2dcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGVzIHRoZSBzZXJ2ZXItc3VwcGxpZWQgY2VpbGluZyAodW5kZWZpbmVkIOKHkiBub1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZm9yY2VtZW50KS4gVGhlIHRocm93IGlzIGNhdWdodCBiZWxvdyBhbmQgd3JpdHRlbiBhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9mYWlsZWQgLyBNQVhfRVZFTlRTX0VYQ0VFREVELlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFNlYWxlZC1sb2cgbm9vcHMgYXJlIGV4Y2x1ZGVkOiB0aGUgY2VpbGluZyBleGlzdHMgdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIGEgcnVuYXdheSBXT1JLRkxPVywgYW5kIGEgbm9vcCBpcyB3cml0dGVuIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgdG8gc2VhbCBhIHBvc2l0aW9uIHdob3NlIHdyaXRlciBkaWVkLiBDb3VudGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gd291bGQgc3BlbmQgdGhlIHVzZXIncyBldmVudCBidWRnZXQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCdzIGJvb2trZWVwaW5nLCBhbmQgd291bGQgbWFrZSB0aGUgbGltaXQgYSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBoaXRzIGRlcGVuZCBvbiBob3cgbXVjaCB3cml0ZSBjb250ZW50aW9uIGl0IGhhcHBlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2VlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZmxvd0V2ZW50Q291bnQgPSBldmVudExvZy5ldmVudHMucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAobiwgZSkgPT4gKGlzU2VhbGVkTm9vcEV2ZW50KGUpID8gbiA6IG4gKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd0V2ZW50Q291bnQgPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dFdmVudENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGp1ZGdlIFRURlMgZWxpZ2liaWxpdHkgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgZmlyc3Qgc25hcHNob3QuIFdhaXRzIGNvbXBsZXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGFscmVhZHkgZGlzcXVhbGlmeSB2aWEgdGhlIGV2ZW50LXR5cGUgY2hlY2ssIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGluZyBhZnRlciB0aGUgd2FpdCBwYXNzIGlzIGVxdWl2YWxlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBwcmUtc3RlcCBhdHRyX3NldCwgYW5kIHRoZSBkZXRvdXIgaXQgbWFya3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdWJ0cmFjdGVkIHZpYSBwcmVTdGVwQXR0clN0YXJ0TXMgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm9vcCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiBhdHRyX3NldCBpczogaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgZXZpZGVuY2UgdGhlIHJ1biBoYWQgYWxyZWFkeSBtYWRlIHByb2dyZXNzLiBBXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2VhbCBzYXlzIGEgY29uY3VycmVudCB3cml0ZXIgZGllZCwgd2hpY2ggc2F5cyBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdXQgdGhpcyBpbnZvY2F0aW9uLCBhbmQgZXhjbHVkaW5nIGl0IHdvdWxkIHNpbGVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBldmVyeSBjb250ZW5kZWQgcnVuIG91dCBvZiB0aGUgVFRGUyBkYXRhc2V0IC0tXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhhY3RseSB0aGUgcnVucyB3b3J0aCBtZWFzdXJpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA/Pz0gZXZlbnRMb2cuZXZlbnRzLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VhbGVkTm9vcEV2ZW50KGUpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHdvcmtmbG93IGV4ZWN1dGlvbicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50TG9nLmV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Nb2RlOiByZXRhaW5lZFNlc3Npb24gPyAncmV0YWluZWQnIDogJ3JlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRUUiBUMy4gYD8/PWAgc28gaXQgbWFya3MgdGhlIEZJUlNUIHJlcGxheSBwYXNzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpbnZvY2F0aW9uOiBhIHJlc3VtZSB0aGF0IG5lZWRzIG1vcmUgdGhhbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRvIHJlYWNoIGl0cyBzdGVwIChlLmcuIGEgcHJlLXN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc2V0QXR0cmlidXRlc2AgZGV0b3VyKSByZXBvcnRzIHRoZSBleHRyYSBwYXNzZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYHJlcGxheWAsIGtlZXBpbmcgdGhlIHBoYXNlcyBhZGRpdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnJlcGxheVN0YXJ0ZWRBdE1zID8/PSByZXBsYXlTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXZlcnkgbWlzc2luZyBkZWNyeXB0L2RlY29tcHJlc3Mgb3BlcmF0aW9uIHVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgKGFscmVhZHktcHJlcGFyZWQgcGF5bG9hZHMgYXJlIHNraXBwZWQpLiBXZWJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDcnlwdG8gd29yayBvdmVybGFwcyBWTSBzZXR1cCBvbiB0aGUgcmVwbGF5IHBhdGggYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcGVuZGVkIGV2ZW50cycgY29uc3VtcHRpb24gb24gdGhlIHJlc3VtZSBwYXRoO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWVycyBzdGlsbCBkZXNlcmlhbGl6ZSBhbmQgcmVzb2x2ZSBpbiBldmVudCBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlQYXlsb2FkQ2FjaGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSZXBsYXlQYXlsb2FkQ2FjaGUod29ya2Zsb3dSdW4pO1xuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdOb2RlIHdvcmtmbG93IHJlcGxheSByZXF1aXJlcyBwYXlsb2FkIHByZXBhcmF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZFByZXdhcm0gPSByZXBsYXlQYXlsb2FkQ2FjaGUucHJld2FybShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSZXN1bHQ6IFdvcmtmbG93UmVzdW1lUmVzdWx0ID0gcmV0YWluZWRTZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHJlc3VtZVdvcmtmbG93KHJldGFpbmVkU2Vzc2lvbiwgZXZlbnRMb2cuZXZlbnRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSByZXRhaW5lZCByZXN1bWUgY2FuIHN0aWxsIHJlcG9ydCBiYWNrIGB7IHR5cGU6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gJ3JlcGxheScgfWAgKGludGVybmFsIGNhY2hlIG1pc3MpLCBpbiB3aGljaCBjYXNlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIGZhbGxzIHRocm91Z2ggdG8gYSBmdWxsIHJlcGxheSBiZWxvdyBhbmQgaXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYSByZXRhaW5lZCBwYXNzLiBUaGUgYHdvcmtmbG93LnJ1bmAgc3BhbiBjYW5ub3Qgc2F5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpczogaXQgaXMgdGFnZ2VkIGByZXRhaW5lZGAgd2hlbiBpdCBvcGVucywgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3VtZSByZXN1bHQgaXMga25vd24uXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVkQnlSZXRhaW5lZFNlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1Jlc3VsdC50eXBlICE9PSAncmVwbGF5JztcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAncmVwbGF5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkID0gc3RhcnRXb3JrZmxvd0NvbXBpbGUod29ya2Zsb3dSdW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vZGUgd29ya2Zsb3cgcmVwbGF5IHJlcXVpcmVzIGNvbXBpbGVkIHNjcmlwdHMnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSZXN1bHQgPSBhd2FpdCByZXBsYXlXb3JrZmxvdyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5OiBhd2FpdCBlbmNyeXB0aW9uS2V5LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkV29ya2Zsb3dTY3JpcHRzOiBhd2FpdCBjb21waWxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IHRoZSBlbmQtb2YtcnVuIGRyYWluIGluc2lkZSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24gY29tbWl0cyBmaXJlLWFuZC1mb3JnZXQgYCpfY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIGJlZm9yZSB0aGUgdGVybWluYWwgYGF3YWl0UnVuUmVhZHkoKWAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDYXBhYmlsaXRpZXM6IHdvcmxkLmNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwYXlsb2FkUHJld2FybTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAnc3VzcGVuZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyayB0aGUgbGl2ZSBzZXNzaW9uOyB0aGUgc3VzcGVuc2lvbiBjYXRjaCBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgdGhlIG9uZSByZXRlbnRpb24gZGVjaXNpb246IGtlZXAgaXQgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpdGVyYXRpb24gb3IgZGlzY2FyZCBpdCBmb3IgYSBmcmVzaCByZXBsYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSB3b3JrZmxvd1Jlc3VsdC5zZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgd29ya2Zsb3dSZXN1bHQuc3VzcGVuc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB3b3JrZmxvd1Jlc3VsdC5vdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Nb2RlOiByZXRhaW5lZFNlc3Npb24gPyAncmV0YWluZWQnIDogJ3JlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgY29tcGxldGVkLiBEbyBOT1QgcmVsb2FkLWFuZC1yZXRyeSB0aGUgY3JlYXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW4gcGxhY2U6IGByZXN1bHRgIHdhcyBjb21wdXRlZCBieSB0aGlzIHJlcGxheSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlICg0MTIpIHJlamVjdGlvbiBtdXN0IGZvcmNlIGEgKmZyZXNoIHJlcGxheSogKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IG9ic2VydmUgdGhlIG5ldyBldmVudCBhbmQgcHJvZHVjZSBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCksIG5vdCByZS1jb21taXQgdGhlIHN0YWxlIHJlc3VsdC4gVGhlIGNhdGNoIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydHMgdGhlIHJlcGxheSBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYSB3b3JrZmxvdyB0aGF0IGZpbmlzaGVzIHdpdGggbm8gc3RlcHMgcmVhY2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBiZWZvcmUgdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZDsgb3JkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBhZnRlciBpdCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBvdXRwdXQ6IHJlc3VsdCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbm91cyB3b3JrZmxvdy1leGVjdXRpb24gZHVyYXRpb24gZm9yIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gb25seTogYW5jaG9ycyB0aGUgYGZpbmFsU2NoZWR1bGluZ1JlcGxheWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbGVtZXRyeSBmaWVsZCBiZWxvdyAoc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zKS4gVGhpcyBpcyB0aGUgRklOQUxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBwYXNzLCB0aGUgb25lIHRoYXQgcmVhY2hlZCBhbmQgc2NoZWR1bGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcDogdmFsaWQgcnNmcyBwYXRocyBjYW4gcmVwbGF5IG1vcmUgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGUuZy4gYSB3b3JrZmxvdy1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXIgcmVwbGF5cyB0d2ljZSksIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJ5IG9taXRzIGVhcmxpZXIgaW52b2NhdGlvbnMnIHJlcGxheSB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpcmVseS4gVGhpcyB2YWx1ZSBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aG9zZSBlYXJsaWVyIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmUgcmVhZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgcnNmc1wiOiByc2ZzIGNvdmVycyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob2xlIHJ1bl9zdGFydGVkLXRvLWZpcnN0LXN0ZXAgd2luZG93O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxTY2hlZHVsaW5nUmVwbGF5IGNvdmVycyBvbmx5IHRoaXMgbGFzdCBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZWQgaGVyZSwgYmVmb3JlIGBoYW5kbGVTdXNwZW5zaW9uYCdzIGF3YWl0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkvTywgc28gaXQgZXhjbHVkZXMgdGhhdCBJL08uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkdXBsaWNhdGVzIHdoYXQgT1RFTCBhbHJlYWR5IGNhcHR1cmVzIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuL2ludm9jYXRpb24gc3BhbiwgYnV0IGlzIGNvbGxlY3RlZCBhcyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbGVtZXRyeSBzbyB0aGUgc2VydmVyIGNhbiBlbWl0IGl0IGFzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVTlNBTVBMRUQsIGZ1bGwtcG9wdWxhdGlvbiBtZXRyaWM6IHdvcmtmbG93LXNlcnZlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgc3BhbnMgYXJlIGhlYXZpbHkgc2FtcGxlZCBpbiBwcm9kdWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAofjclKSwgYW5kIGNsaWVudCBzcGFucyBjYW4ndCBiZSBmaWx0ZXJlZCBieSBTREtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24sIHNvIG5laXRoZXIgY2FuIHNlcnZlIGFzIHRoZSBkYXNoYm9hcmQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhY3QgVFRGUyBkZWNvbXBvc2l0aW9uLiBPbiBhIHJldGFpbmVkLVZNXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgdGhpcyBtZWFzdXJlcyB0aGUgcmVzdW1lICh0eXBpY2FsbHkgfjBtcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSByZXBsYXksIHNvIHRoZSBmaWVsZCdzIGRpc3RyaWJ1dGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmltb2RhbCBvbmNlIHJldGVudGlvbiBpcyBhY3RpdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5kZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUR1cmF0aW9uTXMgPSBzdXNwZW5kZWRBdE1zIC0gcmVwbGF5U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUVFIgVDQ6IHRoZSBuZXh0IGR1cmFibGUgc3RlcCBoYXMgYmVlbiBlbmNvdW50ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhdGVkIG9uIHRoZSBzdXNwZW5zaW9uIGFjdHVhbGx5IHNjaGVkdWxpbmcgc3RlcHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN1c3BlbnNpb24gdGhhdCBvbmx5IGNyZWF0ZXMgaG9va3Mvd2FpdHMgaGFzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlZCBhIHN0ZXAsIGFuZCBhIGxhdGVyIHBhc3MgbWF5LiBUYWtlbiBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBpbnN0YW50IGFzIGByZXBsYXlEdXJhdGlvbk1zYCBzbyBUNCBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHByZWNlZGUgVDMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcgJiYgZXJyLnN0ZXBDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcubmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXMgPz89XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkQXRNcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IHN1c3BlbmRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va3M6IGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzOiBlcnIud2FpdENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoc3VzcGVuc2lvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBWMjogaGFuZGxlIHN1c3BlbnNpb24gd2l0aG91dCBxdWV1aW5nIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWFjaCBldmVudCBjcmVhdGlvbiBpbnNpZGUgaGFuZGxlU3VzcGVuc2lvbiBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlY29uZGl0aW9uIHNuYXBzaG90IG9mIHRoZSBsb2FkZWQgZXZlbnQgbG9nLCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZW5kIGhvbGRpbmcgYW4gZXZlbnQgdGhpcyByZXBsYXkgbmV2ZXIgc2F3IHJlamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3cml0ZSAoNDEyKSBpbnN0ZWFkIG9mIGFjY2VwdGluZyBhIGRpdmVyZ2VudCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVqZWN0aW9uIGlzIGhhbmRsZWQgaGVyZSwgYnkgcmVzdGFydGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSwgbmV2ZXIgYnkgcmUtcG9zdGluZyB0aGUgc2FtZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBzdXNwZW5kZWQgYmVmb3JlIGl0cyBldmVudCBsb2cgd2FzIGxvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VzcGVuc2lvblJlc3VsdDogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgaGFuZGxlU3VzcGVuc2lvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgID47XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0ID0gYXdhaXQgaGFuZGxlU3VzcGVuc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbjogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGxldHMgZWxpZ2libGUgbmV3bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHN0ZXBzIHB1Ymxpc2ggdGhlaXIgc3RlcC1leGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIChjYXJyeWluZyBgc3RlcElucHV0YCkgaW4gcGFyYWxsZWwgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUuIFN0ZXBzIHF1ZXVlZCB0aGVyZSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBiYWNrIGluIGBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHNgIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQgYnkgdGhlIGRpc3BhdGNoIHBhc3MgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERpc3BhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU5hbWU6IGdldFdvcmtmbG93UXVldWVOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYWNlQ2FycmllcjogbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBwcmUtY2xhaW1zOiBsZXRzIHRoZSBiYXRjaGVkIGZhbi1vdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xkIHRoZSBsYXp5LWlubGluZSBzdGVwcycgc3RlcF9jcmVhdGVkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgcGFpcnMgKHN0YW1wZWQgd2l0aCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSdzIG93bmVyc2hpcCkgaW50byB0aGUgb25lIGNvbW1pdCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYm9kaWVzIGJlbG93IHN0YXJ0IHN0cmFpZ2h0IG9mZiBpdC4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuaW5saW5lQ2xhaW1zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBmb2xkIHJldHVybiBvbmNlIHRoZSBwYWlyIGNodW5rIGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZDogdHJhaWxpbmcgY2h1bmtzIGFuZCB0aGUgcGVyLWNodW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcC1tZXNzYWdlIHB1Ymxpc2hlcyByaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGRlZmVycmVkQmF0Y2hXb3JrYCwgd2hpY2ggdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gam9pbnMgYmVmb3JlIGl0IGNhbiBhY2sgKGJlbG93LCBuZXh0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGpvaW4pLCBzbyB0aGUgZHVyYWJpbGl0eSBjb250cmFjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY2hhbmdlZCB3aGlsZSB0aGUgYm9kaWVzIHN0YXJ0IGVhcmxpZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWZlcnJlZEJhdGNoV29yazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGNyZWF0ZSB3YXMgcmVqZWN0ZWQgYXMgc3RhbGU6IHJlLWRlcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nIGluIHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgc3BlbnQsIGZhbGwgYmFjayB0byBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiAoYSByZXRocm93IHJlbGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZWRlbGl2ZXJ5IG9mIGEgbWVzc2FnZSB0aGUgdHVyYm8gcGF0aCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkLCBzbyB0aGUgcnVuIHdvdWxkIHN0YWxsIGZvciB0aGUgcXVldWUncyB+MzAwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1c3BlbnNpb24tY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudDogZmFpbCB0aGUgcnVuIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZCBpdCBiYWNrIHRvIHRoZSBxdWV1ZSB0byBzcGluIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzLCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVuY3J5cHRpb25LZXkudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGluIHRoZSBsb2cgdGhpcyByZXBsYXkgcmFuIG92ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwbHVzIHdoYXRldmVyIHRoZSBzdXNwZW5zaW9uJ3Mgb3duIHdyaXRlcyBmb2xkZWQgYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byBpdCDigJQgc28gYSBgaG9va19jcmVhdGVkYCB0aGlzIHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBhbmQgZ290IGEgZGVsdGEgZm9yIElTIGluIHRoZSBzY2FuLCB3aGlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIGl0IHdyb3RlIHdpdGhvdXQgYSBkZWx0YSBpcyBub3QuIE5laXRoZXIgcmVhZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBhbiBvdXRjb21lIGJlbG93OiBldmVyeSBnYXRlIHRoYXQgY29uc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBvcGVuSG9va2AgYWxzbyB0cmVhdHMgXCJ0aGlzIHN1c3BlbnNpb24gY3JlYXRlZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBob29rXCIgYXMgZXF1aXZhbGVudC4gQ29tcHV0ZWQgbGF6aWx5LCBhdCBtb3N0IG9uY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc2hhcmVkIGJldHdlZW4gdGhlIGhvb2std3JpdGUgY29udGludWF0aW9uIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhL3R1cmJvIGdhdGVzIGJlbG93IOKAlCB0aGUgYXR0ci1kZXRvdXIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBob29rLWNvbmZsaWN0IHBhdGhzIHJldHVybi9jb250aW51ZSBiZWZvcmUgdGhlIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdXN1YWxseSBhdm9pZCB0aGUgc2NhbiBlbnRpcmVseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Ib29rV2FpdCA9IG9uY2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuSG9va0FuZFdhaXRTdGF0ZShldmVudExvZy5ldmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldGVudGlvbkRlY2lzaW9uID0gcmV0YWluZWRTZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0UmV0ZW50aW9uRGVjaXNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbjogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5zZXJpYWxpemF0aW9uQmxvY2tlckNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdXNwZW5zaW9uIGNvbW1pdHRlZCB0aGUgZXZlbnQgYSBob29rJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBhd2FpdGVyIGlzIHBhcmtlZCBvbjsgdGhlIGNvbnRpbnVhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cgZHJpdmVzIHRoZSBuZXh0IGl0ZXJhdGlvbiBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va0NvbnRpbnVhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldGVudGlvbkRlY2lzaW9uPy5yZXRhaW4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyArPSBzdXNwZW5zaW9uUmVzdWx0Lmhvb2tDcmVhdGlvbk1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9IHByZVN0ZXBCbG9ja2luZ01zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiBoYW5kbGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbk1zOiBEYXRlLm5vdygpIC0gc3VzcGVuc2lvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHM6IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHM6IHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQ/LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0hvb2tDb25mbGljdDogc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGVFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXRlbnRpb25EZWNpc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1ZtUmV0ZW50aW9uOiByZXRlbnRpb25EZWNpc2lvbi5yZXRhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZXRhaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdyZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmV0ZW50aW9uRGVjaXNpb24/LnJldGFpbiA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dWbVJldGVudGlvblJlYXNvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRlbnRpb25EZWNpc2lvbi5yZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdXNwZW5zaW9uUmVzdWx0LnNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXJpYWxpemF0aW9uQmxvY2tlckxvZ01ldGFkYXRhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnNlcmlhbGl6YXRpb25CbG9ja2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5zZXJpYWxpemF0aW9uQmxvY2tlckNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBBZHZhbmNlIHRoZSB3b3JrZmxvdyBIRVJFIG92ZXIgdGhlIGV2ZW50IGEgaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICogY3JlYXRlIGp1c3QgY29tbWl0dGVkLCBpbnN0ZWFkIG9mIGhhbmRpbmcgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgICogYmFjayB0byB0aGUgcXVldWUgZm9yIGEgZGVsaXZlcnkgd2hvc2Ugb25seSBqb2JcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGJlIHRvIHJlYWQgdGhhdCBldmVudCBhbmQgcmVwbGF5IHRvIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgcGFya2VkIFZNIGlzIG9uZSBgYXdhaXRgIGF3YXkgZnJvbSBjb25zdW1pbmcgaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyByZXN1bWluZyBpdCBvdmVyIHRoZSBjYXJyaWVkLWZvcndhcmQgbG9nIGNvc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBuZWl0aGVyIHRoZSBxdWV1ZSBob3Agbm9yIHRoZSBjb2xkIHJlcGxheS4gU3RlcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXkgcXVldWVkIGVpdGhlciB3YXk6IHRoaXMgaW52b2NhdGlvbiBydW5zIG5vbmUgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZW0sIHNvIHRoZSBjb250aW51YXRpb24gaXMgbm90IHNlcmlhbGl6ZWQgYmVoaW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZXAgYm9keSDigJQgdGhlIHByb3BlcnR5IGFuIGF3YWl0ZXIgZW1wdHlpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGBsYXp5SW5saW5lU3RlcHNgIGV4aXN0cyB0byBwcm90ZWN0LCBhbmQgd2hpY2ggdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBjb25mbGljdCBwYXRoIGdldHMgYnkgcmV0dXJuaW5nIGJlZm9yZSBhbnkgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBleGVjdXRpb24gYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBzdXNwZW5zaW9uJ3Mgd3JpdGVzIGNhcnJpZWQgdGhlIGxvZyBmb3J3YXJkIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIHRoZSBob29rIGNyZWF0ZSdzIGRlbHRhIGFjY291bnRlZCBmb3IgYWxsIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGVtOyBvdGhlcndpc2UgcmVhZCBmcm9tIHRoZSBjdXJzb3IgZmlyc3QsIHdoaWNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGlsbCBvbmUgbGlzdCBhZ2FpbnN0IHRoZSBkZWxpdmVyeSByb3VuZC10cmlwIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICogZnVsbCByZXBsYXkgaXQgcmVwbGFjZXMuIEFuIG9wZW4gd2FpdCBhbHNvIGZvcmNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHJlYWQsIGZvciB0aGUgcmVhc29uIHRoZSBpbmxpbmUtZGVsdGEgZ2F0ZSBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICogZ2l2ZXM6IGEgYHdhaXRfY29tcGxldGVkYCBpcyBhIHJlc29sdXRpb24gdGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgd2FpdGluZyBvbiByYXRoZXIgdGhhbiBhbiBldmVudCBpdCBjYW4gb2JzZXJ2ZSBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICogaXRlcmF0aW9uIGxhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogRmFsc2Ugd2hlbiB0aGlzIGludm9jYXRpb24gY2Fubm90IGdldCBhbnl3aGVyZSB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiB3YXkg4oCUIG5vIHNlc3Npb24gdG8gcmVzdW1lIChyZXRlbnRpb24gb2ZmLCBvciBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBib3VuZGFyeSB0aGUgcHJlZGljYXRlIHJlZnVzZWQpLCBvciBldmVyeSBob29rIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFscmVhZHkgaGFkIGl0cyBjb250aW51YXRpb24gYW5kIHN0aWxsIHdhbnRzIG9uZSwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBwYXNzIHJhbiBvdmVyIGEgbG9nIHRoYXQgZGlkIG5vdCBob2xkIHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHJlcGVhdGluZyBpdCB3b3VsZCBzcGluLiBUaGUgY2FsbGVyIHJlLWludm9rZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRpbnVlT3Zlckhvb2tXcml0ZSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va0lkczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRsZXM6ICdob29rX2NvbmZsaWN0JyB8ICdob29rX2NyZWF0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXRhaW5lZFNlc3Npb24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJlc2ggPSBob29rSWRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWQpID0+ICFjb250aW51ZWRIb29rSWRzLmhhcyhpZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyZXNoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVkSG9va0lkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VtZVdpdGhvdXRSZWFkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmV2ZW50TG9nQ2FycmllZEZvcndhcmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0LnZhbHVlLm9wZW5XYWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VtZVdpdGhvdXRSZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmFycm93aW5nIGRvZXMgbm90IHN1cnZpdmUgaW50byB0aGlzIGNsb3N1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSB0aGF0IHJhaXNlZCB0aGlzIHN1c3BlbnNpb24gcmFuIG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHJlYWR5IGxvZywgc2FtZSBhcyBgb3Blbkhvb2tXYWl0YCBhc3NlcnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRpbnVpbmcgb3ZlciBhIGhvb2sgd3JpdGUgaW4tcHJvY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJZHM6IGZyZXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FycmllZEZvcndhcmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuZXZlbnRMb2dDYXJyaWVkRm9yd2FyZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCZWZvcmVSZXN1bWU6ICFyZXN1bWVXaXRob3V0UmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ob29rX3dyaXRlX2NvbnRpbnVhdGlvbnMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVkSG9va0lkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rIGNvbmZsaWN0OiB0aGUgdG9rZW4gd2FzIGFscmVhZHkgY2xhaW1lZCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcnVuJ3MgaG9vayB3YXMgbmV2ZXIgY3JlYXRlZCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgaG9va19jb25mbGljdGAgdGhpcyBzdXNwZW5zaW9uIGNvbW1pdHRlZCBpcyB3aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR0bGVzIGl0cyBhd2FpdGVycyDigJQgcmVqZWN0aW5nIGEgcGF5bG9hZCBhd2FpdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmluZyBhIGBob29rLmdldENvbmZsaWN0KClgIHdpdGggdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25mbGljdGluZyBydW4uIFRoZSB3b3JrZmxvdyBtdXN0IG9ic2VydmUgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhpcyBzdXNwZW5zaW9uIHNjaGVkdWxlZCBydW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgd2h5IHRoaXMgYnJhbmNoIGNvbWVzIGFoZWFkIG9mIHRoZSBhdHRyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRvdXIgYW5kIGFsbCBzdGVwIGRpc3BhdGNoOiBhIGBQcm9taXNlLnJhY2VgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIHRoZSBob29rIGFuZCBhIHN0ZXAgbXVzdCBsZXQgdGhlIGR1cmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IHdpbiB3aXRob3V0IGV4ZWN1dGluZyB0aGUgbG9zaW5nIHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBpbiB0aGlzIHByb2Nlc3Mgd2hlbiB0aGUgYm91bmRhcnkgYWxsb3dzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdDsgb3RoZXJ3aXNlIGhhbmQgdGhlIHJ1biBiYWNrIGZvciBhIGZyZXNoIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUgY29uZmxpY3QuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlT3Zlckhvb2tXcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaG9va0NvbmZsaWN0Q29ycmVsYXRpb25JZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9va19jb25mbGljdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBleGVjdXRpb24gcGFzczogaXQgcmVsb2FkcyB0aGUgbG9nIChub3cgaG9sZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGp1c3QtY29tbWl0dGVkIGF0dHJfc2V0KSwgdGhlbiBlaXRoZXIgcmVzdW1lcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldGFpbmVkIFZNIG9yIHBlcmZvcm1zIGEgY29sZCByZXBsYXkgdG8gcmVzb2x2ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldEF0dHJpYnV0ZXMgcHJvbWlzZS4gU2tpcCBzdGVwIHByb2Nlc3NpbmcgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3Mgc28gdGhhdCB0aGUgZHVyYWJsZSBldmVudCBkZWNpZGVzIHJhY2VzIGZpcnN0OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gUHJvbWlzZS5yYWNlKFtzZXRBdHRyaWJ1dGVzKCksIHN0ZXAoKV0pLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBtdXN0IGJlIGFibGUgdG8gd2luIHdpdGhvdXQgZXhlY3V0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zaW5nIHN0ZXAuIFRoZSBuZXh0IHBhc3MgaGFwcGVucyBpbi1wcm9jZXNzIHJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiB2aWEgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdW5saWtlIGhvb2tzIGFuZCB3YWl0cywgYW4gYXR0cl9zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvZHVjZXMgbm8gb3V0LW9mLWJhbmQgaW52b2NhdGlvbiBzb3VyY2UgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgd291bGQgbmVlZCB0byB5aWVsZCB0aGUgbWVzc2FnZSBmb3IsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXlpbmcgYSBkZWxpdmVyeSByb3VuZC10cmlwIGhlcmUgd291bGQgb25seSBhZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgYmVmb3JlIHRoZSB3b3JrZmxvdydzIG5leHQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHMgd2hvc2UgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemUgd2VyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxpemVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgYXMgc3RlcF9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyArIHN0ZXBfZmFpbGVkIChzZWUgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXApLiBOb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gbWVzc2FnZSBpcyBkaXNwYXRjaGVkIGZvciB0aGVtLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBzdWNoIGEgc3RlcCBpcyB0aGUgb25seSBwZW5kaW5nIHdvcmsgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZXZlciByZS1pbnZva2UgdGhlIHJ1biwgc28gcmVwbGF5IGluLXByb2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIHJlbG9hZGVkIGxvZyBpbnN0ZWFkLiBUaGUgcmVwbGF5IHJlamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwJ3MgcHJvbWlzZSB3aXRoIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuY2F1Z2h0LCBpdCBwcm9wYWdhdGVzIG91dCBvZiB0aGUgd29ya2Zsb3cgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gYXMgYSBVU0VSX0VSUk9SLiBIZWFsdGh5IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIGFyZSBub3QgZGlzcGF0Y2hlZCB0aGlzIHBhc3M6IHRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXN1c3BlbmRzIG92ZXIgdGhlaXIgYWxyZWFkeS1jb21taXR0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudHMgYW5kIHRoZSBuZXh0IHBhc3MgZGlzcGF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBhcyB1c3VhbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5mYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKb2luIHRoZSBiYXRjaGVkIGZhbi1vdXQncyB0cmFpbGluZyBjaHVuayBjb21taXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzIGJlZm9yZSBjb250aW51aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdGx5IGxpa2UgdGhlIHR3byBqb2lucyBvbiB0aGUgZGlzcGF0Y2ggcGF0aHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3c6IHRoaXMgaW52b2NhdGlvbiBtdXN0IG5vdCBwcm9jZWVkIChhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnR1YWxseSBhY2spIGJlZm9yZSBldmVyeSBjcmVhdGUgYW5kIHB1Ymxpc2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgbGF1bmNoZWQgaXMgZHVyYWJsZS4gQSByZWplY3Rpb24gcHJvcGFnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIHRoZWlyczogdHJhbnNpZW50IHdvcmxkIGVycm9ycyByZXRocm93IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBmb3IgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3VzcGVuc2lvblJlc3VsdC5kZWZlcnJlZEJhdGNoV29yaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIHN0ZXBzIHdob3NlIHBhaXItZm9sZGVkIHN0ZXBfc3RhcnRlZCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgYWxyZWFkeSBjb21taXR0ZWQgKGBpbmxpbmVDbGFpbXNgKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBleGVjdXRlZCBvbiB0aGlzIHBhc3M6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgcmVwbGF5IGJlbG93IHJlLXN1c3BlbmRzIG92ZXIgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZyBzdGVwcywgYW5kIG93bmVkIHJlY292ZXJ5ICh0aGUgY2xhaW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IHRoaXMgbWVzc2FnZSdzIG93bmVyTWVzc2FnZUlkKSByZS1leGVjdXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIHRoZXJlLiBJdHMgXCJwcmV2aW91cyBkZWxpdmVyeSBjcmFzaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pZC1ib2R5XCIgbG9nIGlzIGEgbWlzbm9tZXIgb24gdGhpcyBwYXRoOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGNyYXNoZWQsIHRoZSBib2RpZXMgd2VyZSBuZXZlciBzdGFydGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmFpbGVkIGRlaHlkcmF0aW9uIG1heSBoYXZlIGV4ZWN1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93LW93bmVkIGNvZGUgKGdldHRlcnMvcHJveGllcykgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93aW5nOyBkZW1vdGUgdG8gYSBjb2xkIHJlcGxheSByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYSBWTSB0aGF0IG1heSBoYXZlIGRpdmVyZ2VkLiBUaGlzIGlzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFyZSB0ZXJtaW5hbC1lcnJvciBwYXRoLCBzbyB0aGUgcmVwbGF5IGNvc3QgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXJyZWxldmFudCBuZXh0IHRvIHRoZSBkaXZlcmdlbmNlIHJpc2suXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcHMgPSBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV4ZWN1dGlvbiBpcyBnYXRlZCBvbiBvd25lcnNoaXAuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB0byBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgKGBsYXp5SW5saW5lU3RlcHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJ1biB0aGVtIGlubGluZSAoaW4gcGFyYWxsZWwpIHZpYSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCBldmVudHMgdGhhdCBjcmVhdGUgZWFjaCBzdGVwIG9uIHRoZSBmbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBPd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGF0b21pYyBhbmQgZXhhY3RseS1vbmUgcGVyIHN0ZXA6IHRoZSB3b3JsZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggc3RlcF9zdGFydGVkIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAo4oaSIGV4ZWN1dGVTdGVwIGBza2lwcGVkYCkgdG8gYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IGxvc2VyLCBzbyBvbmx5IG9uZSBoYW5kbGVyIGV2ZXIgcnVucyBhIGdpdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LiBFdmVyeSBvdGhlciBwZW5kaW5nIHN0ZXAga2VlcHMgaXRzIGVhZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgKGluIGBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzYCkgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1c3BlbnNpb24gaGFuZGxlciBvbmx5IGRlc2lnbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBsYXp5SW5saW5lU3RlcHNgIHdoZW4gbm8gYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHJlc2VudC4gVGhhdCBhd2FpdGVyIGNhc2UgbXVzdCBleGVjdXRlIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZTogYW4gaW5saW5lIGBhd2FpdCBleGVjdXRlU3RlcCguLi4pYCBibG9ja3MgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiwgc28gdGhlIGF3YWl0ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uICh3aGljaCBvbmx5IGFkdmFuY2VzIG9uIHRoZSBuZXh0IHBhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBzZXJpYWxpemVkIGJlaGluZCB0aGUgc3RlcCDigJQgZGVmZWF0aW5nIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JrZmxvdyBleHByZXNzZWQgYXMgcGFyYWxsZWwgKGUuZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBob29rLmdldENvbmZsaWN0KCkudGhlbigoKSA9PiBzdGVwQigpKWAgcmFjaW5nIGBhd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcEEoKWApLiBJbiB0aGF0IGNhc2UgYGxhenlJbmxpbmVTdGVwc2AgaXMgZW1wdHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBzdGVwIGlzIHF1ZXVlZCwgc28gdGhlIGNvbnRpbnVhdGlvbiBiZWxvdyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHJlc3VtZXMgdGhlIHBhcmtlZCBWTSBvdmVyIHRoZSBqdXN0LWNvbW1pdHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19jcmVhdGVkIOKAlCByYWNlcyB0aG9zZSBxdWV1ZWQgc3RlcHMgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgb24gYW55IG9mIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5SW5saW5lU3RlcHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmxhenlJbmxpbmVTdGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUNvcnJlbGF0aW9uSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT4gcy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZmllZCBxdWV1ZSBkaXNwYXRjaCBmb3IgZXZlcnl0aGluZyB3ZSBhcmUgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUtZXhlY3V0aW5nLiBTdGVwcyBhcmUgcXVldWVkIHdpdGggc3RlcElkIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVjZWl2ZXIgcnVucyB0aGVtOyB0aGUgd2FpdCB0aW1lciBpcyBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZ2VuZXJpYyBjb250aW51YXRpb24gdGhhdCBmaXJlcyBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZWxhcHNlcyBhbmQgbGV0cyB0aGUgbmV4dCByZXBsYXkgb2JzZXJ2ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCB2aWEgdGhlIFwiY29tcGxldGUgZWxhcHNlZCB3YWl0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgZGlzcGF0Y2ggZGVjaXNpb24gdGFibGUgKHBlciBwZW5kaW5nIHN0ZXAgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNpZ25hdGVkIGxhenktaW5saW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gSW5saW5lLW93bmVkLCBvd25lciA9PT0gdGhpcyBtZXNzYWdlICDihpJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBleGVjdXRlIGluIFRISVMgaW52b2NhdGlvbiAob3duZWQgcmVjb3Zlcnk6IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWRlbGl2ZXJ5IG9mIHRoZSBvd25pbmcgbWVzc2FnZSByZS1leGVjdXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBzdGVwIGl0IGNyYXNoZWQgb24sIHZpYSBhIHBheWxvYWQtbGVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHN0ZXBfc3RhcnRlZCByZS1zdGFtcGVkIHdpdGggaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3duZXJNZXNzYWdlSWQsIG5vdCBhIGJhcmUgc3RhcnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIElubGluZS1vd25lZCwgb3duZXIgIT09IHRoaXMgbWVzc2FnZSAg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZW5zdXJlIGEgREVMQVlFRCBiYWNrc3RvcCB3YWtlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChkZWxheVNlY29uZHMgPSBvd25lcnNoaXAgbGVhc2UgcmVtYWluaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGluc3RlYWQgb2YgZW5xdWV1ZWluZyB0aGUgc3RlcC4gVGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGludm9jYXRpb24gaXMgKGxpa2VseSkgc3RpbGwgcnVubmluZyB0aGUgYm9keTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhbiBpbW1lZGlhdGUgc3RlcCBtZXNzYWdlIHdvdWxkIGJhcmUtc3RhcnQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcnVubmluZyBzdGVwIGFuZCBleGVjdXRlIGl0IGEgc2Vjb25kIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAod29ya2Zsb3cjMjc4MCkuIFRoZSBiYWNrc3RvcCBpcyBhIHBsYWluIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnRpbnVhdGlvbiwgTk9UIGEgc3RlcCBtZXNzYWdlOiB3aGVuIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZmlyZXMsIHRoaXMgc2FtZSBkZWNpc2lvbiB0YWJsZSBoYW5kbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgd2hhdGV2ZXIgc3RhdGUgdGhlIHN0ZXAgaXMgaW4gYnkgdGhlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICh0ZXJtaW5hbCDihpIgbm90aGluZyBwZW5kaW5nOyBxdWV1ZS1vd25lZCBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHN0ZXBfcmV0cnlpbmcg4oaSIG5vcm1hbCBrZXllZCBkaXNwYXRjaDsgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBkZWFkIHdpdGggbGVhc2UgZXhwaXJlZCDihpIgaW1tZWRpYXRlIGRpc3BhdGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHByZXNlcnZpbmcgc3RlcC1sZXZlbCBmYWlsdXJlIHNlbWFudGljcyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwb2lzb24gc3RlcHM7IGxlYXNlIHJlZnJlc2hlZCBieSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlY292ZXJ5IOKGkiByZS1hcm0pLiBUaGUgYmFja3N0b3Anc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlkZW1wb3RlbmN5S2V5IGlzIHNjb3BlZCB0byB0aGUgb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgRVBPQ0ggKGxhdGVzdCBzdGVwX3N0YXJ0ZWQgdGltZXN0YW1wKSwgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAganVzdCB0aGUgY29ycmVsYXRpb24gSUQsIGFuZCBtdXN0IG5ldmVyIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIHN0ZXAgbWVzc2FnZSdzIG93biBrZXkuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkgZm9yIGJvdGggaW52YXJpYW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChmaXhlZCBrZXlzIGVpdGhlciBhYnNvcmIgdGhlIHJldHJ5IGhhbmRvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvciBkZWR1cGUgdGhlIHJlZnJlc2hlZC1sZWFzZSByZS1hcm0gYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBpbi1mbGlnaHQgYmFja3N0b3AgaXRzZWxmKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBOb3Qgb3duZWQgKG5ldmVyIHN0YW1wZWQgLyBlYWdlciAvIG93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxhcHNlZCBhdCBzdGVwX3JldHJ5aW5nIC8gbGVhc2UgZXhwaXJlZCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAga2lsbC1zd2l0Y2hlZCkg4oaSIGltbWVkaWF0ZSBlbnF1ZXVlLCBleGFjdGx5IGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmVmb3JlLiBUaGlzIGNvdmVycyBjcmFzaCByZWNvdmVyeTogaWYgYSBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIgd3JvdGUgc3RlcF9jcmVhdGVkIGJ1dCBjcmFzaGVkIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHF1ZXVlaW5nLCBhIGxhdGVyIGhhbmRsZXIgcXVldWVzIGl0OyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeUtleSBkZWR1cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkdW5kYW50IHF1ZXVlcyBhY3Jvc3MgY29uY3VycmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2FpdCBjb250aW51YXRpb24gaXMgd2hhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYFByb21pc2UucmFjZShzdGVwLCBzbGVlcClgIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgZXhlY3V0aW9uOiBldmVuIGlmIHRoZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzIHRoaXMgaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IHRpbWVyIGZpcmVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24uIElmIHRoZSBzbGVlcCB3aW5zLCB0aGF0IHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGNvbXBsZXRlcyB0aGUgcnVuOyBpZiB0aGUgc3RlcCB3aW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgY29udGludWF0aW9uIGZpcmVzIGxhdGVyIGFuZCBuby1vcHMgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hbCBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRpbnVhdGlvbidzIGRlbGF5IGlzIGNsYW1wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIHF1ZXVlIGRlbGF5IChsb25nIHdhaXRzIGNoYWluIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgaG9wcykgYW5kIGl0cyBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gcGFzc2VzLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMgZm9yIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheS9rZXkgc2VsZWN0aW9uIHJhdGlvbmFsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lT3duZXJzaGlwID0gaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaE5vd01zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkUmVjb3ZlcnlTdGVwczogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW1bXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tzdG9wV2FrZXNBcm1lZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmUtZW5xdWV1ZXMgc3VwcHJlc3NlZCBiZWNhdXNlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gYWxyZWFkeSBwdWJsaXNoZWQgdGhlIHN0ZXAncyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBhbiBlYXJsaWVyIHBhc3MuIFNlZSBwdWJsaXNoZWRTdGVwQ29ycmVsYXRpb25JZHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwdWJsaXNoZXNTa2lwcGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29ycmVsYXRpb25JZCBvZiBzdXNwZW5zaW9uUmVzdWx0LnF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZWRTdGVwQ29ycmVsYXRpb25JZHMuYWRkKGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIGhhbmQtb2ZmLiBUaGUgbWVhc3VyZW1lbnQgbWF5IG9ubHkgZ28gdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkgQVRURU1QVCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBzdGVwLCBhbmQgdGhlIGxvb3AgYmVsb3cgaXMgd2hhdCBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aG9zZSBhcmUsIHNvIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBjbGFzc2lmaWNhdGlvbiwgbmV2ZXIgYWhlYWQgb2YgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIGtlZXBzIHRoZSB0cmFja2luZyB3aGVuZXZlciBpdCB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gc29tZXRoaW5nIGl0c2VsZjogYSBkZWZlcnJlZCBsYXp5LWlubGluZSBzdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYW4gb3duZWQtcmVjb3Zlcnkgc3RlcCAoYSByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0aW5nIHRoZSBzdGVwIGl0IGNyYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uKS4gQm90aCBsYW5kIGluIGBpbmxpbmVFeGVjdXRpb25zYCBiZWxvdyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgaXQgdGhlcmUuIE9ubHkgd2hlbiBuZWl0aGVyIGV4aXN0cyBpcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIHRoZSBGSVJTVCBzdGVwIHRoaXMgaW52b2NhdGlvbiBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5xdWV1ZXMgYXMgYSBzdGVwIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGVwIGNvbnZlcnRlZCBpbnRvIGEgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1QgYW4gYXR0ZW1wdCAodGhlIHdha2UgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiwgYW5kIHdoaWNoZXZlciBpbnZvY2F0aW9uIGV2ZW50dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIHN0ZXAgaXMgYSBkaWZmZXJlbnQgZGVsaXZlcnkpLCBzbyBpdCBtdXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGFrZSB0aGUgc2FtcGxlLiBJZiBldmVyeSBwZW5kaW5nIHN0ZXAgYmVjb21lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBiYWNrc3RvcCwgbm90aGluZyBoZXJlIGF0dGVtcHRzIHRoZSBzdGVwIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtcHRpb24gZ29lcyB1bnJlcG9ydGVkLCB3aGljaCBpcyB0aGUgaG9uZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lIHJhdGhlciB0aGFuIGEgdG90YWwgYXR0cmlidXRlZCB0byB3b3JrIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG5ldmVyIGRpZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHYXRlZCBvbiB0aGVyZSBiZWluZyBhIG1lYXN1cmVtZW50IHRvIHBsYWNlIGF0IGFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGAmJmAgc2hvcnQtY2lyY3VpdHMsIHNvIGEgZGVsaXZlcnkgY2Fycnlpbmcgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNraW5nIChldmVyeSBub24tcmVzdW1lIGRlbGl2ZXJ5LCBhbmQgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBwYXN0IHRoZSBzdGVwIHRoYXQgY29uc3VtZWQgaXQpIG5ldmVyIHBheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcGVuZGluZy1zdGVwIHNjYW4uIFRoYXQgbWF0dGVycyBvbiB3aWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYW4tb3V0cywgd2hlcmUgYHBlbmRpbmdTdGVwc2AgcnVucyB0byBodW5kcmVkcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYW5kT2ZmUmVzdW1lVGltaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFwZW5kaW5nU3RlcHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RlcCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lT3duZXJzaGlwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUoc3RlcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAub3duZXJNZXNzYWdlSWQgPT09IG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHB1Ymxpc2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzaWxpZW50IGRpc3BhdGNoIFRISVMgcGFzcyAoY3JlYXRlICsgcXVldWUgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWwsIG1lc3NhZ2UgY2FycnlpbmcgYHN0ZXBJbnB1dGApLiBBXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXB1Ymxpc2ggaGVyZSB3b3VsZCBkZWR1cGUgb24gdGhlIGlkZW1wb3RlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleSBhbnl3YXksIGJ1dCBza2lwIHRoZSB3YXN0ZWQgcm91bmQtdHJpcC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIG5ldmVyIGFwcGxpZXMgdG8gdGhlc2U6IHRoZXkgd2VyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHRoaXMgcGFzcywgc28gbm8gc3RlcF9zdGFydGVkIHN0YW1wIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdCB5ZXQuIChFYXJsaWVyIHBhc3NlcycgcHVibGlzaGVzIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3ZlcmVkIGJ5IHB1Ymxpc2hlZFN0ZXBDb3JyZWxhdGlvbklkcyBiZWxvdy4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcy5oYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyc2hpcEFjdGl2ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lT3duZXJzaGlwICYmIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcEFjdGl2ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAub3duZXJNZXNzYWdlSWQgPT09IG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lZCByZWNvdmVyeTogdGhpcyBkZWxpdmVyeSBJUyB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZTsgcmUtZXhlY3V0ZSB0aGUgc3RlcCBpbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBpbnN0ZWFkIG9mIHF1ZXVlaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQgYmFja3N0b3Agd2FrZSB3aGlsZSBhbm90aGVyIGludm9jYXRpb24nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAgbGVhc2UgaXMgbGl2ZTsgaW1tZWRpYXRlIHN0ZXAgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgKGxlYXNlIGV4cGlyZWQg4oeSIHJlbWFpbmluZyAwIOKHkiBzYW1lIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZGF5LCB3aGljaCBpcyBhbHNvIHRoZSBkZWdyYWRlZCBtb2RlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCB1bnN0YWJsZSBtZXNzYWdlIElEcywgd2hlcmUgdGhlIG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGFib3ZlIG5ldmVyIG1hdGNoZXMgdGhlcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrc3RvcERlbGF5U2Vjb25kcyA9IG93bmVyc2hpcEFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RlcExlYXNlUmVtYWluaW5nU2Vjb25kcyhzdGVwLCBkaXNwYXRjaE5vd01zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tzdG9wRGVsYXlTZWNvbmRzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGVuZGluZyBzdGVwIGlzIGlubGluZS1vd25lZCBieSBhIGxpdmUgaW52b2NhdGlvbjsgZW5zdXJpbmcgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGluc3RlYWQgb2YgaW1tZWRpYXRlIHJlcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBzdGVwLm93bmVyTWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogYmFja3N0b3BEZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkoc3RlcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgcHVibGlzaGVkIGJ5IFRISVMgaW52b2NhdGlvbiBvbiBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYXJsaWVyIHBhc3MgKHNlZSBwdWJsaXNoZWRTdGVwQ29ycmVsYXRpb25JZHMpOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSBpcyBpbiB0aGUgcXVldWUgYW5kIHRoZSBzZW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpvaW5lZCBiZWxvdywgc28gYSByZXBlYXQgYnV5cyBub3RoaW5nLiBBXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX3JldHJ5aW5nYCBvYnNlcnZlZCBzaW5jZSBpcyBhIG5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSAodGhlIHJldHJ5IGhhbmRvZmYpLCBzbyBpdCBpcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY292ZXJlZCBieSB0aGUgZWFybGllciBwdWJsaXNoIGFuZCByZS1lbnF1ZXVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBiZWZvcmUuIENoZWNrZWQgYmVmb3JlIHRoZSBUVFIgaGFuZC1vZmYgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIHN0ZXAgbmV2ZXIgY29uc3VtZXMgdGhlIG1lYXN1cmVtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVkU3RlcENvcnJlbGF0aW9uSWRzLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnNhd1JldHJ5aW5nICE9PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHVibGlzaGVzU2tpcHBlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdGVwIElTIGJlaW5nIGF0dGVtcHRlZCwgYnkgdGhlIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBwaWNrcyB0aGUgbWVzc2FnZSB1cC4gQ29uc3VtZSB0aGUgdHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSwgZm9yIHRoZSBmaXJzdCBzdWNoIHN0ZXAgYW5kIG5vIG90aGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwUmVzdW1lVGltaW5nID0gaGFuZE9mZlJlc3VtZVRpbWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdW1lVGltaW5nRm9yTWVzc2FnZShyZXN1bWVUcmFja2luZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bWVUaW1pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kT2ZmUmVzdW1lVGltaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbW11dGFibGUgcnVuIGlkZW50aXR5IHNvIHRoZSBjb25zdW1lciBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgdGhlIHN0ZXAgd2l0aG91dCBhIGJsb2NraW5nIHJ1bnMuZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOKAlCBzZWUgUnVuRGlzcGF0Y2hDb250ZXh0U2NoZW1hLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Db250ZXh0OiBydW5EaXNwYXRjaENvbnRleHQod29ya2Zsb3dSdW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oc3RlcFJlc3VtZVRpbWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBob29rUmVzdW1lVGltaW5nOiBzdGVwUmVzdW1lVGltaW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAtaWRlbnRpdHktc2NvcGVkOiBkZWR1cGVzIGFnYWluc3QgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgZGlzcGF0Y2ggb2YgVEhJUyBzdGVwIChjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXJzLCBjcmFzaC1yZWNvdmVyeSByZS1kaXNwYXRjaCwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlcidzIHJlc2lsaWVudCBwdWJsaXNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGFic29yYmluZyBhIGRpc3BhdGNoIG9mIGEgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgdW5kZXIgYSByZWFzc2lnbmVkIGNvcnJlbGF0aW9uIGlkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGVwTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBoaWdoZXIgdGhhbiB0aGUgaW5jb21pbmcgY29udGludWF0aW9uJ3Mgd2hlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludm9jYXRpb24gSVMgdGhlIGNvbnRpbnVhdGlvbiBmb3IgdGhpcyBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgYW5kIHRoZSB3YWl0IGlzIHN0aWxsIHBlbmRpbmc6IHRoYXQgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlbnQgdGhlIGtleSwgc28gcmUtYXJtaW5nIHVuZGVyIGl0IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgYnkgdGhlIHdvcmxkJ3MgZGVkdXBlIHdpbmRvdyBhbmQgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgbG9zZSBpdHMgb25seSB0aW1lci4gRXZlcnkgb3RoZXIgY2FzZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IDAgYW5kIGtleXMgYXMgYmVmb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0QXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdENvbnRpbnVhdGlvbj8uY29ycmVsYXRpb25JZCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gd2FpdENvbnRpbnVhdGlvbi5hdHRlbXB0ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Q29udGludWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiB3YWl0QXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QXR0ZW1wdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkaXNwYXRjaCBwdWJsaXNoZXMgYW5kIHRoZSBpbmxpbmUgYm9kaWVzIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gQ09OQ1VSUkVOVExZOiB0aGUgc3VzcGVuc2lvbiBjb21taXQgYWxyZWFkeSBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBkaXNwYXRjaGVkIHN0ZXAgZHVyYWJsZSAoYW5kLCB3aGVuIHRoZSBmb2xkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmdhZ2VkLCBzZXR0bGVkIHRoZSBpbmxpbmUgcGFpcnMnIGNsYWltcyksIHdoaWNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25seSBvcmRlcmluZyBib3RoIHNpZGVzIG5lZWQsIHNvIG5laXRoZXIgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgb3RoZXIuIFRoZSBqb2lucyBiZWxvdyAoYmVmb3JlIHN0ZXAgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHJlYWQsIGFuZCBvbiB0aGUgbm8taW5saW5lIGVhcmx5IHJldHVybnMpIGtlZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYWlsdXJlIGNvbnRyYWN0OiBhIGRpc3BhdGNoIHJlamVjdGlvbiBzdGlsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHMgdGhpcyBkZWxpdmVyeSwgYWZ0ZXIgaW4tZmxpZ2h0IGJvZGllcyBzZXR0bGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzU2V0dGxlZCA9IFByb21pc2UuYWxsKGRpc3BhdGNoZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSByZWplY3Rpb24gbXVzdCBub3Qgc3VyZmFjZSBhcyBhbiB1bmhhbmRsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdGlvbiB3aGlsZSB0aGUgYm9kaWVzIHJ1biAob3IgaWYgc2V0dXAgYmV0d2VlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBhbmQgdGhlIGpvaW4gdGhyb3dzIGZpcnN0KTsgYXdhaXRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBwcm9taXNlIGJlbG93IHN0aWxsIG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlc1NldHRsZWQuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2V0IG9mIHN0ZXBzIFRISVMgaW52b2NhdGlvbiBleGVjdXRlczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlcnJlZCBsYXp5LWlubGluZSBiYXRjaCBwbHVzIGFueSBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgKHRoaXMgbWVzc2FnZSdzIHJlZGVsaXZlcnkgcmUtZXhlY3V0aW5nIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgaXQgY3Jhc2hlZCBvbjogbm8gbGF6eVN0ZXBJbnB1dDsgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoeWRyYXRlcyBmcm9tIHRoZSBzdGVwIGVudGl0eSBsaWtlIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQgdGhlIHBheWxvYWQtbGVzcyBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAuIFVubGlrZSB0aGUgYmFja2dyb3VuZCBwYXRoJ3Mgc3RhcnQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBiYXJlOiBpdCBjYXJyaWVzIHRoaXMgbWVzc2FnZSdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lck1lc3NhZ2VJZCwgd2hpY2ggaXMgYWxzbyB3aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3ZlcnkgcmV0cnkgY2VpbGluZyBjb3VudHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lRXhlY3V0aW9uczogQXJyYXk8e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ/OiAodHlwZW9mIGxhenlJbmxpbmVTdGVwcylbbnVtYmVyXVsnZGVoeWRyYXRlZElucHV0J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNsYWltZWRTdGFydD86IFByZWNsYWltZWRJbmxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0+ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5sYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlLWNsYWltZWQgYnkgdGhlIHN1c3BlbnNpb24gYmF0Y2g6IHRoZSBwYWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzZXR0bGVkIHRoaXMgc3RlcCdzIGNyZWF0ZSArIGNsYWltLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBydW5zIChvciBza2lwcykgdGhlIGJvZHkgb2ZmIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGluc3RlYWQgb2Ygc2VuZGluZyBhIGxhenkgc3RhcnQgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFpbSA9IHN1c3BlbnNpb25SZXN1bHQuaW5saW5lQ2xhaW1zLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2xhaW1lZFN0YXJ0OiBjbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMuZGVoeWRyYXRlZElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3duZWRSZWNvdmVyeVN0ZXBzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lcnNoaXAgdGVsZW1ldHJ5IChkZXNpZ24gZG9jIFBoYXNlIDcpOiBzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIHNvIHByb2R1Y3Rpb24gdHJhY2VzIHNob3cgd2hlbiBjcmFzaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnkgcmFuIG9yIGEgd2FrZSB3YXMgY29udmVydGVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AsIGFuZCBhIHdhcm4gKGFsd2F5cyBwcmludGVkLCB1bmxpa2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnL2luZm8pIGZvciBvd25lZCByZWNvdmVyeSwgc2luY2UgaXQgbWVhbnMgYSBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlIGRpZWQgbWlkLXN0ZXAtYm9keS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXB1Ymxpc2hlc1NraXBwZWQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd093bmVkUmVjb3ZlcnlTdGVwcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiYWNrc3RvcFdha2VzQXJtZWQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd0JhY2tzdG9wV2FrZXNBcm1lZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcHVibGlzaGVzU2tpcHBlZCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93RGlzcGF0Y2hSZXB1Ymxpc2hTa2lwcGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHVibGlzaGVzU2tpcHBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwdWJsaXNoZXNTa2lwcGVkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTa2lwcGVkIHJlLXB1Ymxpc2hpbmcgc3RlcCBtZXNzYWdlcyB0aGlzIGludm9jYXRpb24gYWxyZWFkeSBwdWJsaXNoZWQgb24gYW4gZWFybGllciByZXBsYXkgcGFzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwdWJsaXNoZXNTa2lwcGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlLWV4ZWN1dGluZyBpbmxpbmUgc3RlcHMgb3duZWQgYnkgdGhpcyBxdWV1ZSBtZXNzYWdlIOKAlCBhIHByZXZpb3VzIGRlbGl2ZXJ5IGNyYXNoZWQgbWlkLWJvZHkgYW5kIHRoaXMgcmVkZWxpdmVyeSBpcyByZWNvdmVyaW5nIHRoZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkczogb3duZWRSZWNvdmVyeVN0ZXBzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpID0+IHMuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZXhlY3V0ZSBpbmxpbmU6IGV2ZXJ5dGhpbmcgaGFzIGJlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCAob3Igbm8gd29yayBuZWVkcyBzY2hlZHVsaW5nKS4gRXhpdCBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgZHJpdmUgc3Vic2VxdWVudCByZXBsYXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgcnVucyBjb25jdXJyZW50bHkgd2l0aCB0aGUgZGlzcGF0Y2hlcyBvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHBhdGgsIHNvIGpvaW4gdGhlbSAoYW5kIHRoZSBmb2xkJ3MgZGVmZXJyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2h1bmsgY29tbWl0cy9wdWJsaXNoZXMpIGhlcmUgc28gYSBmYWlsdXJlIGZhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWxpdmVyeSBleGFjdGx5IGFzIGl0IGFsd2F5cyBoYXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzU2V0dGxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmRlZmVycmVkQmF0Y2hXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIHRoZSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjb250aW51ZTogdGhlIGBob29rX2NyZWF0ZWRgIHRoaXMgc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGNvbW1pdHRlZCBpcyB3aGF0IHJlc29sdmVzIGl0LCBhbmQgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHdpbGwg4oCUIG5vIHN0ZXAgcmFuIGhlcmUsIGFuZCBldmVyeSBzdGVwIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBzY2hlZHVsZWQgd2VudCB0byB0aGUgcXVldWUg4oCUIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgYSBjb250aW51YXRpb24gdGhlIHJ1biB3b3VsZCBzaXQgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBzb21lIHVucmVsYXRlZCBtZXNzYWdlIHdva2UgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZU92ZXJIb29rV3JpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuYXdhaXRlZEhvb2tDb3JyZWxhdGlvbklkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfY3JlYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kIHRoZSBydW4gYmFjayBmb3IgYSBmcmVzaCByZXBsYXkgb3ZlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQgaG9va19jcmVhdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gaG9va3Mvd2FpdHMgYXJlIGNvbnN1bHRlZCBieSBhbGwgdGhyZWUgZ2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93OyByZXNvbHZlIHRoZSBtZW1vaXplZCBzY2FuIG9uY2UgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Ib29rV2FpdFN0YXRlID0gb3Blbkhvb2tXYWl0LnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtZGVsdGEgZmFzdCBwYXRoIGdhdGUuIFdlIHJlcXVlc3QgdGhlIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoYW5kIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBjb25zdW1lIGl0IGluIHBsYWNlIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3QpIG9ubHkgd2hlbiBBTEwgaG9sZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXZSBoYXZlIGEgcmVhbCBwcmlvciBjdXJzb3IgdG8gZGlmZiBhZ2FpbnN0IChhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBXb3JsZCBtYXkgcmV0dXJuIG5vbmUgb24gdGhlIGluaXRpYWwgbG9hZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBUaGlzIGlzIHRoZSBjbGVhbiBzaW5nbGUtc3RlcCBzZXF1ZW50aWFsIGNhc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGlzIHN1c3BlbnNpb24gcHJvZHVjZWQgZXhhY3RseSBvbmUgc3RlcCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdhaXRzIChgZXJyLntzdGVwLHdhaXR9Q291bnRgKSwgdGhhdCBvbmUgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGxvbmUgcGVuZGluZyBzdGVwIChgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMWApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbmQgdGhlIGxvbmUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMWA6IG5vIHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzaWJsaW5ncyBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycywgYW5kIG5vIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpbmxpbmUgc3RlcCB3cml0aW5nIGl0cyBvd24gZXZlbnRzIG91dCBvZiBiYW5kKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIE5vIHBlbmRpbmcgd2FpdCB0aW1lciBmcm9tIFRISVMgc3VzcGVuc2lvbiwgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvcGVuIHdhaXQgaW4gdGhlIGN1bXVsYXRpdmUgbG9nLiBBIGB3YWl0X2NvbXBsZXRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIGEgcmVzb2x1dGlvbiB0aGUgcmVwbGF5IGlzIHdhaXRpbmcgb24gcmF0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGFuIGFuIGV2ZW50IGl0IGNhbiBvYnNlcnZlIG9uZSBpdGVyYXRpb24gbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNvIGNvbnN1bWluZyBhIGRlbHRhIHRoYXQgcHJlZGF0ZXMgaXQgd291bGQgc2V0dGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgc2xlZXAgZnJvbSBhIHZpZXcgdGhhdCBkb2VzIG5vdCBjb250YWluIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29tcGxldGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIEFuIG9wZW4gKG9yIHRoaXMtc3VzcGVuc2lvbi1jcmVhdGVkKSBob29rIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmaW5lLCBhbmQgdGhhdCBpcyB0aGUgZ2F0ZSB0aGlzIHVzZWQgdG8gY2FycnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBUaGUgZGVsdGEgc25hcHNob3RzIHRoZSBsb2cgYXQgdGhlIHN0ZXBfY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSBidXQgaXMgY29uc3VtZWQgb24gdGhlIG5leHQgcmVwbGF5LCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgYGhvb2tfcmVjZWl2ZWRgIGxhbmRpbmcgaW4gdGhhdCB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIGFic2VudCBmcm9tIHRoZSBkZWx0YSBhbmQgb2JzZXJ2ZWQgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdGVyYXRpb24gbGF0ZXIgdGhhbiBhIHJlYWwgZmV0Y2ggd291bGQgb2JzZXJ2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXQuIFRoYXQgc3RhbGVuZXNzIGlzIHF1YWxpdGF0aXZlbHkgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlYWQtdG8td3JpdGUgcmFjZSB0aGUgZmV0Y2ggcGF0aCBhbHJlYWR5IGhhcyAoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGV2ZW50IGNhbiBsYW5kIHJpZ2h0IGFmdGVyIGBldmVudHMubGlzdGAgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIGJlZm9yZSB0aGUgc3VzcGVuc2lvbidzIHdyaXRlcyksIGFuZCBpdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYm91bmRlZCBieSB0aGUgc2FtZSB0aGluZzogd2hhdCBhIHN0YWxlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaG9sZHMgaXMgYSAqcHJlZml4KiBvZiB0aGUgbG9nLCBuZXZlciBhIGhvbGUgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0LCBhbmQgcmVwbGF5aW5nIGEgcHJlZml4IHR3aWNlIHJlYWNoZXMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlY2lzaW9ucy4gSXRzIG5leHQgd3JpdGUgaXMgYWxsb2NhdGVkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3aGF0ZXZlciBpdCBtaXNzZWQgYW5kIGNvbWVzIGJhY2sgY2FycnlpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgcmVwb3J0U2tpcHBlZFNsb3RzYCBvbiB0aGUgbG9jYWwgd29ybGRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29tbWl0LXRpbWUgYWxsb2NhdGlvbiBvbiB0aGUgVmVyY2VsIG9uZSksIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVwbGF5IGNvcnJlY3RzIGl0c2VsZiBvbiB0aGUgd3JpdGUgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9uIGEgcmVhZC4gQSBXb3JsZCBNQVkgaW5zdGVhZCByZWZ1c2UgdGhlIHdyaXRlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGFsZSAoNDEyKSwgd2hpY2ggdGhlIHJ1bnRpbWUgaGFuZGxlcyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2F5OyBub3RoaW5nIHJlcXVpcmVzIGl0IHRvLiBIb29rcyBjcmVhdGVkIGJ5IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHN1c3BlbnNpb24gYXJlIGluc2lkZSB0aGUgZGVsdGEgKHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBgaG9va19jcmVhdGVkYCBsYW5kcyBiZWZvcmUgdGhlIHN0ZXAtdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdyaXRlKSwgc28gb25seSB0aGVpciBgaG9va19yZWNlaXZlZGAgcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhcmUgc3ViamVjdCB0byB0aGUgc2FtZSB3aW5kb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXaXRoIG5vIGhvb2sgb3Igd2FpdCBvcGVuIGF0IGFsbCwgdGhlIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRvIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW5Ib29rQW5kV2FpdFN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSBzdGVwIHJ1bnMgaW5saW5lLCBlYWNoIHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBldmVudHMgYW5kIHRoZSBwZXItd3JpdGUgZGVsdGEgd291bGQgYmUgcGFydGlhbCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBpcyBub3QgcmVxdWVzdGVkICh0aGUgZ2F0ZSBiZWxvdyBpcyBmYWxzZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpLXN0ZXApIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZG9lcyBhIG5vcm1hbCBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmxpbmVEZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudExvZy5jdXJzb3IgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5zdGVwQ291bnQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3BlbldhaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWxlLXNlbnNpdGl2ZSBiYXRjaDogYSBob29rIGlzIG9wZW4gaW4gdGhlIHJ1biAob3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBjcmVhdGVkIGJ5IHRoaXMgc3VzcGVuc2lvbiwgc28gaXRzIGhvb2tfcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBsYW5kIGFueSBtb21lbnQpLCBzbyBhbiBvdXQtb2YtYmFuZCBldmVudCBjYW4gbWFrZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZpZXcgdGhpcyBiYXRjaCB3YXMgc2NoZWR1bGVkIGZyb20gc3RhbGUsIHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB3aGVuIHNldmVyYWwgaW52b2NhdGlvbnMgcmFjZSBmb3Igb25lIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0uIE9wdGltaXN0aWMgc3RhcnQgYmVnaW5zIHRoZSBib2R5IGJlZm9yZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltIHNldHRsZXMsIHNvIHRoZSB3cml0ZXIgdGhhdCBMT1NFUyB0aGUgY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChgRW50aXR5Q29uZmxpY3RFcnJvcmAg4oaSIGBza2lwcGVkYCkgaGFzIGFscmVhZHkgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGNvZGUgaXQgZG9lcyBub3Qgb3duLiBTdXBwcmVzcyBpdCBmb3IgdGhlc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoZXMsIHNvIHRoZSBib2R5IHJ1bnMgb25seSBhZnRlciB0aGUgY2xhaW0gY2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB3b24uIENvc3RzIG9uZSBjbGFpbSByb3VuZC10cmlwIHBlciBzdGVwIHdoaWxlIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvb2sgaXMgb3BlbiwgYW5kIGJ1eXMgdGhlIHNhbWUgdGhpbmcgb24gZXZlcnkgV29ybGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN0ZXAgYm9keSBleGVjdXRlcyBvbmNlIHBlciBjbGFpbSwgbm90IG9uY2UgcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByYWNlci4gKEEgV29ybGQgdGhhdCByZWZ1c2VzIHRoZSBjbGFpbSBhcyBzdGFsZSAoNDEyKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0cyB0aGUgc2FtZSBwcm90ZWN0aW9uIHRocm91Z2ggdGhlIHNhbWUgYXdhaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub25lIG9mIHRoZSBzaGlwcGVkIG9uZXMgZG9lcyB0aGF0IGZvciBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90LW51bWJlcmVkIHJ1bi4pXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwcmVzc09wdGltaXN0aWNTdGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Ib29rV2FpdFN0YXRlLm9wZW5Ib29rIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoLCBidXQgb25seSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIFwiY2xlYW5cIiAoYSBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb24pLiBUaGUgbW9tZW50IGEgaG9vayBvciB3YWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBsYXRlciByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYmVjb21lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSwgc28gdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydCBzYWZlIG5vIGxvbmdlciBob2xkczogdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIGFuZCB0aGUgc3RlcHMgdGFrZSB0aGUgbm9ybWFsIChlbnYtZ2F0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdC10aGVuLXJ1biBwYXRoLiBUaGUgaG9vay1jb25mbGljdCBjYXNlIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGVhcmx5IGFib3ZlLCB0aGUgYXR0ciBjYXNlIGNvbnRpbnVlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIHJlcGxheSAoc28gYSBiYXRjaC1zY2hlZHVsaW5nIHN1c3BlbnNpb24gbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYXR0ciBldmVudHMpLCBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVuc2l2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYHN1c3BlbnNpb25SZXN1bHQuKmAgZmxhZ3Mgb25seSByZWZsZWN0IHdoYXQgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggY3JlYXRlZCwgc28gdGhleSBkbyBub3QgY2F0Y2ggYSBob29rL3dhaXQgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlYXJsaWVyIGl0ZXJhdGlvbiBvZiB0aGUgc2FtZSBkZWxpdmVyeSAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soLi4uKWAgdGhhdCBkb2Vzbid0IGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3csIGxldHRpbmcgdGhlIHJlcGxheSBsb29wIGNvbnRpbnVlIHRvIGxhdGVyIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbnMpLiBPbmNlIGFueSBob29rIG9yIHdhaXQgaXMgb3BlbiBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgbG9nLCByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYXJlIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biwgc28gdHVyYm8gbXVzdCBsYXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm1hbmVudGx5LCBjaGVja2VkIGhlcmUgdmlhIGBvcGVuSG9va0FuZFdhaXRTdGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGN1bXVsYXRpdmUgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGBXT1JLRkxPV19TRVFVRU5USUFMX1JFUExBWVM9MWAgKHBlci1ydW4gZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9waWNzIGNvbnN1bWVkIHdpdGggYG1heENvbmN1cnJlbmN5OiAxYCkgd291bGQgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW5jaXBsZSB3YWl2ZSB0aGlzIGxhdGNoOiBzZXJpYWxpemVkIG9yY2hlc3RyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbnMgcmVzdG9yZSB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdob2xlIGRlbGl2ZXJ5LiBUaGUgd2FpdmVyIGlzIGludGVudGlvbmFsbHkgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlbjogdGhlIGVudiB2YXIgaXMgYSBydW50aW1lLXByb2Nlc3Mgc2V0dGluZyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgcHJvdmUgdGhlIEJVSUxUIGZsb3cgdHJpZ2dlciBhY3R1YWxseSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbWF4Q29uY3VycmVuY3k6IDFgIChpdCBtdXN0IGJlIHNldCBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b28sIGFuZCBzb21lIGludGVncmF0aW9ucyB3cml0ZSB0aGVpciBvd24gdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlnKSwgYW5kIGBjYXBhYmlsaXRpZXMubWF4Q29uY3VycmVuY3lgIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVzIHF1ZXVlIHN1cHBvcnQsIG5vdCBkZXBsb3llZCBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW50aWwgdGhlIGJ1aWxkIGVtaXRzIGEgdmVyaWZpYWJsZSBzaWduYWwgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGxveWVkIHRyaWdnZXIgaXMgc2VyaWFsaXplZCwgdGhlIGNvbnNlcnZhdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0Y2ggc3RheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JjZU9wdGltaXN0aWNTdGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5Ib29rICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIHN0ZXBzIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWRnZXQgaXMgcGF1c2VkIGZvciB0aGUgd2hvbGUgYmF0Y2ggKHN0ZXAgZHVyYXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb24gbWF4RHVyYXRpb24sIG5vdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aW1lb3V0KSBzbyB0aGUgYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGRvZXNuJ3QgY2hhcmdlIHRoZSBzdGVwIGJvZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5OiBkZWNpZGUgd2hldGhlciB0aGlzIGJhdGNoJ3MgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcXVhbGlmaWVzIGZvciBUVEZTL1NUU08gbWVhc3VyZW1lbnQuIE9ubHkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCdzIGZpcnN0IHN0ZXAgY2FycmllcyB0aGUgdHJhY2tpbmcgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWwgYmF0Y2ggZW1pdHMgb25lIHNhbXBsZSBwZXIgc2NoZWR1bGluZyBnYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgb25lIHBlciBzaWJsaW5nLiBUdXJibydzIHN5bnRoZXNpemVkIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgaGFzIGEgbG9jYWwtY2xvY2sgY3JlYXRlZEF0LCBzbyB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gb25seSB0aGUgcnVuLWlkIFVMSUQgdGltZXN0YW1wIGlzIHRydXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXRlbmN5VHJhY2tpbmcgPSBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW4gPT09IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNyZWF0ZWRBdE1zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkQ3JlYXRlZEF0KHJ1bklkKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXJibyA/IHVuZGVmaW5lZCA6ICt3b3JrZmxvd1J1bi5jcmVhdGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdXNwZW5zaW9uJ3Mgb3duIGhvb2svd2FpdCB3cml0ZXMgYXJlIG5vdCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9hZGVkIGV2ZW50IGxvZyB5ZXQsIHNvIHJlcG9ydCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25IYXNXYWl0czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fCBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZDogc2VydmVkQnlSZXRhaW5lZFNlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSOiBjb25zdW1lZCBieSB0aGlzIGJhdGNoLiBFdmVyeSBzdGVwIGlzIGhhbmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFNBTUUgdHJhY2tpbmcgb2JqZWN0IGFuZCBpdHMgb25lLXNob3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGByZXBvcnRlZGAgbGF0Y2ggcGlja3MgdGhlIHNpbmdsZSBzdGVwIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHJlYWNoZXMgdXNlciBjb2RlLCBzbyB0aGUgc2FtcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXJ2aXZlcyB0aGUgYmF0Y2gncyBmaXJzdCBzdGVwIGxvc2luZyBpdHMgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gdG8gYSBjb25jdXJyZW50IGludm9jYXRpb24gd2hpbGUgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2libGluZyBydW5zLCB3aXRob3V0IGEgcGFyYWxsZWwgYmF0Y2ggcmVwb3J0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIHBlciBzaWJsaW5nLiBDbGVhcmVkIGhlcmUgc28gYSBsYXRlciBsb29wXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24ncyBzdGVwcyAoYW5kIGFueSBpbi1wcm9jZXNzIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydCkgY2Fubm90IHJlcG9ydCB0aGUgc2FtZSByZXN1bXB0aW9uIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hSZXN1bWVUcmFja2luZyA9IHJlc3VtZVRyYWNraW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHRzOiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD5cbiAgICAgICAgICAgICAgICAgICAgICAgID5bXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBFeGVjdXRpb25Qcm9taXNlcyA9IGlubGluZUV4ZWN1dGlvbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocywgc3RlcEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcm9vdFJ1bklkRnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IG51bWJlciA9IHByaW9yIHN0ZXBfc3RhcnRlZCBjb3VudCArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoaXMgZXhlY3V0aW9uJ3Mgc3RhcnQpLCBjb3VudGluZyBvbmx5IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSdzIG93biBzdGFydHM6IHRoZSBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZWlsaW5nIGJvdW5kcyBob3cgbWFueSB0aW1lcyB0aGlzIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHJlLXJ1bnMgYSBzdGVwIGl0IGNyYXNoZWQvdGltZWQgb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uLCBhbmQgZWFjaCBvZiB0aG9zZSAocmUpc3RhcnRzIHN0YW1wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZGF0YS5tZXNzYWdlSWQuIFN0YXJ0cyB3cml0dGVuIGJ5IHJhY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyAoc3RhbGUvd2FrZSByZXBsYXlzLCBhIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBkaXNwYXRjaGVkIG9mZiBhIGxvc3QgY3JlYXRlLWNsYWltKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyeSBvdGhlciBJRHMgKG9yIG5vbmUpIGFuZCBtdXN0IG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCwgb3IgdGhlIGNlaWxpbmcgZmFsc2VseSBleGhhdXN0cyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWx0aHkgc3RlcCAoc2VlIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGxhenkgc3RlcCBpcyBicmFuZC1uZXcgYnkgY29uc3RydWN0aW9uIChpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRlcnMgdGhlIGJhdGNoIG9ubHkgd2hlbiBpdCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIHlldCksIHNvIGl0IGhhcyB6ZXJvIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBhbmQgaXMgYWx3YXlzIGF0dGVtcHQgMSwgc28gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIHNjYW4gZW50aXJlbHkuIE9ubHkgYW4gb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcnVuIGNhbiBoYXZlIHByaW9yIHN0YXJ0cywgYW5kIHRoYXQgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bmNvbW1vbiwgc28gcmVzZXJ2ZSB0aGUgTyhuKSBzY2FuIGZvciBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiB3YWxraW5nIHRoZSBncm93aW5nIGxvZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgaW5saW5lIHN0ZXAgKHdoaWNoIHdvdWxkIGJlIE8obsKyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Jvc3MgYSBsb25nIHNlcXVlbnRpYWwgd29ya2Zsb3cpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdGF0aXZlQXR0ZW1wdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJlY2xhaW1lZFN0YXJ0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ293bmVkQnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IHNlbmQgdGhlIGRlZmVycmVkIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBvbiBzdGVwX3N0YXJ0ZWQgc28gdGhlIHdvcmxkIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgb24gdGhlIGZseS4gQWJzZW50IGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSBzdGVwcywgd2hvc2UgaW5wdXQgaHlkcmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZXhpc3Rpbmcgc3RlcCBlbnRpdHksIGFuZCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlLWNsYWltZWQgc3RlcHMsIHdob3NlIHBhaXIgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVkIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZS1jbGFpbWVkIGlubGluZSBzdGFydDogdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggc2V0dGxlZCB0aGlzIHN0ZXAncyBjcmVhdGUgKyBjbGFpbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4ZWN1dG9yIHJ1bnMgKG9yIHNraXBzKSB0aGUgYm9keSBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB2ZXJkaWN0IHdpdGggbm8gc3RhcnQgd3JpdGUgb2YgaXRzIG93bi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2xhaW1lZFN0YXJ0OiBzLnByZWNsYWltZWRTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIG93bmVyc2hpcDogc3RhbXAgKG9yIHJlLXN0YW1wKSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBxdWV1ZSBtZXNzYWdlIElEIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQsIHNvIHdha2UgcmVwbGF5cyBzZWUgdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgaW4gZmxpZ2h0IGhlcmUgYW5kIHN1cHByZXNzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcmVxdWV1ZSAod29ya2Zsb3cjMjc4MCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBmb3JjZSBvcHRpbWlzdGljIHN0YXJ0IGFuZCBob2xkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IHN0ZXBfc3RhcnRlZCB1bnRpbCB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGxhbmRzICh0aGUgYm9keSBzdGlsbCBydW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5KS4gQm90aCBhcmUgdW5kZWZpbmVkL2ZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZC1lbmZvcmNlZCBiYXRjaGVzIHdpdGggYW4gb3BlbiBob29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoZSBjbGFpbSBiZWZvcmUgcnVubmluZyB0aGUgYm9keSwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSA0MTItZmVuY2VkIHN0ZXAgbmV2ZXIgZXhlY3V0ZXMgdXNlciBjb2RlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdGVwSW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wcmVjbGFpbWVkU3RhcnQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IGxhdGVuY3lUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiYXRjaFJlc3VtZVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHJlc3VtZVRyYWNraW5nOiBiYXRjaFJlc3VtZVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcjogZXZlbnRMb2cuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhcmlhbnQgYm9va2tlZXBpbmc6IHRoaXMgaW52b2NhdGlvbiBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYm9kaWVzIHVudGlsIHRoZXkgc2V0dGxlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuYWRkKHMuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBhbmQgcHJlLWNsYWltZWQgc3RlcHMgYXJlIGJyYW5kLW5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGVpciBjcmVhdGUtY2xhaW0gaXMgdGhlIGV4YWN0bHktb25jZSBnYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgYW4gb3duZWQtcmVjb3Zlcnkgc3RlcCBhbHJlYWR5IGV4aXN0cyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgZGVsYXllZCBiYWNrc3RvcCBtZXNzYWdlIG1heSBmaXJlIG1pZC1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzYW1lIHByb2Nlc3MsIHNvIHJvdXRlIHRob3NlIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4tcHJvY2VzcyBzaW5nbGUtZmxpZ2h0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByZWNsYWltZWRTdGFydCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZC5maW5hbGx5KCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuZGVsZXRlKHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGpvaW5zIGJlbG93IHNpdCBCRVRXRUVOIHRoZXNlIHByb21pc2VzJyBjcmVhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBgUHJvbWlzZS5hbGxgIHRoYXQgcmVhZHMgdGhlbSwgc28gYSBib2R5IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdHMgd2hpbGUgYSBwdWJsaXNoIG9yIGEgdHJhaWxpbmcgY2h1bmsgY29tbWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBpbiBmbGlnaHQgd291bGQgaGF2ZSBubyBoYW5kbGVyIGF0dGFjaGVkIGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWljcm90YXNrIGNoZWNrcG9pbnQ6IGFuIGB1bmhhbmRsZWRSZWplY3Rpb25gLCBmYXRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgTm9kZSdzIGRlZmF1bHQgYC0tdW5oYW5kbGVkLXJlamVjdGlvbnM9dGhyb3dgLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSA0MTIgc3RhbGUtY2xhaW0gcmVqZWN0aW9uIHJhY2VzIGV4YWN0bHkgdGhhdCB3aW5kb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggbm93OyBldmVyeSByZWplY3Rpb24gaXMgc3RpbGwgb2JzZXJ2ZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdHMgYmVsb3csIHdoaWNoIGFyZSB3aGF0IGRlY2lkZSB0aGUgb3V0Y29tZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiBzdGVwRXhlY3V0aW9uUHJvbWlzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKb2luIHRoZSBkaXNwYXRjaCBwdWJsaXNoZXMgbGF1bmNoZWQgYWJvdmUgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb2xkJ3MgZGVmZXJyZWQgYmF0Y2ggd29yayAodHJhaWxpbmcgY2h1bmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0cyArIHBlci1jaHVuayBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzKTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvZGllcyBhcmUgYWxyZWFkeSBydW5uaW5nIGluIHBhcmFsbGVsIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCwgYW5kIHRoaXMgaW52b2NhdGlvbiBtdXN0IG5vdCBhY2sgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGNyZWF0ZSBhbmQgcHVibGlzaCBpcyBkdXJhYmxlLiBBIGZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgaXRzIG9sZCBjb250cmFjdCAoZmFpbCB0aGlzIGRlbGl2ZXJ5IHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIHJlZGVsaXZlcnMpLCBidXQgdGhlIGluLWZsaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib2RpZXMgbXVzdCBzZXR0bGUgZmlyc3Q6IGFuIG93bmVkIGJvZHkgbGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nIHBhc3QgdGhpcyBoYW5kbGVyIHdvdWxkIHJhY2UgaXRzIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXNTZXR0bGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5kZWZlcnJlZEJhdGNoV29yayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZGlzcGF0Y2hFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc3RlcEV4ZWN1dGlvblByb21pc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBkaXNwYXRjaEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YWxlICg0MTIpIHJlamVjdGlvbiBvZiBhbiBpbmxpbmUgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltOiB0aGUgbG9hZGVkIHZpZXcgdGhpcyBiYXRjaCB3YXMgc2NoZWR1bGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gaXMgbWlzc2luZyBhbiBldmVudCB0aGUgYmFja2VuZCBhbHJlYWR5IGhhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIGNsYWltIHdhcyBmZW5jZWQgYnkgdGhlIGd1YXJkIGFuZCBubyBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB3ZXJlIHdyaXR0ZW4uIEFiYW5kb24gdGhlIGJhdGNoIChhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBib2R5IHJlc3VsdCBpcyBkaXNjYXJkZWQgYnkgZXhlY3V0ZVN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbmNpbGlhdGlvbikgYW5kIHJlc3RhcnQgdGhlIHJlcGxheSBzbyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgbWlzc2luZyBldmVudC4gV2FpdCBmb3IgdGhlIHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9ucyB0byBzZXR0bGUgZmlyc3Qgc28gbm8gb3duZWQgYm9keSBpcyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgd2hlbiB0aGUgcmVzdGFydCAob3IgdGhlIGFjayBwYXRoKSBydW5zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoc3RlcEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEV4ZWN1dGlvblByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHNpYmxpbmcgd2hvc2UgY2xhaW0gd2FzIGFjY2VwdGVkIHdyb3RlIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgb2YgaXRzIG93biwgcG9zc2libHkgYWZ0ZXIgdGhlIFdvcmxkIGJ1aWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyA0MTIncyBkZWx0YSwgc28gdGhhdCBkZWx0YSBjYW4gbm8gbG9uZ2VyIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lZCB0byBjb21wbGV0ZSB0aGUgbG9nLCBhbmQgdGhlIHJlc3RhcnQgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVsb2FkIGl0IGluIGZ1bGwuIGBza2lwcGVkYCAodGhlIHN0ZXAgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0ZWQpLCBgZ29uZWAgYW5kIGB0aHJvdHRsZWRgIChjbGFpbSByZWplY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSBub3RoaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdXcm90ZSA9IHNldHRsZWQuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAncmV0cnknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcygnaW5saW5lLWNsYWltJywgc3RlcEVyciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhOiAhc2libGluZ1dyb3RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24gc3RhcnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyByZXR1cm4gKG9yIHRocm93KSBjb21wbGV0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmxpbmUtY2xhaW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0aW9uLnJlaW52b2tlZCkgcmV0dXJuIGVzY2FsYXRpb24ucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHRoZSBiYXRjaCByZXN1bHRzLiBgcmV0cnlgIHN0ZXBzICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBleGlzdCwgc2luY2UgdGhlaXIgYHN0ZXBfc3RhcnRlZGAgc3VjY2VlZGVkKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXF1ZXVlZCBwZXItc3RlcCBhcyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheTsgYHRocm90dGxlZGAgc3RlcHMgKHJlamVjdGVkIG9uIHRoZSBjcmVhdGUtY2xhaW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBuZXZlciBjcmVhdGVkKSBpbnN0ZWFkIGRlZmVyIHJlZGVsaXZlcnkgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2Ugc28gdGhleSByZS1ydW4gaW5saW5lIHdpdGggaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlcGxheTsgY29tcGxldGVkL2ZhaWxlZCBzdGVwcyBhbHJlYWR5IHdyb3RlIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudHMuIFdlIG9ubHkgbG9vcCBiYWNrIHRvIHJlcGxheSB3aGVuIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUsIG90aGVyd2lzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXBlbmRpbmcgc3RlcHMgd2lsbCBiZSByZS1ydW4gYnkgdGhlaXIgcXVldWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlcyBhbmQgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoIHJlcGxheXMgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiAodHlwZW9mIGlubGluZUV4ZWN1dGlvbnMpW251bWJlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW55UGVuZGluZ09wcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB0aHJvdHRsZWQgaW5saW5lIHN0ZXAgZGVsYXlzIHJlZGVsaXZlcnkgb2YgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYmVpbmcgcmUtcXVldWVkIGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcC4gQ3J1Y2lhbGx5LCBhIGB0aHJvdHRsZWRgIHJlc3VsdCBtZWFuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgd2FzIHJlamVjdGVkIG9uIHRoZSBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSwgc28gdGhlIHN0ZXAgd2FzIE5FVkVSIGNyZWF0ZWQgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgbm8gc3RlcCBlbnRpdHkpLiBSZS1xdWV1aW5nIGl0IGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcCB3b3VsZCBzZW5kIGEgYmFyZSBgc3RlcF9zdGFydGVkYCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0KSwgd2hpY2ggdGhlIHdvcmxkIHJlamVjdHMgd2l0aCBgU3RlcCBcIjxpZD5cIiBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kYCBiZWNhdXNlIGl0IGNhbm5vdCBsYXppbHkgY3JlYXRlIHRoZSBzdGVwIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbnB1dDsgdGhhdCBlcnJvciBpc24ndCB0cmFuc2xhdGFibGUsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZWRlbGl2ZXJzIHVudGlsIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGFuZCBydW4pIGZhaWwuIERlZmVycmluZyByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIGluc3RlYWQgcmUtYXR0ZW1wdHMgdGhlIHRocm90dGxlZCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgV0lUSCBpdHMgaW5wdXQgb24gcmVwbGF5LiBXZSB0cmFjayB0aGUgbG9uZ2VzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja29mZiBzbyBhIGJhdGNoIHdpdGggbXVsdGlwbGUgdGhyb3R0bGVzIHdhaXRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4LiBOb3RlOiBgcmV0cnlgIHJlc3VsdHMgYXJlIHNhZmUgdG8gcmUtcXVldWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgYmVjYXVzZSBhIHJldHJ5IGltcGxpZXMgYHN0ZXBfc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgc3VjY2VlZGVkIGFuZCB0aGUgc3RlcCBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGVUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHN0ZXBSZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaW5saW5lRXhlY3V0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiByLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlQZW5kaW5nT3BzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXIgcmVkZWxpdmVyeSBvZiB0aGUgb3JjaGVzdHJhdG9yIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdHRsZSBiYWNrb2ZmLiBPbiByZXBsYXkgZXZlcnkgbm9uLXRlcm1pbmFsIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcmUtZGlzcGF0Y2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtdGhyb3R0bGVkIHN0ZXBzIHJ1biBpbmxpbmUgYWdhaW4gV0lUSCB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCAodGhlaXIgYHN0ZXBfY3JlYXRlZGAgaXMgZGVmZXJyZWQgYW5ldyksIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgYHJldHJ5YCBzdGVwcyBpbiB0aGlzIGJhdGNoIGFyZSBxdWV1ZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93biByZXRyeUFmdGVyIGhvbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmFsIHN0ZXBzIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVkIGZyb20gdGhlaXIgZXZlbnRzIGFuZCBub3QgcmUtcnVuLiBCZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXkgZHJpdmVzIGFsbCByZW1haW5pbmcgd29yaywgd2UgbXVzdCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyByZS1xdWV1ZSBgdG9SZXRyeWAgaGVyZSwgc2luY2UgdGhhdCB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGUtZGlzcGF0Y2ggdGhvc2Ugc3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmV0dXJucyBCRUZPUkUgdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3csIHNvIGEgYmF0Y2ggdGhhdCBtaXhlcyBhIHRocm90dGxlIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc3RlcCB0aGF0IGxlZnQgdW5mbHVzaGVkIG9wcyBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGUgZXhwbGljaXQgZmx1c2ggY29udGludWF0aW9uLiBUaGF0IGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdGhyb3R0bGUgYmFja29mZiAoPj0gMXMpIGFsd2F5cyBleGNlZWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1pbnZvY2F0aW9uIGZsdXNoIHdpbmRvdyAoPD0gNTAwbXMgKyB3YWl0VW50aWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBvcHMgc2V0dGxlIGJlZm9yZSB0aGUgcG9zdC1iYWNrb2ZmIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cyBhbmQgcmVhZHMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKHRocm90dGxlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlUcmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkubWFwKCh7IHN0ZXAsIGRlbGF5U2Vjb25kcyB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXRyeVRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Db250ZXh0OiBydW5EaXNwYXRjaENvbnRleHQod29ya2Zsb3dSdW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSB0aGUgZGVsYXllZCByZXRyeSBvbiB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2gga2V5IHNvIGl0IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCByZS1kaXNwYXRjaCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyZm9ybXMgb24gcmVwbGF5IChpdCB1c2VzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIG1peGVkIGJhdGNoIHdoZXJlIG9uZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbXBsZXRlZGAgd2l0aCB1bmZsdXNoZWQgYmFja2dyb3VuZCBvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYGFueVBlbmRpbmdPcHNgKSBhbmQgYW5vdGhlciBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgd291bGQgZG91YmxlLWRpc3BhdGNoIHRoZSByZXRyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaCBiZWxvdyBxdWV1ZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcGxhaW4gY29udGludWF0aW9uLCB3aG9zZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVzIHRoZSBzdGlsbC1gcmV0cnlpbmdgIHN0ZXAgYXMgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1kaXNwYXRjaGVzIGl0ICppbW1lZGlhdGVseSogYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndpdGgqIGEga2V5LiBTaW5jZSB0aGlzIGRlbGF5ZWQgcmV0cnkgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8ga2V5LCB0aGUgdHdvIG1lc3NhZ2VzIHdvdWxkbid0IGRlZHVwZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCB3b3VsZCBydW4gdHdpY2UsIHRoZSBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYmFja29mZiB3b3VsZCBiZSBpZ25vcmVkIChwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFcnJvcmAgcmV0cmllcyBwZXJzaXN0IG5vIGByZXRyeUFmdGVyYCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ybGQgaGFzIG5vIGBUb29FYXJseWAgZ3VhcmQpLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYm9keSBjb3VsZCBydW4gZWFybHkvY29uY3VycmVudGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJpbmcgdGhlIGtleSBsZXRzIHRoZSBlYXJsaWVyIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHdpbiwgaG9ub3JpbmcgdGhlIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGVwTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCBwZW5kaW5nIGJhY2tncm91bmQgb3BlcmF0aW9ucyBmbHVzaCBiZWZvcmUgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSByZWFkcyB0aGVpciByZXN1bHRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFueVBlbmRpbmdPcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnJlYWtpbmcgbG9vcDogaW5saW5lIHN0ZXAgaGFzIHBlbmRpbmcgb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBsb29wSXRlcmF0aW9uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBpbmxpbmUgc3RlcHMgd2lsbCBiZSByZS1ydW4gdmlhIHRoZWlyIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBtZXNzYWdlczsgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbGwgc3RlcHMgYXJlIHRlcm1pbmFsLiBEb24ndCBsb29wIGhlcmU6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyBzdGVwcyBoYXZlIG5vIHRlcm1pbmFsIGV2ZW50IHRvIG9ic2VydmUgeWV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBpbmxpbmUgc3RlcHMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpLCBzbyBsb29wIGJhY2sgdG8gcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHdvcmtmbG93IG9ic2VydmVzIHRoZSB0ZXJtaW5hbCBldmVudHMgb24gcmVwbGF5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBhbnkgaW5saW5lIGRlbHRhLiBJZiBpdCBpcyBwYXJ0aWFsLCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBpdHMgY3Vyc29yIGluc3RlYWQgb2YgcmVhZGluZyB0aGUgcGFnZSBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVFeGVjdXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmx5ID0gc3RlcFJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbmx5LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmIG9ubHkuaW5saW5lRGVsdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywgb25seS5pbmxpbmVEZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBvbmx5LmlubGluZURlbHRhLmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gb2YgYSBndWFyZGVkIHdyaXRlIG1hZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGJ5IHRoZSByZXBsYXkgbG9vcDogdGhlIHJlc3VsdC1iZWFyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcnVuX2NvbXBsZXRlZGAsIG9yIHRoZSBgd2FpdF9jb21wbGV0ZWRgIG9mIHRoZSB3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzLiBCb3RoIHJlYWNoIHRoaXMgb25lIGNhdGNoIGFuZCB0aGUgcmVqZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBzYXkgd2hpY2gsIGhlbmNlIHRoZSBuZXV0cmFsIGxhYmVsLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVpdGhlciBtYXkgYmUgcmUtcG9zdGVkIGluIHBsYWNlOiB0aGUgY29ycmVsYXRpb24gaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCAoZm9yIHJ1bl9jb21wbGV0ZWQpIHRoZSByZXN1bHQgaXRzZWxmIGNhbWUgZnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZXBsYXksIGFuZCBhIGNvcnJlY3RlZCBsb2cgbWF5IHByb2R1Y2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBvbmVzLiBEb24ndCBmYWlsIHRoZSBydW46IHJlc3RhcnQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgaW4gdGhpcyBpbnZvY2F0aW9uLCBhbmQgb25seSBvbmNlIHRoYXQgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzcGVudCBzY2hlZHVsZSBhbiBleHBsaWNpdCByZS1pbnZvY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0aHJvd2luZyBpbnN0ZWFkIHdvdWxkIHJlbHkgb24gcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgbWVzc2FnZSwgd2hpY2ggdGhlIHR1cmJvIHBhdGggaGFzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkLiBFbXBpcmljYWxseSB0aGUgcnVuIHRoZW4gc3RhbGxzIGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlJ3MgfjMwMHMgZGVmYXVsdCB2aXNpYmlsaXR5IHRpbWVvdXQgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0aW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm1pbmFsRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdGFydFJlcGxheUluUHJvY2VzcygncmVwbGF5LXdyaXRlJywgZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPSBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcGxheS13cml0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0aW9uLnJlaW52b2tlZCkgcmV0dXJuIGVzY2FsYXRpb24ucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudC4gRmFsbCB0aHJvdWdoIHRvIHRoZSB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGJlbG93IGluc3RlYWQgb2YgcmV0aHJvd2luZzogdGhpcyBjYXRjaCBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxpbmcgdGhlIHJ1biwgYW5kIGEgcmV0aHJvdyB3b3VsZCBlc2NhcGUgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIGhhbmRsZXIgYW5kIGJlIHJlZGVsaXZlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yID0gZXNjYWxhdGlvbi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGluZnJhc3RydWN0dXJlIGZhaWx1cmVzIHRhbGtpbmcgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZCAod29ya2Zsb3ctc2VydmVyKSwgc3VjaCBhcyBhbiBleGhhdXN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5QWdlbnQgKFVORF9FUlJfUkVRX1JFVFJZIGZyb20gYSBzdXN0YWluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQyOS81MDMgc3Rvcm0pLCBhIGRyb3BwZWQgc29ja2V0LCBhIGNvbm5lY3QvRE5TXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlLCBvciBhIGNsaWVudCB0aW1lb3V0LCBtdXN0IE5PVCBmYWlsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuLiBSZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIHJldHJpZXMgdGhlIHJlcGxheSBvbmNlIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVycy4gVGhlIEB2ZXJjZWwvcXVldWUgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGllcyBhIGZhc3QgKDFz4oaSNjBzKSBiYWNrb2ZmIGJ5IGRlbGl2ZXJ5IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWRpbmcgdGhlIH41bWluIGRlZmF1bHQgdmlzaWJpbGl0eS10aW1lb3V0IHJlZHJpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChhbmQgbmV2ZXIga2lsbGluZyB0aGUgcHJvY2VzcyB2aWEgcnVuX2ZhaWxlZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyYW5zaWVudCB3b3JsZCBlcnJvciBkdXJpbmcgcmVwbGF5OyByZWRlbGl2ZXJpbmcgdmlhIHF1ZXVlIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcnVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZWQgZm9yIGEgZGl2ZXJnZW5jZSBzbyB0aGUgdGVybWluYWwgbG9nIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIHRoZSBzYW1lIGNvbnRleHQgdGhlIFdBUk4gZG9lcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXZlcmdlbmNlRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVjb3ZlcnlSZXBsYXlzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBkaXZlcmdlbmNlIGluIHRoaXMgcmVjb3ZlcnkgY2hhaW4sIG9sZGVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCwgYm91bmRlZCBieSB0aGUgY2hhaW4ncyBvd24gbGVuZ3RoOiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5IHJlcGxheSBpcyBxdWV1ZWQgYXQgbW9zdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgbWF4UmVjb3ZlcnlSZXBsYXlzYCB0aW1lcywgc28gdGhlIHRlcm1pbmFsIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkcyBgbWF4UmVjb3ZlcnlSZXBsYXlzICsgMWAgaWRzLiBBIHByb2R1Y2VyIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZGF0ZXMgdGhlIGZpZWxkLCBvciBvbmUgd2hvc2UgdmFsdWUgZmFpbGVkIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlLCBjb250cmlidXRlcyBub3RoaW5nIGFuZCB0aGUgaGlzdG9yeSByZXN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgcHJpb3IgbWVzc2FnZSdzIGBldmVudElkYC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2ZXJnZW5jZUV2ZW50SWRzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkcyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbcmVwbGF5RGl2ZXJnZW5jZS5ldmVudElkXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0uc2xpY2UoLShtYXhSZWNvdmVyeVJlcGxheXMgKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoaWNoIHBhc3Mgb2Ygd2hpY2ggaW52b2NhdGlvbiBkaXZlcmdlZCwgYW5kIHdoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBwYXNzIHdhcyB3b3JraW5nIGZyb20uIEFsbCBvZiBpdCBpcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHNjb3BlOyBub25lIG9mIGl0IGlzIGFub3RoZXIgcm91bmQgdHJpcC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IGlzIHRoYXQgYSBkaXZlcmdlbmNlIG9uIGEgY29sZCByZXBsYXkgb2YgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdWxsIGxvZyBhbmQgb25lIG9uIGEgcmV0YWluZWQtVk0gcmVzdW1lIG9mIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgYXJlIGRpZmZlcmVudCBidWdzLCBhbmQgdGhlIG1lc3NhZ2UgYWxvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgc2F5IHdoaWNoIHRoaXMgd2FzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlRmllbGRzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvckRpdmVyZ2VuY2VFdmVudElkOiByZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlY292ZXJ5UmVwbGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlZEJ5UmV0YWluZWRTZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nU3RhdGU6IGV2ZW50TG9nLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2dMZW5ndGg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAnbG9hZEFsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudExvZy5ldmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nTGFzdEV2ZW50SWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAnbG9hZEFsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudExvZy5ldmVudHMuYXQoLTEpPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZXZlbnRMb2cuY3Vyc29yID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSG9va0lucHV0OiBob29rSW5wdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNXYWl0Q29udGludWF0aW9uOiB3YWl0Q29udGludWF0aW9uICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZWNvdmVyeVJlcGxheTogcmVwbGF5RGl2ZXJnZW5jZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwU291cmNlOiByZXN1bWVUcmFja2luZz8uc2V0dXBTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpdmVyZ2VuY2VDb3VudCA8PSBtYXhSZWNvdmVyeVJlcGxheXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQ7IHF1ZXVlaW5nIGEgcmVjb3ZlcnkgcmVwbGF5IGJlZm9yZSBkZWNsYXJpbmcgdGhlIGV2ZW50IGxvZyBjb3JydXB0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuLi5kaXZlcmdlbmNlRmllbGRzLCBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkczogZGl2ZXJnZW5jZUV2ZW50SWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSA9IGRpdmVyZ2VuY2VDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQgJHtkaXZlcmdlbmNlQ291bnR9IHRpbWVzIGFmdGVyICR7bWF4UmVjb3ZlcnlSZXBsYXlzfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfTsgZGl2ZXJnZW50IGV2ZW50IGlkczogJHtkaXZlcmdlbmNlRXZlbnRJZHMuam9pbignLCAnKX0uIExhc3QgZGl2ZXJnZW5jZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheVN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgY29kZSBlcnJvcnMgYW5kIHRlcm1pbmFsIHJ1bnRpbWUgZXJyb3JzIGZhaWwgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4odGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5uYW1lIHx8IGdldEVycm9yTmFtZSh0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayh0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvcjogV29ya2Zsb3dSdW50aW1lRXJyb3IgaW5kaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBTREsvcnVudGltZSBpc3N1ZSwgYW5kIHNlbGVjdGVkIHN1YmNsYXNzZXMgdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHNwZWNpZmljIGNvZGVzIGZvciBiYWNrZW5kIHRyYWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcih0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignRXJyb3Igd2hpbGUgcnVubmluZyB3b3JrZmxvdycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGl2ZXJnZW5jZSBjb250ZXh0IGZpcnN0IHNvIHRoZSBjbGFzc2lmaWVkIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5hbWUgb2YgdGhlIHRlcm1pbmFsIGVycm9yIHdpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGl2ZXJnZW5jZUZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29uc29sZSByZW5kZXJlciBkcm9wcyBgZXJyb3JTdGFja2Agb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtcHRpb24gdGhhdCB0aGUgbWVzc2FnZSBib2R5IGNhcnJpZXMgaXQsIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lc3NhZ2UgaGFzIG5vIGJvZHksIHNvIHdpdGhvdXQgdGhpcyByb3cgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGVycm9yJ3MgdGV4dCBuZXZlciByZWFjaGVzIHRoZSBjb25zb2xlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtOiBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIGZyb20gdGhpcyBsb29wIGl0IGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90IHNuYXBzaG90LCBzbyBhIFdvcmxkIHRoYXQgZmVuY2VzIGNhbiByZWplY3QgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhIHNsb3QtYWxsb2NhdGluZyBvbmUgcmVwb3J0cyBiYWNrIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHJlcGxheSBoYWQgbm90IHNlZW4uIEZhaWwtb3BlbiBvbiBwdXJwb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBuZWl0aGVyIGFwcGxpZXM6IGEgc3B1cmlvdXMgZmFpbHVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgKHRoZSBydW4gY2FuIGJlIHJlLXJ1biBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGFzaGJvYXJkKSwgd2hlcmVhcyBhIHNwdXJpb3VzICpjb21wbGV0aW9uKiBjb21taXRzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIHJlc3VsdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbmNyeXB0aW9uS2V5LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFpbEVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG5cbiAgbGV0IGNhY2hlZEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG4gIGxldCBpbnZvY2F0aW9uQ291bnQgPSAwO1xuICBjb25zdCBlbnRyeXBvaW50Q3JlYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgcm91dGVNb2R1bGVCb2R5SW5pdE1zID1cbiAgICB0eXBlb2Ygb3B0aW9ucz8ucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID09PSAnbnVtYmVyJ1xuICAgICAgPyBlbnRyeXBvaW50Q3JlYXRlZEF0IC0gb3B0aW9ucy5yb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB3aXRoSGVhbHRoQ2hlY2soYXN5bmMgKHJlcSkgPT4ge1xuICAgIGludm9jYXRpb25Db3VudCArPSAxO1xuICAgIGNvbnN0IGhhbmRsZXJDYWNoZWQgPSBjYWNoZWRIYW5kbGVyICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnU0VSVkVSJyk7XG5cbiAgICByZXR1cm4gdHJhY2UoXG4gICAgICAnd29ya2Zsb3cucm91dGUuZmxvdycsXG4gICAgICB7XG4gICAgICAgIGtpbmQ6IHNwYW5LaW5kLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVUeXBlKCdmbG93JyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkZhYXNJbnN0YW5jZShDT01QVVRFX0lOU1RBTkNFX0lEKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUhhbmRsZXJDYWNoZWQoaGFuZGxlckNhY2hlZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQoaW52b2NhdGlvbkNvdW50KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUVudHJ5cG9pbnRBZ2VNcyhcbiAgICAgICAgICAgIERhdGUubm93KCkgLSBlbnRyeXBvaW50Q3JlYXRlZEF0XG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi4ocm91dGVNb2R1bGVCb2R5SW5pdE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogQXR0cmlidXRlLldvcmtmbG93Um91dGVNb2R1bGVCb2R5SW5pdE1zKHJvdXRlTW9kdWxlQm9keUluaXRNcykpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUmVxdWVzdE1ldGhvZChyZXEubWV0aG9kKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJvdXRlKCcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIGlmICghY2FjaGVkSGFuZGxlcikge1xuICAgICAgICAgIGNhY2hlZEhhbmRsZXIgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuaW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoZSBmdWxsIHJ1bnRpbWUgV29ybGQsIG5vdCBgZ2V0V29ybGRIYW5kbGVycygpYC4gVGhhdCBhY2Nlc3NvclxuICAgICAgICAgICAgLy8gb3ducyBhIHNlY29uZCwgYnVpbGQtdGltZS1zYWZlIGNhY2hlLCBzbyBjYWxsaW5nIGl0IGhlcmUgYnVpbHQgYVxuICAgICAgICAgICAgLy8gc2Vjb25kIFdvcmxkIGluIHRoZSBzYW1lIHByb2Nlc3M6IGR1cGxpY2F0ZSBjb25uZWN0aW9uIHBvb2xzIGFuZFxuICAgICAgICAgICAgLy8gcXVldWUgd29ya2VycyBmb3IgYSBzdGF0ZWZ1bCBXb3JsZCwgcGx1cyBhIHNlY29uZCBjb3B5IG9mIHRoYXRcbiAgICAgICAgICAgIC8vIHdvcmxkIHBhY2thZ2UncyBtb2R1bGVzIG9uY2UgaXQgaXMgYnVuZGxlZCwgd2hpY2ggaXMgd2hhdFxuICAgICAgICAgICAgLy8gc2lsZW50bHkgZGVtb3RlZCB0aGUgZXZlbnRzIFdlYlNvY2tldCB0cmFuc3BvcnQgdG8gSFRUUC4gIzM2NjUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIHNwYW4ga2VlcHMgaXRzIG9yaWdpbmFsIG5hbWUuIEl0IGlzIGEgZGlzdGluY3Qgc3BhbiBmcm9tIHRoZVxuICAgICAgICAgICAgLy8gcGVyLXJlcXVlc3QgYHdvcmtmbG93LnJvdXRlLmdldF93b3JsZGAgYXQgdGhlIHRvcCBvZiB0aGUgZmxvd1xuICAgICAgICAgICAgLy8gcm91dGUsIGFuZCByZW5hbWluZyBpdCB3b3VsZCBjb2xsaWRlIHdpdGggdGhhdCBvbmUuXG4gICAgICAgICAgICBjb25zdCB3b3JsZEhhbmRsZXJzID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGRfaGFuZGxlcnMnLFxuICAgICAgICAgICAgICBhc3luYyAoKSA9PiBnZXRXb3JsZCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIod29ybGRIYW5kbGVycyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlZEhhbmRsZXIocmVxKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgQXR0cmlidXRlLkh0dHBSZXNwb25zZVN0YXR1c0NvZGUocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl19
4241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUUzQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUVqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFl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RSxnRUFBZ0U7b0JBQ2hFLHNEQUFzRDtvQkFDdEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLENBQy9CLG1DQUFtQyxFQUNuQyxLQUFLLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUN2QixDQUFDO29CQUNGLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLFFBQVEsWUFBWSxRQUFRLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxFQUFFLGFBQWEsQ0FDakIsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDbEQsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQvc3RyaWN0JztcbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgb25jZSwgc2V0V29ya2Zsb3dCYXNlUGF0aCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQge1xuICBwYXJzZVdvcmtmbG93TmFtZSxcbiAgd29ya2Zsb3dEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBDcmVhdGVFdmVudFBhcmFtcyxcbiAgdHlwZSBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHR5cGUgRXZlbnQsXG4gIHR5cGUgRXZlbnRSZXN1bHQsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzU2VhbGVkTm9vcEV2ZW50LFxuICBpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlLFxuICBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYSxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbiAgdHlwZSBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgeyBkZWNvZGVUaW1lIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJ1bkVycm9yLFxuICBpc1JldHJ5YWJsZVdvcmxkRXJyb3IsXG4gIGlzV29ybGRDb250cmFjdEVycm9yLFxufSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vcnVudGltZS9jb21wdXRlLWluc3RhbmNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1heEV2ZW50c092ZXJyaWRlLFxuICBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMsXG4gIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzLFxuICBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zLFxuICBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCxcbiAgaXNUdXJib0VuYWJsZWQsXG4gIGlzVm1SZXRlbnRpb25FbmFibGVkLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMgfSBmcm9tICcuL3J1bnRpbWUvY291bnQtc3RlcC1zdGFydGVkLWV2ZW50cy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIERlcGxveW1lbnRBZmZpbml0eU91dGNvbWUsXG4gIGd1YXJkRGVwbG95bWVudEFmZmluaXR5LFxuICB0eXBlIFJlZW5xdWV1ZUFyZ3MsXG59IGZyb20gJy4vcnVudGltZS9kZXBsb3ltZW50LWd1YXJkLmpzJztcbmltcG9ydCB7XG4gIGFic29yYlNraXBwZWRTbG90UmVwb3J0LFxuICBhcHBlbmRFdmVudExvZyxcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgaW5zZXJ0RXZlbnRCeUV2ZW50SWQsXG4gIGlzU2xvdEdhcENoZWNrRW5hYmxlZCxcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbG9hZFdvcmtmbG93UnVuRXZlbnRzLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXksXG4gIHJvb3RSdW5JZEZyb20sXG4gIHJ1bkRpc3BhdGNoQ29udGV4dCxcbiAgdHlwZSBTbG90U25hcHNob3RQYXJhbXMsXG4gIHNldHRsZUV2ZW50U2xvdEdhcCxcbiAgc2xvdFNuYXBzaG90UGFyYW1zLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbiAgd2l0aEhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5pbXBvcnQge1xuICBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQsXG4gIFJlcGxheUJ1ZGdldCxcbn0gZnJvbSAnLi9ydW50aW1lL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlciB9IGZyb20gJy4vcnVudGltZS9yZXBsYXktcmVjb3ZlcnktcmVwb3J0ZXIuanMnO1xuaW1wb3J0IHtcbiAgcmVzdW1lVGltaW5nRm9yTWVzc2FnZSxcbiAgcmVzdW1lVHJhY2tpbmdGcm9tTWVzc2FnZSxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1sYXRlbmN5LmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW50aW1lL3J1bi1pZC10aW1lLmpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyxcbiAgZXhlY3V0ZVN0ZXAsXG4gIHR5cGUgUHJlY2xhaW1lZElubGluZVN0YXJ0LFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyB9IGZyb20gJy4vcnVudGltZS9zdGVwLWxhdGVuY3kuanMnO1xuaW1wb3J0IHtcbiAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSxcbiAgaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZSxcbiAgaXNTdGVwT3duZXJzaGlwQWN0aXZlLFxuICBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzLFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1vd25lcnNoaXAuanMnO1xuaW1wb3J0IHsgcnVuU3RlcFNpbmdsZUZsaWdodCB9IGZyb20gJy4vcnVudGltZS9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlU3VzcGVuc2lvbixcbiAgdHlwZSBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXIsXG59IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgdXNlUXVpY2tKU1ZtIH0gZnJvbSAnLi9ydW50aW1lL3ZtLW1vZGUuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi9ydW50aW1lL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkLCB0eXBlIFdvcmxkSGFuZGxlcnMgfSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlUnVuRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrIH0gZnJvbSAnLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQge1xuICBiaW5kQWN0aXZlVHJhY2VDb250ZXh0LFxuICBidWlsZEludm9jYXRpb25TcGFuTGlua3MsXG4gIGdldE5leHRUcmFjZUNhcnJpZXIsXG4gIGdldFNwYW5LaW5kLFxuICBnZXRXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaXNVc2FibGVUcmFjZUNhcnJpZXIsXG4gIHRyYWNlLFxuICB3aXRoVHJhY2VDb250ZXh0LFxuICB3aXRoV29ya2Zsb3dCYWdnYWdlLFxufSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRFcnJvckNhdXNlQ2hhaW4sXG4gIGdldEVycm9yTmFtZSxcbiAgZ2V0RXJyb3JTdGFjayxcbiAgbm9ybWFsaXplVW5rbm93bkVycm9yLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQge1xuICBjb21waWxlV29ya2Zsb3dCdW5kbGUsXG4gIHJlcGxheVdvcmtmbG93LFxuICByZXN1bWVXb3JrZmxvdyxcbiAgdHlwZSBXb3JrZmxvd1Jlc3VtZVJlc3VsdCxcbiAgdHlwZSBXb3JrZmxvd1Nlc3Npb24sXG59IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9O1xuZXhwb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBIZWFsdGhDaGVja09wdGlvbnMsXG4gIHR5cGUgSGVhbHRoQ2hlY2tSZXN1bHQsXG4gIGhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBnZXRIb29rQnlUb2tlbixcbiAgdHlwZSBIb29rLFxuICB0eXBlIFJlc3VtZWRIb29rLFxuICByZXN1bWVIb29rLFxuICByZXN1bWVXZWJob29rLFxufSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnO1xuZXhwb3J0IHtcbiAgZ2V0UnVuLFxuICBSdW4sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbSxcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBXb3JrZmxvd1J1bldyaXRhYmxlU3RyZWFtT3B0aW9ucyxcbn0gZnJvbSAnLi9ydW50aW1lL3J1bi5qcyc7XG5leHBvcnQge1xuICB0eXBlIENhbmNlbFJ1bk9wdGlvbnMsXG4gIGNhbmNlbFJ1bixcbiAgY2FuY2VsUnVucyxcbiAgbGlzdFN0cmVhbXMsXG4gIHR5cGUgUmVhZFN0cmVhbU9wdGlvbnMsXG4gIHR5cGUgUmVjcmVhdGVSdW5PcHRpb25zLFxuICB0eXBlIFJlZW5xdWV1ZVJ1bk9wdGlvbnMsXG4gIHJlYWRTdHJlYW0sXG4gIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nLFxuICByZWVucXVldWVSdW4sXG4gIHR5cGUgU3RvcFNsZWVwT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBSZXN1bHQsXG4gIHdha2VVcFJ1bixcbn0gZnJvbSAnLi9ydW50aW1lL3J1bnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBTdGFydE9wdGlvbnMsXG4gIHR5cGUgU3RhcnRPcHRpb25zQmFzZSxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQsXG4gIHN0YXJ0LFxufSBmcm9tICcuL3J1bnRpbWUvc3RhcnQuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV29ybGQsXG4gIGNyZWF0ZVdvcmxkRnJvbU1vZHVsZSxcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHNldFdvcmxkLFxuICB0eXBlIFdvcmxkRmFjdG9yeU1vZHVsZSxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcblxuLyoqXG4gKiBBcHBseSB0aGUgb3B0aW9uYWwgY2xpZW50LXNpZGUgZXZlbnQtbGltaXQgb3ZlcnJpZGUuXG4gKiBgV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERWAsIHdoZW4gc2V0IHRvIGEgcG9zaXRpdmUgaW50ZWdlciwgY2xhbXBzIHRoZVxuICogc2VydmVyLXN1cHBsaWVkIHBlci1ydW4gZXZlbnQgY2VpbGluZyB0byBhIHNtYWxsZXIgdmFsdWUgc28gZW5mb3JjZW1lbnQgY2FuXG4gKiBiZSBleGVyY2lzZWQgd2l0aG91dCBhIHNlcnZlci1zaWRlIGNoYW5nZS4gQ2xhbXAtZG93biBvbmx5OiBpdCBuZXZlciByYWlzZXNcbiAqIHRoZSBzZXJ2ZXIncyBsaW1pdCwgYW5kIGl0IHRha2VzIGVmZmVjdCBldmVuIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIG5vbmUuXG4gKiBVbnNldCDih5Igc2VydmVyIHZhbHVlIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gY2xhbXBNYXhFdmVudHMoc2VydmVyVmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG92ZXJyaWRlID0gZ2V0TWF4RXZlbnRzT3ZlcnJpZGUoKTtcbiAgaWYgKG92ZXJyaWRlID09PSB1bmRlZmluZWQpIHJldHVybiBzZXJ2ZXJWYWx1ZTtcbiAgcmV0dXJuIHNlcnZlclZhbHVlID09PSB1bmRlZmluZWQgPyBvdmVycmlkZSA6IE1hdGgubWluKHNlcnZlclZhbHVlLCBvdmVycmlkZSk7XG59XG5cbi8qKlxuICogUmVmdXNlIGEgcXVldWUgZGVsaXZlcnkgd2hvc2UgcnVuIHdhcyBjcmVhdGVkIGluIGEgZGlmZmVyZW50IGVudmlyb25tZW50IHRoYW5cbiAqIHRoaXMgZGVwbG95bWVudCBydW5zIGluLlxuICpcbiAqIGBzdGFydCgpYCBwZXJmb3JtcyB0d28gd3JpdGVzIHRoYXQgbXVzdCBsYW5kIGluIHRoZSBzYW1lIHRlbmFudDogdGhlXG4gKiBgcnVuX2NyZWF0ZWRgIGV2ZW50LCBhdHRyaWJ1dGVkIHRvIHdoYXRldmVyIGVudmlyb25tZW50IHRoZSAqY2FsbGVyKlxuICogYXV0aGVudGljYXRlcyBhcywgYW5kIHRoZSBxdWV1ZSBtZXNzYWdlLCBwaW5uZWQgdG8gYSAqZGVwbG95bWVudCouIEFcbiAqIG1pc2NvbmZpZ3VyZWQgY2FsbGVyIGNhbiBzcGxpdCB0aGVtLCB3cml0aW5nIHRoZSBydW4gdG8gb25lIGVudmlyb25tZW50XG4gKiB3aGlsZSBhZGRyZXNzaW5nIHRoZSBtZXNzYWdlIHRvIGEgZGVwbG95bWVudCBpbiBhbm90aGVyLiBUaGUgY29uc3VtZXIgdGhlblxuICogZmluZHMgbm8gcnVuIHVuZGVyIGl0cyBvd24gdGVuYW50IGFuZCB0aGUgYmFja2VuZCdzIHJlc2lsaWVudCBzdGFydFxuICogKGBydW5fc3RhcnRlZGAgY3JlYXRlcyB0aGUgcnVuIHdoZW4gYHJ1bl9jcmVhdGVkYCB3YXMgbmV2ZXIgc2VlbikgbWludHMgYVxuICogU0VDT05EIGNvcHkgb2YgdGhlIHNhbWUgcnVuIGlkIGluIHRoaXMgZW52aXJvbm1lbnQuIEJvdGggY29waWVzIGFyZSByZWFsOiB0aGVcbiAqIGNyZWF0b3IncyBzaXRzIHBlbmRpbmcgZm9yZXZlciwgdGhpcyBvbmUgZXhlY3V0ZXMsIGFuZCBldmVyeSBzdWJzZXF1ZW50XG4gKiBjcm9zcy10ZW5hbnQgcXVldWUgYWNrIGZhaWxzIHRvIGZpbmQgaXRzIG1lc3NhZ2UuXG4gKlxuICogTm90aGluZyBleHRlcm5hbCBpcyBuZWVkZWQgdG8gY2F0Y2ggdGhpczogdGhlIGNyZWF0b3IncyBlbnZpcm9ubWVudCByaWRlcyB0aGVcbiAqIG1lc3NhZ2UgaW4gYHJ1bklucHV0LmVudmlyb25tZW50YCBhbmQgdGhpcyBwcm9jZXNzIGFscmVhZHkga25vd3MgaXRzIG93bi4gU29cbiAqIGNvbXBhcmUgdGhlbSBhbmQgc3RvcCBCRUZPUkUgYHJ1bl9zdGFydGVkYCwgdGhlIHdyaXRlIHRoYXQgd291bGQgY3JlYXRlIHRoZVxuICogZm9yay4gUmVmdXNpbmcgYWZ0ZXIgaXQgd291bGQgYmUgdG9vIGxhdGUuXG4gKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgY2FsbGVyIG11c3QgYWJhbmRvbiB0aGUgZGVsaXZlcnkuIFNraXBwZWQgd2hlbmV2ZXJcbiAqIGVpdGhlciBzaWRlIGlzIHVua25vd24sIHdoaWNoIGtlZXBzIGV2ZXJ5IGV4aXN0aW5nIHNldHVwIG9uIGl0cyBjdXJyZW50XG4gKiBiZWhhdmlvcjogd29ybGRzIHdpdGggbm8gZW52aXJvbm1lbnQgZGltZW5zaW9uIChgd29ybGQtbG9jYWxgLFxuICogYHdvcmxkLXBvc3RncmVzYCkgZG9uJ3QgaW1wbGVtZW50IGBnZXRFbnZpcm9ubWVudGAsIGFuZCBydW5zIHN0YXJ0ZWQgYnkgYW5cbiAqIG9sZGVyIFNESyBjYXJyeSBubyBgZW52aXJvbm1lbnRgIGZpZWxkLlxuICovXG5mdW5jdGlvbiByZWZ1c2VDcm9zc0Vudmlyb25tZW50RGVsaXZlcnkoe1xuICB3b3JsZCxcbiAgcnVuSW5wdXQsXG4gIHJ1bklkLFxuICBydW5Mb2dnZXIsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgcnVuSW5wdXQ6IFJ1bklucHV0IHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICBydW5Mb2dnZXI6IExvZ2dlcjtcbn0pOiBib29sZWFuIHtcbiAgY29uc3QgY3JlYXRvckVudmlyb25tZW50ID0gcnVuSW5wdXQ/LmVudmlyb25tZW50O1xuICBpZiAoIWNyZWF0b3JFbnZpcm9ubWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGN1cnJlbnRFbnZpcm9ubWVudCA9IHdvcmxkLmdldEVudmlyb25tZW50Py4oKTtcbiAgaWYgKCFjdXJyZW50RW52aXJvbm1lbnQgfHwgY3VycmVudEVudmlyb25tZW50ID09PSBjcmVhdG9yRW52aXJvbm1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgYFJlZnVzaW5nIHRvIHJ1biB0aGlzIHdvcmtmbG93OiBpdCB3YXMgY3JlYXRlZCBpbiB0aGUgXCIke2NyZWF0b3JFbnZpcm9ubWVudH1cIiBgICtcbiAgICAgIGBlbnZpcm9ubWVudCBidXQgdGhpcyBkZXBsb3ltZW50IHJ1bnMgaW4gXCIke2N1cnJlbnRFbnZpcm9ubWVudH1cIi4gYCArXG4gICAgICAnRXhlY3V0aW5nIGl0IGhlcmUgd291bGQgY3JlYXRlIGEgc2Vjb25kIGNvcHkgb2YgdGhlIHNhbWUgcnVuIGlkIGluICcgK1xuICAgICAgJ2JvdGggZW52aXJvbm1lbnRzIOKAlCBvbmUgcGVuZGluZyBmb3JldmVyLCBvbmUgcnVubmluZyDigJQgc28gdGhlIHF1ZXVlICcgK1xuICAgICAgJ21lc3NhZ2UgaXMgYmVpbmcgZGlzY2FyZGVkIHdpdGhvdXQgZXhlY3V0aW5nIGFuZCB3aXRob3V0IHJldHJ5aW5nLiAnICtcbiAgICAgICdUaGUgY2xpZW50IHRoYXQgY2FsbGVkIHN0YXJ0KCkgd3JvdGUgdGhlIHJ1biB0byBpdHMgb3duIGVudmlyb25tZW50ICcgK1xuICAgICAgJ2J1dCBhZGRyZXNzZWQgdGhlIHF1ZXVlIG1lc3NhZ2UgdG8gYSBkZXBsb3ltZW50IGluIGFub3RoZXIgb25lLiBDaGVjayAnICtcbiAgICAgICd0aGF0IHRoZSBlbnZpcm9ubWVudCB0aGF0IGNsaWVudCBhdXRoZW50aWNhdGVzIGFzIChXT1JLRkxPV19WRVJDRUxfRU5WICcgK1xuICAgICAgXCJmb3IgQ0xJIGFuZCBDSSBjbGllbnRzLCBvciB0aGUgT0lEQyB0b2tlbidzIGVudmlyb25tZW50IGluc2lkZSBhIFwiICtcbiAgICAgICdkZXBsb3ltZW50KSBtYXRjaGVzIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgZGVwbG95bWVudCBpdCB0YXJnZXRzLiBUaGUgJyArXG4gICAgICBgcnVuIGl0IGNyZWF0ZWQgaXMgc3RpbGwgcGVuZGluZyBpbiBcIiR7Y3JlYXRvckVudmlyb25tZW50fVwiIGFuZCB3aWxsIGAgK1xuICAgICAgJ25vdCBydW4uJyxcbiAgICB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGNyZWF0b3JFbnZpcm9ubWVudCxcbiAgICAgIGN1cnJlbnRFbnZpcm9ubWVudCxcbiAgICAgIHBpbm5lZERlcGxveW1lbnRJZDogcnVuSW5wdXQ/LmRlcGxveW1lbnRJZCxcbiAgICB9XG4gICk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIExvZyB3aGVuIGEgYHN0YXJ0KClgLWVucXVldWVkIG1lc3NhZ2UgcGlubmVkIHRvIG9uZSBkZXBsb3ltZW50IGlzIGRlbGl2ZXJlZFxuICogdG8gYSBkaWZmZXJlbnQgb25lLlxuICpcbiAqIEEgZmlyc3QtZGVsaXZlcnkgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dC5kZXBsb3ltZW50SWRgICh0aGUgZGVwbG95bWVudFxuICogYHN0YXJ0KClgIGFkZHJlc3NlZCBpdCB0byksIHNvIGNvbXBhcmluZyB0aGF0IGFnYWluc3QgdGhpcyBoYW5kbGVyJ3Mgb3duXG4gKiBkZXBsb3ltZW50IGRldGVjdHMgbWlzLWRlbGl2ZXJ5IGRpcmVjdGx5LiBUaGlzIGlzIGEgRElBR05PU1RJQywgbm90IGEgZ2F0ZTpcbiAqIGl0IHdhcm5zIGFuZCBsZXRzIHRoZSBpbnZvY2F0aW9uIHByb2NlZWQsIGRlbGliZXJhdGVseS5cbiAqXG4gKiBXaHkgdGhpcyBvbmUgb25seSB3YXJucyB3aGlsZSBpdHMgZW52aXJvbm1lbnQgc2libGluZyBhYm92ZSByZWZ1c2VzOiBhXG4gKiBkaWZmZXJpbmcgZGVwbG95bWVudCBpZCBpcyBub3QgYnkgaXRzZWxmIGV2aWRlbmNlIG9mIHRoZSBmb3JrIHdlIGNhcmUgYWJvdXQuXG4gKiBUaGUgZW52aXJvbm1lbnQgcGFpciBpcyBleGFjdCAodHdvIG5hbWVkIGVudmlyb25tZW50cyB0aGF0IGRpc2FncmVlKSBhbmQgaXRcbiAqIGlzIHRoZSBkaW1lbnNpb24gdGhlIHJ1bidzIHRlbmFudCBpcyBrZXllZCBvbi4gRGVwbG95bWVudCBpZHMgZGlzYWdyZWUgZm9yXG4gKiBiZW5pZ24gcmVhc29ucyB0b286IGB3b3JsZC1sb2NhbGAgZGVyaXZlcyBpdHMgaWQgZnJvbSB0aGUgaW5zdGFsbGVkIHBhY2thZ2VcbiAqIHZlcnNpb24gKGBkcGxfbG9jYWxAPHZlcnNpb24+YCksIHNvIHVwZ3JhZGluZyB0aGUgU0RLIG1pZC1ydW4gY2hhbmdlcyBpdCB3aXRoXG4gKiBub3RoaW5nIHdyb25nLiBSZWZ1c2luZyBvbiB0aGF0IHNpZ25hbCB3b3VsZCBzdHJhbmQgY29ycmVjdCBydW5zLCBhbmRcbiAqIHJlZnVzaW5nIGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGxlYXZlcyBubyBzZXJ2ZXItc2lkZSByZWNvcmQgdG8gZXhwbGFpbiB3aHkuXG4gKiBBbnlvbmUgdGVtcHRlZCB0byBwcm9tb3RlIHRoaXMgdG8gYSBoYXJkIGZhaWx1cmUgaGFzIHRvIGhhbmRsZSB0aGF0IGZpcnN0LlxuICpcbiAqIFNraXBwZWQgdW5sZXNzIEJPVEggaWRzIGFyZSBrbm93bjogYGdldERlcGxveW1lbnRJZCgpYCB0aHJvd3MgaW4gd29ybGRzIHRoYXRcbiAqIHJlcXVpcmUgYSBkZXBsb3ltZW50IGFuZCBoYXZlIG5vbmUsIGFuZCBhIHJlLWVucXVldWVkIG1lc3NhZ2UgY2FycmllcyBub1xuICogYHJ1bklucHV0YCBhdCBhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhcm5PbkRlcGxveW1lbnRQaW5uaW5nTWlzbWF0Y2goe1xuICB3b3JsZCxcbiAgcnVuSW5wdXQsXG4gIHJ1bklkLFxuICBydW5Mb2dnZXIsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgcnVuSW5wdXQ6IFJ1bklucHV0IHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICBydW5Mb2dnZXI6IExvZ2dlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlubmVkRGVwbG95bWVudElkID0gcnVuSW5wdXQ/LmRlcGxveW1lbnRJZDtcbiAgaWYgKCFwaW5uZWREZXBsb3ltZW50SWQpIHJldHVybjtcblxuICBsZXQgY3VycmVudERlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gV29ybGRzIHRoYXQgcmVxdWlyZSBhIGRlcGxveW1lbnQgaWQgdGhyb3cgd2hlbiB0aGVyZSBpc24ndCBvbmUuIFRoYXQgaXNcbiAgICAvLyBub3QgYSBtaXNtYXRjaDogdGhlcmUgaXMgbm90aGluZyB0byBjb21wYXJlIGFnYWluc3QuXG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghY3VycmVudERlcGxveW1lbnRJZCB8fCBjdXJyZW50RGVwbG95bWVudElkID09PSBwaW5uZWREZXBsb3ltZW50SWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgJ1F1ZXVlIG1lc3NhZ2Ugd2FzIGRlbGl2ZXJlZCB0byBhIGRlcGxveW1lbnQgaXQgd2FzIG5vdCBwaW5uZWQgdG8uICcgK1xuICAgICAgJ1RoZSBydW4gd2FzIGNyZWF0ZWQgdGFyZ2V0aW5nIGEgZGlmZmVyZW50IGRlcGxveW1lbnQsIHNvIHRoaXMgJyArXG4gICAgICAnaW52b2NhdGlvbiBtYXkgYmUgcmVwbGF5aW5nIGFnYWluc3QgY29kZSB0aGUgcnVuIHdhcyBub3Qgc3RhcnRlZCBvbi4gJyArXG4gICAgICAnQ29udGludWluZyDigJQgdGhpcyBpcyBleHBlY3RlZCBpZiB0aGUgV29ya2Zsb3cgU0RLIHZlcnNpb24gY2hhbmdlZCAnICtcbiAgICAgICdtaWQtcnVuIGluIGxvY2FsIGRldmVsb3BtZW50LCB3aGVyZSB0aGUgZGVwbG95bWVudCBpZCBpcyBkZXJpdmVkIGZyb20gJyArXG4gICAgICAndGhhdCB2ZXJzaW9uLicsXG4gICAge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBwaW5uZWREZXBsb3ltZW50SWQsXG4gICAgICBjdXJyZW50RGVwbG95bWVudElkLFxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnI6IHVua25vd24pOiBSdW5FcnJvckNvZGUgfCBudWxsIHtcbiAgaWYgKFdvcmtmbG93UnVudGltZUVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1I7XG4gIH1cblxuICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgc3RlcCBleGVjdXRpb24gcmVqZWN0ZWQgYmVjYXVzZSB0aGUgc3RlcCBlbnRpdHkgZG9lcyBub3QgZXhpc3QsXG4gKiB0aGUgc2lnbmF0dXJlIG9mIGEgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggbWVzc2FnZSB3aG9zZSBkZWxpdmVyeSBiZWF0IChvclxuICogb3V0bGl2ZWQgYSB0cmFuc2llbnQgZmFpbHVyZSBvZikgdGhlIHByb2R1Y2VyJ3MgcGFyYWxsZWwgYHN0ZXBfY3JlYXRlZGBcbiAqIHdyaXRlLiBFdmVyeSBXb3JsZCBzdXJmYWNlcyBpdCBhcyBhIGBXb3JrZmxvd1dvcmxkRXJyb3JgIG5hbWluZyB0aGUgbWlzc2luZ1xuICogc3RlcDogd29ybGQtdmVyY2VsIG1hcHMgdGhlIGJhY2tlbmQncyA0MDQgdG9cbiAqIGB3b3JrZmxvdyBzdGVwIHN0ZXBf4oCmIG5vdCBmb3VuZGAsIHdvcmxkLWxvY2FsIGFuZCB3b3JsZC1wb3N0Z3JlcyB0aHJvd1xuICogYFN0ZXAgXCJzdGVwX+KAplwiIG5vdCBmb3VuZGAgZGlyZWN0bHkuIFRoZSBtZXNzYWdlIG1hdGNoIGlzIGRlbGliZXJhdGVseSBsb29zZVxuICogYWNyb3NzIHRob3NlIHNoYXBlczsgdGhlIHN0YXR1cyBjaGVjayBuYXJyb3dzIHRoZSByZW1vdGUgY2FzZSB3aXRob3V0XG4gKiBleGNsdWRpbmcgdGhlIGxvY2FsIG9uZXMgKHdoaWNoIGNhcnJ5IG5vIHN0YXR1cykuXG4gKlxuICogVXNlZCBvbmx5IHdoZW4gdGhlIG1lc3NhZ2UgY2FycmllcyBgc3RlcElucHV0YCwgc2luY2UgYSBiYXJlIGRpc3BhdGNoXG4gKiB3aXRob3V0IGEgcGF5bG9hZCBoYXMgbm90aGluZyB0byByZWNvdmVyIGZyb20sIGFuZCB0aGUgZXJyb3Iga2VlcHNcbiAqIHByb3BhZ2F0aW5nIGZvciBxdWV1ZS1kcml2ZW4gcmVjb3ZlcnkgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIGlzU3RlcE1pc3NpbmdFcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZXJyLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIGVyci5zdGF0dXMgIT09IDQwNCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL3N0ZXAvaS50ZXN0KGVyci5tZXNzYWdlKSAmJiAvbm90IGZvdW5kL2kudGVzdChlcnIubWVzc2FnZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICB3b3JsZCxcbiAgd29ya2Zsb3dSdW4sXG4gIHJ1bklkLFxuICByZXF1ZXN0SWQsXG4gIGVycixcbiAgZXJyb3JDb2RlLFxuICBsb2dNZXNzYWdlLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGVycjogdW5rbm93bjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIGxvZ01lc3NhZ2U6IHN0cmluZztcbn0pIHtcbiAgcnVudGltZUxvZ2dlci5lcnJvcihsb2dNZXNzYWdlLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXJyb3JDb2RlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1biA/PyBydW5JZCk7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgIHJ1bklkLFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICksXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgcmVxdWVzdElkIH1cbiAgICApO1xuICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihmYWlsRXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgIGVycm9yOiBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsRXJyLm1lc3NhZ2UgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGZhaWxFcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlY29yZGVkVGVybWluYWxSdW5FdmVudChcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBydW5JZDogc3RyaW5nXG4pOiBFdmVudCB8IHVuZGVmaW5lZCB7XG4gIC8vIFRlcm1pbmFsIHJ1biBldmVudHMgYXJlIGFsd2F5cyBsYXN0IGJ5IGNvbnN0cnVjdGlvbiAobm8gZXZlbnQgY3JlYXRpb25cbiAgLy8gc3VjY2VlZHMgYWdhaW5zdCBhIHRlcm1pbmFsIHJ1biksIGJ1dCBzY2FuIHRoZSBmdWxsIGFycmF5IGZvclxuICAvLyBkZWZlbnNlLWluLWRlcHRoOiBhIFdvcmxkL2JhY2tlbmQgb3JkZXJpbmcgYnVnIHNob3VsZG4ndCBtYWtlIHVzIG1pc3MgYW5cbiAgLy8gYWN0dWFsIHRlcm1pbmF0aW9uIHNpZ25hbC5cbiAgcmV0dXJuIGV2ZW50cy5maW5kKFxuICAgIChlKSA9PlxuICAgICAgZS5ydW5JZCA9PT0gcnVuSWQgJiZcbiAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50czogRXZlbnRbXSwgcnVuSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZmluZFJlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKTtcblxuICBpZiAoIXRlcm1pbmFsUnVuRXZlbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdSdW4gcmVhY2hlZCB0ZXJtaW5hbCBldmVudCwgZXhpdGluZycsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBldmVudFR5cGU6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRJZCxcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogSG93IG1hbnkgb2YgYGlkc2AgYXJlIGFic2VudCBmcm9tIGBwcmVzZW50YC4gKi9cbmZ1bmN0aW9uIGNvdW50TWlzc2luZ0lkcyhpZHM6IEl0ZXJhYmxlPHN0cmluZz4sIHByZXNlbnQ6IFNldDxzdHJpbmc+KTogbnVtYmVyIHtcbiAgbGV0IG1pc3NpbmcgPSAwO1xuICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgIGlmICghcHJlc2VudC5oYXMoaWQpKSBtaXNzaW5nKys7XG4gIH1cbiAgcmV0dXJuIG1pc3Npbmc7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcnVuIGhhcyBhIGhvb2sgYW5kL29yIHdhaXQgdGhhdCBhbiBvdXQtb2YtYmFuZCB3cml0ZXIgY291bGRcbiAqIGFwcGVuZCBhbiBldmVudCBmb3IgYmV0d2VlbiBhbiBpbmxpbmUgc3RlcCdzIGBzdGVwX2NvbXBsZXRlZGAgd3JpdGUgYW5kXG4gKiB0aGUgbmV4dCByZXBsYXksIG5hbWVseSBhbiBvcGVuIGhvb2sgKGEgYGhvb2tfY3JlYXRlZGAgbm90IHlldFxuICogYGhvb2tfZGlzcG9zZWRgLCB3aGljaCBhIHdlYmhvb2sgcmVjZWl2ZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYGhvb2tfcmVjZWl2ZWRgKSBvciBhbiBvcGVuIHdhaXQgKGEgYHdhaXRfY3JlYXRlZGAgbm90IHlldFxuICogYHdhaXRfY29tcGxldGVkYCwgd2hpY2ggdGhlIHdhaXQgdGltZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYHdhaXRfY29tcGxldGVkYCkuXG4gKlxuICogT3BlbiB3YWl0cyBibG9jayBpbmxpbmUgZGVsdGFzLiBPcGVuIGhvb2tzIGFuZCB3YWl0cyBkaXNhYmxlIHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0LiBPcGVuIGhvb2tzIGFkZGl0aW9uYWxseSBzdXBwcmVzcyBvcGVyYXRvci1lbmFibGVkXG4gKiBvcHRpbWlzdGljIHN0YXJ0IHVudGlsIHRoZSBgc3RlcF9zdGFydGVkYCBjbGFpbSBzdWNjZWVkczsgb3BlbiB3YWl0cyBsZWF2ZVxuICogdGhhdCBleHBsaWNpdCwgaWRlbXBvdGVuY3ktb25seSBvcHQtaW4gYWxvbmUuXG4gKlxuICogU3RlcC1ib2R5IGBhdHRyX3NldGAgd3JpdGVzIGFyZSBOT1QgYSBjb25jZXJuOiB0aGV5IGxhbmQgYmVmb3JlIHRoZVxuICogc3RlcCdzIHRlcm1pbmFsIHdyaXRlIGFuZCBhcmUgdGhlcmVmb3JlIGFscmVhZHkgaW5zaWRlIHRoZSByZXR1cm5lZFxuICogZGVsdGEuXG4gKi9cbmZ1bmN0aW9uIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50czogRXZlbnRbXSk6IHtcbiAgb3Blbkhvb2s6IGJvb2xlYW47XG4gIG9wZW5XYWl0OiBib29sZWFuO1xufSB7XG4gIGNvbnN0IGhvb2tzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHdhaXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ2hvb2tfY3JlYXRlZCc6XG4gICAgICAgIGhvb2tzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdob29rX2Rpc3Bvc2VkJzpcbiAgICAgICAgaG9va3MuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dhaXRfY3JlYXRlZCc6XG4gICAgICAgIHdhaXRzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3YWl0X2NvbXBsZXRlZCc6XG4gICAgICAgIHdhaXRzLmRlbGV0ZShldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG9wZW5Ib29rOiBob29rcy5zaXplID4gMCwgb3BlbldhaXQ6IHdhaXRzLnNpemUgPiAwIH07XG59XG5cbnR5cGUgUmV0ZW50aW9uRGVjaXNpb24gPVxuICB8IHsgcmV0YWluOiB0cnVlIH1cbiAgfCB7XG4gICAgICByZXRhaW46IGZhbHNlO1xuICAgICAgcmVhc29uOlxuICAgICAgICB8ICdkaXNhYmxlZCdcbiAgICAgICAgfCAnc2VyaWFsaXphdGlvbl9leGVjdXRlZF93b3JrZmxvd19jb2RlJ1xuICAgICAgICB8ICdub19yZXBsYXlfZHJpdmVyJztcbiAgICB9O1xuXG4vKipcbiAqIFRoZSBjb21wbGV0ZSByZXRhaW5lZC1WTSBwb2xpY3kgZm9yIGEgc3VzcGVuc2lvbiBib3VuZGFyeS5cbiAqXG4gKiBFdmVyeSBzdXNwZW5zaW9uIHByb2R1Y2VyIHVzZXMgdGhlIHN1c3BlbnNpb24tZ2VuZXJhdGlvbiBndWFyZCB3aGVuXG4gKiBzaWduYWxpbmcuIE90aGVyd2lzZSBhIHNpZ25hbCBzY2hlZHVsZWQgYXQgYm91bmRhcnkgTiBjb3VsZCBzdXNwZW5kIHRoZSBWTVxuICogYWZ0ZXIgaXQgaGFzIGFscmVhZHkgcmVzdW1lZCBpbnRvIGJvdW5kYXJ5IE4rMS4gVGhlIHN0cmljdGx5IG9yZGVyZWQgZXZlbnRcbiAqIGxvZyBkZXRlcm1pbmVzIHdoaWNoIGJyYW5jaCByZXNvbHV0aW9uIHdpbnMuIEEgc3RlcCBvciBhdHRyaWJ1dGUgd3JpdGUgaXNcbiAqIHJlcXVpcmVkIHRvIGRyaXZlIHRoZSBuZXh0IGlubGluZSBpdGVyYXRpb247IGhvb2stIG9yIHdhaXQtb25seSBzdXNwZW5zaW9uc1xuICogcGFyayBub3JtYWxseS5cbiAqXG4gKiBSZXRhaW5pbmcgYWNyb3NzIGFuIG9wZW4gaG9vayBvciB3YWl0IGFsc28gcGVybWl0cyBhbiBvdXQtb2YtYmFuZCBjb2xkIHJlcGxheVxuICogdG8gcmFjZSB0aGlzIGludm9jYXRpb24uIFRoYXQgaXMgc2FmZSBvbmx5IGJlY2F1c2UgZWFjaCBsb2FkZWQgbG9nIGlzIGFcbiAqIG1vbm90b25lLCBob2xlLWZyZWUgcHJlZml4OyByZXBsYXlpbmcgYSBsb25nZXIgcHJlZml4IHByZXNlcnZlcyBhbGwgZWFybGllclxuICogY29ycmVsYXRpb24tSUQgZHJhd3M7IGFuZCBgc3RlcF9zdGFydGVkYCBhdG9taWNhbGx5IGNob29zZXMgb25lIG93bmVyLiBUaGVcbiAqIGdlbmVyYXRpb24gZ3VhcmQga2VlcHMgbG9zaW5nIHNhbWUtYm91bmRhcnkgc3VzcGVuc2lvbiBzaWduYWxzIHN0YWxlLCB3aGlsZVxuICogYSBzdGFsZS1zbmFwc2hvdC80MTIgcmVzdGFydCBkaXNjYXJkcyB0aGUgcmV0YWluZWQgc2Vzc2lvbiBhbmQgcmVwbGF5cyBmcm9tXG4gKiB0aGUgYXV0aG9yaXRhdGl2ZSBsb2cuIEEgV29ybGQgdGhhdCBleHBvc2VzIGEgbm9uLXByZWZpeCB2aWV3IHdvdWxkIHZpb2xhdGVcbiAqIHRoaXMgcG9saWN5J3MgcHJlY29uZGl0aW9uIGFuZCBjb3VsZCBiaW5kIG9uZSBvcmRpbmFsIHRvIHR3byBsb2dpY2FsIGJyYW5jaGVzXG4gKiBiZWZvcmUgdGhlIHN0ZXAtb3duZXJzaGlwIGNsYWltIGhhcyBhIGNoYW5jZSB0byBhcmJpdHJhdGUgdGhlbS5cbiAqXG4gKiBBIGhvb2std3JpdGUgY29udGludWF0aW9uIGlzIHRoZSBvbmUgYm91bmRhcnkgcmV0YWluZWQgd2l0aG91dCBhIHN0ZXAgb3JcbiAqIGF0dHJpYnV0ZSBkcml2ZXIuIFRoZSBzdXNwZW5zaW9uIGNvbW1pdHRlZCB0aGUgZXZlbnQgYSBob29rJ3Mgb3duIGF3YWl0ZXIgaXNcbiAqIHBhcmtlZCBvbiDigJQgdGhlIGBob29rX2NyZWF0ZWRgIGEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgd2FpdHMgZm9yLCBvciB0aGVcbiAqIGBob29rX2NvbmZsaWN0YCBhIGNyZWF0ZSB3aG9zZSB0b2tlbiB3YXMgYWxyZWFkeSBjbGFpbWVkIGNvbW1pdHRlZCBpbnN0ZWFkIOKAlFxuICogYW5kIHRoZSBjYWxsZXIgYWR2YW5jZXMgdGhlIHdvcmtmbG93IG92ZXIgdGhhdCBldmVudCBieSByZXN1bWluZyB0aGUgc2Vzc2lvblxuICogaW4gdGhpcyBwcm9jZXNzIHJhdGhlciB0aGFuIHJlLWludm9raW5nIChzZWUgYGNvbnRpbnVlT3Zlckhvb2tXcml0ZWAgaW4gdGhlXG4gKiByZXBsYXkgbG9vcCksIHNvIHRoZSBydW50aW1lIGl0c2VsZiBkcml2ZXMgdGhlIG5leHQgaXRlcmF0aW9uLiBPbmUgYXJtIGZvclxuICogYm90aCBvdXRjb21lcyBiZWNhdXNlIGl0IGlzIG9uZSBib3VuZGFyeTogc2FtZSB3cml0ZSwgc2FtZSBldmVudCBzbG90LCBzYW1lXG4gKiBjb250aW51YXRpb24uIFN0ZXBzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gcmlkZSBhbG9uZyBxdWV1ZWQ6IGFuIGF3YWl0ZXJcbiAqIGVtcHRpZXMgYGxhenlJbmxpbmVTdGVwc2AgYW5kIHRoZSBjb25mbGljdCBicmFuY2ggcmV0dXJucyBiZWZvcmUgYW55IGlubGluZVxuICogZXhlY3V0aW9uLCBzbyBub3RoaW5nIHRoaXMgaW52b2NhdGlvbiBkb2VzIGNhbiBvcmRlciB0aGUgY29udGludWF0aW9uIGJlaGluZFxuICogYSBzdGVwIGJvZHkuIFRoZSBob29rIHRoaXMgc3VzcGVuc2lvbiBqdXN0IGNyZWF0ZWQgaXMgYW4gb3BlbiBob29rIGJ5XG4gKiBkZWZpbml0aW9uLCBhbmQgaXMgbm8gbW9yZSBhIGhhemFyZCB0aGFuIGFueSBvdGhlciBvcGVuIGhvb2sgaGVyZTogYVxuICogYGhvb2tfcmVjZWl2ZWRgIGxhbmRpbmcgb3V0IG9mIGJhbmQgaXMgYWJzZW50IGZyb20gdGhlIGxvZyB0aGUgcmVzdW1lIHJlYWRzXG4gKiBleGFjdGx5IGFzIGl0IGlzIGFic2VudCBmcm9tIGEgZmV0Y2ggdGhhdCByZXR1cm5lZCBhIG1vbWVudCBiZWZvcmUgaXQg4oCUIGFcbiAqIHByZWZpeCwgbmV2ZXIgYSBob2xlLCBjb3JyZWN0ZWQgb24gdGhlIG5leHQgd3JpdGUuXG4gKlxuICogUXVpZXNjZW5jZSBhc3N1bWVzIHdvcmtmbG93IGNvZGUgc3RheXMgaW5zaWRlIHRoZSBzYW5kYm94J3MgZGV0ZXJtaW5pc21cbiAqIGNvbnRyYWN0LiBFc2NhcGluZyB0byB0aGUgaG9zdCByZWFsbSAoZm9yIGV4YW1wbGUsIHJlY292ZXJpbmcgYSBob3N0XG4gKiBgRnVuY3Rpb25gIGNvbnN0cnVjdG9yIHRvIHNjaGVkdWxlIHJlYWwgdGltZXJzKSBhbHJlYWR5IG1ha2VzIG9yZGluYXJ5IGNvbGRcbiAqIHJlcGxheSBub25kZXRlcm1pbmlzdGljIGFuZCBpcyBub3QgZGVmZW5kZWQgaGVyZS5cbiAqXG4gKi9cbmZ1bmN0aW9uIGdldFJldGVudGlvbkRlY2lzaW9uKHtcbiAgc3VzcGVuc2lvbixcbiAgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCxcbiAgaG9va0NvbnRpbnVhdGlvbiA9IGZhbHNlLFxufToge1xuICBzdXNwZW5zaW9uOiBXb3JrZmxvd1N1c3BlbnNpb247XG4gIHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdXNwZW5zaW9uIGNvbW1pdHRlZCB0aGUgZXZlbnQgYSBob29rJ3Mgb3duIGF3YWl0ZXIgaXNcbiAgICogd2FpdGluZyBvbiBhbmQgdGhlIGNhbGxlciB3aWxsIGNvbnRpbnVlIG92ZXIgaXQgaW4tcHJvY2VzcywgbWFraW5nIHRoZVxuICAgKiBydW50aW1lIHRoZSByZXBsYXkgZHJpdmVyIGZvciBhIGJvdW5kYXJ5IHRoYXQgaGFzIG5vIHN0ZXAgb3IgYXR0cmlidXRlXG4gICAqIHdyaXRlIG9mIGl0cyBvd24uIFNlZSB0aGUgcG9saWN5IGFib3ZlLlxuICAgKi9cbiAgaG9va0NvbnRpbnVhdGlvbj86IGJvb2xlYW47XG59KTogUmV0ZW50aW9uRGVjaXNpb24ge1xuICBpZiAoIWlzVm1SZXRlbnRpb25FbmFibGVkKCkpIHtcbiAgICByZXR1cm4geyByZXRhaW46IGZhbHNlLCByZWFzb246ICdkaXNhYmxlZCcgfTtcbiAgfVxuICBpZiAoc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmV0YWluOiBmYWxzZSxcbiAgICAgIHJlYXNvbjogJ3NlcmlhbGl6YXRpb25fZXhlY3V0ZWRfd29ya2Zsb3dfY29kZScsXG4gICAgfTtcbiAgfVxuICBpZiAoaG9va0NvbnRpbnVhdGlvbikge1xuICAgIHJldHVybiB7IHJldGFpbjogdHJ1ZSB9O1xuICB9XG4gIGlmIChzdXNwZW5zaW9uLnN0ZXBDb3VudCA9PT0gMCAmJiBzdXNwZW5zaW9uLmF0dHJpYnV0ZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHsgcmV0YWluOiBmYWxzZSwgcmVhc29uOiAnbm9fcmVwbGF5X2RyaXZlcicgfTtcbiAgfVxuICByZXR1cm4geyByZXRhaW46IHRydWUgfTtcbn1cblxuY29uc3QgU0VSSUFMSVpBVElPTl9CTE9DS0VSX0xPR19ERVRBSUxfTElNSVQgPSAxNjA7XG5cbi8qKiBLZWVwIHJldGVudGlvbiBkaWFnbm9zdGljcyB1c2VmdWwgd2l0aG91dCBlbWl0dGluZyB1bmJvdW5kZWQgZ3Vlc3QgZGF0YS4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6YXRpb25CbG9ja2VyTG9nTWV0YWRhdGEoXG4gIGJsb2NrZXJzOiBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXJbXSxcbiAgY291bnQ6IG51bWJlclxuKSB7XG4gIHJldHVybiB7XG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudDogY291bnQsXG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJzOiBibG9ja2Vycy5tYXAoXG4gICAgICAoeyBzb3VyY2UsIGNvcnJlbGF0aW9uSWQsIGtpbmQsIGRldGFpbCB9KSA9PiAoe1xuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGRldGFpbDpcbiAgICAgICAgICBkZXRhaWwgJiYgZGV0YWlsLmxlbmd0aCA+IFNFUklBTElaQVRJT05fQkxPQ0tFUl9MT0dfREVUQUlMX0xJTUlUXG4gICAgICAgICAgICA/IGAke2RldGFpbC5zbGljZSgwLCBTRVJJQUxJWkFUSU9OX0JMT0NLRVJfTE9HX0RFVEFJTF9MSU1JVCl94oCmYFxuICAgICAgICAgICAgOiBkZXRhaWwsXG4gICAgICB9KVxuICAgICksXG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJzVHJ1bmNhdGVkOiBjb3VudCA+IGJsb2NrZXJzLmxlbmd0aCxcbiAgfTtcbn1cblxudHlwZSBSZXBsYXlFdmVudExvZyA9XG4gIHwgeyB0eXBlOiAnbG9hZEFsbCcgfVxuICB8ICh7IHR5cGU6ICdyZWFkeScgfSAmIExvYWRlZEV2ZW50TG9nKVxuICB8ICh7IHR5cGU6ICdsb2FkQWZ0ZXInOyBjdXJzb3I6IHN0cmluZyB9ICYgTG9hZGVkRXZlbnRMb2cpO1xuXG5mdW5jdGlvbiBuZXh0RXZlbnRMb2dMb2FkKGxvZzogTG9hZGVkRXZlbnRMb2cpOiBSZXBsYXlFdmVudExvZyB7XG4gIGlmIChsb2cuY3Vyc29yID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbG9hZEFmdGVyJyxcbiAgICBldmVudHM6IGxvZy5ldmVudHMsXG4gICAgY3Vyc29yOiBsb2cuY3Vyc29yLFxuICB9O1xufVxuXG4vKipcbiAqIE1heGltdW0gaW5saW5lLWV4ZWN1dGlvbiBkdXJhdGlvbiBmb3IgYSBzaW5nbGUgaGFuZGxlciBpbnZvY2F0aW9uLlxuICpcbiAqIE9yZGVyIG9mIHByZWNlZGVuY2U6XG4gKiAxLiBgV09SS0ZMT1dfVjJfVElNRU9VVF9NU2AgZW52IHZhclxuICogMi4gVGllcmVkIGJ1ZGdldCBkZXJpdmVkIGZyb20gYHdvcmxkLmdldFJ1bnRpbWVEZWFkbGluZSgpYFxuICogMy4gRGVmYXVsdCBvZiAyIG1pbnV0ZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4SW5saW5lRHVyYXRpb25NcyhcbiAgd29ybGQ6IFdvcmxkLFxuICBpbnZvY2F0aW9uU3RhcnRUaW1lOiBudW1iZXJcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHJhd0Vudk92ZXJyaWRlID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVjJfVElNRU9VVF9NUztcbiAgaWYgKHJhd0Vudk92ZXJyaWRlICE9PSB1bmRlZmluZWQgJiYgcmF3RW52T3ZlcnJpZGUgIT09ICcnKSB7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhd0Vudk92ZXJyaWRlKTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID4gMCkge1xuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBydW50aW1lRGVhZGxpbmUgPSBhd2FpdCB3b3JsZC5nZXRSdW50aW1lRGVhZGxpbmU/LigpO1xuICBpZiAocnVudGltZURlYWRsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBkZWFkbGluZU1zID0gcnVudGltZURlYWRsaW5lLmdldFRpbWUoKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihkZWFkbGluZU1zKSkge1xuICAgICAgY29uc3QgbWF4RHVyYXRpb25NcyA9IE1hdGguZmxvb3IoZGVhZGxpbmVNcyAtIGludm9jYXRpb25TdGFydFRpbWUpO1xuICAgICAgaWYgKG1heER1cmF0aW9uTXMgPj0gbXMoJzI1bScpKSB7XG4gICAgICAgIHJldHVybiBtcygnMTBtJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhEdXJhdGlvbk1zID49IG1zKCcxMG0nKSkge1xuICAgICAgICByZXR1cm4gbXMoJzVtJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1zKCcybScpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgcm91dGUgd2hpY2ggaGFuZGxlcyB3b3JrZmxvdyBleGVjdXRpb24gcmVxdWVzdHMsXG4gKiBleGVjdXRpbmcgc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUgdG8gcmVkdWNlIGZ1bmN0aW9uIGludm9jYXRpb25zXG4gKiBhbmQgcXVldWUgb3ZlcmhlYWQuXG4gKlxuICogVGhlIGhhbmRsZXIgbG9vcHM6IHJlcGxheSB3b3JrZmxvdyDihpIgZXhlY3V0ZSBzdGVwIGlubGluZSDihpIgcmVwbGF5IOKGkiAuLi5cbiAqIHVudGlsIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMsIHRpbWVzIG91dCwgb3IgZW5jb3VudGVycyBub24tc3RlcCBzdXNwZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3dDb2RlIC0gVGhlIHdvcmtmbG93IGJ1bmRsZSBjb2RlIGNvbnRhaW5pbmcgYWxsIHdvcmtmbG93IGZ1bmN0aW9uc1xuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgVmVyY2VsIEFQSSByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dFbnRyeXBvaW50KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0PzogbnVtYmVyO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICB9XG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHNldFdvcmtmbG93QmFzZVBhdGgob3B0aW9ucz8uYmFzZVBhdGgpO1xuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpO1xuICBjb25zdCB3b3JrZmxvd1ByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgbmFtZXNwYWNlKTtcblxuICBjb25zdCBoYW5kbGVyID0gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoXG4gICAgICB3b3JrZmxvd1ByZWZpeCxcbiAgICAgIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgLy8gVDIgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cgKHNlZSBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKTpcbiAgICAgICAgLy8gdGhlIGluc3RhbnQgdGhpcyBjb25zdW1lciBiZWdhbiwgYmVmb3JlIG1lc3NhZ2UgcGFyc2luZy4gT25seSB1c2VkXG4gICAgICAgIC8vIHdoZW4gdGhlIG1lc3NhZ2UgdHVybnMgb3V0IHRvIGNhcnJ5IHJlc3VtZSB0aW1pbmc7IHRha2luZyBpdFxuICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHkga2VlcHMgaXQgaG9uZXN0IGZvciB0aGUgZGVsaXZlcmllcyB0aGF0IGRvLlxuICAgICAgICBjb25zdCBoYW5kbGVyRW50ZXJlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2VcbiAgICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgICAgLy8gVGhleSBvbmx5IHdyaXRlIGEgc3RhdHVzIHJlc3BvbnNlIHRvIGEgc3RyZWFtIGFuZCBkbyBub3QgZXhwb3NlIHNlbnNpdGl2ZSBkYXRhLlxuICAgICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChtZXNzYWdlXyk7XG4gICAgICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgICAgICAgd29ybGRIYW5kbGVycy5zcGVjVmVyc2lvblxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogaW5jb21pbmdUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcmVxdWVzdGVkQXQsXG4gICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlLFxuICAgICAgICAgIHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnMsXG4gICAgICAgICAgZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudCxcbiAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICBob29rSW5wdXQsXG4gICAgICAgICAgc3RlcElucHV0LFxuICAgICAgICAgIHJ1bkNvbnRleHQsXG4gICAgICAgICAgaG9va1Jlc3VtZVRpbWluZyxcbiAgICAgICAgICB3YWl0Q29udGludWF0aW9uLFxuICAgICAgICB9ID0gV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcblxuICAgICAgICAvLyAtLS0gSG9vay1yZXN1bWUgVFRSIHRlbGVtZXRyeSAocnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cykgLS0tXG4gICAgICAgIC8vIFRocmVhZGVkIHRocm91Z2ggdGhpcyBpbnZvY2F0aW9uIGFuZCBDT05TVU1FRCBieSB0aGUgZmlyc3QgZHVyYWJsZVxuICAgICAgICAvLyBzdGVwIHRoYXQgZm9sbG93cyB0aGUgcmVzdW1wdGlvbiwgY2xlYXJlZCBhdCB0aGF0IHBvaW50IHNvIGEgbGF0ZXJcbiAgICAgICAgLy8gc3RlcCwgYSByZXRyeSwgb3IgYSByZWRlbGl2ZXJ5IG5ldmVyIHJlLXJlcG9ydHMgdGhlIHNhbWUgcmVzdW1lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUd28gZGVsaXZlcnkgc2hhcGVzIGNhcnJ5IHRpbWluZzpcbiAgICAgICAgLy8gIC0gdGhlIHJlc3VtZSdzIG93biBpbnZvY2F0aW9uIChubyBgc3RlcElkYCk6IHRoZSBwcm9kdWNlcidzIFQwL1QxXG4gICAgICAgIC8vICAgIHJpZGUgdGhlIG1lc3NhZ2UgYW5kIHRoaXMgaGFuZGxlcidzIGVudHJ5IGlzIFQyLlxuICAgICAgICAvLyAgLSBhIHN0ZXAgdGhpcyBpbnZvY2F0aW9uIGhhbmRlZCB0byBhbm90aGVyIGludm9jYXRpb24gKGBzdGVwSWRgXG4gICAgICAgIC8vICAgIHByZXNlbnQpOiB0aGUgcmVzdW1pbmcgaW52b2NhdGlvbiBhbHJlYWR5IHN0YW1wZWQgVDIuLlQ0IG9udG9cbiAgICAgICAgLy8gICAgdGhlIG1lc3NhZ2UsIHNvIHRoZXkgYXJlIHJlYWQgYmFjayB2ZXJiYXRpbS5cbiAgICAgICAgbGV0IHJlc3VtZVRyYWNraW5nID0gcmVzdW1lVHJhY2tpbmdGcm9tTWVzc2FnZShcbiAgICAgICAgICBob29rUmVzdW1lVGltaW5nLFxuICAgICAgICAgIGluY29taW5nU3RlcElkICE9PSB1bmRlZmluZWQgPyAnZGlzcGF0Y2hlZCcgOiAnaW5saW5lJ1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcgJiYgaW5jb21pbmdTdGVwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VtZVRyYWNraW5nLmNvbnN1bWVyU3RhcnRlZEF0TXMgPSBoYW5kbGVyRW50ZXJlZEF0TXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlc3VtZVRyYWNraW5nICYmXG4gICAgICAgICAgIU51bWJlci5pc0Zpbml0ZShyZXN1bWVUcmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBBIHN0ZXAgbWVzc2FnZSBmcm9tIGEgcHJvZHVjZXIgdGhhdCBmb3J3YXJkZWQgdGltaW5nIHdpdGhvdXQgdGhlXG4gICAgICAgICAgLy8gY29uc3VtZXIgYm91bmRhcmllcy4gTm90aGluZyBhZGRpdGl2ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyBhIHRyYWNlIGNhcnJpZXIsIGJ1dFxuICAgICAgICAvLyBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpcyByZWdpc3RlcmVkXG4gICAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlLCBzbyB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuXG4gICAgICAgIC8vIGFic2VudCBvbmUgc28gbGlua2VkIG1vZGUgZmFsbHMgYmFjayB0byBhIGZyZXNoIG9yaWdpbiBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZvcndhcmRpbmcgYSB1c2VsZXNzIGB7fWAgZm9yZXZlci5cbiAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgICAgPyBpbmNvbWluZ1RyYWNlQ2FycmllclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IG1ldGFkYXRhLnF1ZXVlTmFtZS5zbGljZSh3b3JrZmxvd1ByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgIC8vIC0tLSBNYXggZGVsaXZlcnkgY2hlY2sgLS0tXG4gICAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSB3b3JrZmxvd3MgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBydW46IGF0dGFjaGVzIHJ1bklkL3dvcmtmbG93TmFtZSB0byBldmVyeVxuICAgICAgICAvLyBsb2cgbGluZSBhbmQgY2hpbGQgbG9nZ2VycyBiZWxvdywgc28gY2FsbGVycyBkb24ndCByZXBlYXQgaXQuXG4gICAgICAgIGNvbnN0IHJ1bkxvZ2dlciA9IHJ1bnRpbWVMb2dnZXIuZm9yUnVuKHJ1bklkLCB3b3JrZmxvd05hbWUpO1xuXG4gICAgICAgIGNvbnN0IG1heFF1ZXVlRGVsaXZlcmllcyA9IGdldE1heFF1ZXVlRGVsaXZlcmllcygpO1xuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IG1heFF1ZXVlRGVsaXZlcmllcykge1xuICAgICAgICAgIGNvbnN0IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERURcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBXb3JrZmxvdyBoYW5kbGVyIGV4Y2VlZGVkIG1heCBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICBlcnJvckNvZGU6IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5lcnJvckNvZGUsXG4gICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uXG4gICAgICAgIC8vIChyb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzKSBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3IsIHdoZXJlIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcy5cbiAgICAgICAgLy8gU2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSByZXBsYXkgYnVkZ2V0IGNvdmVycyBvcmNoZXN0cmF0aW9uIHdvcmsgYmV0d2VlbiBzdGVwcywgbm90IGlubGluZVxuICAgICAgICAvLyBzdGVwIGJvZGllcy4gSXQgaXMgY2hlY2tlZCBiZXR3ZWVuIGxvb3AgaXRlcmF0aW9uczsgc3RlcCBib2RpZXMgdXNlXG4gICAgICAgIC8vIHRoZSBwbGF0Zm9ybSB0aW1lb3V0IGFuZCBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TIGd1YXJkIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHJlcGxheUJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcblxuICAgICAgICAvLyBJbiBsaW5rZWQgbW9kZSB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIE5PVCByZXN0b3JlZCBhcyB0aGVcbiAgICAgICAgLy8gYWN0aXZlIChwYXJlbnQpIGNvbnRleHQ6IHBhc3NpbmcgYHVuZGVmaW5lZGAgbWFrZXNcbiAgICAgICAgLy8gd2l0aFRyYWNlQ29udGV4dCBhIHBhc3N0aHJvdWdoLCBzbyB0aGUgd29ya2Zsb3cuZXhlY3V0ZSBzcGFuIGJlbG93XG4gICAgICAgIC8vIHN0YXlzIGEgY2hpbGQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKSBjb250ZXh0IGFuZCB0aGVcbiAgICAgICAgLy8gcnVuLW9yaWdpbiB0cmF2ZWxzIGFzIGEgc3BhbiBsaW5rIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHBhcmVudFRyYWNlQ2FycmllciA9XG4gICAgICAgICAgdHJhY2VNb2RlID09PSAnY29udGludW91cycgPyB0cmFjZUNvbnRleHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFF1ZXVlLWRlbGl2ZXJlZCBpbnZvY2F0aW9uOiBDT05TVU1FUiBraW5kLCBtYXRjaGluZyB0aGVcbiAgICAgICAgLy8gcXVldWUtZGVsaXZlcmVkIHN0ZXAuZXhlY3V0ZSBzcGFuLlxuICAgICAgICBjb25zdCBzcGFuS2luZCA9IGF3YWl0IGdldFNwYW5LaW5kKCdDT05TVU1FUicpO1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFRyYWNlQ29udGV4dChwYXJlbnRUcmFjZUNhcnJpZXIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFdvcmtmbG93QmFnZ2FnZShcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHdvcmtmbG93TmFtZSB9LFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGQnLCBhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGdldFdvcmxkKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQm90aCBjaGVja3MgYmVsb3cgbG9vayBhdCBgcnVuSW5wdXRgLCBzbyBib3RoIGFyZSBuby1vcHMgb24gYVxuICAgICAgICAgICAgICAvLyByZS1lbnF1ZXVlZCBtZXNzYWdlICh3aGljaCBjYXJyaWVzIG5vbmUpOiB0aGV5IG9ubHkgZXZlciBydW4gb25cbiAgICAgICAgICAgICAgLy8gYSBmaXJzdCBkZWxpdmVyeSwgdGhlIG9uZSB0aGF0IGNvdWxkIGNyZWF0ZSB0aGUgcnVuLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBSZXR1cm5pbmcgYWNrcyB0aGUgbWVzc2FnZS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgbWlzbWF0Y2ggaXNcbiAgICAgICAgICAgICAgLy8gYmFrZWQgaW50byB0aGlzIG1lc3NhZ2UsIHNvIGV2ZXJ5IHJlZGVsaXZlcnkgd291bGQgcmVhY2ggdGhlXG4gICAgICAgICAgICAgIC8vIHNhbWUgdmVyZGljdCwgYW5kIHRocm93aW5nIHdvdWxkIGhvdC1sb29wIHRoZSBoYW5kbGVyIHVudGlsXG4gICAgICAgICAgICAgIC8vIE1BWF9RVUVVRV9ERUxJVkVSSUVTIHdpdGggdGhlIHNhbWUgZXJyb3IgZWFjaCB0aW1lLiBJdCBtYXRjaGVzXG4gICAgICAgICAgICAgIC8vIGhvdyB0aGUgcnVuX3N0YXJ0ZWQgcGF0aCBhbHJlYWR5IGRpc2NhcmRzIGRlbGl2ZXJpZXMgd2hvc2VcbiAgICAgICAgICAgICAgLy8gdmVyZGljdCBjYW5ub3QgY2hhbmdlIChFbnRpdHlDb25mbGljdEVycm9yLCBSdW5FeHBpcmVkRXJyb3IpLlxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmVmdXNlQ3Jvc3NFbnZpcm9ubWVudERlbGl2ZXJ5KHtcbiAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlcixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpYyBvbmx5LiBTZWUgdGhlIGhlbHBlciBmb3Igd2h5IHRoaXMgd2FybnMgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAvLyByZWZ1c2luZyB0aGUgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgYXdhaXQgd2Fybk9uRGVwbG95bWVudFBpbm5pbmdNaXNtYXRjaCh7XG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgcnVuTG9nZ2VyLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlKFxuICAgICAgICAgICAgICAgIGB3b3JrZmxvdy5leGVjdXRlICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWAsXG4gICAgICAgICAgICAgICAgeyBraW5kOiBzcGFuS2luZCwgbGlua3M6IHNwYW5MaW5rcyB9LFxuICAgICAgICAgICAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ2V4ZWN1dGVfdjInKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VQcm9wYWdhdGVkKCEhdHJhY2VDb250ZXh0KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VNb2RlKHRyYWNlTW9kZSksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgaW52b2NhdGlvblN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBub0lubGluZVJlcGxheUFmdGVyTXMgPSBhd2FpdCBnZXRNYXhJbmxpbmVEdXJhdGlvbk1zKFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGxldCBsb29wSXRlcmF0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPSByZXBsYXlEaXZlcmdlbmNlXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIocmVwbGF5RGl2ZXJnZW5jZS5jb3VudClcbiAgICAgICAgICAgICAgICAgICAgOiBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmluZXJ0KCk7XG4gICAgICAgICAgICAgICAgICAvLyBDb21waWxhdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgdGhlIE5vZGUgVk0uIFdhaXQgdW50aWwgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBydW4ncyBlbmdpbmUgc2VsZWN0aW9uIGlzIGtub3duIHNvIFF1aWNrSlMgZGVsaXZlcmllcyBuZXZlclxuICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgYW5kIGNhY2hlIGFuIHVudXNlZCBub2RlOnZtIFNjcmlwdC4gVGhlIHByb21pc2UgaXNcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24tc2NvcGVkIGFuZCByZXVzZWQgYnkgZXZlcnkgY29sZCByZXBsYXk7XG4gICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW9uIHN0aWxsIHdhaXRzIGZvciBhIGZyZXNoIFZNIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICBsZXQgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHM6XG4gICAgICAgICAgICAgICAgICAgIHwgUmV0dXJuVHlwZTx0eXBlb2YgY29tcGlsZVdvcmtmbG93QnVuZGxlPlxuICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCBjb21waWxlZFdvcmtmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRXb3JrZmxvd0NvbXBpbGUgPSBhd2FpdCBiaW5kQWN0aXZlVHJhY2VDb250ZXh0KFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3c/OiBQaWNrPFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3dOYW1lJyB8ICdleGVjdXRpb25Db250ZXh0J1xuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvdyB8fCB1c2VRdWlja0pTVm0od29ya2Zsb3cpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVkV29ya2Zsb3dOYW1lICE9PSB3b3JrZmxvdy53b3JrZmxvd05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkV29ya2Zsb3dOYW1lID0gd29ya2Zsb3cud29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHMgPSBjb21waWxlV29ya2Zsb3dCdW5kbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3cud29ya2Zsb3dOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgcnVucyBjYW4gcmV0dXJuIHdpdGhvdXQgYXdhaXRpbmcgY29tcGlsYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGNvbXBpbGVkV29ya2Zsb3dTY3JpcHRzLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVkV29ya2Zsb3dTY3JpcHRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IG9uY2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlUnVuRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHJlc3VsdC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0UmVwbGF5UGF5bG9hZENhY2hlID0gKFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvdz86IFBpY2s8V29ya2Zsb3dSdW4sICdleGVjdXRpb25Db250ZXh0Jz5cbiAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93IHx8IHVzZVF1aWNrSlNWbSh3b3JrZmxvdykpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXBsYXlQYXlsb2FkQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUgPSBuZXcgUmVwbGF5UGF5bG9hZENhY2hlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxheVBheWxvYWRDYWNoZTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlUmVwbGF5RXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFJlcGxheVBheWxvYWRDYWNoZShldmVudC5ldmVudERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0V29ya2Zsb3dDb21waWxlKGV2ZW50LmV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlPy5wcmVwYXJlRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IHdyaXRlIHRoaXMgbG9vcCBtYWtlcyBjYXJyaWVzIHRoZSBjdXJzb3Igb2YgdGhlIGxvZ1xuICAgICAgICAgICAgICAgICAgLy8gaXQgd2FzIGNvbXB1dGVkIGFnYWluc3QsIGFuZCBmb2xkcyBhIGNvbXBsZXRlIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWx0YSBpbnRvIHRoYXQgbG9nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlRXZlbnQgPSBhc3luYyA8VCBleHRlbmRzIENyZWF0ZUV2ZW50UmVxdWVzdD4oXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2luY2VDdXJzb3IgPSBkZWx0YVJlcXVlc3RDdXJzb3IoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2l0aFNuYXBzaG90ID0geyAuLi5zbG90U25hcHNob3QoKSwgLi4ucGFyYW1zIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIud2l0aEV2ZW50Q3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHNpbmNlQ3Vyc29yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gd2l0aFNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4ud2l0aFNuYXBzaG90LCBzaW5jZUN1cnNvciB9LFxuICAgICAgICAgICAgICAgICAgICAgIChwKSA9PiB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCBkYXRhLCBwKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGFic29yYkNyZWF0ZURlbHRhKHNpbmNlQ3Vyc29yLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZVJlcGxheUxvYWQgPSA8VCBleHRlbmRzIHsgZXZlbnRzPzogRXZlbnRbXSB9PihcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBBdHRyaWJ1dGUuV29ya2Zsb3dSZXBsYXlMb2FkU291cmNlLFxuICAgICAgICAgICAgICAgICAgICBsb2FkOiAoXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RXZlbnRPYnNlcnZlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZFxuICAgICAgICAgICAgICAgICAgICApID0+IFByb21pc2U8VD5cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8VD4gPT5cbiAgICAgICAgICAgICAgICAgICAgdHJhY2UoJ3dvcmtmbG93LnJlcGxheS5sb2FkJywgYXN5bmMgKGxvYWRTcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICBsb2FkU3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSZXBsYXlMb2FkU291cmNlKHNvdXJjZSksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxvYWQoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0NvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVSZXBsYXlFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0NvdW50ID0gcmVzdWx0LmV2ZW50cz8ubGVuZ3RoID8/IGV2ZW50c0NvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c0NvdW50KGV2ZW50c0NvdW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBzbG90IHNuYXBzaG90IGZvciBhIHdyaXRlIGlzc3VlZCBmcm9tIHRoaXMgbG9vcDogaG93XG4gICAgICAgICAgICAgICAgICAgKiBtdWNoIG9mIHRoZSBydW4ncyBsb2cgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCB3YXMgbWFkZVxuICAgICAgICAgICAgICAgICAgICogYWdhaW5zdC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBFdmVyeSB3cml0ZSBnb2VzIHRocm91Z2ggaGVyZSwgaW5jbHVkaW5nIHRoZSBvbmVzIHRoYXQgYXNrXG4gICAgICAgICAgICAgICAgICAgKiBmb3IgYW4gaW5saW5lIGRlbHRhLiBUaGUgdHdvIGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zIGFuZFxuICAgICAgICAgICAgICAgICAgICogYSBXb3JsZCBpcyBmcmVlIHRvIHNlcnZlIGJvdGg6IHRoZSBjdXJzb3Igc2F5cyB3aGVyZSB0b1xuICAgICAgICAgICAgICAgICAgICogc3RhcnQgbGlzdGluZyBmcm9tLCB0aGUgc2xvdCBzYXlzIHdoaWNoIGV2ZW50cyB0aGlzIHdyaXRlclxuICAgICAgICAgICAgICAgICAgICogaGFkIGFscmVhZHkgZGVjaWRlZCB3aXRob3V0LiBXb3JsZHMgdGhhdCB0cmVhdCB0aGUgZGVsdGEgYXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBiZXR0ZXIgYW5zd2VyIGlnbm9yZSB0aGUgc2xvdC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUYWtlbiBmcm9tIHdoYXRldmVyIGlzIGxvYWRlZCwgaW5jbHVkaW5nIHRoZSBzdGFsZVxuICAgICAgICAgICAgICAgICAgICogYGxvYWRBZnRlcmAgc3RhdGUuIFVuZGVyc3RhdGluZyBpcyBzYWZlOiB0aGUgV29ybGQgcmVwb3J0c1xuICAgICAgICAgICAgICAgICAgICogYmFjayBhIHdpZGVyIHNwYW4gdGhhbiBzdHJpY3RseSBuZWVkZWQsIGFuZFxuICAgICAgICAgICAgICAgICAgICogYG1lcmdlUmVwb3J0ZWRFdmVudHNgIGRyb3BzIHdoYXQgdGhlIGxvZyBhbHJlYWR5IGhvbGRzLlxuICAgICAgICAgICAgICAgICAgICogT3ZlcnN0YXRpbmcgaXMgbm90LCBzbyB0aGVyZSBpcyBubyBndWVzc2luZyB3aGVuIG5vdGhpbmcgaXNcbiAgICAgICAgICAgICAgICAgICAqIGxvYWRlZCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNsb3RTbmFwc2hvdCA9ICgpOiBTbG90U25hcHNob3RQYXJhbXMgPT5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBbGwnXG4gICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgIDogc2xvdFNuYXBzaG90UGFyYW1zKGV2ZW50TG9nLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGN1cnNvciB0byBhc2sgZm9yIGFuIGlubGluZSBkZWx0YSBhZ2FpbnN0LCBvclxuICAgICAgICAgICAgICAgICAgICogdW5kZWZpbmVkIHRvIG5vdCBhc2suXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVHVyYm8gaXMgZXhjbHVkZWQgb24gcHVycG9zZTogaXQgZXhpc3RzIHRvIG1ha2UgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgKiBpbnZvY2F0aW9uJ3Mgd3JpdGVzIGFzIGNoZWFwIGFzIHBvc3NpYmxlLCBhbmQgaXQgaGFzIG5vXG4gICAgICAgICAgICAgICAgICAgKiBsb2FkZWQgbG9nIHRvIGV4dGVuZC4gUnVuLXRlcm1pbmFsIHdyaXRlcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAqIGJlY2F1c2Ugbm90aGluZyByZWFkcyB0aGUgbG9nIGFmdGVyd2FyZHMsIHNvIHRoZSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICogd291bGQgYmUgd29yayB0aGUgV29ybGQgZG9lcyBmb3Igbm8gb25lLiBBIGNhbGxlciB0aGF0XG4gICAgICAgICAgICAgICAgICAgKiBzZXQgaXRzIG93biBgc2luY2VDdXJzb3JgIChvciBhc2tlZCBmb3IgdGhlIGBydW5fc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAqIC8gYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQsIHdoaWNoIG93bnMgdGhlIHNhbWUgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAqIGZpZWxkcykga2VlcHMgd2hhdCBpdCBhc2tlZCBmb3IuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhUmVxdWVzdEN1cnNvciA9IChcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IENyZWF0ZUV2ZW50UGFyYW1zIHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgdHVyYm8gfHxcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAncmVhZHknIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPy5zaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPy5wcmVsb2FkRXZlbnRzID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgaXNUZXJtaW5hbFJ1bkV2ZW50VHlwZShkYXRhLmV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRMb2cuY3Vyc29yID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRm9sZCBhbiBpbmxpbmUgZGVsdGEgcmV0dXJuZWQgYnkgYGV2ZW50cy5jcmVhdGVgIGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgKiBpbi1tZW1vcnkgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBkZWx0YSBpcyB3aGF0IGBldmVudHMubGlzdCh7IGN1cnNvcjogc2VudEN1cnNvciB9KWBcbiAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGhhdmUgcmV0dXJuZWQgcmlnaHQgYWZ0ZXIgdGhlIHdyaXRlLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgKiBiYWNrIGJvdGggb3VyIG93biBldmVudCBhbmQgYW55dGhpbmcgYW5vdGhlciB3cml0ZXJcbiAgICAgICAgICAgICAgICAgICAqIGFwcGVuZGVkIGluIGJhbmQuIEFic29yYmluZyBpdCBoZXJlIG1lYW5zIHRoZSBuZXh0IHJlYWRlclxuICAgICAgICAgICAgICAgICAgICogYWxyZWFkeSBoYXMgdGhlIGxvZyBhbmQgdGhlIGxvb3AncyBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICogYGV2ZW50cy5saXN0YCBmaW5kcyBub3RoaW5nIGxlZnQgdG8gZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRGVsaWJlcmF0ZWx5IG5vdCBgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnRgLCBldmVuIHRob3VnaCB0aGVcbiAgICAgICAgICAgICAgICAgICAqIGBoYXNNb3JlYCBoYWxmIG9mIHRoZSB0d28gcG9saWNpZXMgY29pbmNpZGVzLiBBIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgKiBleHRlbmRzIHRoZSB0YWlsIGFuZCBjYXJyaWVzIGEgY3Vyc29yIHRoYXQgaGFzIHRvIG1vdmUgd2l0aFxuICAgICAgICAgICAgICAgICAgICogaXQsIHNvIGl0IGFwcGVuZHMgd2l0aG91dCByZS1zb3J0aW5nIGFuZCBuZWVkcyB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgKiBndWFyZCBiZWxvdzsgYSBza2lwcGVkLXNsb3QgcmVwb3J0IGlzIGEgd2luZG93IHN0cmljdGx5XG4gICAgICAgICAgICAgICAgICAgKiBiZWxvdyB0aGUgd3JpdGUsIGNhcnJpZXMgbm8gY3Vyc29yLCBhbmQgaGFzIHRvIGJlIHNvcnRlZFxuICAgICAgICAgICAgICAgICAgICogYmFjayBpbnRvIHBsYWNlLiBTaGFyaW5nIGFuIGltcGxlbWVudGF0aW9uIHdvdWxkIG1lYW4gb25lXG4gICAgICAgICAgICAgICAgICAgKiBvZiB0aGVtIGRvaW5nIHRoZSBvdGhlcidzIHdvcmsuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRGVjbGluaW5nIGlzIGFsd2F5cyBzYWZlIChhbiB1bmFic29yYmVkIGRlbHRhIGlzIGEgZGVsdGFcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBuZXh0IGBldmVudHMubGlzdGAgcmV0dXJucyksIHNvIHRoZSBndWFyZHMgYXJlIGZyZWUgdG9cbiAgICAgICAgICAgICAgICAgICAqIGJlIHN0cmljdDpcbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiAtIGBoYXNNb3JlYCBtZWFucyB0aGUgV29ybGQgdHJ1bmNhdGVkIHRoZSBwYWdlLiBUYWtpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAqICAgd2hpbGUgYWR2YW5jaW5nIHRoZSBjdXJzb3IgdG8gdGhlIHBhZ2UgZW5kIHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgKiAgIGZpbmUsIGJ1dCB0YWtpbmcgaXQgYW5kIE5PVCBhZHZhbmNpbmcgd291bGQgZHVwbGljYXRlLFxuICAgICAgICAgICAgICAgICAgICogICBhbmQgdGhlIHRydW5jYXRlZCBjYXNlIGlzIHJhcmUgZW5vdWdoIG5vdCB0byBzcGVjaWFsLWNhc2UuXG4gICAgICAgICAgICAgICAgICAgKiAtIFRoZSBjdXJzb3IgbXVzdCBiZSBleGFjdGx5IHdoZXJlIGl0IHdhcyB3aGVuIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgKiAgIHdlbnQgb3V0LiBDb25jdXJyZW50IHdyaXRlcyBlYWNoIGRpZmYgYWdhaW5zdCB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgKiAgIHRoZXkgc2F3LCBhbmQgYGFwcGVuZFVuaXF1ZUV2ZW50c2AgZGVsaWJlcmF0ZWx5IGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgKiAgIHJlLXNvcnQsIHNvIGFic29yYmluZyBhIHNlY29uZCBkZWx0YSBjb21wdXRlZCBmcm9tIGFuXG4gICAgICAgICAgICAgICAgICAgKiAgIG9sZGVyIGN1cnNvciBjb3VsZCBhcHBlbmQgZXZlbnRzIGJlaGluZCBvbmVzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAqICAgdGFrZW4uIEZpcnN0IHJlc3BvbnNlIGJhY2sgd2luczsgdGhlIHJlc3QgYXJlIGRyb3BwZWQuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFic29yYkNyZWF0ZURlbHRhID0gKFxuICAgICAgICAgICAgICAgICAgICBzZW50Q3Vyc29yOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogRXZlbnRSZXN1bHRcbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5JyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvciAhPT0gc2VudEN1cnNvciB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogcmVzdWx0LmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gYHJlYWR5YCBjYW4gcmVwbGF5IG9uY2Ugd2l0aG91dCBhIHJlYWQuIFRoZSBvdGhlciBzdGF0ZXNcbiAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaWJlIHRoZSBuZXh0IGxvYWQgZXhhY3RseS5cbiAgICAgICAgICAgICAgICAgIGxldCBldmVudExvZzogUmVwbGF5RXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgc3RhdGU6IHNldCBieSBlaXRoZXIgdGhlIGJhY2tncm91bmQgc3RlcCBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBvciB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gU2VydmVyLXN1cHBsaWVkIHBlci1ydW4gZXZlbnQgY2VpbGluZyBmcm9tIHRoZSBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UuIFVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQgKG9sZGVyIHNlcnZlcnMsIHR1cmJvKS5cbiAgICAgICAgICAgICAgICAgIGxldCBtYXhFdmVudHNMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93U3RhcnRlZEF0ID0gLTE7XG5cbiAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTKSBzdGF0ZS4gU2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBGSVJTVCBldmVudCBzbmFwc2hvdCBjb250YWluZWRcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYmV5b25kIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkOiBhbnl0aGluZyBlbHNlIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHdob3NlIGNvbnRyaWJ1dGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGltZS10by1maXJzdC1zdGVwIChpbmNsdWRpbmcgdGhlIHF1ZXVlIGhvcCBiYWNrIGhlcmUpXG4gICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWVhc3VyZWQgd2FsbC1jbG9jaywgc28gVFRGUyBpcyBub3QgcmVwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgb25jZSwgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbidzIGxvYWRlZCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgIGxldCBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZFxuICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFNESzogYW5jaG9ycyBSU0ZTIChydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBQT1NUKS4gU2V0IG9uY2UsIGluIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZWQsIHNvIHRoaXMgaXMgc3RhbXBlZCBhdCB0aGUgcG9pbnQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgICAgICAgLy8gc3ludGhlc2l6ZWQgbG9jYWxseSBpbnN0ZWFkIG9mIHRoZSByZWFsIHJlc3BvbnNlLiBTZWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucnNmc0FuY2hvck1zLlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyBob29rX2NyZWF0ZWQgZXZlbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHN0ZXAgcmFuLCBhY2N1bXVsYXRlZCBhY3Jvc3Mgc3VzcGVuc2lvbiBwYXNzZXNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdWJ0cmFjdGVkIGZyb20gVFRGUy4gQWNjdW11bGF0b3JzIGhlcmUgc3Vydml2ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydCAoYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24sIG9yXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlLWV2ZW50IHJlc3RhcnQgYmVsb3cpLCBzbyBhIHJlc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBvdmVyLWNvdW50cyBieSB0aGUgYWJhbmRvbmVkIHBhc3MncyBob29rIHRpbWUsXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBzbGlnaHQgb3Zlci1jb3VudCBlaXRoZXIgcmVzdGFydCBoYXMgYWx3YXlzIGhhZC5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdNcyA9IDA7XG4gICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCBvZiB0aGUgYWNjdW11bGF0b3IgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgdGhlIHJ1bidzIGZpcnN0IGF0dHJfc2V0ICh3aG9zZSBob29rIHBoYXNlIHJhblxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gYSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAvLyBlbmRzIHRoZSBUVEZTIG1lYXN1cmVtZW50IGF0IHRoZSBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZnJvbSBCRUZPUkUgdGhhdCBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCwgc2luY2UgbGF0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgaXQgaXMgcHJvdmFibHkgc2FmZSB0bzogYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCwgc2tpcCB0aGUgaW5pdGlhbCBldmVudC1sb2cgbG9hZCAobm90aGluZyBoYXNcbiAgICAgICAgICAgICAgICAgIC8vIGJlZW4gd3JpdHRlbiB5ZXQpLCBhbmQgZm9yY2Ugb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgKG5vXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHBlZXIgaGFuZGxlciBleGlzdHMgdG8gcmFjZSB0aGUgY3JlYXRlLWNsYWltKS5cbiAgICAgICAgICAgICAgICAgIC8vIGBydW5JbnB1dGAgaXMgb25seSBwcmVzZW50IG9uIHRoZSBzdGFydCgpLWVucXVldWVkIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgYGF0dGVtcHQgPT09IDFgICgxLWJhc2VkKSBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnk7IGBpbmNvbWluZ1N0ZXBJZGAgd291bGQgbWFyayBhIGJhY2tncm91bmQtc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIGEgcmVjb3ZlcnkgcmVwbGF5LCBib3RoXG4gICAgICAgICAgICAgICAgICAvLyBpbmVsaWdpYmxlLiBUaGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXMgZm9yY2VkXG4gICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgZW5kcyBvbmNlIGEgaG9vayBvciB3YWl0IGlzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGludHJvZHVjZSByZXN1bWUgaW52b2NhdGlvbnMpLCBzbyB0dXJibyBleGl0cyBhdCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBwb2ludCAoc2VlIGBmb3JjZU9wdGltaXN0aWNTdGFydGApLiBXb3JrZmxvdyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBpbnRyb2R1Y2Ugbm8gc3VjaCBpbnZvY2F0aW9uIHNvdXJjZTogdGhleSByZXNvbHZlXG4gICAgICAgICAgICAgICAgICAvLyB2aWEgYW4gaW4tcHJvY2VzcyByZXBsYXkgYW5kIGRvbid0IGVuZCB0dXJiby5cbiAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGBtZXRhZGF0YS5hdHRlbXB0ID09PSAxYCBpcyBhbHNvIGxvYWQtYmVhcmluZyBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIG93bmVyc2hpcDogb3duZWQtcmVjb3Zlcnkgc3RlcHMgKGEgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gc3RhbXBlZCBieSBhIFBSRVZJT1VTIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSkgY2FuIG9ubHlcbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0IG9uIGF0dGVtcHQg4omlIDIsIHNvIHR1cmJvIGFuZCBvd25lZCByZWNvdmVyeSBhcmVcbiAgICAgICAgICAgICAgICAgIC8vIG11dHVhbGx5IGV4Y2x1c2l2ZS4gVGhlIHR1cmJvIGByZWludm9rZSgpYCBwYXRocyAoaG9va1xuICAgICAgICAgICAgICAgICAgLy8gY29uZmxpY3QsIHRocm90dGxlIGJhY2tvZmYpIGFjayB0aGlzIG1lc3NhZ2UgYW5kIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkLCBzYWZlIG9ubHkgYmVjYXVzZSBub1xuICAgICAgICAgICAgICAgICAgLy8gbm9uLXRlcm1pbmFsIHN0ZXAgY2FuIGJlIGlubGluZS1vd25lZCBieSB0aGUgYWNrZWQgaWRcbiAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHVyYm8gaXMgb24uIElmIHR1cmJvIGV2ZXIgZW5nYWdlcyBvbiByZWRlbGl2ZXJpZXMsXG4gICAgICAgICAgICAgICAgICAvLyB0aG9zZSBwYXRocyBtdXN0IGZpcnN0IGNoZWNrIGZvciBvd25lZCBwZW5kaW5nIHN0ZXBzIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGB7IHRpbWVvdXRTZWNvbmRzIH1gIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0dXJibyA9XG4gICAgICAgICAgICAgICAgICAgIGlzVHVyYm9FbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hdHRlbXB0ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIXJlcGxheURpdmVyZ2VuY2U7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5Xb3JrZmxvd1R1cmJvKHR1cmJvKSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgb25seTogcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQgKG9yIHJlamVjdHMgaWYgaXQgZmFpbGVkKS4gVGhyZWFkZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludG8gaGFuZGxlU3VzcGVuc2lvbiBhbmQgZXhlY3V0ZVN0ZXAgc28gbm8gc3RlcC9ob29rL3dhaXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHJhY2VzIGFoZWFkIG9mIHRoZSBydW4ncyBjcmVhdGlvbi4gVW5kZWZpbmVkIG91dHNpZGVcbiAgICAgICAgICAgICAgICAgIC8vIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAgICAgICAgICAgICAgICBsZXQgcnVuUmVhZHlCYXJyaWVyOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBPcmRlciBhIHRlcm1pbmFsIHJ1biB3cml0ZSAocnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQpIGFmdGVyXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIGluIHR1cmJvIG1vZGUsIHNpbmNlIGEgbm8tc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2FuIG90aGVyd2lzZSByZWFjaCBydW5fY29tcGxldGVkIGJlZm9yZSB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAvLyBleGlzdHMuIEJlc3QtZWZmb3J0OiBhIGJhcnJpZXIgcmVqZWN0aW9uIGlzIHN3YWxsb3dlZCBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIG9yZGVyaW5nIG9ubHk7IGlmIHJ1bl9zdGFydGVkIHRydWx5IGZhaWxlZCB0aGUgdGVybWluYWwgd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIHN1cmZhY2VzIHRoZSByZWFsIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzLiBOby1vcCBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgY29uc3QgYXdhaXRSdW5SZWFkeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blJlYWR5QmFycmllcikge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW5SZWFkeUJhcnJpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRXb3JrZmxvd1NldHVwRmFpbHVyZSA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgZXJyOiB1bmtub3duXG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOiAnRmF0YWwgcnVudGltZSBlcnJvciBkdXJpbmcgd29ya2Zsb3cgc2V0dXAnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIG9yY2hlc3RyYXRvci4gT3V0c2lkZSB0dXJibyB0aGlzIHJldHVybnNcbiAgICAgICAgICAgICAgICAgIC8vIGB7IHRpbWVvdXRTZWNvbmRzIH1gLCB3aGljaCBtYWtlcyB0aGUgcXVldWUgcmVzY2hlZHVsZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgZGVsaXZlcnkncyBtZXNzYWdlLiBJbiB0dXJibyB0aGF0IGlzIGEgdHJhcDogdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgLCBhbmQgb24gYXN5bmMgcXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyAoZS5nLiBncmFwaGlsZS13b3JrZXIpIGEgcmVzY2hlZHVsZSBjb21lcyBiYWNrIGFzIGRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IDEsIHNvIHR1cmJvIHJlLWVuZ2FnZXMsIHNraXBzIHRoZSBldmVudC1sb2cgbG9hZFxuICAgICAgICAgICAgICAgICAgLy8gYWdhaW4sIHJlcGxheXMgYWdhaW5zdCBhbiBlbXB0eSBsb2csIG5ldmVyIG9ic2VydmVzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gaG9vayBldmVudCB0aGlzIGludm9jYXRpb24ganVzdCB3cm90ZSwgYW5kIHJlLXN1c3BlbmRzXG4gICAgICAgICAgICAgICAgICAvLyBmb3JldmVyICh0aGUgcnVuIHdlZGdlcykuIFVuZGVyIHR1cmJvIHdlIGluc3RlYWQgZW5xdWV1ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgY29udGludWF0aW9uIHRoYXQgY2FycmllcyBOTyBgcnVuSW5wdXRgLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIG5leHQgZGVsaXZlcnkgaXMgYSBub3JtYWwgKG5vbi10dXJibykgbG9hZC1hbmQtcmVwbGF5IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVzIHRoZSBjb21taXR0ZWQgZXZlbnRzIGFuZCBtYWtlcyBwcm9ncmVzczsgd2UgdGhlblxuICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBxdWV1ZSB0cmVhdHMgdGhpcyBkZWxpdmVyeSBhcyBkb25lXG4gICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhbHNvIHJlc2NoZWR1bGluZyBpdC5cbiAgICAgICAgICAgICAgICAgIC8vIElubGluZS1vd25lcnNoaXAgaW52YXJpYW50IGd1YXJkOiBjb3JyZWxhdGlvbiBJRHMgb2ZcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIHdob3NlIGJvZGllcyB0aGlzIGludm9jYXRpb24gaXMgZXhlY3V0aW5nIHVuZGVyIGFuXG4gICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAgc3RhbXAgKGxhenkgaW5saW5lICsgb3duZWQgcmVjb3ZlcnkpLCB3aGlsZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGJvZHkgaXMgaW4gZmxpZ2h0LiBDcmFzaCByZWNvdmVyeSBkZXBlbmRzIG9uIHRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgTk9UIGJlaW5nIGFja2VkIHdoaWxlIHN1Y2ggYSBzdGVwIGlzIG5vbi10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgLy8gKGFjayA9IGhhbmRsZXIgcmV0dXJuIG9yIHJlaW52b2tlLCB3aGljaCBhY2tzICsgZW5xdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGEgTkVXIG1lc3NhZ2UgaWQ6IHRoZSByZWRlbGl2ZXJ5IG9mIHRoZSBvbGQgaWQgaXNcbiAgICAgICAgICAgICAgICAgIC8vIHdoYXQgcmUtZXhlY3V0ZXMgYW4gb3JwaGFuZWQgb3duZWQgc3RlcCkuIEFsbCBleGVjdXRlU3RlcFxuICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgYXJlIGF3YWl0ZWQgYmVmb3JlIGFueSBhY2sgcGF0aCBydW5zLCBzbyB0aGlzIHNldFxuICAgICAgICAgICAgICAgICAgLy8gaXMgZW1wdHkgYXQgZXZlcnkgYWNrIGJ5IGNvbnN0cnVjdGlvbjsgdGhlIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggZnV0dXJlIHJlZmFjdG9ycyB0aGF0IGJyZWFrIHRoYXQgb3JkZXJpbmcuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbkZsaWdodE93bmVkU3RlcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzID0gKFxuICAgICAgICAgICAgICAgICAgICBhY2tQYXRoOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5GbGlnaHRPd25lZFN0ZXBzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbnZhcmlhbnQgdmlvbGF0aW9uOiBhY2tpbmcgdGhlIHdvcmtmbG93IG1lc3NhZ2Ugd2hpbGUgb3duZWQgaW5saW5lIHN0ZXBzIGFyZSBzdGlsbCBleGVjdXRpbmcg4oCUIGNyYXNoIHJlY292ZXJ5IGZvciB0aGVzZSBzdGVwcyBpcyBicm9rZW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkczogWy4uLmluRmxpZ2h0T3duZWRTdGVwc10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gQSBwbGFpbiBvcmNoZXN0cmF0b3ItcmVwbGF5IG1lc3NhZ2UuIE9taXRzIGBydW5JbnB1dGAgKGl0XG4gICAgICAgICAgICAgICAgICAvLyByZS1lbmdhZ2VzIHR1cmJvIG9uIHRoZSBuZXh0IGRlbGl2ZXJ5IGFuZCB3ZWRnZXMgdGhlIHJ1bixcbiAgICAgICAgICAgICAgICAgIC8vIHNlZSBgcmVpbnZva2VgIGJlbG93KSBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIC9cbiAgICAgICAgICAgICAgICAgIC8vIGBzZXJ2ZXJFcnJvclJldHJ5Q291bnRgICh0aGlzIGRlbGl2ZXJ5IGNoYWluJ3MgYnVkZ2V0cykuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlNZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCk6IFByb21pc2U8V29ya2Zsb3dJbnZva2VQYXlsb2FkPiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2UgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogRXh0cmEgZmllbGRzIHRvIGNhcnJ5IG9uIHRoZSBuZXcgbWVzc2FnZS4gT25seSByZWFjaGVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiBuZXh0IGludm9jYXRpb24gb24gdGhlIHR1cmJvIHBhdGg6IHdpdGhvdXQgdHVyYm8gbm9cbiAgICAgICAgICAgICAgICAgICAgICogbWVzc2FnZSBpcyBlbnF1ZXVlZCBhdCBhbGw6IHRoZSBoYW5kbGVyIHJldHVybnMgYVxuICAgICAgICAgICAgICAgICAgICAgKiB2aXNpYmlsaXR5IHRpbWVvdXQgYW5kIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIHRoZSBDVVJSRU5UXG4gICAgICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UsIHdob3NlIGJvZHkgKGFuZCB0aGVyZWZvcmUgYW55IGNvdW50ZXIgb24gaXQpXG4gICAgICAgICAgICAgICAgICAgICAqIGNhbm5vdCBiZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgZXh0cmFQYXlsb2FkPzogUGFydGlhbDxXb3JrZmxvd0ludm9rZVBheWxvYWQ+XG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzKCdyZWludm9rZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXR1cmJvKSByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogZGVsYXlTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgeyAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSwgLi4uZXh0cmFQYXlsb2FkIH0sXG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzID4gMCA/IHsgZGVsYXlTZWNvbmRzIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFByZWNvbmRpdGlvbiAoNDEyKSByZWNvdmVyeTogaG93IG1hbnkgdGltZXMgdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAvLyBoYXMgdGhyb3duIGF3YXkgaXRzIHJlcGxheSBhbmQgc3RhcnRlZCBvdmVyIGluLXByb2Nlc3MuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlY29uZGl0aW9uUmVzdGFydHMgPSAwO1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBFdmVudCBpZHMgdGhlIGRpc2NhcmRlZCByZXBsYXkgaGVsZCwga2VwdCB1bnRpbCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICogbG9hZCByZXNvbHZlcyBzbyBhIHJlc3RhcnQgY2FuIHJlcG9ydCB3aGF0IGl0cyByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAqIGFjdHVhbGx5IGZvdW5kLiBXaXRob3V0IHRoaXMgYSA0MTIgb25seSBldmVyIHRlbGxzIHlvdSB0aGF0XG4gICAgICAgICAgICAgICAgICAgKiBhIHJlc3RhcnQgaGFwcGVuZWQsIHdoaWNoIGNvbmZsYXRlcyB0d28gZGlzdGluY3RcbiAgICAgICAgICAgICAgICAgICAqIHNpdHVhdGlvbnM6IGEgbG9nIHRoYXQgZ3JldyAoZXhwZWN0ZWQsIHRoZSBmZW5jZSBkaWQgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBqb2IpIGFuZCBhIGxvZyB0aGF0IGNhbWUgYmFjayBpZGVudGljYWwsIHdoaWNoIG1lYW5zIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tlbmQgZGlzYWdyZWUgYWJvdXQgdGhlIGNvdW50IGZvciB0aGUgc2FtZSBzZXQgb2ZcbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50cyBhbmQgdGhlIHJlc3RhcnQgd2lsbCByZS1kZXJpdmUgdGhlIHNhbWUgc25hcHNob3QgYW5kXG4gICAgICAgICAgICAgICAgICAgKiBiZSByZWplY3RlZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZToge1xuICAgICAgICAgICAgICAgICAgICBpZHM6IFNldDxzdHJpbmc+O1xuICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpbmxpbmUtZGVsdGEnIHwgJ2Z1bGwtcmVsb2FkJztcbiAgICAgICAgICAgICAgICAgIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogUmVwb3J0IHdoYXQgYSBzdGFsZS1zbmFwc2hvdCByZXN0YXJ0J3MgcmVsb2FkIGZvdW5kLCBvbmNlXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgbG9nIHRoaXMgcmVwbGF5IHdpbGwgYWN0dWFsbHkgY29uc3VtZSBpcyBpbiBoYW5kLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIGBncmV3YCBpcyB0aGUgZXhwZWN0ZWQgY2FzZSBhbmQgZ2l2ZXMgNDEyIHZvbHVtZSBhXG4gICAgICAgICAgICAgICAgICAgKiBkZW5vbWluYXRvci4gYHVuY2hhbmdlZGAgbWVhbnMgdGhlIHJlbG9hZCBkaXNhZ3JlZWQgd2l0aFxuICAgICAgICAgICAgICAgICAgICogdGhlIHJlamVjdGlvbiwgc28gdGhpcyByZXBsYXkgcmUtZGVyaXZlcyB0aGUgc2FtZSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICogYW5kIGlzIHJlamVjdGVkIGFnYWluIHVudGlsIHRoZSBidWRnZXQgaXMgc3BlbnQuIGBzaHJhbmtgXG4gICAgICAgICAgICAgICAgICAgKiBzaG91bGQgYmUgaW1wb3NzaWJsZTogZXZlcnkgbG9hZCBwYXRoIG9ubHkgYWRkcyB0byBhIHJ1bidzXG4gICAgICAgICAgICAgICAgICAgKiBsb2cuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQgPSAoXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50czogRXZlbnRbXVxuICAgICAgICAgICAgICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VsaW5lID0gcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VsaW5lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkZWRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRlZCA9IGNvdW50TWlzc2luZ0lkcyhyZWxvYWRlZElkcywgYmFzZWxpbmUuaWRzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGNvdW50TWlzc2luZ0lkcyhiYXNlbGluZS5pZHMsIHJlbG9hZGVkSWRzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0Y29tZSA9XG4gICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCA+IDAgPyAnc2hyYW5rJyA6IGFkZGVkID4gMCA/ICdncmV3JyA6ICd1bmNoYW5nZWQnO1xuXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAnUmVzdGFydGVkIHJlcGxheSByZWxvYWRlZCBpdHMgZXZlbnQgbG9nIGFmdGVyIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNCZWZvcmU6IGJhc2VsaW5lLmlkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQWZ0ZXI6IHJlbG9hZGVkSWRzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0czogYmFzZWxpbmUucmVzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogYmFzZWxpbmUucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBiYXNlbGluZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFJlY292ZXIgZnJvbSBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBieSByZXN0YXJ0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICogcmVwbGF5IGluc2lkZSB0aGlzIGludm9jYXRpb24sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICogcGVyLWludm9jYXRpb24gYnVkZ2V0IGlzIHNwZW50ICh0aGUgY2FsbGVyIHRoZW4gZmFsbHMgYmFja1xuICAgICAgICAgICAgICAgICAgICogdG8gYSBmcmVzaCBpbnZvY2F0aW9uKS5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBBIDQxMiBtZWFucyB0aGUgbG9nIHRoaXMgcmVwbGF5IGRlcml2ZWQgaXRzIGV2ZW50cyBmcm9tIHdhc1xuICAgICAgICAgICAgICAgICAgICogbWlzc2luZyBhbiBldmVudCB0aGUgYmFja2VuZCBoYWQgYWxyZWFkeSByZWNvcmRlZC4gVGhlXG4gICAgICAgICAgICAgICAgICAgKiByZWplY3RlZCB3cml0ZSBjYW5ub3QgYmUgcmV0cmllZDogY29ycmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgICAgKiBhcmUgcG9zaXRpb25hbCBvcmRpbmFscyBvZiBvbmUgc2VlZGVkIHNlcXVlbmNlLCBzbyBhIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICogb3ZlciB0aGUgY29ycmVjdGVkIGxvZyBtaW50cyBhIGRpZmZlcmVudCBpZCBmb3IgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAqIGxvZ2ljYWwgZXZlbnQsIGFuZCByZS1wb3N0aW5nIHRoaXMgb25lIHdvdWxkIHBlcnNpc3QgYW5cbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IGV2ZXIgcHJvZHVjZXMuIFRoZSB3aG9sZSByZXBsYXkgaGFzXG4gICAgICAgICAgICAgICAgICAgKiB0byBiZSByZS1kZXJpdmVkLCB3aGljaCB0aGUgbG9vcCBkb2VzIGJ5IGRpc2NhcmRpbmcgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBjYWNoZWQgbG9nLCBzaW5jZSBgcnVuV29ya2Zsb3dgIHRoZW4gYnVpbGRzIGEgZnJlc2ggVk0sXG4gICAgICAgICAgICAgICAgICAgKiBzZWVkIGFuZCBjb3JyZWxhdGlvbi1pZCBzZXF1ZW5jZSBmcm9tIHRoZSByZWxvYWRlZCBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RhcnRSZXBsYXlJblByb2Nlc3MgPSAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcj86IHVua25vd24sXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBTZXQgZmFsc2Ugd2hlbiB3cml0ZXMgdGhpcyBpbnZvY2F0aW9uIG1hZGUgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAqIHdpdGggdGhlIHJlamVjdGVkIG9uZSBtYXkgYmUgbWlzc2luZyBmcm9tIHRoZSA0MTInc1xuICAgICAgICAgICAgICAgICAgICAgKiBkZWx0YTogdGhlIFdvcmxkIGNvbXB1dGVkIHRoYXQgZGVsdGEgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgcmVxdWVzdCdzIHNuYXBzaG90LCBzbyBpdCBjYW5ub3QgY29udGFpbiBhblxuICAgICAgICAgICAgICAgICAgICAgKiBldmVudCBhIHNpYmxpbmcgY29tbWl0dGVkIGFmdGVyd2FyZHMsIGFuZCBtZXJnaW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIHJlc3RhcnQgdGhlIHJlcGxheSBvbiBhIGxvZyB0aGF0IGlzIHN0aWxsXG4gICAgICAgICAgICAgICAgICAgICAqIGluY29tcGxldGUuIE9ubHkgYSBmdWxsIHJlbG9hZCBpcyBhdXRob3JpdGF0aXZlIHRoZW4uXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICB7IGFsbG93RGVsdGEgPSB0cnVlIH06IHsgYWxsb3dEZWx0YT86IGJvb2xlYW4gfSA9IHt9XG4gICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzID49XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgc3RhbGUtc25hcHNob3QgcmVzdGFydCBpbnZhbGlkYXRlcyB0aGUgcGFya2VkIFZNOlxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIGl0IGNvbnN1bWVkIHdhcyBtaXNzaW5nIGV2ZW50cywgc28gb25seSBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIGlzIGF1dGhvcml0YXRpdmUuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjb3ZlcnMgdGhlIHN1c3BlbnNpb24tY3JlYXRlIDQxMiwgd2hpY2ggZmlyZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZXRlbnRpb24gZGVjaXNpb24gKGtpbGwgc3dpdGNoICsgc3RlcC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAvLyBnYXRlKSBldmVyIHJhbiwgYW5kIHRoZSBydW5fY29tcGxldGVkIDQxMiwgd2hlcmUgYVxuICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc2Vzc2lvbiBtdXN0IG5vdCBiZSByZXN1bWVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIFdvcmxkIE1BWSByZXR1cm4gdGhlIGV2ZW50cyB3ZSB3ZXJlIG1pc3Npbmcgb24gdGhlIDQxMi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ1c3QgaXQgb25seSBvbiB0aGUgRklSU1QgcmVzdGFydDogaXRzIGNvbXBsZXRlbmVzcyBwcm9vZlxuICAgICAgICAgICAgICAgICAgICAvLyBsZWFucyBvbiB0aGUgYmFja2VuZCdzIG93biBib29ra2VlcGluZywgc28gaWYgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlci1jb3VudHMsIGEgXCJjb21wbGV0ZVwiIGRlbHRhIGNhbiBzdGlsbCBsZWF2ZSBhIGhvbGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kaW5nIGl0IHRvIG9uZSBhdHRlbXB0IGNhcHMgdGhhdCBhdCBhIHNpbmdsZSB3YXN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydDsgZXZlcnkgbGF0ZXIgcmVzdGFydCBkb2VzIHRoZSBhdXRob3JpdGF0aXZlIGxvYWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhICYmIHByZWNvbmRpdGlvblJlc3RhcnRzID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoZXJyb3IsIHJ1bklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbHRhIGlzIG9ubHkgdXNhYmxlIGlmIHRoZXJlIGlzIGEgbG9hZGVkIGxvZyB0byBtZXJnZVxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnRvOyB3aXRob3V0IG9uZSB0aGUgcmVzdGFydCBtdXN0IGxvYWQgZXZlcnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlZERlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YSAhPT0gbnVsbCAmJiBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBzZXQgYmVpbmcgZGlzY2FyZGVkIHdoaWxlIGl0IGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmQ7IHRoZSBjb21wYXJpc29uIGhhcHBlbnMgb25jZSB0aGUgbmV4dCBsb2FkIHJlc29sdmVzLlxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPVxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1c2VkRGVsdGEgPyAnaW5saW5lLWRlbHRhJyA6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICYmIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTVVTVCBiZSBhIGZ1bGwsIGN1cnNvci1sZXNzIHJlbG9hZC4gVGhlIGN1cnNvciBsaXN0c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmQgZnJvbSB0aGUgaGlnaGVzdCBldmVudCBpZCB0aGlzIHJlcGxheSBob2xkcyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hhdCBhIHN0YWxlIHNuYXBzaG90IGlzIG1pc3Npbmcgc2l0cyBiZWxvdyBpdDogYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3QgYWxsb2NhdGVkIGluc2lkZSBhIGNvbmN1cnJlbnQgY29tbWl0IHRha2VzIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGlzIHJlcGxheSBoYWQgYWxyZWFkeSByZWFkIHBhc3QuIEFuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgbG9hZCBzdGFydHMgYWJvdmUgdGhlIGhvbGUgYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlPy5yZXNldFNjYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlOyByZXN0YXJ0aW5nIHJlcGxheSBpbi1wcm9jZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXNlZERlbHRhID8gJ2lubGluZS1kZWx0YScgOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZXN0YXJ0cyc6IHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEVzY2FsYXRlIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIHRoYXQgc3Vydml2ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgKiBpbi1wcm9jZXNzIHJlc3RhcnQgYnVkZ2V0IHRvIGEgZnJlc2ggaW52b2NhdGlvbiwgb3IgZ2l2ZSB1cFxuICAgICAgICAgICAgICAgICAgICogb24gdGhlIHJ1biB3aGVuIHRoZSBwZXItcnVuIGJ1ZGdldCBpcyBhbHNvIHNwZW50LlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBpbi1wcm9jZXNzIGJ1ZGdldCBpcyBhIGNsb3N1cmUgdmFyaWFibGUgYW5kIHRoZSBxdWV1ZSdzXG4gICAgICAgICAgICAgICAgICAgKiBkZWxpdmVyeSBjb3VudCByZXN0YXJ0cyBhdCAxIHdoZW5ldmVyIGEgbmV3IG1lc3NhZ2UgaXNcbiAgICAgICAgICAgICAgICAgICAqIGVucXVldWVkLCBzbyBhIHJ1biB0aGF0IGlzIHBlcm1hbmVudGx5IHVuYWJsZSB0byBjYXRjaCB1cFxuICAgICAgICAgICAgICAgICAgICogd2l0aCBpdHMgb3duIGV2ZW50IGxvZyB3b3VsZCBvdGhlcndpc2UgY3ljbGUgcmVzdGFydHMg4oaSXG4gICAgICAgICAgICAgICAgICAgKiByZS1pbnZva2Ug4oaSIHJlc3RhcnRzIHdpdGggbm8gcnVuLWxldmVsIGJvdW5kLiBUaGUgY2hhaW4gaXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSBjb3VudGVkIG9uIHRoZSBtZXNzYWdlIGl0c2VsZiwgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgICAgICAgKiByZXBsYXkgZGl2ZXJnZW5jZXMgYXJlLCBhbmQgZmFpbHMgdGhlIHJ1biBvbmNlIGV4aGF1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgY291bnRlciBvbmx5IGFkdmFuY2VzIG9uIGhvcHMgdGhhdCBlbnF1ZXVlIGEgbmV3IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAqIChzZWUgYHJlaW52b2tlYCkuIEEgcmVkZWxpdmVyeS1iYXNlZCBob3Aga2VlcHMgdGhlIHNhbWUgYm9keVxuICAgICAgICAgICAgICAgICAgICogYW5kIHNvIHRoZSBzYW1lIGNvdW50LCBidXQgaXQgYWxzbyBrZWVwcyBhZHZhbmNpbmdcbiAgICAgICAgICAgICAgICAgICAqIGBtZXRhZGF0YS5hdHRlbXB0YCwgd2hpY2ggdGhlIG1heC1kZWxpdmVyeSBjaGVjayBhdCB0aGUgdG9wXG4gICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgaGFuZGxlciBhbHJlYWR5IGJvdW5kcywgYW5kIHRoZSBkZWxheSBiZWxvdyBpcyB3aGF0XG4gICAgICAgICAgICAgICAgICAgKiBtYWtlcyB0aGF0IGJ1ZGdldCBzcGFuIHJlYWwgdGltZSByYXRoZXIgdGhhbiBiZWluZyBidXJuZWQgaW5cbiAgICAgICAgICAgICAgICAgICAqIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVua25vd25cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8XG4gICAgICAgICAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHwgeyByZWludm9rZWQ6IGZhbHNlOyBlcnJvcjogRXJyb3IgfVxuICAgICAgICAgICAgICAgICAgPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dGVtcHQgPSAocHJlY29uZGl0aW9uUmVpbnZvY2F0aW9ucyA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlaW52b2NhdGlvbnMgPSBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gbWF4UmVpbnZvY2F0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGNyZWF0aW9uIHdhcyByZWplY3RlZCBhcyBzdGFsZSBhZnRlciAke21heFJlaW52b2NhdGlvbnN9IHJlLWludm9jYXRpb25zIG9mICR7Z2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKX0gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydHMgZWFjaDogdGhpcyBydW4gY2Fubm90IG9ic2VydmUgaXRzIG93biBldmVudCBsb2cgY29tcGxldGVseSBlbm91Z2ggdG8gbWFrZSBwcm9ncmVzcy4gTGFzdCByZWplY3Rpb24gKCR7cmVhc29ufSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlIGFmdGVyIGluLXByb2Nlc3MgcmVzdGFydHM7IHJlLWludm9raW5nIHJ1biBmb3IgYSBmcmVzaCByZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnM6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWludm9jYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZWludm9jYXRpb25zJzogYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQsIHVubGlrZSB0aGUgb3RoZXIgcmVpbnZva2UoKSBjYWxsZXJzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXN0YXJ0cyBhbHJlYWR5IHJlbG9hZGVkIHRoZSBsb2cgc2V2ZXJhbCB0aW1lc1xuICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGNhdGNoaW5nIHVwLCBzbyB0aGUgd3JpdGVycyB0aGlzIHJlcGxheSBpcyByYWNpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZS4gUmV0cnlpbmcgaW5zdGFudGx5IGJ1cm5zIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGJ1ZGdldCBhdCBmdWxsIHNwZWVkLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IHJlaW52b2tlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgZ3VhcmQsIHNoYXJlZCBieSB0aGUgdHdvIHBhdGhzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgYSBydW46IHF1ZXVlZCBzdGVwIGV4ZWN1dGlvbnMgYW5kIGZsb3cgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRGVwbG95bWVudCA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBQaWNrPFxuICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICdydW5JZCcgfCAnZGVwbG95bWVudElkJyB8ICdzcGVjVmVyc2lvbidcbiAgICAgICAgICAgICAgICAgICAgPixcbiAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlUGF5bG9hZDogKCkgPT4gUHJvbWlzZTxXb3JrZmxvd0ludm9rZVBheWxvYWQ+LFxuICAgICAgICAgICAgICAgICAgICBiZWZvcmVTdG9wPzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0Y29tZSwgc3BhbkF0dHJpYnV0ZXMgfSA9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50OiBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWVucXVldWU6IGFzeW5jICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH06IFJlZW5xdWV1ZUFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVlbnF1ZXVlUGF5bG9hZCgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRlcGxveW1lbnRJZCwgc3BlY1ZlcnNpb24sIGRlbGF5U2Vjb25kcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkF0dHJpYnV0ZXMpIHNwYW4/LnNldEF0dHJpYnV0ZXMoc3BhbkF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0Y29tZTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybjogdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgcHJvZHVjZXIgcGFyYWxsZWxpemVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgIHdyaXRlIHdpdGggdGhpcyBxdWV1ZSBwdWJsaXNoLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGVudGl0eSBtYXkgbm90IGV4aXN0IHlldCB3aGVuIHRoaXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlczogdGhlIGRlbGl2ZXJ5IGJlYXQgdGhlIHdyaXRlLCBvciB0aGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdHJhbnNpZW50bHkgYW5kIHRoaXMgbWVzc2FnZSBjYXJyaWVzIHRoZSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgaW5wdXQuIElkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgbWVzc2FnZSdzIGBzdGVwSW5wdXRgLCBrZXllZCBieSB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVsYXRpb24gaWQsIHNvIHRoZSBwcm9kdWNlcidzIHdyaXRlIGFuZCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZW5zdXJlIGNvbnZlcmdlIG9uIGV4YWN0bHkgb25lIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSW52b2tlZCBmcm9tIHR3byBwbGFjZXM6XG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBJTi1CQU5EICh0aGUgbG9hZC1iZWFyaW5nIHBhdGgpOiB3aGVuIHRoZSBiYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHN0ZXBfc3RhcnRlZGAgYmVsb3cgcmVqZWN0cyB3aXRoIFwic3RlcCBub3QgZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgZXhlY3V0b3IgY2F0Y2ggbWF0ZXJpYWxpemVzIHRoZSBzdGVwIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHJpZXMgb25jZSwgYWxsIHdpdGhpbiB0aGlzIGRlbGl2ZXJ5LiBUaGlzIG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBub3QgcmVseSBvbiBkZWxpdmVyeSBhdHRlbXB0czogd29ybGQtdmVyY2VsJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmYWlsdXJlLXJldHJ5IHBhdGggcmUtZW5xdWV1ZXMgYSBGUkVTSCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGF0dGVtcHQgcmVzZXRzIHRvIDEpLCBzbyBhbiBhdHRlbXB0LWdhdGVkIHJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgdW5yZWFjaGFibGUgb24gdGhlIHJldHJ5IGNoYWluIGFuZCB0aGUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdvdWxkIHN0YWxsIHVudGlsIHRoZSBPUklHSU5BTCBtZXNzYWdlJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB+MzAwcyB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkZWxpdmVyeSwgbWVhc3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBleGFjdGx5IHNvIGluIHRoZSBkdXJhYmVuY2ggcGFyYWxsZWwgc3dlZXBzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgcGF0aCBleGlzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vICAtIEVBR0VSTFkgb24gYSBnZW51aW5lIHJlZGVsaXZlcnkgKGF0dGVtcHQgPiAxKTogYVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlZGVsaXZlcmVkIGRpc3BhdGNoIGFscmVhZHkgaGFkIGl0cyBjcmVhdGUgcmFjZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlc29sdmVkIGVpdGhlciB3YXksIHNvIGVuc3VyaW5nIHVwIGZyb250IHNhdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZhaWxlZC1zdGFydCByb3VuZCB0cmlwIHRoZSBpbi1iYW5kIHJlY292ZXJ5IHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3RoZXJ3aXNlIHBheS4gT24gdGhlIGxlZ2FjeSBwcm9sb2d1ZSBpdCBvdmVybGFwc1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBydW4gZmV0Y2ggKG5vIHdhbGwtdGltZSBjb3N0KTsgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgZmV0Y2gtZnJlZSAocnVuQ29udGV4dCkgcHJvbG9ndWUgaXQgaXMgdGhlIHNvbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwcmUtc3RlcCB3cml0ZSBhbmQgc3RpbGwgdGhlIGNoZWFwZXIgdHJhZGUuIEZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgZGVsaXZlcmllcyBza2lwIGl0OiB0aGUgcHJvZHVjZXIncyB3cml0ZSBhbG1vc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbHdheXMgbGFuZHMsIGFuZCBhbiBlYWdlciBlbnN1cmUgd291bGQgYnVybiBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uZGl0aW9uYWwgd3JpdGUgcGVyIHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5zdXJlU3RlcEZyb21NZXNzYWdlID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICAgICAgICAgICAgICAgICAgICAnb2snIHwgJ2dvbmUnXG4gICAgICAgICAgICAgICAgICAgICAgPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBJbnB1dCkgcmV0dXJuICdvayc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlZCBVaW50OEFycmF5IGJ5IFN0ZXBEaXNwYXRjaElucHV0U2NoZW1hOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG5vbi1iaW5hcnkgKG1hbmdsZWQpIHBheWxvYWQgZmFpbHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGFyc2UgYWJvdmUgYW5kIG5ldmVyIHJlYWNoZXMgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHN0ZXBJbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrcyB0aGlzIGNyZWF0ZSBhcyBhIGRpc3BhdGNoIHJlLWVuc3VyZSBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBndWFyZC1lbmZvcmNpbmcgYmFja2VuZCBjYW4gcmVmdXNlIGl0IHdoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9kdWNlcidzIHdyaXRlIHdhcyA0MTItcmVqZWN0ZWQgKHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggd2FzIHJldm9rZWQpLiBTdXJmYWNlcyBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yIOKGkiAnZ29uZScgYmVsb3csIGFja2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuIFdvcmxkcyB3aXRob3V0IHRoZSBndWFyZCBpZ25vcmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWFTdGVwRGlzcGF0Y2g6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGRlbGl2ZXJ5IG1hdGVyaWFsaXplZCB0aGUgc3RlcCwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpb24gb2YgdGhlIHByb2R1Y2VyJ3MgcmVjb3ZlcnkgcGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuU3RlcFJlc2lsaWVudERpc3BhdGNoTWF0ZXJpYWxpemVkKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWF0ZXJpYWxpemVkIHN0ZXBfY3JlYXRlZCBmcm9tIHRoZSBxdWV1ZSBtZXNzYWdlIOKAlCB0aGUgcHJvZHVjZXJcXHUyMDE5cyBkaXJlY3Qgd3JpdGUgZGlkIG5vdCBsYW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbW1vbiBjYXNlOiB0aGUgcHJvZHVjZXIncyB3cml0ZSAob3IgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHJlLWVuc3VyZSkgYWxyZWFkeSBsYW5kZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybiAnb2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gZXhlY3V0ZTogdGhlIHJ1biB3ZW50IHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChtYXRjaGVzIHRoZSBydW4tc3RhdHVzIGNoZWNrIGJlbG93KSwgb3IgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBndWFyZC1lbmZvcmNpbmcgYmFja2VuZCByZXZva2VkIHRoaXMgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKDQxMCBgc3RlcC1kaXNwYXRjaC1yZXZva2VkYCwgdGhlIHByb2R1Y2VyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgd2FzIDQxMi1yZWplY3RlZCBhbmQgdGhlIHJlcGxheSByZXN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBhIGNvcnJlY3RlZCBzY2hlZHVsZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkgcmV0dXJuICdnb25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50OiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVyIGF0dGVtcHQgY29udmVyZ2VzIGluc3RlYWQgb2YgZXhlY3V0aW5nIChhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNraW5nKSBhIHN0ZXAgdGhhdCBtYXkgbm90IGV4aXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biBpZGVudGl0eSBmb3IgdGhpcyBleGVjdXRpb24uIEEgbWVzc2FnZSBzdGFtcGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBgcnVuQ29udGV4dGAgKGltbXV0YWJsZSBydW4gZmllbGRzIHRoZSBwcm9kdWNlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhlbGQgYXQgZGlzcGF0Y2ggdGltZSkgc2tpcHMgdGhlIGJsb2NraW5nIGBydW5zLmdldGBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpcmVseSDigJQgb25lIGxlc3Mgcm91bmQgdHJpcCBvbiB0aGUgVFRMUy1jcml0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGgsIGFuZCBOIGZld2VyIHJlYWRzIG9uIHRoZSBydW4ncyBwYXJ0aXRpb24gcGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFuLW91dCAodmVyY2VsL3dvcmtmbG93IzM0NTYpLiBUaGUgcnVuLXN0YXR1cyBlYXJseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXQgaXMgbm90IGxvc3Q6IGV2ZXJ5IFdvcmxkIHJlamVjdHMgYSBgc3RlcF9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltIG9uIGEgdGVybWluYWwgcnVuIChSdW5FeHBpcmVkIOKGkiBnb25lLCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAg4oaSIHNraXBwZWQpIOKAlCBpbmNsdWRpbmcgYSByZWRlbGl2ZXJlZCBzdGFydCB3aG9zZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcm93IHN0aWxsIHJlYWRzIGBydW5uaW5nYCwgd2hpY2ggd29ybGQtbG9jYWwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGQtcG9zdGdyZXMgcmVqZWN0IGFzIG9mIHRoaXMgY2hhbmdlIChwcmV2aW91c2x5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB3b3JsZC12ZXJjZWwncyBydW4tc3RhdHVzIGZlbmNlIGNvdmVyZWQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNoYXBlLCBhbmQgdGhlIGJvZHkgY291bGQgcmUtcnVuIG9uIGEgZmluaXNoZWQgcnVuKS5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbGRlciBtZXNzYWdlcyB3aXRob3V0IHRoZSBmaWVsZCBrZWVwIHRoZSBsZWdhY3lcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYmdSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBydW5JZGVudGl0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0PzogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgLy8gV2hpY2ggcHJvbG9ndWUgcmFuIOKAlCBtYWtlcyBhZG9wdGlvbiBvZiB0aGUgZmV0Y2gtZnJlZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggKGFuZCB0aGUgcm91bmQgdHJpcCBpdCBzYXZlcykgZGlyZWN0bHkgb2JzZXJ2YWJsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyB2ZXJzaW9uLXNrZXcgd2luZG93cy5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlLlN0ZXBEaXNwYXRjaFByb2xvZ3VlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Db250ZXh0ID8gJ3J1bl9jb250ZXh0JyA6ICdydW5zX2dldCdcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWFnZXIgcmVkZWxpdmVyeSByZS1lbnN1cmUgaGFzIG5vIHJ1biBmZXRjaCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCB3aXRoIG9uIHRoaXMgcGF0aCDigJQgaXQgaXMga2VwdCBiZWNhdXNlIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmVkIGRpc3BhdGNoIGhhcyBhbHJlYWR5IGhhZCBpdHMgY3JlYXRlIHJhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkLCBzbyBvbmUgY29uZGl0aW9uYWwgd3JpdGUgaGVyZSBpcyBjaGVhcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIGxldHRpbmcgdGhlIGJhcmUgc3RhcnQgZmFpbCBhbmQgcGF5aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4tYmFuZCByZWNvdmVyeSdzIGV4dHJhIHN0YXJ0IHJvdW5kIHRyaXAuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnN1cmVPdXRjb21lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElucHV0ICYmIG1ldGFkYXRhLmF0dGVtcHQgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCdvaycgYXMgY29uc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuc3VyZU91dGNvbWUgPT09ICdnb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRlbnRpdHkgPSBydW5Db250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmV0Y2hlZCwgZW5zdXJlT3V0Y29tZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJbnB1dCAmJiBtZXRhZGF0YS5hdHRlbXB0ID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZW5zdXJlU3RlcEZyb21NZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgnb2snIGFzIGNvbnN0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuc3VyZU91dGNvbWUgPT09ICdnb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZldGNoZWQuc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgc3RhdHVzOiBmZXRjaGVkLnN0YXR1cyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGByZXNvbHZlRGF0YTogJ25vbmUnYCBzdHJpcHMgaW5wdXQvb3V0cHV0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb3cncyB0eXBlOyBldmVyeSBjb25zdW1lciBoZXJlIHJlYWRzIGlkZW50aXR5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZHMgb25seSwgYW5kIHRoZSByZXBsYXkgc3ludGhlc2lzIG92ZXJyaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBiZ1J1biA9IGZldGNoZWQgYXMgV29ya2Zsb3dSdW47XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZGVudGl0eSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBmZXRjaGVkLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGZldGNoZWQuc3BlY1ZlcnNpb24gPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGZldGNoZWQuc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHN0YXJ0ZWRBdDogK2ZldGNoZWQuc3RhcnRlZEF0IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKGZldGNoZWQuYXR0cmlidXRlcywgcnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ292ZXJzIGV2ZXJ5IHF1ZXVlZCBzdGVwIGV4ZWN1dGlvbiDigJQgZmlyc3QgZGlzcGF0Y2ggYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyaWVzL3JldHJpZXMgYWxpa2UuIFRoZSByZS1yb3V0ZSBwYXlsb2FkIGtlZXBzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1lc3NhZ2UncyBzdGVwSW5wdXQvcnVuQ29udGV4dCBzbyB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVwbG95bWVudCdzIGNvbnN1bWVyIHJldGFpbnMgdGhlIHJlc2lsaWVudCByZS1lbnN1cmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGZldGNoLWZyZWUgcHJvbG9ndWUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSWRlbnRpdHkuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW5JZGVudGl0eS5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdGVwSW5wdXQgPyB7IHN0ZXBJbnB1dCB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihydW5Db250ZXh0ID8geyBydW5Db250ZXh0IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCB0aGUgcmUtcm91dGVkIGhvcCBpbiB0aGUgVFRSIGRlY29tcG9zaXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnU3RhcnRlZEF0ID0gcnVuSWRlbnRpdHkuc3RhcnRlZEF0ID8/IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRyeSBjZWlsaW5nIGZvciBhIGJhY2tncm91bmRlZCBzdGVwLiBgbWV0YWRhdGEuYXR0ZW1wdGBcbiAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50KSBpcyBhIGNoZWFwIHVwcGVyIGJvdW5kLCBidXQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyLWNvdW50czogYSBUaHJvdHRsZUVycm9yIC8gVG9vRWFybHlFcnJvciAob3IgYW55XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSB0aGF0IG5ldmVyIHJhbiB0aGUgYm9keSkgc3RpbGwgYWR2YW5jZXMgaXQsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1c3RpbmcgaXQgZGlyZWN0bHkgY291bGQgZmFpbCBhIHN0ZXAgYXMgXCJleGNlZWRlZCBtYXhcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyaWVzXCIgYmVmb3JlIHRoZSBib2R5IGV2ZXIgcmFuIChhIHVzZXItdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdW5kZXIgdHJhbnNpZW50IGJhY2tlbmQgcHJlc3N1cmUpLiBVc2UgaXQgb25seVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZmFzdCBnYXRlOiB3aGlsZSBpdCBpcyBhdCBvciB1bmRlciB0aGUgY2VpbGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGNhbm5vdCBiZSBleGhhdXN0ZWQsIHNvIHByb2NlZWQgd2l0aG91dCB0b3VjaGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cuIE9ubHkgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIGRvIHdlIGxvYWQgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb2cgYW5kIGRlcml2ZSB0aGUgYXV0aG9yaXRhdGl2ZSBhdHRlbXB0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkZWQgYHN0ZXBfc3RhcnRlZGAgY291bnQsIHNjb3BlZCB0byB0aGUgbGlmZWN5Y2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0b3RhbCAoYmFyZSBzdGFydHMgcGx1cyB0aGUgbGFyZ2VzdCBzaW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcidzIHN0YXJ0cyk6IHRocm90dGxlL3Rvby1lYXJseSByZWRlbGl2ZXJpZXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGFydCBhdCBhbGwsIHJhY2luZyBpbnZvY2F0aW9ucycgb25lLW9mZiBzdGFtcGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlcyBkb24ndCBhY2N1bXVsYXRlIChjb3VudGluZyB0aGVtIGZhbHNlbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGhhdXN0ZWQgaGVhbHRoeSBzdGVwcywgc2VlIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhdHRlbXB0cyBidXJuZWQgdW5kZXIgYSBwcmlvciBpbmxpbmUtb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2Ugc3RpbGwgY291bnQsIHNvIGEgc3RlcCB0aGF0IHRpbWVzIG91dCB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkIHJlY292ZXJ5IGFuZCB0aGVuIHRyYW5zaXRpb25zIHRvIHF1ZXVlZC9iYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllcyB0cmlwcyB0aGUgY29tYmluZWQgY2VpbGluZy4gVGhpcyBzdGlsbCBib3VuZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0cywgd2hpY2ggd3JpdGUgbm8gZXJyb3IgZm9yIHRoZSBwb3N0LWJvZHkgZ3VhcmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9IG1ldGFkYXRhLmF0dGVtcHQ7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdNYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0ZXBGdW5jdGlvbihpbmNvbWluZ1N0ZXBOYW1lKT8ubWF4UmV0cmllcyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gYmdNYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAndG90YWxBdHRlbXB0cycgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUVFI6IHRoaXMgZGVsaXZlcnkgSVMgdGhlIGRpc3BhdGNoZWQgbmV4dCBzdGVwIG9mIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bXB0aW9uLiBDb25zdW1lIHRoZSB0cmFja2luZyBoZXJlIHNvIHRoZSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGhpcyBoYW5kbGVyIG1heSBmYWxsIHRocm91Z2ggdG8gY2Fubm90XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGl0IGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUmVzdW1lVHJhY2tpbmcgPSByZXN1bWVUcmFja2luZztcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVuczpcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLWZsaWdodDogYSBkZWxheWVkIGJhY2tzdG9wIChvciByZXRyeSkgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGFycml2ZSB3aGlsZSBhbm90aGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHNhbWUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbWlkLWJvZHkgaW4gdGhpcyBwcm9jZXNzLCBtb3N0IGltcG9ydGFudGx5IG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCBubyBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBvd25lcnNoaXAgbGVhc2UgaXMgbm90IGEgZGVhdGggcHJvb2YuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50LCB0aGVuIGFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXhlY3V0aW5nLiBObyBvd25lck1lc3NhZ2VJZCBoZXJlOiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIG9mIGEgcXVldWUtZHJpdmVuIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSBjbGVhcnMgaW5saW5lIG93bmVyc2hpcCAodGhlIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlLW93bmVkIGZyb20gdGhpcyBwb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlUXVldWVkU3RlcCA9ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogcnVuSWRlbnRpdHkuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogYmdTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiBydW5JZGVudGl0eS5yb290UnVuSWQgPz8gcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHJ1bklkZW50aXR5LnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmc6IHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCBhcyBhIGZhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnYXRlLCB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZWNvcmRlZCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCBvbmNlIGl0IGNyb3NzZXMgdGhlIGNlaWxpbmcgKHNlZSBhYm92ZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJnUmVzdW1lVHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyByZXN1bWVUcmFja2luZzogYmdSZXN1bWVUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVldWVkU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4tYmFuZCByZXNpbGllbnQgcmVjb3Zlcnk6IGEgbWlzc2luZyBzdGVwIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN0ZXBJbnB1dC1jYXJyeWluZyBtZXNzYWdlIG1lYW5zIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG91dHJhbiAob3Igb3V0bGl2ZWQgYSB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgb2YpIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgd3JpdGUuIE1hdGVyaWFsaXplIHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgcGF5bG9hZCBhbmQgcmV0cnkgT05DRSwgd2l0aGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5LiBTZWUgZW5zdXJlU3RlcEZyb21NZXNzYWdlIGZvciB3aHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2Fubm90IHdhaXQgZm9yIGEgcmVkZWxpdmVyeS4gQSBzZWNvbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgcHJvcGFnYXRlcyBhcyBiZWZvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBJbnB1dCB8fCAhaXNTdGVwTWlzc2luZ0Vycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UoKSkgPT09ICdnb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgYXMgY29uc3QgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVldWVkU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzdGVwIGhhZCBwZW5kaW5nIG9wcyAoc3RyZWFtIHdyaXRlcyksIGJyZWFrIGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0VW50aWwgZmx1c2ggdGhlbSwgc28gY2FuJ3QgY29udGludWUgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnc2tpcHBlZCdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgZXZlbnRzIHRvIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXJzb3ItYmFzZWQgbG9hZGluZyBzbyB0aGUgbWFpbiBsb29wIGNhbiBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWxseSBmcm9tIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBuZXh0RXZlbnRMb2dMb2FkKGxvYWRlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBwZW5kaW5nIHN0ZXBzOiBhbnkgc3RlcF9jcmVhdGVkIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWF0Y2hpbmcgc3RlcF9jb21wbGV0ZWQgb3Igc3RlcF9mYWlsZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFRlcm1pbmFsSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbG9hZGVkLmV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVGVybWluYWxJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nU3RlcElkcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBlbmRpbmcgc3RlcCB0aGF0IFRISVMgbWVzc2FnZSBpbmxpbmUtb3ducyAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2Ugc3RhbXBlZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGFuZCB0aGVuIGNyYXNoZWQgbWlkLWJvZHkpIG11c3QgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmVkIGhlcmU6IG9ubHkgdGhlIG93bmluZyBtZXNzYWdlIG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1leGVjdXRlIGl0IGJlZm9yZSB0aGUgb3duZXJzaGlwIGxlYXNlIGV4cGlyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3YWtlIHJlcGxheXMgbWVyZWx5IGVuc3VyZSBhIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AuIEZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiBsb29wLCB3aG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0YWJsZSByb3V0ZXMgaXQgdG8gb3duZWQgcmVjb3ZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BlbmRpbmdTdGVwT3duZWRCeU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5tZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmU7IGZhbGxpbmcgdGhyb3VnaCB0byByZWNvdmVyIGFuIGlubGluZSBzdGVwIG93bmVkIGJ5IHRoaXMgbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHN0ZXBzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVpbmc6IHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGUgd2lsbCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgZG9uZSBhbmQgcmVwbGF5IGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nLCByZXR1cm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHN0ZXBzIGRvbmU6IGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiByZXBsYXkgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBzaGFyZWQgc3RhdGUgc28gdGhlIGxvb3AgY2FuIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lIGFmdGVyIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBydW4gcm93IG9ubHkgd2hlbiBjb250aW51aW5nIGludG8gcmVwbGF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGZvciBldmVyeSBxdWV1ZWQgc3RlcCdzIHByb2xvZ3VlLiBUaGlzIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdmVycyByZWNvdmVyeSBvZiBhbiBpbmxpbmUgc3RlcCBvd25lZCBieSB0aGlzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlSdW5Sb3cgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBiZ1J1biA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBzdGF0dXNlcyBvbmx5OiBhIGBwZW5kaW5nYCByZWFkIGhlcmUgaXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgcm93ICh0aGlzIHJ1biBoYXMgY29tcGxldGVkIHN0ZXBzLCBzbyBpdCBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0ZWQpLCBhbmQgdW5kZXIgdGhlIGZldGNoLWZyZWUgcHJvbG9ndWUgdGhpcyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgY29tcGxldGVyJ3MgT05MWSBzdGF0dXMgcmVhZCDigJQgcmV0dXJuaW5nIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBhYmFuZG9uIHRoZSBmYW4tb3V0J3MgY29udGludWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIGZpbmFsIHN0ZXBfY29tcGxldGVkIGlzIHdyaXR0ZW4sIHRoZSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBuZXZlciBydW5zKS4gRmFsbCB0aHJvdWdoIGluc3RlYWQ6IHRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bnRoZXNpemVzIGBydW5uaW5nYCBhbmQgdGhlIG5leHQgZW50aXR5IHdyaXRlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmZW5jZWQgc2VydmVyLXNpZGUgaWYgdGhlIHJ1biB0cnVseSBlbmRlZCBtZWFud2hpbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKHJlcGxheVJ1blJvdy5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBpbmxpbmUgcmVwbGF5IGFmdGVyIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlcGxheVJ1blJvdy5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3RlcCBib2R5IG5lZWRzIG5vIHdvcmtmbG93IFZNLiBDb21waWxlIG9ubHkgd2hlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5aW5nLCB1c2luZyB0aGUgZmV0Y2hlZCByb3cncyBWTSBzZWxlY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdvcmtmbG93Q29tcGlsZShyZXBsYXlSdW5Sb3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50ID0gbG9hZGVkLmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlJbnB1dDogdW5rbm93bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5DcmVhdGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBydW5DcmVhdGVkRXZlbnQuZXZlbnREYXRhLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xlZ2FjeVNwZWNWZXJzaW9uKHJlcGxheVJ1blJvdy5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm8gXCJydW5fY3JlYXRlZFwiIGV2ZW50YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnYWN5IHJ1bnMgcHJlZGF0ZSB0aGUgZXZlbnQtc291cmNlZCBydW5fY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhcmlhbnQsIHNvIHJldGFpbiB0aGUgcmVzb2x2ZWQgR0VUIG9ubHkgZm9yIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZ2FjeVJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZ2FjeVJ1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlJbnB1dCA9IGxlZ2FjeVJ1bi5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXBsYXlSdW5Sb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiByZXBsYXlJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gYmdTdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBlcnJvciB3aGlsZSBwcmVwYXJpbmcgYmFja2dyb3VuZCB3b3JrZmxvdyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gRGVwbG95bWVudC1hZmZpbml0eSBwcmUtY2hlY2sgZm9yIHRoZSBsYXp5IGhvb2sgZmFzdFxuICAgICAgICAgICAgICAgICAgLy8gcGF0aCBiZWxvdy4gTmV3IGxhenktcmVzdW1lIG1lc3NhZ2VzIGNhcnJ5IHRoZSBydW4nc1xuICAgICAgICAgICAgICAgICAgLy8gcGlubmVkIGRlcGxveW1lbnQgKGBob29rSW5wdXQuZGVwbG95bWVudElkYCksIHNvIGFcbiAgICAgICAgICAgICAgICAgIC8vIG1pc3JvdXRlZCBkZWxpdmVyeSBpcyBkZXRlY3RhYmxlIHdpdGggYSBjaGVhcCBhbWJpZW50XG4gICAgICAgICAgICAgICAgICAvLyBkZXBsb3ltZW50LWlkIGNvbXBhcmlzb24gQkVGT1JFIHRoZSBmYXN0IHBhdGgnc1xuICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3cml0ZSwgc28gdGhlIGNvcnJlY3RseS1yb3V0ZWQgY29tbW9uIGNhc2VcbiAgICAgICAgICAgICAgICAgIC8vIHBheXMgbm8gcnVuIGZldGNoIGFuZCBubyBsYXRlbmN5LiBPbmx5IGEgZGV0ZWN0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoIGZldGNoZXMgdGhlIGF1dGhvcml0YXRpdmUgcnVuIGFuZCBoYW5kcyBpdCB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGd1YXJkICh3aGljaCBvd25zIHJlLXJvdXRlL2ZhaWwgcG9saWN5KTtcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSByZS1yb3V0ZWQgbWVzc2FnZSBrZWVwcyB0aGUgY29tcGxldGUgYGhvb2tJbnB1dGAsXG4gICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBtYXkgaG9sZCB0aGUgb25seSBjb3B5IG9mIHRoZSByZXN1bWUgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHBpbm5lZCBvciBhbWJpZW50IGlkIGlzIHVuYXZhaWxhYmxlIChvbGRlclxuICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjZXIgbWVzc2FnZSwgYSB3b3JsZCB3aXRob3V0IGRlcGxveW1lbnQgYWZmaW5pdHksXG4gICAgICAgICAgICAgICAgICAvLyBvciBhIGdldERlcGxveW1lbnRJZCBmYWlsdXJlKSwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkOlxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGF1dGhvcml0YXRpdmUgZ3VhcmQgYWZ0ZXIgcnVuIHNldHVwICh3aGljaCByZW1haW5zXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvdGVjdGlvbiBiZWZvcmUgcmVwbGF5IGFuZCBzdGVwIGV4ZWN1dGlvbikgc3RpbGxcbiAgICAgICAgICAgICAgICAgIC8vIGNvdmVycyB0aGUgZGVsaXZlcnk7IHRoZSBmYXN0IHBhdGgncyB3cml0ZSBpcyBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAvLyBwZXIgKHJ1bklkLCByZXN1bWVJZCksIHNvIGEgcHJlLWd1YXJkIHdyaXRlIGZyb20gYW5cbiAgICAgICAgICAgICAgICAgIC8vIG9sZGVyIG1lc3NhZ2Ugc3RheXMgY29udmVyZ2VudC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXdvcmtmbG93UnVuICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dD8uZGVwbG95bWVudElkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBlbGlnaWJpbGl0eSBhcyBndWFyZERlcGxveW1lbnRBZmZpbml0eTogd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAvLyBhdG9taWMsIGltbXV0YWJsZSBkZXBsb3ltZW50cyB0aGUgaWRzIGxlZ2l0aW1hdGVseVxuICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXIgKGUuZy4gZHBsX2xvY2FsQDx2ZXJzaW9uPikgYW5kIGNvbXBhcmluZyB0aGVtXG4gICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIHRyaWdnZXIgc3B1cmlvdXMgcnVuIGZldGNoZXMuXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLmNhcGFiaWxpdGllcz8uZGVwbG95bWVudEFmZmluaXR5ID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlubmVkRGVwbG95bWVudElkID0gaG9va0lucHV0LmRlcGxveW1lbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnREZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgIT09IHBpbm5lZERlcGxveW1lbnRJZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgZ3VhcmREZXBsb3ltZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcndhcmRlZCBVTk1PRElGSUVEIChpbiBwYXJ0aWN1bGFyIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGRlbGl2ZXJ5J3MgZW50cnkgdGltZSkgc28gdGhlIG1pc3JvdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvcCBpcyBhdHRyaWJ1dGVkIHRvIGBxdWV1ZV9kZWxpdmVyeWAgYW5kIFQyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kcyB1cCBiZWluZyB0aGUgZmluYWwgY29uc3VtZXIncyBlbnRyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va1Jlc3VtZVRpbWluZyA/IHsgaG9va1Jlc3VtZVRpbWluZyB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXRSdW5SZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgKSkgIT09ICdjb250aW51ZSdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIExhenkgaG9vayByZXN1bWUgZmFzdCBwYXRoIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gQSBsYXp5IGhvb2sgZGVsaXZlcnkgKHJlc3VtZUlkICsgZGlnZXN0IG9uIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSkgaG9pc3RzIHRoZSBjb25zdW1lcidzIGlkZW1wb3RlbnQgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgLy8gcmUtZW5zdXJlIGFib3ZlIHJ1bl9zdGFydGVkIGFuZCBhc2tzIHRoZSBXb3JsZCB0byByZXR1cm5cbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHJlcGxheSBsb2cgd2l0aCB0aGUgd3JpdGUgKHByZWxvYWRFdmVudHMpLiBBXG4gICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nIFdvcmxkIGFuc3dlcnMgd2l0aCB0aGUgcmVjb25zdHJ1Y3RlZCBydW4sIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGUgcmVwbGF5IGxvZywgYW5kIHRoZSBydW4ncyBldmVudCBjZWlsaW5nOlxuICAgICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyB0aGUgZ2VuZXJpYyBzZXR1cCBiZWxvdyB3b3VsZCBzcGVuZCBhXG4gICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBQT1NUIGFuZCBhbiBldmVudHMubGlzdCBvbi4gQW55IG90aGVyIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgLy8gKG9sZGVyIHNlcnZlciwgYSBXb3JsZCB0aGF0IGlnbm9yZXMgdGhlIHBhcmFtLCBvciBhXG4gICAgICAgICAgICAgICAgICAvLyBwcmVsb2FkIHRoYXQgZmFpbHMgdmFsaWRhdGlvbiwgaW5jbHVkaW5nIGEgYm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gaGFzTW9yZSBwYWdlKSBmYWxscyBiYWNrIHRvIHRoYXQgZ2VuZXJpYyBzZXR1cDsgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkIHdyaXRlIGl0c2VsZiBoYXMgc3RpbGwgc3VjY2VlZGVkIGVpdGhlclxuICAgICAgICAgICAgICAgICAgLy8gd2F5LCBzbyB0aGUgcmUtZW5zdXJlIGJsb2NrIGJlbG93IGlzIHNraXBwZWQgdmlhXG4gICAgICAgICAgICAgICAgICAvLyBgaG9va0Vuc3VyZWRgLiBOZXZlciB0YWtlbiBvbiB0dXJibyAodHVyYm8gZGVsaXZlcmllc1xuICAgICAgICAgICAgICAgICAgLy8gY2FycnkgcnVuSW5wdXQsIG5vdCBob29rSW5wdXQpIG9yIGFmdGVyIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwIHBhdGggYWxyZWFkeSBsb2FkZWQgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgIGxldCBob29rRW5zdXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhd29ya2Zsb3dSdW4gJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0ICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5yZXN1bWVJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBob29rUmVzdW1lSW5wdXQgPSBob29rSW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIERhdGUgdGhlIG1hdGVyaWFsaXplZCBldmVudCB0byB3aGVuIHRoZSByZXN1bWUgYWN0dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIHNhbWUgZGVyaXZhdGlvbiBhcyB0aGUgcmUtZW5zdXJlIGJlbG93ICh0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lSWQgaXMgYSBVTElEIG1pbnRlZCBieSByZXN1bWVIb29rKCkgYXQgcmVzdW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIHRpbWUpLlxuICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJyZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVUaW1lKGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93Lmhvb2tfcmVjZWl2ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93Lmhvb2tfcmVjZWl2ZWQucHJlbG9hZF9ldmVudHMnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUxvYWQgPSB0cmFjZVJlcGxheUxvYWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnaG9va19wcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYXlFdmVudE9ic2VydmVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tSZXN1bWVJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tSZXN1bWVJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va1Jlc3VtZUlucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rUmVzdW1lSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVQYXlsb2FkRGlnZXN0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rUmVzdW1lSW5wdXQucGF5bG9hZERpZ2VzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRFdmVudHM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlFdmVudE9ic2VydmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVwbGF5TG9hZDtcbiAgICAgICAgICAgICAgICAgICAgICBob29rRW5zdXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogdW5saWtlIHRoZSByZS1lbnN1cmUgYmVsb3csIHRoaXMgaG9pc3RlZCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgTk9UIHNldCBIb29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkOiBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgb24gZXZlcnkgZmFzdC1wYXRoIHJlc3VtZSwgaW5jbHVkaW5nIHRoZSBjb21tb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIHdoZXJlIHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZSBhbHJlYWR5IGxhbmRlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGNhbGwgbWVyZWx5IGNvbnZlcmdlZCBvbiBpdCwgc28gaXQgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlY292ZXJ5IHNpZ25hbC4gd29ya2Zsb3cucmVzdW1lX3NldHVwX3NvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChiZWxvdykgZGVzY3JpYmVzIHRoaXMgcGF0aCBpbnN0ZWFkLlxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZWxvYWQgaXMgdXNhYmxlIGFzIHJlcGxheSBpbnB1dCBvbmx5IHdoZW4gaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZW1vbnN0cmFibHkgdGhlIGNvbXBsZXRlIHBpY3R1cmU6IGEgcmVjb25zdHJ1Y3RlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIGEgc3RhcnQgdGltZSwgYSBub24tZW1wdHkgQ09NUExFVEUgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGhhc01vcmUgZmFsc2UsIHNpbmNlIHRoaXMgcGF0aCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3ItY29udGludWF0aW9uIG1hY2hpbmVyeSwgc28gYSBib3VuZGVkIHBhZ2UgbXVzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZSB0cnVzdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmVyJ3MgZXZlbnQgY2VpbGluZyAodGhpcyByZXNwb25zZSBwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkJ3Mgcm9sZSwgc28gYSBtaXNzaW5nIGNlaWxpbmcgd291bGQgbGVhdmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudC1saW1pdCBlbmZvcmNlbWVudCBkaXNhYmxlZCBmb3IgdGhlIHJ1biksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBydW4gbGlmZWN5Y2xlIGV2ZW50cywgdGhlIGNhbm9uaWNhbCBldmVudCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgY29udmVyZ2VkIG9uLCBhbmQgdGhlIGhvb2tfcmVjZWl2ZWQgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUSElTIHJlc3VtZSAoc28gd2UgbmV2ZXIgcmVwbGF5IGFnYWluc3QgYSBsb2cgdGhhdCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcgdGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZGVsaXZlcnkpLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzYWJsZVJlcGxheVByZWxvYWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1biAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucnVuLnN0YXJ0ZWRBdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jdXJzb3IgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc01vcmUgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0Lm1heEV2ZW50cyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZXN1bWVJZCA9PT0gaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlUmVwbGF5UHJlbG9hZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bj8uc3RhcnRlZEF0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVjb25zdHJ1Y3RlZCBydW4gYWx3YXlzIHJlYWRzICdydW5uaW5nJywgYnV0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50IGNvbW1pdHRlZCBjb25jdXJyZW50bHkgcmlkZXMgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgaXRzZWxmLiBUaGUgbm9kZSByZXBsYXkgbG9vcCB3b3VsZCBjYXRjaCBpdCwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIGRpc3BhdGNoZXMgYmVmb3JlIHRoYXQgY2hlY2ssIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWxpdmVyeSBoZXJlLCBiZWZvcmUgYW55IGVuZ2luZSBydW5zLiBTYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lIGFzIHRoZSBydW5fc3RhcnRlZCBwYXRoJ3Mgbm9uLXJ1bm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXR1cyBjaGVjay5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsRXZlbnQgPSByZXN1bHQuZXZlbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZWxvYWQgc3RpbGwgaW5pdGlhbGl6ZWQgdGhpcyBkZWxpdmVyeSAoaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgaG93IHRoZSB0ZXJtaW5hbCBzdGF0ZSB3YXMgb2JzZXJ2ZWQpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAtc291cmNlIGFuZCB0aGUgcnVuJ3MgYWN0dWFsIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXR1cyBhcmUgcmVjb3JkZWQgYmVmb3JlIGNvbnN1bWluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFdmVudC5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGVybWluYWxFdmVudC5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdjYW5jZWxsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfc3RyZWFtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBsYXp5IGhvb2sgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGVybWluYWxFdmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdvcmtmbG93Q29tcGlsZSh3b3JrZmxvd1J1bik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHJlc3VsdC5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9ycyBSU0ZTLCBzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlLiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBwbGF5cyBydW5fc3RhcnRlZCdzIHJvbGUgb24gdGhpcyBwYXRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcuc2V0dXBTb3VyY2UgPSAnaG9va19wcmVsb2FkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzZnVsIHdyaXRlLCBubyB1c2FibGUgcHJlbG9hZCAoQ0JPUiByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhbiBvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0LWluLCBhIGJvdW5kZWQgaGFzTW9yZSBwYWdlLCBvciBhIHByZWxvYWQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHZhbGlkYXRpb24pOiB0YWtlIHRoZSBnZW5lcmljIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBiZWxvdy4gSXRzIHByZWxvYWQgaXMgbG9hZGVkIGFmdGVyIHRoaXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCwgc28gdGhlIGNhbm9uaWNhbCBob29rX3JlY2VpdmVkIGlzIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHdoYXRldmVyIGxvZyB0aGF0IHNldHVwIHJlYWRzLCBzbyBubyBzcGxpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzdW1lU2V0dXBTb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfZmFsbGJhY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGNsYXNzaWZpY2F0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3c6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLSBIb29rTm90Rm91bmQgLyBSdW5FeHBpcmVkOiB0aGUgcnVuIHdlbnQgdGVybWluYWw7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBub3RoaW5nIGxlZnQgdG8gcmVzdW1lLCBjb25zdW1lIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gYW55dGhpbmcgZWxzZSAoRW50aXR5Q29uZmxpY3QsIGEgdHJ1bmNhdGVkIHByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbSwgdHJhbnNwb3J0IGZhaWx1cmVzKTogdHJhbnNpZW50LiBSZXRocm93IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgdGhlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIChydW5JZCwgcmVzdW1lSWQpIGNsYWltIGNvbnZlcmdlcyBvbiByZXRyeS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIGxhenkgaG9vayBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcmVjb3JkV29ya2Zsb3dTZXR1cEZhaWx1cmUoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyAtLS0gSW5mcmFzdHJ1Y3R1cmU6IHByZXBhcmUgdGhlIHJ1biBzdGF0ZSAtLS1cbiAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgd29ya2Zsb3dSdW4gd2FzIGFscmVhZHkgc2V0IGJ5IHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwIHBhdGggKGlubGluZSByZXBsYXkgYWZ0ZXIgYWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUpXG4gICAgICAgICAgICAgICAgICAvLyBvciBieSB0aGUgbGF6eSBob29rIGZhc3QgcGF0aCBhYm92ZS5cbiAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgcnVuX3N0YXJ0ZWQgZGlyZWN0bHk6IHRoaXMgYm90aCB0cmFuc2l0aW9uc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHRvICdydW5uaW5nJyBBTkQgcmV0dXJucyB0aGUgcnVuIGVudGl0eSwgc2F2aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgc2VwYXJhdGUgcnVucy5nZXQgcm91bmQtdHJpcC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJhY3Q6IGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJykgbXVzdCBiZSBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBydW5zIGFscmVhZHkgaW4gJ3J1bm5pbmcnIHN0YXR1cyAocmV0dXJuIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBlcnJvciksIG5vdCBqdXN0IGZvciBwZW5kaW5nIOKGkiBydW5uaW5nIHRyYW5zaXRpb25zLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBydW5TdGFydGVkRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX3N0YXJ0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc3BlYyB2ZXJzaW9uIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0KCkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYXZhaWxhYmxlLCBzbyB0aGUgcmVzaWxpZW50IHN0YXJ0IHBhdGggY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gd2l0aCB0aGUgY29ycmVjdCB2ZXJzaW9uIChub3QgYWx3YXlzIGN1cnJlbnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ/LnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgcnVuIGlucHV0IGZyb20gcXVldWUgc28gdGhlIHNlcnZlciBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJ1biBpZiBydW5fY3JlYXRlZCB3YXMgbWlzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVpbnQ4QXJyYXkgdmFsdWVzIHN1cnZpdmUgdGhlIHF1ZXVlIG5hdGl2ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gKENCT1Igb24gd29ybGQtdmVyY2VsLCBKU09OIHJldml2ZXIgb24gd29ybGQtbG9jYWwpLlxuICAgICAgICAgICAgICAgICAgICAgIC4uLihydW5JbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXQud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXQuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0dXJibyAmJiBydW5JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBiYWNrZ3JvdW5kIGBydW5fc3RhcnRlZGAgYW5kIHN5bnRoZXNpemUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGl0eSBsb2NhbGx5IHNvIHJlcGxheSBjYW4gYmVnaW4gd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZC10cmlwLiBTYWZlIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uOiBzdGFydCgpIGNyZWF0ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIG1vbWVudHMgYWdvIGFuZCBubyBldmVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJyaWVyIGlzIGNvbnN1bWVkIGJ5IGV2ZXJ5IGRvd25zdHJlYW0gd3JpdGUgKHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyLCBvcHRpbWlzdGljIHN0ZXBfc3RhcnRlZCwgdGVybWluYWwgcnVuIHdyaXRlcykgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50KCd3b3JrZmxvdy5ydW5fc3RhcnRlZC5jcmVhdGUuc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuc2tpcF9wcmVsb2FkJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydGVkUHJvbWlzZSA9IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYmFja2dyb3VuZCB0aGlzIHB1cmVseSBhcyBhIHdyaXRlIGJhcnJpZXIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZWFkIGl0cyBwcmVsb2FkZWQgZXZlbnRzLCBzbyBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgZXZlbnQtbG9nIHByZWxvYWQuIFRoYXQgdHJpbXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCByZXF1ZXN0IHRoZSBjaGFpbmVkIGZpcnN0IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdHMgb24gKHNob3J0ZW5pbmcgdGltZS10by1zZWNvbmQtc3RlcCkgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzdGVkIGxpc3QrcmVzb2x2ZSBpdCB3b3VsZCBvdGhlcndpc2UgY29tcHV0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkLCBza2lwUHJlbG9hZDogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIgPSBzdGFydGVkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRXb3JrZmxvd0NvbXBpbGUocnVuSW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSZXBsYXlQYXlsb2FkQ2FjaGUocnVuSW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgcmVjb3JkV29ya2Zsb3dTZXR1cEZhaWx1cmUoZXJyKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBiYWNrZ3JvdW5kcyBydW5fc3RhcnRlZCwgc28gdGhlIG5vbi10dXJib1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc2lnbm1lbnQgYmVsb3cgbmV2ZXIgcnVucy4gVGhyZWFkIHRoZSBwZXItcnVuIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2VpbGluZyBvZmYgdGhlIGJhY2tncm91bmRlZCByZXNwb25zZSBoZXJlIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGd1YXJkIHJlLWNoZWNrcyBtYXhFdmVudHNMaW1pdCBldmVyeSBsb29wXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0aW9uLCBzbyBhIHZhbHVlIHRoYXQgbGFuZHMgc2hvcnRseSBhZnRlciBzdGFydFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGVuZm9yY2VzIHdlbGwgYmVmb3JlIGEgcnVuYXdheSBsb2cgYXBwcm9hY2hlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjZWlsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3RhcnRlZFByb21pc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gY2xhbXBNYXhFdmVudHMoci5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCkgbWF4RXZlbnRzTGltaXQgPSBsaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGFuIGVhcmx5IGZhaWx1cmUgZnJvbSBzdXJmYWNpbmcgYXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuaGFuZGxlZFJlamVjdGlvbjsgcnVuUmVhZHlCYXJyaWVyIHN0aWxsIG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0OiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIHlldCBvbiBhIGZpcnN0IGRlbGl2ZXJ5IChydW5fc3RhcnRlZCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCkuIEFuIGVtcHR5IHByZWxvYWQgcm91dGVzIGl0ZXJhdGlvbiAxIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm8tbG9hZCBwcmVsb2FkZWQgYnJhbmNoOyBpdGVyYXRpb24gMiB0aGVuIHRha2VzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBvc3QtcHJlbG9hZGVkIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGEgc3B1cmlvdXMgXCJjdXJzb3IgbWlzc2luZ1wiIHdhcm5pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW5JbnB1dC5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVkIGF0dHJpYnV0ZXMgZnJvbSBzdGFydCgpIHJpZGUgYWxvbmcgaW4gYHJ1bklucHV0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgbGl2ZSBpbiBgcnVuX2NyZWF0ZWRgJ3MgZXZlbnREYXRhLCBub3Qgc2VwYXJhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBhdHRyX3NldGAgZXZlbnRzKSwgc28gdGhlIHN5bnRoZXNpemVkIHNuYXBzaG90IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gZXZlbiB0aG91Z2ggd2Ugc2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCBPTkxZIHdoaWxlIGF0dHJpYnV0ZXMgYXJlIHdyaXRlLW9ubHk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBpbi13b3JrZmxvdyByZWFkIEFQSSB0b2RheSAoc2VlIHdvcmtmbG93LnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkXCIpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByZWxvYWRlZCBsb2cgY2FuJ3QgZGl2ZXJnZSBvbiBhIHJlYWQuIElmIGEgcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIGlzIGV2ZXIgYWRkZWQgaXQgTVVTVCByZWFkIGZyb20gdGhpcyBzbmFwc2hvdCwgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSByZXBsYXlpbmcgcnVuX2NyZWF0ZWQvYXR0cl9zZXQgZXZlbnRzLCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvJ3MgZW1wdHkgaW5pdGlhbCBsb2cgd291bGQgc3VyZmFjZSBzZWVkIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGB7fWAgb24gdGhlIGZpcnN0IGRlbGl2ZXJ5IG9ubHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgYHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXNgIGRlY2xhcmF0aW9uIGFib3ZlOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHN5bnRoZXNpemVzIHRoZSBydW4gYmVmb3JlIHRoZSByZWFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCByZXNwb25zZSBsYW5kcywgc28gYW5jaG9yIFJTRlMgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGF0IGFuIGFjdHVhbCByZXNwb25zZSBpbnN0YW50LlxuICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdydW5uaW5nJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuc2tpcF9wcmVsb2FkJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUxvYWQgPSB0cmFjZVJlcGxheUxvYWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdydW5fc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYXlFdmVudE9ic2VydmVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUV2ZW50KHJ1blN0YXJ0ZWRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RXZlbnRPYnNlcnZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0V29ya2Zsb3dDb21waWxlKHJ1bklucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSZXBsYXlQYXlsb2FkQ2FjaGUocnVuSW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc2V0dXBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcGxheUxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBzeW5jaHJvbm91cyBzZXR1cCBlcnJvciBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmluZyB0aGUgaW4tZmxpZ2h0IHJlcGxheSBsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNldHVwRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXBsYXlMb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgPSBjbGFtcE1heEV2ZW50cyhyZXN1bHQubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcnMgUlNGUywgc2VlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ292ZXJzIGJvdGggdGhlIHBsYWluIHNlcXVlbnRpYWwgcmVzdW1lIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhenkgZmFzdCBwYXRoJ3MgZmFsbGJhY2sgKHdob3NlIGhvaXN0ZWQgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIG5vIHVzYWJsZSBwcmVsb2FkIGFuZCBsZWZ0IHdvcmtmbG93UnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnNldCwgc28gaXQgbGFuZHMgaGVyZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcuc2V0dXBTb3VyY2UgPSAncnVuX3N0YXJ0ZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmV2ZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFsuLi5yZXN1bHQuZXZlbnRzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSByZXN1bHQuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dEV2ZW50TG9nTG9hZChsb2FkZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmxvYWRlZCwgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArcmVzdWx0LnJ1bi5zdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJlc3VsdC5ydW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJ1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQucnVuLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIGBjYW5jZWxgLCB3ZSBhY3R1YWxseSB3YW50IHRvIHByb3BhZ2F0ZSBhIFdvcmtmbG93Q2FuY2VsbGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgd29ya2Zsb3cgY29udGV4dCBzbyB0aGUgdXNlciBjYW4gZ3JhY2VmdWxseSBleGl0LiB0aGlzIGlzIFNJR1RFUk1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZnVydGhlcm1vcmUsIHRoZXJlIHNob3VsZCBiZSBhIHRpbWVvdXQgb3IgYSB3YXkgdG8gZm9yY2UgY2FuY2VsIFNJR0tJTExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBhY3R1YWxseSBleGl0IGhlcmUgd2l0aG91dCByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGF0IGFsbCwgaW4gdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheWluZyB0aGUgd29ya2Zsb3cgaXMgaXRzZWxmIGZhaWxpbmcuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRXb3JrZmxvd0NvbXBpbGUod29ya2Zsb3dSdW4pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHdhcyBjb25jdXJyZW50bHkgY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yOiBydW4gd2FzIGNvbmN1cnJlbnRseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGVkIGR1cmluZyBzZXR1cC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yOiBydW4gYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgc2tpcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGF3YWl0IHJlY29yZFdvcmtmbG93U2V0dXBGYWlsdXJlKGVycikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKG5vbi10dXJibyBydW5fc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmICghd29ya2Zsb3dSdW4pXG4gICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIG11c3QgYmUgbG9hZGVkIGJlZm9yZSByZXBsYXknXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gTmVpdGhlciBzZXR1cCBicmFuY2ggcmFuLCBzbyB0aGUgcnVuIGFycml2ZWQgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgLy8gbG9hZGVkIGFuZCBzZXR1cCB3YXMgYSBwbGFpbiBldmVudCBsb2FkLiBPbmx5IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZC1zdGVwIGZhbGwtdGhyb3VnaCByZWFjaGVzIGhlcmUgd2l0aCBhIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gcHJlbG9hZGVkIHRvZGF5LCBhbmQgaXQgY29uc3VtZXMgdGhlIHRyYWNraW5nIGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gdGhpcyBpcyB0aGUgaG9uZXN0IGRlZmF1bHQgcmF0aGVyIHRoYW4gYSBsaXZlXG4gICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQga2VlcHMgdGhlIGRpbWVuc2lvbiB0b3RhbCBpZiBvbmUgaXMgZXZlciBhZGRlZC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcuc2V0dXBTb3VyY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ2V2ZW50X2xvYWQnO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgZmxvdyByZXBsYXkgKGluaXRpYWwgc3RhcnQsIHN0ZXAgY29tcGxldGlvbnMsXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHJlc3VtcHRpb25zLCB3YWl0IGNvbXBsZXRpb25zKSBhbmQgc3RvcHMgYmVmb3JlIGFueVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY29kZSBvciBpbmxpbmUgc3RlcCBleGVjdXRlcyB3aGVuIHRoZSBydW4gaXMgbm90XG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgaGVyZSAoc2VlIGBndWFyZERlcGxveW1lbnRBZmZpbml0eWApLiBUaGlzIHJlbWFpbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBBVVRIT1JJVEFUSVZFIHByb3RlY3Rpb24gYmVmb3JlIHJlcGxheSBhbmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBgYXdhaXRSdW5SZWFkeWAgb3JkZXJzIHR1cmJvJ3MgYHJ1bl9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGVpdGhlciBzdG9wcGluZyBhY3Rpb24uXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBob29rIHJlc3VtZXMgYXJlIGFkZGl0aW9uYWxseSBwcmUtY2hlY2tlZCBhYm92ZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGZhc3QgcGF0aDogYSBuZXcgbWVzc2FnZSdzIGBob29rSW5wdXQuZGVwbG95bWVudElkYCBpc1xuICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZWQgYWdhaW5zdCB0aGUgYW1iaWVudCBkZXBsb3ltZW50IGlkIGZvciBmcmVlLCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYSBkZXRlY3RlZCBtaXNtYXRjaCBmZXRjaGVzIHRoZSBhdXRob3JpdGF0aXZlIHJ1bixcbiAgICAgICAgICAgICAgICAgIC8vIHNvIGEgbWlzcm91dGVkIG1vZGVybiByZXN1bWUgcmUtcm91dGVzIHdpdGggemVybyBldmVudFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzLiBPbGRlciBtZXNzYWdlcyAobm8gYGhvb2tJbnB1dC5kZXBsb3ltZW50SWRgKSByZWFjaFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZhc3QgcGF0aCdzIGlkZW1wb3RlbnQgaG9va19yZWNlaXZlZCB3cml0ZSBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQ7IHRoYXQgd3JpdGUgY29udmVyZ2VzIHBlciAocnVuSWQsIHJlc3VtZUlkKSBvbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHBpbm5lZCBkZXBsb3ltZW50LCBzbyBpdCBpcyBzYWZlIGJ1dCBpbmN1cnMgdGhlIHdyaXRlLiBFaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgcmUtcm91dGVkIG1lc3NhZ2UgbXVzdCBjYXJyeSBgaG9va0lucHV0YCwgb3IgYVxuICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHdob3NlIHByb2R1Y2VyIHdyaXRlIGhhZCBub3QgeWV0IGxhbmRlZCB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgLy8gbG9zdC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va0lucHV0ID8geyBob29rSW5wdXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgcHJlLWNoZWNrIHJlLXJvdXRlIGFib3ZlOiBmb3J3YXJkZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVkLCBzbyB0aGUgZXh0cmEgaG9wIGlzIHF1ZXVlIGRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBMZWdhY3kgbGF6eSBob29rIHJlc3VtZTogaWRlbXBvdGVudGx5IGVuc3VyZSB0aGUgZXZlbnQgZnJvbVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHBheWxvYWQtYmVhcmluZyBgaG9va0lucHV0YCBiZWZvcmUgcmVwbGF5LCBrZXllZCBieVxuICAgICAgICAgICAgICAgICAgLy8gYHJlc3VtZUlkYCBzbyByZWRlbGl2ZXJpZXMgY29udmVyZ2Ugb24gZXhhY3RseSBvbmUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAvLyBgaG9va0lucHV0YCBuZXZlciByaWRlcyBhIHR1cmJvIGZpcnN0LWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyAodGhhdCBwYXRoIGNhcnJpZXMgYHJ1bklucHV0YCwgbm90IGBob29rSW5wdXRgKSwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gb25seSBydW5zIG9uIHRoZSBub3JtYWwgbG9hZC1hbmQtcmVwbGF5IHBhdGguIFNraXBwZWRcbiAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IHdoZW4gdGhlIGZhc3QgcGF0aCBhYm92ZSBhbHJlYWR5IGVuc3VyZWQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBldmVudCAoYGhvb2tFbnN1cmVkYCksIHN1Y2Nlc3NmdWxseSBvciB2aWEgaXRzIGZhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgLy8gd2hvc2UgcnVuX3N0YXJ0ZWQgcHJlbG9hZCB3YXMgbG9hZGVkIGFmdGVyIHRoZSB3cml0ZSBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgZXZlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoaG9va0lucHV0ICYmICFob29rRW5zdXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZXJmIChPcHRpb24gQSk6IGlmIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFscmVhZHkgbGFuZGVkIGluIHRoZSBydW5fc3RhcnRlZCBwcmVsb2FkLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIGV2ZW50IGlzIGluIHRoZSBsb2cgYW5kIHRoZSByZS1lbnN1cmUgcm91bmQgdHJpcFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBwdXJlIG92ZXJoZWFkLiBTa2lwIGl0IHdoZW4gdGhlIHByZWxvYWQgYWxyZWFkeSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgYGhvb2tfcmVjZWl2ZWRgIHdpdGggdGhpcyByZXN1bWUncyBwZXJzaXN0ZWQgYHJlc3VtZUlkYFxuICAgICAgICAgICAgICAgICAgICAvLyAodW5pcXVlIHBlciByZXN1bWUsIHNvIHdlIG5ldmVyIHNraXAgb24gYW4gdW5yZWxhdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQpLiBCZXN0LWVmZm9ydDogdGhlIHdpbiBsYW5kcyBvbmx5IHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyJ3Mgd3JpdGUgYmVhdCB0aGlzIGNvbnN1bWVyJ3MgbG9hZDsgb3RoZXJ3aXNlIHdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgaWRlbXBvdGVudCByZS1lbnN1cmUgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdW5yZWFjaGFibGUgZm9yIGF0b21pYyBsYXp5IHJlc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gKHJlc3VtZUlkICsgZGlnZXN0KTogdGhvc2Ugc2V0IGBob29rRW5zdXJlZGAgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgZmFzdCBwYXRoIGFib3ZlIChvbiBzdWNjZXNzIEFORCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2spLCBzbyB0aGlzIGJsb2NrIChhbmQgdGhlIHNraXAgY2hlY2spIG5vdyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcyBob29rSW5wdXQgc2hhcGVzIHdpdGhvdXQgdGhlIGZ1bGwgaWRlbXBvdGVuY3lcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFpci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVByZWxvYWRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nOiBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgbGVhdmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkLCBzbyB0aGUgV29ybGQgZmFsbHMgYmFjayB0byBgY3JlYXRlZEF0YC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJyZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5yZXN1bWVJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShkZWNvZGVUaW1lKGhvb2tJbnB1dC5yZXN1bWVJZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5zdXJlZEV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0lucHV0LnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va0lucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lUGF5bG9hZERpZ2VzdDogaG9va0lucHV0LnBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lci1zaWRlIGNvbXBsZXRpb24gb2YgdGhlIHJlY292ZXJ5IHBhdGg6IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBtYXRlcmlhbGl6ZWQgdGhlIGV2ZW50IGJlY2F1c2UgdGhlIHByb2R1Y2VyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdCB3cml0ZSBoYWQgbm90IGxhbmRlZCBpbiB0aGUgcHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBldmVudCAod2hldGhlciB0aGlzIGNhbGwgY29tbWl0dGVkIGl0IG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJnZWQgb24gdGhlIHByb2R1Y2VyJ3MgY29uY3VycmVudCB3cml0ZSksIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIGFuZCwgd29yc2UsIHdvdWxkIGFjayBhIGRlbGl2ZXJ5IHRoYXQgbWF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNhcnJ5IHRoZSBvbmx5IGNvcHkgb2YgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEVudGl0eUNvbmZsaWN0IChhbmQgYW55IG90aGVyIHVuZXhwZWN0ZWQgZXJyb3IpOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmVzdW1lSWQgY29uc3RyYWludCBleGlzdHMgYnV0IHRoZSBtYXRjaGluZyBldmVudCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBub3QgeWV0IG9ic2VydmFibGU6IHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIHdyaXRlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0aWxsIGluIGZsaWdodCwgb3IgYSByZWRyaXZlIHJhY2VkIHRoZSBjbGFpbS4gVGhpcyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0cmFuc2llbnQ6IHJldGhyb3cgc28gdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgYXR0ZW1wdCBjb252ZXJnZXMgb24gdGhlIGNvbW1pdHRlZCBldmVudCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlcGxheWluZyAoYW5kIGFja2luZykgd2l0aG91dCB0aGUgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlIHByZWxvYWRlZCB0aGUgbG9nIEJFRk9SRSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlLCBzbyBpdCBjYW5ub3QgaW5jbHVkZSB0aGUgaG9va19yZWNlaXZlZC4gUmF0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBkaXNjYXJkIHRoZSBwcmVsb2FkICh3aGljaCB3b3VsZCBjb3N0IGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZCB0cmlwIG9uIHRoZSBmaXJzdCByZXBsYXkgaXRlcmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaW4gdGhlIGNhbm9uaWNhbCBldmVudCByZWNvbnN0cnVjdGVkIGFib3ZlLiBJdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYSBzdGFibGUgZXZlbnRJZCwgc28gYGluc2VydEV2ZW50QnlFdmVudElkYCBrZWVwc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGluIGFzY2VuZGluZyBldmVudElkIG9yZGVyIGFuZCBpcyBpZGVtcG90ZW50IGlmIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IHJlLW9ic2VydmVzIGl0LiBPbmx5IHdoZW4gdGhlIFdvcmxkIHJldHVybnMgbm8gZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB3ZSBmYWxsIGJhY2sgdG8gcmVsb2FkaW5nIHRoZSBjb21wbGV0ZSBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJyAmJiBlbnN1cmVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEV2ZW50QnlFdmVudElkKGV2ZW50TG9nLmV2ZW50cywgZW5zdXJlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVSZXBsYXlFdmVudChlbnN1cmVkRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChyZS1lbnN1cmUgbmVlZGVkKVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgbGl2ZSBWTSBwYXJrZWQgYXQgdGhlIHByZXZpb3VzIGJvdW5kYXJ5LCB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gcmV0ZW50aW9uIGRlY2lzaW9uIGtlcHQgaXQuIG51bGwg4oaSIHRoaXMgaXRlcmF0aW9uIGNvbGQtXG4gICAgICAgICAgICAgICAgICAvLyByZXBsYXlzLiBJbnZvY2F0aW9uLXNjb3BlZDogZGllcyB3aXRoIHRoaXMgZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgcmV0YWluZWRTZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gSG9va3Mgd2hvc2UgY3JlYXRlIHRoaXMgaW52b2NhdGlvbiBoYXMgYWxyZWFkeSBhbnN3ZXJlZCBieVxuICAgICAgICAgICAgICAgICAgLy8gY29udGludWluZyBpbiB0aGlzIHByb2Nlc3MgaW5zdGVhZCBvZiByZS1pbnZva2luZyDigJRcbiAgICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIGNyZWF0ZSBjb21taXR0ZWQgdGhlIGBob29rX2NyZWF0ZWRgIGFcbiAgICAgICAgICAgICAgICAgIC8vIGBob29rLmdldENvbmZsaWN0KClgIHdhcyBwYXJrZWQgb24gb3IgdGhlIGBob29rX2NvbmZsaWN0YFxuICAgICAgICAgICAgICAgICAgLy8gYSBjbGFpbWVkIHRva2VuIHByb2R1Y2VkLiBPbmUgc2V0LCBiZWNhdXNlIGEgaG9vayB0YWtlc1xuICAgICAgICAgICAgICAgICAgLy8gb25lIG9mIHRob3NlIG91dGNvbWVzIGFuZCBuZXZlciBib3RoLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIFRyYWNrZWQgYnkgaG9vaywgbm90IGJ5IGNvdW50LCBiZWNhdXNlIGEgcmVwZWF0IGZvciB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFNBTUUgaG9vayBpcyB0aGUgb25seSBzaGFwZSB0aGF0IGNhbm5vdCBtYWtlIHByb2dyZXNzOiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBpcyByZXNvbHZlZCBieSBhbiBldmVudCB0aGUgc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21taXR0ZWQsIHNvIGEgcGFzcyB0aGF0IGNvbWVzIGJhY2sgYXNraW5nIGZvclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgb25lIHJhbiBvdmVyIGEgbG9nIHRoYXQgc3RpbGwgZGlkIG5vdCBob2xkIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LCBhbmQgY29udGludWluZyBhZ2FpbiB3b3VsZCBzcGluLiBBIGhvb2sgdGhhdCBoYXNcbiAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZWVuIHNlZW4gaGVyZSBiZWZvcmUgaXMgYSBwYXNzIHRoYXQgZ290IHNvbWV3aGVyZSwgc29cbiAgICAgICAgICAgICAgICAgIC8vIGEgd29ya2Zsb3cgY3JlYXRpbmcgb25lIHN1Y2ggaG9vayBhZnRlciBhbm90aGVyIGtlZXBzXG4gICAgICAgICAgICAgICAgICAvLyBjb250aW51aW5nIGluLXByb2Nlc3MgZm9yIGVhY2guXG4gICAgICAgICAgICAgICAgICBjb25zdCBjb250aW51ZWRIb29rSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBzIFRISVMgZGVsaXZlcnkgaGFzIGFscmVhZHkgcHVibGlzaGVkIGFcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAtZXhlY3V0aW9uIG1lc3NhZ2UgZm9yLCBhY3Jvc3MgaXRzIHJlcGxheSBwYXNzZXM6XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyJ3MgcmVzaWxpZW50IHB1Ymxpc2hlc1xuICAgICAgICAgICAgICAgICAgLy8gKGBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHNgKSBwbHVzIHRoZSBkaXNwYXRjaCBwYXNzJ3NcbiAgICAgICAgICAgICAgICAgIC8vIG93biBpbW1lZGlhdGUgZW5xdWV1ZXMuIEEgZmFuLW91dCB0aGF0IHJ1bnMgc29tZSBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIGZhbGxzIGJhY2sgaW50byB0aGlzIGxvb3Agb25jZSB0aGV5IGZpbmlzaCxcbiAgICAgICAgICAgICAgICAgIC8vIHJlbG9hZHMgdGhlIGxvZywgYW5kIGZpbmRzIHRoZSBxdWV1ZWQgc2libGluZ3Mgc3RpbGxcbiAgICAgICAgICAgICAgICAgIC8vIHBlbmRpbmc7IHdpdGhvdXQgdGhpcyBzZXQgdGhlIG5leHQgZGlzcGF0Y2ggcGFzcyBzZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgb25lIG9mIHRoZWlyIG1lc3NhZ2VzIGFnYWluLiBUaGUgcXVldWUgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgLy8gdGhlbSBieSBpZGVtcG90ZW5jeSBrZXksIGJ1dCBlYWNoIHJlZHVuZGFudCBzZW5kIHN0aWxsXG4gICAgICAgICAgICAgICAgICAvLyBjb3N0cyBhIHJvdW5kLXRyaXAgb24gdGhlIHNoYXJlZCBjb25uZWN0aW9uIHBvb2wgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBob2xkcyB0aGUgaW52b2NhdGlvbiBvcGVuIHBhc3QgaXRzIHVzZWZ1bCB3b3JrXG4gICAgICAgICAgICAgICAgICAvLyAobWVhc3VyZWQ6IDE5LTI4IHJlLXNlbmRzIHBlciBwYXNzIG9uIGEgMzItYnJhbmNoXG4gICAgICAgICAgICAgICAgICAvLyBmYW4tb3V0LCB+NDAwIG1zIGFmdGVyIHRoZSBvcmlnaW5hbHMpLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBpbnZvY2F0aW9uLXNjb3BlZCwgbmV2ZXIgZGVyaXZlZCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbG9nOiBhIGBzdGVwX2NyZWF0ZWRgIGluIHRoZSBsb2cgcHJvdmVzIHRoZSBzdGVwIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCwgbm90IHRoYXQgaXRzIG1lc3NhZ2Ugd2FzIGV2ZXIgc2VudCAodGhlXG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaXNoZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuIHRoZSB0d28pLiBTbyBhXG4gICAgICAgICAgICAgICAgICAvLyBESUZGRVJFTlQgaW52b2NhdGlvbiAoY3Jhc2gtcmVjb3ZlcnkgcmVkZWxpdmVyeSwgYVxuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCB3YWtlKSByZS1lbnF1ZXVlcyB1bmNvbmRpdGlvbmFsbHksIGV4YWN0bHlcbiAgICAgICAgICAgICAgICAgIC8vIGFzIGJlZm9yZSwgYW5kIG9ubHkga25vd2xlZGdlIG9mIHRoaXMgcHJvY2VzcydzIG93blxuICAgICAgICAgICAgICAgICAgLy8gc2VuZHMgaXMgdXNlZCB0byBza2lwLiBEaWVzIHdpdGggdGhpcyBkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHB1Ymxpc2hlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBNYWluIHJlcGxheSBsb29wXG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5LWJ1ZGdldCBjaGVjazogYmFpbCBvdXQgKHJldHJ5IG9yIGZhaWwpIGlmXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGVwIHRpbWUgd2l0aGluIHRoaXMgaW52b2NhdGlvbiBoYXMgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgYnVkZ2V0LiBTdGVwIGJvZGllcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSByZXBsYXlCdWRnZXQucGF1c2UoKS9yZXN1bWUoKSBicmFja2V0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBleGVjdXRlU3RlcGAgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxheUJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TXM6IHJlcGxheUJ1ZGdldC5jb25maWd1cmVkTGltaXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RTbmFwc2hvdDogc2xvdFNuYXBzaG90KCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB0aGUgdGVybWluYWwgYXR0ZW1wdCByZXR1cm5zLCBhZnRlciBydW5fZmFpbGVkIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZS4gRWFybGllciBhdHRlbXB0cyByZWplY3QgZm9yIHF1ZXVlIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGltZW91dCBiZWZvcmUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSA+PVxuICAgICAgICAgICAgICAgICAgICAgIG5vSW5saW5lUmVwbGF5QWZ0ZXJNc1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnVjIgdGltZW91dCByZWFjaGVkLCByZS1zY2hlZHVsaW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlTdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBwYXNzIHdhcyBzZXJ2ZWQgYnkgYSByZXRhaW5lZCBWTSBzZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYXQgdGhlIHJlc3VtZS9yZXBsYXkgZGVjaXNpb24gYmVsb3csIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAvLyBgcmV0YWluZWRTZXNzaW9uYCBpcyByZWFzc2lnbmVkIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZWRCeVJldGFpbmVkU2Vzc2lvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIC0tLSBRdWlja0pTIFZNIGVuZ2luZSBkaXNwYXRjaCAtLS1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgUXVpY2tKUyBlbmdpbmUgKG9wdC1pbiB2aWEgV09SS0ZMT1dfVk09cXVpY2tqc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dWbSkgaXMgYSBzZWxmLWNvbnRhaW5lZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFsdGVybmF0aXZlIHRvIHRoZSBub2RlOnZtIGlubGluZS1yZXBsYXkgbG9naWNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdy4gSXQgcGVyZm9ybXMgdGhlIHNhbWUgZnVsbCBldmVudCByZXBsYXksIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIHdvcmtmbG93IGNvZGUgaW4gYSBRdWlja0pTIFdBU00gVk0sIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIHZpYSB0aGUgc2FtZSBjb21iaW5lZCByb3V0ZSAoc28gdGhleSBoaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlU3RlcCBiZWxvdyBvbiByZS1lbnRyeSksIGFuZCBtYW5hZ2VzIGl0cyBvd25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fY29tcGxldGVkIC8gcnVuX2ZhaWxlZCBsaWZlY3ljbGUgZm9yIHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3V0Y29tZXMuIFdoZW4gdGhlIFF1aWNrSlMgZW5naW5lIGlzIGluIGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgZGlzcGF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgSU5TSURFIHRoaXMgdHJ5OiBlbmdpbmUgZmFpbHVyZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZSB0aGUgZW50cnlwb2ludCAoTWF4RXZlbnRzRXhjZWVkZWRFcnJvciwgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdBU00gT09NIGF0IHRoZSBtZW1vcnkgY2VpbGluZywgYSBidW5kbGUtZXZhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUpIG11c3QgcmVhY2ggdGhpcyBsb29wJ3MgY2F0Y2ggc28gdGhleSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzc2lmaWVkIGFuZCByZWNvcmRlZCBhcyBydW5fZmFpbGVkOiBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0aGV5IHdvdWxkIG5hY2sgdGhlIG1lc3NhZ2UgYW5kIGJ1cm4gYWxsIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyaWVzIGJlZm9yZSBkeWluZyBhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELiBUcmFuc2llbnQgd29ybGQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmV0aHJvdyBvdXQgb2YgdGhlIGNhdGNoIGZvciByZWRlbGl2ZXJ5LCBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXMgbm9kZS1lbmdpbmUgcmVwbGF5IGZhaWx1cmVzLlxuICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VRdWlja0pTVm0od29ya2Zsb3dSdW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdVc2luZyBRdWlja0pTIFZNIGVuZ2luZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBlbnRyeXBvaW50IGZldGNoZXMgdGhlIGV2ZW50IGxvZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBldmVudHMgZGlyZWN0bHksIHNvIHdhaXQgZm9yIHRoZSBydW4gdG8gYmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmFibHkgc3RhcnRlZCBmaXJzdDogaXQgZG9lcyBub3QgdGhyZWFkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gcnVuUmVhZHlCYXJyaWVyIHRoZSB3YXkgaGFuZGxlU3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQsIGV2ZW50TG9nLmN1cnNvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGltcG9ydDogdGhlIFF1aWNrSlMgZW50cnlwb2ludCdzIGltcG9ydCBjaGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZWRzIHRoZSBiYXNlNjQgV0FTTSBiaW5hcnkgKyBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAofjEuMyBNQiBkZWNvZGVkIGF0IG1vZHVsZSBzY29wZSkuIExvYWRpbmcgaXQgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhhdCBvdXQgb2Ygbm9kZS1lbmdpbmUgZGVwbG95bWVudHMgZW50aXJlbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBvbmx5IHRoZSBvcHQtaW4gcGF0aCBwYXlzLCBvbiBmaXJzdCBkaXNwYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnLi9ydW50aW1lL3F1aWNranMtZW50cnlwb2ludC5qcydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWlja2pzUmVzdWx0ID0gYXdhaXQgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGU6IGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZXJlIHRoYXQgbG9nIHdhcyByZWFkIHRvLCBzbyB0aGUgZW5naW5lIHJlYWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmQgZnJvbSBpdCBhbmQgY2FuIGFzayBmb3IgYW4gaW5saW5lIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFnYWluc3QgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEN1cnNvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAncmVhZHknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRTcGFuOiBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXRzIHRoZSBlbnRyeXBvaW50IHJlY29nbml6ZSBpdHNlbGYgYXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBmb3IgYSBzcGVjaWZpYyB3YWl0LCBzbyBhIGRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgYXJyaXZlcyBiZWZvcmUgaXRzIHdhaXQgZWxhcHNlcyByZS1hcm1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGEgZnJlc2gga2V5IGluc3RlYWQgb2YgbG9zaW5nIHRoZSB0aW1lci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdENvbnRpbnVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLXN0ZXAgb3duZXJzaGlwIHBsdW1iaW5nOiByZWRlbGl2ZXJpZXMgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZXNzYWdlIGRyaXZlIGNyYXNoIHJlY292ZXJ5IGZvciBzdGVwcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYXJsaWVyIGludm9jYXRpb24gY2xhaW1lZCBpbmxpbmUgKHNlZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AgcGFzcyBpbiB0aGUgZW50cnlwb2ludCdzIGxvb3ApLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1lc3NhZ2UgaWQgaXMgc3RhbXBlZCBhcyBgb3duZXJNZXNzYWdlSWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlubGluZSBsYXp5IHN0ZXAgY2xhaW1zIHNvIHdha2UgcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlciB0byB0aGUgaW4tZmxpZ2h0IGJvZHkgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1aWNranNSZXN1bHQ/LnRpbWVvdXRTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGByZWludm9rZWAgcmF0aGVyIHRoYW4gcmV0dXJuaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB7IHRpbWVvdXRTZWNvbmRzIH1gIGRpcmVjdGx5OiB1bmRlciB0dXJibyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjaGVkdWxlIHdvdWxkIHJlLWVuZ2FnZSB0dXJibyBvbiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChyZXBsYXlpbmcgYWdhaW5zdCBhIHN0YWxlIHByZWxvYWRlZCBsb2cgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlZGdpbmcgdGhlIHJ1biwgc2VlIHRoZSByZWludm9rZSgpIGRvY3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdmUpLiByZWludm9rZSBlbnF1ZXVlcyBhbiBleHBsaWNpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gd2l0aG91dCBgcnVuSW5wdXRgIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKHF1aWNranNSZXN1bHQudGltZW91dFNlY29uZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlICE9PSAncmVhZHknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBZnRlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQoZXZlbnRMb2cuZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjb25jdXJyZW50IGNvbXBsZXRpb24gdmlhIHRoZSBldmVudCBsb2c6IGlmXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGhhbmRsZXIgd3JvdGUgYSB0ZXJtaW5hbCBydW4gZXZlbnQsIGV4aXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgcmVwbGF5IHdvcmsuIFRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZXNlIGV2ZW50cywgc28gY2hlY2tpbmcgdGhlIGxvZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdXMgdGhlIHNhbWUgc2lnbmFsIGFzIGEgcnVucy5nZXQoKSByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgZXh0cmEgcmVxdWVzdCBwZXIgbG9vcCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudExvZy5ldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0c1RvQ29tcGxldGUgPSBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk6IGUgaXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ICYgeyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPj0gKGUuZXZlbnREYXRhLnJlc3VtZUF0IGFzIERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGUuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lQXQ6IGUuZXZlbnREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0RXZlbnQgb2Ygd2FpdHNUb0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY3JlYXRlRXZlbnQod2FpdEV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVtcC1hbmQtcmVwb3J0OiBmb2xkIHdoYXQgdGhpcyB3cml0ZSBza2lwcGVkIG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgbG9nLCB3aGljaCBpcyB3aGF0IGBjcmVhdGVFdmVudGAgcmVhZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3Qgc25hcHNob3Qgb2ZmLCBzbyBlYWNoIHJlbWFpbmluZyB3YWl0IGFza3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc2xvdCBhYm92ZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRydW5jYXRlZCBjYXNlIG1hdHRlcnMgdHdpY2Ugb3ZlciBoZXJlLiBCZXlvbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGFjY291bnRpbmcgYGFic29yYlNraXBwZWRTbG90UmVwb3J0YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWplY3RzIGl0IGZvciwgdGhlIG1pc3NpbmctY29tcGxldGlvbiBjaGVjayBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNpZGVzIGZyb20gdGhpcyBsb2cgd2hldGhlciB0aGUgaGFuZGxlciBzdGlsbCBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZmV0Y2gsIHNvIGEgcGFydGlhbCBwYWdlIHdvdWxkIG1ha2UgdGhlIGxvZyBsb29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2UgaXQgaG9sZHMgYSBjb21wbGV0aW9uIHdob3NlIHBhZ2UgaXMgdW5yZWFkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBmZXRjaCBvbiBhIHNuYXBzaG90IHNob3J0IG9mIHRoZSBXb3JsZCdzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChldmVudExvZy5ldmVudHMsIGNyZWF0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2FpdCBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCBpcyBjb21taXR0ZWQsIGFuZCB0aGlzIHJlcGxheSBoYXMgdG8gc2VlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biB3YWl0X2NvbXBsZXRlZCBiZWZvcmUgaXQgY2FuIGFkdmFuY2UgcGFzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzbGVlcC4gRWFjaCB3cml0ZSBhc2tlZCB0aGUgV29ybGQgZm9yIHRoZSBkZWx0YSBzaW5jZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG91ciBjdXJzb3IgYW5kIGZvbGRlZCBpdCBpbiAoc2VlIGNyZWF0ZUV2ZW50KSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgaGFzIGFscmVhZHkgaGFuZGVkIHRob3NlIGV2ZW50cyBiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkby4gT25seSBmZXRjaCBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGlvbnMgc3RpbGwgbWlzc2luZyBsb2NhbGx5OiBhIFdvcmxkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVzIGBzaW5jZUN1cnNvcmAsIGEgdHJ1bmNhdGVkIGRlbHRhLCBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhYnNvcmIgdGhhdCBsb3N0IHRoZSBjdXJzb3IgcmFjZSwgb3IgYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aG9zZSByZWplY3Rpb24gY2FycmllcyBubyBkZWx0YS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW5nV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRFdmVudC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmdXYWl0Q29tcGxldGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBvbmx5IGV2ZW50cyBhZnRlciB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBjb25jdXJyZW50IGR1cmFibGUgZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZWlyIG9yZGVyaW5nIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGEgZnVsbCByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSB1cyBhIHN0YWJsZSBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGluY2x1ZGUgdGhlIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLmN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nV2FpdENvbXBsZXRpb25zLmV2ZXJ5KCh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhd0FsbFdhaXRDb21wbGV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYXMgaGFwcGVuZWQsIHNvIGEgcG9zaXRpb24gbm90aGluZyBvY2N1cGllcyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gZXZlbnQgdGhhdCBuZXZlciBvY2N1cnJlZCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2F5LiBGYWlsaW5nIGhlcmUgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHJ1biB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0cyBpdHMgb3duIGNvcnJ1cHRpb24gYW5kIG9uZSB0aGF0IHNpbGVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgd3JvbmcgYW5zd2VyLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBob2xlIHRoYXQgaXMgbWVyZWx5IGEgd3JpdGUgbWlkLWNvbW1pdCBmaWxscyBpbiBvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24sIHNvIHNldHRsZUV2ZW50U2xvdEdhcCByZS1yZWFkcyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jbHVkaW5nLCBhbmQgYWRvcHRzIHdoaWNoZXZlciBsb2cgaXQgc2V0dGxlZCBvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTbG90R2FwQ2hlY2tFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBzZXR0bGVFdmVudFNsb3RHYXAocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRMb2cuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2V0dGxlZC5sb2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRsZWQuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGxvZyBmb3IgcnVuICR7cnVuSWR9IGhhcyBhIGhvbGUgYXQgc2xvdCAke3NldHRsZWQuZ2FwLmZpcnN0TWlzc2luZ1Nsb3R9OiAke3NldHRsZWQuZ2FwLm1pc3NpbmdDb3VudH0gb2YgdGhlICR7c2V0dGxlZC5nYXAubWF4U2xvdH0gc2xvdHMgdXAgdG8gdGhlIGxvZydzIG1heGltdW0gaG9sZCBubyBldmVudC5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGluZyBlbGFwc2VkIHdhaXRzIHJlZnJlc2hlcyB0aGUgZXZlbnQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgbWF5IGhhdmUgd3JpdHRlbiB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYWZ0ZXIgdGhlIGluaXRpYWwgc25hcHNob3QgYnV0IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBPbmNlIHRoZSBldmVudCBsb2cgcmVjb3JkcyB0aGF0IG91dGNvbWUsIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBpcyBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRMb2cuZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVudC1saW1pdCBndWFyZDogZmFpbCBhIHJ1bmF3YXkgcnVuIG9uY2UgaXRzIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZXMgdGhlIHNlcnZlci1zdXBwbGllZCBjZWlsaW5nICh1bmRlZmluZWQg4oeSIG5vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5mb3JjZW1lbnQpLiBUaGUgdGhyb3cgaXMgY2F1Z2h0IGJlbG93IGFuZCB3cml0dGVuIGFzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX2ZhaWxlZCAvIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VhbGVkLWxvZyBub29wcyBhcmUgZXhjbHVkZWQ6IHRoZSBjZWlsaW5nIGV4aXN0cyB0b1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgYSBydW5hd2F5IFdPUktGTE9XLCBhbmQgYSBub29wIGlzIHdyaXR0ZW4gYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCB0byBzZWFsIGEgcG9zaXRpb24gd2hvc2Ugd3JpdGVyIGRpZWQuIENvdW50aW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSB3b3VsZCBzcGVuZCB0aGUgdXNlcidzIGV2ZW50IGJ1ZGdldCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZW5kJ3MgYm9va2tlZXBpbmcsIGFuZCB3b3VsZCBtYWtlIHRoZSBsaW1pdCBhIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhpdHMgZGVwZW5kIG9uIGhvdyBtdWNoIHdyaXRlIGNvbnRlbnRpb24gaXQgaGFwcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0byBzZWUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1heEV2ZW50c0xpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93RXZlbnRDb3VudCA9IGV2ZW50TG9nLmV2ZW50cy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuLCBlKSA9PiAoaXNTZWFsZWROb29wRXZlbnQoZSkgPyBuIDogbiArIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93RXZlbnRDb3VudCA+PSBtYXhFdmVudHNMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0V2ZW50Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeToganVkZ2UgVFRGUyBlbGlnaWJpbGl0eSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBmaXJzdCBzbmFwc2hvdC4gV2FpdHMgY29tcGxldGVkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYWxyZWFkeSBkaXNxdWFsaWZ5IHZpYSB0aGUgZXZlbnQtdHlwZSBjaGVjaywgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW5nIGFmdGVyIHRoZSB3YWl0IHBhc3MgaXMgZXF1aXZhbGVudC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyX3NldCBpcyBwZXJtaXR0ZWQ6IGEgcmVkZWxpdmVyeSBjYW4gbGFuZCBhZnRlciBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkIHByZS1zdGVwIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN1YnRyYWN0ZWQgdmlhIHByZVN0ZXBBdHRyU3RhcnRNcyByZWdhcmRsZXNzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW52b2NhdGlvbiB3cm90ZSBpdCAoc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub29wIGlzIHBlcm1pdHRlZCBmb3IgdGhlIHNhbWUgcmVhc29uIGF0dHJfc2V0IGlzOiBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBldmlkZW5jZSB0aGUgcnVuIGhhZCBhbHJlYWR5IG1hZGUgcHJvZ3Jlc3MuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFsIHNheXMgYSBjb25jdXJyZW50IHdyaXRlciBkaWVkLCB3aGljaCBzYXlzIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhYm91dCB0aGlzIGludm9jYXRpb24sIGFuZCBleGNsdWRpbmcgaXQgd291bGQgc2lsZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGV2ZXJ5IGNvbnRlbmRlZCBydW4gb3V0IG9mIHRoZSBUVEZTIGRhdGFzZXQgLS1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHRoZSBydW5zIHdvcnRoIG1lYXN1cmluZy5cbiAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID8/PSBldmVudExvZy5ldmVudHMuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWFsZWROb29wRXZlbnQoZSlcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRMb2cuZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIFQzLiBgPz89YCBzbyBpdCBtYXJrcyB0aGUgRklSU1QgcmVwbGF5IHBhc3Mgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludm9jYXRpb246IGEgcmVzdW1lIHRoYXQgbmVlZHMgbW9yZSB0aGFuIG9uZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgdG8gcmVhY2ggaXRzIHN0ZXAgKGUuZy4gYSBwcmUtc3RlcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVzYCBkZXRvdXIpIHJlcG9ydHMgdGhlIGV4dHJhIHBhc3Nlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSBgcmVwbGF5YCwga2VlcGluZyB0aGUgcGhhc2VzIGFkZGl0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bWVUcmFja2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcucmVwbGF5U3RhcnRlZEF0TXMgPz89IHJlcGxheVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBldmVyeSBtaXNzaW5nIGRlY3J5cHQvZGVjb21wcmVzcyBvcGVyYXRpb24gdXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9udCAoYWxyZWFkeS1wcmVwYXJlZCBwYXlsb2FkcyBhcmUgc2tpcHBlZCkuIFdlYlxuICAgICAgICAgICAgICAgICAgICAgIC8vIENyeXB0byB3b3JrIG92ZXJsYXBzIFZNIHNldHVwIG9uIHRoZSByZXBsYXkgcGF0aCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXBwZW5kZWQgZXZlbnRzJyBjb25zdW1wdGlvbiBvbiB0aGUgcmVzdW1lIHBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZXJzIHN0aWxsIGRlc2VyaWFsaXplIGFuZCByZXNvbHZlIGluIGV2ZW50IG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheVBheWxvYWRDYWNoZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFJlcGxheVBheWxvYWRDYWNoZSh3b3JrZmxvd1J1bik7XG4gICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ05vZGUgd29ya2Zsb3cgcmVwbGF5IHJlcXVpcmVzIHBheWxvYWQgcHJlcGFyYXRpb24nXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkUHJld2FybSA9IHJlcGxheVBheWxvYWRDYWNoZS5wcmV3YXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1Jlc3VsdDogV29ya2Zsb3dSZXN1bWVSZXN1bHQgPSByZXRhaW5lZFNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgcmVzdW1lV29ya2Zsb3cocmV0YWluZWRTZXNzaW9uLCBldmVudExvZy5ldmVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJldGFpbmVkIHJlc3VtZSBjYW4gc3RpbGwgcmVwb3J0IGJhY2sgYHsgdHlwZTpcbiAgICAgICAgICAgICAgICAgICAgICAvLyAncmVwbGF5JyB9YCAoaW50ZXJuYWwgY2FjaGUgbWlzcyksIGluIHdoaWNoIGNhc2UgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgZmFsbHMgdGhyb3VnaCB0byBhIGZ1bGwgcmVwbGF5IGJlbG93IGFuZCBpcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhIHJldGFpbmVkIHBhc3MuIFRoZSBgd29ya2Zsb3cucnVuYCBzcGFuIGNhbm5vdCBzYXlcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzOiBpdCBpcyB0YWdnZWQgYHJldGFpbmVkYCB3aGVuIGl0IG9wZW5zLCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdW1lIHJlc3VsdCBpcyBrbm93bi5cbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZWRCeVJldGFpbmVkU2Vzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UmVzdWx0LnR5cGUgIT09ICdyZXBsYXknO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UmVzdWx0LnR5cGUgPT09ICdyZXBsYXknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSBzdGFydFdvcmtmbG93Q29tcGlsZSh3b3JrZmxvd1J1bik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnTm9kZSB3b3JrZmxvdyByZXBsYXkgcmVxdWlyZXMgY29tcGlsZWQgc2NyaXB0cydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1Jlc3VsdCA9IGF3YWl0IHJlcGxheVdvcmtmbG93KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXk6IGF3YWl0IGVuY3J5cHRpb25LZXkudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHM6IGF3YWl0IGNvbXBpbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogdGhlIGVuZC1vZi1ydW4gZHJhaW4gaW5zaWRlIHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiBjb21taXRzIGZpcmUtYW5kLWZvcmdldCBgKl9jcmVhdGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgYmVmb3JlIHRoZSB0ZXJtaW5hbCBgYXdhaXRSdW5SZWFkeSgpYCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENhcGFiaWxpdGllczogd29ybGQuY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBheWxvYWRQcmV3YXJtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UmVzdWx0LnR5cGUgPT09ICdzdXNwZW5kZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJrIHRoZSBsaXZlIHNlc3Npb247IHRoZSBzdXNwZW5zaW9uIGNhdGNoIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyB0aGUgb25lIHJldGVudGlvbiBkZWNpc2lvbjoga2VlcCBpdCBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGl0ZXJhdGlvbiBvciBkaXNjYXJkIGl0IGZvciBhIGZyZXNoIHJlcGxheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IHdvcmtmbG93UmVzdWx0LnNlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB3b3JrZmxvd1Jlc3VsdC5zdXNwZW5zaW9uO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHdvcmtmbG93UmVzdWx0Lm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBleGVjdXRpb24gY29tcGxldGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZmxvdyBjb21wbGV0ZWQuIERvIE5PVCByZWxvYWQtYW5kLXJldHJ5IHRoZSBjcmVhdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBwbGFjZTogYHJlc3VsdGAgd2FzIGNvbXB1dGVkIGJ5IHRoaXMgcmVwbGF5LCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgKDQxMikgcmVqZWN0aW9uIG11c3QgZm9yY2UgYSAqZnJlc2ggcmVwbGF5KiAod2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXkgb2JzZXJ2ZSB0aGUgbmV3IGV2ZW50IGFuZCBwcm9kdWNlIGEgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0KSwgbm90IHJlLWNvbW1pdCB0aGUgc3RhbGUgcmVzdWx0LiBUaGUgY2F0Y2ggYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0cyB0aGUgcmVwbGF5IGluLXByb2Nlc3MuXG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBhIHdvcmtmbG93IHRoYXQgZmluaXNoZXMgd2l0aCBubyBzdGVwcyByZWFjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGJlZm9yZSB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkOyBvcmRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIGFmdGVyIGl0IHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7IG91dHB1dDogcmVzdWx0IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIHdvcmtmbG93LWV4ZWN1dGlvbiBkdXJhdGlvbiBmb3IgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBvbmx5OiBhbmNob3JzIHRoZSBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsZW1ldHJ5IGZpZWxkIGJlbG93IChzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXMpLiBUaGlzIGlzIHRoZSBGSU5BTFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHBhc3MsIHRoZSBvbmUgdGhhdCByZWFjaGVkIGFuZCBzY2hlZHVsZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBzdGVwOiB2YWxpZCByc2ZzIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcCAoZS5nLiBhIHdvcmtmbG93LWJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVzKClgIGRldG91ciByZXBsYXlzIHR3aWNlKSwgYW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5LiBUaGlzIHZhbHVlIGlzIE5PVCBhY2N1bXVsYXRlZCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRob3NlIGVhcmxpZXIgcGFzc2VzLCBzbyBpdCBtdXN0IG5vdCBiZSByZWFkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCI6IHJzZnMgY292ZXJzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvbGUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCB3aW5kb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgY292ZXJzIG9ubHkgdGhpcyBsYXN0IHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlZCBoZXJlLCBiZWZvcmUgYGhhbmRsZVN1c3BlbnNpb25gJ3MgYXdhaXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSS9PLCBzbyBpdCBleGNsdWRlcyB0aGF0IEkvTy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGR1cGxpY2F0ZXMgd2hhdCBPVEVMIGFscmVhZHkgY2FwdHVyZXMgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4vaW52b2NhdGlvbiBzcGFuLCBidXQgaXMgY29sbGVjdGVkIGFzIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsZW1ldHJ5IHNvIHRoZSBzZXJ2ZXIgY2FuIGVtaXQgaXQgYXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVOU0FNUExFRCwgZnVsbC1wb3B1bGF0aW9uIG1ldHJpYzogd29ya2Zsb3ctc2VydmVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBzcGFucyBhcmUgaGVhdmlseSBzYW1wbGVkIGluIHByb2R1Y3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh+NyUpLCBhbmQgY2xpZW50IHNwYW5zIGNhbid0IGJlIGZpbHRlcmVkIGJ5IFNES1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiwgc28gbmVpdGhlciBjYW4gc2VydmUgYXMgdGhlIGRhc2hib2FyZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdCBUVEZTIGRlY29tcG9zaXRpb24uIE9uIGEgcmV0YWluZWQtVk1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB0aGlzIG1lYXN1cmVzIHRoZSByZXN1bWUgKHR5cGljYWxseSB+MG1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIHJlcGxheSwgc28gdGhlIGZpZWxkJ3MgZGlzdHJpYnV0aW9uIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW1vZGFsIG9uY2UgcmV0ZW50aW9uIGlzIGFjdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbmRlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5RHVyYXRpb25NcyA9IHN1c3BlbmRlZEF0TXMgLSByZXBsYXlTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRUUiBUNDogdGhlIG5leHQgZHVyYWJsZSBzdGVwIGhhcyBiZWVuIGVuY291bnRlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2F0ZWQgb24gdGhlIHN1c3BlbnNpb24gYWN0dWFsbHkgc2NoZWR1bGluZyBzdGVwczpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3VzcGVuc2lvbiB0aGF0IG9ubHkgY3JlYXRlcyBob29rcy93YWl0cyBoYXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGVkIGEgc3RlcCwgYW5kIGEgbGF0ZXIgcGFzcyBtYXkuIFRha2VuIGZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIGluc3RhbnQgYXMgYHJlcGxheUR1cmF0aW9uTXNgIHNvIFQ0IGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcHJlY2VkZSBUMy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bWVUcmFja2luZyAmJiBlcnIuc3RlcENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZy5uZXh0U3RlcEVuY291bnRlcmVkQXRNcyA/Pz1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWRBdE1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgc3VzcGVuZGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IHJlcGxheUR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBlcnIuc3RlcENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rczogZXJyLmhvb2tDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHM6IGVyci53YWl0Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25NZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRXb3JrZmxvd1N1c3BlbnNpb25NZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhzdXNwZW5zaW9uTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFYyOiBoYW5kbGUgc3VzcGVuc2lvbiB3aXRob3V0IHF1ZXVpbmcgc3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFYWNoIGV2ZW50IGNyZWF0aW9uIGluc2lkZSBoYW5kbGVTdXNwZW5zaW9uIGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVjb25kaXRpb24gc25hcHNob3Qgb2YgdGhlIGxvYWRlZCBldmVudCBsb2csIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgaG9sZGluZyBhbiBldmVudCB0aGlzIHJlcGxheSBuZXZlciBzYXcgcmVqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdyaXRlICg0MTIpIGluc3RlYWQgb2YgYWNjZXB0aW5nIGEgZGl2ZXJnZW50IG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWplY3Rpb24gaXMgaGFuZGxlZCBoZXJlLCBieSByZXN0YXJ0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LCBuZXZlciBieSByZS1wb3N0aW5nIHRoZSBzYW1lIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHN1c3BlbmRlZCBiZWZvcmUgaXRzIGV2ZW50IGxvZyB3YXMgbG9hZGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXNwZW5zaW9uUmVzdWx0OiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBoYW5kbGVTdXNwZW5zaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogbGV0cyBlbGlnaWJsZSBuZXdseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQgc3RlcHMgcHVibGlzaCB0aGVpciBzdGVwLWV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgKGNhcnJ5aW5nIGBzdGVwSW5wdXRgKSBpbiBwYXJhbGxlbCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZS4gU3RlcHMgcXVldWVkIHRoZXJlIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGJhY2sgaW4gYHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkc2AgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHBlZCBieSB0aGUgZGlzcGF0Y2ggcGFzcyBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGlzcGF0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTmFtZTogZ2V0V29ya2Zsb3dRdWV1ZU5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhY2VDYXJyaWVyOiBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIHByZS1jbGFpbXM6IGxldHMgdGhlIGJhdGNoZWQgZmFuLW91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGQgdGhlIGxhenktaW5saW5lIHN0ZXBzJyBzdGVwX2NyZWF0ZWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBwYWlycyAoc3RhbXBlZCB3aXRoIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duZXJzaGlwKSBpbnRvIHRoZSBvbmUgY29tbWl0LCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBib2RpZXMgYmVsb3cgc3RhcnQgc3RyYWlnaHQgb2ZmIGl0LiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5pbmxpbmVDbGFpbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIGZvbGQgcmV0dXJuIG9uY2UgdGhlIHBhaXIgY2h1bmsgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkOiB0cmFpbGluZyBjaHVua3MgYW5kIHRoZSBwZXItY2h1bmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzIHJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgZGVmZXJyZWRCYXRjaFdvcmtgLCB3aGljaCB0aGlzIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqb2lucyBiZWZvcmUgaXQgY2FuIGFjayAoYmVsb3csIG5leHQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggam9pbiksIHNvIHRoZSBkdXJhYmlsaXR5IGNvbnRyYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdW5jaGFuZ2VkIHdoaWxlIHRoZSBib2RpZXMgc3RhcnQgZWFybGllci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlZmVycmVkQmF0Y2hXb3JrOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN1c3BlbnNpb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN1c3BlbnNpb24gY3JlYXRlIHdhcyByZWplY3RlZCBhcyBzdGFsZTogcmUtZGVyaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXkgZnJvbSBhIGNvcnJlY3RlZCBsb2cgaW4gdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmNlIHRoZSBpbi1wcm9jZXNzIGJ1ZGdldCBpcyBzcGVudCwgZmFsbCBiYWNrIHRvIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGltbWVkaWF0ZSByZS1pbnZvY2F0aW9uIChhIHJldGhyb3cgcmVsaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlZGVsaXZlcnkgb2YgYSBtZXNzYWdlIHRoZSB0dXJibyBwYXRoIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNrZWQsIHNvIHRoZSBydW4gd291bGQgc3RhbGwgZm9yIHRoZSBxdWV1ZSdzIH4zMDBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdmlzaWJpbGl0eSB0aW1lb3V0KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VzcGVuc2lvbi1jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1c3BlbnNpb24tY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0aW9uLnJlaW52b2tlZCkgcmV0dXJuIGVzY2FsYXRpb24ucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gYnVkZ2V0IHNwZW50OiBmYWlsIHRoZSBydW4gcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kIGl0IGJhY2sgdG8gdGhlIHF1ZXVlIHRvIHNwaW4gYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXNjYWxhdGlvbi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZhdGFsRXJyb3IuaXMoc3VzcGVuc2lvbkVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudCBmYWlsdXJlcyBwcm9wYWdhdGUgdG8gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBzbyB0aGUgbWVzc2FnZSBpcyByZWRlbGl2ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdXNwZW5zaW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uLXJldHJ5YWJsZSBmYWlsdXJlIHdoaWxlIGNvbW1pdHRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24ncyBldmVudHMsIGUuZy4gYW4gYXR0cmlidXRlIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXb3JsZCByZWplY3RlZCBhcyBpbnZhbGlkICh0aGUgY3VtdWxhdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGNhcCBjYW4gb25seSBiZSBjaGVja2VkIFdvcmxkLXNpZGUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRlbGl2ZXJ5IHdvdWxkIHJlcGxheSB0aGUgd29ya2Zsb3cgaW50byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSB3cml0ZSBhbmQgdGhlIHNhbWUgcmVqZWN0aW9uLCBzbyBmYWlsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gd2l0aCB0aGUgZXJyb3IgaW5zdGVhZCBvZiB3ZWRnaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGluIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGNsYXNzaWZ5UnVuRXJyb3Ioc3VzcGVuc2lvbkVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm9uLXJldHJ5YWJsZSBlcnJvciB3aGlsZSBjb21taXR0aW5nIHdvcmtmbG93IHN1c3BlbnNpb247IGZhaWxpbmcgcnVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogc3VzcGVuc2lvbkVycm9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN1c3BlbnNpb25FcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogb3JkZXIgdGhlIHRlcm1pbmFsIHdyaXRlIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW5jcnlwdGlvbktleS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JUeXBlKHN1c3BlbnNpb25FcnJvci5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gaG9va3Mvd2FpdHMgaW4gdGhlIGxvZyB0aGlzIHJlcGxheSByYW4gb3ZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsdXMgd2hhdGV2ZXIgdGhlIHN1c3BlbnNpb24ncyBvd24gd3JpdGVzIGZvbGRlZCBiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIGl0IOKAlCBzbyBhIGBob29rX2NyZWF0ZWRgIHRoaXMgc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkIGFuZCBnb3QgYSBkZWx0YSBmb3IgSVMgaW4gdGhlIHNjYW4sIHdoaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgaXQgd3JvdGUgd2l0aG91dCBhIGRlbHRhIGlzIG5vdC4gTmVpdGhlciByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIGFuIG91dGNvbWUgYmVsb3c6IGV2ZXJ5IGdhdGUgdGhhdCBjb25zdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYG9wZW5Ib29rYCBhbHNvIHRyZWF0cyBcInRoaXMgc3VzcGVuc2lvbiBjcmVhdGVkIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvb2tcIiBhcyBlcXVpdmFsZW50LiBDb21wdXRlZCBsYXppbHksIGF0IG1vc3Qgb25jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzaGFyZWQgYmV0d2VlbiB0aGUgaG9vay13cml0ZSBjb250aW51YXRpb24gYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsdGEvdHVyYm8gZ2F0ZXMgYmVsb3cg4oCUIHRoZSBhdHRyLWRldG91ciBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvb2stY29uZmxpY3QgcGF0aHMgcmV0dXJuL2NvbnRpbnVlIGJlZm9yZSB0aGUgZ2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB1c3VhbGx5IGF2b2lkIHRoZSBzY2FuIGVudGlyZWx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3Blbkhvb2tXYWl0ID0gb25jZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50TG9nLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ZW50aW9uRGVjaXNpb24gPSByZXRhaW5lZFNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRSZXRlbnRpb25EZWNpc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN1c3BlbnNpb24gY29tbWl0dGVkIHRoZSBldmVudCBhIGhvb2snc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duIGF3YWl0ZXIgaXMgcGFya2VkIG9uOyB0aGUgY29udGludWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyBkcml2ZXMgdGhlIG5leHQgaXRlcmF0aW9uIGluLXByb2Nlc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rQ29udGludWF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ZW50aW9uRGVjaXNpb24/LnJldGFpbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zICs9IHN1c3BlbnNpb25SZXN1bHQuaG9va0NyZWF0aW9uTXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID0gcHJlU3RlcEJsb2NraW5nTXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdXNwZW5zaW9uIGhhbmRsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uTXM6IERhdGUubm93KCkgLSBzdXNwZW5zaW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwczogc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kczogc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dD8uc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F0dHJpYnV0ZUV2ZW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJldGVudGlvbkRlY2lzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Vm1SZXRlbnRpb246IHJldGVudGlvbkRlY2lzaW9uLnJldGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JldGFpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3JlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXRlbnRpb25EZWNpc2lvbj8ucmV0YWluID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1ZtUmV0ZW50aW9uUmVhc29uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGVudGlvbkRlY2lzaW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN1c3BlbnNpb25SZXN1bHQuc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlcmlhbGl6YXRpb25CbG9ja2VyTG9nTWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuc2VyaWFsaXphdGlvbkJsb2NrZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEFkdmFuY2UgdGhlIHdvcmtmbG93IEhFUkUgb3ZlciB0aGUgZXZlbnQgYSBob29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBjcmVhdGUganVzdCBjb21taXR0ZWQsIGluc3RlYWQgb2YgaGFuZGluZyB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBiYWNrIHRvIHRoZSBxdWV1ZSBmb3IgYSBkZWxpdmVyeSB3aG9zZSBvbmx5IGpvYlxuICAgICAgICAgICAgICAgICAgICAgICAgICogd291bGQgYmUgdG8gcmVhZCB0aGF0IGV2ZW50IGFuZCByZXBsYXkgdG8gdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBwYXJrZWQgVk0gaXMgb25lIGBhd2FpdGAgYXdheSBmcm9tIGNvbnN1bWluZyBpdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvIHJlc3VtaW5nIGl0IG92ZXIgdGhlIGNhcnJpZWQtZm9yd2FyZCBsb2cgY29zdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIG5laXRoZXIgdGhlIHF1ZXVlIGhvcCBub3IgdGhlIGNvbGQgcmVwbGF5LiBTdGVwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICogc3RheSBxdWV1ZWQgZWl0aGVyIHdheTogdGhpcyBpbnZvY2F0aW9uIHJ1bnMgbm9uZSBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlbSwgc28gdGhlIGNvbnRpbnVhdGlvbiBpcyBub3Qgc2VyaWFsaXplZCBiZWhpbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICogc3RlcCBib2R5IOKAlCB0aGUgcHJvcGVydHkgYW4gYXdhaXRlciBlbXB0eWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICogYGxhenlJbmxpbmVTdGVwc2AgZXhpc3RzIHRvIHByb3RlY3QsIGFuZCB3aGljaCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbmZsaWN0IHBhdGggZ2V0cyBieSByZXR1cm5pbmcgYmVmb3JlIGFueSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4ZWN1dGlvbiBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlIHN1c3BlbnNpb24ncyB3cml0ZXMgY2FycmllZCB0aGUgbG9nIGZvcndhcmQgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgdGhlIGhvb2sgY3JlYXRlJ3MgZGVsdGEgYWNjb3VudGVkIGZvciBhbGwgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZW07IG90aGVyd2lzZSByZWFkIGZyb20gdGhlIGN1cnNvciBmaXJzdCwgd2hpY2ggaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0aWxsIG9uZSBsaXN0IGFnYWluc3QgdGhlIGRlbGl2ZXJ5IHJvdW5kLXRyaXAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBmdWxsIHJlcGxheSBpdCByZXBsYWNlcy4gQW4gb3BlbiB3YWl0IGFsc28gZm9yY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcmVhZCwgZm9yIHRoZSByZWFzb24gdGhlIGlubGluZS1kZWx0YSBnYXRlIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBnaXZlczogYSBgd2FpdF9jb21wbGV0ZWRgIGlzIGEgcmVzb2x1dGlvbiB0aGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyB3YWl0aW5nIG9uIHJhdGhlciB0aGFuIGFuIGV2ZW50IGl0IGNhbiBvYnNlcnZlIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBpdGVyYXRpb24gbGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBGYWxzZSB3aGVuIHRoaXMgaW52b2NhdGlvbiBjYW5ub3QgZ2V0IGFueXdoZXJlIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdheSDigJQgbm8gc2Vzc2lvbiB0byByZXN1bWUgKHJldGVudGlvbiBvZmYsIG9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvdW5kYXJ5IHRoZSBwcmVkaWNhdGUgcmVmdXNlZCksIG9yIGV2ZXJ5IGhvb2sgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICogYWxyZWFkeSBoYWQgaXRzIGNvbnRpbnVhdGlvbiBhbmQgc3RpbGwgd2FudHMgb25lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBhc3MgcmFuIG92ZXIgYSBsb2cgdGhhdCBkaWQgbm90IGhvbGQgdGhlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgcmVwZWF0aW5nIGl0IHdvdWxkIHNwaW4uIFRoZSBjYWxsZXIgcmUtaW52b2tlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGludWVPdmVySG9va1dyaXRlID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSWRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGxlczogJ2hvb2tfY29uZmxpY3QnIHwgJ2hvb2tfY3JlYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldGFpbmVkU2Vzc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmVzaCA9IGhvb2tJZHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZCkgPT4gIWNvbnRpbnVlZEhvb2tJZHMuaGFzKGlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJlc2gubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZWRIb29rSWRzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdW1lV2l0aG91dFJlYWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuZXZlbnRMb2dDYXJyaWVkRm9yd2FyZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXQudmFsdWUub3BlbldhaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdW1lV2l0aG91dFJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXJyb3dpbmcgZG9lcyBub3Qgc3Vydml2ZSBpbnRvIHRoaXMgY2xvc3VyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IHRoYXQgcmFpc2VkIHRoaXMgc3VzcGVuc2lvbiByYW4gb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVhZHkgbG9nLCBzYW1lIGFzIGBvcGVuSG9va1dhaXRgIGFzc2VydHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGludWluZyBvdmVyIGEgaG9vayB3cml0ZSBpbi1wcm9jZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0bGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va0lkczogZnJlc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJyaWVkRm9yd2FyZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5ldmVudExvZ0NhcnJpZWRGb3J3YXJkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJlZm9yZVJlc3VtZTogIXJlc3VtZVdpdGhvdXRSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93Lmhvb2tfd3JpdGVfY29udGludWF0aW9ucyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZWRIb29rSWRzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2sgY29uZmxpY3Q6IHRoZSB0b2tlbiB3YXMgYWxyZWFkeSBjbGFpbWVkLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBydW4ncyBob29rIHdhcyBuZXZlciBjcmVhdGVkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBob29rX2NvbmZsaWN0YCB0aGlzIHN1c3BlbnNpb24gY29tbWl0dGVkIGlzIHdoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRsZXMgaXRzIGF3YWl0ZXJzIOKAlCByZWplY3RpbmcgYSBwYXlsb2FkIGF3YWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2aW5nIGEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgd2l0aCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0aW5nIHJ1bi4gVGhlIHdvcmtmbG93IG11c3Qgb2JzZXJ2ZSB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGlzIHN1c3BlbnNpb24gc2NoZWR1bGVkIHJ1bnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyB3aHkgdGhpcyBicmFuY2ggY29tZXMgYWhlYWQgb2YgdGhlIGF0dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldG91ciBhbmQgYWxsIHN0ZXAgZGlzcGF0Y2g6IGEgYFByb21pc2UucmFjZWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gdGhlIGhvb2sgYW5kIGEgc3RlcCBtdXN0IGxldCB0aGUgZHVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgd2luIHdpdGhvdXQgZXhlY3V0aW5nIHRoZSBsb3Npbmcgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGluIHRoaXMgcHJvY2VzcyB3aGVuIHRoZSBib3VuZGFyeSBhbGxvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0OyBvdGhlcndpc2UgaGFuZCB0aGUgcnVuIGJhY2sgZm9yIGEgZnJlc2ggcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBjb25mbGljdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVPdmVySG9va1dyaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5ob29rQ29uZmxpY3RDb3JyZWxhdGlvbklkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX2NvbmZsaWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyBhcmUgcmVzb2x2ZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGV4ZWN1dGlvbiBwYXNzOiBpdCByZWxvYWRzIHRoZSBsb2cgKG5vdyBob2xkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUganVzdC1jb21taXR0ZWQgYXR0cl9zZXQpLCB0aGVuIGVpdGhlciByZXN1bWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0YWluZWQgVk0gb3IgcGVyZm9ybXMgYSBjb2xkIHJlcGxheSB0byByZXNvbHZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0QXR0cmlidXRlcyBwcm9taXNlLiBTa2lwIHN0ZXAgcHJvY2Vzc2luZyBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyBzbyB0aGF0IHRoZSBkdXJhYmxlIGV2ZW50IGRlY2lkZXMgcmFjZXMgZmlyc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBQcm9taXNlLnJhY2UoW3NldEF0dHJpYnV0ZXMoKSwgc3RlcCgpXSksIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlIG11c3QgYmUgYWJsZSB0byB3aW4gd2l0aG91dCBleGVjdXRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3Npbmcgc3RlcC4gVGhlIG5leHQgcGFzcyBoYXBwZW5zIGluLXByb2Nlc3MgcmF0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIHZpYSBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB1bmxpa2UgaG9va3MgYW5kIHdhaXRzLCBhbiBhdHRyX3NldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm9kdWNlcyBubyBvdXQtb2YtYmFuZCBpbnZvY2F0aW9uIHNvdXJjZSB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciB3b3VsZCBuZWVkIHRvIHlpZWxkIHRoZSBtZXNzYWdlIGZvciwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBheWluZyBhIGRlbGl2ZXJ5IHJvdW5kLXRyaXAgaGVyZSB3b3VsZCBvbmx5IGFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBiZWZvcmUgdGhlIHdvcmtmbG93J3MgbmV4dCBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwcyB3aG9zZSBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZSB3ZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZWQgYnkgdGhlIHN1c3BlbnNpb24gaGFuZGxlciBhcyBzdGVwX2NyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICsgc3RlcF9mYWlsZWQgKHNlZSBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcCkuIE5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwLWV4ZWN1dGlvbiBtZXNzYWdlIGlzIGRpc3BhdGNoZWQgZm9yIHRoZW0sIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHN1Y2ggYSBzdGVwIGlzIHRoZSBvbmx5IHBlbmRpbmcgd29yayBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBldmVyIHJlLWludm9rZSB0aGUgcnVuLCBzbyByZXBsYXkgaW4tcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUgcmVsb2FkZWQgbG9nIGluc3RlYWQuIFRoZSByZXBsYXkgcmVqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAncyBwcm9taXNlIHdpdGggdGhlIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGEgdHJ5L2NhdGNoIGFyb3VuZCB0aGUgc3RlcCBjYWxsIG9ic2VydmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5jYXVnaHQsIGl0IHByb3BhZ2F0ZXMgb3V0IG9mIHRoZSB3b3JrZmxvdyBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZmFpbHMgdGhlIHJ1biBhcyBhIFVTRVJfRVJST1IuIEhlYWx0aHkgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgYXJlIG5vdCBkaXNwYXRjaGVkIHRoaXMgcGFzczogdGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtc3VzcGVuZHMgb3ZlciB0aGVpciBhbHJlYWR5LWNvbW1pdHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50cyBhbmQgdGhlIG5leHQgcGFzcyBkaXNwYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGFzIHVzdWFsLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcy5zaXplID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpvaW4gdGhlIGJhdGNoZWQgZmFuLW91dCdzIHRyYWlsaW5nIGNodW5rIGNvbW1pdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMgYmVmb3JlIGNvbnRpbnVpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0bHkgbGlrZSB0aGUgdHdvIGpvaW5zIG9uIHRoZSBkaXNwYXRjaCBwYXRoc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdzogdGhpcyBpbnZvY2F0aW9uIG11c3Qgbm90IHByb2NlZWQgKGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHVhbGx5IGFjaykgYmVmb3JlIGV2ZXJ5IGNyZWF0ZSBhbmQgcHVibGlzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBsYXVuY2hlZCBpcyBkdXJhYmxlLiBBIHJlamVjdGlvbiBwcm9wYWdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2UgdGhlaXJzOiB0cmFuc2llbnQgd29ybGQgZXJyb3JzIHJldGhyb3cgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGZvciByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzdXNwZW5zaW9uUmVzdWx0LmRlZmVycmVkQmF0Y2hXb3JrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgc3RlcHMgd2hvc2UgcGFpci1mb2xkZWQgc3RlcF9zdGFydGVkIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyBhbHJlYWR5IGNvbW1pdHRlZCAoYGlubGluZUNsYWltc2ApIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpYmVyYXRlbHkgTk9UIGV4ZWN1dGVkIG9uIHRoaXMgcGFzczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCByZXBsYXkgYmVsb3cgcmUtc3VzcGVuZHMgb3ZlciB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIHN0ZXBzLCBhbmQgb3duZWQgcmVjb3ZlcnkgKHRoZSBjbGFpbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycnkgdGhpcyBtZXNzYWdlJ3Mgb3duZXJNZXNzYWdlSWQpIHJlLWV4ZWN1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gdGhlcmUuIEl0cyBcInByZXZpb3VzIGRlbGl2ZXJ5IGNyYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlkLWJvZHlcIiBsb2cgaXMgYSBtaXNub21lciBvbiB0aGlzIHBhdGg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgY3Jhc2hlZCwgdGhlIGJvZGllcyB3ZXJlIG5ldmVyIHN0YXJ0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmYWlsZWQgZGVoeWRyYXRpb24gbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3ctb3duZWQgY29kZSAoZ2V0dGVycy9wcm94aWVzKSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dpbmc7IGRlbW90ZSB0byBhIGNvbGQgcmVwbGF5IHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBhIFZNIHRoYXQgbWF5IGhhdmUgZGl2ZXJnZWQuIFRoaXMgaXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXJlIHRlcm1pbmFsLWVycm9yIHBhdGgsIHNvIHRoZSByZXBsYXkgY29zdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcnJlbGV2YW50IG5leHQgdG8gdGhlIGRpdmVyZ2VuY2Ugcmlzay5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBuZXh0RXZlbnRMb2dMb2FkKGV2ZW50TG9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwcyA9IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgZXhlY3V0aW9uIGlzIGdhdGVkIG9uIG93bmVyc2hpcC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIHRvIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyAoYGxhenlJbmxpbmVTdGVwc2ApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcnVuIHRoZW0gaW5saW5lIChpbiBwYXJhbGxlbCkgdmlhIGxhenlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyB0aGF0IGNyZWF0ZSBlYWNoIHN0ZXAgb24gdGhlIGZseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmluZyBvbmUgd29ybGQgcm91bmQtdHJpcCBwZXIgaW5saW5lIHN0ZXAuIE93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgYXRvbWljIGFuZCBleGFjdGx5LW9uZSBwZXIgc3RlcDogdGhlIHdvcmxkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSBpbnNpZGUgZWFjaCBzdGVwX3N0YXJ0ZWQgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVudGl0eUNvbmZsaWN0RXJyb3JgICjihpIgZXhlY3V0ZVN0ZXAgYHNraXBwZWRgKSB0byBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgbG9zZXIsIHNvIG9ubHkgb25lIGhhbmRsZXIgZXZlciBydW5zIGEgZ2l2ZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZHkuIEV2ZXJ5IG90aGVyIHBlbmRpbmcgc3RlcCBrZWVwcyBpdHMgZWFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCAoaW4gYGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHNgKSBhbmQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIG9ubHkgZGVzaWduYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGxhenlJbmxpbmVTdGVwc2Agd2hlbiBubyBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBwcmVzZW50LiBUaGF0IGF3YWl0ZXIgY2FzZSBtdXN0IGV4ZWN1dGUgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lOiBhbiBpbmxpbmUgYGF3YWl0IGV4ZWN1dGVTdGVwKC4uLilgIGJsb2NrcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLCBzbyB0aGUgYXdhaXRlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gKHdoaWNoIG9ubHkgYWR2YW5jZXMgb24gdGhlIG5leHQgcGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHNlcmlhbGl6ZWQgYmVoaW5kIHRoZSBzdGVwIOKAlCBkZWZlYXRpbmcgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtmbG93IGV4cHJlc3NlZCBhcyBwYXJhbGxlbCAoZS5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGhvb2suZ2V0Q29uZmxpY3QoKS50aGVuKCgpID0+IHN0ZXBCKCkpYCByYWNpbmcgYGF3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwQSgpYCkuIEluIHRoYXQgY2FzZSBgbGF6eUlubGluZVN0ZXBzYCBpcyBlbXB0eSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHN0ZXAgaXMgcXVldWVkLCBzbyB0aGUgY29udGludWF0aW9uIGJlbG93IOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggcmVzdW1lcyB0aGUgcGFya2VkIFZNIG92ZXIgdGhlIGp1c3QtY29tbWl0dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBob29rX2NyZWF0ZWQg4oCUIHJhY2VzIHRob3NlIHF1ZXVlZCBzdGVwcyByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdGluZyBvbiBhbnkgb2YgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhenlJbmxpbmVTdGVwcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQubGF6eUlubGluZVN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiBzLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmaWVkIHF1ZXVlIGRpc3BhdGNoIGZvciBldmVyeXRoaW5nIHdlIGFyZSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZS1leGVjdXRpbmcuIFN0ZXBzIGFyZSBxdWV1ZWQgd2l0aCBzdGVwSWQgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlciBydW5zIHRoZW07IHRoZSB3YWl0IHRpbWVyIGlzIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBnZW5lcmljIGNvbnRpbnVhdGlvbiB0aGF0IGZpcmVzIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBlbGFwc2VzIGFuZCBsZXRzIHRoZSBuZXh0IHJlcGxheSBvYnNlcnZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IHZpYSB0aGUgXCJjb21wbGV0ZSBlbGFwc2VkIHdhaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBkaXNwYXRjaCBkZWNpc2lvbiB0YWJsZSAocGVyIHBlbmRpbmcgc3RlcCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2lnbmF0ZWQgbGF6eS1pbmxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyID09PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGV4ZWN1dGUgaW4gVEhJUyBpbnZvY2F0aW9uIChvd25lZCByZWNvdmVyeTogYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlIHJlLWV4ZWN1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIHN0ZXAgaXQgY3Jhc2hlZCBvbiwgdmlhIGEgcGF5bG9hZC1sZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9zdGFydGVkIHJlLXN0YW1wZWQgd2l0aCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvd25lck1lc3NhZ2VJZCwgbm90IGEgYmFyZSBzdGFydCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gSW5saW5lLW93bmVkLCBvd25lciAhPT0gdGhpcyBtZXNzYWdlICDihpJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBlbnN1cmUgYSBERUxBWUVEIGJhY2tzdG9wIHdha2UgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGRlbGF5U2Vjb25kcyA9IG93bmVyc2hpcCBsZWFzZSByZW1haW5pbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW5zdGVhZCBvZiBlbnF1ZXVlaW5nIHRoZSBzdGVwLiBUaGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW52b2NhdGlvbiBpcyAobGlrZWx5KSBzdGlsbCBydW5uaW5nIHRoZSBib2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFuIGltbWVkaWF0ZSBzdGVwIG1lc3NhZ2Ugd291bGQgYmFyZS1zdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBydW5uaW5nIHN0ZXAgYW5kIGV4ZWN1dGUgaXQgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICh3b3JrZmxvdyMyNzgwKS4gVGhlIGJhY2tzdG9wIGlzIGEgcGxhaW4gcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29udGludWF0aW9uLCBOT1QgYSBzdGVwIG1lc3NhZ2U6IHdoZW4gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBmaXJlcywgdGhpcyBzYW1lIGRlY2lzaW9uIHRhYmxlIGhhbmRsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB3aGF0ZXZlciBzdGF0ZSB0aGUgc3RlcCBpcyBpbiBieSB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHRlcm1pbmFsIOKGkiBub3RoaW5nIHBlbmRpbmc7IHF1ZXVlLW93bmVkIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9yZXRyeWluZyDihpIgbm9ybWFsIGtleWVkIGRpc3BhdGNoOyBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRlYWQgd2l0aCBsZWFzZSBleHBpcmVkIOKGkiBpbW1lZGlhdGUgZGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcHJlc2VydmluZyBzdGVwLWxldmVsIGZhaWx1cmUgc2VtYW50aWNzIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBvaXNvbiBzdGVwczsgbGVhc2UgcmVmcmVzaGVkIGJ5IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVjb3Zlcnkg4oaSIHJlLWFybSkuIFRoZSBiYWNrc3RvcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWRlbXBvdGVuY3lLZXkgaXMgc2NvcGVkIHRvIHRoZSBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBFUE9DSCAobGF0ZXN0IHN0ZXBfc3RhcnRlZCB0aW1lc3RhbXApLCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBqdXN0IHRoZSBjb3JyZWxhdGlvbiBJRCwgYW5kIG11c3QgbmV2ZXIgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBtZXNzYWdlJ3Mgb3duIGtleS4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSBmb3IgYm90aCBpbnZhcmlhbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGZpeGVkIGtleXMgZWl0aGVyIGFic29yYiB0aGUgcmV0cnkgaGFuZG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9yIGRlZHVwZSB0aGUgcmVmcmVzaGVkLWxlYXNlIHJlLWFybSBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIGluLWZsaWdodCBiYWNrc3RvcCBpdHNlbGYpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIE5vdCBvd25lZCAobmV2ZXIgc3RhbXBlZCAvIGVhZ2VyIC8gb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGFwc2VkIGF0IHN0ZXBfcmV0cnlpbmcgLyBsZWFzZSBleHBpcmVkIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBraWxsLXN3aXRjaGVkKSDihpIgaW1tZWRpYXRlIGVucXVldWUsIGV4YWN0bHkgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZWZvcmUuIFRoaXMgY292ZXJzIGNyYXNoIHJlY292ZXJ5OiBpZiBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlciB3cm90ZSBzdGVwX2NyZWF0ZWQgYnV0IGNyYXNoZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcXVldWVpbmcsIGEgbGF0ZXIgaGFuZGxlciBxdWV1ZXMgaXQ7IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5S2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWR1bmRhbnQgcXVldWVzIGFjcm9zcyBjb25jdXJyZW50IGhhbmRsZXJzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3YWl0IGNvbnRpbnVhdGlvbiBpcyB3aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgYmVoYXZlIGNvcnJlY3RseSB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBleGVjdXRpb246IGV2ZW4gaWYgdGhlIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBibG9ja3MgdGhpcyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgdGltZXIgZmlyZXMgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbi4gSWYgdGhlIHNsZWVwIHdpbnMsIHRoYXQgcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gY29tcGxldGVzIHRoZSBydW47IGlmIHRoZSBzdGVwIHdpbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCBjb250aW51YXRpb24gZmlyZXMgbGF0ZXIgYW5kIG5vLW9wcyBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlcm1pbmFsIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29udGludWF0aW9uJ3MgZGVsYXkgaXMgY2xhbXBlZCB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heGltdW0gcXVldWUgZGVsYXkgKGxvbmcgd2FpdHMgY2hhaW4gYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBob3BzKSBhbmQgaXRzIGlkZW1wb3RlbmN5IGtleSBkZWR1cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vYnNlcnZhdGlvbnMgb2YgdGhlIHNhbWUgcGVuZGluZyB3YWl0IGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBwYXNzZXMuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5L2tleSBzZWxlY3Rpb24gcmF0aW9uYWxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVPd25lcnNoaXAgPSBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoTm93TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWRSZWNvdmVyeVN0ZXBzOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbVtdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFja3N0b3BXYWtlc0FybWVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltbWVkaWF0ZSByZS1lbnF1ZXVlcyBzdXBwcmVzc2VkIGJlY2F1c2UgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgc3RlcCdzIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGFuIGVhcmxpZXIgcGFzcy4gU2VlIHB1Ymxpc2hlZFN0ZXBDb3JyZWxhdGlvbklkcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXB1Ymxpc2hlc1NraXBwZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb3JyZWxhdGlvbklkIG9mIHN1c3BlbnNpb25SZXN1bHQucXVldWVkU3RlcENvcnJlbGF0aW9uSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUVFIgaGFuZC1vZmYuIFRoZSBtZWFzdXJlbWVudCBtYXkgb25seSBnbyB0byBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uIHRoYXQgd2lsbCBhY3R1YWxseSBBVFRFTVBUIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIHN0ZXAsIGFuZCB0aGUgbG9vcCBiZWxvdyBpcyB3aGF0IGRlY2lkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHRob3NlIGFyZSwgc28gdGhlIGRlY2lzaW9uIGlzIG1hZGUgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGNsYXNzaWZpY2F0aW9uLCBuZXZlciBhaGVhZCBvZiBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGludm9jYXRpb24ga2VlcHMgdGhlIHRyYWNraW5nIHdoZW5ldmVyIGl0IHdpbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBzb21ldGhpbmcgaXRzZWxmOiBhIGRlZmVycmVkIGxhenktaW5saW5lIHN0ZXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBhbiBvd25lZC1yZWNvdmVyeSBzdGVwIChhIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25pbmcgbWVzc2FnZSByZS1leGVjdXRpbmcgdGhlIHN0ZXAgaXQgY3Jhc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24pLiBCb3RoIGxhbmQgaW4gYGlubGluZUV4ZWN1dGlvbnNgIGJlbG93IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZSBpdCB0aGVyZS4gT25seSB3aGVuIG5laXRoZXIgZXhpc3RzIGlzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kZWQgdG8gdGhlIEZJUlNUIHN0ZXAgdGhpcyBpbnZvY2F0aW9uIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnF1ZXVlcyBhcyBhIHN0ZXAgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0ZXAgY29udmVydGVkIGludG8gYSBkZWxheWVkIGJhY2tzdG9wIHdha2UgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVCBhbiBhdHRlbXB0ICh0aGUgd2FrZSBpcyBhIHBsYWluIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uLCBhbmQgd2hpY2hldmVyIGludm9jYXRpb24gZXZlbnR1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgc3RlcCBpcyBhIGRpZmZlcmVudCBkZWxpdmVyeSksIHNvIGl0IG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0YWtlIHRoZSBzYW1wbGUuIElmIGV2ZXJ5IHBlbmRpbmcgc3RlcCBiZWNvbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGJhY2tzdG9wLCBub3RoaW5nIGhlcmUgYXR0ZW1wdHMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1wdGlvbiBnb2VzIHVucmVwb3J0ZWQsIHdoaWNoIGlzIHRoZSBob25lc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWUgcmF0aGVyIHRoYW4gYSB0b3RhbCBhdHRyaWJ1dGVkIHRvIHdvcmsgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgbmV2ZXIgZGlkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhdGVkIG9uIHRoZXJlIGJlaW5nIGEgbWVhc3VyZW1lbnQgdG8gcGxhY2UgYXQgYWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYCYmYCBzaG9ydC1jaXJjdWl0cywgc28gYSBkZWxpdmVyeSBjYXJyeWluZyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tpbmcgKGV2ZXJ5IG5vbi1yZXN1bWUgZGVsaXZlcnksIGFuZCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHBhc3QgdGhlIHN0ZXAgdGhhdCBjb25zdW1lZCBpdCkgbmV2ZXIgcGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBwZW5kaW5nLXN0ZXAgc2Nhbi4gVGhhdCBtYXR0ZXJzIG9uIHdpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbi1vdXRzLCB3aGVyZSBgcGVuZGluZ1N0ZXBzYCBydW5zIHRvIGh1bmRyZWRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhbmRPZmZSZXN1bWVUaW1pbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXBlbmRpbmdTdGVwcy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGVwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVPd25lcnNoaXAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5vd25lck1lc3NhZ2VJZCA9PT0gbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgcHVibGlzaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNpbGllbnQgZGlzcGF0Y2ggVEhJUyBwYXNzIChjcmVhdGUgKyBxdWV1ZSBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCwgbWVzc2FnZSBjYXJyeWluZyBgc3RlcElucHV0YCkuIEFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcHVibGlzaCBoZXJlIHdvdWxkIGRlZHVwZSBvbiB0aGUgaWRlbXBvdGVuY3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5IGFueXdheSwgYnV0IHNraXAgdGhlIHdhc3RlZCByb3VuZC10cmlwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lcnNoaXAgbmV2ZXIgYXBwbGllcyB0byB0aGVzZTogdGhleSB3ZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQgdGhpcyBwYXNzLCBzbyBubyBzdGVwX3N0YXJ0ZWQgc3RhbXAgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0IHlldC4gKEVhcmxpZXIgcGFzc2VzJyBwdWJsaXNoZXMgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdmVyZWQgYnkgcHVibGlzaGVkU3RlcENvcnJlbGF0aW9uSWRzIGJlbG93LilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQucXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVPd25lcnNoaXAgJiYgaXNTdGVwT3duZXJzaGlwQWN0aXZlKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwQWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5vd25lck1lc3NhZ2VJZCA9PT0gbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVkIHJlY292ZXJ5OiB0aGlzIGRlbGl2ZXJ5IElTIHRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlOyByZS1leGVjdXRlIHRoZSBzdGVwIGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGluc3RlYWQgb2YgcXVldWVpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLnB1c2goc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXllZCBiYWNrc3RvcCB3YWtlIHdoaWxlIGFub3RoZXIgaW52b2NhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCBsZWFzZSBpcyBsaXZlOyBpbW1lZGlhdGUgc3RlcCBlbnF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSAobGVhc2UgZXhwaXJlZCDih5IgcmVtYWluaW5nIDAg4oeSIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kYXksIHdoaWNoIGlzIGFsc28gdGhlIGRlZ3JhZGVkIG1vZGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkcyB3aXRoIHVuc3RhYmxlIG1lc3NhZ2UgSURzLCB3aGVyZSB0aGUgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYWJvdmUgbmV2ZXIgbWF0Y2hlcyB0aGVyZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tzdG9wRGVsYXlTZWNvbmRzID0gb3duZXJzaGlwQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKHN0ZXAsIGRpc3BhdGNoTm93TXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3N0b3BEZWxheVNlY29uZHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQZW5kaW5nIHN0ZXAgaXMgaW5saW5lLW93bmVkIGJ5IGEgbGl2ZSBpbnZvY2F0aW9uOyBlbnN1cmluZyBkZWxheWVkIGJhY2tzdG9wIHdha2UgaW5zdGVhZCBvZiBpbW1lZGlhdGUgcmVxdWV1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IHN0ZXAub3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wRGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogYmFja3N0b3BJZGVtcG90ZW5jeUtleShzdGVwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBwdWJsaXNoZWQgYnkgVEhJUyBpbnZvY2F0aW9uIG9uIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhcmxpZXIgcGFzcyAoc2VlIHB1Ymxpc2hlZFN0ZXBDb3JyZWxhdGlvbklkcyk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGlzIGluIHRoZSBxdWV1ZSBhbmQgdGhlIHNlbmQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gam9pbmVkIGJlbG93LCBzbyBhIHJlcGVhdCBidXlzIG5vdGhpbmcuIEFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfcmV0cnlpbmdgIG9ic2VydmVkIHNpbmNlIGlzIGEgbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlICh0aGUgcmV0cnkgaGFuZG9mZiksIHNvIGl0IGlzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3ZlcmVkIGJ5IHRoZSBlYXJsaWVyIHB1Ymxpc2ggYW5kIHJlLWVucXVldWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGJlZm9yZS4gQ2hlY2tlZCBiZWZvcmUgdGhlIFRUUiBoYW5kLW9mZiBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQgc3RlcCBuZXZlciBjb25zdW1lcyB0aGUgbWVhc3VyZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZWRTdGVwQ29ycmVsYXRpb25JZHMuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc2F3UmV0cnlpbmcgIT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwdWJsaXNoZXNTa2lwcGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0ZXAgSVMgYmVpbmcgYXR0ZW1wdGVkLCBieSB0aGUgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHBpY2tzIHRoZSBtZXNzYWdlIHVwLiBDb25zdW1lIHRoZSB0cmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlLCBmb3IgdGhlIGZpcnN0IHN1Y2ggc3RlcCBhbmQgbm8gb3RoZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBSZXN1bWVUaW1pbmcgPSBoYW5kT2ZmUmVzdW1lVGltaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXN1bWVUaW1pbmdGb3JNZXNzYWdlKHJlc3VtZVRyYWNraW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VtZVRpbWluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRPZmZSZXN1bWVUaW1pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltbXV0YWJsZSBydW4gaWRlbnRpdHkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgc3RlcCB3aXRob3V0IGEgYmxvY2tpbmcgcnVucy5nZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4oCUIHNlZSBSdW5EaXNwYXRjaENvbnRleHRTY2hlbWEuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNvbnRleHQ6IHJ1bkRpc3BhdGNoQ29udGV4dCh3b3JrZmxvd1J1biksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdGVwUmVzdW1lVGltaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IGhvb2tSZXN1bWVUaW1pbmc6IHN0ZXBSZXN1bWVUaW1pbmcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcC1pZGVudGl0eS1zY29wZWQ6IGRlZHVwZXMgYWdhaW5zdCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBkaXNwYXRjaCBvZiBUSElTIHN0ZXAgKGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlcnMsIGNyYXNoLXJlY292ZXJ5IHJlLWRpc3BhdGNoLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyJ3MgcmVzaWxpZW50IHB1Ymxpc2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgYWJzb3JiaW5nIGEgZGlzcGF0Y2ggb2YgYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCB1bmRlciBhIHJlYXNzaWduZWQgY29ycmVsYXRpb24gaWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnN0ZXBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25lIGhpZ2hlciB0aGFuIHRoZSBpbmNvbWluZyBjb250aW51YXRpb24ncyB3aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW52b2NhdGlvbiBJUyB0aGUgY29udGludWF0aW9uIGZvciB0aGlzIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBhbmQgdGhlIHdhaXQgaXMgc3RpbGwgcGVuZGluZzogdGhhdCBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVudCB0aGUga2V5LCBzbyByZS1hcm1pbmcgdW5kZXIgaXQgd291bGQgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCBieSB0aGUgd29ybGQncyBkZWR1cGUgd2luZG93IGFuZCB0aGUgd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBsb3NlIGl0cyBvbmx5IHRpbWVyLiBFdmVyeSBvdGhlciBjYXNlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgMCBhbmQga2V5cyBhcyBiZWZvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRBdHRlbXB0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Q29udGludWF0aW9uPy5jb3JyZWxhdGlvbklkID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB3YWl0Q29udGludWF0aW9uLmF0dGVtcHQgKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRDb250aW51YXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IHdhaXRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBdHRlbXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRpc3BhdGNoIHB1Ymxpc2hlcyBhbmQgdGhlIGlubGluZSBib2RpZXMgYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBDT05DVVJSRU5UTFk6IHRoZSBzdXNwZW5zaW9uIGNvbW1pdCBhbHJlYWR5IG1hZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGRpc3BhdGNoZWQgc3RlcCBkdXJhYmxlIChhbmQsIHdoZW4gdGhlIGZvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZ2FnZWQsIHNldHRsZWQgdGhlIGlubGluZSBwYWlycycgY2xhaW1zKSwgd2hpY2ggaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvbmx5IG9yZGVyaW5nIGJvdGggc2lkZXMgbmVlZCwgc28gbmVpdGhlciB3YWl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvdGhlci4gVGhlIGpvaW5zIGJlbG93IChiZWZvcmUgc3RlcCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcmVhZCwgYW5kIG9uIHRoZSBuby1pbmxpbmUgZWFybHkgcmV0dXJucykga2VlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZhaWx1cmUgY29udHJhY3Q6IGEgZGlzcGF0Y2ggcmVqZWN0aW9uIHN0aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlscyB0aGlzIGRlbGl2ZXJ5LCBhZnRlciBpbi1mbGlnaHQgYm9kaWVzIHNldHRsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXNTZXR0bGVkID0gUHJvbWlzZS5hbGwoZGlzcGF0Y2hlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJlamVjdGlvbiBtdXN0IG5vdCBzdXJmYWNlIGFzIGFuIHVuaGFuZGxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVqZWN0aW9uIHdoaWxlIHRoZSBib2RpZXMgcnVuIChvciBpZiBzZXR1cCBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGFuZCB0aGUgam9pbiB0aHJvd3MgZmlyc3QpOyBhd2FpdGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHByb21pc2UgYmVsb3cgc3RpbGwgb2JzZXJ2ZXMgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzU2V0dGxlZC5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXQgb2Ygc3RlcHMgVEhJUyBpbnZvY2F0aW9uIGV4ZWN1dGVzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVycmVkIGxhenktaW5saW5lIGJhdGNoIHBsdXMgYW55IG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyAodGhpcyBtZXNzYWdlJ3MgcmVkZWxpdmVyeSByZS1leGVjdXRpbmcgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBpdCBjcmFzaGVkIG9uOiBubyBsYXp5U3RlcElucHV0OyB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh5ZHJhdGVzIGZyb20gdGhlIHN0ZXAgZW50aXR5IGxpa2UgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGgsIGFuZCB0aGUgcGF5bG9hZC1sZXNzIHN0ZXBfc3RhcnRlZCByZS1zdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcC4gVW5saWtlIHRoZSBiYWNrZ3JvdW5kIHBhdGgncyBzdGFydCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgTk9UIGJhcmU6IGl0IGNhcnJpZXMgdGhpcyBtZXNzYWdlJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyTWVzc2FnZUlkLCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSByZXRyeSBjZWlsaW5nIGNvdW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVFeGVjdXRpb25zOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dD86ICh0eXBlb2YgbGF6eUlubGluZVN0ZXBzKVtudW1iZXJdWydkZWh5ZHJhdGVkSW5wdXQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2xhaW1lZFN0YXJ0PzogUHJlY2xhaW1lZElubGluZVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfT4gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmUtY2xhaW1lZCBieSB0aGUgc3VzcGVuc2lvbiBiYXRjaDogdGhlIHBhaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHNldHRsZWQgdGhpcyBzdGVwJ3MgY3JlYXRlICsgY2xhaW0sIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4ZWN1dG9yIHJ1bnMgKG9yIHNraXBzKSB0aGUgYm9keSBvZmYgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcmRpY3QgaW5zdGVhZCBvZiBzZW5kaW5nIGEgbGF6eSBzdGFydCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYWltID0gc3VzcGVuc2lvblJlc3VsdC5pbmxpbmVDbGFpbXMuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjbGFpbWVkU3RhcnQ6IGNsYWltLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogcy5kZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vd25lZFJlY292ZXJ5U3RlcHMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCB0ZWxlbWV0cnkgKGRlc2lnbiBkb2MgUGhhc2UgNyk6IHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgc28gcHJvZHVjdGlvbiB0cmFjZXMgc2hvdyB3aGVuIGNyYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeSByYW4gb3IgYSB3YWtlIHdhcyBjb252ZXJ0ZWQgaW50byBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcCwgYW5kIGEgd2FybiAoYWx3YXlzIHByaW50ZWQsIHVubGlrZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcvaW5mbykgZm9yIG93bmVkIHJlY292ZXJ5LCBzaW5jZSBpdCBtZWFucyBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UgZGllZCBtaWQtc3RlcC1ib2R5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHVibGlzaGVzU2tpcHBlZCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ob3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93T3duZWRSZWNvdmVyeVN0ZXBzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJhY2tzdG9wV2FrZXNBcm1lZCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93QmFja3N0b3BXYWtlc0FybWVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVwdWJsaXNoZXNTa2lwcGVkID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dEaXNwYXRjaFJlcHVibGlzaFNraXBwZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwdWJsaXNoZXNTa2lwcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXB1Ymxpc2hlc1NraXBwZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NraXBwZWQgcmUtcHVibGlzaGluZyBzdGVwIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBhbHJlYWR5IHB1Ymxpc2hlZCBvbiBhbiBlYXJsaWVyIHJlcGxheSBwYXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXB1Ymxpc2hlc1NraXBwZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmUtZXhlY3V0aW5nIGlubGluZSBzdGVwcyBvd25lZCBieSB0aGlzIHF1ZXVlIG1lc3NhZ2Ug4oCUIGEgcHJldmlvdXMgZGVsaXZlcnkgY3Jhc2hlZCBtaWQtYm9keSBhbmQgdGhpcyByZWRlbGl2ZXJ5IGlzIHJlY292ZXJpbmcgdGhlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWRzOiBvd25lZFJlY292ZXJ5U3RlcHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocykgPT4gcy5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBleGVjdXRlIGlubGluZTogZXZlcnl0aGluZyBoYXMgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIChvciBubyB3b3JrIG5lZWRzIHNjaGVkdWxpbmcpLiBFeGl0IGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBkcml2ZSBzdWJzZXF1ZW50IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lRXhlY3V0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBydW5zIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBkaXNwYXRjaGVzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcGF0aCwgc28gam9pbiB0aGVtIChhbmQgdGhlIGZvbGQncyBkZWZlcnJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaHVuayBjb21taXRzL3B1Ymxpc2hlcykgaGVyZSBzbyBhIGZhaWx1cmUgZmFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbGl2ZXJ5IGV4YWN0bHkgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXNTZXR0bGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuZGVmZXJyZWRCYXRjaFdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgdGhlIHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbnRpbnVlOiB0aGUgYGhvb2tfY3JlYXRlZGAgdGhpcyBzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgY29tbWl0dGVkIGlzIHdoYXQgcmVzb2x2ZXMgaXQsIGFuZCBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Ugd2lsbCDigJQgbm8gc3RlcCByYW4gaGVyZSwgYW5kIGV2ZXJ5IHN0ZXAgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHNjaGVkdWxlZCB3ZW50IHRvIHRoZSBxdWV1ZSDigJQgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBhIGNvbnRpbnVhdGlvbiB0aGUgcnVuIHdvdWxkIHNpdCBpZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudGlsIHNvbWUgdW5yZWxhdGVkIG1lc3NhZ2Ugd29rZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlT3Zlckhvb2tXcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5hd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9va19jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmQgdGhlIHJ1biBiYWNrIGZvciBhIGZyZXNoIHJlcGxheSBvdmVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBob29rX2NyZWF0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBhcmUgY29uc3VsdGVkIGJ5IGFsbCB0aHJlZSBnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3c7IHJlc29sdmUgdGhlIG1lbW9pemVkIHNjYW4gb25jZSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3Blbkhvb2tXYWl0U3RhdGUgPSBvcGVuSG9va1dhaXQudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBmYXN0IHBhdGggZ2F0ZS4gV2UgcmVxdWVzdCB0aGUgZGVsdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChhbmQgb24gdGhlIG5leHQgaXRlcmF0aW9uIGNvbnN1bWUgaXQgaW4gcGxhY2Ugb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCkgb25seSB3aGVuIEFMTCBob2xkOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdlIGhhdmUgYSByZWFsIHByaW9yIGN1cnNvciB0byBkaWZmIGFnYWluc3QgKGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFdvcmxkIG1heSByZXR1cm4gbm9uZSBvbiB0aGUgaW5pdGlhbCBsb2FkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoaXMgaXMgdGhlIGNsZWFuIHNpbmdsZS1zdGVwIHNlcXVlbnRpYWwgY2FzZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgc3VzcGVuc2lvbiBwcm9kdWNlZCBleGFjdGx5IG9uZSBzdGVwIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2FpdHMgKGBlcnIue3N0ZXAsd2FpdH1Db3VudGApLCB0aGF0IG9uZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgbG9uZSBwZW5kaW5nIHN0ZXAgKGBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCB0aGUgbG9uZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxYDogbm8gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNpYmxpbmdzIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLCBhbmQgbm8gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlubGluZSBzdGVwIHdyaXRpbmcgaXRzIG93biBldmVudHMgb3V0IG9mIGJhbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gcGVuZGluZyB3YWl0IHRpbWVyIGZyb20gVEhJUyBzdXNwZW5zaW9uLCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW4gd2FpdCBpbiB0aGUgY3VtdWxhdGl2ZSBsb2cuIEEgYHdhaXRfY29tcGxldGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgYSByZXNvbHV0aW9uIHRoZSByZXBsYXkgaXMgd2FpdGluZyBvbiByYXRoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoYW4gYW4gZXZlbnQgaXQgY2FuIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc28gY29uc3VtaW5nIGEgZGVsdGEgdGhhdCBwcmVkYXRlcyBpdCB3b3VsZCBzZXR0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBzbGVlcCBmcm9tIGEgdmlldyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb21wbGV0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gQW4gb3BlbiAob3IgdGhpcy1zdXNwZW5zaW9uLWNyZWF0ZWQpIGhvb2sgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZpbmUsIGFuZCB0aGF0IGlzIHRoZSBnYXRlIHRoaXMgdXNlZCB0byBjYXJyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFRoZSBkZWx0YSBzbmFwc2hvdHMgdGhlIGxvZyBhdCB0aGUgc3RlcF9jb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdyaXRlIGJ1dCBpcyBjb25zdW1lZCBvbiB0aGUgbmV4dCByZXBsYXksIHNvIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvdXQtb2YtYmFuZCBgaG9va19yZWNlaXZlZGAgbGFuZGluZyBpbiB0aGF0IHdpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgYWJzZW50IGZyb20gdGhlIGRlbHRhIGFuZCBvYnNlcnZlZCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0ZXJhdGlvbiBsYXRlciB0aGFuIGEgcmVhbCBmZXRjaCB3b3VsZCBvYnNlcnZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdC4gVGhhdCBzdGFsZW5lc3MgaXMgcXVhbGl0YXRpdmVseSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVhZC10by13cml0ZSByYWNlIHRoZSBmZXRjaCBwYXRoIGFscmVhZHkgaGFzIChhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZXZlbnQgY2FuIGxhbmQgcmlnaHQgYWZ0ZXIgYGV2ZW50cy5saXN0YCByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbmQgYmVmb3JlIHRoZSBzdXNwZW5zaW9uJ3Mgd3JpdGVzKSwgYW5kIGl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBib3VuZGVkIGJ5IHRoZSBzYW1lIHRoaW5nOiB3aGF0IGEgc3RhbGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBob2xkcyBpcyBhICpwcmVmaXgqIG9mIHRoZSBsb2csIG5ldmVyIGEgaG9sZSBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXQsIGFuZCByZXBsYXlpbmcgYSBwcmVmaXggdHdpY2UgcmVhY2hlcyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZGVjaXNpb25zLiBJdHMgbmV4dCB3cml0ZSBpcyBhbGxvY2F0ZWQgYWJvdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdoYXRldmVyIGl0IG1pc3NlZCBhbmQgY29tZXMgYmFjayBjYXJyeWluZyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGByZXBvcnRTa2lwcGVkU2xvdHNgIG9uIHRoZSBsb2NhbCB3b3JsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb21taXQtdGltZSBhbGxvY2F0aW9uIG9uIHRoZSBWZXJjZWwgb25lKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXBsYXkgY29ycmVjdHMgaXRzZWxmIG9uIHRoZSB3cml0ZSByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb24gYSByZWFkLiBBIFdvcmxkIE1BWSBpbnN0ZWFkIHJlZnVzZSB0aGUgd3JpdGUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHN0YWxlICg0MTIpLCB3aGljaCB0aGUgcnVudGltZSBoYW5kbGVzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YXk7IG5vdGhpbmcgcmVxdWlyZXMgaXQgdG8uIEhvb2tzIGNyZWF0ZWQgYnkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3VzcGVuc2lvbiBhcmUgaW5zaWRlIHRoZSBkZWx0YSAodGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGBob29rX2NyZWF0ZWRgIGxhbmRzIGJlZm9yZSB0aGUgc3RlcC10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUpLCBzbyBvbmx5IHRoZWlyIGBob29rX3JlY2VpdmVkYCByZXNwb25zZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFyZSBzdWJqZWN0IHRvIHRoZSBzYW1lIHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdpdGggbm8gaG9vayBvciB3YWl0IG9wZW4gYXQgYWxsLCB0aGUgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgd3JpdGVyIGlzIGNhbmNlbGxhdGlvbiwgd2hpY2ggaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdG8gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3Blbkhvb2tBbmRXYWl0U3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHN0ZXAgcnVucyBpbmxpbmUsIGVhY2ggd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duIGV2ZW50cyBhbmQgdGhlIHBlci13cml0ZSBkZWx0YSB3b3VsZCBiZSBwYXJ0aWFsLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhIGlzIG5vdCByZXF1ZXN0ZWQgKHRoZSBnYXRlIGJlbG93IGlzIGZhbHNlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGktc3RlcCkgYW5kIHRoZSBuZXh0IGl0ZXJhdGlvbiBkb2VzIGEgbm9ybWFsIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdElubGluZURlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50TG9nLmN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc2Vuc2l0aXZlIGJhdGNoOiBhIGhvb2sgaXMgb3BlbiBpbiB0aGUgcnVuIChvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYnkgdGhpcyBzdXNwZW5zaW9uLCBzbyBpdHMgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGxhbmQgYW55IG1vbWVudCksIHNvIGFuIG91dC1vZi1iYW5kIGV2ZW50IGNhbiBtYWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWQgZnJvbSBzdGFsZSwgd2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHdoZW4gc2V2ZXJhbCBpbnZvY2F0aW9ucyByYWNlIGZvciBvbmUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbS4gT3B0aW1pc3RpYyBzdGFydCBiZWdpbnMgdGhlIGJvZHkgYmVmb3JlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0gc2V0dGxlcywgc28gdGhlIHdyaXRlciB0aGF0IExPU0VTIHRoZSBjbGFpbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBFbnRpdHlDb25mbGljdEVycm9yYCDihpIgYHNraXBwZWRgKSBoYXMgYWxyZWFkeSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgY29kZSBpdCBkb2VzIG5vdCBvd24uIFN1cHByZXNzIGl0IGZvciB0aGVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2hlcywgc28gdGhlIGJvZHkgcnVucyBvbmx5IGFmdGVyIHRoZSBjbGFpbSBjYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHdvbi4gQ29zdHMgb25lIGNsYWltIHJvdW5kLXRyaXAgcGVyIHN0ZXAgd2hpbGUgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9vayBpcyBvcGVuLCBhbmQgYnV5cyB0aGUgc2FtZSB0aGluZyBvbiBldmVyeSBXb3JsZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3RlcCBib2R5IGV4ZWN1dGVzIG9uY2UgcGVyIGNsYWltLCBub3Qgb25jZSBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhY2VyLiAoQSBXb3JsZCB0aGF0IHJlZnVzZXMgdGhlIGNsYWltIGFzIHN0YWxlICg0MTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRzIHRoZSBzYW1lIHByb3RlY3Rpb24gdGhyb3VnaCB0aGUgc2FtZSBhd2FpdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbmUgb2YgdGhlIHNoaXBwZWQgb25lcyBkb2VzIHRoYXQgZm9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3QtbnVtYmVyZWQgcnVuLilcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2sgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGFydCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gsIGJ1dCBvbmx5IHdoaWxlIHRoZSBydW4gaXMgc3RpbGwgXCJjbGVhblwiIChhIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbikuIFRoZSBtb21lbnQgYSBob29rIG9yIHdhaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIGxhdGVyIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBiZWNvbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlLCBzbyB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgbm8gbG9uZ2VyIGhvbGRzOiB0dXJib1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgYW5kIHRoZSBzdGVwcyB0YWtlIHRoZSBub3JtYWwgKGVudi1nYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0LXRoZW4tcnVuIHBhdGguIFRoZSBob29rLWNvbmZsaWN0IGNhc2UgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgZWFybHkgYWJvdmUsIHRoZSBhdHRyIGNhc2UgY29udGludWVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlc2ggcmVwbGF5IChzbyBhIGJhdGNoLXNjaGVkdWxpbmcgc3VzcGVuc2lvbiBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmllcyBhdHRyIGV2ZW50cyksIGFuZCB0aGUgYXdhaXRlZC1ob29rIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHRpZWQgbGF6eUlubGluZVN0ZXBzOyB0aGUgY2hlY2tzIGJlbG93IGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgc3VzcGVuc2lvblJlc3VsdC4qYCBmbGFncyBvbmx5IHJlZmxlY3Qgd2hhdCBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBjcmVhdGVkLCBzbyB0aGV5IGRvIG5vdCBjYXRjaCBhIGhvb2svd2FpdCBvcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFuIGVhcmxpZXIgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIGRlbGl2ZXJ5IChlLmcuIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vayguLi4pYCB0aGF0IGRvZXNuJ3QgYmxvY2sgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdywgbGV0dGluZyB0aGUgcmVwbGF5IGxvb3AgY29udGludWUgdG8gbGF0ZXIgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9ucykuIE9uY2UgYW55IGhvb2sgb3Igd2FpdCBpcyBvcGVuIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VtdWxhdGl2ZSBsb2csIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBhcmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLCBzbyB0dXJibyBtdXN0IGxhdGNoIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWFuZW50bHksIGNoZWNrZWQgaGVyZSB2aWEgYG9wZW5Ib29rQW5kV2FpdFN0YXRlYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUgY3VtdWxhdGl2ZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogYFdPUktGTE9XX1NFUVVFTlRJQUxfUkVQTEFZUz0xYCAocGVyLXJ1biBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3BpY3MgY29uc3VtZWQgd2l0aCBgbWF4Q29uY3VycmVuY3k6IDFgKSB3b3VsZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbmNpcGxlIHdhaXZlIHRoaXMgbGF0Y2g6IHNlcmlhbGl6ZWQgb3JjaGVzdHJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyByZXN0b3JlIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgZGVsaXZlcnkuIFRoZSB3YWl2ZXIgaXMgaW50ZW50aW9uYWxseSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2VuOiB0aGUgZW52IHZhciBpcyBhIHJ1bnRpbWUtcHJvY2VzcyBzZXR0aW5nIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBwcm92ZSB0aGUgQlVJTFQgZmxvdyB0cmlnZ2VyIGFjdHVhbGx5IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBtYXhDb25jdXJyZW5jeTogMWAgKGl0IG11c3QgYmUgc2V0IGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbywgYW5kIHNvbWUgaW50ZWdyYXRpb25zIHdyaXRlIHRoZWlyIG93biB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcpLCBhbmQgYGNhcGFiaWxpdGllcy5tYXhDb25jdXJyZW5jeWAgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgcXVldWUgc3VwcG9ydCwgbm90IGRlcGxveWVkIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnRpbCB0aGUgYnVpbGQgZW1pdHMgYSB2ZXJpZmlhYmxlIHNpZ25hbCB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwbG95ZWQgdHJpZ2dlciBpcyBzZXJpYWxpemVkLCB0aGUgY29uc2VydmF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRjaCBzdGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2sgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBpbmxpbmUgc3RlcHMgaW4gcGFyYWxsZWwuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZGdldCBpcyBwYXVzZWQgZm9yIHRoZSB3aG9sZSBiYXRjaCAoc3RlcCBkdXJhdGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBtYXhEdXJhdGlvbiwgbm90IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRpbWVvdXQpIHNvIHRoZSBidWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gZG9lc24ndCBjaGFyZ2UgdGhlIHN0ZXAgYm9kaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGRlY2lkZSB3aGV0aGVyIHRoaXMgYmF0Y2gncyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMvU1RTTyBtZWFzdXJlbWVudC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoJ3MgZmlyc3Qgc3RlcCBjYXJyaWVzIHRoZSB0cmFja2luZyBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCBiYXRjaCBlbWl0cyBvbmUgc2FtcGxlIHBlciBzY2hlZHVsaW5nIGdhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvbmUgcGVyIHNpYmxpbmcuIFR1cmJvJ3Mgc3ludGhlc2l6ZWQgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBoYXMgYSBsb2NhbC1jbG9jayBjcmVhdGVkQXQsIHNvIHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBvbmx5IHRoZSBydW4taWQgVUxJRCB0aW1lc3RhbXAgaXMgdHJ1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lUcmFja2luZyA9IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEF0TXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRDcmVhdGVkQXQocnVuSWQpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1cmJvID8gdW5kZWZpbmVkIDogK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmUgbm90IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2FkZWQgZXZlbnQgbG9nIHlldCwgc28gcmVwb3J0IHRoZW0gZXhwbGljaXRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkhhc1dhaXRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uQ3JlYXRlZEhvb2tzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkOiBzZXJ2ZWRCeVJldGFpbmVkU2Vzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUVFI6IGNvbnN1bWVkIGJ5IHRoaXMgYmF0Y2guIEV2ZXJ5IHN0ZXAgaXMgaGFuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgU0FNRSB0cmFja2luZyBvYmplY3QgYW5kIGl0cyBvbmUtc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHJlcG9ydGVkYCBsYXRjaCBwaWNrcyB0aGUgc2luZ2xlIHN0ZXAgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgcmVhY2hlcyB1c2VyIGNvZGUsIHNvIHRoZSBzYW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cnZpdmVzIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgbG9zaW5nIGl0cyBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSB0byBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiB3aGlsZSBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWJsaW5nIHJ1bnMsIHdpdGhvdXQgYSBwYXJhbGxlbCBiYXRjaCByZXBvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgcGVyIHNpYmxpbmcuIENsZWFyZWQgaGVyZSBzbyBhIGxhdGVyIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbidzIHN0ZXBzIChhbmQgYW55IGluLXByb2Nlc3MgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0KSBjYW5ub3QgcmVwb3J0IHRoZSBzYW1lIHJlc3VtcHRpb24gYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaFJlc3VtZVRyYWNraW5nID0gcmVzdW1lVHJhY2tpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdHM6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPltdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcEV4ZWN1dGlvblByb21pc2VzID0gaW5saW5lRXhlY3V0aW9ucy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzLCBzdGVwSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgbnVtYmVyID0gcHJpb3Igc3RlcF9zdGFydGVkIGNvdW50ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhpcyBleGVjdXRpb24ncyBzdGFydCksIGNvdW50aW5nIG9ubHkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duIHN0YXJ0czogdGhlIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgYm91bmRzIGhvdyBtYW55IHRpbWVzIHRoaXMgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmUtcnVucyBhIHN0ZXAgaXQgY3Jhc2hlZC90aW1lZCBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24sIGFuZCBlYWNoIG9mIHRob3NlIChyZSlzdGFydHMgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhLm1lc3NhZ2VJZC4gU3RhcnRzIHdyaXR0ZW4gYnkgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIChzdGFsZS93YWtlIHJlcGxheXMsIGEgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGRpc3BhdGNoZWQgb2ZmIGEgbG9zdCBjcmVhdGUtY2xhaW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IG90aGVyIElEcyAob3Igbm9uZSkgYW5kIG11c3Qgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50LCBvciB0aGUgY2VpbGluZyBmYWxzZWx5IGV4aGF1c3RzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeSBzdGVwIChzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24gKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGVycyB0aGUgYmF0Y2ggb25seSB3aGVuIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgeWV0KSwgc28gaXQgaGFzIHplcm8gcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGFuZCBpcyBhbHdheXMgYXR0ZW1wdCAxLCBzbyBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2NhbiBlbnRpcmVseS4gT25seSBhbiBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1ydW4gY2FuIGhhdmUgcHJpb3Igc3RhcnRzLCBhbmQgdGhhdCBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY29tbW9uLCBzbyByZXNlcnZlIHRoZSBPKG4pIHNjYW4gZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHdhbGtpbmcgdGhlIGdyb3dpbmcgbG9nIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBpbmxpbmUgc3RlcCAod2hpY2ggd291bGQgYmUgTyhuwrIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyBhIGxvbmcgc2VxdWVudGlhbCB3b3JrZmxvdykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wcmVjbGFpbWVkU3RhcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb3duZWRCeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGlubGluZSBzdGFydDogc2VuZCB0aGUgZGVmZXJyZWQgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IG9uIHN0ZXBfc3RhcnRlZCBzbyB0aGUgd29ybGQgY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCBvbiB0aGUgZmx5LiBBYnNlbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHN0ZXBzLCB3aG9zZSBpbnB1dCBoeWRyYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBleGlzdGluZyBzdGVwIGVudGl0eSwgYW5kIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmUtY2xhaW1lZCBzdGVwcywgd2hvc2UgcGFpciBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZWQgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlLWNsYWltZWQgaW5saW5lIHN0YXJ0OiB0aGUgc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBzZXR0bGVkIHRoaXMgc3RlcCdzIGNyZWF0ZSArIGNsYWltO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhlY3V0b3IgcnVucyAob3Igc2tpcHMpIHRoZSBib2R5IG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHZlcmRpY3Qgd2l0aCBubyBzdGFydCB3cml0ZSBvZiBpdHMgb3duLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjbGFpbWVkU3RhcnQ6IHMucHJlY2xhaW1lZFN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgb3duZXJzaGlwOiBzdGFtcCAob3IgcmUtc3RhbXApIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbidzIHF1ZXVlIG1lc3NhZ2UgSUQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCwgc28gd2FrZSByZXBsYXlzIHNlZSB0aGUgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBpbiBmbGlnaHQgaGVyZSBhbmQgc3VwcHJlc3MgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSByZXF1ZXVlICh3b3JrZmxvdyMyNzgwKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGZvcmNlIG9wdGltaXN0aWMgc3RhcnQgYW5kIGhvbGQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhenkgc3RlcF9zdGFydGVkIHVudGlsIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgbGFuZHMgKHRoZSBib2R5IHN0aWxsIHJ1bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkpLiBCb3RoIGFyZSB1bmRlZmluZWQvZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkLWVuZm9yY2VkIGJhdGNoZXMgd2l0aCBhbiBvcGVuIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdGhlIGNsYWltIGJlZm9yZSBydW5uaW5nIHRoZSBib2R5LCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIDQxMi1mZW5jZWQgc3RlcCBuZXZlciBleGVjdXRlcyB1c2VyIGNvZGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBzdXBwcmVzc09wdGltaXN0aWNTdGFydCBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBJbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByZWNsYWltZWRTdGFydCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5VHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgbGF0ZW5jeVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJhdGNoUmVzdW1lVHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgcmVzdW1lVHJhY2tpbmc6IGJhdGNoUmVzdW1lVHJhY2tpbmcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVxdWVzdElubGluZURlbHRhICYmIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yOiBldmVudExvZy5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludmFyaWFudCBib29ra2VlcGluZzogdGhpcyBpbnZvY2F0aW9uIG93bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBib2RpZXMgdW50aWwgdGhleSBzZXR0bGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0T3duZWRTdGVwcy5hZGQocy5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGFuZCBwcmUtY2xhaW1lZCBzdGVwcyBhcmUgYnJhbmQtbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZWlyIGNyZWF0ZS1jbGFpbSBpcyB0aGUgZXhhY3RseS1vbmNlIGdhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBhbiBvd25lZC1yZWNvdmVyeSBzdGVwIGFscmVhZHkgZXhpc3RzIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBkZWxheWVkIGJhY2tzdG9wIG1lc3NhZ2UgbWF5IGZpcmUgbWlkLWJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNhbWUgcHJvY2Vzcywgc28gcm91dGUgdGhvc2UgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1wcm9jZXNzIHNpbmdsZS1mbGlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJlY2xhaW1lZFN0YXJ0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBydW5TdGVwU2luZ2xlRmxpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcnVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVkLmZpbmFsbHkoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0T3duZWRTdGVwcy5kZWxldGUocy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgam9pbnMgYmVsb3cgc2l0IEJFVFdFRU4gdGhlc2UgcHJvbWlzZXMnIGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGBQcm9taXNlLmFsbGAgdGhhdCByZWFkcyB0aGVtLCBzbyBhIGJvZHkgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVqZWN0cyB3aGlsZSBhIHB1Ymxpc2ggb3IgYSB0cmFpbGluZyBjaHVuayBjb21taXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGluIGZsaWdodCB3b3VsZCBoYXZlIG5vIGhhbmRsZXIgYXR0YWNoZWQgYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWNyb3Rhc2sgY2hlY2twb2ludDogYW4gYHVuaGFuZGxlZFJlamVjdGlvbmAsIGZhdGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBOb2RlJ3MgZGVmYXVsdCBgLS11bmhhbmRsZWQtcmVqZWN0aW9ucz10aHJvd2AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIDQxMiBzdGFsZS1jbGFpbSByZWplY3Rpb24gcmFjZXMgZXhhY3RseSB0aGF0IHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBub3c7IGV2ZXJ5IHJlamVjdGlvbiBpcyBzdGlsbCBvYnNlcnZlZCBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0cyBiZWxvdywgd2hpY2ggYXJlIHdoYXQgZGVjaWRlIHRoZSBvdXRjb21lLlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9taXNlIG9mIHN0ZXBFeGVjdXRpb25Qcm9taXNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpvaW4gdGhlIGRpc3BhdGNoIHB1Ymxpc2hlcyBsYXVuY2hlZCBhYm92ZSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvbGQncyBkZWZlcnJlZCBiYXRjaCB3b3JrICh0cmFpbGluZyBjaHVua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXRzICsgcGVyLWNodW5rIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMpOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYm9kaWVzIGFyZSBhbHJlYWR5IHJ1bm5pbmcgaW4gcGFyYWxsZWwgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoLCBhbmQgdGhpcyBpbnZvY2F0aW9uIG11c3Qgbm90IGFjayBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgY3JlYXRlIGFuZCBwdWJsaXNoIGlzIGR1cmFibGUuIEEgZmFpbHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyBpdHMgb2xkIGNvbnRyYWN0IChmYWlsIHRoaXMgZGVsaXZlcnkgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1lc3NhZ2UgcmVkZWxpdmVycyksIGJ1dCB0aGUgaW4tZmxpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZGllcyBtdXN0IHNldHRsZSBmaXJzdDogYW4gb3duZWQgYm9keSBsZWZ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcgcGFzdCB0aGlzIGhhbmRsZXIgd291bGQgcmFjZSBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlc1NldHRsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmRlZmVycmVkQmF0Y2hXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkaXNwYXRjaEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChzdGVwRXhlY3V0aW9uUHJvbWlzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGRpc3BhdGNoRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEV4ZWN1dGlvblByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdGVwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhbGUgKDQxMikgcmVqZWN0aW9uIG9mIGFuIGlubGluZSBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW06IHRoZSBsb2FkZWQgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBpcyBtaXNzaW5nIGFuIGV2ZW50IHRoZSBiYWNrZW5kIGFscmVhZHkgaGFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgY2xhaW0gd2FzIGZlbmNlZCBieSB0aGUgZ3VhcmQgYW5kIG5vIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIHdlcmUgd3JpdHRlbi4gQWJhbmRvbiB0aGUgYmF0Y2ggKGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljIGJvZHkgcmVzdWx0IGlzIGRpc2NhcmRlZCBieSBleGVjdXRlU3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29uY2lsaWF0aW9uKSBhbmQgcmVzdGFydCB0aGUgcmVwbGF5IHNvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVzIHRoZSBtaXNzaW5nIGV2ZW50LiBXYWl0IGZvciB0aGUgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb25zIHRvIHNldHRsZSBmaXJzdCBzbyBubyBvd25lZCBib2R5IGlzIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCB3aGVuIHRoZSByZXN0YXJ0IChvciB0aGUgYWNrIHBhdGgpIHJ1bnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdGVwRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uUHJvbWlzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc2libGluZyB3aG9zZSBjbGFpbSB3YXMgYWNjZXB0ZWQgd3JvdGUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyBvZiBpdHMgb3duLCBwb3NzaWJseSBhZnRlciB0aGUgV29ybGQgYnVpbHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIDQxMidzIGRlbHRhLCBzbyB0aGF0IGRlbHRhIGNhbiBubyBsb25nZXIgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWVkIHRvIGNvbXBsZXRlIHRoZSBsb2csIGFuZCB0aGUgcmVzdGFydCBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byByZWxvYWQgaXQgaW4gZnVsbC4gYHNraXBwZWRgICh0aGUgc3RlcCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RlZCksIGBnb25lYCBhbmQgYHRocm90dGxlZGAgKGNsYWltIHJlamVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb3RlIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ1dyb3RlID0gc2V0dGxlZC5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGNvbWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Y29tZS52YWx1ZS50eXBlID09PSAnY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdyZXRyeScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKCdpbmxpbmUtY2xhaW0nLCBzdGVwRXJyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RGVsdGE6ICFzaWJsaW5nV3JvdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpbmFsbHkgYmVsb3cgcmVzdW1lcyB0aGUgcmVwbGF5IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpbmFsbHkgYmVsb3cgcmVzdW1lcyB0aGUgcmVwbGF5IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGlzIHJldHVybiAob3IgdGhyb3cpIGNvbXBsZXRlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lubGluZS1jbGFpbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXNjYWxhdGlvbi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgdGhlIGJhdGNoIHJlc3VsdHMuIGByZXRyeWAgc3RlcHMgKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGVpciBgc3RlcF9zdGFydGVkYCBzdWNjZWVkZWQpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcXVldWVkIHBlci1zdGVwIGFzIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5OyBgdGhyb3R0bGVkYCBzdGVwcyAocmVqZWN0ZWQgb24gdGhlIGNyZWF0ZS1jbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG5ldmVyIGNyZWF0ZWQpIGluc3RlYWQgZGVmZXIgcmVkZWxpdmVyeSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSBzbyB0aGV5IHJlLXJ1biBpbmxpbmUgd2l0aCBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVwbGF5OyBjb21wbGV0ZWQvZmFpbGVkIHN0ZXBzIGFscmVhZHkgd3JvdGUgdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50cy4gV2Ugb25seSBsb29wIGJhY2sgdG8gcmVwbGF5IHdoZW4gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSwgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtcGVuZGluZyBzdGVwcyB3aWxsIGJlIHJlLXJ1biBieSB0aGVpciBxdWV1ZWQgcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFuZCB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5cyBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1JldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6ICh0eXBlb2YgaW5saW5lRXhlY3V0aW9ucylbbnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbnlQZW5kaW5nT3BzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHRocm90dGxlZCBpbmxpbmUgc3RlcCBkZWxheXMgcmVkZWxpdmVyeSBvZiBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSByYXRoZXIgdGhhbiBiZWluZyByZS1xdWV1ZWQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwLiBDcnVjaWFsbHksIGEgYHRocm90dGxlZGAgcmVzdWx0IG1lYW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGF6eSBgc3RlcF9zdGFydGVkYCB3YXMgcmVqZWN0ZWQgb24gdGhlIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltLCBzbyB0aGUgc3RlcCB3YXMgTkVWRVIgY3JlYXRlZCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgLCBubyBzdGVwIGVudGl0eSkuIFJlLXF1ZXVpbmcgaXQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwIHdvdWxkIHNlbmQgYSBiYXJlIGBzdGVwX3N0YXJ0ZWRgIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQpLCB3aGljaCB0aGUgd29ybGQgcmVqZWN0cyB3aXRoIGBTdGVwIFwiPGlkPlwiIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmRgIGJlY2F1c2UgaXQgY2Fubm90IGxhemlseSBjcmVhdGUgdGhlIHN0ZXAgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGlucHV0OyB0aGF0IGVycm9yIGlzbid0IHRyYW5zbGF0YWJsZSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHJlZGVsaXZlcnMgdW50aWwgTUFYX1FVRVVFX0RFTElWRVJJRVMgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCAoYW5kIHJ1bikgZmFpbC4gRGVmZXJyaW5nIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgaW5zdGVhZCByZS1hdHRlbXB0cyB0aGUgdGhyb3R0bGVkIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBXSVRIIGl0cyBpbnB1dCBvbiByZXBsYXkuIFdlIHRyYWNrIHRoZSBsb25nZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrb2ZmIHNvIGEgYmF0Y2ggd2l0aCBtdWx0aXBsZSB0aHJvdHRsZXMgd2FpdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXguIE5vdGU6IGByZXRyeWAgcmVzdWx0cyBhcmUgc2FmZSB0byByZS1xdWV1ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyBiZWNhdXNlIGEgcmV0cnkgaW1wbGllcyBgc3RlcF9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzdWNjZWVkZWQgYW5kIHRoZSBzdGVwIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aHJvdHRsZVRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5saW5lRXhlY3V0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gc3RlcFJlc3VsdHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpbmxpbmVFeGVjdXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IHIudGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRpbWVvdXRTZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVBlbmRpbmdPcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZlciByZWRlbGl2ZXJ5IG9mIHRoZSBvcmNoZXN0cmF0b3IgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm90dGxlIGJhY2tvZmYuIE9uIHJlcGxheSBldmVyeSBub24tdGVybWluYWwgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZS1kaXNwYXRjaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXI6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC10aHJvdHRsZWQgc3RlcHMgcnVuIGlubGluZSBhZ2FpbiBXSVRIIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0ICh0aGVpciBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCBhbmV3KSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBgcmV0cnlgIHN0ZXBzIGluIHRoaXMgYmF0Y2ggYXJlIHF1ZXVlZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duIHJldHJ5QWZ0ZXIgaG9ub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgc3RlcHMgKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZWQgZnJvbSB0aGVpciBldmVudHMgYW5kIG5vdCByZS1ydW4uIEJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBkcml2ZXMgYWxsIHJlbWFpbmluZyB3b3JrLCB3ZSBtdXN0IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHJlLXF1ZXVlIGB0b1JldHJ5YCBoZXJlLCBzaW5jZSB0aGF0IHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1kaXNwYXRjaCB0aG9zZSBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEJFRk9SRSB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdywgc28gYSBiYXRjaCB0aGF0IG1peGVzIGEgdGhyb3R0bGUgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzdGVwIHRoYXQgbGVmdCB1bmZsdXNoZWQgb3BzIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZSBleHBsaWNpdCBmbHVzaCBjb250aW51YXRpb24uIFRoYXQgaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0aHJvdHRsZSBiYWNrb2ZmICg+PSAxcykgYWx3YXlzIGV4Y2VlZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluLWludm9jYXRpb24gZmx1c2ggd2luZG93ICg8PSA1MDBtcyArIHdhaXRVbnRpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG9wcyBzZXR0bGUgYmVmb3JlIHRoZSBwb3N0LWJhY2tvZmYgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzIGFuZCByZWFkcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UodGhyb3R0bGVUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5tYXAoKHsgc3RlcCwgZGVsYXlTZWNvbmRzIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJldHJ5VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNvbnRleHQ6IHJ1bkRpc3BhdGNoQ29udGV4dCh3b3JrZmxvd1J1biksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IHRoZSBkZWxheWVkIHJldHJ5IG9uIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBrZXkgc28gaXQgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWVkIHJlLWRpc3BhdGNoIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJmb3JtcyBvbiByZXBsYXkgKGl0IHVzZXMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGEgbWl4ZWQgYmF0Y2ggd2hlcmUgb25lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY29tcGxldGVkYCB3aXRoIHVuZmx1c2hlZCBiYWNrZ3JvdW5kIG9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChgYW55UGVuZGluZ09wc2ApIGFuZCBhbm90aGVyIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyB3b3VsZCBkb3VibGUtZGlzcGF0Y2ggdGhlIHJldHJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoIGJlbG93IHF1ZXVlcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSBwbGFpbiBjb250aW51YXRpb24sIHdob3NlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIHN0aWxsLWByZXRyeWluZ2Agc3RlcCBhcyBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJlLWRpc3BhdGNoZXMgaXQgKmltbWVkaWF0ZWx5KiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqd2l0aCogYSBrZXkuIFNpbmNlIHRoaXMgZGVsYXllZCByZXRyeSBoYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBrZXksIHRoZSB0d28gbWVzc2FnZXMgd291bGRuJ3QgZGVkdXBlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIHdvdWxkIHJ1biB0d2ljZSwgdGhlIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBiYWNrb2ZmIHdvdWxkIGJlIGlnbm9yZWQgKHBsYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVycm9yYCByZXRyaWVzIHBlcnNpc3Qgbm8gYHJldHJ5QWZ0ZXJgLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JsZCBoYXMgbm8gYFRvb0Vhcmx5YCBndWFyZCksIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBib2R5IGNvdWxkIHJ1biBlYXJseS9jb25jdXJyZW50bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhcmluZyB0aGUga2V5IGxldHMgdGhlIGVhcmxpZXIgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2Ugd2luLCBob25vcmluZyB0aGUgYmFja29mZi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnN0ZXBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHBlbmRpbmcgYmFja2dyb3VuZCBvcGVyYXRpb25zIGZsdXNoIGJlZm9yZSB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHJlYWRzIHRoZWlyIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55UGVuZGluZ09wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCcmVha2luZyBsb29wOiBpbmxpbmUgc3RlcCBoYXMgcGVuZGluZyBvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGxvb3BJdGVyYXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGlubGluZSBzdGVwcyB3aWxsIGJlIHJlLXJ1biB2aWEgdGhlaXIgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IG1lc3NhZ2VzOyB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFsbCBzdGVwcyBhcmUgdGVybWluYWwuIERvbid0IGxvb3AgaGVyZTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHN0ZXBzIGhhdmUgbm8gdGVybWluYWwgZXZlbnQgdG8gb2JzZXJ2ZSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGlubGluZSBzdGVwcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSksIHNvIGxvb3AgYmFjayB0byByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgd29ya2Zsb3cgb2JzZXJ2ZXMgdGhlIHRlcm1pbmFsIGV2ZW50cyBvbiByZXBsYXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIGFueSBpbmxpbmUgZGVsdGEuIElmIGl0IGlzIHBhcnRpYWwsIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGl0cyBjdXJzb3IgaW5zdGVhZCBvZiByZWFkaW5nIHRoZSBwYWdlIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ubHkgPSBzdGVwUmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHkudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiYgb25seS5pbmxpbmVEZWx0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBvbmx5LmlubGluZURlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG9ubHkuaW5saW5lRGVsdGEuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0RXZlbnRMb2dMb2FkKGV2ZW50TG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBvZiBhIGd1YXJkZWQgd3JpdGUgbWFkZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYnkgdGhlIHJlcGxheSBsb29wOiB0aGUgcmVzdWx0LWJlYXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fY29tcGxldGVkYCwgb3IgdGhlIGB3YWl0X2NvbXBsZXRlZGAgb2YgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuIEJvdGggcmVhY2ggdGhpcyBvbmUgY2F0Y2ggYW5kIHRoZSByZWplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHNheSB3aGljaCwgaGVuY2UgdGhlIG5ldXRyYWwgbGFiZWwuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWl0aGVyIG1heSBiZSByZS1wb3N0ZWQgaW4gcGxhY2U6IHRoZSBjb3JyZWxhdGlvbiBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIChmb3IgcnVuX2NvbXBsZXRlZCkgdGhlIHJlc3VsdCBpdHNlbGYgY2FtZSBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcGxheSwgYW5kIGEgY29ycmVjdGVkIGxvZyBtYXkgcHJvZHVjZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IG9uZXMuIERvbid0IGZhaWwgdGhlIHJ1bjogcmVzdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBpbiB0aGlzIGludm9jYXRpb24sIGFuZCBvbmx5IG9uY2UgdGhhdCBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNwZW50IHNjaGVkdWxlIGFuIGV4cGxpY2l0IHJlLWludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRocm93aW5nIGluc3RlYWQgd291bGQgcmVseSBvbiByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBtZXNzYWdlLCB3aGljaCB0aGUgdHVyYm8gcGF0aCBoYXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNrZWQuIEVtcGlyaWNhbGx5IHRoZSBydW4gdGhlbiBzdGFsbHMgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUncyB+MzAwcyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYWxFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKCdyZXBsYXktd3JpdGUnLCBlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9IGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwbGF5LXdyaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gYnVkZ2V0IHNwZW50LiBGYWxsIHRocm91Z2ggdG8gdGhlIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cgaW5zdGVhZCBvZiByZXRocm93aW5nOiB0aGlzIGNhdGNoIG93bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyB0aGUgcnVuLCBhbmQgYSByZXRocm93IHdvdWxkIGVzY2FwZSB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgaGFuZGxlciBhbmQgYmUgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZXMgdGFsa2luZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkICh3b3JrZmxvdy1zZXJ2ZXIpLCBzdWNoIGFzIGFuIGV4aGF1c3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnlBZ2VudCAoVU5EX0VSUl9SRVFfUkVUUlkgZnJvbSBhIHN1c3RhaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gNDI5LzUwMyBzdG9ybSksIGEgZHJvcHBlZCBzb2NrZXQsIGEgY29ubmVjdC9ETlNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUsIG9yIGEgY2xpZW50IHRpbWVvdXQsIG11c3QgTk9UIGZhaWwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4uIFJldGhyb3cgc28gdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gcmV0cmllcyB0aGUgcmVwbGF5IG9uY2UgdGhlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJzLiBUaGUgQHZlcmNlbC9xdWV1ZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIGEgZmFzdCAoMXPihpI2MHMpIGJhY2tvZmYgYnkgZGVsaXZlcnkgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZGluZyB0aGUgfjVtaW4gZGVmYXVsdCB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBuZXZlciBraWxsaW5nIHRoZSBwcm9jZXNzIHZpYSBydW5fZmFpbGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJhbnNpZW50IHdvcmxkIGVycm9yIGR1cmluZyByZXBsYXk7IHJlZGVsaXZlcmluZyB2aWEgcXVldWUgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlZCBmb3IgYSBkaXZlcmdlbmNlIHNvIHRoZSB0ZXJtaW5hbCBsb2cgYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgdGhlIHNhbWUgY29udGV4dCB0aGUgV0FSTiBkb2VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpdmVyZ2VuY2VGaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVwbGF5RGl2ZXJnZW5jZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2ZXJnZW5jZUNvdW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGF5RGl2ZXJnZW5jZT8uY291bnQgPz8gMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZWNvdmVyeVJlcGxheXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IGRpdmVyZ2VuY2UgaW4gdGhpcyByZWNvdmVyeSBjaGFpbiwgb2xkZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0LCBib3VuZGVkIGJ5IHRoZSBjaGFpbidzIG93biBsZW5ndGg6IGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnkgcmVwbGF5IGlzIHF1ZXVlZCBhdCBtb3N0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBtYXhSZWNvdmVyeVJlcGxheXNgIHRpbWVzLCBzbyB0aGUgdGVybWluYWwgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWRzIGBtYXhSZWNvdmVyeVJlcGxheXMgKyAxYCBpZHMuIEEgcHJvZHVjZXIgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVkYXRlcyB0aGUgZmllbGQsIG9yIG9uZSB3aG9zZSB2YWx1ZSBmYWlsZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UsIGNvbnRyaWJ1dGVzIG5vdGhpbmcgYW5kIHRoZSBoaXN0b3J5IHJlc3RhcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBwcmlvciBtZXNzYWdlJ3MgYGV2ZW50SWRgLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZlcmdlbmNlRXZlbnRJZHMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcGxheURpdmVyZ2VuY2U/LmV2ZW50SWRzID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGF5RGl2ZXJnZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFtyZXBsYXlEaXZlcmdlbmNlLmV2ZW50SWRdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW10pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXS5zbGljZSgtKG1heFJlY292ZXJ5UmVwbGF5cyArIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpY2ggcGFzcyBvZiB3aGljaCBpbnZvY2F0aW9uIGRpdmVyZ2VkLCBhbmQgd2hhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHBhc3Mgd2FzIHdvcmtpbmcgZnJvbS4gQWxsIG9mIGl0IGlzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gc2NvcGU7IG5vbmUgb2YgaXQgaXMgYW5vdGhlciByb3VuZCB0cmlwLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgaXMgdGhhdCBhIGRpdmVyZ2VuY2Ugb24gYSBjb2xkIHJlcGxheSBvZiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bGwgbG9nIGFuZCBvbmUgb24gYSByZXRhaW5lZC1WTSByZXN1bWUgb2YgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YSBhcmUgZGlmZmVyZW50IGJ1Z3MsIGFuZCB0aGUgbWVzc2FnZSBhbG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBzYXkgd2hpY2ggdGhpcyB3YXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VGaWVsZHMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX0RJVkVSR0VOQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUV2ZW50SWQ6IGVyci5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yRGl2ZXJnZW5jZUV2ZW50SWQ6IHJlcGxheURpdmVyZ2VuY2U/LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUV2ZW50SWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjb3ZlcnlSZXBsYXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVkQnlSZXRhaW5lZFNlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2dTdGF0ZTogZXZlbnRMb2cudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZ0xlbmd0aDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV2ZW50TG9nLmV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2dMYXN0RXZlbnRJZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV2ZW50TG9nLmV2ZW50cy5hdCgtMSk/LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChldmVudExvZy5jdXJzb3IgPz8gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNIb29rSW5wdXQ6IGhvb2tJbnB1dCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1dhaXRDb250aW51YXRpb246IHdhaXRDb250aW51YXRpb24gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlY292ZXJ5UmVwbGF5OiByZXBsYXlEaXZlcmdlbmNlICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBTb3VyY2U6IHJlc3VtZVRyYWNraW5nPy5zZXR1cFNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGl2ZXJnZW5jZUNvdW50IDw9IG1heFJlY292ZXJ5UmVwbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJlcGxheSBkaXZlcmdlZDsgcXVldWVpbmcgYSByZWNvdmVyeSByZXBsYXkgYmVmb3JlIGRlY2xhcmluZyB0aGUgZXZlbnQgbG9nIGNvcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC4uLmRpdmVyZ2VuY2VGaWVsZHMsIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWRzOiBkaXZlcmdlbmNlRXZlbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlID0gZGl2ZXJnZW5jZUNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yID0gbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJlcGxheSBkaXZlcmdlZCAke2RpdmVyZ2VuY2VDb3VudH0gdGltZXMgYWZ0ZXIgJHttYXhSZWNvdmVyeVJlcGxheXN9IHJlY292ZXJ5IHJlcGxheXM7IGxhdGVzdCBkaXZlcmdlbnQgZXZlbnQgd2FzICR7ZXJyLmV2ZW50SWR9OyBkaXZlcmdlbnQgZXZlbnQgaWRzOiAke2RpdmVyZ2VuY2VFdmVudElkcy5qb2luKCcsICcpfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwbGF5U3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXZlcmdlbmNlIGNvbnRleHQgZmlyc3Qgc28gdGhlIGNsYXNzaWZpZWQgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbmFtZSBvZiB0aGUgdGVybWluYWwgZXJyb3Igd2luLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5kaXZlcmdlbmNlRmllbGRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVzc2FnZSBoYXMgbm8gYm9keSwgc28gdGhlIGNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyZXIgcHJvbW90ZXMgYGVycm9yU3RhY2tgIGludG8gb25lIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93cyBgZXJyb3JNZXNzYWdlYCBvbiBpdHMgb3duIHJvdyB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBwcm9kdWNlZCBubyBzdGFjayB0byBjYXJyeSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWl0aGVyIG9mIHRob3NlIHJlYWNoZXMgYSB3cmFwcGVkIGVycm9yJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhc29uOiBgVHlwZUVycm9yOiBmZXRjaCBmYWlsZWRgIGNhcnJpZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgbWVzc2FnZSBieSBkZXNpZ24gYW5kIGEgc3RhY2sgb2YgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgbm9kZTppbnRlcm5hbC9gIGZyYW1lcywgYW5kIHRoZSB3b3JsZCBsYXllcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biB3cmFwcGVycyBuYW1lIHRoZSByZXF1ZXN0IHRoYXQgZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHdoYXQgZmFpbGVkIGFib3V0IGl0LiBVbmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBubyBjYXVzZSwgc28gdGhlIHJvdyBkaXNhcHBlYXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhbiBvcmRpbmFyeSB1c2VyIHRocm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhdXNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVycm9yQ2F1c2VDaGFpbih0ZXJtaW5hbEVycm9yKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtOiBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIGZyb20gdGhpcyBsb29wIGl0IGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90IHNuYXBzaG90LCBzbyBhIFdvcmxkIHRoYXQgZmVuY2VzIGNhbiByZWplY3QgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhIHNsb3QtYWxsb2NhdGluZyBvbmUgcmVwb3J0cyBiYWNrIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHJlcGxheSBoYWQgbm90IHNlZW4uIEZhaWwtb3BlbiBvbiBwdXJwb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBuZWl0aGVyIGFwcGxpZXM6IGEgc3B1cmlvdXMgZmFpbHVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgKHRoZSBydW4gY2FuIGJlIHJlLXJ1biBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGFzaGJvYXJkKSwgd2hlcmVhcyBhIHNwdXJpb3VzICpjb21wbGV0aW9uKiBjb21taXRzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIHJlc3VsdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbmNyeXB0aW9uS2V5LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFpbEVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG5cbiAgbGV0IGNhY2hlZEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG4gIGxldCBpbnZvY2F0aW9uQ291bnQgPSAwO1xuICBjb25zdCBlbnRyeXBvaW50Q3JlYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgcm91dGVNb2R1bGVCb2R5SW5pdE1zID1cbiAgICB0eXBlb2Ygb3B0aW9ucz8ucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID09PSAnbnVtYmVyJ1xuICAgICAgPyBlbnRyeXBvaW50Q3JlYXRlZEF0IC0gb3B0aW9ucy5yb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB3aXRoSGVhbHRoQ2hlY2soYXN5bmMgKHJlcSkgPT4ge1xuICAgIGludm9jYXRpb25Db3VudCArPSAxO1xuICAgIGNvbnN0IGhhbmRsZXJDYWNoZWQgPSBjYWNoZWRIYW5kbGVyICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnU0VSVkVSJyk7XG5cbiAgICByZXR1cm4gdHJhY2UoXG4gICAgICAnd29ya2Zsb3cucm91dGUuZmxvdycsXG4gICAgICB7XG4gICAgICAgIGtpbmQ6IHNwYW5LaW5kLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVUeXBlKCdmbG93JyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkZhYXNJbnN0YW5jZShDT01QVVRFX0lOU1RBTkNFX0lEKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUhhbmRsZXJDYWNoZWQoaGFuZGxlckNhY2hlZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQoaW52b2NhdGlvbkNvdW50KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUVudHJ5cG9pbnRBZ2VNcyhcbiAgICAgICAgICAgIERhdGUubm93KCkgLSBlbnRyeXBvaW50Q3JlYXRlZEF0XG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi4ocm91dGVNb2R1bGVCb2R5SW5pdE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogQXR0cmlidXRlLldvcmtmbG93Um91dGVNb2R1bGVCb2R5SW5pdE1zKHJvdXRlTW9kdWxlQm9keUluaXRNcykpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUmVxdWVzdE1ldGhvZChyZXEubWV0aG9kKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJvdXRlKCcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIGlmICghY2FjaGVkSGFuZGxlcikge1xuICAgICAgICAgIGNhY2hlZEhhbmRsZXIgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuaW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoZSBmdWxsIHJ1bnRpbWUgV29ybGQsIG5vdCBgZ2V0V29ybGRIYW5kbGVycygpYC4gVGhhdCBhY2Nlc3NvclxuICAgICAgICAgICAgLy8gb3ducyBhIHNlY29uZCwgYnVpbGQtdGltZS1zYWZlIGNhY2hlLCBzbyBjYWxsaW5nIGl0IGhlcmUgYnVpbHQgYVxuICAgICAgICAgICAgLy8gc2Vjb25kIFdvcmxkIGluIHRoZSBzYW1lIHByb2Nlc3M6IGR1cGxpY2F0ZSBjb25uZWN0aW9uIHBvb2xzIGFuZFxuICAgICAgICAgICAgLy8gcXVldWUgd29ya2VycyBmb3IgYSBzdGF0ZWZ1bCBXb3JsZCwgcGx1cyBhIHNlY29uZCBjb3B5IG9mIHRoYXRcbiAgICAgICAgICAgIC8vIHdvcmxkIHBhY2thZ2UncyBtb2R1bGVzIG9uY2UgaXQgaXMgYnVuZGxlZCwgd2hpY2ggaXMgd2hhdFxuICAgICAgICAgICAgLy8gc2lsZW50bHkgZGVtb3RlZCB0aGUgZXZlbnRzIFdlYlNvY2tldCB0cmFuc3BvcnQgdG8gSFRUUC4gIzM2NjUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIHNwYW4ga2VlcHMgaXRzIG9yaWdpbmFsIG5hbWUuIEl0IGlzIGEgZGlzdGluY3Qgc3BhbiBmcm9tIHRoZVxuICAgICAgICAgICAgLy8gcGVyLXJlcXVlc3QgYHdvcmtmbG93LnJvdXRlLmdldF93b3JsZGAgYXQgdGhlIHRvcCBvZiB0aGUgZmxvd1xuICAgICAgICAgICAgLy8gcm91dGUsIGFuZCByZW5hbWluZyBpdCB3b3VsZCBjb2xsaWRlIHdpdGggdGhhdCBvbmUuXG4gICAgICAgICAgICBjb25zdCB3b3JsZEhhbmRsZXJzID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGRfaGFuZGxlcnMnLFxuICAgICAgICAgICAgICBhc3luYyAoKSA9PiBnZXRXb3JsZCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIod29ybGRIYW5kbGVycyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlZEhhbmRsZXIocmVxKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgQXR0cmlidXRlLkh0dHBSZXNwb25zZVN0YXR1c0NvZGUocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl19