@bnsights/bbsf-controls 1.0.193 → 1.0.194-beta.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 (111) hide show
  1. package/README.md +331 -0
  2. package/esm2022/lib/Shared/Components/app-base-component.mjs +3 -3
  3. package/esm2022/lib/Shared/Components/ng-tag-input.mjs +12 -7
  4. package/esm2022/lib/Shared/Directives/appPreventDoubleClick.directive.mjs +3 -2
  5. package/esm2022/lib/Shared/Directives/template-name.directive.mjs +4 -3
  6. package/esm2022/lib/Shared/Models/DatePickerOptions.mjs +4 -4
  7. package/esm2022/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +4 -3
  8. package/esm2022/lib/Shared/Pipes/bbsf-date.pipe.mjs +4 -3
  9. package/esm2022/lib/Shared/default_intl.mjs +2 -2
  10. package/esm2022/lib/Shared/services/ControlUtility.mjs +2 -2
  11. package/esm2022/lib/Shared/services/file-upload.service.mjs +3 -3
  12. package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +2 -2
  13. package/esm2022/lib/Shared/utils/date-formatter.mjs +48 -0
  14. package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +24 -16
  15. package/esm2022/lib/controls/Calendar/Calendar.component.mjs +19 -12
  16. package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +14 -10
  17. package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +8 -5
  18. package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +21 -14
  19. package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +12 -6
  20. package/esm2022/lib/controls/FileUpload/FileUpload.component.mjs +15 -7
  21. package/esm2022/lib/controls/Form/Form.component.mjs +22 -6
  22. package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +14 -9
  23. package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +17 -9
  24. package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +22 -13
  25. package/esm2022/lib/controls/MarkdownEditor/markdown-editor.component.mjs +16 -8
  26. package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +14 -9
  27. package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +12 -7
  28. package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +18 -12
  29. package/esm2022/lib/controls/Paging/JwPagination.component.mjs +8 -4
  30. package/esm2022/lib/controls/Paging/Paging.component.mjs +25 -12
  31. package/esm2022/lib/controls/Phone/Phone.component.mjs +14 -9
  32. package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +17 -9
  33. package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +10 -6
  34. package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +13 -14
  35. package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +13 -7
  36. package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +6 -4
  37. package/esm2022/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +5 -4
  38. package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +13 -7
  39. package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +19 -14
  40. package/esm2022/lib/controls/TextArea/TextArea.component.mjs +20 -12
  41. package/esm2022/lib/controls/TextBox/TextBox.component.mjs +16 -10
  42. package/esm2022/lib/controls/Toggleslide/Toggleslide.component.mjs +13 -7
  43. package/esm2022/lib/controls/bbsf-controls.module.mjs +70 -333
  44. package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +15 -11
  45. package/esm2022/lib/modules/bbsf-core.module.mjs +210 -0
  46. package/esm2022/lib/modules/bbsf-datetime.module.mjs +90 -0
  47. package/esm2022/lib/modules/bbsf-dropdown.module.mjs +57 -0
  48. package/esm2022/lib/modules/bbsf-editors.module.mjs +97 -0
  49. package/esm2022/lib/modules/bbsf-forms-basic.module.mjs +79 -0
  50. package/esm2022/lib/modules/bbsf-multilingual.module.mjs +60 -0
  51. package/esm2022/lib/modules/bbsf-phone.module.mjs +57 -0
  52. package/esm2022/lib/modules/bbsf-specialized.module.mjs +160 -0
  53. package/esm2022/lib/modules/bbsf-uploads.module.mjs +106 -0
  54. package/esm2022/lib/modules/bbsf-utility.module.mjs +103 -0
  55. package/esm2022/public-api.mjs +38 -2
  56. package/fesm2022/bnsights-bbsf-controls.mjs +8673 -7750
  57. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -1
  58. package/lib/Shared/Components/app-base-component.d.ts +2 -2
  59. package/lib/Shared/Components/ng-tag-input.d.ts +2 -3
  60. package/lib/Shared/Directives/appPreventDoubleClick.directive.d.ts +1 -1
  61. package/lib/Shared/Directives/template-name.directive.d.ts +1 -1
  62. package/lib/Shared/Pipes/bbsf-date-time.pipe.d.ts +1 -1
  63. package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +1 -1
  64. package/lib/Shared/default_intl.d.ts +1 -1
  65. package/lib/Shared/services/ControlUtility.d.ts +1 -1
  66. package/lib/Shared/services/file-upload.service.d.ts +1 -1
  67. package/lib/Shared/services/validationErrorMassage.service.d.ts +1 -1
  68. package/lib/Shared/utils/date-formatter.d.ts +23 -0
  69. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +5 -4
  70. package/lib/controls/Calendar/Calendar.component.d.ts +5 -4
  71. package/lib/controls/CheckBox/CheckBox.component.d.ts +3 -2
  72. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +2 -2
  73. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +3 -3
  74. package/lib/controls/DropdownList/DropdownList.component.d.ts +2 -2
  75. package/lib/controls/FileUpload/FileUpload.component.d.ts +3 -4
  76. package/lib/controls/Form/Form.component.d.ts +2 -2
  77. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +3 -3
  78. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +4 -4
  79. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +5 -4
  80. package/lib/controls/MarkdownEditor/markdown-editor.component.d.ts +2 -2
  81. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +3 -3
  82. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +2 -2
  83. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +3 -2
  84. package/lib/controls/Paging/JwPagination.component.d.ts +1 -1
  85. package/lib/controls/Paging/Paging.component.d.ts +5 -4
  86. package/lib/controls/Phone/Phone.component.d.ts +2 -2
  87. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +3 -3
  88. package/lib/controls/RadioButton/RadioButton.component.d.ts +2 -2
  89. package/lib/controls/Recaptcha/Recaptcha.component.d.ts +3 -2
  90. package/lib/controls/Repeater/repeater/repeater.component.d.ts +1 -1
  91. package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +1 -1
  92. package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +1 -1
  93. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +2 -2
  94. package/lib/controls/TagsInput/TagsInput.component.d.ts +5 -4
  95. package/lib/controls/TextArea/TextArea.component.d.ts +3 -2
  96. package/lib/controls/TextBox/TextBox.component.d.ts +2 -2
  97. package/lib/controls/Toggleslide/Toggleslide.component.d.ts +2 -2
  98. package/lib/controls/bbsf-controls.module.d.ts +35 -66
  99. package/lib/controls/page-header-component/page-header-component.component.d.ts +2 -2
  100. package/lib/modules/bbsf-core.module.d.ts +90 -0
  101. package/lib/modules/bbsf-datetime.module.d.ts +41 -0
  102. package/lib/modules/bbsf-dropdown.module.d.ts +33 -0
  103. package/lib/modules/bbsf-editors.module.d.ts +47 -0
  104. package/lib/modules/bbsf-forms-basic.module.d.ts +35 -0
  105. package/lib/modules/bbsf-multilingual.module.d.ts +31 -0
  106. package/lib/modules/bbsf-phone.module.d.ts +33 -0
  107. package/lib/modules/bbsf-specialized.module.d.ts +63 -0
  108. package/lib/modules/bbsf-uploads.module.d.ts +50 -0
  109. package/lib/modules/bbsf-utility.module.d.ts +45 -0
  110. package/package.json +2 -13
  111. package/public-api.d.ts +12 -0
