@magic-xpa/engine 4.900.0-dev490.91 → 4.900.0-dev490.96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/src/CurrentClientVersion.mjs +2 -2
- package/esm2020/src/tasks/Task.mjs +2 -1
- package/fesm2015/magic-xpa-engine.mjs +2 -1
- package/fesm2015/magic-xpa-engine.mjs.map +1 -1
- package/fesm2020/magic-xpa-engine.mjs +2 -1
- package/fesm2020/magic-xpa-engine.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -609,6 +609,7 @@ export class Task extends TaskBase {
|
|
|
609
609
|
result = await this.DataviewManager.Execute(dataViewCommand);
|
|
610
610
|
if (!result.Success)
|
|
611
611
|
return null;
|
|
612
|
+
this.ResumeSubformLayout();
|
|
612
613
|
}
|
|
613
614
|
nonInteractiveTask = await this.StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm);
|
|
614
615
|
this.InStartProcess = false;
|
|
@@ -2486,4 +2487,4 @@ export class Task extends TaskBase {
|
|
|
2486
2487
|
}
|
|
2487
2488
|
Task.StartProgLevel = 0;
|
|
2488
2489
|
Task._idleTimerStarted = false;
|
|
2489
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pJLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFFUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxRQUFRLEVBQ1IscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixNQUFNLEVBRU4saUJBQWlCLEVBQ2pCLEtBQUssRUFFTCxPQUFPLEVBR1AsUUFBUSxFQUNSLEdBQUcsRUFFSCxhQUFhLEVBQ2IsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQXdCLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVB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QkFBbUIsRUFBRTtvQkFDbkYsTUFBTSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGlCQUFpQjt3QkFDbEIsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN0RTthQUNGO1NBQ0Y7SUFDSCxDQUFDOztBQTV0SE0sbUJBQWMsR0FBVyxDQUFDLENBQUM7QUFFbkIsc0JBQWlCLEdBQVksS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZWJ1ZywgSGFzaFV0aWxzLCBMaXN0LCBOTnVtYmVyLCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RhY2ssIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVbmlxdWVUc2tTb3J0LFxyXG4gIFdpbmRvd1R5cGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBEaXNwbGF5Q29udmVydG9yLFxyXG4gIEV2ZW50cyxcclxuICBGaWVsZERlZixcclxuICBHdWlEYXRhQ29sbGVjdGlvbixcclxuICBIZWxwcyxcclxuICBJVGFzayxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBOVU1fVFlQRSxcclxuICBQSUMsXHJcbiAgUHJvcGVydHksXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSZWNvcmRVdGlscyxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnR9IGZyb20gJy4uL2V2ZW50L0V2ZW50JztcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSAnLi4vZGF0YS9EYXRhVmlldyc7XHJcbmltcG9ydCB7RHZDYWNoZX0gZnJvbSAnLi4vZGF0YS9EdkNhY2hlJztcclxuaW1wb3J0IHtNR0RhdGF9IGZyb20gJy4vTUdEYXRhJztcclxuaW1wb3J0IHtEYXRhVmlld0NvbW1hbmRUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9EYXRhdmlld0NvbW1hbmQnO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yQmFzZSwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHtUYXNrU2VydmljZUJhc2V9IGZyb20gJy4vVGFza1NlcnZpY2VCYXNlJztcclxuaW1wb3J0IHtBcmd1bWVudHNMaXN0fSBmcm9tICcuLi9ydC9Bcmd1bWVudHNMaXN0JztcclxuaW1wb3J0IHtUYXNrVHJhbnNhY3Rpb25NYW5hZ2VyfSBmcm9tICcuLi9kYXRhL1Rhc2tUcmFuc2FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQge0RhdGF2aWV3TWFuYWdlcn0gZnJvbSAnLi4vZGF0YS9EYXRhdmlld01hbmFnZXInO1xyXG5pbXBvcnQge1NvcnRDb2xsZWN0aW9ufSBmcm9tICcuL3NvcnQvU29ydENvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1NvcnR9IGZyb20gJy4vc29ydC9Tb3J0JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbCc7XHJcbmltcG9ydCB7UmVtb3RlVGFza1NlcnZpY2V9IGZyb20gJy4vUmVtb3RlVGFza1NlcnZpY2UnO1xyXG5pbXBvcnQge1JldHVyblJlc3VsdH0gZnJvbSAnLi4vdXRpbC9SZXR1cm5SZXN1bHQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi4vZXZlbnQvUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtJQ2xpZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7RGF0YXZpZXdIZWFkZXJzfSBmcm9tICcuLi9ydC9EYXRhdmlld0hlYWRlcnMnO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9ufSBmcm9tICcuLi9ydC9UcmFuc2FjdGlvbic7XHJcbmltcG9ydCB7VGFza3NUYWJsZX0gZnJvbSAnLi9UYXNrc1RhYmxlJztcclxuaW1wb3J0IHtJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50VGFyZ2V0ZWRDb21tYW5kJztcclxuaW1wb3J0IHtIYW5kbGVyc1RhYmxlfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHtSZWNvbXB1dGVUYWJsZX0gZnJvbSAnLi4vcnQvUmVjb21wdXRlVGFibGUnO1xyXG5pbXBvcnQge0V4cFRhYmxlfSBmcm9tICcuLi9leHAvRXhwVGFibGUnO1xyXG5pbXBvcnQge1VzZXJFdmVudHNUYWJsZX0gZnJvbSAnLi4vZXZlbnQvVXNlckV2ZW50c1RhYmxlJztcclxuaW1wb3J0IHtGb3Jtc1RhYmxlfSBmcm9tICcuLi9ndWkvRm9ybXNUYWJsZSc7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtGaWVsZH0gZnJvbSAnLi4vZGF0YS9GaWVsZCc7XHJcbmltcG9ydCB7QWN0aW9uTWFuYWdlcn0gZnJvbSAnLi4vZXZlbnQvQWN0aW9uTWFuYWdlcic7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJ9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwL0V4cHJlc3Npb24nO1xyXG5pbXBvcnQge0ZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlfSBmcm9tICcuLi9kYXRhL0ZpZWxkc1RhYmxlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7T3BlbmluZ1Rhc2tEZXRhaWxzLCBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlLCBVc2VyUmFuZ2V9IGZyb20gJy4vVGFza0Jhc2UnO1xyXG5pbXBvcnQge0xhbmd1YWdlRGF0YX0gZnJvbSAnLi4vZW52L0xhbmd1YWdlRGF0YSc7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0dsb2JhbENvbW1hbmRzTWFuYWdlcn0gZnJvbSAnLi4vR2xvYmFsQ29tbWFuZHNNYW5hZ2VyJztcclxuaW1wb3J0IHtFdmVudHNBbGxvd2VkVHlwZX0gZnJvbSAnLi4vZXZlbnQvSUV2ZW50c01hbmFnZXInO1xyXG5pbXBvcnQge0NyZWF0ZWRGb3JtVmVjdG9yfSBmcm9tICcuLi9ndWkvQ3JlYXRlZEZvcm1WZWN0b3InO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuaW1wb3J0IHtJTUdEYXRhQ29sbGVjdGlvbn0gZnJvbSAnLi9JTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7TUdEYXRhQ29sbGVjdGlvbn0gZnJvbSAnLi9NR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlclBvc2l0aW9ufSBmcm9tICcuLi9ldmVudC9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcblxyXG5leHBvcnQgZW51bSBUYXNrX0Zsb3cge1xyXG4gIE5PTkUsXHJcbiAgU1RFUCxcclxuICBGQVNUXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRhc2tfRGlyZWN0aW9uIHtcclxuICBCQUNLID0gLTEsXHJcbiAgTk9ORSxcclxuICBGT1JFXHJcbn1cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBUYXNrIGV4dGVuZHMgVGFza0Jhc2Uge1xyXG4gIHByaXZhdGUgX2R2Q2FjaGU6IER2Q2FjaGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX21nRGF0YTogTUdEYXRhID0gbnVsbDtcclxuICBwcml2YXRlIF9hYm9ydGluZzogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGFuIGFib3J0IGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZvciB0aGlzIHRhc2sgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnNcclxuICBwcml2YXRlIF9iRXhlY0VuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmFsT2xkVmFsdWVzOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgZm9yIHRoZSBnZXQgdmFsdWUgdG8gZ2V0IHRoZSBvbGQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2UgYXJlIGluIHJlY29yZCBzdWZmaXggKGhhbmRsZSBiZWZvcmUpXHJcbiAgcHJpdmF0ZSBfY2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgLy8gd2FzIGNhbmNlbC9xdWl0IGV2ZW50IHJhaXNlZCA/XHJcbiAgcHJpdmF0ZSBfY291bnRlcjogbnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2VzIG9ubHkgaW4gbm9uIGludGVydmFsIHRhc2tzLlxyXG4gIHByaXZhdGUgX2N1cnJTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBzdGFydFByb2cgcmVxdWVzdCBpbiB3aGljaCB3ZSB0YXNrIGlzIHN0YXJ0ZWRcclxuICBwcml2YXRlIF9kZXN0aW5hdGlvblN1YmZvcm06IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIHByaXZhdGUgX2VuYWJsZVpvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBmaXJzdCByZWNvcmQgY3ljbGVcclxuICBwcml2YXRlIF9vcmlnaW5hbFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgcHJpdmF0ZSBfaW5DcmVhdGVMaW5lOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8gaXMgdGhlIHRhc2sgaW50byBwcm9jZXNzaW5nIENSRUFURSBMSU5FXHJcbiAgcHVibGljIEluU2VsZWN0OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgd2hlbiB0aGUgdGFzayBpcyBleGVjdXRpbmcgYSBTRUxFQ1QgaW50ZXJuYWwgZXZlbnRcclxuICBwdWJsaWMgSW5TdGFydFByb2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzayBieSBjYWxsIG9wZXJhdGlvblxyXG4gIHByaXZhdGUgX2tub3duVG9TZXJ2ZXI6IGJvb2xlYW4gPSB0cnVlOyAgICAgICAgICAgICAgIC8vIEZhbHNlIGlmIHRoZSBzZXJ2ZXIgaGFzXHJcbiAgcHJpdmF0ZSBfbG9vcFN0YWNrOiBTdGFjazxudW1iZXI+ID0gbnVsbDtcclxuICBwcml2YXRlIGFsbG93UmVtb3RlQ21kRXhlY3V0aW9uOiBib29sZWFuO1xyXG4gIHB1YmxpYyBEZWxheUNvbW1hbmRFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBjb250YWluaW5nIHRoZSBDYWxsIG9wZXJhdGlvbi5cclxuICAvLy8gVGhpcyBtZW1iZXIgaXMgdXNlZCBmb3Igc2VhcmNoaW5nIHRoZSB2YXJpYWJsZXMgbGlrZSBWYXJJbmRleCgpLCBldGNcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfcGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnZXQgUGFyZW50VGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb250ZXh0VGFzazogVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBjb250ZXh0IG9mIHdoaWNoIHRhc2sgdGhpcyB0YXNrIGlzIGN1cnJlbnRseSBydW5uaW5nXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHNhbWUgYXMgX3BhcmVudFRhc2sgZXhjZXB0IGZvciBNb2RhbCB0YXNrcy4gSW4gY2FzZSwgdGhlIGN1cnJlbnQgdGFzayBpcyBtb2RhbCwgX3RyaWdnZXJpbmdUYXNrIHJlZmVycyB0b1xyXG4gIC8vLyAgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBvZiB0aGUgX3BhcmVudFRhc2suIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIGFsbCBnZW5lcmF0aW9uLWJhc2VkIGZ1bmN0aW9ucyBhbmQgUHJvZygpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdHJpZ2dlcmluZ1Rhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBpcyB0aGUgdGFzayB3aGljaCBjb250YWluZWQgdGhlIENhbGwgb3BlcmF0aW9uLiBJZiB0aGUgdGFzayB3YXMgZXhlY3V0ZWQgd2l0aG91dCBjYWxsXHJcbiAgLy8vICAgb3BlcmF0aW9uIGVnLiB0aGUgTVAsIHRoZSBzdGFydHVwIHByb2dyYW0sIGV0Yy4sIGl0IHJlZmVycyB0byBpdHNlbGYuIFRoaXMgbWVtYmVyIHVzZWQgdG8gc2VhcmNoIGZvciB0aGUgZXZlbnQgaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBQYXRoUGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZlbnRDb250cm9sQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcHJldmVudFJlY29yZFN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Rhc2tQYXRoOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuXHJcbiAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIGN1cnJlbnRseSB0cnlpbmcgdG8gY29tbWl0IGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIHByaXZhdGUgX3RyeWluZ1RvQ29tbWl0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNldCBUcnlpbmdUb0NvbW1pdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdHJ5aW5nVG9Db21taXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBUcnlpbmdUb0NvbW1pdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cnlpbmdUb0NvbW1pdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZUxvb3BTdGFjazogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIChMT09QQ09VTlRFUigpKSBpcyBpbiB0aGUgc2NvcGUgb2YgQmxvY2sgTG9vcC5cclxuICBwcml2YXRlIF9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBJbkhhbmRsZUFjdENhbmNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBSdW50aW1lU29ydHM6IFNvcnRDb2xsZWN0aW9uID0gbnVsbDtcclxuICBwdWJsaWMgVmV3Rmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIGRhdGFWaWV3Q29udGVudDogc3RyaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgLy8gZGF0YVZpZXdDb250ZW50IHJldHJpZXZlZCBieSBHZXREYXRhVmlld0NvbnRlbnQgY29tbWFuZC5cclxuICBwdWJsaWMgUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDogYm9vbGVhbiA9IGZhbHNlOyAgICAvLyBJbiByZWNvcmQgcHJlZml4IChjb21tb25IYW5kbGVyQmVmb3JlKSB3ZSBleGVjdXRlIHJlY29yZCBwcmVmaXggb2YgYWxsIGZhdGhlcnMuXHJcblxyXG4gIC8vIEJ1dCB3ZSBkbyBub3QgbmVlZCBpdCBpbiBhbGwgY2FzZXMuXHJcbiAgLy8gV2hlbiB3ZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIGl0LlxyXG4gIC8vIFdoZW4gd2UgY2xpY2sgb24gdGhlIG5lc3RlZCBzdWJmb3JtIHdlIG5lZWQgaXQuXHJcbiAgLy8gaWYgdHJ1ZSwgZG8gdGhlIHBhcmVudCBzdWJmb3JtIHJlY29yZCBwcmVmaXhcclxuXHJcbiAgLy8gLTEg4oCTIFRoZSB0YXNrIGlzIG5vdCBleGVjdXRlZCBhcyBhIHN1YmZvcm1cclxuICAvLyAgMCDigJMgVGhlIHRhc2sgaXMgZXhlY3V0ZWQgYnkgc2V0dGluZyB0aGUgZm9jdXMgb24gaXRcclxuICAvLyAgMSDigJMgVGhlIHN1YnRhc2sgaXMgZXhlY3V0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgLy8gIDIg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJlY2F1c2UgdGhlIEF1dG9tYXRpYyBSZWZyZXNoIHByb3BlcnR5XHJcbiAgLy8gICAgICBvciB0aGUgU3ViZm9ybSBSZWZyZXNoIGV2ZW50IGhhcyBiZWVuIHRyaWdnZXJlZFxyXG4gIHB1YmxpYyBNb2RlQXNQYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXNrIG1vZGUgaXMgJ0FzIFBhcmVudCcgd2UgbmVlZCB0byBjYXJlIG91dCBpdCBzcGVjaWZpY2FsbHlcclxuICBwdWJsaWMgVGFza1RyYW5zYWN0aW9uTWFuYWdlcjogVGFza1RyYW5zYWN0aW9uTWFuYWdlciA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkIG9uIHRoZSBjbGllbnQuXHJcbiAgLy8vIFJlbGV2YW50IG9ubHkgZm9yIG5vbi1vZmZsaW5lIHdpdGggbG9jYWwgZGF0YS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBFeGVjdXRlQ2xpZW50U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBleGVjdXRlcyBDb21tb25IYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gRm9yIHN1YmZvcm1zIHdlIGRvIG5vdCBleGVjdXRlIGl0J3MgUlAgaWYgdGhlIHBhcmVudCBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgLy8vIGl0J3MgQ29tbWFuZEhhbmRsZXJCZWZvcmUgbWV0aG9kLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEluQ29tbW9uSGFuZGxlckJlZm9yZVJQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0cmlldmUgYW5kIHJldHVybiBhIHNlcnZpY2Ugb2JqZWN0IGNvbnRhaW5pbmcgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIGRpZmZlcmVudCBpbiB0aGUgdGFzayBsZXZlbCBiZXR3ZWVuIGNvbm5lY3RlZCBhbmQgb2ZmbGluZSBzdGF0ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIF90YXNrU2VydmljZTogVGFza1NlcnZpY2VCYXNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlQmFzZSB7XHJcbiAgICBpZiAodGhpcy5fdGFza1NlcnZpY2UgPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFza1NlcnZpY2UgPSBuZXcgUmVtb3RlVGFza1NlcnZpY2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBjb21tYW5kcyBwcm9jZXNzb3IgZGVwZW5kaW5nIG9uIHRhc2sgdHlwZSBhbmQgc3RhdGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgZ2V0IENvbW1hbmRzUHJvY2Vzc29yKCk6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSB7XHJcbiAgICByZXR1cm4gQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0xvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCA9IG51bGw7XHJcbiAgcHVibGljIEFyZ3VtZW50c0xpc3Q6IEFyZ3VtZW50c0xpc3QgPSBudWxsOyAgICAgICAgICAgLy8gb2ZmLWxpbmUgZXhlY3V0aW9uIC0gdGFzayBhcmd1bWVudCwgdG8gZW5hYmxlIHRoZSB1cGRhdGUgb2YgZmllbGQgdmFsdWVzXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcGFyZW50IHRhc2sgb2YgdGhlIHN1YnRhc2sgYnkgdG9vbGtpdCB0cmVlIGluY2x1ZGUgdGhlIG1haW4gcHJvZ3JhbS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMb2dpY2FsU3R1ZGlvUGFyZW50VGFzaygpOiBUYXNrIHtcclxuICAgIGlmICh0aGlzLlN0dWRpb1BhcmVudFRhc2sgPT09IG51bGwgJiYgIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgdGhpcy5fY3RsSWR4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gPFRhc2s+dGhpcy5TdHVkaW9QYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IEtub3duVG9TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fa25vd25Ub1NlcnZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb25maXJtVXBkYXRlTm86IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAvLyBvbmx5IGZvciBjb25maXJtcyB1cGRhdGVcclxuICBwdWJsaWMgRGF0YVN5bmNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBVbmlxdWVTb3J0OiBVbmlxdWVUc2tTb3J0ID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdGhlIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgb24gdGhlIGRhdGEgdmlldyBtYW5hZ2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXQgVHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uKSB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgUmVmcmVzaE9uVmFyczogbnVtYmVyW10gPSBudWxsO1xyXG4gIHB1YmxpYyBEdlBvc0Rlc2NyaXB0b3I6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDtcclxuICBwdWJsaWMgU3ViVGFza3M6IFRhc2tzVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBFeHBUYWI6IEV4cFRhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgVXNlckV2dFRhYjogVXNlckV2ZW50c1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRGF0YXZpZXdIZWFkZXJzVGFibGU6IERhdGF2aWV3SGVhZGVycyA9IG51bGw7XHJcbiAgcHVibGljIEhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgX2Zvcm1zOiBGb3Jtc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwdWJsaWMgUHVibGljTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBzdWZmaXggd2FzIHBlcmZvcm1lZCBmb3IgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgVGFza1N1ZmZpeEV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgaWYgKHRoaXMudGFza0RlZmluaXRpb25JZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnRhc2tEZWZpbml0aW9uSWQgPSBuZXcgVGFza0RlZmluaXRpb25JZCh0aGlzLl9jdGxJZHgsIHRoaXMuUHJvZ3JhbUlzbiwgdGhpcy5UYXNrSXNuLCB0aGlzLl9pc1ByZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJldHJ1blZhbHVlRXhwOiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBTdWJmb3JtQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIFN0YXJ0UHJvZ0xldmVsOiBudW1iZXIgPSAwOyAgLy8gcmVjdXJzaXZlIGxldmVsIG9mIFwic3RhcnRQcm9nXCIgaW52b2NhdGlvbnNcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2lkbGVUaW1lclN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc3RhdGljIGdldCBJc0Jsb2NraW5nQmF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50OiBUYXNrKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBUYXNrKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChwYXJlbnQpKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEocGFyZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKCk7XHJcbiAgICB0aGlzLkRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMpO1xyXG4gICAgdGhpcy5fZmxvd01vbml0b3IgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG4gICAgdGhpcy5Db250ZXh0VGFzayA9IHRoaXM7XHJcbiAgICB0aGlzLl9kdkNhY2hlID0gbmV3IER2Q2FjaGUodGhpcyk7XHJcbiAgICB0aGlzLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXggPSB0cnVlO1xyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIgPSBuZXcgRGF0YXZpZXdNYW5hZ2VyKHRoaXMpO1xyXG4gICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIgPSBuZXcgVGFza1RyYW5zYWN0aW9uTWFuYWdlcih0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhVmlldy5Jbml0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEocGFyZW50OiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuUGF0aFBhcmVudFRhc2sgPSBwYXJlbnQ7XHJcbiAgICB0aGlzLl9wYXJlbnRUYXNrID0gcGFyZW50O1xyXG4gICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSBudWxsO1xyXG4gICAgdGhpcy5idWlsZFRhc2tQYXRoKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgQ3JlYXRlVGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICBsZXQgdGFzayA9ICBuZXcgVGFzaygpO1xyXG4gICAgdGFzay5Jbml0KCk7XHJcbiAgICByZXR1cm4gdGFzaztcclxuICB9XHJcblxyXG4gIC8vIElUYXNrIE1lbWJlcnNcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGVsbHMgd2hldGhlciB0aGUgdGFzayBpcyBhYm9ydGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNBYm9ydGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hYm9ydGluZztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRUYXNrUGF0aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Rhc2tQYXRoID0gbmV3IExpc3Q8VGFzaz4oKTtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrLl90YXNrUGF0aCAhPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFza1BhdGguQWRkUmFuZ2UodGhpcy5fcGFyZW50VGFzay5fdGFza1BhdGguR2V0RW51bWVyYXRvcigpKTtcclxuICAgIHRoaXMuX3Rhc2tQYXRoLnB1c2godGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0YXNrIGRhdGEgYnkgcGFyc2luZyB0aGUgeG1sIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ2RcIj5yZWZlcmVuY2UgdG8gTUdEYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVuaW5nVGFza0RldGFpbHNcIj5hZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9mIG9wZW5pbmcgdGFzazwvcGFyYW0+XHJcbiAgYXN5bmMgZmlsbERhdGEobWdkOiBNR0RhdGEsIG9wZW5pbmdUYXNrRGV0YWlsczogT3BlbmluZ1Rhc2tEZXRhaWxzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBJZiB0aGlzIHRhc2sgd2FzIG9wZW5lZCBieSBhbiBcIm9wZW4gd2luZG93XCIgY29tbWFuZCAtIGNvbm5lY3QgaGltIHRvIGl0cyBwYXJlbnRcclxuICAgIGlmICghc3VwZXIuaXNNYWluUHJvZygpKSB7XHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrID09PSBudWxsICYmIG9wZW5pbmdUYXNrRGV0YWlscy5DYWxsaW5nVGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudFRhc2sgPSA8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2s7XHJcbiAgICAgICAgdGhpcy5idWlsZFRhc2tQYXRoKCk7XHJcbiAgICAgICAgKDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5DYWxsaW5nVGFzaykuYWRkU3ViVGFzayh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5QYXRoUGFyZW50VGFzayA9PT0gbnVsbCAmJiBvcGVuaW5nVGFza0RldGFpbHMuUGF0aFBhcmVudFRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLlBhdGhQYXJlbnRUYXNrID0gPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLlBhdGhQYXJlbnRUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBmb3IgTUdfQUNUX1pPT00gYWN0aW9uIGVuYWJsZVxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKSB7XHJcbiAgICAgIHRoaXMuc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9tZ0RhdGEgPSBtZ2Q7XHJcbiAgICB0aGlzLmZpbGxBdHRyaWJ1dGVzKCk7XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhLmFkZFRhc2sodGhpcyk7XHJcblxyXG4gICAgbGV0IHBhcmVudEZvcm06IE1nRm9ybUJhc2UgPSAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbCkgPyB0aGlzLl9wYXJlbnRUYXNrLmdldEZvcm0oKSA6IG51bGw7XHJcblxyXG4gICAgd2hpbGUgKGF3YWl0IHRoaXMuaW5pdElubmVyT2JqZWN0cyhSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldE5leHRUYWcoKSwgcGFyZW50Rm9ybSkpIHtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuUHJlcGFyZVRyYW5zYWN0aW9uUHJvcGVydGllcyh0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24sIGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLkhhbmRsZVRyaWdnZXJUYXNrKCk7XHJcbiAgICB0aGlzLkhhbmRsZVByZXZpb3VzbHlBY3RpdmVUYXNrSWQoKTtcclxuXHJcbiAgICAvLyBTZXQgaXNTdWJmb3JtIGZsYWdcclxuICAgIHRoaXMuQ2hlY2tBbmRTZXRTdWJGb3JtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgIC8vIGdldCB0aGUgc3ViZm9ybSBjb250cm9sIGZyb20gdGhlIHBhcmVudCB0YXNrXHJcbiAgICAgIGxldCBzdWJGb3JtQ3RybDogTWdDb250cm9sID0gKDxNZ0Zvcm0+dGhpcy5nZXRQYXJlbnQoKS5nZXRGb3JtKCkpLmdldFN1YkZvcm1DdHJsRm9yVGFzayh0aGlzLl90YXNrVGFnKTtcclxuICAgICAgaWYgKHN1YkZvcm1DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgc3ViRm9ybUN0cmwuc2V0U3ViZm9ybVRhc2tJZCh0aGlzLl90YXNrVGFnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gdXBkYXRlIHRoZSBmb3JtIHdpdGggdGhlIHN1YmZvcm0gY29udHJvbCBmcm9tIHRoZSBwYXJlbnQgdGFza1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5zZXRTdWJGb3JtQ3RybChzdWJGb3JtQ3RybCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyBoYW5kbGUgdGhlIFByZXZpb3VzbHlBY3RpdmVUYXNrSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhbmRsZVByZXZpb3VzbHlBY3RpdmVUYXNrSWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLkdldENvbnRleHRUYXNrKCkgIT09IG51bGwgJiYgdGhpcy5fbWdEYXRhICE9PSB0aGlzLl9wYXJlbnRUYXNrLmdldE1HRGF0YSgpKVxyXG4gICAgICB0aGlzLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgPSAodGhpcy5fcGFyZW50VGFzay5HZXRDb250ZXh0VGFzaygpKS5nZXRUYXNrVGFnKCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsKVxyXG4gICAgICB0aGlzLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgPSB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaGFuZGxlIHRoZSB0cmlnZ2VyIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhbmRsZVRyaWdnZXJUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGE6IHN0cmluZyk6IHZvaWQ7XHJcbiAgRmlsbFRhc2tUYWJsZXMoKTogdm9pZDtcclxuICBGaWxsVGFza1RhYmxlcyh0YXNrVGFibGVzRGF0YT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgdGhpcy5GaWxsVGFza1RhYmxlc18wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsVGFza1RhYmxlc18wKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBhdHRyaWJ1dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsQXR0cmlidXRlcygpOiB2b2lkIHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIHN1cGVyLmZpbGxBdHRyaWJ1dGVzKHBhcnNlcik7XHJcblxyXG4gICAgICAvLyBRQ1IgIzc1OTkxMTogbXByZyBtdXN0IGJlbG9uZyB0byB0aGUgbWFpbiBhcHBsaWNhdGlvbidzIE1HRGF0YS5cclxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGl0IHdpbGwgbm90IGJlIGRpc2NhcmRlZCB1bnRpbCB0aGUgZW5kIG9mIGV4ZWN1dGlvbi5cclxuICAgICAgaWYgKHN1cGVyLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLl9tZ0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFRhc2suZmlsbEF0dHJpYnV0ZXMoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuO1xyXG4gICAgaXNUYWdQcm9jZXNzZWQgPSBzdXBlci5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZVN0cik7XHJcbiAgICBpZiAoIWlzVGFnUHJvY2Vzc2VkKSB7XHJcbiAgICAgIGlzVGFnUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVGUkVTSE9OOlxyXG4gICAgICAgICAgaWYgKCEodmFsdWVTdHIudHJpbSgpID09PSBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5TZXRSZWZyZXNoT25WYXJzKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIHRoaXMuTmFtZSA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TX0RFQzpcclxuICAgICAgICAgIGlmICghKHZhbHVlU3RyLnRyaW0oKSA9PT0gXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGVzY3JpcHRvcih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFTX0xPQ0FURTpcclxuICAgICAgICAgIGlmICgrdmFsdWVTdHIgPT0gMSlcclxuICAgICAgICAgICAgdGhpcy5oYXNMb2NhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0FTX1BBUkVOVDpcclxuICAgICAgICAgIGlmICgrdmFsdWVTdHIgPT0gMSlcclxuICAgICAgICAgICAgdGhpcy5Nb2RlQXNQYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfVU5JUVVFX1NPUlQ6XHJcbiAgICAgICAgICB0aGlzLlVuaXF1ZVNvcnQgPSA8VW5pcXVlVHNrU29ydD52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19JRDpcclxuICAgICAgICAgIHRoaXMuc2V0UmVtb3RlVHJhbnNhY3Rpb24odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BVQkxJQzpcclxuICAgICAgICAgIHRoaXMuUHVibGljTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX09GRkxJTkU6XHJcbiAgICAgICAgICB0aGlzLklzT2ZmbGluZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUkVUVVJOX1ZBTFVFX0VYUDpcclxuICAgICAgICAgIHRoaXMuUmV0cnVuVmFsdWVFeHAgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVVNfRklMRV9OQU1FOlxyXG4gICAgICAgICAgLy8gVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICd7MH0nXCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+cG9zc2libGUgdGFnIG5hbWUgLCBuYW1lIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIGFzeW5jIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudEZvcm06IE1nRm9ybUJhc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIHN3aXRjaCAoZm91bmRUYWdOYW1lKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQVEFCTEU6XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlbHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2hlbHBUYWIgPSBuZXcgSGVscHMoKTtcclxuXHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlbHBUYWIuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUjpcclxuICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC4uLlwiLCBmb3VuZFRhZ05hbWUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5EYXRhVmlldy5maWxsSGVhZGVyRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1A6XHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYi5maWxsRGF0YSh0aGlzLCAnVCcsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STTpcclxuICAgICAgICB0aGlzLkZvcm0gPSB0aGlzLkZvcm1Jbml0RGF0YShwYXJlbnRGb3JtKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVV9DT05URU5UOlxyXG4gICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiYXNzZW1ibGllc1wiOlxyXG4gICAgICAgIGxldCBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKCcvYXNzZW1ibGllcycsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STVM6XHJcbiAgICAgICAgdGhpcy5fZm9ybXMgPSBuZXcgRm9ybXNUYWJsZSh0aGlzLCBwYXJlbnRGb3JtKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybXMuZmlsbERhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0s6XHJcbiAgICAgICAgaWYgKHRoaXMuU3ViVGFza3MgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgICAgIGxldCBzdWJ0YXNrID0gbmV3IFRhc2sodGhpcyk7XHJcbiAgICAgICAgc3VidGFzay5Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YnRhc2spO1xyXG4gICAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX21nRGF0YTtcclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgICBtZ2QgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TUdEYXRhRm9yU3RhcnR1cFByb2dyYW0oKTtcclxuICAgICAgICBhd2FpdCBzdWJ0YXNrLmZpbGxEYXRhKG1nZCwgbmV3IE9wZW5pbmdUYXNrRGV0YWlscygpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTDpcclxuICAgICAgICBhd2FpdCBUYXNrLlByb2Nlc3NUYXNrVVJMKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLkV4cFRhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5FeHBUYWIgPSBuZXcgRXhwVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXhwXCIpO1xyXG4gICAgICAgIHRoaXMuRXhwVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1VTRVJfRVZFTlRTOlxyXG4gICAgICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuVXNlckV2dFRhYiA9IG5ldyBVc2VyRXZlbnRzVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gdXNlciBldmVudCB0YWJcIik7XHJcbiAgICAgICAgdGhpcy5Vc2VyRXZ0VGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0xJTktTOlxyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUgPSBuZXcgRGF0YXZpZXdIZWFkZXJzKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFM6XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMgPSBuZXcgU29ydENvbGxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLlJ1bnRpbWVTb3J0cy5maWxsRGF0YSggcGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS19UQUJMRVM6XHJcbiAgICAgICAgdGhpcy5GaWxsVGFza1RhYmxlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFOlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGVcIik7XHJcbiAgICAgICAgdGhpcy5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVEhBTkRMRVJTOlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byBldmVudGhhbmRsZXJzXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLkhhbmRsZXJzVGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLkhhbmRsZXJzVGFiID0gbmV3IEhhbmRsZXJzVGFibGUoKTtcclxuICAgICAgICB0aGlzLkhhbmRsZXJzVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgdGhpcy5hZGRFeHBIYW5kbGVyc1RvTUdEYXRhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKFwiL1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKSkge1xyXG4gICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIFRhc2suaW5pdElubmVyT2JqZWN0cyAuIEVudGVyIGNhc2UgZm9yIFwiICsgZm91bmRUYWdOYW1lKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIFJlY29tcHV0ZUZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjb21wdXRlVGFibGU6IFJlY29tcHV0ZVRhYmxlID0gbmV3IFJlY29tcHV0ZVRhYmxlKCk7XHJcbiAgICByZWNvbXB1dGVUYWJsZS5maWxsRGF0YV8xKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3LCB0aGlzLCBwYXJzZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsVGFza1RhYmxlc18xKCk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIC8vIEdldCB0aGUgZW5kIG9mIHRoZSB0YXNrIHRhYmxlIGVsZW1lbnRcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tfVEFCTEVTX0VORCwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgZW5kQ29udGV4dCkgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFLmxlbmd0aDtcclxuICAgIC8vIGdldCB0aGUgdGFzayB0YWJsZSB4bWwgc3RyaW5nXHJcbiAgICBsZXQgdGFza1RhYmxlc0RhdGE6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICB0aGlzLkZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhKTtcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBoYW5kbGVycyB0cmlnZ2VyZWQgYnkgZXhwcmVzc2lvbnMgdG8gbWdkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZEV4cEhhbmRsZXJzVG9NR0RhdGEoKTogdm9pZCB7XHJcbiAgICBsZXQgaWR4OiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5IYW5kbGVyc1RhYi5nZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gdGhpcy5IYW5kbGVyc1RhYi5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICBsZXQgZXZ0OiBFdmVudCA9IGhhbmRsZXIuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiB8fFxyXG4gICAgICAgIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OKSkge1xyXG4gICAgICAgIHRoaXMuX21nRGF0YS5hZGRFeHBIYW5kbGVyKGhhbmRsZXIsIGlkeCk7XHJcbiAgICAgICAgaWR4Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJlZnJlc2ggb24gdmFyaWFibGUgbGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIFNldFJlZnJlc2hPblZhcnModmFyaWFibGVzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBzdHJUb2s6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZSh2YXJpYWJsZXMsIFwiLFwiKTtcclxuICAgIGxldCBmbGROdW06IG51bWJlcjtcclxuICAgIGxldCBpbnRWYWxzID0gbmV3IExpc3Q8bnVtYmVyPigpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHJUb2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgZmxkTnVtID0gTk51bWJlci5QYXJzZShzdHJUb2tbaV0pO1xyXG4gICAgICBpbnRWYWxzLnB1c2goZmxkTnVtKTtcclxuICAgIH1cclxuICAgIHRoaXMuUmVmcmVzaE9uVmFycyA9IG5ldyBBcnJheShpbnRWYWxzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgaW50VmFscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmbGROdW0gPSBpbnRWYWxzLmdldF9JdGVtKGkpO1xyXG4gICAgICB0aGlzLlJlZnJlc2hPblZhcnNbaV0gPSBmbGROdW07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBEYXRhU3luY2VkIHByb3BlcnR5IG9mIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldERhdGFTeW5jZWQoc3luY2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFTeW5jZWQgPSBzeW5jZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgZmllbGQgYnkgaXRzIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZmllbGQgYnkgaXRzIG5hbWU8L3JldHVybnM+XHJcbiAgZ2V0RmllbGQoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG4gICAgcmV0dXJuICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RmllbGRCeU5hbWUoZmxkTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGFuIGV4cHJlc3Npb24gYnkgaXRzIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+aWQgb2YgdGhlIGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIGdldEV4cEJ5SWQoaWQ6IG51bWJlcik6IEV4cHJlc3Npb24ge1xyXG4gICAgaWYgKHRoaXMuRXhwVGFiICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5FeHBUYWIuZ2V0RXhwQnlJZChpZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFRhc2suR2V0RXhwQnlJZCgpOiBubyBleHByZXNzaW9uIHRhYmxlXCIpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRFeHBPYmplY3RCeUlkKGlkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RXhwQnlJZChpZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogYW55IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCBleHBCeUlkOiBFeHByZXNzaW9uID0gdGhpcy5nZXRFeHBCeUlkKGV4cElkKTtcclxuICAgICAgRGVidWcuQXNzZXJ0KGV4cEJ5SWQgIT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSBleHBCeUlkLkdldFN0b3JhZ2VBdHRyaWJ1dGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGN1bGF0ZSBleHByZXNpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+VGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1R5cGVcIj5UaGUgZXhwZWN0ZWQgcmVzdWx0IHR5cGUuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW5ndGhcIj5UaGUgZXhwZWN0ZWQgbGVuZ3RoIG9mIHRoZSByZXN1bHQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVVuaWNvZGVcIj5EZW5vdGVzIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBhIHVuaWNvZGUgc3RyaW5nLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzQ2VsbFR5cGVcIj5Ob3QgdXNlZC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgQ2FsY3VsYXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGV4cElkID4gMCkge1xyXG4gICAgICBsZXQgZXhwQnlJZDogRXhwcmVzc2lvbiA9IHRoaXMuZ2V0RXhwQnlJZChleHBJZCk7XHJcbiAgICAgIERlYnVnLkFzc2VydChleHBCeUlkICE9PSBudWxsKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgZXhwQnlJZC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKHJlc1R5cGUsIGxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluc2VydCBSZWNvcmQgVGFibGUgdG8gZGF0YXZpZXcgb2YgdGhlIHRhc2sgaWYgaXQgY2FtZSBhZnRlciBjbG9zaW5nIHRhc2sgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpbnNlcnRSZWNvcmRUYWJsZShpbnZhbGlkYXRlOiBib29sZWFuLCBwYXJzZXI6IFhtbFBhcnNlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gY2hlY2sgY2FjaGUgbG9naWMgb25seSBmb3Igc3ViLWZvcm1zXHJcbiAgICBpZiAoYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgIGxldCBmaXJzdFRpbWU6IGJvb2xlYW4gPSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldEZpcnN0RHYoKTtcclxuICAgICAgLy8gaWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHRhc2sgZ2V0IGR2IG9yIHRoZSBvbGQgZHYgaXMgbm90IGludmFsaWRhdGVkIG9yXHJcbiAgICAgIC8vIHRoZSBvbGQgZHYgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmlyc3QgcmVjb3JkIGRvIG5vdCBwdXQgaW4gY2FjaGVcclxuICAgICAgaWYgKCFmaXJzdFRpbWUgJiYgaW52YWxpZGF0ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNMb2NhdGUpIHtcclxuICAgICAgICAgIC8vIHRoZSBvbGQgZC52IHdhcyBub3QgdXBkYXRlZCBwdXQgaXQgaW4gY2FjaGUgKGl0cyByZXBsaWNhdGUpXHJcbiAgICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5JbmNsdWRlc0ZpcnN0KCkpIHtcclxuICAgICAgICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSlcclxuICAgICAgICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB0aGlzLmxvY2F0ZVB1dEluQ2FjaGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcGFyc2UgdGhlIG5ldyBkYXRhdmlld1xyXG4gICAgYXdhaXQgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5maWxsRGF0YShwYXJzZXIpO1xyXG5cclxuICAgIGlmIChpbnZhbGlkYXRlKVxyXG4gICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldENoYW5nZWQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaGFuZGxlcnMgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEhhbmRsZXJzVGFiKCk6IEhhbmRsZXJzVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuSGFuZGxlcnNUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5Jc0FmdGVyUmV0cnlCZWZvcmVCdWlsZFhNTCA9IHRoaXMuZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgaWYgKHRoaXMuS25vd25Ub1NlcnZlciAmJiAhdGhpcy5Jc09mZmxpbmUpIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSyk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVEFTS0lEICsgXCI9XFxcIlwiICsgdGhpcy5nZXRUYXNrVGFnKCkgKyBcIlxcXCJcIik7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX01BSU5MRVZFTCArIFwiPVxcXCJcIiArIHRoaXMuZ2V0TWFpbkxldmVsKCkgKyBcIlxcXCJcIik7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmJ1aWxkWE1MKG1lc3NhZ2UpO1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9IG51bGwgJiYgdGhpcy5Gb3JtLk9wZW5lZClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgoPE1nRm9ybT50aGlzLkZvcm0pLkdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCkpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIlxcbiAgIDwvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0sgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIHJhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIFVzZXJSYW5nZXM6IExpc3Q8VXNlclJhbmdlPiwgbG9jYXRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGZsZDogRmllbGQ7XHJcbiAgICBsZXQgY2VsbEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBTdG9yYWdlQXR0cmlidXRlLlNLSVA7XHJcbiAgICBsZXQgdG9CYXNlNjQ6IGJvb2xlYW4gPSAoRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpIDw9IDEpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IFVzZXJSYW5nZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfUk5HKTtcclxuXHJcbiAgICAgIGxldCBybmc6IFVzZXJSYW5nZSA9IFVzZXJSYW5nZXMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEICsgXCI9XFxcIlwiICsgcm5nLnZlZUlkeCArIFwiXFxcIlwiKTtcclxuXHJcbiAgICAgIGZsZCA9IDxGaWVsZD50aGlzLkRhdGFWaWV3LmdldEZpZWxkKDxudW1iZXI+cm5nLnZlZUlkeCAtIDEpO1xyXG4gICAgICBsZXQgZmxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAocm5nLm51bGxNaW4pXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5OVUxMX01JTl9STkcgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAoIXJuZy5kaXNjYXJkTWluICYmIHJuZy5taW4gIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IFJlY29yZFV0aWxzLml0ZW1WYWxUb1hNTChybmcubWluLCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUlOX1JORyArIFwiPVxcXCJcIiArIHZhbCArIFwiXFxcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJuZy5udWxsTWF4KVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTlVMTF9NQVhfUk5HICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKCFybmcuZGlzY2FyZE1heCAmJiBybmcubWF4ICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5pdGVtVmFsVG9YTUwocm5nLm1heCwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1BWF9STkcgKyBcIj1cXFwiXCIgKyB2YWwgKyBcIlxcXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYXRlKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfTE9DQVRFUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgZWxzZVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfUkFOR0VTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSB1c2VyIGFkZGVkIHNvcnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFhNTEZvclNvcnRzKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlVzZXJTb3J0cyAhPSBudWxsICYmIHRoaXMuVXNlclNvcnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuVXNlclNvcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICAgICAgbGV0IHNydDogU29ydCA9IHRoaXMuVXNlclNvcnRzLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuU09SVCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCArIFwiPVxcXCJcIiArIHNydC5mbGRJZHggKyBcIlxcXCJcIik7XHJcbiAgICAgICAgaWYgKHNydC5kaXIpXHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRElSICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuVXNlclNvcnRzLkNsZWFyKCk7XHJcbiAgICAgIHRoaXMuVXNlclNvcnRzID0gbnVsbDtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgdXNlciBldmVudCBieSBpdHMgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgZXZlbnQ8L3BhcmFtPlxyXG4gIGdldFVzZXJFdmVudChpZHg6IG51bWJlcik6IEV2ZW50IHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLlVzZXJFdnRUYWIgIT09IG51bGwpO1xyXG4gICAgbGV0IHJldEV2ZW50OiBFdmVudCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5Vc2VyRXZ0VGFiICE9PSBudWxsKVxyXG4gICAgICByZXRFdmVudCA9IHRoaXMuVXNlckV2dFRhYi5nZXRFdmVudChpZHgpO1xyXG4gICAgcmV0dXJuIHJldEV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBTZXQgdGhlIE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnIG9uIHRoZSBmb3JtLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldE1vdmVUb0ZpcnN0Q29udHJvbChtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChtb3ZlVG9GaXJzdENvbnRyb2wgfHwgIXRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgICAvLyB0aGlzIGlzIGEgY2FsbCBkZXN0aW5hdGlvbi8gc3ViZm9ybSBjYWxsXHJcbiAgICAgICAgLy8gV2UgcGVyZm9ybSBtb3ZlIHRvIGZpcnN0IGNvbnRyb2wgb25seSB0byBvbmUgY29udHJvbCBmb3JtIHBlciByZXF1ZXN0IC0gdGhlIGZpcnN0IG9uZSB0aGF0IHdlIHJlY2VpdmVcclxuICAgICAgICBsZXQgYWxyZWFkeU1vdmVkOiBib29sZWFuID0gKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5hbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgIGlmICghYWxyZWFkeU1vdmVkKVxyXG4gICAgICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5Nb3ZlZFRvRmlyc3RDb250cm9sID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0YXJ0IHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgYW5kIGl0cyBzdWJUYXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgU3RhcnQobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8SVRhc2s+IHtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5faXNTdGFydGVkKSB7XHJcbiAgICAgIHRoaXMuX2lzU3RhcnRlZCA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLkluaXRpYWxpemVFeGVjdXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSB0cnVlO1xyXG4gICAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQgPSBhd2FpdCB0aGlzLlNldHVwKCk7XHJcblxyXG4gICAgICAvLyB0YXNrIGluaXRpYWxpemF0aW9uIGZhaWxlZCAtIGNsb3NlIHRoZSB0YXNrXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICB0aGlzLl9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKCk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhmYWxzZSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkVuYWJsZUFjdGlvbnMoKTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuSW5pdGlhbGl6ZUZvcm0obW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiAhdGhpcy5faXNNYWluUHJnKVxyXG4gICAgICAgIG5vbkludGVyYWN0aXZlVGFzayA9IHRoaXM7XHJcblxyXG4gICAgICB0aGlzLkRhdGFWaWV3V2FzUmV0cmlldmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIFFDUiAjIDE2NzMzMiA6XHJcbiAgICAgIC8vIElmIHdlIHN0YXJ0IHBvcmdyYW0gUDEsIGZvciB3aGljaCBNUCBpcyBzdGFydGVkLiBNUCBpcyBjYWxsaW5nIFAyIGZyb20gaXQncyBUUC4gU28sIHdoZW4gaXQgY2FsbHMgUDJcclxuICAgICAgLy8gYWdhaW4gaXQgc3RhcnRzIE1QLCBidXQgZnJvbSBNUCBpdCBhZ2FpbiBzdGFydHMgUDEuIGFzIFAxIGlzIGluIGl0J3Mgc3VidGFzayBhbmQgaXQgaXMgbm90IHlldCBzdGFydGVkLlxyXG4gICAgICAvLyBTbywgaXQncyB3cm9uZyB0byBzdGFydCBQMSB3aGlsZSBleGVjdXRpbmcgVFAgb2YgTVAuIEl0IHNob3VsZCBleGVjdXRlIG9ubHkgUDIuXHJcbiAgICAgIC8vIFNvLCBpbiBvcmRlciB0byBhdm9pZCB0aGlzLCBzZXQgTVAncyBzdWJ0YXNrcyB0byBudWxsIGJlZm9yZSBlbnRlcmluZyBUUC4gYW5kIGFnYWluIHJlc3RvcmUgaXQgYmFjaywgaW4gb3JkZXIgdG9cclxuICAgICAgLy8gc3RhcnQgUDEgcHJvcGVybHkuXHJcbiAgICAgIGxldCBzdWJUYXNrczogVGFza3NUYWJsZSA9IHRoaXMuU3ViVGFza3M7XHJcbiAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLlN1YlRhc2tzID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuU3ViVGFza3MgPSBzdWJUYXNrcztcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGlmICh0aGlzLl9hYm9ydGluZylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGxldCBkYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkZpcnN0Q2h1bmspO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSBhd2FpdCB0aGlzLlN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2ssIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluaXRpYWxpemUgZXhlY3V0aW9uLXJlbGF0ZWQgc3R1ZmYuXHJcbiAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgT05MWSBmcm9tIFRhc2suU3RhcnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdGlhbGl6ZUV4ZWN1dGlvbigpOiB2b2lkIHtcclxuICAgIC8vIGN1cnJlbnRseSB0aGUgaXMgbm8gY29udHJvbCBleGVjdXRpbmcgdGhlcmUgZm9yIHRoZVxyXG4gICAgLy8gY3VycmVudCBleGVjdXRpbmcgY29udHJvbCBpbmRleCBpcyBzZXQgdG8gLTFcclxuICAgIHN1cGVyLnNldEJya0xldmVsKENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9SRUNfTUFJTiwgLTEpO1xyXG4gICAgdGhpcy5fZmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7ICAgICAgLy8gV2hpbGUgc3RhcnRpbmcgYSBUYXNrLCBzZXQgZmlyc3RSZWNvcmRDeWNsZSA9IFRSVUVcclxuXHJcbiAgICB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPSAoKHRoaXMuSXNTdWJGb3JtICYmICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5hbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpKVxyXG4gICAgICA/ICg8VGFzaz50aGlzLmdldFBhcmVudCgpKS5fY3VyclN0YXJ0UHJvZ0xldmVsXHJcbiAgICAgIDogVGFzay5TdGFydFByb2dMZXZlbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRpYWxpemUgZm9ybS1yZWxhdGVkIHN0dWZmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBJbml0aWFsaXplRm9ybShtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBzZXQgTW92ZVRvRmlyc3RDb250cm9sIGZsYWcgb24gdGhlIGZvcm0uXHJcbiAgICAgIHRoaXMuU2V0TW92ZVRvRmlyc3RDb250cm9sKG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgICAvLyB0aGUgSW5pdEZvcm0gbWlnaHQgY2F1c2UgZXhlY3V0aW9uIG9mIGNvZGUgKHZhcmlhYmxlIGNoYW5nZSkgc28gd2Ugc2hvdWxkIGRvIGl0IHdpdGggYSBuZXcgc2VydmVyIGV4ZWN1dGlvbiBzdGFja1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtcyA9ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuR2V0Um91dGVQYXJhbXMoKTtcclxuXHJcbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgdGFzaydzIGZvcm0uXHJcbiAgICAgIGF3YWl0IHRoaXMuSW5pdEZvcm0oKTtcclxuXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0TUdEYXRhKCkuU3RhcnRUaW1lcnMoKTtcclxuICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFJldHVyblJlc3VsdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCBzdWIgdGFza3Mgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBub25JbnRlcmFjdGl2ZVRhc2s6IFRhc2ssIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgbGV0IHRtcE5vbkludGVyYWN0aXZlVGFzazogVGFzayA9ICA8VGFzaz4gYXdhaXQgdGFzay5TdGFydChtb3ZlVG9GaXJzdENvbnRyb2wsIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrID09PSBudWxsKVxyXG4gICAgICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gdG1wTm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gICAgICAgIGVsc2UgaWYgKHRtcE5vbkludGVyYWN0aXZlVGFzayAhPT0gbnVsbClcclxuICAgICAgICAgIERlYnVnLkFzc2VydChmYWxzZSwgXCJtb3JlIHRoYW4gMSBub24gaW50ZXJhY3RpdmUgaW4gdGFzay5zdGFydFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEVuYWJsZUFjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgYWN0TGlzdDogbnVtYmVyW10gPSBBY3Rpb25NYW5hZ2VyLmFjdEVuYWJsZWQ7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChhY3RMaXN0LCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNTdWJGb3JtKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5ULCB0cnVlKTtcclxuXHJcblxyXG4gICAgLy8gZW5hYmxlIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRhc2sgcHJvcGVydGllc1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGVuYWJsZVByaW50ZGF0YTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEEsIGZhbHNlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5UX0RBVEEsIGVuYWJsZVByaW50ZGF0YSk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzaG93IGVycm9yIG9uIHRhc2sncyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBhc3luYyBTaG93RXJyb3IodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWxzVHJhbnNUZXh0OiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKHRleHQpO1xyXG4gICAgbGV0IG1sc1RyYW5zVGl0bGU6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS50cmFuc2xhdGUoQ29uc3RJbnRlcmZhY2UuRVJST1JfU1RSSU5HKTtcclxuICAgIC8vIG1scyA/Pz9cclxuICAgIGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveChtbHNUcmFuc1RpdGxlLCBtbHNUcmFuc1RleHQsIFN0eWxlcy5NU0dCT1hfSUNPTl9FUlJPUiB8IFN0eWxlcy5NU0dCT1hfQlVUVE9OX09LKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgdGhlIHJlc3VsdC4gSWYgZmFpbGVkIC0gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZWJveCBhbmQgZW5kIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRW5kVGFza09uRXJyb3IocmVzdWx0OiBSZXR1cm5SZXN1bHQsIGRpc3BsYXlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFyZXN1bHQuU3VjY2VzcyAmJiAhdGhpcy5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuSW5TdGFydFByb2Nlc3MpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuZFRhc2soZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFNldHVwKCk6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQ7XHJcbiAgICB0aGlzLlRhc2tTZXJ2aWNlLkluaXRUYXNrUHJlZml4RXhlY3V0ZWRGbGFnKHRoaXMpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBUYXNrU2VydmljZUJhc2UuQ3JlYXRlRmlyc3RSZWNvcmQodGhpcyk7XHJcblxyXG4gICAgLy8gaW5pdCBkYXRhIHZpZXdcclxuICAgIC8vIE5vdGU6IEV2ZW4gaWYgdGhlIHJlc3VsdEluaXRNb2RlIGlzIGZhbHNlIHdlIE1VU1QgaW5pdCB0aGUgZGF0YSB2aWV3XHJcbiAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0KTtcclxuICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuXHJcbiAgICAvLyBuZWVkIHRvIGNoZWNrIHJlc3VsdChvZiB0aGUgZGF0YSB2aWV3IGluaXQgYW5kIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmV0dXJuIHRoaXMgZXJyb3JcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQsIHdob3NlIGV4ZWN1dGlvbiB3YXMgZGVsYXllZCBiZWN1YXNlIHRhc2sgd2FzIG5vdCBzdGFydGVkLiBTbyBFeGN1dGUgdGhvc2UgY29tbWFuZHMgYWZ0ZXIgdGFzayBzdGFydGVkLlxyXG4gICAgICBsZXQgY29tbWFuZHM6IExpc3Q8SUNsaWVudFRhcmdldGVkQ29tbWFuZD4gPSBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UuZ2V0Q29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGNtZElkeDogbnVtYmVyID0gMDsgY21kSWR4IDwgY29tbWFuZHMubGVuZ3RoOyBjbWRJZHgrKykge1xyXG4gICAgICAgIGxldCBjb21tYW5kOiBJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kID0gKGNvbW1hbmRzLmdldF9JdGVtKGNtZElkeCkpO1xyXG4gICAgICAgIGlmIChjb21tYW5kLlRhc2tUYWcgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICBhd2FpdCBjb21tYW5kLkV4ZWN1dGUobnVsbCk7XHJcbiAgICAgICAgICBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UucmVtb3ZlQ29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoY29tbWFuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuUHJlcGFyZSk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LlN1Y2Nlc3MpIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5UYXNrU2VydmljZS5QcmVwYXJlVGFzayh0aGlzKTtcclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICBhd2FpdCB0aGlzLkVuZFRhc2tPbkVycm9yKHJlc3VsdCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIGRhdGFWaWV3Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0RGF0YUNvbnRyb2xWaWV3cyk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBmaXJzdCByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBvbmx5IGZvciBjb25uZWN0ZWQgdGFzay5cclxuICAvLy8gICBGb3Igb2ZmbGluZSB0YXNrIHdlIHJ1biBFbnRlckZpcnN0UmVjb3JkIGZ1bmN0aW9uLiBUaGVyZSB3ZSBleGVjdXRlIFJQIGFuZCBvcGVuIHN1YmZvcm1zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZG9GaXJzdFJlY29yZEN5Y2xlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgdGhpcy5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2godGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRoaXMuSXNTdWJGb3JtKTtcclxuXHJcbiAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgc3ViVGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgICAgICBpZiAoc3ViVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICAgICg8TWdGb3JtPnN1YlRhc2suZ2V0Rm9ybSgpKS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHN1YlRhc2suZG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgdGFzayBpcyBhIHN1YiBmb3JtIGJ5IGl0cyBtZ2QgZGVmaW5pdGlvbiAodXNlZCBvbmx5IHdoaWxlIGluaXRpYXRpbmcgdGFzayBmb3Igc2V0dGluZyBpc1N1YmZvcm0pXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIENoZWNrQW5kU2V0U3ViRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMuSXNTdWJGb3JtID0gKCFzdXBlci5pc01haW5Qcm9nKCkgJiYgdGhpcyAhPT0gdGhpcy5fbWdEYXRhLmdldEZpcnN0VGFzaygpKTtcclxuICB9XHJcblxyXG5cclxuICBJc1JvdXRlKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLlJvdXRlclBhdGggIT0gbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RvcCB0aGUgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrO1xyXG4gICAgaWYgKHRoaXMuX2Fib3J0aW5nKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICB3aGlsZSAoKHRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soMCkpICE9IG51bGwpIHtcclxuICAgICAgICB0YXNrLnNldERlc3RpbmF0aW9uU3ViZm9ybSh0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0pO1xyXG4gICAgICAgIGF3YWl0IHRhc2suc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpXHJcbiAgICAgIHRoaXMuX2Fib3J0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIHRhc2sgYW5kIGl0cyBwYXJlbnQgYXJlIGZyb20gZGlmZmVyZW50IE1HREFUQSBvYmplY3RzIHRoZW4gZGlzY29ubmVjdFxyXG4gICAgLy8gdGhlbSBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgdGFzayBmcm9tIGl0cyBwYXJlbnRcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGFyZW50VGFzay5yZW1vdmVTdWJUYXNrKHRoaXMpO1xyXG4gICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgb2xkVGltZXJzOiBMaXN0PG51bWJlcj4gPSBuZXcgTGlzdDxudW1iZXI+KCksIG5ld1RpbWVycyA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgICAgICBsZXQgbWdkID0gdGhpcy5nZXRNR0RhdGEoKTtcclxuXHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG9sZFRpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLnJlbW92ZVRpbWVySGFuZGxlcih0aGlzKTtcclxuICAgICAgICBtZ2QucmVtb3ZlRXhwcmVzc2lvbkhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG5ld1RpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLmNoYW5nZVRpbWVycyhvbGRUaW1lcnMsIG5ld1RpbWVycyk7XHJcblxyXG4gICAgICAgIG1nZC5yZW1vdmVUYXNrKHRoaXMpO1xyXG4gICAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuYWJvcnQoPE1nRm9ybT50aGlzLmdldEZvcm0oKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFib3J0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgdGFzayBnb3QgY2xvc2VkIGR1ZSB0byBhIGNsaWNrIG9uIHNhbWUgdGFzaywgdGhlbiBzZXQgQ3VycmVudENsaWNrZWRDdHJsIHRvIG51bGxcclxuICAgIGlmICh0aGlzLmdldENsaWNrZWRDb250cm9sKCkgIT0gbnVsbClcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9IG51bGwpXHJcbiAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkucmVtb3ZlUmVmc1RvQ3RybHMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgbGV0IHN1YkZvcm0gPSA8TWdDb250cm9sPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG5cclxuICAgICAgc3ViRm9ybS5zZXRTdWJmb3JtVGFza0lkKG51bGwpO1xyXG4gICAgICBzdWJGb3JtLmluaXRTdWJmb3JtVGFzaygpO1xyXG5cclxuICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSA9PT0gdGhpcylcclxuICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2Uuc2V0TGFzdEZvY3VzZWRUYXNrKHRoaXMuX3BhcmVudFRhc2spO1xyXG5cclxuICAgICAgLy8gUUNSICMzMTAxMTMuIElmIHRoZSBzdWJmb3JtIHRhc2sgZm9yIHdhcyBub3QgbG9hZGVkIHlldCwgZG8gbm90IHJlZnJlc2ggaXQuXHJcbiAgICAgIGlmIChzdWJGb3JtLlN1YmZvcm1Mb2FkZWQpXHJcbiAgICAgICAgYXdhaXQgKHN1YkZvcm0uZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKSkuUmVmcmVzaERpc3BsYXkodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNsZWFyRGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5DbGVhcik7XHJcbiAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNsZWFyRGF0YVZpZXdDb21tYW5kKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYWJvcnQgdGhlIE1nRGF0YSB0byB3aGljaCB0aGUgdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhYm9ydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0TUdEYXRhKCkuYWJvcnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIHN1Yi10YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaGFzU3ViVGFza3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcyAhPT0gbnVsbCAmJiB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQSBudW1iZXIsIDEtMjQsIHRoZSBjdXJyZW50IHRhc2sncyBkZXB0aCBpbiB0aGUgdGFzayBleGVjdXRpb24gaGllcmFyY2h5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGRlcHRoIG9mIHRoZSB0YXNrLCAxIGlmIGNhbGxlZCBmcm9tIHRoZSByb290IHRhc2s8L3JldHVybnM+XHJcbiAgZ2V0VGFza0RlcHRoKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG5cclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gKDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG4gICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgIGlmICh0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICBkZXB0aCA9IGRlcHRoICsgMTtcclxuXHJcbiAgICByZXR1cm4gZGVwdGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIGdldFRhc2tEZXB0aCByZWN1cnNpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHByaXZhdGUgZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgaWYgKHRtcFRhc2sgPT0gbnVsbCB8fCBieVBhcmVudE9yZGVyKVxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvKiBpZiB0aGUgY3RsSWR4IG9mIHRoZSBjdXJyZW50IHRhc2sgYW5kIHRoZSBwYXJlbnQgYXJlIGRpZmZlcmVudCwgICAqL1xyXG4gICAgICAgIC8qIHRoYXQgaXMgdGhlIGN1cnJlbnQgdGFzayBpcyBmcm9tIGEgY29tcG9uZW50LCBhZGQgdGhlIGNvbXBvbmVudCdzICovXHJcbiAgICAgICAgLyogTWFpbiBQcmcgYXMgd2VsbC4gKi9cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0aGlzLl9wYXJlbnRUYXNrLmdldEN0bElkeCgpKVxyXG4gICAgICAgICAgcmV0dXJuIDIgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgIH1cclxuICAgIHJldHVybiAxICsgKHRtcFRhc2spLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhbmNlc3RvciBvZiB0aGUgVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+b2YgdGhlIGFuY2VzdG9yIHRhc2s8L3BhcmFtPlxyXG4gIEdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uOiBudW1iZXIpOiBJVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIGxldCByZXRUYXNrOiBJVGFzayA9IG51bGw7XHJcblxyXG4gICAgaWYgKGdlbmVyYXRpb24gPT09IDApXHJcbiAgICAgIHJldFRhc2sgPSB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgICBpZiAodG1wVGFzayA9PT0gbnVsbClcclxuICAgICAgICB0bXBUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICAgICAgaWYgKHRtcFRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgcmV0VGFzayA9IHRtcFRhc2suZ2V0VGFza0FuY2VzdG9yXygtLWdlbmVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRhc2sgZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0VGFza0RlcHRoKCk6IG51bWJlcntcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZmYgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgdGFzayBjb250YWlucyB0aGUgdGFzayBwYXNzZWQgYXMgcGFyYW1ldGVyPC9yZXR1cm5zPlxyXG4gIHBhdGhDb250YWlucyh0YXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tQYXRoLkNvbnRhaW5zKDxUYXNrPnRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGNvbnRleHQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29udGV4dFwiPnRoZSBuZXcgY29udGV4dCB0YXNrIG9mIHRoZSBjdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIFNldENvbnRleHRUYXNrKGNvbnRleHQ6IFRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLkNvbnRleHRUYXNrID0gPFRhc2s+Y29udGV4dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB0YXNrIHdoaWNoIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGhhbmRsZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRDb250ZXh0VGFzaygpOiBJVGFzayB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q3VyclJlYygpKTtcclxuXHJcbiAgICBpZiAodGhpcy5JblN0YXJ0UHJvY2Vzc1xyXG4gICAgICB8fCBjdXJyUmVjICE9PSBudWxsICYmIChjdXJyUmVjLkluQ29tcHV0ZSB8fCBjdXJyUmVjLkluUmVjb21wdXRlKVxyXG4gICAgICB8fCB0aGlzLkZvcm0gIT09IG51bGwgJiYgdGhpcy5Gb3JtLmluUmVmcmVzaERpc3BsYXkoKSlcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuQ29udGV4dFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRyaWdnZXJpbmdUYXNrKCk6IFRhc2sge1xyXG4gICAgLy8gVGhpcyBpcyBhIHNlbWkgcGF0Y2ggd2hpY2ggZml4ZXMgcHJvYmxlbXMgc3VjaCBhcyB0aGUgb25lcyBpbiBRQ1IgIzI5NjQyOFxyXG4gICAgLy8gV2hlbiBhIG1vZGFsIHRhc2sgZ2V0cyBvcGVuZWQsIGl0IG1pZ2h0IHNldCBpdHMgdHJpZ2dlcmluZyB0YXNrIHRvIGEgdGFza1xyXG4gICAgLy8gd2hvc2UgJ2Fib3J0JyBjb21tYW5kIGFycml2ZWQgYW5kIGlzIHBlbmRpbmcgZm9yIGV4ZWN1dGlvbi4gVW5kZXIgdGhlc2VcclxuICAgIC8vIGNpcmN1bXN0YW5jZXMsIHdlIG11c3QgY2hlY2sgZXZlcnkgYWNjZXNzIHRvIHRyaWdnZXJpbmdUYXNrIGFuZCBtYWtlIHN1cmVcclxuICAgIC8vIGl0IHBvaW50cyB0byBhIHZhbGlkIHRhc2suXHJcbiAgICBpZiAodGhpcy5fdHJpZ2dlcmluZ1Rhc2sgIT09IG51bGwgJiYgdGhpcy5fdHJpZ2dlcmluZ1Rhc2suZ2V0TUdEYXRhKCkuSXNBYm9ydGluZylcclxuICAgICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl90cmlnZ2VyaW5nVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaW4gdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5sYXN0IGZvY3VzZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgc2V0TGFzdFBhcmtlZEN0cmwoY3RybDogTWdDb250cm9sQmFzZSk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0TGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKHRoaXMsIGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFF1ZXJ5IFRhc2sgUGF0aCBSZXR1cm5zIHRoZSB0YXNrIHBhdGggdGhhdCBsZWFkcyB0byB0aGUgY3VycmVudCB0YXNrLiBUaGUgcmVzdWx0aW5nIGFscGhhIHN0cmluZ1xyXG4gIC8vLyAgIGNvbnRhaW5zIHRoZSB0YXNrIG5hbWVzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG5hbWUgb2YgdGhlIHRhc2suIE5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlICc7J1xyXG4gIC8vLyAgIGNoYXJhY3Rlci4gRm9yIFBST0coKSB1c2luZy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHF1ZXJ5VGFza1BhdGgoKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICBsZXQgaW5zZXJ0ZWROYW1lczogbnVtYmVyID0gMDsgICAgICAgIC8vIGhvdyBtYWNoIG5hbWVzIGluc2VydGVkIHRvIHRoZSBvdXRwdXQgc3RyaW5nXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoNzkzNik7IC8vIDMxICogMjU2ICovXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKSk7XHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCBmYWxzZSk7XHJcbiAgICBmb3IgKGxldCB0c2s6IG51bWJlciA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0c2sgPj0gMDsgdHNrLS0pIHtcclxuICAgICAgbGV0IGN1cnJUc2s6IFRhc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuICAgICAgaWYgKGN1cnJUc2suaXNNYWluUHJvZygpKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZVByb3A6IFByb3BlcnR5ID0gY3VyclRzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpO1xyXG4gICAgICBpZiAobmFtZVByb3AgPT0gbnVsbClcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IG5hbWVQcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZSkpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IDEgbmFtZSAtPiBkb24ndCBpbnNlcnQgJzsnXHJcbiAgICAgICAgLy8gYWZ0ZXIgbGFzdCBuYW1lIGRvbid0IGluc2VydCAnOycgdG9vLlxyXG4gICAgICAgIGlmIChpbnNlcnRlZE5hbWVzKysgIT09IDApXHJcbiAgICAgICAgICByZXN1bHQuQXBwZW5kKCc7Jyk7XHJcbiAgICAgICAgcmVzdWx0LkFwcGVuZChuYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgRmllbGQgd2hpY2ggY29udGFpbiBpdGVtIG51bWJlciBpdG1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fMl9wYXJlbnRfdmVlKGl0bTogbnVtYmVyKTogRmllbGQge1xyXG4gICAgbGV0IGN1cnJUc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0bTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRtOiBudW1iZXIgPSAwOyAgICAgIC8vIHN0YXJ0IG9mIHRoZSBmaWVsZCBpbiBmaWVsZGVUYWIgbnVtYmVyIGZvciBjaGVja2VkIHRhc2tcclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGgtMV1cclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBjdXJyVHNrID0gdHJlZVJvdXRlW3Rza107XHJcblxyXG4gICAgICBjdXJySXRtICs9IGN1cnJUc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgLy8gZm91bmQgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGZpZWxkXHJcbiAgICAgIGlmIChpdG0gPCBjdXJySXRtKSB7XHJcbiAgICAgICAgLy8gbnVtYmVyIG9mIEZpZWxkIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdG0gLT0gbGFzdEl0bTtcclxuICAgICAgICByZXR1cm4gPEZpZWxkPmN1cnJUc2suRGF0YVZpZXcuZ2V0RmllbGQoaXRtKTtcclxuICAgICAgfVxyXG4gICAgICBsYXN0SXRtID0gY3Vyckl0bTtcclxuICAgIH1cclxuICAgIC8vIG5vdCBmb3VuZCB0aGUgZmllbGRcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbnRyb2wgaWQgd2hpY2ggY29udGFpbiBmaWVsZCBhdHRhY2hlZCB0byBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGVtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xJREZyb21WYXJJdGVtKGl0ZW06IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0ZW06IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbGFzdEl0ZW06IG51bWJlciA9IDA7ICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGggLSAxXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcbiAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG4gICAgICBjdXJySXRlbSArPSBjdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2wgJiBmaWVsZFxyXG4gICAgICBpZiAoaXRlbSA8IGN1cnJJdGVtKSB7XHJcbiAgICAgICAgLy8gTnVtYmVyIG9mIGZpZWxkcyBpbiBmb3VuZCB0YXNrXHJcbiAgICAgICAgaXRlbSAtPSBsYXN0SXRlbTtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdXJyVGFzay5EYXRhVmlldy5nZXRGaWVsZChpdGVtKTtcclxuICAgICAgICBpZiAoZmllbGQuZ2V0Q3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgPSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIGN1cnJUYXNrLkZvcm0uZ2V0Q29udHJvbElkeChmaWVsZC5nZXRDdHJsKCkpICsgMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpXHJcbiAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgIGxhc3RJdGVtID0gY3Vyckl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBhdHRhY2hlZCB0byB0aGUgdmFyaWFibGUgaW4gc2FtZSB0YXNrIG5vdCBmb3VuZFxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBmcm9tIGNvbnRyb2xJRFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xGcm9tQ29udHJvbElEKGNvbnRyb2xJRDogbnVtYmVyLCBwYXJlbnQ6IFJlZlBhcmFtPG51bWJlcj4pOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBwYXJlbnQudmFsdWUgPSAtMTtcclxuXHJcbiAgICBpZiAoY29udHJvbElEID49IDApIHtcclxuICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgICAgbGV0IGNhbGxlclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzSW5DdXJydGFzazogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgY29udHJvbElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcblxyXG4gICAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcblxyXG4gICAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG5cclxuICAgICAgICBpZiAoY3VyclRhc2suRm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBub09mQ29udHJvbHNJbkN1cnJ0YXNrID0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2xcclxuICAgICAgICAgIGlmIChjb250cm9sSUQgPCAobm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKyBub09mQ29udHJvbHNJbkN1cnJ0YXNrKSkge1xyXG4gICAgICAgICAgICAvLyBJZHggb2YgdGhlIGNvbnRyb2wgaW4gY3VycmVudCB0YXNrXHJcbiAgICAgICAgICAgIGNvbnRyb2xJZHggPSBjb250cm9sSUQgLSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzaztcclxuICAgICAgICAgICAgY29udHJvbCA9IDxNZ0NvbnRyb2w+Y3VyclRhc2suRm9ybS5DdHJsVGFiLmdldEN0cmwoY29udHJvbElkeCk7XHJcbiAgICAgICAgICAgIGNhbGxlclRhc2sgPSBjdXJyVGFzaztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gbm9PZkNvbnRyb2xzSW5DdXJydGFzaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEdldCBwYXJlbnRcclxuICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmVudC52YWx1ZSA9IDA7XHJcbiAgICAgICAgbGV0IHByZXZDdGxJZHg6IG51bWJlciA9IHRyZWVSb3V0ZVswXS5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSAwOyB0YXNrIDwgdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2srKykge1xyXG4gICAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgICAgaWYgKHByZXZDdGxJZHggIT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIHBhcmVudC52YWx1ZSsrO1xyXG5cclxuICAgICAgICAgIGlmIChjYWxsZXJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXggPT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIHByZXZDdGxJZHggPSBjdXJyVGFzay5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnRyb2wgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIENvbnRyb2xJRFxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjdGxfaXRtXzRfcGFyZW50X3ZlZShwYXJlbnQ6IG51bWJlciwgdmVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHRzazogVGFzaztcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcblxyXG4gICAgaWYgKHBhcmVudCAhPT0gVGFza0Jhc2UuTUFJTl9QUkdfUEFSRU5UX0lEICYmIGRlcHRoIDw9IHBhcmVudClcclxuICAgICAgcmV0dXJuIHZlZTtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuXHJcbiAgICBpZiAodmVlICE9PSAwKSB7XHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgLy8gZ2V0IHRoZSBpbmRleCBvZiBwYXJlbnQgaW4gdGhlIHRhc2sgdHJlZVxyXG4gICAgICBsZXQgaW5kT2ZQYXJlbnRJblRhc2tUcmVlOiBudW1iZXIgPSB0aGlzLmdldEluZE9mUGFyZW50SW5UYXNrVHJlZShwYXJlbnQsIHRyZWVSb3V0ZSk7XHJcblxyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgaSA+IGluZE9mUGFyZW50SW5UYXNrVHJlZTsgaS0tKSB7XHJcbiAgICAgICAgdHNrID0gdHJlZVJvdXRlW2ldO1xyXG4gICAgICAgIHZlZSArPSB0c2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1RyZWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudDogbnVtYmVyLCB0YXNrVHJlZTogVGFza1tdKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IHRhc2tUcmVlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKHRhc2tUcmVlW2ldLmlzTWFpblByb2coKSAmJiB0aGlzLl9jdGxJZHggPT09IHRhc2tUcmVlW2ldLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBpbmRPZlBhcmVudEluVGFza1RyZWUgPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IHBhcmVudDtcclxuXHJcbiAgICByZXR1cm4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVudHJ5IHBvaW50IHRvIHRoZSByZWN1cnNpb24gaW5kdWNlZCBieSBnZXRGaWVsZEJ5TmFtZV8uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGEgZmllbGQgd2hpY2ggYmVsb25ncyB0byBtZSBvciB0byBteSBwYXJlbnRzIHdpdGggdGhlIG1hdGNoaW5nIG5hbWU8L3JldHVybnM+XHJcbiAgZ2V0RmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG4gICAgcmV0dXJuICg8VGFzaz4gKHRoaXMuR2V0Q29udGV4dFRhc2soKSkpLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIGZpZWxkIHdpdGggdGhlIG5hbWUgaW4gdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lLCB0aGUgbmFtZSBjYW4gYmUgZW1wdHkgc3RyaW5nIHRvbzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyBub3QgZm91bmQgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTC48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZTogc3RyaW5nKTogRmllbGR7XHJcbiAgICBsZXQgdG1wVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAoZmxkTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCBmbGQ6IEZpZWxkID0gdGhpcy5nZXRGaWVsZChmbGROYW1lKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgZmllbGQgaXMgbm90IG91cnMgLSByZWN1cnNpdmUgY2hlY2sgdGhlIGFuY2VzdG9yc1xyXG4gICAgaWYgKGZsZCA9PSBudWxsKSB7XHJcbiAgICAgIHRtcFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCkgIT0gbnVsbCA/IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSA6IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0bXBUYXNrLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBsZXQgbWFpblByZzogVGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCB0aGlzLmdldEN0bElkeCgpKTtcclxuICAgICAgICAgIGZsZCA9IG1haW5QcmcuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICAgICAgZmxkID0gdG1wVGFzay5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGluZGV4IG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gWmVyby48L3JldHVybnM+XHJcbiAgZ2V0SW5kZXhPZkZpZWxkQnlOYW1lKGZsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9IHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpO1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpO1xyXG4gICAgbGV0IGZsZFRhYjogRmllbGRzVGFibGU7XHJcblxyXG4gICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gMDtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG4gICAgZm9yIChsZXQgY3VycjogbnVtYmVyID0gZGVwdGggLSAxOyBjdXJyID49IDA7IGN1cnItLSkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0cmVlUm91dGVbY3Vycl07XHJcbiAgICAgIGlmIChjdXJyVGFzayA9PT0gZmxkLmdldFRhc2soKSkge1xyXG4gICAgICAgIGN1cnIgPSBmbGQuZ2V0SWQoKTtcclxuICAgICAgICBpbmRleCArPSArK2N1cnI7ICAgICAgICAgLy8gc3RhcnQgaW5kZXggaW4gTWFnaWMgZnJvbSAxIGFuZCBub3QgZnJvbSAwXHJcbiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgIC8vIGdldCBvdXQgb2YgdGhlIHRhc2sgdHJlZSAtIHRoZSBpbmRleCBpcyBmb3VuZFxyXG4gICAgICB9XHJcbiAgICAgIGZsZFRhYiA9IDxGaWVsZHNUYWJsZT5jdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKTtcclxuICAgICAgaW5kZXggKz0gZmxkVGFiLmdldFNpemUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgdGhlIHBhdGggZnJvbSB0aGlzIHRhc2sgdG8gdGhlIHJvb3Qgb2YgdGhlIHRhc2tzIHRyZWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGF0aFwiPmFycmF5IG9mIHRhc2tzLCB0aGUgcm91dGUgdXAuIFRoZSAwIGl0ZW0gaXMgc3RhcnQgcG9pbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICBwYXRoVG9Sb290KHBhdGg6IFRhc2tbXSwgYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSAoYnlQYXJlbnRPcmRlciA/IHRoaXMgOiA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwYXRoW2ldID0gdGFzaztcclxuICAgICAgbGV0IGN0bElkeDogbnVtYmVyID0gdGFzay5nZXRDdGxJZHgoKTtcclxuXHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gYnlQYXJlbnRPcmRlciA/IG51bGwgOiB0YXNrLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKVxyXG4gICAgICAgIHRhc2sgPSB0bXBUYXNrO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgZ2xvYmFsIGhhbmRsZXIgYWRkIGl0IHRvIHRoZSBwYXRoXHJcbiAgICAgICAgICBpZiAoIWJ5UGFyZW50T3JkZXIgJiYgdGhpcy5pc01haW5Qcm9nKCkgJiYgdGhpcy5nZXRDdGxJZHgoKSAhPT0gQ29uc3RJbnRlcmZhY2UuVE9QX0xFVkVMX0NPTlRBSU5FUilcclxuICAgICAgICAgICAgcGF0aFtpICsgMV0gPSB0aGlzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiBjdGxJZHggIT09IHRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICBwYXRoWysraV0gPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgY3RsSWR4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgdGFzayBzaG91bGQgYmUgcmVmcmVzaGVkIC0gY29tcGFyZSB0aGUgXCJyZWZyZXNoIG9uXCIgZmllbGRzIG9mIHRoZSBjdXJyZW50IHJlY29yZCB0byB0aGVcclxuICAvLy8gICBwcmV2aW91cyByZWNvcmQgYW5kIGlmIGRpZmZlcmVudCB2YWx1ZXMgYXJlIGZvdW5kIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzaG91bGRCZVJlZnJlc2hlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBkYXRhVmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fcGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcmV2Q3VyclJlYyBpcyBudWxsIG9ubHkgaWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgb3IgYWZ0ZXIgQ2FuY2VsLlxyXG4gICAgLy8gQWZ0ZXIgQ2FuY2VsIGluIHRoZSBwYXJlbnQgdGFzayBTdWJmb3JtIHJlZnJlc2ggbXVzdCBiZSBkb25lIGFsd2F5c1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgPT09IG51bGwgfHwgZGF0YVZpZXcuaXNQcmV2Q3VyclJlY051bGwoKSB8fFxyXG4gICAgICAodGhpcy5SZWZyZXNoT25WYXJzICE9PSBudWxsICYmICFkYXRhVmlldy5jdXJyRXF1YWxzUHJldih0aGlzLlJlZnJlc2hPblZhcnMpKSlcclxuICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3ViVGFza3MgKHN1YmZvcm1zKSBzaG91bGQgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBDaGVja1JlZnJlc2hTdWJUYXNrcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBkbyBub3QgcmVmcmVzaCBzdWJmb3JtcyBiZWZvcmUgdGhlIGZpcnN0IHJlY29yZCBwcmVmaXguIFRoZSBzZXJ2ZXIgc2VudCB1cyB0aGVpciBkYXRhdmlldyFcclxuICAgIGlmICh0aGlzLl9lbnRlcmVkUmVjTGV2ZWwpIHtcclxuICAgICAgbGV0IHN1YmZvcm1zVG9SZWZyZXNoOiBMaXN0PFRhc2s+ID0gYXdhaXQgdGhpcy5HZXRTdWJmb3Jtc1RvUmVmcmVzaCgpO1xyXG5cclxuICAgICAgaWYgKHN1YmZvcm1zVG9SZWZyZXNoLmxlbmd0aCA+IDApXHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgYSBsaXN0IG9mIHN1YnRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+YSBsaXN0IG9mIHN1YnRhc2tzPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0U3ViVGFza3MoKTogTGlzdDxUYXNrPiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpXHJcbiAgICAgICAgc3ViVGFza3MucHVzaCg8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2YgdGhvc2Ugc3ViZm9ybXMgdGhhdCBtdXN0IGJlIHJlZnJlc2hlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5saXN0IG9mIHN1YmZvcm1zIHRvIHJlZnJlc2g8L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0U3ViZm9ybXNUb1JlZnJlc2goKTogUHJvbWlzZTxMaXN0PFRhc2s+PiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSB0aGlzLkdldFN1YlRhc2tzKCk7XHJcbiAgICBsZXQgc3ViVGFza3NUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5TaG91bGRSZWZyZXNoU3ViZm9ybVRhc2soc3ViVGFzaykpXHJcbiAgICAgICAgc3ViVGFza3NUb1JlZnJlc2gucHVzaChzdWJUYXNrKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrc1RvUmVmcmVzaDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIHRoZSBzcGVjaWZpYyBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIFNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnN1YlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIC8vIERlZmVjdCA3Njk3OS4gU3ViZm9ybSBjYW4gZXhlY3V0ZSByZWZyZXNoIG9ubHkgYWZ0ZXIgaXQgaGFzIFRhc2tWaWV3LlxyXG4gICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgIXN1YlRhc2suSW5TZWxlY3QgJiYgc3ViVGFzay5BZnRlckZpcnN0UmVjb3JkUHJlZml4KSB7XHJcbiAgICAgIGxldCBwYXJlbnRNb2RlOiBzdHJpbmcgPSB0aGlzLmdldE1vZGUoKTtcclxuICAgICAgbGV0IG1vZGVQcm9wZXJ0eTogbnVtYmVyID0gKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWVxyXG4gICAgICAgIDogcGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUpO1xyXG5cclxuICAgICAgLy8gRm9yIGEgc3ViZm9ybSB3aXRoICdBc1BhcmVudCcgbW9kZSB3ZSBhbHNvIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybVxyXG4gICAgICAvLyBhZnRlciB0aGUgcGFyZW50IHJlY29yZCBwcmVmaXguIElmIHRoZSBzcGVjaWZpYyBtb2RlIGlzIG5vdCBhbGxvd2VkXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGNvbnRpbnVlcyBpbiB0aGUgb2xkIG1vZGUuXHJcbiAgICAgIGlmIChzdWJUYXNrLk1vZGVBc1BhcmVudCAmJiBwYXJlbnRNb2RlICE9PSBzdWJUYXNrLmdldE1vZGUoKSAmJlxyXG4gICAgICAgIHRoaXMuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEICYmXHJcbiAgICAgICAgYXdhaXQgKHN1YlRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSAmJlxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suY2hlY2tQcm9wKG1vZGVQcm9wZXJ0eSwgdHJ1ZSkpIHtcclxuICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgc3ViZm9ybUN0cmwuUmVmcmVzaE9uVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xyXG5cclxuICAgICAgICBhd2FpdCBzdWJUYXNrLlNldE1vZGVBc1BhcmVudChwYXJlbnRNb2RlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZWZyZXNoID0gYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fUkVGUkVTSCwgdHJ1ZSkgJiYgc3ViVGFzay5zaG91bGRCZVJlZnJlc2hlZCgpO1xyXG5cclxuICAgICAgICBpZiAocmVmcmVzaCkge1xyXG4gICAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5pc1Zpc2libGUoKSAmJlxyXG4gICAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVmcmVzaCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlZnJlc2gpXHJcbiAgICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlZnJlc2g7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldHMgdGhlIHRhc2sgbW9kZSBhcyBwYXJlbnQgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TW9kZVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKHRydWUpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UoZmFsc2UpO1xyXG4gICAgICBsZXQgc3ViVGFza0R2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgICBpZiAoIXN1YlRhc2tEdi5pc0VtcHR5KCkgJiYgKHN1YlRhc2tEdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICB0aGlzLnNldE1vZGUocGFyZW50TW9kZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICBhd2FpdCAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuXHJcbiAgICB0aGlzLnNldE9yaWdpbmFsVGFza01vZGUocGFyZW50TW9kZSk7XHJcbiAgICBhd2FpdCB0aGlzLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gYWZ0ZXIgY29tcHV0ZSBkbyBzdWJmb3JtIHRhc2sgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIGFzeW5jIGRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCkge1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0cnVlKTtcclxuICAgICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENsZWFuIGZsYWcgZm9yIFN1YmZvcm0gcmVjb3JkIGN5Y2xlIDwvc3VtbWFyeT5cclxuICBDbGVhbkRvU3ViZm9ybVByZWZpeFN1ZmZpeCgpOiB2b2lkIHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgbXVzdCBkaXNwbGF5IGNvbmZpcm1hdGlvbiB3aW5kb3cgcHJpb3IgdG8gZGVsZXRpbmcgYSByZWNvcmQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBtdXN0Q29uZmlybUluRGVsZXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSk7XHJcblxyXG4gICAgLy8gQXMgc3RyYW5nZSBhcyBpdCBzb3VuZHMsIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0b1xyXG4gICAgLy8gRmFsc2UsIHRoZW4gbm8gbmVlZCB0byBkaXNwbGF5IGNvbmZpcm1hdGlvbi4uLlxyXG4gICAgcmV0dXJuICFwcm9wLmlzRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHN1Yi10YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YlRhc2tcIj50aGUgc3ViIHRhc2sgdG8gYWRkPC9wYXJhbT5cclxuICBhZGRTdWJUYXNrKHN1YlRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlN1YlRhc2tzID09PSBudWxsKVxyXG4gICAgICB0aGlzLlN1YlRhc2tzID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgIHRoaXMuU3ViVGFza3MuYWRkVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgb25lIG9mIHRoaXMgdGFza3Mgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSBzdWItdGFzayB0byByZW1vdmU8L3BhcmFtPlxyXG4gIHJlbW92ZVN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MucmVtb3ZlVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcmFuc2FjdGlvbkZhaWxlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkID0gdmFsO1xyXG5cclxuICAgIGlmICghdmFsKVxyXG4gICAgICB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxldmVsXCI+aXMgdGhlIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2hlY2tpbmcuIFRSQU5TX05PTkUgLS0+IGNoZWNrIGZvciBhbnlcclxuICAvLy8gICBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGxldmVsIGZhaWx1cmUgVFJBTlNfUkVDT1JEL1RBU0tfUFJFRklYIC0tPiBjaGVjayBmb3IgYSBmYWlsdXJlIGluIHRoYXQgc3BlY2lmaWNcclxuICAvLy8gICBsZXZlbDwvcGFyYW0+XHJcbiAgdHJhbnNhY3Rpb25GYWlsZWQobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbCkpXHJcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbkZhaWxlZDtcclxuICAgIGVsc2UgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgZmxhZyBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gcmV0cnkgb24gdGhlIHRhc2sncyBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnZhbHVlIG9mIGZsYWc8L3BhcmFtPlxyXG4gIHNldEFmdGVyUmV0cnkodmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgIT0gbnVsbCkge1xyXG4gICAgICBpZiAodmFsID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LnNldEFmdGVyUmV0cnkodmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFmdGVyUmV0cnkoKTogYm9vbGVhbjtcclxuICBnZXRBZnRlclJldHJ5KHJlY292ZXJ5OiBzdHJpbmcpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEFmdGVyUmV0cnlfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8xKHJlY292ZXJ5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgcGFydCBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gY3VycmVudGx5IGJlaW5nIHJldHJpZWQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzAoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZCB3aXRoIGEgc3BlY2lmaWMgcmVjb3Zlcnk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzEocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNhY3Rpb24uZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBFeGVjRW5kVGFzayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBfYkV4ZWNFbmRUYXNrIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV4ZWNFbmRUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JFeGVjRW5kVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJleGVjdXRlIGVuZCB0YXNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibW9kZVwiPnRoZSBtb2RlIHRvIGNvbXBhcmUgdG88L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc2hvdWxkIHdlIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uPzwvcmV0dXJucz5cclxuICBhc3luYyBldmFsRW5kQ29uZChtb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBlbmRUYXNrQ29uZFByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IGV2YWxFbmRDb25kUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OKTtcclxuXHJcbiAgICAvLyBEb250IGV2YWx1YXRlIGVuZCBjb25kaXRpb24gaWYgd2UgYXJlIGFscmVhZHkgY2xvc2luZyB0aGUgdGFza1xyXG4gICAgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2JFeGVjRW5kVGFzaylcclxuICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgaWYgKGV2YWxFbmRDb25kUHJvcCAhPSBudWxsICYmICggTlN0cmluZy5Db21wYXJlKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpLCBDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSxcclxuICAgICAgICB0cnVlKSA9PT0gMCB8fCAoKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpKS50b0xvd2VyQ2FzZSgpID09PSBtb2RlLnRvTG93ZXJDYXNlKCkpKSkge1xyXG4gICAgICAvLyBjaGVjayB0aGUgZW5kIGNvbmRpdGlvblxyXG4gICAgICBlbmRUYXNrQ29uZFByb3AgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTik7XHJcbiAgICAgIGlmIChlbmRUYXNrQ29uZFByb3AgPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGxldCBlbmRUYXNrOiBzdHJpbmcgPSBhd2FpdCBlbmRUYXNrQ29uZFByb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgLy8gc2lnbmFsIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBlbmQgdGFzayBhZnRlciB3ZSBnZXQgb3V0IG9mIHRoZSBsb29wXHJcbiAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihlbmRUYXNrKSkge1xyXG4gICAgICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJ0cnlpbmcgdG8gc3RvcFwiIGZsYWcgZm9yIHRoZSB0YXNrIGFuZCBpdCdzIHN1YlRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcnlpbmdUb1N0b3AodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgdGFzay5zZXRUcnlpbmdUb1N0b3AodmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5Jc1RyeWluZ1RvU3RvcCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBnZXRJblJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlY29yZFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW5SZWNvcmRTdWZmaXgoYlZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYlZhbHVlICE9PSB0aGlzLl9pblJlY29yZFN1ZmZpeCkge1xyXG4gICAgICB0aGlzLl9pblJlY29yZFN1ZmZpeCA9IGJWYWx1ZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBiRXZhbE9sZFZhbHVlcyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJGbGFnXCI+dHJ1ZS9mYWxzZSB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlL2ZsYXNlIC0gdmFsdWUgdXBkYXRlZDwvcmV0dXJucz5cclxuICBzZXRFdmFsT2xkVmFsdWVzKGJGbGFnOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYkZsYWcgIT09IHRoaXMuX2V2YWxPbGRWYWx1ZXMpIHtcclxuICAgICAgdGhpcy5fZXZhbE9sZFZhbHVlcyA9IGJGbGFnO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJFdmFsT2xkVmFsdWVzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmFsc2UgLSBsb29rIGF0IG9sZCB2YWx1ZXMgd2hlbiBnZXR0aW5nIHRoZSBmaWVsZCB2YWx1ZTwvcmV0dXJucz5cclxuICBnZXRFdmFsT2xkVmFsdWVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2YWxPbGRWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAgYXN5bmMgZW5kVGFzayhyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBkdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb24/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc3ViZm9ybURlc3RpbmF0aW9uKSlcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGZhbHNlLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIHN1YmZvcm1EZXN0aW5hdGlvbiwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRlZCBpbiBlbmRpbmcgdGhlIHRhc2sgYW5kIGl0cyBzdWIgdGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV2ZXJzaWJsZUV4aXRcIj5pZiB0cnVlIHRoZW4gdGhlIGV4aXQgaXMgcmV2ZXJzaWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5RGVzY3NcIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhlIHN1YiB0YXNrcyBhbmQgaGFuZGxlIHJlYyBzdWZmaXggZm9yIHRoaXMgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtRGVzdGluYXRpb25cIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhpcyB0YXNrPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGVuZFRhc2tfMShyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb246IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGNsb3NlZFN1YkZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcblxyXG4gICAgaWYgKCh0aGlzLklzU3ViRm9ybSAmJiAhc3ViZm9ybURlc3RpbmF0aW9uKSAmJiAhdGhpcy5fcGFyZW50VGFzay5JbkVuZFRhc2spIHtcclxuICAgICAgLy8gaWYgdGhpcyB0YXNrIGlzIGEgc3ViZm9ybSBhbmQgaXRzIHBhcmVudCBpcyBub3QgdHJ5aW5nIHRvIHN0b3AgdGhlblxyXG4gICAgICAvLyBzdGFydCBzdG9wcGluZyB0aGUgdGFza3Mgc3ViIHRyZWUgZnJvbSB0aGUgcGFyZW50IGZvcm1cclxuICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5fcGFyZW50VGFzay5lbmRUYXNrKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLkluRW5kVGFzaykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuSW5FbmRUYXNrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBlcnJvciBhbmQgYnJvd3NlciBjbG9zZSwgaW50aW1hdGUgc2VydmVyIGFib3V0IGJyb3dzZXIgY2xvc2VcclxuICAgICAgICBpZigoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkgJiYgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVVubG9hZENvbW1hbmQoKTtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICAgICAgdGhpcy5zZXRUcnlpbmdUb1N0b3AodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIGV4aXQgZnJvbSBzdWJUYXNrcyBpbiBhIHByZWZpeCBtYW5uZXJcclxuICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBzdWIgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgbGV0IGNsaWVudE9wZXJFeGlzdDogYm9vbGVhbiA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyRXhpc3QgPSBhd2FpdCB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyh0aGlzLFxyXG4gICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpXHJcbiAgICAgICAgICAgICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHRoaXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdCAmJiAhcGVuZGluZ1RyYW5zYWN0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgICAgIGNsb3NlZFN1YkZvcm0gPSBjbG9zZWRTdWJGb3JtIHx8IHN1YlRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZXhpdCBmb3IgdGhlIGZpcnN0IHRhc2sgbXVzdCBlbmQgYWxsIHRhc2tzXHJcbiAgICAgICAgICBpZiAodGhpcyA9PT0gbWdkVGFiLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpIHtcclxuICAgICAgICAgICAgZm9yIChpID0gbWdkVGFiLmdldFNpemUoKSAtIDE7IGkgPiAwICYmIHN1Y2NlZWRlZDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG1nZFRhYi5nZXRNR0RhdGEoaSkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKG1nZFRhYi5nZXRNR0RhdGEoaSkuZ2V0Rmlyc3RUYXNrKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG4gICAgICAgICAgLy8gaWYgY2xvc2luZyB0aGUgc3ViIHRhc2tzIHdhcyBzdWNjZXNzZnVsIHRoZW4gZXhlY3V0ZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIHR1cm4gb2ZmIHRoZSBmb3JjZSByZWNvcmQgc3VmZml4LFxyXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgYW4gdW53YW50ZWQgdXBkYXRlIG1pZ2h0IGJlIHNlbnQgd2hlbiB0YXNrIGVuZHMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjBcIik7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgZm9yY2Ugc3VmZml4LCBmb3IganVzdCBpbiBjYXNlLlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiBmb3JjZVN1ZmZpeCA9PT0gdHJ1ZSAmJiB0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgXCIxXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpXHJcbiAgICAgICAgICAgIHRoaXMuSGFuZGxlVHJhbnNhY3Rpb25JbmZvKCk7XHJcblxyXG4gICAgICAgICAgbGV0IHByZVRza1N1ZmZpeDogYm9vbGVhbiA9IHN1Y2NlZWRlZDtcclxuXHJcbiAgICAgICAgICAvLyBub3cgcGVyZm9ybSB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHN1Y2NlZWRlZCAmJiAhb25seURlc2NzICYmIHJldmVyc2libGVFeGl0ICYmICFkdWVUb1ZlcmlmeUVycm9yICYmXHJcbiAgICAgICAgICAgICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKSAmJlxyXG4gICAgICAgICAgICB0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCAmJiAhdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQpXHJcbiAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGF3YWl0IHRoaXMuaGFuZGxlVGFza1N1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gZXhpdCBmcm9tIGFueSBzdWJUYXNrcyBvcGVuZWQgZHVyaW5nIHRoZSBsYXN0IHJlYy1zdWZmaXggb3IgdGFzayBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiB0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghc3ViVGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQoc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZG9udCBjb250aW51ZSB3aXRoIHRhc2sgZXhpdCBpZiBhIGRhdGEgZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGFzayBzdWZmaXggKGUuZy4gcm9sbGJhY2soKSlcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIC8vIHRhc2sgc3VmZml4IG9ubHkgc3RvcHMgZXhlY3V0aW9uIGZvciBjdXJyZW50IHRhc2ssIHdoaWNoIGlzIGJlaW5nIGNsb3NlZFxyXG4gICAgICAgICAgaWYgKHByZVRza1N1ZmZpeClcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpIHtcclxuICAgICAgICAgICAgLy8gVHJ5IGNsb3NpbmcgYW55IHRhc2sgbGV2ZWwgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoZmFsc2UsIENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiAhdGhpcy50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19UQVNLX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWNjZWVkZWQpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGJhc2VNZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhO1xyXG4gICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBjbG9zaW5nIHRoZSB0b3Btb3N0IHRhc2sgLSBkb250IGxvb3NlIGFueSBldmVudHMsIGxlZnQgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIGJhc2VNZ2QuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnRzKGJhc2VNZ2QsIDApO1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgc3QgPSBuZXcgU2Vzc2lvblN0YXRpc3RpY3NGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzdC5Xcml0ZVRvRmxvd01vbml0b3IoKEZsb3dNb25pdG9yUXVldWUpX2Zsb3dNb25pdG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgICAgICAgICAgLy9hYm9ydGluZyB0YXNrIGNsb3N1cmVcclxuICAgICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgVGFza1NlcnZpY2VCYXNlLkV4aXQodGhpcywgcmV2ZXJzaWJsZUV4aXQsIHN1YmZvcm1EZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFdoZW4gY2xvc2luZyBhIHRhc2sgd2hvc2UgcGFyZW50IGlzIGEgbWFpbiBwcm9ncmFtLCBjaGVjayB0aGUgbWFpbiBwcm9ncmFtJ3MgZW5kXHJcbiAgICAgICAgICAgICAgLy8gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgICAgICAgICAgICAgIGxldCBtYWluUHJnVGFzazogVGFzayA9IG1nZC5nZXRNYWluUHJvZygwKTtcclxuICAgICAgICAgICAgICAgIGxldCByb290VGFzazogVGFzayA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuZE1haW5Qcmc6IGJvb2xlYW4gPSBhd2FpdCBtYWluUHJnVGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZW5kIHRoZSByb290IHRhc2sgaWYgd2UgYXJlIGFscmVhZHkgZG9pbmcgaXQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcyAhPT0gcm9vdFRhc2sgJiYgZW5kTWFpblByZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHJvb3RUYXNrKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0Q3RybChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgTWdGb3JtLkNyZWF0ZWRGb3Jtcy5yZW1vdmUoPE1nRm9ybT50aGlzLkZvcm0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICBpZiAoIXRoaXMuSXNTdWJGb3JtIHx8IHN1YmZvcm1EZXN0aW5hdGlvbilcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkLCByZXZlcnNpYmxlRXhpdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRY3IgIzkxNDY0NSA6IHJldHVybiBmYWxzZSBpbiBhIHJlY3Vyc2l2ZSBjYWxsLlxyXG4gICAgLy8gb3RoZXJ3aXNlIGNvbW1vbkhhbmRsZXJBZnRlcihldmVudE1hbmFnZXIpIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmIHRoZSBjYWxsIGlzIHJlY3Vyc2l2ZWx5IG1hZGUgZnJvbSBoYW5kbGVFdmVudC5cclxuICAgIC8vIGZvciBleGFtcGxlIDogdGFzayBjb25kIGZ1bGZpbGxlZC4gaGFuZGxlSW50ZXJuYWxFdmVudCh0aGlzLCBNR19BQ1RfUkVDX1NVRkZJWCkgaXMgY2FsbGVkLlxyXG4gICAgLy8gd2hpbGUgaW4gcmVjIHN1ZiBoYW5kbGVyLCBlbmRUYXNrIGlzIGNhbGxlZCBhZ2Fpbi4uaWYgd2UgcmV0dXJuIHRydWUgdGhlbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIGlzIG5vdCBleGVjdXRlZC5cclxuICAgIC8vIGlmIHRoZSByZWMgc3VmZml4IGhhbmRsZXIgZGlkIG5vdCBleGlzdCwgdGhlcmUgd2lsbCBiZSBubyBjYWxsIHRvIGVuZFRhc2sgYW5kIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgd2lsbCBiZSBleGVjdXRlZC5cclxuICAgIC8vIFRoZSBuYW1lICdzdWNjZWVkZWQnIGlzIGEgYml0IG1pc2xlYWRpbmcuLml0cyBtb3JlIGxpa2UgJ2V4ZWN1dGVkJy4uYnV0IHdlIGRlY2lkZWQgdG8ga2VlcCBpdC5cclxuICAgIGVsc2UgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyByZXN0b3JlIHRoZSBmbGFnLlxyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRoaXMuX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQpO1xyXG5cclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldFNlcnZlclNpZGVUYXNrU3VmZml4KClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0U2VydmVyU2lkZVRhc2tTdWZmaXggKHRhc2sgOiBUYXNrKSA6IHZvaWRcclxuICB7XHJcbiAgICB2YXIgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKTtcclxuXHJcbiAgICBsZXQgIGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICAvLyBmaW5kIGlmIE1HX0FDVF9UQVNLX1NVRkZJWCBoYW5kbGVyIGV4aXN0cz9cclxuICAgIHZhciBldnRIYW5Qb3MgPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGV2dEhhblBvcy5pbml0KHJ0RXZ0KTtcclxuICAgIGhhbmRsZXIgPSBldnRIYW5Qb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgIGlmIChoYW5kbGVyICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAobGV0ICBpID0gMDsgaSA8IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0U2l6ZSgpOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgb3BlciA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0T3BlcmF0aW9uKGkpO1xyXG4gICAgICAgIG9wZXIuc2V0RXhlY09uU2VydmVyKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFzay5oYXNTdWJUYXNrcygpKSAgIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrLkdldFN1YlRhc2tzKCkubGVuZ3RoOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgc3ViVGFzazogVGFzayA9IDxUYXNrPnRhc2suU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHN1YlRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3MoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBDaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3MgKHRhc2s6IFRhc2ssIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZSA8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gZmFsc2U7XHJcbiAgICB2YXIgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuXHJcbiAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIC8vIGZpbmQgaWYgTUdfQUNUX1RBU0tfU1VGRklYIC8gTUdfQUNUX1JFQ19TVUZGSVggaGFuZGxlciBleGlzdHM/XHJcbiAgICB2YXIgZXZ0SGFuUG9zID0gbmV3IEV2ZW50SGFuZGxlclBvc2l0aW9uKCk7XHJcbiAgICBldnRIYW5Qb3MuaW5pdChydEV2dCk7XHJcbiAgICBoYW5kbGVyID0gZXZ0SGFuUG9zLmdldE5leHQoKTtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKSB7XHJcbiAgICAgIGxldCBjdXJyUmVjb3JkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIGlmICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLm1vZGlmaWVkUmVjb3Jkc051bWJlcigpID4gMCB8fCAoY3VyclJlY29yZCAhPSBudWxsICYmIGN1cnJSZWNvcmQuTW9kaWZpZWQpKVxyXG4gICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghY2xpZW50T3BlcmF0aW9uRXhpc3QpIHtcclxuICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAvLyBmb3Igbm9uIGludGVyYWN0aXZlLCBjcmVhdGUgbW9kZSB0YXNrLiAgZm9yY2UgcmVjb3JkIHN1ZmZpeCBpcyBjYW5jZWxsZWRcclxuXHJcbiAgICAgICAgaWYgKGZvcmNlU3VmZml4ID09PSB0cnVlKVxyXG4gICAgICAgIGlmICh0YXNrLklzSW50ZXJhY3RpdmUgfHwgIHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFuZGxlciAhPSBudWxsICYmICFjbGllbnRPcGVyYXRpb25FeGlzdCkge1xyXG4gICAgICAgIGxldCBjbnQgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbnQ7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG9wZXIgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldE9wZXJhdGlvbihpKTtcclxuICAgICAgICAgIGlmIChvcGVyLmdldEV4ZWNPbkNsaWVudCgpKSB7XHJcbiAgICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG9wZXIuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfUkFJU0VfRVZFTlQpe1xyXG4gICAgICAgICAgICAgIGlmIChvcGVyLkdldFJ1bnRpbWVFdmVudCgpLmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmXHJcbiAgICAgICAgICAgICAgb3Blci5HZXRSdW50aW1lRXZlbnQoKS5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVykge1xyXG4gICAgICAgICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWNsaWVudE9wZXJhdGlvbkV4aXN0ICYmIHRhc2suaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAoIWNsaWVudE9wZXJhdGlvbkV4aXN0ICYmIGkgPCB0YXNrLmdldFN1YlRhc2tzKCkuZ2V0U2l6ZSgpKTsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgc3ViVGFzayA9IDxUYXNrPnRhc2suU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gYXdhaXQgdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3Moc3ViVGFzaywgZXZlbnRDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBjbGllbnRPcGVyYXRpb25FeGlzdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnModGFzayA6IFRhc2spOiBib29sZWFuXHJcbiAge1xyXG4gICAgbGV0IHBlbmRpbmdUcmFuc2FjdGlvbnMgPSBmYWxzZTtcclxuICAgIGxldCBjdXJyUmVjb3JkID0gICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpXHJcbiAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0cnVlO1xyXG5cclxuICAgIGlmICghcGVuZGluZ1RyYW5zYWN0aW9ucyAmJiB0YXNrLmhhc1N1YlRhc2tzKCkpXHJcbiAgICB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyAoIXBlbmRpbmdUcmFuc2FjdGlvbnMgJiYgaSA8IHRhc2suZ2V0U3ViVGFza3MoKS5nZXRTaXplKCkpOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgc3ViVGFzayA9IDxUYXNrPnRhc2suU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdGhpcy5DaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyhzdWJUYXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwZW5kaW5nVHJhbnNhY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25seURlc2NzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWNjZWVkZWRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSGFuZGxlVHJhbnNhY3Rpb25JbmZvKCk6IHZvaWQge1xyXG4gICAgLy8gd2hpbGUgcmVtb3RlIHRhc2sgd2l0aG91dCBsb2NhbCBkYXRhLCBoYXMgc3ViZm9ybSB0aGF0IGhhcyBsb2NhbCBkYXRhIDogUmVtb3RlIHRyYW5zYWN0aW9uIGlzIHNldCBvbiB0aGUgcGFyZW50IHRhc2sgYW5kIGxvY2FsIFRyYW5zYWN0aW9uIGlzIHNldCBvbiBzdWJmb3JtLlxyXG4gICAgLy8gVGhlIG1lbWJlciB0YXNrLlRyYW5zYWN0aW9uIGlzIGdldCB0aGUgRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb25cclxuICAgIC8vIGZvciBzdWJmb3JtIDogIHRoZSBDdXJyZW50RGF0YXZpZXdNYW5hZ2VyIGlzIHRoZSBsb2NhbERhdGF2aWV3IHNvIHRoZSB0cmFuc2FjdGlvbiBpcyB0aGUgbG9jYWwgdHJhbnNhY3Rpb24gdGhhdCB0aGUgc3ViZm9ybSBpcyB0aGUgb3duZXIgYnV0IG5vdCB0aGUgb3duZXIgb2YgdGhlIHJlbW90ZSB0cmFuc2FjdGlvblxyXG4gICAgLy8gVGhlIG1ldGhvZCBzZXRUcmFuc0NsZWFyZWQoKSBuZWVkIHRvIGJlIGNhbGxlZCBvbmx5IGZvciByZW1vdGUgdHJhbnNhY3Rpb24gdGhhdCBpcyB0aGUgb3duZXIgdGFzayAuIChfdHJhbnNDbGVhcmVkIGlzIHNlbmQgdG8gdGhlIHNlcnZlciApXHJcblxyXG4gICAgLy8gY2hlY2sgdGhlIHJlbW90ZSB0cmFuc2FjdGlvblxyXG4gICAgbGV0IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbjtcclxuICAgIGlmICh0cmFuc2FjdGlvbiAhPT0gbnVsbCAmJiB0cmFuc2FjdGlvbi5pc093bmVyKHRoaXMpICYmIHRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09ICdQJykge1xyXG4gICAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSBudWxsO1xyXG4gICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldFRyYW5zQ2xlYXJlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGV4aXQgY29tbWFuZCwgYWRkcyBpdCB0byBjb21tYW5kcyBmb3IgZXhlY3V0aW9uIGFuZCBleGVjdXRlIGl0IGlmIGl0J3MgbmVlZGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXZlcnNpYmxlRXhpdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybURlc3RpbmF0aW9uXCI+PC9wYXJhbT5cclxuICBhc3luYyBFeGl0KHJldmVyc2libGVFeGl0OiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb246IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHJlY29yZCBzdWZmaXggd2FzIHN1Y2Nlc3NmdWwgYW5kIHRoaXMgdGFzayBpcyBub3QgYSBzdWIgZm9ybVxyXG4gICAgLy8gdGhlbiBlbmQgdGhlIHRhc2sgYXQgdGhlIHNlcnZlciBzaWRlXHJcblxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSByZXZlcnNpYmxlRXhpdCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ2xpZW50Q29tbWFuZD5Db21tYW5kRmFjdG9yeS5DcmVhdGVCcm93c2VyRXNjRXZlbnRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtRGVzdGluYXRpb24pIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDbGllbnRDb21tYW5kPkNvbW1hbmRGYWN0b3J5LkNyZWF0ZU5vblJldmVyc2libGVFeGl0Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybURlc3RpbmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLl9tZ0RhdGEuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgaWYgKCFzdWJmb3JtRGVzdGluYXRpb24pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBCcm93ZXJFc2NDb21tYW5kIGltbWVkaWF0ZWx5IG9ubHkgaWZcclxuICAgICAgICAvLyAxLiBJZiB3ZSBhcmUgdHJ5aW5nIHRvIGNsb3NlIHRoZSBicm93c2VyIGFuZCB0aGUgdG9wbW9zdCB0YXNrIGlzIGNsb3NpbmdcclxuICAgICAgICAvLyAyLiBJZiB1c2VyIGV4cGxpY2l0bHkgY2xvc2VzIHRoZSBjdXJyZW50IHRhc2sgKGxpa2UgY2xvc2luZyBvdmVybGF5KVxyXG4gICAgICAgIC8vIEZvciBhbGwgb3RoZXIgRXhpdCgpIGNvbW1hbmRzLCBqdXN0IGFkZCB0aGUgQnJvd3NlckVzY0NvbW1hbmQgdG8gQ21kc1RvU2VydmVyLlxyXG4gICAgICAgIGlmKHRoaXMuZ2V0VGFza1RhZygpID09IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkgfHxcclxuICAgICAgICAgICAhKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5JbkVuZFRhc2sgJiYgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkNsb3NpbmdGb3JtVUkpKVxyXG4gICAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIGNsb3Npbmcgb2YgTWFpbiBQcm9ncmFtIGRpZG4ndCBzdWNjZWVkIG9uIHNlcnZlciwgY2xvc2UgaXQgaGVyZSAtLS0gb2Zjb3Vyc2UgaXRcclxuICAgICAgICAvLyBpbmNsdWRlcyB0aGUgZXhlY3V0aW9uIG9mIFRTIGFzIHdlbGwuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZ0RhdGEuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBmaW5hbGx5IG9wZXJhdGlvbiBvZiBlbmRUYXNrIGZ1bmN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1Y2NlZWRlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXZlcnNpYmxlRXhpdFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkOiBib29sZWFuLCByZXZlcnNpYmxlRXhpdDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgc3ViVGFzay5oYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQsIHJldmVyc2libGVFeGl0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuSW5FbmRUYXNrID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHN1Y2NlZWRlZClcclxuICAgICAgdGhpcy5faXNTdGFydGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCFzdWNjZWVkZWQgJiYgcmV2ZXJzaWJsZUV4aXQgJiYgdGhpcy5Jc1RyeWluZ1RvU3RvcClcclxuICAgICAgdGhpcy5zZXRUcnlpbmdUb1N0b3AoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJlY3Vyc2l2ZSBmdW5jdGlvbiBmb3IgVGFzayBQcmVmaXggZXhlY3V0aW9uIGZvciBhbGwgc3ViZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgaGFuZGxlVGFza1N1ZmZpeCh3aXRoU3ViVGFza3M6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcblxyXG4gICAgaWYgKHdpdGhTdWJUYXNrcykge1xyXG4gICAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpICYmIHN1Y2NlZWRlZDsgaSsrKSB7XHJcbiAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgc3VjY2VlZGVkID0gYXdhaXQgc3ViVGFzay5oYW5kbGVUYXNrU3VmZml4KHdpdGhTdWJUYXNrcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1Y2NlZWRlZClcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcbiAgICBzdWNjZWVkZWQgPSAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIHRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBpZiB0aGUgdGFzayBpbnRvIGNyZWF0ZSBsaW5lIHByb2Nlc3Npbmcgb3Igbm90XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJbkNyZWF0ZUxpbmUoaW5DcmVhdGVMaW5lOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbkNyZWF0ZUxpbmUgPSBpbkNyZWF0ZUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGlmIHRoZSB0YXNrIGlzIGludG8gQ3JlYXRlIGxpbmUgcHJvY2Vzc2luZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SW5DcmVhdGVMaW5lKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luQ3JlYXRlTGluZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIGFuIGludGVybmFsIGV2ZW50IG9uIHRoaXMgdGFza3Mgc2xhdmUgdGFza3MuIFNsYXZlIHRhc2tzIGFyZTogKDEpIElmIHRoaXMgdGFzayBpcyBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gICBvd25lciAtIGFsbCB0YXNrcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSB0cmFuc2FjdGlvbnMgYXJlIGl0cyBzbGF2ZXMuICgyKSBJZiB0aGlzIHRhc2sgaXMgbm90IGFuIG93bmVyIC1cclxuICAvLy8gICBhbGwgaXRzIHN1YmZvcm1zIGFyZSBjb25zaWRlcmVkIHNsYXZlcy4gaWYgb25lIG9mIHRoZSBzdWIgdGFza3MgZmFpbGVkIGhhbmRsaW5nIHRoZSBldmVudCB0aGVuIGFcclxuICAvLy8gICByZWZlcmVuY2UgdG8gdGhhdCB0YXNrIGlzIHJldHVybmVkIG90aGVyd2lzZSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgbnVsbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRlcm5hbEV2dENvZGVcIj50aGUgY29kZSBvZiB0aGUgaW50ZXJuYWwgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhpbnRlcm5hbEV2dENvZGU6IG51bWJlcik6IFByb21pc2U8VGFzaz4ge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBmYWlsdXJlVGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuICAgIGxldCB0cmlnZ2VyZWRUYXNrczogTGlzdDxUYXNrQmFzZT4gPSBtZ2RUYWIuZ2V0VHJpZ2dlcmVkVGFza3ModGhpcyk7XHJcbiAgICBsZXQgb3JwaGFuczogTGlzdDxUYXNrPiA9IG51bGw7XHJcbiAgICBsZXQgc2FtZVRyYW5zOiBib29sZWFuO1xyXG4gICAgbGV0IGhhc1NsYXZlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGlzT3duZXI6IGJvb2xlYW4gPSB0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5pc093bmVyKHRoaXMpO1xyXG5cclxuICAgIC8vIGV2ZW50IG9uIHRyYW5zLW93bmVyIHNob3VsZCBiZSBwcm9wb2dhdGVkIHRvIGFsbCBvdGhlciB0YXNrcyBpbiB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbi5cclxuICAgIGlmIChpc093bmVyKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldEV2ZW50U2NvcGVUcmFucygpO1xyXG4gICAgICBvcnBoYW5zID0gbmV3IExpc3Q8VGFzaz4oKTtcclxuXHJcbiAgICAgIC8vIEluIGNhc2UgYSBjaGFuZ2Ugb2YgdHJhbnMtb3duZXJzaGlwIHByZXZpb3VzbHkgdG9vayBwbGFjZSwgdGhlcmUgbWlnaHQgYmUgdGFza3NcclxuICAgICAgLy8gd2hpY2ggYmVsb25nIHRvIHRoZSBjdXJyZW50IGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gYnV0IHRoZWlyIHBhcmVudCBpcyBnb25lLiBUaGVzZSBhcmUgb3JwaGFuIHRhc2tzXHJcbiAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHByb3BvZ2F0ZSB0aGUgZXZlbnQgdG8gdGhlbSB0b28uXHJcbiAgICAgIG1nZFRhYi5zdGFydFRhc2tzSXRlcmF0aW9uKCk7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrPm1nZFRhYi5nZXROZXh0VGFzaygpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgc2FtZVRyYW5zID0gdGFzay5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0YXNrLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKTtcclxuICAgICAgICBpZiAodGFzayAhPT0gdGhpcyAmJiBzYW1lVHJhbnMgJiYgdGFzay5QcmV2aW91c2x5QWN0aXZlVGFza0lkICE9IG51bGwgJiYgbWdkVGFiLkdldFRhc2tCeUlEKHRhc2suUHJldmlvdXNseUFjdGl2ZVRhc2tJZCkgPT0gbnVsbClcclxuICAgICAgICAgIG9ycGhhbnMucHVzaCh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBzY29wZVRyYW5zOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaXNFdmVudFNjb3BlVHJhbnMoKTtcclxuXHJcbiAgICAvLyBQcm9wYWdhdGUgdGhlIGV2ZW50IGFjY29yZGluZyB0byB0aGUgc2NvcGUsIG9uIGFsbCB0YXNrcyB0cmlnZ2VyZWQgYnkgbWVcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlnZ2VyZWRUYXNrcy5sZW5ndGggJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7IGkrKykge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dHJpZ2dlcmVkVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHNhbWVUcmFucyA9IHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0YXNrLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRhc2suVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpO1xyXG5cclxuICAgICAgaWYgKCF0YXNrLklzU3ViRm9ybSAmJiAoc2NvcGVUcmFucyAmJiBzYW1lVHJhbnMpICYmIHRhc2suaXNTdGFydGVkKCkpIHtcclxuICAgICAgICAvLyBRQ1IgNDM4NTMwIEd1YXJhbnRlZSB0aGF0IGJlZm9yZSBwcmVmaXggY29tcHV0ZSB3aWxsIGJlIGV4ZWN1dGVkXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpLkZvcm1SZWZyZXNoZWQgJiYgaW50ZXJuYWxFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKGZhbHNlKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgaW50ZXJuYWxFdnRDb2RlKTtcclxuICAgICAgICBoYXNTbGF2ZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvcGFnYXRlIHRoZSBldmVudCBvbiBvcnBoYW5zIHRvby5cclxuICAgIGZvciAoOyBpc093bmVyICYmIGkgPCBvcnBoYW5zLmxlbmd0aCAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTsgaSsrKSB7XHJcbiAgICAgIHRhc2sgPSBvcnBoYW5zLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgLy8gUUNSIDQzODUzMCBHdWFyYW50ZWUgdGhhdCBiZWZvcmUgcHJlZml4IGNvbXB1dGUgd2lsbCBiZSBleGVjdXRlZFxyXG4gICAgICBpZiAodGFzay5nZXRGb3JtKCkuRm9ybVJlZnJlc2hlZCAmJiBpbnRlcm5hbEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKGZhbHNlKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIGludGVybmFsRXZ0Q29kZSk7XHJcbiAgICAgIGhhc1NsYXZlcyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc1NsYXZlcyAmJiBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBmYWlsdXJlVGFzayA9IHRhc2s7XHJcblxyXG4gICAgaWYgKGlzT3duZXIpXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmNsZWFyRXZlbnRTY29wZSgpO1xyXG5cclxuICAgIHJldHVybiBmYWlsdXJlVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBhIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW5hYmxlUmVjb3JkQWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkYXRhdmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5EYXRhVmlldztcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG5cclxuICAgIGlmIChkYXRhdmlldy5JbmNsdWRlc0ZpcnN0KCkgfHwgZGF0YXZpZXcuSXNPbmVXYXlLZXkpIHtcclxuICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8IGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LklzT25lV2F5S2V5KVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8IChkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgPT09IDApIHx8IChkYXRhdmlldy5nZXRUb3BSZWNJZHgoKSA9PT0gMCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuSW5jbHVkZXNMYXN0KCkpIHtcclxuICAgICAgaWYgKCgodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpIHx8IGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8XHJcbiAgICAgICAgICAoKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSkgJiZcclxuICAgICAgICAgICAgKCFFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd0NyZWF0ZUluTW9kaWZ5TW9kZSh0aGlzLmdldENvbXBJZHgoKSkgfHxcclxuICAgICAgICAgICAgICAhYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkpKSAmJiAoZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpICsgMSkgPT09IGRhdGF2aWV3LmdldFNpemUoKSkge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCB0cnVlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCAoKGRhdGF2aWV3LmdldFNpemUoKSAtIGRhdGF2aWV3LmdldFRvcFJlY0lkeCgpKSA8PSB0aGlzLkZvcm0uZ2V0Um93c0luUGFnZSgpKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIGZhbHNlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTlRFUl9ST1dfRURJVElORywgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9fUFJPR19FWEVfUklHSFRTLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaXMgc3RhcnRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzU3RhcnRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBzdWIgdGFza3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFN1YlRhc2tzKCk6IFRhc2tzVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuU3ViVGFza3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgdGFza3MgcmVmcmVzaGVzIG9uIGEgY2hhbmdlIG9mIG9uZSBvZiBpdHMgcGFyZW50IGZpZWxkcyB3aXRoIHRoZSBnaXZlbiBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZFwiPnRoZSBpZCBvZiB0aGUgcGFyZW50IGZpZWxkPC9wYXJhbT5cclxuICByZWZyZXNoZXNPbihmbGRJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgIXJlc3VsdCAmJiB0aGlzLlJlZnJlc2hPblZhcnMgIT09IG51bGwgJiYgaSA8IHRoaXMuUmVmcmVzaE9uVmFycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZXN1bHQgPSAodGhpcy5SZWZyZXNoT25WYXJzW2ldID09PSBmbGRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciB0aGlzIHRhc2sgZnJvbSB0aGUgYWN0aXZlIHRyYW5zYWN0aW9ucyBhY2NvdW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEFib3J0VHJhbnNhY3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB2YWx1ZSBvZiBwcmV2ZW50UmVjb3JkU3VmZml4IHRvIHZhbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50cnVlIGlmIHdlIGFscmVhZHkgcGVyZm9ybWVkIHJlY29yZCBzdWZmaXg8L3BhcmFtPlxyXG4gIHNldFByZXZlbnRSZWNvcmRTdWZmaXgodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ZW50UmVjb3JkU3VmZml4ID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB2YWx1ZSBvZiBwcmV2ZW50UmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGdldFByZXZlbnRSZWNvcmRTdWZmaXgoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldmVudFJlY29yZFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIHNldFByZXZlbnRDb250cm9sQ2hhbmdlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldmVudENvbnRyb2xDaGFuZ2UgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2ZW50Q29udHJvbENoYW5nZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzaWduYWwgdGhlIHNlcnZlciBjbG9zZWQgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldEtub3duVG9TZXJ2ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9rbm93blRvU2VydmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZHZQb3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiLVwiPmV2YWx1YXRlcyB0aGUgZGVyY3JpcHRvciBhbmQgcmV0dXJuIHRoZSBub24taGF2ZSBkdlBvcyB2YWx1ZTwvcGFyYW0+XHJcbiAgZXZhbHVhdGVEZXNjcmlwdG9yKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHJlczogTlVNX1RZUEU7XHJcbiAgICBpZiAodGhpcy5EdlBvc0Rlc2NyaXB0b3IgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIEhhc2hVdGlscy5HZXRIYXNoQ29kZShyZXN1bHQpO1xyXG5cclxuICAgIGxldCBmaXJzdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gZ28gb3ZlciB0aGUgbGlzdCBvZiB0aGUgZGVzY3JpcHRvclxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuRHZQb3NEZXNjcmlwdG9yLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghZmlyc3QpXHJcbiAgICAgICAgcmVzdWx0ICs9IFwiO1wiO1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRDZWxsOiBzdHJpbmdbXSA9IHRoaXMuRHZQb3NEZXNjcmlwdG9yLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgLy8gcGFyc2UgdGhlIGN1cnJlbnQgdGFzayBhbmQgZmllbGQgbnVtYmVyXHJcbiAgICAgIGxldCBjdXJyZW50VGFnOiBzdHJpbmcgPSBjdXJyZW50Q2VsbFswXTtcclxuICAgICAgbGV0IGN1cnJlbnRWZWVJZHg6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VycmVudENlbGxbMV0pO1xyXG4gICAgICBsZXQgY3VycmVudFRhc2sgPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0VGFza0J5SUQoY3VycmVudFRhZyk7XHJcbiAgICAgIGxldCBjdXJyZW50RmllbGQgPSA8RmllbGQ+Y3VycmVudFRhc2suRGF0YVZpZXcuZ2V0RmllbGQoY3VycmVudFZlZUlkeCk7XHJcbiAgICAgIGxldCBkaXNwVmFsOiBzdHJpbmcgPSBjdXJyZW50RmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcblxyXG4gICAgICAvLyBRQ1IgOTc4NTY2XHJcbiAgICAgIGlmIChjdXJyZW50RmllbGQuaXNOdWxsKCkpXHJcbiAgICAgICAgZGlzcFZhbCA9IFwiXCI7XHJcblxyXG4gICAgICAvLyBRQ1IgNzQzMjkwXHJcbiAgICAgIGxldCBwaWM6IFBJQztcclxuICAgICAgc3dpdGNoIChjdXJyZW50RmllbGQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgLy8gYm9vbGVhbiBpcyBzdG9yZWQgYXMgXCJvXCIgb3IgXCIxXCIgc28gd2UganVzdCBhZGQgdGhlbSBhcyB3ZVxyXG4gICAgICAgIC8vIGRvIGluIHRoZSBzZXJ2ZXJcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgcmVzdWx0ICs9IGRpc3BWYWw7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAvLyBRQ1IgNzQyOTY2IGRhdGUgYW5kIHRpbWUgc3BlY2lhbCB0cmVhdG1lbnRcclxuICAgICAgICAgIGlmIChkaXNwVmFsICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHBpYyA9IG5ldyBQSUMoY3VycmVudEZpZWxkLmdldFBpY3R1cmUoKSwgY3VycmVudEZpZWxkLmdldFR5cGUoKSwgMCk7XHJcbiAgICAgICAgICAgIGxldCBjb252OiBEaXNwbGF5Q29udmVydG9yID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IGNvbnYubWcyZGlzcChkaXNwVmFsLCBcIlwiLCBwaWMsIGZhbHNlLCB0aGlzLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgLy8gUUNSIDU0MzIwNCB3aGVuIHRoZXJlIGlzIGFuIGVtcHR5IHN0cmluZyAoYWxwaGEpYXBwZW5kIG5vdGhpbmdcclxuICAgICAgICAgIGlmIChkaXNwVmFsICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IG5ldyBOVU1fVFlQRShkaXNwVmFsKTtcclxuICAgICAgICAgICAgcGljID0gbmV3IFBJQyhjdXJyZW50RmllbGQuZ2V0UGljdHVyZSgpLCBjdXJyZW50RmllbGQuZ2V0VHlwZSgpLCAwKTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IHJlcy50b19hKHBpYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdG1wU3RyMjogc3RyaW5nID0gU3RyVXRpbC5zdHJpbmdUb0hleGFEdW1wKHJlc3VsdCwgNCk7XHJcblxyXG4gICAgcmV0dXJuIEhhc2hVdGlscy5HZXRIYXNoQ29kZSh0bXBTdHIyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZHMgdGhlIGR2UG9zIGRlc2NyaXB0b3IgdmVjdG9yIGVhY2ggb2YgdGhlIGR2UG9zRGVzY3JpcHRvciB2ZWN0b3IgZWxlbWVudHMgaXMgYSBTdHJpbmcgYXJyYXkgb2Ygc2l6ZVxyXG4gIC8vLyAgIDIgaW4gdGhlIGZpcnN0IGNlbGwgb2YgZWFjaCBhcnJheSB3ZSBoYXZlIHRoZSB0YWcgYW5kIGluIHRoZSBzZWNvbmQgd2UgaGF2ZSB0aGUgdmVlIGlpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGVzY3JpcHRvcihuZXdEZXNjOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghKG5ld0Rlc2MudHJpbSgpID09PSBcIlwiKSkge1xyXG4gICAgICBsZXQgZGVzYzogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKG5ld0Rlc2MsIFwiO1wiKTtcclxuICAgICAgdGhpcy5EdlBvc0Rlc2NyaXB0b3IgPSBuZXcgTGlzdDxzdHJpbmdbXT4oKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkZXNjLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGNlbGw6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMik7XHJcbiAgICAgICAgbGV0IHRhZ1ZlZVBhaXI6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShkZXNjW2ldLCBcIixcIik7XHJcbiAgICAgICAgY2VsbFswXSA9IHRhZ1ZlZVBhaXJbMF07XHJcbiAgICAgICAgY2VsbFsxXSA9IHRhZ1ZlZVBhaXJbMV07XHJcblxyXG4gICAgICAgIC8vIHB1dCB0aGUgY2VsbCB2YWx1ZSBpbnRvIHRoZSB2ZWN0b3JcclxuICAgICAgICB0aGlzLkR2UG9zRGVzY3JpcHRvci5wdXNoKGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2FjaGUgb2JqZWN0IG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFza0NhY2hlKCk6IER2Q2FjaGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R2Q2FjaGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJlcGFyZSBhbGwgc3ViLWZvcm0gdHJlZSdzIHRvIGVpdGhlciBnbyB0byBzZXJ2ZXIgKGFmdGVyIGRlbGV0aW5nIHJlbGV2YW50IGVudHJpZXMpIG9yIHRvIHRha2UgZC52IGZyb21cclxuICAvLy8gICBjYWNoZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIGFsbCBzdWJmb3JtIGNhbiBkbyBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgYmVjYXVzZSBvZiB1cGRhdGVzPC9yZXR1cm5zPlxyXG4gIGFzeW5jIHByZXBhcmVDYWNoZShpZ25vcmVDdXJyOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3VjY2VzczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gY2hlY2tpbmcgbXlzZWxmIGlmIGkgYW0gYSBzdWJmb3JtXHJcbiAgICBpZiAoIWlnbm9yZUN1cnIpIHtcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSkge1xyXG4gICAgICAgICAgLy8gaXMgdGhlIGN1cnJlbnQgdXBkYXRlIGRhdGF2aWV3IHdlcmUgcHJldmlvdXNseSB0YWtlbiBmcm9tIGNhY2hlXHJcbiAgICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gY2hlY2tzIHRoYXQgaSBhbSBhIHN1YiBmb3JtIGJ1dCBpIGFtIG5vdCBjYWNoZWRcclxuICAgICAgICBpZiAodGhpcy5Jc1N1YkZvcm0gJiYgISBhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgY3VycmV0VGFzazogVGFzaztcclxuXHJcbiAgICAvLyBjaGVjayBhbGwgbXkgc3ViIGZvcm1zXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIC8vIHRoaXMgbG9vcCBtdXN0IHJ1biB0byBpdHMgZW5kIHNvIGFsbCB1cGRhdGVkIGQudiB3aWxsIGJlIGRlbGV0ZWRcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBjdXJyZXRUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIC8vIGlmIG9uZSBvZiBteSBzdWItZm9ybXMgbmVlZHMgdG8gZ28gdG8gdGhlIHNlcnZlciAtIHNvIGRvIGlcclxuICAgICAgICBpZiAoISBhd2FpdCBjdXJyZXRUYXNrLnByZXBhcmVDYWNoZShmYWxzZSkpIHtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBpZiB3ZSBjYW4gdGFrZSB0aGUgZC52IG9mIHRoZSB0YXNrIGFuZCBhbGwgaGlzIHN1Yi1mb3JtcyBmcm9tIGNhY2hlIGlzIHdlIGNhbiAtIHRha2UgdGhlbSBhbmRcclxuICAvLy8gICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgY3VycmVudCBkLnYgb2YgZWFjaCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgYWxsIGQudidzIHdlcmUgZm91bmQgYW5kIHNldDwvcmV0dXJucz5cclxuICBhc3luYyB0ZXN0QW5kU2V0KGlnbm9yZUN1cnI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIGNoZWNrIGN1cnJlbnQgdGFza1xyXG4gICAgaWYgKCFpZ25vcmVDdXJyICYmIGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICBsZXQgcmVxdWVzdGVkRHY6IG51bWJlciA9IHRoaXMuZXZhbHVhdGVEZXNjcmlwdG9yKCk7XHJcblxyXG4gICAgICAvLyB0cnkgdG8gdGFrZSBmcm9tIGNhY2hlIG9ubHkgaWYgcmVxdWVzdGVkIGlzIG5vdCBjdXJyZW50XHJcbiAgICAgIGlmIChyZXF1ZXN0ZWREdiAhPT0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCkpIHtcclxuICAgICAgICBsZXQgZnJvbUNhY2hlOiBEYXRhVmlldyA9IHRoaXMuX2R2Q2FjaGUuZ2V0Q2FjaGVkRGF0YVZpZXcocmVxdWVzdGVkRHYpO1xyXG4gICAgICAgIGlmIChmcm9tQ2FjaGUgPT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUR2KGZyb21DYWNoZSk7ICAgICAvLyBjaGFuZ2VzIHRoZSBjdXJyZW50IGQudiB3aXRoIHRoZSBvbmUgdGFrZW4gZnJvbSBjYWNoZSBkbyBub3QgZm9yZ2V0IHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIGNhY2hlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFFDUiAjNDMwMDQ1LiBJbmRpY2F0ZSB0aGF0IFJQIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZ2V0IGZyb20gdGhlIGNhY2hlLlxyXG4gICAgICB0aGlzLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIHN1Yi1mb3JtcyB0YXNrc2RcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgLy8gdGhpcyBsb29wIGRvZXMgbm90IG5lZWQgdG8gcmVhY2ggaXRzIGVuZFxyXG4gICAgICAvLyB0aGUgbW9tZW50IG9uZSB0aGF0IG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBpcyBkaXNjb3ZlcmVkIGFsbCBuZWVkIHRvIGdvIGFsc29cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICAvLyBkb2VzIHRoZSBpLXRoIHNvbiBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKS50ZXN0QW5kU2V0KGZhbHNlKSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgZC52IHdpdGggb25lIHRha2VuIGZyb20gY2FjaGUgaW4gdGhpcyBtZXRob2Qgd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdXBkYXRlc1xyXG4gIC8vLyAgIG9mIHRoZSBjdXJyZW50IGRhdGF2aWV3IHNpbmNlIHRoZSBtZXRob2QgaXMgb25seSBjYWxsZWQgZnJvbSB0ZXN0QW5kU2V0IHRoYXQgaW4gdHVybiBpcyBvbmx5IHVzZWQgYWZ0ZXJcclxuICAvLy8gICBhIFN1Y2Nlc3NmdWwgcnVuIHByYXByZUNhY2hlIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBmb3IgdXBkYXRlcyBpbiB0aGUgY3VycmVudCBkYXRhdmlldyBvZlxyXG4gIC8vLyAgIGVhY2ggcmVsYXRlZCB0YXNrLiBob3dldmVyIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgd2UgY2hlY2sgaXQgYW55d2F5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZyb21DYWNoZVwiPnRoZSBuZXcgZC52PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNoYW5nZUR2KGZyb21DYWNoZTogRGF0YVZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkYXRhdmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5EYXRhVmlldztcclxuICAgIC8vIHRoZSBkYXRhIHZpZXcgd2UgcmVjZWl2ZSBpcyBDZXJ0YWlubHkgZnJvbSB0aGUgY2FjaGVcclxuXHJcbiAgICBpZiAoIXRoaXMuaGFzTG9jYXRlKSB7XHJcbiAgICAgIGlmICghZGF0YXZpZXcuZ2V0Q2hhbmdlZCgpICYmIGRhdGF2aWV3LkluY2x1ZGVzRmlyc3QoKSlcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoZGF0YXZpZXcucmVwbGljYXRlKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxvY2F0ZVB1dEluQ2FjaGUoKTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIGRhdGEgdmlldyBmcm9tIHRoZSBjYWNoZSBhcyB0aGUgY3VycmVudFxyXG4gICAgYXdhaXQgZGF0YXZpZXcuc2V0U2FtZUFzKGZyb21DYWNoZSk7XHJcbiAgICBkYXRhdmlldy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcblxyXG4gICAgdGhpcy5Gb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuXHJcbiAgICBhd2FpdCAoPE1nRm9ybT50aGlzLkZvcm0pLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcblxyXG4gICAgLy8gUUNSIDkyNDgwOTRcclxuICAgIHRoaXMuc2V0T3JpZ2luYWxUYXNrTW9kZSh0aGlzLmdldE1vZGUoKSk7XHJcbiAgfVxyXG5cclxuICBzZXRPcmlnaW5hbFRhc2tNb2RlKG9yaWdpbmFsVGFza01vZGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JpZ2luYWxUYXNrTW9kZSA9IG9yaWdpbmFsVGFza01vZGUuY2hhckF0KDApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgbW9kZSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRPcmlnaW5hbFRhc2tNb2RlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxUYXNrTW9kZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpcyBDYWNoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgc3ViIGZvcm0gY29udHJvbCB0aGlzIHRhc2sgQ29ycmVsYXRlcyB3aXRoIHRoaXMgbWV0aG9kXHJcbiAgLy8vICAgYWN0dWFsbHkgY29tYmluZXMgdHdvIHRlc3QgZmlyc3QgdGhhdCB0aGUgdGFzayBpcyBhIHN1YiBmb3JtIHNlY29uZCB0aGF0IHRoZSBzdWIgdGhhdCB0aGUgc3ViIGZvcm0gaGFzXHJcbiAgLy8vICAgdGhlIGlzIGNhY2hlZCBwcm9wZXJ0eSBzZXQgdG8geWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpc0NhY2hlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLklzU3ViRm9ybSAmJiBhd2FpdCAoPE1nQ29udHJvbEJhc2U+dGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCkpLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19DQUNIRUQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkb2VzIHRoZSBpbnNlcnQgaW4gY2FjaGUgbG9naWMgaW4gY2FzZSB0aGUgdGFzayBoYXMgbG9jYXRlIGV4cHJlc3Npb25zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGxvY2F0ZVB1dEluQ2FjaGUoKTogdm9pZCB7XHJcbiAgICBsZXQgY2FjaGVkOiBEYXRhVmlldyA9IHRoaXMuX2R2Q2FjaGUuZ2V0Q2FjaGVkRGF0YVZpZXcoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCkpO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgZGF0YSB2aWV3IGhhcyBiZWVuIGluc2VydGVkIHRvIHRoZSBjYWNoZSBiZWZvcmVcclxuICAgIGlmIChjYWNoZWQgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5jaGVja0ZpcnN0KGNhY2hlZC5nZXRMb2NhdGVGaXJzdFJlYygpKSAmJiAhKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpIHtcclxuICAgICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldExvY2F0ZUZpcnN0UmVjKGNhY2hlZC5nZXRMb2NhdGVGaXJzdFJlYygpKTtcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gcHV0IGl0IGluIHRoZSBjYWNoZSBpZiBpdCBpcyBub3QgdXBkYXRlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGhhc0xvY2F0ZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYXNMb2FjdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNMb2NhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgb3BlbnMgYSBuZXcgVHJhbnNhY3Rpb24gb3Igc2V0IHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgVHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0UmVtb3RlVHJhbnNhY3Rpb24odHJhbnNJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuICAgIGxldCB0cmFuc1Rhc2s6IFRhc2s7XHJcbiAgICBsZXQgaXNGaW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgbWdkVGFiLnN0YXJ0VGFza3NJdGVyYXRpb24oKTtcclxuICAgIHdoaWxlICgodHJhbnNUYXNrID0gPFRhc2s+bWdkVGFiLmdldE5leHRUYXNrKCkpICE9IG51bGwpIHtcclxuICAgICAgLy8gdHJhbnNhY3Rpb24gbWlnaHQgYmUgbnVsbCB3aGVuIHRhc2sgaXMgYWJvcnRpbmcgYnV0IG5vdCB5ZXQgdW5sb2FkZWQuXHJcbiAgICAgIGlmICh0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiAhPSBudWxsICYmXHJcbiAgICAgICAgdHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0cmFuc0lkKSB7XHJcbiAgICAgICAgaXNGaW5kID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IChpc0ZpbmQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24odGhpcywgdHJhbnNJZCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIG5ldyBUcmFuc2FjdGlvbiBPd25lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0VHJhbnNPd25lclRhc2soKTogdm9pZCB7XHJcbiAgICB0aGlzLlRyYW5zYWN0aW9uLnNldE93bmVyVGFzayh0aGlzKTtcclxuICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0VHJhbnNCZWdpbignVCcpLyonVCcqLztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBjb3VudGVyIGFjY29yZGluZyB0byB0aGUgdG9wbW9zdCB2YWx1ZSBpbiB0aGUgc3RhY2sgYW5kIHRoZSBzdGF0dXMgb2YgdGhlXHJcbiAgLy8vICAgXCJ1c2VMb29wU3RhY2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMb29wQ291bnRlcigpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcclxuICAgIGlmICh0aGlzLl91c2VMb29wU3RhY2sgJiYgdGhpcy5fbG9vcFN0YWNrICE9PSBudWxsICYmICEodGhpcy5fbG9vcFN0YWNrLmNvdW50KCkgPT09IDApKSB7XHJcbiAgICAgIHJlc3VsdCA9IDxudW1iZXI+dGhpcy5fbG9vcFN0YWNrLnBlZWsoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaGVzIHRoZSB2YWx1ZSAwIG9uIHRoZSB0b3Agb2YgdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGVudGVyTG9vcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9sb29wU3RhY2sgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuX2xvb3BTdGFjayA9IG5ldyBTdGFjaygpO1xyXG5cclxuICAgIHRoaXMuX2xvb3BTdGFjay5wdXNoKDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgdGhlIHRvcG1vc3QgZW50cnkgZnJvbSB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgbGVhdmVMb29wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wb3BMb29wQ291bnRlcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGNvdW50ZXIgZnJvbSB0aGUgc3RhY2sgYW5kIHJldHVybnMgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcExvb3BDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLl9sb29wU3RhY2sgIT09IG51bGwgJiYgISh0aGlzLl9sb29wU3RhY2suY291bnQoKSA9PT0gMCkpXHJcbiAgICAgIHJlc3VsdCA9IDxudW1iZXI+dGhpcy5fbG9vcFN0YWNrLnBvcCgpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5jcmVhc2VzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbmNyZWFzZUxvb3BDb3VudGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbG9vcFN0YWNrLnB1c2godGhpcy5wb3BMb29wQ291bnRlcigpICsgMSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExvb3BTdGFja1NpemUoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9sb29wU3RhY2sgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLl9sb29wU3RhY2suY291bnQoKTtcclxuXHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBcInVzZSBsb29wIHN0YWNrXCIgdmFyaWFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSB0byBzZXQ8L3BhcmFtPlxyXG4gIHNldFVzZUxvb3BTdGFjayh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3VzZUxvb3BTdGFjayA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGxpbmtzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREYXRhdmlld0hlYWRlcnMoKTogRGF0YXZpZXdIZWFkZXJzIHtcclxuICAgIHJldHVybiB0aGlzLkRhdGF2aWV3SGVhZGVyc1RhYmxlO1xyXG4gIH1cclxuXHJcbiAgaXNGaXJzdFJlY29yZEN5Y2xlKFZhbHVlXz86IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNGaXJzdFJlY29yZEN5Y2xlXzAoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmlzRmlyc3RSZWNvcmRDeWNsZV8xKFZhbHVlXyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRmlyc3RSZWNvcmRDeWNsZV8wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0UmVjb3JkQ3ljbGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRmlyc3RSZWNvcmRDeWNsZV8xKFZhbHVlXzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZmlyc3RSZWNvcmRDeWNsZSA9IFZhbHVlXztcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgaW50ZXJuYWwgbmFtZTwvc3VtbWFyeT5cclxuICBnZXRQdWJsaWNOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5QdWJsaWNOYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSBBbGxvd0V2ZW50czwvc3VtbWFyeT5cclxuICBhc3luYyBpc0FsbG93RXZlbnRzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19FVkVOVFMpO1xyXG4gICAgcmV0dXJuIGF3YWl0IHByb3AuZ2V0VmFsdWVCb29sZWFuKCk7XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIHRhc2sgaWQ8L3N1bW1hcnk+XHJcbiAgZ2V0RXh0ZXJuYWxUYXNrSWQoKTogc3RyaW5nIHtcclxuICAgIGxldCB0YXNrSWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19JRCk7XHJcblxyXG4gICAgaWYgKHByb3AgIT0gbnVsbClcclxuICAgICAgdGFza0lkID0gcHJvcC5HZXRDb21wdXRlZFZhbHVlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRhc2tJZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBUUlVFIGlmIHRoaXMgdGFzayBvd25zIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNUcmFuc2FjdGlvbk93bmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVHJhbnNPd25lcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5pc093bmVyKHRoaXMpKVxyXG4gICAgICBpc1RyYW5zT3duZXIgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiBpc1RyYW5zT3duZXI7XHJcbiAgfVxyXG5cclxuICBpc1RyYW5zYWN0aW9uT25MZXZlbChsZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zYWN0aW9uT3duZXIoKSAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09IGxldmVsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB3aGV0aGVyIHRoZSB0YXNrIGlzIHRoZSBQcm9ncmFtIChpLmUuIG5vdCBhIHN1YnRhc2spXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1Byb2dyYW0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNQcmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW5hYmxlLWRpc2FibGUgYWN0aW9ucyBmb3IgdGFzayBtb2Rlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW5hYmxlTW9kZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZW5hYmxlOiBib29sZWFuID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19NT0RJRlksIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUsIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUVVFUlksIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1FVRVJZLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JBTkdFLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19SQU5HRSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEUsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0xPQ0FURSwgZW5hYmxlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19TRUFSQ0gsIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TT1JUX1JFQ09SRFMsIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0lOREVYLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZJRVdfQllfS0VZLCBlbmFibGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBoYXNab29tSGFuZGxlciB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFbmFibGVab29tSGFuZGxlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VuYWJsZVpvb21IYW5kbGVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHJldHVybnM+IHRoZSBoYXNab29tSGFuZGxlclxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlWm9vbUhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IGlzIHRoZSB0YXNrIGlzIGEgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrPC9yZXR1cm5zPlxyXG4gIGlzRGVzdGluYXRpb25TdWJmb3JtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RpbmF0aW9uU3ViZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZm9yIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXN0aW5hdGlvblN1YmZvcm1cIj48L3BhcmFtPlxyXG4gIHNldERlc3RpbmF0aW9uU3ViZm9ybShkZXN0aW5hdGlvblN1YmZvcm06IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3RpbmF0aW9uU3ViZm9ybSA9IGRlc3RpbmF0aW9uU3ViZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaXMgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2s8L3JldHVybnM+XHJcbiAgZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNEZXN0aW5hdGlvbkNhbGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGZvciBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNEZXN0aW5hdGlvbkNhbGxcIj48L3BhcmFtPlxyXG4gIHNldElzRGVzdGluYXRpb25DYWxsKGlzRGVzdGluYXRpb25DYWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pc0Rlc3RpbmF0aW9uQ2FsbCA9IGlzRGVzdGluYXRpb25DYWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgc2V0Q2FuY2VsV2FzUmFpc2VkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FuY2VsV2FzUmFpc2VkID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgY2FuY2VsV2FzUmFpc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhbmNlbFdhc1JhaXNlZDtcclxuICB9XHJcblxyXG4gIGVuYWJsZUNyZWF0ZUFjdHModmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FLCB2YWwpO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkUsICAodGhpcy5nZXRGb3JtKCkuSGFzVGFibGUoKSApID8gdmFsIDogZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgZW5hYmxlL2Rpc2FibGUgc3RhdHVzIG9mIGNyZWF0ZSBhbmQgZGVsZXRlIGFjdGlvbnNcclxuICAvLy8gPC9zdW1tYXJ5XHJcbiAgYXN5bmMgc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCEodGhpcy5EYXRhVmlldykuaXNFbXB0eURhdGF2aWV3KCkgJiYgYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfREVMRVRFLCB0cnVlKSAmJlxyXG4gICAgICB0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiYgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5IYXNNYWluVGFibGUpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIHRydWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxMSU5FLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKChhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSAmJlxyXG4gICAgICAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5IYXNNYWluVGFibGUgJiZcclxuICAgICAgICAodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZICYmIEVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93Q3JlYXRlSW5Nb2RpZnlNb2RlKHRoaXMuZ2V0Q29tcElkeCgpKSkgfHxcclxuICAgICAgICAodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSkpXHJcbiAgICAgIHRoaXMuZW5hYmxlQ3JlYXRlQWN0cyh0cnVlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5lbmFibGVDcmVhdGVBY3RzKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW1wdHlEYXRhdmlld1wiPnRoZSBlbXB0eURhdGF2aWV3IHRvIHNldCA8L3BhcmFtPlxyXG4gIHNldEVtcHR5RGF0YXZpZXcoZW1wdHlEYXRhdmlldzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhVmlldy5zZXRFbXB0eURhdGF2aWV3KGVtcHR5RGF0YXZpZXcpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiA8L3JldHVybnM+XHJcbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHdoZW4gdGFzayBzdGFydHMgaXRzIGV4ZWN1dGlvbiBpbiBFbXB0eSBEYXRhdmlldyBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbXB0eURhdGF2aWV3T3BlbihzdWJmb3JtUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gdG8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSykge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVywgdHJ1ZSk7XHJcbiAgICAgIC8vIGlmIHRoZSB0YXNrIGlzIGEgc3ViZm9ybSBhbmQgc3ViZm9ybSByZWZyZXNoIGlzIGRvbmUsIHNvIGV4ZWN1dGUgdGhlIGVtcHR5IGRhdGF0dmlldyBoYW5kbGVyLFxyXG4gICAgICAvLyBpZiB0aGUgdGFzayBpcyBub3QgYSBzdWJmb3JtLCBwdXQgdGhlIGVtcHR5IGRhdGF2aWV3IGV2ZW50IG9uIHRoZSBxdWV1ZVxyXG4gICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgcnRFdm50ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICBpZiAoKHJ0RXZudCAhPSBudWxsICYmIHJ0RXZudC5nZXRJbnRlcm5hbENvZGUoKSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKSB8fCBzdWJmb3JtUmVmcmVzaClcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGhpcyk7XHJcbiAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcpO1xyXG4gICAgICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZEludGVybmFsRXZlbnRXaXRoSXRhc2tBbmRDb2RlKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVyk7XHJcblxyXG4gICAgICB0aGlzLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcblxyXG4gICAgICAvLyBmb3Igc3ViZm9ybSBtb2RlICdBc1BhcmVudCcuIElmIHRoZSBwYXJlbnQgdGFzayB0aGF0IGluICdFbXB0eSBEYXRhdmlldycgc3RhdGUgY2hhbmdlcyBpdHMgbW9kZVxyXG4gICAgICAvLyB0aGUgc3ViZm9ybSBhbHNvIG11c3QgY2hhbmdlIG1vZGUuXHJcbiAgICAgIC8vIFFDUiAjMjgxODYyLiBJZiB0aGUgc3ViZm9ybSB0YXNrIGlzIG9wZW5lZCBpbiB0aGUgZmlyc3QgdGltZSBkbyBub3QgcmVmcmVzaCBpdCdzIHN1YmZvcm1zLFxyXG4gICAgICAvLyBiZWNhdXNlIHRoZXkndmUgcmVjZWl2ZWQgdGhlaXIgZGF0YXZpZXdzIGFscmVhZHkuXHJcbiAgICAgIC8vIFdlIG11c3QgcmVmcmVzaCB0aGVtIHdoZW4gdGhlIHN1YmZvcm0gdGFzayBwYXNzZXMgdG8gZW1wdHkgRFYuXHJcbiAgICAgIGlmICh0aGlzLlN1YmZvcm1FeGVjTW9kZSAhPT0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUUgJiYgc3ViZm9ybVJlZnJlc2ggJiYgYXdhaXQgdGhpcy5DaGVja1JlZnJlc2hTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgYXdhaXQgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5jb21wdXRlU3ViRm9ybXMoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVJlY29yZEFjdGlvbnMoKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQsIGZhbHNlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4sIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHdoZW4gdGFzayBlbmRzIGl0cyBleGVjdXRpb24gaW4gRW1wdHkgRGF0YXZpZXcgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZW1wdHlEYXRhdmlld0Nsb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcsIGZhbHNlKTtcclxuICAgIHRoaXMuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIGFzeW5jIFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrOiBUYXNrQmFzZSwgZXhwbGljaXRTdWJmb3JtUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgbGV0IGlzSW5zaWRlOiBib29sZWFuID0gYXdhaXQgKDxUYXNrPnN1YmZvcm1UYXNrKS5FeGVjdXRlTmVzdGVkUlMoY3VyclRhc2spO1xyXG5cclxuICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSICM0MzQ0NjcuIEV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgc3ViZm9ybSBpZiBpdCdzIHRoZSBjdXJyZW50IChsYXN0IGZvY3VzZWQpIHRhc2suXHJcbiAgICBpZiAoc3ViZm9ybVRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgsIHRydWUpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlzSW5zaWRlID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIERlZmVjdCA3NzQ4My4gRG8gbm90IGNvbnRpbnVlIGlmIHRoZSByZWNvcmQgc3VmZml4IGV4ZWN1dGlvbiBpcyBmYWlsZWQuXHJcbiAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjcmVhdGUgY29tbWFuZCBmb3IgdGhlIHNlcnZlclxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTdWJmb3JtUmVmcmVzaENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSwgZXhwbGljaXRTdWJmb3JtUmVmcmVzaCk7XHJcbiAgICBhd2FpdCBzdWJmb3JtVGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG4gICAgaWYgKHN1YmZvcm1UYXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChleHBsaWNpdFN1YmZvcm1SZWZyZXNoKSB7XHJcbiAgICAgIC8vIFFDUiAjNDI5MTEyLiBQdXNoIGV4ZWN1dGlvbiBzdGFjayBiZWZvcmUgUlAgZXhlY3V0aW9uLlxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgLy8gRGVmZWN0ICM3NzA0OS4gRG8gbm90IGV4ZWN1dGUgcGFyZW50IFJQLiBXZSBuZWVkIGl0IG9ubHkgd2hlbiBjbGljayBvbiBzdWJmb3Jtd2FzIGRvbmUuXHJcbiAgICAgIGxldCBwZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4T3JnOiBib29sZWFuID0gKDxUYXNrPnN1YmZvcm1UYXNrKS5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4O1xyXG4gICAgICAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXggPSBmYWxzZTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0cnVlKTtcclxuICAgICAgKDxUYXNrPnN1YmZvcm1UYXNrKS5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gcGVyZm9ybVBhcmVudFJlY29yZFByZWZpeE9yZztcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgU3ViZm9ybVJlZnJlc2ggZXZlbnQgdG8gaXRzZWxmIHNvIHRoZSBjdXJzb3IgbXVzdCBiZSBvbiB0aGUgZmlyc3QgY29udHJvbCBvZiB0aGUgY3VycmVudCByZWNvcmRcclxuICAgIC8vIGFzIGZvciBWaWV3UmVmcmVzaCBldmVudC5cclxuICAgIGlmIChpc0luc2lkZSkge1xyXG4gICAgICAvLyBEZWZlY3QgMTE1NzkzLiBjdXJyVGFzayBjYW4ndCBiZSBudWxsLlxyXG4gICAgICAvLyBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXN1YmZvcm1UYXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkgJiYgY3VyclRhc2sgIT0gbnVsbClcclxuICAgICAgLy8gICBjdXJyVGFzay5tb3ZlVG9GaXJzdEN0cmwoZmFsc2UpO1xyXG4gICAgICAvLyBUT0RPOiBUYWJiaW5nICYgRm9jdXNpbmc6IEhhbmRsZSB0aGlzIHNpdHVhdGlvblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGlmIChleHBsaWNpdFN1YmZvcm1SZWZyZXNoKSB7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIGlmIChjdXJyVGFzayAhPSBudWxsKVxyXG4gICAgICAgICAgICAoPERhdGFWaWV3PmN1cnJUYXNrLkRhdGFWaWV3KS5zZXRQcmV2Q3VyclJlYygpO1xyXG4gICAgICAgICAgc3ViZm9ybVRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEV4ZWN1dGVzIFJlY29yZCBTdWZmaXhlcyBvZiBhbGwgbmVzdGVkIHN1YmZvcm1zIGZyb20gYm90dG9tIHRvIHRvcC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1UYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBFeGVjdXRlTmVzdGVkUlMobGFzdFRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBpc0V4ZWN1dGVOZXN0ZWRSUzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFFDUiAjMTY4MzQyLiBBIG5ldyB0YXNrIGlzIHNldCBhcyBmb2N1c2VkIHRhc2sgYWZ0ZXIgdGhlIGZpcnN0IENQLlxyXG4gICAgLy8gU28gaWYgaW4gQ1AgVXBkYXRlIG9wZXJhdGlvbiBpcyBleGVjdXRlZCBjdXJyVGFzayBpcyBudWxsLiBCdXQgd2UgbXVzdCByZWZyZXNoIHRoZSBzdWJmb3JtLlxyXG4gICAgaWYgKGxhc3RUYXNrID09IG51bGwpXHJcbiAgICAgIHJldHVybiBpc0V4ZWN1dGVOZXN0ZWRSUztcclxuXHJcbiAgICAvLyBEbyBub3QgZXhlY3V0ZSBzdWJmb3JtIHJlZnJlc2ggd2hlbiB0aGUgZm9jdXNlZCB0YXNrIGlzIG5vdCBvcGVuZWQgYXMgYSBzdWJmb3JtIChpdCB3YXMgb3BlbmVkIGZyb20gY2FsbCBvcGVyYXRpb24pLFxyXG4gICAgLy8gYnV0IHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgc3ViZm9ybSB0YXNrLiBTZWUgZm9yIGV4YW1wbGUgUUNSICM0MzE4NTAuXHJcbiAgICBpZiAodGhpcy5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLICYmIGxhc3RUYXNrLmdldE1nZElEKCkgIT09IHRoaXMuZ2V0TWdkSUQoKSlcclxuICAgICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG5cclxuICAgIGZvciAobGV0IHRhc2s6IFRhc2sgPSBsYXN0VGFzazsgdGFzayAhPT0gdGhpcyAmJiB0YXNrLnBhdGhDb250YWlucyh0aGlzKSAmJiB0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0s7IHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaXNFeGVjdXRlTmVzdGVkUlMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0V4ZWN1dGVOZXN0ZWRSUztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSBSZWMgc3VmZml4IGZvciBhbGwgbmVzdGVkIHN1YmZvcm1zIHVudGlsbCBzdWJmb3JtIHRhc2sgdGhhdCBjb250YWlucyB0aGVzZSAyIHN1YmZvcm1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1Rhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgZXhlY1N1YmZvcm1SZWNTdWZmaXgobmV3VGFzazogVGFzayk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICBsZXQgc3ViZlRhc2s6IFRhc2s7XHJcbiAgICBsZXQgaTogbnVtYmVyLCBpZHggPSAwO1xyXG4gICAgZm9yIChpID0gdGhpcy5fdGFza1BhdGgubGVuZ3RoOyBpID4gMDsgaS0tKSB7XHJcbiAgICAgIHN1YmZUYXNrID0gdGhpcy5fdGFza1BhdGguZ2V0X0l0ZW0oaSAtIDEpO1xyXG4gICAgICBpZiAoIW5ld1Rhc2suX3Rhc2tQYXRoLkNvbnRhaW5zKHN1YmZUYXNrKSkge1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIC8vIENoYW5nZSB0aGUgQ3JlYXRlIG1vZGUgdG8gTW9kaWZ5IGlmIHRoZSBjdXJyZW50IHJlY29yZCBpcyBub3QgYSBuZXcgcmVjb3JkLlxyXG4gICAgICAgIC8vIFNvIHRoZSBtb2RlIGlzIGNoYW5nZWQgb25seSBmb3IgdGhlIGZpcnN0IHJlY29yZCB0aGF0IHdhcyBub3QgY2hhbmdlZC5cclxuICAgICAgICBpZiAoc3ViZlRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhKCg8RGF0YVZpZXc+c3ViZlRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkuaXNOZXdSZWMoKSlcclxuICAgICAgICAgIHN1YmZUYXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlkeCA9IG5ld1Rhc2suX3Rhc2tQYXRoLmluZGV4T2Yoc3ViZlRhc2spO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoaSA+IDApO1xyXG4gICAgcmV0dXJuIGlkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGNvdW50ZXIgb2YgdGhlIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5jb3VudGVyPC9yZXR1cm5zPlxyXG4gIGdldENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb3VudGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluY3JlYXNlIHRoZSB0YXNrcyBjb3VudGVyIGJ5IDEuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+Y291bnRlcjwvcmV0dXJucz5cclxuICBpbmNyZWFzZUNvdW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb3VudGVyID0gdGhpcy5fY291bnRlciArIDE7XHJcbiAgfVxyXG5cclxuICBzZXRDb3VudGVyKGNudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb3VudGVyID0gY250O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgICEhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJTdGFydFByb2dMZXZlbCA9PT0gVGFzay5TdGFydFByb2dMZXZlbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ2hlY2sgaWYgcmVmZXJlbmNlIHRvIG1haW4gcHJvZ3JhbSBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmaWVsZFN0clwiPmEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgaXNNYWluUHJvZ3JhbUZpZWxkKGZpZWxkU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBGaWVsZDogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhmaWVsZFN0ciwgJywnKTtcclxuICAgIGxldCBtYWluUHJvZ0ZpZWxkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKEZpZWxkLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICBsZXQgcGFyZW50OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKEZpZWxkLmdldF9JdGVtKDApKTtcclxuICAgICAgaWYgKHBhcmVudCA9PT0gVGFza0Jhc2UuTUFJTl9QUkdfUEFSRU5UX0lEKVxyXG4gICAgICAgIG1haW5Qcm9nRmllbGQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluUHJvZ0ZpZWxkO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGFza0luZm8oKTogc3RyaW5nIHtcclxuICAgIC8vIEdldCB0aGUgdGFzayBuYW1lIHVzaW5nIHRoZSBnZXRQcm9wKCkgYXMgbmFtZSBpcyBvbmx5IHNlcmlhbGl6ZWQgZm9yIGRlYnVnXHJcbiAgICBsZXQgdGFza05hbWU6IHN0cmluZyA9ICh0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdCgnezB9IHsxfScsdGhpcy5pc1Byb2dyYW0oKSA/ICdQcm9ncmFtJzogJ1N1YnRhc2snLCB0YXNrTmFtZSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiKHRhc2sgezB9LVxcXCJ7MX1cXFwiezJ9KVwiLCB0aGlzLl90YXNrVGFnLCB0aGlzLk5hbWUsIHN1cGVyLmlzTWFpblByb2coKSA/IChcIiBjdGwgXCIgKyB0aGlzLl9jdGxJZHgpIDogXCJcIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBDb25zdHJ1Y3RNZ0Zvcm0oYWxyZWFkeVNldFBhcmVudEZvcm06IFJlZlBhcmFtPGJvb2xlYW4+KTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gbmV3IE1nRm9ybSgpO1xyXG4gICAgbGV0IHBhcmVudEZvcm06IE1nRm9ybUJhc2UgPSAodGhpcy5QYXJlbnRUYXNrICE9IG51bGwgPyB0aGlzLlBhcmVudFRhc2suZ2V0Rm9ybSgpIDogbnVsbCk7XHJcblxyXG4gICAgLy8gUGFyZW50Rm9ybSBvZiBhbnkgZm9ybSBzaG91bGQgYmUgYSB2aXNpYmxlIG9uZS4gSXQgbWlnaHQgaGFwcGVuIHRoYXQgdGhlIFBhcmVudFRhc2tcclxuICAgIC8vIGlzIGEgbm9uLWludGVyYWN0aXZlIHRhc2sgd2l0aCBPcGVuV2luZG93PU5vLiBJbiB0aGlzIGNhc2UsIHRoZSBQYXJlbnQgb2YgdGhlIG5vbi1pbnRlcmFjdGl2ZVxyXG4gICAgLy8gdGFzaywgc2hvdWxkIGJlIHRoZSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgZm9ybS5cclxuICAgIHdoaWxlIChwYXJlbnRGb3JtICE9IG51bGwgJiYgIXBhcmVudEZvcm0uZ2V0VGFzaygpLmlzT3BlbldpbigpKSB7XHJcbiAgICAgIHBhcmVudEZvcm0gPSBwYXJlbnRGb3JtLlBhcmVudEZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybS5QYXJlbnRGb3JtID0gcGFyZW50Rm9ybTtcclxuICAgIGFscmVhZHlTZXRQYXJlbnRGb3JtLnZhbHVlID0gdHJ1ZTtcclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG1nZGF0YSBJRCB0byB3aGljaCB0YXNrIGJlbG9uZ3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1nZElEKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWdEYXRhLkdldElkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJlZmVyZW5jZSB0byBjdXJyZW50IE1HRGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TUdEYXRhKCk6IE1HRGF0YSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWdEYXRhO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZWZyZXNoIHRoZSBkaXNwbGF5LCBwYWludCB0aGUgY29udHJvbHMgYW5kIHRoZWlyIHByb3BlcnRpZXMgYWdhaW4gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCAmJiAhdGhpcy5pc0Fib3J0aW5nKCkgJiYgdGhpcy5pc1N0YXJ0ZWQoKSkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlN0YXJ0IHRhc2suUmVmcmVzaERpc3BsYXkoKVwiKTtcclxuXHJcbiAgICAgIC8vIHJlY29yZHMgZnJvbSB0aGUgRGF0YVZpZXcgYW5kIHJlZnJlc2hlcyB0aGUgcm93cy5cclxuICAgICAgLy8gTm93LCBUYXNrLlJlZnJlc2hEaXNwbGF5KCkgaXMgY2FsbGVkIGZyb20gMiBwbGFjZXM6XHJcbiAgICAgIC8vIDEuIHdoaWxlIGluaXRpbmcgdGhlIGZvcm1cclxuICAgICAgLy8gMi4gd2hlbiBjb21pbmcgYmFjayBmcm9tIHNlcnZlclxyXG4gICAgICAvLyBJbiBjYXNlICMxLCB3ZSBkbyBub3QgbmVlZCB0byByZWZyZXNoIHRoZSB0YWJsZSBhcyBpdCBpcyBkb25lIGZyb20gZmlyc3RUYWJsZVJlZnJlc2goKS5cclxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjYW4gYmUgZWxpbWluYXRlZC5cclxuICAgICAgaWYgKHRoaXMuX3JlZnJlc2hUeXBlICE9PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkUpIHtcclxuICAgICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLkZvcm07XHJcbiAgICAgICAgbGV0IHdhc1JlZnJlc2hlZDogYm9vbGVhbiA9IGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICBpZiAod2FzUmVmcmVzaGVkKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZWZyZXNoVHlwZSA9IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJFbmQgdGFzay5SZWZyZXNoRGlzcGxheSgpXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIHZhbHVlIG9mIGEgZmllbGQuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgLy8gVE9ETyBzYWRoYW4gcmVtb3ZlIHVudXNlZFxyXG4gIC8vIGFzeW5jIGdldEZpZWxkVmFsdWUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8dm9pZD4ge1xyXG4gIC8vICAgdmFsdWUudmFsdWUgPSBhd2FpdCAoPEZpZWxkPmZpZWxkRGVmKS5nZXRWYWx1ZShmYWxzZSk7XHJcbiAgLy8gICBpc051bGwudmFsdWUgPSBhd2FpdCAoPEZpZWxkPmZpZWxkRGVmKS5pc051bGwoKTtcclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSBkaXNwbGF5IHZhbHVlIG9mIGEgZmllbGQuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgZ2V0RmllbGREaXNwbGF5VmFsdWUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPik6IHZvaWQge1xyXG4gICAgdmFsdWUudmFsdWUgPSAoPEZpZWxkPmZpZWxkRGVmKS5nZXREaXNwVmFsdWUoKTtcclxuICAgIGlzTnVsbC52YWx1ZSA9ICg8RmllbGQ+ZmllbGREZWYpLmlzTnVsbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB1cGRhdGVzIHRoZSBmaWVsZCdzIHZhbHVlIGFuZCBzdGFydHMgcmVjb21wdXRlLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIGFzeW5jIFVwZGF0ZUZpZWxkVmFsdWVBbmRTdGFydFJlY29tcHV0ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuVGFza1ByZWZpeEV4ZWN1dGVkKSB7XHJcbiAgICAgIGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodmFsdWUsIGlzTnVsbCwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRm9yIGEgcmljaGNsaWVudCB0YXNrcywgY2hlY2sgaWYgTm9uLUludGVyYWN0aXZlIHRhc2sgY2hpbGQgc2hvdWxkIGJlIE1vZGFsLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWU8L3JldHVybnM+XHJcbiAgU2hvdWxkTm9uSW50ZXJhY3RpdmVDaGlsZEJlTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5TaG91bGRDaGlsZEJlTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgaWYgYSB0YXNrcyBjaGlsZCBzaG91bGQgYmUgbW9kYWxcclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRDaGlsZEJlTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gd2luZG93IGlzIG9wZW5lZCBhbmQgb2YgbW9kYWwgdHlwZSAoZG9lc24ndCBtYXR0ZXIgaWYgaW50ZXJhY3RpdmUgb3Igbm90KVxyXG4gICAgaWYgKCh0aGlzLkZvcm0uQ29uY3JldGVXaW5kb3dUeXBlID09PSBXaW5kb3dUeXBlLk92ZXJsYXkpICYmIHRoaXMuZ2V0Rm9ybSgpLk9wZW5lZClcclxuICAgICAgY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsID0gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgICBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWwgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHBhcmVudCB0YXNrIG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UGFyZW50KCk6IFRhc2tCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIHRhc2sgaXMgdGhlIGNoZWNrZWQgdGFzayBvciBhIGRlc2NlbmRhbnQgb2YgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzRGVzY2VuZGVudE9mKGNoa1Rhc2s6IFRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoY2hrVGFzayA9PT0gdGhpcylcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICBlbHNlIGlmIChjaGtUYXNrID09PSBudWxsIHx8IHRoaXMuX3BhcmVudFRhc2sgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzay5pc0Rlc2NlbmRlbnRPZihjaGtUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHN1YmZvcm1DdHJsIHdoaWNoIGlzIE1vZGFsIGluIGN1cnJlbnQgcnVudGltZSB0cmVlIGlmIHRoZXJlIGlzIGFueT8uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgR2V0U3ViZm9ybU1vZGFsUGFyZW50VGFzaygpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gdGhpcztcclxuICAgIHdoaWxlIChjdXJyVGFzay5fcGFyZW50VGFzayAhPSBudWxsICYmIGN1cnJUYXNrLl9wYXJlbnRUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpIHtcclxuICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPihjdXJyVGFzay5fcGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKSk7XHJcbiAgICAgIGlmIChzdWJmb3JtQ3RybC5Jc01vZGFsKCkpXHJcbiAgICAgIHtcclxuICAgICAgICByZXR1cm4gc3ViZm9ybUN0cmw7XHJcbiAgICAgIH1cclxuICAgICAgY3VyclRhc2sgPSBjdXJyVGFzay5fcGFyZW50VGFzaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRydWUgZm9yIHJlbW90ZSB0YXNrIGZvciBleHByZXNzaW9uIHRoYXQgd2FzIGNvbXB1dGVkIG9uY2Ugb24gc2VydmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZEV2YWx1YXRlUHJvcGVydHlMb2NhbGx5KHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5UYXNrU2VydmljZS5TaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseShwcm9wSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIG1ldGhvZCBydW5zIGFjdGlvbnMgYWZ0ZXIgdGhlICdmb3JtJyB0YWcgaXMgaGFuZGxlZC5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEVuc3VyZVZhbGlkRm9ybSgpOiB2b2lkIHtcclxuICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1ldGhvZDpcclxuICAgIC8vIElmIHRoaXMgdGFzayBpcyB0aGUgbWFpbiBwcm9ncmFtIGFuZCBfb3BlbldpbiBldmFsdWF0ZXMgdG8gJ2ZhbHNlJywgdGhlblxyXG4gICAgLy8gcHJldmVudCB0aGUgZGlzcGxheSBvZiB0aGUgZm9ybSwgYnkgc2V0dGluZyBpdCB0byAnbnVsbCcuXHJcbiAgICBpZiAodGhpcy5faXNNYWluUHJnICYmIHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAoIXRoaXMuX29wZW5XaW4gfHwgIXRoaXMuRm9ybS5pc0xlZ2FsRm9ybSkgeyAgIC8vIFRoaXMgY2FuIGJlIG1kaSBmcmFtZVxyXG4gICAgICAgIHRoaXMuRm9ybSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29tcHV0ZSB0aGUgbWFpbiBkaXNwbGF5IG9uY2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgQ29tcHV0ZU1haW5EaXNwbGF5KCk6UHJvbWlzZTx2b2lkPiAge1xyXG4gICAgbGV0IHByb3BNYWluRGlzcGxheTogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTUFJTl9ESVNQTEFZKTtcclxuICAgIC8vIGdldCB0aGUgdmFsdWUgb2YgbWFpbiBkaXNwbGF5IFxyXG4gICAgbGV0IG1haW5EaXNwbGF5SW5kZXg6IG51bWJlciA9IGF3YWl0IHByb3BNYWluRGlzcGxheS5nZXRWYWx1ZUludCgpO1xyXG5cclxuICAgIG1haW5EaXNwbGF5SW5kZXggPSB0aGlzLkdldFJlYWxNYWluRGlzcGxheUluZGV4T25DdXJyZW50VGFzayhtYWluRGlzcGxheUluZGV4KTtcclxuXHJcbiAgICB0aGlzLl9mb3Jtcy5Jbml0Rm9ybUZyb21YbWxTdHJpbmcobWFpbkRpc3BsYXlJbmRleCk7XHJcbiAgICB0aGlzLkVuc3VyZVZhbGlkRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwcmVwYXJlIHRhc2sgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUHJlcGFyZVRhc2tGb3JtKCk6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBhd2FpdCBUYXNrU2VydmljZUJhc2UuUHJlcGFyZVByb3BPcGVuVGFza1dpbmRvdyh0aGlzKTtcclxuICAgIHJldHVybiBhd2FpdCBSZW1vdGVUYXNrU2VydmljZS5QcmVwYXJlUHJvcE1haW5EaXNwbGF5KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBpZiBmb3JtIGlzIGxlZ2FsXHJcbiAgLy8vIHdlIGFyZSBub3QgZ2V0IHRvIHRoYXQgbWV0aG9kIGZvciBtYWluIGRpc3BsYXkgdGhhdCBvcGVuIHdpbmRvdyBpcyBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBGb3JtSXNMZWdhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0Zvcm1Jc0xlZ2FsOiBib29sZWFuID0gc3VwZXIuaXNNYWluUHJvZygpO1xyXG4gICAgcmV0dXJuIGlzRm9ybUlzTGVnYWwgfHwgc3VwZXIuZ2V0Rm9ybSgpLmlzTGVnYWxGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIG1haW4gZGlzcGxheSBvbiBzdHVkaW8gZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1haW5Ec3BJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkRlcHRoKG1haW5Ec3BJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IHRoaXMuTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcblxyXG4gICAgd2hpbGUgKHRhc2sgIT0gbnVsbCkge1xyXG4gICAgICBtYWluRHNwSWR4ICs9IHRhc2suX2Zvcm1zLkNvdW50O1xyXG4gICAgICB0YXNrID0gdGFzay5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpbkRzcElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBtYWluIGRpc3BsYXkgb24gc3R1ZGlvIGRlcHRoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYWluRHNwSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJlYWxNYWluRGlzcGxheUluZGV4T25DdXJyZW50VGFzayhtYWluRHNwSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKG1haW5Ec3BJZHggPiAxKSB7XHJcblxyXG4gICAgICBsZXQgdGFzazogVGFzayA9IHRoaXMuTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcblxyXG4gICAgICB3aGlsZSAodGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgbWFpbkRzcElkeCAtPSB0YXNrLl9mb3Jtcy5Db3VudDtcclxuICAgICAgICB0YXNrID0gdGFzay5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluRHNwSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgQW5jZXN0b3IgdGFzayAob24gcnVudGltZSB0cmVlKSBvZiB0aGUgc2VuZCB0YXNrIGRlZmluaXRpb24gaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpbmRUYXNrRGVmaW5pdGlvbklkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEFuY2VzdG9yVGFza0J5VGFza0RlZmluaXRpb25JZChmaW5kVGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCk6IFRhc2sge1xyXG4gICAgbGV0IGN1cnJlbnRUYXNrOiBUYXNrID0gdGhpcztcclxuXHJcbiAgICAvLyBGaXhlZCBidWcgIzoxNzI5NTlcclxuICAgIC8vIGlmIHRoZSBmaW5kVGFza0RlZmluaXRpb25JZCBpcyBtYWluIHByb2dyYW0gKGNhbiBiZSBvZiBjb21wb25lbnQpIHdlIHdpbGwgbm90IGZvdW5kIGl0IGluIHRoZSBfcGFyZW50VGFza1xyXG4gICAgLy8gc28gd2Ugd2lsbCB0YWtlIHRoZSB0YXNrIGZyb20gdGhlIE1HRGF0YVRhYmxlXHJcbiAgICBpZiAoZmluZFRhc2tEZWZpbml0aW9uSWQuSXNNYWluUHJvZ3JhbSgpKVxyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgZmluZFRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpO1xyXG5cclxuICAgIHdoaWxlIChjdXJyZW50VGFzayAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChjdXJyZW50VGFzay5UYXNrRGVmaW5pdGlvbklkLkVxdWFscyhmaW5kVGFza0RlZmluaXRpb25JZCkpXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXNrO1xyXG5cclxuICAgICAgY3VycmVudFRhc2sgPSBjdXJyZW50VGFzay5fcGFyZW50VGFzaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIFNldERhdGFDb250cm9sVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZDogbnVtYmVyLCBkY1ZhbHVlc0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gc3VwZXIuZ2V0Rm9ybSgpLmdldEN0cmwoY29udHJvbElkKTtcclxuICAgIGN0cmwuc2V0RGNWYWxJZChkY1ZhbHVlc0lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZGlzcGxheSB0ZXN0IG9uIHN0YXR1cyBiYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIERpc3BsYXlNZXNzYWdlVG9TdGF0dXNCYXIodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBRY3IgIzc5ODMxMS4gaWYgc2VydmVyIHNpZGUgaGFkIE1QIGRvaW5nIHZlcmlmeSB0byBwYW5lIGFuZCBNUCBoYXMgbm8gZm9ybVxyXG4gICAgLy8gd2Ugd2lsbCBnZXQgYW4gZXhjZXB0aW9uLiBzbyBpbiBjYXNlIG9mIG5vIGZvcm0sIGdldCBpdCBmcm9tIGxhc3QgZm9jdXNlZCB0YXNrLlxyXG4gICAgbGV0IHRhc2tUb1ZlcmlmeU9uOiBUYXNrID0gPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKTtcclxuICAgIGlmICh0YXNrVG9WZXJpZnlPbi5nZXRGb3JtKCkgPT0gbnVsbClcclxuICAgICAgdGFza1RvVmVyaWZ5T24gPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcblxyXG4gICAgdGFza1RvVmVyaWZ5T24uV3JpdGVUb01lc3NhZ2VQYW5lKHRleHQpO1xyXG4gIH1cclxuXHJcblxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyID0gKDxNZ0Zvcm0+dGhpcy5nZXRGb3JtKCkpLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTtcclxuXHJcbiAgICByZXR1cm4gaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXI7XHJcbiAgfVxyXG5cclxuICBHZXRUYXNrRGV0YWlscygpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5hbWVzID0gICh0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcztcclxuICAgIHdoaWxlICh0YXNrLlBhcmVudFRhc2sgIT09IG51bGwgJiYgIXRhc2suUGFyZW50VGFzay5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnRhc2suUGFyZW50VGFzaztcclxuICAgICAgbmFtZXMgPSAgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgXCIuXCIgKyBuYW1lcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmFtZXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIHRhc2tVUkwgdGFnXHJcbiAgLy8vIGV2ZXJ5IHRhc2tVUkwgdGFnIGlzIHJlcGxhY2VkIGJ5IHRoZSBkYXRhIG9mIHRoZSB4bWwgaXNsYW5kIGl0IHJlZmVycyB0bzwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgUHJvY2Vzc1Rhc2tVUkwoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgeG1sRGF0YTogc3RyaW5nID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxkYXRhKCk7XHJcbiAgICBsZXQgZW5kVGFza1VybElkeDogbnVtYmVyID0geG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgRGVidWcuQXNzZXJ0KGVuZFRhc2tVcmxJZHggIT09IC0xICYmIGVuZFRhc2tVcmxJZHggPCB4bWxEYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgLy8gZXh0cmFjdCB0aGUgdGFzayB1cmwgYW5kIHRoZSByZWYgbGlzdFxyXG4gICAgbGV0IHRhZzogc3RyaW5nID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kVGFza1VybElkeCk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoKTtcclxuXHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZFRhc2tVcmxJZHgpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgbGV0IHRhc2tDYWNoZVVSTDogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKDEpO1xyXG4gICAgbGV0IHJlZkxpc3RTdHI6IHN0cmluZyA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbSgzKTtcclxuXHJcbiAgICAvLyBicmluZyB0aGUgZGF0YVxyXG4gICAgbGV0IHRhc2tDb250ZW50T3JpZ2luYWw6IHN0cmluZyA9IGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuR2V0Q29udGVudCh0YXNrQ2FjaGVVUkwsIHRydWUpO1xyXG5cclxuICAgIC8vIHByZWZpeCB0aGUgb3JpZ2luYWwgZGF0YSB0aWxsIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCA8dGFza1VSTD5cclxuICAgIGxldCB0YXNrQ29udGVudEZpbmFsOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoeG1sRGF0YS5zdWJzdHIoMCwgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSAtIChDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGggKyAxKSksIHRhc2tDb250ZW50T3JpZ2luYWwubGVuZ3RoKTtcclxuICAgIC8vIHRoZSBudW1iZXIgb2YgdG9rZW5zIGluIHJlZkxpc3QgYW5kIHRoZSBudW1iZXIgb2YgbG9jYXRpb24gaW4gdGhlIHhtbCB0byBiZSByZXBsYWNlZCAoaS5lLiB0aGUgcGxhY2VzIHdpdGggWzopIHNob3VsZCBiZSBlcXVhbFxyXG4gICAgbGV0IHJlZmxpc3Q6IExpc3Q8c3RyaW5nPiA9IHRoaXMuZ2V0UmVmbGlzdChyZWZMaXN0U3RyLCAnOycsIHRydWUsIC0xKTtcclxuICAgIGxldCByZWZMaXN0SWR4ID0gMDtcclxuXHJcbiAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGFza0NvbnRlbnRPcmlnaW5hbC5pbmRleE9mKFwiWzpcIik7XHJcbiAgICBsZXQgcHJldklkeDogbnVtYmVyID0gMDtcclxuICAgIHdoaWxlIChjdXJySWR4ICE9PSAtMSkge1xyXG4gICAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZCh0YXNrQ29udGVudE9yaWdpbmFsLnN1YnN0cihwcmV2SWR4LCBjdXJySWR4IC0gcHJldklkeCkpO1xyXG4gICAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZChyZWZsaXN0LmdldF9JdGVtKHJlZkxpc3RJZHgrKykpO1xyXG4gICAgICBjdXJySWR4ICs9IDI7XHJcbiAgICAgIHByZXZJZHggPSBjdXJySWR4O1xyXG4gICAgICBjdXJySWR4ID0gdGFza0NvbnRlbnRPcmlnaW5hbC5pbmRleE9mKFwiWzpcIiwgcHJldklkeCk7XHJcbiAgICB9XHJcbiAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZCh0YXNrQ29udGVudE9yaWdpbmFsLnN1YnN0cihwcmV2SWR4KSk7XHJcblxyXG4gICAgLy8gc3VmZml4IHRoZSByZXN0IG9mIHRoZSBvcmlnaW5hbCB4bWwgZnJvbSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IDwvdGFza1VSTD5cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHhtbERhdGEuc3Vic3RyKHhtbERhdGEuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBlbmRUYXNrVXJsSWR4ICsgMSkgKyAxKSk7XHJcbiAgICB4bWxEYXRhID0gdGFza0NvbnRlbnRGaW5hbC5Ub1N0cmluZygpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC0tLS0tLS0+IHsxfVwiLCB0YXNrQ2FjaGVVUkwsIHhtbERhdGEpKTtcclxuXHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldFhNTGRhdGEoeG1sRGF0YSk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcGFyc2VzIHRoZSBkYXRhIGFjb3JkaW5nIHRvIHRoZSBkZWxpbWV0ZXIgYW5kIHRoZSByZWZsaXN0IGRlbGltZXRlcnMgbG9naWM8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRydW5jXCI+aWYgdHJ1ZSB0cnVjYXRlIGZpcnN0ICdcXFxcJyAoaW4gdXNlIGZvciBpc2xhbmQgZGF0YSBwYXJzaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYXhUb2tlbnNcIj5pZiAtMSBhbGwgdG9rZW5zIGF2aWFsYWJsZSBlbHNlIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRvIHNlYXJjaDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0YVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVmbGlzdChkYXRhOiBzdHJpbmcsIGRlbGltOiBzdHJpbmcsIHRydW5jOiBib29sZWFuLCBtYXhUb2tlbnM6IG51bWJlcik6IExpc3Q8c3RyaW5nPiB7XHJcbiAgICBsZXQgY3VyclN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgbGlzdDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IHRva2Vuc0NudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBzaW5jZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGFsd2F5cyAnOycgd2Ugc3RhcnQgZnJvbSAxXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY3Vycjogc3RyaW5nID0gZGF0YS5jaGFyQXQoaSk7XHJcblxyXG4gICAgICBpZiAoY3VyciAhPT0gJ1xcXFwnICYmIGN1cnIgIT09IGRlbGltKVxyXG4gICAgICAgIGN1cnJTdHIuQXBwZW5kKGN1cnIpO1xyXG4gICAgICBlbHNlIGlmIChjdXJyID09PSBkZWxpbSkge1xyXG4gICAgICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGN1cnJTdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIHRva2Vuc0NudCsrO1xyXG5cclxuICAgICAgICBpZiAodG9rZW5zQ250ID09PSBtYXhUb2tlbnMpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjdXJyID09PSAnXFxcXCcpIHtcclxuICAgICAgICAvLyB0aGUgZm9ybWF0ICdcXFxcZGVsaW1pdGVyJyBpcyBhbHdheXMgdHJ1bmNhdGVkXHJcbiAgICAgICAgaWYgKCF0cnVuYyAmJiBkYXRhLmNoYXJBdChpICsgMSkgIT09IGRlbGltKVxyXG4gICAgICAgICAgY3VyclN0ci5BcHBlbmQoZGF0YS5jaGFyQXQoaSkpO1xyXG5cclxuICAgICAgICBpKys7XHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoZGF0YS5jaGFyQXQoaSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXBwZW5kIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHJlZiBsaXN0XHJcbiAgICBsaXN0LnB1c2goY3VyclN0ci5Ub1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBhbmQgc2V0IGZvY3VzIHRvIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIFN0YXJ0UHJvZ3JhbShjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBsZXQgb3JnU3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBhbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRBbGxvd0V2ZW50cygpO1xyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0QWxsb3dFdmVudHMoRXZlbnRzQWxsb3dlZFR5cGUuQUxMKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlN0YXJ0IFxcXCJzdGFydFByb2dcXFwiXCIpO1xyXG4gICAgVGFzay5TdGFydFByb2dMZXZlbCsrO1xyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7IC8vIFFDUiAjNzY5NzM0IC0gbm90aGluZyBjYW4gc3RvcCBhIHRhc2sgZnJvbSBzdGFydGluZyB1cC5cclxuXHJcbiAgICAvLyBGaXhlZCBidWcgIzI4MzY0NyBleGVjdXRlIGNvbXBvbmVudHMgbWFpbiBwcm9ncmFtcyAtICBpbiB0aGUgc2VydmVyIHdlIGV4ZWN1dGUgdGhlIHNhbWUgc2VlIGluaS5jcHAgbWV0aG9kIGV4ZWN1dGVfbWFpbl9wcm9ncygpXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBhd2FpdCB0aGlzLkV4ZWN1dGVDb21wb25lbnRNYWluUHJvZ3JhbXMoY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgLy8gZXhlY3V0ZSBpbnRlcm5hbCBtYWluIHByb2dyYW1zXHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQpO1xyXG4gICAgbGV0IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG4gICAgYXdhaXQgVGFzay5FeGVjdXRlTWFpblByb2dyYW0oMCwgY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCwgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrUmVmLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUpO1xyXG4gICAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkID0gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmLnZhbHVlO1xyXG5cclxuICAgIGlmICghVGFzay5faWRsZVRpbWVyU3RhcnRlZCkge1xyXG4gICAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLnN0YXJ0VGltZXIoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKSwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0SWRsZVRpbWUoMCksIHRydWUpO1xyXG4gICAgICBUYXNrLl9pZGxlVGltZXJTdGFydGVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLk9wZW5Gb3JtcyhjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICBhd2FpdCB0aGlzLkRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5Nb3ZlVG9GaXJzdENvbnRyb2xzKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuXHJcblxyXG4gICAgLy8gSGFuZGxlIHRoZSBldmVudHMgb25seSB3aGVuIGFsbCB0aGUgdGFza3MgYW5kIHRoZWlyIGZvcm1zIGFyZSBvcGVuZWQuXHJcbiAgICBpZiAoVGFzay5TdGFydFByb2dMZXZlbCA9PT0gMSkge1xyXG4gICAgICBsZXQgcmVzZXRBbGxvd0V2ZW50czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICBsZXQgY2FuRXhlY3V0ZUV2ZW50czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAvLyBzZXQgdGhlIHdpdGhpbiBub24gaW50ZXJhY3RpdmUgc2luY2UgdGhlIGhhbmRsZUV2ZW50cyBtaWdodCB0cnkgdG8gZXhlY3V0ZSBhbiBldmVudFxyXG4gICAgICAvLyB0aGF0IHdhcyByYWlzZWQgaW4gdGhlIDFzdCByZWMgcHJlZiAoYWRkZWQgaW4gbW92ZVRvRmlyc3Rjb250cm9scykuXHJcbiAgICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgIT09IG51bGwgJiYgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgICAgcmVzZXRBbGxvd0V2ZW50cyA9IHRydWU7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhhd2FpdCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNBbGxvd0V2ZW50cygpKTtcclxuXHJcbiAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlIHRhc2sgd2l0aCBhbGxvdyBldmVudHMgPSBOTyBpcyBhYm91dCB0byBydW4uXHJcbiAgICAgICAgLy8gZG9uJ3QgdHJ5IHRvIGV4ZWN1dGUgdGhlIGV2ZW50cyBiZWZvcmUgaXQgc3RhcnRzIGJlY2F1c2UgdGhleSB3aWxsIGJlIGxvc3QuICgjMTM4NDkzKVxyXG4gICAgICAgIGNhbkV4ZWN1dGVFdmVudHMgPSBhd2FpdCAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLmlzQWxsb3dFdmVudHMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIGl0IGlzIGEgc3ViZm9ybSB3aXRoIHZpc2liaWxpdHkgZXhwcmVzc2lvbiBldmFsdWF0ZWQgdG8gVFJVRSxcclxuICAgICAgLy8gc28gYWZ0ZXIgcmV0dXJuIGZyb20gdGhlIHNlcnZlciBkbyBub3QgZXhlY3V0ZSBldmVudHMgZnJvbSB0aGUgcXVldWUuXHJcbiAgICAgIC8vIFRoZXNlIGV2ZW50cyB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gdGhlICdzdGFydFByb2cnIG9mIHRoZSBwYXJlbnQgdGFzay5cclxuICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSAhPT0gbnVsbCAmJiBjYW5FeGVjdXRlRXZlbnRzKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudHMoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKSwgMCk7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZXN0b3JlLiBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuIGl0IHdpbGwgYmUgc2V0IGFnYWluIG9uY2UgaW4gdGhlIGNvcnJlY3QgZXZlbnRzTG9vcC5cclxuICAgICAgaWYgKHJlc2V0QWxsb3dFdmVudHMpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0QWxsb3dFdmVudHMoYWxsb3dFdmVudHMpO1xyXG4gICAgfVxyXG5cclxuICAgIFRhc2suU3RhcnRQcm9nTGV2ZWwtLTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCBcXFwic3RhcnRQcm9nXFxcIlwiKTtcclxuXHJcbiAgICAvLyBJZiBvcmlnaW5hbGx5IHdlIHdlcmUgaW5zdHJ1Y3RlZCB0byBzdG9wIGV2ZW50cyBleGVjdXRpb24sIHRoZW4gcmVzdG9yZSB0aGlzXHJcbiAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbiAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24gJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihvcmdTdG9wRXhlY3V0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBjb21wb25lbnQncyBtYWluIHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNhbGxCeURlc3RTdWJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgbm9uIGludGVyYWN0aXZlIHRhc2sgaWYgYW55IHRoYXQgZXhlY3V0ZWQ8L3JldHVybnM+XHJcbiAgc3RhdGljIGFzeW5jIEV4ZWN1dGVDb21wb25lbnRNYWluUHJvZ3JhbXMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4sIG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IFByb21pc2U8VGFzaz4geyAvLyBnbyB3aXRoIFN0YXJ0UHJvZ3JhbVxyXG4gICAgbGV0IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2s6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcblxyXG4gICAgbGV0IG1heEN0bElkeDogbnVtYmVyID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKS5nZXRNYXhDdGxJZHgoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IG1heEN0bElkeDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBjb21wb25lbnRNYWluUHJvZ3JhbTogVGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBpKTtcclxuXHJcbiAgICAgIGlmIChjb21wb25lbnRNYWluUHJvZ3JhbSAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbShpLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgbWFpbiBwcm9ncmFtIG9mIEN0bEluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJDdGxJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2FsbEJ5RGVzdFN1YkZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VycmVudE5vbkludGVyYWN0aXZlVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBFeGVjdXRlTWFpblByb2dyYW0oQ3RsSW5kZXg6IG51bWJlciwgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4sIG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgY3VycmVudE5vbkludGVyYWN0aXZlVGFzazogUmVmUGFyYW08VGFzaz4sIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDogUmVmUGFyYW08VGFzaz4sIG1nRGF0YVRhYmxlOiBJTUdEYXRhQ29sbGVjdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1haW5Qcm9ncmFtVGFzazogVGFzayA9IDxUYXNrPm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIEN0bEluZGV4KTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcIiAgQ2xpZW50TWFuYWdlci5zdGFydFByb2c6IGN0bElkeD17MH0sIHRhc2s9ezF9XCIsIEN0bEluZGV4LCBtYWluUHJvZ3JhbVRhc2spKTtcclxuXHJcbiAgICBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlID0gIDxUYXNrPihhd2FpdCBtYWluUHJvZ3JhbVRhc2suU3RhcnQobW92ZVRvRmlyc3RDb250cm9sLCBjYWxsQnlEZXN0U3ViRm9ybSkpO1xyXG4gICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZSA9PT0gbnVsbClcclxuICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlID0gY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZTtcclxuICAgIGVsc2UgaWYgKGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlLCBcIm1vcmUgdGhhbiAxIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBpbiBzdGFydFByb2dcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IE9wZW4gYWxsIHRoZSBmb3JtIHRoYXQgYXJlIHBlbmRpbmcgaW4gQ3JlYXRlZEZvcm1zIHZlY3Rvci4gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBPcGVuRm9ybXMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjcmVhdGVkRm9ybXM6IENyZWF0ZWRGb3JtVmVjdG9yID0gTWdGb3JtLkNyZWF0ZWRGb3JtcztcclxuXHJcbiAgICBpZiAoY3JlYXRlZEZvcm1zLkNvdW50KCkgPiAwKSB7XHJcbiAgICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgICB3aGlsZSAoaSA8IGNyZWF0ZWRGb3Jtcy5Db3VudCgpKSB7XHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gY3JlYXRlZEZvcm1zLmdldChpKTtcclxuICAgICAgICBsZXQgY2FuT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBPcGVuIGEgc3ViZm9ybSBvbmx5IGlmIGl0cyBjb250YWluZXIgZm9ybSBpcyBPcGVuZWQuXHJcbiAgICAgICAgLy8gaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSBkb2Vzbid0IGdvIHdlbGwgZm9yIHN1YmZvcm1zIChRQ1IgIzkxOTExOSkuXHJcbiAgICAgICAgaWYgKG1nRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgICAgbGV0IG9wZW5lZDogYm9vbGVhbiA9ICg8TWdGb3JtQmFzZT5tZ0Zvcm0uZ2V0U3ViRm9ybUN0cmwoKS5nZXRGb3JtKCkpLk9wZW5lZDtcclxuICAgICAgICAgIGlmIChvcGVuZWQpIHtcclxuICAgICAgICAgICAgY2FuT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCg8VGFzaz5tZ0Zvcm0uZ2V0VGFzaygpKS5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpKSB7XHJcbiAgICAgICAgICAgIGNhbk9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbk9wZW4pIHtcclxuICAgICAgICAgIE1hbmFnZXIuT3BlbkZvcm0obWdGb3JtKTtcclxuICAgICAgICAgIGF3YWl0IE1hbmFnZXIuRG9GaXJzdFJlZnJlc2hUYWJsZShtZ0Zvcm0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1nRm9ybS5PcGVuZWQpIHtcclxuXHJcbiAgICAgICAgICBjcmVhdGVkRm9ybXMucmVtb3ZlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHb2VzIG92ZXIgZm9ybXMgaXMgY3JlYXRlZEZvcm1WZWMgYW5kIHBlcmZvcm1zIG1vdmUgdG8gZmlyc3QgcmVjb3JkIGN5Y2xlIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIERvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoaSk7XHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbWdkLmdldFRhc2tzQ291bnQoKTsgaisrKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBtZ2QuZ2V0VGFzayhqKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgICAgICAgaWYgKG1nRm9ybSAhPT0gbnVsbCAmJiB0YXNrLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgJiYgIW1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlKSB7XHJcbiAgICAgICAgICAgIG1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5kb0ZpcnN0UmVjb3JkQ3ljbGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRm9yIGV2ZXJ5IG1nZGF0YSBwZXJmb3JtIG1vdmUgdG8gZmlyc3QgY29udHJvbCB0byB0aGUgZm9ybVxyXG4gIC8vLyB0aGF0IHdlIG1hcmtlZCBiZWZvcmUgd2l0aCBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgTW92ZVRvRmlyc3RDb250cm9scyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShpKTtcclxuXHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBsZXQgdGFza3NDb3VudDogbnVtYmVyID0gbWdkLmdldFRhc2tzQ291bnQoKTtcclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRhc2tzQ291bnQ7IGorKykge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gbWdkLmdldFRhc2soaik7XHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2suaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSAmJiBtZ0Zvcm0gIT09IG51bGwgJiYgbWdGb3JtLk1vdmVkVG9GaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgIG1nRm9ybS5Nb3ZlZFRvRmlyc3RDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIWNhbGxCeURlc3RTdWJGb3JtKVxyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==
|
|
2490
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pJLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFFUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxRQUFRLEVBQ1IscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixNQUFNLEVBRU4saUJBQWlCLEVBQ2pCLEtBQUssRUFFTCxPQUFPLEVBR1AsUUFBUSxFQUNSLEdBQUcsRUFFSCxhQUFhLEVBQ2IsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQXdCLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVB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SSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtvQkFDbkYsTUFBTSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGlCQUFpQjt3QkFDbEIsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN0RTthQUNGO1NBQ0Y7SUFDSCxDQUFDOztBQTl0SE0sbUJBQWMsR0FBVyxDQUFDLENBQUM7QUFFbkIsc0JBQWlCLEdBQVksS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZWJ1ZywgSGFzaFV0aWxzLCBMaXN0LCBOTnVtYmVyLCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RhY2ssIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVbmlxdWVUc2tTb3J0LFxyXG4gIFdpbmRvd1R5cGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBEaXNwbGF5Q29udmVydG9yLFxyXG4gIEV2ZW50cyxcclxuICBGaWVsZERlZixcclxuICBHdWlEYXRhQ29sbGVjdGlvbixcclxuICBIZWxwcyxcclxuICBJVGFzayxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBOVU1fVFlQRSxcclxuICBQSUMsXHJcbiAgUHJvcGVydHksXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSZWNvcmRVdGlscyxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnR9IGZyb20gJy4uL2V2ZW50L0V2ZW50JztcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSAnLi4vZGF0YS9EYXRhVmlldyc7XHJcbmltcG9ydCB7RHZDYWNoZX0gZnJvbSAnLi4vZGF0YS9EdkNhY2hlJztcclxuaW1wb3J0IHtNR0RhdGF9IGZyb20gJy4vTUdEYXRhJztcclxuaW1wb3J0IHtEYXRhVmlld0NvbW1hbmRUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9EYXRhdmlld0NvbW1hbmQnO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yQmFzZSwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHtUYXNrU2VydmljZUJhc2V9IGZyb20gJy4vVGFza1NlcnZpY2VCYXNlJztcclxuaW1wb3J0IHtBcmd1bWVudHNMaXN0fSBmcm9tICcuLi9ydC9Bcmd1bWVudHNMaXN0JztcclxuaW1wb3J0IHtUYXNrVHJhbnNhY3Rpb25NYW5hZ2VyfSBmcm9tICcuLi9kYXRhL1Rhc2tUcmFuc2FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQge0RhdGF2aWV3TWFuYWdlcn0gZnJvbSAnLi4vZGF0YS9EYXRhdmlld01hbmFnZXInO1xyXG5pbXBvcnQge1NvcnRDb2xsZWN0aW9ufSBmcm9tICcuL3NvcnQvU29ydENvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1NvcnR9IGZyb20gJy4vc29ydC9Tb3J0JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbCc7XHJcbmltcG9ydCB7UmVtb3RlVGFza1NlcnZpY2V9IGZyb20gJy4vUmVtb3RlVGFza1NlcnZpY2UnO1xyXG5pbXBvcnQge1JldHVyblJlc3VsdH0gZnJvbSAnLi4vdXRpbC9SZXR1cm5SZXN1bHQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi4vZXZlbnQvUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtJQ2xpZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7RGF0YXZpZXdIZWFkZXJzfSBmcm9tICcuLi9ydC9EYXRhdmlld0hlYWRlcnMnO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9ufSBmcm9tICcuLi9ydC9UcmFuc2FjdGlvbic7XHJcbmltcG9ydCB7VGFza3NUYWJsZX0gZnJvbSAnLi9UYXNrc1RhYmxlJztcclxuaW1wb3J0IHtJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50VGFyZ2V0ZWRDb21tYW5kJztcclxuaW1wb3J0IHtIYW5kbGVyc1RhYmxlfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHtSZWNvbXB1dGVUYWJsZX0gZnJvbSAnLi4vcnQvUmVjb21wdXRlVGFibGUnO1xyXG5pbXBvcnQge0V4cFRhYmxlfSBmcm9tICcuLi9leHAvRXhwVGFibGUnO1xyXG5pbXBvcnQge1VzZXJFdmVudHNUYWJsZX0gZnJvbSAnLi4vZXZlbnQvVXNlckV2ZW50c1RhYmxlJztcclxuaW1wb3J0IHtGb3Jtc1RhYmxlfSBmcm9tICcuLi9ndWkvRm9ybXNUYWJsZSc7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtGaWVsZH0gZnJvbSAnLi4vZGF0YS9GaWVsZCc7XHJcbmltcG9ydCB7QWN0aW9uTWFuYWdlcn0gZnJvbSAnLi4vZXZlbnQvQWN0aW9uTWFuYWdlcic7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJ9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwL0V4cHJlc3Npb24nO1xyXG5pbXBvcnQge0ZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlfSBmcm9tICcuLi9kYXRhL0ZpZWxkc1RhYmxlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7T3BlbmluZ1Rhc2tEZXRhaWxzLCBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlLCBVc2VyUmFuZ2V9IGZyb20gJy4vVGFza0Jhc2UnO1xyXG5pbXBvcnQge0xhbmd1YWdlRGF0YX0gZnJvbSAnLi4vZW52L0xhbmd1YWdlRGF0YSc7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0dsb2JhbENvbW1hbmRzTWFuYWdlcn0gZnJvbSAnLi4vR2xvYmFsQ29tbWFuZHNNYW5hZ2VyJztcclxuaW1wb3J0IHtFdmVudHNBbGxvd2VkVHlwZX0gZnJvbSAnLi4vZXZlbnQvSUV2ZW50c01hbmFnZXInO1xyXG5pbXBvcnQge0NyZWF0ZWRGb3JtVmVjdG9yfSBmcm9tICcuLi9ndWkvQ3JlYXRlZEZvcm1WZWN0b3InO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuaW1wb3J0IHtJTUdEYXRhQ29sbGVjdGlvbn0gZnJvbSAnLi9JTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7TUdEYXRhQ29sbGVjdGlvbn0gZnJvbSAnLi9NR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlclBvc2l0aW9ufSBmcm9tICcuLi9ldmVudC9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcblxyXG5leHBvcnQgZW51bSBUYXNrX0Zsb3cge1xyXG4gIE5PTkUsXHJcbiAgU1RFUCxcclxuICBGQVNUXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRhc2tfRGlyZWN0aW9uIHtcclxuICBCQUNLID0gLTEsXHJcbiAgTk9ORSxcclxuICBGT1JFXHJcbn1cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBUYXNrIGV4dGVuZHMgVGFza0Jhc2Uge1xyXG4gIHByaXZhdGUgX2R2Q2FjaGU6IER2Q2FjaGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX21nRGF0YTogTUdEYXRhID0gbnVsbDtcclxuICBwcml2YXRlIF9hYm9ydGluZzogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGFuIGFib3J0IGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZvciB0aGlzIHRhc2sgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnNcclxuICBwcml2YXRlIF9iRXhlY0VuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmFsT2xkVmFsdWVzOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgZm9yIHRoZSBnZXQgdmFsdWUgdG8gZ2V0IHRoZSBvbGQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2UgYXJlIGluIHJlY29yZCBzdWZmaXggKGhhbmRsZSBiZWZvcmUpXHJcbiAgcHJpdmF0ZSBfY2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgLy8gd2FzIGNhbmNlbC9xdWl0IGV2ZW50IHJhaXNlZCA/XHJcbiAgcHJpdmF0ZSBfY291bnRlcjogbnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2VzIG9ubHkgaW4gbm9uIGludGVydmFsIHRhc2tzLlxyXG4gIHByaXZhdGUgX2N1cnJTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBzdGFydFByb2cgcmVxdWVzdCBpbiB3aGljaCB3ZSB0YXNrIGlzIHN0YXJ0ZWRcclxuICBwcml2YXRlIF9kZXN0aW5hdGlvblN1YmZvcm06IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIHByaXZhdGUgX2VuYWJsZVpvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBmaXJzdCByZWNvcmQgY3ljbGVcclxuICBwcml2YXRlIF9vcmlnaW5hbFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgcHJpdmF0ZSBfaW5DcmVhdGVMaW5lOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8gaXMgdGhlIHRhc2sgaW50byBwcm9jZXNzaW5nIENSRUFURSBMSU5FXHJcbiAgcHVibGljIEluU2VsZWN0OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgd2hlbiB0aGUgdGFzayBpcyBleGVjdXRpbmcgYSBTRUxFQ1QgaW50ZXJuYWwgZXZlbnRcclxuICBwdWJsaWMgSW5TdGFydFByb2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzayBieSBjYWxsIG9wZXJhdGlvblxyXG4gIHByaXZhdGUgX2tub3duVG9TZXJ2ZXI6IGJvb2xlYW4gPSB0cnVlOyAgICAgICAgICAgICAgIC8vIEZhbHNlIGlmIHRoZSBzZXJ2ZXIgaGFzXHJcbiAgcHJpdmF0ZSBfbG9vcFN0YWNrOiBTdGFjazxudW1iZXI+ID0gbnVsbDtcclxuICBwcml2YXRlIGFsbG93UmVtb3RlQ21kRXhlY3V0aW9uOiBib29sZWFuO1xyXG4gIHB1YmxpYyBEZWxheUNvbW1hbmRFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBjb250YWluaW5nIHRoZSBDYWxsIG9wZXJhdGlvbi5cclxuICAvLy8gVGhpcyBtZW1iZXIgaXMgdXNlZCBmb3Igc2VhcmNoaW5nIHRoZSB2YXJpYWJsZXMgbGlrZSBWYXJJbmRleCgpLCBldGNcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfcGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnZXQgUGFyZW50VGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb250ZXh0VGFzazogVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBjb250ZXh0IG9mIHdoaWNoIHRhc2sgdGhpcyB0YXNrIGlzIGN1cnJlbnRseSBydW5uaW5nXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHNhbWUgYXMgX3BhcmVudFRhc2sgZXhjZXB0IGZvciBNb2RhbCB0YXNrcy4gSW4gY2FzZSwgdGhlIGN1cnJlbnQgdGFzayBpcyBtb2RhbCwgX3RyaWdnZXJpbmdUYXNrIHJlZmVycyB0b1xyXG4gIC8vLyAgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBvZiB0aGUgX3BhcmVudFRhc2suIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIGFsbCBnZW5lcmF0aW9uLWJhc2VkIGZ1bmN0aW9ucyBhbmQgUHJvZygpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdHJpZ2dlcmluZ1Rhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBpcyB0aGUgdGFzayB3aGljaCBjb250YWluZWQgdGhlIENhbGwgb3BlcmF0aW9uLiBJZiB0aGUgdGFzayB3YXMgZXhlY3V0ZWQgd2l0aG91dCBjYWxsXHJcbiAgLy8vICAgb3BlcmF0aW9uIGVnLiB0aGUgTVAsIHRoZSBzdGFydHVwIHByb2dyYW0sIGV0Yy4sIGl0IHJlZmVycyB0byBpdHNlbGYuIFRoaXMgbWVtYmVyIHVzZWQgdG8gc2VhcmNoIGZvciB0aGUgZXZlbnQgaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBQYXRoUGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZlbnRDb250cm9sQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcHJldmVudFJlY29yZFN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Rhc2tQYXRoOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuXHJcbiAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIGN1cnJlbnRseSB0cnlpbmcgdG8gY29tbWl0IGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIHByaXZhdGUgX3RyeWluZ1RvQ29tbWl0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNldCBUcnlpbmdUb0NvbW1pdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdHJ5aW5nVG9Db21taXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBUcnlpbmdUb0NvbW1pdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cnlpbmdUb0NvbW1pdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZUxvb3BTdGFjazogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIChMT09QQ09VTlRFUigpKSBpcyBpbiB0aGUgc2NvcGUgb2YgQmxvY2sgTG9vcC5cclxuICBwcml2YXRlIF9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBJbkhhbmRsZUFjdENhbmNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBSdW50aW1lU29ydHM6IFNvcnRDb2xsZWN0aW9uID0gbnVsbDtcclxuICBwdWJsaWMgVmV3Rmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIGRhdGFWaWV3Q29udGVudDogc3RyaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgLy8gZGF0YVZpZXdDb250ZW50IHJldHJpZXZlZCBieSBHZXREYXRhVmlld0NvbnRlbnQgY29tbWFuZC5cclxuICBwdWJsaWMgUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDogYm9vbGVhbiA9IGZhbHNlOyAgICAvLyBJbiByZWNvcmQgcHJlZml4IChjb21tb25IYW5kbGVyQmVmb3JlKSB3ZSBleGVjdXRlIHJlY29yZCBwcmVmaXggb2YgYWxsIGZhdGhlcnMuXHJcblxyXG4gIC8vIEJ1dCB3ZSBkbyBub3QgbmVlZCBpdCBpbiBhbGwgY2FzZXMuXHJcbiAgLy8gV2hlbiB3ZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIGl0LlxyXG4gIC8vIFdoZW4gd2UgY2xpY2sgb24gdGhlIG5lc3RlZCBzdWJmb3JtIHdlIG5lZWQgaXQuXHJcbiAgLy8gaWYgdHJ1ZSwgZG8gdGhlIHBhcmVudCBzdWJmb3JtIHJlY29yZCBwcmVmaXhcclxuXHJcbiAgLy8gLTEg4oCTIFRoZSB0YXNrIGlzIG5vdCBleGVjdXRlZCBhcyBhIHN1YmZvcm1cclxuICAvLyAgMCDigJMgVGhlIHRhc2sgaXMgZXhlY3V0ZWQgYnkgc2V0dGluZyB0aGUgZm9jdXMgb24gaXRcclxuICAvLyAgMSDigJMgVGhlIHN1YnRhc2sgaXMgZXhlY3V0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgLy8gIDIg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJlY2F1c2UgdGhlIEF1dG9tYXRpYyBSZWZyZXNoIHByb3BlcnR5XHJcbiAgLy8gICAgICBvciB0aGUgU3ViZm9ybSBSZWZyZXNoIGV2ZW50IGhhcyBiZWVuIHRyaWdnZXJlZFxyXG4gIHB1YmxpYyBNb2RlQXNQYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXNrIG1vZGUgaXMgJ0FzIFBhcmVudCcgd2UgbmVlZCB0byBjYXJlIG91dCBpdCBzcGVjaWZpY2FsbHlcclxuICBwdWJsaWMgVGFza1RyYW5zYWN0aW9uTWFuYWdlcjogVGFza1RyYW5zYWN0aW9uTWFuYWdlciA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkIG9uIHRoZSBjbGllbnQuXHJcbiAgLy8vIFJlbGV2YW50IG9ubHkgZm9yIG5vbi1vZmZsaW5lIHdpdGggbG9jYWwgZGF0YS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBFeGVjdXRlQ2xpZW50U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBleGVjdXRlcyBDb21tb25IYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gRm9yIHN1YmZvcm1zIHdlIGRvIG5vdCBleGVjdXRlIGl0J3MgUlAgaWYgdGhlIHBhcmVudCBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgLy8vIGl0J3MgQ29tbWFuZEhhbmRsZXJCZWZvcmUgbWV0aG9kLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEluQ29tbW9uSGFuZGxlckJlZm9yZVJQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0cmlldmUgYW5kIHJldHVybiBhIHNlcnZpY2Ugb2JqZWN0IGNvbnRhaW5pbmcgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIGRpZmZlcmVudCBpbiB0aGUgdGFzayBsZXZlbCBiZXR3ZWVuIGNvbm5lY3RlZCBhbmQgb2ZmbGluZSBzdGF0ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIF90YXNrU2VydmljZTogVGFza1NlcnZpY2VCYXNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlQmFzZSB7XHJcbiAgICBpZiAodGhpcy5fdGFza1NlcnZpY2UgPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFza1NlcnZpY2UgPSBuZXcgUmVtb3RlVGFza1NlcnZpY2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBjb21tYW5kcyBwcm9jZXNzb3IgZGVwZW5kaW5nIG9uIHRhc2sgdHlwZSBhbmQgc3RhdGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgZ2V0IENvbW1hbmRzUHJvY2Vzc29yKCk6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSB7XHJcbiAgICByZXR1cm4gQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0xvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCA9IG51bGw7XHJcbiAgcHVibGljIEFyZ3VtZW50c0xpc3Q6IEFyZ3VtZW50c0xpc3QgPSBudWxsOyAgICAgICAgICAgLy8gb2ZmLWxpbmUgZXhlY3V0aW9uIC0gdGFzayBhcmd1bWVudCwgdG8gZW5hYmxlIHRoZSB1cGRhdGUgb2YgZmllbGQgdmFsdWVzXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcGFyZW50IHRhc2sgb2YgdGhlIHN1YnRhc2sgYnkgdG9vbGtpdCB0cmVlIGluY2x1ZGUgdGhlIG1haW4gcHJvZ3JhbS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMb2dpY2FsU3R1ZGlvUGFyZW50VGFzaygpOiBUYXNrIHtcclxuICAgIGlmICh0aGlzLlN0dWRpb1BhcmVudFRhc2sgPT09IG51bGwgJiYgIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgdGhpcy5fY3RsSWR4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gPFRhc2s+dGhpcy5TdHVkaW9QYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IEtub3duVG9TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fa25vd25Ub1NlcnZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb25maXJtVXBkYXRlTm86IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAvLyBvbmx5IGZvciBjb25maXJtcyB1cGRhdGVcclxuICBwdWJsaWMgRGF0YVN5bmNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBVbmlxdWVTb3J0OiBVbmlxdWVUc2tTb3J0ID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdGhlIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgb24gdGhlIGRhdGEgdmlldyBtYW5hZ2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXQgVHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uKSB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgUmVmcmVzaE9uVmFyczogbnVtYmVyW10gPSBudWxsO1xyXG4gIHB1YmxpYyBEdlBvc0Rlc2NyaXB0b3I6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDtcclxuICBwdWJsaWMgU3ViVGFza3M6IFRhc2tzVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBFeHBUYWI6IEV4cFRhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgVXNlckV2dFRhYjogVXNlckV2ZW50c1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRGF0YXZpZXdIZWFkZXJzVGFibGU6IERhdGF2aWV3SGVhZGVycyA9IG51bGw7XHJcbiAgcHVibGljIEhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgX2Zvcm1zOiBGb3Jtc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwdWJsaWMgUHVibGljTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBzdWZmaXggd2FzIHBlcmZvcm1lZCBmb3IgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgVGFza1N1ZmZpeEV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgaWYgKHRoaXMudGFza0RlZmluaXRpb25JZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnRhc2tEZWZpbml0aW9uSWQgPSBuZXcgVGFza0RlZmluaXRpb25JZCh0aGlzLl9jdGxJZHgsIHRoaXMuUHJvZ3JhbUlzbiwgdGhpcy5UYXNrSXNuLCB0aGlzLl9pc1ByZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJldHJ1blZhbHVlRXhwOiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBTdWJmb3JtQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIFN0YXJ0UHJvZ0xldmVsOiBudW1iZXIgPSAwOyAgLy8gcmVjdXJzaXZlIGxldmVsIG9mIFwic3RhcnRQcm9nXCIgaW52b2NhdGlvbnNcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2lkbGVUaW1lclN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc3RhdGljIGdldCBJc0Jsb2NraW5nQmF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50OiBUYXNrKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBUYXNrKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChwYXJlbnQpKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEocGFyZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKCk7XHJcbiAgICB0aGlzLkRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMpO1xyXG4gICAgdGhpcy5fZmxvd01vbml0b3IgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG4gICAgdGhpcy5Db250ZXh0VGFzayA9IHRoaXM7XHJcbiAgICB0aGlzLl9kdkNhY2hlID0gbmV3IER2Q2FjaGUodGhpcyk7XHJcbiAgICB0aGlzLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXggPSB0cnVlO1xyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIgPSBuZXcgRGF0YXZpZXdNYW5hZ2VyKHRoaXMpO1xyXG4gICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIgPSBuZXcgVGFza1RyYW5zYWN0aW9uTWFuYWdlcih0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhVmlldy5Jbml0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEocGFyZW50OiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuUGF0aFBhcmVudFRhc2sgPSBwYXJlbnQ7XHJcbiAgICB0aGlzLl9wYXJlbnRUYXNrID0gcGFyZW50O1xyXG4gICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSBudWxsO1xyXG4gICAgdGhpcy5idWlsZFRhc2tQYXRoKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgQ3JlYXRlVGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICBsZXQgdGFzayA9ICBuZXcgVGFzaygpO1xyXG4gICAgdGFzay5Jbml0KCk7XHJcbiAgICByZXR1cm4gdGFzaztcclxuICB9XHJcblxyXG4gIC8vIElUYXNrIE1lbWJlcnNcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGVsbHMgd2hldGhlciB0aGUgdGFzayBpcyBhYm9ydGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNBYm9ydGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hYm9ydGluZztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRUYXNrUGF0aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Rhc2tQYXRoID0gbmV3IExpc3Q8VGFzaz4oKTtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrLl90YXNrUGF0aCAhPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFza1BhdGguQWRkUmFuZ2UodGhpcy5fcGFyZW50VGFzay5fdGFza1BhdGguR2V0RW51bWVyYXRvcigpKTtcclxuICAgIHRoaXMuX3Rhc2tQYXRoLnB1c2godGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0YXNrIGRhdGEgYnkgcGFyc2luZyB0aGUgeG1sIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ2RcIj5yZWZlcmVuY2UgdG8gTUdEYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVuaW5nVGFza0RldGFpbHNcIj5hZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9mIG9wZW5pbmcgdGFzazwvcGFyYW0+XHJcbiAgYXN5bmMgZmlsbERhdGEobWdkOiBNR0RhdGEsIG9wZW5pbmdUYXNrRGV0YWlsczogT3BlbmluZ1Rhc2tEZXRhaWxzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBJZiB0aGlzIHRhc2sgd2FzIG9wZW5lZCBieSBhbiBcIm9wZW4gd2luZG93XCIgY29tbWFuZCAtIGNvbm5lY3QgaGltIHRvIGl0cyBwYXJlbnRcclxuICAgIGlmICghc3VwZXIuaXNNYWluUHJvZygpKSB7XHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrID09PSBudWxsICYmIG9wZW5pbmdUYXNrRGV0YWlscy5DYWxsaW5nVGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudFRhc2sgPSA8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2s7XHJcbiAgICAgICAgdGhpcy5idWlsZFRhc2tQYXRoKCk7XHJcbiAgICAgICAgKDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5DYWxsaW5nVGFzaykuYWRkU3ViVGFzayh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5QYXRoUGFyZW50VGFzayA9PT0gbnVsbCAmJiBvcGVuaW5nVGFza0RldGFpbHMuUGF0aFBhcmVudFRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLlBhdGhQYXJlbnRUYXNrID0gPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLlBhdGhQYXJlbnRUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBmb3IgTUdfQUNUX1pPT00gYWN0aW9uIGVuYWJsZVxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKSB7XHJcbiAgICAgIHRoaXMuc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9tZ0RhdGEgPSBtZ2Q7XHJcbiAgICB0aGlzLmZpbGxBdHRyaWJ1dGVzKCk7XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhLmFkZFRhc2sodGhpcyk7XHJcblxyXG4gICAgbGV0IHBhcmVudEZvcm06IE1nRm9ybUJhc2UgPSAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbCkgPyB0aGlzLl9wYXJlbnRUYXNrLmdldEZvcm0oKSA6IG51bGw7XHJcblxyXG4gICAgd2hpbGUgKGF3YWl0IHRoaXMuaW5pdElubmVyT2JqZWN0cyhSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldE5leHRUYWcoKSwgcGFyZW50Rm9ybSkpIHtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuUHJlcGFyZVRyYW5zYWN0aW9uUHJvcGVydGllcyh0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24sIGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLkhhbmRsZVRyaWdnZXJUYXNrKCk7XHJcbiAgICB0aGlzLkhhbmRsZVByZXZpb3VzbHlBY3RpdmVUYXNrSWQoKTtcclxuXHJcbiAgICAvLyBTZXQgaXNTdWJmb3JtIGZsYWdcclxuICAgIHRoaXMuQ2hlY2tBbmRTZXRTdWJGb3JtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgIC8vIGdldCB0aGUgc3ViZm9ybSBjb250cm9sIGZyb20gdGhlIHBhcmVudCB0YXNrXHJcbiAgICAgIGxldCBzdWJGb3JtQ3RybDogTWdDb250cm9sID0gKDxNZ0Zvcm0+dGhpcy5nZXRQYXJlbnQoKS5nZXRGb3JtKCkpLmdldFN1YkZvcm1DdHJsRm9yVGFzayh0aGlzLl90YXNrVGFnKTtcclxuICAgICAgaWYgKHN1YkZvcm1DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgc3ViRm9ybUN0cmwuc2V0U3ViZm9ybVRhc2tJZCh0aGlzLl90YXNrVGFnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gdXBkYXRlIHRoZSBmb3JtIHdpdGggdGhlIHN1YmZvcm0gY29udHJvbCBmcm9tIHRoZSBwYXJlbnQgdGFza1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5zZXRTdWJGb3JtQ3RybChzdWJGb3JtQ3RybCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyBoYW5kbGUgdGhlIFByZXZpb3VzbHlBY3RpdmVUYXNrSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhbmRsZVByZXZpb3VzbHlBY3RpdmVUYXNrSWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLkdldENvbnRleHRUYXNrKCkgIT09IG51bGwgJiYgdGhpcy5fbWdEYXRhICE9PSB0aGlzLl9wYXJlbnRUYXNrLmdldE1HRGF0YSgpKVxyXG4gICAgICB0aGlzLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgPSAodGhpcy5fcGFyZW50VGFzay5HZXRDb250ZXh0VGFzaygpKS5nZXRUYXNrVGFnKCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsKVxyXG4gICAgICB0aGlzLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgPSB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaGFuZGxlIHRoZSB0cmlnZ2VyIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhbmRsZVRyaWdnZXJUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGE6IHN0cmluZyk6IHZvaWQ7XHJcbiAgRmlsbFRhc2tUYWJsZXMoKTogdm9pZDtcclxuICBGaWxsVGFza1RhYmxlcyh0YXNrVGFibGVzRGF0YT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgdGhpcy5GaWxsVGFza1RhYmxlc18wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsVGFza1RhYmxlc18wKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBhdHRyaWJ1dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsQXR0cmlidXRlcygpOiB2b2lkIHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIHN1cGVyLmZpbGxBdHRyaWJ1dGVzKHBhcnNlcik7XHJcblxyXG4gICAgICAvLyBRQ1IgIzc1OTkxMTogbXByZyBtdXN0IGJlbG9uZyB0byB0aGUgbWFpbiBhcHBsaWNhdGlvbidzIE1HRGF0YS5cclxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGl0IHdpbGwgbm90IGJlIGRpc2NhcmRlZCB1bnRpbCB0aGUgZW5kIG9mIGV4ZWN1dGlvbi5cclxuICAgICAgaWYgKHN1cGVyLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLl9tZ0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFRhc2suZmlsbEF0dHJpYnV0ZXMoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuO1xyXG4gICAgaXNUYWdQcm9jZXNzZWQgPSBzdXBlci5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZVN0cik7XHJcbiAgICBpZiAoIWlzVGFnUHJvY2Vzc2VkKSB7XHJcbiAgICAgIGlzVGFnUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVGUkVTSE9OOlxyXG4gICAgICAgICAgaWYgKCEodmFsdWVTdHIudHJpbSgpID09PSBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5TZXRSZWZyZXNoT25WYXJzKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIHRoaXMuTmFtZSA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TX0RFQzpcclxuICAgICAgICAgIGlmICghKHZhbHVlU3RyLnRyaW0oKSA9PT0gXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGVzY3JpcHRvcih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFTX0xPQ0FURTpcclxuICAgICAgICAgIGlmICgrdmFsdWVTdHIgPT0gMSlcclxuICAgICAgICAgICAgdGhpcy5oYXNMb2NhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0FTX1BBUkVOVDpcclxuICAgICAgICAgIGlmICgrdmFsdWVTdHIgPT0gMSlcclxuICAgICAgICAgICAgdGhpcy5Nb2RlQXNQYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfVU5JUVVFX1NPUlQ6XHJcbiAgICAgICAgICB0aGlzLlVuaXF1ZVNvcnQgPSA8VW5pcXVlVHNrU29ydD52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19JRDpcclxuICAgICAgICAgIHRoaXMuc2V0UmVtb3RlVHJhbnNhY3Rpb24odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BVQkxJQzpcclxuICAgICAgICAgIHRoaXMuUHVibGljTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX09GRkxJTkU6XHJcbiAgICAgICAgICB0aGlzLklzT2ZmbGluZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUkVUVVJOX1ZBTFVFX0VYUDpcclxuICAgICAgICAgIHRoaXMuUmV0cnVuVmFsdWVFeHAgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVVNfRklMRV9OQU1FOlxyXG4gICAgICAgICAgLy8gVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICd7MH0nXCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+cG9zc2libGUgdGFnIG5hbWUgLCBuYW1lIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIGFzeW5jIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudEZvcm06IE1nRm9ybUJhc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIHN3aXRjaCAoZm91bmRUYWdOYW1lKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQVEFCTEU6XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlbHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2hlbHBUYWIgPSBuZXcgSGVscHMoKTtcclxuXHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlbHBUYWIuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUjpcclxuICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC4uLlwiLCBmb3VuZFRhZ05hbWUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5EYXRhVmlldy5maWxsSGVhZGVyRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1A6XHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYi5maWxsRGF0YSh0aGlzLCAnVCcsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STTpcclxuICAgICAgICB0aGlzLkZvcm0gPSB0aGlzLkZvcm1Jbml0RGF0YShwYXJlbnRGb3JtKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVV9DT05URU5UOlxyXG4gICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiYXNzZW1ibGllc1wiOlxyXG4gICAgICAgIGxldCBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKCcvYXNzZW1ibGllcycsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STVM6XHJcbiAgICAgICAgdGhpcy5fZm9ybXMgPSBuZXcgRm9ybXNUYWJsZSh0aGlzLCBwYXJlbnRGb3JtKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybXMuZmlsbERhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0s6XHJcbiAgICAgICAgaWYgKHRoaXMuU3ViVGFza3MgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgICAgIGxldCBzdWJ0YXNrID0gbmV3IFRhc2sodGhpcyk7XHJcbiAgICAgICAgc3VidGFzay5Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YnRhc2spO1xyXG4gICAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX21nRGF0YTtcclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgICBtZ2QgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TUdEYXRhRm9yU3RhcnR1cFByb2dyYW0oKTtcclxuICAgICAgICBhd2FpdCBzdWJ0YXNrLmZpbGxEYXRhKG1nZCwgbmV3IE9wZW5pbmdUYXNrRGV0YWlscygpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTDpcclxuICAgICAgICBhd2FpdCBUYXNrLlByb2Nlc3NUYXNrVVJMKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLkV4cFRhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5FeHBUYWIgPSBuZXcgRXhwVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXhwXCIpO1xyXG4gICAgICAgIHRoaXMuRXhwVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1VTRVJfRVZFTlRTOlxyXG4gICAgICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuVXNlckV2dFRhYiA9IG5ldyBVc2VyRXZlbnRzVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gdXNlciBldmVudCB0YWJcIik7XHJcbiAgICAgICAgdGhpcy5Vc2VyRXZ0VGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0xJTktTOlxyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUgPSBuZXcgRGF0YXZpZXdIZWFkZXJzKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFM6XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMgPSBuZXcgU29ydENvbGxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLlJ1bnRpbWVTb3J0cy5maWxsRGF0YSggcGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS19UQUJMRVM6XHJcbiAgICAgICAgdGhpcy5GaWxsVGFza1RhYmxlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFOlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGVcIik7XHJcbiAgICAgICAgdGhpcy5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVEhBTkRMRVJTOlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byBldmVudGhhbmRsZXJzXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLkhhbmRsZXJzVGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLkhhbmRsZXJzVGFiID0gbmV3IEhhbmRsZXJzVGFibGUoKTtcclxuICAgICAgICB0aGlzLkhhbmRsZXJzVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgdGhpcy5hZGRFeHBIYW5kbGVyc1RvTUdEYXRhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKFwiL1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKSkge1xyXG4gICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIFRhc2suaW5pdElubmVyT2JqZWN0cyAuIEVudGVyIGNhc2UgZm9yIFwiICsgZm91bmRUYWdOYW1lKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIFJlY29tcHV0ZUZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjb21wdXRlVGFibGU6IFJlY29tcHV0ZVRhYmxlID0gbmV3IFJlY29tcHV0ZVRhYmxlKCk7XHJcbiAgICByZWNvbXB1dGVUYWJsZS5maWxsRGF0YV8xKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3LCB0aGlzLCBwYXJzZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsVGFza1RhYmxlc18xKCk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIC8vIEdldCB0aGUgZW5kIG9mIHRoZSB0YXNrIHRhYmxlIGVsZW1lbnRcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tfVEFCTEVTX0VORCwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgZW5kQ29udGV4dCkgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFLmxlbmd0aDtcclxuICAgIC8vIGdldCB0aGUgdGFzayB0YWJsZSB4bWwgc3RyaW5nXHJcbiAgICBsZXQgdGFza1RhYmxlc0RhdGE6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICB0aGlzLkZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhKTtcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBoYW5kbGVycyB0cmlnZ2VyZWQgYnkgZXhwcmVzc2lvbnMgdG8gbWdkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZEV4cEhhbmRsZXJzVG9NR0RhdGEoKTogdm9pZCB7XHJcbiAgICBsZXQgaWR4OiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5IYW5kbGVyc1RhYi5nZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gdGhpcy5IYW5kbGVyc1RhYi5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICBsZXQgZXZ0OiBFdmVudCA9IGhhbmRsZXIuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiB8fFxyXG4gICAgICAgIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OKSkge1xyXG4gICAgICAgIHRoaXMuX21nRGF0YS5hZGRFeHBIYW5kbGVyKGhhbmRsZXIsIGlkeCk7XHJcbiAgICAgICAgaWR4Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJlZnJlc2ggb24gdmFyaWFibGUgbGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIFNldFJlZnJlc2hPblZhcnModmFyaWFibGVzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBzdHJUb2s6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZSh2YXJpYWJsZXMsIFwiLFwiKTtcclxuICAgIGxldCBmbGROdW06IG51bWJlcjtcclxuICAgIGxldCBpbnRWYWxzID0gbmV3IExpc3Q8bnVtYmVyPigpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHJUb2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgZmxkTnVtID0gTk51bWJlci5QYXJzZShzdHJUb2tbaV0pO1xyXG4gICAgICBpbnRWYWxzLnB1c2goZmxkTnVtKTtcclxuICAgIH1cclxuICAgIHRoaXMuUmVmcmVzaE9uVmFycyA9IG5ldyBBcnJheShpbnRWYWxzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgaW50VmFscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmbGROdW0gPSBpbnRWYWxzLmdldF9JdGVtKGkpO1xyXG4gICAgICB0aGlzLlJlZnJlc2hPblZhcnNbaV0gPSBmbGROdW07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBEYXRhU3luY2VkIHByb3BlcnR5IG9mIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldERhdGFTeW5jZWQoc3luY2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFTeW5jZWQgPSBzeW5jZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgZmllbGQgYnkgaXRzIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZmllbGQgYnkgaXRzIG5hbWU8L3JldHVybnM+XHJcbiAgZ2V0RmllbGQoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG4gICAgcmV0dXJuICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RmllbGRCeU5hbWUoZmxkTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGFuIGV4cHJlc3Npb24gYnkgaXRzIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+aWQgb2YgdGhlIGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIGdldEV4cEJ5SWQoaWQ6IG51bWJlcik6IEV4cHJlc3Npb24ge1xyXG4gICAgaWYgKHRoaXMuRXhwVGFiICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5FeHBUYWIuZ2V0RXhwQnlJZChpZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFRhc2suR2V0RXhwQnlJZCgpOiBubyBleHByZXNzaW9uIHRhYmxlXCIpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRFeHBPYmplY3RCeUlkKGlkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RXhwQnlJZChpZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogYW55IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCBleHBCeUlkOiBFeHByZXNzaW9uID0gdGhpcy5nZXRFeHBCeUlkKGV4cElkKTtcclxuICAgICAgRGVidWcuQXNzZXJ0KGV4cEJ5SWQgIT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSBleHBCeUlkLkdldFN0b3JhZ2VBdHRyaWJ1dGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGN1bGF0ZSBleHByZXNpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+VGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1R5cGVcIj5UaGUgZXhwZWN0ZWQgcmVzdWx0IHR5cGUuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW5ndGhcIj5UaGUgZXhwZWN0ZWQgbGVuZ3RoIG9mIHRoZSByZXN1bHQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVVuaWNvZGVcIj5EZW5vdGVzIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBhIHVuaWNvZGUgc3RyaW5nLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzQ2VsbFR5cGVcIj5Ob3QgdXNlZC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgQ2FsY3VsYXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGV4cElkID4gMCkge1xyXG4gICAgICBsZXQgZXhwQnlJZDogRXhwcmVzc2lvbiA9IHRoaXMuZ2V0RXhwQnlJZChleHBJZCk7XHJcbiAgICAgIERlYnVnLkFzc2VydChleHBCeUlkICE9PSBudWxsKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgZXhwQnlJZC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKHJlc1R5cGUsIGxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluc2VydCBSZWNvcmQgVGFibGUgdG8gZGF0YXZpZXcgb2YgdGhlIHRhc2sgaWYgaXQgY2FtZSBhZnRlciBjbG9zaW5nIHRhc2sgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpbnNlcnRSZWNvcmRUYWJsZShpbnZhbGlkYXRlOiBib29sZWFuLCBwYXJzZXI6IFhtbFBhcnNlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gY2hlY2sgY2FjaGUgbG9naWMgb25seSBmb3Igc3ViLWZvcm1zXHJcbiAgICBpZiAoYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgIGxldCBmaXJzdFRpbWU6IGJvb2xlYW4gPSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldEZpcnN0RHYoKTtcclxuICAgICAgLy8gaWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHRhc2sgZ2V0IGR2IG9yIHRoZSBvbGQgZHYgaXMgbm90IGludmFsaWRhdGVkIG9yXHJcbiAgICAgIC8vIHRoZSBvbGQgZHYgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmlyc3QgcmVjb3JkIGRvIG5vdCBwdXQgaW4gY2FjaGVcclxuICAgICAgaWYgKCFmaXJzdFRpbWUgJiYgaW52YWxpZGF0ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNMb2NhdGUpIHtcclxuICAgICAgICAgIC8vIHRoZSBvbGQgZC52IHdhcyBub3QgdXBkYXRlZCBwdXQgaXQgaW4gY2FjaGUgKGl0cyByZXBsaWNhdGUpXHJcbiAgICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5JbmNsdWRlc0ZpcnN0KCkpIHtcclxuICAgICAgICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSlcclxuICAgICAgICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB0aGlzLmxvY2F0ZVB1dEluQ2FjaGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcGFyc2UgdGhlIG5ldyBkYXRhdmlld1xyXG4gICAgYXdhaXQgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5maWxsRGF0YShwYXJzZXIpO1xyXG5cclxuICAgIGlmIChpbnZhbGlkYXRlKVxyXG4gICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldENoYW5nZWQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaGFuZGxlcnMgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEhhbmRsZXJzVGFiKCk6IEhhbmRsZXJzVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuSGFuZGxlcnNUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5Jc0FmdGVyUmV0cnlCZWZvcmVCdWlsZFhNTCA9IHRoaXMuZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgaWYgKHRoaXMuS25vd25Ub1NlcnZlciAmJiAhdGhpcy5Jc09mZmxpbmUpIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSyk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVEFTS0lEICsgXCI9XFxcIlwiICsgdGhpcy5nZXRUYXNrVGFnKCkgKyBcIlxcXCJcIik7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX01BSU5MRVZFTCArIFwiPVxcXCJcIiArIHRoaXMuZ2V0TWFpbkxldmVsKCkgKyBcIlxcXCJcIik7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmJ1aWxkWE1MKG1lc3NhZ2UpO1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9IG51bGwgJiYgdGhpcy5Gb3JtLk9wZW5lZClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgoPE1nRm9ybT50aGlzLkZvcm0pLkdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCkpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIlxcbiAgIDwvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0sgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIHJhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIFVzZXJSYW5nZXM6IExpc3Q8VXNlclJhbmdlPiwgbG9jYXRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGZsZDogRmllbGQ7XHJcbiAgICBsZXQgY2VsbEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBTdG9yYWdlQXR0cmlidXRlLlNLSVA7XHJcbiAgICBsZXQgdG9CYXNlNjQ6IGJvb2xlYW4gPSAoRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpIDw9IDEpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IFVzZXJSYW5nZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfUk5HKTtcclxuXHJcbiAgICAgIGxldCBybmc6IFVzZXJSYW5nZSA9IFVzZXJSYW5nZXMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEICsgXCI9XFxcIlwiICsgcm5nLnZlZUlkeCArIFwiXFxcIlwiKTtcclxuXHJcbiAgICAgIGZsZCA9IDxGaWVsZD50aGlzLkRhdGFWaWV3LmdldEZpZWxkKDxudW1iZXI+cm5nLnZlZUlkeCAtIDEpO1xyXG4gICAgICBsZXQgZmxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAocm5nLm51bGxNaW4pXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5OVUxMX01JTl9STkcgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAoIXJuZy5kaXNjYXJkTWluICYmIHJuZy5taW4gIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IFJlY29yZFV0aWxzLml0ZW1WYWxUb1hNTChybmcubWluLCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUlOX1JORyArIFwiPVxcXCJcIiArIHZhbCArIFwiXFxcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJuZy5udWxsTWF4KVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTlVMTF9NQVhfUk5HICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKCFybmcuZGlzY2FyZE1heCAmJiBybmcubWF4ICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5pdGVtVmFsVG9YTUwocm5nLm1heCwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1BWF9STkcgKyBcIj1cXFwiXCIgKyB2YWwgKyBcIlxcXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYXRlKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfTE9DQVRFUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgZWxzZVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfUkFOR0VTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSB1c2VyIGFkZGVkIHNvcnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFhNTEZvclNvcnRzKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlVzZXJTb3J0cyAhPSBudWxsICYmIHRoaXMuVXNlclNvcnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuVXNlclNvcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICAgICAgbGV0IHNydDogU29ydCA9IHRoaXMuVXNlclNvcnRzLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuU09SVCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCArIFwiPVxcXCJcIiArIHNydC5mbGRJZHggKyBcIlxcXCJcIik7XHJcbiAgICAgICAgaWYgKHNydC5kaXIpXHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRElSICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuVXNlclNvcnRzLkNsZWFyKCk7XHJcbiAgICAgIHRoaXMuVXNlclNvcnRzID0gbnVsbDtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgdXNlciBldmVudCBieSBpdHMgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgZXZlbnQ8L3BhcmFtPlxyXG4gIGdldFVzZXJFdmVudChpZHg6IG51bWJlcik6IEV2ZW50IHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLlVzZXJFdnRUYWIgIT09IG51bGwpO1xyXG4gICAgbGV0IHJldEV2ZW50OiBFdmVudCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5Vc2VyRXZ0VGFiICE9PSBudWxsKVxyXG4gICAgICByZXRFdmVudCA9IHRoaXMuVXNlckV2dFRhYi5nZXRFdmVudChpZHgpO1xyXG4gICAgcmV0dXJuIHJldEV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBTZXQgdGhlIE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnIG9uIHRoZSBmb3JtLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldE1vdmVUb0ZpcnN0Q29udHJvbChtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChtb3ZlVG9GaXJzdENvbnRyb2wgfHwgIXRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgICAvLyB0aGlzIGlzIGEgY2FsbCBkZXN0aW5hdGlvbi8gc3ViZm9ybSBjYWxsXHJcbiAgICAgICAgLy8gV2UgcGVyZm9ybSBtb3ZlIHRvIGZpcnN0IGNvbnRyb2wgb25seSB0byBvbmUgY29udHJvbCBmb3JtIHBlciByZXF1ZXN0IC0gdGhlIGZpcnN0IG9uZSB0aGF0IHdlIHJlY2VpdmVcclxuICAgICAgICBsZXQgYWxyZWFkeU1vdmVkOiBib29sZWFuID0gKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5hbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgIGlmICghYWxyZWFkeU1vdmVkKVxyXG4gICAgICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5Nb3ZlZFRvRmlyc3RDb250cm9sID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0YXJ0IHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgYW5kIGl0cyBzdWJUYXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgU3RhcnQobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8SVRhc2s+IHtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5faXNTdGFydGVkKSB7XHJcbiAgICAgIHRoaXMuX2lzU3RhcnRlZCA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLkluaXRpYWxpemVFeGVjdXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSB0cnVlO1xyXG4gICAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQgPSBhd2FpdCB0aGlzLlNldHVwKCk7XHJcblxyXG4gICAgICAvLyB0YXNrIGluaXRpYWxpemF0aW9uIGZhaWxlZCAtIGNsb3NlIHRoZSB0YXNrXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICB0aGlzLl9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKCk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhmYWxzZSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkVuYWJsZUFjdGlvbnMoKTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuSW5pdGlhbGl6ZUZvcm0obW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiAhdGhpcy5faXNNYWluUHJnKVxyXG4gICAgICAgIG5vbkludGVyYWN0aXZlVGFzayA9IHRoaXM7XHJcblxyXG4gICAgICB0aGlzLkRhdGFWaWV3V2FzUmV0cmlldmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIFFDUiAjIDE2NzMzMiA6XHJcbiAgICAgIC8vIElmIHdlIHN0YXJ0IHBvcmdyYW0gUDEsIGZvciB3aGljaCBNUCBpcyBzdGFydGVkLiBNUCBpcyBjYWxsaW5nIFAyIGZyb20gaXQncyBUUC4gU28sIHdoZW4gaXQgY2FsbHMgUDJcclxuICAgICAgLy8gYWdhaW4gaXQgc3RhcnRzIE1QLCBidXQgZnJvbSBNUCBpdCBhZ2FpbiBzdGFydHMgUDEuIGFzIFAxIGlzIGluIGl0J3Mgc3VidGFzayBhbmQgaXQgaXMgbm90IHlldCBzdGFydGVkLlxyXG4gICAgICAvLyBTbywgaXQncyB3cm9uZyB0byBzdGFydCBQMSB3aGlsZSBleGVjdXRpbmcgVFAgb2YgTVAuIEl0IHNob3VsZCBleGVjdXRlIG9ubHkgUDIuXHJcbiAgICAgIC8vIFNvLCBpbiBvcmRlciB0byBhdm9pZCB0aGlzLCBzZXQgTVAncyBzdWJ0YXNrcyB0byBudWxsIGJlZm9yZSBlbnRlcmluZyBUUC4gYW5kIGFnYWluIHJlc3RvcmUgaXQgYmFjaywgaW4gb3JkZXIgdG9cclxuICAgICAgLy8gc3RhcnQgUDEgcHJvcGVybHkuXHJcbiAgICAgIGxldCBzdWJUYXNrczogVGFza3NUYWJsZSA9IHRoaXMuU3ViVGFza3M7XHJcbiAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLlN1YlRhc2tzID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuU3ViVGFza3MgPSBzdWJUYXNrcztcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGlmICh0aGlzLl9hYm9ydGluZylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGxldCBkYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkZpcnN0Q2h1bmspO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgdGhpcy5SZXN1bWVTdWJmb3JtTGF5b3V0KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG5vbkludGVyYWN0aXZlVGFzayA9IGF3YWl0IHRoaXMuU3RhcnRTdWJUYXNrcyhtb3ZlVG9GaXJzdENvbnRyb2wsIG5vbkludGVyYWN0aXZlVGFzaywgY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG4gICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5pdGlhbGl6ZSBleGVjdXRpb24tcmVsYXRlZCBzdHVmZi5cclxuICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBPTkxZIGZyb20gVGFzay5TdGFydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0aWFsaXplRXhlY3V0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gY3VycmVudGx5IHRoZSBpcyBubyBjb250cm9sIGV4ZWN1dGluZyB0aGVyZSBmb3IgdGhlXHJcbiAgICAvLyBjdXJyZW50IGV4ZWN1dGluZyBjb250cm9sIGluZGV4IGlzIHNldCB0byAtMVxyXG4gICAgc3VwZXIuc2V0QnJrTGV2ZWwoQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX1JFQ19NQUlOLCAtMSk7XHJcbiAgICB0aGlzLl9maXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTsgICAgICAvLyBXaGlsZSBzdGFydGluZyBhIFRhc2ssIHNldCBmaXJzdFJlY29yZEN5Y2xlID0gVFJVRVxyXG5cclxuICAgIHRoaXMuX2N1cnJTdGFydFByb2dMZXZlbCA9ICgodGhpcy5Jc1N1YkZvcm0gJiYgKDxNZ0Zvcm0+dGhpcy5nZXRQYXJlbnQoKS5nZXRGb3JtKCkpLmFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCkpXHJcbiAgICAgID8gKDxUYXNrPnRoaXMuZ2V0UGFyZW50KCkpLl9jdXJyU3RhcnRQcm9nTGV2ZWxcclxuICAgICAgOiBUYXNrLlN0YXJ0UHJvZ0xldmVsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdGlhbGl6ZSBmb3JtLXJlbGF0ZWQgc3R1ZmZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEluaXRpYWxpemVGb3JtKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIHNldCBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZyBvbiB0aGUgZm9ybS5cclxuICAgICAgdGhpcy5TZXRNb3ZlVG9GaXJzdENvbnRyb2wobW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAgIC8vIHRoZSBJbml0Rm9ybSBtaWdodCBjYXVzZSBleGVjdXRpb24gb2YgY29kZSAodmFyaWFibGUgY2hhbmdlKSBzbyB3ZSBzaG91bGQgZG8gaXQgd2l0aCBhIG5ldyBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlUGFyYW1zID0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5HZXRSb3V0ZVBhcmFtcygpO1xyXG5cclxuICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY3VycmVudCB0YXNrJ3MgZm9ybS5cclxuICAgICAgYXdhaXQgdGhpcy5Jbml0Rm9ybSgpO1xyXG5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgdGhpcy5nZXRNR0RhdGEoKS5TdGFydFRpbWVycygpO1xyXG4gICAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUmV0dXJuUmVzdWx0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHN0YXJ0IHN1YiB0YXNrcyBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9uSW50ZXJhY3RpdmVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgU3RhcnRTdWJUYXNrcyhtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIG5vbkludGVyYWN0aXZlVGFzazogVGFzaywgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBsZXQgdG1wTm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrID0gIDxUYXNrPiBhd2FpdCB0YXNrLlN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbCwgY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG4gICAgICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2sgPT09IG51bGwpXHJcbiAgICAgICAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSB0bXBOb25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgICAgICAgZWxzZSBpZiAodG1wTm9uSW50ZXJhY3RpdmVUYXNrICE9PSBudWxsKVxyXG4gICAgICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlLCBcIm1vcmUgdGhhbiAxIG5vbiBpbnRlcmFjdGl2ZSBpbiB0YXNrLnN0YXJ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFzaztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgRW5hYmxlQWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBhY3RMaXN0OiBudW1iZXJbXSA9IEFjdGlvbk1hbmFnZXIuYWN0RW5hYmxlZDtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGVMaXN0KGFjdExpc3QsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQsIHRydWUpO1xyXG5cclxuXHJcbiAgICAvLyBlbmFibGUgYWN0aW9ucyBkZXBlbmRpbmcgb24gdGFzayBwcm9wZXJ0aWVzXHJcbiAgICBhd2FpdCB0aGlzLmVuYWJsZU1vZGVzKCk7XHJcbiAgICBpZiAoYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OLCBmYWxzZSkpIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNULCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZW5hYmxlUHJpbnRkYXRhOiBib29sZWFuID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJJTlRfREFUQSwgZmFsc2UpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUFJJTlRfREFUQSwgZW5hYmxlUHJpbnRkYXRhKTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNob3cgZXJyb3Igb24gdGFzaydzIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIGFzeW5jIFNob3dFcnJvcih0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtbHNUcmFuc1RleHQ6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS50cmFuc2xhdGUodGV4dCk7XHJcbiAgICBsZXQgbWxzVHJhbnNUaXRsZTogc3RyaW5nID0gTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLnRyYW5zbGF0ZShDb25zdEludGVyZmFjZS5FUlJPUl9TVFJJTkcpO1xyXG4gICAgLy8gbWxzID8/P1xyXG4gICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1sc1RyYW5zVGl0bGUsIG1sc1RyYW5zVGV4dCwgU3R5bGVzLk1TR0JPWF9JQ09OX0VSUk9SIHwgU3R5bGVzLk1TR0JPWF9CVVRUT05fT0spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjaGVjayB0aGUgcmVzdWx0LiBJZiBmYWlsZWQgLSBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlYm94IGFuZCBlbmQgdGhlIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc3VsdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBFbmRUYXNrT25FcnJvcihyZXN1bHQ6IFJldHVyblJlc3VsdCwgZGlzcGxheUVycm9yOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXJlc3VsdC5TdWNjZXNzICYmICF0aGlzLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICBpZiAodGhpcy5JblN0YXJ0UHJvY2Vzcykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5kVGFzayhmYWxzZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICBpZiAoZGlzcGxheUVycm9yKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5TaG93RXJyb3IocmVzdWx0LkVycm9yRGVzY3JpcHRpb24pO1xyXG4gICAgICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoZGlzcGxheUVycm9yKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5TaG93RXJyb3IocmVzdWx0LkVycm9yRGVzY3JpcHRpb24pO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgU2V0dXAoKTogUHJvbWlzZTxSZXR1cm5SZXN1bHQ+IHtcclxuICAgIGxldCByZXN1bHQ6IFJldHVyblJlc3VsdDtcclxuICAgIHRoaXMuVGFza1NlcnZpY2UuSW5pdFRhc2tQcmVmaXhFeGVjdXRlZEZsYWcodGhpcyk7XHJcbiAgICB0aGlzLlRhc2tTdWZmaXhFeGVjdXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIFRhc2tTZXJ2aWNlQmFzZS5DcmVhdGVGaXJzdFJlY29yZCh0aGlzKTtcclxuXHJcbiAgICAvLyBpbml0IGRhdGEgdmlld1xyXG4gICAgLy8gTm90ZTogRXZlbiBpZiB0aGUgcmVzdWx0SW5pdE1vZGUgaXMgZmFsc2Ugd2UgTVVTVCBpbml0IHRoZSBkYXRhIHZpZXdcclxuICAgIGxldCBkYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkluaXQpO1xyXG4gICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG5cclxuICAgIC8vIG5lZWQgdG8gY2hlY2sgcmVzdWx0KG9mIHRoZSBkYXRhIHZpZXcgaW5pdCBhbmQgaWYgbm90IHN1Y2Nlc3MgdGhlbiByZXR1cm4gdGhpcyBlcnJvclxyXG4gICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICBpZiAocmVzdWx0LlN1Y2Nlc3MpIHtcclxuICAgICAgLy8gRXhlY3V0ZSB0aGUgY29tbWFuZCwgd2hvc2UgZXhlY3V0aW9uIHdhcyBkZWxheWVkIGJlY3Vhc2UgdGFzayB3YXMgbm90IHN0YXJ0ZWQuIFNvIEV4Y3V0ZSB0aG9zZSBjb21tYW5kcyBhZnRlciB0YXNrIHN0YXJ0ZWQuXHJcbiAgICAgIGxldCBjb21tYW5kczogTGlzdDxJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kPiA9IEdsb2JhbENvbW1hbmRzTWFuYWdlci5JbnN0YW5jZS5nZXRDb21tYW5kc0V4ZWN1dGVkQWZ0ZXJUYXNrU3RhcnRlZCgpO1xyXG5cclxuICAgICAgZm9yIChsZXQgY21kSWR4OiBudW1iZXIgPSAwOyBjbWRJZHggPCBjb21tYW5kcy5sZW5ndGg7IGNtZElkeCsrKSB7XHJcbiAgICAgICAgbGV0IGNvbW1hbmQ6IElDbGllbnRUYXJnZXRlZENvbW1hbmQgPSAoY29tbWFuZHMuZ2V0X0l0ZW0oY21kSWR4KSk7XHJcbiAgICAgICAgaWYgKGNvbW1hbmQuVGFza1RhZyA9PT0gdGhpcy5nZXRUYXNrVGFnKCkpIHtcclxuICAgICAgICAgIGF3YWl0IGNvbW1hbmQuRXhlY3V0ZShudWxsKTtcclxuICAgICAgICAgIEdsb2JhbENvbW1hbmRzTWFuYWdlci5JbnN0YW5jZS5yZW1vdmVDb21tYW5kc0V4ZWN1dGVkQWZ0ZXJUYXNrU3RhcnRlZChjb21tYW5kKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRhdGFWaWV3Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5QcmVwYXJlKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLlRhc2tTZXJ2aWNlLlByZXBhcmVUYXNrKHRoaXMpO1xyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuRW5kVGFza09uRXJyb3IocmVzdWx0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LlN1Y2Nlc3MpIHtcclxuICAgICAgZGF0YVZpZXdDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkluaXREYXRhQ29udHJvbFZpZXdzKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIGZpcnN0IHJlY29yZCBwcmVmaXggJiBzdWZmaXhcclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIG9ubHkgZm9yIGNvbm5lY3RlZCB0YXNrLlxyXG4gIC8vLyAgIEZvciBvZmZsaW5lIHRhc2sgd2UgcnVuIEVudGVyRmlyc3RSZWNvcmQgZnVuY3Rpb24uIFRoZXJlIHdlIGV4ZWN1dGUgUlAgYW5kIG9wZW4gc3ViZm9ybXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBkb0ZpcnN0UmVjb3JkQ3ljbGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuX2lzTWFpblByZykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICB0aGlzLlN1YmZvcm1FeGVjTW9kZSA9IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaCh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgdGhpcy5Jc1N1YkZvcm0pO1xyXG5cclxuICAgICAgaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgICAgIGlmIChzdWJUYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgKDxNZ0Zvcm0+c3ViVGFzay5nZXRGb3JtKCkpLklnbm9yZUZpcnN0UmVjb3JkQ3ljbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc3ViVGFzay5kb0ZpcnN0UmVjb3JkQ3ljbGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLlN1YmZvcm1FeGVjTW9kZSA9IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVM7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrIGlzIGEgc3ViIGZvcm0gYnkgaXRzIG1nZCBkZWZpbml0aW9uICh1c2VkIG9ubHkgd2hpbGUgaW5pdGlhdGluZyB0YXNrIGZvciBzZXR0aW5nIGlzU3ViZm9ybSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQ2hlY2tBbmRTZXRTdWJGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5Jc1N1YkZvcm0gPSAoIXN1cGVyLmlzTWFpblByb2coKSAmJiB0aGlzICE9PSB0aGlzLl9tZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIElzUm91dGUoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuUm91dGVyUGF0aCAhPSBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdG9wIHRoZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2s7XHJcbiAgICBpZiAodGhpcy5fYWJvcnRpbmcpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzaygwKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRhc2suc2V0RGVzdGluYXRpb25TdWJmb3JtKHRoaXMuX2Rlc3RpbmF0aW9uU3ViZm9ybSk7XHJcbiAgICAgICAgYXdhaXQgdGFzay5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzTWFpblByZylcclxuICAgICAgdGhpcy5fYWJvcnRpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgdGFzayBhbmQgaXRzIHBhcmVudCBhcmUgZnJvbSBkaWZmZXJlbnQgTUdEQVRBIG9iamVjdHMgdGhlbiBkaXNjb25uZWN0XHJcbiAgICAvLyB0aGVtIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhpcyB0YXNrIGZyb20gaXRzIHBhcmVudFxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYXNrLnJlbW92ZVN1YlRhc2sodGhpcyk7XHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBvbGRUaW1lcnM6IExpc3Q8bnVtYmVyPiA9IG5ldyBMaXN0PG51bWJlcj4oKSwgbmV3VGltZXJzID0gbmV3IExpc3Q8bnVtYmVyPigpO1xyXG4gICAgICAgIGxldCBtZ2QgPSB0aGlzLmdldE1HRGF0YSgpO1xyXG5cclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgb2xkVGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QucmVtb3ZlVGltZXJIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIG1nZC5yZW1vdmVFeHByZXNzaW9uSGFuZGxlcih0aGlzKTtcclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgbmV3VGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QuY2hhbmdlVGltZXJzKG9sZFRpbWVycywgbmV3VGltZXJzKTtcclxuXHJcbiAgICAgICAgbWdkLnJlbW92ZVRhc2sodGhpcyk7XHJcbiAgICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQWJvcnRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgIC8vIElmIHRoZSB0YXNrIGdvdCBjbG9zZWQgZHVlIHRvIGEgY2xpY2sgb24gc2FtZSB0YXNrLCB0aGVuIHNldCBDdXJyZW50Q2xpY2tlZEN0cmwgdG8gbnVsbFxyXG4gICAgaWYgKHRoaXMuZ2V0Q2xpY2tlZENvbnRyb2woKSAhPSBudWxsKVxyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLkZvcm0gIT0gbnVsbClcclxuICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5yZW1vdmVSZWZzVG9DdHJscygpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICBsZXQgc3ViRm9ybSA9IDxNZ0NvbnRyb2w+dGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgICBzdWJGb3JtLnNldFN1YmZvcm1UYXNrSWQobnVsbCk7XHJcbiAgICAgIHN1YkZvcm0uaW5pdFN1YmZvcm1UYXNrKCk7XHJcblxyXG4gICAgICBpZiAoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpID09PSB0aGlzKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5zZXRMYXN0Rm9jdXNlZFRhc2sodGhpcy5fcGFyZW50VGFzayk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzMxMDExMy4gSWYgdGhlIHN1YmZvcm0gdGFzayBmb3Igd2FzIG5vdCBsb2FkZWQgeWV0LCBkbyBub3QgcmVmcmVzaCBpdC5cclxuICAgICAgaWYgKHN1YkZvcm0uU3ViZm9ybUxvYWRlZClcclxuICAgICAgICBhd2FpdCAoc3ViRm9ybS5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2xlYXJEYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkNsZWFyKTtcclxuICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY2xlYXJEYXRhVmlld0NvbW1hbmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBhYm9ydCB0aGUgTWdEYXRhIHRvIHdoaWNoIHRoZSB0YXNrIGJlbG9uZ3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFib3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRNR0RhdGEoKS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBoYXMgc3ViLXRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBoYXNTdWJUYXNrcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlN1YlRhc2tzICE9PSBudWxsICYmIHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBIG51bWJlciwgMS0yNCwgdGhlIGN1cnJlbnQgdGFzaydzIGRlcHRoIGluIHRoZSB0YXNrIGV4ZWN1dGlvbiBoaWVyYXJjaHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZGVwdGggb2YgdGhlIHRhc2ssIDEgaWYgY2FsbGVkIGZyb20gdGhlIHJvb3QgdGFzazwvcmV0dXJucz5cclxuICBnZXRUYXNrRGVwdGgoYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoYnlQYXJlbnRPcmRlcilcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcblxyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSAoPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcbiAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBoYW5kbGVyIGFkZCBpdCB0byB0aGUgcGF0aFxyXG4gICAgaWYgKHRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IENvbnN0SW50ZXJmYWNlLlRPUF9MRVZFTF9DT05UQUlORVIpXHJcbiAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xyXG5cclxuICAgIHJldHVybiBkZXB0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgZ2V0VGFza0RlcHRoIHJlY3Vyc2lvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnlQYXJlbnRPcmRlclwiPmlmIHRydWUsIHdlIHRyYXZlbCB0aGUgcGFyZW50cywgb3RoZXJ3aXNlIHdlIHRyYXZlbCB0aGUgdHJpZ2dlcmluZyB0YXNrczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICBpZiAodG1wVGFzayA9PSBudWxsIHx8IGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8qIGlmIHRoZSBjdGxJZHggb2YgdGhlIGN1cnJlbnQgdGFzayBhbmQgdGhlIHBhcmVudCBhcmUgZGlmZmVyZW50LCAgICovXHJcbiAgICAgICAgLyogdGhhdCBpcyB0aGUgY3VycmVudCB0YXNrIGlzIGZyb20gYSBjb21wb25lbnQsIGFkZCB0aGUgY29tcG9uZW50J3MgKi9cclxuICAgICAgICAvKiBNYWluIFByZyBhcyB3ZWxsLiAqL1xyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRoaXMuX3BhcmVudFRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICByZXR1cm4gMiArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgICByZXR1cm4gMSArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgfVxyXG4gICAgcmV0dXJuIDEgKyAodG1wVGFzaykuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGFuY2VzdG9yIG9mIHRoZSBUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj5vZiB0aGUgYW5jZXN0b3IgdGFzazwvcGFyYW0+XHJcbiAgR2V0VGFza0FuY2VzdG9yKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbjogbnVtYmVyKTogSVRhc2sge1xyXG4gICAgbGV0IHJldFRhc2s6IElUYXNrID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZ2VuZXJhdGlvbiA9PT0gMClcclxuICAgICAgcmV0VGFzayA9IHRoaXM7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICAgIGlmICh0bXBUYXNrID09PSBudWxsKVxyXG4gICAgICAgIHRtcFRhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gICAgICBpZiAodG1wVGFzayAhPT0gbnVsbClcclxuICAgICAgICByZXRUYXNrID0gdG1wVGFzay5nZXRUYXNrQW5jZXN0b3JfKC0tZ2VuZXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGFzayBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRUYXNrRGVwdGgoKTogbnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmZiB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCB0YXNrIGNvbnRhaW5zIHRoZSB0YXNrIHBhc3NlZCBhcyBwYXJhbWV0ZXI8L3JldHVybnM+XHJcbiAgcGF0aENvbnRhaW5zKHRhc2s6IFRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1BhdGguQ29udGFpbnMoPFRhc2s+dGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgY29udGV4dCB0YXNrIG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb250ZXh0XCI+dGhlIG5ldyBjb250ZXh0IHRhc2sgb2YgdGhlIGN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgU2V0Q29udGV4dFRhc2soY29udGV4dDogVGFza0Jhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSA8VGFzaz5jb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHRhc2sgd2hpY2ggaXMgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldENvbnRleHRUYXNrKCk6IElUYXNrIHtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpO1xyXG5cclxuICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzXHJcbiAgICAgIHx8IGN1cnJSZWMgIT09IG51bGwgJiYgKGN1cnJSZWMuSW5Db21wdXRlIHx8IGN1cnJSZWMuSW5SZWNvbXB1dGUpXHJcbiAgICAgIHx8IHRoaXMuRm9ybSAhPT0gbnVsbCAmJiB0aGlzLkZvcm0uaW5SZWZyZXNoRGlzcGxheSgpKVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuXHJcbiAgICByZXR1cm4gdGhpcy5Db250ZXh0VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIgd2hpY2ggY3JlYXRlZCBtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VHJpZ2dlcmluZ1Rhc2soKTogVGFzayB7XHJcbiAgICAvLyBUaGlzIGlzIGEgc2VtaSBwYXRjaCB3aGljaCBmaXhlcyBwcm9ibGVtcyBzdWNoIGFzIHRoZSBvbmVzIGluIFFDUiAjMjk2NDI4XHJcbiAgICAvLyBXaGVuIGEgbW9kYWwgdGFzayBnZXRzIG9wZW5lZCwgaXQgbWlnaHQgc2V0IGl0cyB0cmlnZ2VyaW5nIHRhc2sgdG8gYSB0YXNrXHJcbiAgICAvLyB3aG9zZSAnYWJvcnQnIGNvbW1hbmQgYXJyaXZlZCBhbmQgaXMgcGVuZGluZyBmb3IgZXhlY3V0aW9uLiBVbmRlciB0aGVzZVxyXG4gICAgLy8gY2lyY3Vtc3RhbmNlcywgd2UgbXVzdCBjaGVjayBldmVyeSBhY2Nlc3MgdG8gdHJpZ2dlcmluZ1Rhc2sgYW5kIG1ha2Ugc3VyZVxyXG4gICAgLy8gaXQgcG9pbnRzIHRvIGEgdmFsaWQgdGFzay5cclxuICAgIGlmICh0aGlzLl90cmlnZ2VyaW5nVGFzayAhPT0gbnVsbCAmJiB0aGlzLl90cmlnZ2VyaW5nVGFzay5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKVxyXG4gICAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJpbmdUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpbiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmxhc3QgZm9jdXNlZCBjb250cm9sPC9wYXJhbT5cclxuICBzZXRMYXN0UGFya2VkQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICBzdXBlci5zZXRMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGhpcywgY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUXVlcnkgVGFzayBQYXRoIFJldHVybnMgdGhlIHRhc2sgcGF0aCB0aGF0IGxlYWRzIHRvIHRoZSBjdXJyZW50IHRhc2suIFRoZSByZXN1bHRpbmcgYWxwaGEgc3RyaW5nXHJcbiAgLy8vICAgY29udGFpbnMgdGhlIHRhc2sgbmFtZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgbmFtZSBvZiB0aGUgdGFzay4gTmFtZXMgYXJlIHNlcGFyYXRlZCBieSB0aGUgJzsnXHJcbiAgLy8vICAgY2hhcmFjdGVyLiBGb3IgUFJPRygpIHVzaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcXVlcnlUYXNrUGF0aCgpOiBTdHJpbmdCdWlsZGVyIHtcclxuICAgIGxldCBpbnNlcnRlZE5hbWVzOiBudW1iZXIgPSAwOyAgICAgICAgLy8gaG93IG1hY2ggbmFtZXMgaW5zZXJ0ZWQgdG8gdGhlIG91dHB1dCBzdHJpbmdcclxuICAgIGxldCByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcig3OTM2KTsgLy8gMzEgKiAyNTYgKi9cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgoZmFsc2UpKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIGZhbHNlKTtcclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBsZXQgY3VyclRzazogVGFzayA9IHRyZWVSb3V0ZVt0c2tdO1xyXG4gICAgICBpZiAoY3VyclRzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIGxldCBuYW1lUHJvcDogUHJvcGVydHkgPSBjdXJyVHNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSk7XHJcbiAgICAgIGlmIChuYW1lUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gbmFtZVByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgMSBuYW1lIC0+IGRvbid0IGluc2VydCAnOydcclxuICAgICAgICAvLyBhZnRlciBsYXN0IG5hbWUgZG9uJ3QgaW5zZXJ0ICc7JyB0b28uXHJcbiAgICAgICAgaWYgKGluc2VydGVkTmFtZXMrKyAhPT0gMClcclxuICAgICAgICAgIHJlc3VsdC5BcHBlbmQoJzsnKTtcclxuICAgICAgICByZXN1bHQuQXBwZW5kKG5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBGaWVsZCB3aGljaCBjb250YWluIGl0ZW0gbnVtYmVyIGl0bVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3RsX2l0bV8yX3BhcmVudF92ZWUoaXRtOiBudW1iZXIpOiBGaWVsZCB7XHJcbiAgICBsZXQgY3VyclRzazogVGFzaztcclxuICAgIGxldCBjdXJySXRtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxhc3RJdG06IG51bWJlciA9IDA7ICAgICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aC0xXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdHNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdHNrID49IDA7IHRzay0tKSB7XHJcbiAgICAgIGN1cnJUc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuXHJcbiAgICAgIGN1cnJJdG0gKz0gY3VyclRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBmb3VuZCB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgZmllbGRcclxuICAgICAgaWYgKGl0bSA8IGN1cnJJdG0pIHtcclxuICAgICAgICAvLyBudW1iZXIgb2YgRmllbGQgaW4gZm91bmQgdGFza1xyXG4gICAgICAgIGl0bSAtPSBsYXN0SXRtO1xyXG4gICAgICAgIHJldHVybiA8RmllbGQ+Y3VyclRzay5EYXRhVmlldy5nZXRGaWVsZChpdG0pO1xyXG4gICAgICB9XHJcbiAgICAgIGxhc3RJdG0gPSBjdXJySXRtO1xyXG4gICAgfVxyXG4gICAgLy8gbm90IGZvdW5kIHRoZSBmaWVsZFxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBpZCB3aGljaCBjb250YWluIGZpZWxkIGF0dGFjaGVkIHRvIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbElERnJvbVZhckl0ZW0oaXRlbTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgIGxldCBjdXJySXRlbTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRlbTogbnVtYmVyID0gMDsgICAvLyBzdGFydCBvZiB0aGUgZmllbGQgaW4gZmllbGRlVGFiIG51bWJlciBmb3IgY2hlY2tlZCB0YXNrXHJcbiAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcbiAgICAgIGN1cnJJdGVtICs9IGN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbCAmIGZpZWxkXHJcbiAgICAgIGlmIChpdGVtIDwgY3Vyckl0ZW0pIHtcclxuICAgICAgICAvLyBOdW1iZXIgb2YgZmllbGRzIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdGVtIC09IGxhc3RJdGVtO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN1cnJUYXNrLkRhdGFWaWV3LmdldEZpZWxkKGl0ZW0pO1xyXG4gICAgICAgIGlmIChmaWVsZC5nZXRDdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayA9IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrICsgY3VyclRhc2suRm9ybS5nZXRDb250cm9sSWR4KGZpZWxkLmdldEN0cmwoKSkgKyAxO1xyXG5cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN1cnJUYXNrLkZvcm0gIT0gbnVsbClcclxuICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgbGFzdEl0ZW0gPSBjdXJySXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb250cm9sIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSBpbiBzYW1lIHRhc2sgbm90IGZvdW5kXHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250cm9sIGZyb20gY29udHJvbElEXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sSURcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbEZyb21Db250cm9sSUQoY29udHJvbElEOiBudW1iZXIsIHBhcmVudDogUmVmUGFyYW08bnVtYmVyPik6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuICAgIHBhcmVudC52YWx1ZSA9IC0xO1xyXG5cclxuICAgIGlmIChjb250cm9sSUQgPj0gMCkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgY2FsbGVyVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgIGxldCBub09mQ29udHJvbHNJbkN1cnJ0YXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBjb250cm9sSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpKTtcclxuXHJcbiAgICAgIC8vIHRoZSByb3V0ZSB1cCwgdGhlIGluc2VydCAob3VyIHRhc2spIGlzIFswXSwgYW5kIGV4aXQgKHJvb3QpIGlzIFt0cmVlUm91dGUubGVuZ3RoIC0gMV1cclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuXHJcbiAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIG5vT2ZDb250cm9sc0luQ3VycnRhc2sgPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbFxyXG4gICAgICAgICAgaWYgKGNvbnRyb2xJRCA8IChub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIG5vT2ZDb250cm9sc0luQ3VycnRhc2spKSB7XHJcbiAgICAgICAgICAgIC8vIElkeCBvZiB0aGUgY29udHJvbCBpbiBjdXJyZW50IHRhc2tcclxuICAgICAgICAgICAgY29udHJvbElkeCA9IGNvbnRyb2xJRCAtIG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrO1xyXG4gICAgICAgICAgICBjb250cm9sID0gPE1nQ29udHJvbD5jdXJyVGFzay5Gb3JtLkN0cmxUYWIuZ2V0Q3RybChjb250cm9sSWR4KTtcclxuICAgICAgICAgICAgY2FsbGVyVGFzayA9IGN1cnJUYXNrO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBub09mQ29udHJvbHNJbkN1cnJ0YXNrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR2V0IHBhcmVudFxyXG4gICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50LnZhbHVlID0gMDtcclxuICAgICAgICBsZXQgcHJldkN0bElkeDogbnVtYmVyID0gdHJlZVJvdXRlWzBdLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHRhc2s6IG51bWJlciA9IDA7IHRhc2sgPCB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzaysrKSB7XHJcbiAgICAgICAgICBjdXJyVGFzayA9IHRyZWVSb3V0ZVt0YXNrXTtcclxuXHJcbiAgICAgICAgICBpZiAocHJldkN0bElkeCAhPT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgcGFyZW50LnZhbHVlKys7XHJcblxyXG4gICAgICAgICAgaWYgKGNhbGxlclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCA9PT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgcHJldkN0bElkeCA9IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgQ29udHJvbElEXHJcbiAgICByZXR1cm4gY29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fNF9wYXJlbnRfdmVlKHBhcmVudDogbnVtYmVyLCB2ZWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdHNrOiBUYXNrO1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSB0aGlzLmdldFRhc2tEZXB0aCh0cnVlKTtcclxuXHJcbiAgICBpZiAocGFyZW50ICE9PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQgJiYgZGVwdGggPD0gcGFyZW50KVxyXG4gICAgICByZXR1cm4gdmVlO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG5cclxuICAgIGlmICh2ZWUgIT09IDApIHtcclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHBhcmVudCBpbiB0aGUgdGFzayB0cmVlXHJcbiAgICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IHRoaXMuZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudCwgdHJlZVJvdXRlKTtcclxuXHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyBpID4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlOyBpLS0pIHtcclxuICAgICAgICB0c2sgPSB0cmVlUm91dGVbaV07XHJcbiAgICAgICAgdmVlICs9IHRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2ZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrVHJlZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRJbmRPZlBhcmVudEluVGFza1RyZWUocGFyZW50OiBudW1iZXIsIHRhc2tUcmVlOiBUYXNrW10pOiBudW1iZXIge1xyXG4gICAgbGV0IGluZE9mUGFyZW50SW5UYXNrVHJlZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgdGFza1RyZWUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAodGFza1RyZWVbaV0uaXNNYWluUHJvZygpICYmIHRoaXMuX2N0bElkeCA9PT0gdGFza1RyZWVbaV0uZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IGk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgaW5kT2ZQYXJlbnRJblRhc2tUcmVlID0gcGFyZW50O1xyXG5cclxuICAgIHJldHVybiBpbmRPZlBhcmVudEluVGFza1RyZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW50cnkgcG9pbnQgdG8gdGhlIHJlY3Vyc2lvbiBpbmR1Y2VkIGJ5IGdldEZpZWxkQnlOYW1lXy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gYSBmaWVsZCB3aGljaCBiZWxvbmdzIHRvIG1lIG9yIHRvIG15IHBhcmVudHMgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZTwvcmV0dXJucz5cclxuICBnZXRGaWVsZEJ5TmFtZShmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gKDxUYXNrPiAodGhpcy5HZXRDb250ZXh0VGFzaygpKSkuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbmQgZmllbGQgd2l0aCB0aGUgbmFtZSBpbiB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWUsIHRoZSBuYW1lIGNhbiBiZSBlbXB0eSBzdHJpbmcgdG9vPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBOVUxMLjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkQnlOYW1lXyhmbGROYW1lOiBzdHJpbmcpOiBGaWVsZHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmIChmbGROYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkKGZsZE5hbWUpO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmaWVsZCBpcyBub3Qgb3VycyAtIHJlY3Vyc2l2ZSBjaGVjayB0aGUgYW5jZXN0b3JzXHJcbiAgICBpZiAoZmxkID09IG51bGwpIHtcclxuICAgICAgdG1wVGFzayA9IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSAhPSBudWxsID8gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpIDogdGhpcy5fcGFyZW50VGFzaztcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRtcFRhc2suZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGxldCBtYWluUHJnOiBUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIHRoaXMuZ2V0Q3RsSWR4KCkpO1xyXG4gICAgICAgICAgZmxkID0gbWFpblByZy5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgICAgICBmbGQgPSB0bXBUYXNrLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaW5kZXggb2YgdGhlIGZpZWxkIGluIHRoZSB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gSWYgdGhlIHZhcmlhYmxlIG5hbWUgaXMgbm90IGZvdW5kIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBaZXJvLjwvcmV0dXJucz5cclxuICBnZXRJbmRleE9mRmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IHRoaXMuZ2V0RmllbGRCeU5hbWUoZmxkTmFtZSk7XHJcbiAgICBsZXQgZmxkVGFiOiBGaWVsZHNUYWJsZTtcclxuXHJcbiAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiAwO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcbiAgICBmb3IgKGxldCBjdXJyOiBudW1iZXIgPSBkZXB0aCAtIDE7IGN1cnIgPj0gMDsgY3Vyci0tKSB7XHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRyZWVSb3V0ZVtjdXJyXTtcclxuICAgICAgaWYgKGN1cnJUYXNrID09PSBmbGQuZ2V0VGFzaygpKSB7XHJcbiAgICAgICAgY3VyciA9IGZsZC5nZXRJZCgpO1xyXG4gICAgICAgIGluZGV4ICs9ICsrY3VycjsgICAgICAgICAvLyBzdGFydCBpbmRleCBpbiBNYWdpYyBmcm9tIDEgYW5kIG5vdCBmcm9tIDBcclxuICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG91dCBvZiB0aGUgdGFzayB0cmVlIC0gdGhlIGluZGV4IGlzIGZvdW5kXHJcbiAgICAgIH1cclxuICAgICAgZmxkVGFiID0gPEZpZWxkc1RhYmxlPmN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpO1xyXG4gICAgICBpbmRleCArPSBmbGRUYWIuZ2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSB0aGUgcGF0aCBmcm9tIHRoaXMgdGFzayB0byB0aGUgcm9vdCBvZiB0aGUgdGFza3MgdHJlZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXRoXCI+YXJyYXkgb2YgdGFza3MsIHRoZSByb3V0ZSB1cC4gVGhlIDAgaXRlbSBpcyBzdGFydCBwb2ludCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHBhdGhUb1Jvb3QocGF0aDogVGFza1tdLCBieVBhcmVudE9yZGVyOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IChieVBhcmVudE9yZGVyID8gdGhpcyA6IDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBhdGhbaV0gPSB0YXNrO1xyXG4gICAgICBsZXQgY3RsSWR4OiBudW1iZXIgPSB0YXNrLmdldEN0bElkeCgpO1xyXG5cclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSBieVBhcmVudE9yZGVyID8gbnVsbCA6IHRhc2suZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpXHJcbiAgICAgICAgdGFzayA9IHRtcFRhc2s7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG5cclxuICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBnbG9iYWwgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgICAgICAgIGlmICghYnlQYXJlbnRPcmRlciAmJiB0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICAgICAgICBwYXRoW2kgKyAxXSA9IHRoaXM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIGN0bElkeCAhPT0gdGFzay5nZXRDdGxJZHgoKSlcclxuICAgICAgICAgIHBhdGhbKytpXSA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBjdGxJZHgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyB0YXNrIHNob3VsZCBiZSByZWZyZXNoZWQgLSBjb21wYXJlIHRoZSBcInJlZnJlc2ggb25cIiBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZVxyXG4gIC8vLyAgIHByZXZpb3VzIHJlY29yZCBhbmQgaWYgZGlmZmVyZW50IHZhbHVlcyBhcmUgZm91bmQgcmV0dXJucyB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNob3VsZEJlUmVmcmVzaGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGRhdGFWaWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl9wYXJlbnRUYXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHByZXZDdXJyUmVjIGlzIG51bGwgb25seSBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSBvciBhZnRlciBDYW5jZWwuXHJcbiAgICAvLyBBZnRlciBDYW5jZWwgaW4gdGhlIHBhcmVudCB0YXNrIFN1YmZvcm0gcmVmcmVzaCBtdXN0IGJlIGRvbmUgYWx3YXlzXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCB8fCBkYXRhVmlldy5pc1ByZXZDdXJyUmVjTnVsbCgpIHx8XHJcbiAgICAgICh0aGlzLlJlZnJlc2hPblZhcnMgIT09IG51bGwgJiYgIWRhdGFWaWV3LmN1cnJFcXVhbHNQcmV2KHRoaXMuUmVmcmVzaE9uVmFycykpKVxyXG4gICAgICByZXN1bHQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBzdWJUYXNrcyAoc3ViZm9ybXMpIHNob3VsZCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIENoZWNrUmVmcmVzaFN1YlRhc2tzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGRvIG5vdCByZWZyZXNoIHN1YmZvcm1zIGJlZm9yZSB0aGUgZmlyc3QgcmVjb3JkIHByZWZpeC4gVGhlIHNlcnZlciBzZW50IHVzIHRoZWlyIGRhdGF2aWV3IVxyXG4gICAgaWYgKHRoaXMuX2VudGVyZWRSZWNMZXZlbCkge1xyXG4gICAgICBsZXQgc3ViZm9ybXNUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBhd2FpdCB0aGlzLkdldFN1YmZvcm1zVG9SZWZyZXNoKCk7XHJcblxyXG4gICAgICBpZiAoc3ViZm9ybXNUb1JlZnJlc2gubGVuZ3RoID4gMClcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2Ygc3VidGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5hIGxpc3Qgb2Ygc3VidGFza3M8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXRTdWJUYXNrcygpOiBMaXN0PFRhc2s+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSlcclxuICAgICAgICBzdWJUYXNrcy5wdXNoKDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIGEgbGlzdCBvZiB0aG9zZSBzdWJmb3JtcyB0aGF0IG11c3QgYmUgcmVmcmVzaGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmxpc3Qgb2Ygc3ViZm9ybXMgdG8gcmVmcmVzaDwvcmV0dXJucz5cclxuICBhc3luYyBHZXRTdWJmb3Jtc1RvUmVmcmVzaCgpOiBQcm9taXNlPExpc3Q8VGFzaz4+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuICAgIGxldCBzdWJUYXNrc1RvUmVmcmVzaDogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLlNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrKSlcclxuICAgICAgICBzdWJUYXNrc1RvUmVmcmVzaC5wdXNoKHN1YlRhc2spXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzVG9SZWZyZXNoO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgaWYgdGhlIHNwZWNpZmljIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YlRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgU2hvdWxkUmVmcmVzaFN1YmZvcm1UYXNrKHN1YlRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+c3ViVGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuXHJcbiAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgLy8gRGVmZWN0IDc2OTc5LiBTdWJmb3JtIGNhbiBleGVjdXRlIHJlZnJlc2ggb25seSBhZnRlciBpdCBoYXMgVGFza1ZpZXcuXHJcbiAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAhc3ViVGFzay5JblNlbGVjdCAmJiBzdWJUYXNrLkFmdGVyRmlyc3RSZWNvcmRQcmVmaXgpIHtcclxuICAgICAgbGV0IHBhcmVudE1vZGU6IHN0cmluZyA9IHRoaXMuZ2V0TW9kZSgpO1xyXG4gICAgICBsZXQgbW9kZVByb3BlcnR5OiBudW1iZXIgPSAocGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZXHJcbiAgICAgICAgOiBwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSk7XHJcblxyXG4gICAgICAvLyBGb3IgYSBzdWJmb3JtIHdpdGggJ0FzUGFyZW50JyBtb2RlIHdlIGFsc28gbXVzdCByZWZyZXNoIHRoZSBzdWJmb3JtXHJcbiAgICAgIC8vIGFmdGVyIHRoZSBwYXJlbnQgcmVjb3JkIHByZWZpeC4gSWYgdGhlIHNwZWNpZmljIG1vZGUgaXMgbm90IGFsbG93ZWRcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gY29udGludWVzIGluIHRoZSBvbGQgbW9kZS5cclxuICAgICAgaWYgKHN1YlRhc2suTW9kZUFzUGFyZW50ICYmIHBhcmVudE1vZGUgIT09IHN1YlRhc2suZ2V0TW9kZSgpICYmXHJcbiAgICAgICAgdGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQgJiZcclxuICAgICAgICBhd2FpdCAoc3ViVGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpICYmXHJcbiAgICAgICAgYXdhaXQgc3ViVGFzay5jaGVja1Byb3AobW9kZVByb3BlcnR5LCB0cnVlKSkge1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuaXNWaXNpYmxlKCkgJiZcclxuICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHJlZnJlc2ggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVmcmVzaCA9IHRydWU7XHJcblxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlZnJlc2ggPSBhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19SRUZSRVNILCB0cnVlKSAmJiBzdWJUYXNrLnNob3VsZEJlUmVmcmVzaGVkKCk7XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIHN1YmZvcm1DdHJsLlJlZnJlc2hPblZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVmcmVzaClcclxuICAgICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmcmVzaDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0cyB0aGUgdGFzayBtb2RlIGFzIHBhcmVudCBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRNb2RlXCI+PC9wYXJhbT5cclxuICBhc3luYyBTZXRNb2RlQXNQYXJlbnQocGFyZW50TW9kZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmVuYWJsZU1vZGVzKCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgIGxldCBzdWJUYXNrRHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcbiAgICAgIGlmICghc3ViVGFza0R2LmlzRW1wdHkoKSAmJiAoc3ViVGFza0R2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRNb2RlKHBhcmVudE1vZGUpO1xyXG5cclxuICAgIHRoaXMuc2V0T3JpZ2luYWxUYXNrTW9kZShwYXJlbnRNb2RlKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBhZnRlciBjb21wdXRlIGRvIHN1YmZvcm0gdGFzayByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgYXN5bmMgZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgaWYgKHN1YlRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4KSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2xlYW4gZmxhZyBmb3IgU3ViZm9ybSByZWNvcmQgY3ljbGUgPC9zdW1tYXJ5PlxyXG4gIENsZWFuRG9TdWJmb3JtUHJlZml4U3VmZml4KCk6IHZvaWQge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBtdXN0IGRpc3BsYXkgY29uZmlybWF0aW9uIHdpbmRvdyBwcmlvciB0byBkZWxldGluZyBhIHJlY29yZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG11c3RDb25maXJtSW5EZWxldGVNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFKTtcclxuXHJcbiAgICAvLyBBcyBzdHJhbmdlIGFzIGl0IHNvdW5kcywgaWYgdGhlIHByb3BlcnR5IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvXHJcbiAgICAvLyBGYWxzZSwgdGhlbiBubyBuZWVkIHRvIGRpc3BsYXkgY29uZmlybWF0aW9uLi4uXHJcbiAgICByZXR1cm4gIXByb3AuaXNFeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPnRoZSBzdWIgdGFzayB0byBhZGQ8L3BhcmFtPlxyXG4gIGFkZFN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSBvbmUgb2YgdGhpcyB0YXNrcyBzdWItdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJUYXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHN1Yi10YXNrIHRvIHJlbW92ZTwvcGFyYW0+XHJcbiAgcmVtb3ZlU3ViVGFzayhzdWJUYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TdWJUYXNrcyAhPT0gbnVsbClcclxuICAgICAgdGhpcy5TdWJUYXNrcy5yZW1vdmVUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyYW5zYWN0aW9uRmFpbGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQgPSB2YWw7XHJcblxyXG4gICAgaWYgKCF2YWwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGV2ZWxcIj5pcyB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBsZXZlbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjaGVja2luZy4gVFJBTlNfTk9ORSAtLT4gY2hlY2sgZm9yIGFueVxyXG4gIC8vLyAgIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgZmFpbHVyZSBUUkFOU19SRUNPUkQvVEFTS19QUkVGSVggLS0+IGNoZWNrIGZvciBhIGZhaWx1cmUgaW4gdGhhdCBzcGVjaWZpY1xyXG4gIC8vLyAgIGxldmVsPC9wYXJhbT5cclxuICB0cmFuc2FjdGlvbkZhaWxlZChsZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgZWxzZSBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0TGV2ZWwoKSA9PT0gbGV2ZWwpKVxyXG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQ7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBmbGFnIG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiByZXRyeSBvbiB0aGUgdGFzaydzIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dmFsdWUgb2YgZmxhZzwvcGFyYW0+XHJcbiAgc2V0QWZ0ZXJSZXRyeSh2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRBZnRlclJldHJ5KHZhbCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh2YWwgPT09IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgPSBudWxsO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QWZ0ZXJSZXRyeSgpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW47XHJcbiAgZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBZnRlclJldHJ5XzEocmVjb3ZlcnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uLmdldEFmdGVyUmV0cnkoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhpcyB0YXNrIGlzIHBhcnQgb2YgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGN1cnJlbnRseSBiZWluZyByZXRyaWVkIHdpdGggYSBzcGVjaWZpYyByZWNvdmVyeTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMShyZWNvdmVyeTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEV4ZWNFbmRUYXNrIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIF9iRXhlY0VuZFRhc2sgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0RXhlY0VuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYkV4ZWNFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwiZXhlY3V0ZSBlbmQgdGFza1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBFdmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RlXCI+dGhlIG1vZGUgdG8gY29tcGFyZSB0bzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzaG91bGQgd2UgZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24/PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV2YWxFbmRDb25kKG1vZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGVuZFRhc2tDb25kUHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgZXZhbEVuZENvbmRQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FVkFMX0VORF9DT05ESVRJT04pO1xyXG5cclxuICAgIC8vIERvbnQgZXZhbHVhdGUgZW5kIGNvbmRpdGlvbiBpZiB3ZSBhcmUgYWxyZWFkeSBjbG9zaW5nIHRoZSB0YXNrXHJcbiAgICBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fYkV4ZWNFbmRUYXNrKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZXZhbEVuZENvbmRQcm9wICE9IG51bGwgJiYgKCBOU3RyaW5nLkNvbXBhcmUoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCksIENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFLFxyXG4gICAgICAgIHRydWUpID09PSAwIHx8ICgoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCkpLnRvTG93ZXJDYXNlKCkgPT09IG1vZGUudG9Mb3dlckNhc2UoKSkpKSB7XHJcbiAgICAgIC8vIGNoZWNrIHRoZSBlbmQgY29uZGl0aW9uXHJcbiAgICAgIGVuZFRhc2tDb25kUHJvcCA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OKTtcclxuICAgICAgaWYgKGVuZFRhc2tDb25kUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgbGV0IGVuZFRhc2s6IHN0cmluZyA9IGF3YWl0IGVuZFRhc2tDb25kUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAvLyBzaWduYWwgd2UgbmVlZCB0byBwZXJmb3JtIGFuIGVuZCB0YXNrIGFmdGVyIHdlIGdldCBvdXQgb2YgdGhlIGxvb3BcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGVuZFRhc2spKSB7XHJcbiAgICAgICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInRyeWluZyB0byBzdG9wXCIgZmxhZyBmb3IgdGhlIHRhc2sgYW5kIGl0J3Mgc3ViVGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyeWluZ1RvU3RvcCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICB0YXNrLnNldFRyeWluZ1RvU3RvcCh2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLklzVHJ5aW5nVG9TdG9wID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGdldEluUmVjb3JkU3VmZml4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJblJlY29yZFN1ZmZpeChiVmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiVmFsdWUgIT09IHRoaXMuX2luUmVjb3JkU3VmZml4KSB7XHJcbiAgICAgIHRoaXMuX2luUmVjb3JkU3VmZml4ID0gYlZhbHVlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJFdmFsT2xkVmFsdWVzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYkZsYWdcIj50cnVlL2ZhbHNlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmxhc2UgLSB2YWx1ZSB1cGRhdGVkPC9yZXR1cm5zPlxyXG4gIHNldEV2YWxPbGRWYWx1ZXMoYkZsYWc6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiRmxhZyAhPT0gdGhpcy5fZXZhbE9sZFZhbHVlcykge1xyXG4gICAgICB0aGlzLl9ldmFsT2xkVmFsdWVzID0gYkZsYWc7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkV2YWxPbGRWYWx1ZXMgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZS9mYWxzZSAtIGxvb2sgYXQgb2xkIHZhbHVlcyB3aGVuIGdldHRpbmcgdGhlIGZpZWxkIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV2YWxPbGRWYWx1ZXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZhbE9sZFZhbHVlcztcclxuICB9XHJcblxyXG4gICBhc3luYyBlbmRUYXNrKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbj86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChzdWJmb3JtRGVzdGluYXRpb24pKVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZmFsc2UsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgc3ViZm9ybURlc3RpbmF0aW9uLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkIGluIGVuZGluZyB0aGUgdGFzayBhbmQgaXRzIHN1YiB0YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXZlcnNpYmxlRXhpdFwiPmlmIHRydWUgdGhlbiB0aGUgZXhpdCBpcyByZXZlcnNpYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlEZXNjc1wiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGUgc3ViIHRhc2tzIGFuZCBoYW5kbGUgcmVjIHN1ZmZpeCBmb3IgdGhpcyB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YmZvcm1EZXN0aW5hdGlvblwiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGlzIHRhc2s8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZW5kVGFza18xKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbiwgZHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgY2xvc2VkU3ViRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuXHJcbiAgICBpZiAoKHRoaXMuSXNTdWJGb3JtICYmICFzdWJmb3JtRGVzdGluYXRpb24pICYmICF0aGlzLl9wYXJlbnRUYXNrLkluRW5kVGFzaykge1xyXG4gICAgICAvLyBpZiB0aGlzIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBpdHMgcGFyZW50IGlzIG5vdCB0cnlpbmcgdG8gc3RvcCB0aGVuXHJcbiAgICAgIC8vIHN0YXJ0IHN0b3BwaW5nIHRoZSB0YXNrcyBzdWIgdHJlZSBmcm9tIHRoZSBwYXJlbnQgZm9ybVxyXG4gICAgICBzdWNjZWVkZWQgPSBhd2FpdCB0aGlzLl9wYXJlbnRUYXNrLmVuZFRhc2socmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgIXRoaXMuSW5FbmRUYXNrKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5JbkVuZFRhc2sgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBJbiBjYXNlIG9mIGVycm9yIGFuZCBicm93c2VyIGNsb3NlLCBpbnRpbWF0ZSBzZXJ2ZXIgYWJvdXQgYnJvd3NlciBjbG9zZVxyXG4gICAgICAgIGlmKChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuSW5FbmRUYXNrICYmIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJKSAmJiBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoMCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuSXNUcnlpbmdUb1N0b3ApXHJcbiAgICAgICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcCh0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHN1YlRhc2tzIGluIGEgcHJlZml4IG1hbm5lclxyXG4gICAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KSB7XHJcbiAgICAgICAgICAvLyBleGl0IGZyb20gdGhlIHN1YiB0YXNrc1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIGxldCBwZW5kaW5nVHJhbnNhY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBsZXQgY2xpZW50T3BlckV4aXN0OiBib29sZWFuID0gYXdhaXQgdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3ModGhpcyxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNsaWVudE9wZXJFeGlzdCA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdClcclxuICAgICAgICAgICAgICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRoaXMuQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnModGhpcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0ICYmICFwZW5kaW5nVHJhbnNhY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSAmJiBzdWNjZWVkZWQ7IGkrKykge1xyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgY2xvc2VkU3ViRm9ybSA9IGNsb3NlZFN1YkZvcm0gfHwgc3ViVGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBleGl0IGZvciB0aGUgZmlyc3QgdGFzayBtdXN0IGVuZCBhbGwgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzID09PSBtZ2RUYWIuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSkge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSBtZ2RUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+IDAgJiYgc3VjY2VlZGVkOyBpLS0pIHtcclxuICAgICAgICAgICAgICBpZiAobWdkVGFiLmdldE1HRGF0YShpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sobWdkVGFiLmdldE1HRGF0YShpKS5nZXRGaXJzdFRhc2soKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3VjY2VlZGVkKSB7XHJcbiAgICAgICAgICAvLyBpZiBjbG9zaW5nIHRoZSBzdWIgdGFza3Mgd2FzIHN1Y2Nlc3NmdWwgdGhlbiBleGVjdXRlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiAhZHVlVG9WZXJpZnlFcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gZm9yIG5vbiBpbnRlcmFjdGl2ZSwgdHVybiBvZmYgdGhlIGZvcmNlIHJlY29yZCBzdWZmaXgsXHJcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhbiB1bndhbnRlZCB1cGRhdGUgbWlnaHQgYmUgc2VudCB3aGVuIHRhc2sgZW5kcy5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgZm9yY2VTdWZmaXggPT09IHRydWUgJiYgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIFwiMFwiKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBmb3JjZSBzdWZmaXgsIGZvciBqdXN0IGluIGNhc2UuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjFcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIGlmIChzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcylcclxuICAgICAgICAgICAgdGhpcy5IYW5kbGVUcmFuc2FjdGlvbkluZm8oKTtcclxuXHJcbiAgICAgICAgICBsZXQgcHJlVHNrU3VmZml4OiBib29sZWFuID0gc3VjY2VlZGVkO1xyXG5cclxuICAgICAgICAgIC8vIG5vdyBwZXJmb3JtIHRhc2sgc3VmZml4XHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MgJiYgcmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IgJiZcclxuICAgICAgICAgICAgKCF0aGlzLklzU3ViRm9ybSB8fCBzdWJmb3JtRGVzdGluYXRpb24pICYmXHJcbiAgICAgICAgICAgIHRoaXMuVGFza1ByZWZpeEV4ZWN1dGVkICYmICF0aGlzLlRhc2tTdWZmaXhFeGVjdXRlZClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5oYW5kbGVUYXNrU3VmZml4KHRydWUpO1xyXG5cclxuICAgICAgICAgIC8vIERvbid0IGZvcmdldCB0byBleGl0IGZyb20gYW55IHN1YlRhc2tzIG9wZW5lZCBkdXJpbmcgdGhlIGxhc3QgcmVjLXN1ZmZpeCBvciB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFzdWJUYXNrLklzU3ViRm9ybSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZU5vblJldmVyc2libGVFdmVudChzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBkb250IGNvbnRpbnVlIHdpdGggdGFzayBleGl0IGlmIGEgZGF0YSBlcnJvciBvY2N1cmVkIGR1cmluZyB0YXNrIHN1ZmZpeCAoZS5nLiByb2xsYmFjaygpKVxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KVxyXG4gICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcblxyXG4gICAgICAgICAgLy8gdGFzayBzdWZmaXggb25seSBzdG9wcyBleGVjdXRpb24gZm9yIGN1cnJlbnQgdGFzaywgd2hpY2ggaXMgYmVpbmcgY2xvc2VkXHJcbiAgICAgICAgICBpZiAocHJlVHNrU3VmZml4KVxyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQWJvcnRpbmcoKSAmJiBzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcykge1xyXG4gICAgICAgICAgICAvLyBUcnkgY2xvc2luZyBhbnkgdGFzayBsZXZlbCBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlci5jaGVja0FuZENvbW1pdChmYWxzZSwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfVEFTS19QUkVGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcikgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBsZXQgYmFzZU1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGE7XHJcbiAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGNsb3NpbmcgdGhlIHRvcG1vc3QgdGFzayAtIGRvbnQgbG9vc2UgYW55IGV2ZW50cywgbGVmdCBpbiB0aGUgcXVldWVcclxuICAgICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgYmFzZU1nZC5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudHMoYmFzZU1nZCwgMCk7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZhciBzdCA9IG5ldyBTZXNzaW9uU3RhdGlzdGljc0Zvcm0oKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0LldyaXRlVG9GbG93TW9uaXRvcigoRmxvd01vbml0b3JRdWV1ZSlfZmxvd01vbml0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAvL2Fib3J0aW5nIHRhc2sgY2xvc3VyZVxyXG4gICAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCBUYXNrU2VydmljZUJhc2UuRXhpdCh0aGlzLCByZXZlcnNpYmxlRXhpdCwgc3ViZm9ybURlc3RpbmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gV2hlbiBjbG9zaW5nIGEgdGFzayB3aG9zZSBwYXJlbnQgaXMgYSBtYWluIHByb2dyYW0sIGNoZWNrIHRoZSBtYWluIHByb2dyYW0ncyBlbmRcclxuICAgICAgICAgICAgICAvLyBjb25kaXRpb25cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suaXNNYWluUHJvZygpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1haW5QcmdUYXNrOiBUYXNrID0gbWdkLmdldE1haW5Qcm9nKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvb3RUYXNrOiBUYXNrID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5kTWFpblByZzogYm9vbGVhbiA9IGF3YWl0IG1haW5QcmdUYXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBlbmQgdGhlIHJvb3QgdGFzayBpZiB3ZSBhcmUgYWxyZWFkeSBkb2luZyBpdC5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzICE9PSByb290VGFzayAmJiBlbmRNYWluUHJnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQocm9vdFRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0UpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBNZ0Zvcm0uQ3JlYXRlZEZvcm1zLnJlbW92ZSg8TWdGb3JtPnRoaXMuRm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIGlmICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQsIHJldmVyc2libGVFeGl0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFjciAjOTE0NjQ1IDogcmV0dXJuIGZhbHNlIGluIGEgcmVjdXJzaXZlIGNhbGwuXHJcbiAgICAvLyBvdGhlcndpc2UgY29tbW9uSGFuZGxlckFmdGVyKGV2ZW50TWFuYWdlcikgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWYgdGhlIGNhbGwgaXMgcmVjdXJzaXZlbHkgbWFkZSBmcm9tIGhhbmRsZUV2ZW50LlxyXG4gICAgLy8gZm9yIGV4YW1wbGUgOiB0YXNrIGNvbmQgZnVsZmlsbGVkLiBoYW5kbGVJbnRlcm5hbEV2ZW50KHRoaXMsIE1HX0FDVF9SRUNfU1VGRklYKSBpcyBjYWxsZWQuXHJcbiAgICAvLyB3aGlsZSBpbiByZWMgc3VmIGhhbmRsZXIsIGVuZFRhc2sgaXMgY2FsbGVkIGFnYWluLi5pZiB3ZSByZXR1cm4gdHJ1ZSB0aGVuIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgaXMgbm90IGV4ZWN1dGVkLlxyXG4gICAgLy8gaWYgdGhlIHJlYyBzdWZmaXggaGFuZGxlciBkaWQgbm90IGV4aXN0LCB0aGVyZSB3aWxsIGJlIG5vIGNhbGwgdG8gZW5kVGFzayBhbmQgdGhlIGNvbW1vbkhhbmRsZXJBZnRlciB3aWxsIGJlIGV4ZWN1dGVkLlxyXG4gICAgLy8gVGhlIG5hbWUgJ3N1Y2NlZWRlZCcgaXMgYSBiaXQgbWlzbGVhZGluZy4uaXRzIG1vcmUgbGlrZSAnZXhlY3V0ZWQnLi5idXQgd2UgZGVjaWRlZCB0byBrZWVwIGl0LlxyXG4gICAgZWxzZSBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHJlc3RvcmUgdGhlIGZsYWcuXHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodGhpcy5faW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZCk7XHJcblxyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCAodGFzayA6IFRhc2spIDogdm9pZFxyXG4gIHtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG5cclxuICAgIGxldCAgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIC8vIGZpbmQgaWYgTUdfQUNUX1RBU0tfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgIGkgPSAwOyBpIDwgaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgb3Blci5zZXRFeGVjT25TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXNrLmhhc1N1YlRhc2tzKCkpICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2suR2V0U3ViVGFza3MoKS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyAodGFzazogVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlIDxib29sZWFuPiB7XHJcbiAgICBsZXQgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBmYWxzZTtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG5cclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgLy8gZmluZCBpZiBNR19BQ1RfVEFTS19TVUZGSVggLyBNR19BQ1RfUkVDX1NVRkZJWCBoYW5kbGVyIGV4aXN0cz9cclxuICAgIHZhciBldnRIYW5Qb3MgPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGV2dEhhblBvcy5pbml0KHJ0RXZ0KTtcclxuICAgIGhhbmRsZXIgPSBldnRIYW5Qb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpIHtcclxuICAgICAgbGV0IGN1cnJSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpXHJcbiAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCFjbGllbnRPcGVyYXRpb25FeGlzdCkge1xyXG4gICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIGNyZWF0ZSBtb2RlIHRhc2suICBmb3JjZSByZWNvcmQgc3VmZml4IGlzIGNhbmNlbGxlZFxyXG5cclxuICAgICAgICBpZiAoZm9yY2VTdWZmaXggPT09IHRydWUpXHJcbiAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSB8fCAgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYW5kbGVyICE9IG51bGwgJiYgIWNsaWVudE9wZXJhdGlvbkV4aXN0KSB7XHJcbiAgICAgICAgbGV0IGNudCA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb3BlciA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0T3BlcmF0aW9uKGkpO1xyXG4gICAgICAgICAgaWYgKG9wZXIuZ2V0RXhlY09uQ2xpZW50KCkpIHtcclxuICAgICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob3Blci5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9SQUlTRV9FVkVOVCl7XHJcbiAgICAgICAgICAgICAgaWYgKG9wZXIuR2V0UnVudGltZUV2ZW50KCkuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiZcclxuICAgICAgICAgICAgICBvcGVyLkdldFJ1bnRpbWVFdmVudCgpLmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgdGFzay5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgaSA8IHRhc2suZ2V0U3ViVGFza3MoKS5nZXRTaXplKCkpOyBpKyspIHtcclxuICAgICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBhd2FpdCB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyhzdWJUYXNrLCBldmVudENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGNsaWVudE9wZXJhdGlvbkV4aXN0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnMoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBDaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyh0YXNrIDogVGFzayk6IGJvb2xlYW5cclxuICB7XHJcbiAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJSZWNvcmQgPSAgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRydWU7XHJcblxyXG4gICAgaWYgKCFwZW5kaW5nVHJhbnNhY3Rpb25zICYmIHRhc2suaGFzU3ViVGFza3MoKSlcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7ICghcGVuZGluZ1RyYW5zYWN0aW9ucyAmJiBpIDwgdGFzay5nZXRTdWJUYXNrcygpLmdldFNpemUoKSk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHN1YlRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBlbmRpbmdUcmFuc2FjdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbmx5RGVzY3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1Y2NlZWRlZFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBIYW5kbGVUcmFuc2FjdGlvbkluZm8oKTogdm9pZCB7XHJcbiAgICAvLyB3aGlsZSByZW1vdGUgdGFzayB3aXRob3V0IGxvY2FsIGRhdGEsIGhhcyBzdWJmb3JtIHRoYXQgaGFzIGxvY2FsIGRhdGEgOiBSZW1vdGUgdHJhbnNhY3Rpb24gaXMgc2V0IG9uIHRoZSBwYXJlbnQgdGFzayBhbmQgbG9jYWwgVHJhbnNhY3Rpb24gaXMgc2V0IG9uIHN1YmZvcm0uXHJcbiAgICAvLyBUaGUgbWVtYmVyIHRhc2suVHJhbnNhY3Rpb24gaXMgZ2V0IHRoZSBEYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvblxyXG4gICAgLy8gZm9yIHN1YmZvcm0gOiAgdGhlIEN1cnJlbnREYXRhdmlld01hbmFnZXIgaXMgdGhlIGxvY2FsRGF0YXZpZXcgc28gdGhlIHRyYW5zYWN0aW9uIGlzIHRoZSBsb2NhbCB0cmFuc2FjdGlvbiB0aGF0IHRoZSBzdWJmb3JtIGlzIHRoZSBvd25lciBidXQgbm90IHRoZSBvd25lciBvZiB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBUaGUgbWV0aG9kIHNldFRyYW5zQ2xlYXJlZCgpIG5lZWQgdG8gYmUgY2FsbGVkIG9ubHkgZm9yIHJlbW90ZSB0cmFuc2FjdGlvbiB0aGF0IGlzIHRoZSBvd25lciB0YXNrIC4gKF90cmFuc0NsZWFyZWQgaXMgc2VuZCB0byB0aGUgc2VydmVyIClcclxuXHJcbiAgICAvLyBjaGVjayB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICBsZXQgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0gdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uICE9PSBudWxsICYmIHRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykgJiYgdHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gJ1AnKSB7XHJcbiAgICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0VHJhbnNDbGVhcmVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgZXhpdCBjb21tYW5kLCBhZGRzIGl0IHRvIGNvbW1hbmRzIGZvciBleGVjdXRpb24gYW5kIGV4ZWN1dGUgaXQgaWYgaXQncyBuZWVkZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJldmVyc2libGVFeGl0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtRGVzdGluYXRpb25cIj48L3BhcmFtPlxyXG4gIGFzeW5jIEV4aXQocmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgcmVjb3JkIHN1ZmZpeCB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhpcyB0YXNrIGlzIG5vdCBhIHN1YiBmb3JtXHJcbiAgICAvLyB0aGVuIGVuZCB0aGUgdGFzayBhdCB0aGUgc2VydmVyIHNpZGVcclxuXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IHJldmVyc2libGVFeGl0ID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDbGllbnRDb21tYW5kPkNvbW1hbmRGYWN0b3J5LkNyZWF0ZUJyb3dzZXJFc2NFdmVudENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIHN1YmZvcm1EZXN0aW5hdGlvbikgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNsaWVudENvbW1hbmQ+Q29tbWFuZEZhY3RvcnkuQ3JlYXRlTm9uUmV2ZXJzaWJsZUV4aXRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtRGVzdGluYXRpb24pO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBpZiAoIXN1YmZvcm1EZXN0aW5hdGlvbikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIEJyb3dlckVzY0NvbW1hbmQgaW1tZWRpYXRlbHkgb25seSBpZlxyXG4gICAgICAgIC8vIDEuIElmIHdlIGFyZSB0cnlpbmcgdG8gY2xvc2UgdGhlIGJyb3dzZXIgYW5kIHRoZSB0b3Btb3N0IHRhc2sgaXMgY2xvc2luZ1xyXG4gICAgICAgIC8vIDIuIElmIHVzZXIgZXhwbGljaXRseSBjbG9zZXMgdGhlIGN1cnJlbnQgdGFzayAobGlrZSBjbG9zaW5nIG92ZXJsYXkpXHJcbiAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBFeGl0KCkgY29tbWFuZHMsIGp1c3QgYWRkIHRoZSBCcm93c2VyRXNjQ29tbWFuZCB0byBDbWRzVG9TZXJ2ZXIuXHJcbiAgICAgICAgaWYodGhpcy5nZXRUYXNrVGFnKCkgPT0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSB8fFxyXG4gICAgICAgICAgICEoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkpXHJcbiAgICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY2xvc2luZyBvZiBNYWluIFByb2dyYW0gZGlkbid0IHN1Y2NlZWQgb24gc2VydmVyLCBjbG9zZSBpdCBoZXJlIC0tLSBvZmNvdXJzZSBpdFxyXG4gICAgICAgIC8vIGluY2x1ZGVzIHRoZSBleGVjdXRpb24gb2YgVFMgYXMgd2VsbC5cclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWN1cnNpdmUgZnVuY3Rpb24gZm9yIGZpbmFsbHkgb3BlcmF0aW9uIG9mIGVuZFRhc2sgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VjY2VlZGVkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldmVyc2libGVFeGl0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQ6IGJvb2xlYW4sIHJldmVyc2libGVFeGl0OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBzdWJUYXNrLmhhbmRsZUZpbmFsbHlFbmRUYXNrKHN1Y2NlZWRlZCwgcmV2ZXJzaWJsZUV4aXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5JbkVuZFRhc2sgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICB0aGlzLl9pc1N0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXN1Y2NlZWRlZCAmJiByZXZlcnNpYmxlRXhpdCAmJiB0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBUYXNrIFByZWZpeCBleGVjdXRpb24gZm9yIGFsbCBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBoYW5kbGVUYXNrU3VmZml4KHdpdGhTdWJUYXNrczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAod2l0aFN1YlRhc2tzKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICBzdWNjZWVkZWQgPSBhd2FpdCBzdWJUYXNrLmhhbmRsZVRhc2tTdWZmaXgod2l0aFN1YlRhc2tzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKTtcclxuICAgIHN1Y2NlZWRlZCA9ICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGlmIHRoZSB0YXNrIGludG8gY3JlYXRlIGxpbmUgcHJvY2Vzc2luZyBvciBub3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEluQ3JlYXRlTGluZShpbkNyZWF0ZUxpbmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luQ3JlYXRlTGluZSA9IGluQ3JlYXRlTGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaWYgdGhlIHRhc2sgaXMgaW50byBDcmVhdGUgbGluZSBwcm9jZXNzaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJbkNyZWF0ZUxpbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5DcmVhdGVMaW5lO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYW4gaW50ZXJuYWwgZXZlbnQgb24gdGhpcyB0YXNrcyBzbGF2ZSB0YXNrcy4gU2xhdmUgdGFza3MgYXJlOiAoMSkgSWYgdGhpcyB0YXNrIGlzIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIC8vLyAgIG93bmVyIC0gYWxsIHRhc2tzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIHRyYW5zYWN0aW9ucyBhcmUgaXRzIHNsYXZlcy4gKDIpIElmIHRoaXMgdGFzayBpcyBub3QgYW4gb3duZXIgLVxyXG4gIC8vLyAgIGFsbCBpdHMgc3ViZm9ybXMgYXJlIGNvbnNpZGVyZWQgc2xhdmVzLiBpZiBvbmUgb2YgdGhlIHN1YiB0YXNrcyBmYWlsZWQgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZW4gYVxyXG4gIC8vLyAgIHJlZmVyZW5jZSB0byB0aGF0IHRhc2sgaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludGVybmFsRXZ0Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBpbnRlcm5hbCBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKGludGVybmFsRXZ0Q29kZTogbnVtYmVyKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGZhaWx1cmVUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyaWdnZXJlZFRhc2tzOiBMaXN0PFRhc2tCYXNlPiA9IG1nZFRhYi5nZXRUcmlnZ2VyZWRUYXNrcyh0aGlzKTtcclxuICAgIGxldCBvcnBoYW5zOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuICAgIGxldCBzYW1lVHJhbnM6IGJvb2xlYW47XHJcbiAgICBsZXQgaGFzU2xhdmVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaXNPd25lcjogYm9vbGVhbiA9IHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcyk7XHJcblxyXG4gICAgLy8gZXZlbnQgb24gdHJhbnMtb3duZXIgc2hvdWxkIGJlIHByb3BvZ2F0ZWQgdG8gYWxsIG90aGVyIHRhc2tzIGluIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uLlxyXG4gICAgaWYgKGlzT3duZXIpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0RXZlbnRTY29wZVRyYW5zKCk7XHJcbiAgICAgIG9ycGhhbnMgPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgICAgLy8gSW4gY2FzZSBhIGNoYW5nZSBvZiB0cmFucy1vd25lcnNoaXAgcHJldmlvdXNseSB0b29rIHBsYWNlLCB0aGVyZSBtaWdodCBiZSB0YXNrc1xyXG4gICAgICAvLyB3aGljaCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBidXQgdGhlaXIgcGFyZW50IGlzIGdvbmUuIFRoZXNlIGFyZSBvcnBoYW4gdGFza3NcclxuICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcHJvcG9nYXRlIHRoZSBldmVudCB0byB0aGVtIHRvby5cclxuICAgICAgbWdkVGFiLnN0YXJ0VGFza3NJdGVyYXRpb24oKTtcclxuICAgICAgd2hpbGUgKCh0YXNrID0gPFRhc2s+bWdkVGFiLmdldE5leHRUYXNrKCkpICE9IG51bGwpIHtcclxuICAgICAgICBzYW1lVHJhbnMgPSB0YXNrLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRhc2suVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpO1xyXG4gICAgICAgIGlmICh0YXNrICE9PSB0aGlzICYmIHNhbWVUcmFucyAmJiB0YXNrLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgIT0gbnVsbCAmJiBtZ2RUYWIuR2V0VGFza0J5SUQodGFzay5QcmV2aW91c2x5QWN0aXZlVGFza0lkKSA9PSBudWxsKVxyXG4gICAgICAgICAgb3JwaGFucy5wdXNoKHRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNjb3BlVHJhbnM6IGJvb2xlYW4gPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5pc0V2ZW50U2NvcGVUcmFucygpO1xyXG5cclxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgZXZlbnQgYWNjb3JkaW5nIHRvIHRoZSBzY29wZSwgb24gYWxsIHRhc2tzIHRyaWdnZXJlZCBieSBtZVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWdnZXJlZFRhc2tzLmxlbmd0aCAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTsgaSsrKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50cmlnZ2VyZWRUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc2FtZVRyYW5zID0gdGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRhc2suVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdGFzay5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCk7XHJcblxyXG4gICAgICBpZiAoIXRhc2suSXNTdWJGb3JtICYmIChzY29wZVRyYW5zICYmIHNhbWVUcmFucykgJiYgdGFzay5pc1N0YXJ0ZWQoKSkge1xyXG4gICAgICAgIC8vIFFDUiA0Mzg1MzAgR3VhcmFudGVlIHRoYXQgYmVmb3JlIHByZWZpeCBjb21wdXRlIHdpbGwgYmUgZXhlY3V0ZWRcclxuICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkuRm9ybVJlZnJlc2hlZCAmJiBpbnRlcm5hbEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBpbnRlcm5hbEV2dENvZGUpO1xyXG4gICAgICAgIGhhc1NsYXZlcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9wYWdhdGUgdGhlIGV2ZW50IG9uIG9ycGhhbnMgdG9vLlxyXG4gICAgZm9yICg7IGlzT3duZXIgJiYgaSA8IG9ycGhhbnMubGVuZ3RoICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpOyBpKyspIHtcclxuICAgICAgdGFzayA9IG9ycGhhbnMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNDM4NTMwIEd1YXJhbnRlZSB0aGF0IGJlZm9yZSBwcmVmaXggY29tcHV0ZSB3aWxsIGJlIGV4ZWN1dGVkXHJcbiAgICAgIGlmICh0YXNrLmdldEZvcm0oKS5Gb3JtUmVmcmVzaGVkICYmIGludGVybmFsRXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgaW50ZXJuYWxFdnRDb2RlKTtcclxuICAgICAgaGFzU2xhdmVzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzU2xhdmVzICYmIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGZhaWx1cmVUYXNrID0gdGFzaztcclxuXHJcbiAgICBpZiAoaXNPd25lcilcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuY2xlYXJFdmVudFNjb3BlKCk7XHJcblxyXG4gICAgcmV0dXJuIGZhaWx1cmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIGEgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVSZWNvcmRBY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG5cclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LkluY2x1ZGVzRmlyc3QoKSB8fCBkYXRhdmlldy5Jc09uZVdheUtleSkge1xyXG4gICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIGZhbHNlKTtcclxuICAgICAgICBpZiAoZGF0YXZpZXcuSXNPbmVXYXlLZXkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgKGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSA9PT0gMCkgfHwgKGRhdGF2aWV3LmdldFRvcFJlY0lkeCgpID09PSAwKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhdmlldy5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICBpZiAoKCh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkgfHwgZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHxcclxuICAgICAgICAgICgodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKSAmJlxyXG4gICAgICAgICAgICAoIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93Q3JlYXRlSW5Nb2RpZnlNb2RlKHRoaXMuZ2V0Q29tcElkeCgpKSB8fFxyXG4gICAgICAgICAgICAgICFhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSkpICYmIChkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgKyAxKSA9PT0gZGF0YXZpZXcuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8ICgoZGF0YXZpZXcuZ2V0U2l6ZSgpIC0gZGF0YXZpZXcuZ2V0VG9wUmVjSWR4KCkpIDw9IHRoaXMuRm9ybS5nZXRSb3dzSW5QYWdlKCkpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIGZhbHNlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgZmFsc2UpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIHRydWUpO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT19QUk9HX0VYRV9SSUdIVFMsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBpcyBzdGFydGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1N0YXJ0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNTdGFydGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHN1YiB0YXNrcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U3ViVGFza3MoKTogVGFza3NUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrcyByZWZyZXNoZXMgb24gYSBjaGFuZ2Ugb2Ygb25lIG9mIGl0cyBwYXJlbnQgZmllbGRzIHdpdGggdGhlIGdpdmVuIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkXCI+dGhlIGlkIG9mIHRoZSBwYXJlbnQgZmllbGQ8L3BhcmFtPlxyXG4gIHJlZnJlc2hlc09uKGZsZElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyAhcmVzdWx0ICYmIHRoaXMuUmVmcmVzaE9uVmFycyAhPT0gbnVsbCAmJiBpIDwgdGhpcy5SZWZyZXNoT25WYXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLlJlZnJlc2hPblZhcnNbaV0gPT09IGZsZElkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIHRoaXMgdGFzayBmcm9tIHRoZSBhY3RpdmUgdHJhbnNhY3Rpb25zIGFjY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQWJvcnRUcmFuc2FjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXggdG8gdmFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRydWUgaWYgd2UgYWxyZWFkeSBwZXJmb3JtZWQgcmVjb3JkIHN1ZmZpeDwvcGFyYW0+XHJcbiAgc2V0UHJldmVudFJlY29yZFN1ZmZpeCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZlbnRSZWNvcmRTdWZmaXggPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5XHJcbiAgZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2ZW50UmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ZW50Q29udHJvbENoYW5nZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldFByZXZlbnRDb250cm9sQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZlbnRDb250cm9sQ2hhbmdlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNpZ25hbCB0aGUgc2VydmVyIGNsb3NlZCB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0S25vd25Ub1NlcnZlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2tub3duVG9TZXJ2ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBkdlBvcyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCItXCI+ZXZhbHVhdGVzIHRoZSBkZXJjcmlwdG9yIGFuZCByZXR1cm4gdGhlIG5vbi1oYXZlIGR2UG9zIHZhbHVlPC9wYXJhbT5cclxuICBldmFsdWF0ZURlc2NyaXB0b3IoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRTtcclxuICAgIGlmICh0aGlzLkR2UG9zRGVzY3JpcHRvciA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHJlc3VsdCk7XHJcblxyXG4gICAgbGV0IGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBnbyBvdmVyIHRoZSBsaXN0IG9mIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5EdlBvc0Rlc2NyaXB0b3IubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCFmaXJzdClcclxuICAgICAgICByZXN1bHQgKz0gXCI7XCI7XHJcblxyXG4gICAgICBsZXQgY3VycmVudENlbGw6IHN0cmluZ1tdID0gdGhpcy5EdlBvc0Rlc2NyaXB0b3IuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBwYXJzZSB0aGUgY3VycmVudCB0YXNrIGFuZCBmaWVsZCBudW1iZXJcclxuICAgICAgbGV0IGN1cnJlbnRUYWc6IHN0cmluZyA9IGN1cnJlbnRDZWxsWzBdO1xyXG4gICAgICBsZXQgY3VycmVudFZlZUlkeDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjdXJyZW50Q2VsbFsxXSk7XHJcbiAgICAgIGxldCBjdXJyZW50VGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRUYXNrQnlJRChjdXJyZW50VGFnKTtcclxuICAgICAgbGV0IGN1cnJlbnRGaWVsZCA9IDxGaWVsZD5jdXJyZW50VGFzay5EYXRhVmlldy5nZXRGaWVsZChjdXJyZW50VmVlSWR4KTtcclxuICAgICAgbGV0IGRpc3BWYWw6IHN0cmluZyA9IGN1cnJlbnRGaWVsZC5nZXREaXNwVmFsdWUoKTtcclxuXHJcbiAgICAgIC8vIFFDUiA5Nzg1NjZcclxuICAgICAgaWYgKGN1cnJlbnRGaWVsZC5pc051bGwoKSlcclxuICAgICAgICBkaXNwVmFsID0gXCJcIjtcclxuXHJcbiAgICAgIC8vIFFDUiA3NDMyOTBcclxuICAgICAgbGV0IHBpYzogUElDO1xyXG4gICAgICBzd2l0Y2ggKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkpIHtcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAvLyBib29sZWFuIGlzIHN0b3JlZCBhcyBcIm9cIiBvciBcIjFcIiBzbyB3ZSBqdXN0IGFkZCB0aGVtIGFzIHdlXHJcbiAgICAgICAgLy8gZG8gaW4gdGhlIHNlcnZlclxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICByZXN1bHQgKz0gZGlzcFZhbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICAgIC8vIFFDUiA3NDI5NjYgZGF0ZSBhbmQgdGltZSBzcGVjaWFsIHRyZWF0bWVudFxyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcGljID0gbmV3IFBJQyhjdXJyZW50RmllbGQuZ2V0UGljdHVyZSgpLCBjdXJyZW50RmllbGQuZ2V0VHlwZSgpLCAwKTtcclxuICAgICAgICAgICAgbGV0IGNvbnY6IERpc3BsYXlDb252ZXJ0b3IgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gY29udi5tZzJkaXNwKGRpc3BWYWwsIFwiXCIsIHBpYywgZmFsc2UsIHRoaXMuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAvLyBRQ1IgNTQzMjA0IHdoZW4gdGhlcmUgaXMgYW4gZW1wdHkgc3RyaW5nIChhbHBoYSlhcHBlbmQgbm90aGluZ1xyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcmVzID0gbmV3IE5VTV9UWVBFKGRpc3BWYWwpO1xyXG4gICAgICAgICAgICBwaWMgPSBuZXcgUElDKGN1cnJlbnRGaWVsZC5nZXRQaWN0dXJlKCksIGN1cnJlbnRGaWVsZC5nZXRUeXBlKCksIDApO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gcmVzLnRvX2EocGljKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaXJzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0bXBTdHIyOiBzdHJpbmcgPSBTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAocmVzdWx0LCA0KTtcclxuXHJcbiAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHRtcFN0cjIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkcyB0aGUgZHZQb3MgZGVzY3JpcHRvciB2ZWN0b3IgZWFjaCBvZiB0aGUgZHZQb3NEZXNjcmlwdG9yIHZlY3RvciBlbGVtZW50cyBpcyBhIFN0cmluZyBhcnJheSBvZiBzaXplXHJcbiAgLy8vICAgMiBpbiB0aGUgZmlyc3QgY2VsbCBvZiBlYWNoIGFycmF5IHdlIGhhdmUgdGhlIHRhZyBhbmQgaW4gdGhlIHNlY29uZCB3ZSBoYXZlIHRoZSB2ZWUgaWluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREZXNjcmlwdG9yKG5ld0Rlc2M6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCEobmV3RGVzYy50cmltKCkgPT09IFwiXCIpKSB7XHJcbiAgICAgIGxldCBkZXNjOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUobmV3RGVzYywgXCI7XCIpO1xyXG4gICAgICB0aGlzLkR2UG9zRGVzY3JpcHRvciA9IG5ldyBMaXN0PHN0cmluZ1tdPigpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRlc2MubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY2VsbDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigyKTtcclxuICAgICAgICBsZXQgdGFnVmVlUGFpcjogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGRlc2NbaV0sIFwiLFwiKTtcclxuICAgICAgICBjZWxsWzBdID0gdGFnVmVlUGFpclswXTtcclxuICAgICAgICBjZWxsWzFdID0gdGFnVmVlUGFpclsxXTtcclxuXHJcbiAgICAgICAgLy8gcHV0IHRoZSBjZWxsIHZhbHVlIGludG8gdGhlIHZlY3RvclxyXG4gICAgICAgIHRoaXMuRHZQb3NEZXNjcmlwdG9yLnB1c2goY2VsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjYWNoZSBvYmplY3Qgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrQ2FjaGUoKTogRHZDYWNoZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHZDYWNoZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcmVwYXJlIGFsbCBzdWItZm9ybSB0cmVlJ3MgdG8gZWl0aGVyIGdvIHRvIHNlcnZlciAoYWZ0ZXIgZGVsZXRpbmcgcmVsZXZhbnQgZW50cmllcykgb3IgdG8gdGFrZSBkLnYgZnJvbVxyXG4gIC8vLyAgIGNhY2hlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgYWxsIHN1YmZvcm0gY2FuIGRvIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBiZWNhdXNlIG9mIHVwZGF0ZXM8L3JldHVybnM+XHJcbiAgYXN5bmMgcHJlcGFyZUNhY2hlKGlnbm9yZUN1cnI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBjaGVja2luZyBteXNlbGYgaWYgaSBhbSBhIHN1YmZvcm1cclxuICAgIGlmICghaWdub3JlQ3Vycikge1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKSB7XHJcbiAgICAgICAgICAvLyBpcyB0aGUgY3VycmVudCB1cGRhdGUgZGF0YXZpZXcgd2VyZSBwcmV2aW91c2x5IHRha2VuIGZyb20gY2FjaGVcclxuICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBjaGVja3MgdGhhdCBpIGFtIGEgc3ViIGZvcm0gYnV0IGkgYW0gbm90IGNhY2hlZFxyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSAmJiAhIGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBjdXJyZXRUYXNrOiBUYXNrO1xyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBteSBzdWIgZm9ybXNcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgLy8gdGhpcyBsb29wIG11c3QgcnVuIHRvIGl0cyBlbmQgc28gYWxsIHVwZGF0ZWQgZC52IHdpbGwgYmUgZGVsZXRlZFxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGN1cnJldFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgLy8gaWYgb25lIG9mIG15IHN1Yi1mb3JtcyBuZWVkcyB0byBnbyB0byB0aGUgc2VydmVyIC0gc28gZG8gaVxyXG4gICAgICAgIGlmICghIGF3YWl0IGN1cnJldFRhc2sucHJlcGFyZUNhY2hlKGZhbHNlKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHdlIGNhbiB0YWtlIHRoZSBkLnYgb2YgdGhlIHRhc2sgYW5kIGFsbCBoaXMgc3ViLWZvcm1zIGZyb20gY2FjaGUgaXMgd2UgY2FuIC0gdGFrZSB0aGVtIGFuZFxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBjdXJyZW50IGQudiBvZiBlYWNoIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBhbGwgZC52J3Mgd2VyZSBmb3VuZCBhbmQgc2V0PC9yZXR1cm5zPlxyXG4gIGFzeW5jIHRlc3RBbmRTZXQoaWdub3JlQ3VycjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gY2hlY2sgY3VycmVudCB0YXNrXHJcbiAgICBpZiAoIWlnbm9yZUN1cnIgJiYgYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgIGxldCByZXF1ZXN0ZWREdjogbnVtYmVyID0gdGhpcy5ldmFsdWF0ZURlc2NyaXB0b3IoKTtcclxuXHJcbiAgICAgIC8vIHRyeSB0byB0YWtlIGZyb20gY2FjaGUgb25seSBpZiByZXF1ZXN0ZWQgaXMgbm90IGN1cnJlbnRcclxuICAgICAgaWYgKHJlcXVlc3RlZER2ICE9PSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSkge1xyXG4gICAgICAgIGxldCBmcm9tQ2FjaGU6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldyhyZXF1ZXN0ZWREdik7XHJcbiAgICAgICAgaWYgKGZyb21DYWNoZSA9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlRHYoZnJvbUNhY2hlKTsgICAgIC8vIGNoYW5nZXMgdGhlIGN1cnJlbnQgZC52IHdpdGggdGhlIG9uZSB0YWtlbiBmcm9tIGNhY2hlIGRvIG5vdCBmb3JnZXQgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBuZWVkcyB0byBiZSBpbnNlcnRlZCB0byB0aGUgY2FjaGVcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUUNSICM0MzAwNDUuIEluZGljYXRlIHRoYXQgUlAgbXVzdCBiZSBleGVjdXRlZCBhZnRlciBnZXQgZnJvbSB0aGUgY2FjaGUuXHJcbiAgICAgIHRoaXMuRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBhbGwgc3ViLWZvcm1zIHRhc2tzZFxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAvLyB0aGlzIGxvb3AgZG9lcyBub3QgbmVlZCB0byByZWFjaCBpdHMgZW5kXHJcbiAgICAgIC8vIHRoZSBtb21lbnQgb25lIHRoYXQgbmVlZCB0byBnbyB0byB0aGUgc2VydmVyIGlzIGRpc2NvdmVyZWQgYWxsIG5lZWQgdG8gZ28gYWxzb1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIC8vIGRvZXMgdGhlIGktdGggc29uIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpLnRlc3RBbmRTZXQoZmFsc2UpKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hhbmdlcyB0aGUgY3VycmVudCBkLnYgd2l0aCBvbmUgdGFrZW4gZnJvbSBjYWNoZSBpbiB0aGlzIG1ldGhvZCB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB1cGRhdGVzXHJcbiAgLy8vICAgb2YgdGhlIGN1cnJlbnQgZGF0YXZpZXcgc2luY2UgdGhlIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBmcm9tIHRlc3RBbmRTZXQgdGhhdCBpbiB0dXJuIGlzIG9ubHkgdXNlZCBhZnRlclxyXG4gIC8vLyAgIGEgU3VjY2Vzc2Z1bCBydW4gcHJhcHJlQ2FjaGUgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGZvciB1cGRhdGVzIGluIHRoZSBjdXJyZW50IGRhdGF2aWV3IG9mXHJcbiAgLy8vICAgZWFjaCByZWxhdGVkIHRhc2suIGhvd2V2ZXIgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSBjaGVjayBpdCBhbnl3YXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZnJvbUNhY2hlXCI+dGhlIG5ldyBkLnY8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY2hhbmdlRHYoZnJvbUNhY2hlOiBEYXRhVmlldyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgLy8gdGhlIGRhdGEgdmlldyB3ZSByZWNlaXZlIGlzIENlcnRhaW5seSBmcm9tIHRoZSBjYWNoZVxyXG5cclxuICAgIGlmICghdGhpcy5oYXNMb2NhdGUpIHtcclxuICAgICAgaWYgKCFkYXRhdmlldy5nZXRDaGFuZ2VkKCkgJiYgZGF0YXZpZXcuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZShkYXRhdmlldy5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMubG9jYXRlUHV0SW5DYWNoZSgpO1xyXG5cclxuICAgIC8vIHNldCB0aGUgZGF0YSB2aWV3IGZyb20gdGhlIGNhY2hlIGFzIHRoZSBjdXJyZW50XHJcbiAgICBhd2FpdCBkYXRhdmlldy5zZXRTYW1lQXMoZnJvbUNhY2hlKTtcclxuICAgIGRhdGF2aWV3LnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuXHJcbiAgICB0aGlzLkZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG5cclxuICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuRm9ybSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuXHJcbiAgICAvLyBRQ1IgOTI0ODA5NFxyXG4gICAgdGhpcy5zZXRPcmlnaW5hbFRhc2tNb2RlKHRoaXMuZ2V0TW9kZSgpKTtcclxuICB9XHJcblxyXG4gIHNldE9yaWdpbmFsVGFza01vZGUob3JpZ2luYWxUYXNrTW9kZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlID0gb3JpZ2luYWxUYXNrTW9kZS5jaGFyQXQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBtb2RlIG9mIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9yaWdpbmFsVGFza01vZGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGlzIENhY2hlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBzdWIgZm9ybSBjb250cm9sIHRoaXMgdGFzayBDb3JyZWxhdGVzIHdpdGggdGhpcyBtZXRob2RcclxuICAvLy8gICBhY3R1YWxseSBjb21iaW5lcyB0d28gdGVzdCBmaXJzdCB0aGF0IHRoZSB0YXNrIGlzIGEgc3ViIGZvcm0gc2Vjb25kIHRoYXQgdGhlIHN1YiB0aGF0IHRoZSBzdWIgZm9ybSBoYXNcclxuICAvLy8gICB0aGUgaXMgY2FjaGVkIHByb3BlcnR5IHNldCB0byB5ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQ2FjaGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNTdWJGb3JtICYmIGF3YWl0ICg8TWdDb250cm9sQmFzZT50aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKSkuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvZXMgdGhlIGluc2VydCBpbiBjYWNoZSBsb2dpYyBpbiBjYXNlIHRoZSB0YXNrIGhhcyBsb2NhdGUgZXhwcmVzc2lvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgbG9jYXRlUHV0SW5DYWNoZSgpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZWQ6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldygoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSk7XHJcblxyXG4gICAgLy8gaWYgdGhpcyBkYXRhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgdG8gdGhlIGNhY2hlIGJlZm9yZVxyXG4gICAgaWYgKGNhY2hlZCAhPSBudWxsKSB7XHJcbiAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNoZWNrRmlyc3QoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpICYmICEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSkge1xyXG4gICAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0TG9jYXRlRmlyc3RSZWMoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpO1xyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBwdXQgaXQgaW4gdGhlIGNhY2hlIGlmIGl0IGlzIG5vdCB1cGRhdGVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSlcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaGFzTG9jYXRlIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhc0xvYWN0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0xvY2F0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBvcGVucyBhIG5ldyBUcmFuc2FjdGlvbiBvciBzZXQgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBUcmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRSZW1vdGVUcmFuc2FjdGlvbih0cmFuc0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyYW5zVGFzazogVGFzaztcclxuICAgIGxldCBpc0ZpbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBtZ2RUYWIuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgd2hpbGUgKCh0cmFuc1Rhc2sgPSA8VGFzaz5tZ2RUYWIuZ2V0TmV4dFRhc2soKSkgIT0gbnVsbCkge1xyXG4gICAgICAvLyB0cmFuc2FjdGlvbiBtaWdodCBiZSBudWxsIHdoZW4gdGFzayBpcyBhYm9ydGluZyBidXQgbm90IHlldCB1bmxvYWRlZC5cclxuICAgICAgaWYgKHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uICE9IG51bGwgJiZcclxuICAgICAgICB0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRyYW5zSWQpIHtcclxuICAgICAgICBpc0ZpbmQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gKGlzRmluZCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbih0aGlzLCB0cmFuc0lkKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgbmV3IFRyYW5zYWN0aW9uIE93bmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRUcmFuc093bmVyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0T3duZXJUYXNrKHRoaXMpO1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRUcmFuc0JlZ2luKCdUJykvKidUJyovO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHRoZSB0b3Btb3N0IHZhbHVlIGluIHRoZSBzdGFjayBhbmQgdGhlIHN0YXR1cyBvZiB0aGVcclxuICAvLy8gICBcInVzZUxvb3BTdGFja1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExvb3BDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3VzZUxvb3BTdGFjayAmJiB0aGlzLl9sb29wU3RhY2sgIT09IG51bGwgJiYgISh0aGlzLl9sb29wU3RhY2suY291bnQoKSA9PT0gMCkpIHtcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucGVlaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgdGhlIHZhbHVlIDAgb24gdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZW50ZXJMb29wKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fbG9vcFN0YWNrID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fbG9vcFN0YWNrLnB1c2goMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdG9wbW9zdCBlbnRyeSBmcm9tIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBsZWF2ZUxvb3AoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcExvb3BDb3VudGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBmcm9tIHRoZSBzdGFjayBhbmQgcmV0dXJucyBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wTG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSlcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucG9wKCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZXMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluY3JlYXNlTG9vcENvdW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCh0aGlzLnBvcExvb3BDb3VudGVyKCkgKyAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcFN0YWNrU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvb3BTdGFjay5jb3VudCgpO1xyXG5cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwidXNlIGxvb3Agc3RhY2tcIiB2YXJpYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIHRvIHNldDwvcGFyYW0+XHJcbiAgc2V0VXNlTG9vcFN0YWNrKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdXNlTG9vcFN0YWNrID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGlua3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERhdGF2aWV3SGVhZGVycygpOiBEYXRhdmlld0hlYWRlcnMge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UmVjb3JkQ3ljbGUoVmFsdWVfPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWNvcmRDeWNsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maXJzdFJlY29yZEN5Y2xlID0gVmFsdWVfO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSBpbnRlcm5hbCBuYW1lPC9zdW1tYXJ5PlxyXG4gIGdldFB1YmxpY05hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLlB1YmxpY05hbWU7XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIEFsbG93RXZlbnRzPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQWxsb3dFdmVudHMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUyk7XHJcbiAgICByZXR1cm4gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgdGFzayBpZDwvc3VtbWFyeT5cclxuICBnZXRFeHRlcm5hbFRhc2tJZCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhc2tJZDogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEKTtcclxuXHJcbiAgICBpZiAocHJvcCAhPSBudWxsKVxyXG4gICAgICB0YXNrSWQgPSBwcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gdGFza0lkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIFRSVUUgaWYgdGhpcyB0YXNrIG93bnMgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RyYW5zYWN0aW9uT3duZXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUcmFuc093bmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykpXHJcbiAgICAgIGlzVHJhbnNPd25lciA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIGlzVHJhbnNPd25lcjtcclxuICB9XHJcblxyXG4gIGlzVHJhbnNhY3Rpb25PbkxldmVsKGxldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzVHJhbnNhY3Rpb25Pd25lcigpICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gbGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHdoZXRoZXIgdGhlIHRhc2sgaXMgdGhlIFByb2dyYW0gKGkuZS4gbm90IGEgc3VidGFzaylcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzUHJvZ3JhbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1ByZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciB0YXNrIG1vZGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVNb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUVVFUlksIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkFOR0UsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1JBTkdFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTE9DQVRFLCBlbmFibGUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSCwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JULCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NPUlRfUkVDT1JEUywgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVgsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVklFV19CWV9LRVksIGVuYWJsZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGhhc1pvb21IYW5kbGVyIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEVuYWJsZVpvb21IYW5kbGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5hYmxlWm9vbUhhbmRsZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGhhc1pvb21IYW5kbGVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRFbmFibGVab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmFibGVab29tSGFuZGxlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaXMgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2s8L3JldHVybnM+XHJcbiAgaXNEZXN0aW5hdGlvblN1YmZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc3RpbmF0aW9uU3ViZm9ybVwiPjwvcGFyYW0+XHJcbiAgc2V0RGVzdGluYXRpb25TdWJmb3JtKGRlc3RpbmF0aW9uU3ViZm9ybTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtID0gZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBnZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZm9yIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0Rlc3RpbmF0aW9uQ2FsbFwiPjwvcGFyYW0+XHJcbiAgc2V0SXNEZXN0aW5hdGlvbkNhbGwoaXNEZXN0aW5hdGlvbkNhbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsID0gaXNEZXN0aW5hdGlvbkNhbGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBzZXRDYW5jZWxXYXNSYWlzZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYW5jZWxXYXNSYWlzZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBjYW5jZWxXYXNSYWlzZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FuY2VsV2FzUmFpc2VkO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlQ3JlYXRlQWN0cyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUsIHZhbCk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSwgICh0aGlzLmdldEZvcm0oKS5IYXNUYWJsZSgpICkgPyB2YWwgOiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyBlbmFibGUvZGlzYWJsZSBzdGF0dXMgb2YgY3JlYXRlIGFuZCBkZWxldGUgYWN0aW9uc1xyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBhc3luYyBzZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoISh0aGlzLkRhdGFWaWV3KS5pc0VtcHR5RGF0YXZpZXcoKSAmJiBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEUsIHRydWUpICYmXHJcbiAgICAgIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgdHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAoKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpICYmXHJcbiAgICAgICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSAmJlxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiYgRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dDcmVhdGVJbk1vZGlmeU1vZGUodGhpcy5nZXRDb21wSWR4KCkpKSB8fFxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSlcclxuICAgICAgdGhpcy5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbXB0eURhdGF2aWV3XCI+dGhlIGVtcHR5RGF0YXZpZXcgdG8gc2V0IDwvcGFyYW0+XHJcbiAgc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFWaWV3LnNldEVtcHR5RGF0YXZpZXcoZW1wdHlEYXRhdmlldyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IDwvcmV0dXJucz5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIHN0YXJ0cyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVtcHR5RGF0YXZpZXdPcGVuKHN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICBpZiAodGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCB0cnVlKTtcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSwgc28gZXhlY3V0ZSB0aGUgZW1wdHkgZGF0YXR2aWV3IGhhbmRsZXIsXHJcbiAgICAgIC8vIGlmIHRoZSB0YXNrIGlzIG5vdCBhIHN1YmZvcm0sIHB1dCB0aGUgZW1wdHkgZGF0YXZpZXcgZXZlbnQgb24gdGhlIHF1ZXVlXHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBydEV2bnQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpO1xyXG4gICAgICAgIGlmICgocnRFdm50ICE9IG51bGwgJiYgcnRFdm50LmdldEludGVybmFsQ29kZSgpID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpIHx8IHN1YmZvcm1SZWZyZXNoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0aGlzKTtcclxuICAgICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVyk7XHJcbiAgICAgICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhJdGFza0FuZENvZGUodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgIC8vIGZvciBzdWJmb3JtIG1vZGUgJ0FzUGFyZW50Jy4gSWYgdGhlIHBhcmVudCB0YXNrIHRoYXQgaW4gJ0VtcHR5IERhdGF2aWV3JyBzdGF0ZSBjaGFuZ2VzIGl0cyBtb2RlXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGFsc28gbXVzdCBjaGFuZ2UgbW9kZS5cclxuICAgICAgLy8gUUNSICMyODE4NjIuIElmIHRoZSBzdWJmb3JtIHRhc2sgaXMgb3BlbmVkIGluIHRoZSBmaXJzdCB0aW1lIGRvIG5vdCByZWZyZXNoIGl0J3Mgc3ViZm9ybXMsXHJcbiAgICAgIC8vIGJlY2F1c2UgdGhleSd2ZSByZWNlaXZlZCB0aGVpciBkYXRhdmlld3MgYWxyZWFkeS5cclxuICAgICAgLy8gV2UgbXVzdCByZWZyZXNoIHRoZW0gd2hlbiB0aGUgc3ViZm9ybSB0YXNrIHBhc3NlcyB0byBlbXB0eSBEVi5cclxuICAgICAgaWYgKHRoaXMuU3ViZm9ybUV4ZWNNb2RlICE9PSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRSAmJiBzdWJmb3JtUmVmcmVzaCAmJiBhd2FpdCB0aGlzLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpIHtcclxuICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNvbXB1dGVTdWJGb3JtcygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUmVjb3JkQWN0aW9ucygpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgZmFsc2UpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIGVuZHMgaXRzIGV4ZWN1dGlvbiBpbiBFbXB0eSBEYXRhdmlldyBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbXB0eURhdGF2aWV3Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVywgZmFsc2UpO1xyXG4gICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2s6IFRhc2tCYXNlLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICBsZXQgaXNJbnNpZGU6IGJvb2xlYW4gPSBhd2FpdCAoPFRhc2s+c3ViZm9ybVRhc2spLkV4ZWN1dGVOZXN0ZWRSUyhjdXJyVGFzayk7XHJcblxyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIzQzNDQ2Ny4gRXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCBzdWJmb3JtIGlmIGl0J3MgdGhlIGN1cnJlbnQgKGxhc3QgZm9jdXNlZCkgdGFzay5cclxuICAgIGlmIChzdWJmb3JtVGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgdHJ1ZSk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaXNJbnNpZGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gRGVmZWN0IDc3NDgzLiBEbyBub3QgY29udGludWUgaWYgdGhlIHJlY29yZCBzdWZmaXggZXhlY3V0aW9uIGlzIGZhaWxlZC5cclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNyZWF0ZSBjb21tYW5kIGZvciB0aGUgc2VydmVyXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1SZWZyZXNoQ29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoKTtcclxuICAgIGF3YWl0IHN1YmZvcm1UYXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICBpZiAoc3ViZm9ybVRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgLy8gUUNSICM0MjkxMTIuIFB1c2ggZXhlY3V0aW9uIHN0YWNrIGJlZm9yZSBSUCBleGVjdXRpb24uXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgIzc3MDQ5LiBEbyBub3QgZXhlY3V0ZSBwYXJlbnQgUlAuIFdlIG5lZWQgaXQgb25seSB3aGVuIGNsaWNrIG9uIHN1YmZvcm13YXMgZG9uZS5cclxuICAgICAgbGV0IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc6IGJvb2xlYW4gPSAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXg7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXggPSBwZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4T3JnO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBTdWJmb3JtUmVmcmVzaCBldmVudCB0byBpdHNlbGYgc28gdGhlIGN1cnNvciBtdXN0IGJlIG9uIHRoZSBmaXJzdCBjb250cm9sIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgLy8gYXMgZm9yIFZpZXdSZWZyZXNoIGV2ZW50LlxyXG4gICAgaWYgKGlzSW5zaWRlKSB7XHJcbiAgICAgIC8vIERlZmVjdCAxMTU3OTMuIGN1cnJUYXNrIGNhbid0IGJlIG51bGwuXHJcbiAgICAgIC8vIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhc3ViZm9ybVRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSAmJiBjdXJyVGFzayAhPSBudWxsKVxyXG4gICAgICAvLyAgIGN1cnJUYXNrLm1vdmVUb0ZpcnN0Q3RybChmYWxzZSk7XHJcbiAgICAgIC8vIFRPRE86IFRhYmJpbmcgJiBGb2N1c2luZzogSGFuZGxlIHRoaXMgc2l0dWF0aW9uXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+Y3VyclRhc2suRGF0YVZpZXcpLnNldFByZXZDdXJyUmVjKCk7XHJcbiAgICAgICAgICBzdWJmb3JtVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXhlY3V0ZXMgUmVjb3JkIFN1ZmZpeGVzIG9mIGFsbCBuZXN0ZWQgc3ViZm9ybXMgZnJvbSBib3R0b20gdG8gdG9wLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV4ZWN1dGVOZXN0ZWRSUyhsYXN0VGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGlzRXhlY3V0ZU5lc3RlZFJTOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUUNSICMxNjgzNDIuIEEgbmV3IHRhc2sgaXMgc2V0IGFzIGZvY3VzZWQgdGFzayBhZnRlciB0aGUgZmlyc3QgQ1AuXHJcbiAgICAvLyBTbyBpZiBpbiBDUCBVcGRhdGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIGN1cnJUYXNrIGlzIG51bGwuIEJ1dCB3ZSBtdXN0IHJlZnJlc2ggdGhlIHN1YmZvcm0uXHJcbiAgICBpZiAobGFzdFRhc2sgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG5cclxuICAgIC8vIERvIG5vdCBleGVjdXRlIHN1YmZvcm0gcmVmcmVzaCB3aGVuIHRoZSBmb2N1c2VkIHRhc2sgaXMgbm90IG9wZW5lZCBhcyBhIHN1YmZvcm0gKGl0IHdhcyBvcGVuZWQgZnJvbSBjYWxsIG9wZXJhdGlvbiksXHJcbiAgICAvLyBidXQgdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzdWJmb3JtIHRhc2suIFNlZSBmb3IgZXhhbXBsZSBRQ1IgIzQzMTg1MC5cclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgbGFzdFRhc2suZ2V0TWdkSUQoKSAhPT0gdGhpcy5nZXRNZ2RJRCgpKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogVGFzayA9IGxhc3RUYXNrOyB0YXNrICE9PSB0aGlzICYmIHRhc2sucGF0aENvbnRhaW5zKHRoaXMpICYmIHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSzsgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0V4ZWN1dGVOZXN0ZWRSUyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIFJlYyBzdWZmaXggZm9yIGFsbCBuZXN0ZWQgc3ViZm9ybXMgdW50aWxsIHN1YmZvcm0gdGFzayB0aGF0IGNvbnRhaW5zIHRoZXNlIDIgc3ViZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBleGVjU3ViZm9ybVJlY1N1ZmZpeChuZXdUYXNrOiBUYXNrKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBzdWJmVGFzazogVGFzaztcclxuICAgIGxldCBpOiBudW1iZXIsIGlkeCA9IDA7XHJcbiAgICBmb3IgKGkgPSB0aGlzLl90YXNrUGF0aC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgc3ViZlRhc2sgPSB0aGlzLl90YXNrUGF0aC5nZXRfSXRlbShpIC0gMSk7XHJcbiAgICAgIGlmICghbmV3VGFzay5fdGFza1BhdGguQ29udGFpbnMoc3ViZlRhc2spKSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBDcmVhdGUgbW9kZSB0byBNb2RpZnkgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBhIG5ldyByZWNvcmQuXHJcbiAgICAgICAgLy8gU28gdGhlIG1vZGUgaXMgY2hhbmdlZCBvbmx5IGZvciB0aGUgZmlyc3QgcmVjb3JkIHRoYXQgd2FzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgIGlmIChzdWJmVGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICEoKDxEYXRhVmlldz5zdWJmVGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5pc05ld1JlYygpKVxyXG4gICAgICAgICAgc3ViZlRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWR4ID0gbmV3VGFzay5fdGFza1BhdGguaW5kZXhPZihzdWJmVGFzayk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIERlYnVnLkFzc2VydChpID4gMCk7XHJcbiAgICByZXR1cm4gaWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY291bnRlciBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgZ2V0Q291bnRlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvdW50ZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5jcmVhc2UgdGhlIHRhc2tzIGNvdW50ZXIgYnkgMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5jb3VudGVyPC9yZXR1cm5zPlxyXG4gIGluY3JlYXNlQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLl9jb3VudGVyICsgMTtcclxuICB9XHJcblxyXG4gIHNldENvdW50ZXIoY250OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSBjbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgISFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclN0YXJ0UHJvZ0xldmVsID09PSBUYXNrLlN0YXJ0UHJvZ0xldmVsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVjayBpZiByZWZlcmVuY2UgdG8gbWFpbiBwcm9ncmFtIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZpZWxkU3RyXCI+YSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc01haW5Qcm9ncmFtRmllbGQoZmllbGRTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IEZpZWxkOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKGZpZWxkU3RyLCAnLCcpO1xyXG4gICAgbGV0IG1haW5Qcm9nRmllbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoRmllbGQubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoRmllbGQuZ2V0X0l0ZW0oMCkpO1xyXG4gICAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpXHJcbiAgICAgICAgbWFpblByb2dGaWVsZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Qcm9nRmllbGQ7XHJcbiAgfVxyXG5cclxuICBnZXRUYXNrSW5mbygpOiBzdHJpbmcge1xyXG4gICAgLy8gR2V0IHRoZSB0YXNrIG5hbWUgdXNpbmcgdGhlIGdldFByb3AoKSBhcyBuYW1lIGlzIG9ubHkgc2VyaWFsaXplZCBmb3IgZGVidWdcclxuICAgIGxldCB0YXNrTmFtZTogc3RyaW5nID0gKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KCd7MH0gezF9Jyx0aGlzLmlzUHJvZ3JhbSgpID8gJ1Byb2dyYW0nOiAnU3VidGFzaycsIHRhc2tOYW1lKTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCIodGFzayB7MH0tXFxcInsxfVxcXCJ7Mn0pXCIsIHRoaXMuX3Rhc2tUYWcsIHRoaXMuTmFtZSwgc3VwZXIuaXNNYWluUHJvZygpID8gKFwiIGN0bCBcIiArIHRoaXMuX2N0bElkeCkgOiBcIlwiKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENvbnN0cnVjdE1nRm9ybShhbHJlYWR5U2V0UGFyZW50Rm9ybTogUmVmUGFyYW08Ym9vbGVhbj4pOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSBuZXcgTWdGb3JtKCk7XHJcbiAgICBsZXQgcGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9ICh0aGlzLlBhcmVudFRhc2sgIT0gbnVsbCA/IHRoaXMuUGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsKTtcclxuXHJcbiAgICAvLyBQYXJlbnRGb3JtIG9mIGFueSBmb3JtIHNob3VsZCBiZSBhIHZpc2libGUgb25lLiBJdCBtaWdodCBoYXBwZW4gdGhhdCB0aGUgUGFyZW50VGFza1xyXG4gICAgLy8gaXMgYSBub24taW50ZXJhY3RpdmUgdGFzayB3aXRoIE9wZW5XaW5kb3c9Tm8uIEluIHRoaXMgY2FzZSwgdGhlIFBhcmVudCBvZiB0aGUgbm9uLWludGVyYWN0aXZlXHJcbiAgICAvLyB0YXNrLCBzaG91bGQgYmUgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBmb3JtLlxyXG4gICAgd2hpbGUgKHBhcmVudEZvcm0gIT0gbnVsbCAmJiAhcGFyZW50Rm9ybS5nZXRUYXNrKCkuaXNPcGVuV2luKCkpIHtcclxuICAgICAgcGFyZW50Rm9ybSA9IHBhcmVudEZvcm0uUGFyZW50Rm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtLlBhcmVudEZvcm0gPSBwYXJlbnRGb3JtO1xyXG4gICAgYWxyZWFkeVNldFBhcmVudEZvcm0udmFsdWUgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbWdkYXRhIElEIHRvIHdoaWNoIHRhc2sgYmVsb25nc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TWdkSUQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGEuR2V0SWQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmVmZXJlbmNlIHRvIGN1cnJlbnQgTUdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNR0RhdGEoKTogTUdEYXRhIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJlZnJlc2ggdGhlIGRpc3BsYXksIHBhaW50IHRoZSBjb250cm9scyBhbmQgdGhlaXIgcHJvcGVydGllcyBhZ2FpbiA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiB0aGlzLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgdGFzay5SZWZyZXNoRGlzcGxheSgpXCIpO1xyXG5cclxuICAgICAgLy8gcmVjb3JkcyBmcm9tIHRoZSBEYXRhVmlldyBhbmQgcmVmcmVzaGVzIHRoZSByb3dzLlxyXG4gICAgICAvLyBOb3csIFRhc2suUmVmcmVzaERpc3BsYXkoKSBpcyBjYWxsZWQgZnJvbSAyIHBsYWNlczpcclxuICAgICAgLy8gMS4gd2hpbGUgaW5pdGluZyB0aGUgZm9ybVxyXG4gICAgICAvLyAyLiB3aGVuIGNvbWluZyBiYWNrIGZyb20gc2VydmVyXHJcbiAgICAgIC8vIEluIGNhc2UgIzEsIHdlIGRvIG5vdCBuZWVkIHRvIHJlZnJlc2ggdGhlIHRhYmxlIGFzIGl0IGlzIGRvbmUgZnJvbSBmaXJzdFRhYmxlUmVmcmVzaCgpLlxyXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNhbiBiZSBlbGltaW5hdGVkLlxyXG4gICAgICBpZiAodGhpcy5fcmVmcmVzaFR5cGUgIT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORSkge1xyXG4gICAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuRm9ybTtcclxuICAgICAgICBsZXQgd2FzUmVmcmVzaGVkOiBib29sZWFuID0gYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIGlmICh3YXNSZWZyZXNoZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3JlZnJlc2hUeXBlID0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLyBUT0RPIHNhZGhhbiByZW1vdmUgdW51c2VkXHJcbiAgLy8gYXN5bmMgZ2V0RmllbGRWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgLy8gICB2YWx1ZS52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmdldFZhbHVlKGZhbHNlKTtcclxuICAvLyAgIGlzTnVsbC52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmlzTnVsbCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIGRpc3BsYXkgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogdm9pZCB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9ICg8RmllbGQ+ZmllbGREZWYpLmdldERpc3BWYWx1ZSgpO1xyXG4gICAgaXNOdWxsLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHVwZGF0ZXMgdGhlIGZpZWxkJ3MgdmFsdWUgYW5kIHN0YXJ0cyByZWNvbXB1dGUuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5UYXNrUHJlZml4RXhlY3V0ZWQpIHtcclxuICAgICAgYXdhaXQgKDxGaWVsZD5maWVsZERlZikuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh2YWx1ZSwgaXNOdWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgYSByaWNoY2xpZW50IHRhc2tzLCBjaGVjayBpZiBOb24tSW50ZXJhY3RpdmUgdGFzayBjaGlsZCBzaG91bGQgYmUgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZTwvcmV0dXJucz5cclxuICBTaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlNob3VsZENoaWxkQmVNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayBpZiBhIHRhc2tzIGNoaWxkIHNob3VsZCBiZSBtb2RhbFxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZENoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyB3aW5kb3cgaXMgb3BlbmVkIGFuZCBvZiBtb2RhbCB0eXBlIChkb2Vzbid0IG1hdHRlciBpZiBpbnRlcmFjdGl2ZSBvciBub3QpXHJcbiAgICBpZiAoKHRoaXMuRm9ybS5Db25jcmV0ZVdpbmRvd1R5cGUgPT09IFdpbmRvd1R5cGUuT3ZlcmxheSkgJiYgdGhpcy5nZXRGb3JtKCkuT3BlbmVkKVxyXG4gICAgICBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcGFyZW50IHRhc2sgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQYXJlbnQoKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgdGFzayBpcyB0aGUgY2hlY2tlZCB0YXNrIG9yIGEgZGVzY2VuZGFudCBvZiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNEZXNjZW5kZW50T2YoY2hrVGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIGlmIChjaGtUYXNrID09PSB0aGlzKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKGNoa1Rhc2sgPT09IG51bGwgfHwgdGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUYXNrLmlzRGVzY2VuZGVudE9mKGNoa1Rhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgc3ViZm9ybUN0cmwgd2hpY2ggaXMgTW9kYWwgaW4gY3VycmVudCBydW50aW1lIHRyZWUgaWYgdGhlcmUgaXMgYW55Py5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBHZXRTdWJmb3JtTW9kYWxQYXJlbnRUYXNrKCk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKGN1cnJUYXNrLl9wYXJlbnRUYXNrICE9IG51bGwgJiYgY3VyclRhc2suX3BhcmVudFRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG4gICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+KGN1cnJUYXNrLl9wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpKTtcclxuICAgICAgaWYgKHN1YmZvcm1DdHJsLklzTW9kYWwoKSlcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybiBzdWJmb3JtQ3RybDtcclxuICAgICAgfVxyXG4gICAgICBjdXJyVGFzayA9IGN1cnJUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBmb3IgcmVtb3RlIHRhc2sgZm9yIGV4cHJlc3Npb24gdGhhdCB3YXMgY29tcHV0ZWQgb25jZSBvbiBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlRhc2tTZXJ2aWNlLlNob3VsZEV2YWx1YXRlUHJvcGVydHlMb2NhbGx5KHByb3BJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgbWV0aG9kIHJ1bnMgYWN0aW9ucyBhZnRlciB0aGUgJ2Zvcm0nIHRhZyBpcyBoYW5kbGVkLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgRW5zdXJlVmFsaWRGb3JtKCk6IHZvaWQge1xyXG4gICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kOlxyXG4gICAgLy8gSWYgdGhpcyB0YXNrIGlzIHRoZSBtYWluIHByb2dyYW0gYW5kIF9vcGVuV2luIGV2YWx1YXRlcyB0byAnZmFsc2UnLCB0aGVuXHJcbiAgICAvLyBwcmV2ZW50IHRoZSBkaXNwbGF5IG9mIHRoZSBmb3JtLCBieSBzZXR0aW5nIGl0IHRvICdudWxsJy5cclxuICAgIGlmICh0aGlzLl9pc01haW5QcmcgJiYgdGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5fb3BlbldpbiB8fCAhdGhpcy5Gb3JtLmlzTGVnYWxGb3JtKSB7ICAgLy8gVGhpcyBjYW4gYmUgbWRpIGZyYW1lXHJcbiAgICAgICAgdGhpcy5Gb3JtID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb21wdXRlIHRoZSBtYWluIGRpc3BsYXkgb25jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDb21wdXRlTWFpbkRpc3BsYXkoKTpQcm9taXNlPHZvaWQ+ICB7XHJcbiAgICBsZXQgcHJvcE1haW5EaXNwbGF5OiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVkpO1xyXG4gICAgLy8gZ2V0IHRoZSB2YWx1ZSBvZiBtYWluIGRpc3BsYXkgXHJcbiAgICBsZXQgbWFpbkRpc3BsYXlJbmRleDogbnVtYmVyID0gYXdhaXQgcHJvcE1haW5EaXNwbGF5LmdldFZhbHVlSW50KCk7XHJcblxyXG4gICAgbWFpbkRpc3BsYXlJbmRleCA9IHRoaXMuR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5EaXNwbGF5SW5kZXgpO1xyXG5cclxuICAgIHRoaXMuX2Zvcm1zLkluaXRGb3JtRnJvbVhtbFN0cmluZyhtYWluRGlzcGxheUluZGV4KTtcclxuICAgIHRoaXMuRW5zdXJlVmFsaWRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHByZXBhcmUgdGFzayBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBQcmVwYXJlVGFza0Zvcm0oKTogUHJvbWlzZTxSZXR1cm5SZXN1bHQ+IHtcclxuICAgIGF3YWl0IFRhc2tTZXJ2aWNlQmFzZS5QcmVwYXJlUHJvcE9wZW5UYXNrV2luZG93KHRoaXMpO1xyXG4gICAgcmV0dXJuIGF3YWl0IFJlbW90ZVRhc2tTZXJ2aWNlLlByZXBhcmVQcm9wTWFpbkRpc3BsYXkodGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGZvcm0gaXMgbGVnYWxcclxuICAvLy8gd2UgYXJlIG5vdCBnZXQgdG8gdGhhdCBtZXRob2QgZm9yIG1haW4gZGlzcGxheSB0aGF0IG9wZW4gd2luZG93IGlzIGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEZvcm1Jc0xlZ2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzRm9ybUlzTGVnYWw6IGJvb2xlYW4gPSBzdXBlci5pc01haW5Qcm9nKCk7XHJcbiAgICByZXR1cm4gaXNGb3JtSXNMZWdhbCB8fCBzdXBlci5nZXRGb3JtKCkuaXNMZWdhbEZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgbWFpbiBkaXNwbGF5IG9uIHN0dWRpbyBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWFpbkRzcElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uRGVwdGgobWFpbkRzcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICB3aGlsZSAodGFzayAhPSBudWxsKSB7XHJcbiAgICAgIG1haW5Ec3BJZHggKz0gdGFzay5fZm9ybXMuQ291bnQ7XHJcbiAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluRHNwSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIG1haW4gZGlzcGxheSBvbiBzdHVkaW8gZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1haW5Ec3BJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5Ec3BJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAobWFpbkRzcElkeCA+IDEpIHtcclxuXHJcbiAgICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICAgIHdoaWxlICh0YXNrICE9IG51bGwpIHtcclxuICAgICAgICBtYWluRHNwSWR4IC09IHRhc2suX2Zvcm1zLkNvdW50O1xyXG4gICAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Ec3BJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBBbmNlc3RvciB0YXNrIChvbiBydW50aW1lIHRyZWUpIG9mIHRoZSBzZW5kIHRhc2sgZGVmaW5pdGlvbiBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmluZFRhc2tEZWZpbml0aW9uSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0QW5jZXN0b3JUYXNrQnlUYXNrRGVmaW5pdGlvbklkKGZpbmRUYXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkKTogVGFzayB7XHJcbiAgICBsZXQgY3VycmVudFRhc2s6IFRhc2sgPSB0aGlzO1xyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjOjE3Mjk1OVxyXG4gICAgLy8gaWYgdGhlIGZpbmRUYXNrRGVmaW5pdGlvbklkIGlzIG1haW4gcHJvZ3JhbSAoY2FuIGJlIG9mIGNvbXBvbmVudCkgd2Ugd2lsbCBub3QgZm91bmQgaXQgaW4gdGhlIF9wYXJlbnRUYXNrXHJcbiAgICAvLyBzbyB3ZSB3aWxsIHRha2UgdGhlIHRhc2sgZnJvbSB0aGUgTUdEYXRhVGFibGVcclxuICAgIGlmIChmaW5kVGFza0RlZmluaXRpb25JZC5Jc01haW5Qcm9ncmFtKCkpXHJcbiAgICAgIHJldHVybiA8VGFzaz5HdWlEYXRhQ29sbGVjdGlvbi5NR0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KHRoaXMuQ29udGV4dElELCBmaW5kVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCk7XHJcblxyXG4gICAgd2hpbGUgKGN1cnJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgaWYgKGN1cnJlbnRUYXNrLlRhc2tEZWZpbml0aW9uSWQuRXF1YWxzKGZpbmRUYXNrRGVmaW5pdGlvbklkKSlcclxuICAgICAgICByZXR1cm4gY3VycmVudFRhc2s7XHJcblxyXG4gICAgICBjdXJyZW50VGFzayA9IGN1cnJlbnRUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgU2V0RGF0YUNvbnRyb2xWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkOiBudW1iZXIsIGRjVmFsdWVzSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSBzdXBlci5nZXRGb3JtKCkuZ2V0Q3RybChjb250cm9sSWQpO1xyXG4gICAgY3RybC5zZXREY1ZhbElkKGRjVmFsdWVzSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkaXNwbGF5IHRlc3Qgb24gc3RhdHVzIGJhclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgRGlzcGxheU1lc3NhZ2VUb1N0YXR1c0Jhcih0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIFFjciAjNzk4MzExLiBpZiBzZXJ2ZXIgc2lkZSBoYWQgTVAgZG9pbmcgdmVyaWZ5IHRvIHBhbmUgYW5kIE1QIGhhcyBubyBmb3JtXHJcbiAgICAvLyB3ZSB3aWxsIGdldCBhbiBleGNlcHRpb24uIHNvIGluIGNhc2Ugb2Ygbm8gZm9ybSwgZ2V0IGl0IGZyb20gbGFzdCBmb2N1c2VkIHRhc2suXHJcbiAgICBsZXQgdGFza1RvVmVyaWZ5T246IFRhc2sgPSA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgaWYgKHRhc2tUb1ZlcmlmeU9uLmdldEZvcm0oKSA9PSBudWxsKVxyXG4gICAgICB0YXNrVG9WZXJpZnlPbiA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuXHJcbiAgICB0YXNrVG9WZXJpZnlPbi5Xcml0ZVRvTWVzc2FnZVBhbmUodGV4dCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIgPSAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIEdldFRhc2tEZXRhaWxzKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZXMgPSAgKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKHRhc2suUGFyZW50VGFzayAhPT0gbnVsbCAmJiAhdGFzay5QYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dGFzay5QYXJlbnRUYXNrO1xyXG4gICAgICBuYW1lcyA9ICAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCkgKyBcIi5cIiArIG5hbWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuYW1lcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBhcnNlcyB0aGUgdGFza1VSTCB0YWdcclxuICAvLy8gZXZlcnkgdGFza1VSTCB0YWcgaXMgcmVwbGFjZWQgYnkgdGhlIGRhdGEgb2YgdGhlIHhtbCBpc2xhbmQgaXQgcmVmZXJzIHRvPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBQcm9jZXNzVGFza1VSTCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB4bWxEYXRhOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTGRhdGEoKTtcclxuICAgIGxldCBlbmRUYXNrVXJsSWR4OiBudW1iZXIgPSB4bWxEYXRhLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoZW5kVGFza1VybElkeCAhPT0gLTEgJiYgZW5kVGFza1VybElkeCA8IHhtbERhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAvLyBleHRyYWN0IHRoZSB0YXNrIHVybCBhbmQgdGhlIHJlZiBsaXN0XHJcbiAgICBsZXQgdGFnOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRUYXNrVXJsSWR4KTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTCkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGgpO1xyXG5cclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kVGFza1VybElkeCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICBsZXQgdGFza0NhY2hlVVJMOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oMSk7XHJcbiAgICBsZXQgcmVmTGlzdFN0cjogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKDMpO1xyXG5cclxuICAgIC8vIGJyaW5nIHRoZSBkYXRhXHJcbiAgICBsZXQgdGFza0NvbnRlbnRPcmlnaW5hbDogc3RyaW5nID0gYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5HZXRDb250ZW50KHRhc2tDYWNoZVVSTCwgdHJ1ZSk7XHJcblxyXG4gICAgLy8gcHJlZml4IHRoZSBvcmlnaW5hbCBkYXRhIHRpbGwgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IDx0YXNrVVJMPlxyXG4gICAgbGV0IHRhc2tDb250ZW50RmluYWw6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih4bWxEYXRhLnN1YnN0cigwLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKSwgdGFza0NvbnRlbnRPcmlnaW5hbC5sZW5ndGgpO1xyXG4gICAgLy8gdGhlIG51bWJlciBvZiB0b2tlbnMgaW4gcmVmTGlzdCBhbmQgdGhlIG51bWJlciBvZiBsb2NhdGlvbiBpbiB0aGUgeG1sIHRvIGJlIHJlcGxhY2VkIChpLmUuIHRoZSBwbGFjZXMgd2l0aCBbOikgc2hvdWxkIGJlIGVxdWFsXHJcbiAgICBsZXQgcmVmbGlzdDogTGlzdDxzdHJpbmc+ID0gdGhpcy5nZXRSZWZsaXN0KHJlZkxpc3RTdHIsICc7JywgdHJ1ZSwgLTEpO1xyXG4gICAgbGV0IHJlZkxpc3RJZHggPSAwO1xyXG5cclxuICAgIGxldCBjdXJySWR4OiBudW1iZXIgPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiKTtcclxuICAgIGxldCBwcmV2SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgd2hpbGUgKGN1cnJJZHggIT09IC0xKSB7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgsIGN1cnJJZHggLSBwcmV2SWR4KSk7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHJlZmxpc3QuZ2V0X0l0ZW0ocmVmTGlzdElkeCsrKSk7XHJcbiAgICAgIGN1cnJJZHggKz0gMjtcclxuICAgICAgcHJldklkeCA9IGN1cnJJZHg7XHJcbiAgICAgIGN1cnJJZHggPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiLCBwcmV2SWR4KTtcclxuICAgIH1cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgpKTtcclxuXHJcbiAgICAvLyBzdWZmaXggdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHhtbCBmcm9tIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgPC90YXNrVVJMPlxyXG4gICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQoeG1sRGF0YS5zdWJzdHIoeG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZFRhc2tVcmxJZHggKyAxKSArIDEpKTtcclxuICAgIHhtbERhdGEgPSB0YXNrQ29udGVudEZpbmFsLlRvU3RyaW5nKCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLS0tLS0tLT4gezF9XCIsIHRhc2tDYWNoZVVSTCwgeG1sRGF0YSkpO1xyXG5cclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YSh4bWxEYXRhKTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4KFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkgLSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoICsgMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIGRhdGEgYWNvcmRpbmcgdG8gdGhlIGRlbGltZXRlciBhbmQgdGhlIHJlZmxpc3QgZGVsaW1ldGVycyBsb2dpYzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHJ1bmNcIj5pZiB0cnVlIHRydWNhdGUgZmlyc3QgJ1xcXFwnIChpbiB1c2UgZm9yIGlzbGFuZCBkYXRhIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFRva2Vuc1wiPmlmIC0xIGFsbCB0b2tlbnMgYXZpYWxhYmxlIGVsc2UgdGhlIG51bWJlciBvZiB0b2tlbnMgdG8gc2VhcmNoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRSZWZsaXN0KGRhdGE6IHN0cmluZywgZGVsaW06IHN0cmluZywgdHJ1bmM6IGJvb2xlYW4sIG1heFRva2VuczogbnVtYmVyKTogTGlzdDxzdHJpbmc+IHtcclxuICAgIGxldCBjdXJyU3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBsaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdG9rZW5zQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNpbmNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYWx3YXlzICc7JyB3ZSBzdGFydCBmcm9tIDFcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjdXJyOiBzdHJpbmcgPSBkYXRhLmNoYXJBdChpKTtcclxuXHJcbiAgICAgIGlmIChjdXJyICE9PSAnXFxcXCcgJiYgY3VyciAhPT0gZGVsaW0pXHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoY3Vycik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09IGRlbGltKSB7XHJcbiAgICAgICAgbGlzdC5wdXNoKGN1cnJTdHIuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgY3VyclN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgdG9rZW5zQ250Kys7XHJcblxyXG4gICAgICAgIGlmICh0b2tlbnNDbnQgPT09IG1heFRva2VucylcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09ICdcXFxcJykge1xyXG4gICAgICAgIC8vIHRoZSBmb3JtYXQgJ1xcXFxkZWxpbWl0ZXInIGlzIGFsd2F5cyB0cnVuY2F0ZWRcclxuICAgICAgICBpZiAoIXRydW5jICYmIGRhdGEuY2hhckF0KGkgKyAxKSAhPT0gZGVsaW0pXHJcbiAgICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgIGkrKztcclxuICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcmVmIGxpc3RcclxuICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBzZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgU3RhcnRQcm9ncmFtKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGxldCBvcmdTdG9wRXhlY3V0aW9uOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldEFsbG93RXZlbnRzKCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsKys7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTsgLy8gUUNSICM3Njk3MzQgLSBub3RoaW5nIGNhbiBzdG9wIGEgdGFzayBmcm9tIHN0YXJ0aW5nIHVwLlxyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjMjgzNjQ3IGV4ZWN1dGUgY29tcG9uZW50cyBtYWluIHByb2dyYW1zIC0gIGluIHRoZSBzZXJ2ZXIgd2UgZXhlY3V0ZSB0aGUgc2FtZSBzZWUgaW5pLmNwcCBtZXRob2QgZXhlY3V0ZV9tYWluX3Byb2dzKClcclxuICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCA9IGF3YWl0IHRoaXMuRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAvLyBleGVjdXRlIGludGVybmFsIG1haW4gcHJvZ3JhbXNcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCk7XHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFza1JlZjogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbSgwLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWYsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKCFUYXNrLl9pZGxlVGltZXJTdGFydGVkKSB7XHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2Uuc3RhcnRUaW1lcihBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLCBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRJZGxlVGltZSgwKSwgdHJ1ZSk7XHJcbiAgICAgIFRhc2suX2lkbGVUaW1lclN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIGF3YWl0IHRoaXMuRG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICBhd2FpdCB0aGlzLk1vdmVUb0ZpcnN0Q29udHJvbHMoY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG5cclxuXHJcbiAgICAvLyBIYW5kbGUgdGhlIGV2ZW50cyBvbmx5IHdoZW4gYWxsIHRoZSB0YXNrcyBhbmQgdGhlaXIgZm9ybXMgYXJlIG9wZW5lZC5cclxuICAgIGlmIChUYXNrLlN0YXJ0UHJvZ0xldmVsID09PSAxKSB7XHJcbiAgICAgIGxldCByZXNldEFsbG93RXZlbnRzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBjYW5FeGVjdXRlRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIHNldCB0aGUgd2l0aGluIG5vbiBpbnRlcmFjdGl2ZSBzaW5jZSB0aGUgaGFuZGxlRXZlbnRzIG1pZ2h0IHRyeSB0byBleGVjdXRlIGFuIGV2ZW50XHJcbiAgICAgIC8vIHRoYXQgd2FzIHJhaXNlZCBpbiB0aGUgMXN0IHJlYyBwcmVmIChhZGRlZCBpbiBtb3ZlVG9GaXJzdGNvbnRyb2xzKS5cclxuICAgICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCAhPT0gbnVsbCAmJiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNTdGFydGVkKCkpIHtcclxuICAgICAgICByZXNldEFsbG93RXZlbnRzID0gdHJ1ZTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCkpO1xyXG5cclxuICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUgdGFzayB3aXRoIGFsbG93IGV2ZW50cyA9IE5PIGlzIGFib3V0IHRvIHJ1bi5cclxuICAgICAgICAvLyBkb24ndCB0cnkgdG8gZXhlY3V0ZSB0aGUgZXZlbnRzIGJlZm9yZSBpdCBzdGFydHMgYmVjYXVzZSB0aGV5IHdpbGwgYmUgbG9zdC4gKCMxMzg0OTMpXHJcbiAgICAgICAgY2FuRXhlY3V0ZUV2ZW50cyA9IGF3YWl0ICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNBbGxvd0V2ZW50cygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiB0aGUgaXQgaXMgYSBzdWJmb3JtIHdpdGggdmlzaWJpbGl0eSBleHByZXNzaW9uIGV2YWx1YXRlZCB0byBUUlVFLFxyXG4gICAgICAvLyBzbyBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyIGRvIG5vdCBleGVjdXRlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZS5cclxuICAgICAgLy8gVGhlc2UgZXZlbnRzIHdpbGwgYmUgZXhlY3V0ZWQgZnJvbSB0aGUgJ3N0YXJ0UHJvZycgb2YgdGhlIHBhcmVudCB0YXNrLlxyXG4gICAgICBpZiAoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpICE9PSBudWxsICYmIGNhbkV4ZWN1dGVFdmVudHMpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50cyhBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0Q3Vyck1HRGF0YSgpLCAwKTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc3RvcmUuIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4gaXQgd2lsbCBiZSBzZXQgYWdhaW4gb25jZSBpbiB0aGUgY29ycmVjdCBldmVudHNMb29wLlxyXG4gICAgICBpZiAocmVzZXRBbGxvd0V2ZW50cylcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhhbGxvd0V2ZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgVGFzay5TdGFydFByb2dMZXZlbC0tO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIFxcXCJzdGFydFByb2dcXFwiXCIpO1xyXG5cclxuICAgIC8vIElmIG9yaWdpbmFsbHkgd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIHN0b3AgZXZlbnRzIGV4ZWN1dGlvbiwgdGhlbiByZXN0b3JlIHRoaXNcclxuICAgIGlmIChvcmdTdG9wRXhlY3V0aW9uICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbiAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKG9yZ1N0b3BFeGVjdXRpb24pO1xyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIGNvbXBvbmVudCdzIG1haW4gcHJvZ3JhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2FsbEJ5RGVzdFN1YkZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSBub24gaW50ZXJhY3RpdmUgdGFzayBpZiBhbnkgdGhhdCBleGVjdXRlZDwvcmV0dXJucz5cclxuICBzdGF0aWMgYXN5bmMgRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7IC8vIGdvIHdpdGggU3RhcnRQcm9ncmFtXHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFzazogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuXHJcbiAgICBsZXQgbWF4Q3RsSWR4OiBudW1iZXIgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLmdldE1heEN0bElkeCgpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbWF4Q3RsSWR4OyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGNvbXBvbmVudE1haW5Qcm9ncmFtOiBUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIGkpO1xyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudE1haW5Qcm9ncmFtICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IFRhc2suRXhlY3V0ZU1haW5Qcm9ncmFtKGksIGNhbGxCeURlc3RTdWJGb3JtLCBtb3ZlVG9GaXJzdENvbnRyb2wsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2ssIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBtYWluIHByb2dyYW0gb2YgQ3RsSW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkN0bEluZGV4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjYWxsQnlEZXN0U3ViRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEV4ZWN1dGVNYWluUHJvZ3JhbShDdGxJbmRleDogbnVtYmVyLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrOiBSZWZQYXJhbTxUYXNrPiwgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBSZWZQYXJhbTxUYXNrPiwgbWdEYXRhVGFibGU6IElNR0RhdGFDb2xsZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWFpblByb2dyYW1UYXNrOiBUYXNrID0gPFRhc2s+bWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgQ3RsSW5kZXgpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiICBDbGllbnRNYW5hZ2VyLnN0YXJ0UHJvZzogY3RsSWR4PXswfSwgdGFzaz17MX1cIiwgQ3RsSW5kZXgsIG1haW5Qcm9ncmFtVGFzaykpO1xyXG5cclxuICAgIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWUgPSAgPFRhc2s+KGF3YWl0IG1haW5Qcm9ncmFtVGFzay5TdGFydChtb3ZlVG9GaXJzdENvbnRyb2wsIGNhbGxCeURlc3RTdWJGb3JtKSk7XHJcbiAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlID09PSBudWxsKVxyXG4gICAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWUgPSBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlO1xyXG4gICAgZWxzZSBpZiAoY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UsIFwibW9yZSB0aGFuIDEgbm9uIGludGVyYWN0aXZlIHRhc2tzIGluIHN0YXJ0UHJvZ1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gT3BlbiBhbGwgdGhlIGZvcm0gdGhhdCBhcmUgcGVuZGluZyBpbiBDcmVhdGVkRm9ybXMgdmVjdG9yLiA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIE9wZW5Gb3JtcyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNyZWF0ZWRGb3JtczogQ3JlYXRlZEZvcm1WZWN0b3IgPSBNZ0Zvcm0uQ3JlYXRlZEZvcm1zO1xyXG5cclxuICAgIGlmIChjcmVhdGVkRm9ybXMuQ291bnQoKSA+IDApIHtcclxuICAgICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICAgIHdoaWxlIChpIDwgY3JlYXRlZEZvcm1zLkNvdW50KCkpIHtcclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSBjcmVhdGVkRm9ybXMuZ2V0KGkpO1xyXG4gICAgICAgIGxldCBjYW5PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIE9wZW4gYSBzdWJmb3JtIG9ubHkgaWYgaXRzIGNvbnRhaW5lciBmb3JtIGlzIE9wZW5lZC5cclxuICAgICAgICAvLyBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpIGRvZXNuJ3QgZ28gd2VsbCBmb3Igc3ViZm9ybXMgKFFDUiAjOTE5MTE5KS5cclxuICAgICAgICBpZiAobWdGb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgICBsZXQgb3BlbmVkOiBib29sZWFuID0gKDxNZ0Zvcm1CYXNlPm1nRm9ybS5nZXRTdWJGb3JtQ3RybCgpLmdldEZvcm0oKSkuT3BlbmVkO1xyXG4gICAgICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgICAgICBjYW5PcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoKDxUYXNrPm1nRm9ybS5nZXRUYXNrKCkpLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkpIHtcclxuICAgICAgICAgICAgY2FuT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FuT3Blbikge1xyXG4gICAgICAgICAgTWFuYWdlci5PcGVuRm9ybShtZ0Zvcm0pO1xyXG4gICAgICAgICAgYXdhaXQgTWFuYWdlci5Eb0ZpcnN0UmVmcmVzaFRhYmxlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWdGb3JtLk9wZW5lZCkge1xyXG5cclxuICAgICAgICAgIGNyZWF0ZWRGb3Jtcy5yZW1vdmUobWdGb3JtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdvZXMgb3ZlciBmb3JtcyBpcyBjcmVhdGVkRm9ybVZlYyBhbmQgcGVyZm9ybXMgbW92ZSB0byBmaXJzdCByZWNvcmQgY3ljbGUgY29udHJvbDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgRG9GaXJzdFJlY29yZEN5Y2xlKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShpKTtcclxuICAgICAgaWYgKG1nZCA9PT0gbnVsbCB8fCBtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBtZ2QuZ2V0VGFza3NDb3VudCgpOyBqKyspIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IG1nZC5nZXRUYXNrKGopO1xyXG5cclxuICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAgICAgICBpZiAobWdGb3JtICE9PSBudWxsICYmIHRhc2suaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSAmJiAhbWdGb3JtLklnbm9yZUZpcnN0UmVjb3JkQ3ljbGUpIHtcclxuICAgICAgICAgICAgbWdGb3JtLklnbm9yZUZpcnN0UmVjb3JkQ3ljbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgZXZlcnkgbWdkYXRhIHBlcmZvcm0gbW92ZSB0byBmaXJzdCBjb250cm9sIHRvIHRoZSBmb3JtXHJcbiAgLy8vIHRoYXQgd2UgbWFya2VkIGJlZm9yZSB3aXRoIE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBNb3ZlVG9GaXJzdENvbnRyb2xzKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKGkpO1xyXG5cclxuICAgICAgaWYgKG1nZCA9PT0gbnVsbCB8fCBtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGxldCB0YXNrc0NvdW50OiBudW1iZXIgPSBtZ2QuZ2V0VGFza3NDb3VudCgpO1xyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdGFza3NDb3VudDsgaisrKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBtZ2QuZ2V0VGFzayhqKTtcclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgICAgICBpZiAodGFzay5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpICYmIG1nRm9ybSAhPT0gbnVsbCAmJiBtZ0Zvcm0uTW92ZWRUb0ZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgbWdGb3JtLk1vdmVkVG9GaXJzdENvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghY2FsbEJ5RGVzdFN1YkZvcm0pXHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl19
|