@sinequa/assistant 3.7.2 → 3.7.3
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.
|
@@ -531,6 +531,10 @@ export class ChatComponent extends AbstractFacet {
|
|
|
531
531
|
return;
|
|
532
532
|
}
|
|
533
533
|
const userMsg = { role: 'user', content: '', additionalProperties: { display: false, isUserInput: false, type: "Action", forcedWorkflow: attachDocAction.forcedWorkflow, forcedWorkflowProperties: { ...(attachDocAction.forcedWorkflowProperties || {}), ids }, additionalWorkflowProperties: this.config.additionalWorkflowProperties } };
|
|
534
|
+
// Remove the search warning message if exists
|
|
535
|
+
if (this.chatService.chatHistory.at(-1)?.role === 'search-warning') {
|
|
536
|
+
this.chatService.chatHistory.pop();
|
|
537
|
+
}
|
|
534
538
|
const messages = [...this.chatService.chatHistory, userMsg];
|
|
535
539
|
this.messages$.next(messages);
|
|
536
540
|
this.fetch(messages);
|
|
@@ -1054,4 +1058,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
1054
1058
|
type: ContentChild,
|
|
1055
1059
|
args: ['debugMessagesTpl']
|
|
1056
1060
|
}] } });
|
|
1057
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBOEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFOLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQVMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBaUIsa0JBQWtCLEVBQUcsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7O0FBY2xFLE1BQU0sT0FBTyxhQUFjLFNBQVEsYUFBYTtJQXdIOUM7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQXZISCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRCxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0QywyQkFBc0IsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN4RCxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMvQyxRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyx5QkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUkzRCwrQ0FBK0M7UUFDdEMsVUFBSyxHQUFVLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBUWpELDJEQUEyRDtRQUNsRCxhQUFRLEdBQXlCLFdBQVcsQ0FBQztRQUN0RCx5REFBeUQ7UUFDaEQsb0JBQWUsR0FBcUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2RSwyR0FBMkc7UUFDbEcsa0NBQTZCLEdBQUcsS0FBSyxDQUFDO1FBQy9DLHVGQUF1RjtRQUM5RSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFHcEMsNkNBQTZDO1FBQ3BDLHlCQUFvQixHQUFHLFlBQVksQ0FBQztRQU83QywwRUFBMEU7UUFDaEUsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQ3pELCtFQUErRTtRQUMvRSxtRUFBbUU7UUFDaEQsYUFBUSxHQUFHLElBQUksWUFBWSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQy9ELDhFQUE4RTtRQUM1RCxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUNqRCxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDbkQsb0hBQW9IO1FBQzFHLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNyRCx5SEFBeUg7UUFDL0csZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUNsRSx5RUFBeUU7UUFDL0Qsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQVk5RCxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQTRCLFNBQVMsQ0FBQyxDQUFDO1FBRXRFLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFZCxhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ2hCLHFCQUFnQixHQUFHLElBQUksTUFBTSxDQUFDO1lBQ3BDLElBQUksRUFBRSxhQUFhO1lBQ25CLEtBQUssRUFBRSxpQkFBaUI7WUFDeEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7U0FDN0IsQ0FBQyxDQUFDO1FBRUssU0FBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFRbEMsYUFBUSxHQUFHLElBQUksZUFBZSxDQUE0QixTQUFTLENBQUMsQ0FBQztRQUVyRSx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGdCQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsK0NBQStDO1FBRW5FLHlFQUF5RTtRQUNqRSxxQ0FBZ0MsR0FBRyxLQUFLLENBQUM7UUFJakQsc0JBQWlCLEdBQWE7WUFDNUIsb0JBQW9CO1lBQ3BCLGtDQUFrQztZQUNsQyxxQkFBcUI7WUFDckIsaUJBQWlCO1lBQ2pCLDZCQUE2QjtZQUM3QixPQUFPO1NBQ1IsQ0FBQztRQUNGLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFJdkIsZUFBVSxHQUF1QixTQUFTLENBQUM7UUFDM0MsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUluQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFHbEIsd0JBQW1CLEdBQTZCLFNBQVMsQ0FBQztRQUloRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxFQUN4QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxFQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQzNDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUM3QyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQ2xDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsRUFDdkMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUM1QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDTixJQUFJLElBQUksQ0FBQyxXQUFXLFlBQVksb0JBQW9CLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDbkQ7WUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUN6QyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUM5QyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQ2pELEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlCLElBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO29CQUM5RixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO2lCQUNqQzthQUNGO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQTtnQkFDL0IsTUFBTSxLQUFLLENBQUM7YUFDYjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUMsU0FBUyxFQUFFLENBQ2QsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNYLGFBQWEsQ0FBQztZQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQjtTQUNyQyxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQzlFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxZQUFZLG9CQUFvQixFQUFFO1lBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQjtRQUNwQixRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDckIsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDcEMsTUFBTTtZQUNSLEtBQUssV0FBVztnQkFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDekMsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMseUZBQXlGLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1NBQzlIO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBYSxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUdoRDs7Ozs7Ozs7OztPQVVHO0lBQ0ssY0FBYztRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNwQyx1R0FBdUc7UUFDdkcsSUFBSSxPQUFPLEVBQUUsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFdBQVcsWUFBWSxvQkFBb0IsRUFBRTtZQUN4RyxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNoRTtRQUNEOzs7V0FHRztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksT0FBTyxFQUFFLElBQUksRUFBRTtZQUM5QyxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7b0JBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxrQ0FBa0M7aUJBQ3JFO2dCQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDYixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxFQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQztnQkFDbkssUUFBUSxFQUFFLENBQUM7YUFDWjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxFQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFDO2dCQUM1SCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7U0FDRjtRQUNEOzs7O1dBSUc7UUFDSCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFO1lBQzNHLElBQUksSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDckgsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7d0JBQzdCLHdGQUF3Rjt3QkFDeEYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVOzRCQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQjt5QkFDckMsQ0FBQzs2QkFDRCxJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsNEJBQTRCO3dCQUN4RixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO3lCQUMxQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7NEJBQ2YsNENBQTRDOzRCQUM1QyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQzs0QkFDdEMsK0NBQStDOzRCQUMvQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs0QkFDN0QsNENBQTRDOzRCQUM1QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO3dCQUN2QyxDQUFDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtxQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRTs2QkFDM0QsU0FBUyxDQUFDOzRCQUNULElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDOzRCQUNkLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0NBQ1YsNENBQTRDO2dDQUM1QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0NBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7NEJBQ3ZDLENBQUM7NEJBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQ0FDYixrRUFBa0U7Z0NBQ2xFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDOUIsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29DQUNmLDRDQUE0QztvQ0FDNUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7b0NBQ3RDLCtDQUErQztvQ0FDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0NBQzdELDRDQUE0QztvQ0FDNUMsSUFBSSxDQUFDLG1CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDO29DQUN4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO2dDQUN2QyxDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDO3lCQUNGLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtxQkFBTTtvQkFDTCw0Q0FBNEM7b0JBQzVDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO29CQUN0QywrQ0FBK0M7b0JBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUM5RDthQUNGO2lCQUFNO2dCQUNMLCtDQUErQztnQkFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDOUQ7U0FDRjtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDhCQUE4QjtRQUNwQyxNQUFNLFNBQVMsR0FBRyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBQyxDQUFDO1FBQzVILE1BQU0sT0FBTyxHQUFHLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUMsRUFBQyxDQUFDO1FBQ25PLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO1FBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyx3QkFBd0I7UUFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsRUFBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztRQUMvSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFHRDs7Ozs7Ozs7O09BU0c7SUFDSyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ1gsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3JJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7WUFDdkYsT0FBTztTQUNSO1FBQ0QsSUFBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFO1lBQy9FLG9JQUFvSTtZQUNwSSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO2dCQUNwQyxnQ0FBZ0M7Z0JBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLHVHQUF1RztnQkFDdkcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDakcsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUM7YUFDeEM7WUFDRCw4Q0FBOEM7WUFDOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssZ0JBQWdCLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3BDO1lBQ0QsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RFLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsYUFBYyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxhQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLFlBQVksQ0FBQyxRQUFnQixFQUFFLFlBQTJCO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLEVBQUMsRUFBQyxDQUFDO1FBQ3BMLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxFQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLGdDQUFnQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUM1WCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFFBQXVCO1FBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7WUFDdkYsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztpQkFDbEUsU0FBUyxDQUFDO2dCQUNULElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDekMsS0FBSyxFQUFFLEdBQUcsRUFBRTtvQkFDVixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ3JCLE1BQU0sT0FBTyxHQUFHLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxFQUFDLENBQUM7d0JBQ2xKLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDN0M7b0JBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixDQUFDO2dCQUNELFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQ2IsbURBQW1EO29CQUNuRCxtRkFBbUY7b0JBQ25GLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3pEO29CQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQzthQUNGLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDTCxNQUFNLE9BQU8sR0FBRyxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFDO1lBQ2xKLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUcsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3JDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxVQUFVO1FBQ1IsSUFBRyxJQUFJLENBQUMsV0FBVyxZQUFZLG9CQUFvQixFQUFFO1lBQ25ELDRDQUE0QztZQUM1QyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsRUFBRTtnQkFDaEMsdUVBQXVFO2dCQUN2RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELG9EQUFvRDtnQkFDcEQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtvQkFDcEQsS0FBSyxFQUFFLENBQUM7aUJBQ1Q7Z0JBQ0Qsc0hBQXNIO2dCQUN0SCxnQ0FBZ0M7Z0JBQ2hDLDBDQUEwQztnQkFDMUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO29CQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxhQUFhLEdBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDMUM7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsQ0FBQyx1Q0FBdUM7Z0JBQ3pFOzs7bUJBR0c7Z0JBQ0YsSUFBSSxDQUFDLFdBQW9DLENBQUMsVUFBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0UsdUVBQXVFO2dCQUN2RSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsS0FBSyxDQUFDO1lBQ2hELENBQUMsQ0FBQTtZQUNELG1FQUFtRTtZQUNuRSxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVyxDQUFDLEtBQUssRUFBRTtnQkFDMUMsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO29CQUMvQiwwRUFBMEU7b0JBQzFFLG9CQUFvQixFQUFFLENBQUM7b0JBQ3ZCLE1BQU07Z0JBQ1IsS0FBSyxrQkFBa0IsQ0FBQyxZQUFZO29CQUNsQyw0REFBNEQ7b0JBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUU7d0JBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO3dCQUNqRSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDO3FCQUM5QztvQkFDRCwwQ0FBMEM7b0JBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekUsTUFBTTtnQkFDUixLQUFLLGtCQUFrQixDQUFDLFlBQVk7b0JBQ2xDLDJCQUEyQjtvQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUU7eUJBQ2pDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3lCQUNsQyxLQUFLLENBQUMsR0FBRyxFQUFFO3dCQUNWLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0UsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsTUFBTTtnQkFDUjtvQkFDRSxNQUFNO2FBQ1Q7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLFlBQVksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFXLENBQUMsS0FBSyxLQUFLLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsUUFBdUI7UUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBRyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDckMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNkJBQTZCO1FBQ25DLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUU7WUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsWUFBWSxDQUFDO1NBQ2pLO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDMUI7UUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRTtZQUN2RixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtRQUNwRSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsd0JBQXdCO1FBQzNELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxrQ0FBa0M7UUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsRUFBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztRQUMvSixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksQ0FBQyxHQUFhO1FBQ3hCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7WUFDdkYsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixPQUFPO1NBQ1I7UUFDRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtRUFBbUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDckcsT0FBTztTQUNSO1FBQ0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxFQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFDLEVBQUUsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsRUFBQyxFQUFDLENBQUM7UUFDdlUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWU7UUFDYiw0REFBNEQ7UUFDNUQsTUFBTSxTQUFTLEdBQUcsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQztRQUM1SCxNQUFNLE9BQU8sR0FBRyxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFDLEVBQUMsQ0FBQztRQUVuTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFO1lBQzdELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDM0M7YUFBTTtZQUNMLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssaUJBQWlCLENBQUMsU0FBc0IsRUFBRSxPQUFvQjtRQUNwRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRTtZQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3RjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9GO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGdCQUFnQixDQUFDLFNBQXNCLEVBQUUsT0FBb0I7UUFDbkUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDckIsTUFBTSxZQUFZLEdBQUcsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLDRCQUE0QixFQUFDLEVBQUMsQ0FBQztZQUMvVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVGLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEVBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0NBQWdDLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEVBQUMsQ0FBQyxDQUFDO2FBQ3hiO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxFQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLGdDQUFnQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUN6YjtTQUNGO2FBQU07WUFDTCxNQUFNLFVBQVUsR0FBRyxFQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLEVBQUMsQ0FBQztZQUM3SSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hHO0lBQ0gsQ0FBQztJQUVPLDBCQUEwQixDQUFDLE9BQW9CLEVBQUUsSUFBWTtRQUNuRSxPQUFPO1lBQ0wsVUFBVSxFQUFFLENBQUM7WUFDYixNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDdkIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3BCLE1BQU0sRUFBRSxJQUFJO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRLENBQUMsUUFBc0IsRUFBRSxXQUFvQjtRQUNuRCxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN6QyxPQUFPLENBQUMsS0FBSyxDQUFDLCtFQUErRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pHLE9BQU87U0FDUjtRQUNELElBQUksV0FBVyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3hDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsK0VBQStFO1NBQ3RHO2FBQ0k7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMscUZBQXFGO1lBQ2hILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUztRQUNQLElBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhO1NBQzlDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMscUJBQXFCO1FBQy9ELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYzthQUM1QixJQUFJLENBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUNoQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDcEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFDOUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUN4RixDQUFDLFNBQVMsRUFBRSxDQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FDekMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRTtZQUN2RixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQzVGLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLHNDQUFzQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7WUFDdkYsT0FBTztTQUNSO1FBQ0QseUpBQXlKO1FBQ3pKLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUMzRCxDQUFDLEVBQUUsQ0FBQztTQUNMO1FBQ0QsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsa0ZBQWtGO1lBQ2xGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3Qyw2RkFBNkY7WUFDN0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0UsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7U0FDeEU7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssd0JBQXdCLENBQUMsS0FBYTtRQUM1QyxzRkFBc0Y7UUFDdEYsa0RBQWtEO1FBQ2xELDJNQUEyTTtRQUMzTSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVk7YUFDMUIsS0FBSyxFQUFFO2FBQ1AsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEVBQUMsR0FBRyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxFQUFDLENBQUMsQ0FBQzthQUN6RyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNmLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzNCLE9BQU8sRUFBQyxHQUFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxFQUFDLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFBO2FBQzVGO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUE7UUFDcEIsNkdBQTZHO1FBQzdHLDJNQUEyTTtRQUMzTSwrRUFBK0U7UUFDL0UsOEhBQThIO1FBQzlILE1BQU0sNENBQTRDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFNO2FBQ2pCLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO2FBQ2YsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDZixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUMzQixPQUFPLEVBQUMsR0FBRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsRUFBQyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLEVBQUMsQ0FBQTthQUM1RjtZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6SCxxREFBcUQ7UUFDckQsc0ZBQXNGO1FBQ3RGLHVLQUF1SztRQUN2SyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hGLDBEQUEwRDtRQUMxRCxPQUFPLGVBQWUsQ0FBQyxLQUFLLEdBQUcsNENBQTRDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7SUFDekcsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxLQUFvQjtRQUMxQixRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDakIsS0FBSyxXQUFXO2dCQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFDbkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7aUJBQ3ZCO2dCQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZUFBZSxDQUFDLEtBQXFCO1FBQ25DLElBQUksS0FBSyxFQUFFLEdBQUcsS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQzdDLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztTQUN6QjtRQUNELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUN0QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYyxDQUFDLGFBQWEsQ0FBQztRQUM3QyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxHQUFHLFNBQVMsSUFBSSxDQUFDO1FBQ3RDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6QixFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLElBQUksQ0FBQztRQUN6QyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsT0FBb0IsRUFBRSxJQUFZO1FBQ3ZDLHNDQUFzQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBRXRCLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBWSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDdEcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLE9BQW9CLEVBQUUsSUFBWTtRQUMxQyxzQ0FBc0M7UUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsRUFBQyxJQUFJLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtRQUV0QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3pHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3JIO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVTtRQUNSLE1BQU0sT0FBTyxHQUFHO1lBQ2QsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxPQUFPO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtTQUN4QixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3RFO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsSUFBeUQ7UUFDN0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUTtZQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUNwQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUN4QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUM5QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYTtTQUM3QyxDQUFDO1FBQ0YsSUFBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxzQkFBc0IsQ0FBQyxJQUF5RDtRQUM5RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUTtZQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUNwQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUN4QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUM5QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYTtTQUM3QyxDQUFDO1FBQ0YsSUFBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsTUFBdUIsRUFBRSxLQUFhO1FBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUM3SCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxLQUFhO1FBQzVCLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ3ZELE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxzREFBc0Q7UUFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEQsb0hBQW9IO1FBQ3BILHNIQUFzSDtRQUN0SCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlDQUFpQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztTQUN2RTtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsdUJBQXVCLENBQUMsUUFBdUIsRUFBRSxLQUFhO1FBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1NBQ3BEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCx1QkFBdUIsQ0FBQyxPQUFnQztRQUN0RCxJQUFJLE9BQU8sRUFBRSxJQUFJLEtBQUssV0FBVztlQUN4QixPQUFPLEVBQUUsT0FBTyxLQUFLLEVBQUU7ZUFDdkIsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVztlQUMzQyxDQUFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTO2VBQ3pDLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU07ZUFDdEMsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUU7WUFDekQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7MEdBbmtDVSxhQUFhOzhGQUFiLGFBQWEsNHRCQVJiO1FBQ1QsZUFBZTtRQUNmLG9CQUFvQjtLQUNyQixzcUJDN0JILG9yUkErS0EseWtKRC9JWSxZQUFZLHlqQkFBRSxXQUFXLDBnQ0FBRSxvQkFBb0Isd2FBQUUseUJBQXlCLDBGQUFFLHFCQUFxQixzR0FBRSxXQUFXOzJGQUU3RyxhQUFhO2tCQVp6QixTQUFTOytCQUNFLFlBQVksYUFHWDt3QkFDVCxlQUFlO3dCQUNmLG9CQUFvQjtxQkFDckIsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxXQUFXLENBQUM7MEVBZWhILFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQU9HLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsNkJBQTZCO3NCQUFyQyxLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUVHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdZLFFBQVE7c0JBQTFCLE1BQU07dUJBQUMsU0FBUztnQkFFQyxPQUFPO3NCQUF4QixNQUFNO3VCQUFDLFFBQVE7Z0JBQ04sSUFBSTtzQkFBYixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVtQixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0ksYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUVFLFVBQVU7c0JBQXJDLFlBQVk7dUJBQUMsWUFBWTtnQkFDQyxTQUFTO3NCQUFuQyxZQUFZO3VCQUFDLFdBQVc7Z0JBQ1ksbUJBQW1CO3NCQUF2RCxZQUFZO3VCQUFDLHFCQUFxQjtnQkFDRCxnQkFBZ0I7c0JBQWpELFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvYWN0aW9uXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEZhY2V0IH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvZmFjZXRcIjtcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy9zZWFyY2hcIjtcbmltcG9ydCB7IEFwcFNlcnZpY2UsIFF1ZXJ5IH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYXBwLXV0aWxzXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlLCBSZWNvcmQgYXMgQXJ0aWNsZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlc1wiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgZnJvbUV2ZW50LCBtYXAsIG1lcmdlLCBzd2l0Y2hNYXAsIHRha2UsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdENvbnRleHRBdHRhY2htZW50LCBDaGF0Q29uZmlnLCBDaGF0TWVzc2FnZSwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIE1lc3NhZ2VIYW5kbGVyLCBSYXdNZXNzYWdlLCBTdWdnZXN0ZWRBY3Rpb24sIEluaXRDaGF0LCBEZWJ1Z01lc3NhZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5zdGFuY2VNYW5hZ2VyU2VydmljZSB9IGZyb20gXCIuL2luc3RhbmNlLW1hbmFnZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0Q2hhdFNlcnZpY2UgfSBmcm9tIFwiLi93ZWJzb2NrZXQtY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZUNvbXBvbmVudCB9IGZyb20gXCIuL2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbG9naW5cIjtcbmltcG9ydCB7IFJlc3RDaGF0U2VydmljZSB9IGZyb20gXCIuL3Jlc3QtY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUb2tlblByb2dyZXNzQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vdG9rZW4tcHJvZ3Jlc3MtYmFyL3Rva2VuLXByb2dyZXNzLWJhci5jb21wb25lbnRcIjtcbmltcG9ydCB7IERlYnVnTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gXCIuL2RlYnVnLW1lc3NhZ2UvZGVidWctbWVzc2FnZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IEh1YkNvbm5lY3Rpb24sIEh1YkNvbm5lY3Rpb25TdGF0ZSAgfSBmcm9tIFwiQG1pY3Jvc29mdC9zaWduYWxyXCI7XG5pbXBvcnQgeyBVdGlsc01vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3V0aWxzXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL25vdGlmaWNhdGlvblwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcS1jaGF0LXYzJywgLy8gbWFuZGF0b3J5IHNpbmNlIEBzaW5lcXVhL2NvbXBvbmVudHMgYWxyZWFkeSBoYXMgdGhlIHNhbWUgdGFnLW5hbWUgXCJzcS1jaGF0XCJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIFJlc3RDaGF0U2VydmljZSxcbiAgICBXZWJTb2NrZXRDaGF0U2VydmljZVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIENoYXRNZXNzYWdlQ29tcG9uZW50LCBUb2tlblByb2dyZXNzQmFyQ29tcG9uZW50LCBEZWJ1Z01lc3NhZ2VDb21wb25lbnQsIFV0aWxzTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBDaGF0Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGYWNldCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBsb2dpblNlcnZpY2UgPSBpbmplY3QoTG9naW5TZXJ2aWNlKTtcbiAgcHVibGljIHdlYnNvY2tldFNlcnZpY2UgPSBpbmplY3QoV2ViU29ja2V0Q2hhdFNlcnZpY2UpO1xuICBwdWJsaWMgcmVzdFNlcnZpY2UgPSBpbmplY3QoUmVzdENoYXRTZXJ2aWNlKTtcbiAgcHVibGljIGluc3RhbmNlTWFuYWdlclNlcnZpY2UgPSBpbmplY3QoSW5zdGFuY2VNYW5hZ2VyU2VydmljZSk7XG4gIHB1YmxpYyBzZWFyY2hTZXJ2aWNlID0gaW5qZWN0KFNlYXJjaFNlcnZpY2UpO1xuICBwdWJsaWMgcHJpbmNpcGFsU2VydmljZSA9IGluamVjdChQcmluY2lwYWxXZWJTZXJ2aWNlKTtcbiAgcHVibGljIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuICBwdWJsaWMgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuXG4gIC8qKiBEZWZpbmUgdGhlIGtleSBiYXNlZCBvbiBpdCwgdGhlIGNoYXQgc2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHN0b3JlZCAqL1xuICBASW5wdXQoKSBpbnN0YW5jZUlkOiBzdHJpbmc7XG4gIC8qKiBEZWZpbmUgdGhlIHF1ZXJ5IHRvIHVzZSB0byBmZXRjaCBhbnN3ZXJzICovXG4gIEBJbnB1dCgpIHF1ZXJ5OiBRdWVyeSA9IHRoaXMuc2VhcmNoU2VydmljZS5xdWVyeTtcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjaGF0IHNob3VsZCBiZSByZWxvYWRlZCBhZnRlciB0aGUgcXVlcnkgY2hhbmdlc1xuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjaGF0IHdpbGwgYmUgcmVsb2FkZWQgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0gcHJldlF1ZXJ5IFRoZSBwcmV2aW91cyBxdWVyeVxuICAgKiBAcGFyYW0gbmV3UXVlcnkgVGhlIG5ldyBxdWVyeVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjaGF0IHNob3VsZCBiZSByZWxvYWRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBASW5wdXQoKSBxdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQ6IChwcmV2UXVlcnk6IFF1ZXJ5LCBuZXdRdWVyeTogUXVlcnkpID0+IGJvb2xlYW47XG4gIC8qKiBEZWZpbmUgdGhlIHByb3RvY29sIHRvIGJlIHVzZWQgZm9yIHRoaXMgY2hhdCBpbnN0YW5jZSovXG4gIEBJbnB1dCgpIHByb3RvY29sOiAnUkVTVCcgfCAnV0VCU09DS0VUJyA9IFwiV0VCU09DS0VUXCI7XG4gIC8qKiBNYXAgb2YgbGlzdGVuZXJzIG92ZXJyaWRpbmcgZGVmYXVsdCByZWdpc3RlcmVkIG9uZXMqL1xuICBASW5wdXQoKSBtZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPGFueT4+ID0gbmV3IE1hcCgpO1xuICAvKiogV2hlbiB0aGUgYXNzaXN0YW50IGFuc3dlciBhIHVzZXIgcXVlc3Rpb24sIGF1dG9tYXRpY2FsbHkgc2Nyb2xsIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgZGlzY3Vzc2lvbiAqL1xuICBASW5wdXQoKSBhdXRvbWF0aWNTY3JvbGxUb0xhc3RSZXNwb25zZSA9IGZhbHNlO1xuICAvKiogV2hlbiB0aGUgYXNzaXN0YW50IGFuc3dlciBhIHVzZXIgcXVlc3Rpb24sIGF1dG9tYXRpY2FsbHkgZm9jdXMgdG8gdGhlIGNoYXQgaW5wdXQgKi9cbiAgQElucHV0KCkgZm9jdXNBZnRlclJlc3BvbnNlID0gZmFsc2U7XG4gIC8qKiBBIGNoYXQgZGlzY3Vzc2lvbiB0aGF0IHRoZSBjb21wb25lbnQgc2hvdWxkIGdldCBpbml0aWFsaXplZCB3aXRoIGl0ICovXG4gIEBJbnB1dCgpIGNoYXQ/OiBJbml0Q2hhdDtcbiAgLyoqIEljb24gdG8gdXNlIGZvciB0aGUgYXNzaXN0YW50IG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIGFzc2lzdGFudE1lc3NhZ2VJY29uID0gJ3NxLXNpbmVxdWEnO1xuICAvKiogSWNvbiB0byB1c2UgZm9yIHRoZSB1c2VyIG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIHVzZXJNZXNzYWdlSWNvbjogc3RyaW5nO1xuICAvKiogSWNvbiB0byB1c2UgZm9yIHRoZSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gIC8qKiBJY29uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaCB3YXJuaW5nIG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIHNlYXJjaFdhcm5pbmdNZXNzYWdlSWNvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgb25jZSB0aGUgc2lnbmFsUiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkICAqL1xuICBAT3V0cHV0KCkgY29ubmVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8SHViQ29ubmVjdGlvbj4oKTtcbiAgLyoqIEV2ZW50IGVtaXR0ZXIgdHJpZ2dlcmVkIGVhY2ggdGltZSB0aGUgYXNzaXN0YW50IHVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hhdCAqL1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgY2hhdCBpcyBsb2FkaW5nIG5ldyBjb250ZW50ICovXG4gIEBPdXRwdXQoXCJsb2FkaW5nXCIpIGxvYWRpbmckID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBFbWl0cyB0aGUgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb24gdXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGNvbXBvbmVudCAqL1xuICBAT3V0cHV0KFwiY29uZmlnXCIpIF9jb25maWcgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRDb25maWc+KCk7XG4gIEBPdXRwdXQoKSBkYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZVtdPigpO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdG8gb3BlbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb250ZXh0IGF0dGFjaG1lbnQqL1xuICBAT3V0cHV0KCkgb3BlbkRvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlPigpO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdG8gb3BlbiB0aGUgcHJldmlldyBvZiBhIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgY29udGV4dCBhdHRhY2htZW50ICovXG4gIEBPdXRwdXQoKSBvcGVuUHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdENvbnRleHRBdHRhY2htZW50PigpO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBzdWdnZXN0ZWQgYWN0aW9uICovXG4gIEBPdXRwdXQoKSBzdWdnZXN0QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxTdWdnZXN0ZWRBY3Rpb24+KCk7XG4gIC8qKiBWaWV3Q2hpbGQgZGVjb3JhdG9ycyB0byBhY2Nlc3MgdGhlIHRlbXBsYXRlIGVsZW1lbnRzICovXG4gIEBWaWV3Q2hpbGQoJ21lc3NhZ2VMaXN0JykgbWVzc2FnZUxpc3Q/OiBFbGVtZW50UmVmPEhUTUxVTGlzdEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdxdWVzdGlvbklucHV0JykgcXVlc3Rpb25JbnB1dD86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG4gIC8qKiBDb250ZW50Q2hpbGQgZGVjb3JhdG9ycyBhbGxvd2luZyB0aGUgb3ZlcnJpZGUgb2YgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnQgKi9cbiAgQENvbnRlbnRDaGlsZCgnbG9hZGluZ1RwbCcpIGxvYWRpbmdUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCdyZXBvcnRUcGwnKSByZXBvcnRUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCd0b2tlbkNvbnN1bXB0aW9uVHBsJykgdG9rZW5Db25zdW1wdGlvblRwbD86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ2RlYnVnTWVzc2FnZXNUcGwnKSBkZWJ1Z01lc3NhZ2VzVHBsPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBjaGF0U2VydmljZTogQ2hhdFNlcnZpY2U7XG4gIGNvbmZpZzogQ2hhdENvbmZpZztcbiAgbWVzc2FnZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGF0TWVzc2FnZVtdIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHF1ZXN0aW9uID0gJyc7XG5cbiAgX2FjdGlvbnM6IEFjdGlvbltdID0gW107XG4gIHByaXZhdGUgX3Jlc2V0Q2hhdEFjdGlvbiA9IG5ldyBBY3Rpb24oe1xuICAgIGljb246ICdmYXMgZmEtc3luYycsXG4gICAgdGl0bGU6IFwiUmVzZXQgYXNzaXN0YW50XCIsXG4gICAgYWN0aW9uOiAoKSA9PiB0aGlzLm5ld0NoYXQoKVxuICB9KTtcblxuICBwcml2YXRlIF9zdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2RhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVmFyaWFibGVzIHRoYXQgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIG1vZGVsIGluIHVzZSAqL1xuICBtb2RlbERlc2NyaXB0aW9uPzogR2xsbU1vZGVsRGVzY3JpcHRpb247XG5cbiAgbWVzc2FnZVRvRWRpdD86IG51bWJlcjtcbiAgcmVtYXBwZWRNZXNzYWdlVG9FZGl0PzogbnVtYmVyO1xuICBjaGFuZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2ltcGxlQ2hhbmdlcyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgY3VycmVudE1lc3NhZ2VJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBmaXJzdENoYW5nZXNIYW5kbGVkID0gZmFsc2U7XG4gIGlzQXRCb3R0b20gPSB0cnVlO1xuICBpbml0aWFsaXphdGlvbkVycm9yID0gZmFsc2U7XG4gIGVuYWJsZWRVc2VySW5wdXQgPSBmYWxzZTtcbiAgaXNDb25uZWN0ZWQgPSB0cnVlOyAvLyBCeSBkZWZhdWx0LCB0aGUgY2hhdCBpcyBjb25zaWRlcmVkIGNvbm5lY3RlZFxuICByZXRyaWFsQXR0ZW1wdHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLy8gRmxhZyB0byB0cmFjayB3aGV0aGVyIHRoZSAncmVjb25uZWN0ZWQnIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICBwcml2YXRlIF9pc1JlY29ubmVjdGVkTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7XG5cbiAgLy8gSXNzdWUgcmVwb3J0aW5nXG4gIGlzc3VlVHlwZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdElzc3VlVHlwZXM6IHN0cmluZ1tdID0gW1xuICAgICdVc2VyIEludGVyZmFjZSBidWcnLFxuICAgICdJbmNvcnJlY3Qgb3IgbWlzbGVhZGluZyByZXNwb25zZScsXG4gICAgJ0luY29tcGxldGUgcmVzcG9uc2UnLFxuICAgICdUZWNobmljYWwgaXNzdWUnLFxuICAgICdQcml2YWN5L2RhdGEgc2VjdXJpdHkgaXNzdWUnLFxuICAgICdPdGhlcidcbiAgXTtcbiAgaXNzdWVUeXBlOiBzdHJpbmcgPSAnJztcbiAgcmVwb3J0Q29tbWVudD86IHN0cmluZztcbiAgbWVzc2FnZVRvUmVwb3J0PzogQ2hhdE1lc3NhZ2U7XG4gIHJlcG9ydFJhbms/OiBudW1iZXI7XG4gIHJlcG9ydFR5cGU6ICdsaWtlJyB8ICdkaXNsaWtlJyA9ICdkaXNsaWtlJztcbiAgc2hvd1JlcG9ydCA9IGZhbHNlO1xuXG4gIC8vIERlYnVnIG1lc3NhZ2VzXG4gIGRlYnVnTWVzc2FnZXM6IERlYnVnTWVzc2FnZVtdIHwgdW5kZWZpbmVkO1xuICBzaG93RGVidWdNZXNzYWdlcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ByZXZpb3VzUXVlcnk6IFF1ZXJ5O1xuICBwcml2YXRlIF9yZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2FjdGlvbnMucHVzaCh0aGlzLl9yZXNldENoYXRBY3Rpb24pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc3ViLmFkZChcbiAgICAgIHRoaXMubG9naW5TZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgICAgICBmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdsb2dpbi1jb21wbGV0ZScpLFxuICAgICAgICB0YXAoXyA9PiB0aGlzLmluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKSksXG4gICAgICAgIG1hcChfID0+IHRoaXMuY2hhdFNlcnZpY2UuaW5pdENoYXRDb25maWcoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRDb25maWckKSxcbiAgICAgICAgZmlsdGVyKGluaXRDb25maWcgPT4gISFpbml0Q29uZmlnKSxcbiAgICAgICAgc3dpdGNoTWFwKF8gPT4gdGhpcy5jaGF0U2VydmljZS5pbml0KCkpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRQcm9jZXNzJCksXG4gICAgICAgIGZpbHRlcihzdWNjZXNzID0+ICEhc3VjY2VzcyksXG4gICAgICAgIHRhcChfID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCh0aGlzLmNoYXRTZXJ2aWNlLmNvbm5lY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uTG9hZENoYXQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcChfID0+IHRoaXMuY2hhdFNlcnZpY2Uub3ZlcnJpZGVVc2VyKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLnVzZXJPdmVycmlkZSQpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyE7XG4gICAgICAgICAgdGhpcy5lbmFibGVkVXNlcklucHV0ID0gdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmVuYWJsZWRVc2VySW5wdXQ7XG4gICAgICAgICAgdGhpcy5pc3N1ZVR5cGVzID0gdGhpcy5jb25maWcuYXVkaXRTZXR0aW5ncz8uaXNzdWVUeXBlcz8ubGVuZ3RoID8gdGhpcy5jb25maWcuYXVkaXRTZXR0aW5ncyEuaXNzdWVUeXBlcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLl9jb25maWcuZW1pdChjb25maWcpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGVsRGVzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIGlmKCF0aGlzLmZpcnN0Q2hhbmdlc0hhbmRsZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNRdWVyeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkpOyAvLyBJbml0aWFsaXplIHRoZSBwcmV2aW91cyBxdWVyeVxuICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2FkZFNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgIHRoaXMuZmlyc3RDaGFuZ2VzSGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25FcnJvciA9IHRydWVcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuXG4gICAgdGhpcy5fc3ViLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0cmVhbWluZyQsXG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJFxuICAgICAgXSkucGlwZShcbiAgICAgICAgbWFwKChbc3RyZWFtaW5nLCBzdG9wcGluZ0dlbmVyYXRpb25dKSA9PiAhIShzdHJlYW1pbmcgfHwgc3RvcHBpbmdHZW5lcmF0aW9uKSlcbiAgICAgICkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgdGhpcy5fcmVzZXRDaGF0QWN0aW9uLmRpc2FibGVkID0gcmVzdWx0O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuY2hhbmdlcyQubmV4dChjaGFuZ2VzKTtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9kYXRhU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0b3BDb25uZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWw/LmlzQWRtaW5pc3RyYXRvciB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZSB0aGUgY2hhdCBzZXJ2aWNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBAaW5wdXQgcHJvdG9jb2xcbiAgICogVGhpcyBjaGF0IHNlcnZpY2UgaW5zdGFuY2Ugd2lsbCB0aGVuIGJlIHN0b3JlZCBpbiB0aGUgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSB3aXRoIHByb3ZpZGVkIEBpbnB1dCBpbnN0YW5jZUlkIGFzIGEga2V5XG4gICAqL1xuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xuICAgICAgY2FzZSAnUkVTVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLnJlc3RTZXJ2aWNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dFQlNPQ0tFVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLndlYnNvY2tldFNlcnZpY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZm91bmQgYSBDaGF0U2VydmljZSBpbXBsZW1lbnRhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBwcm90b2NvbDogJyR7dGhpcy5wcm90b2NvbH0nYCk7XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0Q2hhdEluc3RhbmNlSWQodGhpcy5pbnN0YW5jZUlkKTtcbiAgICB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2Uuc3RvcmVJbnN0YW5jZSh0aGlzLmluc3RhbmNlSWQsIHRoaXMuY2hhdFNlcnZpY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7IHJldHVybiB0aGlzLl9hY3Rpb25zOyB9XG5cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY2hhbmdlcyBpbiB0aGUgY2hhdCBjb21wb25lbnQuXG4gICAqIElmIHRoZSBjaGF0IHNlcnZpY2UgaXMgYSBXZWJTb2NrZXRDaGF0U2VydmljZSwgaXQgaGFuZGxlcyB0aGUgb3ZlcnJpZGUgb2YgdGhlIG1lc3NhZ2UgaGFuZGxlcnMgaWYgdGhleSBleGlzdC5cbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNoYXQgd2l0aCB0aGUgcHJvdmlkZWQgY2hhdCBtZXNzYWdlcyBpZiB0aGV5IGV4aXN0LCBvdGhlcndpc2UgbG9hZHMgdGhlIGRlZmF1bHQgY2hhdC5cbiAgICogSWYgdGhlIGNoYXQgaXMgaW5pdGlhbGl6ZWQsIHRoZSBpbml0aWFsaXphdGlvbiBldmVudCBpcyBcIlF1ZXJ5XCIsIHRoZSBxdWVyeSBjaGFuZ2VzLCBhbmQgdGhlIHF1ZXJ5Q2hhbmdlU2hvdWxkVHJpZ2dlclJlbG9hZCBmdW5jdGlvbiBpcyBwcm92aWRlZCxcbiAgICogdGhlbiB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgYnkgZGVmYXVsdC5cbiAgICogSXQgdGFrZXMgaW50byBhY2NvdW50IHRoZSBvbmdvaW5nIHN0cmVhbWluZyBwcm9jZXNzIGFuZCB0aGUgb25nb2luZyBzdG9wcGluZyBwcm9jZXNzIHRvIHRyaWdnZXIgdGhhdCBjb25kaXRpb25hbGx5IGRlZmluZSB0aGUgbG9naWNcbiAgICogb2YgdGhlIHJlbG9hZCA6XG4gICAqIC0gSWYgdGhlIGNoYXQgaXMgc3RyZWFtaW5nLCB0aGVuIHN0b3AgdGhlIGdlbmVyYXRpb24gYW5kIHdhaXQgZm9yIHRoZSBmZXRjaCB0byBjb21wbGV0ZSBiZWZvcmUgcmVsb2FkaW5nIHRoZSBjaGF0LlxuICAgKiAtIElmIHRoZSBjaGF0IGlzIHN0b3BwaW5nIHRoZSBnZW5lcmF0aW9uLCB0aGVuIHdhaXQgZm9yIHRoZSBmZXRjaCB0byBjb21wbGV0ZSBiZWZvcmUgcmVsb2FkaW5nIHRoZSBjaGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ2hhbmdlcygpIHtcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzJC52YWx1ZTtcbiAgICAvLyBJZiB0aGUgY2hhdCBzZXJ2aWNlIGlzIGEgV2ViU29ja2V0Q2hhdFNlcnZpY2UsIGhhbmRsZSB0aGUgb3ZlcnJpZGUgb2YgdGhlIG1lc3NhZ2UgaGFuZGxlcnMgaWYgZXhpc3RzXG4gICAgaWYgKGNoYW5nZXM/Lm1lc3NhZ2VIYW5kbGVycyAmJiB0aGlzLm1lc3NhZ2VIYW5kbGVycyAmJiB0aGlzLmNoYXRTZXJ2aWNlIGluc3RhbmNlb2YgV2ViU29ja2V0Q2hhdFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2Uub3ZlcnJpZGVNZXNzYWdlSGFuZGxlcnModGhpcy5tZXNzYWdlSGFuZGxlcnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHdpdGggdGhlIHByb3ZpZGVkIGNoYXQgbWVzc2FnZXMgaWYgZXhpc3RzLCBvdGhlcndpc2UgbG9hZCB0aGUgZGVmYXVsdCBjaGF0XG4gICAgICogT25jZSB0aGUgY2hhdCBpcyBpbml0aWFsaXplZCAoZmlyc3RDaGFuZ2VzSGFuZGxlZCBpcyB0cnVlKSwgYWxsb3cgb3BlbmluZyB0aGUgY2hhdCB3aXRoIHRoZSBuZXcgcHJvdmlkZWQgbWVzc2FnZXMgKGlmIGV4aXN0cylcbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuZmlyc3RDaGFuZ2VzSGFuZGxlZCB8fCBjaGFuZ2VzPy5jaGF0KSB7XG4gICAgICBjb25zdCBvcGVuQ2hhdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXMkLnZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5saXN0U2F2ZWRDaGF0KCk7IC8vIFJlZnJlc2ggdGhlIGxpc3Qgb2Ygc2F2ZWQgY2hhdHNcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5DaGF0KHRoaXMuY2hhdCEubWVzc2FnZXMpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVDaGF0SWQoKTtcbiAgICAgIGlmICh0aGlzLmNoYXQpIHtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ25ldy1jaGF0Jywgeydjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlKSwnY2hhdC1pbml0JzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0KX0pO1xuICAgICAgICBvcGVuQ2hhdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ25ldy1jaGF0Jywgeydjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlKX0pO1xuICAgICAgICB0aGlzLmxvYWREZWZhdWx0Q2hhdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgY2hhdCBpcyBpbml0aWFsaXplZCwgdGhlIGluaXRpYWxpemF0aW9uIGV2ZW50IGlzIFwiUXVlcnlcIiwgdGhlIHF1ZXJ5IGNoYW5nZXMgYW5kIHRoZSBxdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQgZnVuY3Rpb24gaXMgcHJvdmlkZWQsXG4gICAgICogdGhlbiB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZVxuICAgICAqIE90aGVyd2lzZSwgdGhlIGNoYXQgc2hvdWxkIGJlIHJlbG9hZGVkIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBpZiAodGhpcy5maXJzdENoYW5nZXNIYW5kbGVkICYmIGNoYW5nZXM/LnF1ZXJ5ICYmIHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5ldmVudCA9PT0gJ1F1ZXJ5Jykge1xuICAgICAgaWYgKHRoaXMucXVlcnlDaGFuZ2VTaG91bGRUcmlnZ2VyUmVsb2FkID8gdGhpcy5xdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQodGhpcy5fcHJldmlvdXNRdWVyeSwgdGhpcy5xdWVyeSkgOiB0cnVlKSB7XG4gICAgICAgIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJC52YWx1ZSkge1xuICAgICAgICAgIGlmICghdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBzdWJzY3JpcHRpb24gdG8gd2FpdCBmb3IgYm90aCBzdHJlYW1pbmckIGFuZCBzdG9wcGluZ0dlbmVyYXRpb24kIHRvIGJlIGZhbHNlXG4gICAgICAgICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLFxuICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiRcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgZmlsdGVyKChbc3RyZWFtaW5nLCBzdG9wcGluZ10pID0+ICFzdHJlYW1pbmcgJiYgIXN0b3BwaW5nKSwgLy8gV2FpdCB1bnRpbCBib3RoIGFyZSBmYWxzZVxuICAgICAgICAgICAgICB0YWtlKDEpIC8vIENvbXBsZXRlIGFmdGVyIHRoZSBmaXJzdCBtYXRjaFxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSByZWxvYWQgYWZ0ZXIgdGhlIHF1ZXJ5IGNoYW5nZVxuICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUmVsb2FkQWZ0ZXJRdWVyeUNoYW5nZSgpO1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgX3ByZXZpb3VzUXVlcnkgd2l0aCB0aGUgY3VycmVudCBxdWVyeVxuICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1F1ZXJ5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KSk7XG4gICAgICAgICAgICAgIC8vIENsZWFuIHVwIHN1YnNjcmlwdGlvbiBhbmQgcmVzZXQgaXRzIHZhbHVlXG4gICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJC52YWx1ZSkge1xuICAgICAgICAgIGlmICghdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLnN0b3BHZW5lcmF0aW9uKClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb24gYW5kIHJlc2V0IGl0cyB2YWx1ZVxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG9uZ29pbmcgZmV0Y2ggdG8gY29tcGxldGUsIHRoZW4gdHJpZ2dlciB0aGUgcmVsb2FkXG4gICAgICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnBpcGUoXG4gICAgICAgICAgICAgICAgICBmaWx0ZXIoKHN0cmVhbWluZykgPT4gIXN0cmVhbWluZyksXG4gICAgICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgcmVsb2FkIGFmdGVyIHRoZSBxdWVyeSBjaGFuZ2VcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJSZWxvYWRBZnRlclF1ZXJ5Q2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgX3ByZXZpb3VzUXVlcnkgd2l0aCB0aGUgY3VycmVudCBxdWVyeVxuICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNRdWVyeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkpO1xuICAgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgc3Vic2NyaXB0aW9uIGFuZCByZXNldCBpdHMgdmFsdWVcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbiEudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHJlbG9hZCBhZnRlciB0aGUgcXVlcnkgY2hhbmdlXG4gICAgICAgICAgdGhpcy5fdHJpZ2dlclJlbG9hZEFmdGVyUXVlcnlDaGFuZ2UoKTtcbiAgICAgICAgICAvLyBVcGRhdGUgX3ByZXZpb3VzUXVlcnkgd2l0aCB0aGUgY3VycmVudCBxdWVyeVxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzUXVlcnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucXVlcnkpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIF9wcmV2aW91c1F1ZXJ5IHdpdGggdGhlIGN1cnJlbnQgcXVlcnlcbiAgICAgICAgdGhpcy5fcHJldmlvdXNRdWVyeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIHJlbG9hZCBhZnRlciB0aGUgcXVlcnkgY2hhbmdlLlxuICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbnMgdG8gcmVsb2FkIHRoZSBjaGF0IGFmdGVyIGEgcXVlcnkgY2hhbmdlLlxuICAgKiBJdCBzZXRzIHRoZSBzeXN0ZW0gYW5kIHVzZXIgbWVzc2FnZXMsIHJlc2V0cyB0aGUgc2F2ZWRDaGF0SWQsIGdlbmVyYXRlcyBhIG5ldyBjaGF0SWQsXG4gICAqIGdlbmVyYXRlcyBhIG5ldyBjaGF0IGF1ZGl0IGV2ZW50LCBhbmQgaGFuZGxlcyB0aGUgcXVlcnkgbW9kZS5cbiAgICovXG4gIHByaXZhdGUgX3RyaWdnZXJSZWxvYWRBZnRlclF1ZXJ5Q2hhbmdlKCkge1xuICAgIGNvbnN0IHN5c3RlbU1zZyA9IHtyb2xlOiAnc3lzdGVtJywgY29udGVudDogdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zeXN0ZW1Qcm9tcHQsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogZmFsc2V9fTtcbiAgICBjb25zdCB1c2VyTXNnID0ge3JvbGU6ICd1c2VyJywgY29udGVudDogQ2hhdFNlcnZpY2UuZm9ybWF0UHJvbXB0KHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMudXNlclByb21wdCwge3ByaW5jaXBhbDogdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbH0pLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5kaXNwbGF5VXNlclByb21wdH19O1xuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0U2F2ZWRDaGF0SWQodW5kZWZpbmVkKTsgLy8gUmVzZXQgdGhlIHNhdmVkQ2hhdElkXG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUNoYXRJZCgpOyAvLyBHZW5lcmF0ZSBhIG5ldyBjaGF0SWRcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbmV3LWNoYXQnLCB7J2NvbmZpZ3VyYXRpb24nOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUpfSk7IC8vIEdlbmVyYXRlIGEgbmV3IGNoYXQgYXVkaXQgZXZlbnRcbiAgICB0aGlzLl9oYW5kbGVRdWVyeU1vZGUoc3lzdGVtTXNnLCB1c2VyTXNnKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzY3JvbGwgbGlzdGVuZXIgdG8gdGhlIG1lc3NhZ2UgbGlzdCBlbGVtZW50LlxuICAgKiBUaGUgbGlzdGVuZXIgaXMgdHJpZ2dlcmVkIHdoZW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzIG9jY3VyOlxuICAgKiAtIExvYWRpbmcgc3RhdGUgY2hhbmdlc1xuICAgKiAtIE1lc3NhZ2VzIGNoYW5nZVxuICAgKiAtIFN0cmVhbWluZyBzdGF0ZSBjaGFuZ2VzXG4gICAqIC0gU2Nyb2xsIGV2ZW50IG9jY3VycyBvbiB0aGUgbWVzc2FnZSBsaXN0IGVsZW1lbnRcbiAgICpcbiAgICogV2hlbiB0aGUgbGlzdGVuZXIgaXMgdHJpZ2dlcmVkLCBpdCB1cGRhdGVzIHRoZSBgaXNBdEJvdHRvbWAgcHJvcGVydHkuXG4gICAqL1xuICBwcml2YXRlIF9hZGRTY3JvbGxMaXN0ZW5lcigpIHtcbiAgICB0aGlzLl9zdWIuYWRkKFxuICAgICAgbWVyZ2UodGhpcy5sb2FkaW5nJCwgdGhpcy5tZXNzYWdlcyQsIHRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCwgZnJvbUV2ZW50KHRoaXMubWVzc2FnZUxpc3QhLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0F0Qm90dG9tID0gdGhpcy5fdG9nZ2xlU2Nyb2xsQnV0dG9uVmlzaWJpbGl0eSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb2RlbCBkZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgZGVmYXVsdFZhbHVlcyBzZXJ2aWNlX2lkIGFuZCBtb2RlbF9pZFxuICAgKi9cbiAgdXBkYXRlTW9kZWxEZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLm1vZGVsRGVzY3JpcHRpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLmdldE1vZGVsKHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCwgdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgYSBxdWVzdGlvbiBmcm9tIHRoZSB1c2VyLlxuICAgKiBJZiB0aGUgdXNlciBpcyBlZGl0aW5nIGEgcHJldmlvdXMgbWVzc2FnZSwgcmVtb3ZlcyBhbGwgc3Vic2VxdWVudCBtZXNzYWdlcyBmcm9tIHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqIFRyaWdnZXJzIHRoZSBmZXRjaCBvZiB0aGUgYW5zd2VyIGZvciB0aGUgc3VibWl0dGVkIHF1ZXN0aW9uIGJ5IGNhbGxpbmcgX2ZldGNoQW5zd2VyKCkuXG4gICAqIENsZWFycyB0aGUgaW5wdXQgdmFsdWUgaW4gdGhlIFVJLlxuICAgKiDimqDvuI8gSWYgdGhlIGNoYXQgaXMgc3RyZWFtaW5nIG9yIHN0b3BwaW5nIHRoZSBnZW5lcmF0aW9uLCB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkLlxuICAgKi9cbiAgc3VibWl0UXVlc3Rpb24oKSB7XG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnZhbHVlIHx8ICEhdGhpcy5jaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKHRoaXMucXVlc3Rpb24udHJpbSgpICYmIHRoaXMubWVzc2FnZXMkLnZhbHVlICYmIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkpIHtcbiAgICAgIC8vIFdoZW4gdGhlIHVzZXIgc3VibWl0cyBhIHF1ZXN0aW9uLCBpZiB0aGUgdXNlciBpcyBlZGl0aW5nIGEgcHJldmlvdXMgbWVzc2FnZSwgcmVtb3ZlIGFsbCBzdWJzZXF1ZW50IG1lc3NhZ2VzIGZyb20gdGhlIGNoYXQgaGlzdG9yeVxuICAgICAgaWYgKHRoaXMubWVzc2FnZVRvRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbWVzc2FnZXMgaW4gdGhlIFVJXG4gICAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQodGhpcy5tZXNzYWdlcyQudmFsdWUuc2xpY2UoMCwgdGhpcy5tZXNzYWdlVG9FZGl0KSk7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcmF3IG1lc3NhZ2VzIGluIHRoZSBjaGF0IGhpc3Rvcnkgd2hpY2ggaXMgdGhlIGNsZWFuIHZlcnNpb24gdXNlZCB0byBtYWtlIHRoZSBuZXh0IHJlcXVlc3RcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3Rvcnkuc2xpY2UoMCwgdGhpcy5yZW1hcHBlZE1lc3NhZ2VUb0VkaXQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVtYXBwZWRNZXNzYWdlVG9FZGl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIHRoZSBzZWFyY2ggd2FybmluZyBtZXNzYWdlIGlmIGV4aXN0c1xuICAgICAgaWYgKHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkuYXQoLTEpPy5yb2xlID09PSAnc2VhcmNoLXdhcm5pbmcnKSB7XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkucG9wKCk7XG4gICAgICB9XG4gICAgICAvLyBGZXRjaCB0aGUgYW5zd2VyXG4gICAgICB0aGlzLl9mZXRjaEFuc3dlcih0aGlzLnF1ZXN0aW9uLnRyaW0oKSwgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSk7XG4gICAgICAvLyBDbGVhciB0aGUgaW5wdXQgdmFsdWUgaW4gdGhlIFVJXG4gICAgICB0aGlzLnF1ZXN0aW9uSW5wdXQhLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMucXVlc3Rpb25JbnB1dCEubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgYXV0b2A7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBmZXRjaCBvZiB0aGUgYW5zd2VyIGZvciB0aGUgZ2l2ZW4gcXVlc3Rpb24gYW5kIHVwZGF0ZXMgdGhlIGNvbnZlcnNhdGlvbi5cbiAgICogR2VuZXJhdGVzIGFuIGF1ZGl0IGV2ZW50IGZvciB0aGUgdXNlciBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIHF1ZXN0aW9uIGFza2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gY29udmVyc2F0aW9uIC0gVGhlIGN1cnJlbnQgY29udmVyc2F0aW9uIG1lc3NhZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmV0Y2hBbnN3ZXIocXVlc3Rpb246IHN0cmluZywgY29udmVyc2F0aW9uOiBDaGF0TWVzc2FnZVtdKSB7XG4gICAgY29uc3QgdXNlck1zZyA9IHtyb2xlOiAndXNlcicsIGNvbnRlbnQ6IHF1ZXN0aW9uLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWUsIGlzVXNlcklucHV0OiB0cnVlLCBhZGRpdGlvbmFsV29ya2Zsb3dQcm9wZXJ0aWVzOiB0aGlzLmNvbmZpZy5hZGRpdGlvbmFsV29ya2Zsb3dQcm9wZXJ0aWVzfX07XG4gICAgY29uc3QgbWVzc2FnZXMgPSBbLi4uY29udmVyc2F0aW9uLCB1c2VyTXNnXTtcbiAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmZldGNoKG1lc3NhZ2VzKTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHsuLi50aGlzLl9kZWZpbmVNZXNzYWdlQXVkaXREZXRhaWxzKHVzZXJNc2csIG1lc3NhZ2VzLmxlbmd0aCAtIDEpLCAncXVlcnknOiBKU09OLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KSwgJ2lzLXVzZXItaW5wdXQnOiB0cnVlLCAnZW5hYmxlZC1mdW5jdGlvbnMnOiB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKS5tYXAoZnVuYyA9PiBmdW5jLm5hbWUpLCAnYWRkaXRpb25hbC13b3JrZmxvdy1wcm9wZXJ0aWVzJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllcyl9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBlbmRpbmcgb24gdGhlIGNvbm5lY3Rpb24ncyBzdGF0ZSA6XG4gICAqICAtIElmIGNvbm5lY3RlZCA9PiBnaXZlbiBhIGxpc3Qgb2YgbWVzc2FnZXMsIHRoZSBjaGF0IGVuZHBvaW50IGlzIGludm9rZWQgZm9yIGEgY29udGludWF0aW9uIGFuZCB1cGRhdGVzIHRoZSBsaXN0IG9mIG1lc3NhZ2VzIGFjY29yZGluZ2x5LlxuICAgKiAgLSBJZiBhbnkgb3RoZXIgc3RhdGUgPT4gYSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoZSBjaGF0LlxuICAgKiDimqDvuI8gSWYgdGhlIGFzc2lzdGFudCBpcyBzdHJlYW1pbmcgb3Igc3RvcHBpbmcgdGhlIGdlbmVyYXRpb24sIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQuXG4gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbGlzdCBvZiBtZXNzYWdlcyB0byBpbnZva2UgdGhlIGNoYXQgZW5kcG9pbnQgd2l0aFxuICAgKi9cbiAgcHVibGljIGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSB7XG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnZhbHVlIHx8ICEhdGhpcy5jaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5fZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX2RhdGFTdWJzY3JpcHRpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLmZldGNoKG1lc3NhZ2VzLCB0aGlzLnF1ZXJ5KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiByZXMgPT4gdGhpcy51cGRhdGVEYXRhKHJlcy5oaXN0b3J5KSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXR1cygpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7cm9sZTogJ2Nvbm5lY3Rpb24tZXJyb3InLCBjb250ZW50OiB0aGlzLmNvbmZpZy5jb25uZWN0aW9uU2V0dGluZ3MuY29ubmVjdGlvbkVycm9yTWVzc2FnZSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0cnVlfX07XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQoWy4uLm1lc3NhZ2VzLCBtZXNzYWdlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IG1lc3NhZ2UgaWYgaXQncyBhbiBlbXB0eSBtZXNzYWdlXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGR1ZSB0byB0aGUgbWFubmVyIGluIHdoaWNoIHRoZSBjaGF0IHNlcnZpY2UgaGFuZGxlcyBjb25zZWN1dGl2ZSBtZXNzYWdlc1xuICAgICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzJC52YWx1ZT8uYXQoLTEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNFbXB0eUFzc2lzdGFudE1lc3NhZ2UobGFzdE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQodGhpcy5tZXNzYWdlcyQudmFsdWU/LnNsaWNlKDAsIC0xKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtyb2xlOiAnY29ubmVjdGlvbi1lcnJvcicsIGNvbnRlbnQ6IHRoaXMuY29uZmlnLmNvbm5lY3Rpb25TZXR0aW5ncy5jb25uZWN0aW9uRXJyb3JNZXNzYWdlLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fTtcbiAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQoWy4uLm1lc3NhZ2VzLCBtZXNzYWdlXSk7XG4gICAgfVxuXG4gICAgaWYodGhpcy5hdXRvbWF0aWNTY3JvbGxUb0xhc3RSZXNwb25zZSkge1xuICAgICAgdGhpcy5zY3JvbGxEb3duKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJ5IHRvIGZldGNoIHRoZSBtZXNzYWdlcyBpZiB0aGUgY29ubmVjdGlvbiBpc3N1ZXMuXG4gICAqICAtIElmIHJlY29ubmVjdGluZyA9PiBrZWVwIGRpc3BsYXkgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZSBldmVuIHdoZW4gY2xpY2tpbmcgb24gdGhlIFwicmV0cnlcIiBidXR0b24gYW5kIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiByZXRyaWFsIGF0dGVtcHRzLCB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyByZS1lc3RhYmxpc2hlZFxuICAgKiAgLSBJZiBkaXNjb25uZWN0ZWQgPT4gT24gY2xpY2sgb24gdGhlIFwicmV0cnlcIiBidXR0b24sIHN0YXJ0IHRoZSBjb25uZWN0aW9uIHByb2Nlc3Mgd2hpbGUgZGlzcGxheWluZyB0aGUgY29ubmVjdGlvbiBlcnJvciBtZXNzYWdlIDpcbiAgICogICAgICAqIElmIHN1Y2Nlc3NmdWwgPT4gZ2l2ZW4gYSBsaXN0IG9mIG1lc3NhZ2VzLCB0aGUgY2hhdCBlbmRwb2ludCBpcyBpbnZva2VkIGZvciBhIGNvbnRpbnVhdGlvbiBhbmQgdXBkYXRlcyB0aGUgbGlzdCBvZiBtZXNzYWdlcyBhY2NvcmRpbmdseS5cbiAgICogICAgICAqIElmIGZhaWxlZCA9PiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHJldHJpYWwgYXR0ZW1wdHNcbiAgICovXG4gIHJldHJ5RmV0Y2goKSB7XG4gICAgaWYodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSB7XG4gICAgICAvLyBBIG9uZS10aW1lIGxpc3RlbmVyIGZvciByZWNvbm5lY3RlZCBldmVudFxuICAgICAgY29uc3Qgb25SZWNvbm5lY3RlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIEdldCB0aGUgbWVzc2FnZXMgd2l0aG91dCB0aGUgbGFzdCBvbmUgKHRoZSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2UpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcyQudmFsdWUhLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBcInVzZXJcIiBtZXNzYWdlIGluIHRoZSBtZXNzYWdlcyBsaXN0XG4gICAgICAgIGxldCBpbmRleCA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChpbmRleCA+PSAwICYmIG1lc3NhZ2VzW2luZGV4XS5yb2xlICE9PSAndXNlcicpIHtcbiAgICAgICAgICBpbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGEgdXNlciBtZXNzYWdlIGlzIGZvdW5kIChhbmQgaXQgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSksIHJlbW92ZSBhbGwgc3Vic2VxdWVudCBtZXNzYWdlcyBmcm9tIHRoZSBjaGF0IGhpc3RvcnlcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtZXNzYWdlcyBpbiB0aGUgVUlcbiAgICAgICAgLy8gYW5kIGZldGNoIHRoZSBhbnN3ZXIgZnJvbSB0aGUgYXNzaXN0YW50XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlcyQubmV4dCh0aGlzLm1lc3NhZ2VzJC52YWx1ZSEuc2xpY2UoMCwgaW5kZXgrMSkpO1xuICAgICAgICAgIGNvbnN0IHJlbWFwcGVkSW5kZXggPSB0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShpbmRleCk7XG4gICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhLnNsaWNlKDAsIHJlbWFwcGVkSW5kZXgrMSk7XG4gICAgICAgICAgdGhpcy5mZXRjaCh0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJldHJpYWxBdHRlbXB0cyA9IHVuZGVmaW5lZDsgLy8gUmVzZXQgdGhlIG51bWJlciBvZiByZXRyaWFsIGF0dGVtcHRzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUbyByZW1vdmUgdGhlIGhhbmRsZXIgZm9yIG9ucmVjb25uZWN0ZWQoKSBhZnRlciBpdCdzIGJlZW4gcmVnaXN0ZXJlZCxjYW5ub3QgZGlyZWN0bHkgdXNlIG9mZigpIGxpa2UgeW91IHdvdWxkIGZvciBub3JtYWwgZXZlbnRzIHJlZ2lzdGVyZWQgd2l0aCBjb25uZWN0aW9uLm9uKCkuXG4gICAgICAgICAqIEluc3RlYWQsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVtb3ZlIG9yIHJlc2V0IHRoZSBoYW5kbGVyIGJ5IGFzc2lnbmluZyBpdCB0byBudWxsIG9yIGFuIGVtcHR5IGZ1bmN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICAodGhpcy5jaGF0U2VydmljZSBhcyBXZWJTb2NrZXRDaGF0U2VydmljZSkuY29ubmVjdGlvbiEub25yZWNvbm5lY3RlZCgoKSA9PiB7fSk7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBmbGFnIHRvIGVuc3VyZSB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGFnYWluIHdoZW4gbmVlZGVkXG4gICAgICAgIHRoaXMuX2lzUmVjb25uZWN0ZWRMaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgY29ubmVjdGlvbidzIHN0YXRlLCB0YWtlIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25cbiAgICAgIHN3aXRjaCAodGhpcy5jaGF0U2VydmljZS5jb25uZWN0aW9uIS5zdGF0ZSkge1xuICAgICAgICBjYXNlIEh1YkNvbm5lY3Rpb25TdGF0ZS5Db25uZWN0ZWQ6XG4gICAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgcmUtZXN0YWJsaXNoZWQgaW4gdGhlIG1lYW50aW1lLCBmZXRjaCB0aGUgbWVzc2FnZXNcbiAgICAgICAgICBvblJlY29ubmVjdGVkSGFuZGxlcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEh1YkNvbm5lY3Rpb25TdGF0ZS5SZWNvbm5lY3Rpbmc6XG4gICAgICAgICAgLy8gQXR0YWNoIHRoZSByZWNvbm5lY3RlZCBsaXN0ZW5lciBpZiBub3QgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICAgICAgaWYgKCF0aGlzLl9pc1JlY29ubmVjdGVkTGlzdGVuZXJSZWdpc3RlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmNvbm5lY3Rpb24hLm9ucmVjb25uZWN0ZWQob25SZWNvbm5lY3RlZEhhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5faXNSZWNvbm5lY3RlZExpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEluY3JlYXNlIHRoZSBudW1iZXIgb2YgcmV0cmlhbCBhdHRlbXB0c1xuICAgICAgICAgIHRoaXMucmV0cmlhbEF0dGVtcHRzID0gdGhpcy5yZXRyaWFsQXR0ZW1wdHMgPyB0aGlzLnJldHJpYWxBdHRlbXB0cysxIDogMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBIdWJDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGVkOlxuICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgY29ubmVjdGlvblxuICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2Uuc3RhcnRDb25uZWN0aW9uKClcbiAgICAgICAgICAudGhlbigoKSA9PiBvblJlY29ubmVjdGVkSGFuZGxlcigpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB7IC8vIElmIHRoZSBjb25uZWN0aW9uIGZhaWxzLCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHJldHJpYWwgYXR0ZW1wdHNcbiAgICAgICAgICAgIHRoaXMucmV0cmlhbEF0dGVtcHRzID0gdGhpcy5yZXRyaWFsQXR0ZW1wdHMgPyB0aGlzLnJldHJpYWxBdHRlbXB0cysxIDogMTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNpZ25hbFIgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQuXG4gICAqIEZvciB0aGUgUkVTVCBwcm90b2NvbCwgdGhlIGNvbm5lY3Rpb24gaXMgYWx3YXlzIGNvbnNpZGVyZWQgY29ubmVjdGVkIChmb3IgdGhlIG1vbWVudCkuXG4gICAqL1xuICBwcml2YXRlIF91cGRhdGVDb25uZWN0aW9uU3RhdHVzKCkge1xuICAgIHRoaXMuaXNDb25uZWN0ZWQgPSAodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSA/IHRoaXMuY2hhdFNlcnZpY2UuY29ubmVjdGlvbiEuc3RhdGUgPT09IEh1YkNvbm5lY3Rpb25TdGF0ZS5Db25uZWN0ZWQgOiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgVUkgd2l0aCB0aGUgbmV3IG1lc3NhZ2VzXG4gICAqIEBwYXJhbSBtZXNzYWdlc1xuICAgKi9cbiAgdXBkYXRlRGF0YShtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSkge1xuICAgIHRoaXMubWVzc2FnZXMkLm5leHQobWVzc2FnZXMpO1xuICAgIHRoaXMuZGF0YS5lbWl0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMucXVlc3Rpb24gPSAnJztcbiAgICBpZih0aGlzLmF1dG9tYXRpY1Njcm9sbFRvTGFzdFJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnNjcm9sbERvd24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhdCBkaXNjdXNzaW9uIGlzIHNjcm9sbGVkIGRvd24gdG8gdGhlIGJvdHRvbSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIF90b2dnbGVTY3JvbGxCdXR0b25WaXNpYmlsaXR5KCk6IGJvb2xlYW4ge1xuICAgIGlmKHRoaXMubWVzc2FnZUxpc3Q/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMubWVzc2FnZUxpc3Q/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5tZXNzYWdlTGlzdD8ubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLSAxKSA8PSB0aGlzLm1lc3NhZ2VMaXN0Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgY2hhdCBkaXNjdXNzaW9uXG4gICAqL1xuICBzY3JvbGxEb3duKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYodGhpcy5tZXNzYWdlTGlzdD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5tZXNzYWdlTGlzdC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIG5ldyBjaGF0IHdpdGggdGhlIGRlZmF1bHRWYWx1ZXMgc2V0dGluZ3MuXG4gICAqIFRoZSBzYXZlZENoYXRJZCBpbiB0aGUgY2hhdCBzZXJ2aWNlIHdpbGwgYmUgcmVzZXQsIHNvIHRoYXQgdGhlIHVwY29taW5nIHNhdmVkIGNoYXQgb3BlcmF0aW9ucyB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgZnJlc2ggbmV3IGNoYXQuXG4gICAqIElmIHRoZSBzYXZlZENoYXQgZmVhdHVyZSBpcyBlbmFibGVkLCB0aGUgbGlzdCBvZiBzYXZlZCBjaGF0cyB3aWxsIGJlIHJlZnJlc2hlZC5cbiAgICog4pqg77iPIElmIHRoZSBhc3Npc3RhbnQgaXMgc3RyZWFtaW5nIG9yIHN0b3BwaW5nIHRoZSBnZW5lcmF0aW9uLCB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkLlxuICAgKi9cbiAgbmV3Q2hhdCgpIHtcbiAgICBpZiAoISF0aGlzLmNoYXRTZXJ2aWNlLnN0cmVhbWluZyQudmFsdWUgfHwgISF0aGlzLmNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiQudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGF0U2VydmljZS5zZXRTYXZlZENoYXRJZCh1bmRlZmluZWQpOyAvLyBSZXNldCB0aGUgc2F2ZWRDaGF0SWRcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQ2hhdElkKCk7IC8vIEdlbmVyYXRlIGEgbmV3IGNoYXRJZFxuICAgIHRoaXMuY2hhdFNlcnZpY2UubGlzdFNhdmVkQ2hhdCgpOyAvLyBSZWZyZXNoIHRoZSBsaXN0IG9mIHNhdmVkIGNoYXRzXG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ25ldy1jaGF0Jywgeydjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlKX0pOyAvLyBHZW5lcmF0ZSBhIG5ldyBjaGF0IGF1ZGl0IGV2ZW50XG4gICAgdGhpcy5sb2FkRGVmYXVsdENoYXQoKTsgLy8gU3RhcnQgYSBuZXcgY2hhdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgSURzIHRvIHRoZSBhc3Npc3RhbnQuXG4gICAqIElmIG5vIGRvY3VtZW50IElEcyBhcmUgcHJvdmlkZWQsIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQuXG4gICAqIElmIHRoZSBhY3Rpb24gZm9yIGF0dGFjaGluZyBhIGRvY3VtZW50IGlzIG5vdCBkZWZpbmVkIGF0IHRoZSBhcHBsaWNhdGlvbiBjdXN0b21pemF0aW9uIGxldmVsLCBhbiBlcnJvciBpcyBsb2dnZWQuXG4gICAqIOKaoO+4jyBJZiB0aGUgYXNzaXN0YW50IGlzIHN0cmVhbWluZyBvciBzdG9wcGluZyB0aGUgZ2VuZXJhdGlvbiwgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZC5cbiAgICogQHBhcmFtIGlkcyAtIEFuIGFycmF5IG9mIGRvY3VtZW50IElEcyB0byBhdHRhY2guXG4gICAqL1xuICBhdHRhY2hUb0NoYXQoaWRzOiBzdHJpbmdbXSkge1xuICAgIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJC52YWx1ZSB8fCAhIXRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJC52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlkcyB8fCBpZHM/Lmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXR0YWNoRG9jQWN0aW9uID0gdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmFjdGlvbnM/LltcImF0dGFjaERvY0FjdGlvblwiXTtcbiAgICBpZiAoIWF0dGFjaERvY0FjdGlvbikge1xuICAgICAgY29uc29sZS5lcnJvcihgTm8gYWN0aW9uIGlzIGRlZmluZWQgZm9yIGF0dGFjaGluZyBhIGRvY3VtZW50IHRvIHRoZSBhc3Npc3RhbnQgXCIke3RoaXMuaW5zdGFuY2VJZH1cImApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1c2VyTXNnID0geyByb2xlOiAndXNlcicsIGNvbnRlbnQ6ICcnLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IGZhbHNlLCBpc1VzZXJJbnB1dDogZmFsc2UsIHR5cGU6IFwiQWN0aW9uXCIsIGZvcmNlZFdvcmtmbG93OiBhdHRhY2hEb2NBY3Rpb24uZm9yY2VkV29ya2Zsb3csIGZvcmNlZFdvcmtmbG93UHJvcGVydGllczogey4uLihhdHRhY2hEb2NBY3Rpb24uZm9yY2VkV29ya2Zsb3dQcm9wZXJ0aWVzIHx8IHt9KSwgaWRzfSwgYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllczogdGhpcy5jb25maWcuYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllc319O1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gWy4uLnRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhLCB1c2VyTXNnXTtcbiAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmZldGNoKG1lc3NhZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgZGVmYXVsdCBjaGF0IHdpdGggdGhlIGRlZmF1bHRWYWx1ZXMgc2V0dGluZ3NcbiAgICogSWYgdGhlIGNoYXQgaXMgbWVhbnQgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCBldmVudCA9PT0gXCJRdWVyeVwiLCB0aGUgY29ycmVzcG9uZGluZyB1c2VyIHF1ZXJ5IG1lc3NhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgY2hhdCBoaXN0b3J5XG4gICAqL1xuICBsb2FkRGVmYXVsdENoYXQoKSB7XG4gICAgLy8gRGVmaW5lIHRoZSBkZWZhdWx0IHN5c3RlbSBwcm9tcHQgYW5kIHVzZXIgcHJvbXB0IG1lc3NhZ2VzXG4gICAgY29uc3Qgc3lzdGVtTXNnID0ge3JvbGU6ICdzeXN0ZW0nLCBjb250ZW50OiB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLnN5c3RlbVByb21wdCwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiBmYWxzZX19O1xuICAgIGNvbnN0IHVzZXJNc2cgPSB7cm9sZTogJ3VzZXInLCBjb250ZW50OiBDaGF0U2VydmljZS5mb3JtYXRQcm9tcHQodGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy51c2VyUHJvbXB0LCB7cHJpbmNpcGFsOiB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsfSksIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmRpc3BsYXlVc2VyUHJvbXB0fX07XG5cbiAgICBpZiAodGhpcy5jb25maWcubW9kZVNldHRpbmdzLmluaXRpYWxpemF0aW9uLmV2ZW50ID09PSAnUXVlcnknKSB7XG4gICAgICB0aGlzLl9oYW5kbGVRdWVyeU1vZGUoc3lzdGVtTXNnLCB1c2VyTXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGFuZGxlUHJvbXB0TW9kZShzeXN0ZW1Nc2csIHVzZXJNc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBwcm9tcHQgbW9kZSBvZiB0aGUgY2hhdCBjb21wb25lbnQuXG4gICAqIElmIGBzZW5kVXNlclByb21wdGAgaXMgdHJ1ZSwgaXQgb3BlbnMgdGhlIGNoYXQgd2l0aCBib3RoIHN5c3RlbSBhbmQgdXNlciBtZXNzYWdlcyxcbiAgICogYW5kIGdlbmVyYXRlcyBhdWRpdCBldmVudHMgZm9yIGJvdGggbWVzc2FnZXMuXG4gICAqIElmIGBzZW5kVXNlclByb21wdGAgaXMgZmFsc2UsIGl0IG9wZW5zIHRoZSBjaGF0IHdpdGggb25seSB0aGUgc3lzdGVtIG1lc3NhZ2UsXG4gICAqIGFuZCBnZW5lcmF0ZXMgYW4gYXVkaXQgZXZlbnQgZm9yIHRoZSBzeXN0ZW0gbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHN5c3RlbU1zZyAtIFRoZSBzeXN0ZW0gbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNoYXQuXG4gICAqIEBwYXJhbSB1c2VyTXNnIC0gVGhlIHVzZXIgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNoYXQgKG9wdGlvbmFsKS5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVByb21wdE1vZGUoc3lzdGVtTXNnOiBDaGF0TWVzc2FnZSwgdXNlck1zZzogQ2hhdE1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5jb25maWcubW9kZVNldHRpbmdzLnNlbmRVc2VyUHJvbXB0KSB7XG4gICAgICB0aGlzLm9wZW5DaGF0KFtzeXN0ZW1Nc2csIHVzZXJNc2ddKTtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgdGhpcy5fZGVmaW5lTWVzc2FnZUF1ZGl0RGV0YWlscyhzeXN0ZW1Nc2csIDApKTtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgdGhpcy5fZGVmaW5lTWVzc2FnZUF1ZGl0RGV0YWlscyh1c2VyTXNnLCAxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkNoYXQoW3N5c3RlbU1zZ10pO1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ21lc3NhZ2UnLCB0aGlzLl9kZWZpbmVNZXNzYWdlQXVkaXREZXRhaWxzKHN5c3RlbU1zZywgMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBxdWVyeSBtb2RlIGJ5IGRpc3BsYXlpbmcgdGhlIHN5c3RlbSBtZXNzYWdlLCB1c2VyIG1lc3NhZ2UsIGFuZCB1c2VyIHF1ZXJ5IG1lc3NhZ2UuXG4gICAqIElmIHRoZSBwcm92aWRlZCBxdWVyeSB0ZXh0IGlzIG5vdCBlbXB0eSwgdGhlbiBhZGQgdGhlIHVzZXIgcXVlcnkgbWVzc2FnZSB0byB0aGUgY2hhdCBoaXN0b3J5IGFuZCBpbnZva2UgdGhlIGFzc2lzdGFudFxuICAgKiBPdGhlcndpc2UsIGp1c3Qgc3RhcnQgYSBuZXcgY2hhdCB3aXRoIGEgd2FybmluZyBtZXNzYWdlIGludml0aW5nIHRoZSB1c2VyIHRvIHBlcmZvcm0gYSBmdWxsIHRleHQgc2VhcmNoIHRvIHJldHJpZXZlIHNvbWUgcmVzdWx0c1xuICAgKiBAcGFyYW0gc3lzdGVtTXNnIC0gVGhlIHN5c3RlbSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAgICogQHBhcmFtIHVzZXJNc2cgLSBUaGUgdXNlciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVF1ZXJ5TW9kZShzeXN0ZW1Nc2c6IENoYXRNZXNzYWdlLCB1c2VyTXNnOiBDaGF0TWVzc2FnZSkge1xuICAgIGlmICghIXRoaXMucXVlcnkudGV4dCkge1xuICAgICAgY29uc3QgdXNlclF1ZXJ5TXNnID0ge3JvbGU6ICd1c2VyJywgY29udGVudDogdGhpcy5xdWVyeS50ZXh0LCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5kaXNwbGF5VXNlclF1ZXJ5LCBxdWVyeTogdGhpcy5xdWVyeSwgZm9yY2VkV29ya2Zsb3c6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5mb3JjZWRXb3JrZmxvdywgaXNVc2VySW5wdXQ6IHRydWUsIGFkZGl0aW9uYWxXb3JrZmxvd1Byb3BlcnRpZXM6IHRoaXMuY29uZmlnLmFkZGl0aW9uYWxXb3JrZmxvd1Byb3BlcnRpZXN9fTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3Muc2VuZFVzZXJQcm9tcHQpIHtcbiAgICAgICAgdGhpcy5vcGVuQ2hhdChbc3lzdGVtTXNnLCB1c2VyTXNnLCB1c2VyUXVlcnlNc2ddKTtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ21lc3NhZ2UnLCB0aGlzLl9kZWZpbmVNZXNzYWdlQXVkaXREZXRhaWxzKHN5c3RlbU1zZywgMCkpO1xuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHRoaXMuX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHModXNlck1zZywgMSkpO1xuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHsuLi50aGlzLl9kZWZpbmVNZXNzYWdlQXVkaXREZXRhaWxzKHVzZXJRdWVyeU1zZywgMiksICdxdWVyeSc6IEpTT04uc3RyaW5naWZ5KHRoaXMucXVlcnkpICwnaXMtdXNlci1pbnB1dCc6IHRydWUsICdmb3JjZWQtd29ya2Zsb3cnOiB0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3MuaW5pdGlhbGl6YXRpb24uZm9yY2VkV29ya2Zsb3csICdlbmFibGVkLWZ1bmN0aW9ucyc6IHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zPy5maWx0ZXIoZnVuYyA9PiBmdW5jLmVuYWJsZWQpLm1hcChmdW5jID0+IGZ1bmMubmFtZSksICdhZGRpdGlvbmFsLXdvcmtmbG93LXByb3BlcnRpZXMnOkpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLmFkZGl0aW9uYWxXb3JrZmxvd1Byb3BlcnRpZXMpfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5DaGF0KFtzeXN0ZW1Nc2csIHVzZXJRdWVyeU1zZ10pO1xuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHRoaXMuX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHMoc3lzdGVtTXNnLCAwKSk7XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgey4uLnRoaXMuX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHModXNlclF1ZXJ5TXNnLCAxKSwgJ3F1ZXJ5JzogSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkgLCdpcy11c2VyLWlucHV0JzogdHJ1ZSwgJ2ZvcmNlZC13b3JrZmxvdyc6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5mb3JjZWRXb3JrZmxvdywgJ2VuYWJsZWQtZnVuY3Rpb25zJzogdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnM/LmZpbHRlcihmdW5jID0+IGZ1bmMuZW5hYmxlZCkubWFwKGZ1bmMgPT4gZnVuYy5uYW1lKSwgJ2FkZGl0aW9uYWwtd29ya2Zsb3ctcHJvcGVydGllcyc6IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLmFkZGl0aW9uYWxXb3JrZmxvd1Byb3BlcnRpZXMpfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdNc2cgPSB7cm9sZTogJ3NlYXJjaC13YXJuaW5nJywgY29udGVudDogdGhpcy5jb25maWcuZ2xvYmFsU2V0dGluZ3Muc2VhcmNoV2FybmluZ01lc3NhZ2UsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdHJ1ZX19O1xuICAgICAgdGhpcy5vcGVuQ2hhdChbc3lzdGVtTXNnLCB3YXJuaW5nTXNnXSk7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHRoaXMuX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHMod2FybmluZ01zZywgMCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHMobWVzc2FnZTogQ2hhdE1lc3NhZ2UsIHJhbms6IG51bWJlcik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICAnZHVyYXRpb24nOiAwLFxuICAgICAgJ3RleHQnOiBtZXNzYWdlLmNvbnRlbnQsXG4gICAgICAncm9sZSc6IG1lc3NhZ2Uucm9sZSxcbiAgICAgICdyYW5rJzogcmFua1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQvb3BlbiBhIG5ldyBjaGF0IHdpdGggdGhlIHByb3ZpZGVkIG1lc3NhZ2VzIGFuZCBjaGF0SWRcbiAgICogSWYgdGhlIGxhc3QgbWVzc2FnZSBpcyBmcm9tIHRoZSB1c2VyLCBhIHJlcXVlc3QgdG8gdGhlIGFzc2lzdGFudCBpcyBtYWRlIHRvIGdldCBhbiBhbnN3ZXJcbiAgICogSWYgdGhlIGxhc3QgbWVzc2FnZSBpcyBmcm9tIHRoZSBhc3Npc3RhbnQsIHRoZSBjb252ZXJzYXRpb24gaXMgbG9hZGVkIHJpZ2h0IGF3YXlcbiAgICogQHBhcmFtIG1lc3NhZ2VzIFRoZSBsaXN0IG9mIG1lc3NhZ2VzIG9mIHRoZSBjaGF0XG4gICAqIEBwYXJhbSBzYXZlZENoYXRJZCAgVGhlIGlkIG9mIHRoZSBzYXZlZCBjaGF0LiBJZiBwcm92aWRlZCAoaWUuIGFuIGV4aXN0aW5nIGRpc2N1c3Npb24gaW4gdGhlIHNhdmVkIGNoYXQgaW5kZXgpLCB1cGRhdGUgdGhlIHNhdmVkQ2hhdElkIGluIHRoZSBjaGF0IHNlcnZpY2UgZm9yIHRoZSB1cGNvbWluZyBzYXZlZCBjaGF0IG9wZXJhdGlvbnNcbiAgICovXG4gIG9wZW5DaGF0KG1lc3NhZ2VzOiBSYXdNZXNzYWdlW10sIHNhdmVkQ2hhdElkPzogc3RyaW5nKSB7XG4gICAgaWYgKCFtZXNzYWdlcyB8fCAhQXJyYXkuaXNBcnJheShtZXNzYWdlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gbG9hZCB0aGUgZGlzY3Vzc2lvbi4gSW52YWxpZCBtZXNzYWdlcyByZWNlaXZlZCA6JywgbWVzc2FnZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2F2ZWRDaGF0SWQpIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0U2F2ZWRDaGF0SWQoc2F2ZWRDaGF0SWQpO1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUNoYXRJZChzYXZlZENoYXRJZCk7XG4gICAgfVxuICAgIHRoaXMucmVzZXRDaGF0KCk7XG4gICAgdGhpcy5tZXNzYWdlcyQubmV4dChtZXNzYWdlcyk7XG4gICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IG1lc3NhZ2VzO1xuICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXMuYXQoLTEpO1xuICAgIGlmKGxhc3RNZXNzYWdlICYmIGxhc3RNZXNzYWdlLnJvbGUgPT09ICd1c2VyJykge1xuICAgICAgdGhpcy5mZXRjaChtZXNzYWdlcyk7IC8vIElmIHRoZSBsYXN0IG1lc3NhZ2UgaWYgZnJvbSBhIHVzZXIsIGFuIGFuc3dlciBmcm9tIHRoZSBhc3Npc3RhbnQgaXMgZXhwZWN0ZWRcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGEobWVzc2FnZXMpOyAvLyBJZiB0aGUgbGFzdCBtZXNzYWdlIGlmIGZyb20gdGhlIGFzc2lzdGFudCwgd2UgY2FuIGxvYWQgdGhlIGNvbnZlcnNhdGlvbiByaWdodCBhd2F5XG4gICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgfVxuICAgIHRoaXMuX2FkZFNjcm9sbExpc3RlbmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGNoYXQgYnkgY2xlYXJpbmcgdGhlIGNoYXQgaGlzdG9yeSBhbmQgdGhlIFVJIGFjY29yZGluZ2x5XG4gICAqIFRoZSB1c2VyIGlucHV0IHdpbGwgYmUgY2xlYXJlZFxuICAgKiBUaGUgZmV0Y2ggc3Vic2NyaXB0aW9uIHdpbGwgYmUgdGVybWluYXRlZFxuICAgKi9cbiAgcmVzZXRDaGF0KCkge1xuICAgIGlmKHRoaXMubWVzc2FnZXMkLnZhbHVlKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KHVuZGVmaW5lZCk7IC8vIFJlc2V0IGNoYXRcbiAgICB9XG4gICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IHVuZGVmaW5lZDsgLy8gUmVzZXQgY2hhdCBoaXN0b3J5XG4gICAgdGhpcy5xdWVzdGlvbiA9ICcnO1xuICAgIHRoaXMudGVybWluYXRlRmV0Y2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbmQgTG9hZCB0aGUgc2F2ZWQgY2hhdCBmcm9tIHRoZSBzYXZlZCBjaGF0IGluZGV4LlxuICAgKiBJZiB0aGUgc2F2ZWQgY2hhdCBpcyBmb3VuZCwgdGhlIGNoYXQgZGlzY3Vzc2lvbiB3aWxsIGJlIGxvYWRlZCB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlcyBhbmQgY2hhdElkXG4gICAqL1xuICBvbkxvYWRDaGF0KCkge1xuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLl9zdWIuYWRkKFxuICAgICAgdGhpcy5jaGF0U2VydmljZS5sb2FkU2F2ZWRDaGF0JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoc2F2ZWRDaGF0ID0+ICEhc2F2ZWRDaGF0KSxcbiAgICAgICAgICBzd2l0Y2hNYXAoc2F2ZWRDaGF0ID0+IHRoaXMuY2hhdFNlcnZpY2UuZ2V0U2F2ZWRDaGF0KHNhdmVkQ2hhdCEuaWQpKSxcbiAgICAgICAgICBmaWx0ZXIoc2F2ZWRDaGF0SGlzdG9yeSA9PiAhIXNhdmVkQ2hhdEhpc3RvcnkpLFxuICAgICAgICAgIHRhcChzYXZlZENoYXRIaXN0b3J5ID0+IHRoaXMub3BlbkNoYXQoc2F2ZWRDaGF0SGlzdG9yeSEuaGlzdG9yeSwgc2F2ZWRDaGF0SGlzdG9yeSEuaWQpKVxuICAgICAgICApLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBjdXJyZW50IGFzc2lzdGFudCdzIGFuc3dlci5cbiAgICogVGhlIGZldGNoIHN1YnNjcmlwdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gICAqL1xuICBzdG9wR2VuZXJhdGlvbigpIHtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0b3BHZW5lcmF0aW9uKCkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4gdGhpcy50ZXJtaW5hdGVGZXRjaCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXJtaW5hdGUgdGhlIGZldGNoIHByb2Nlc3MgYnkgdW5zdWJzY3JpYmluZyBmcm9tIHRoZSBkYXRhIHN1YnNjcmlwdGlvbiBhbmQgdXBkYXRpbmcgdGhlIGxvYWRpbmcgc3RhdHVzIHRvIGZhbHNlLlxuICAgKiBBZGRpdGlvbmFsbHksIGZvY3VzIG9uIHRoZSBjaGF0IGlucHV0IGlmIHRoZSBmb2N1c0FmdGVyUmVzcG9uc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIHRlcm1pbmF0ZUZldGNoKCkge1xuICAgIHRoaXMuX2RhdGFTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fZGF0YVN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGlmICh0aGlzLmZvY3VzQWZ0ZXJSZXNwb25zZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25JbnB1dD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSBwcmV2aW91cyB1c2VyIG1lc3NhZ2Ugb2YgdGhlIGNoYXQgaGlzdG9yeSB0byB0aGUgY2hhdCB1c2VyIGlucHV0LlxuICAgKiBUaHVzLCB0aGUgdXNlciBjYW4gZWRpdCBhbmQgcmVzdWJtaXQgdGhlIG1lc3NhZ2UuXG4gICAqIE9uY2UgdGhlIGVkaXRlZCBtZXNzYWdlIGlzIHN1Ym1pdHRlZCwgYWxsIHN1YnNlcXVlbnQgbWVzc2FnZXMgc3RhcnRpbmcgZnJvbSBAcGFyYW0gaW5kZXggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGhpc3RvcnkgYW5kIHRoZSBVSSB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuXG4gICAqIFRoZSBhc3Npc3RhbnQgd2lsbCByZWdlbmVyYXRlIGEgbmV3IGFuc3dlciBiYXNlZCBvbiB0aGUgdXBkYXRlZCBjaGF0IGhpc3RvcnkuXG4gICAqIOKaoO+4jyBJZiB0aGUgYXNzaXN0YW50IGlzIHN0cmVhbWluZyBvciBzdG9wcGluZyB0aGUgZ2VuZXJhdGlvbiwgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgdXNlcidzIG1lc3NhZ2UgdG8gZWRpdFxuICAgKi9cbiAgZWRpdE1lc3NhZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJC52YWx1ZSB8fCAhIXRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJC52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSBpbmRleDtcbiAgICB0aGlzLnJlbWFwcGVkTWVzc2FnZVRvRWRpdCA9IHRoaXMuX3JlbWFwSW5kZXhJbkNoYXRIaXN0b3J5KGluZGV4KTtcbiAgICB0aGlzLnF1ZXN0aW9uID0gdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSFbdGhpcy5fcmVtYXBJbmRleEluQ2hhdEhpc3RvcnkoaW5kZXgpXS5jb250ZW50O1xuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdlZGl0LmNsaWNrJywgeydyYW5rJzogdGhpcy5fcmVtYXBJbmRleEluQ2hhdEhpc3RvcnkoaW5kZXgpfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHByZXZpb3VzIGFzc2lzdGFudCBtZXNzYWdlIG9mIHRoZSBjaGF0IGhpc3RvcnkgdG8gdGhlIGNsaXBib2FyZC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgYXNzaXN0YW50J3MgbWVzc2FnZSB0byBlZGl0XG4gICAqL1xuICBjb3B5TWVzc2FnZShpbmRleDogbnVtYmVyKSB7XG4gICAgLy8gUmVtYXAgdGhlIGluZGV4IGluIHRoZSBjaGF0IGhpc3RvcnlcbiAgICBjb25zdCBpZHggPSB0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShpbmRleCk7XG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ2NvcHkuY2xpY2snLCB7J3JhbmsnOiBpZHh9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydGluZyBmcm9tIHRoZSBwcm92aWRlZCBpbmRleCwgcmVtb3ZlIGFsbCBzdWJzZXF1ZW50IG1lc3NhZ2VzIGZyb20gdGhlIGNoYXQgaGlzdG9yeSBhbmQgdGhlIFVJIGFjY29yZGluZ2x5LlxuICAgKiBUaGUgYXNzaXN0YW50IHdpbGwgcmVnZW5lcmF0ZSBhIG5ldyBhbnN3ZXIgYmFzZWQgb24gdGhlIHVwZGF0ZWQgY2hhdCBoaXN0b3J5LlxuICAgKiDimqDvuI8gSWYgdGhlIGFzc2lzdGFudCBpcyBzdHJlYW1pbmcgb3Igc3RvcHBpbmcgdGhlIGdlbmVyYXRpb24sIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGFzc2lzdGFudCdzIG1lc3NhZ2UgdG8gcmVnZW5lcmF0ZVxuICAgKi9cbiAgcmVnZW5lcmF0ZU1lc3NhZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJC52YWx1ZSB8fCAhIXRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJC52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIG1lc3NhZ2VzIGluIHRoZSBVSSBieSByZW1vdmluZyBhbGwgc3Vic2VxdWVudCAnYXNzaXN0YW50JyBtZXNzYWdlcyBzdGFydGluZyBmcm9tIHRoZSBwcm92aWRlZCBpbmRleCB1bnRpbCB0aGUgZmlyc3QgcHJldmlvdXMgJ3VzZXInIG1lc3NhZ2VcbiAgICBsZXQgaSA9IGluZGV4O1xuICAgIHdoaWxlIChpID49IDAgJiYgKHRoaXMubWVzc2FnZXMkLnZhbHVlISlbaV0ucm9sZSAhPT0gJ3VzZXInKSB7XG4gICAgICBpLS07XG4gICAgfVxuICAgIC8vIEl0IHNob3VsZCBhbHdheXMgYmUgdGhlIGNhc2UgdGhhdCBpID4gMFxuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQodGhpcy5tZXNzYWdlcyQudmFsdWUhLnNsaWNlKDAsIGkrMSkpO1xuICAgICAgLy8gUmVtYXAgdGhlIGluZGV4IG9mIHRoaXMgZm91bmQgZmlyc3QgcHJldmlvdXMgJ3VzZXInIG1lc3NhZ2UgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgICAgY29uc3QgaWR4ID0gdGhpcy5fcmVtYXBJbmRleEluQ2hhdEhpc3RvcnkoaSk7XG4gICAgICAvLyBEZWZpbmUgYW5kIFVwZGF0ZSB0aGUgY2hhdCBoaXN0b3J5IGJhc2VkIG9uIHdoaWNoIHRoZSBhc3Npc3RhbnQgd2lsbCBnZW5lcmF0ZSBhIG5ldyBhbnN3ZXJcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkgPSB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5IS5zbGljZSgwLCBpZHgrMSk7XG4gICAgICAvLyBGZXRjaCB0aGUgYW5zd2VyXG4gICAgICB0aGlzLmZldGNoKHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkpO1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ3JlZ2VuZXJhdGUuY2xpY2snLCB7J3JhbmsnOiBpZHh9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtYXBzIHRoZSBpbmRleCBpbiB0aGUgY2hhdCBoaXN0b3J5LlxuICAgKiBUaGUgY2hhdCBoaXN0b3J5IGlzIGEgbGlzdCBvZiBtZXNzYWdlcyB3aGVyZSBzb21lIG1lc3NhZ2VzIGNhbiBiZSBoaWRkZW4gKGRpc3BsYXkgc2V0IHRvIGZhbHNlKS5cbiAgICogVGhlIGluZGV4IHByb3ZpZGVkIGFzIGlucHV0IGlzIHRoZSBpbmRleCBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2hhdCBoaXN0b3J5IGRpc3BsYXllZCBpbiB0aGUgVUkuXG4gICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB0aGUgYmFja2VuZCBpcyB1cGRhdGVkIHRvIGFkZCB0aGUgaWRzIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCB0byBiZSByZW1hcHBlZC5cbiAgICovXG4gIHByaXZhdGUgX3JlbWFwSW5kZXhJbkNoYXRIaXN0b3J5KGluZGV4OiBudW1iZXIpIHtcbiAgICAvLyBhIGNvcHkgb2YgdGhlIGNoYXQgaGlzdG9yeSBpcyBjcmVhdGVkIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY2hhdCBoaXN0b3J5LlxuICAgIC8vIEFkZGl0aW9uYWxseSwgYSByYW5rIGlzIGdpdmluZyB0byBlYWNoIG1lc3NhZ2UuXG4gICAgLy8gQWxsIG1lc3NhZ2VzIGhhdmluZyByb2xlICd1c2VyJyBhcmUgdXBkYXRlZCB3aXRoIHRoZSBkaXNwbGF5IHByb3BlcnR5IHNldCB0byB0cnVlLCB0aGlzIGlzIG1hbmRhdG9yeSB0byBnZXQgdGhlIGNvcnJlY3QgcmFuayBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2hhdCBoaXN0b3J5IHdoZW4gdGhlIHVzZXIgbWVzc2FnZSB0byByZW1hcCBpcyBoaWRkZW5cbiAgICBjb25zdCBoaXN0b3J5ID0gdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSFcbiAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoKVxuICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG1lc3NhZ2UsIGlkeCkgPT4gKHsuLi5tZXNzYWdlLCBhZGRpdGlvbmFsUHJvcGVydGllczogey4uLm1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMsIHJhbms6IGlkeH19KSlcbiAgICAgICAgICAgICAgICAgICAgICAubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yb2xlID09PSBcInVzZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLm1lc3NhZ2UsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7Li4ubWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcywgZGlzcGxheTogdHJ1ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgaGlkZGVuIG1lc3NhZ2VzIChvZiByb2xlIGRpZmZlcmVudCB0aGVuIFwidXNlclwiKSBpbiBtZXNzYWdlcyQgYmVmb3JlIHRoZSBwcm92aWRlZCBpbmRleFxuICAgIC8vIEFsbCBtZXNzYWdlcyBoYXZpbmcgcm9sZSAndXNlcicgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgZGlzcGxheSBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZSwgdGhpcyBpcyBtYW5kYXRvcnkgdG8gZ2V0IHRoZSBjb3JyZWN0IHJhbmsgb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIGNoYXQgaGlzdG9yeSB3aGVuIHRoZSB1c2VyIG1lc3NhZ2UgdG8gcmVtYXAgaXMgaGlkZGVuXG4gICAgLy8gVGhpcyBpcyBtYW5kYXRvcnkgdG8gZ2V0IHRoZSBjb3JyZWN0IHJhbmsgb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIC8vIFNpbmNlIHNvbWUgaGlkZGVuIG1lc3NhZ2VzIChsaWtlICdzeXN0ZW0nIG1lc3NhZ2VzKSBhcmUgbm90IGRpc3BsYXllZCBpbiB0aGUgVUkgYnV0IGhhdmUgYmVlbiBjb3VudGVkIGluIHRoZSBwcm92aWRlZCBpbmRleFxuICAgIGNvbnN0IG51bWJlck9mSGlkZGVuTWVzc2FnZXNJbk1lc3NhZ2VzJEJlZm9yZUluZGV4ID0gdGhpcy5tZXNzYWdlcyQudmFsdWUhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5tZXNzYWdlLCBhZGRpdGlvbmFsUHJvcGVydGllczogey4uLm1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMsIGRpc3BsYXk6IHRydWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobWVzc2FnZSA9PiAhbWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcy5kaXNwbGF5KS5sZW5ndGg7XG4gICAgLy8gcmVtb3ZlIGFsbCBtZXNzYWdlcyB0aGF0IGhhdmUgZGlzcGxheSBzZXQgdG8gZmFsc2VcbiAgICAvLyB0aGlzIGlzIG1hbmRhdG9yeSBzaW5jZSBhdCB0aGUgcG9pbnQgb2YgdGltZSB3aGVuIHRoZSBhc3Npc3RhbnQgYW5zd2VycyBhIHF1ZXN0aW9uLFxuICAgIC8vIGl0IG1pZ2h0IGhhdmUgc29tZSBoaWRkZW4gbWVzc2FnZXMgKGZvciBleGFtcGxlIGNvbnRleHRNZXNzYWdlcykgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZSBjaGF0IGhpc3RvcnkgYnV0IGRvbid0IGZpZ3VyZSBpbiBtZXNzYWdlcyQgdW5sZXNzIGEgbmV3IHF1ZXN0aW9uIGlzIGFza2VkXG4gICAgY29uc3QgZmlsdGVyZWRIaXN0b3J5ID0gaGlzdG9yeS5maWx0ZXIobWVzc2FnZSA9PiBtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXkpO1xuICAgIC8vIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIGZpbHRlcmVkIGhpc3RvcnlcbiAgICByZXR1cm4gZmlsdGVyZWRIaXN0b3J5W2luZGV4IC0gbnVtYmVyT2ZIaWRkZW5NZXNzYWdlc0luTWVzc2FnZXMkQmVmb3JlSW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnJhbms7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUga2V5IHVwIGV2ZW50IGZvciAnQmFja3NwYWNlJyBhbmQgJ0VudGVyJyBrZXlzLlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUga2V5Ym9hcmQgZXZlbnQuXG4gICAqL1xuICBvbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlSGVpZ2h0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnN1Ym1pdFF1ZXN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVIZWlnaHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBhbmQgYWRqdXN0cyB0aGUgaGVpZ2h0IG9mIHRoZSBxdWVzdGlvbiBpbnB1dCBlbGVtZW50IGJhc2VkIG9uIGl0cyBjb250ZW50LlxuICAgKiBJZiB0aGUgRW50ZXIga2V5IGlzIHByZXNzZWQgd2l0aG91dCB0aGUgU2hpZnQga2V5LCBpdCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBiZWhhdmlvci5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBrZXlib2FyZCBldmVudFxuICAgKi9cbiAgY2FsY3VsYXRlSGVpZ2h0KGV2ZW50PzogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudD8ua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGNvbnN0IG1heEhlaWdodCA9IDE3MDtcbiAgICBjb25zdCBlbCA9IHRoaXMucXVlc3Rpb25JbnB1dCEubmF0aXZlRWxlbWVudDtcbiAgICBlbC5zdHlsZS5tYXhIZWlnaHQgPSBgJHttYXhIZWlnaHR9cHhgO1xuICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSBgJHtlbC5zY3JvbGxIZWlnaHR9cHhgO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93WSA9IGVsLnNjcm9sbEhlaWdodCA+PSBtYXhIZWlnaHQgPyAnc2Nyb2xsJyA6ICdoaWRkZW4nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBcImxpa2VcIiBldmVudCBvbiBjbGlja2luZyBvbiB0aGUgdGh1bWItdXAgaWNvbiBvZiBhbiBhc3Npc3RhbnQncyBtZXNzYWdlXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBhc3Npc3RhbnQgbWVzc2FnZSB0byBsaWtlXG4gICAqIEBwYXJhbSByYW5rIFRoZSByYW5rIG9mIHRoZSBtZXNzYWdlIHRvIGxpa2VcbiAgICovXG4gIG9uTGlrZShtZXNzYWdlOiBDaGF0TWVzc2FnZSwgcmFuazogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gUmVtYXAgdGhlIGluZGV4IGluIHRoZSBjaGF0IGhpc3RvcnlcbiAgICBjb25zdCBpZHggPSB0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShyYW5rKTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgndGh1bWItdXAuY2xpY2snLCB7cmFuazogaWR4fSk7XG4gICAgdGhpcy5yZXBvcnRUeXBlID0gJ2xpa2UnO1xuICAgIHRoaXMubWVzc2FnZVRvUmVwb3J0ID0gbWVzc2FnZTtcbiAgICB0aGlzLnJlcG9ydENvbW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXBvcnRSYW5rID0gcmFuaztcbiAgICB0aGlzLnNob3dSZXBvcnQgPSB0cnVlXG5cbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5IVt0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShyYW5rKV0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGxpa2VkID0gdHJ1ZTtcbiAgICB0aGlzLl91cGRhdGVDaGF0SGlzdG9yeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBcImRpc2xpa2VcIiBldmVudCBvbiBjbGlja2luZyBvbiB0aGUgdGh1bWItZG93biBpY29uIG9mIGFuIGFzc2lzdGFudCdzIG1lc3NhZ2UuXG4gICAqIEl0IGFsc28gb3BlbnMgdGhlIGlzc3VlIHJlcG9ydGluZyBkaWFsb2cuXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBhc3Npc3RhbnQgbWVzc2FnZSB0byBkaXNsaWtlXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcmFuayBvZiB0aGUgbWVzc2FnZSB0byBkaXNsaWtlXG4gICAqL1xuICBvbkRpc2xpa2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UsIHJhbms6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlbWFwIHRoZSBpbmRleCBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAgY29uc3QgaWR4ID0gdGhpcy5fcmVtYXBJbmRleEluQ2hhdEhpc3RvcnkocmFuayk7XG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ3RodW1iLWRvd24uY2xpY2snLCB7cmFuazogaWR4fSk7XG4gICAgdGhpcy5yZXBvcnRUeXBlID0gJ2Rpc2xpa2UnO1xuICAgIHRoaXMubWVzc2FnZVRvUmVwb3J0ID0gbWVzc2FnZTtcbiAgICB0aGlzLmlzc3VlVHlwZSA9ICcnO1xuICAgIHRoaXMucmVwb3J0Q29tbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlcG9ydFJhbmsgPSByYW5rO1xuICAgIHRoaXMuc2hvd1JlcG9ydCA9IHRydWVcblxuICAgIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhW3RoaXMuX3JlbWFwSW5kZXhJbkNoYXRIaXN0b3J5KHJhbmspXS5hZGRpdGlvbmFsUHJvcGVydGllcy4kZGlzbGlrZWQgPSB0cnVlO1xuICAgIHRoaXMuX3VwZGF0ZUNoYXRIaXN0b3J5KCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDaGF0SGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkpO1xuICAgIGlmICh0aGlzLmNoYXRTZXJ2aWNlLnNhdmVkQ2hhdElkKSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnVwZGF0ZVNhdmVkQ2hhdCh0aGlzLmNoYXRTZXJ2aWNlLnNhdmVkQ2hhdElkLCB1bmRlZmluZWQsIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnQgYW4gaXNzdWUgcmVsYXRlZCB0byB0aGUgYXNzaXN0YW50J3MgbWVzc2FnZS5cbiAgICovXG4gIHNlbmRSZXBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICdjb21tZW50JzogdGhpcy5yZXBvcnRDb21tZW50LFxuICAgICAgJ3RleHQnOiB0aGlzLm1lc3NhZ2VUb1JlcG9ydCEuY29udGVudCxcbiAgICAgICdyYW5rJzogdGhpcy5yZXBvcnRSYW5rLFxuICAgIH07XG4gICAgaWYgKHRoaXMucmVwb3J0VHlwZSA9PT0gJ2Rpc2xpa2UnKSB7XG4gICAgICBkZXRhaWxzWydyZXBvcnQtdHlwZSddID0gdGhpcy5pc3N1ZVR5cGU7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbmVnYXRpdmUtcmVwb3J0LnNlbmQnLCBkZXRhaWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ3Bvc2l0aXZlLXJlcG9ydC5zZW5kJywgZGV0YWlscyk7XG4gICAgfVxuICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uuc3VjY2VzcygnWW91ciByZXBvcnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNlbnQnKTtcbiAgICB0aGlzLnNob3dSZXBvcnQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcmVwb3J0aW5nIGRpYWxvZy5cbiAgICovXG4gIGlnbm9yZVJlcG9ydCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dSZXBvcnQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIGNsaWNrIG9uIGEgcmVmZXJlbmNlJ3MgJ29wZW4gcHJldmlldycuXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBvcGVuQXR0YWNobWVudFByZXZpZXcoZGF0YToge3JlZmVyZW5jZTogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXJ9KSB7XG4gICAgdGhpcy5vcGVuUHJldmlldy5lbWl0KGRhdGEucmVmZXJlbmNlKTtcbiAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgJ2RvYy1pZCc6IGRhdGEucmVmZXJlbmNlLnJlY29yZElkLFxuICAgICAgJ3RpdGxlJzogZGF0YS5yZWZlcmVuY2UucmVjb3JkLnRpdGxlLFxuICAgICAgJ3NvdXJjZSc6IGRhdGEucmVmZXJlbmNlLnJlY29yZC50cmVlcGF0aCxcbiAgICAgICdjb2xsZWN0aW9uJzogZGF0YS5yZWZlcmVuY2UucmVjb3JkLmNvbGxlY3Rpb24sXG4gICAgICAnaW5kZXgnOiBkYXRhLnJlZmVyZW5jZS5yZWNvcmQuZGF0YWJhc2VhbGlhcyxcbiAgICB9O1xuICAgIGlmKCEhZGF0YS5wYXJ0SWQpIGRldGFpbHNbJ3BhcnQtaWQnXSA9IGRhdGEucGFydElkO1xuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdhdHRhY2htZW50LnByZXZpZXcuY2xpY2snLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIGNsaWNrIG9uIGEgcmVmZXJlbmNlJ3MgJ29wZW4gb3JpZ2luYWwgZG9jdW1lbnQnLlxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgb3Blbk9yaWdpbmFsQXR0YWNobWVudChkYXRhOiB7cmVmZXJlbmNlOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcn0pIHtcbiAgICB0aGlzLm9wZW5Eb2N1bWVudC5lbWl0KGRhdGEucmVmZXJlbmNlLnJlY29yZCk7XG4gICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICdkb2MtaWQnOiBkYXRhLnJlZmVyZW5jZS5yZWNvcmRJZCxcbiAgICAgICd0aXRsZSc6IGRhdGEucmVmZXJlbmNlLnJlY29yZC50aXRsZSxcbiAgICAgICdzb3VyY2UnOiBkYXRhLnJlZmVyZW5jZS5yZWNvcmQudHJlZXBhdGgsXG4gICAgICAnY29sbGVjdGlvbic6IGRhdGEucmVmZXJlbmNlLnJlY29yZC5jb2xsZWN0aW9uLFxuICAgICAgJ2luZGV4JzogZGF0YS5yZWZlcmVuY2UucmVjb3JkLmRhdGFiYXNlYWxpYXMsXG4gICAgfTtcbiAgICBpZighIWRhdGEucGFydElkKSBkZXRhaWxzWydwYXJ0LWlkJ10gPSBkYXRhLnBhcnRJZDtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnYXR0YWNobWVudC5saW5rLmNsaWNrJywgZGV0YWlscyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBjbGljayBvbiBhIHN1Z2dlc3RlZCBhY3Rpb24uXG4gICAqIEBwYXJhbSBhY3Rpb24gU3VnZ2VzdGVkIGFjdGlvbi5cbiAgICogQHBhcmFtIGluZGV4IFJhbmsgb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIGNoYXRIaXN0b3J5IHJlbGF0ZWQgdG8gdGhlIHN1Z2dlc3RlZCBhY3Rpb24uXG4gICAqL1xuICBzdWdnZXN0QWN0aW9uQ2xpY2soYWN0aW9uOiBTdWdnZXN0ZWRBY3Rpb24sIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnN1Z2dlc3RBY3Rpb24uZW1pdChhY3Rpb24pO1xuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdzdWdnZXN0ZWRBY3Rpb24uY2xpY2snLCB7J3RleHQnOiBhY3Rpb24uY29udGVudCwgJ3N1Z2dlc3RlZEFjdGlvbi10eXBlJzogYWN0aW9uLnR5cGV9KVxuICB9XG5cbiAgLyoqXG4gICAqIEl0IGxvb2tzIGZvciB0aGUgZGVidWcgbWVzc2FnZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGdyb3VwIG9mIFwiYXNzaXN0YW50XCIgbWVzc2FnZXMuXG4gICAqIEJ5IGRlc2lnbiwgdGhlIGRlYnVnIG1lc3NhZ2VzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgZmlyc3QgdmlzaWJsZSBtZXNzYWdlIGFtb25nIHRoZSBncm91cCBcImFzc2lzdGFudFwiIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHJhbmsgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHJldHVybnMgVGhlIGRlYnVnIG1lc3NhZ2VzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBncm91cCBvZiBcImFzc2lzdGFudFwiIG1lc3NhZ2VzXG4gICAqL1xuICBnZXREZWJ1Z01lc3NhZ2VzKGluZGV4OiBudW1iZXIpOiBEZWJ1Z01lc3NhZ2VbXSB7XG4gICAgLy8gSWYgaXQgaXMgbm90IGFuIGFzc2lzdGFudCBtZXNzYWdlLCByZXR1cm5cbiAgICBpZiAoKHRoaXMubWVzc2FnZXMkLnZhbHVlISlbaW5kZXhdLnJvbGUgIT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIEdldCB0aGUgYXJyYXkgb2YgbWVzc2FnZXMgdXAgdG8gdGhlIGluZGljYXRlZCBpbmRleFxuICAgIGNvbnN0IGFycmF5ID0gdGhpcy5tZXNzYWdlcyQudmFsdWUhLnNsaWNlKDAsIGluZGV4ICsgMSk7XG4gICAgLy8gSWYgaXQgaXMgYW4gYXNzaXN0YW50IG1lc3NhZ2UsIGxvb2sgZm9yIHRoZSBkZWJ1ZyBtZXNzYWdlcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZ3JvdXAgb2YgXCJhc3Npc3RhbnRcIiBtZXNzYWdlc1xuICAgIC8vIEJ5IGRlc2lnbiwgdGhlIGRlYnVnIG1lc3NhZ2VzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgZmlyc3QgdmlzaWJsZSBtZXNzYWdlIGFtb25nIHRoZSBncm91cCBcImFzc2lzdGFudFwiIG1lc3NhZ2VzLlxuICAgIGNvbnN0IGlkeCA9IHRoaXMuY2hhdFNlcnZpY2UuZmlyc3RWaXNpYmxlQXNzaXN0YW50TWVzc2FnZUluZGV4KGFycmF5KTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHJldHVybiAodGhpcy5tZXNzYWdlcyQudmFsdWUhKVtpZHhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRkZWJ1ZyB8fCBbXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgY2xpY2sgb24gdGhlICdzaG93IGxvZyBpbmZvJyBidXR0b24gb2YgYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHJhbmsgb2YgdGhlIG1lc3NhZ2VcbiAgICovXG4gIHNob3dEZWJ1ZyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kZWJ1Z01lc3NhZ2VzID0gdGhpcy5nZXREZWJ1Z01lc3NhZ2VzKGluZGV4KTtcbiAgICB0aGlzLnNob3dEZWJ1Z01lc3NhZ2VzID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHdoZXRoZXIgdGhlIGN1cnJlbnQgbWVzc2FnZSBpcyBhbiBhc3Npc3RhbnQgbWVzc2FnZSBhbmQgdGhhdCBhbGwgZm9sbG93aW5nIG1lc3NhZ2VzIGFyZSBhc3Npc3RhbnQgb25lc1xuICAgKiBVc2VkIHRvIGtlZXAgdGhlIFwiVmlldyBwcm9ncmVzc1wiIG9wZW5lZCBldmVuIHRob3VnaCB0aGUgYXNzaXN0YW50IGlzIHNlbmRpbmcgYWRkaXRpb25hbCBtZXNzYWdlcyBhZnRlciB0aGUgY3VycmVudCBvbmVcbiAgICogQHBhcmFtIG1lc3NhZ2VzIHRoZSBsaXN0IG9mIGN1cnJlbnQgbWVzc2FnZXNcbiAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBtZXNzYWdlXG4gICAqIEByZXR1cm5zIGlmIHRoaXMgbWVzc2FnZXMgYW5kIHRoZSBmb2xsb3dpbmcgb25lcyAoaWYgYW55KSBhcmUgdGhlIGxhc3Qgb25lc1xuICAgKi9cbiAgaXNBc3Npc3RhbnRMYXN0TWVzc2FnZXMobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG1lc3NhZ2VzW2ldLnJvbGUgIT09ICdhc3Npc3RhbnQnKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSBpcyBhbiBlbXB0eSBhc3Npc3RhbnQgbWVzc2FnZS5cbiAgICogQW4gZW1wdHkgYXNzaXN0YW50IG1lc3NhZ2UgaXMgZGVmaW5lZCBhcyBhIG1lc3NhZ2Ugd2l0aCB0aGUgcm9sZSAnYXNzaXN0YW50JyxcbiAgICogYW4gZW1wdHkgY29udGVudCwgYW5kIG5vIGFkZGl0aW9uYWwgcHJvcGVydGllcyBzdWNoIGFzIGF0dGFjaG1lbnRzLCBwcm9ncmVzcyxcbiAgICogZGVidWcgaW5mb3JtYXRpb24sIG9yIHN1Z2dlc3RlZCBhY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1lc3NhZ2UgaXMgYW4gZW1wdHkgYXNzaXN0YW50IG1lc3NhZ2UsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNFbXB0eUFzc2lzdGFudE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAobWVzc2FnZT8ucm9sZSA9PT0gJ2Fzc2lzdGFudCdcbiAgICAgICAgICAmJiBtZXNzYWdlPy5jb250ZW50ID09PSBcIlwiXG4gICAgICAgICAgJiYgIW1lc3NhZ2U/LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPy4kYXR0YWNobWVudFxuICAgICAgICAgICYmICFtZXNzYWdlPy5hZGRpdGlvbmFsUHJvcGVydGllcz8uJHByb2dyZXNzXG4gICAgICAgICAgJiYgIW1lc3NhZ2U/LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPy4kZGVidWdcbiAgICAgICAgICAmJiAhbWVzc2FnZT8uYWRkaXRpb25hbFByb3BlcnRpZXM/LiRzdWdnZXN0ZWRBY3Rpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5pdGlhbGl6YXRpb25FcnJvclwiPlxuICA8ZGl2ICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXM7IGVsc2UgbG9hZGluZ1RwbCB8fCBsb2FkaW5nVHBsRGVmYXVsdFwiIGNsYXNzPVwiaC0xMDAgZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgPCEtLSBUb2tlbiBjb25zdW1wdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXMtMVwiICpuZ0lmPVwiY29uZmlnPy5nbG9iYWxTZXR0aW5ncz8uZGlzcGxheVVzZXJRdW90YUNvbnN1bXB0aW9uIHx8IGNvbmZpZz8uZ2xvYmFsU2V0dGluZ3M/LmRpc3BsYXlDaGF0VG9rZW5zQ29uc3VtcHRpb25cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b2tlbkNvbnN1bXB0aW9uVHBsIHx8IGRlZmF1bHRUb2tlbkNvbnN1bXB0aW9uVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaW5zdGFuY2VJZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENoYXQgTWVzc2FnZXMgLS0+XG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoIG92ZXJmbG93LWF1dG8gZmxleC1ncm93LTEgcGUtMiBwYi0yXCIgI21lc3NhZ2VMaXN0PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlczsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICA8IS0tIFJlZ3VsYXIgbWVzc2FnZXMgLS0+XG4gICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgKm5nSWY9XCJtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXkgJiYgIWlzRW1wdHlBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpXCJcbiAgICAgICAgICBbc3R5bGUuLS1icy1saXN0LWdyb3VwLWl0ZW0tcGFkZGluZy15LnJlbV09XCInMC42J1wiXG4gICAgICAgICAgW2NsYXNzLm9wYWNpdHktNTBdPVwibWVzc2FnZVRvRWRpdCAmJiAobWVzc2FnZVRvRWRpdCA8IChpbmRleCArIDEpKVwiPlxuICAgICAgICAgIDxzcS1jaGF0LW1lc3NhZ2VcbiAgICAgICAgICAgIFtjbGFzcy5zcS11c2VyLW1lc3NhZ2VdPVwibWVzc2FnZS5yb2xlID09PSAndXNlcidcIlxuICAgICAgICAgICAgW2NsYXNzLmxhc3QtbWVzc2FnZV09XCJsYXN0XCJcbiAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgW2NvbnZlcnNhdGlvbl09XCJtZXNzYWdlc1wiXG4gICAgICAgICAgICBbc3VnZ2VzdGVkQWN0aW9uc109XCJsYXN0ID8gbWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcy4kc3VnZ2VzdGVkQWN0aW9uIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIFthc3Npc3RhbnRNZXNzYWdlSWNvbl09XCJhc3Npc3RhbnRNZXNzYWdlSWNvblwiXG4gICAgICAgICAgICBbdXNlck1lc3NhZ2VJY29uXT1cInVzZXJNZXNzYWdlSWNvblwiXG4gICAgICAgICAgICBbY29ubmVjdGlvbkVycm9yTWVzc2FnZUljb25dPVwiY29ubmVjdGlvbkVycm9yTWVzc2FnZUljb25cIlxuICAgICAgICAgICAgW3NlYXJjaFdhcm5pbmdNZXNzYWdlSWNvbl09XCJzZWFyY2hXYXJuaW5nTWVzc2FnZUljb25cIlxuICAgICAgICAgICAgW3N0cmVhbWluZ109XCIoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSAmJiAobGFzdCB8fCBpc0Fzc2lzdGFudExhc3RNZXNzYWdlcyhtZXNzYWdlcywgaW5kZXgpKVwiXG4gICAgICAgICAgICBbY2FuRWRpdF09XCIoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSA9PT0gZmFsc2UgJiYgbWVzc2FnZVRvRWRpdCA9PT0gdW5kZWZpbmVkICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ3VzZXInXCJcbiAgICAgICAgICAgIFtjYW5Db3B5XT1cIigoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSA9PT0gZmFsc2UgfHwgIWxhc3QpICYmIG1lc3NhZ2VUb0VkaXQgPT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlLnJvbGUgIT09ICdjb25uZWN0aW9uLWVycm9yJyAmJiBtZXNzYWdlLnJvbGUgIT09ICdzZWFyY2gtd2FybmluZydcIlxuICAgICAgICAgICAgW2Nhbkxpa2VdPVwiKChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpID09PSBmYWxzZSB8fCAhbGFzdCkgJiYgbWVzc2FnZS5yb2xlID09PSAnYXNzaXN0YW50J1wiXG4gICAgICAgICAgICBbY2FuRGlzbGlrZV09XCIoKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgPT09IGZhbHNlIHx8ICFsYXN0KSAmJiBtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnXCJcbiAgICAgICAgICAgIFtjYW5EZWJ1Z109XCIoKChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpID09PSBmYWxzZSAmJiBsYXN0KSB8fCAoIWxhc3QgJiYgbWVzc2FnZXNbaW5kZXgrMV0ucm9sZSAhPT0gJ2Fzc2lzdGFudCcpKSAmJiBtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIGlzQWRtaW4gJiYgKGdldERlYnVnTWVzc2FnZXMoaW5kZXgpLmxlbmd0aCA+IDApICYmIGNvbmZpZz8uZGVmYXVsdFZhbHVlcy5kZWJ1Z1wiXG4gICAgICAgICAgICBbY2FuUmVnZW5lcmF0ZV09XCIoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSA9PT0gZmFsc2UgICYmIChsYXN0IHx8ICghbGFzdCAmJiBtZXNzYWdlc1tpbmRleCsxXS5yb2xlICE9PSAnYXNzaXN0YW50JykpICAmJiBtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2VUb0VkaXQgPT09IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAoZWRpdCk9XCJlZGl0TWVzc2FnZShpbmRleClcIlxuICAgICAgICAgICAgKGNvcHkpPVwiY29weU1lc3NhZ2UoaW5kZXgpXCJcbiAgICAgICAgICAgIChyZWdlbmVyYXRlKT1cInJlZ2VuZXJhdGVNZXNzYWdlKGluZGV4KVwiXG4gICAgICAgICAgICAob3BlbkRvY3VtZW50KT1cIm9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob3BlblByZXZpZXcpPVwib3BlbkF0dGFjaG1lbnRQcmV2aWV3KCRldmVudClcIlxuICAgICAgICAgICAgKHN1Z2dlc3RBY3Rpb24pPVwic3VnZ2VzdEFjdGlvbkNsaWNrKCRldmVudCwgaW5kZXgpXCJcbiAgICAgICAgICAgIChsaWtlKT1cIm9uTGlrZShtZXNzYWdlLCBpbmRleClcIlxuICAgICAgICAgICAgKGRpc2xpa2UpPVwib25EaXNsaWtlKG1lc3NhZ2UsIGluZGV4KVwiXG4gICAgICAgICAgICAoZGVidWcpPVwic2hvd0RlYnVnKGluZGV4KVwiPlxuICAgICAgICAgIDwvc3EtY2hhdC1tZXNzYWdlPlxuICAgICAgICA8L2xpPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIExvYWRpbmcgc3Bpbm5lciAtLT5cbiAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0lmPVwiKGxvYWRpbmckIHwgYXN5bmMpID09PSB0cnVlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nVHBsIHx8IGxvYWRpbmdUcGxEZWZhdWx0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG5cbiAgICA8IS0tIFJlcG9ydGluZyBhIGZlZWRiYWNrIGZvcm0gLS0+XG4gICAgPGRpdiBjbGFzcz1cImlzc3VlLXJlcG9ydCBwdC0zIHBiLTJcIiAqbmdJZj1cInNob3dSZXBvcnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZXBvcnRUcGwgfHwgcmVwb3J0VHBsRGVmYXVsdDsgY29udGV4dDogeyAkaW1wbGljaXQ6IG1lc3NhZ2VUb1JlcG9ydCwgcmFuazogcmVwb3J0UmFuaywgdHlwZTogcmVwb3J0VHlwZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFVzZXIgdGV4dCBpbnB1dCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbnB1dCBtdC1hdXRvXCIgKm5nSWY9XCIhc2hvd1JlcG9ydFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInB5LTJcIj5cbiAgICAgICAgPGRpdiBbaGlkZGVuXT1cIiFpc0Nvbm5lY3RlZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbmFibGVkVXNlcklucHV0XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW5wdXRUcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gUmV0cnkgYnV0dG9uIC0tPlxuICAgICAgICA8YnV0dG9uIFtoaWRkZW5dPVwiaXNDb25uZWN0ZWRcIiBjbGFzcz1cImJ0biBtYi00IGFzdC1lcnJvciBhc3QtYnRuIHNxLXJldHJ5XCIgKGNsaWNrKT1cInJldHJ5RmV0Y2goKVwiPlxuICAgICAgICAgIDxzcGFuPlRyeSBhZ2Fpbjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInJldHJpYWxBdHRlbXB0c1wiIGNsYXNzPVwibXMtMiBhdHRlbXB0c1wiPnt7IHJldHJpYWxBdHRlbXB0cyB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZCBzbWFsbCB0ZXh0LW11dGVkIHB4LTNcIiAqbmdJZj1cIiEhY29uZmlnPy5nbG9iYWxTZXR0aW5ncz8uZGlzY2xhaW1lclwiPlxuICAgICAgICAgIHt7IGNvbmZpZz8uZ2xvYmFsU2V0dGluZ3M/LmRpc2NsYWltZXIgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRmxvYXRpbmcgc2Nyb2xsIGJ1dHRvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzQXRCb3R0b20gJiYgIXNob3dSZXBvcnRcIiBjbGFzcz1cInNxLWZsb2F0aW5nLXNjcm9sbFwiIFtuZ0NsYXNzXT1cImVuYWJsZWRVc2VySW5wdXQgPyAnc3EtZmxvYXRpbmctc2Nyb2xsLS13aGVuLXVzZXItaW5wdXQnIDogJ3NxLWZsb2F0aW5nLXNjcm9sbC0td2l0aG91dC11c2VyLWlucHV0J1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBzaGFkb3dcIiAoY2xpY2spPVwic2Nyb2xsRG93bigpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWFuZ2xlLWRvdWJsZS1kb3duXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gTkcgVEVNUExBVEVTLS0+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RwbERlZmF1bHQ+XG4gIDxkaXYgY2xhc3M9XCJzcGlubmVyLWdyb3cgdGV4dC1wcmltYXJ5IGQtYmxvY2sgbXgtYXV0byBteS01XCIgcm9sZT1cInN0YXR1c1wiPlxuICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0VHBsPlxuICA8ZGl2IGNsYXNzPVwicHgtMyBweS0xXCI+XG4gICAgPGRpdiBjbGFzcz1cImFzdC1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNlYXJjaFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHRleHRhcmVhICNxdWVzdGlvbklucHV0IHJvd3M9XCIxXCJcbiAgICAgICAgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiQXNrIHNvbWV0aGluZ1wiIGF1dG9mb2N1c1xuICAgICAgICBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uXCJcbiAgICAgICAgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cImNhbGN1bGF0ZUhlaWdodCgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIihsb2FkaW5nJCB8IGFzeW5jKSB8fCAoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSB8fCAoY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJCB8IGFzeW5jKVwiPlxuICAgICAgPC90ZXh0YXJlYT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCIhKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgJiYgIShsb2FkaW5nJCB8IGFzeW5jKSAmJiAhKGNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiQgfCBhc3luYylcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1zLTJcIlxuICAgICAgICBzcVRvb2x0aXA9XCJTZW5kIG1lc3NhZ2VcIlxuICAgICAgICAoY2xpY2spPVwic3VibWl0UXVlc3Rpb24oKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wYXBlci1wbGFuZVwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIm1lc3NhZ2VUb0VkaXRcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1zLTJcIlxuICAgICAgICBzcVRvb2x0aXA9XCJDYW5jZWwgZWRpdGlvblwiXG4gICAgICAgIChjbGljayk9XCJtZXNzYWdlVG9FZGl0ID0gdW5kZWZpbmVkOyBxdWVzdGlvbiA9ICcnXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXVuZG8tYWx0XCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiAqbmdJZj1cIihjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpICYmICEoY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJCB8IGFzeW5jKVwiIGNsYXNzPVwicHJvY2Vzc2luZyBtcy0yXCI+XG4gICAgICAgIEdlbmVyYXRpbmcgPGkgY2xhc3M9XCJtcy0xIGZhcyBmYS1zcGlubmVyIGZhLXB1bHNlXCI+PC9pPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCIoY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJCB8IGFzeW5jKVwiIGNsYXNzPVwicHJvY2Vzc2luZyBtcy0yXCI+XG4gICAgICAgIFN0b3BwaW5nIDxpIGNsYXNzPVwibXMtMSBmYXMgZmEtc3Bpbm5lciBmYS1wdWxzZVwiPjwvaT5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCIoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSAmJiAhKGNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiQgfCBhc3luYylcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1zLTJcIlxuICAgICAgICBzcVRvb2x0aXA9XCJTdG9wIGdlbmVyYXRpbmdcIlxuICAgICAgICAoY2xpY2spPVwic3RvcEdlbmVyYXRpb24oKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zdG9wXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyZXBvcnRUcGxEZWZhdWx0IGxldC1tZXNzYWdlIGxldC1yYW5rPVwicmFua1wiIGxldC10eXBlPVwidHlwZVwiPlxuICA8ZGl2IGNsYXNzPVwicHgtM1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAnZGlzbGlrZSdcIj5cbiAgICAgIDxoNT5Jc3N1ZSB0eXBlPC9oNT5cbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBtYi00XCIgWyhuZ01vZGVsKV09XCJpc3N1ZVR5cGVcIj5cbiAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiJydcIj5DaG9vc2UgYW4gaXNzdWUgdHlwZTwvb3B0aW9uPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB0eXBlIG9mIChpc3N1ZVR5cGVzID8/IGRlZmF1bHRJc3N1ZVR5cGVzKVwiPnt7dHlwZX19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICAgIDxoNT5XaGF0IHdhcyB1bnNhdGlzZnlpbmcgYWJvdXQgdGhpcyByZXNwb25zZT8gKG9wdGlvbmFsKTwvaDU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09ICdsaWtlJ1wiPlxuICAgICAgPGg1PldoeSBkaWQgeW91IGxpa2UgdGhpcyBhbnN3ZXI/IChvcHRpb25hbCk8L2g1PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicmVwb3J0Q29tbWVudFwiIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBjb21tZW50XCI+PC90ZXh0YXJlYT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93LXJldmVyc2UgZ2FwLTEgbXQtMlwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJ0eXBlID09PSAnZGlzbGlrZScgJiYgIWlzc3VlVHlwZVwiIChjbGljayk9XCJzZW5kUmVwb3J0KClcIj5TZW5kPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIChjbGljayk9XCJpZ25vcmVSZXBvcnQoKVwiPkRvIG5vdCBzZW5kIHJlcG9ydDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRva2VuQ29uc3VtcHRpb25UcGwgbGV0LWluc3RhbmNlSWQ+XG4gIDxzcS10b2tlbi1wcm9ncmVzcy1iYXJcbiAgICBbaW5zdGFuY2VJZF09XCJpbnN0YW5jZUlkXCI+XG4gIDwvc3EtdG9rZW4tcHJvZ3Jlc3MtYmFyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cImRlYnVnLW1lc3NhZ2VzXCIgW2NsYXNzLmRpc3BsYXllZF09XCJzaG93RGVidWdNZXNzYWdlc1wiPlxuICA8YnV0dG9uICpuZ0lmPVwic2hvd0RlYnVnTWVzc2FnZXNcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgc2hhZG93IGJhY2stYnRuXCIgKGNsaWNrKT1cInNob3dEZWJ1Z01lc3NhZ2VzPWZhbHNlXCI+XG4gICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodFwiPjwvaT5cbiAgPC9idXR0b24+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWJ1Z01lc3NhZ2VzVHBsIHx8IGRlZmF1bHREZWJ1Z01lc3NhZ2VzVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGVidWdNZXNzYWdlcyB9XCI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdERlYnVnTWVzc2FnZXNUcGwgbGV0LWRlYnVnTWVzc2FnZXM+XG4gIDxzcS1kZWJ1Zy1tZXNzYWdlIFtkYXRhXT1cImRlYnVnTWVzc2FnZXNcIj48L3NxLWRlYnVnLW1lc3NhZ2U+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
1061
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBOEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFOLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQVMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFD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IHsgaW5qZWN0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvYWN0aW9uXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEZhY2V0IH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvZmFjZXRcIjtcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy9zZWFyY2hcIjtcbmltcG9ydCB7IEFwcFNlcnZpY2UsIFF1ZXJ5IH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYXBwLXV0aWxzXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlLCBSZWNvcmQgYXMgQXJ0aWNsZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlc1wiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgZnJvbUV2ZW50LCBtYXAsIG1lcmdlLCBzd2l0Y2hNYXAsIHRha2UsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdENvbnRleHRBdHRhY2htZW50LCBDaGF0Q29uZmlnLCBDaGF0TWVzc2FnZSwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIE1lc3NhZ2VIYW5kbGVyLCBSYXdNZXNzYWdlLCBTdWdnZXN0ZWRBY3Rpb24sIEluaXRDaGF0LCBEZWJ1Z01lc3NhZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5zdGFuY2VNYW5hZ2VyU2VydmljZSB9IGZyb20gXCIuL2luc3RhbmNlLW1hbmFnZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0Q2hhdFNlcnZpY2UgfSBmcm9tIFwiLi93ZWJzb2NrZXQtY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZUNvbXBvbmVudCB9IGZyb20gXCIuL2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbG9naW5cIjtcbmltcG9ydCB7IFJlc3RDaGF0U2VydmljZSB9IGZyb20gXCIuL3Jlc3QtY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUb2tlblByb2dyZXNzQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vdG9rZW4tcHJvZ3Jlc3MtYmFyL3Rva2VuLXByb2dyZXNzLWJhci5jb21wb25lbnRcIjtcbmltcG9ydCB7IERlYnVnTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gXCIuL2RlYnVnLW1lc3NhZ2UvZGVidWctbWVzc2FnZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IEh1YkNvbm5lY3Rpb24sIEh1YkNvbm5lY3Rpb25TdGF0ZSAgfSBmcm9tIFwiQG1pY3Jvc29mdC9zaWduYWxyXCI7XG5pbXBvcnQgeyBVdGlsc01vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3V0aWxzXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL25vdGlmaWNhdGlvblwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcS1jaGF0LXYzJywgLy8gbWFuZGF0b3J5IHNpbmNlIEBzaW5lcXVhL2NvbXBvbmVudHMgYWxyZWFkeSBoYXMgdGhlIHNhbWUgdGFnLW5hbWUgXCJzcS1jaGF0XCJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIFJlc3RDaGF0U2VydmljZSxcbiAgICBXZWJTb2NrZXRDaGF0U2VydmljZVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIENoYXRNZXNzYWdlQ29tcG9uZW50LCBUb2tlblByb2dyZXNzQmFyQ29tcG9uZW50LCBEZWJ1Z01lc3NhZ2VDb21wb25lbnQsIFV0aWxzTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBDaGF0Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGYWNldCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBsb2dpblNlcnZpY2UgPSBpbmplY3QoTG9naW5TZXJ2aWNlKTtcbiAgcHVibGljIHdlYnNvY2tldFNlcnZpY2UgPSBpbmplY3QoV2ViU29ja2V0Q2hhdFNlcnZpY2UpO1xuICBwdWJsaWMgcmVzdFNlcnZpY2UgPSBpbmplY3QoUmVzdENoYXRTZXJ2aWNlKTtcbiAgcHVibGljIGluc3RhbmNlTWFuYWdlclNlcnZpY2UgPSBpbmplY3QoSW5zdGFuY2VNYW5hZ2VyU2VydmljZSk7XG4gIHB1YmxpYyBzZWFyY2hTZXJ2aWNlID0gaW5qZWN0KFNlYXJjaFNlcnZpY2UpO1xuICBwdWJsaWMgcHJpbmNpcGFsU2VydmljZSA9IGluamVjdChQcmluY2lwYWxXZWJTZXJ2aWNlKTtcbiAgcHVibGljIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuICBwdWJsaWMgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuXG4gIC8qKiBEZWZpbmUgdGhlIGtleSBiYXNlZCBvbiBpdCwgdGhlIGNoYXQgc2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHN0b3JlZCAqL1xuICBASW5wdXQoKSBpbnN0YW5jZUlkOiBzdHJpbmc7XG4gIC8qKiBEZWZpbmUgdGhlIHF1ZXJ5IHRvIHVzZSB0byBmZXRjaCBhbnN3ZXJzICovXG4gIEBJbnB1dCgpIHF1ZXJ5OiBRdWVyeSA9IHRoaXMuc2VhcmNoU2VydmljZS5xdWVyeTtcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjaGF0IHNob3VsZCBiZSByZWxvYWRlZCBhZnRlciB0aGUgcXVlcnkgY2hhbmdlc1xuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjaGF0IHdpbGwgYmUgcmVsb2FkZWQgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0gcHJldlF1ZXJ5IFRoZSBwcmV2aW91cyBxdWVyeVxuICAgKiBAcGFyYW0gbmV3UXVlcnkgVGhlIG5ldyBxdWVyeVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjaGF0IHNob3VsZCBiZSByZWxvYWRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBASW5wdXQoKSBxdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQ6IChwcmV2UXVlcnk6IFF1ZXJ5LCBuZXdRdWVyeTogUXVlcnkpID0+IGJvb2xlYW47XG4gIC8qKiBEZWZpbmUgdGhlIHByb3RvY29sIHRvIGJlIHVzZWQgZm9yIHRoaXMgY2hhdCBpbnN0YW5jZSovXG4gIEBJbnB1dCgpIHByb3RvY29sOiAnUkVTVCcgfCAnV0VCU09DS0VUJyA9IFwiV0VCU09DS0VUXCI7XG4gIC8qKiBNYXAgb2YgbGlzdGVuZXJzIG92ZXJyaWRpbmcgZGVmYXVsdCByZWdpc3RlcmVkIG9uZXMqL1xuICBASW5wdXQoKSBtZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPGFueT4+ID0gbmV3IE1hcCgpO1xuICAvKiogV2hlbiB0aGUgYXNzaXN0YW50IGFuc3dlciBhIHVzZXIgcXVlc3Rpb24sIGF1dG9tYXRpY2FsbHkgc2Nyb2xsIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgZGlzY3Vzc2lvbiAqL1xuICBASW5wdXQoKSBhdXRvbWF0aWNTY3JvbGxUb0xhc3RSZXNwb25zZSA9IGZhbHNlO1xuICAvKiogV2hlbiB0aGUgYXNzaXN0YW50IGFuc3dlciBhIHVzZXIgcXVlc3Rpb24sIGF1dG9tYXRpY2FsbHkgZm9jdXMgdG8gdGhlIGNoYXQgaW5wdXQgKi9cbiAgQElucHV0KCkgZm9jdXNBZnRlclJlc3BvbnNlID0gZmFsc2U7XG4gIC8qKiBBIGNoYXQgZGlzY3Vzc2lvbiB0aGF0IHRoZSBjb21wb25lbnQgc2hvdWxkIGdldCBpbml0aWFsaXplZCB3aXRoIGl0ICovXG4gIEBJbnB1dCgpIGNoYXQ/OiBJbml0Q2hhdDtcbiAgLyoqIEljb24gdG8gdXNlIGZvciB0aGUgYXNzaXN0YW50IG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIGFzc2lzdGFudE1lc3NhZ2VJY29uID0gJ3NxLXNpbmVxdWEnO1xuICAvKiogSWNvbiB0byB1c2UgZm9yIHRoZSB1c2VyIG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIHVzZXJNZXNzYWdlSWNvbjogc3RyaW5nO1xuICAvKiogSWNvbiB0byB1c2UgZm9yIHRoZSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gIC8qKiBJY29uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaCB3YXJuaW5nIG1lc3NhZ2VzICovXG4gIEBJbnB1dCgpIHNlYXJjaFdhcm5pbmdNZXNzYWdlSWNvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgb25jZSB0aGUgc2lnbmFsUiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkICAqL1xuICBAT3V0cHV0KCkgY29ubmVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8SHViQ29ubmVjdGlvbj4oKTtcbiAgLyoqIEV2ZW50IGVtaXR0ZXIgdHJpZ2dlcmVkIGVhY2ggdGltZSB0aGUgYXNzaXN0YW50IHVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hhdCAqL1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgY2hhdCBpcyBsb2FkaW5nIG5ldyBjb250ZW50ICovXG4gIEBPdXRwdXQoXCJsb2FkaW5nXCIpIGxvYWRpbmckID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBFbWl0cyB0aGUgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb24gdXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGNvbXBvbmVudCAqL1xuICBAT3V0cHV0KFwiY29uZmlnXCIpIF9jb25maWcgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRDb25maWc+KCk7XG4gIEBPdXRwdXQoKSBkYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZVtdPigpO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdG8gb3BlbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb250ZXh0IGF0dGFjaG1lbnQqL1xuICBAT3V0cHV0KCkgb3BlbkRvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlPigpO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdG8gb3BlbiB0aGUgcHJldmlldyBvZiBhIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgY29udGV4dCBhdHRhY2htZW50ICovXG4gIEBPdXRwdXQoKSBvcGVuUHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdENvbnRleHRBdHRhY2htZW50PigpO1xuICAvKiogRXZlbnQgZW1pdHRlciB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBzdWdnZXN0ZWQgYWN0aW9uICovXG4gIEBPdXRwdXQoKSBzdWdnZXN0QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxTdWdnZXN0ZWRBY3Rpb24+KCk7XG4gIC8qKiBWaWV3Q2hpbGQgZGVjb3JhdG9ycyB0byBhY2Nlc3MgdGhlIHRlbXBsYXRlIGVsZW1lbnRzICovXG4gIEBWaWV3Q2hpbGQoJ21lc3NhZ2VMaXN0JykgbWVzc2FnZUxpc3Q/OiBFbGVtZW50UmVmPEhUTUxVTGlzdEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdxdWVzdGlvbklucHV0JykgcXVlc3Rpb25JbnB1dD86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG4gIC8qKiBDb250ZW50Q2hpbGQgZGVjb3JhdG9ycyBhbGxvd2luZyB0aGUgb3ZlcnJpZGUgb2YgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnQgKi9cbiAgQENvbnRlbnRDaGlsZCgnbG9hZGluZ1RwbCcpIGxvYWRpbmdUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCdyZXBvcnRUcGwnKSByZXBvcnRUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCd0b2tlbkNvbnN1bXB0aW9uVHBsJykgdG9rZW5Db25zdW1wdGlvblRwbD86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ2RlYnVnTWVzc2FnZXNUcGwnKSBkZWJ1Z01lc3NhZ2VzVHBsPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBjaGF0U2VydmljZTogQ2hhdFNlcnZpY2U7XG4gIGNvbmZpZzogQ2hhdENvbmZpZztcbiAgbWVzc2FnZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGF0TWVzc2FnZVtdIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHF1ZXN0aW9uID0gJyc7XG5cbiAgX2FjdGlvbnM6IEFjdGlvbltdID0gW107XG4gIHByaXZhdGUgX3Jlc2V0Q2hhdEFjdGlvbiA9IG5ldyBBY3Rpb24oe1xuICAgIGljb246ICdmYXMgZmEtc3luYycsXG4gICAgdGl0bGU6IFwiUmVzZXQgYXNzaXN0YW50XCIsXG4gICAgYWN0aW9uOiAoKSA9PiB0aGlzLm5ld0NoYXQoKVxuICB9KTtcblxuICBwcml2YXRlIF9zdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2RhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVmFyaWFibGVzIHRoYXQgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIG1vZGVsIGluIHVzZSAqL1xuICBtb2RlbERlc2NyaXB0aW9uPzogR2xsbU1vZGVsRGVzY3JpcHRpb247XG5cbiAgbWVzc2FnZVRvRWRpdD86IG51bWJlcjtcbiAgcmVtYXBwZWRNZXNzYWdlVG9FZGl0PzogbnVtYmVyO1xuICBjaGFuZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2ltcGxlQ2hhbmdlcyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgY3VycmVudE1lc3NhZ2VJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBmaXJzdENoYW5nZXNIYW5kbGVkID0gZmFsc2U7XG4gIGlzQXRCb3R0b20gPSB0cnVlO1xuICBpbml0aWFsaXphdGlvbkVycm9yID0gZmFsc2U7XG4gIGVuYWJsZWRVc2VySW5wdXQgPSBmYWxzZTtcbiAgaXNDb25uZWN0ZWQgPSB0cnVlOyAvLyBCeSBkZWZhdWx0LCB0aGUgY2hhdCBpcyBjb25zaWRlcmVkIGNvbm5lY3RlZFxuICByZXRyaWFsQXR0ZW1wdHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLy8gRmxhZyB0byB0cmFjayB3aGV0aGVyIHRoZSAncmVjb25uZWN0ZWQnIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICBwcml2YXRlIF9pc1JlY29ubmVjdGVkTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7XG5cbiAgLy8gSXNzdWUgcmVwb3J0aW5nXG4gIGlzc3VlVHlwZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdElzc3VlVHlwZXM6IHN0cmluZ1tdID0gW1xuICAgICdVc2VyIEludGVyZmFjZSBidWcnLFxuICAgICdJbmNvcnJlY3Qgb3IgbWlzbGVhZGluZyByZXNwb25zZScsXG4gICAgJ0luY29tcGxldGUgcmVzcG9uc2UnLFxuICAgICdUZWNobmljYWwgaXNzdWUnLFxuICAgICdQcml2YWN5L2RhdGEgc2VjdXJpdHkgaXNzdWUnLFxuICAgICdPdGhlcidcbiAgXTtcbiAgaXNzdWVUeXBlOiBzdHJpbmcgPSAnJztcbiAgcmVwb3J0Q29tbWVudD86IHN0cmluZztcbiAgbWVzc2FnZVRvUmVwb3J0PzogQ2hhdE1lc3NhZ2U7XG4gIHJlcG9ydFJhbms/OiBudW1iZXI7XG4gIHJlcG9ydFR5cGU6ICdsaWtlJyB8ICdkaXNsaWtlJyA9ICdkaXNsaWtlJztcbiAgc2hvd1JlcG9ydCA9IGZhbHNlO1xuXG4gIC8vIERlYnVnIG1lc3NhZ2VzXG4gIGRlYnVnTWVzc2FnZXM6IERlYnVnTWVzc2FnZVtdIHwgdW5kZWZpbmVkO1xuICBzaG93RGVidWdNZXNzYWdlcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ByZXZpb3VzUXVlcnk6IFF1ZXJ5O1xuICBwcml2YXRlIF9yZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2FjdGlvbnMucHVzaCh0aGlzLl9yZXNldENoYXRBY3Rpb24pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc3ViLmFkZChcbiAgICAgIHRoaXMubG9naW5TZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgICAgICBmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdsb2dpbi1jb21wbGV0ZScpLFxuICAgICAgICB0YXAoXyA9PiB0aGlzLmluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKSksXG4gICAgICAgIG1hcChfID0+IHRoaXMuY2hhdFNlcnZpY2UuaW5pdENoYXRDb25maWcoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRDb25maWckKSxcbiAgICAgICAgZmlsdGVyKGluaXRDb25maWcgPT4gISFpbml0Q29uZmlnKSxcbiAgICAgICAgc3dpdGNoTWFwKF8gPT4gdGhpcy5jaGF0U2VydmljZS5pbml0KCkpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRQcm9jZXNzJCksXG4gICAgICAgIGZpbHRlcihzdWNjZXNzID0+ICEhc3VjY2VzcyksXG4gICAgICAgIHRhcChfID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCh0aGlzLmNoYXRTZXJ2aWNlLmNvbm5lY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uTG9hZENoYXQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcChfID0+IHRoaXMuY2hhdFNlcnZpY2Uub3ZlcnJpZGVVc2VyKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLnVzZXJPdmVycmlkZSQpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyE7XG4gICAgICAgICAgdGhpcy5lbmFibGVkVXNlcklucHV0ID0gdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmVuYWJsZWRVc2VySW5wdXQ7XG4gICAgICAgICAgdGhpcy5pc3N1ZVR5cGVzID0gdGhpcy5jb25maWcuYXVkaXRTZXR0aW5ncz8uaXNzdWVUeXBlcz8ubGVuZ3RoID8gdGhpcy5jb25maWcuYXVkaXRTZXR0aW5ncyEuaXNzdWVUeXBlcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLl9jb25maWcuZW1pdChjb25maWcpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGVsRGVzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIGlmKCF0aGlzLmZpcnN0Q2hhbmdlc0hhbmRsZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNRdWVyeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkpOyAvLyBJbml0aWFsaXplIHRoZSBwcmV2aW91cyBxdWVyeVxuICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2FkZFNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgIHRoaXMuZmlyc3RDaGFuZ2VzSGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25FcnJvciA9IHRydWVcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuXG4gICAgdGhpcy5fc3ViLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0cmVhbWluZyQsXG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJFxuICAgICAgXSkucGlwZShcbiAgICAgICAgbWFwKChbc3RyZWFtaW5nLCBzdG9wcGluZ0dlbmVyYXRpb25dKSA9PiAhIShzdHJlYW1pbmcgfHwgc3RvcHBpbmdHZW5lcmF0aW9uKSlcbiAgICAgICkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgdGhpcy5fcmVzZXRDaGF0QWN0aW9uLmRpc2FibGVkID0gcmVzdWx0O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuY2hhbmdlcyQubmV4dChjaGFuZ2VzKTtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9kYXRhU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0b3BDb25uZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWw/LmlzQWRtaW5pc3RyYXRvciB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZSB0aGUgY2hhdCBzZXJ2aWNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBAaW5wdXQgcHJvdG9jb2xcbiAgICogVGhpcyBjaGF0IHNlcnZpY2UgaW5zdGFuY2Ugd2lsbCB0aGVuIGJlIHN0b3JlZCBpbiB0aGUgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSB3aXRoIHByb3ZpZGVkIEBpbnB1dCBpbnN0YW5jZUlkIGFzIGEga2V5XG4gICAqL1xuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xuICAgICAgY2FzZSAnUkVTVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLnJlc3RTZXJ2aWNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dFQlNPQ0tFVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLndlYnNvY2tldFNlcnZpY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZm91bmQgYSBDaGF0U2VydmljZSBpbXBsZW1lbnRhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBwcm90b2NvbDogJyR7dGhpcy5wcm90b2NvbH0nYCk7XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0Q2hhdEluc3RhbmNlSWQodGhpcy5pbnN0YW5jZUlkKTtcbiAgICB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2Uuc3RvcmVJbnN0YW5jZSh0aGlzLmluc3RhbmNlSWQsIHRoaXMuY2hhdFNlcnZpY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7IHJldHVybiB0aGlzLl9hY3Rpb25zOyB9XG5cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY2hhbmdlcyBpbiB0aGUgY2hhdCBjb21wb25lbnQuXG4gICAqIElmIHRoZSBjaGF0IHNlcnZpY2UgaXMgYSBXZWJTb2NrZXRDaGF0U2VydmljZSwgaXQgaGFuZGxlcyB0aGUgb3ZlcnJpZGUgb2YgdGhlIG1lc3NhZ2UgaGFuZGxlcnMgaWYgdGhleSBleGlzdC5cbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNoYXQgd2l0aCB0aGUgcHJvdmlkZWQgY2hhdCBtZXNzYWdlcyBpZiB0aGV5IGV4aXN0LCBvdGhlcndpc2UgbG9hZHMgdGhlIGRlZmF1bHQgY2hhdC5cbiAgICogSWYgdGhlIGNoYXQgaXMgaW5pdGlhbGl6ZWQsIHRoZSBpbml0aWFsaXphdGlvbiBldmVudCBpcyBcIlF1ZXJ5XCIsIHRoZSBxdWVyeSBjaGFuZ2VzLCBhbmQgdGhlIHF1ZXJ5Q2hhbmdlU2hvdWxkVHJpZ2dlclJlbG9hZCBmdW5jdGlvbiBpcyBwcm92aWRlZCxcbiAgICogdGhlbiB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgYnkgZGVmYXVsdC5cbiAgICogSXQgdGFrZXMgaW50byBhY2NvdW50IHRoZSBvbmdvaW5nIHN0cmVhbWluZyBwcm9jZXNzIGFuZCB0aGUgb25nb2luZyBzdG9wcGluZyBwcm9jZXNzIHRvIHRyaWdnZXIgdGhhdCBjb25kaXRpb25hbGx5IGRlZmluZSB0aGUgbG9naWNcbiAgICogb2YgdGhlIHJlbG9hZCA6XG4gICAqIC0gSWYgdGhlIGNoYXQgaXMgc3RyZWFtaW5nLCB0aGVuIHN0b3AgdGhlIGdlbmVyYXRpb24gYW5kIHdhaXQgZm9yIHRoZSBmZXRjaCB0byBjb21wbGV0ZSBiZWZvcmUgcmVsb2FkaW5nIHRoZSBjaGF0LlxuICAgKiAtIElmIHRoZSBjaGF0IGlzIHN0b3BwaW5nIHRoZSBnZW5lcmF0aW9uLCB0aGVuIHdhaXQgZm9yIHRoZSBmZXRjaCB0byBjb21wbGV0ZSBiZWZvcmUgcmVsb2FkaW5nIHRoZSBjaGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ2hhbmdlcygpIHtcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzJC52YWx1ZTtcbiAgICAvLyBJZiB0aGUgY2hhdCBzZXJ2aWNlIGlzIGEgV2ViU29ja2V0Q2hhdFNlcnZpY2UsIGhhbmRsZSB0aGUgb3ZlcnJpZGUgb2YgdGhlIG1lc3NhZ2UgaGFuZGxlcnMgaWYgZXhpc3RzXG4gICAgaWYgKGNoYW5nZXM/Lm1lc3NhZ2VIYW5kbGVycyAmJiB0aGlzLm1lc3NhZ2VIYW5kbGVycyAmJiB0aGlzLmNoYXRTZXJ2aWNlIGluc3RhbmNlb2YgV2ViU29ja2V0Q2hhdFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2Uub3ZlcnJpZGVNZXNzYWdlSGFuZGxlcnModGhpcy5tZXNzYWdlSGFuZGxlcnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHdpdGggdGhlIHByb3ZpZGVkIGNoYXQgbWVzc2FnZXMgaWYgZXhpc3RzLCBvdGhlcndpc2UgbG9hZCB0aGUgZGVmYXVsdCBjaGF0XG4gICAgICogT25jZSB0aGUgY2hhdCBpcyBpbml0aWFsaXplZCAoZmlyc3RDaGFuZ2VzSGFuZGxlZCBpcyB0cnVlKSwgYWxsb3cgb3BlbmluZyB0aGUgY2hhdCB3aXRoIHRoZSBuZXcgcHJvdmlkZWQgbWVzc2FnZXMgKGlmIGV4aXN0cylcbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuZmlyc3RDaGFuZ2VzSGFuZGxlZCB8fCBjaGFuZ2VzPy5jaGF0KSB7XG4gICAgICBjb25zdCBvcGVuQ2hhdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXMkLnZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5saXN0U2F2ZWRDaGF0KCk7IC8vIFJlZnJlc2ggdGhlIGxpc3Qgb2Ygc2F2ZWQgY2hhdHNcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5DaGF0KHRoaXMuY2hhdCEubWVzc2FnZXMpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVDaGF0SWQoKTtcbiAgICAgIGlmICh0aGlzLmNoYXQpIHtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ25ldy1jaGF0Jywgeydjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlKSwnY2hhdC1pbml0JzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0KX0pO1xuICAgICAgICBvcGVuQ2hhdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ25ldy1jaGF0Jywgeydjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlKX0pO1xuICAgICAgICB0aGlzLmxvYWREZWZhdWx0Q2hhdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgY2hhdCBpcyBpbml0aWFsaXplZCwgdGhlIGluaXRpYWxpemF0aW9uIGV2ZW50IGlzIFwiUXVlcnlcIiwgdGhlIHF1ZXJ5IGNoYW5nZXMgYW5kIHRoZSBxdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQgZnVuY3Rpb24gaXMgcHJvdmlkZWQsXG4gICAgICogdGhlbiB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZVxuICAgICAqIE90aGVyd2lzZSwgdGhlIGNoYXQgc2hvdWxkIGJlIHJlbG9hZGVkIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBpZiAodGhpcy5maXJzdENoYW5nZXNIYW5kbGVkICYmIGNoYW5nZXM/LnF1ZXJ5ICYmIHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5ldmVudCA9PT0gJ1F1ZXJ5Jykge1xuICAgICAgaWYgKHRoaXMucXVlcnlDaGFuZ2VTaG91bGRUcmlnZ2VyUmVsb2FkID8gdGhpcy5xdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQodGhpcy5fcHJldmlvdXNRdWVyeSwgdGhpcy5xdWVyeSkgOiB0cnVlKSB7XG4gICAgICAgIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJC52YWx1ZSkge1xuICAgICAgICAgIGlmICghdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBzdWJzY3JpcHRpb24gdG8gd2FpdCBmb3IgYm90aCBzdHJlYW1pbmckIGFuZCBzdG9wcGluZ0dlbmVyYXRpb24kIHRvIGJlIGZhbHNlXG4gICAgICAgICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLFxuICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiRcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgZmlsdGVyKChbc3RyZWFtaW5nLCBzdG9wcGluZ10pID0+ICFzdHJlYW1pbmcgJiYgIXN0b3BwaW5nKSwgLy8gV2FpdCB1bnRpbCBib3RoIGFyZSBmYWxzZVxuICAgICAgICAgICAgICB0YWtlKDEpIC8vIENvbXBsZXRlIGFmdGVyIHRoZSBmaXJzdCBtYXRjaFxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSByZWxvYWQgYWZ0ZXIgdGhlIHF1ZXJ5IGNoYW5nZVxuICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUmVsb2FkQWZ0ZXJRdWVyeUNoYW5nZSgpO1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgX3ByZXZpb3VzUXVlcnkgd2l0aCB0aGUgY3VycmVudCBxdWVyeVxuICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1F1ZXJ5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KSk7XG4gICAgICAgICAgICAgIC8vIENsZWFuIHVwIHN1YnNjcmlwdGlvbiBhbmQgcmVzZXQgaXRzIHZhbHVlXG4gICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJC52YWx1ZSkge1xuICAgICAgICAgIGlmICghdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLnN0b3BHZW5lcmF0aW9uKClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb24gYW5kIHJlc2V0IGl0cyB2YWx1ZVxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG9uZ29pbmcgZmV0Y2ggdG8gY29tcGxldGUsIHRoZW4gdHJpZ2dlciB0aGUgcmVsb2FkXG4gICAgICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnBpcGUoXG4gICAgICAgICAgICAgICAgICBmaWx0ZXIoKHN0cmVhbWluZykgPT4gIXN0cmVhbWluZyksXG4gICAgICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgcmVsb2FkIGFmdGVyIHRoZSBxdWVyeSBjaGFuZ2VcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJSZWxvYWRBZnRlclF1ZXJ5Q2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgX3ByZXZpb3VzUXVlcnkgd2l0aCB0aGUgY3VycmVudCBxdWVyeVxuICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNRdWVyeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkpO1xuICAgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgc3Vic2NyaXB0aW9uIGFuZCByZXNldCBpdHMgdmFsdWVcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbiEudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHJlbG9hZCBhZnRlciB0aGUgcXVlcnkgY2hhbmdlXG4gICAgICAgICAgdGhpcy5fdHJpZ2dlclJlbG9hZEFmdGVyUXVlcnlDaGFuZ2UoKTtcbiAgICAgICAgICAvLyBVcGRhdGUgX3ByZXZpb3VzUXVlcnkgd2l0aCB0aGUgY3VycmVudCBxdWVyeVxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzUXVlcnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucXVlcnkpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIF9wcmV2aW91c1F1ZXJ5IHdpdGggdGhlIGN1cnJlbnQgcXVlcnlcbiAgICAgICAgdGhpcy5fcHJldmlvdXNRdWVyeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIHJlbG9hZCBhZnRlciB0aGUgcXVlcnkgY2hhbmdlLlxuICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbnMgdG8gcmVsb2FkIHRoZSBjaGF0IGFmdGVyIGEgcXVlcnkgY2hhbmdlLlxuICAgKiBJdCBzZXRzIHRoZSBzeXN0ZW0gYW5kIHVzZXIgbWVzc2FnZXMsIHJlc2V0cyB0aGUgc2F2ZWRDaGF0SWQsIGdlbmVyYXRlcyBhIG5ldyBjaGF0SWQsXG4gICAqIGdlbmVyYXRlcyBhIG5ldyBjaGF0IGF1ZGl0IGV2ZW50LCBhbmQgaGFuZGxlcyB0aGUgcXVlcnkgbW9kZS5cbiAgICovXG4gIHByaXZhdGUgX3RyaWdnZXJSZWxvYWRBZnRlclF1ZXJ5Q2hhbmdlKCkge1xuICAgIGNvbnN0IHN5c3RlbU1zZyA9IHtyb2xlOiAnc3lzdGVtJywgY29udGVudDogdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zeXN0ZW1Qcm9tcHQsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogZmFsc2V9fTtcbiAgICBjb25zdCB1c2VyTXNnID0ge3JvbGU6ICd1c2VyJywgY29udGVudDogQ2hhdFNlcnZpY2UuZm9ybWF0UHJvbXB0KHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMudXNlclByb21wdCwge3ByaW5jaXBhbDogdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbH0pLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5kaXNwbGF5VXNlclByb21wdH19O1xuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0U2F2ZWRDaGF0SWQodW5kZWZpbmVkKTsgLy8gUmVzZXQgdGhlIHNhdmVkQ2hhdElkXG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUNoYXRJZCgpOyAvLyBHZW5lcmF0ZSBhIG5ldyBjaGF0SWRcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbmV3LWNoYXQnLCB7J2NvbmZpZ3VyYXRpb24nOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUpfSk7IC8vIEdlbmVyYXRlIGEgbmV3IGNoYXQgYXVkaXQgZXZlbnRcbiAgICB0aGlzLl9oYW5kbGVRdWVyeU1vZGUoc3lzdGVtTXNnLCB1c2VyTXNnKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzY3JvbGwgbGlzdGVuZXIgdG8gdGhlIG1lc3NhZ2UgbGlzdCBlbGVtZW50LlxuICAgKiBUaGUgbGlzdGVuZXIgaXMgdHJpZ2dlcmVkIHdoZW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzIG9jY3VyOlxuICAgKiAtIExvYWRpbmcgc3RhdGUgY2hhbmdlc1xuICAgKiAtIE1lc3NhZ2VzIGNoYW5nZVxuICAgKiAtIFN0cmVhbWluZyBzdGF0ZSBjaGFuZ2VzXG4gICAqIC0gU2Nyb2xsIGV2ZW50IG9jY3VycyBvbiB0aGUgbWVzc2FnZSBsaXN0IGVsZW1lbnRcbiAgICpcbiAgICogV2hlbiB0aGUgbGlzdGVuZXIgaXMgdHJpZ2dlcmVkLCBpdCB1cGRhdGVzIHRoZSBgaXNBdEJvdHRvbWAgcHJvcGVydHkuXG4gICAqL1xuICBwcml2YXRlIF9hZGRTY3JvbGxMaXN0ZW5lcigpIHtcbiAgICB0aGlzLl9zdWIuYWRkKFxuICAgICAgbWVyZ2UodGhpcy5sb2FkaW5nJCwgdGhpcy5tZXNzYWdlcyQsIHRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCwgZnJvbUV2ZW50KHRoaXMubWVzc2FnZUxpc3QhLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0F0Qm90dG9tID0gdGhpcy5fdG9nZ2xlU2Nyb2xsQnV0dG9uVmlzaWJpbGl0eSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb2RlbCBkZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgZGVmYXVsdFZhbHVlcyBzZXJ2aWNlX2lkIGFuZCBtb2RlbF9pZFxuICAgKi9cbiAgdXBkYXRlTW9kZWxEZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLm1vZGVsRGVzY3JpcHRpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLmdldE1vZGVsKHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCwgdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgYSBxdWVzdGlvbiBmcm9tIHRoZSB1c2VyLlxuICAgKiBJZiB0aGUgdXNlciBpcyBlZGl0aW5nIGEgcHJldmlvdXMgbWVzc2FnZSwgcmVtb3ZlcyBhbGwgc3Vic2VxdWVudCBtZXNzYWdlcyBmcm9tIHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqIFRyaWdnZXJzIHRoZSBmZXRjaCBvZiB0aGUgYW5zd2VyIGZvciB0aGUgc3VibWl0dGVkIHF1ZXN0aW9uIGJ5IGNhbGxpbmcgX2ZldGNoQW5zd2VyKCkuXG4gICAqIENsZWFycyB0aGUgaW5wdXQgdmFsdWUgaW4gdGhlIFVJLlxuICAgKiDimqDvuI8gSWYgdGhlIGNoYXQgaXMgc3RyZWFtaW5nIG9yIHN0b3BwaW5nIHRoZSBnZW5lcmF0aW9uLCB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkLlxuICAgKi9cbiAgc3VibWl0UXVlc3Rpb24oKSB7XG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnZhbHVlIHx8ICEhdGhpcy5jaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKHRoaXMucXVlc3Rpb24udHJpbSgpICYmIHRoaXMubWVzc2FnZXMkLnZhbHVlICYmIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkpIHtcbiAgICAgIC8vIFdoZW4gdGhlIHVzZXIgc3VibWl0cyBhIHF1ZXN0aW9uLCBpZiB0aGUgdXNlciBpcyBlZGl0aW5nIGEgcHJldmlvdXMgbWVzc2FnZSwgcmVtb3ZlIGFsbCBzdWJzZXF1ZW50IG1lc3NhZ2VzIGZyb20gdGhlIGNoYXQgaGlzdG9yeVxuICAgICAgaWYgKHRoaXMubWVzc2FnZVRvRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbWVzc2FnZXMgaW4gdGhlIFVJXG4gICAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQodGhpcy5tZXNzYWdlcyQudmFsdWUuc2xpY2UoMCwgdGhpcy5tZXNzYWdlVG9FZGl0KSk7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcmF3IG1lc3NhZ2VzIGluIHRoZSBjaGF0IGhpc3Rvcnkgd2hpY2ggaXMgdGhlIGNsZWFuIHZlcnNpb24gdXNlZCB0byBtYWtlIHRoZSBuZXh0IHJlcXVlc3RcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3Rvcnkuc2xpY2UoMCwgdGhpcy5yZW1hcHBlZE1lc3NhZ2VUb0VkaXQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVtYXBwZWRNZXNzYWdlVG9FZGl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIHRoZSBzZWFyY2ggd2FybmluZyBtZXNzYWdlIGlmIGV4aXN0c1xuICAgICAgaWYgKHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkuYXQoLTEpPy5yb2xlID09PSAnc2VhcmNoLXdhcm5pbmcnKSB7XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkucG9wKCk7XG4gICAgICB9XG4gICAgICAvLyBGZXRjaCB0aGUgYW5zd2VyXG4gICAgICB0aGlzLl9mZXRjaEFuc3dlcih0aGlzLnF1ZXN0aW9uLnRyaW0oKSwgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSk7XG4gICAgICAvLyBDbGVhciB0aGUgaW5wdXQgdmFsdWUgaW4gdGhlIFVJXG4gICAgICB0aGlzLnF1ZXN0aW9uSW5wdXQhLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMucXVlc3Rpb25JbnB1dCEubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgYXV0b2A7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBmZXRjaCBvZiB0aGUgYW5zd2VyIGZvciB0aGUgZ2l2ZW4gcXVlc3Rpb24gYW5kIHVwZGF0ZXMgdGhlIGNvbnZlcnNhdGlvbi5cbiAgICogR2VuZXJhdGVzIGFuIGF1ZGl0IGV2ZW50IGZvciB0aGUgdXNlciBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIHF1ZXN0aW9uIGFza2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gY29udmVyc2F0aW9uIC0gVGhlIGN1cnJlbnQgY29udmVyc2F0aW9uIG1lc3NhZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmV0Y2hBbnN3ZXIocXVlc3Rpb246IHN0cmluZywgY29udmVyc2F0aW9uOiBDaGF0TWVzc2FnZVtdKSB7XG4gICAgY29uc3QgdXNlck1zZyA9IHtyb2xlOiAndXNlcicsIGNvbnRlbnQ6IHF1ZXN0aW9uLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWUsIGlzVXNlcklucHV0OiB0cnVlLCBhZGRpdGlvbmFsV29ya2Zsb3dQcm9wZXJ0aWVzOiB0aGlzLmNvbmZpZy5hZGRpdGlvbmFsV29ya2Zsb3dQcm9wZXJ0aWVzfX07XG4gICAgY29uc3QgbWVzc2FnZXMgPSBbLi4uY29udmVyc2F0aW9uLCB1c2VyTXNnXTtcbiAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmZldGNoKG1lc3NhZ2VzKTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHsuLi50aGlzLl9kZWZpbmVNZXNzYWdlQXVkaXREZXRhaWxzKHVzZXJNc2csIG1lc3NhZ2VzLmxlbmd0aCAtIDEpLCAncXVlcnknOiBKU09OLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KSwgJ2lzLXVzZXItaW5wdXQnOiB0cnVlLCAnZW5hYmxlZC1mdW5jdGlvbnMnOiB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKS5tYXAoZnVuYyA9PiBmdW5jLm5hbWUpLCAnYWRkaXRpb25hbC13b3JrZmxvdy1wcm9wZXJ0aWVzJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllcyl9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBlbmRpbmcgb24gdGhlIGNvbm5lY3Rpb24ncyBzdGF0ZSA6XG4gICAqICAtIElmIGNvbm5lY3RlZCA9PiBnaXZlbiBhIGxpc3Qgb2YgbWVzc2FnZXMsIHRoZSBjaGF0IGVuZHBvaW50IGlzIGludm9rZWQgZm9yIGEgY29udGludWF0aW9uIGFuZCB1cGRhdGVzIHRoZSBsaXN0IG9mIG1lc3NhZ2VzIGFjY29yZGluZ2x5LlxuICAgKiAgLSBJZiBhbnkgb3RoZXIgc3RhdGUgPT4gYSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoZSBjaGF0LlxuICAgKiDimqDvuI8gSWYgdGhlIGFzc2lzdGFudCBpcyBzdHJlYW1pbmcgb3Igc3RvcHBpbmcgdGhlIGdlbmVyYXRpb24sIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQuXG4gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbGlzdCBvZiBtZXNzYWdlcyB0byBpbnZva2UgdGhlIGNoYXQgZW5kcG9pbnQgd2l0aFxuICAgKi9cbiAgcHVibGljIGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSB7XG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnZhbHVlIHx8ICEhdGhpcy5jaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5fZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX2RhdGFTdWJzY3JpcHRpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLmZldGNoKG1lc3NhZ2VzLCB0aGlzLnF1ZXJ5KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiByZXMgPT4gdGhpcy51cGRhdGVEYXRhKHJlcy5oaXN0b3J5KSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXR1cygpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7cm9sZTogJ2Nvbm5lY3Rpb24tZXJyb3InLCBjb250ZW50OiB0aGlzLmNvbmZpZy5jb25uZWN0aW9uU2V0dGluZ3MuY29ubmVjdGlvbkVycm9yTWVzc2FnZSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0cnVlfX07XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQoWy4uLm1lc3NhZ2VzLCBtZXNzYWdlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IG1lc3NhZ2UgaWYgaXQncyBhbiBlbXB0eSBtZXNzYWdlXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGR1ZSB0byB0aGUgbWFubmVyIGluIHdoaWNoIHRoZSBjaGF0IHNlcnZpY2UgaGFuZGxlcyBjb25zZWN1dGl2ZSBtZXNzYWdlc1xuICAgICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzJC52YWx1ZT8uYXQoLTEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNFbXB0eUFzc2lzdGFudE1lc3NhZ2UobGFzdE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQodGhpcy5tZXNzYWdlcyQudmFsdWU/LnNsaWNlKDAsIC0xKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtyb2xlOiAnY29ubmVjdGlvbi1lcnJvcicsIGNvbnRlbnQ6IHRoaXMuY29uZmlnLmNvbm5lY3Rpb25TZXR0aW5ncy5jb25uZWN0aW9uRXJyb3JNZXNzYWdlLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fTtcbiAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQoWy4uLm1lc3NhZ2VzLCBtZXNzYWdlXSk7XG4gICAgfVxuXG4gICAgaWYodGhpcy5hdXRvbWF0aWNTY3JvbGxUb0xhc3RSZXNwb25zZSkge1xuICAgICAgdGhpcy5zY3JvbGxEb3duKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJ5IHRvIGZldGNoIHRoZSBtZXNzYWdlcyBpZiB0aGUgY29ubmVjdGlvbiBpc3N1ZXMuXG4gICAqICAtIElmIHJlY29ubmVjdGluZyA9PiBrZWVwIGRpc3BsYXkgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZSBldmVuIHdoZW4gY2xpY2tpbmcgb24gdGhlIFwicmV0cnlcIiBidXR0b24gYW5kIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiByZXRyaWFsIGF0dGVtcHRzLCB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyByZS1lc3RhYmxpc2hlZFxuICAgKiAgLSBJZiBkaXNjb25uZWN0ZWQgPT4gT24gY2xpY2sgb24gdGhlIFwicmV0cnlcIiBidXR0b24sIHN0YXJ0IHRoZSBjb25uZWN0aW9uIHByb2Nlc3Mgd2hpbGUgZGlzcGxheWluZyB0aGUgY29ubmVjdGlvbiBlcnJvciBtZXNzYWdlIDpcbiAgICogICAgICAqIElmIHN1Y2Nlc3NmdWwgPT4gZ2l2ZW4gYSBsaXN0IG9mIG1lc3NhZ2VzLCB0aGUgY2hhdCBlbmRwb2ludCBpcyBpbnZva2VkIGZvciBhIGNvbnRpbnVhdGlvbiBhbmQgdXBkYXRlcyB0aGUgbGlzdCBvZiBtZXNzYWdlcyBhY2NvcmRpbmdseS5cbiAgICogICAgICAqIElmIGZhaWxlZCA9PiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHJldHJpYWwgYXR0ZW1wdHNcbiAgICovXG4gIHJldHJ5RmV0Y2goKSB7XG4gICAgaWYodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSB7XG4gICAgICAvLyBBIG9uZS10aW1lIGxpc3RlbmVyIGZvciByZWNvbm5lY3RlZCBldmVudFxuICAgICAgY29uc3Qgb25SZWNvbm5lY3RlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIEdldCB0aGUgbWVzc2FnZXMgd2l0aG91dCB0aGUgbGFzdCBvbmUgKHRoZSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2UpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcyQudmFsdWUhLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBcInVzZXJcIiBtZXNzYWdlIGluIHRoZSBtZXNzYWdlcyBsaXN0XG4gICAgICAgIGxldCBpbmRleCA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChpbmRleCA+PSAwICYmIG1lc3NhZ2VzW2luZGV4XS5yb2xlICE9PSAndXNlcicpIHtcbiAgICAgICAgICBpbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGEgdXNlciBtZXNzYWdlIGlzIGZvdW5kIChhbmQgaXQgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSksIHJlbW92ZSBhbGwgc3Vic2VxdWVudCBtZXNzYWdlcyBmcm9tIHRoZSBjaGF0IGhpc3RvcnlcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtZXNzYWdlcyBpbiB0aGUgVUlcbiAgICAgICAgLy8gYW5kIGZldGNoIHRoZSBhbnN3ZXIgZnJvbSB0aGUgYXNzaXN0YW50XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlcyQubmV4dCh0aGlzLm1lc3NhZ2VzJC52YWx1ZSEuc2xpY2UoMCwgaW5kZXgrMSkpO1xuICAgICAgICAgIGNvbnN0IHJlbWFwcGVkSW5kZXggPSB0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShpbmRleCk7XG4gICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhLnNsaWNlKDAsIHJlbWFwcGVkSW5kZXgrMSk7XG4gICAgICAgICAgdGhpcy5mZXRjaCh0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJldHJpYWxBdHRlbXB0cyA9IHVuZGVmaW5lZDsgLy8gUmVzZXQgdGhlIG51bWJlciBvZiByZXRyaWFsIGF0dGVtcHRzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUbyByZW1vdmUgdGhlIGhhbmRsZXIgZm9yIG9ucmVjb25uZWN0ZWQoKSBhZnRlciBpdCdzIGJlZW4gcmVnaXN0ZXJlZCxjYW5ub3QgZGlyZWN0bHkgdXNlIG9mZigpIGxpa2UgeW91IHdvdWxkIGZvciBub3JtYWwgZXZlbnRzIHJlZ2lzdGVyZWQgd2l0aCBjb25uZWN0aW9uLm9uKCkuXG4gICAgICAgICAqIEluc3RlYWQsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVtb3ZlIG9yIHJlc2V0IHRoZSBoYW5kbGVyIGJ5IGFzc2lnbmluZyBpdCB0byBudWxsIG9yIGFuIGVtcHR5IGZ1bmN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICAodGhpcy5jaGF0U2VydmljZSBhcyBXZWJTb2NrZXRDaGF0U2VydmljZSkuY29ubmVjdGlvbiEub25yZWNvbm5lY3RlZCgoKSA9PiB7fSk7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBmbGFnIHRvIGVuc3VyZSB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGFnYWluIHdoZW4gbmVlZGVkXG4gICAgICAgIHRoaXMuX2lzUmVjb25uZWN0ZWRMaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgY29ubmVjdGlvbidzIHN0YXRlLCB0YWtlIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25cbiAgICAgIHN3aXRjaCAodGhpcy5jaGF0U2VydmljZS5jb25uZWN0aW9uIS5zdGF0ZSkge1xuICAgICAgICBjYXNlIEh1YkNvbm5lY3Rpb25TdGF0ZS5Db25uZWN0ZWQ6XG4gICAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgcmUtZXN0YWJsaXNoZWQgaW4gdGhlIG1lYW50aW1lLCBmZXRjaCB0aGUgbWVzc2FnZXNcbiAgICAgICAgICBvblJlY29ubmVjdGVkSGFuZGxlcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEh1YkNvbm5lY3Rpb25TdGF0ZS5SZWNvbm5lY3Rpbmc6XG4gICAgICAgICAgLy8gQXR0YWNoIHRoZSByZWNvbm5lY3RlZCBsaXN0ZW5lciBpZiBub3QgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICAgICAgaWYgKCF0aGlzLl9pc1JlY29ubmVjdGVkTGlzdGVuZXJSZWdpc3RlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmNvbm5lY3Rpb24hLm9ucmVjb25uZWN0ZWQob25SZWNvbm5lY3RlZEhhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5faXNSZWNvbm5lY3RlZExpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEluY3JlYXNlIHRoZSBudW1iZXIgb2YgcmV0cmlhbCBhdHRlbXB0c1xuICAgICAgICAgIHRoaXMucmV0cmlhbEF0dGVtcHRzID0gdGhpcy5yZXRyaWFsQXR0ZW1wdHMgPyB0aGlzLnJldHJpYWxBdHRlbXB0cysxIDogMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBIdWJDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGVkOlxuICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgY29ubmVjdGlvblxuICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2Uuc3RhcnRDb25uZWN0aW9uKClcbiAgICAgICAgICAudGhlbigoKSA9PiBvblJlY29ubmVjdGVkSGFuZGxlcigpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB7IC8vIElmIHRoZSBjb25uZWN0aW9uIGZhaWxzLCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHJldHJpYWwgYXR0ZW1wdHNcbiAgICAgICAgICAgIHRoaXMucmV0cmlhbEF0dGVtcHRzID0gdGhpcy5yZXRyaWFsQXR0ZW1wdHMgPyB0aGlzLnJldHJpYWxBdHRlbXB0cysxIDogMTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNpZ25hbFIgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQuXG4gICAqIEZvciB0aGUgUkVTVCBwcm90b2NvbCwgdGhlIGNvbm5lY3Rpb24gaXMgYWx3YXlzIGNvbnNpZGVyZWQgY29ubmVjdGVkIChmb3IgdGhlIG1vbWVudCkuXG4gICAqL1xuICBwcml2YXRlIF91cGRhdGVDb25uZWN0aW9uU3RhdHVzKCkge1xuICAgIHRoaXMuaXNDb25uZWN0ZWQgPSAodGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSA/IHRoaXMuY2hhdFNlcnZpY2UuY29ubmVjdGlvbiEuc3RhdGUgPT09IEh1YkNvbm5lY3Rpb25TdGF0ZS5Db25uZWN0ZWQgOiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgVUkgd2l0aCB0aGUgbmV3IG1lc3NhZ2VzXG4gICAqIEBwYXJhbSBtZXNzYWdlc1xuICAgKi9cbiAgdXBkYXRlRGF0YShtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSkge1xuICAgIHRoaXMubWVzc2FnZXMkLm5leHQobWVzc2FnZXMpO1xuICAgIHRoaXMuZGF0YS5lbWl0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMucXVlc3Rpb24gPSAnJztcbiAgICBpZih0aGlzLmF1dG9tYXRpY1Njcm9sbFRvTGFzdFJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnNjcm9sbERvd24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhdCBkaXNjdXNzaW9uIGlzIHNjcm9sbGVkIGRvd24gdG8gdGhlIGJvdHRvbSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIF90b2dnbGVTY3JvbGxCdXR0b25WaXNpYmlsaXR5KCk6IGJvb2xlYW4ge1xuICAgIGlmKHRoaXMubWVzc2FnZUxpc3Q/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMubWVzc2FnZUxpc3Q/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5tZXNzYWdlTGlzdD8ubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLSAxKSA8PSB0aGlzLm1lc3NhZ2VMaXN0Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgY2hhdCBkaXNjdXNzaW9uXG4gICAqL1xuICBzY3JvbGxEb3duKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYodGhpcy5tZXNzYWdlTGlzdD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5tZXNzYWdlTGlzdC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIG5ldyBjaGF0IHdpdGggdGhlIGRlZmF1bHRWYWx1ZXMgc2V0dGluZ3MuXG4gICAqIFRoZSBzYXZlZENoYXRJZCBpbiB0aGUgY2hhdCBzZXJ2aWNlIHdpbGwgYmUgcmVzZXQsIHNvIHRoYXQgdGhlIHVwY29taW5nIHNhdmVkIGNoYXQgb3BlcmF0aW9ucyB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgZnJlc2ggbmV3IGNoYXQuXG4gICAqIElmIHRoZSBzYXZlZENoYXQgZmVhdHVyZSBpcyBlbmFibGVkLCB0aGUgbGlzdCBvZiBzYXZlZCBjaGF0cyB3aWxsIGJlIHJlZnJlc2hlZC5cbiAgICog4pqg77iPIElmIHRoZSBhc3Npc3RhbnQgaXMgc3RyZWFtaW5nIG9yIHN0b3BwaW5nIHRoZSBnZW5lcmF0aW9uLCB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkLlxuICAgKi9cbiAgbmV3Q2hhdCgpIHtcbiAgICBpZiAoISF0aGlzLmNoYXRTZXJ2aWNlLnN0cmVhbWluZyQudmFsdWUgfHwgISF0aGlzLmNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiQudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGF0U2VydmljZS5zZXRTYXZlZENoYXRJZCh1bmRlZmluZWQpOyAvLyBSZXNldCB0aGUgc2F2ZWRDaGF0SWRcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQ2hhdElkKCk7IC8vIEdlbmVyYXRlIGEgbmV3IGNoYXRJZFxuICAgIHRoaXMuY2hhdFNlcnZpY2UubGlzdFNhdmVkQ2hhdCgpOyAvLyBSZWZyZXNoIHRoZSBsaXN0IG9mIHNhdmVkIGNoYXRzXG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ25ldy1jaGF0Jywgeydjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlKX0pOyAvLyBHZW5lcmF0ZSBhIG5ldyBjaGF0IGF1ZGl0IGV2ZW50XG4gICAgdGhpcy5sb2FkRGVmYXVsdENoYXQoKTsgLy8gU3RhcnQgYSBuZXcgY2hhdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgSURzIHRvIHRoZSBhc3Npc3RhbnQuXG4gICAqIElmIG5vIGRvY3VtZW50IElEcyBhcmUgcHJvdmlkZWQsIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQuXG4gICAqIElmIHRoZSBhY3Rpb24gZm9yIGF0dGFjaGluZyBhIGRvY3VtZW50IGlzIG5vdCBkZWZpbmVkIGF0IHRoZSBhcHBsaWNhdGlvbiBjdXN0b21pemF0aW9uIGxldmVsLCBhbiBlcnJvciBpcyBsb2dnZWQuXG4gICAqIOKaoO+4jyBJZiB0aGUgYXNzaXN0YW50IGlzIHN0cmVhbWluZyBvciBzdG9wcGluZyB0aGUgZ2VuZXJhdGlvbiwgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZC5cbiAgICogQHBhcmFtIGlkcyAtIEFuIGFycmF5IG9mIGRvY3VtZW50IElEcyB0byBhdHRhY2guXG4gICAqL1xuICBhdHRhY2hUb0NoYXQoaWRzOiBzdHJpbmdbXSkge1xuICAgIGlmICghIXRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJC52YWx1ZSB8fCAhIXRoaXMuY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJC52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlkcyB8fCBpZHM/Lmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXR0YWNoRG9jQWN0aW9uID0gdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmFjdGlvbnM/LltcImF0dGFjaERvY0FjdGlvblwiXTtcbiAgICBpZiAoIWF0dGFjaERvY0FjdGlvbikge1xuICAgICAgY29uc29sZS5lcnJvcihgTm8gYWN0aW9uIGlzIGRlZmluZWQgZm9yIGF0dGFjaGluZyBhIGRvY3VtZW50IHRvIHRoZSBhc3Npc3RhbnQgXCIke3RoaXMuaW5zdGFuY2VJZH1cImApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1c2VyTXNnID0geyByb2xlOiAndXNlcicsIGNvbnRlbnQ6ICcnLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IGZhbHNlLCBpc1VzZXJJbnB1dDogZmFsc2UsIHR5cGU6IFwiQWN0aW9uXCIsIGZvcmNlZFdvcmtmbG93OiBhdHRhY2hEb2NBY3Rpb24uZm9yY2VkV29ya2Zsb3csIGZvcmNlZFdvcmtmbG93UHJvcGVydGllczogey4uLihhdHRhY2hEb2NBY3Rpb24uZm9yY2VkV29ya2Zsb3dQcm9wZXJ0aWVzIHx8IHt9KSwgaWRzfSwgYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllczogdGhpcy5jb25maWcuYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllc319O1xuICAgIC8vIFJlbW92ZSB0aGUgc2VhcmNoIHdhcm5pbmcgbWVzc2FnZSBpZiBleGlzdHNcbiAgICBpZiAodGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSEuYXQoLTEpPy5yb2xlID09PSAnc2VhcmNoLXdhcm5pbmcnKSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5IS5wb3AoKTtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZXMgPSBbLi4udGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSEsIHVzZXJNc2ddO1xuICAgIHRoaXMubWVzc2FnZXMkLm5leHQobWVzc2FnZXMpO1xuICAgIHRoaXMuZmV0Y2gobWVzc2FnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBkZWZhdWx0IGNoYXQgd2l0aCB0aGUgZGVmYXVsdFZhbHVlcyBzZXR0aW5nc1xuICAgKiBJZiB0aGUgY2hhdCBpcyBtZWFudCB0byBiZSBpbml0aWFsaXplZCB3aXRoIGV2ZW50ID09PSBcIlF1ZXJ5XCIsIHRoZSBjb3JyZXNwb25kaW5nIHVzZXIgcXVlcnkgbWVzc2FnZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjaGF0IGhpc3RvcnlcbiAgICovXG4gIGxvYWREZWZhdWx0Q2hhdCgpIHtcbiAgICAvLyBEZWZpbmUgdGhlIGRlZmF1bHQgc3lzdGVtIHByb21wdCBhbmQgdXNlciBwcm9tcHQgbWVzc2FnZXNcbiAgICBjb25zdCBzeXN0ZW1Nc2cgPSB7cm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6IHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc3lzdGVtUHJvbXB0LCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IGZhbHNlfX07XG4gICAgY29uc3QgdXNlck1zZyA9IHtyb2xlOiAndXNlcicsIGNvbnRlbnQ6IENoYXRTZXJ2aWNlLmZvcm1hdFByb21wdCh0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLnVzZXJQcm9tcHQsIHtwcmluY2lwYWw6IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWx9KSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3MuZGlzcGxheVVzZXJQcm9tcHR9fTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3MuaW5pdGlhbGl6YXRpb24uZXZlbnQgPT09ICdRdWVyeScpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVF1ZXJ5TW9kZShzeXN0ZW1Nc2csIHVzZXJNc2cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oYW5kbGVQcm9tcHRNb2RlKHN5c3RlbU1zZywgdXNlck1zZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHByb21wdCBtb2RlIG9mIHRoZSBjaGF0IGNvbXBvbmVudC5cbiAgICogSWYgYHNlbmRVc2VyUHJvbXB0YCBpcyB0cnVlLCBpdCBvcGVucyB0aGUgY2hhdCB3aXRoIGJvdGggc3lzdGVtIGFuZCB1c2VyIG1lc3NhZ2VzLFxuICAgKiBhbmQgZ2VuZXJhdGVzIGF1ZGl0IGV2ZW50cyBmb3IgYm90aCBtZXNzYWdlcy5cbiAgICogSWYgYHNlbmRVc2VyUHJvbXB0YCBpcyBmYWxzZSwgaXQgb3BlbnMgdGhlIGNoYXQgd2l0aCBvbmx5IHRoZSBzeXN0ZW0gbWVzc2FnZSxcbiAgICogYW5kIGdlbmVyYXRlcyBhbiBhdWRpdCBldmVudCBmb3IgdGhlIHN5c3RlbSBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gc3lzdGVtTXNnIC0gVGhlIHN5c3RlbSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY2hhdC5cbiAgICogQHBhcmFtIHVzZXJNc2cgLSBUaGUgdXNlciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY2hhdCAob3B0aW9uYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlUHJvbXB0TW9kZShzeXN0ZW1Nc2c6IENoYXRNZXNzYWdlLCB1c2VyTXNnOiBDaGF0TWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3Muc2VuZFVzZXJQcm9tcHQpIHtcbiAgICAgIHRoaXMub3BlbkNoYXQoW3N5c3RlbU1zZywgdXNlck1zZ10pO1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ21lc3NhZ2UnLCB0aGlzLl9kZWZpbmVNZXNzYWdlQXVkaXREZXRhaWxzKHN5c3RlbU1zZywgMCkpO1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ21lc3NhZ2UnLCB0aGlzLl9kZWZpbmVNZXNzYWdlQXVkaXREZXRhaWxzKHVzZXJNc2csIDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuQ2hhdChbc3lzdGVtTXNnXSk7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHRoaXMuX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHMoc3lzdGVtTXNnLCAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHF1ZXJ5IG1vZGUgYnkgZGlzcGxheWluZyB0aGUgc3lzdGVtIG1lc3NhZ2UsIHVzZXIgbWVzc2FnZSwgYW5kIHVzZXIgcXVlcnkgbWVzc2FnZS5cbiAgICogSWYgdGhlIHByb3ZpZGVkIHF1ZXJ5IHRleHQgaXMgbm90IGVtcHR5LCB0aGVuIGFkZCB0aGUgdXNlciBxdWVyeSBtZXNzYWdlIHRvIHRoZSBjaGF0IGhpc3RvcnkgYW5kIGludm9rZSB0aGUgYXNzaXN0YW50XG4gICAqIE90aGVyd2lzZSwganVzdCBzdGFydCBhIG5ldyBjaGF0IHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UgaW52aXRpbmcgdGhlIHVzZXIgdG8gcGVyZm9ybSBhIGZ1bGwgdGV4dCBzZWFyY2ggdG8gcmV0cmlldmUgc29tZSByZXN1bHRzXG4gICAqIEBwYXJhbSBzeXN0ZW1Nc2cgLSBUaGUgc3lzdGVtIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICAgKiBAcGFyYW0gdXNlck1zZyAtIFRoZSB1c2VyIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlUXVlcnlNb2RlKHN5c3RlbU1zZzogQ2hhdE1lc3NhZ2UsIHVzZXJNc2c6IENoYXRNZXNzYWdlKSB7XG4gICAgaWYgKCEhdGhpcy5xdWVyeS50ZXh0KSB7XG4gICAgICBjb25zdCB1c2VyUXVlcnlNc2cgPSB7cm9sZTogJ3VzZXInLCBjb250ZW50OiB0aGlzLnF1ZXJ5LnRleHQsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmluaXRpYWxpemF0aW9uLmRpc3BsYXlVc2VyUXVlcnksIHF1ZXJ5OiB0aGlzLnF1ZXJ5LCBmb3JjZWRXb3JrZmxvdzogdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmluaXRpYWxpemF0aW9uLmZvcmNlZFdvcmtmbG93LCBpc1VzZXJJbnB1dDogdHJ1ZSwgYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllczogdGhpcy5jb25maWcuYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllc319O1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5zZW5kVXNlclByb21wdCkge1xuICAgICAgICB0aGlzLm9wZW5DaGF0KFtzeXN0ZW1Nc2csIHVzZXJNc2csIHVzZXJRdWVyeU1zZ10pO1xuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIHRoaXMuX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHMoc3lzdGVtTXNnLCAwKSk7XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgdGhpcy5fZGVmaW5lTWVzc2FnZUF1ZGl0RGV0YWlscyh1c2VyTXNnLCAxKSk7XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgey4uLnRoaXMuX2RlZmluZU1lc3NhZ2VBdWRpdERldGFpbHModXNlclF1ZXJ5TXNnLCAyKSwgJ3F1ZXJ5JzogSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVyeSkgLCdpcy11c2VyLWlucHV0JzogdHJ1ZSwgJ2ZvcmNlZC13b3JrZmxvdyc6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5mb3JjZWRXb3JrZmxvdywgJ2VuYWJsZWQtZnVuY3Rpb25zJzogdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnM/LmZpbHRlcihmdW5jID0+IGZ1bmMuZW5hYmxlZCkubWFwKGZ1bmMgPT4gZnVuYy5uYW1lKSwgJ2FkZGl0aW9uYWwtd29ya2Zsb3ctcHJvcGVydGllcyc6SlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllcyl9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3BlbkNoYXQoW3N5c3RlbU1zZywgdXNlclF1ZXJ5TXNnXSk7XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgdGhpcy5fZGVmaW5lTWVzc2FnZUF1ZGl0RGV0YWlscyhzeXN0ZW1Nc2csIDApKTtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ21lc3NhZ2UnLCB7Li4udGhpcy5fZGVmaW5lTWVzc2FnZUF1ZGl0RGV0YWlscyh1c2VyUXVlcnlNc2csIDEpLCAncXVlcnknOiBKU09OLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KSAsJ2lzLXVzZXItaW5wdXQnOiB0cnVlLCAnZm9yY2VkLXdvcmtmbG93JzogdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmluaXRpYWxpemF0aW9uLmZvcmNlZFdvcmtmbG93LCAnZW5hYmxlZC1mdW5jdGlvbnMnOiB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKS5tYXAoZnVuYyA9PiBmdW5jLm5hbWUpLCAnYWRkaXRpb25hbC13b3JrZmxvdy1wcm9wZXJ0aWVzJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuYWRkaXRpb25hbFdvcmtmbG93UHJvcGVydGllcyl9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgd2FybmluZ01zZyA9IHtyb2xlOiAnc2VhcmNoLXdhcm5pbmcnLCBjb250ZW50OiB0aGlzLmNvbmZpZy5nbG9iYWxTZXR0aW5ncy5zZWFyY2hXYXJuaW5nTWVzc2FnZSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0cnVlfX07XG4gICAgICB0aGlzLm9wZW5DaGF0KFtzeXN0ZW1Nc2csIHdhcm5pbmdNc2ddKTtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgdGhpcy5fZGVmaW5lTWVzc2FnZUF1ZGl0RGV0YWlscyh3YXJuaW5nTXNnLCAwKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVmaW5lTWVzc2FnZUF1ZGl0RGV0YWlscyhtZXNzYWdlOiBDaGF0TWVzc2FnZSwgcmFuazogbnVtYmVyKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkdXJhdGlvbic6IDAsXG4gICAgICAndGV4dCc6IG1lc3NhZ2UuY29udGVudCxcbiAgICAgICdyb2xlJzogbWVzc2FnZS5yb2xlLFxuICAgICAgJ3JhbmsnOiByYW5rXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydC9vcGVuIGEgbmV3IGNoYXQgd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZXMgYW5kIGNoYXRJZFxuICAgKiBJZiB0aGUgbGFzdCBtZXNzYWdlIGlzIGZyb20gdGhlIHVzZXIsIGEgcmVxdWVzdCB0byB0aGUgYXNzaXN0YW50IGlzIG1hZGUgdG8gZ2V0IGFuIGFuc3dlclxuICAgKiBJZiB0aGUgbGFzdCBtZXNzYWdlIGlzIGZyb20gdGhlIGFzc2lzdGFudCwgdGhlIGNvbnZlcnNhdGlvbiBpcyBsb2FkZWQgcmlnaHQgYXdheVxuICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIGxpc3Qgb2YgbWVzc2FnZXMgb2YgdGhlIGNoYXRcbiAgICogQHBhcmFtIHNhdmVkQ2hhdElkICBUaGUgaWQgb2YgdGhlIHNhdmVkIGNoYXQuIElmIHByb3ZpZGVkIChpZS4gYW4gZXhpc3RpbmcgZGlzY3Vzc2lvbiBpbiB0aGUgc2F2ZWQgY2hhdCBpbmRleCksIHVwZGF0ZSB0aGUgc2F2ZWRDaGF0SWQgaW4gdGhlIGNoYXQgc2VydmljZSBmb3IgdGhlIHVwY29taW5nIHNhdmVkIGNoYXQgb3BlcmF0aW9uc1xuICAgKi9cbiAgb3BlbkNoYXQobWVzc2FnZXM6IFJhd01lc3NhZ2VbXSwgc2F2ZWRDaGF0SWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIW1lc3NhZ2VzIHx8ICFBcnJheS5pc0FycmF5KG1lc3NhZ2VzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byBsb2FkIHRoZSBkaXNjdXNzaW9uLiBJbnZhbGlkIG1lc3NhZ2VzIHJlY2VpdmVkIDonLCBtZXNzYWdlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzYXZlZENoYXRJZCkge1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5zZXRTYXZlZENoYXRJZChzYXZlZENoYXRJZCk7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQ2hhdElkKHNhdmVkQ2hhdElkKTtcbiAgICB9XG4gICAgdGhpcy5yZXNldENoYXQoKTtcbiAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5ID0gbWVzc2FnZXM7XG4gICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlcy5hdCgtMSk7XG4gICAgaWYobGFzdE1lc3NhZ2UgJiYgbGFzdE1lc3NhZ2Uucm9sZSA9PT0gJ3VzZXInKSB7XG4gICAgICB0aGlzLmZldGNoKG1lc3NhZ2VzKTsgLy8gSWYgdGhlIGxhc3QgbWVzc2FnZSBpZiBmcm9tIGEgdXNlciwgYW4gYW5zd2VyIGZyb20gdGhlIGFzc2lzdGFudCBpcyBleHBlY3RlZFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YShtZXNzYWdlcyk7IC8vIElmIHRoZSBsYXN0IG1lc3NhZ2UgaWYgZnJvbSB0aGUgYXNzaXN0YW50LCB3ZSBjYW4gbG9hZCB0aGUgY29udmVyc2F0aW9uIHJpZ2h0IGF3YXlcbiAgICAgIHRoaXMudGVybWluYXRlRmV0Y2goKTtcbiAgICB9XG4gICAgdGhpcy5fYWRkU2Nyb2xsTGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY2hhdCBieSBjbGVhcmluZyB0aGUgY2hhdCBoaXN0b3J5IGFuZCB0aGUgVUkgYWNjb3JkaW5nbHlcbiAgICogVGhlIHVzZXIgaW5wdXQgd2lsbCBiZSBjbGVhcmVkXG4gICAqIFRoZSBmZXRjaCBzdWJzY3JpcHRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkXG4gICAqL1xuICByZXNldENoYXQoKSB7XG4gICAgaWYodGhpcy5tZXNzYWdlcyQudmFsdWUpIHtcbiAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQodW5kZWZpbmVkKTsgLy8gUmVzZXQgY2hhdFxuICAgIH1cbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5ID0gdW5kZWZpbmVkOyAvLyBSZXNldCBjaGF0IGhpc3RvcnlcbiAgICB0aGlzLnF1ZXN0aW9uID0gJyc7XG4gICAgdGhpcy50ZXJtaW5hdGVGZXRjaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGFuZCBMb2FkIHRoZSBzYXZlZCBjaGF0IGZyb20gdGhlIHNhdmVkIGNoYXQgaW5kZXguXG4gICAqIElmIHRoZSBzYXZlZCBjaGF0IGlzIGZvdW5kLCB0aGUgY2hhdCBkaXNjdXNzaW9uIHdpbGwgYmUgbG9hZGVkIHdpdGggdGhlIHByb3ZpZGVkIG1lc3NhZ2VzIGFuZCBjaGF0SWRcbiAgICovXG4gIG9uTG9hZENoYXQoKSB7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuX3N1Yi5hZGQoXG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmxvYWRTYXZlZENoYXQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihzYXZlZENoYXQgPT4gISFzYXZlZENoYXQpLFxuICAgICAgICAgIHN3aXRjaE1hcChzYXZlZENoYXQgPT4gdGhpcy5jaGF0U2VydmljZS5nZXRTYXZlZENoYXQoc2F2ZWRDaGF0IS5pZCkpLFxuICAgICAgICAgIGZpbHRlcihzYXZlZENoYXRIaXN0b3J5ID0+ICEhc2F2ZWRDaGF0SGlzdG9yeSksXG4gICAgICAgICAgdGFwKHNhdmVkQ2hhdEhpc3RvcnkgPT4gdGhpcy5vcGVuQ2hhdChzYXZlZENoYXRIaXN0b3J5IS5oaXN0b3J5LCBzYXZlZENoYXRIaXN0b3J5IS5pZCkpXG4gICAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGN1cnJlbnQgYXNzaXN0YW50J3MgYW5zd2VyLlxuICAgKiBUaGUgZmV0Y2ggc3Vic2NyaXB0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAgICovXG4gIHN0b3BHZW5lcmF0aW9uKCkge1xuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc3RvcEdlbmVyYXRpb24oKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB0aGlzLnRlcm1pbmF0ZUZldGNoKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZSB0aGUgZmV0Y2ggcHJvY2VzcyBieSB1bnN1YnNjcmliaW5nIGZyb20gdGhlIGRhdGEgc3Vic2NyaXB0aW9uIGFuZCB1cGRhdGluZyB0aGUgbG9hZGluZyBzdGF0dXMgdG8gZmFsc2UuXG4gICAqIEFkZGl0aW9uYWxseSwgZm9jdXMgb24gdGhlIGNoYXQgaW5wdXQgaWYgdGhlIGZvY3VzQWZ0ZXJSZXNwb25zZSBmbGFnIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgdGVybWluYXRlRmV0Y2goKSB7XG4gICAgdGhpcy5fZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9kYXRhU3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNBZnRlclJlc3BvbnNlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbklucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHByZXZpb3VzIHVzZXIgbWVzc2FnZSBvZiB0aGUgY2hhdCBoaXN0b3J5IHRvIHRoZSBjaGF0IHVzZXIgaW5wdXQuXG4gICAqIFRodXMsIHRoZSB1c2VyIGNhbiBlZGl0IGFuZCByZXN1Ym1pdCB0aGUgbWVzc2FnZS5cbiAgICogT25jZSB0aGUgZWRpdGVkIG1lc3NhZ2UgaXMgc3VibWl0dGVkLCBhbGwgc3Vic2VxdWVudCBtZXNzYWdlcyBzdGFydGluZyBmcm9tIEBwYXJhbSBpbmRleCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgaGlzdG9yeSBhbmQgdGhlIFVJIHdpbGwgYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAgICogVGhlIGFzc2lzdGFudCB3aWxsIHJlZ2VuZXJhdGUgYSBuZXcgYW5zd2VyIGJhc2VkIG9uIHRoZSB1cGRhdGVkIGNoYXQgaGlzdG9yeS5cbiAgICog4pqg77iPIElmIHRoZSBhc3Npc3RhbnQgaXMgc3RyZWFtaW5nIG9yIHN0b3BwaW5nIHRoZSBnZW5lcmF0aW9uLCB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSB1c2VyJ3MgbWVzc2FnZSB0byBlZGl0XG4gICAqL1xuICBlZGl0TWVzc2FnZShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnZhbHVlIHx8ICEhdGhpcy5jaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZVRvRWRpdCA9IGluZGV4O1xuICAgIHRoaXMucmVtYXBwZWRNZXNzYWdlVG9FZGl0ID0gdGhpcy5fcmVtYXBJbmRleEluQ2hhdEhpc3RvcnkoaW5kZXgpO1xuICAgIHRoaXMucXVlc3Rpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5IVt0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShpbmRleCldLmNvbnRlbnQ7XG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ2VkaXQuY2xpY2snLCB7J3JhbmsnOiB0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShpbmRleCl9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgcHJldmlvdXMgYXNzaXN0YW50IG1lc3NhZ2Ugb2YgdGhlIGNoYXQgaGlzdG9yeSB0byB0aGUgY2xpcGJvYXJkLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBhc3Npc3RhbnQncyBtZXNzYWdlIHRvIGVkaXRcbiAgICovXG4gIGNvcHlNZXNzYWdlKGluZGV4OiBudW1iZXIpIHtcbiAgICAvLyBSZW1hcCB0aGUgaW5kZXggaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGlkeCA9IHRoaXMuX3JlbWFwSW5kZXhJbkNoYXRIaXN0b3J5KGluZGV4KTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgnY29weS5jbGljaycsIHsncmFuayc6IGlkeH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0aW5nIGZyb20gdGhlIHByb3ZpZGVkIGluZGV4LCByZW1vdmUgYWxsIHN1YnNlcXVlbnQgbWVzc2FnZXMgZnJvbSB0aGUgY2hhdCBoaXN0b3J5IGFuZCB0aGUgVUkgYWNjb3JkaW5nbHkuXG4gICAqIFRoZSBhc3Npc3RhbnQgd2lsbCByZWdlbmVyYXRlIGEgbmV3IGFuc3dlciBiYXNlZCBvbiB0aGUgdXBkYXRlZCBjaGF0IGhpc3RvcnkuXG4gICAqIOKaoO+4jyBJZiB0aGUgYXNzaXN0YW50IGlzIHN0cmVhbWluZyBvciBzdG9wcGluZyB0aGUgZ2VuZXJhdGlvbiwgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgYXNzaXN0YW50J3MgbWVzc2FnZSB0byByZWdlbmVyYXRlXG4gICAqL1xuICByZWdlbmVyYXRlTWVzc2FnZShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnZhbHVlIHx8ICEhdGhpcy5jaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFVwZGF0ZSB0aGUgbWVzc2FnZXMgaW4gdGhlIFVJIGJ5IHJlbW92aW5nIGFsbCBzdWJzZXF1ZW50ICdhc3Npc3RhbnQnIG1lc3NhZ2VzIHN0YXJ0aW5nIGZyb20gdGhlIHByb3ZpZGVkIGluZGV4IHVudGlsIHRoZSBmaXJzdCBwcmV2aW91cyAndXNlcicgbWVzc2FnZVxuICAgIGxldCBpID0gaW5kZXg7XG4gICAgd2hpbGUgKGkgPj0gMCAmJiAodGhpcy5tZXNzYWdlcyQudmFsdWUhKVtpXS5yb2xlICE9PSAndXNlcicpIHtcbiAgICAgIGktLTtcbiAgICB9XG4gICAgLy8gSXQgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSB0aGF0IGkgPiAwXG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5tZXNzYWdlcyQubmV4dCh0aGlzLm1lc3NhZ2VzJC52YWx1ZSEuc2xpY2UoMCwgaSsxKSk7XG4gICAgICAvLyBSZW1hcCB0aGUgaW5kZXggb2YgdGhpcyBmb3VuZCBmaXJzdCBwcmV2aW91cyAndXNlcicgbWVzc2FnZSBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAgICBjb25zdCBpZHggPSB0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShpKTtcbiAgICAgIC8vIERlZmluZSBhbmQgVXBkYXRlIHRoZSBjaGF0IGhpc3RvcnkgYmFzZWQgb24gd2hpY2ggdGhlIGFzc2lzdGFudCB3aWxsIGdlbmVyYXRlIGEgbmV3IGFuc3dlclxuICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhLnNsaWNlKDAsIGlkeCsxKTtcbiAgICAgIC8vIEZldGNoIHRoZSBhbnN3ZXJcbiAgICAgIHRoaXMuZmV0Y2godGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSk7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgncmVnZW5lcmF0ZS5jbGljaycsIHsncmFuayc6IGlkeH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1hcHMgdGhlIGluZGV4IGluIHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqIFRoZSBjaGF0IGhpc3RvcnkgaXMgYSBsaXN0IG9mIG1lc3NhZ2VzIHdoZXJlIHNvbWUgbWVzc2FnZXMgY2FuIGJlIGhpZGRlbiAoZGlzcGxheSBzZXQgdG8gZmFsc2UpLlxuICAgKiBUaGUgaW5kZXggcHJvdmlkZWQgYXMgaW5wdXQgaXMgdGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIGluIHRoZSBjaGF0IGhpc3RvcnkgZGlzcGxheWVkIGluIHRoZSBVSS5cbiAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHRoZSBiYWNrZW5kIGlzIHVwZGF0ZWQgdG8gYWRkIHRoZSBpZHMgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSBjaGF0IGhpc3RvcnlcbiAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IHRvIGJlIHJlbWFwcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtYXBJbmRleEluQ2hhdEhpc3RvcnkoaW5kZXg6IG51bWJlcikge1xuICAgIC8vIGEgY29weSBvZiB0aGUgY2hhdCBoaXN0b3J5IGlzIGNyZWF0ZWQgdG8gYXZvaWQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjaGF0IGhpc3RvcnkuXG4gICAgLy8gQWRkaXRpb25hbGx5LCBhIHJhbmsgaXMgZ2l2aW5nIHRvIGVhY2ggbWVzc2FnZS5cbiAgICAvLyBBbGwgbWVzc2FnZXMgaGF2aW5nIHJvbGUgJ3VzZXInIGFyZSB1cGRhdGVkIHdpdGggdGhlIGRpc3BsYXkgcHJvcGVydHkgc2V0IHRvIHRydWUsIHRoaXMgaXMgbWFuZGF0b3J5IHRvIGdldCB0aGUgY29ycmVjdCByYW5rIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBjaGF0IGhpc3Rvcnkgd2hlbiB0aGUgdXNlciBtZXNzYWdlIHRvIHJlbWFwIGlzIGhpZGRlblxuICAgIGNvbnN0IGhpc3RvcnkgPSB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5IVxuICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgLm1hcCgobWVzc2FnZSwgaWR4KSA9PiAoey4uLm1lc3NhZ2UsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7Li4ubWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcywgcmFuazogaWR4fX0pKVxuICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4ubWVzc2FnZSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsuLi5tZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLCBkaXNwbGF5OiB0cnVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBoaWRkZW4gbWVzc2FnZXMgKG9mIHJvbGUgZGlmZmVyZW50IHRoZW4gXCJ1c2VyXCIpIGluIG1lc3NhZ2VzJCBiZWZvcmUgdGhlIHByb3ZpZGVkIGluZGV4XG4gICAgLy8gQWxsIG1lc3NhZ2VzIGhhdmluZyByb2xlICd1c2VyJyBhcmUgdXBkYXRlZCB3aXRoIHRoZSBkaXNwbGF5IHByb3BlcnR5IHNldCB0byB0cnVlLCB0aGlzIGlzIG1hbmRhdG9yeSB0byBnZXQgdGhlIGNvcnJlY3QgcmFuayBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2hhdCBoaXN0b3J5IHdoZW4gdGhlIHVzZXIgbWVzc2FnZSB0byByZW1hcCBpcyBoaWRkZW5cbiAgICAvLyBUaGlzIGlzIG1hbmRhdG9yeSB0byBnZXQgdGhlIGNvcnJlY3QgcmFuayBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAgLy8gU2luY2Ugc29tZSBoaWRkZW4gbWVzc2FnZXMgKGxpa2UgJ3N5c3RlbScgbWVzc2FnZXMpIGFyZSBub3QgZGlzcGxheWVkIGluIHRoZSBVSSBidXQgaGF2ZSBiZWVuIGNvdW50ZWQgaW4gdGhlIHByb3ZpZGVkIGluZGV4XG4gICAgY29uc3QgbnVtYmVyT2ZIaWRkZW5NZXNzYWdlc0luTWVzc2FnZXMkQmVmb3JlSW5kZXggPSB0aGlzLm1lc3NhZ2VzJC52YWx1ZSFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCBpbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJ1c2VyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLm1lc3NhZ2UsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7Li4ubWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcywgZGlzcGxheTogdHJ1ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihtZXNzYWdlID0+ICFtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXkpLmxlbmd0aDtcbiAgICAvLyByZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgaGF2ZSBkaXNwbGF5IHNldCB0byBmYWxzZVxuICAgIC8vIHRoaXMgaXMgbWFuZGF0b3J5IHNpbmNlIGF0IHRoZSBwb2ludCBvZiB0aW1lIHdoZW4gdGhlIGFzc2lzdGFudCBhbnN3ZXJzIGEgcXVlc3Rpb24sXG4gICAgLy8gaXQgbWlnaHQgaGF2ZSBzb21lIGhpZGRlbiBtZXNzYWdlcyAoZm9yIGV4YW1wbGUgY29udGV4dE1lc3NhZ2VzKSB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIGNoYXQgaGlzdG9yeSBidXQgZG9uJ3QgZmlndXJlIGluIG1lc3NhZ2VzJCB1bmxlc3MgYSBuZXcgcXVlc3Rpb24gaXMgYXNrZWRcbiAgICBjb25zdCBmaWx0ZXJlZEhpc3RvcnkgPSBoaXN0b3J5LmZpbHRlcihtZXNzYWdlID0+IG1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheSk7XG4gICAgLy8gcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgZmlsdGVyZWQgaGlzdG9yeVxuICAgIHJldHVybiBmaWx0ZXJlZEhpc3RvcnlbaW5kZXggLSBudW1iZXJPZkhpZGRlbk1lc3NhZ2VzSW5NZXNzYWdlcyRCZWZvcmVJbmRleF0uYWRkaXRpb25hbFByb3BlcnRpZXMucmFuaztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBrZXkgdXAgZXZlbnQgZm9yICdCYWNrc3BhY2UnIGFuZCAnRW50ZXInIGtleXMuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBrZXlib2FyZCBldmVudC5cbiAgICovXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVIZWlnaHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuc3VibWl0UXVlc3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUhlaWdodCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGFuZCBhZGp1c3RzIHRoZSBoZWlnaHQgb2YgdGhlIHF1ZXN0aW9uIGlucHV0IGVsZW1lbnQgYmFzZWQgb24gaXRzIGNvbnRlbnQuXG4gICAqIElmIHRoZSBFbnRlciBrZXkgaXMgcHJlc3NlZCB3aXRob3V0IHRoZSBTaGlmdCBrZXksIGl0IHByZXZlbnRzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGtleWJvYXJkIGV2ZW50XG4gICAqL1xuICBjYWxjdWxhdGVIZWlnaHQoZXZlbnQ/OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Py5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gMTcwO1xuICAgIGNvbnN0IGVsID0gdGhpcy5xdWVzdGlvbklucHV0IS5uYXRpdmVFbGVtZW50O1xuICAgIGVsLnN0eWxlLm1heEhlaWdodCA9IGAke21heEhlaWdodH1weGA7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIGVsLnN0eWxlLmhlaWdodCA9IGAke2VsLnNjcm9sbEhlaWdodH1weGA7XG4gICAgZWwuc3R5bGUub3ZlcmZsb3dZID0gZWwuc2Nyb2xsSGVpZ2h0ID49IG1heEhlaWdodCA/ICdzY3JvbGwnIDogJ2hpZGRlbic7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIFwibGlrZVwiIGV2ZW50IG9uIGNsaWNraW5nIG9uIHRoZSB0aHVtYi11cCBpY29uIG9mIGFuIGFzc2lzdGFudCdzIG1lc3NhZ2VcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGFzc2lzdGFudCBtZXNzYWdlIHRvIGxpa2VcbiAgICogQHBhcmFtIHJhbmsgVGhlIHJhbmsgb2YgdGhlIG1lc3NhZ2UgdG8gbGlrZVxuICAgKi9cbiAgb25MaWtlKG1lc3NhZ2U6IENoYXRNZXNzYWdlLCByYW5rOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBSZW1hcCB0aGUgaW5kZXggaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGlkeCA9IHRoaXMuX3JlbWFwSW5kZXhJbkNoYXRIaXN0b3J5KHJhbmspO1xuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCd0aHVtYi11cC5jbGljaycsIHtyYW5rOiBpZHh9KTtcbiAgICB0aGlzLnJlcG9ydFR5cGUgPSAnbGlrZSc7XG4gICAgdGhpcy5tZXNzYWdlVG9SZXBvcnQgPSBtZXNzYWdlO1xuICAgIHRoaXMucmVwb3J0Q29tbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlcG9ydFJhbmsgPSByYW5rO1xuICAgIHRoaXMuc2hvd1JlcG9ydCA9IHRydWVcblxuICAgIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhW3RoaXMuX3JlbWFwSW5kZXhJbkNoYXRIaXN0b3J5KHJhbmspXS5hZGRpdGlvbmFsUHJvcGVydGllcy4kbGlrZWQgPSB0cnVlO1xuICAgIHRoaXMuX3VwZGF0ZUNoYXRIaXN0b3J5KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIFwiZGlzbGlrZVwiIGV2ZW50IG9uIGNsaWNraW5nIG9uIHRoZSB0aHVtYi1kb3duIGljb24gb2YgYW4gYXNzaXN0YW50J3MgbWVzc2FnZS5cbiAgICogSXQgYWxzbyBvcGVucyB0aGUgaXNzdWUgcmVwb3J0aW5nIGRpYWxvZy5cbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGFzc2lzdGFudCBtZXNzYWdlIHRvIGRpc2xpa2VcbiAgICogQHBhcmFtIGluZGV4IFRoZSByYW5rIG9mIHRoZSBtZXNzYWdlIHRvIGRpc2xpa2VcbiAgICovXG4gIG9uRGlzbGlrZShtZXNzYWdlOiBDaGF0TWVzc2FnZSwgcmFuazogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gUmVtYXAgdGhlIGluZGV4IGluIHRoZSBjaGF0IGhpc3RvcnlcbiAgICBjb25zdCBpZHggPSB0aGlzLl9yZW1hcEluZGV4SW5DaGF0SGlzdG9yeShyYW5rKTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgndGh1bWItZG93bi5jbGljaycsIHtyYW5rOiBpZHh9KTtcbiAgICB0aGlzLnJlcG9ydFR5cGUgPSAnZGlzbGlrZSc7XG4gICAgdGhpcy5tZXNzYWdlVG9SZXBvcnQgPSBtZXNzYWdlO1xuICAgIHRoaXMuaXNzdWVUeXBlID0gJyc7XG4gICAgdGhpcy5yZXBvcnRDb21tZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVwb3J0UmFuayA9IHJhbms7XG4gICAgdGhpcy5zaG93UmVwb3J0ID0gdHJ1ZVxuXG4gICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSFbdGhpcy5fcmVtYXBJbmRleEluQ2hhdEhpc3RvcnkocmFuayldLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRkaXNsaWtlZCA9IHRydWU7XG4gICAgdGhpcy5fdXBkYXRlQ2hhdEhpc3RvcnkoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNoYXRIaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZXMkLm5leHQodGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSk7XG4gICAgaWYgKHRoaXMuY2hhdFNlcnZpY2Uuc2F2ZWRDaGF0SWQpIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UudXBkYXRlU2F2ZWRDaGF0KHRoaXMuY2hhdFNlcnZpY2Uuc2F2ZWRDaGF0SWQsIHVuZGVmaW5lZCwgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBhbiBpc3N1ZSByZWxhdGVkIHRvIHRoZSBhc3Npc3RhbnQncyBtZXNzYWdlLlxuICAgKi9cbiAgc2VuZFJlcG9ydCgpOiB2b2lkIHtcbiAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgJ2NvbW1lbnQnOiB0aGlzLnJlcG9ydENvbW1lbnQsXG4gICAgICAndGV4dCc6IHRoaXMubWVzc2FnZVRvUmVwb3J0IS5jb250ZW50LFxuICAgICAgJ3JhbmsnOiB0aGlzLnJlcG9ydFJhbmssXG4gICAgfTtcbiAgICBpZiAodGhpcy5yZXBvcnRUeXBlID09PSAnZGlzbGlrZScpIHtcbiAgICAgIGRldGFpbHNbJ3JlcG9ydC10eXBlJ10gPSB0aGlzLmlzc3VlVHlwZTtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCduZWdhdGl2ZS1yZXBvcnQuc2VuZCcsIGRldGFpbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudCgncG9zaXRpdmUtcmVwb3J0LnNlbmQnLCBkZXRhaWxzKTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5zdWNjZXNzKCdZb3VyIHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCcpO1xuICAgIHRoaXMuc2hvd1JlcG9ydCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSByZXBvcnRpbmcgZGlhbG9nLlxuICAgKi9cbiAgaWdub3JlUmVwb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd1JlcG9ydCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgY2xpY2sgb24gYSByZWZlcmVuY2UncyAnb3BlbiBwcmV2aWV3Jy5cbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIG9wZW5BdHRhY2htZW50UHJldmlldyhkYXRhOiB7cmVmZXJlbmNlOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcn0pIHtcbiAgICB0aGlzLm9wZW5QcmV2aWV3LmVtaXQoZGF0YS5yZWZlcmVuY2UpO1xuICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAnZG9jLWlkJzogZGF0YS5yZWZlcmVuY2UucmVjb3JkSWQsXG4gICAgICAndGl0bGUnOiBkYXRhLnJlZmVyZW5jZS5yZWNvcmQudGl0bGUsXG4gICAgICAnc291cmNlJzogZGF0YS5yZWZlcmVuY2UucmVjb3JkLnRyZWVwYXRoLFxuICAgICAgJ2NvbGxlY3Rpb24nOiBkYXRhLnJlZmVyZW5jZS5yZWNvcmQuY29sbGVjdGlvbixcbiAgICAgICdpbmRleCc6IGRhdGEucmVmZXJlbmNlLnJlY29yZC5kYXRhYmFzZWFsaWFzLFxuICAgIH07XG4gICAgaWYoISFkYXRhLnBhcnRJZCkgZGV0YWlsc1sncGFydC1pZCddID0gZGF0YS5wYXJ0SWQ7XG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ2F0dGFjaG1lbnQucHJldmlldy5jbGljaycsIGRldGFpbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgY2xpY2sgb24gYSByZWZlcmVuY2UncyAnb3BlbiBvcmlnaW5hbCBkb2N1bWVudCcuXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBvcGVuT3JpZ2luYWxBdHRhY2htZW50KGRhdGE6IHtyZWZlcmVuY2U6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyfSkge1xuICAgIHRoaXMub3BlbkRvY3VtZW50LmVtaXQoZGF0YS5yZWZlcmVuY2UucmVjb3JkKTtcbiAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgJ2RvYy1pZCc6IGRhdGEucmVmZXJlbmNlLnJlY29yZElkLFxuICAgICAgJ3RpdGxlJzogZGF0YS5yZWZlcmVuY2UucmVjb3JkLnRpdGxlLFxuICAgICAgJ3NvdXJjZSc6IGRhdGEucmVmZXJlbmNlLnJlY29yZC50cmVlcGF0aCxcbiAgICAgICdjb2xsZWN0aW9uJzogZGF0YS5yZWZlcmVuY2UucmVjb3JkLmNvbGxlY3Rpb24sXG4gICAgICAnaW5kZXgnOiBkYXRhLnJlZmVyZW5jZS5yZWNvcmQuZGF0YWJhc2VhbGlhcyxcbiAgICB9O1xuICAgIGlmKCEhZGF0YS5wYXJ0SWQpIGRldGFpbHNbJ3BhcnQtaWQnXSA9IGRhdGEucGFydElkO1xuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KCdhdHRhY2htZW50LmxpbmsuY2xpY2snLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIGNsaWNrIG9uIGEgc3VnZ2VzdGVkIGFjdGlvbi5cbiAgICogQHBhcmFtIGFjdGlvbiBTdWdnZXN0ZWQgYWN0aW9uLlxuICAgKiBAcGFyYW0gaW5kZXggUmFuayBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2hhdEhpc3RvcnkgcmVsYXRlZCB0byB0aGUgc3VnZ2VzdGVkIGFjdGlvbi5cbiAgICovXG4gIHN1Z2dlc3RBY3Rpb25DbGljayhhY3Rpb246IFN1Z2dlc3RlZEFjdGlvbiwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc3VnZ2VzdEFjdGlvbi5lbWl0KGFjdGlvbik7XG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ3N1Z2dlc3RlZEFjdGlvbi5jbGljaycsIHsndGV4dCc6IGFjdGlvbi5jb250ZW50LCAnc3VnZ2VzdGVkQWN0aW9uLXR5cGUnOiBhY3Rpb24udHlwZX0pXG4gIH1cblxuICAvKipcbiAgICogSXQgbG9va3MgZm9yIHRoZSBkZWJ1ZyBtZXNzYWdlcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZ3JvdXAgb2YgXCJhc3Npc3RhbnRcIiBtZXNzYWdlcy5cbiAgICogQnkgZGVzaWduLCB0aGUgZGVidWcgbWVzc2FnZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBmaXJzdCB2aXNpYmxlIG1lc3NhZ2UgYW1vbmcgdGhlIGdyb3VwIFwiYXNzaXN0YW50XCIgbWVzc2FnZXMuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcmFuayBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcmV0dXJucyBUaGUgZGVidWcgbWVzc2FnZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGdyb3VwIG9mIFwiYXNzaXN0YW50XCIgbWVzc2FnZXNcbiAgICovXG4gIGdldERlYnVnTWVzc2FnZXMoaW5kZXg6IG51bWJlcik6IERlYnVnTWVzc2FnZVtdIHtcbiAgICAvLyBJZiBpdCBpcyBub3QgYW4gYXNzaXN0YW50IG1lc3NhZ2UsIHJldHVyblxuICAgIGlmICgodGhpcy5tZXNzYWdlcyQudmFsdWUhKVtpbmRleF0ucm9sZSAhPT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBhcnJheSBvZiBtZXNzYWdlcyB1cCB0byB0aGUgaW5kaWNhdGVkIGluZGV4XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLm1lc3NhZ2VzJC52YWx1ZSEuc2xpY2UoMCwgaW5kZXggKyAxKTtcbiAgICAvLyBJZiBpdCBpcyBhbiBhc3Npc3RhbnQgbWVzc2FnZSwgbG9vayBmb3IgdGhlIGRlYnVnIG1lc3NhZ2VzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBncm91cCBvZiBcImFzc2lzdGFudFwiIG1lc3NhZ2VzXG4gICAgLy8gQnkgZGVzaWduLCB0aGUgZGVidWcgbWVzc2FnZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBmaXJzdCB2aXNpYmxlIG1lc3NhZ2UgYW1vbmcgdGhlIGdyb3VwIFwiYXNzaXN0YW50XCIgbWVzc2FnZXMuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5jaGF0U2VydmljZS5maXJzdFZpc2libGVBc3Npc3RhbnRNZXNzYWdlSW5kZXgoYXJyYXkpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgcmV0dXJuICh0aGlzLm1lc3NhZ2VzJC52YWx1ZSEpW2lkeF0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGRlYnVnIHx8IFtdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBjbGljayBvbiB0aGUgJ3Nob3cgbG9nIGluZm8nIGJ1dHRvbiBvZiBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcmFuayBvZiB0aGUgbWVzc2FnZVxuICAgKi9cbiAgc2hvd0RlYnVnKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRlYnVnTWVzc2FnZXMgPSB0aGlzLmdldERlYnVnTWVzc2FnZXMoaW5kZXgpO1xuICAgIHRoaXMuc2hvd0RlYnVnTWVzc2FnZXMgPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgd2hldGhlciB0aGUgY3VycmVudCBtZXNzYWdlIGlzIGFuIGFzc2lzdGFudCBtZXNzYWdlIGFuZCB0aGF0IGFsbCBmb2xsb3dpbmcgbWVzc2FnZXMgYXJlIGFzc2lzdGFudCBvbmVzXG4gICAqIFVzZWQgdG8ga2VlcCB0aGUgXCJWaWV3IHByb2dyZXNzXCIgb3BlbmVkIGV2ZW4gdGhvdWdoIHRoZSBhc3Npc3RhbnQgaXMgc2VuZGluZyBhZGRpdGlvbmFsIG1lc3NhZ2VzIGFmdGVyIHRoZSBjdXJyZW50IG9uZVxuICAgKiBAcGFyYW0gbWVzc2FnZXMgdGhlIGxpc3Qgb2YgY3VycmVudCBtZXNzYWdlc1xuICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IG1lc3NhZ2VcbiAgICogQHJldHVybnMgaWYgdGhpcyBtZXNzYWdlcyBhbmQgdGhlIGZvbGxvd2luZyBvbmVzIChpZiBhbnkpIGFyZSB0aGUgbGFzdCBvbmVzXG4gICAqL1xuICBpc0Fzc2lzdGFudExhc3RNZXNzYWdlcyhtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWVzc2FnZXNbaV0ucm9sZSAhPT0gJ2Fzc2lzdGFudCcpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGFuIGVtcHR5IGFzc2lzdGFudCBtZXNzYWdlLlxuICAgKiBBbiBlbXB0eSBhc3Npc3RhbnQgbWVzc2FnZSBpcyBkZWZpbmVkIGFzIGEgbWVzc2FnZSB3aXRoIHRoZSByb2xlICdhc3Npc3RhbnQnLFxuICAgKiBhbiBlbXB0eSBjb250ZW50LCBhbmQgbm8gYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHN1Y2ggYXMgYXR0YWNobWVudHMsIHByb2dyZXNzLFxuICAgKiBkZWJ1ZyBpbmZvcm1hdGlvbiwgb3Igc3VnZ2VzdGVkIGFjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWVzc2FnZSBpcyBhbiBlbXB0eSBhc3Npc3RhbnQgbWVzc2FnZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBpc0VtcHR5QXNzaXN0YW50TWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmIChtZXNzYWdlPy5yb2xlID09PSAnYXNzaXN0YW50J1xuICAgICAgICAgICYmIG1lc3NhZ2U/LmNvbnRlbnQgPT09IFwiXCJcbiAgICAgICAgICAmJiAhbWVzc2FnZT8uYWRkaXRpb25hbFByb3BlcnRpZXM/LiRhdHRhY2htZW50XG4gICAgICAgICAgJiYgIW1lc3NhZ2U/LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPy4kcHJvZ3Jlc3NcbiAgICAgICAgICAmJiAhbWVzc2FnZT8uYWRkaXRpb25hbFByb3BlcnRpZXM/LiRkZWJ1Z1xuICAgICAgICAgICYmICFtZXNzYWdlPy5hZGRpdGlvbmFsUHJvcGVydGllcz8uJHN1Z2dlc3RlZEFjdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbml0aWFsaXphdGlvbkVycm9yXCI+XG4gIDxkaXYgKm5nSWY9XCJtZXNzYWdlcyQgfCBhc3luYyBhcyBtZXNzYWdlczsgZWxzZSBsb2FkaW5nVHBsIHx8IGxvYWRpbmdUcGxEZWZhdWx0XCIgY2xhc3M9XCJoLTEwMCBkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICA8IS0tIFRva2VuIGNvbnN1bXB0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJjb25maWc/Lmdsb2JhbFNldHRpbmdzPy5kaXNwbGF5VXNlclF1b3RhQ29uc3VtcHRpb24gfHwgY29uZmlnPy5nbG9iYWxTZXR0aW5ncz8uZGlzcGxheUNoYXRUb2tlbnNDb25zdW1wdGlvblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRva2VuQ29uc3VtcHRpb25UcGwgfHwgZGVmYXVsdFRva2VuQ29uc3VtcHRpb25UcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpbnN0YW5jZUlkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2hhdCBNZXNzYWdlcyAtLT5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2ggb3ZlcmZsb3ctYXV0byBmbGV4LWdyb3ctMSBwZS0yIHBiLTJcIiAjbWVzc2FnZUxpc3Q+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIG1lc3NhZ2VzOyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgIDwhLS0gUmVndWxhciBtZXNzYWdlcyAtLT5cbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheSAmJiAhaXNFbXB0eUFzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSlcIlxuICAgICAgICAgIFtzdHlsZS4tLWJzLWxpc3QtZ3JvdXAtaXRlbS1wYWRkaW5nLXkucmVtXT1cIicwLjYnXCJcbiAgICAgICAgICBbY2xhc3Mub3BhY2l0eS01MF09XCJtZXNzYWdlVG9FZGl0ICYmIChtZXNzYWdlVG9FZGl0IDwgKGluZGV4ICsgMSkpXCI+XG4gICAgICAgICAgPHNxLWNoYXQtbWVzc2FnZVxuICAgICAgICAgICAgW2NsYXNzLnNxLXVzZXItbWVzc2FnZV09XCJtZXNzYWdlLnJvbGUgPT09ICd1c2VyJ1wiXG4gICAgICAgICAgICBbY2xhc3MubGFzdC1tZXNzYWdlXT1cImxhc3RcIlxuICAgICAgICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZVwiXG4gICAgICAgICAgICBbY29udmVyc2F0aW9uXT1cIm1lc3NhZ2VzXCJcbiAgICAgICAgICAgIFtzdWdnZXN0ZWRBY3Rpb25zXT1cImxhc3QgPyBtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW2Fzc2lzdGFudE1lc3NhZ2VJY29uXT1cImFzc2lzdGFudE1lc3NhZ2VJY29uXCJcbiAgICAgICAgICAgIFt1c2VyTWVzc2FnZUljb25dPVwidXNlck1lc3NhZ2VJY29uXCJcbiAgICAgICAgICAgIFtjb25uZWN0aW9uRXJyb3JNZXNzYWdlSWNvbl09XCJjb25uZWN0aW9uRXJyb3JNZXNzYWdlSWNvblwiXG4gICAgICAgICAgICBbc2VhcmNoV2FybmluZ01lc3NhZ2VJY29uXT1cInNlYXJjaFdhcm5pbmdNZXNzYWdlSWNvblwiXG4gICAgICAgICAgICBbc3RyZWFtaW5nXT1cIihjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpICYmIChsYXN0IHx8IGlzQXNzaXN0YW50TGFzdE1lc3NhZ2VzKG1lc3NhZ2VzLCBpbmRleCkpXCJcbiAgICAgICAgICAgIFtjYW5FZGl0XT1cIihjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpID09PSBmYWxzZSAmJiBtZXNzYWdlVG9FZGl0ID09PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5yb2xlID09PSAndXNlcidcIlxuICAgICAgICAgICAgW2NhbkNvcHldPVwiKChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpID09PSBmYWxzZSB8fCAhbGFzdCkgJiYgbWVzc2FnZVRvRWRpdCA9PT0gdW5kZWZpbmVkICYmIG1lc3NhZ2Uucm9sZSAhPT0gJ2Nvbm5lY3Rpb24tZXJyb3InICYmIG1lc3NhZ2Uucm9sZSAhPT0gJ3NlYXJjaC13YXJuaW5nJ1wiXG4gICAgICAgICAgICBbY2FuTGlrZV09XCIoKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgPT09IGZhbHNlIHx8ICFsYXN0KSAmJiBtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnXCJcbiAgICAgICAgICAgIFtjYW5EaXNsaWtlXT1cIigoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSA9PT0gZmFsc2UgfHwgIWxhc3QpICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCdcIlxuICAgICAgICAgICAgW2NhbkRlYnVnXT1cIigoKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgPT09IGZhbHNlICYmIGxhc3QpIHx8ICghbGFzdCAmJiBtZXNzYWdlc1tpbmRleCsxXS5yb2xlICE9PSAnYXNzaXN0YW50JykpICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgaXNBZG1pbiAmJiAoZ2V0RGVidWdNZXNzYWdlcyhpbmRleCkubGVuZ3RoID4gMCkgJiYgY29uZmlnPy5kZWZhdWx0VmFsdWVzLmRlYnVnXCJcbiAgICAgICAgICAgIFtjYW5SZWdlbmVyYXRlXT1cIihjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpID09PSBmYWxzZSAgJiYgKGxhc3QgfHwgKCFsYXN0ICYmIG1lc3NhZ2VzW2luZGV4KzFdLnJvbGUgIT09ICdhc3Npc3RhbnQnKSkgICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgbWVzc2FnZVRvRWRpdCA9PT0gdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIChlZGl0KT1cImVkaXRNZXNzYWdlKGluZGV4KVwiXG4gICAgICAgICAgICAoY29weSk9XCJjb3B5TWVzc2FnZShpbmRleClcIlxuICAgICAgICAgICAgKHJlZ2VuZXJhdGUpPVwicmVnZW5lcmF0ZU1lc3NhZ2UoaW5kZXgpXCJcbiAgICAgICAgICAgIChvcGVuRG9jdW1lbnQpPVwib3Blbk9yaWdpbmFsQXR0YWNobWVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc3VnZ2VzdEFjdGlvbik9XCJzdWdnZXN0QWN0aW9uQ2xpY2soJGV2ZW50LCBpbmRleClcIlxuICAgICAgICAgICAgKGxpa2UpPVwib25MaWtlKG1lc3NhZ2UsIGluZGV4KVwiXG4gICAgICAgICAgICAoZGlzbGlrZSk9XCJvbkRpc2xpa2UobWVzc2FnZSwgaW5kZXgpXCJcbiAgICAgICAgICAgIChkZWJ1Zyk9XCJzaG93RGVidWcoaW5kZXgpXCI+XG4gICAgICAgICAgPC9zcS1jaGF0LW1lc3NhZ2U+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwhLS0gTG9hZGluZyBzcGlubmVyIC0tPlxuICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nSWY9XCIobG9hZGluZyQgfCBhc3luYykgPT09IHRydWVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdUcGwgfHwgbG9hZGluZ1RwbERlZmF1bHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cblxuICAgIDwhLS0gUmVwb3J0aW5nIGEgZmVlZGJhY2sgZm9ybSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiaXNzdWUtcmVwb3J0IHB0LTMgcGItMlwiICpuZ0lmPVwic2hvd1JlcG9ydFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlcG9ydFRwbCB8fCByZXBvcnRUcGxEZWZhdWx0OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbWVzc2FnZVRvUmVwb3J0LCByYW5rOiByZXBvcnRSYW5rLCB0eXBlOiByZXBvcnRUeXBlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVXNlciB0ZXh0IGlucHV0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWlucHV0IG10LWF1dG9cIiAqbmdJZj1cIiFzaG93UmVwb3J0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHktMlwiPlxuICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiIWlzQ29ubmVjdGVkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZWRVc2VySW5wdXRcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnB1dFRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBSZXRyeSBidXR0b24gLS0+XG4gICAgICAgIDxidXR0b24gW2hpZGRlbl09XCJpc0Nvbm5lY3RlZFwiIGNsYXNzPVwiYnRuIG1iLTQgYXN0LWVycm9yIGFzdC1idG4gc3EtcmV0cnlcIiAoY2xpY2spPVwicmV0cnlGZXRjaCgpXCI+XG4gICAgICAgICAgPHNwYW4+VHJ5IGFnYWluPC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwicmV0cmlhbEF0dGVtcHRzXCIgY2xhc3M9XCJtcy0yIGF0dGVtcHRzXCI+e3sgcmV0cmlhbEF0dGVtcHRzIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kIHNtYWxsIHRleHQtbXV0ZWQgcHgtM1wiICpuZ0lmPVwiISFjb25maWc/Lmdsb2JhbFNldHRpbmdzPy5kaXNjbGFpbWVyXCI+XG4gICAgICAgICAge3sgY29uZmlnPy5nbG9iYWxTZXR0aW5ncz8uZGlzY2xhaW1lciB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGbG9hdGluZyBzY3JvbGwgYnV0dG9uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNBdEJvdHRvbSAmJiAhc2hvd1JlcG9ydFwiIGNsYXNzPVwic3EtZmxvYXRpbmctc2Nyb2xsXCIgW25nQ2xhc3NdPVwiZW5hYmxlZFVzZXJJbnB1dCA/ICdzcS1mbG9hdGluZy1zY3JvbGwtLXdoZW4tdXNlci1pbnB1dCcgOiAnc3EtZmxvYXRpbmctc2Nyb2xsLS13aXRob3V0LXVzZXItaW5wdXQnXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHNoYWRvd1wiIChjbGljayk9XCJzY3JvbGxEb3duKClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYW5nbGUtZG91YmxlLWRvd25cIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBORyBURU1QTEFURVMtLT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nVHBsRGVmYXVsdD5cbiAgPGRpdiBjbGFzcz1cInNwaW5uZXItZ3JvdyB0ZXh0LXByaW1hcnkgZC1ibG9jayBteC1hdXRvIG15LTVcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRUcGw+XG4gIDxkaXYgY2xhc3M9XCJweC0zIHB5LTFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXN0LWlucHV0LWNvbnRhaW5lclwiPlxuICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cImJ0biBidG4tbGlnaHRcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc2VhcmNoXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8dGV4dGFyZWEgI3F1ZXN0aW9uSW5wdXQgcm93cz1cIjFcIlxuICAgICAgICB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJBc2sgc29tZXRoaW5nXCIgYXV0b2ZvY3VzXG4gICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb25cIlxuICAgICAgICAoa2V5dXApPVwib25LZXlVcCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwiY2FsY3VsYXRlSGVpZ2h0KCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiKGxvYWRpbmckIHwgYXN5bmMpIHx8IChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpIHx8IChjaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kIHwgYXN5bmMpXCI+XG4gICAgICA8L3RleHRhcmVhPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIiEoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSAmJiAhKGxvYWRpbmckIHwgYXN5bmMpICYmICEoY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJCB8IGFzeW5jKVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHQgbXMtMlwiXG4gICAgICAgIHNxVG9vbHRpcD1cIlNlbmQgbWVzc2FnZVwiXG4gICAgICAgIChjbGljayk9XCJzdWJtaXRRdWVzdGlvbigpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBhcGVyLXBsYW5lXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwibWVzc2FnZVRvRWRpdFwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHQgbXMtMlwiXG4gICAgICAgIHNxVG9vbHRpcD1cIkNhbmNlbCBlZGl0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm1lc3NhZ2VUb0VkaXQgPSB1bmRlZmluZWQ7IHF1ZXN0aW9uID0gJydcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdW5kby1hbHRcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgJiYgIShjaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kIHwgYXN5bmMpXCIgY2xhc3M9XCJwcm9jZXNzaW5nIG1zLTJcIj5cbiAgICAgICAgR2VuZXJhdGluZyA8aSBjbGFzcz1cIm1zLTEgZmFzIGZhLXNwaW5uZXIgZmEtcHVsc2VcIj48L2k+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cIihjaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kIHwgYXN5bmMpXCIgY2xhc3M9XCJwcm9jZXNzaW5nIG1zLTJcIj5cbiAgICAgICAgU3RvcHBpbmcgPGkgY2xhc3M9XCJtcy0xIGZhcyBmYS1zcGlubmVyIGZhLXB1bHNlXCI+PC9pPlxuICAgICAgPC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIihjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpICYmICEoY2hhdFNlcnZpY2Uuc3RvcHBpbmdHZW5lcmF0aW9uJCB8IGFzeW5jKVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHQgbXMtMlwiXG4gICAgICAgIHNxVG9vbHRpcD1cIlN0b3AgZ2VuZXJhdGluZ1wiXG4gICAgICAgIChjbGljayk9XCJzdG9wR2VuZXJhdGlvbigpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXN0b3BcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JlcG9ydFRwbERlZmF1bHQgbGV0LW1lc3NhZ2UgbGV0LXJhbms9XCJyYW5rXCIgbGV0LXR5cGU9XCJ0eXBlXCI+XG4gIDxkaXYgY2xhc3M9XCJweC0zXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09ICdkaXNsaWtlJ1wiPlxuICAgICAgPGg1Pklzc3VlIHR5cGU8L2g1PlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IG1iLTRcIiBbKG5nTW9kZWwpXT1cImlzc3VlVHlwZVwiPlxuICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCInJ1wiPkNob29zZSBhbiBpc3N1ZSB0eXBlPC9vcHRpb24+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHR5cGUgb2YgKGlzc3VlVHlwZXMgPz8gZGVmYXVsdElzc3VlVHlwZXMpXCI+e3t0eXBlfX08L29wdGlvbj5cbiAgICAgIDwvc2VsZWN0PlxuICAgICAgPGg1PldoYXQgd2FzIHVuc2F0aXNmeWluZyBhYm91dCB0aGlzIHJlc3BvbnNlPyAob3B0aW9uYWwpPC9oNT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PT0gJ2xpa2UnXCI+XG4gICAgICA8aDU+V2h5IGRpZCB5b3UgbGlrZSB0aGlzIGFuc3dlcj8gKG9wdGlvbmFsKTwvaDU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRDb21tZW50XCIgcGxhY2Vob2xkZXI9XCJXcml0ZSB5b3VyIGNvbW1lbnRcIj48L3RleHRhcmVhPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3ctcmV2ZXJzZSBnYXAtMSBtdC0yXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cInR5cGUgPT09ICdkaXNsaWtlJyAmJiAhaXNzdWVUeXBlXCIgKGNsaWNrKT1cInNlbmRSZXBvcnQoKVwiPlNlbmQ8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgKGNsaWNrKT1cImlnbm9yZVJlcG9ydCgpXCI+RG8gbm90IHNlbmQgcmVwb3J0PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VG9rZW5Db25zdW1wdGlvblRwbCBsZXQtaW5zdGFuY2VJZD5cbiAgPHNxLXRva2VuLXByb2dyZXNzLWJhclxuICAgIFtpbnN0YW5jZUlkXT1cImluc3RhbmNlSWRcIj5cbiAgPC9zcS10b2tlbi1wcm9ncmVzcy1iYXI+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2IGNsYXNzPVwiZGVidWctbWVzc2FnZXNcIiBbY2xhc3MuZGlzcGxheWVkXT1cInNob3dEZWJ1Z01lc3NhZ2VzXCI+XG4gIDxidXR0b24gKm5nSWY9XCJzaG93RGVidWdNZXNzYWdlc1wiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBzaGFkb3cgYmFjay1idG5cIiAoY2xpY2spPVwic2hvd0RlYnVnTWVzc2FnZXM9ZmFsc2VcIj5cbiAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9pPlxuICA8L2J1dHRvbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlYnVnTWVzc2FnZXNUcGwgfHwgZGVmYXVsdERlYnVnTWVzc2FnZXNUcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBkZWJ1Z01lc3NhZ2VzIH1cIj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RGVidWdNZXNzYWdlc1RwbCBsZXQtZGVidWdNZXNzYWdlcz5cbiAgPHNxLWRlYnVnLW1lc3NhZ2UgW2RhdGFdPVwiZGVidWdNZXNzYWdlc1wiPjwvc3EtZGVidWctbWVzc2FnZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|