@@ -1,16 +1,19 @@
1
- import { Component, Input, Optional, ViewChild, EventEmitter, Output, ViewEncapsulation } from '@angular/core';
2
- import { MapAutocompleteDTO } from '../../Shared/Models/MapAutocompleteDTO';
1
+ import { Component, Input, Optional, ViewChild, EventEmitter, Output, ViewEncapsulation, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
+ import { GoogleMapsModule } from '@angular/google-maps';
5
+ import { ScriptLoaderModule } from 'ngx-script-loader';
3
6
  import { environment } from '@bnsights/bbsf-utilities';
4
- import { FormControl, Validators } from '@angular/forms';
7
+ import { MapAutocompleteDTO } from '../../Shared/Models/MapAutocompleteDTO';
5
8
  import { MapSearchTypes, MapZoomLevel } from '../../Shared/Enums/map-enums';
6
9
  import * as i0 from "@angular/core";
7
10
  import * as i1 from "../../Shared/services/ControlUtility";
8
11
  import * as i2 from "@angular/forms";
9
- import * as i3 from "@bnsights/bbsf-utilities";
10
- import * as i4 from "../../Shared/services/GlobalSettings.service";
11
- import * as i5 from "ngx-script-loader";
12
- import * as i6 from "@angular/common";
13
- import * as i7 from "@ng-bootstrap/ng-bootstrap";
12
+ import * as i3 from "@bnsights/bbsf-utilities/ui";
13
+ import * as i4 from "@bnsights/bbsf-utilities/translate";
14
+ import * as i5 from "../../Shared/services/GlobalSettings.service";
15
+ import * as i6 from "ngx-script-loader";
16
+ import * as i7 from "@angular/common";
14
17
  import * as i8 from "@angular/google-maps";
15
18
  export class MapAutoCompleteComponent {
16
19
  static { this.controlContainerStatic = null; }
@@ -466,15 +469,21 @@ export class MapAutoCompleteComponent {
466
469
  this.GermanAddressMapped(this.selectedPin);
467
470
  this.closeMapModal();
468
471
  }
469
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapAutoCompleteComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.BBSFTranslateService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }, { token: i5.ScriptService }], target: i0.ɵɵFactoryTarget.Component }); }
470
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapAutoCompleteComponent, selector: "BBSF-MapAutoComplete", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["mapSearch"], descendants: true }, { propertyName: "advancedMapModal", first: true, predicate: ["advancedMapModal"], descendants: true }, { propertyName: "setLocationSearch", first: true, predicate: ["setLocationSearch"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n\r\n <!--#region input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <input class=\"form-control input-icon-o {{options.extraClasses}}\" [value]=\"mapAutoCompleteModel.text\"\r\n [address]=\"mapAutoCompleteModel.text\" value=\"{{mapAutoCompleteModel.text}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\"\r\n [placeholder]=\"options.placeholder\" [id]=\"options.name\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\"\r\n ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\" (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region readonly -->\r\n <div *ngIf=\"options.isReadonly\">\r\n <a href=\"{{mapAutoCompleteModel.googleMapsURL}}\" target=\"_blank\">{{mapAutoCompleteModel.text}}</a>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">\r\n {{resetError()}} </div>\r\n\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngClass]=\"{'bbsf-blur': modalIsOpen}\"\r\n [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" #setLocationSearch type=\"text\"\r\n placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [zoom]=\"zoomLevel\" [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n <div class=\"text-danger\" *ngIf=\"(options.validateLocationWithinCity && options.city && invalidLocationWithinCity)\">\r\n {{translateValue('InvalidLocationWithinCity').replace('{0}', options.city)}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i8.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged"], exportAs: ["mapMarker"] }, { kind: "pipe", type: i6.KeyValuePipe, name: "keyvalue" }], encapsulation: i0.ViewEncapsulation.None }); }
472
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapAutoCompleteComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i4.BBSFTranslateService }, { token: i3.ControlValidationService }, { token: i5.GlobalSettings }, { token: i6.ScriptService }], target: i0.ɵɵFactoryTarget.Component }); }
473
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapAutoCompleteComponent, isStandalone: true, selector: "BBSF-MapAutoComplete", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["mapSearch"], descendants: true }, { propertyName: "advancedMapModal", first: true, predicate: ["advancedMapModal"], descendants: true }, { propertyName: "setLocationSearch", first: true, predicate: ["setLocationSearch"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n\r\n <!--#region input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <input class=\"form-control input-icon-o {{options.extraClasses}}\" [value]=\"mapAutoCompleteModel.text\"\r\n [address]=\"mapAutoCompleteModel.text\" value=\"{{mapAutoCompleteModel.text}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\"\r\n [placeholder]=\"options.placeholder\" [id]=\"options.name\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\"\r\n ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\" (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region readonly -->\r\n <div *ngIf=\"options.isReadonly\">\r\n <a href=\"{{mapAutoCompleteModel.googleMapsURL}}\" target=\"_blank\">{{mapAutoCompleteModel.text}}</a>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">\r\n {{resetError()}} </div>\r\n\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngClass]=\"{'bbsf-blur': modalIsOpen}\"\r\n [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" #setLocationSearch type=\"text\"\r\n placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [zoom]=\"zoomLevel\" [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n <div class=\"text-danger\" *ngIf=\"(options.validateLocationWithinCity && options.city && invalidLocationWithinCity)\">\r\n {{translateValue('InvalidLocationWithinCity').replace('{0}', options.city)}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i7.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ScriptLoaderModule }, { kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i8.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i8.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged"], exportAs: ["mapMarker"] }], encapsulation: i0.ViewEncapsulation.None }); }
471
474
  }
472
475
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapAutoCompleteComponent, decorators: [{
473
476
  type: Component,
474
- args: [{ selector: 'BBSF-MapAutoComplete', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n\r\n <!--#region input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <input class=\"form-control input-icon-o {{options.extraClasses}}\" [value]=\"mapAutoCompleteModel.text\"\r\n [address]=\"mapAutoCompleteModel.text\" value=\"{{mapAutoCompleteModel.text}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\"\r\n [placeholder]=\"options.placeholder\" [id]=\"options.name\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\"\r\n ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\" (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region readonly -->\r\n <div *ngIf=\"options.isReadonly\">\r\n <a href=\"{{mapAutoCompleteModel.googleMapsURL}}\" target=\"_blank\">{{mapAutoCompleteModel.text}}</a>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">\r\n {{resetError()}} </div>\r\n\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngClass]=\"{'bbsf-blur': modalIsOpen}\"\r\n [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" #setLocationSearch type=\"text\"\r\n placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [zoom]=\"zoomLevel\" [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n <div class=\"text-danger\" *ngIf=\"(options.validateLocationWithinCity && options.city && invalidLocationWithinCity)\">\r\n {{translateValue('InvalidLocationWithinCity').replace('{0}', options.city)}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>" }]
477
+ args: [{ selector: 'BBSF-MapAutoComplete', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
478
+ CommonModule,
479
+ FormsModule,
480
+ ReactiveFormsModule,
481
+ ScriptLoaderModule,
482
+ GoogleMapsModule
483
+ ], schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA], template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n\r\n <!--#region input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <input class=\"form-control input-icon-o {{options.extraClasses}}\" [value]=\"mapAutoCompleteModel.text\"\r\n [address]=\"mapAutoCompleteModel.text\" value=\"{{mapAutoCompleteModel.text}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\"\r\n [placeholder]=\"options.placeholder\" [id]=\"options.name\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\"\r\n ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\" (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region readonly -->\r\n <div *ngIf=\"options.isReadonly\">\r\n <a href=\"{{mapAutoCompleteModel.googleMapsURL}}\" target=\"_blank\">{{mapAutoCompleteModel.text}}</a>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">\r\n {{resetError()}} </div>\r\n\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngClass]=\"{'bbsf-blur': modalIsOpen}\"\r\n [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" #setLocationSearch type=\"text\"\r\n placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [zoom]=\"zoomLevel\" [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n <div class=\"text-danger\" *ngIf=\"(options.validateLocationWithinCity && options.city && invalidLocationWithinCity)\">\r\n {{translateValue('InvalidLocationWithinCity').replace('{0}', options.city)}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>" }]
475
484
  }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.ControlUtility }, { type: i2.ControlContainer, decorators: [{
476
485
  type: Optional
477
- }] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.BBSFTranslateService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }, { type: i5.ScriptService }], propDecorators: { group: [{
486
+ }] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i4.BBSFTranslateService }, { type: i3.ControlValidationService }, { type: i5.GlobalSettings }, { type: i6.ScriptService }], propDecorators: { group: [{
478
487
  type: Input
479
488
  }], options: [{
480
489
  type: Input
@@ -490,4 +499,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
490
499
  type: ViewChild,
491
500
  args: ["setLocationSearch", { static: false }]
492
501
  }] } });
