ontimize-web-ngx 15.0.0-beta.4 → 15.0.0-rc.0

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.
Files changed (59) hide show
  1. package/esm2020/lib/components/form/navigation/o-form.navigation.class.mjs +5 -2
  2. package/esm2020/lib/components/form/o-form.component.mjs +11 -2
  3. package/esm2020/lib/components/grid/o-grid.component.mjs +11 -1
  4. package/esm2020/lib/components/image/o-image.component.mjs +3 -3
  5. package/esm2020/lib/components/index.mjs +2 -1
  6. package/esm2020/lib/components/input/combo/combo-search/o-combo-search.component.mjs +3 -3
  7. package/esm2020/lib/components/input/currency-input/o-currency-input.component.mjs +4 -4
  8. package/esm2020/lib/components/input/file-input/o-file-input.component.mjs +2 -18
  9. package/esm2020/lib/components/input/o-form-service-component.class.mjs +7 -9
  10. package/esm2020/lib/components/o-service-component.class.mjs +3 -6
  11. package/esm2020/lib/components/table/column/cell-renderer/service/o-table-cell-renderer-service.component.mjs +26 -4
  12. package/esm2020/lib/components/table/extensions/header/table-menu/o-table-menu.component.mjs +20 -4
  13. package/esm2020/lib/components/table/o-table.component.mjs +4 -1
  14. package/esm2020/lib/components/tree/header/index.mjs +2 -0
  15. package/esm2020/lib/components/tree/header/tree-menu/o-tree-menu.component.mjs +33 -0
  16. package/esm2020/lib/components/tree/index.mjs +5 -0
  17. package/esm2020/lib/components/tree/o-tree-dao.service.mjs +43 -0
  18. package/esm2020/lib/components/tree/o-tree.component.mjs +523 -0
  19. package/esm2020/lib/components/tree/o-tree.datasource.mjs +79 -0
  20. package/esm2020/lib/components/tree/o-tree.module.mjs +24 -0
  21. package/esm2020/lib/components/tree/tree-node/tree-node.component.mjs +49 -0
  22. package/esm2020/lib/config/o-modules.mjs +8 -6
  23. package/esm2020/lib/directives/o-mat-error.directive.mjs +4 -1
  24. package/esm2020/lib/i18n/i18n.mjs +17 -8
  25. package/esm2020/lib/layouts/form-layout/o-form-layout-manager-base.class.mjs +1 -1
  26. package/esm2020/lib/ontimize-web-ngx.module.mjs +4 -3
  27. package/esm2020/lib/services/permissions/o-permissions.module.mjs +1 -3
  28. package/esm2020/lib/services/permissions/permissions.service.mjs +18 -8
  29. package/esm2020/lib/services/state/o-tree-component-state.class.mjs +4 -0
  30. package/esm2020/lib/services/state/o-tree-component-state.service.mjs +50 -0
  31. package/fesm2015/ontimize-web-ngx.mjs +6441 -5678
  32. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  33. package/fesm2020/ontimize-web-ngx.mjs +6424 -5665
  34. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  35. package/lib/components/form/o-form.component.d.ts +4 -1
  36. package/lib/components/grid/o-grid.component.d.ts +1 -0
  37. package/lib/components/index.d.ts +1 -0
  38. package/lib/components/input/file-input/o-file-input.component.d.ts +1 -1
  39. package/lib/components/table/extensions/header/table-menu/o-table-menu.component.d.ts +5 -0
  40. package/lib/components/table/o-table.component.d.ts +1 -1
  41. package/lib/components/tree/header/index.d.ts +1 -0
  42. package/lib/components/tree/header/tree-menu/o-tree-menu.component.d.ts +13 -0
  43. package/lib/components/tree/index.d.ts +4 -0
  44. package/lib/components/tree/o-tree-dao.service.d.ts +18 -0
  45. package/lib/components/tree/o-tree.component.d.ts +111 -0
  46. package/lib/components/tree/o-tree.datasource.d.ts +22 -0
  47. package/lib/components/tree/o-tree.module.d.ts +14 -0
  48. package/lib/components/tree/tree-node/tree-node.component.d.ts +14 -0
  49. package/lib/i18n/i18n.d.ts +9 -0
  50. package/lib/layouts/form-layout/o-form-layout-manager-base.class.d.ts +1 -0
  51. package/lib/ontimize-web-ngx.module.d.ts +2 -1
  52. package/lib/services/state/o-tree-component-state.class.d.ts +3 -0
  53. package/lib/services/state/o-tree-component-state.service.d.ts +13 -0
  54. package/package.json +1 -1
  55. package/theme.scss +2 -2
  56. package/theming/ontimize-style-v8.scss +2 -1
  57. package/theming/styles/density.scss +6 -2
  58. package/theming/styles/ontimize-v8/o-form-field-style.scss +6 -3
  59. package/theming/themes/ontimize-black-yellow.scss +13 -3
@@ -70,6 +70,9 @@ export const DEFAULT_OUTPUTS_O_FORM = [
70
70
  'beforeCloseDetail',
71
71
  'beforeGoEditMode',
72
72
  'onFormModeChange',
73
+ 'onBeforeInsert',
74
+ 'onBeforeUpdate',
75
+ 'onBeforeDelete',
73
76
  'onInsert',
74
77
  'onUpdate',
75
78
  'onDelete',
@@ -149,6 +152,9 @@ export class OFormComponent {
149
152
  this.onUpdateMode = new EventEmitter();
150
153
  this.onInitialMode = new EventEmitter();
151
154
  this.onFormModeChange = new EventEmitter();
155
+ this.onBeforeInsert = new EventEmitter();
156
+ this.onBeforeUpdate = new EventEmitter();
157
+ this.onBeforeDelete = new EventEmitter();
152
158
  this.onInsert = new EventEmitter();
153
159
  this.onUpdate = new EventEmitter();
154
160
  this.onDelete = new EventEmitter();
@@ -653,6 +659,7 @@ export class OFormComponent {
653
659
  const self = this;
654
660
  const values = this.getAttributesValuesToInsert();
655
661
  const sqlTypes = this.getAttributesSQLTypes();
662
+ this.onBeforeInsert.emit(values);
656
663
  this.insertData(values, sqlTypes).subscribe(resp => {
657
664
  self.postCorrectInsert(resp);
658
665
  self.formCache.setCacheSnapshot();
@@ -700,6 +707,7 @@ export class OFormComponent {
700
707
  this.dialogService.alert('INFO', this._messageService.getNothingToUpdateMessage());
701
708
  return;
702
709
  }
710
+ this.onBeforeUpdate.emit(values);
703
711
  this.updateData(filter, values, sqlTypes).subscribe(resp => {
704
712
  self.postCorrectUpdate(resp);
705
713
  self.formCache.setCacheSnapshot();
@@ -720,6 +728,7 @@ export class OFormComponent {
720
728
  }
721
729
  delete() {
722
730
  const filter = this.getKeysValues();
731
+ this.onBeforeDelete.emit(filter);
723
732
  return this.deleteData(filter);
724
733
  }
725
734
  queryData(filter) {
@@ -1297,7 +1306,7 @@ export class OFormComponent {
1297
1306
  OFormComponent.DEFAULT_LAYOUT_DIRECTION = 'column';
1298
1307
  OFormComponent.guardClassName = 'CanDeactivateFormGuard';
1299
1308
  OFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OFormComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1300
- OFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: OFormComponent, selector: "o-form", inputs: { showHeader: ["show-header", "showHeader"], headerMode: ["header-mode", "headerMode"], headerPosition: ["header-position", "headerPosition"], labelheader: ["label-header", "labelheader"], labelHeaderAlign: ["label-header-align", "labelHeaderAlign"], headeractions: ["header-actions", "headeractions"], showHeaderActionsText: ["show-header-actions-text", "showHeaderActionsText"], entity: "entity", keys: "keys", columns: "columns", service: "service", stayInRecordAfterEdit: ["stay-in-record-after-edit", "stayInRecordAfterEdit"], afterInsertMode: ["after-insert-mode", "afterInsertMode"], serviceType: ["service-type", "serviceType"], queryOnInit: ["query-on-init", "queryOnInit"], parentKeys: ["parent-keys", "parentKeys"], queryMethod: ["query-method", "queryMethod"], insertMethod: ["insert-method", "insertMethod"], updateMethod: ["update-method", "updateMethod"], deleteMethod: ["delete-method", "deleteMethod"], layoutDirection: ["layout-direction", "layoutDirection"], layoutAlign: ["layout-align", "layoutAlign"], editableDetail: ["editable-detail", "editableDetail"], keysSqlTypes: ["keys-sql-types", "keysSqlTypes"], undoButton: ["undo-button", "undoButton"], showHeaderNavigation: ["show-header-navigation", "showHeaderNavigation"], oattr: ["attr", "oattr"], includeBreadcrumb: ["include-breadcrumb", "includeBreadcrumb"], detectChangesOnBlur: ["detect-changes-on-blur", "detectChangesOnBlur"], confirmExit: ["confirm-exit", "confirmExit"], ignoreOnExit: ["ignore-on-exit", "ignoreOnExit"], queryFallbackFunction: ["query-fallback-function", "queryFallbackFunction"], ignoreDefaultNavigation: ["ignore-default-navigation", "ignoreDefaultNavigation"], messageServiceType: ["message-service-type", "messageServiceType"] }, outputs: { onDataLoaded: "onDataLoaded", beforeCloseDetail: "beforeCloseDetail", beforeGoEditMode: "beforeGoEditMode", onFormModeChange: "onFormModeChange", onInsert: "onInsert", onUpdate: "onUpdate", onDelete: "onDelete", beforeInsertMode: "beforeInsertMode", beforeUpdateMode: "beforeUpdateMode", beforeInitialMode: "beforeInitialMode", onInsertMode: "onInsertMode", onUpdateMode: "onUpdateMode", onInitialMode: "onInitialMode", onCancel: "onCancel" }, host: { properties: { "class.o-form": "true" } }, providers: [
1309
+ OFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: OFormComponent, selector: "o-form", inputs: { showHeader: ["show-header", "showHeader"], headerMode: ["header-mode", "headerMode"], headerPosition: ["header-position", "headerPosition"], labelheader: ["label-header", "labelheader"], labelHeaderAlign: ["label-header-align", "labelHeaderAlign"], headeractions: ["header-actions", "headeractions"], showHeaderActionsText: ["show-header-actions-text", "showHeaderActionsText"], entity: "entity", keys: "keys", columns: "columns", service: "service", stayInRecordAfterEdit: ["stay-in-record-after-edit", "stayInRecordAfterEdit"], afterInsertMode: ["after-insert-mode", "afterInsertMode"], serviceType: ["service-type", "serviceType"], queryOnInit: ["query-on-init", "queryOnInit"], parentKeys: ["parent-keys", "parentKeys"], queryMethod: ["query-method", "queryMethod"], insertMethod: ["insert-method", "insertMethod"], updateMethod: ["update-method", "updateMethod"], deleteMethod: ["delete-method", "deleteMethod"], layoutDirection: ["layout-direction", "layoutDirection"], layoutAlign: ["layout-align", "layoutAlign"], editableDetail: ["editable-detail", "editableDetail"], keysSqlTypes: ["keys-sql-types", "keysSqlTypes"], undoButton: ["undo-button", "undoButton"], showHeaderNavigation: ["show-header-navigation", "showHeaderNavigation"], oattr: ["attr", "oattr"], includeBreadcrumb: ["include-breadcrumb", "includeBreadcrumb"], detectChangesOnBlur: ["detect-changes-on-blur", "detectChangesOnBlur"], confirmExit: ["confirm-exit", "confirmExit"], ignoreOnExit: ["ignore-on-exit", "ignoreOnExit"], queryFallbackFunction: ["query-fallback-function", "queryFallbackFunction"], ignoreDefaultNavigation: ["ignore-default-navigation", "ignoreDefaultNavigation"], messageServiceType: ["message-service-type", "messageServiceType"] }, outputs: { onDataLoaded: "onDataLoaded", beforeCloseDetail: "beforeCloseDetail", beforeGoEditMode: "beforeGoEditMode", onFormModeChange: "onFormModeChange", onBeforeInsert: "onBeforeInsert", onBeforeUpdate: "onBeforeUpdate", onBeforeDelete: "onBeforeDelete", onInsert: "onInsert", onUpdate: "onUpdate", onDelete: "onDelete", beforeInsertMode: "beforeInsertMode", beforeUpdateMode: "beforeUpdateMode", beforeInitialMode: "beforeInitialMode", onInsertMode: "onInsertMode", onUpdateMode: "onUpdateMode", onInitialMode: "onInitialMode", onCancel: "onCancel" }, host: { properties: { "class.o-form": "true" } }, providers: [
1301
1310
  { provide: OFormBase, useExisting: forwardRef(() => OFormComponent) },
1302
1311
  OntimizeServiceProvider,
1303
1312
  OFormMessageService
@@ -1355,4 +1364,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1355
1364
  type: ViewChild,
1356
1365
  args: ['innerForm']
1357
1366
  }] } });
1358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxFQUlOLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUVoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU16RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFRbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtC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QixFQUFFOzttREFDSTtBQWU1QjtJQUFDLHFCQUFxQixFQUFFOzsrREFDd0I7MkZBNURyQyxjQUFjO2tCQWhCMUIsU0FBUzsrQkFDRSxRQUFRLGFBQ1A7d0JBQ1QsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxFQUFFO3dCQUNyRSx1QkFBdUI7d0JBQ3ZCLG1CQUFtQjtxQkFDcEIsVUFHTyxxQkFBcUIsV0FDcEIsc0JBQXNCLGlCQUNoQixpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLGdCQUFnQixFQUFFLE1BQU07cUJBQ3pCOytOQVNELFVBQVUsTUFZVixxQkFBcUIsTUFJWCxXQUFXLE1BU1gsY0FBYyxNQUd4QixVQUFVLE1BRVYsb0JBQW9CLE1BR3BCLGlCQUFpQixNQUVqQixtQkFBbUIsTUFFbkIsV0FBVyxNQWdCSix1QkFBdUIsTUFxRU4sV0FBVztzQkFBbEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgSUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRm9ybURhdGFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JtRGF0YVR5cGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS10eXBlLWNvbXBvbmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPRm9ybUxheW91dE1hbmFnZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L28tZm9ybS1sYXlvdXQtbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmFjdG9yaWVzJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlLCBPTmF2aWdhdGlvbkl0ZW0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb250aW1pemUvb250aW1pemUuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFNuYWNrQmFyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NuYWNrYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT0NvbmZpZ3VyZU1lc3NhZ2VTZXJ2aWNlQXJncyB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1tZXNzYWdlLXNlcnZpY2UtYXJncy50eXBlJztcbmltcG9ydCB7IE9Db25maWd1cmVTZXJ2aWNlQXJncyB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1zZXJ2aWNlLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBGb3JtTGF5b3V0Q2xvc2VEZXRhaWxPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvZm9ybS1sYXlvdXQtZGV0YWlsLWNvbXBvbmVudC1kYXRhLnR5cGUnO1xuaW1wb3J0IHsgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL2Zvcm0tdmFsdWUtb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9Gb3JtSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1mb3JtLWluaXRpYWxpemF0aW9uLW9wdGlvbnMudHlwZSc7XG5pbXBvcnQgeyBPRm9ybVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1mb3JtLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBTUUxUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWwvc3FsdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tY29udGFpbmVyL28tZm9ybS1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29udHJvbCB9IGZyb20gJy4uL2lucHV0L28tZm9ybS1jb250cm9sLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtQ2FjaGVDbGFzcyB9IGZyb20gJy4vY2FjaGUvby1mb3JtLmNhY2hlLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtQmFzZSB9IGZyb20gJy4vby1mb3JtLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSwgQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCB9IGZyb20gJy4vZ3VhcmRzL28tZm9ybS1jYW4tZGVhY3RpdmF0ZS5ndWFyZCc7XG5pbXBvcnQgeyBPRm9ybU5hdmlnYXRpb25DbGFzcyB9IGZyb20gJy4vbmF2aWdhdGlvbi9vLWZvcm0ubmF2aWdhdGlvbi5jbGFzcyc7XG5pbXBvcnQgeyBPRm9ybVZhbHVlIH0gZnJvbSAnLi9vLWZvcm0tdmFsdWUnO1xuaW1wb3J0IHsgT0Zvcm1NZXNzYWdlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvby1mb3JtLW1lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPRm9ybVRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXIvby1mb3JtLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS1jb21wb25lbnQtaGFzaC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRNYW5hZ2VyQmFzZSB9IGZyb20gJy4uLy4uL2xheW91dHMvZm9ybS1sYXlvdXQvby1mb3JtLWxheW91dC1tYW5hZ2VyLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT0Zvcm1Ub29sYmFyQmFzZSB9IGZyb20gJy4vdG9vbGJhci9vLWZvcm0tdG9vbGJhci1iYXNlLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fRk9STSA9IFtcbiAgLy8gc2hvdy1oZWFkZXIgW2Jvb2xlYW5dOiB2aXNpYmlsaXR5IG9mIGZvcm0gdG9vbGJhci4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0hlYWRlcjogc2hvdy1oZWFkZXInLFxuXG4gIC8vIGhlYWRlci1tb2RlIFtzdHJpbmddWyBub25lIHwgZmxvYXRpbmcgXTogcGFpbnRpbmcgbW9kZSBvZiBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6ICdmbG9hdGluZydcbiAgJ2hlYWRlck1vZGU6IGhlYWRlci1tb2RlJyxcblxuICAvLyBoZWFkZXItcG9zaXRpb24gWyB0b3AgfCBib3R0b20gXTogcG9zaXRpb24gb2YgdGhlIGZvcm0gdG9vbGJhci4gRGVmYXVsdDogJ3RvcCdcbiAgJ2hlYWRlclBvc2l0aW9uOiBoZWFkZXItcG9zaXRpb24nLFxuXG4gIC8vIGxhYmVsLWhlYWRlciBbc3RyaW5nXTogZGlzcGxheWFibGUgdGV4dCBvbiBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6ICcnLlxuICAnbGFiZWxoZWFkZXI6IGxhYmVsLWhlYWRlcicsXG5cbiAgLy8gbGFiZWwtaGVhZGVyLWFsaWduIFtzdHJpbmddW3N0YXJ0IHwgY2VudGVyIHwgZW5kXTogYWxpZ25tZW50IG9mIGZvcm0gdG9vbGJhciB0ZXh0LiBEZWZhdWx0OiAnY2VudGVyJ1xuICAnbGFiZWxIZWFkZXJBbGlnbjogbGFiZWwtaGVhZGVyLWFsaWduJyxcblxuICAvLyBoZWFkZXItYWN0aW9ucyBbc3RyaW5nXTogYXZhaWxhYmxlIGFjdGlvbiBidXR0b25zIG9uIGZvcm0gdG9vbGJhciBvZiBzdGFuZGFyZCBDUlVEIG9wZXJhdGlvbnMsIHNlcGFyYXRlZCBieSAnOycuIEF2YWlsYWJsZSBvcHRpb25zIGFyZSBSO0k7VTtEIChSZWZyZXNoLCBJbnNlcnQsIFVwZGF0ZSwgRGVsZXRlKS4gRGVmYXVsdDogUjtJO1U7RFxuICAnaGVhZGVyYWN0aW9uczogaGVhZGVyLWFjdGlvbnMnLFxuXG4gIC8vIHNob3ctaGVhZGVyLWFjdGlvbnMtdGV4dCBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBmb3JtIHRvb2xiYXIgYnV0dG9ucy4gRGVmYXVsdCB5ZXNcbiAgJ3Nob3dIZWFkZXJBY3Rpb25zVGV4dDogc2hvdy1oZWFkZXItYWN0aW9ucy10ZXh0JyxcblxuICAvLyBlbnRpdHkgW3N0cmluZ106IGVudGl0eSBvZiB0aGUgc2VydmljZS4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdlbnRpdHknLFxuXG4gIC8vIGtleXMgW3N0cmluZ106IGVudGl0eSBrZXlzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXMnLFxuXG4gIC8vIGNvbHVtbnMgW3N0cmluZ106IGNvbHVtbnMgb2YgdGhlIGVudGl0eSwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdjb2x1bW5zJyxcblxuICAvLyBzZXJ2aWNlIFtzdHJpbmddOiBKRUUgc2VydmljZSBwYXRoLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NlcnZpY2UnLFxuXG4gIC8vIHN0YXktaW4tcmVjb3JkLWFmdGVyLWVkaXQgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93cyBlZGl0IGZvcm0gYWZ0ZXIgZWRpdCBhIHJlY29yZC4gRGVmYXVsdDogZmFsc2U7XG4gICdzdGF5SW5SZWNvcmRBZnRlckVkaXQ6IHN0YXktaW4tcmVjb3JkLWFmdGVyLWVkaXQnLFxuXG4gIC8vIFtzdHJpbmddW25ldyB8IGRldGFpbF06IHNob3dzIHJlc2V0ZWQgZm9ybSBhZnRlciBpbnNlcnQgYSBuZXcgcmVjb3JkIChuZXcpIG9yIHNob3dzIHRoZSBpbnNlcnRlZCByZWNvcmQgYWZ0ZXIgKGRldGFpbClcbiAgJ2FmdGVySW5zZXJ0TW9kZTogYWZ0ZXItaW5zZXJ0LW1vZGUnLFxuXG4gICdzZXJ2aWNlVHlwZSA6IHNlcnZpY2UtdHlwZScsXG5cbiAgJ3F1ZXJ5T25Jbml0IDogcXVlcnktb24taW5pdCcsXG5cbiAgJ3BhcmVudEtleXM6IHBhcmVudC1rZXlzJyxcblxuICAvLyBxdWVyeS1tZXRob2QgW3N0cmluZ106IG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIHRvIHBlcmZvcm0gcXVlcmllcy4gRGVmYXVsdDogcXVlcnkuXG4gICdxdWVyeU1ldGhvZDogcXVlcnktbWV0aG9kJyxcblxuICAvLyBpbnNlcnQtbWV0aG9kIFtzdHJpbmddOiBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCB0byBwZXJmb3JtIGluc2VydHMuIERlZmF1bHQ6IGluc2VydC5cbiAgJ2luc2VydE1ldGhvZDogaW5zZXJ0LW1ldGhvZCcsXG5cbiAgLy8gdXBkYXRlLW1ldGhvZCBbc3RyaW5nXTogbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QgdG8gcGVyZm9ybSB1cGRhdGVzLiBEZWZhdWx0OiB1cGRhdGUuXG4gICd1cGRhdGVNZXRob2Q6IHVwZGF0ZS1tZXRob2QnLFxuXG4gIC8vIGRlbGV0ZS1tZXRob2QgW3N0cmluZ106IG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIHRvIHBlcmZvcm0gZGVsZXRpb25zLiBEZWZhdWx0OiBkZWxldGUuXG4gICdkZWxldGVNZXRob2Q6IGRlbGV0ZS1tZXRob2QnLFxuXG4gIC8vIGxheW91dC1kaXJlY3Rpb24gW3N0cmluZ11bY29sdW1ufHJvd106IERlZmF1bHQ6IGNvbHVtblxuICAnbGF5b3V0RGlyZWN0aW9uOiBsYXlvdXQtZGlyZWN0aW9uJyxcblxuICAvLyBmeExheW91dEFsaWduIHZhbHVlLiBEZWZhdWx0OiAnc3RhcnQgc3RhcnQnXG4gICdsYXlvdXRBbGlnbjogbGF5b3V0LWFsaWduJyxcblxuICAvLyBlZGl0YWJsZS1kZXRhaWwgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBEZWZhdWx0OiB0cnVlO1xuICAnZWRpdGFibGVEZXRhaWw6IGVkaXRhYmxlLWRldGFpbCcsXG5cbiAgLy8ga2V5cy1zcWwtdHlwZXMgW3N0cmluZ106IGVudGl0eSBrZXlzIHR5cGVzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXNTcWxUeXBlczoga2V5cy1zcWwtdHlwZXMnLFxuXG4gIC8vIHVuZG8tYnV0dG9uIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogSW5jbHVkZSB1bmRvIGJ1dHRvbiBpbiBmb3JtLXRvb2xiYXIuIERlZmF1bHQ6IHRydWU7XG4gICd1bmRvQnV0dG9uOiB1bmRvLWJ1dHRvbicsXG5cbiAgLy8gc2hvdy1oZWFkZXItbmF2aWdhdGlvbiBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluY2x1ZGUgbmF2aWdhdGlvbnMgYnV0dG9ucyBpbiBmb3JtLXRvb2xiYXIuIERlZmF1bHQ6IGZhbHNlO1xuICAnc2hvd0hlYWRlck5hdmlnYXRpb246IHNob3ctaGVhZGVyLW5hdmlnYXRpb24nLFxuXG4gIC8vIGF0dHJcbiAgJ29hdHRyOmF0dHInLFxuXG4gICdpbmNsdWRlQnJlYWRjcnVtYjogaW5jbHVkZS1icmVhZGNydW1iJyxcblxuICAnZGV0ZWN0Q2hhbmdlc09uQmx1cjogZGV0ZWN0LWNoYW5nZXMtb24tYmx1cicsXG5cbiAgJ2NvbmZpcm1FeGl0OiBjb25maXJtLWV4aXQnLFxuXG4gIC8vIGlnbm9yZS1vbi1leGl0IFtzdHJpbmddOiBmaWVsZHMgYXR0cidzIHRoYXQgd2lsbCBiZSBpZ25vcmVkIHdoZW4gdGhlIGZvcm0gaXMgY2xvc2VkLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2lnbm9yZU9uRXhpdDogaWdub3JlLW9uLWV4aXQnLFxuXG4gIC8vIFtmdW5jdGlvbl06IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gcXVlcnkgZXJyb3IuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncXVlcnlGYWxsYmFja0Z1bmN0aW9uOiBxdWVyeS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2luc2VydEZhbGxiYWNrRnVuY3Rpb246IGluc2VydC1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ3VwZGF0ZUZhbGxiYWNrRnVuY3Rpb246IHVwZGF0ZS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2RlbGV0ZUZhbGxiYWNrRnVuY3Rpb246IGRlbGV0ZS1mYWxsYmFjay1mdW5jdGlvbidcblxuICAvLyBpZ25vcmUtZGVmYXVsdC1uYXZpZ2F0aW9uIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogaWdub3JlIGRlZmF1bHQgbmF2aWdhdGlvbiB3aGVuIHVzZXIgY2xpY2sgdGhlIHRvb2xiYXIgYnV0dG9ucy4gRGVmYXVsdDogbm8uXG4gICdpZ25vcmVEZWZhdWx0TmF2aWdhdGlvbjogaWdub3JlLWRlZmF1bHQtbmF2aWdhdGlvbicsXG5cbiAgJ21lc3NhZ2VTZXJ2aWNlVHlwZSA6IG1lc3NhZ2Utc2VydmljZS10eXBlJyxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19GT1JNID0gW1xuICAnb25EYXRhTG9hZGVkJyxcbiAgJ2JlZm9yZUNsb3NlRGV0YWlsJyxcbiAgJ2JlZm9yZUdvRWRpdE1vZGUnLFxuICAnb25Gb3JtTW9kZUNoYW5nZScsXG4gICdvbkluc2VydCcsXG4gICdvblVwZGF0ZScsXG4gICdvbkRlbGV0ZScsXG4gICdiZWZvcmVJbnNlcnRNb2RlJyxcbiAgJ2JlZm9yZVVwZGF0ZU1vZGUnLFxuICAnYmVmb3JlSW5pdGlhbE1vZGUnLFxuICAnb25JbnNlcnRNb2RlJyxcbiAgJ29uVXBkYXRlTW9kZScsXG4gICdvbkluaXRpYWxNb2RlJyxcbiAgJ29uQ2FuY2VsJ1xuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby1mb3JtJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBPRm9ybUJhc2UsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9Gb3JtQ29tcG9uZW50KSB9LFxuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyLFxuICAgIE9Gb3JtTWVzc2FnZVNlcnZpY2VcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL28tZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fRk9STSxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fRk9STSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby1mb3JtXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENhbkNvbXBvbmVudERlYWN0aXZhdGUsIEFmdGVyVmlld0luaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9MQVlPVVRfRElSRUNUSU9OID0gJ2NvbHVtbic7XG4gIHB1YmxpYyBzdGF0aWMgZ3VhcmRDbGFzc05hbWUgPSAnQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCc7XG5cbiAgLyogaW5wdXRzIHZhcmlhYmxlcyAqL1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIGhlYWRlck1vZGU6IHN0cmluZyA9ICdmbG9hdGluZyc7XG4gIGhlYWRlclBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nID0gJ3RvcCc7XG4gIGxhYmVsaGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgbGFiZWxIZWFkZXJBbGlnbjogc3RyaW5nID0gJ2NlbnRlcic7XG4gIGhlYWRlcmFjdGlvbnM6IHN0cmluZyA9ICcnO1xuICBzaG93SGVhZGVyQWN0aW9uc1RleHQ6IHN0cmluZyA9ICd5ZXMnO1xuICBlbnRpdHk6IHN0cmluZztcbiAga2V5czogc3RyaW5nID0gJyc7XG4gIGNvbHVtbnM6IHN0cmluZyA9ICcnO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzdGF5SW5SZWNvcmRBZnRlckVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWZ0ZXJJbnNlcnRNb2RlOiAnbmV3JyB8ICdkZXRhaWwnIHwgJ2Nsb3NlJyA9ICdjbG9zZSc7XG4gIHNlcnZpY2VUeXBlOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwcm90ZWN0ZWQgcXVlcnlPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcGFyZW50S2V5czogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcXVlcnlNZXRob2Q6IHN0cmluZyA9IENvZGVzLlFVRVJZX01FVEhPRDtcbiAgcHJvdGVjdGVkIGluc2VydE1ldGhvZDogc3RyaW5nID0gQ29kZXMuSU5TRVJUX01FVEhPRDtcbiAgcHJvdGVjdGVkIHVwZGF0ZU1ldGhvZDogc3RyaW5nID0gQ29kZXMuVVBEQVRFX01FVEhPRDtcbiAgcHJvdGVjdGVkIGRlbGV0ZU1ldGhvZDogc3RyaW5nID0gQ29kZXMuREVMRVRFX01FVEhPRDtcbiAgcHJvdGVjdGVkIF9sYXlvdXREaXJlY3Rpb246IHN0cmluZyA9IE9Gb3JtQ29tcG9uZW50LkRFRkFVTFRfTEFZT1VUX0RJUkVDVElPTjtcbiAgcHJvdGVjdGVkIF9sYXlvdXRBbGlnbjogc3RyaW5nID0gJ3N0YXJ0IHN0cmV0Y2gnO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIGVkaXRhYmxlRGV0YWlsOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGtleXNTcWxUeXBlczogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgdW5kb0J1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93SGVhZGVyTmF2aWdhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgb2F0dHI6IHN0cmluZyA9ICcnO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgaW5jbHVkZUJyZWFkY3J1bWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGRldGVjdENoYW5nZXNPbkJsdXI6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29uZmlybUV4aXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBzZXQgaWdub3JlT25FeGl0KHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbCA9IFV0aWwucGFyc2VBcnJheSh2YWwsIHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9pZ25vcmVPbkV4aXQgPSB2YWw7XG4gIH1cbiAgZ2V0IGlnbm9yZU9uRXhpdCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZU9uRXhpdDtcbiAgfVxuICBwcm90ZWN0ZWQgX2lnbm9yZU9uRXhpdDogc3RyaW5nW107XG4gIHB1YmxpYyBxdWVyeUZhbGxiYWNrRnVuY3Rpb246IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAvLyBwdWJsaWMgaW5zZXJ0RmFsbGJhY2tGdW5jdGlvbjogRnVuY3Rpb247XG4gIC8vIHB1YmxpYyB1cGRhdGVGYWxsYmFja0Z1bmN0aW9uOiBGdW5jdGlvbjtcbiAgLy8gcHVibGljIGRlbGV0ZUZhbGxiYWNrRnVuY3Rpb246IEZ1bmN0aW9uO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIGlnbm9yZURlZmF1bHROYXZpZ2F0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIG1lc3NhZ2VTZXJ2aWNlVHlwZTogc3RyaW5nO1xuICAvKiBlbmQgb2YgaW5wdXRzIHZhcmlhYmxlcyAqL1xuXG4gIC8qcGFyc2VkIGlucHV0cyB2YXJpYWJsZXMgKi9cbiAgaXNEZXRhaWxGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIGtleXNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgY29sc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBkYXRhU2VydmljZTogYW55O1xuICBfcEtleXNFcXVpdiA9IHt9O1xuICBrZXlzU3FsVHlwZXNBcnJheTogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwcm90ZWN0ZWQgX21lc3NhZ2VTZXJ2aWNlOiBPRm9ybU1lc3NhZ2VTZXJ2aWNlO1xuICAvKiBlbmQgb2YgcGFyc2VkIGlucHV0cyB2YXJpYWJsZXMgKi9cblxuICBmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXA7XG4gIG9uRGF0YUxvYWRlZDogRXZlbnRFbWl0dGVyPG9iamVjdD4gPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgYmVmb3JlQ2xvc2VEZXRhaWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGJlZm9yZVVwZGF0ZU1vZGVgIGluc3RlYWRcbiAgICovXG4gIGJlZm9yZUdvRWRpdE1vZGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIGJlZm9yZUluc2VydE1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIGJlZm9yZVVwZGF0ZU1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIGJlZm9yZUluaXRpYWxNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBvbkluc2VydE1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIG9uVXBkYXRlTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgb25Jbml0aWFsTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgb25Gb3JtTW9kZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgcHVibGljIG9uSW5zZXJ0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uVXBkYXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uRGVsZXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJvdGVjdGVkIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBsb2FkaW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHVibGljIGZvcm1EYXRhOiBvYmplY3QgPSB7fTtcbiAgcHVibGljIG5hdmlnYXRpb25EYXRhOiBBcnJheTxhbnk+ID0gW107XG4gIHB1YmxpYyBjdXJyZW50SW5kZXggPSAwO1xuICBwdWJsaWMgbW9kZTogbnVtYmVyID0gT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUw7XG5cbiAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2U7XG4gIHByb3RlY3RlZCBzbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZTtcblxuICBwcm90ZWN0ZWQgX2Zvcm1Ub29sYmFyOiBPRm9ybVRvb2xiYXJCYXNlO1xuXG4gIHByb3RlY3RlZCBfY29tcG9uZW50czogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCA9IHt9O1xuICBwcm90ZWN0ZWQgX2NvbXBTUUxUeXBlczogb2JqZWN0ID0ge307XG5cbiAgZm9ybVBhcmVudEtleXNWYWx1ZXM6IG9iamVjdDtcblxuICBwdWJsaWMgb25Gb3JtSW5pdFN0cmVhbTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBwcm90ZWN0ZWQgcmVsb2FkU3RyZWFtOiBPYnNlcnZhYmxlPGFueT47XG4gIHByb3RlY3RlZCByZWxvYWRTdHJlYW1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgcXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGxvYWRlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgZHluYW1pY0Zvcm1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgZGVhY3RpdmF0ZUd1YXJkOiBDYW5EZWFjdGl2YXRlRm9ybUd1YXJkO1xuICBwdWJsaWMgZGVhY3RpdmF0ZUd1YXJkSWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIGZvcm1DYWNoZTogT0Zvcm1DYWNoZUNsYXNzO1xuICBwcm90ZWN0ZWQgZm9ybU5hdmlnYXRpb246IE9Gb3JtTmF2aWdhdGlvbkNsYXNzO1xuXG4gIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBPRm9ybUNvbnRhaW5lckNvbXBvbmVudDtcblxuICBwcm90ZWN0ZWQgcGVybWlzc2lvbnNTZXJ2aWNlOiBQZXJtaXNzaW9uc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBwZXJtaXNzaW9uczogT0Zvcm1QZXJtaXNzaW9ucztcblxuICBAVmlld0NoaWxkKCdpbm5lckZvcm0nKSBpbm5lckZvcm1FbDogRWxlbWVudFJlZjtcblxuICBpZ25vcmVGb3JtQ2FjaGVLZXlzOiBBcnJheTxhbnk+ID0gW107XG4gIGNhbkRpc2NhcmRDaGFuZ2VzOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzdGF0aWMgTW9kZSgpOiBhbnkge1xuICAgIGVudW0gbSB7XG4gICAgICBRVUVSWSxcbiAgICAgIElOU0VSVCxcbiAgICAgIFVQREFURSxcbiAgICAgIElOSVRJQUxcbiAgICB9XG4gICAgcmV0dXJuIG07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZWxSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG5cbiAgICB0aGlzLmZvcm1DYWNoZSA9IG5ldyBPRm9ybUNhY2hlQ2xhc3ModGhpcyk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbiA9IG5ldyBPRm9ybU5hdmlnYXRpb25DbGFzcyh0aGlzLmluamVjdG9yLCB0aGlzLCB0aGlzLnJvdXRlciwgdGhpcy5hY3RSb3V0ZSk7XG5cbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBpbmplY3Rvci5nZXQ8RGlhbG9nU2VydmljZT4oRGlhbG9nU2VydmljZSBhcyBUeXBlPERpYWxvZ1NlcnZpY2U+KTtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0PE5hdmlnYXRpb25TZXJ2aWNlPihOYXZpZ2F0aW9uU2VydmljZSBhcyBUeXBlPE5hdmlnYXRpb25TZXJ2aWNlPik7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSBpbmplY3Rvci5nZXQ8U25hY2tCYXJTZXJ2aWNlPihTbmFja0JhclNlcnZpY2UgYXMgVHlwZTxTbmFja0JhclNlcnZpY2U+KTtcbiAgICB0aGlzLnBlcm1pc3Npb25zU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PFBlcm1pc3Npb25zU2VydmljZT4oUGVybWlzc2lvbnNTZXJ2aWNlIGFzIFR5cGU8UGVybWlzc2lvbnNTZXJ2aWNlPik7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlbG9hZFN0cmVhbSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgc2VsZi5vbkZvcm1Jbml0U3RyZWFtLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgc2VsZi5mb3JtTmF2aWdhdGlvbi5uYXZpZ2F0aW9uU3RyZWFtLmFzT2JzZXJ2YWJsZSgpXG4gICAgXSk7XG5cbiAgICB0aGlzLnJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbiA9IHRoaXMucmVsb2FkU3RyZWFtLnN1YnNjcmliZSh2YWxBcnIgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNBcnJheSh2YWxBcnIpICYmIHZhbEFyci5sZW5ndGggPT09IDIgJiYgIXNlbGYuaXNJbkluc2VydE1vZGUoKSkge1xuICAgICAgICBjb25zdCB2YWxBcnJWYWx1ZXMgPSB2YWxBcnJbMF0gPT09IHRydWUgJiYgdmFsQXJyWzFdID09PSB0cnVlO1xuICAgICAgICBpZiAoc2VsZi5xdWVyeU9uSW5pdCAmJiB2YWxBcnJWYWx1ZXMpIHtcbiAgICAgICAgICBzZWxmLnJlbG9hZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLmluaXRpYWxpemVGaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZm9ybUNvbnRhaW5lciA9IGluamVjdG9yLmdldChPRm9ybUNvbnRhaW5lckNvbXBvbmVudCk7XG4gICAgICB0aGlzLmZvcm1Db250YWluZXIuc2V0Rm9ybSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyRm9ybUNvbXBvbmVudChjb21wOiBhbnkpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcblxuICAgICAgICBpZiAoIWNvbXAuaXNBdXRvbWF0aWNSZWdpc3RlcmluZygpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudHMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgICBjb21wLnJlcGVhdGVkQXR0ciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIGNvbXBvbmVudCByZWdpc3RlcmVkIGluIHRoZSBmb3JtIHdpdGggdGhlIGF0dHI6ICcgKyBhdHRyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb21wb25lbnRzW2F0dHJdID0gY29tcDtcbiAgICAgICAgLy8gU2V0dGluZyBwYXJlbnQga2V5IHZhbHVlcy4uLlxuICAgICAgICBpZiAodGhpcy5mb3JtUGFyZW50S2V5c1ZhbHVlcyAmJiB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzW2F0dHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzW2F0dHJdO1xuICAgICAgICAgIHRoaXMuX2NvbXBvbmVudHNbYXR0cl0uc2V0VmFsdWUodmFsLCB7XG4gICAgICAgICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICogVE9ETy4gQ2hlY2sgaXQhISFcbiAgICAgICAgKiBFbiB1biBmb3JtdWxhcmlvIGNvbiB0YWJzLCBjdWFuZG8gc2UgY2FtYmlhIGRlIHVubyBhIG90cm8sIHNlIGRlc3RydXllbiBsYXMgdmlzdGFzXG4gICAgICAgICogZGUgbG9zIGNvbXBvbmVudGVzIGhpam8gZGVsIGZvcm11bGFyaW8uXG4gICAgICAgICogZm9ybURhdGFDYWNoZSBjb250aWVuZSBsb3MgdmFsb3JlcyAob3JpZ2luYWxlcyDDsyBlZGl0YWRvcykgZGUgbG9zIGNhbXBvcyBkZWwgZm9ybXVsYXJpby5cbiAgICAgICAgKiBMYSBpZGVhIGVzIGFzaWduYXIgZXNlIHZhbG9yIGFsIGNhbXBvIGN1YW5kbyBzZSByZWdpc3RyZSBkZSBudWV2byAoSGF5IHF1ZSBhc2VndXJhciBlbCBwcm9jZXNvXG4gICAgICAgICogcGFyYSBxdWUgc8OzbG8gc2VhIGN1YW5kbyBzZSByZWdpc3RyYSBkZSBudWV2byA7KSApXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IGNhY2hlZFZhbHVlID0gdGhpcy5mb3JtQ2FjaGUuZ2V0Q2FjaGVkVmFsdWUoYXR0cik7XG4gICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChjYWNoZWRWYWx1ZSkgJiYgdGhpcy5nZXREYXRhVmFsdWVzKCkgJiYgdGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIHRoaXMuX2NvbXBvbmVudHNbYXR0cl0uc2V0VmFsdWUoY2FjaGVkVmFsdWUsIHtcbiAgICAgICAgICAgIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UsXG4gICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlclNRTFR5cGVGb3JtQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YVR5cGVDb21wb25lbnQpIHtcbiAgICBpZiAoKGNvbXAgYXMgYW55KS5yZXBlYXRlZEF0dHIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBjb21wLmdldFNRTFR5cGUoKTtcbiAgICAgIGNvbnN0IGF0dHIgPSBjb21wLmdldEF0dHJpYnV0ZSgpO1xuICAgICAgaWYgKHR5cGUgIT09IFNRTFR5cGVzLk9USEVSICYmIGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwICYmIHRoaXMuaWdub3JlRm9ybUNhY2hlS2V5cy5pbmRleE9mKGF0dHIpID09PSAtMSkge1xuICAgICAgICAvLyBSaWdodCBub3cganVzdCBzdG9yZSB2YWx1ZXMgZGlmZmVyZW50IG9mICdPVEhFUidcbiAgICAgICAgdGhpcy5fY29tcFNRTFR5cGVzW2F0dHJdID0gdHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlckZvcm1Db250cm9sQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YUNvbXBvbmVudCkge1xuICAgIGlmICgoY29tcCBhcyBhbnkpLnJlcGVhdGVkQXR0cikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gY29tcC5nZXRDb250cm9sKCk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAucmVnaXN0ZXJDb250cm9sKGF0dHIsIGNvbnRyb2wpO1xuICAgICAgICAgIGlmICghY29tcC5pc0F1dG9tYXRpY1JlZ2lzdGVyaW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlRm9ybUNhY2hlS2V5cy5wdXNoKGNvbXAuZ2V0QXR0cmlidXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXJGb3JtQ29tcG9uZW50KGNvbXA6IElDb21wb25lbnQpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDAgJiYgdGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fY29tcG9uZW50c1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGUoKTpzdHJpbmcge1xuICAgIGlmICh0aGlzLm9hdHRyKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYXR0cjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVucmVnaXN0ZXJGb3JtQ29udHJvbENvbXBvbmVudChjb21wOiBJRm9ybURhdGFDb21wb25lbnQpIHtcbiAgICBpZiAoY29tcCAmJiBjb21wLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSkge1xuICAgICAgY29uc3QgY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gY29tcC5nZXRDb250cm9sKCk7XG4gICAgICBjb25zdCBhdHRyID0gY29tcC5nZXRBdHRyaWJ1dGUoKTtcbiAgICAgIGlmIChjb250cm9sICYmIGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woYXR0cik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlclNRTFR5cGVGb3JtQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YVR5cGVDb21wb25lbnQpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBTUUxUeXBlc1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRvb2xiYXIoZlRvb2xiYXI6IE9Gb3JtVG9vbGJhckNvbXBvbmVudCkge1xuICAgIGlmIChmVG9vbGJhcikge1xuICAgICAgdGhpcy5fZm9ybVRvb2xiYXIgPSBmVG9vbGJhcjtcbiAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLmlzRGV0YWlsID0gdGhpcy5pc0RldGFpbEZvcm07XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50cygpOiBJRm9ybURhdGFDb21wb25lbnRIYXNoIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50cztcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKCk6IGFueSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gICAgY29uc3QgbG9hZE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh0cnVlKTtcbiAgICAgIH0sIDI1MCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgc2VsZi5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgfSk7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbG9hZE9ic2VydmFibGUuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHNlbGYubG9hZGluZ1N1YmplY3QubmV4dCh2YWwgYXMgYm9vbGVhbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgZ2V0RGF0YVZhbHVlKGF0dHI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzSW5JbnNlcnRNb2RlKCkpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZm9ybU5hdmlnYXRpb24uZ2V0RmlsdGVyRnJvbVVybFBhcmFtcygpO1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5mb3JtR3JvdXAudmFsdWVbYXR0cl0gfHwgdXJsUGFyYW1zW2F0dHJdO1xuICAgICAgcmV0dXJuIG5ldyBPRm9ybVZhbHVlKHZhbCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5Jbml0aWFsTW9kZSgpICYmICF0aGlzLmlzRWRpdGFibGVEZXRhaWwoKSkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybURhdGE7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIHJldHVybiBkYXRhW2F0dHJdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0luVXBkYXRlTW9kZSgpIHx8IHRoaXMuaXNFZGl0YWJsZURldGFpbCgpKSB7XG4gICAgICBpZiAodGhpcy5mb3JtRGF0YSAmJiBPYmplY3Qua2V5cyh0aGlzLmZvcm1EYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZm9ybUNhY2hlLmdldENhY2hlZFZhbHVlKGF0dHIpO1xuICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXAuZGlydHkgJiYgdmFsKSB7XG4gICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE9Gb3JtVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgT0Zvcm1WYWx1ZSh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJldHVybiBvcmlnaW5hbCB2YWx1ZSBzdG9yZWQgaW50byBmb3JtIGRhdGEuLi5cbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtRGF0YTtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVthdHRyXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPRm9ybVZhbHVlKCk7XG4gIH1cblxuICBnZXREYXRhVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgZm9ybSBkYXRhLiBUaGUgZGF0YSByZWxhdGVkIHRvIHVybCBwYXJhbXMgYW5kIHBhcmVudCBrZXlzIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAqL1xuICBjbGVhckRhdGEoKSB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5mb3JtTmF2aWdhdGlvbi5nZXRGaWx0ZXJGcm9tVXJsUGFyYW1zKCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoe30sIHtcbiAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLnNldERhdGEoZmlsdGVyKTtcbiAgfVxuXG4gIGNhbkRlYWN0aXZhdGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIHtcbiAgICBjb25zdCByZWFkT25seSA9IHRoaXMuaXNJbkluaXRpYWxNb2RlKCkgJiYgIXRoaXMuaXNFZGl0YWJsZURldGFpbCgpO1xuICAgIGNvbnN0IGNhbmNlbGxlZEVkaXRpb24gPSB0aGlzLmlzSW5VcGRhdGVNb2RlKCkgJiYgdGhpcy5fZm9ybVRvb2xiYXIgJiYgIXRoaXMuX2Zvcm1Ub29sYmFyLmVkaXRNb2RlO1xuICAgIGlmIChyZWFkT25seSB8fCBjYW5jZWxsZWRFZGl0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlybUV4aXQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjYW5EaXNjYXJkQ2hhbmdlcyA9ICEhdGhpcy5jYW5EaXNjYXJkQ2hhbmdlcztcbiAgICB0aGlzLmNhbkRpc2NhcmRDaGFuZ2VzID0gZmFsc2U7XG4gICAgcmV0dXJuIGNhbkRpc2NhcmRDaGFuZ2VzIHx8IHRoaXMuc2hvd0NvbmZpcm1EaXNjYXJkQ2hhbmdlcygpO1xuICB9XG5cbiAgc2hvd0NvbmZpcm1EaXNjYXJkQ2hhbmdlcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbi5zaG93Q29uZmlybURpc2NhcmRDaGFuZ2VzKHRoaXMuaWdub3JlT25FeGl0KTtcbiAgfVxuXG4gIGV4ZWN1dGVUb29sYmFyQWN0aW9uKGFjdGlvbjogc3RyaW5nLCBvcHRpb25zPzogYW55KSB7XG4gICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgIGNhc2UgQ29kZXMuQkFDS19BQ1RJT046IHRoaXMuYmFjayhvcHRpb25zKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkNMT1NFX0RFVEFJTF9BQ1RJT046IHRoaXMuY2xvc2VEZXRhaWwob3B0aW9ucyk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5SRUxPQURfQUNUSU9OOiB0aGlzLnJlbG9hZCh0cnVlKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkdPX0lOU0VSVF9BQ1RJT046IHRoaXMuZ29JbnNlcnRNb2RlKG9wdGlvbnMpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuSU5TRVJUX0FDVElPTjogdGhpcy5pbnNlcnQoKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkdPX0VESVRfQUNUSU9OOiB0aGlzLmdvRWRpdE1vZGUoKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkVESVRfQUNUSU9OOiB0aGlzLnVwZGF0ZSgpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuVU5ET19MQVNUX0NIQU5HRV9BQ1RJT046IHRoaXMudW5kbygpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuREVMRVRFX0FDVElPTjogcmV0dXJuIHRoaXMuZGVsZXRlKCk7XG4gICAgICBkZWZhdWx0OiBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWRkRGVhY3RpdmF0ZUd1YXJkKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcblxuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uaW5pdGlhbGl6ZSgpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICBhZGREZWFjdGl2YXRlR3VhcmQoKSB7XG4gICAgaWYgKCF0aGlzLmFjdFJvdXRlIHx8ICF0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVhY3RpdmF0ZUd1YXJkID0gdGhpcy5pbmplY3Rvci5nZXQoQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCk7XG4gICAgdGhpcy5kZWFjdGl2YXRlR3VhcmQuYWRkRm9ybSh0aGlzKTtcbiAgICBjb25zdCBjYW5EZWFjdGl2YXRlQXJyYXkgPSAodGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlIHx8IFtdKTtcbiAgICBsZXQgcHJldmlvdXNseUFkZGVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbkRlYWN0aXZhdGVBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgcHJldmlvdXNseUFkZGVkID0gKChjYW5EZWFjdGl2YXRlQXJyYXlbaV0uaGFzT3duUHJvcGVydHkoJ0NMQVNTTkFNRScpICYmIGNhbkRlYWN0aXZhdGVBcnJheVtpXS5DTEFTU05BTUUpID09PSBPRm9ybUNvbXBvbmVudC5ndWFyZENsYXNzTmFtZSk7XG4gICAgICBpZiAocHJldmlvdXNseUFkZGVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXByZXZpb3VzbHlBZGRlZCkge1xuICAgICAgY2FuRGVhY3RpdmF0ZUFycmF5LnB1c2godGhpcy5kZWFjdGl2YXRlR3VhcmQuY29uc3RydWN0b3IpO1xuICAgICAgdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlID0gY2FuRGVhY3RpdmF0ZUFycmF5O1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lEZWFjdGl2YXRlR3VhcmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYWN0aXZhdGVHdWFyZCgpKSB7XG4gICAgICAgIHRoaXMuZGVhY3RpdmF0ZUd1YXJkLnJlbW92ZUZvcm0odGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5kZWFjdGl2YXRlR3VhcmQuaXNGb3Jtc0NhY2hlRW1wdHkoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmFjdFJvdXRlIHx8ICF0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnIHx8ICF0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3VhcmRJbmRleCA9IHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5maW5kSW5kZXgoKGNhbkRlYWN0aXZhdGUpID0+IGNhbkRlYWN0aXZhdGUubmFtZSA9PT0gT0Zvcm1Db21wb25lbnQuZ3VhcmRDbGFzc05hbWUpXG4gICAgICBpZiAoZ3VhcmRJbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5zcGxpY2UoZ3VhcmRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vXG4gICAgfVxuICB9XG5cbiAgaGFzRGVhY3RpdmF0ZUd1YXJkKCkge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLmRlYWN0aXZhdGVHdWFyZCk7XG4gIH1cblxuICAvKipcbiAgICogQW5ndWxhciBtZXRob2RzXG4gICAqL1xuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuaGVhZGVyYWN0aW9ucyA9PT0gJ2FsbCcpIHtcbiAgICAgIHRoaXMuaGVhZGVyYWN0aW9ucyA9ICdSO0k7VTtEJztcbiAgICB9XG4gICAgdGhpcy5rZXlzQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5rZXlzLCB0cnVlKTtcbiAgICB0aGlzLmNvbHNBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmNvbHVtbnMsIHRydWUpO1xuICAgIGNvbnN0IHBrQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5wYXJlbnRLZXlzKTtcbiAgICB0aGlzLl9wS2V5c0VxdWl2ID0gVXRpbC5wYXJzZVBhcmVudEtleXNFcXVpdmFsZW5jZXMocGtBcnJheSk7XG4gICAgdGhpcy5rZXlzU3FsVHlwZXNBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmtleXNTcWxUeXBlcyk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZVNlcnZpY2UoKTtcblxuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc3Vic2NyaWJlVG9RdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc3Vic2NyaWJlVG9VcmxQYXJhbXMoKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnN1YnNjcmliZVRvVXJsKCk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5zdWJzY3JpYmVUb0NhY2hlQ2hhbmdlcygpO1xuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25WaXNpYmxlQ2hhbmdlKHZpc2libGUgPT4ge1xuICAgICAgICBzZWxmLnNob3dIZWFkZXIgPSB2aXNpYmxlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5tb2RlID0gT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUw7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0Rm9ybVBlcm1pc3Npb25zKHRoaXMub2F0dHIsIHRoaXMuYWN0Um91dGUpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIGlmICh0eXBlb2YgdGhpcy5pbnNlcnRGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gICB0aGlzLmluc2VydEZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgLy8gfVxuICAgIC8vIGlmICh0eXBlb2YgdGhpcy51cGRhdGVGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gICB0aGlzLnVwZGF0ZUZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgLy8gfVxuICAgIC8vIGlmICh0eXBlb2YgdGhpcy5kZWxldGVGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gICB0aGlzLmRlbGV0ZUZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgLy8gfVxuICB9XG5cblxuICAvKipcbiAgICogUmVpbml0aWFsaXplIGZvcm0gYWRkaW5nIG9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIHJlaW5pdGlhbGl6ZShvcHRpb25zOiBPRm9ybUluaXRpYWxpemF0aW9uT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2xvbmVkT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNsb25lZE9wdHMpIHtcbiAgICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICB0aGlzW3Byb3BdID0gY2xvbmVkT3B0c1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICBjb25maWd1cmVTZXJ2aWNlKCkge1xuICAgIGNvbnN0IG1zZ0NvbmZpZ3VyZVNlcnZpY2VBcmdzOiBPQ29uZmlndXJlTWVzc2FnZVNlcnZpY2VBcmdzID0geyBpbmplY3RvcjogdGhpcy5pbmplY3RvciwgYmFzZVNlcnZpY2U6IE9Gb3JtTWVzc2FnZVNlcnZpY2UsIHNlcnZpY2VUeXBlOiB0aGlzLm1lc3NhZ2VTZXJ2aWNlVHlwZSB9XG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UgPSBVdGlsLmNvbmZpZ3VyZU1lc3NhZ2VTZXJ2aWNlKG1zZ0NvbmZpZ3VyZVNlcnZpY2VBcmdzKTtcblxuICAgIGNvbnN0IGNvbmZpZ3VyZVNlcnZpY2VBcmdzOiBPQ29uZmlndXJlU2VydmljZUFyZ3MgPSB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yLCBiYXNlU2VydmljZTogT250aW1pemVTZXJ2aWNlLCBlbnRpdHk6IHRoaXMuZW50aXR5LCBzZXJ2aWNlOiB0aGlzLnNlcnZpY2UsIHNlcnZpY2VUeXBlOiB0aGlzLnNlcnZpY2VUeXBlIH1cbiAgICB0aGlzLmRhdGFTZXJ2aWNlID0gVXRpbC5jb25maWd1cmVTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2VBcmdzKTtcbiAgfVxuXG4gIGdldCBtZXNzYWdlU2VydmljZSgpOiBPRm9ybU1lc3NhZ2VTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZVNlcnZpY2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucmVsb2FkU3RyZWFtU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5xdWVyeVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybUNhY2hlLmRlc3Ryb3koKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLmRlc3Ryb3koKTtcbiAgICB0aGlzLmRlc3Ryb3lEZWFjdGl2YXRlR3VhcmQoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGV0ZXJtaW5hdGVGb3JtTW9kZSgpO1xuICAgICAgdGhpcy5vbkZvcm1Jbml0U3RyZWFtLmVtaXQodHJ1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKlxuICAgKiBJbm5lciBtZXRob2RzXG4gICAqL1xuXG4gIF9zZXRDb21wb25lbnRzRWRpdGFibGUoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb21wb25lbnRzOiBhbnkgPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKGNvbXBLZXkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wS2V5XTtcbiAgICAgIGNvbXBvbmVudC5pc1JlYWRPbmx5ID0gIXN0YXRlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZm9ybSBvcGVyYXRpb24gbW9kZS5cbiAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUgdG8gYmUgZXN0YWJsaXNoZWRcbiAgICovXG4gIHNldEZvcm1Nb2RlKG1vZGU6IG51bWJlcikge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDpcbiAgICAgICAgdGhpcy5iZWZvcmVJbml0aWFsTW9kZS5lbWl0KCk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtVG9vbGJhcikge1xuICAgICAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLnNldEluaXRpYWxNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRoaXMuaXNFZGl0YWJsZURldGFpbCgpKTtcbiAgICAgICAgdGhpcy5vbkZvcm1Nb2RlQ2hhbmdlLmVtaXQodGhpcy5tb2RlKTtcbiAgICAgICAgdGhpcy5vbkluaXRpYWxNb2RlLmVtaXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTlNFUlQ6XG4gICAgICAgIHRoaXMuYmVmb3JlSW5zZXJ0TW9kZS5lbWl0KCk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtVG9vbGJhcikge1xuICAgICAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLnNldEluc2VydE1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyRGF0YSgpO1xuICAgICAgICB0aGlzLl9zZXRDb21wb25lbnRzRWRpdGFibGUodHJ1ZSk7XG4gICAgICAgIHRoaXMub25Gb3JtTW9kZUNoYW5nZS5lbWl0KHRoaXMubW9kZSk7XG4gICAgICAgIHRoaXMub25JbnNlcnRNb2RlLmVtaXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5VUERBVEU6XG4gICAgICAgIHRoaXMuYmVmb3JlVXBkYXRlTW9kZS5lbWl0KCk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtVG9vbGJhcikge1xuICAgICAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLnNldEVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRydWUpO1xuICAgICAgICB0aGlzLm9uRm9ybU1vZGVDaGFuZ2UuZW1pdCh0aGlzLm1vZGUpO1xuICAgICAgICB0aGlzLm9uVXBkYXRlTW9kZS5lbWl0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuUVVFUlk6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Zvcm0gUVVFUlkgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXRzIG5ldyBkYXRhIGZvciB0aGUgZm9ybVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgc2V0RGF0YShkYXRhKTogdm9pZCB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShkYXRhKSkge1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPRm9ybUNvbXBvbmVudF0gRm9ybSBkYXRhIGhhcyBtb3JlIHRoYW4gYSBzaW5nbGUgcmVjb3JkLiBTdG9yaW5nIGVtcHR5IGRhdGEnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gZGF0YS5sZW5ndGggPT09IDEgPyBkYXRhWzBdIDoge307XG4gICAgICB0aGlzLl91cGRhdGVGb3JtRGF0YSh0aGlzLnRvRm9ybVZhbHVlRGF0YShjdXJyZW50RGF0YSkpO1xuICAgICAgdGhpcy5fZW1pdERhdGEoY3VycmVudERhdGEpO1xuICAgIH0gZWxzZSBpZiAoVXRpbC5pc09iamVjdChkYXRhKSkge1xuICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEodGhpcy50b0Zvcm1WYWx1ZURhdGEoZGF0YSkpO1xuICAgICAgdGhpcy5fZW1pdERhdGEoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignRm9ybSBoYXMgcmVjZWl2ZWQgbm90IHN1cHBvcnRlZCBzZXJ2aWNlIGRhdGEuIFN1cHBvcnRlZCBkYXRhIGFyZSBBcnJheSBvciBPYmplY3QnKTtcbiAgICAgIHRoaXMuX3VwZGF0ZUZvcm1EYXRhKHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBzZXREYXRhKGRhdGEpYCBpbnN0ZWFkXG4gICAqL1xuICBfc2V0RGF0YShkYXRhKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9zZXREYXRhYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBzZXREYXRhYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5zZXREYXRhKGRhdGEpO1xuICB9XG5cbiAgX2VtaXREYXRhKGRhdGEpIHtcbiAgICB0aGlzLm9uRGF0YUxvYWRlZC5lbWl0KGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgYmFjaygpYCBpbnN0ZWFkXG4gICAqL1xuICBfYmFja0FjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2JhY2tBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGJhY2tgIGluc3RlYWQnKTtcbiAgICB0aGlzLmJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZSBiYWNrXG4gICAqL1xuICBiYWNrKG9wdGlvbnM/OiBhbnkpIHtcbiAgICBjb25zdCBhbGxPcHRpb25zID0gT2JqZWN0LmFzc2lnbihvcHRpb25zIHx8IHt9LCB7IGlnbm9yZU5hdmlnYXRpb246IHRoaXMuaWdub3JlRGVmYXVsdE5hdmlnYXRpb24gfSk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5uYXZpZ2F0ZUJhY2soYWxsT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBjbG9zZURldGFpbChvcHRpb25zPzogYW55KWAgaW5zdGVhZFxuICAgKi9cbiAgX2Nsb3NlRGV0YWlsQWN0aW9uKG9wdGlvbnM/OiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2Nsb3NlRGV0YWlsQWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBjbG9zZURldGFpbGAgaW5zdGVhZCcpO1xuICAgIHRoaXMuY2xvc2VEZXRhaWwob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgY3VycmVudCBkZXRhaWwgZm9ybVxuICAgKi9cbiAgY2xvc2VEZXRhaWwob3B0aW9ucz86IGFueSkge1xuICAgIG9wdGlvbnMgPSBVdGlsLmlzRGVmaW5lZChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fTtcbiAgICBvcHRpb25zLmlnbm9yZU5hdmlnYXRpb24gPSB0aGlzLmlnbm9yZURlZmF1bHROYXZpZ2F0aW9uO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uY2xvc2VEZXRhaWxBY3Rpb24ob3B0aW9ucyk7XG4gIH1cblxuICBfc3RheUluUmVjb3JkQWZ0ZXJJbnNlcnQoaW5zZXJ0ZWRLZXlzOiBvYmplY3QpIHtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnN0YXlJblJlY29yZEFmdGVySW5zZXJ0KGluc2VydGVkS2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGByZWxvYWQodXNlRmlsdGVyOiBib29sZWFuID0gZmFsc2UpYCBpbnN0ZWFkXG4gICAqL1xuICBfcmVsb2FkQWN0aW9uKHVzZUZpbHRlcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9yZWxvYWRBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYHJlbG9hZGAgaW5zdGVhZCcpO1xuICAgIHRoaXMucmVsb2FkKHVzZUZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHRoZSBmb3JtIGRhdGFcbiAgICovXG4gIHJlbG9hZCh1c2VGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGxldCBmaWx0ZXIgPSB7fTtcbiAgICBpZiAodXNlRmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmdldEN1cnJlbnRLZXlzVmFsdWVzKCk7XG4gICAgfVxuICAgIHRoaXMucXVlcnlEYXRhKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvICdpbnNlcnQnIG1vZGVcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBnb0luc2VydE1vZGUob3B0aW9ucz86IGFueSlgIGluc3RlYWRcbiAgICovXG4gIF9nb0luc2VydE1vZGUob3B0aW9ucz86IGFueSkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fZ29JbnNlcnRNb2RlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBnb0luc2VydE1vZGVgIGluc3RlYWQnKTtcbiAgICB0aGlzLmdvSW5zZXJ0TW9kZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gJ2luc2VydCcgbW9kZVxuICAgKi9cbiAgZ29JbnNlcnRNb2RlKG9wdGlvbnM/OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdvSW5zZXJ0TW9kZShvcHRpb25zKTtcbiAgfVxuXG4gIF9jbGVhckZvcm1BZnRlckluc2VydCgpIHtcbiAgICB0aGlzLmNsZWFyRGF0YSgpO1xuICAgIHRoaXMuX3NldENvbXBvbmVudHNFZGl0YWJsZSh0cnVlKTtcbiAgfVxuXG4gIF9jbGVhckFuZENsb3NlRm9ybUFmdGVySW5zZXJ0KCkge1xuICAgIGNvbnN0IGNsb3NlT3B0czogRm9ybUxheW91dENsb3NlRGV0YWlsT3B0aW9ucyA9IHsgZXhpdFdpdGhvdXRDb25maXJtYXRpb246IHRydWUgfTtcbiAgICB0aGlzLmNsb3NlRGV0YWlsKGNsb3NlT3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgaW5zZXJ0IGFjdGlvbi5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBpbnNlcnQoKWAgaW5zdGVhZFxuICAgKi9cbiAgX2luc2VydEFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2luc2VydEFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgaW5zZXJ0YCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5pbnNlcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBpbnNlcnQgYWN0aW9uLlxuICAgKi9cbiAgaW5zZXJ0KCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tjb250cm9sXS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQodGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0VmFsaWRhdGlvbkVycm9yRGlhbG9nVGl0bGUoKSwgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0VmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1ZhbHVlc1RvSW5zZXJ0KCk7XG4gICAgY29uc3Qgc3FsVHlwZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNTUUxUeXBlcygpO1xuICAgIHRoaXMuaW5zZXJ0RGF0YSh2YWx1ZXMsIHNxbFR5cGVzKS5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICBzZWxmLnBvc3RDb3JyZWN0SW5zZXJ0KHJlc3ApO1xuICAgICAgc2VsZi5mb3JtQ2FjaGUuc2V0Q2FjaGVTbmFwc2hvdCgpO1xuICAgICAgc2VsZi5tYXJrRm9ybUxheW91dE1hbmFnZXJUb1VwZGF0ZSgpO1xuICAgICAgaWYgKHNlbGYuYWZ0ZXJJbnNlcnRNb2RlID09PSAnZGV0YWlsJykge1xuICAgICAgICBzZWxmLl9zdGF5SW5SZWNvcmRBZnRlckluc2VydChyZXNwKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5hZnRlckluc2VydE1vZGUgPT09ICduZXcnKSB7XG4gICAgICAgIHRoaXMuX2NsZWFyRm9ybUFmdGVySW5zZXJ0KCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuYWZ0ZXJJbnNlcnRNb2RlID09PSAnY2xvc2UnKSB7XG4gICAgICAgIHRoaXMuX2NsZWFyQW5kQ2xvc2VGb3JtQWZ0ZXJJbnNlcnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY2xvc2VEZXRhaWwoKTtcbiAgICAgIH1cbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICBzZWxmLnBvc3RJbmNvcnJlY3RJbnNlcnQoZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byAnZWRpdCcgbW9kZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGdvRWRpdE1vZGUoKWAgaW5zdGVhZFxuICAgKi9cbiAgX2dvRWRpdE1vZGUoKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9nb0VkaXRNb2RlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBnb0VkaXRNb2RlYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5nb0VkaXRNb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvICdlZGl0JyBtb2RlXG4gICAqL1xuICBnb0VkaXRNb2RlKCkge1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uZ29FZGl0TW9kZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zICdlZGl0JyBhY3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGB1cGRhdGUoKWAgaW5zdGVhZFxuICAgKi9cbiAgX2VkaXRBY3Rpb24oKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9lZGl0QWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGB1cGRhdGVgIGluc3RlYWQnKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zICdlZGl0JyBhY3Rpb25cbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChcbiAgICAgIChjb250cm9sKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xdLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdFUlJPUicsIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFZhbGlkYXRpb25FcnJvcigpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyByZXRyaWV2aW5nIGtleXMuLi5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEtleXNWYWx1ZXMoKTtcblxuICAgIC8vIHJldHJpZXZpbmcgdmFsdWVzIHRvIHVwZGF0ZS4uLlxuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1ZhbHVlc1RvVXBkYXRlKCk7XG4gICAgY29uc3Qgc3FsVHlwZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNTUUxUeXBlcygpO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIHVwZGF0ZVxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdJTkZPJywgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0Tm90aGluZ1RvVXBkYXRlTWVzc2FnZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpbnZva2UgdXBkYXRlIG1ldGhvZC4uLlxuICAgIHRoaXMudXBkYXRlRGF0YShmaWx0ZXIsIHZhbHVlcywgc3FsVHlwZXMpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgIHNlbGYucG9zdENvcnJlY3RVcGRhdGUocmVzcCk7XG4gICAgICBzZWxmLmZvcm1DYWNoZS5zZXRDYWNoZVNuYXBzaG90KCk7XG4gICAgICBzZWxmLm1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk7XG4gICAgICBpZiAoc2VsZi5zdGF5SW5SZWNvcmRBZnRlckVkaXQpIHtcbiAgICAgICAgc2VsZi5yZWxvYWQodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmNsb3NlRGV0YWlsKCk7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0VXBkYXRlKGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyAnZGVsZXRlJyBhY3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBkZWxldGUoKWAgaW5zdGVhZFxuICAgKi9cbiAgX2RlbGV0ZUFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2RlbGV0ZUFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgZGVsZXRlYCBpbnN0ZWFkJyk7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgJ2RlbGV0ZScgYWN0aW9uXG4gICAqL1xuICBkZWxldGUoKSB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRLZXlzVmFsdWVzKCk7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlRGF0YShmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIG1hbmFnZSB0aGUgY2FsbCB0byB0aGUgc2VydmljZSBkYXRhXG4gICAqIEBwYXJhbSBmaWx0ZXJcbiAgICovXG4gIHF1ZXJ5RGF0YShmaWx0ZXI6IGFueSkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU2VydmljZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignT0Zvcm1Db21wb25lbnQ6IG5vIHNlcnZpY2UgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChmaWx0ZXIpIHx8IE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09Gb3JtQ29tcG9uZW50OiBubyBmaWx0ZXIgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb3JtQ2FjaGUucmVzdGFydENhY2hlKCk7XG4gICAgdGhpcy5jbGVhckNvbXBvbmVudHNPbGRWYWx1ZSgpO1xuICAgIGlmICh0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBhdiA9IHRoaXMuZ2V0QXR0cmlidXRlc1RvUXVlcnkoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCk7XG4gICAgdGhpcy5xdWVyeVN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeU1ldGhvZF0oZmlsdGVyLCBhdiwgdGhpcy5lbnRpdHksIHNxbFR5cGVzKVxuICAgICAgLnN1YnNjcmliZSgocmVzcDogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXNwLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHJlc3AuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEoe30pO1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRRdWVyeUVycm9yTWVzc2FnZSgpKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFUlJPUjogJyArIHJlc3AubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEoe30pO1xuICAgICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24pKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24oZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgZXJyLnN0YXR1c1RleHQpIHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyLnN0YXR1c1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRRdWVyeUVycm9yTWVzc2FnZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVzVG9RdWVyeSgpOiBBcnJheTxhbnk+IHtcbiAgICBsZXQgYXR0cmlidXRlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIC8vIGFkZCBmb3JtIGtleXMuLi5cbiAgICBpZiAodGhpcy5rZXlzQXJyYXkgJiYgdGhpcy5rZXlzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgYXR0cmlidXRlcy5wdXNoKC4uLnRoaXMua2V5c0FycmF5KTtcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50czogYW55ID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgLy8gYWRkIG9ubHkgdGhlIGZpZWxkcyBjb250YWluZWQgaW50byB0aGUgZm9ybS4uLlxuICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoYXR0cmlidXRlcy5pbmRleE9mKGl0ZW0pIDwgMCAmJlxuICAgICAgICBjb21wb25lbnRzW2l0ZW1dLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSAmJiBjb21wb25lbnRzW2l0ZW1dLmlzQXV0b21hdGljQmluZGluZygpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGFkZCBmaWVsZHMgc3RvcmVkIGludG8gZm9ybSBjYWNoZS4uLlxuICAgIGNvbnN0IGRhdGFDYWNoZSA9IHRoaXMuZm9ybUNhY2hlLmdldERhdGFDYWNoZSgpO1xuICAgIGlmIChkYXRhQ2FjaGUpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGFDYWNoZSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBhdHRyaWJ1dGVzLmluZGV4T2YoaXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuY29uY2F0KHRoaXMuY29sc0FycmF5LmZpbHRlcihjb2wgPT4gYXR0cmlidXRlcy5pbmRleE9mKGNvbCkgPCAwKSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBtYW5hZ2UgdGhlIGNhbGwgdG8gdGhlIGluc2VydCBzZXJ2aWNlXG4gICAqIEBwYXJhbSB2YWx1ZXNcbiAgICogQHBhcmFtIFtzcWxUeXBlc11cbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxhbnk+XG4gICAqL1xuICBpbnNlcnREYXRhKHZhbHVlcywgc3FsVHlwZXM/OiBvYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy5kYXRhU2VydmljZVt0aGlzLmluc2VydE1ldGhvZF0odmFsdWVzLCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpLnN1YnNjcmliZShcbiAgICAgICAgcmVzcCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNWYWx1ZXNUb0luc2VydCgpOiBvYmplY3Qge1xuICAgIGNvbnN0IGF0dHJWYWx1ZXMgPSB7fTtcbiAgICBpZiAodGhpcy5mb3JtUGFyZW50S2V5c1ZhbHVlcykge1xuICAgICAgT2JqZWN0LmFzc2lnbihhdHRyVmFsdWVzLCB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXR0clZhbHVlcywgdGhpcy5nZXRSZWdpc3RlcmVkRmllbGRzVmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHNxbCB0eXBlcyBmcm9tIHRoZSBmb3JtIGNvbXBvbmVudHMgYW5kIHRoZSBmb3JtIGtleXNcbiAgICovXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTogb2JqZWN0IHtcbiAgICBjb25zdCB0eXBlczogb2JqZWN0ID0ge307XG4gICAgLy8gQWRkIGZvcm0ga2V5cyBzcWwgdHlwZXNcbiAgICB0aGlzLmtleXNTcWxUeXBlc0FycmF5LmZvckVhY2goKGtzdCwgaSkgPT4gdHlwZXNbdGhpcy5rZXlzQXJyYXlbaV1dID0gU1FMVHlwZXMuZ2V0U1FMVHlwZVZhbHVlKGtzdCkpO1xuICAgIC8vIEFkZCBmb3JtIGNvbXBvbmVudHMgc3FsIHR5cGVzXG4gICAgaWYgKHRoaXMuX2NvbXBTUUxUeXBlcyAmJiBPYmplY3Qua2V5cyh0aGlzLl9jb21wU1FMVHlwZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odHlwZXMsIHRoaXMuX2NvbXBTUUxUeXBlcyk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIG1hbmFnZSB0aGUgY2FsbCB0byB0aGUgdXBkYXRlIHNlcnZpY2VcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqIEBwYXJhbSBbc3FsVHlwZXNdXG4gICAqIEByZXR1cm5zICBPYnNlcnZhYmxlPGFueT5cbiAgICovXG4gIHVwZGF0ZURhdGEoZmlsdGVyLCB2YWx1ZXMsIHNxbFR5cGVzPzogb2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy51cGRhdGVNZXRob2RdKGZpbHRlciwgdmFsdWVzLCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpLnN1YnNjcmliZShcbiAgICAgICAgcmVzcCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNWYWx1ZXNUb1VwZGF0ZSgpOiBvYmplY3Qge1xuICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGNoYW5nZWRBdHRycyA9IHRoaXMuZm9ybUNhY2hlLmdldENoYW5nZWRGb3JtQ29udHJvbHNBdHRyKCk7XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZpbHRlcihjb250cm9sTmFtZSA9PlxuICAgICAgc2VsZi5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2YoY29udHJvbE5hbWUpID09PSAtMSAmJlxuICAgICAgY2hhbmdlZEF0dHJzLmluZGV4T2YoY29udHJvbE5hbWUpICE9PSAtMVxuICAgICkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHNlbGYuZm9ybUdyb3VwLmNvbnRyb2xzW2l0ZW1dO1xuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgdmFsdWVzW2l0ZW1dID0gY29udHJvbC5nZXRWYWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzW2l0ZW1dID0gY29udHJvbC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZXNbaXRlbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZXNbaXRlbV0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdG8gbWFuYWdlIHRoZSBjYWxsIHRvIHRoZSBkZWxldGUgc2VydmljZVxuICAgKiBAcGFyYW0gZmlsdGVyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGU8YW55PlxuICAgKi9cbiAgZGVsZXRlRGF0YShmaWx0ZXI6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbiA9IHRoaXMubG9hZCgpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy5jYW5EaXNjYXJkQ2hhbmdlcyA9IHRydWU7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlW3RoaXMuZGVsZXRlTWV0aG9kXShmaWx0ZXIsIHRoaXMuZW50aXR5LCBzcWxUeXBlcykuc3Vic2NyaWJlKFxuICAgICAgICByZXNwID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgICAgc2VsZi5mb3JtQ2FjaGUuc2V0Q2FjaGVTbmFwc2hvdCgpO1xuICAgICAgICAgICAgc2VsZi5tYXJrRm9ybUxheW91dE1hbmFnZXJUb1VwZGF0ZSgpO1xuICAgICAgICAgICAgc2VsZi5wb3N0Q29ycmVjdERlbGV0ZShyZXNwKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYucG9zdEluY29ycmVjdERlbGV0ZShyZXNwKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0RGVsZXRlKGVycik7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIHRvSlNPTkRhdGEoZGF0YSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IHt9O1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZURhdGEgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICB2YWx1ZURhdGFbaXRlbV0gPSBkYXRhW2l0ZW1dLnZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZURhdGE7XG4gIH1cblxuICB0b0Zvcm1WYWx1ZURhdGEoZGF0YSkge1xuICAgIGlmIChkYXRhICYmIFV0aWwuaXNBcnJheShkYXRhKSkge1xuICAgICAgY29uc3QgdmFsdWVEYXRhOiBBcnJheTxvYmplY3Q+ID0gW107XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgdmFsdWVEYXRhLnB1c2goc2VsZi5vYmplY3RUb0Zvcm1WYWx1ZURhdGEoaXRlbSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVEYXRhO1xuICAgIH0gZWxzZSBpZiAoZGF0YSAmJiBVdGlsLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYmplY3RUb0Zvcm1WYWx1ZURhdGEoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXlzIHZhbHVlc1xuICAgKiBAcmV0dXJucyBrZXlzXG4gICAqL1xuICBnZXRLZXlzVmFsdWVzKCk6IGFueSB7XG4gICAgY29uc3QgZmlsdGVyID0ge307XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IHRoaXMuZm9ybURhdGE7XG4gICAgaWYgKCF0aGlzLmtleXNBcnJheSkge1xuICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG4gICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRSZWNvcmRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBjdXJyZW50RGF0YSA9IGN1cnJlbnRSZWNvcmRba2V5XTtcbiAgICAgICAgaWYgKGN1cnJlbnREYXRhIGluc3RhbmNlb2YgT0Zvcm1WYWx1ZSkge1xuICAgICAgICAgIGN1cnJlbnREYXRhID0gY3VycmVudERhdGEudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZmlsdGVyW2tleV0gPSBjdXJyZW50RGF0YTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgaXNJblF1ZXJ5TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuUVVFUlk7XG4gIH1cblxuICBpc0luSW5zZXJ0TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5TRVJUO1xuICB9XG5cbiAgaXNJblVwZGF0ZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gT0Zvcm1Db21wb25lbnQuTW9kZSgpLlVQREFURTtcbiAgfVxuXG4gIGlzSW5Jbml0aWFsTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDtcbiAgfVxuXG4gIHNldFF1ZXJ5TW9kZSgpIHtcbiAgICB0aGlzLnNldEZvcm1Nb2RlKE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5RVUVSWSk7XG4gIH1cblxuICBzZXRJbnNlcnRNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOU0VSVCk7XG4gIH1cblxuICBzZXRVcGRhdGVNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLlVQREFURSk7XG4gIH1cblxuICBzZXRJbml0aWFsTW9kZSgpIHtcbiAgICB0aGlzLnNldEZvcm1Nb2RlKE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHluYW1pY0Zvcm1Db21wb25lbnQoZHluYW1pY0Zvcm0pIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGR5bmFtaWNGb3JtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLmR5bmFtaWNGb3JtU3Vic2NyaXB0aW9uID0gZHluYW1pY0Zvcm0ucmVuZGVyLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBzZWxmLnJlZnJlc2hDb21wb25lbnRzRWRpdGFibGVTdGF0ZSgpO1xuICAgICAgICBpZiAoIXNlbGYuaXNJbkluc2VydE1vZGUoKSAmJiBzZWxmLnF1ZXJ5T25Jbml0KSB7XG4gICAgICAgICAgc2VsZi5yZWxvYWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYuZm9ybVBhcmVudEtleXNWYWx1ZXMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmZvcm1QYXJlbnRLZXlzVmFsdWVzKS5mb3JFYWNoKHBhcmVudEtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNlbGYuZm9ybVBhcmVudEtleXNWYWx1ZXNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBzZWxmLmdldEZpZWxkUmVmZXJlbmNlKHBhcmVudEtleSk7XG4gICAgICAgICAgICBpZiAoVXRpbC5pc0Zvcm1EYXRhQ29tcG9uZW50KGNvbXApICYmIGNvbXAuaXNBdXRvbWF0aWNCaW5kaW5nKCkpIHtcbiAgICAgICAgICAgICAgY29tcC5zZXRWYWx1ZSh2YWx1ZSwge1xuICAgICAgICAgICAgICAgIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdW5yZWdpc3RlckR5bmFtaWNGb3JtQ29tcG9uZW50KGR5bmFtaWNGb3JtKSB7XG4gICAgaWYgKGR5bmFtaWNGb3JtICYmIHRoaXMuZHluYW1pY0Zvcm1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRSZXF1aXJlZENvbXBvbmVudHMoKTogb2JqZWN0IHtcbiAgICBjb25zdCByZXF1aXJlZENvbXBvbnRlbnRzOiBvYmplY3QgPSB7fTtcbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29tcCA9IGNvbXBvbmVudHNba2V5XTtcbiAgICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICAgIGlmICgoY29tcCBhcyBhbnkpLmlzUmVxdWlyZWQgJiYgYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXF1aXJlZENvbXBvbnRlbnRzW2F0dHJdID0gY29tcDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXF1aXJlZENvbXBvbnRlbnRzO1xuICB9XG5cbiAgZ2V0IGxheW91dERpcmVjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYXlvdXREaXJlY3Rpb247XG4gIH1cblxuICBzZXQgbGF5b3V0RGlyZWN0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFyc2VkVmFsID0gKHZhbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLl9sYXlvdXREaXJlY3Rpb24gPSBbJ3JvdycsICdjb2x1bW4nLCAncm93LXJldmVyc2UnLCAnY29sdW1uLXJldmVyc2UnXS5pbmRleE9mKHBhcnNlZFZhbCkgIT09IC0xID8gcGFyc2VkVmFsIDogT0Zvcm1Db21wb25lbnQuREVGQVVMVF9MQVlPVVRfRElSRUNUSU9OO1xuICB9XG5cbiAgZ2V0IGxheW91dEFsaWduKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dEFsaWduO1xuICB9XG5cbiAgc2V0IGxheW91dEFsaWduKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGF5b3V0QWxpZ24gPSB2YWw7XG4gIH1cblxuICBnZXQgc2hvd0Zsb2F0aW5nVG9vbGJhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93SGVhZGVyICYmIHRoaXMuaGVhZGVyTW9kZSA9PT0gJ2Zsb2F0aW5nJztcbiAgfVxuXG4gIGdldCBzaG93Tm90RmxvYXRpbmdUb29sYmFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dIZWFkZXIgJiYgdGhpcy5oZWFkZXJNb2RlICE9PSAnZmxvYXRpbmcnO1xuICB9XG5cbiAgaXNFZGl0YWJsZURldGFpbCgpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZURldGFpbDtcbiAgfVxuXG4gIGlzSW5pdGlhbFN0YXRlQ2hhbmdlZChpZ25vcmVBdHRyczogc3RyaW5nW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1DYWNoZS5pc0luaXRpYWxTdGF0ZUNoYW5nZWQoaWdub3JlQXR0cnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgdW5kbygpYCBpbnN0ZWFkXG4gICAqL1xuICBfdW5kb0xhc3RDaGFuZ2VBY3Rpb24oKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll91bmRvTGFzdENoYW5nZUFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgdW5kb2AgaW5zdGVhZCcpO1xuICAgIHRoaXMudW5kbygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZG8gbGFzdCBjaGFuZ2VcbiAgICovXG4gIHVuZG8oKSB7XG4gICAgdGhpcy5mb3JtQ2FjaGUudW5kb0xhc3RDaGFuZ2UoKTtcbiAgfVxuXG4gIGdldCBpc0NhY2hlU3RhY2tFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ2FjaGUuaXNDYWNoZVN0YWNrRW1wdHk7XG4gIH1cblxuICB1bmRvS2V5Ym9hcmRQcmVzc2VkKCkge1xuICAgIHRoaXMuZm9ybUNhY2hlLnVuZG9MYXN0Q2hhbmdlKCk7XG4gIH1cblxuICBnZXRGb3JtVG9vbGJhcigpOiBPRm9ybVRvb2xiYXJCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVRvb2xiYXI7XG4gIH1cblxuICBnZXRGb3JtTWFuYWdlcigpOiBPRm9ybUxheW91dE1hbmFnZXJCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbi5mb3JtTGF5b3V0TWFuYWdlcjtcbiAgfVxuXG4gIGdldEZvcm1OYXZpZ2F0aW9uKCk6IE9Gb3JtTmF2aWdhdGlvbkNsYXNzIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbjtcbiAgfVxuXG4gIGdldEZvcm1DYWNoZSgpOiBPRm9ybUNhY2hlQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmZvcm1DYWNoZTtcbiAgfVxuXG4gIGdldFVybFBhcmFtKGFyZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybU5hdmlnYXRpb24oKS5nZXRVcmxQYXJhbXMoKVthcmddO1xuICB9XG5cbiAgZ2V0VXJsUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldEZvcm1OYXZpZ2F0aW9uKCkuZ2V0VXJsUGFyYW1zKCk7XG4gIH1cblxuICBzZXRVcmxQYXJhbXNBbmRSZWxvYWQodmFsOiBvYmplY3QpIHtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnNldFVybFBhcmFtcyh2YWwpO1xuICAgIHRoaXMucmVsb2FkKHRydWUpO1xuICB9XG5cbiAgZ2V0UmVnaXN0ZXJlZEZpZWxkc1ZhbHVlcygpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB7fTtcbiAgICBjb25zdCBjb21wb25lbnRzOiBJRm9ybURhdGFDb21wb25lbnRIYXNoID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgY29tcG9uZW50c0tleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5maWx0ZXIoa2V5ID0+IHNlbGYuaWdub3JlRm9ybUNhY2hlS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKTtcbiAgICBjb21wb25lbnRzS2V5cy5mb3JFYWNoKGNvbXBLZXkgPT4ge1xuICAgICAgY29uc3QgY29tcDogSUZvcm1EYXRhQ29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wS2V5XTtcbiAgICAgIHZhbHVlc1tjb21wS2V5XSA9IGNvbXAuZ2V0VmFsdWUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZm9ybVxuICAgKiBAcGFyYW0gYXR0ciB0aGUgYXR0ciBvZiB0aGUgZm9ybSBmaWVsZFxuICAgKi9cbiAgZ2V0RmllbGRWYWx1ZShhdHRyOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2UoYXR0cik7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIHZhbHVlID0gY29tcC5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIG9iamVjdCB3aXRoIHRoZSB2YWx1ZXMgb2YgZWFjaCBhdHRyaWJ1dGVcbiAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyJ3Mgb2YgdGhlIGZvcm0gZmllbGRzXG4gICAqL1xuICBnZXRGaWVsZFZhbHVlcyhhdHRyczogc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IGFyciA9IHt9O1xuICAgIGF0dHJzLmZvckVhY2goa2V5ID0+IGFycltrZXldID0gdGhpcy5nZXRGaWVsZFZhbHVlKGtleSkpO1xuICAgIHJldHVybiBhcnI7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIGF0dHIgYXR0cmlidXRlIG9mIGNvbnRyb2xcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlXG4gICAqL1xuICBzZXRGaWVsZFZhbHVlKGF0dHI6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9ucz86IEZvcm1WYWx1ZU9wdGlvbnMpIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZShhdHRyKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29tcC5zZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGVhY2ggY29udHJvbCBpbiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzXG4gICAqL1xuICBzZXRGaWVsZFZhbHVlcyh2YWx1ZXM6IGFueSwgb3B0aW9ucz86IEZvcm1WYWx1ZU9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB0aGlzLnNldEZpZWxkVmFsdWUoa2V5LCB2YWx1ZXNba2V5XSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSB2YWx1ZSBvZiBlYWNoIGNvbnRyb2wgaW4gdGhlIGZvcm1cbiAgICogQHBhcmFtIGF0dHIgdGhlIGF0dHIgb2YgdGhlIGZvcm0gZmllbGRcbiAgICovXG4gIGNsZWFyRmllbGRWYWx1ZShhdHRyOiBzdHJpbmcsIG9wdGlvbnM/OiBGb3JtVmFsdWVPcHRpb25zKSB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2UoYXR0cik7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbXAuY2xlYXJWYWx1ZShvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHZhbHVlIG9mIGVhY2ggY29udHJvbCBpbiB0aGUgZm9ybVxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHIncyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICovXG4gIGNsZWFyRmllbGRWYWx1ZXMoYXR0cnM6IHN0cmluZ1tdLCBvcHRpb25zPzogRm9ybVZhbHVlT3B0aW9ucykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGF0dHJzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgc2VsZi5jbGVhckZpZWxkVmFsdWUoa2V5LCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIGF0dHIgdGhlIGF0dHIgb2YgdGhlIGZvcm0gZmllbGRcbiAgICovXG4gIGdldEZpZWxkUmVmZXJlbmNlKGF0dHI6IHN0cmluZyk6IElGb3JtRGF0YUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudHNbYXR0cl07XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByZWZlcmVuY2Ugb2YgZWFjaCBjb250cm9sIGluIHRoZSBmb3JtXG4gICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cidzIG9mIHRoZSBmb3JtIGZpbGVkc1xuICAgKi9cbiAgZ2V0RmllbGRSZWZlcmVuY2VzKGF0dHJzOiBzdHJpbmdbXSk6IElGb3JtRGF0YUNvbXBvbmVudEhhc2gge1xuICAgIGNvbnN0IGFycjogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCA9IHt9O1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGF0dHJzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgYXJyW2tleV0gPSBzZWxmLmdldEZpZWxkUmVmZXJlbmNlKGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIGdldEZvcm1Db21wb25lbnRQZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcpOiBPUGVybWlzc2lvbnMge1xuICAgIGxldCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnBlcm1pc3Npb25zKSkge1xuICAgICAgcGVybWlzc2lvbnMgPSAodGhpcy5wZXJtaXNzaW9ucy5jb21wb25lbnRzIHx8IFtdKS5maW5kKGNvbXAgPT4gY29tcC5hdHRyID09PSBhdHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgZ2V0QWN0aW9uc1Blcm1pc3Npb25zKCk6IE9QZXJtaXNzaW9uc1tdIHtcbiAgICBsZXQgcGVybWlzc2lvbnM6IE9QZXJtaXNzaW9uc1tdO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnBlcm1pc3Npb25zKSkge1xuICAgICAgcGVybWlzc2lvbnMgPSAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRldGVybWluYXRlRm9ybU1vZGUoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsU2VnbWVudHMgPSB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdldFVybFNlZ21lbnRzKCk7XG4gICAgaWYgKHVybFNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlZ21lbnQgPSB1cmxTZWdtZW50c1t1cmxTZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHRoaXMuZGV0ZXJtaW5hdGVNb2RlRnJvbVVybFNlZ21lbnQoc2VnbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdFJvdXRlLnBhcmVudCkge1xuICAgICAgdGhpcy5hY3RSb3V0ZS5wYXJlbnQudXJsLnN1YnNjcmliZShzZWdtZW50cyA9PiB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5kZXRlcm1pbmF0ZU1vZGVGcm9tVXJsU2VnbWVudChzZWdtZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEZvcm1Nb2RlKE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMKTtcbiAgICB9XG4gICAgLy8gc3RheUluUmVjb3JkQWZ0ZXJFZGl0IGlzIHRydWUgaWYgZm9ybSBoYXMgZWRpdGFibGUgZGV0YWlsID0gdHJ1ZVxuICAgIHRoaXMuc3RheUluUmVjb3JkQWZ0ZXJFZGl0ID0gdGhpcy5zdGF5SW5SZWNvcmRBZnRlckVkaXQgfHwgdGhpcy5pc0VkaXRhYmxlRGV0YWlsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGV0ZXJtaW5hdGVNb2RlRnJvbVVybFNlZ21lbnQoc2VnbWVudDogVXJsU2VnbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IF9wYXRoID0gc2VnbWVudCA/IHNlZ21lbnQucGF0aCA6ICcnO1xuICAgIGlmICh0aGlzLmlzSW5zZXJ0TW9kZVBhdGgoX3BhdGgpKSB7XG4gICAgICB0aGlzLnNldEluc2VydE1vZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNVcGRhdGVNb2RlUGF0aChfcGF0aCkpIHtcbiAgICAgIHRoaXMuc2V0VXBkYXRlTW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEluaXRpYWxNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF91cGRhdGVGb3JtRGF0YShuZXdGb3JtRGF0YTogb2JqZWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0gbmV3Rm9ybURhdGE7XG4gICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcCA9IGNvbXBvbmVudHNba2V5XTtcbiAgICAgICAgICBpZiAoVXRpbC5pc0Zvcm1EYXRhQ29tcG9uZW50KGNvbXApKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoY29tcC5pc0F1dG9tYXRpY0JpbmRpbmcoKSkge1xuICAgICAgICAgICAgICAgIGNvbXAuZGF0YSA9IHNlbGYuZ2V0RGF0YVZhbHVlKGtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYuaW5pdGlhbGl6ZUZpZWxkcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVGaWVsZHMoKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tjb250cm9sXS5tYXJrQXNQcmlzdGluZSgpO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUNhY2hlLnJlZ2lzdGVyQ2FjaGUoKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnVwZGF0ZU5hdmlnYXRpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhckNvbXBvbmVudHNPbGRWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnRzOiBJRm9ybURhdGFDb21wb25lbnRIYXNoID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgY29tcG9uZW50c0tleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5maWx0ZXIoa2V5ID0+IHNlbGYuaWdub3JlRm9ybUNhY2hlS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKTtcbiAgICBjb21wb25lbnRzS2V5cy5mb3JFYWNoKGNvbXBLZXkgPT4ge1xuICAgICAgY29uc3QgY29tcDogSUZvcm1EYXRhQ29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wS2V5XTtcbiAgICAgIChjb21wIGFzIGFueSkub2xkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICBjb21wLmdldEZvcm1Db250cm9sKCkuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0Q29ycmVjdEluc2VydChyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4odGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0SW5zZXJ0U3VjY2Vzc01lc3NhZ2UoKSwgeyBpY29uOiAnY2hlY2tfY2lyY2xlJyB9KTtcbiAgICB0aGlzLm9uSW5zZXJ0LmVtaXQocmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0SW5jb3JyZWN0SW5zZXJ0KHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RXJyb3IoJ2luc2VydCcsIHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdEluY29ycmVjdERlbGV0ZShyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0Vycm9yKCdkZWxldGUnLCByZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RJbmNvcnJlY3RVcGRhdGUocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dFcnJvcigndXBkYXRlJywgcmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0Q29ycmVjdFVwZGF0ZShyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4odGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0VXBkYXRlU3VjY2Vzc01lc3NhZ2UoKSwgeyBpY29uOiAnY2hlY2tfY2lyY2xlJyB9KTtcbiAgICB0aGlzLm9uVXBkYXRlLmVtaXQocmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0Q29ycmVjdERlbGV0ZShyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4odGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0RGVsZXRlU3VjY2Vzc01lc3NhZ2UoKSwgeyBpY29uOiAnY2hlY2tfY2lyY2xlJyB9KTtcbiAgICB0aGlzLm9uRGVsZXRlLmVtaXQocmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9ybUxheW91dE1hbmFnZXJUb1VwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtTGF5b3V0TWFuYWdlciA9IHRoaXMuZ2V0Rm9ybU1hbmFnZXIoKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoZm9ybUxheW91dE1hbmFnZXIpKSB7XG4gICAgICBmb3JtTGF5b3V0TWFuYWdlci5tYXJrRm9yVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb2JqZWN0VG9Gb3JtVmFsdWVEYXRhKGRhdGE6IG9iamVjdCA9IHt9KTogb2JqZWN0IHtcbiAgICBjb25zdCB2YWx1ZURhdGEgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICB2YWx1ZURhdGFbaXRlbV0gPSBuZXcgT0Zvcm1WYWx1ZShkYXRhW2l0ZW1dKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVEYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEN1cnJlbnRLZXlzVmFsdWVzKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybU5hdmlnYXRpb24uZ2V0Q3VycmVudEtleXNWYWx1ZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoQ29tcG9uZW50c0VkaXRhYmxlU3RhdGUoKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgIGNhc2UgT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUw6XG4gICAgICAgIHRoaXMuX3NldENvbXBvbmVudHNFZGl0YWJsZSh0aGlzLmlzRWRpdGFibGVEZXRhaWwoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5TRVJUOlxuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuVVBEQVRFOlxuICAgICAgICB0aGlzLl9zZXRDb21wb25lbnRzRWRpdGFibGUodHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGlzSW5zZXJ0TW9kZVBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmF2RGF0YTogT05hdmlnYXRpb25JdGVtID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRMYXN0SXRlbSgpO1xuICAgIC8vIFRPRE86IHNvbHZlIGlzc3VlICM3Mjcgd2hlbiBgaW5zZXJ0LWZvcm0tcm91dGVgIGlzIHByZXNlbnRcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQobmF2RGF0YSkgPyBwYXRoID09PSBuYXZEYXRhLmdldEluc2VydEZvcm1Sb3V0ZSgpIDogQ29kZXMuREVGQVVMVF9JTlNFUlRfUk9VVEUgPT09IHBhdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNVcGRhdGVNb2RlUGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYXZEYXRhOiBPTmF2aWdhdGlvbkl0ZW0gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldFByZXZpb3VzUm91dGVEYXRhKCk7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKG5hdkRhdGEpICYmIHBhdGggPT09IG5hdkRhdGEuZ2V0RWRpdEZvcm1Sb3V0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RXJyb3Iob3BlcmF0aW9uOiBzdHJpbmcsIHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdFUlJPUicsIHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtZXNzYWdlID0gJydcbiAgICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3VwZGF0ZSc6XG4gICAgICAgICAgbWVzc2FnZSA9IHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFVwZGF0ZUVycm9yTWVzc2FnZSgpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2luc2VydCc6XG4gICAgICAgICAgbWVzc2FnZSA9IHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldEluc2VydEVycm9yTWVzc2FnZSgpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgbWVzc2FnZSA9IHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldERlbGV0ZUVycm9yTWVzc2FnZSgpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjY3VzdG9tRm9ybVRvb2xiYXJCdXR0b25zPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbby1mb3JtLXRvb2xiYXItYnV0dG9uc11cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48by1mb3JtLXRvb2xiYXIgKm5nSWY9XCJzaG93RmxvYXRpbmdUb29sYmFyICYmIGhlYWRlclBvc2l0aW9uPT09J3RvcCdcIiBbbGFiZWwtaGVhZGVyXT1cImxhYmVsaGVhZGVyXCIgW2xhYmVsLWhlYWRlci1hbGlnbl09XCJsYWJlbEhlYWRlckFsaWduXCJcbiAgW2hlYWRlci1hY3Rpb25zXT1cImhlYWRlcmFjdGlvbnNcIiBbc2hvdy1oZWFkZXItbmF2aWdhdGlvbl09XCJzaG93SGVhZGVyTmF2aWdhdGlvblwiIFtzaG93LWhlYWRlci1hY3Rpb25zLXRleHRdPVwic2hvd0hlYWRlckFjdGlvbnNUZXh0XCJcbiAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiIGxheW91dC1wYWRkaW5nPlxuICA8ZGl2IG8tY3VzdG9tLWZvcm0tdG9vbGJhci1idXR0b25zLXdyYXBwZXIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L28tZm9ybS10b29sYmFyPlxuXG48bmctaG9zdCBvS2V5Ym9hcmRMaXN0ZW5lciBrZXlib2FyZEtleXM9XCIxNzs5MFwiIChvbktleXNQcmVzc2VkKT1cInVuZG9LZXlib2FyZFByZXNzZWQoKVwiIGNsYXNzPVwic2Nyb2xsaW5nIG8tc2Nyb2xsXCI+XG4gIDxkaXYgZnhGbGV4PVwiZ3Jvd1wiPlxuICAgIDxvLWZvcm0tdG9vbGJhciAqbmdJZj1cInNob3dOb3RGbG9hdGluZ1Rvb2xiYXIgJiYgaGVhZGVyUG9zaXRpb249PT0ndG9wJ1wiIFtsYWJlbC1oZWFkZXJdPVwibGFiZWxoZWFkZXJcIiBbbGFiZWwtaGVhZGVyLWFsaWduXT1cImxhYmVsSGVhZGVyQWxpZ25cIlxuICAgICAgW2hlYWRlci1hY3Rpb25zXT1cImhlYWRlcmFjdGlvbnNcIiBbc2hvdy1oZWFkZXItbmF2aWdhdGlvbl09XCJzaG93SGVhZGVyTmF2aWdhdGlvblwiIFtzaG93LWhlYWRlci1hY3Rpb25zLXRleHRdPVwic2hvd0hlYWRlckFjdGlvbnNUZXh0XCJcbiAgICAgIChvbkNhbmNlbCk9XCJvbkNhbmNlbC5lbWl0KCRldmVudClcIiBsYXlvdXQtcGFkZGluZz5cbiAgICAgIDxkaXYgby1jdXN0b20tZm9ybS10b29sYmFyLWJ1dHRvbnMtd3JhcHBlciBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgICAgIDxkaXYgby1jdXN0b20tZm9ybS10b29sYmFyLWJ1dHRvbnMtd3JhcHBlciBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUZvcm1Ub29sYmFyQnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvby1mb3JtLXRvb2xiYXI+XG5cbiAgICA8Zm9ybSAjaW5uZXJGb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgY2xhc3M9XCJpbm5lci1mb3JtXCIgW2NsYXNzLmZvcm0tbm8tdG9vbGJhcl09XCIhc2hvd0hlYWRlclwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGF1dG9jb3JyZWN0PVwib2ZmXCJcbiAgICAgIGF1dG9jYXBpdGFsaXplPVwib2ZmXCIgc3BlbGxjaGVjaz1cImZhbHNlXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZyB8IGFzeW5jXCIgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGxheW91dC1wYWRkaW5nIFtmeExheW91dF09XCJsYXlvdXREaXJlY3Rpb25cIiBbZnhMYXlvdXRBbGlnbl09XCJsYXlvdXRBbGlnblwiIGNsYXNzPVwiby1mb3JtLWNvbnRlbnQtd3JhcHBlclwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG5cbiAgICA8by1mb3JtLXRvb2xiYXIgKm5nSWY9XCJzaG93Tm90RmxvYXRpbmdUb29sYmFyICYmIGhlYWRlclBvc2l0aW9uPT09J2JvdHRvbSdcIiBbbGFiZWwtaGVhZGVyXT1cImxhYmVsaGVhZGVyXCIgW2xhYmVsLWhlYWRlci1hbGlnbl09XCJsYWJlbEhlYWRlckFsaWduXCJcbiAgICAgIFtoZWFkZXItYWN0aW9uc109XCJoZWFkZXJhY3Rpb25zXCIgW3Nob3ctaGVhZGVyLW5hdmlnYXRpb25dPVwic2hvd0hlYWRlck5hdmlnYXRpb25cIiBbc2hvdy1oZWFkZXItYWN0aW9ucy10ZXh0XT1cInNob3dIZWFkZXJBY3Rpb25zVGV4dFwiXG4gICAgICAob25DYW5jZWwpPVwib25DYW5jZWwuZW1pdCgkZXZlbnQpXCIgbGF5b3V0LXBhZGRpbmc+XG4gICAgICA8ZGl2IG8tY3VzdG9tLWZvcm0tdG9vbGJhci1idXR0b25zLXdyYXBwZXIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tRm9ybVRvb2xiYXJCdXR0b25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L28tZm9ybS10b29sYmFyPlxuICA8L2Rpdj5cbjwvbmctaG9zdD5cblxuPG8tZm9ybS10b29sYmFyICpuZ0lmPVwic2hvd0Zsb2F0aW5nVG9vbGJhciAmJiBoZWFkZXJQb3NpdGlvbj09PSdib3R0b20nXCIgW2xhYmVsLWhlYWRlcl09XCJsYWJlbGhlYWRlclwiIFtsYWJlbC1oZWFkZXItYWxpZ25dPVwibGFiZWxIZWFkZXJBbGlnblwiXG4gIFtoZWFkZXItYWN0aW9uc109XCJoZWFkZXJhY3Rpb25zXCIgW3Nob3ctaGVhZGVyLW5hdmlnYXRpb25dPVwic2hvd0hlYWRlck5hdmlnYXRpb25cIiBbc2hvdy1oZWFkZXItYWN0aW9ucy10ZXh0XT1cInNob3dIZWFkZXJBY3Rpb25zVGV4dFwiXG4gIChvbkNhbmNlbCk9XCJvbkNhbmNlbC5lbWl0KCRldmVudClcIiBsYXlvdXQtcGFkZGluZz5cbiAgPGRpdiBvLWN1c3RvbS1mb3JtLXRvb2xiYXItYnV0dG9ucy13cmFwcGVyIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tRm9ybVRvb2xiYXJCdXR0b25zXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9vLWZvcm0tdG9vbGJhcj5cbiJdfQ==
1367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxFQUlOLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUVoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU16RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFRbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtC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RTtRQUNyRSx1QkFBdUI7UUFDdkIsbUJBQW1CO0tBQ3BCLG9JQ3ZMSCxxcEdBbURBO0FEb0pFO0lBQUMscUJBQXFCLEVBQUU7O2tEQUNHO0FBVzNCO0lBQUMscUJBQXFCLEVBQUU7OzZEQUNlO0FBR3ZDO0lBQUMscUJBQXFCLEVBQUU7O21EQUNjO0FBUXRDO0lBQUMscUJBQXFCLEVBQUU7O3NEQUNpQjtBQUV6QztJQUFDLHFCQUFxQixFQUFFOztrREFDRztBQUMzQjtJQUFDLHFCQUFxQixFQUFFOzs0REFDYztBQUV0QztJQUFDLHFCQUFxQixFQUFFOzt5REFDVztBQUNuQztJQUFDLHFCQUFxQixFQUFFOzsyREFDWTtBQUNwQztJQUFDLHFCQUFxQixFQUFFOzttREFDSTtBQWU1QjtJQUFDLHFCQUFxQixFQUFFOzsrREFDd0I7MkZBNURyQyxjQUFjO2tCQWhCMUIsU0FBUzsrQkFDRSxRQUFRLGFBQ1A7d0JBQ1QsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxFQUFFO3dCQUNyRSx1QkFBdUI7d0JBQ3ZCLG1CQUFtQjtxQkFDcEIsVUFHTyxxQkFBcUIsV0FDcEIsc0JBQXNCLGlCQUNoQixpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLGdCQUFnQixFQUFFLE1BQU07cUJBQ3pCOytOQVNELFVBQVUsTUFZVixxQkFBcUIsTUFJWCxXQUFXLE1BU1gsY0FBYyxNQUd4QixVQUFVLE1BRVYsb0JBQW9CLE1BR3BCLGlCQUFpQixNQUVqQixtQkFBbUIsTUFFbkIsV0FBVyxNQWdCSix1QkFBdUIsTUF3RU4sV0FBVztzQkFBbEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgSUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRm9ybURhdGFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JtRGF0YVR5cGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS10eXBlLWNvbXBvbmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPRm9ybUxheW91dE1hbmFnZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L28tZm9ybS1sYXlvdXQtbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmFjdG9yaWVzJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlLCBPTmF2aWdhdGlvbkl0ZW0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb250aW1pemUvb250aW1pemUuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFNuYWNrQmFyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NuYWNrYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT0NvbmZpZ3VyZU1lc3NhZ2VTZXJ2aWNlQXJncyB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1tZXNzYWdlLXNlcnZpY2UtYXJncy50eXBlJztcbmltcG9ydCB7IE9Db25maWd1cmVTZXJ2aWNlQXJncyB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1zZXJ2aWNlLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBGb3JtTGF5b3V0Q2xvc2VEZXRhaWxPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvZm9ybS1sYXlvdXQtZGV0YWlsLWNvbXBvbmVudC1kYXRhLnR5cGUnO1xuaW1wb3J0IHsgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL2Zvcm0tdmFsdWUtb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9Gb3JtSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1mb3JtLWluaXRpYWxpemF0aW9uLW9wdGlvbnMudHlwZSc7XG5pbXBvcnQgeyBPRm9ybVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1mb3JtLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBTUUxUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWwvc3FsdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tY29udGFpbmVyL28tZm9ybS1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29udHJvbCB9IGZyb20gJy4uL2lucHV0L28tZm9ybS1jb250cm9sLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtQ2FjaGVDbGFzcyB9IGZyb20gJy4vY2FjaGUvby1mb3JtLmNhY2hlLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtQmFzZSB9IGZyb20gJy4vby1mb3JtLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSwgQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCB9IGZyb20gJy4vZ3VhcmRzL28tZm9ybS1jYW4tZGVhY3RpdmF0ZS5ndWFyZCc7XG5pbXBvcnQgeyBPRm9ybU5hdmlnYXRpb25DbGFzcyB9IGZyb20gJy4vbmF2aWdhdGlvbi9vLWZvcm0ubmF2aWdhdGlvbi5jbGFzcyc7XG5pbXBvcnQgeyBPRm9ybVZhbHVlIH0gZnJvbSAnLi9vLWZvcm0tdmFsdWUnO1xuaW1wb3J0IHsgT0Zvcm1NZXNzYWdlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvby1mb3JtLW1lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPRm9ybVRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXIvby1mb3JtLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS1jb21wb25lbnQtaGFzaC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRNYW5hZ2VyQmFzZSB9IGZyb20gJy4uLy4uL2xheW91dHMvZm9ybS1sYXlvdXQvby1mb3JtLWxheW91dC1tYW5hZ2VyLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT0Zvcm1Ub29sYmFyQmFzZSB9IGZyb20gJy4vdG9vbGJhci9vLWZvcm0tdG9vbGJhci1iYXNlLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fRk9STSA9IFtcbiAgLy8gc2hvdy1oZWFkZXIgW2Jvb2xlYW5dOiB2aXNpYmlsaXR5IG9mIGZvcm0gdG9vbGJhci4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0hlYWRlcjogc2hvdy1oZWFkZXInLFxuXG4gIC8vIGhlYWRlci1tb2RlIFtzdHJpbmddWyBub25lIHwgZmxvYXRpbmcgXTogcGFpbnRpbmcgbW9kZSBvZiBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6ICdmbG9hdGluZydcbiAgJ2hlYWRlck1vZGU6IGhlYWRlci1tb2RlJyxcblxuICAvLyBoZWFkZXItcG9zaXRpb24gWyB0b3AgfCBib3R0b20gXTogcG9zaXRpb24gb2YgdGhlIGZvcm0gdG9vbGJhci4gRGVmYXVsdDogJ3RvcCdcbiAgJ2hlYWRlclBvc2l0aW9uOiBoZWFkZXItcG9zaXRpb24nLFxuXG4gIC8vIGxhYmVsLWhlYWRlciBbc3RyaW5nXTogZGlzcGxheWFibGUgdGV4dCBvbiBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6ICcnLlxuICAnbGFiZWxoZWFkZXI6IGxhYmVsLWhlYWRlcicsXG5cbiAgLy8gbGFiZWwtaGVhZGVyLWFsaWduIFtzdHJpbmddW3N0YXJ0IHwgY2VudGVyIHwgZW5kXTogYWxpZ25tZW50IG9mIGZvcm0gdG9vbGJhciB0ZXh0LiBEZWZhdWx0OiAnY2VudGVyJ1xuICAnbGFiZWxIZWFkZXJBbGlnbjogbGFiZWwtaGVhZGVyLWFsaWduJyxcblxuICAvLyBoZWFkZXItYWN0aW9ucyBbc3RyaW5nXTogYXZhaWxhYmxlIGFjdGlvbiBidXR0b25zIG9uIGZvcm0gdG9vbGJhciBvZiBzdGFuZGFyZCBDUlVEIG9wZXJhdGlvbnMsIHNlcGFyYXRlZCBieSAnOycuIEF2YWlsYWJsZSBvcHRpb25zIGFyZSBSO0k7VTtEIChSZWZyZXNoLCBJbnNlcnQsIFVwZGF0ZSwgRGVsZXRlKS4gRGVmYXVsdDogUjtJO1U7RFxuICAnaGVhZGVyYWN0aW9uczogaGVhZGVyLWFjdGlvbnMnLFxuXG4gIC8vIHNob3ctaGVhZGVyLWFjdGlvbnMtdGV4dCBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBmb3JtIHRvb2xiYXIgYnV0dG9ucy4gRGVmYXVsdCB5ZXNcbiAgJ3Nob3dIZWFkZXJBY3Rpb25zVGV4dDogc2hvdy1oZWFkZXItYWN0aW9ucy10ZXh0JyxcblxuICAvLyBlbnRpdHkgW3N0cmluZ106IGVudGl0eSBvZiB0aGUgc2VydmljZS4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdlbnRpdHknLFxuXG4gIC8vIGtleXMgW3N0cmluZ106IGVudGl0eSBrZXlzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXMnLFxuXG4gIC8vIGNvbHVtbnMgW3N0cmluZ106IGNvbHVtbnMgb2YgdGhlIGVudGl0eSwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdjb2x1bW5zJyxcblxuICAvLyBzZXJ2aWNlIFtzdHJpbmddOiBKRUUgc2VydmljZSBwYXRoLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NlcnZpY2UnLFxuXG4gIC8vIHN0YXktaW4tcmVjb3JkLWFmdGVyLWVkaXQgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93cyBlZGl0IGZvcm0gYWZ0ZXIgZWRpdCBhIHJlY29yZC4gRGVmYXVsdDogZmFsc2U7XG4gICdzdGF5SW5SZWNvcmRBZnRlckVkaXQ6IHN0YXktaW4tcmVjb3JkLWFmdGVyLWVkaXQnLFxuXG4gIC8vIFtzdHJpbmddW25ldyB8IGRldGFpbF06IHNob3dzIHJlc2V0ZWQgZm9ybSBhZnRlciBpbnNlcnQgYSBuZXcgcmVjb3JkIChuZXcpIG9yIHNob3dzIHRoZSBpbnNlcnRlZCByZWNvcmQgYWZ0ZXIgKGRldGFpbClcbiAgJ2FmdGVySW5zZXJ0TW9kZTogYWZ0ZXItaW5zZXJ0LW1vZGUnLFxuXG4gICdzZXJ2aWNlVHlwZSA6IHNlcnZpY2UtdHlwZScsXG5cbiAgJ3F1ZXJ5T25Jbml0IDogcXVlcnktb24taW5pdCcsXG5cbiAgJ3BhcmVudEtleXM6IHBhcmVudC1rZXlzJyxcblxuICAvLyBxdWVyeS1tZXRob2QgW3N0cmluZ106IG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIHRvIHBlcmZvcm0gcXVlcmllcy4gRGVmYXVsdDogcXVlcnkuXG4gICdxdWVyeU1ldGhvZDogcXVlcnktbWV0aG9kJyxcblxuICAvLyBpbnNlcnQtbWV0aG9kIFtzdHJpbmddOiBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCB0byBwZXJmb3JtIGluc2VydHMuIERlZmF1bHQ6IGluc2VydC5cbiAgJ2luc2VydE1ldGhvZDogaW5zZXJ0LW1ldGhvZCcsXG5cbiAgLy8gdXBkYXRlLW1ldGhvZCBbc3RyaW5nXTogbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QgdG8gcGVyZm9ybSB1cGRhdGVzLiBEZWZhdWx0OiB1cGRhdGUuXG4gICd1cGRhdGVNZXRob2Q6IHVwZGF0ZS1tZXRob2QnLFxuXG4gIC8vIGRlbGV0ZS1tZXRob2QgW3N0cmluZ106IG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIHRvIHBlcmZvcm0gZGVsZXRpb25zLiBEZWZhdWx0OiBkZWxldGUuXG4gICdkZWxldGVNZXRob2Q6IGRlbGV0ZS1tZXRob2QnLFxuXG4gIC8vIGxheW91dC1kaXJlY3Rpb24gW3N0cmluZ11bY29sdW1ufHJvd106IERlZmF1bHQ6IGNvbHVtblxuICAnbGF5b3V0RGlyZWN0aW9uOiBsYXlvdXQtZGlyZWN0aW9uJyxcblxuICAvLyBmeExheW91dEFsaWduIHZhbHVlLiBEZWZhdWx0OiAnc3RhcnQgc3RhcnQnXG4gICdsYXlvdXRBbGlnbjogbGF5b3V0LWFsaWduJyxcblxuICAvLyBlZGl0YWJsZS1kZXRhaWwgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBEZWZhdWx0OiB0cnVlO1xuICAnZWRpdGFibGVEZXRhaWw6IGVkaXRhYmxlLWRldGFpbCcsXG5cbiAgLy8ga2V5cy1zcWwtdHlwZXMgW3N0cmluZ106IGVudGl0eSBrZXlzIHR5cGVzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXNTcWxUeXBlczoga2V5cy1zcWwtdHlwZXMnLFxuXG4gIC8vIHVuZG8tYnV0dG9uIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogSW5jbHVkZSB1bmRvIGJ1dHRvbiBpbiBmb3JtLXRvb2xiYXIuIERlZmF1bHQ6IHRydWU7XG4gICd1bmRvQnV0dG9uOiB1bmRvLWJ1dHRvbicsXG5cbiAgLy8gc2hvdy1oZWFkZXItbmF2aWdhdGlvbiBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluY2x1ZGUgbmF2aWdhdGlvbnMgYnV0dG9ucyBpbiBmb3JtLXRvb2xiYXIuIERlZmF1bHQ6IGZhbHNlO1xuICAnc2hvd0hlYWRlck5hdmlnYXRpb246IHNob3ctaGVhZGVyLW5hdmlnYXRpb24nLFxuXG4gIC8vIGF0dHJcbiAgJ29hdHRyOmF0dHInLFxuXG4gICdpbmNsdWRlQnJlYWRjcnVtYjogaW5jbHVkZS1icmVhZGNydW1iJyxcblxuICAnZGV0ZWN0Q2hhbmdlc09uQmx1cjogZGV0ZWN0LWNoYW5nZXMtb24tYmx1cicsXG5cbiAgJ2NvbmZpcm1FeGl0OiBjb25maXJtLWV4aXQnLFxuXG4gIC8vIGlnbm9yZS1vbi1leGl0IFtzdHJpbmddOiBmaWVsZHMgYXR0cidzIHRoYXQgd2lsbCBiZSBpZ25vcmVkIHdoZW4gdGhlIGZvcm0gaXMgY2xvc2VkLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2lnbm9yZU9uRXhpdDogaWdub3JlLW9uLWV4aXQnLFxuXG4gIC8vIFtmdW5jdGlvbl06IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gcXVlcnkgZXJyb3IuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncXVlcnlGYWxsYmFja0Z1bmN0aW9uOiBxdWVyeS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2luc2VydEZhbGxiYWNrRnVuY3Rpb246IGluc2VydC1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ3VwZGF0ZUZhbGxiYWNrRnVuY3Rpb246IHVwZGF0ZS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2RlbGV0ZUZhbGxiYWNrRnVuY3Rpb246IGRlbGV0ZS1mYWxsYmFjay1mdW5jdGlvbidcblxuICAvLyBpZ25vcmUtZGVmYXVsdC1uYXZpZ2F0aW9uIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogaWdub3JlIGRlZmF1bHQgbmF2aWdhdGlvbiB3aGVuIHVzZXIgY2xpY2sgdGhlIHRvb2xiYXIgYnV0dG9ucy4gRGVmYXVsdDogbm8uXG4gICdpZ25vcmVEZWZhdWx0TmF2aWdhdGlvbjogaWdub3JlLWRlZmF1bHQtbmF2aWdhdGlvbicsXG5cbiAgJ21lc3NhZ2VTZXJ2aWNlVHlwZSA6IG1lc3NhZ2Utc2VydmljZS10eXBlJyxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19GT1JNID0gW1xuICAnb25EYXRhTG9hZGVkJyxcbiAgJ2JlZm9yZUNsb3NlRGV0YWlsJyxcbiAgJ2JlZm9yZUdvRWRpdE1vZGUnLFxuICAnb25Gb3JtTW9kZUNoYW5nZScsXG4gICdvbkJlZm9yZUluc2VydCcsXG4gICdvbkJlZm9yZVVwZGF0ZScsXG4gICdvbkJlZm9yZURlbGV0ZScsXG4gICdvbkluc2VydCcsXG4gICdvblVwZGF0ZScsXG4gICdvbkRlbGV0ZScsXG4gICdiZWZvcmVJbnNlcnRNb2RlJyxcbiAgJ2JlZm9yZVVwZGF0ZU1vZGUnLFxuICAnYmVmb3JlSW5pdGlhbE1vZGUnLFxuICAnb25JbnNlcnRNb2RlJyxcbiAgJ29uVXBkYXRlTW9kZScsXG4gICdvbkluaXRpYWxNb2RlJyxcbiAgJ29uQ2FuY2VsJ1xuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby1mb3JtJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBPRm9ybUJhc2UsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9Gb3JtQ29tcG9uZW50KSB9LFxuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyLFxuICAgIE9Gb3JtTWVzc2FnZVNlcnZpY2VcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL28tZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fRk9STSxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fRk9STSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby1mb3JtXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENhbkNvbXBvbmVudERlYWN0aXZhdGUsIEFmdGVyVmlld0luaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9MQVlPVVRfRElSRUNUSU9OID0gJ2NvbHVtbic7XG4gIHB1YmxpYyBzdGF0aWMgZ3VhcmRDbGFzc05hbWUgPSAnQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCc7XG5cbiAgLyogaW5wdXRzIHZhcmlhYmxlcyAqL1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIGhlYWRlck1vZGU6IHN0cmluZyA9ICdmbG9hdGluZyc7XG4gIGhlYWRlclBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nID0gJ3RvcCc7XG4gIGxhYmVsaGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgbGFiZWxIZWFkZXJBbGlnbjogc3RyaW5nID0gJ2NlbnRlcic7XG4gIGhlYWRlcmFjdGlvbnM6IHN0cmluZyA9ICcnO1xuICBzaG93SGVhZGVyQWN0aW9uc1RleHQ6IHN0cmluZyA9ICd5ZXMnO1xuICBlbnRpdHk6IHN0cmluZztcbiAga2V5czogc3RyaW5nID0gJyc7XG4gIGNvbHVtbnM6IHN0cmluZyA9ICcnO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzdGF5SW5SZWNvcmRBZnRlckVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWZ0ZXJJbnNlcnRNb2RlOiAnbmV3JyB8ICdkZXRhaWwnIHwgJ2Nsb3NlJyA9ICdjbG9zZSc7XG4gIHNlcnZpY2VUeXBlOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwcm90ZWN0ZWQgcXVlcnlPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcGFyZW50S2V5czogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcXVlcnlNZXRob2Q6IHN0cmluZyA9IENvZGVzLlFVRVJZX01FVEhPRDtcbiAgcHJvdGVjdGVkIGluc2VydE1ldGhvZDogc3RyaW5nID0gQ29kZXMuSU5TRVJUX01FVEhPRDtcbiAgcHJvdGVjdGVkIHVwZGF0ZU1ldGhvZDogc3RyaW5nID0gQ29kZXMuVVBEQVRFX01FVEhPRDtcbiAgcHJvdGVjdGVkIGRlbGV0ZU1ldGhvZDogc3RyaW5nID0gQ29kZXMuREVMRVRFX01FVEhPRDtcbiAgcHJvdGVjdGVkIF9sYXlvdXREaXJlY3Rpb246IHN0cmluZyA9IE9Gb3JtQ29tcG9uZW50LkRFRkFVTFRfTEFZT1VUX0RJUkVDVElPTjtcbiAgcHJvdGVjdGVkIF9sYXlvdXRBbGlnbjogc3RyaW5nID0gJ3N0YXJ0IHN0cmV0Y2gnO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIGVkaXRhYmxlRGV0YWlsOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGtleXNTcWxUeXBlczogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgdW5kb0J1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93SGVhZGVyTmF2aWdhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgb2F0dHI6IHN0cmluZyA9ICcnO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgaW5jbHVkZUJyZWFkY3J1bWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGRldGVjdENoYW5nZXNPbkJsdXI6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29uZmlybUV4aXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBzZXQgaWdub3JlT25FeGl0KHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbCA9IFV0aWwucGFyc2VBcnJheSh2YWwsIHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9pZ25vcmVPbkV4aXQgPSB2YWw7XG4gIH1cbiAgZ2V0IGlnbm9yZU9uRXhpdCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZU9uRXhpdDtcbiAgfVxuICBwcm90ZWN0ZWQgX2lnbm9yZU9uRXhpdDogc3RyaW5nW107XG4gIHB1YmxpYyBxdWVyeUZhbGxiYWNrRnVuY3Rpb246IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAvLyBwdWJsaWMgaW5zZXJ0RmFsbGJhY2tGdW5jdGlvbjogRnVuY3Rpb247XG4gIC8vIHB1YmxpYyB1cGRhdGVGYWxsYmFja0Z1bmN0aW9uOiBGdW5jdGlvbjtcbiAgLy8gcHVibGljIGRlbGV0ZUZhbGxiYWNrRnVuY3Rpb246IEZ1bmN0aW9uO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIGlnbm9yZURlZmF1bHROYXZpZ2F0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIG1lc3NhZ2VTZXJ2aWNlVHlwZTogc3RyaW5nO1xuICAvKiBlbmQgb2YgaW5wdXRzIHZhcmlhYmxlcyAqL1xuXG4gIC8qcGFyc2VkIGlucHV0cyB2YXJpYWJsZXMgKi9cbiAgaXNEZXRhaWxGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIGtleXNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgY29sc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBkYXRhU2VydmljZTogYW55O1xuICBfcEtleXNFcXVpdiA9IHt9O1xuICBrZXlzU3FsVHlwZXNBcnJheTogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwcm90ZWN0ZWQgX21lc3NhZ2VTZXJ2aWNlOiBPRm9ybU1lc3NhZ2VTZXJ2aWNlO1xuICAvKiBlbmQgb2YgcGFyc2VkIGlucHV0cyB2YXJpYWJsZXMgKi9cblxuICBmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXA7XG4gIG9uRGF0YUxvYWRlZDogRXZlbnRFbWl0dGVyPG9iamVjdD4gPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgYmVmb3JlQ2xvc2VEZXRhaWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGJlZm9yZVVwZGF0ZU1vZGVgIGluc3RlYWRcbiAgICovXG4gIGJlZm9yZUdvRWRpdE1vZGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIGJlZm9yZUluc2VydE1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIGJlZm9yZVVwZGF0ZU1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIGJlZm9yZUluaXRpYWxNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBvbkluc2VydE1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIG9uVXBkYXRlTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgb25Jbml0aWFsTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgb25Gb3JtTW9kZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgcHVibGljIG9uQmVmb3JlSW5zZXJ0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uQmVmb3JlVXBkYXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uQmVmb3JlRGVsZXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uSW5zZXJ0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uVXBkYXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uRGVsZXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJvdGVjdGVkIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBsb2FkaW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHVibGljIGZvcm1EYXRhOiBvYmplY3QgPSB7fTtcbiAgcHVibGljIG5hdmlnYXRpb25EYXRhOiBBcnJheTxhbnk+ID0gW107XG4gIHB1YmxpYyBjdXJyZW50SW5kZXggPSAwO1xuICBwdWJsaWMgbW9kZTogbnVtYmVyID0gT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUw7XG5cbiAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2U7XG4gIHByb3RlY3RlZCBzbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZTtcblxuICBwcm90ZWN0ZWQgX2Zvcm1Ub29sYmFyOiBPRm9ybVRvb2xiYXJCYXNlO1xuXG4gIHByb3RlY3RlZCBfY29tcG9uZW50czogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCA9IHt9O1xuICBwcm90ZWN0ZWQgX2NvbXBTUUxUeXBlczogb2JqZWN0ID0ge307XG5cbiAgZm9ybVBhcmVudEtleXNWYWx1ZXM6IG9iamVjdDtcblxuICBwdWJsaWMgb25Gb3JtSW5pdFN0cmVhbTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBwcm90ZWN0ZWQgcmVsb2FkU3RyZWFtOiBPYnNlcnZhYmxlPGFueT47XG4gIHByb3RlY3RlZCByZWxvYWRTdHJlYW1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgcXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGxvYWRlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgZHluYW1pY0Zvcm1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgZGVhY3RpdmF0ZUd1YXJkOiBDYW5EZWFjdGl2YXRlRm9ybUd1YXJkO1xuICBwdWJsaWMgZGVhY3RpdmF0ZUd1YXJkSWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIGZvcm1DYWNoZTogT0Zvcm1DYWNoZUNsYXNzO1xuICBwcm90ZWN0ZWQgZm9ybU5hdmlnYXRpb246IE9Gb3JtTmF2aWdhdGlvbkNsYXNzO1xuXG4gIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBPRm9ybUNvbnRhaW5lckNvbXBvbmVudDtcblxuICBwcm90ZWN0ZWQgcGVybWlzc2lvbnNTZXJ2aWNlOiBQZXJtaXNzaW9uc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBwZXJtaXNzaW9uczogT0Zvcm1QZXJtaXNzaW9ucztcblxuICBAVmlld0NoaWxkKCdpbm5lckZvcm0nKSBpbm5lckZvcm1FbDogRWxlbWVudFJlZjtcblxuICBpZ25vcmVGb3JtQ2FjaGVLZXlzOiBBcnJheTxhbnk+ID0gW107XG4gIGNhbkRpc2NhcmRDaGFuZ2VzOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzdGF0aWMgTW9kZSgpOiBhbnkge1xuICAgIGVudW0gbSB7XG4gICAgICBRVUVSWSxcbiAgICAgIElOU0VSVCxcbiAgICAgIFVQREFURSxcbiAgICAgIElOSVRJQUxcbiAgICB9XG4gICAgcmV0dXJuIG07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZWxSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG5cbiAgICB0aGlzLmZvcm1DYWNoZSA9IG5ldyBPRm9ybUNhY2hlQ2xhc3ModGhpcyk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbiA9IG5ldyBPRm9ybU5hdmlnYXRpb25DbGFzcyh0aGlzLmluamVjdG9yLCB0aGlzLCB0aGlzLnJvdXRlciwgdGhpcy5hY3RSb3V0ZSk7XG5cbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBpbmplY3Rvci5nZXQ8RGlhbG9nU2VydmljZT4oRGlhbG9nU2VydmljZSBhcyBUeXBlPERpYWxvZ1NlcnZpY2U+KTtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0PE5hdmlnYXRpb25TZXJ2aWNlPihOYXZpZ2F0aW9uU2VydmljZSBhcyBUeXBlPE5hdmlnYXRpb25TZXJ2aWNlPik7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSBpbmplY3Rvci5nZXQ8U25hY2tCYXJTZXJ2aWNlPihTbmFja0JhclNlcnZpY2UgYXMgVHlwZTxTbmFja0JhclNlcnZpY2U+KTtcbiAgICB0aGlzLnBlcm1pc3Npb25zU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PFBlcm1pc3Npb25zU2VydmljZT4oUGVybWlzc2lvbnNTZXJ2aWNlIGFzIFR5cGU8UGVybWlzc2lvbnNTZXJ2aWNlPik7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlbG9hZFN0cmVhbSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgc2VsZi5vbkZvcm1Jbml0U3RyZWFtLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgc2VsZi5mb3JtTmF2aWdhdGlvbi5uYXZpZ2F0aW9uU3RyZWFtLmFzT2JzZXJ2YWJsZSgpXG4gICAgXSk7XG5cbiAgICB0aGlzLnJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbiA9IHRoaXMucmVsb2FkU3RyZWFtLnN1YnNjcmliZSh2YWxBcnIgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNBcnJheSh2YWxBcnIpICYmIHZhbEFyci5sZW5ndGggPT09IDIgJiYgIXNlbGYuaXNJbkluc2VydE1vZGUoKSkge1xuICAgICAgICBjb25zdCB2YWxBcnJWYWx1ZXMgPSB2YWxBcnJbMF0gPT09IHRydWUgJiYgdmFsQXJyWzFdID09PSB0cnVlO1xuICAgICAgICBpZiAoc2VsZi5xdWVyeU9uSW5pdCAmJiB2YWxBcnJWYWx1ZXMpIHtcbiAgICAgICAgICBzZWxmLnJlbG9hZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLmluaXRpYWxpemVGaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZm9ybUNvbnRhaW5lciA9IGluamVjdG9yLmdldChPRm9ybUNvbnRhaW5lckNvbXBvbmVudCk7XG4gICAgICB0aGlzLmZvcm1Db250YWluZXIuc2V0Rm9ybSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyRm9ybUNvbXBvbmVudChjb21wOiBhbnkpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcblxuICAgICAgICBpZiAoIWNvbXAuaXNBdXRvbWF0aWNSZWdpc3RlcmluZygpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudHMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgICBjb21wLnJlcGVhdGVkQXR0ciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIGNvbXBvbmVudCByZWdpc3RlcmVkIGluIHRoZSBmb3JtIHdpdGggdGhlIGF0dHI6ICcgKyBhdHRyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb21wb25lbnRzW2F0dHJdID0gY29tcDtcbiAgICAgICAgLy8gU2V0dGluZyBwYXJlbnQga2V5IHZhbHVlcy4uLlxuICAgICAgICBpZiAodGhpcy5mb3JtUGFyZW50S2V5c1ZhbHVlcyAmJiB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzW2F0dHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzW2F0dHJdO1xuICAgICAgICAgIHRoaXMuX2NvbXBvbmVudHNbYXR0cl0uc2V0VmFsdWUodmFsLCB7XG4gICAgICAgICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICogVE9ETy4gQ2hlY2sgaXQhISFcbiAgICAgICAgKiBFbiB1biBmb3JtdWxhcmlvIGNvbiB0YWJzLCBjdWFuZG8gc2UgY2FtYmlhIGRlIHVubyBhIG90cm8sIHNlIGRlc3RydXllbiBsYXMgdmlzdGFzXG4gICAgICAgICogZGUgbG9zIGNvbXBvbmVudGVzIGhpam8gZGVsIGZvcm11bGFyaW8uXG4gICAgICAgICogZm9ybURhdGFDYWNoZSBjb250aWVuZSBsb3MgdmFsb3JlcyAob3JpZ2luYWxlcyDDsyBlZGl0YWRvcykgZGUgbG9zIGNhbXBvcyBkZWwgZm9ybXVsYXJpby5cbiAgICAgICAgKiBMYSBpZGVhIGVzIGFzaWduYXIgZXNlIHZhbG9yIGFsIGNhbXBvIGN1YW5kbyBzZSByZWdpc3RyZSBkZSBudWV2byAoSGF5IHF1ZSBhc2VndXJhciBlbCBwcm9jZXNvXG4gICAgICAgICogcGFyYSBxdWUgc8OzbG8gc2VhIGN1YW5kbyBzZSByZWdpc3RyYSBkZSBudWV2byA7KSApXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IGNhY2hlZFZhbHVlID0gdGhpcy5mb3JtQ2FjaGUuZ2V0Q2FjaGVkVmFsdWUoYXR0cik7XG4gICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChjYWNoZWRWYWx1ZSkgJiYgdGhpcy5nZXREYXRhVmFsdWVzKCkgJiYgdGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIHRoaXMuX2NvbXBvbmVudHNbYXR0cl0uc2V0VmFsdWUoY2FjaGVkVmFsdWUsIHtcbiAgICAgICAgICAgIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UsXG4gICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlclNRTFR5cGVGb3JtQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YVR5cGVDb21wb25lbnQpIHtcbiAgICBpZiAoKGNvbXAgYXMgYW55KS5yZXBlYXRlZEF0dHIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBjb21wLmdldFNRTFR5cGUoKTtcbiAgICAgIGNvbnN0IGF0dHIgPSBjb21wLmdldEF0dHJpYnV0ZSgpO1xuICAgICAgaWYgKHR5cGUgIT09IFNRTFR5cGVzLk9USEVSICYmIGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwICYmIHRoaXMuaWdub3JlRm9ybUNhY2hlS2V5cy5pbmRleE9mKGF0dHIpID09PSAtMSkge1xuICAgICAgICAvLyBSaWdodCBub3cganVzdCBzdG9yZSB2YWx1ZXMgZGlmZmVyZW50IG9mICdPVEhFUidcbiAgICAgICAgdGhpcy5fY29tcFNRTFR5cGVzW2F0dHJdID0gdHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlckZvcm1Db250cm9sQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YUNvbXBvbmVudCkge1xuICAgIGlmICgoY29tcCBhcyBhbnkpLnJlcGVhdGVkQXR0cikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gY29tcC5nZXRDb250cm9sKCk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAucmVnaXN0ZXJDb250cm9sKGF0dHIsIGNvbnRyb2wpO1xuICAgICAgICAgIGlmICghY29tcC5pc0F1dG9tYXRpY1JlZ2lzdGVyaW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlRm9ybUNhY2hlS2V5cy5wdXNoKGNvbXAuZ2V0QXR0cmlidXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXJGb3JtQ29tcG9uZW50KGNvbXA6IElDb21wb25lbnQpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDAgJiYgdGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fY29tcG9uZW50c1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vYXR0cikge1xuICAgICAgcmV0dXJuIHRoaXMub2F0dHI7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB1bnJlZ2lzdGVyRm9ybUNvbnRyb2xDb21wb25lbnQoY29tcDogSUZvcm1EYXRhQ29tcG9uZW50KSB7XG4gICAgaWYgKGNvbXAgJiYgY29tcC5pc0F1dG9tYXRpY1JlZ2lzdGVyaW5nKCkpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCA9IGNvbXAuZ2V0Q29udHJvbCgpO1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoY29udHJvbCAmJiBhdHRyICYmIGF0dHIubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5yZW1vdmVDb250cm9sKGF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXJTUUxUeXBlRm9ybUNvbXBvbmVudChjb21wOiBJRm9ybURhdGFUeXBlQ29tcG9uZW50KSB7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBjb21wLmdldEF0dHJpYnV0ZSgpO1xuICAgICAgaWYgKGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jb21wU1FMVHlwZXNbYXR0cl07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUb29sYmFyKGZUb29sYmFyOiBPRm9ybVRvb2xiYXJDb21wb25lbnQpIHtcbiAgICBpZiAoZlRvb2xiYXIpIHtcbiAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyID0gZlRvb2xiYXI7XG4gICAgICB0aGlzLl9mb3JtVG9vbGJhci5pc0RldGFpbCA9IHRoaXMuaXNEZXRhaWxGb3JtO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudHMoKTogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudHM7XG4gIH1cblxuICBwdWJsaWMgbG9hZCgpOiBhbnkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgIGNvbnN0IGxvYWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQodHJ1ZSk7XG4gICAgICB9LCAyNTApO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHNlbGYubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgIH0pO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGxvYWRPYnNlcnZhYmxlLnN1YnNjcmliZSh2YWwgPT4ge1xuICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBzZWxmLmxvYWRpbmdTdWJqZWN0Lm5leHQodmFsIGFzIGJvb2xlYW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIGdldERhdGFWYWx1ZShhdHRyOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc0luSW5zZXJ0TW9kZSgpKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdldEZpbHRlckZyb21VcmxQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlW2F0dHJdIHx8IHVybFBhcmFtc1thdHRyXTtcbiAgICAgIHJldHVybiBuZXcgT0Zvcm1WYWx1ZSh2YWwpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0luSW5pdGlhbE1vZGUoKSAmJiAhdGhpcy5pc0VkaXRhYmxlRGV0YWlsKCkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1EYXRhO1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICByZXR1cm4gZGF0YVthdHRyXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNJblVwZGF0ZU1vZGUoKSB8fCB0aGlzLmlzRWRpdGFibGVEZXRhaWwoKSkge1xuICAgICAgaWYgKHRoaXMuZm9ybURhdGEgJiYgT2JqZWN0LmtleXModGhpcy5mb3JtRGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZvcm1DYWNoZS5nZXRDYWNoZWRWYWx1ZShhdHRyKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwLmRpcnR5ICYmIHZhbCkge1xuICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBPRm9ybVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IE9Gb3JtVmFsdWUodmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZXR1cm4gb3JpZ2luYWwgdmFsdWUgc3RvcmVkIGludG8gZm9ybSBkYXRhLi4uXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybURhdGE7XG4gICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFbYXR0cl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgT0Zvcm1WYWx1ZSgpO1xuICB9XG5cbiAgZ2V0RGF0YVZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGZvcm0gZGF0YS4gVGhlIGRhdGEgcmVsYXRlZCB0byB1cmwgcGFyYW1zIGFuZCBwYXJlbnQga2V5cyByZW1haW4gdW5jaGFuZ2VkLlxuICAgKi9cbiAgY2xlYXJEYXRhKCkge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZm9ybU5hdmlnYXRpb24uZ2V0RmlsdGVyRnJvbVVybFBhcmFtcygpO1xuICAgIHRoaXMuZm9ybUdyb3VwLnJlc2V0KHt9LCB7XG4gICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5zZXREYXRhKGZpbHRlcik7XG4gIH1cblxuICBjYW5EZWFjdGl2YXRlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XG4gICAgY29uc3QgcmVhZE9ubHkgPSB0aGlzLmlzSW5Jbml0aWFsTW9kZSgpICYmICF0aGlzLmlzRWRpdGFibGVEZXRhaWwoKTtcbiAgICBjb25zdCBjYW5jZWxsZWRFZGl0aW9uID0gdGhpcy5pc0luVXBkYXRlTW9kZSgpICYmIHRoaXMuX2Zvcm1Ub29sYmFyICYmICF0aGlzLl9mb3JtVG9vbGJhci5lZGl0TW9kZTtcbiAgICBpZiAocmVhZE9ubHkgfHwgY2FuY2VsbGVkRWRpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpcm1FeGl0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY2FuRGlzY2FyZENoYW5nZXMgPSAhIXRoaXMuY2FuRGlzY2FyZENoYW5nZXM7XG4gICAgdGhpcy5jYW5EaXNjYXJkQ2hhbmdlcyA9IGZhbHNlO1xuICAgIHJldHVybiBjYW5EaXNjYXJkQ2hhbmdlcyB8fCB0aGlzLnNob3dDb25maXJtRGlzY2FyZENoYW5nZXMoKTtcbiAgfVxuXG4gIHNob3dDb25maXJtRGlzY2FyZENoYW5nZXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybU5hdmlnYXRpb24uc2hvd0NvbmZpcm1EaXNjYXJkQ2hhbmdlcyh0aGlzLmlnbm9yZU9uRXhpdCk7XG4gIH1cblxuICBleGVjdXRlVG9vbGJhckFjdGlvbihhY3Rpb246IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICBjYXNlIENvZGVzLkJBQ0tfQUNUSU9OOiB0aGlzLmJhY2sob3B0aW9ucyk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5DTE9TRV9ERVRBSUxfQUNUSU9OOiB0aGlzLmNsb3NlRGV0YWlsKG9wdGlvbnMpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuUkVMT0FEX0FDVElPTjogdGhpcy5yZWxvYWQodHJ1ZSk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5HT19JTlNFUlRfQUNUSU9OOiB0aGlzLmdvSW5zZXJ0TW9kZShvcHRpb25zKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLklOU0VSVF9BQ1RJT046IHRoaXMuaW5zZXJ0KCk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5HT19FRElUX0FDVElPTjogdGhpcy5nb0VkaXRNb2RlKCk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5FRElUX0FDVElPTjogdGhpcy51cGRhdGUoKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLlVORE9fTEFTVF9DSEFOR0VfQUNUSU9OOiB0aGlzLnVuZG8oKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkRFTEVURV9BQ1RJT046IHJldHVybiB0aGlzLmRlbGV0ZSgpO1xuICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZERlYWN0aXZhdGVHdWFyZCgpO1xuXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XG5cbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgYWRkRGVhY3RpdmF0ZUd1YXJkKCkge1xuICAgIGlmICghdGhpcy5hY3RSb3V0ZSB8fCAhdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlYWN0aXZhdGVHdWFyZCA9IHRoaXMuaW5qZWN0b3IuZ2V0KENhbkRlYWN0aXZhdGVGb3JtR3VhcmQpO1xuICAgIHRoaXMuZGVhY3RpdmF0ZUd1YXJkLmFkZEZvcm0odGhpcyk7XG4gICAgY29uc3QgY2FuRGVhY3RpdmF0ZUFycmF5ID0gKHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZSB8fCBbXSk7XG4gICAgbGV0IHByZXZpb3VzbHlBZGRlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjYW5EZWFjdGl2YXRlQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHByZXZpb3VzbHlBZGRlZCA9ICgoY2FuRGVhY3RpdmF0ZUFycmF5W2ldLmhhc093blByb3BlcnR5KCdDTEFTU05BTUUnKSAmJiBjYW5EZWFjdGl2YXRlQXJyYXlbaV0uQ0xBU1NOQU1FKSA9PT0gT0Zvcm1Db21wb25lbnQuZ3VhcmRDbGFzc05hbWUpO1xuICAgICAgaWYgKHByZXZpb3VzbHlBZGRlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwcmV2aW91c2x5QWRkZWQpIHtcbiAgICAgIGNhbkRlYWN0aXZhdGVBcnJheS5wdXNoKHRoaXMuZGVhY3RpdmF0ZUd1YXJkLmNvbnN0cnVjdG9yKTtcbiAgICAgIHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZSA9IGNhbkRlYWN0aXZhdGVBcnJheTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95RGVhY3RpdmF0ZUd1YXJkKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWFjdGl2YXRlR3VhcmQoKSkge1xuICAgICAgICB0aGlzLmRlYWN0aXZhdGVHdWFyZC5yZW1vdmVGb3JtKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuZGVhY3RpdmF0ZUd1YXJkLmlzRm9ybXNDYWNoZUVtcHR5KCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5hY3RSb3V0ZSB8fCAhdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZyB8fCAhdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGd1YXJkSW5kZXggPSB0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuZmluZEluZGV4KChjYW5EZWFjdGl2YXRlKSA9PiBjYW5EZWFjdGl2YXRlLm5hbWUgPT09IE9Gb3JtQ29tcG9uZW50Lmd1YXJkQ2xhc3NOYW1lKVxuICAgICAgaWYgKGd1YXJkSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuc3BsaWNlKGd1YXJkSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL1xuICAgIH1cbiAgfVxuXG4gIGhhc0RlYWN0aXZhdGVHdWFyZCgpIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5kZWFjdGl2YXRlR3VhcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgbWV0aG9kc1xuICAgKi9cblxuICBpbml0aWFsaXplKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLmhlYWRlcmFjdGlvbnMgPT09ICdhbGwnKSB7XG4gICAgICB0aGlzLmhlYWRlcmFjdGlvbnMgPSAnUjtJO1U7RCc7XG4gICAgfVxuICAgIHRoaXMua2V5c0FycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMua2V5cywgdHJ1ZSk7XG4gICAgdGhpcy5jb2xzQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5jb2x1bW5zLCB0cnVlKTtcbiAgICBjb25zdCBwa0FycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMucGFyZW50S2V5cyk7XG4gICAgdGhpcy5fcEtleXNFcXVpdiA9IFV0aWwucGFyc2VQYXJlbnRLZXlzRXF1aXZhbGVuY2VzKHBrQXJyYXkpO1xuICAgIHRoaXMua2V5c1NxbFR5cGVzQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5rZXlzU3FsVHlwZXMpO1xuXG4gICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG5cbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnN1YnNjcmliZVRvUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnN1YnNjcmliZVRvVXJsUGFyYW1zKCk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5zdWJzY3JpYmVUb1VybCgpO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc3Vic2NyaWJlVG9DYWNoZUNoYW5nZXMoKTtcblxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlKSB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uVmlzaWJsZUNoYW5nZSh2aXNpYmxlID0+IHtcbiAgICAgICAgc2VsZi5zaG93SGVhZGVyID0gdmlzaWJsZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubW9kZSA9IE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMO1xuXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlLmdldEZvcm1QZXJtaXNzaW9ucyh0aGlzLm9hdHRyLCB0aGlzLmFjdFJvdXRlKTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMucXVlcnlGYWxsYmFja0Z1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBpZiAodHlwZW9mIHRoaXMuaW5zZXJ0RmFsbGJhY2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICAgdGhpcy5pbnNlcnRGYWxsYmFja0Z1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIC8vIH1cbiAgICAvLyBpZiAodHlwZW9mIHRoaXMudXBkYXRlRmFsbGJhY2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICAgdGhpcy51cGRhdGVGYWxsYmFja0Z1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIC8vIH1cbiAgICAvLyBpZiAodHlwZW9mIHRoaXMuZGVsZXRlRmFsbGJhY2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICAgdGhpcy5kZWxldGVGYWxsYmFja0Z1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIC8vIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlaW5pdGlhbGl6ZSBmb3JtIGFkZGluZyBvcHRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICByZWluaXRpYWxpemUob3B0aW9uczogT0Zvcm1Jbml0aWFsaXphdGlvbk9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNsb25lZE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBjbG9uZWRPcHRzKSB7XG4gICAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgdGhpc1twcm9wXSA9IGNsb25lZE9wdHNbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgfVxuICB9XG5cbiAgY29uZmlndXJlU2VydmljZSgpIHtcbiAgICBjb25zdCBtc2dDb25maWd1cmVTZXJ2aWNlQXJnczogT0NvbmZpZ3VyZU1lc3NhZ2VTZXJ2aWNlQXJncyA9IHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsIGJhc2VTZXJ2aWNlOiBPRm9ybU1lc3NhZ2VTZXJ2aWNlLCBzZXJ2aWNlVHlwZTogdGhpcy5tZXNzYWdlU2VydmljZVR5cGUgfVxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlID0gVXRpbC5jb25maWd1cmVNZXNzYWdlU2VydmljZShtc2dDb25maWd1cmVTZXJ2aWNlQXJncyk7XG5cbiAgICBjb25zdCBjb25maWd1cmVTZXJ2aWNlQXJnczogT0NvbmZpZ3VyZVNlcnZpY2VBcmdzID0geyBpbmplY3RvcjogdGhpcy5pbmplY3RvciwgYmFzZVNlcnZpY2U6IE9udGltaXplU2VydmljZSwgZW50aXR5OiB0aGlzLmVudGl0eSwgc2VydmljZTogdGhpcy5zZXJ2aWNlLCBzZXJ2aWNlVHlwZTogdGhpcy5zZXJ2aWNlVHlwZSB9XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IFV0aWwuY29uZmlndXJlU2VydmljZShjb25maWd1cmVTZXJ2aWNlQXJncyk7XG4gIH1cblxuICBnZXQgbWVzc2FnZVNlcnZpY2UoKTogT0Zvcm1NZXNzYWdlU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VTZXJ2aWNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZWxvYWRTdHJlYW1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVlcnlTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucXVlcnlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmZvcm1DYWNoZS5kZXN0cm95KCk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5kZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95RGVhY3RpdmF0ZUd1YXJkKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRldGVybWluYXRlRm9ybU1vZGUoKTtcbiAgICAgIHRoaXMub25Gb3JtSW5pdFN0cmVhbS5lbWl0KHRydWUpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLypcbiAgICogSW5uZXIgbWV0aG9kc1xuICAgKi9cblxuICBfc2V0Q29tcG9uZW50c0VkaXRhYmxlKHN0YXRlOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29tcG9uZW50czogYW55ID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgT2JqZWN0LmtleXMoY29tcG9uZW50cykuZm9yRWFjaChjb21wS2V5ID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcEtleV07XG4gICAgICBjb21wb25lbnQuaXNSZWFkT25seSA9ICFzdGF0ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGZvcm0gb3BlcmF0aW9uIG1vZGUuXG4gICAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHRvIGJlIGVzdGFibGlzaGVkXG4gICAqL1xuICBzZXRGb3JtTW9kZShtb2RlOiBudW1iZXIpIHtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgIGNhc2UgT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUw6XG4gICAgICAgIHRoaXMuYmVmb3JlSW5pdGlhbE1vZGUuZW1pdCgpO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICBpZiAodGhpcy5fZm9ybVRvb2xiYXIpIHtcbiAgICAgICAgICB0aGlzLl9mb3JtVG9vbGJhci5zZXRJbml0aWFsTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldENvbXBvbmVudHNFZGl0YWJsZSh0aGlzLmlzRWRpdGFibGVEZXRhaWwoKSk7XG4gICAgICAgIHRoaXMub25Gb3JtTW9kZUNoYW5nZS5lbWl0KHRoaXMubW9kZSk7XG4gICAgICAgIHRoaXMub25Jbml0aWFsTW9kZS5lbWl0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5TRVJUOlxuICAgICAgICB0aGlzLmJlZm9yZUluc2VydE1vZGUuZW1pdCgpO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICBpZiAodGhpcy5fZm9ybVRvb2xiYXIpIHtcbiAgICAgICAgICB0aGlzLl9mb3JtVG9vbGJhci5zZXRJbnNlcnRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhckRhdGEoKTtcbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRydWUpO1xuICAgICAgICB0aGlzLm9uRm9ybU1vZGVDaGFuZ2UuZW1pdCh0aGlzLm1vZGUpO1xuICAgICAgICB0aGlzLm9uSW5zZXJ0TW9kZS5lbWl0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuVVBEQVRFOlxuICAgICAgICB0aGlzLmJlZm9yZVVwZGF0ZU1vZGUuZW1pdCgpO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICBpZiAodGhpcy5fZm9ybVRvb2xiYXIpIHtcbiAgICAgICAgICB0aGlzLl9mb3JtVG9vbGJhci5zZXRFZGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldENvbXBvbmVudHNFZGl0YWJsZSh0cnVlKTtcbiAgICAgICAgdGhpcy5vbkZvcm1Nb2RlQ2hhbmdlLmVtaXQodGhpcy5tb2RlKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZU1vZGUuZW1pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT0Zvcm1Db21wb25lbnQuTW9kZSgpLlFVRVJZOlxuICAgICAgICBjb25zb2xlLmVycm9yKCdGb3JtIFFVRVJZIG1vZGUgaXMgbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogU2V0cyBuZXcgZGF0YSBmb3IgdGhlIGZvcm1cbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHNldERhdGEoZGF0YSk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT0Zvcm1Db21wb25lbnRdIEZvcm0gZGF0YSBoYXMgbW9yZSB0aGFuIGEgc2luZ2xlIHJlY29yZC4gU3RvcmluZyBlbXB0eSBkYXRhJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGRhdGEubGVuZ3RoID09PSAxID8gZGF0YVswXSA6IHt9O1xuICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEodGhpcy50b0Zvcm1WYWx1ZURhdGEoY3VycmVudERhdGEpKTtcbiAgICAgIHRoaXMuX2VtaXREYXRhKGN1cnJlbnREYXRhKTtcbiAgICB9IGVsc2UgaWYgKFV0aWwuaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUZvcm1EYXRhKHRoaXMudG9Gb3JtVmFsdWVEYXRhKGRhdGEpKTtcbiAgICAgIHRoaXMuX2VtaXREYXRhKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Zvcm0gaGFzIHJlY2VpdmVkIG5vdCBzdXBwb3J0ZWQgc2VydmljZSBkYXRhLiBTdXBwb3J0ZWQgZGF0YSBhcmUgQXJyYXkgb3IgT2JqZWN0Jyk7XG4gICAgICB0aGlzLl91cGRhdGVGb3JtRGF0YSh7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgc2V0RGF0YShkYXRhKWAgaW5zdGVhZFxuICAgKi9cbiAgX3NldERhdGEoZGF0YSkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fc2V0RGF0YWAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgc2V0RGF0YWAgaW5zdGVhZCcpO1xuICAgIHRoaXMuc2V0RGF0YShkYXRhKTtcbiAgfVxuXG4gIF9lbWl0RGF0YShkYXRhKSB7XG4gICAgdGhpcy5vbkRhdGFMb2FkZWQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGJhY2soKWAgaW5zdGVhZFxuICAgKi9cbiAgX2JhY2tBY3Rpb24oKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9iYWNrQWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBiYWNrYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5iYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgYmFja1xuICAgKi9cbiAgYmFjayhvcHRpb25zPzogYW55KSB7XG4gICAgY29uc3QgYWxsT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucyB8fCB7fSwgeyBpZ25vcmVOYXZpZ2F0aW9uOiB0aGlzLmlnbm9yZURlZmF1bHROYXZpZ2F0aW9uIH0pO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24ubmF2aWdhdGVCYWNrKGFsbE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgY2xvc2VEZXRhaWwob3B0aW9ucz86IGFueSlgIGluc3RlYWRcbiAgICovXG4gIF9jbG9zZURldGFpbEFjdGlvbihvcHRpb25zPzogYW55KSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9jbG9zZURldGFpbEFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgY2xvc2VEZXRhaWxgIGluc3RlYWQnKTtcbiAgICB0aGlzLmNsb3NlRGV0YWlsKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGN1cnJlbnQgZGV0YWlsIGZvcm1cbiAgICovXG4gIGNsb3NlRGV0YWlsKG9wdGlvbnM/OiBhbnkpIHtcbiAgICBvcHRpb25zID0gVXRpbC5pc0RlZmluZWQob3B0aW9ucykgPyBvcHRpb25zIDoge307XG4gICAgb3B0aW9ucy5pZ25vcmVOYXZpZ2F0aW9uID0gdGhpcy5pZ25vcmVEZWZhdWx0TmF2aWdhdGlvbjtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLmNsb3NlRGV0YWlsQWN0aW9uKG9wdGlvbnMpO1xuICB9XG5cbiAgX3N0YXlJblJlY29yZEFmdGVySW5zZXJ0KGluc2VydGVkS2V5czogb2JqZWN0KSB7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5zdGF5SW5SZWNvcmRBZnRlckluc2VydChpbnNlcnRlZEtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgcmVsb2FkKHVzZUZpbHRlcjogYm9vbGVhbiA9IGZhbHNlKWAgaW5zdGVhZFxuICAgKi9cbiAgX3JlbG9hZEFjdGlvbih1c2VGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fcmVsb2FkQWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGByZWxvYWRgIGluc3RlYWQnKTtcbiAgICB0aGlzLnJlbG9hZCh1c2VGaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZCB0aGUgZm9ybSBkYXRhXG4gICAqL1xuICByZWxvYWQodXNlRmlsdGVyOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBsZXQgZmlsdGVyID0ge307XG4gICAgaWYgKHVzZUZpbHRlcikge1xuICAgICAgZmlsdGVyID0gdGhpcy5nZXRDdXJyZW50S2V5c1ZhbHVlcygpO1xuICAgIH1cbiAgICB0aGlzLnF1ZXJ5RGF0YShmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byAnaW5zZXJ0JyBtb2RlXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZ29JbnNlcnRNb2RlKG9wdGlvbnM/OiBhbnkpYCBpbnN0ZWFkXG4gICAqL1xuICBfZ29JbnNlcnRNb2RlKG9wdGlvbnM/OiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2dvSW5zZXJ0TW9kZWAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgZ29JbnNlcnRNb2RlYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5nb0luc2VydE1vZGUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvICdpbnNlcnQnIG1vZGVcbiAgICovXG4gIGdvSW5zZXJ0TW9kZShvcHRpb25zPzogYW55KSB7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5nb0luc2VydE1vZGUob3B0aW9ucyk7XG4gIH1cblxuICBfY2xlYXJGb3JtQWZ0ZXJJbnNlcnQoKSB7XG4gICAgdGhpcy5jbGVhckRhdGEoKTtcbiAgICB0aGlzLl9zZXRDb21wb25lbnRzRWRpdGFibGUodHJ1ZSk7XG4gIH1cblxuICBfY2xlYXJBbmRDbG9zZUZvcm1BZnRlckluc2VydCgpIHtcbiAgICBjb25zdCBjbG9zZU9wdHM6IEZvcm1MYXlvdXRDbG9zZURldGFpbE9wdGlvbnMgPSB7IGV4aXRXaXRob3V0Q29uZmlybWF0aW9uOiB0cnVlIH07XG4gICAgdGhpcy5jbG9zZURldGFpbChjbG9zZU9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGluc2VydCBhY3Rpb24uXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgaW5zZXJ0KClgIGluc3RlYWRcbiAgICovXG4gIF9pbnNlcnRBY3Rpb24oKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9pbnNlcnRBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGluc2VydGAgaW5zdGVhZCcpO1xuICAgIHRoaXMuaW5zZXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgaW5zZXJ0IGFjdGlvbi5cbiAgICovXG4gIGluc2VydCgpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29udHJvbF0ubWFya0FzVG91Y2hlZCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFZhbGlkYXRpb25FcnJvckRpYWxvZ1RpdGxlKCksIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFZhbGlkYXRpb25FcnJvcigpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNWYWx1ZXNUb0luc2VydCgpO1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTtcbiAgICB0aGlzLm9uQmVmb3JlSW5zZXJ0LmVtaXQodmFsdWVzKTtcbiAgICB0aGlzLmluc2VydERhdGEodmFsdWVzLCBzcWxUeXBlcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgc2VsZi5wb3N0Q29ycmVjdEluc2VydChyZXNwKTtcbiAgICAgIHNlbGYuZm9ybUNhY2hlLnNldENhY2hlU25hcHNob3QoKTtcbiAgICAgIHNlbGYubWFya0Zvcm1MYXlvdXRNYW5hZ2VyVG9VcGRhdGUoKTtcbiAgICAgIGlmIChzZWxmLmFmdGVySW5zZXJ0TW9kZSA9PT0gJ2RldGFpbCcpIHtcbiAgICAgICAgc2VsZi5fc3RheUluUmVjb3JkQWZ0ZXJJbnNlcnQocmVzcCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuYWZ0ZXJJbnNlcnRNb2RlID09PSAnbmV3Jykge1xuICAgICAgICB0aGlzLl9jbGVhckZvcm1BZnRlckluc2VydCgpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmFmdGVySW5zZXJ0TW9kZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICB0aGlzLl9jbGVhckFuZENsb3NlRm9ybUFmdGVySW5zZXJ0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmNsb3NlRGV0YWlsKCk7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0SW5zZXJ0KGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gJ2VkaXQnIG1vZGVcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBnb0VkaXRNb2RlKClgIGluc3RlYWRcbiAgICovXG4gIF9nb0VkaXRNb2RlKCkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fZ29FZGl0TW9kZWAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgZ29FZGl0TW9kZWAgaW5zdGVhZCcpO1xuICAgIHRoaXMuZ29FZGl0TW9kZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byAnZWRpdCcgbW9kZVxuICAgKi9cbiAgZ29FZGl0TW9kZSgpIHtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdvRWRpdE1vZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyAnZWRpdCcgYWN0aW9uXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgdXBkYXRlKClgIGluc3RlYWRcbiAgICovXG4gIF9lZGl0QWN0aW9uKCkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fZWRpdEFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgdXBkYXRlYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyAnZWRpdCcgYWN0aW9uXG4gICAqL1xuICB1cGRhdGUoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goXG4gICAgICAoY29udHJvbCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tjb250cm9sXS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmICghdGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcmV0cmlldmluZyBrZXlzLi4uXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRLZXlzVmFsdWVzKCk7XG5cbiAgICAvLyByZXRyaWV2aW5nIHZhbHVlcyB0byB1cGRhdGUuLi5cbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNWYWx1ZXNUb1VwZGF0ZSgpO1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTtcblxuICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gTm90aGluZyB0byB1cGRhdGVcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnSU5GTycsIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldE5vdGhpbmdUb1VwZGF0ZU1lc3NhZ2UoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25CZWZvcmVVcGRhdGUuZW1pdCh2YWx1ZXMpO1xuICAgIC8vIGludm9rZSB1cGRhdGUgbWV0aG9kLi4uXG4gICAgdGhpcy51cGRhdGVEYXRhKGZpbHRlciwgdmFsdWVzLCBzcWxUeXBlcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgc2VsZi5wb3N0Q29ycmVjdFVwZGF0ZShyZXNwKTtcbiAgICAgIHNlbGYuZm9ybUNhY2hlLnNldENhY2hlU25hcHNob3QoKTtcbiAgICAgIHNlbGYubWFya0Zvcm1MYXlvdXRNYW5hZ2VyVG9VcGRhdGUoKTtcbiAgICAgIGlmIChzZWxmLnN0YXlJblJlY29yZEFmdGVyRWRpdCkge1xuICAgICAgICBzZWxmLnJlbG9hZCh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY2xvc2VEZXRhaWwoKTtcbiAgICAgIH1cbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICBzZWxmLnBvc3RJbmNvcnJlY3RVcGRhdGUoZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zICdkZWxldGUnIGFjdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGRlbGV0ZSgpYCBpbnN0ZWFkXG4gICAqL1xuICBfZGVsZXRlQWN0aW9uKCkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fZGVsZXRlQWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBkZWxldGVgIGluc3RlYWQnKTtcbiAgICByZXR1cm4gdGhpcy5kZWxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyAnZGVsZXRlJyBhY3Rpb25cbiAgICovXG4gIGRlbGV0ZSgpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEtleXNWYWx1ZXMoKTtcbiAgICB0aGlzLm9uQmVmb3JlRGVsZXRlLmVtaXQoZmlsdGVyKTtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVEYXRhKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdG8gbWFuYWdlIHRoZSBjYWxsIHRvIHRoZSBzZXJ2aWNlIGRhdGFcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKi9cbiAgcXVlcnlEYXRhKGZpbHRlcjogYW55KSB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLmRhdGFTZXJ2aWNlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdPRm9ybUNvbXBvbmVudDogbm8gc2VydmljZSBjb25maWd1cmVkISBhYm9ydGluZyBxdWVyeScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGZpbHRlcikgfHwgT2JqZWN0LmtleXMoZmlsdGVyKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybignT0Zvcm1Db21wb25lbnQ6IG5vIGZpbHRlciBjb25maWd1cmVkISBhYm9ydGluZyBxdWVyeScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvcm1DYWNoZS5yZXN0YXJ0Q2FjaGUoKTtcbiAgICB0aGlzLmNsZWFyQ29tcG9uZW50c09sZFZhbHVlKCk7XG4gICAgaWYgKHRoaXMucXVlcnlTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucXVlcnlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbiA9IHRoaXMubG9hZCgpO1xuICAgIGNvbnN0IGF2ID0gdGhpcy5nZXRBdHRyaWJ1dGVzVG9RdWVyeSgpO1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTtcbiAgICB0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhU2VydmljZVt0aGlzLnF1ZXJ5TWV0aG9kXShmaWx0ZXIsIGF2LCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICB0aGlzLnNldERhdGEocmVzcC5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVGb3JtRGF0YSh7fSk7XG4gICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdFUlJPUicsIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFF1ZXJ5RXJyb3JNZXNzYWdlKCkpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VSUk9SOiAnICsgcmVzcC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB0aGlzLl91cGRhdGVGb3JtRGF0YSh7fSk7XG4gICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbikpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbihlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVyciAmJiBlcnIuc3RhdHVzVGV4dCkge1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCBlcnIuc3RhdHVzVGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdFUlJPUicsIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFF1ZXJ5RXJyb3JNZXNzYWdlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNUb1F1ZXJ5KCk6IEFycmF5PGFueT4ge1xuICAgIGxldCBhdHRyaWJ1dGVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgLy8gYWRkIGZvcm0ga2V5cy4uLlxuICAgIGlmICh0aGlzLmtleXNBcnJheSAmJiB0aGlzLmtleXNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBhdHRyaWJ1dGVzLnB1c2goLi4udGhpcy5rZXlzQXJyYXkpO1xuICAgIH1cbiAgICBjb25zdCBjb21wb25lbnRzOiBhbnkgPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICAvLyBhZGQgb25seSB0aGUgZmllbGRzIGNvbnRhaW5lZCBpbnRvIHRoZSBmb3JtLi4uXG4gICAgT2JqZWN0LmtleXMoY29tcG9uZW50cykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChhdHRyaWJ1dGVzLmluZGV4T2YoaXRlbSkgPCAwICYmXG4gICAgICAgIGNvbXBvbmVudHNbaXRlbV0uaXNBdXRvbWF0aWNSZWdpc3RlcmluZygpICYmIGNvbXBvbmVudHNbaXRlbV0uaXNBdXRvbWF0aWNCaW5kaW5nKCkpIHtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWRkIGZpZWxkcyBzdG9yZWQgaW50byBmb3JtIGNhY2hlLi4uXG4gICAgY29uc3QgZGF0YUNhY2hlID0gdGhpcy5mb3JtQ2FjaGUuZ2V0RGF0YUNhY2hlKCk7XG4gICAgaWYgKGRhdGFDYWNoZSkge1xuICAgICAgT2JqZWN0LmtleXMoZGF0YUNhY2hlKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkICYmIGF0dHJpYnV0ZXMuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5jb25jYXQodGhpcy5jb2xzQXJyYXkuZmlsdGVyKGNvbCA9PiBhdHRyaWJ1dGVzLmluZGV4T2YoY29sKSA8IDApKTtcbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIG1hbmFnZSB0aGUgY2FsbCB0byB0aGUgaW5zZXJ0IHNlcnZpY2VcbiAgICogQHBhcmFtIHZhbHVlc1xuICAgKiBAcGFyYW0gW3NxbFR5cGVzXVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlPGFueT5cbiAgICovXG4gIGluc2VydERhdGEodmFsdWVzLCBzcWxUeXBlcz86IG9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbiA9IHRoaXMubG9hZCgpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlW3RoaXMuaW5zZXJ0TWV0aG9kXSh2YWx1ZXMsIHRoaXMuZW50aXR5LCBzcWxUeXBlcykuc3Vic2NyaWJlKFxuICAgICAgICByZXNwID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwLmRhdGEpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgZ2V0QXR0cmlidXRlc1ZhbHVlc1RvSW5zZXJ0KCk6IG9iamVjdCB7XG4gICAgY29uc3QgYXR0clZhbHVlcyA9IHt9O1xuICAgIGlmICh0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGF0dHJWYWx1ZXMsIHRoaXMuZm9ybVBhcmVudEtleXNWYWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhdHRyVmFsdWVzLCB0aGlzLmdldFJlZ2lzdGVyZWRGaWVsZHNWYWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgc3FsIHR5cGVzIGZyb20gdGhlIGZvcm0gY29tcG9uZW50cyBhbmQgdGhlIGZvcm0ga2V5c1xuICAgKi9cbiAgcHVibGljIGdldEF0dHJpYnV0ZXNTUUxUeXBlcygpOiBvYmplY3Qge1xuICAgIGNvbnN0IHR5cGVzOiBvYmplY3QgPSB7fTtcbiAgICAvLyBBZGQgZm9ybSBrZXlzIHNxbCB0eXBlc1xuICAgIHRoaXMua2V5c1NxbFR5cGVzQXJyYXkuZm9yRWFjaCgoa3N0LCBpKSA9PiB0eXBlc1t0aGlzLmtleXNBcnJheVtpXV0gPSBTUUxUeXBlcy5nZXRTUUxUeXBlVmFsdWUoa3N0KSk7XG4gICAgLy8gQWRkIGZvcm0gY29tcG9uZW50cyBzcWwgdHlwZXNcbiAgICBpZiAodGhpcy5fY29tcFNRTFR5cGVzICYmIE9iamVjdC5rZXlzKHRoaXMuX2NvbXBTUUxUeXBlcykubGVuZ3RoID4gMCkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0eXBlcywgdGhpcy5fY29tcFNRTFR5cGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVzO1xuICB9XG5cblxuICAvKipcbiAgICogQWxsb3cgdG8gbWFuYWdlIHRoZSBjYWxsIHRvIHRoZSB1cGRhdGUgc2VydmljZVxuICAgKiBAcGFyYW0gZmlsdGVyXG4gICAqIEBwYXJhbSB2YWx1ZXNcbiAgICogQHBhcmFtIFtzcWxUeXBlc11cbiAgICogQHJldHVybnMgIE9ic2VydmFibGU8YW55PlxuICAgKi9cbiAgdXBkYXRlRGF0YShmaWx0ZXIsIHZhbHVlcywgc3FsVHlwZXM/OiBvYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy5kYXRhU2VydmljZVt0aGlzLnVwZGF0ZU1ldGhvZF0oZmlsdGVyLCB2YWx1ZXMsIHRoaXMuZW50aXR5LCBzcWxUeXBlcykuc3Vic2NyaWJlKFxuICAgICAgICByZXNwID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwLmRhdGEpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgZ2V0QXR0cmlidXRlc1ZhbHVlc1RvVXBkYXRlKCk6IG9iamVjdCB7XG4gICAgY29uc3QgdmFsdWVzID0ge307XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgY2hhbmdlZEF0dHJzID0gdGhpcy5mb3JtQ2FjaGUuZ2V0Q2hhbmdlZEZvcm1Db250cm9sc0F0dHIoKTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZmlsdGVyKGNvbnRyb2xOYW1lID0+XG4gICAgICBzZWxmLmlnbm9yZUZvcm1DYWNoZUtleXMuaW5kZXhPZihjb250cm9sTmFtZSkgPT09IC0xICYmXG4gICAgICBjaGFuZ2VkQXR0cnMuaW5kZXhPZihjb250cm9sTmFtZSkgIT09IC0xXG4gICAgKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sID0gc2VsZi5mb3JtR3JvdXAuY29udHJvbHNbaXRlbV07XG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE9Gb3JtQ29udHJvbCkge1xuICAgICAgICB2YWx1ZXNbaXRlbV0gPSBjb250cm9sLmdldFZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXNbaXRlbV0gPSBjb250cm9sLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlc1tpdGVtXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlc1tpdGVtXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBtYW5hZ2UgdGhlIGNhbGwgdG8gdGhlIGRlbGV0ZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSBmaWx0ZXJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxhbnk+XG4gICAqL1xuICBkZWxldGVEYXRhKGZpbHRlcjogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgc3FsVHlwZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNTUUxUeXBlcygpO1xuICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICB0aGlzLmNhbkRpc2NhcmRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5kZWxldGVNZXRob2RdKGZpbHRlciwgdGhpcy5lbnRpdHksIHNxbFR5cGVzKS5zdWJzY3JpYmUoXG4gICAgICAgIHJlc3AgPT4ge1xuICAgICAgICAgIGlmIChyZXNwLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgICBzZWxmLmZvcm1DYWNoZS5zZXRDYWNoZVNuYXBzaG90KCk7XG4gICAgICAgICAgICBzZWxmLm1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk7XG4gICAgICAgICAgICBzZWxmLnBvc3RDb3JyZWN0RGVsZXRlKHJlc3ApO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwLmRhdGEpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0RGVsZXRlKHJlc3ApO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICBzZWxmLnBvc3RJbmNvcnJlY3REZWxldGUoZXJyKTtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgdG9KU09ORGF0YShkYXRhKSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0ge307XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlRGF0YSA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHZhbHVlRGF0YVtpdGVtXSA9IGRhdGFbaXRlbV0udmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlRGF0YTtcbiAgfVxuXG4gIHRvRm9ybVZhbHVlRGF0YShkYXRhKSB7XG4gICAgaWYgKGRhdGEgJiYgVXRpbC5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCB2YWx1ZURhdGE6IEFycmF5PG9iamVjdD4gPSBbXTtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICB2YWx1ZURhdGEucHVzaChzZWxmLm9iamVjdFRvRm9ybVZhbHVlRGF0YShpdGVtKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZURhdGE7XG4gICAgfSBlbHNlIGlmIChkYXRhICYmIFV0aWwuaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9iamVjdFRvRm9ybVZhbHVlRGF0YShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGtleXMgdmFsdWVzXG4gICAqIEByZXR1cm5zIGtleXNcbiAgICovXG4gIGdldEtleXNWYWx1ZXMoKTogYW55IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7fTtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gdGhpcy5mb3JtRGF0YTtcbiAgICBpZiAoIXRoaXMua2V5c0FycmF5KSB7XG4gICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cbiAgICB0aGlzLmtleXNBcnJheS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoY3VycmVudFJlY29yZFtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGN1cnJlbnREYXRhID0gY3VycmVudFJlY29yZFtrZXldO1xuICAgICAgICBpZiAoY3VycmVudERhdGEgaW5zdGFuY2VvZiBPRm9ybVZhbHVlKSB7XG4gICAgICAgICAgY3VycmVudERhdGEgPSBjdXJyZW50RGF0YS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaWx0ZXJba2V5XSA9IGN1cnJlbnREYXRhO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBpc0luUXVlcnlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5RVUVSWTtcbiAgfVxuXG4gIGlzSW5JbnNlcnRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTlNFUlQ7XG4gIH1cblxuICBpc0luVXBkYXRlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuVVBEQVRFO1xuICB9XG5cbiAgaXNJbkluaXRpYWxNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMO1xuICB9XG5cbiAgc2V0UXVlcnlNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLlFVRVJZKTtcbiAgfVxuXG4gIHNldEluc2VydE1vZGUoKSB7XG4gICAgdGhpcy5zZXRGb3JtTW9kZShPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5TRVJUKTtcbiAgfVxuXG4gIHNldFVwZGF0ZU1vZGUoKSB7XG4gICAgdGhpcy5zZXRGb3JtTW9kZShPRm9ybUNvbXBvbmVudC5Nb2RlKCkuVVBEQVRFKTtcbiAgfVxuXG4gIHNldEluaXRpYWxNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUwpO1xuICB9XG5cbiAgcmVnaXN0ZXJEeW5hbWljRm9ybUNvbXBvbmVudChkeW5hbWljRm9ybSkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQoZHluYW1pY0Zvcm0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZHluYW1pY0Zvcm1TdWJzY3JpcHRpb24gPSBkeW5hbWljRm9ybS5yZW5kZXIuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHNlbGYucmVmcmVzaENvbXBvbmVudHNFZGl0YWJsZVN0YXRlKCk7XG4gICAgICAgIGlmICghc2VsZi5pc0luSW5zZXJ0TW9kZSgpICYmIHNlbGYucXVlcnlPbkluaXQpIHtcbiAgICAgICAgICBzZWxmLnJlbG9hZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5mb3JtUGFyZW50S2V5c1ZhbHVlcykge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuZm9ybVBhcmVudEtleXNWYWx1ZXMpLmZvckVhY2gocGFyZW50S2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc2VsZi5mb3JtUGFyZW50S2V5c1ZhbHVlc1twYXJlbnRLZXldO1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IHNlbGYuZ2V0RmllbGRSZWZlcmVuY2UocGFyZW50S2V5KTtcbiAgICAgICAgICAgIGlmIChVdGlsLmlzRm9ybURhdGFDb21wb25lbnQoY29tcCkgJiYgY29tcC5pc0F1dG9tYXRpY0JpbmRpbmcoKSkge1xuICAgICAgICAgICAgICBjb21wLnNldFZhbHVlKHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1bnJlZ2lzdGVyRHluYW1pY0Zvcm1Db21wb25lbnQoZHluYW1pY0Zvcm0pIHtcbiAgICBpZiAoZHluYW1pY0Zvcm0gJiYgdGhpcy5keW5hbWljRm9ybVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5keW5hbWljRm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlcXVpcmVkQ29tcG9uZW50cygpOiBvYmplY3Qge1xuICAgIGNvbnN0IHJlcXVpcmVkQ29tcG9udGVudHM6IG9iamVjdCA9IHt9O1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50cykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBjb21wID0gY29tcG9uZW50c1trZXldO1xuICAgICAgICBjb25zdCBhdHRyID0gY29tcC5nZXRBdHRyaWJ1dGUoKTtcbiAgICAgICAgaWYgKChjb21wIGFzIGFueSkuaXNSZXF1aXJlZCAmJiBhdHRyICYmIGF0dHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlcXVpcmVkQ29tcG9udGVudHNbYXR0cl0gPSBjb21wO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVpcmVkQ29tcG9udGVudHM7XG4gIH1cblxuICBnZXQgbGF5b3V0RGlyZWN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dERpcmVjdGlvbjtcbiAgfVxuXG4gIHNldCBsYXlvdXREaXJlY3Rpb24odmFsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJzZWRWYWwgPSAodmFsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuX2xheW91dERpcmVjdGlvbiA9IFsncm93JywgJ2NvbHVtbicsICdyb3ctcmV2ZXJzZScsICdjb2x1bW4tcmV2ZXJzZSddLmluZGV4T2YocGFyc2VkVmFsKSAhPT0gLTEgPyBwYXJzZWRWYWwgOiBPRm9ybUNvbXBvbmVudC5ERUZBVUxUX0xBWU9VVF9ESVJFQ1RJT047XG4gIH1cblxuICBnZXQgbGF5b3V0QWxpZ24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0QWxpZ247XG4gIH1cblxuICBzZXQgbGF5b3V0QWxpZ24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sYXlvdXRBbGlnbiA9IHZhbDtcbiAgfVxuXG4gIGdldCBzaG93RmxvYXRpbmdUb29sYmFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dIZWFkZXIgJiYgdGhpcy5oZWFkZXJNb2RlID09PSAnZmxvYXRpbmcnO1xuICB9XG5cbiAgZ2V0IHNob3dOb3RGbG9hdGluZ1Rvb2xiYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0hlYWRlciAmJiB0aGlzLmhlYWRlck1vZGUgIT09ICdmbG9hdGluZyc7XG4gIH1cblxuICBpc0VkaXRhYmxlRGV0YWlsKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlRGV0YWlsO1xuICB9XG5cbiAgaXNJbml0aWFsU3RhdGVDaGFuZ2VkKGlnbm9yZUF0dHJzOiBzdHJpbmdbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNhY2hlLmlzSW5pdGlhbFN0YXRlQ2hhbmdlZChpZ25vcmVBdHRycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGB1bmRvKClgIGluc3RlYWRcbiAgICovXG4gIF91bmRvTGFzdENoYW5nZUFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX3VuZG9MYXN0Q2hhbmdlQWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGB1bmRvYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy51bmRvKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5kbyBsYXN0IGNoYW5nZVxuICAgKi9cbiAgdW5kbygpIHtcbiAgICB0aGlzLmZvcm1DYWNoZS51bmRvTGFzdENoYW5nZSgpO1xuICB9XG5cbiAgZ2V0IGlzQ2FjaGVTdGFja0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1DYWNoZS5pc0NhY2hlU3RhY2tFbXB0eTtcbiAgfVxuXG4gIHVuZG9LZXlib2FyZFByZXNzZWQoKSB7XG4gICAgdGhpcy5mb3JtQ2FjaGUudW5kb0xhc3RDaGFuZ2UoKTtcbiAgfVxuXG4gIGdldEZvcm1Ub29sYmFyKCk6IE9Gb3JtVG9vbGJhckJhc2Uge1xuICAgIHJldHVybiB0aGlzLl9mb3JtVG9vbGJhcjtcbiAgfVxuXG4gIGdldEZvcm1NYW5hZ2VyKCk6IE9Gb3JtTGF5b3V0TWFuYWdlckJhc2Uge1xuICAgIHJldHVybiB0aGlzLmZvcm1OYXZpZ2F0aW9uLmZvcm1MYXlvdXRNYW5hZ2VyO1xuICB9XG5cbiAgZ2V0Rm9ybU5hdmlnYXRpb24oKTogT0Zvcm1OYXZpZ2F0aW9uQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmZvcm1OYXZpZ2F0aW9uO1xuICB9XG5cbiAgZ2V0Rm9ybUNhY2hlKCk6IE9Gb3JtQ2FjaGVDbGFzcyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNhY2hlO1xuICB9XG5cbiAgZ2V0VXJsUGFyYW0oYXJnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtTmF2aWdhdGlvbigpLmdldFVybFBhcmFtcygpW2FyZ107XG4gIH1cblxuICBnZXRVcmxQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybU5hdmlnYXRpb24oKS5nZXRVcmxQYXJhbXMoKTtcbiAgfVxuXG4gIHNldFVybFBhcmFtc0FuZFJlbG9hZCh2YWw6IG9iamVjdCkge1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc2V0VXJsUGFyYW1zKHZhbCk7XG4gICAgdGhpcy5yZWxvYWQodHJ1ZSk7XG4gIH1cblxuICBnZXRSZWdpc3RlcmVkRmllbGRzVmFsdWVzKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgIGNvbnN0IGNvbXBvbmVudHM6IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBjb21wb25lbnRzS2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZpbHRlcihrZXkgPT4gc2VsZi5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICAgIGNvbXBvbmVudHNLZXlzLmZvckVhY2goY29tcEtleSA9PiB7XG4gICAgICBjb25zdCBjb21wOiBJRm9ybURhdGFDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBLZXldO1xuICAgICAgdmFsdWVzW2NvbXBLZXldID0gY29tcC5nZXRWYWx1ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250cm9sIGluIHRoZSBmb3JtXG4gICAqIEBwYXJhbSBhdHRyIHRoZSBhdHRyIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqL1xuICBnZXRGaWVsZFZhbHVlKGF0dHI6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICBjb25zdCBjb21wID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZShhdHRyKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgdmFsdWUgPSBjb21wLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggdGhlIHZhbHVlcyBvZiBlYWNoIGF0dHJpYnV0ZVxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHIncyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICovXG4gIGdldEZpZWxkVmFsdWVzKGF0dHJzOiBzdHJpbmdbXSk6IGFueSB7XG4gICAgY29uc3QgYXJyID0ge307XG4gICAgYXR0cnMuZm9yRWFjaChrZXkgPT4gYXJyW2tleV0gPSB0aGlzLmdldEZpZWxkVmFsdWUoa2V5KSk7XG4gICAgcmV0dXJuIGFycjtcblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGluIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gYXR0ciBhdHRyaWJ1dGUgb2YgY29udHJvbFxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWVcbiAgICovXG4gIHNldEZpZWxkVmFsdWUoYXR0cjogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zPzogRm9ybVZhbHVlT3B0aW9ucykge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlKGF0dHIpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICBjb21wLnNldFZhbHVlKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgZWFjaCBjb250cm9sIGluIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXNcbiAgICovXG4gIHNldEZpZWxkVmFsdWVzKHZhbHVlczogYW55LCBvcHRpb25zPzogRm9ybVZhbHVlT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShrZXksIHZhbHVlc1trZXldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIHZhbHVlIG9mIGVhY2ggY29udHJvbCBpbiB0aGUgZm9ybVxuICAgKiBAcGFyYW0gYXR0ciB0aGUgYXR0ciBvZiB0aGUgZm9ybSBmaWVsZFxuICAgKi9cbiAgY2xlYXJGaWVsZFZhbHVlKGF0dHI6IHN0cmluZywgb3B0aW9ucz86IEZvcm1WYWx1ZU9wdGlvbnMpIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZShhdHRyKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29tcC5jbGVhclZhbHVlKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdmFsdWUgb2YgZWFjaCBjb250cm9sIGluIHRoZSBmb3JtXG4gICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cidzIG9mIHRoZSBmb3JtIGZpZWxkc1xuICAgKi9cbiAgY2xlYXJGaWVsZFZhbHVlcyhhdHRyczogc3RyaW5nW10sIG9wdGlvbnM/OiBGb3JtVmFsdWVPcHRpb25zKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgYXR0cnMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBzZWxmLmNsZWFyRmllbGRWYWx1ZShrZXksIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjb250cm9sIGluIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gYXR0ciB0aGUgYXR0ciBvZiB0aGUgZm9ybSBmaWVsZFxuICAgKi9cbiAgZ2V0RmllbGRSZWZlcmVuY2UoYXR0cjogc3RyaW5nKTogSUZvcm1EYXRhQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50c1thdHRyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSBvZiBlYWNoIGNvbnRyb2wgaW4gdGhlIGZvcm1cbiAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyJ3Mgb2YgdGhlIGZvcm0gZmlsZWRzXG4gICAqL1xuICBnZXRGaWVsZFJlZmVyZW5jZXMoYXR0cnM6IHN0cmluZ1tdKTogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCB7XG4gICAgY29uc3QgYXJyOiBJRm9ybURhdGFDb21wb25lbnRIYXNoID0ge307XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgYXR0cnMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBhcnJba2V5XSA9IHNlbGYuZ2V0RmllbGRSZWZlcmVuY2Uoa2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgZ2V0Rm9ybUNvbXBvbmVudFBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgbGV0IHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnM7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucGVybWlzc2lvbnMpKSB7XG4gICAgICBwZXJtaXNzaW9ucyA9ICh0aGlzLnBlcm1pc3Npb25zLmNvbXBvbmVudHMgfHwgW10pLmZpbmQoY29tcCA9PiBjb21wLmF0dHIgPT09IGF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cblxuICBnZXRBY3Rpb25zUGVybWlzc2lvbnMoKTogT1Blcm1pc3Npb25zW10ge1xuICAgIGxldCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zW107XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucGVybWlzc2lvbnMpKSB7XG4gICAgICBwZXJtaXNzaW9ucyA9ICh0aGlzLnBlcm1pc3Npb25zLmFjdGlvbnMgfHwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGV0ZXJtaW5hdGVGb3JtTW9kZSgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmxTZWdtZW50cyA9IHRoaXMuZm9ybU5hdmlnYXRpb24uZ2V0VXJsU2VnbWVudHMoKTtcbiAgICBpZiAodXJsU2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VnbWVudCA9IHVybFNlZ21lbnRzW3VybFNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5kZXRlcm1pbmF0ZU1vZGVGcm9tVXJsU2VnbWVudChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0Um91dGUucGFyZW50KSB7XG4gICAgICB0aGlzLmFjdFJvdXRlLnBhcmVudC51cmwuc3Vic2NyaWJlKHNlZ21lbnRzID0+IHtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICB0aGlzLmRldGVybWluYXRlTW9kZUZyb21VcmxTZWdtZW50KHNlZ21lbnQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUwpO1xuICAgIH1cbiAgICAvLyBzdGF5SW5SZWNvcmRBZnRlckVkaXQgaXMgdHJ1ZSBpZiBmb3JtIGhhcyBlZGl0YWJsZSBkZXRhaWwgPSB0cnVlXG4gICAgdGhpcy5zdGF5SW5SZWNvcmRBZnRlckVkaXQgPSB0aGlzLnN0YXlJblJlY29yZEFmdGVyRWRpdCB8fCB0aGlzLmlzRWRpdGFibGVEZXRhaWwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlcm1pbmF0ZU1vZGVGcm9tVXJsU2VnbWVudChzZWdtZW50OiBVcmxTZWdtZW50KTogdm9pZCB7XG4gICAgY29uc3QgX3BhdGggPSBzZWdtZW50ID8gc2VnbWVudC5wYXRoIDogJyc7XG4gICAgaWYgKHRoaXMuaXNJbnNlcnRNb2RlUGF0aChfcGF0aCkpIHtcbiAgICAgIHRoaXMuc2V0SW5zZXJ0TW9kZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1VwZGF0ZU1vZGVQYXRoKF9wYXRoKSkge1xuICAgICAgdGhpcy5zZXRVcGRhdGVNb2RlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0SW5pdGlhbE1vZGUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3VwZGF0ZUZvcm1EYXRhKG5ld0Zvcm1EYXRhOiBvYmplY3QpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuZm9ybURhdGEgPSBuZXdGb3JtRGF0YTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wID0gY29tcG9uZW50c1trZXldO1xuICAgICAgICAgIGlmIChVdGlsLmlzRm9ybURhdGFDb21wb25lbnQoY29tcCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChjb21wLmlzQXV0b21hdGljQmluZGluZygpKSB7XG4gICAgICAgICAgICAgICAgY29tcC5kYXRhID0gc2VsZi5nZXREYXRhVmFsdWUoa2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5pbml0aWFsaXplRmllbGRzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZUZpZWxkcygpOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChjb250cm9sID0+IHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xdLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtQ2FjaGUucmVnaXN0ZXJDYWNoZSgpO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24udXBkYXRlTmF2aWdhdGlvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyQ29tcG9uZW50c09sZFZhbHVlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudHM6IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBjb21wb25lbnRzS2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZpbHRlcihrZXkgPT4gc2VsZi5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICAgIGNvbXBvbmVudHNLZXlzLmZvckVhY2goY29tcEtleSA9PiB7XG4gICAgICBjb25zdCBjb21wOiBJRm9ybURhdGFDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBLZXldO1xuICAgICAgKGNvbXAgYXMgYW55KS5vbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbXAuZ2V0Rm9ybUNvbnRyb2woKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RDb3JyZWN0SW5zZXJ0KHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbih0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRJbnNlcnRTdWNjZXNzTWVzc2FnZSgpLCB7IGljb246ICdjaGVja19jaXJjbGUnIH0pO1xuICAgIHRoaXMub25JbnNlcnQuZW1pdChyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RJbmNvcnJlY3RJbnNlcnQocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dFcnJvcignaW5zZXJ0JywgcmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0SW5jb3JyZWN0RGVsZXRlKHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RXJyb3IoJ2RlbGV0ZScsIHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdEluY29ycmVjdFVwZGF0ZShyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0Vycm9yKCd1cGRhdGUnLCByZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RDb3JyZWN0VXBkYXRlKHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbih0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRVcGRhdGVTdWNjZXNzTWVzc2FnZSgpLCB7IGljb246ICdjaGVja19jaXJjbGUnIH0pO1xuICAgIHRoaXMub25VcGRhdGUuZW1pdChyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RDb3JyZWN0RGVsZXRlKHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbih0aGlzLl9tZXNzYWdlU2VydmljZS5nZXREZWxldGVTdWNjZXNzTWVzc2FnZSgpLCB7IGljb246ICdjaGVja19jaXJjbGUnIH0pO1xuICAgIHRoaXMub25EZWxldGUuZW1pdChyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1MYXlvdXRNYW5hZ2VyID0gdGhpcy5nZXRGb3JtTWFuYWdlcigpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChmb3JtTGF5b3V0TWFuYWdlcikpIHtcbiAgICAgIGZvcm1MYXlvdXRNYW5hZ2VyLm1hcmtGb3JVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvYmplY3RUb0Zvcm1WYWx1ZURhdGEoZGF0YTogb2JqZWN0ID0ge30pOiBvYmplY3Qge1xuICAgIGNvbnN0IHZhbHVlRGF0YSA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHZhbHVlRGF0YVtpdGVtXSA9IG5ldyBPRm9ybVZhbHVlKGRhdGFbaXRlbV0pO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZURhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q3VycmVudEtleXNWYWx1ZXMoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbi5nZXRDdXJyZW50S2V5c1ZhbHVlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hDb21wb25lbnRzRWRpdGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDpcbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRoaXMuaXNFZGl0YWJsZURldGFpbCgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTlNFUlQ6XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5VUERBVEU6XG4gICAgICAgIHRoaXMuX3NldENvbXBvbmVudHNFZGl0YWJsZSh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJbnNlcnRNb2RlUGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYXZEYXRhOiBPTmF2aWdhdGlvbkl0ZW0gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldExhc3RJdGVtKCk7XG4gICAgLy8gVE9ETzogc29sdmUgaXNzdWUgIzcyNyB3aGVuIGBpbnNlcnQtZm9ybS1yb3V0ZWAgaXMgcHJlc2VudFxuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChuYXZEYXRhKSA/IHBhdGggPT09IG5hdkRhdGEuZ2V0SW5zZXJ0Rm9ybVJvdXRlKCkgOiBDb2Rlcy5ERUZBVUxUX0lOU0VSVF9ST1VURSA9PT0gcGF0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1VwZGF0ZU1vZGVQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5hdkRhdGE6IE9OYXZpZ2F0aW9uSXRlbSA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0UHJldmlvdXNSb3V0ZURhdGEoKTtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQobmF2RGF0YSkgJiYgcGF0aCA9PT0gbmF2RGF0YS5nZXRFZGl0Rm9ybVJvdXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dFcnJvcihvcGVyYXRpb246IHN0cmluZywgcmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgcmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1lc3NhZ2UgPSAnJ1xuICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSAndXBkYXRlJzpcbiAgICAgICAgICBtZXNzYWdlID0gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0VXBkYXRlRXJyb3JNZXNzYWdlKClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaW5zZXJ0JzpcbiAgICAgICAgICBtZXNzYWdlID0gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0SW5zZXJ0RXJyb3JNZXNzYWdlKClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICBtZXNzYWdlID0gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0RGVsZXRlRXJyb3JNZXNzYWdlKClcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxufVxuIiwiPG5nLXRlbXBsYXRlICNjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnM+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIltvLWZvcm0tdG9vbGJhci1idXR0b25zXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxvLWZvcm0tdG9vbGJhciAqbmdJZj1cInNob3dGbG9hdGluZ1Rvb2xiYXIgJiYgaGVhZGVyUG9zaXRpb249PT0ndG9wJ1wiIFtsYWJlbC1oZWFkZXJdPVwibGFiZWxoZWFkZXJcIiBbbGFiZWwtaGVhZGVyLWFsaWduXT1cImxhYmVsSGVhZGVyQWxpZ25cIlxuICBbaGVhZGVyLWFjdGlvbnNdPVwiaGVhZGVyYWN0aW9uc1wiIFtzaG93LWhlYWRlci1uYXZpZ2F0aW9uXT1cInNob3dIZWFkZXJOYXZpZ2F0aW9uXCIgW3Nob3ctaGVhZGVyLWFjdGlvbnMtdGV4dF09XCJzaG93SGVhZGVyQWN0aW9uc1RleHRcIlxuICAob25DYW5jZWwpPVwib25DYW5jZWwuZW1pdCgkZXZlbnQpXCIgbGF5b3V0LXBhZGRpbmc+XG4gIDxkaXYgby1jdXN0b20tZm9ybS10b29sYmFyLWJ1dHRvbnMtd3JhcHBlciBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUZvcm1Ub29sYmFyQnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvby1mb3JtLXRvb2xiYXI+XG5cbjxuZy1ob3N0IG9LZXlib2FyZExpc3RlbmVyIGtleWJvYXJkS2V5cz1cIjE3OzkwXCIgKG9uS2V5c1ByZXNzZWQpPVwidW5kb0tleWJvYXJkUHJlc3NlZCgpXCIgY2xhc3M9XCJzY3JvbGxpbmcgby1zY3JvbGxcIj5cbiAgPGRpdiBmeEZsZXg9XCJncm93XCI+XG4gICAgPG8tZm9ybS10b29sYmFyICpuZ0lmPVwic2hvd05vdEZsb2F0aW5nVG9vbGJhciAmJiBoZWFkZXJQb3NpdGlvbj09PSd0b3AnXCIgW2xhYmVsLWhlYWRlcl09XCJsYWJlbGhlYWRlclwiIFtsYWJlbC1oZWFkZXItYWxpZ25dPVwibGFiZWxIZWFkZXJBbGlnblwiXG4gICAgICBbaGVhZGVyLWFjdGlvbnNdPVwiaGVhZGVyYWN0aW9uc1wiIFtzaG93LWhlYWRlci1uYXZpZ2F0aW9uXT1cInNob3dIZWFkZXJOYXZpZ2F0aW9uXCIgW3Nob3ctaGVhZGVyLWFjdGlvbnMtdGV4dF09XCJzaG93SGVhZGVyQWN0aW9uc1RleHRcIlxuICAgICAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiIGxheW91dC1wYWRkaW5nPlxuICAgICAgPGRpdiBvLWN1c3RvbS1mb3JtLXRvb2xiYXItYnV0dG9ucy13cmFwcGVyIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICAgICAgPGRpdiBvLWN1c3RvbS1mb3JtLXRvb2xiYXItYnV0dG9ucy13cmFwcGVyIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tRm9ybVRvb2xiYXJCdXR0b25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9vLWZvcm0tdG9vbGJhcj5cblxuICAgIDxmb3JtICNpbm5lckZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiBjbGFzcz1cImlubmVyLWZvcm1cIiBbY2xhc3MuZm9ybS1uby10b29sYmFyXT1cIiFzaG93SGVhZGVyXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXV0b2NvcnJlY3Q9XCJvZmZcIlxuICAgICAgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nIHwgYXN5bmNcIiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgbGF5b3V0LXBhZGRpbmcgW2Z4TGF5b3V0XT1cImxheW91dERpcmVjdGlvblwiIFtmeExheW91dEFsaWduXT1cImxheW91dEFsaWduXCIgY2xhc3M9XCJvLWZvcm0tY29udGVudC13cmFwcGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cblxuICAgIDxvLWZvcm0tdG9vbGJhciAqbmdJZj1cInNob3dOb3RGbG9hdGluZ1Rvb2xiYXIgJiYgaGVhZGVyUG9zaXRpb249PT0nYm90dG9tJ1wiIFtsYWJlbC1oZWFkZXJdPVwibGFiZWxoZWFkZXJcIiBbbGFiZWwtaGVhZGVyLWFsaWduXT1cImxhYmVsSGVhZGVyQWxpZ25cIlxuICAgICAgW2hlYWRlci1hY3Rpb25zXT1cImhlYWRlcmFjdGlvbnNcIiBbc2hvdy1oZWFkZXItbmF2aWdhdGlvbl09XCJzaG93SGVhZGVyTmF2aWdhdGlvblwiIFtzaG93LWhlYWRlci1hY3Rpb25zLXRleHRdPVwic2hvd0hlYWRlckFjdGlvbnNUZXh0XCJcbiAgICAgIChvbkNhbmNlbCk9XCJvbkNhbmNlbC5lbWl0KCRldmVudClcIiBsYXlvdXQtcGFkZGluZz5cbiAgICAgIDxkaXYgby1jdXN0b20tZm9ybS10b29sYmFyLWJ1dHRvbnMtd3JhcHBlciBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvby1mb3JtLXRvb2xiYXI+XG4gIDwvZGl2PlxuPC9uZy1ob3N0PlxuXG48by1mb3JtLXRvb2xiYXIgKm5nSWY9XCJzaG93RmxvYXRpbmdUb29sYmFyICYmIGhlYWRlclBvc2l0aW9uPT09J2JvdHRvbSdcIiBbbGFiZWwtaGVhZGVyXT1cImxhYmVsaGVhZGVyXCIgW2xhYmVsLWhlYWRlci1hbGlnbl09XCJsYWJlbEhlYWRlckFsaWduXCJcbiAgW2hlYWRlci1hY3Rpb25zXT1cImhlYWRlcmFjdGlvbnNcIiBbc2hvdy1oZWFkZXItbmF2aWdhdGlvbl09XCJzaG93SGVhZGVyTmF2aWdhdGlvblwiIFtzaG93LWhlYWRlci1hY3Rpb25zLXRleHRdPVwic2hvd0hlYWRlckFjdGlvbnNUZXh0XCJcbiAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiIGxheW91dC1wYWRkaW5nPlxuICA8ZGl2IG8tY3VzdG9tLWZvcm0tdG9vbGJhci1idXR0b25zLXdyYXBwZXIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L28tZm9ybS10b29sYmFyPlxuIl19