493
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBc0IsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0ksT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFrRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2SCxPQUFPLEVBQXFDLFdBQVcsRUFBaUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7OztBQVE1RSxNQUFNLE9BQU8sd0JBQXdCO2FBQzVCLDJCQUFzQixHQUFHLElBQUksQUFBUCxDQUFRO0lBRXJDLFlBQW9CLE1BQWMsRUFBVSxjQUE4QixFQUFzQixnQkFBa0MsRUFDekgsMEJBQThDLEVBQVUsY0FBOEIsRUFBVSxTQUErQixFQUM5SCx3QkFBa0QsRUFBVSxjQUE4QixFQUFVLGFBQTRCO1FBRnRILFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBc0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUN6SCwrQkFBMEIsR0FBMUIsMEJBQTBC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QUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQzsrR0F6Z0JVLHdCQUF3QjttR0FBeEIsd0JBQXdCLDhjQ2hCckMsMjFKQTBGZTs7NEZEMUVGLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSxzQkFBc0IsaUJBRWpCLGlCQUFpQixDQUFDLElBQUk7OzBCQU13QyxRQUFROzBPQWM1RSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQzJDLGdCQUFnQjtzQkFBakUsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNTLGdCQUFnQjtzQkFBakUsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0csaUJBQWlCO3NCQUFuRSxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3B0aW9uYWwsIE5nWm9uZSwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFV0aWxpdHkgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvQ29udHJvbFV0aWxpdHknO1xyXG5pbXBvcnQgeyBNYXBBdXRvQ29tcGxldGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9NYXBBdXRvQ29tcGxldGVPcHRpb25zJztcclxuaW1wb3J0IHsgTWFwQXV0b2NvbXBsZXRlRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9NYXBBdXRvY29tcGxldGVEVE8nO1xyXG5pbXBvcnQgeyBCQlNGVHJhbnNsYXRlU2VydmljZSwgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLCBVdGlsaXR5U2VydmljZSwgZW52aXJvbm1lbnQgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9HbG9iYWxTZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sQ29udGFpbmVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3JtR3JvdXBEaXJlY3RpdmUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNjcmlwdFNlcnZpY2UgfSBmcm9tICduZ3gtc2NyaXB0LWxvYWRlcic7XHJcbmltcG9ydCB7IE1hcFNlYXJjaFR5cGVzLCBNYXBab29tTGV2ZWwgfSBmcm9tICcuLi8uLi9TaGFyZWQvRW51bXMvbWFwLWVudW1zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1NYXBBdXRvQ29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9NYXBBdXRvQ29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXBBdXRvQ29tcGxldGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyU3RhdGljID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBtYXBBdXRvQ29tcGxldGVDb250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLCBwcml2YXRlIFV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGU6IEJCU0ZUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSwgcHJpdmF0ZSBnbG9iYWxTZXR0aW5nczogR2xvYmFsU2V0dGluZ3MsIHByaXZhdGUgc2NyaXB0U2VydmljZTogU2NyaXB0U2VydmljZSkge1xyXG5cclxuICAgIE1hcEF1dG9Db21wbGV0ZUNvbXBvbmVudC5jb250cm9sQ29udGFpbmVyU3RhdGljID0gdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgPSB0cmFuc2xhdGUuY3VycmVudExhbmcgIT0gdW5kZWZpbmVkID8gdHJhbnNsYXRlLmN1cnJlbnRMYW5nIDogdHJhbnNsYXRlLmRlZmF1bHRMYW5nO1xyXG5cclxuICAgIHRoaXMuc2NyaXB0U2VydmljZS5sb2FkU2NyaXB0KGBodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PSR7ZW52aXJvbm1lbnQuQkJTRl9Hb29nbGVNYXBLZXl9JmxpYnJhcmllcz1wbGFjZXNgKVxyXG4gICAgICAuc3Vic2NyaWJlKF8gPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd01hcCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5tYXBTY3JpcHRMb2FkZWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBncm91cDogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IE1hcEF1dG9Db21wbGV0ZU9wdGlvbnM7XHJcbiAgQE91dHB1dCgpIE9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBWaWV3Q2hpbGQoXCJtYXBTZWFyY2hcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBzZWFyY2hFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoXCJhZHZhbmNlZE1hcE1vZGFsXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBhZHZhbmNlZE1hcE1vZGFsOiBhbnk7XHJcbiAgQFZpZXdDaGlsZChcInNldExvY2F0aW9uU2VhcmNoXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBzZXRMb2NhdGlvblNlYXJjaDogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgbWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBtYXBBdXRvQ29tcGxldGVNb2RlbDogTWFwQXV0b2NvbXBsZXRlRFRPID0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nID0gdGhpcy5VdGlsaXR5U2VydmljZS5nZXRDdXJyZW50TGFuZ3VhZ2UoKTtcclxuICBtYXJrQWxsQXNUb3VjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdmFsaWRhdGlvblJ1bGVzID0gW107XHJcbiAgdmFsaWRhdGlvblJ1bGVzQXN5bmMgPSBbXTtcclxuICBpbnZhbGlkTG9jYXRpb25XaXRoaW5DaXR5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgem9vbUxldmVsOiBudW1iZXIgPSBNYXBab29tTGV2ZWwuQ2l0eTtcclxuXHJcbiAgc2hvd01hcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1hcmtlclBvc2l0aW9uOiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsO1xyXG4gIG1hcENlbnRlcjogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbDtcclxuICBtb2RhbElzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1hcmtlck9wdGlvbnM6IGdvb2dsZS5tYXBzLk1hcmtlck9wdGlvbnM7XHJcblxyXG4gIHBsYWNlOiBhbnk7XHJcbiAgc2VsZWN0ZWRQaW46IGFueTtcclxuXHJcbiAgLy8jcmVnaW9uIGV2ZW50c1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLmlzQ3JlYXRlZEJlZm9yID0gZmFsc2U7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsID0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG5cclxuICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlID0gZXZlbnQubGFuZztcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuem9vbSlcclxuICAgICAgdGhpcy56b29tTGV2ZWwgPSB0aGlzLm9wdGlvbnMuem9vbVxyXG4gICAgdGhpcy5pbml0aWFsaXplQ29udHJvbE9wdGlvbnMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy52YWx1ZT8udGV4dClcclxuICAgICAgdGhpcy5zZXRBZGRyZXNzKCk7XHJcblxyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVDb250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3QgIT0gbnVsbCkge1xyXG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5uYW1lKTtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVMaXN0W2luZGV4XS5rZXksIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVMaXN0W2luZGV4XS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHZhciBlbGVtZW50SFRNTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5uYW1lKSBhcyBhbnk7XHJcbiAgICBpZiAoZWxlbWVudEhUTUwpXHJcbiAgICAgIGVsZW1lbnRIVE1MLnZhbHVlID0gdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC50ZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5yZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH07XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvclZhbGlkYXRpb24oRXJyb3JMaXN0KSB7XHJcbiAgICBpZiAodGhpcy5tYXJrQWxsQXNUb3VjaGVkICYmIHRoaXMuZ3JvdXAuaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnNob3dHbG9iYWxFcnJvcigpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKEVycm9yTGlzdCwgdGhpcy5ncm91cCwgdGhpcy5vcHRpb25zKTtcclxuICB9XHJcblxyXG4gIEF1dG9jb21wbGV0ZVNlbGVjdGVkKHJlc3VsdDogZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlUmVzdWx0KSB7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsID09IG5ldyBNYXBBdXRvY29tcGxldGVEVE8oKTtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwudGV4dCA9IHJlc3VsdC5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwucGxhY2VJRCA9IHJlc3VsdC5wbGFjZV9pZDtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwuZ29vZ2xlTWFwc1VSTCA9IHJlc3VsdC51cmw7XHJcbiAgfVxyXG5cclxuICBMb2NhdGlvblNlbGVjdGVkKGxvY2F0aW9uKSB7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxhdGl0dWRlID0gbG9jYXRpb24ubGF0aXR1ZGU7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxvbmdpdHVkZSA9IGxvY2F0aW9uLmxvbmdpdHVkZTtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XHJcblxyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsKTtcclxuICAgIGxldCBvcmlnaW5hbFZhbHVlID0gdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC52YWx1ZTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiAmJiB0aGlzLm9wdGlvbnMucGF0Y2hQYXRoICYmIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXRjaENvbnRyb2xWYWx1ZShvcmlnaW5hbFZhbHVlLCB0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiwgdGhpcy5vcHRpb25zLnBhdGNoUGF0aCk7XHJcbiAgICB9XHJcbiAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWw7XHJcbiAgfVxyXG5cclxuICBHZXJtYW5BZGRyZXNzTWFwcGVkKHJlc3VsdCkge1xyXG4gICAgaWYgKHJlc3VsdC50eXBlKSB7XHJcbiAgICAgIGlmIChyZXN1bHQudGFyZ2V0LnZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMubmFtZV0uc2V0VmFsdWUocmVzdWx0KTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCA9PSBuZXcgTWFwQXV0b2NvbXBsZXRlRFRPKCk7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLnRleHQgPSByZXN1bHQuZGlzcGxheUFkZHJlc3M7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLnBsYWNlSUQgPSByZXN1bHQucGxhY2VJRDtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwuZ29vZ2xlTWFwc1VSTCA9IHJlc3VsdC51cmw7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxhdGl0dWRlID0gcmVzdWx0Lmdlb0xvY2F0aW9uLmxhdDtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwubG9uZ2l0dWRlID0gcmVzdWx0Lmdlb0xvY2F0aW9uLmxuZztcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCk7XHJcbiAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5uYW1lXS5zZXRWYWx1ZSh0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsKTtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdCh0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnZhbHVlKTtcclxuICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbDtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBoZWxwZXIgbWV0aG9kc1xyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVDb250cm9sT3B0aW9ucygpIHtcclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMubmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sID0gdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMubmFtZV07XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudmlld1R5cGUpXHJcbiAgICAgIHRoaXMub3B0aW9ucy52aWV3VHlwZSA9IHRoaXMuZ2xvYmFsU2V0dGluZ3Mudmlld1R5cGU7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc1JlcXVpcmVkKVxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubGFiZWxLZXkgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMubGFiZWxLZXkgIT0gXCJcIilcclxuICAgICAgdGhpcy5vcHRpb25zLmxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUodGhpcy5vcHRpb25zLmxhYmVsS2V5KTtcclxuXHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXNBc3luYyk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzRGlzYWJsZWQpXHJcbiAgICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICBsZXQgZ2VybWFuQWRkcmVzcyA9IHtcclxuICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy52YWx1ZS5nb29nbGVNYXBzVVJMLFxyXG4gICAgICAgIHBsYWNlSUQ6IHRoaXMub3B0aW9ucy52YWx1ZS5wbGFjZUlELFxyXG4gICAgICAgIGRpc3BsYXlBZGRyZXNzOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgICBuYW1lOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgICBsb2NhbGl0eToge30sXHJcbiAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgIGNvdW50cnk6IHt9LFxyXG4gICAgICAgIGdlb0xvY2F0aW9uOiB7IGxhdDogLTEsIGxuZzogLTEgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGdlcm1hbkFkZHJlc3MuZ2VvTG9jYXRpb24ubGF0ID0gdGhpcy5vcHRpb25zLnZhbHVlLmxhdGl0dWRlO1xyXG4gICAgICBnZXJtYW5BZGRyZXNzLmdlb0xvY2F0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy52YWx1ZS5sb25naXR1ZGU7XHJcblxyXG4gICAgICB0aGlzLkdlcm1hbkFkZHJlc3NNYXBwZWQoZ2VybWFuQWRkcmVzcyk7XHJcblxyXG4gICAgICB0aGlzLnBsYWNlID0ge1xyXG4gICAgICAgIHVybDogdGhpcy5vcHRpb25zLnZhbHVlLmdvb2dsZU1hcHNVUkwsXHJcbiAgICAgICAgcGxhY2VfaWQ6IHRoaXMub3B0aW9ucy52YWx1ZS5wbGFjZUlELFxyXG4gICAgICAgIGZvcm1hdHRlZF9hZGRyZXNzOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgICBuYW1lOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuQXV0b2NvbXBsZXRlU2VsZWN0ZWQodGhpcy5wbGFjZSk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLm5hbWVdLnNldFZhbHVlKHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwpO1xyXG4gICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLmN1c3RvbVZhbGlkYXRpb247XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRQbGFjZUF1dG9jb21wbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZU5vbmVBZHZhbmNlZE1hcEF1dG9Db21wbGV0ZSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHsgQXV0b2NvbXBsZXRlIH0gPSBhd2FpdCBnb29nbGUubWFwcy5pbXBvcnRMaWJyYXJ5KFwicGxhY2VzXCIpIGFzIGdvb2dsZS5tYXBzLlBsYWNlc0xpYnJhcnk7XHJcblxyXG4gICAgY29uc3QgYXV0b2NvbXBsZXRlID0gbmV3IEF1dG9jb21wbGV0ZSh0aGlzLnNlYXJjaEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xyXG4gICAgICB0eXBlczogW01hcFNlYXJjaFR5cGVzLkFkZHJlc3NdXHJcbiAgICB9KTtcclxuXHJcbiAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihhdXRvY29tcGxldGUsICdwbGFjZV9jaGFuZ2VkJywgXyA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bihfID0+IHtcclxuICAgICAgICBjb25zdCBwbGFjZSA9IGF1dG9jb21wbGV0ZS5nZXRQbGFjZSgpO1xyXG5cclxuICAgICAgICBpZiAocGxhY2UuZ2VvbWV0cnkpIHtcclxuICAgICAgICAgIGNvbnN0IGdlcm1hbkFkZHJlc3MgPSB7XHJcbiAgICAgICAgICAgIGljb246IHBsYWNlLmljb24sXHJcbiAgICAgICAgICAgIHVybDogcGxhY2UudXJsLFxyXG4gICAgICAgICAgICBwbGFjZUlEOiBwbGFjZS5wbGFjZV9pZCxcclxuICAgICAgICAgICAgZGlzcGxheUFkZHJlc3M6IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzLFxyXG4gICAgICAgICAgICBuYW1lOiBwbGFjZS5uYW1lLFxyXG4gICAgICAgICAgICB2aWNpbml0eTogcGxhY2UudmljaW5pdHksXHJcbiAgICAgICAgICAgIGxvY2FsaXR5OiB7fSxcclxuICAgICAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgICAgICBjb3VudHJ5OiB7fSxcclxuICAgICAgICAgICAgZ2VvTG9jYXRpb246IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBwbGFjZS5hZGRyZXNzX2NvbXBvbmVudHMuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdHJlZXRfbnVtYmVyJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJzdHJlZXROdW1iZXJcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdyb3V0ZScpID4gLTEpIHtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzW1wic3RyZWV0TmFtZVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzc1tcInBvc3RhbENvZGVcIl0gPSBOdW1iZXIodmFsdWUuc2hvcnRfbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N1YmxvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJzdWJsb2NhbGl0eVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignbG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2NvdW50cnknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5jb3VudHJ5W1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmNvdW50cnlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMycpID4gLTEpIHtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLkdlcm1hbkFkZHJlc3NNYXBwZWQoZ2VybWFuQWRkcmVzcyk7XHJcbiAgICAgICAgICB0aGlzLkF1dG9jb21wbGV0ZVNlbGVjdGVkKHBsYWNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFwU2NyaXB0TG9hZGVkKCkge1xyXG4gICAgdGhpcy5nZXRQbGFjZUF1dG9jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlVmFsdWUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaXNMb2NhdGlvbldpdGhpbkNpdHkoY2l0eU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGNpdHlOYW1lID09PSBcIlVtbSBBbCBRdXdhaW5cIilcclxuICAgICAgY2l0eU5hbWUgPSBcIkVtaXJhdGUgb2YgVW1tIEFsIFF1d2FpblwiO1xyXG5cclxuICAgIGxldCBsYXRMbmcgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwubGF0aXR1ZGUsIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwubG9uZ2l0dWRlKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFBpbikge1xyXG4gICAgICBsZXQgbG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkUGluLmdlb0xvY2F0aW9uO1xyXG4gICAgICBsYXRMbmcgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxvY2F0aW9uLmxhdCwgbG9jYXRpb24ubG5nKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5vbk1hcENsaWNrKDxnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50PnsgbGF0TG5nOiBsYXRMbmcgfSk7XHJcblxyXG4gICAgY29uc3QgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBnZW9jb2Rlci5nZW9jb2RlKHsgbG9jYXRpb246IGxhdExuZyB9LCAocmVzdWx0cywgc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0sgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBlbWlyYXRlQ29tcG9uZW50ID0gcmVzdWx0c1swXS5hZGRyZXNzX2NvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT5cclxuICAgICAgICAgICAgY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKCdhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzEnKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAoZW1pcmF0ZUNvbXBvbmVudCAmJiBlbWlyYXRlQ29tcG9uZW50LmxvbmdfbmFtZS50b0xvd2VyQ2FzZSgpID09PSBjaXR5TmFtZS50b0xvd2VyQ2FzZSgpKSByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0R2VvY29kZXIoYWRkcmVzczogc3RyaW5nLCBhZG1pbmlzdHJhdGl2ZUFyZWE6IHN0cmluZywgY291bnRyeTogc3RyaW5nLCB6b29tOiBudW1iZXIgPSBNYXBab29tTGV2ZWwuQ2l0eSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7XHJcblxyXG4gICAgICBjb25zdCBnZW9jb2RlUmVxdWVzdDogZ29vZ2xlLm1hcHMuR2VvY29kZXJSZXF1ZXN0ID0geyBhZGRyZXNzOiBhZGRyZXNzIH07XHJcbiAgICAgIGlmIChhZG1pbmlzdHJhdGl2ZUFyZWEgJiYgY291bnRyeSkge1xyXG4gICAgICAgIGdlb2NvZGVSZXF1ZXN0LmNvbXBvbmVudFJlc3RyaWN0aW9ucyA9IHtcclxuICAgICAgICAgIGNvdW50cnk6IGNvdW50cnksXHJcbiAgICAgICAgICBhZG1pbmlzdHJhdGl2ZUFyZWE6IGFkbWluaXN0cmF0aXZlQXJlYVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdlb2NvZGVyLmdlb2NvZGUoZ2VvY29kZVJlcXVlc3QsIChyZXN1bHRzLCBzdGF0dXMpID0+IHtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbi50b0pTT04oKTtcclxuICAgICAgICAgIHRoaXMubWFwQ2VudGVyID0gbG9jYXRpb247XHJcbiAgICAgICAgICB0aGlzLm1hcmtlclBvc2l0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxhdGl0dWRlID0gbG9jYXRpb24ubGF0O1xyXG4gICAgICAgICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5sb25naXR1ZGUgPSBsb2NhdGlvbi5sbmc7XHJcbiAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLnRleHQgPSByZXN1bHRzWzBdLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG5cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHsgLi4udGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCB9O1xyXG4gICAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMubmFtZV0uc2V0VmFsdWUodGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCk7XHJcbiAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy56b29tTGV2ZWwgPSB6b29tO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBZGRyZXNzKCkge1xyXG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWRkcmVzcykge1xyXG4gICAgICAgIGxldCBhZGRyZXNzRm91bmQgPSBhd2FpdCB0aGlzLnNldEdlb2NvZGVyLmNhbGwodGhpcywgdGhpcy5vcHRpb25zLmFkZHJlc3MsIHRoaXMub3B0aW9ucy5jaXR5LCB0aGlzLm9wdGlvbnMuY291bnRyeSwgTWFwWm9vbUxldmVsLkJ1aWxkaW5nKTtcclxuICAgICAgICBpZiAoIWFkZHJlc3NGb3VuZCAmJiB0aGlzLm9wdGlvbnMuZW5hYmxlRmFsbGJhY2tBZGRyZXNzKSB7XHJcbiAgICAgICAgICBsZXQgZmFsbGJhY2tBZGRyZXNzRm91bmQgPSBhd2FpdCB0aGlzLnNldEdlb2NvZGVyLmNhbGwodGhpcywgdGhpcy5vcHRpb25zLmNpdHksIHRoaXMub3B0aW9ucy5jaXR5LCB0aGlzLm9wdGlvbnMuY291bnRyeSk7XHJcbiAgICAgICAgICBpZiAoIWZhbGxiYWNrQWRkcmVzc0ZvdW5kKVxyXG4gICAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsID0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZhbGlkYXRlTG9jYXRpb25XaXRoaW5DaXR5KSB7XHJcbiAgICAgICAgY29uc3QgaXNMb2NhdGlvbldpdGhpbkNpdHkgPSBhd2FpdCB0aGlzLmlzTG9jYXRpb25XaXRoaW5DaXR5KHRoaXMub3B0aW9ucy5jaXR5KVxyXG4gICAgICAgIGlmICghaXNMb2NhdGlvbldpdGhpbkNpdHkpXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuaXNMb2NhdGlvblZhbGlkID0gISh0aGlzLmludmFsaWRMb2NhdGlvbldpdGhpbkNpdHkgPSB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGFkdmFuY2VkIG1hcCBtZXRob2RzXHJcblxyXG4gIGFzeW5jIG9uTWFwQ2xpY2soZXZlbnQ6IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuYWRkTWFya2VyKGV2ZW50KTtcclxuXHJcbiAgICBsZXQgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcclxuICAgIGdlb2NvZGVyLmdlb2NvZGUoeyBsb2NhdGlvbjogZXZlbnQubGF0TG5nPy50b0pTT04oKSB9KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgIGNvbnN0IHBsYWNlID0gcmVzLnJlc3VsdHNbMF07XHJcbiAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZXRMb2NhdGlvblNlYXJjaFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICBpbnB1dC52YWx1ZSA9IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUGluID0ge1xyXG4gICAgICAgIHBsYWNlSUQ6IHBsYWNlLnBsYWNlX2lkLFxyXG4gICAgICAgIGRpc3BsYXlBZGRyZXNzOiBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcyxcclxuICAgICAgICBnZW9Mb2NhdGlvbjogcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24udG9KU09OKCksXHJcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3BsYWNlLz9xPXBsYWNlX2lkOiR7cGxhY2UucGxhY2VfaWR9YCxcclxuICAgICAgICBsb2NhbGl0eToge30sXHJcbiAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgIGNvdW50cnk6IHt9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcGxhY2UuYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdHJlZXRfbnVtYmVyJykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbltcInN0cmVldE51bWJlclwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdyb3V0ZScpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJzdHJlZXROYW1lXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wicG9zdGFsQ29kZVwiXSA9IE51bWJlcih2YWx1ZS5zaG9ydF9uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N1YmxvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbltcInN1YmxvY2FsaXR5XCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignbG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4ubG9jYWxpdHlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzEnKSA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLnN0YXRlW1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4uc3RhdGVbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdjb3VudHJ5JykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5jb3VudHJ5W1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4uY291bnRyeVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMycpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4ubG9jYWxpdHlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZE1hcmtlcihldmVudDogZ29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmxhdExuZylcclxuICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IGV2ZW50LmxhdExuZy50b0pTT04oKTtcclxuICB9XHJcblxyXG4gIG9wZW5NYXBNb2RhbCgpIHtcclxuICAgIHRoaXMubW9kYWxJc09wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5nZXRDdXJyZW50TG9jYXRpb24oKTtcclxuICAgIHRoaXMuYWRkU2VhcmNoQm94KCk7XHJcbiAgfVxyXG5cclxuICBjbG9zZU1hcE1vZGFsKCkge1xyXG4gICAgdGhpcy5tb2RhbElzT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudExvY2F0aW9uKCkge1xyXG4gICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigocG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHBvaW50OiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsID0ge1xyXG4gICAgICAgIGxhdDogcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlLFxyXG4gICAgICAgIGxuZzogcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMubWFwQ2VudGVyID0gcG9pbnQ7XHJcblxyXG4gICAgICB0aGlzLm1hcmtlclBvc2l0aW9uID0ge1xyXG4gICAgICAgIGxhdDogdGhpcy5tYXBDZW50ZXIubGF0LFxyXG4gICAgICAgIGxuZzogdGhpcy5tYXBDZW50ZXIubG5nXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm1hcmtlck9wdGlvbnMgPSB7XHJcbiAgICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcclxuICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkU2VhcmNoQm94KCkge1xyXG4gICAgY29uc3QgeyBBdXRvY29tcGxldGUgfSA9IGF3YWl0IGdvb2dsZS5tYXBzLmltcG9ydExpYnJhcnkoXCJwbGFjZXNcIikgYXMgZ29vZ2xlLm1hcHMuUGxhY2VzTGlicmFyeTtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZXRMb2NhdGlvblNlYXJjaFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3Qgc2VhcmNoQm94ID0gbmV3IEF1dG9jb21wbGV0ZShpbnB1dCk7XHJcblxyXG4gICAgZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIoc2VhcmNoQm94LCBcInBsYWNlX2NoYW5nZWRcIiwgKCkgPT4ge1xyXG4gICAgICBjb25zdCBwbGFjZSA9IHNlYXJjaEJveC5nZXRQbGFjZSgpO1xyXG4gICAgICBpZiAocGxhY2UuZ2VvbWV0cnkpIHtcclxuICAgICAgICB0aGlzLm1hcmtlclBvc2l0aW9uID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24udG9KU09OKCk7XHJcbiAgICAgICAgdGhpcy5tYXBDZW50ZXIgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi50b0pTT04oKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUGluID0ge1xyXG4gICAgICAgICAgaWNvbjogcGxhY2UuaWNvbixcclxuICAgICAgICAgIHVybDogcGxhY2UudXJsLFxyXG4gICAgICAgICAgcGxhY2VJRDogcGxhY2UucGxhY2VfaWQsXHJcbiAgICAgICAgICBkaXNwbGF5QWRkcmVzczogcGxhY2UuZm9ybWF0dGVkX2FkZHJlc3MsXHJcbiAgICAgICAgICBuYW1lOiBwbGFjZS5uYW1lLFxyXG4gICAgICAgICAgdmljaW5pdHk6IHBsYWNlLnZpY2luaXR5LFxyXG4gICAgICAgICAgbG9jYWxpdHk6IHt9LFxyXG4gICAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgICAgY291bnRyeToge30sXHJcbiAgICAgICAgICBnZW9Mb2NhdGlvbjogcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24udG9KU09OKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcGxhY2UuYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N0cmVldF9udW1iZXInKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJzdHJlZXROdW1iZXJcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3JvdXRlJykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wic3RyZWV0TmFtZVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdwb3N0YWxfY29kZScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbltcInBvc3RhbENvZGVcIl0gPSBOdW1iZXIodmFsdWUuc2hvcnRfbmFtZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignc3VibG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJzdWJsb2NhbGl0eVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdsb2NhbGl0eScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5sb2NhbGl0eVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4ubG9jYWxpdHlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xJykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLnN0YXRlW1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5zdGF0ZVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdjb3VudHJ5JykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmNvdW50cnlbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmNvdW50cnlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8zJykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc3VibWl0U2V0TG9jYXRpb24oKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuaXNMb2NhdGlvblZhbGlkID0gISh0aGlzLmludmFsaWRMb2NhdGlvbldpdGhpbkNpdHkgPSBmYWxzZSk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnZhbGlkYXRlTG9jYXRpb25XaXRoaW5DaXR5ICYmIHRoaXMub3B0aW9ucy5jaXR5KSB7XHJcbiAgICAgIGNvbnN0IGlzTG9jYXRpb25XaXRoaW5DaXR5ID0gYXdhaXQgdGhpcy5pc0xvY2F0aW9uV2l0aGluQ2l0eSh0aGlzLm9wdGlvbnMuY2l0eSk7XHJcbiAgICAgIGlmICghaXNMb2NhdGlvbldpdGhpbkNpdHkpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuaXNMb2NhdGlvblZhbGlkID0gISh0aGlzLmludmFsaWRMb2NhdGlvbldpdGhpbkNpdHkgPSB0cnVlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRQaW4pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLkdlcm1hbkFkZHJlc3NNYXBwZWQodGhpcy5zZWxlY3RlZFBpbik7XHJcbiAgICB0aGlzLmNsb3NlTWFwTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gRXh0ZXJuYWwgTWV0aG9kc1xyXG5cclxuICBSZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKTtcclxuICB9O1xyXG4gIEFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH07XHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnJlbW92ZUN1c3RvbVZhbGlkYXRpb24odGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pO1xyXG4gIH07XHJcbiAgQWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmFkZEN1c3RvbVZhbGlkYXRpb24odGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pO1xyXG4gIH07XHJcbiAgSXNWYWxpZCA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuaXNWYWxpZCh0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sKTtcclxuICB9O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxufVxyXG5cclxuXHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TWFwXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYmJzZi1jb250cm9sIGJic2YtbWFwc1wiIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwiKG9wdGlvbnMudmlld1R5cGU9PTEpPydiYnNmLXZlcnRpY2FsJzonYmJzZi1ob3Jpem9udGFsJ1wiPlxyXG4gICAgICA8bGFiZWwgKm5nSWY9XCIhb3B0aW9ucy5oaWRlTGFiZWxcIiBjbGFzcz1cImJic2YtbGFiZWwge3tvcHRpb25zLmxhYmVsRXh0cmFDbGFzc2VzfX1cIj5cclxuICAgICAgICB7e29wdGlvbnMubGFiZWxWYWx1ZX19XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIoKG9wdGlvbnMuc2hvd0FzdGVyaXNrJiZvcHRpb25zLmlzUmVxdWlyZWQpfHwob3B0aW9ucy5pc1JlcXVpcmVkKSkmJiFvcHRpb25zLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICA8IS0tI3JlZ2lvbiBpbnB1dC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgYmJzZi1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIj5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtaWNvbi1vIHt7b3B0aW9ucy5leHRyYUNsYXNzZXN9fVwiIFt2YWx1ZV09XCJtYXBBdXRvQ29tcGxldGVNb2RlbC50ZXh0XCJcclxuICAgICAgICAgIFthZGRyZXNzXT1cIm1hcEF1dG9Db21wbGV0ZU1vZGVsLnRleHRcIiB2YWx1ZT1cInt7bWFwQXV0b0NvbXBsZXRlTW9kZWwudGV4dH19XCJcclxuICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJlbWFpbC1lcnJvclwiIGFyaWEtaW52YWxpZD1cInRydWVcIlxyXG4gICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwibWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBtYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC50b3VjaGVkXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJvcHRpb25zLnBsYWNlaG9sZGVyXCIgW2lkXT1cIm9wdGlvbnMubmFtZVwiIChrZXl1cCk9XCJHZXJtYW5BZGRyZXNzTWFwcGVkKCRldmVudClcIiAjbWFwU2VhcmNoIC8+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIm9wdGlvbnMuc2hvd0FkdmFuY2VkTWFwXCIgY2xhc3M9XCJib3JkZXItMCBidG4tc2Vjb25kYXJ5IGJ0bi1pY29uLW9cIlxyXG4gICAgICAgICAgbmdiVG9vbHRpcD1cInt7dHJhbnNsYXRlVmFsdWUoJ1NldExvY2F0aW9uJyl9fVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib3Blbk1hcE1vZGFsKClcIj5cclxuXHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTFcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNMTIgMTNDMTMuNjU2OSAxMyAxNSAxMS42NTY5IDE1IDEwQzE1IDguMzQzMTUgMTMuNjU2OSA3IDEyIDdDMTAuMzQzMSA3IDkgOC4zNDMxNSA5IDEwQzkgMTEuNjU2OSAxMC4zNDMxIDEzIDEyIDEzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xMiAyMkMxNiAxOCAyMCAxNC40MTgzIDIwIDEwQzIwIDUuNTgxNzIgMTYuNDE4MyAyIDEyIDJDNy41ODE3MiAyIDQgNS41ODE3MiA0IDEwQzQgMTQuNDE4MyA4IDE4IDEyIDIyWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgPCEtLSAjcmVnaW9uIHJlYWRvbmx5IC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5pc1JlYWRvbmx5XCI+XHJcbiAgICAgICAgPGEgaHJlZj1cInt7bWFwQXV0b0NvbXBsZXRlTW9kZWwuZ29vZ2xlTWFwc1VSTH19XCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3ttYXBBdXRvQ29tcGxldGVNb2RlbC50ZXh0fX08L2E+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInN1YnRleHQtY29udGFpbmVyXCIgKm5nSWY9XCIhb3B0aW9ucy5pc1JlYWRvbmx5XCI+XHJcbiAgICAgIDwhLS0gTGFiZWxEZXNjcmlwdGlvbi0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmJzZi1jb250cm9sLWRlc2NcIiAqbmdJZj1cIm9wdGlvbnMubGFiZWxEZXNjcmlwdGlvbiE9bnVsbFwiPnt7b3B0aW9ucy5sYWJlbERlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgICAgPCEtLSByZXF1aXJlZFRleHQtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvblwiICpuZ0lmPVwiKG1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLmludmFsaWQgJiYgbWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAgICB7e2dldEVycm9yVmFsaWRhdGlvbihtYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5lcnJvcnN8a2V5dmFsdWUpfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiKGdyb3VwLnZhbGlkJiZncm91cC5kaXJ0eSYmZ3JvdXAudG91Y2hlZCApfHwoZ3JvdXAudW50b3VjaGVkJiZncm91cC5pbnZhbGlkJiZncm91cC5kaXJ0eSlcIj5cclxuICAgICAge3tyZXNldEVycm9yKCl9fSA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgaWQ9XCJtZGxTYW1wbGVcIiBjbGFzcz1cIm1vZGFsIGJic2YtY3JvcHBlci1tb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBbbmdDbGFzc109XCJ7J2Jic2YtYmx1cic6IG1vZGFsSXNPcGVufVwiXHJcbiAgICBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiBtb2RhbElzT3BlbiA/ICdibG9jaycgOiAnbm9uZScsICdvcGFjaXR5JzogMX1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxyXG4gICAgICAgICAgICB7e3RyYW5zbGF0ZVZhbHVlKCdTZXRMb2NhdGlvbk9uTWFwJyl9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwiY2xvc2VNYXBNb2RhbCgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0zIG1iLTNcIiBpZD1cInNldExvY2F0aW9uU2VhcmNoXCIgI3NldExvY2F0aW9uU2VhcmNoIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e3RyYW5zbGF0ZVZhbHVlKCdTZXRMb2NhdGlvbicpfX1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb29nbGUtbWFwLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8Z29vZ2xlLW1hcCBbem9vbV09XCJ6b29tTGV2ZWxcIiBbY2VudGVyXT1cIm1hcENlbnRlclwiIFt3aWR0aF09XCJudWxsXCIgW2hlaWdodF09XCJudWxsXCIgI2dvb2dsZU1hcCAobWFwQ2xpY2spPVwib25NYXBDbGljaygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPG1hcC1tYXJrZXIgW3Bvc2l0aW9uXT1cIm1hcmtlclBvc2l0aW9uXCIgW29wdGlvbnNdPVwibWFya2VyT3B0aW9uc1wiPjwvbWFwLW1hcmtlcj5cclxuICAgICAgICAgICAgPC9nb29nbGUtbWFwPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cIihvcHRpb25zLnZhbGlkYXRlTG9jYXRpb25XaXRoaW5DaXR5ICYmIG9wdGlvbnMuY2l0eSAmJiBpbnZhbGlkTG9jYXRpb25XaXRoaW5DaXR5KVwiPlxyXG4gICAgICAgICAgICB7e3RyYW5zbGF0ZVZhbHVlKCdJbnZhbGlkTG9jYXRpb25XaXRoaW5DaXR5JykucmVwbGFjZSgnezB9Jywgb3B0aW9ucy5jaXR5KX19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0XCIgKGNsaWNrKT1cImNsb3NlTWFwTW9kYWwoKVwiPlxyXG4gICAgICAgICAgICB7e3RyYW5zbGF0ZVZhbHVlKFwiQ2FuY2VsXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1icmFuZFwiIChjbGljayk9XCJzdWJtaXRTZXRMb2NhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIHt7dHJhbnNsYXRlVmFsdWUoJ0NvbmZpcm0nKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvbmctY29udGFpbmVyPiJdfQ==
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBc0IsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckwsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBcUMsV0FBVyxFQUFpQyxVQUFVLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0osT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFpQixrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUt2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7O0FBZ0I1RSxNQUFNLE9BQU8sd0JBQXdCO2FBQzVCLDJCQUFzQixHQUFHLElBQUksQUFBUCxDQUFRO0lBRXJDLFlBQW9CLE1BQWMsRUFBVSxjQUE4QixFQUFzQixnQkFBa0Ms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R0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUN4RSxPQUFPO2FBQ1I7U0FDRjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUNuQixPQUFPO1FBRVQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQzsrR0F6Z0JVLHdCQUF3QjttR0FBeEIsd0JBQXdCLGtlQzVCckMsMjFKQTBGZSwyQ0R0RVgsWUFBWSxnWEFDWixXQUFXLDBMQUNYLG1CQUFtQiwrS0FDbkIsa0JBQWtCLDhCQUNsQixnQkFBZ0I7OzRGQUlQLHdCQUF3QjtrQkFkcEMsU0FBUzsrQkFDRSxzQkFBc0IsaUJBRWpCLGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3FCQUNqQixXQUNRLENBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUM7OzBCQUswQixRQUFROzBPQWM1RSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQzJDLGdCQUFnQjtzQkFBakUsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNTLGdCQUFnQjtzQkFBakUsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0csaUJBQWlCO3NCQUFuRSxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3B0aW9uYWwsIE5nWm9uZSwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5PX0VSUk9SU19TQ0hFTUEgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sQ29udGFpbmVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3JtR3JvdXBEaXJlY3RpdmUsIFZhbGlkYXRvcnMsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBHb29nbGVNYXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZ29vZ2xlLW1hcHMnO1xyXG5pbXBvcnQgeyBTY3JpcHRTZXJ2aWNlLCBTY3JpcHRMb2FkZXJNb2R1bGUgfSBmcm9tICduZ3gtc2NyaXB0LWxvYWRlcic7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgQkJTRlRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMvdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLCBVdGlsaXR5U2VydmljZSB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcy91aSc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgTWFwQXV0b0NvbXBsZXRlT3B0aW9ucyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvTWFwQXV0b0NvbXBsZXRlT3B0aW9ucyc7XHJcbmltcG9ydCB7IE1hcEF1dG9jb21wbGV0ZURUTyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvTWFwQXV0b2NvbXBsZXRlRFRPJztcclxuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvR2xvYmFsU2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE1hcFNlYXJjaFR5cGVzLCBNYXBab29tTGV2ZWwgfSBmcm9tICcuLi8uLi9TaGFyZWQvRW51bXMvbWFwLWVudW1zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1NYXBBdXRvQ29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9NYXBBdXRvQ29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBTY3JpcHRMb2FkZXJNb2R1bGUsXHJcbiAgICBHb29nbGVNYXBzTW9kdWxlXHJcbiAgXSxcclxuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgTk9fRVJST1JTX1NDSEVNQV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hcEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgc3RhdGljIGNvbnRyb2xDb250YWluZXJTdGF0aWMgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGNvbnRyb2xVdGlsaXR5OiBDb250cm9sVXRpbGl0eSwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxyXG4gICAgcHVibGljIG1hcEF1dG9Db21wbGV0ZUNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsIHByaXZhdGUgVXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIHRyYW5zbGF0ZTogQkJTRlRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbnRyb2xWYWxpZGF0aW9uU2VydmljZTogQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLCBwcml2YXRlIGdsb2JhbFNldHRpbmdzOiBHbG9iYWxTZXR0aW5ncywgcHJpdmF0ZSBzY3JpcHRTZXJ2aWNlOiBTY3JpcHRTZXJ2aWNlKSB7XHJcblxyXG4gICAgTWFwQXV0b0NvbXBsZXRlQ29tcG9uZW50LmNvbnRyb2xDb250YWluZXJTdGF0aWMgPSB0aGlzLmNvbnRyb2xDb250YWluZXI7XHJcbiAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZSA9IHRyYW5zbGF0ZS5jdXJyZW50TGFuZyAhPSB1bmRlZmluZWQgPyB0cmFuc2xhdGUuY3VycmVudExhbmcgOiB0cmFuc2xhdGUuZGVmYXVsdExhbmc7XHJcblxyXG4gICAgdGhpcy5zY3JpcHRTZXJ2aWNlLmxvYWRTY3JpcHQoYGh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9JHtlbnZpcm9ubWVudC5CQlNGX0dvb2dsZU1hcEtleX0mbGlicmFyaWVzPXBsYWNlc2ApXHJcbiAgICAgIC5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93TWFwID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1hcFNjcmlwdExvYWRlZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgb3B0aW9uczogTWFwQXV0b0NvbXBsZXRlT3B0aW9ucztcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZChcIm1hcFNlYXJjaFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIHNlYXJjaEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcImFkdmFuY2VkTWFwTW9kYWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGFkdmFuY2VkTWFwTW9kYWw6IGFueTtcclxuICBAVmlld0NoaWxkKFwic2V0TG9jYXRpb25TZWFyY2hcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldExvY2F0aW9uU2VhcmNoOiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICBtYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIG1hcEF1dG9Db21wbGV0ZU1vZGVsOiBNYXBBdXRvY29tcGxldGVEVE8gPSBuZXcgTWFwQXV0b2NvbXBsZXRlRFRPKCk7XHJcbiAgY3VycmVudExhbmd1YWdlOiBzdHJpbmcgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpO1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB2YWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICB2YWxpZGF0aW9uUnVsZXNBc3luYyA9IFtdO1xyXG4gIGludmFsaWRMb2NhdGlvbldpdGhpbkNpdHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB6b29tTGV2ZWw6IG51bWJlciA9IE1hcFpvb21MZXZlbC5DaXR5O1xyXG5cclxuICBzaG93TWFwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWFya2VyUG9zaXRpb246IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWw7XHJcbiAgbWFwQ2VudGVyOiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsO1xyXG4gIG1vZGFsSXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWFya2VyT3B0aW9uczogZ29vZ2xlLm1hcHMuTWFya2VyT3B0aW9ucztcclxuXHJcbiAgcGxhY2U6IGFueTtcclxuICBzZWxlY3RlZFBpbjogYW55O1xyXG5cclxuICAvLyNyZWdpb24gZXZlbnRzXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuaXNDcmVhdGVkQmVmb3IgPSBmYWxzZTtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwgPSBuZXcgTWFwQXV0b2NvbXBsZXRlRFRPKCk7XHJcblxyXG4gICAgdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgPSBldmVudC5sYW5nO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy56b29tKVxyXG4gICAgICB0aGlzLnpvb21MZXZlbCA9IHRoaXMub3B0aW9ucy56b29tO1xyXG4gICAgdGhpcy5pbml0aWFsaXplQ29udHJvbE9wdGlvbnMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy52YWx1ZT8udGV4dClcclxuICAgICAgdGhpcy5zZXRBZGRyZXNzKCk7XHJcblxyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVDb250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3QgIT0gbnVsbCkge1xyXG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5uYW1lKTtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVMaXN0W2luZGV4XS5rZXksIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVMaXN0W2luZGV4XS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHZhciBlbGVtZW50SFRNTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5uYW1lKSBhcyBhbnk7XHJcbiAgICBpZiAoZWxlbWVudEhUTUwpXHJcbiAgICAgIGVsZW1lbnRIVE1MLnZhbHVlID0gdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC50ZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5yZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH07XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvclZhbGlkYXRpb24oRXJyb3JMaXN0KSB7XHJcbiAgICBpZiAodGhpcy5tYXJrQWxsQXNUb3VjaGVkICYmIHRoaXMuZ3JvdXAuaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnNob3dHbG9iYWxFcnJvcigpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKEVycm9yTGlzdCwgdGhpcy5ncm91cCwgdGhpcy5vcHRpb25zKTtcclxuICB9XHJcblxyXG4gIEF1dG9jb21wbGV0ZVNlbGVjdGVkKHJlc3VsdDogZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlUmVzdWx0KSB7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsID09IG5ldyBNYXBBdXRvY29tcGxldGVEVE8oKTtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwudGV4dCA9IHJlc3VsdC5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwucGxhY2VJRCA9IHJlc3VsdC5wbGFjZV9pZDtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwuZ29vZ2xlTWFwc1VSTCA9IHJlc3VsdC51cmw7XHJcbiAgfVxyXG5cclxuICBMb2NhdGlvblNlbGVjdGVkKGxvY2F0aW9uKSB7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxhdGl0dWRlID0gbG9jYXRpb24ubGF0aXR1ZGU7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxvbmdpdHVkZSA9IGxvY2F0aW9uLmxvbmdpdHVkZTtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XHJcblxyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsKTtcclxuICAgIGxldCBvcmlnaW5hbFZhbHVlID0gdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC52YWx1ZTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiAmJiB0aGlzLm9wdGlvbnMucGF0Y2hQYXRoICYmIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXRjaENvbnRyb2xWYWx1ZShvcmlnaW5hbFZhbHVlLCB0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiwgdGhpcy5vcHRpb25zLnBhdGNoUGF0aCk7XHJcbiAgICB9XHJcbiAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWw7XHJcbiAgfVxyXG5cclxuICBHZXJtYW5BZGRyZXNzTWFwcGVkKHJlc3VsdCkge1xyXG4gICAgaWYgKHJlc3VsdC50eXBlKSB7XHJcbiAgICAgIGlmIChyZXN1bHQudGFyZ2V0LnZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMubmFtZV0uc2V0VmFsdWUocmVzdWx0KTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCA9PSBuZXcgTWFwQXV0b2NvbXBsZXRlRFRPKCk7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLnRleHQgPSByZXN1bHQuZGlzcGxheUFkZHJlc3M7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLnBsYWNlSUQgPSByZXN1bHQucGxhY2VJRDtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwuZ29vZ2xlTWFwc1VSTCA9IHJlc3VsdC51cmw7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxhdGl0dWRlID0gcmVzdWx0Lmdlb0xvY2F0aW9uLmxhdDtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwubG9uZ2l0dWRlID0gcmVzdWx0Lmdlb0xvY2F0aW9uLmxuZztcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCk7XHJcbiAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5uYW1lXS5zZXRWYWx1ZSh0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsKTtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdCh0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnZhbHVlKTtcclxuICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbDtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBoZWxwZXIgbWV0aG9kc1xyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVDb250cm9sT3B0aW9ucygpIHtcclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMubmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sID0gdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMubmFtZV07XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudmlld1R5cGUpXHJcbiAgICAgIHRoaXMub3B0aW9ucy52aWV3VHlwZSA9IHRoaXMuZ2xvYmFsU2V0dGluZ3Mudmlld1R5cGU7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc1JlcXVpcmVkKVxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubGFiZWxLZXkgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMubGFiZWxLZXkgIT0gXCJcIilcclxuICAgICAgdGhpcy5vcHRpb25zLmxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUodGhpcy5vcHRpb25zLmxhYmVsS2V5KTtcclxuXHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXNBc3luYyk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzRGlzYWJsZWQpXHJcbiAgICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICBsZXQgZ2VybWFuQWRkcmVzcyA9IHtcclxuICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy52YWx1ZS5nb29nbGVNYXBzVVJMLFxyXG4gICAgICAgIHBsYWNlSUQ6IHRoaXMub3B0aW9ucy52YWx1ZS5wbGFjZUlELFxyXG4gICAgICAgIGRpc3BsYXlBZGRyZXNzOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgICBuYW1lOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgICBsb2NhbGl0eToge30sXHJcbiAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgIGNvdW50cnk6IHt9LFxyXG4gICAgICAgIGdlb0xvY2F0aW9uOiB7IGxhdDogLTEsIGxuZzogLTEgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGdlcm1hbkFkZHJlc3MuZ2VvTG9jYXRpb24ubGF0ID0gdGhpcy5vcHRpb25zLnZhbHVlLmxhdGl0dWRlO1xyXG4gICAgICBnZXJtYW5BZGRyZXNzLmdlb0xvY2F0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy52YWx1ZS5sb25naXR1ZGU7XHJcblxyXG4gICAgICB0aGlzLkdlcm1hbkFkZHJlc3NNYXBwZWQoZ2VybWFuQWRkcmVzcyk7XHJcblxyXG4gICAgICB0aGlzLnBsYWNlID0ge1xyXG4gICAgICAgIHVybDogdGhpcy5vcHRpb25zLnZhbHVlLmdvb2dsZU1hcHNVUkwsXHJcbiAgICAgICAgcGxhY2VfaWQ6IHRoaXMub3B0aW9ucy52YWx1ZS5wbGFjZUlELFxyXG4gICAgICAgIGZvcm1hdHRlZF9hZGRyZXNzOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgICBuYW1lOiB0aGlzLm9wdGlvbnMudmFsdWUudGV4dCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuQXV0b2NvbXBsZXRlU2VsZWN0ZWQodGhpcy5wbGFjZSk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLm5hbWVdLnNldFZhbHVlKHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwpO1xyXG4gICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLmN1c3RvbVZhbGlkYXRpb247XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRQbGFjZUF1dG9jb21wbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZU5vbmVBZHZhbmNlZE1hcEF1dG9Db21wbGV0ZSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHsgQXV0b2NvbXBsZXRlIH0gPSBhd2FpdCBnb29nbGUubWFwcy5pbXBvcnRMaWJyYXJ5KFwicGxhY2VzXCIpIGFzIGdvb2dsZS5tYXBzLlBsYWNlc0xpYnJhcnk7XHJcblxyXG4gICAgY29uc3QgYXV0b2NvbXBsZXRlID0gbmV3IEF1dG9jb21wbGV0ZSh0aGlzLnNlYXJjaEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xyXG4gICAgICB0eXBlczogW01hcFNlYXJjaFR5cGVzLkFkZHJlc3NdXHJcbiAgICB9KTtcclxuXHJcbiAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihhdXRvY29tcGxldGUsICdwbGFjZV9jaGFuZ2VkJywgXyA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bihfID0+IHtcclxuICAgICAgICBjb25zdCBwbGFjZSA9IGF1dG9jb21wbGV0ZS5nZXRQbGFjZSgpO1xyXG5cclxuICAgICAgICBpZiAocGxhY2UuZ2VvbWV0cnkpIHtcclxuICAgICAgICAgIGNvbnN0IGdlcm1hbkFkZHJlc3MgPSB7XHJcbiAgICAgICAgICAgIGljb246IHBsYWNlLmljb24sXHJcbiAgICAgICAgICAgIHVybDogcGxhY2UudXJsLFxyXG4gICAgICAgICAgICBwbGFjZUlEOiBwbGFjZS5wbGFjZV9pZCxcclxuICAgICAgICAgICAgZGlzcGxheUFkZHJlc3M6IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzLFxyXG4gICAgICAgICAgICBuYW1lOiBwbGFjZS5uYW1lLFxyXG4gICAgICAgICAgICB2aWNpbml0eTogcGxhY2UudmljaW5pdHksXHJcbiAgICAgICAgICAgIGxvY2FsaXR5OiB7fSxcclxuICAgICAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgICAgICBjb3VudHJ5OiB7fSxcclxuICAgICAgICAgICAgZ2VvTG9jYXRpb246IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBwbGFjZS5hZGRyZXNzX2NvbXBvbmVudHMuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdHJlZXRfbnVtYmVyJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJzdHJlZXROdW1iZXJcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdyb3V0ZScpID4gLTEpIHtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzW1wic3RyZWV0TmFtZVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzc1tcInBvc3RhbENvZGVcIl0gPSBOdW1iZXIodmFsdWUuc2hvcnRfbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N1YmxvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJzdWJsb2NhbGl0eVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignbG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2NvdW50cnknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5jb3VudHJ5W1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmNvdW50cnlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMycpID4gLTEpIHtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLkdlcm1hbkFkZHJlc3NNYXBwZWQoZ2VybWFuQWRkcmVzcyk7XHJcbiAgICAgICAgICB0aGlzLkF1dG9jb21wbGV0ZVNlbGVjdGVkKHBsYWNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFwU2NyaXB0TG9hZGVkKCkge1xyXG4gICAgdGhpcy5nZXRQbGFjZUF1dG9jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlVmFsdWUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaXNMb2NhdGlvbldpdGhpbkNpdHkoY2l0eU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGNpdHlOYW1lID09PSBcIlVtbSBBbCBRdXdhaW5cIilcclxuICAgICAgY2l0eU5hbWUgPSBcIkVtaXJhdGUgb2YgVW1tIEFsIFF1d2FpblwiO1xyXG5cclxuICAgIGxldCBsYXRMbmcgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwubGF0aXR1ZGUsIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwubG9uZ2l0dWRlKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFBpbikge1xyXG4gICAgICBsZXQgbG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkUGluLmdlb0xvY2F0aW9uO1xyXG4gICAgICBsYXRMbmcgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxvY2F0aW9uLmxhdCwgbG9jYXRpb24ubG5nKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5vbk1hcENsaWNrKDxnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50PnsgbGF0TG5nOiBsYXRMbmcgfSk7XHJcblxyXG4gICAgY29uc3QgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBnZW9jb2Rlci5nZW9jb2RlKHsgbG9jYXRpb246IGxhdExuZyB9LCAocmVzdWx0cywgc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0sgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBlbWlyYXRlQ29tcG9uZW50ID0gcmVzdWx0c1swXS5hZGRyZXNzX2NvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT5cclxuICAgICAgICAgICAgY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKCdhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzEnKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAoZW1pcmF0ZUNvbXBvbmVudCAmJiBlbWlyYXRlQ29tcG9uZW50LmxvbmdfbmFtZS50b0xvd2VyQ2FzZSgpID09PSBjaXR5TmFtZS50b0xvd2VyQ2FzZSgpKSByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0R2VvY29kZXIoYWRkcmVzczogc3RyaW5nLCBhZG1pbmlzdHJhdGl2ZUFyZWE6IHN0cmluZywgY291bnRyeTogc3RyaW5nLCB6b29tOiBudW1iZXIgPSBNYXBab29tTGV2ZWwuQ2l0eSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7XHJcblxyXG4gICAgICBjb25zdCBnZW9jb2RlUmVxdWVzdDogZ29vZ2xlLm1hcHMuR2VvY29kZXJSZXF1ZXN0ID0geyBhZGRyZXNzOiBhZGRyZXNzIH07XHJcbiAgICAgIGlmIChhZG1pbmlzdHJhdGl2ZUFyZWEgJiYgY291bnRyeSkge1xyXG4gICAgICAgIGdlb2NvZGVSZXF1ZXN0LmNvbXBvbmVudFJlc3RyaWN0aW9ucyA9IHtcclxuICAgICAgICAgIGNvdW50cnk6IGNvdW50cnksXHJcbiAgICAgICAgICBhZG1pbmlzdHJhdGl2ZUFyZWE6IGFkbWluaXN0cmF0aXZlQXJlYVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdlb2NvZGVyLmdlb2NvZGUoZ2VvY29kZVJlcXVlc3QsIChyZXN1bHRzLCBzdGF0dXMpID0+IHtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbi50b0pTT04oKTtcclxuICAgICAgICAgIHRoaXMubWFwQ2VudGVyID0gbG9jYXRpb247XHJcbiAgICAgICAgICB0aGlzLm1hcmtlclBvc2l0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLmxhdGl0dWRlID0gbG9jYXRpb24ubGF0O1xyXG4gICAgICAgICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5sb25naXR1ZGUgPSBsb2NhdGlvbi5sbmc7XHJcbiAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLnRleHQgPSByZXN1bHRzWzBdLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG5cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHsgLi4udGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCB9O1xyXG4gICAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMubmFtZV0uc2V0VmFsdWUodGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbCk7XHJcbiAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy56b29tTGV2ZWwgPSB6b29tO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBZGRyZXNzKCkge1xyXG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWRkcmVzcykge1xyXG4gICAgICAgIGxldCBhZGRyZXNzRm91bmQgPSBhd2FpdCB0aGlzLnNldEdlb2NvZGVyLmNhbGwodGhpcywgdGhpcy5vcHRpb25zLmFkZHJlc3MsIHRoaXMub3B0aW9ucy5jaXR5LCB0aGlzLm9wdGlvbnMuY291bnRyeSwgTWFwWm9vbUxldmVsLkJ1aWxkaW5nKTtcclxuICAgICAgICBpZiAoIWFkZHJlc3NGb3VuZCAmJiB0aGlzLm9wdGlvbnMuZW5hYmxlRmFsbGJhY2tBZGRyZXNzKSB7XHJcbiAgICAgICAgICBsZXQgZmFsbGJhY2tBZGRyZXNzRm91bmQgPSBhd2FpdCB0aGlzLnNldEdlb2NvZGVyLmNhbGwodGhpcywgdGhpcy5vcHRpb25zLmNpdHksIHRoaXMub3B0aW9ucy5jaXR5LCB0aGlzLm9wdGlvbnMuY291bnRyeSk7XHJcbiAgICAgICAgICBpZiAoIWZhbGxiYWNrQWRkcmVzc0ZvdW5kKVxyXG4gICAgICAgICAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsID0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZhbGlkYXRlTG9jYXRpb25XaXRoaW5DaXR5KSB7XHJcbiAgICAgICAgY29uc3QgaXNMb2NhdGlvbldpdGhpbkNpdHkgPSBhd2FpdCB0aGlzLmlzTG9jYXRpb25XaXRoaW5DaXR5KHRoaXMub3B0aW9ucy5jaXR5KTtcclxuICAgICAgICBpZiAoIWlzTG9jYXRpb25XaXRoaW5DaXR5KVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmlzTG9jYXRpb25WYWxpZCA9ICEodGhpcy5pbnZhbGlkTG9jYXRpb25XaXRoaW5DaXR5ID0gdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gIC8vI3JlZ2lvbiBhZHZhbmNlZCBtYXAgbWV0aG9kc1xyXG5cclxuICBhc3luYyBvbk1hcENsaWNrKGV2ZW50OiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLmFkZE1hcmtlcihldmVudCk7XHJcblxyXG4gICAgbGV0IGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7XHJcbiAgICBnZW9jb2Rlci5nZW9jb2RlKHsgbG9jYXRpb246IGV2ZW50LmxhdExuZz8udG9KU09OKCkgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICBjb25zdCBwbGFjZSA9IHJlcy5yZXN1bHRzWzBdO1xyXG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2V0TG9jYXRpb25TZWFyY2hcIikgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgaW5wdXQudmFsdWUgPSBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgICAgdGhpcy5zZWxlY3RlZFBpbiA9IHtcclxuICAgICAgICBwbGFjZUlEOiBwbGFjZS5wbGFjZV9pZCxcclxuICAgICAgICBkaXNwbGF5QWRkcmVzczogcGxhY2UuZm9ybWF0dGVkX2FkZHJlc3MsXHJcbiAgICAgICAgZ2VvTG9jYXRpb246IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpLFxyXG4gICAgICAgIHVybDogYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9wbGFjZS8/cT1wbGFjZV9pZDoke3BsYWNlLnBsYWNlX2lkfWAsXHJcbiAgICAgICAgbG9jYWxpdHk6IHt9LFxyXG4gICAgICAgIHN0YXRlOiB7fSxcclxuICAgICAgICBjb3VudHJ5OiB7fSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignc3RyZWV0X251bWJlcicpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJzdHJlZXROdW1iZXJcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncm91dGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wic3RyZWV0TmFtZVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3Bvc3RhbF9jb2RlJykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbltcInBvc3RhbENvZGVcIl0gPSBOdW1iZXIodmFsdWUuc2hvcnRfbmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdWJsb2NhbGl0eScpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJzdWJsb2NhbGl0eVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2xvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5sb2NhbGl0eVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xJykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5zdGF0ZVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLnN0YXRlW1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignY291bnRyeScpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4uY291bnRyeVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmNvdW50cnlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzMnKSA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRNYXJrZXIoZXZlbnQ6IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5sYXRMbmcpXHJcbiAgICAgIHRoaXMubWFya2VyUG9zaXRpb24gPSBldmVudC5sYXRMbmcudG9KU09OKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuTWFwTW9kYWwoKSB7XHJcbiAgICB0aGlzLm1vZGFsSXNPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKCk7XHJcbiAgICB0aGlzLmFkZFNlYXJjaEJveCgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNYXBNb2RhbCgpIHtcclxuICAgIHRoaXMubW9kYWxJc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRMb2NhdGlvbigpIHtcclxuICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHBvc2l0aW9uOiBHZW9sb2NhdGlvblBvc2l0aW9uKSA9PiB7XHJcblxyXG4gICAgICBjb25zdCBwb2ludDogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCA9IHtcclxuICAgICAgICBsYXQ6IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSxcclxuICAgICAgICBsbmc6IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm1hcENlbnRlciA9IHBvaW50O1xyXG5cclxuICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHtcclxuICAgICAgICBsYXQ6IHRoaXMubWFwQ2VudGVyLmxhdCxcclxuICAgICAgICBsbmc6IHRoaXMubWFwQ2VudGVyLmxuZ1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5tYXJrZXJPcHRpb25zID0ge1xyXG4gICAgICAgIGRyYWdnYWJsZTogZmFsc2UsXHJcbiAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFNlYXJjaEJveCgpIHtcclxuICAgIGNvbnN0IHsgQXV0b2NvbXBsZXRlIH0gPSBhd2FpdCBnb29nbGUubWFwcy5pbXBvcnRMaWJyYXJ5KFwicGxhY2VzXCIpIGFzIGdvb2dsZS5tYXBzLlBsYWNlc0xpYnJhcnk7XHJcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2V0TG9jYXRpb25TZWFyY2hcIikgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IHNlYXJjaEJveCA9IG5ldyBBdXRvY29tcGxldGUoaW5wdXQpO1xyXG5cclxuICAgIGdvb2dsZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyKHNlYXJjaEJveCwgXCJwbGFjZV9jaGFuZ2VkXCIsICgpID0+IHtcclxuICAgICAgY29uc3QgcGxhY2UgPSBzZWFyY2hCb3guZ2V0UGxhY2UoKTtcclxuICAgICAgaWYgKHBsYWNlLmdlb21ldHJ5KSB7XHJcbiAgICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpO1xyXG4gICAgICAgIHRoaXMubWFwQ2VudGVyID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24udG9KU09OKCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBpbiA9IHtcclxuICAgICAgICAgIGljb246IHBsYWNlLmljb24sXHJcbiAgICAgICAgICB1cmw6IHBsYWNlLnVybCxcclxuICAgICAgICAgIHBsYWNlSUQ6IHBsYWNlLnBsYWNlX2lkLFxyXG4gICAgICAgICAgZGlzcGxheUFkZHJlc3M6IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzLFxyXG4gICAgICAgICAgbmFtZTogcGxhY2UubmFtZSxcclxuICAgICAgICAgIHZpY2luaXR5OiBwbGFjZS52aWNpbml0eSxcclxuICAgICAgICAgIGxvY2FsaXR5OiB7fSxcclxuICAgICAgICAgIHN0YXRlOiB7fSxcclxuICAgICAgICAgIGNvdW50cnk6IHt9LFxyXG4gICAgICAgICAgZ2VvTG9jYXRpb246IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdHJlZXRfbnVtYmVyJykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wic3RyZWV0TnVtYmVyXCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdyb3V0ZScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbltcInN0cmVldE5hbWVcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJwb3N0YWxDb2RlXCJdID0gTnVtYmVyKHZhbHVlLnNob3J0X25hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N1YmxvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wic3VibG9jYWxpdHlcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignbG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4ubG9jYWxpdHlbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5zdGF0ZVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4uc3RhdGVbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignY291bnRyeScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5jb3VudHJ5W1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5jb3VudHJ5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMycpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGFzeW5jIHN1Ym1pdFNldExvY2F0aW9uKCkge1xyXG4gICAgdGhpcy5vcHRpb25zLmlzTG9jYXRpb25WYWxpZCA9ICEodGhpcy5pbnZhbGlkTG9jYXRpb25XaXRoaW5DaXR5ID0gZmFsc2UpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0ZUxvY2F0aW9uV2l0aGluQ2l0eSAmJiB0aGlzLm9wdGlvbnMuY2l0eSkge1xyXG4gICAgICBjb25zdCBpc0xvY2F0aW9uV2l0aGluQ2l0eSA9IGF3YWl0IHRoaXMuaXNMb2NhdGlvbldpdGhpbkNpdHkodGhpcy5vcHRpb25zLmNpdHkpO1xyXG4gICAgICBpZiAoIWlzTG9jYXRpb25XaXRoaW5DaXR5KSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmlzTG9jYXRpb25WYWxpZCA9ICEodGhpcy5pbnZhbGlkTG9jYXRpb25XaXRoaW5DaXR5ID0gdHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUGluKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5HZXJtYW5BZGRyZXNzTWFwcGVkKHRoaXMuc2VsZWN0ZWRQaW4pO1xyXG4gICAgdGhpcy5jbG9zZU1hcE1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEV4dGVybmFsIE1ldGhvZHNcclxuXHJcbiAgUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5yZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgfTtcclxuICBBZGRSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmFkZFJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKTtcclxuICB9O1xyXG4gIFJlbW92ZUN1c3RvbVZhbGlkYXRpb24gPSAoQ3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5yZW1vdmVDdXN0b21WYWxpZGF0aW9uKHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKTtcclxuICB9O1xyXG4gIEFkZEN1c3RvbVZhbGlkYXRpb24gPSAoQ3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5hZGRDdXN0b21WYWxpZGF0aW9uKHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKTtcclxuICB9O1xyXG4gIElzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmlzVmFsaWQodGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCk7XHJcbiAgfTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbn1cclxuXHJcblxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd01hcFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGJic2YtY29udHJvbCBiYnNmLW1hcHNcIiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cIihvcHRpb25zLnZpZXdUeXBlPT0xKT8nYmJzZi12ZXJ0aWNhbCc6J2Jic2YtaG9yaXpvbnRhbCdcIj5cclxuICAgICAgPGxhYmVsICpuZ0lmPVwiIW9wdGlvbnMuaGlkZUxhYmVsXCIgY2xhc3M9XCJiYnNmLWxhYmVsIHt7b3B0aW9ucy5sYWJlbEV4dHJhQ2xhc3Nlc319XCI+XHJcbiAgICAgICAge3tvcHRpb25zLmxhYmVsVmFsdWV9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiKChvcHRpb25zLnNob3dBc3RlcmlzayYmb3B0aW9ucy5pc1JlcXVpcmVkKXx8KG9wdGlvbnMuaXNSZXF1aXJlZCkpJiYhb3B0aW9ucy5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPlxyXG4gICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgPCEtLSNyZWdpb24gaW5wdXQtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGJic2YtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCIhb3B0aW9ucy5pc1JlYWRvbmx5XCI+XHJcbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LWljb24tbyB7e29wdGlvbnMuZXh0cmFDbGFzc2VzfX1cIiBbdmFsdWVdPVwibWFwQXV0b0NvbXBsZXRlTW9kZWwudGV4dFwiXHJcbiAgICAgICAgICBbYWRkcmVzc109XCJtYXBBdXRvQ29tcGxldGVNb2RlbC50ZXh0XCIgdmFsdWU9XCJ7e21hcEF1dG9Db21wbGV0ZU1vZGVsLnRleHR9fVwiXHJcbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIiBhcmlhLWludmFsaWQ9XCJ0cnVlXCJcclxuICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cIm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLmludmFsaWQgJiYgbWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wudG91Y2hlZFwiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwib3B0aW9ucy5wbGFjZWhvbGRlclwiIFtpZF09XCJvcHRpb25zLm5hbWVcIiAoa2V5dXApPVwiR2VybWFuQWRkcmVzc01hcHBlZCgkZXZlbnQpXCIgI21hcFNlYXJjaCAvPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJvcHRpb25zLnNob3dBZHZhbmNlZE1hcFwiIGNsYXNzPVwiYm9yZGVyLTAgYnRuLXNlY29uZGFyeSBidG4taWNvbi1vXCJcclxuICAgICAgICAgIG5nYlRvb2x0aXA9XCJ7e3RyYW5zbGF0ZVZhbHVlKCdTZXRMb2NhdGlvbicpfX1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9wZW5NYXBNb2RhbCgpXCI+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTEyIDEzQzEzLjY1NjkgMTMgMTUgMTEuNjU2OSAxNSAxMEMxNSA4LjM0MzE1IDEzLjY1NjkgNyAxMiA3QzEwLjM0MzEgNyA5IDguMzQzMTUgOSAxMEM5IDExLjY1NjkgMTAuMzQzMSAxMyAxMiAxM1pcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNMTIgMjJDMTYgMTggMjAgMTQuNDE4MyAyMCAxMEMyMCA1LjU4MTcyIDE2LjQxODMgMiAxMiAyQzcuNTgxNzIgMiA0IDUuNTgxNzIgNCAxMEM0IDE0LjQxODMgOCAxOCAxMiAyMlpcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgIDwhLS0gI3JlZ2lvbiByZWFkb25seSAtLT5cclxuICAgICAgPGRpdiAqbmdJZj1cIm9wdGlvbnMuaXNSZWFkb25seVwiPlxyXG4gICAgICAgIDxhIGhyZWY9XCJ7e21hcEF1dG9Db21wbGV0ZU1vZGVsLmdvb2dsZU1hcHNVUkx9fVwiIHRhcmdldD1cIl9ibGFua1wiPnt7bWFwQXV0b0NvbXBsZXRlTW9kZWwudGV4dH19PC9hPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzdWJ0ZXh0LWNvbnRhaW5lclwiICpuZ0lmPVwiIW9wdGlvbnMuaXNSZWFkb25seVwiPlxyXG4gICAgICA8IS0tIExhYmVsRGVzY3JpcHRpb24tLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImJic2YtY29udHJvbC1kZXNjXCIgKm5nSWY9XCJvcHRpb25zLmxhYmVsRGVzY3JpcHRpb24hPW51bGxcIj57e29wdGlvbnMubGFiZWxEZXNjcmlwdGlvbn19PC9kaXY+XHJcbiAgICAgIDwhLS0gcmVxdWlyZWRUZXh0LS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb25cIiAqbmdJZj1cIihtYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5pbnZhbGlkICYmIG1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnRvdWNoZWQpXCI+XHJcbiAgICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24obWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuZXJyb3JzfGtleXZhbHVlKX19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpXCI+XHJcbiAgICAgIHt7cmVzZXRFcnJvcigpfX0gPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGlkPVwibWRsU2FtcGxlXCIgY2xhc3M9XCJtb2RhbCBiYnNmLWNyb3BwZXItbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgW25nQ2xhc3NdPVwieydiYnNmLWJsdXInOiBtb2RhbElzT3Blbn1cIlxyXG4gICAgW25nU3R5bGVdPVwieydkaXNwbGF5JzogbW9kYWxJc09wZW4gPyAnYmxvY2snIDogJ25vbmUnLCAnb3BhY2l0eSc6IDF9XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5cclxuICAgICAgICAgICAge3t0cmFuc2xhdGVWYWx1ZSgnU2V0TG9jYXRpb25Pbk1hcCcpfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cImNsb3NlTWFwTW9kYWwoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtMyBtYi0zXCIgaWQ9XCJzZXRMb2NhdGlvblNlYXJjaFwiICNzZXRMb2NhdGlvblNlYXJjaCB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3t0cmFuc2xhdGVWYWx1ZSgnU2V0TG9jYXRpb24nKX19XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29vZ2xlLW1hcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGdvb2dsZS1tYXAgW3pvb21dPVwiem9vbUxldmVsXCIgW2NlbnRlcl09XCJtYXBDZW50ZXJcIiBbd2lkdGhdPVwibnVsbFwiIFtoZWlnaHRdPVwibnVsbFwiICNnb29nbGVNYXAgKG1hcENsaWNrKT1cIm9uTWFwQ2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDxtYXAtbWFya2VyIFtwb3NpdGlvbl09XCJtYXJrZXJQb3NpdGlvblwiIFtvcHRpb25zXT1cIm1hcmtlck9wdGlvbnNcIj48L21hcC1tYXJrZXI+XHJcbiAgICAgICAgICAgIDwvZ29vZ2xlLW1hcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCIob3B0aW9ucy52YWxpZGF0ZUxvY2F0aW9uV2l0aGluQ2l0eSAmJiBvcHRpb25zLmNpdHkgJiYgaW52YWxpZExvY2F0aW9uV2l0aGluQ2l0eSlcIj5cclxuICAgICAgICAgICAge3t0cmFuc2xhdGVWYWx1ZSgnSW52YWxpZExvY2F0aW9uV2l0aGluQ2l0eScpLnJlcGxhY2UoJ3swfScsIG9wdGlvbnMuY2l0eSl9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodFwiIChjbGljayk9XCJjbG9zZU1hcE1vZGFsKClcIj5cclxuICAgICAgICAgICAge3t0cmFuc2xhdGVWYWx1ZShcIkNhbmNlbFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tYnJhbmRcIiAoY2xpY2spPVwic3VibWl0U2V0TG9jYXRpb24oKVwiPlxyXG4gICAgICAgICAgICB7e3RyYW5zbGF0ZVZhbHVlKCdDb25maXJtJyl9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L25nLWNvbnRhaW5lcj4iXX0=