angular-slickgrid 5.0.2 → 5.1.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 (207) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +182 -181
  3. package/app/modules/angular-slickgrid/components/angular-slickgrid.component.d.ts +3 -2
  4. package/app/modules/angular-slickgrid/models/angularGridInstance.interface.d.ts +3 -0
  5. package/esm2020/app/modules/angular-slickgrid/components/angular-slickgrid.component.mjs +21 -7
  6. package/esm2020/app/modules/angular-slickgrid/constants.mjs +1 -1
  7. package/esm2020/app/modules/angular-slickgrid/extensions/index.mjs +1 -1
  8. package/esm2020/app/modules/angular-slickgrid/extensions/slickRowDetailView.mjs +3 -3
  9. package/esm2020/app/modules/angular-slickgrid/global-grid-options.mjs +1 -1
  10. package/esm2020/app/modules/angular-slickgrid/index.mjs +1 -1
  11. package/esm2020/app/modules/angular-slickgrid/models/angularComponentOutput.interface.mjs +1 -1
  12. package/esm2020/app/modules/angular-slickgrid/models/angularGridInstance.interface.mjs +1 -1
  13. package/esm2020/app/modules/angular-slickgrid/models/externalTestingDependencies.interface.mjs +1 -1
  14. package/esm2020/app/modules/angular-slickgrid/models/gridOption.interface.mjs +1 -1
  15. package/esm2020/app/modules/angular-slickgrid/models/index.mjs +1 -1
  16. package/esm2020/app/modules/angular-slickgrid/models/rowDetailView.interface.mjs +1 -1
  17. package/esm2020/app/modules/angular-slickgrid/models/slickGrid.interface.mjs +1 -1
  18. package/esm2020/app/modules/angular-slickgrid/modules/angular-slickgrid.module.mjs +5 -5
  19. package/esm2020/app/modules/angular-slickgrid/services/angularUtil.service.mjs +4 -4
  20. package/esm2020/app/modules/angular-slickgrid/services/container.service.mjs +4 -4
  21. package/esm2020/app/modules/angular-slickgrid/services/index.mjs +1 -1
  22. package/esm2020/app/modules/angular-slickgrid/services/translater.service.mjs +4 -4
  23. package/esm2020/app/modules/angular-slickgrid/services/utilities.mjs +1 -1
  24. package/esm2020/app/modules/angular-slickgrid/slickgrid-config.mjs +1 -1
  25. package/esm2020/public_api.mjs +1 -1
  26. package/fesm2015/angular-slickgrid.mjs +35 -21
  27. package/fesm2015/angular-slickgrid.mjs.map +1 -1
  28. package/fesm2020/angular-slickgrid.mjs +35 -21
  29. package/fesm2020/angular-slickgrid.mjs.map +1 -1
  30. package/i18n/en.json +90 -90
  31. package/i18n/fr.json +91 -91
  32. package/package.json +10 -10
  33. package/test/cypress/node_modules/@4tw/cypress-drag-drop/README.md +169 -0
  34. package/test/cypress/node_modules/@cypress/request/README.md +1038 -0
  35. package/test/cypress/node_modules/@cypress/xvfb/README.md +48 -0
  36. package/test/cypress/node_modules/@cypress/xvfb/node_modules/debug/README.md +437 -0
  37. package/test/cypress/node_modules/@types/node/README.md +16 -0
  38. package/test/cypress/node_modules/@types/sinonjs__fake-timers/README.md +16 -0
  39. package/test/cypress/node_modules/@types/sizzle/README.md +16 -0
  40. package/test/cypress/node_modules/@types/yauzl/README.md +16 -0
  41. package/test/cypress/node_modules/@types/yauzl/node_modules/@types/node/README.md +16 -0
  42. package/test/cypress/node_modules/aggregate-error/README.md +61 -0
  43. package/test/cypress/node_modules/ansi-colors/README.md +315 -0
  44. package/test/cypress/node_modules/ansi-escapes/README.md +245 -0
  45. package/test/cypress/node_modules/ansi-regex/README.md +78 -0
  46. package/test/cypress/node_modules/ansi-styles/README.md +152 -0
  47. package/test/cypress/node_modules/arch/README.md +71 -0
  48. package/test/cypress/node_modules/asn1/README.md +50 -0
  49. package/test/cypress/node_modules/assert-plus/README.md +162 -0
  50. package/test/cypress/node_modules/astral-regex/README.md +46 -0
  51. package/test/cypress/node_modules/async/README.md +60 -0
  52. package/test/cypress/node_modules/asynckit/README.md +233 -0
  53. package/test/cypress/node_modules/at-least-node/README.md +25 -0
  54. package/test/cypress/node_modules/aws-sign2/README.md +4 -0
  55. package/test/cypress/node_modules/aws4/README.md +183 -0
  56. package/test/cypress/node_modules/balanced-match/README.md +91 -0
  57. package/test/cypress/node_modules/base64-js/README.md +34 -0
  58. package/test/cypress/node_modules/bcrypt-pbkdf/README.md +45 -0
  59. package/test/cypress/node_modules/blob-util/README.md +623 -0
  60. package/test/cypress/node_modules/bluebird/README.md +57 -0
  61. package/test/cypress/node_modules/brace-expansion/README.md +129 -0
  62. package/test/cypress/node_modules/buffer/README.md +410 -0
  63. package/test/cypress/node_modules/buffer-crc32/README.md +47 -0
  64. package/test/cypress/node_modules/cachedir/README.md +27 -0
  65. package/test/cypress/node_modules/caseless/README.md +45 -0
  66. package/test/cypress/node_modules/chalk/README.md +293 -0
  67. package/test/cypress/node_modules/chalk/node_modules/supports-color/README.md +76 -0
  68. package/test/cypress/node_modules/check-more-types/README.md +952 -0
  69. package/test/cypress/node_modules/ci-info/README.md +114 -0
  70. package/test/cypress/node_modules/clean-stack/README.md +76 -0
  71. package/test/cypress/node_modules/cli-cursor/README.md +55 -0
  72. package/test/cypress/node_modules/cli-table3/README.md +218 -0
  73. package/test/cypress/node_modules/cli-truncate/README.md +139 -0
  74. package/test/cypress/node_modules/color-convert/README.md +68 -0
  75. package/test/cypress/node_modules/color-name/README.md +11 -0
  76. package/test/cypress/node_modules/colorette/README.md +102 -0
  77. package/test/cypress/node_modules/colors/README.md +221 -0
  78. package/test/cypress/node_modules/combined-stream/README.md +138 -0
  79. package/test/cypress/node_modules/commander/README.md +737 -0
  80. package/test/cypress/node_modules/common-tags/README.md +687 -0
  81. package/test/cypress/node_modules/core-util-is/README.md +3 -0
  82. package/test/cypress/node_modules/cross-spawn/README.md +96 -0
  83. package/test/cypress/node_modules/cypress/README.md +25 -0
  84. package/test/cypress/node_modules/cypress/angular/README.md +10 -0
  85. package/test/cypress/node_modules/cypress/mount-utils/README.md +140 -0
  86. package/test/cypress/node_modules/cypress/react/README.md +14 -0
  87. package/test/cypress/node_modules/cypress/react18/README.md +7 -0
  88. package/test/cypress/node_modules/cypress/svelte/README.md +15 -0
  89. package/test/cypress/node_modules/cypress/vue/README.md +14 -0
  90. package/test/cypress/node_modules/cypress/vue2/README.md +7 -0
  91. package/test/cypress/node_modules/dashdash/README.md +574 -0
  92. package/test/cypress/node_modules/dayjs/README.md +128 -0
  93. package/test/cypress/node_modules/debug/README.md +455 -0
  94. package/test/cypress/node_modules/delayed-stream/README.md +141 -0
  95. package/test/cypress/node_modules/ecc-jsbn/README.md +8 -0
  96. package/test/cypress/node_modules/emoji-regex/README.md +73 -0
  97. package/test/cypress/node_modules/end-of-stream/README.md +54 -0
  98. package/test/cypress/node_modules/enquirer/README.md +1752 -0
  99. package/test/cypress/node_modules/escape-string-regexp/README.md +27 -0
  100. package/test/cypress/node_modules/eventemitter2/README.md +809 -0
  101. package/test/cypress/node_modules/execa/README.md +656 -0
  102. package/test/cypress/node_modules/executable/README.md +64 -0
  103. package/test/cypress/node_modules/extend/README.md +81 -0
  104. package/test/cypress/node_modules/extract-zip/README.md +57 -0
  105. package/test/cypress/node_modules/extract-zip/node_modules/debug/README.md +455 -0
  106. package/test/cypress/node_modules/extsprintf/README.md +46 -0
  107. package/test/cypress/node_modules/fd-slicer/README.md +199 -0
  108. package/test/cypress/node_modules/figures/README.md +139 -0
  109. package/test/cypress/node_modules/forever-agent/README.md +4 -0
  110. package/test/cypress/node_modules/form-data/README.md +234 -0
  111. package/test/cypress/node_modules/fs-extra/README.md +264 -0
  112. package/test/cypress/node_modules/fs.realpath/README.md +33 -0
  113. package/test/cypress/node_modules/get-stream/README.md +124 -0
  114. package/test/cypress/node_modules/getos/README.md +79 -0
  115. package/test/cypress/node_modules/getpass/README.md +32 -0
  116. package/test/cypress/node_modules/glob/README.md +375 -0
  117. package/test/cypress/node_modules/global-dirs/README.md +72 -0
  118. package/test/cypress/node_modules/graceful-fs/README.md +133 -0
  119. package/test/cypress/node_modules/has-flag/README.md +89 -0
  120. package/test/cypress/node_modules/http-signature/README.md +80 -0
  121. package/test/cypress/node_modules/human-signals/README.md +155 -0
  122. package/test/cypress/node_modules/ieee754/README.md +51 -0
  123. package/test/cypress/node_modules/indent-string/README.md +70 -0
  124. package/test/cypress/node_modules/inflight/README.md +37 -0
  125. package/test/cypress/node_modules/inherits/README.md +42 -0
  126. package/test/cypress/node_modules/ini/README.md +102 -0
  127. package/test/cypress/node_modules/is-ci/README.md +50 -0
  128. package/test/cypress/node_modules/is-fullwidth-code-point/README.md +39 -0
  129. package/test/cypress/node_modules/is-installed-globally/README.md +31 -0
  130. package/test/cypress/node_modules/is-path-inside/README.md +63 -0
  131. package/test/cypress/node_modules/is-stream/README.md +57 -0
  132. package/test/cypress/node_modules/is-typedarray/README.md +16 -0
  133. package/test/cypress/node_modules/isexe/README.md +51 -0
  134. package/test/cypress/node_modules/isstream/README.md +66 -0
  135. package/test/cypress/node_modules/jsbn/README.md +175 -0
  136. package/test/cypress/node_modules/json-schema/README.md +3 -0
  137. package/test/cypress/node_modules/json-stringify-safe/README.md +52 -0
  138. package/test/cypress/node_modules/jsonfile/README.md +205 -0
  139. package/test/cypress/node_modules/jsonfile/node_modules/universalify/README.md +76 -0
  140. package/test/cypress/node_modules/jsprim/README.md +287 -0
  141. package/test/cypress/node_modules/lazy-ass/README.md +269 -0
  142. package/test/cypress/node_modules/listr2/README.md +17 -0
  143. package/test/cypress/node_modules/lodash/README.md +39 -0
  144. package/test/cypress/node_modules/lodash.once/README.md +18 -0
  145. package/test/cypress/node_modules/log-symbols/README.md +51 -0
  146. package/test/cypress/node_modules/log-update/README.md +97 -0
  147. package/test/cypress/node_modules/log-update/node_modules/slice-ansi/README.md +66 -0
  148. package/test/cypress/node_modules/log-update/node_modules/wrap-ansi/README.md +97 -0
  149. package/test/cypress/node_modules/lru-cache/README.md +166 -0
  150. package/test/cypress/node_modules/merge-stream/README.md +78 -0
  151. package/test/cypress/node_modules/mime-db/README.md +102 -0
  152. package/test/cypress/node_modules/mime-types/README.md +123 -0
  153. package/test/cypress/node_modules/mimic-fn/README.md +69 -0
  154. package/test/cypress/node_modules/minimatch/README.md +209 -0
  155. package/test/cypress/node_modules/ms/README.md +60 -0
  156. package/test/cypress/node_modules/npm-run-path/README.md +115 -0
  157. package/test/cypress/node_modules/once/README.md +79 -0
  158. package/test/cypress/node_modules/onetime/README.md +94 -0
  159. package/test/cypress/node_modules/ospath/README.md +53 -0
  160. package/test/cypress/node_modules/p-map/README.md +89 -0
  161. package/test/cypress/node_modules/path-is-absolute/README.md +59 -0
  162. package/test/cypress/node_modules/path-key/README.md +61 -0
  163. package/test/cypress/node_modules/pend/README.md +41 -0
  164. package/test/cypress/node_modules/performance-now/README.md +30 -0
  165. package/test/cypress/node_modules/pify/README.md +119 -0
  166. package/test/cypress/node_modules/pretty-bytes/README.md +131 -0
  167. package/test/cypress/node_modules/proxy-from-env/README.md +131 -0
  168. package/test/cypress/node_modules/psl/README.md +215 -0
  169. package/test/cypress/node_modules/pump/README.md +65 -0
  170. package/test/cypress/node_modules/punycode/README.md +122 -0
  171. package/test/cypress/node_modules/qs/README.md +475 -0
  172. package/test/cypress/node_modules/request-progress/README.md +78 -0
  173. package/test/cypress/node_modules/restore-cursor/README.md +26 -0
  174. package/test/cypress/node_modules/rimraf/README.md +101 -0
  175. package/test/cypress/node_modules/rxjs/README.md +147 -0
  176. package/test/cypress/node_modules/rxjs/_esm2015/README.md +147 -0
  177. package/test/cypress/node_modules/rxjs/_esm5/README.md +147 -0
  178. package/test/cypress/node_modules/rxjs/src/README.md +147 -0
  179. package/test/cypress/node_modules/safe-buffer/README.md +584 -0
  180. package/test/cypress/node_modules/safer-buffer/README.md +156 -0
  181. package/test/cypress/node_modules/semver/README.md +566 -0
  182. package/test/cypress/node_modules/shebang-command/README.md +34 -0
  183. package/test/cypress/node_modules/shebang-regex/README.md +33 -0
  184. package/test/cypress/node_modules/signal-exit/README.md +39 -0
  185. package/test/cypress/node_modules/slice-ansi/README.md +72 -0
  186. package/test/cypress/node_modules/sshpk/README.md +804 -0
  187. package/test/cypress/node_modules/string-width/README.md +50 -0
  188. package/test/cypress/node_modules/strip-ansi/README.md +46 -0
  189. package/test/cypress/node_modules/strip-final-newline/README.md +30 -0
  190. package/test/cypress/node_modules/supports-color/README.md +77 -0
  191. package/test/cypress/node_modules/throttleit/README.md +32 -0
  192. package/test/cypress/node_modules/tmp/README.md +365 -0
  193. package/test/cypress/node_modules/tough-cookie/README.md +527 -0
  194. package/test/cypress/node_modules/tslib/README.md +142 -0
  195. package/test/cypress/node_modules/tunnel-agent/README.md +4 -0
  196. package/test/cypress/node_modules/tweetnacl/README.md +459 -0
  197. package/test/cypress/node_modules/type-fest/README.md +760 -0
  198. package/test/cypress/node_modules/universalify/README.md +76 -0
  199. package/test/cypress/node_modules/untildify/README.md +30 -0
  200. package/test/cypress/node_modules/uuid/README.md +505 -0
  201. package/test/cypress/node_modules/verror/README.md +528 -0
  202. package/test/cypress/node_modules/verror/node_modules/extsprintf/README.md +46 -0
  203. package/test/cypress/node_modules/which/README.md +54 -0
  204. package/test/cypress/node_modules/wrap-ansi/README.md +91 -0
  205. package/test/cypress/node_modules/wrappy/README.md +36 -0
  206. package/test/cypress/node_modules/yallist/README.md +204 -0
  207. package/test/cypress/node_modules/yauzl/README.md +658 -0
@@ -4,7 +4,7 @@ import 'slickgrid/dist/slick.interactions.min';
4
4
  import 'slickgrid/dist/slick.grid.min';
5
5
  import 'slickgrid/dist/slick.dataview.min';
6
6
  // ...then everything else...
7
- import { ApplicationRef, Component, Inject, Input, Optional, } from '@angular/core';
7
+ import { ApplicationRef, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
8
8
  import { Observable } from 'rxjs';
9
9
  import { ExtensionName,
10
10
  // services
@@ -53,6 +53,9 @@ export class AngularSlickgridComponent {
53
53
  this.totalItems = 0;
54
54
  this.subscriptions = [];
55
55
  this.gridId = '';
56
+ // make the columnDefinitions a 2-way binding so that plugin adding cols
57
+ // are synched on user's side as well (RowMove, RowDetail, RowSelections)
58
+ this.columnDefinitionsChange = new EventEmitter(true);
56
59
  const slickgridConfig = new SlickgridConfig();
57
60
  // initialize and assign all Service Dependencies
58
61
  this._eventPubSubService = externalServices?.eventPubSubService ?? new EventPubSubService(this.elm.nativeElement);
@@ -344,6 +347,14 @@ export class AngularSlickgridComponent {
344
347
  // save reference for all columns before they optionally become hidden/visible
345
348
  this.sharedService.allColumns = this._columnDefinitions;
346
349
  this.sharedService.visibleColumns = this._columnDefinitions;
350
+ // before certain extentions/plugins potentially adds extra columns not created by the user itself (RowMove, RowDetail, RowSelections)
351
+ // we'll subscribe to the event and push back the change to the user so they always use full column defs array including extra cols
352
+ this.subscriptions.push(this._eventPubSubService.subscribe('onPluginColumnsChanged', data => {
353
+ this._columnDefinitions = data.columns;
354
+ this.columnDefinitionsChange.emit(this._columnDefinitions);
355
+ }));
356
+ // after subscribing to potential columns changed, we are ready to create these optional extensions
357
+ // when we did find some to create (RowMove, RowDetail, RowSelections), it will automatically modify column definitions (by previous subscribe)
347
358
  this.extensionService.createExtensionsBeforeGridCreation(this._columnDefinitions, this.gridOptions);
348
359
  // if user entered some Pinning/Frozen "presets", we need to apply them in the grid options
349
360
  if (this.gridOptions.presets?.pinning) {
@@ -447,6 +458,7 @@ export class AngularSlickgridComponent {
447
458
  destroy: this.destroy.bind(this),
448
459
  // return all available Services (non-singleton)
449
460
  backendService: this.gridOptions?.backendServiceApi?.service,
461
+ eventPubSubService: this._eventPubSubService,
450
462
  filterService: this.filterService,
451
463
  gridEventService: this.gridEventService,
452
464
  gridStateService: this.gridStateService,
@@ -1121,21 +1133,21 @@ export class AngularSlickgridComponent {
1121
1133
  }
1122
1134
  }
1123
1135
  }
1124
- AngularSlickgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.6", ngImport: i0, type: AngularSlickgridComponent, deps: [{ token: i1.AngularUtilService }, { token: i0.ApplicationRef }, { token: i0.ChangeDetectorRef }, { token: i2.ContainerService }, { token: i0.ElementRef }, { token: i3.TranslateService, optional: true }, { token: i4.TranslaterService, optional: true }, { token: 'config' }, { token: 'externalService' }], target: i0.ɵɵFactoryTarget.Component });
1125
- AngularSlickgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.6", type: AngularSlickgridComponent, selector: "angular-slickgrid", inputs: { customDataView: "customDataView", gridId: "gridId", gridOptions: "gridOptions", paginationOptions: "paginationOptions", columnDefinitions: "columnDefinitions", dataset: "dataset", datasetHierarchical: "datasetHierarchical" }, providers: [
1136
+ AngularSlickgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: AngularSlickgridComponent, deps: [{ token: i1.AngularUtilService }, { token: i0.ApplicationRef }, { token: i0.ChangeDetectorRef }, { token: i2.ContainerService }, { token: i0.ElementRef }, { token: i3.TranslateService, optional: true }, { token: i4.TranslaterService, optional: true }, { token: 'config' }, { token: 'externalService' }], target: i0.ɵɵFactoryTarget.Component });
1137
+ AngularSlickgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.11", type: AngularSlickgridComponent, selector: "angular-slickgrid", inputs: { customDataView: "customDataView", gridId: "gridId", gridOptions: "gridOptions", paginationOptions: "paginationOptions", columnDefinitions: "columnDefinitions", dataset: "dataset", datasetHierarchical: "datasetHierarchical" }, outputs: { columnDefinitionsChange: "columnDefinitionsChange" }, providers: [
1126
1138
  // make everything transient (non-singleton)
1127
1139
  AngularUtilService,
1128
1140
  ApplicationRef,
1129
1141
  TranslaterService,
1130
- ], ngImport: i0, template: "<div id=\"slickGridContainer-{{gridId}}\" class=\"gridPane\">\r\n <div attr.id='{{gridId}}' class=\"slickgrid-container\" style=\"width: 100%\">\r\n </div>\r\n</div>" });
1131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImport: i0, type: AngularSlickgridComponent, decorators: [{
1142
+ ], ngImport: i0, template: "<div id=\"slickGridContainer-{{gridId}}\" class=\"gridPane\">\n <div attr.id='{{gridId}}' class=\"slickgrid-container\" style=\"width: 100%\">\n </div>\n</div>" });
1143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: AngularSlickgridComponent, decorators: [{
1132
1144
  type: Component,
1133
1145
  args: [{ selector: 'angular-slickgrid', providers: [
1134
1146
  // make everything transient (non-singleton)
1135
1147
  AngularUtilService,
1136
1148
  ApplicationRef,
1137
1149
  TranslaterService,
1138
- ], template: "<div id=\"slickGridContainer-{{gridId}}\" class=\"gridPane\">\r\n <div attr.id='{{gridId}}' class=\"slickgrid-container\" style=\"width: 100%\">\r\n </div>\r\n</div>" }]
1150
+ ], template: "<div id=\"slickGridContainer-{{gridId}}\" class=\"gridPane\">\n <div attr.id='{{gridId}}' class=\"slickgrid-container\" style=\"width: 100%\">\n </div>\n</div>" }]
1139
1151
  }], ctorParameters: function () { return [{ type: i1.AngularUtilService }, { type: i0.ApplicationRef }, { type: i0.ChangeDetectorRef }, { type: i2.ContainerService }, { type: i0.ElementRef }, { type: i3.TranslateService, decorators: [{
1140
1152
  type: Optional
1141
1153
  }] }, { type: i4.TranslaterService, decorators: [{
@@ -1156,9 +1168,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImpor
1156
1168
  type: Input
1157
1169
  }], columnDefinitions: [{
1158
1170
  type: Input
1171
+ }], columnDefinitionsChange: [{
1172
+ type: Output
1159
1173
  }], dataset: [{
1160
1174
  type: Input
1161
1175
  }], datasetHierarchical: [{
1162
1176
  type: Input
1163
1177
  }] } });
1164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTyx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sbUNBQW1DLENBQUM7QUFFM0MsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFxQixTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBYSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFFN0ksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBU0wsYUFBYTtBQVliLFdBQVc7QUFDWCxxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIsV0FBVyxFQUNYLGVBQWU7QUFFZixZQUFZO0FBQ1oseUNBQXlDLEVBQ3pDLFlBQVksRUFDWixhQUFhLEVBQ2IsY0FBYyxHQUNmLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDMUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV6QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVuRSxXQUFXO0FBQ1gsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7OztBQWdCdEUsTUFBTSxPQUFPLHlCQUF5QjtJQTBLcEMsWUFDbUIsa0JBQXNDLEVBQ3RDLE1BQXNCLEVBQ3RCLEVBQXFCLEVBQ3JCLGdCQUFrQyxFQUNsQyxHQUFlLEVBQ0gsU0FBMkIsRUFDM0IsaUJBQW9DLEVBQ3ZDLGFBQXlCLEVBQ3hCLGdCQUE2QztRQVJ2RCx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUNILGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDdkMsa0JBQWEsR0FBYixhQUFhLENBQVk7UUEvSzdDLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUMxQixrQkFBYSxHQUFzQixJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUc1RCxnQ0FBMkIsR0FBRyxLQUFLLENBQUM7UUFDcEMsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQzNCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixzQ0FBaUMsR0FBRyxLQUFLLENBQUM7UUFDMUMsNkJBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLHlCQUFvQixHQUF1QixFQUFFLENBQUM7UUFHdEQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBSzdCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFLZixrQkFBYSxHQUF3QixFQUFFLENBQUM7UUEyQi9CLFdBQU0sR0FBVyxFQUFFLENBQUM7UUE2SDNCLE1BQU0sZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFOUMsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsRUFBRSxrQkFBa0IsSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUV2RSxJQUFJLENBQUMscUJBQXFCLEdBQUcsZ0JBQWdCLEVBQUUscUJBQXFCLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3BHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckYsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRSxhQUFhLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUM1RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLEVBQUUsaUJBQWlCLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRSxhQUFhLElBQUksSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQW9CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0ssSUFBSSxDQUFDLGNBQWMsR0FBRyxnQkFBZ0IsRUFBRSxjQUFjLElBQUksSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsRUFBRSxXQUFXLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDOUksSUFBSSxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsRUFBRSxlQUFlLElBQUksSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hKLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsRUFBRSxpQkFBaUIsSUFBSSxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRWhLLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLGdCQUFnQixDQUNoRixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixFQUFFLGdCQUFnQixJQUFJLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcE4sSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsRUFBRSxXQUFXLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdOLElBQUksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLEVBQUUseUJBQXlCLElBQUksSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFckosSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0I7WUFDckIsSUFBSSxDQUFDLGFBQWE7WUFDbEIsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsV0FBVztZQUNoQixJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLElBQUksQ0FBQyxlQUFlO1lBQ3BCLElBQUksQ0FBQyxpQkFBaUI7WUFDdEIsSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxDQUFDLFdBQVc7WUFDaEIsSUFBSSxDQUFDLGVBQWU7U0FDckIsQ0FBQztRQUVGLGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQXpMRCxJQUNJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxvQkFBNEM7UUFDaEUsSUFBSSxvQkFBb0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDbkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLG9CQUFvQixFQUFFLENBQUM7U0FDbkg7YUFBTTtZQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztTQUNoRDtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUNyRixJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsSUFDSSxpQkFBaUIsQ0FBQyxpQkFBMkI7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUNJLE9BQU87UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakcsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLFVBQWlCO1FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUNqRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBRXRCLDRIQUE0SDtRQUM1SCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssYUFBYSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDeEssSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEtBQUssQ0FBQztZQUMvQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGtEQUFrRDtTQUM3RztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFdkQsNENBQTRDO1FBQzVDLDRFQUE0RTtRQUM1RSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUseUJBQXlCLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtZQUN0RSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELElBQ0ksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxtQkFBbUIsQ0FBQyxzQkFBeUM7UUFDL0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckcsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxzQkFBc0IsQ0FBQztRQUVoRSxJQUFJLHNCQUFzQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRTtZQUN4RixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ25DO1FBRUQsNklBQTZJO1FBQzdJLElBQUksc0JBQXNCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLDBCQUEwQixFQUFFO1lBQzVGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUU5Qyw4SUFBOEk7WUFDOUksa0hBQWtIO1lBQ2xILFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLGlCQUFpQixJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztpQkFDN0M7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxJQUFJLENBQUM7U0FDL0M7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsbUdBQW1HO0lBQ25HLElBQUksb0JBQW9CLENBQUMsYUFBc0I7UUFDN0MsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxnQ0FBZ0MsQ0FBQyxhQUFzQjtRQUN6RCxJQUFJLENBQUMsaUNBQWlDLEdBQUcsYUFBYSxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBOEVELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLHNLQUFzSyxDQUFDLENBQUM7U0FDekw7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBRS9CLDJGQUEyRjtRQUMzRixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNyRyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUM1QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxPQUFPLENBQUMsOEJBQThCLEdBQUcsS0FBSztRQUM1QywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtZQUN4QyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO2dCQUM5QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbkI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXRCLDRDQUE0QztRQUM1QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLFFBQVEsRUFBRSxPQUFPLEVBQUU7b0JBQ3JCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDcEI7YUFDRjtZQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7U0FDaEM7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVoQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtnQkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN6QjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRTtZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUN0RCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUErQixDQUFDLENBQUM7YUFDaEU7WUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1NBQ3BDO1FBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3JELElBQUksQ0FBQyxpQkFBeUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDOUM7UUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxhQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMxQztRQUVELCtFQUErRTtRQUMvRSxJQUFJLDhCQUE4QixFQUFFO1lBQ2xDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO1FBRUQsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQWdCLENBQUM7SUFDcEMsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLGVBQWUsSUFBSSxPQUFPLENBQUM7UUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQztRQUN2RSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsMkNBQTJDLENBQUMsV0FBdUI7UUFDakUsTUFBTSxVQUFVLEdBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQ3BDLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUU3QyxtR0FBbUc7WUFDbkcsSUFBSSxPQUFPLGlCQUFpQixDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUU7Z0JBQzFELFVBQVUsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLGFBQWtCLEVBQUUsRUFBRTtvQkFDdEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFVLElBQUksaUJBQWlCLElBQUksT0FBTyxpQkFBaUIsQ0FBQyxjQUFjLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzFKLElBQUksYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDcEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFFLGFBQXFCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUUsYUFBcUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ2pLLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBRSxhQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFFLGFBQXFCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQzt3QkFDeEwsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUM3QztnQkFDSCxDQUFDLENBQUM7YUFDSDtTQUNGO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxZQUErQjtRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDckQsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFFbEMsc0pBQXNKO1FBQ3RKLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUE2QixLQUFLLFNBQVMsRUFBRTtZQUM1UCxJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQztTQUN2RDtRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUM3RyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTdELHdHQUF3RztRQUN4RyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzlELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxtRUFBbUU7UUFFaEgsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUM7WUFDNUcsSUFBSSxlQUFlLEdBQW1CLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLENBQUM7WUFFL0UsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFO2dCQUN6RSxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSw4QkFBOEIsRUFBRSxDQUFDO2dCQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDOUUsZUFBZSxHQUFHLEVBQUUsR0FBRyxlQUFlLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7YUFDckc7WUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEU7UUFFRCx3R0FBd0c7UUFDeEcsb0lBQW9JO1FBQ3BJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTVCLDhHQUE4RztRQUM5RywrRUFBK0U7UUFDL0Usb0dBQW9HO1FBQ3BHLDBHQUEwRztRQUMxRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRW5HLGdIQUFnSDtRQUNoSCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsNEJBQTRCLEVBQUU7WUFDakQseUNBQXlDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsNEJBQTRCLENBQUMsQ0FBQztTQUNuSDtRQUVELDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXBHLDJGQUEyRjtRQUMzRixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRTtZQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDakY7UUFFRCw4RkFBOEY7UUFDOUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUErQixDQUFDO1FBRW5GLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpFLCtJQUErSTtRQUMvSSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNHLElBQUksaUJBQWlCLElBQUksQ0FBQyxJQUFJLGlCQUFpQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDakYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ2hHO1FBRUQsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXRCLHNFQUFzRTtRQUN0RSxxTkFBcU47UUFDck4sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsb0JBQXNDLENBQUMsQ0FBQztTQUN2RjtRQUVELG9HQUFvRztRQUNwRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ2hKLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3BKLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN6QywwSEFBMEg7WUFDMUgsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzlHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxDQUFDO1lBQzdGLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFMUIsNEdBQTRHO1lBQzVHLG1EQUFtRDtZQUNuRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO2dCQUN6SixtSUFBbUk7Z0JBQ25JLGlIQUFpSDtnQkFDakgsSUFBSSxnQ0FBZ0MsR0FBRyxLQUFLLENBQUM7Z0JBQzdDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMscUNBQXFDLENBQUMsRUFBRTtvQkFDekgsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsbUNBQThDLENBQUM7aUJBQzdHO2dCQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3RFLElBQUksT0FBTyxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7b0JBQzFDLElBQUkscUJBQXFCLEdBQUcsaUJBQWlCLENBQUM7b0JBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO3dCQUN0QiwrSUFBK0k7d0JBQy9JLHFCQUFxQixHQUFHLGlCQUFpQixJQUFJLGdDQUFnQyxDQUFDO3FCQUMvRTtvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztpQkFDeEU7cUJBQU0sSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVEsRUFBRTtvQkFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2lCQUN0STthQUNGO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUMxRixJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsRUFBRTtvQkFDbkgsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7aUJBQ3pDO2dCQUNELElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2FBQ25DO1NBQ0Y7UUFFRCw2RkFBNkY7UUFDN0YseUdBQXlHO1FBQ3pHLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUM7U0FDbEY7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxFLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDcEU7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0RCxxRkFBcUY7UUFDckYsNERBQTREO1FBQzVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRTtZQUN2QyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsc0RBQXNEO1FBQ3RELDRGQUE0RjtRQUM1RixxSkFBcUo7UUFDckosSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDM0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1QztRQUVELElBQUksQ0FBQyxxQkFBcUIsR0FBRztZQUMzQixnQ0FBZ0M7WUFDaEMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWE7WUFFaEQsaUJBQWlCO1lBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFaEMsZ0RBQWdEO1lBQ2hELGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE9BQU87WUFDNUQsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUN2QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtTQUN0QyxDQUFBO1FBRUQscURBQXFEO1FBQ3JELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFVBQTZCO1FBQzdDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLElBQUksS0FBSyxDQUFDO1FBQ2hHLElBQUksQ0FBQywwQkFBMEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ25ILElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO2dCQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDO2FBQ2pFO1NBQ0Y7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFO1lBQ3JELE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLFVBQVUsRUFBRTtZQUMvRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFO1NBQ3ZELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWUsQ0FBQyxPQUFjLEVBQUUsVUFBbUI7UUFDakQsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsNkJBQTZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoRyxNQUFNLGVBQWUsR0FBRyxVQUFVLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNyRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25EO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUU7WUFDdkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRTtnQkFDM0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN4QjtZQUVELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7b0JBQy9CLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxDQUFDO29CQUUvQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQUU7d0JBQzNDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO3FCQUN6QztpQkFDRjtnQkFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2FBQ25DO1lBRUQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUM3QjtZQUVELHNLQUFzSztZQUN0SyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUUxTCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFO2dCQUNsRyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBZ0MsQ0FBQyxDQUFDO2dCQUM5SCxrRkFBa0Y7Z0JBQ2xGLDJFQUEyRTtnQkFDM0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDMUcsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNsRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsWUFBWSxDQUFDO2lCQUNqQztnQkFFRCwyRkFBMkY7Z0JBQzNGLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUU7b0JBQ2xDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2lCQUNyRDtxQkFBTTtvQkFDTCxtREFBbUQ7b0JBQ25ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzFEO2FBQ0Y7WUFFRCxvSUFBb0k7WUFDcEksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDL0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzdDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUNBQXFDLENBQUMsV0FBdUIsRUFBRSxpQkFBNkI7UUFDMUYsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUMxRixpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3JFLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7U0FDMUU7UUFDRCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsMkJBQTJCLENBQUMsb0JBQThCO1FBQ3hELHVFQUF1RTtRQUN2RSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsMENBQTBDLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUU3RixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztTQUMzRTthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLHFCQUFxQixFQUFFO1lBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDbEM7YUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsb0NBQW9DLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSwwQkFBMEIsRUFBRTtZQUNwSCxJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDbkQ7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsRUFBRTtJQUNGLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFFckI7OztPQUdHO0lBQ0sseUJBQXlCLENBQUMsaUJBQTJCO1FBQzNELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxXQUFXLEdBQUcsSUFBSTtRQUNoRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQWUsRUFBRSxXQUF1QixFQUFFLFFBQXVCO1FBQzFGLHdFQUF3RTtRQUN4RSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFO1lBQ2hDLHFFQUFxRTtZQUNyRSxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7YUFDakM7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDekMsMEZBQTBGO2dCQUMxRixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRXJELElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQy9DLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO29CQUN0QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxXQUFXLENBQUMsb0JBQW9CLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUU7d0JBQzVFLElBQUksQ0FBQyxlQUFlLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztxQkFDcEQ7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7UUFFRCx3SUFBd0k7UUFDeEksSUFBSSxXQUFXLENBQUMsaUJBQWlCLEVBQUU7WUFDakMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1lBRWpELElBQUksVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7Z0JBQzdCLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN6RztTQUNGO1FBRUQsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSwyQkFBMkIsSUFBSSxFQUFFLENBQUM7WUFFakYsZ0RBQWdEO1lBQ2hELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLDhCQUE4QixDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUMxRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBRSxJQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7d0JBQ2hFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakcsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtZQUVELG9EQUFvRDtZQUNwRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRTtnQkFDM0IsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFFLFFBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7d0JBQ3BFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLDhCQUE4QixDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO3dCQUM5RyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDckcsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtZQUVELGdFQUFnRTtZQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV4QyxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLDhFQUE4RTtnQkFDOUUsSUFBSSxXQUFXLENBQUMsYUFBYSxFQUFFO29CQUM3Qix3RUFBd0U7b0JBQ3hFLElBQUksV0FBVyxDQUFDLGlCQUFpQixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRTt3QkFDbkYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDMUM7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3hDO2lCQUNGO2dCQUVELCtFQUErRTtnQkFDL0UsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFO29CQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFOUIsdUVBQXVFO29CQUN2RSxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRTt3QkFDckYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUM7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDNUM7aUJBQ0Y7Z0JBRUQseURBQXlEO2dCQUN6RCxJQUFJLENBQUMsdUNBQXVDLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7Z0JBRS9DLHFIQUFxSDtnQkFDckgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtvQkFDNUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDcEcsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFO29CQUNuRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFFcEYsbUhBQW1IO29CQUNuSCxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1Q0FBdUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG9DQUFvQyxDQUFDLEVBQUU7d0JBQzdJLElBQUksQ0FBQyxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDhCQUE4QixDQUFDLENBQUM7cUJBQ25HO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksV0FBVyxFQUFFLGVBQWUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTtvQkFDcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRTt3QkFDaEUsd0dBQXdHO3dCQUN4RyxrSEFBa0g7d0JBQ2xILDhHQUE4Rzt3QkFDOUcsSUFBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUN4RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7eUJBQ2Y7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGO1FBRUQsd0ZBQXdGO1FBQ3hGLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxlQUFlLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLGVBQWUsRUFBRTtZQUMxRyxRQUFRLENBQUMsZUFBZSxHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksV0FBVyxDQUFDLGVBQWUsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFO29CQUM5RCxjQUFjLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQzNFO2dCQUNELE9BQU8sY0FBYyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLDRCQUE0QixDQUFDLFdBQXVCO1FBQzFELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztRQUNqRCxNQUFNLGlCQUFpQixHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQzNELE1BQU0sY0FBYyxHQUF5QixpQkFBaUIsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzlFLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyTSxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLHVHQUF1RztZQUN2Ryw4RUFBOEU7WUFDOUUsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDdEMsb0JBQW9CO2dCQUNwQixJQUFJLGlCQUFpQixDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDM0gsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNwRTtnQkFDRCxvQkFBb0I7Z0JBQ3BCLElBQUksaUJBQWlCLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzSCwrR0FBK0c7b0JBQy9HLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDN0gsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztpQkFDekQ7Z0JBQ0QsdUJBQXVCO2dCQUN2QixJQUFJLGlCQUFpQixDQUFDLGdCQUFnQixJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUN4RSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO29CQUNoRSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQzFEO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLGFBQWEsSUFBSSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUU7b0JBQ3BELGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0Y7WUFFRCx3Q0FBd0M7WUFDeEMsSUFBSSxVQUFVLElBQUksaUJBQWlCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLHNCQUFzQixDQUFDLEVBQUU7Z0JBQ3BGLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pHLE1BQU0sT0FBTyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUUvSix5SEFBeUg7Z0JBQ3pILFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQThDLENBQUM7b0JBRWxGLHVFQUF1RTtvQkFDdkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFFN0IseURBQXlEO29CQUN6RCxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7d0JBQ3pCLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztxQkFDekI7b0JBRUQsNkNBQTZDO29CQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDO29CQUNqRSxJQUFJLE9BQU8sWUFBWSxPQUFPLEVBQUU7d0JBQzlCLE9BQU87NkJBQ0osSUFBSSxDQUFDLENBQUMsYUFBa0IsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsK0JBQStCLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7NkJBQ3JJLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO3FCQUM5RTt5QkFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3BCLE9BQTJCLENBQUMsU0FBUyxDQUFDOzRCQUNyQyxJQUFJLEVBQUUsQ0FBQyxhQUFrQixFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7NEJBQ3JJLEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7eUJBQy9FLENBQUMsQ0FDSCxDQUFDO3FCQUNIO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsSUFBZSxFQUFFLE9BQW1CO1FBQ3pELElBQUksQ0FBQyxPQUFPLENBQUMseUJBQXlCLElBQUksT0FBTyxDQUFDLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLElBQUksT0FBTyxDQUFDLG9DQUFvQyxDQUFDLEVBQUU7WUFDN0ssTUFBTSxJQUFJLEtBQUssQ0FBQyxnVkFBZ1YsQ0FBQyxDQUFDO1NBQ25XO1FBRUQsNENBQTRDO1FBQzVDLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyx5QkFBeUIsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDOUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUM3RjthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNsQztRQUNELElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFO1lBQzVCLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyx5QkFBeUIsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7Z0JBQzlFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtTQUNGO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQixDQUFDLEtBQWdCLEVBQUUsV0FBdUI7UUFDM0UsOEVBQThFO1FBQzlFLElBQUksV0FBVyxDQUFDLGFBQWEsRUFBRTtZQUM3QixJQUFJLFdBQVcsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNyRSwrR0FBK0c7Z0JBQy9HLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDL0M7U0FDRjtJQUNILENBQUM7SUFFRCxvSEFBb0g7SUFDNUcsd0JBQXdCLENBQUMsdUJBQStCLEVBQUUsY0FBc0I7UUFDdEYsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRTtZQUNuQixTQUFTLEVBQUUsdUJBQXVCO1lBQ2xDLGNBQWM7U0FDZixDQUFDO1FBQ0YsNkRBQTZEO1FBQzdELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3pDO1FBRUQsb0dBQW9HO1FBQ3BHLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLDZCQUE2QixFQUFFO1lBQ3hFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUM3RDtJQUNILENBQUM7SUFFTywyQkFBMkIsQ0FBQyxpQkFBNkI7UUFDL0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUc7Z0JBQ3BCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjthQUMxQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3BELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGlCQUFvQyxFQUFFLEVBQUU7Z0JBQ2pHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxFQUNGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsK0JBQStCLEVBQUUsQ0FBQyxVQUFnQyxFQUFFLEVBQUU7Z0JBQ3ZHLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUM7Z0JBQ25ELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDckU7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FDSCxDQUFDO1lBQ0Ysb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCwrR0FBK0c7SUFDdkcseUJBQXlCLENBQUMsTUFBYztRQUM5QyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSyxNQUFNLENBQUMsTUFBdUIsQ0FBQyxlQUFlLENBQUM7UUFDbkcsSUFBSSxlQUFlLFlBQVksVUFBVSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUMzRyxDQUFDO1NBQ0g7YUFBTSxJQUFJLGVBQWUsWUFBWSxPQUFPLEVBQUU7WUFDN0Msc0ZBQXNGO1lBQ3RGLDJFQUEyRTtZQUMzRSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBcUIsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlO2lCQUMvRDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsNkNBQTZDO0lBQ3JDLHVDQUF1QztRQUM3QyxrRkFBa0Y7UUFDbEYsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlILE1BQU0sV0FBVyxHQUFhLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9ILElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZFLHdFQUF3RTtnQkFDeEUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFO29CQUMzQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQzFJLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxFQUFFLEtBQUssb0JBQW9CLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxvQkFBb0IsRUFBRTt3QkFDOUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDckM7aUJBQ0Y7Z0JBRUQsc0ZBQXNGO2dCQUN0Rix5R0FBeUc7Z0JBQ3pHLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFMUQsK0VBQStFO2dCQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDO2FBQ2pEO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsNkNBQTZDO0lBQ3JDLHVDQUF1QztRQUM3QyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzVDLGdGQUFnRjtZQUNoRixxSUFBcUk7WUFDckksMkdBQTJHO1lBQzNHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BKLElBQUksQ0FBQyxhQUFhLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ25HO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QixDQUFDLE9BQWU7UUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRTtnQkFDM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxlQUFlLEVBQUUsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLFNBQVMsRUFBRTtvQkFDcEgsSUFBSSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztpQkFDbEQ7YUFDRjtZQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNyRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2hILElBQUksQ0FBQywyQkFBMkIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3JEO0lBQ0gsQ0FBQztJQUVELDhFQUE4RTtJQUN0RSxnQ0FBZ0M7UUFDdEMsZ0RBQWdEO1FBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO1FBQzFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hJLElBQUksa0JBQWtCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUU7WUFDcE0sSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFDekQsSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFFekQsbUdBQW1HO1lBQ25HLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDOUQsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNuRTtpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JFLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbkU7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEdBQUcsY0FBYyxDQUFDO1lBRWpFLDJFQUEyRTtZQUMzRSw0RUFBNEU7WUFDNUUsMkRBQTJEO1lBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkYsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTt3QkFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7cUJBQ2hEO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxXQUF1QjtRQUM5QyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDakMsV0FBVyxDQUFDLGVBQWUsR0FBRyxzQkFBc0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWxFLDRJQUE0STtRQUM1SSxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksS0FBSyxDQUFDO1FBRTlKLCtIQUErSDtRQUMvSCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQWUsQ0FBQztRQUVyRyxtSUFBbUk7UUFDbkksbUdBQW1HO1FBQ25HLHlLQUF5SztRQUN6SyxJQUFJLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksV0FBVyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkosT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxJQUFJLGlCQUFpQixDQUFDLFVBQVcsQ0FBQyxRQUFRLENBQUM7WUFDcEosT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxJQUFJLGlCQUFpQixDQUFDLFVBQVcsQ0FBQyxTQUFTLENBQUM7U0FDeko7UUFFRCx1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLDJCQUEyQixHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNyRSxJQUFJLE9BQU8sQ0FBQyxlQUFlLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO1lBQ3JELE9BQU8sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztTQUNqRDtRQUVELHdGQUF3RjtRQUN4RixxRUFBcUU7UUFDckUsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3hGLE9BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQzthQUN0RDtTQUNGO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHdIQUF3SDtJQUNoSCxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLElBQUksRUFBRSxDQUFDO1FBRTdFLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxZQUFZLEVBQWdCLENBQUMsQ0FBQztRQUU1RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwSixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1NBQ2pKO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixrSUFBa0k7UUFDbEksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1NBQzVFO1FBRUQsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV4RSxxRUFBcUU7UUFDckUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRTtZQUN0RixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUN0RDtRQUVELGtEQUFrRDtRQUNsRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFO1lBQ25DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3REO1FBRUQscUhBQXFIO1FBQ3JILElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDaEQ7UUFFRCx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksMEJBQTBCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXZELHdFQUF3RTtRQUN4RSwrRkFBK0Y7UUFDL0YsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQzVDLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtvQkFDekQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUN0RDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsc0VBQXNFO0lBQzlELG9CQUFvQixDQUFDLFFBQW9CO1FBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxJQUFJO1FBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxjQUFjLEVBQUU7WUFDMUYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsSixJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBbUMsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7U0FDdEM7YUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzFCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNoQztZQUNELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUksZ0JBQXFCLEVBQUUsZ0JBQWdCLEdBQUcsS0FBSztRQUN4RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDakQsSUFBSSxtQkFBbUIsQ0FBQztRQUN4QixJQUFJLGlCQUFpQixHQUFVLEVBQUUsQ0FBQztRQUVsQyx3SUFBd0k7UUFDeEksSUFBSSxJQUFJLENBQUMsaUNBQWlDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3RFLG1CQUFtQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDN0YsaUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1NBQzlDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6RSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRTtnQkFDbEQseUZBQXlGO2dCQUN6RixtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLDBDQUEwQyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25KLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDO2dCQUMxRSxpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7YUFDOUM7aUJBQU07Z0JBQ0wsZ0dBQWdHO2dCQUNoRyw2RkFBNkY7Z0JBQzdGLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQ0FBbUMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RJLGlCQUFpQixHQUFHLGdCQUFnQixJQUFJLEVBQUUsQ0FBQzthQUM1QztTQUNGO1FBRUQsMkZBQTJGO1FBQzNGLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxhQUFhLENBQUMsRUFBRTtZQUNsRyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDOUQ7UUFFRCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDBDQUEwQyxDQUFDLGlCQUEyQjtRQUM1RSxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsd1JBQXdSLENBQUMsQ0FBQztTQUN6UztRQUVELE9BQU8saUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBb0IsRUFBRSxFQUFFO1lBQ3BELDZHQUE2RztZQUM3RyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO2dCQUM1RCxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDeEM7WUFDRCxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2pILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDhCQUE4QjtRQUNwQyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVPLHdCQUF3QjtRQUM5Qix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHNCQUFzQixDQUFVLE1BQWlCLEVBQUUsYUFBa0I7UUFDMUUsTUFBTSxDQUFDLE1BQXVCLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUMxRCxNQUFNLENBQUMsTUFBdUIsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpELCtGQUErRjtRQUMvRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckYsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsU0FBUyxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxNQUFzQixDQUFDO2FBQ2hFO1NBQ0Y7UUFFRCx5R0FBeUc7UUFDekcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQXdDLENBQUM7UUFDM0YsSUFBSSxhQUFhLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRTtZQUM3RCxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDOztzSEFqeENVLHlCQUF5Qiw4UUFrTDFCLFFBQVEsYUFDUixpQkFBaUI7MEdBbkxoQix5QkFBeUIsd1JBUHpCO1FBQ1QsNENBQTRDO1FBQzVDLGtCQUFrQjtRQUNsQixjQUFjO1FBQ2QsaUJBQWlCO0tBQ2xCLDBCQ3ZGSCx5S0FHTTsyRkRzRk8seUJBQXlCO2tCQVZyQyxTQUFTOytCQUNFLG1CQUFtQixhQUVsQjt3QkFDVCw0Q0FBNEM7d0JBQzVDLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxpQkFBaUI7cUJBQ2xCOzswQkFrTEUsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLGlCQUFpQjs0Q0E1SGxCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWVGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFlRixPQUFPO3NCQURWLEtBQUs7Z0JBMEJGLG1CQUFtQjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCAzcmQgcGFydHkgdmVuZG9yIGxpYnNcclxuaW1wb3J0ICdzbGlja2dyaWQvZGlzdC9zbGljay5jb3JlLm1pbic7XHJcbmltcG9ydCAnc2xpY2tncmlkL2Rpc3Qvc2xpY2suaW50ZXJhY3Rpb25zLm1pbic7XHJcbmltcG9ydCAnc2xpY2tncmlkL2Rpc3Qvc2xpY2suZ3JpZC5taW4nO1xyXG5pbXBvcnQgJ3NsaWNrZ3JpZC9kaXN0L3NsaWNrLmRhdGF2aWV3Lm1pbic7XHJcblxyXG4vLyAuLi50aGVuIGV2ZXJ5dGhpbmcgZWxzZS4uLlxyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBBcHBsaWNhdGlvblJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIC8vIGludGVyZmFjZXMvdHlwZXNcclxuICBBdXRvY29tcGxldGVyRWRpdG9yLFxyXG4gIEJhY2tlbmRTZXJ2aWNlQXBpLFxyXG4gIEJhY2tlbmRTZXJ2aWNlT3B0aW9uLFxyXG4gIENvbHVtbixcclxuICBDb2x1bW5FZGl0b3IsXHJcbiAgRGF0YVZpZXdPcHRpb24sXHJcbiAgRXZlbnRTdWJzY3JpcHRpb24sXHJcbiAgRXh0ZW5zaW9uTmFtZSxcclxuICBFeHRlcm5hbFJlc291cmNlLFxyXG4gIExvY2FsZSxcclxuICBNZXRyaWNzLFxyXG4gIFBhZ2luYXRpb24sXHJcbiAgU2VsZWN0RWRpdG9yLFxyXG4gIFNlcnZpY2VQYWdpbmF0aW9uLFxyXG4gIFNsaWNrRGF0YVZpZXcsXHJcbiAgU2xpY2tFdmVudEhhbmRsZXIsXHJcbiAgU2xpY2tHcmlkLFxyXG4gIFNsaWNrTmFtZXNwYWNlLFxyXG5cclxuICAvLyBzZXJ2aWNlc1xyXG4gIEJhY2tlbmRVdGlsaXR5U2VydmljZSxcclxuICBDb2xsZWN0aW9uU2VydmljZSxcclxuICBFdmVudE5hbWluZ1N0eWxlLFxyXG4gIEV4dGVuc2lvblNlcnZpY2UsXHJcbiAgRXh0ZW5zaW9uVXRpbGl0eSxcclxuICBGaWx0ZXJGYWN0b3J5LFxyXG4gIEZpbHRlclNlcnZpY2UsXHJcbiAgR3JpZEV2ZW50U2VydmljZSxcclxuICBHcmlkU2VydmljZSxcclxuICBHcmlkU3RhdGVTZXJ2aWNlLFxyXG4gIEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UsXHJcbiAgUGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgUmVzaXplclNlcnZpY2UsXHJcbiAgUnhKc0ZhY2FkZSxcclxuICBTaGFyZWRTZXJ2aWNlLFxyXG4gIFNsaWNrZ3JpZENvbmZpZyxcclxuICBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIsXHJcbiAgU29ydFNlcnZpY2UsXHJcbiAgVHJlZURhdGFTZXJ2aWNlLFxyXG5cclxuICAvLyB1dGlsaXRpZXNcclxuICBhdXRvQWRkRWRpdG9yRm9ybWF0dGVyVG9Db2x1bW5zV2l0aEVkaXRvcixcclxuICBlbXB0eUVsZW1lbnQsXHJcbiAgR3JpZFN0YXRlVHlwZSxcclxuICB1bnN1YnNjcmliZUFsbCxcclxufSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jb21tb24nO1xyXG5pbXBvcnQgeyBFdmVudFB1YlN1YlNlcnZpY2UgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9ldmVudC1wdWItc3ViJztcclxuaW1wb3J0IHsgU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9lbXB0eS13YXJuaW5nLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNsaWNrRm9vdGVyQ29tcG9uZW50IH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY3VzdG9tLWZvb3Rlci1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbGlja1BhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9wYWdpbmF0aW9uLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJ4SnNSZXNvdXJjZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3J4anMtb2JzZXJ2YWJsZSc7XHJcbmltcG9ydCB7IGRlcXVhbCB9IGZyb20gJ2RlcXVhbC9saXRlJztcclxuXHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IEFuZ3VsYXJHcmlkSW5zdGFuY2UsIEV4dGVybmFsVGVzdGluZ0RlcGVuZGVuY2llcywgR3JpZE9wdGlvbiwgfSBmcm9tICcuLy4uL21vZGVscy9pbmRleCc7XHJcbmltcG9ydCB7IEdsb2JhbEdyaWRPcHRpb25zIH0gZnJvbSAnLi8uLi9nbG9iYWwtZ3JpZC1vcHRpb25zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90cmFuc2xhdGVyLnNlcnZpY2UnO1xyXG5cclxuLy8gU2VydmljZXNcclxuaW1wb3J0IHsgQW5ndWxhclV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYW5ndWxhclV0aWwuc2VydmljZSc7XHJcbmltcG9ydCB7IFNsaWNrUm93RGV0YWlsVmlldyB9IGZyb20gJy4uL2V4dGVuc2lvbnMvc2xpY2tSb3dEZXRhaWxWaWV3JztcclxuaW1wb3J0IHsgQ29udGFpbmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnRhaW5lci5zZXJ2aWNlJztcclxuXHJcbi8vIHVzaW5nIGV4dGVybmFsIG5vbi10eXBlZCBqcyBsaWJyYXJpZXNcclxuZGVjbGFyZSBjb25zdCBTbGljazogU2xpY2tOYW1lc3BhY2U7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FuZ3VsYXItc2xpY2tncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgLy8gbWFrZSBldmVyeXRoaW5nIHRyYW5zaWVudCAobm9uLXNpbmdsZXRvbilcclxuICAgIEFuZ3VsYXJVdGlsU2VydmljZSxcclxuICAgIEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgVHJhbnNsYXRlclNlcnZpY2UsXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclNsaWNrZ3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBfZGF0YXNldD86IGFueVtdIHwgbnVsbDtcclxuICBwcml2YXRlIF9jb2x1bW5EZWZpbml0aW9ucyE6IENvbHVtbltdO1xyXG4gIHByaXZhdGUgX2N1cnJlbnREYXRhc2V0TGVuZ3RoID0gMDtcclxuICBwcml2YXRlIF9ldmVudEhhbmRsZXI6IFNsaWNrRXZlbnRIYW5kbGVyID0gbmV3IFNsaWNrLkV2ZW50SGFuZGxlcigpO1xyXG4gIHByaXZhdGUgX2V2ZW50UHViU3ViU2VydmljZSE6IEV2ZW50UHViU3ViU2VydmljZTtcclxuICBwcml2YXRlIF9hbmd1bGFyR3JpZEluc3RhbmNlczogQW5ndWxhckdyaWRJbnN0YW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzR3JpZEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNMb2NhbEdyaWQgPSB0cnVlO1xyXG4gIHByaXZhdGUgX3BhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3JlZ2lzdGVyZWRSZXNvdXJjZXM6IEV4dGVybmFsUmVzb3VyY2VbXSA9IFtdO1xyXG4gIGRhdGFWaWV3ITogU2xpY2tEYXRhVmlldztcclxuICBzbGlja0dyaWQhOiBTbGlja0dyaWQ7XHJcbiAgZ3JvdXBpbmdEZWZpbml0aW9uOiBhbnkgPSB7fTtcclxuICBncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyPzogU2xpY2tHcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyO1xyXG4gIGJhY2tlbmRTZXJ2aWNlQXBpPzogQmFja2VuZFNlcnZpY2VBcGk7XHJcbiAgbG9jYWxlcyE6IExvY2FsZTtcclxuICBtZXRyaWNzPzogTWV0cmljcztcclxuICBzaG93UGFnaW5hdGlvbiA9IGZhbHNlO1xyXG4gIHNlcnZpY2VMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHRvdGFsSXRlbXMgPSAwO1xyXG4gIHBhZ2luYXRpb25EYXRhPzoge1xyXG4gICAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb247XHJcbiAgICBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XHJcbiAgfTtcclxuICBzdWJzY3JpcHRpb25zOiBFdmVudFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIC8vIGNvbXBvbmVudHMgLyBwbHVnaW5zXHJcbiAgc2xpY2tFbXB0eVdhcm5pbmc/OiBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudDtcclxuICBzbGlja0Zvb3Rlcj86IFNsaWNrRm9vdGVyQ29tcG9uZW50O1xyXG4gIHNsaWNrUGFnaW5hdGlvbj86IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudDtcclxuICBzbGlja1Jvd0RldGFpbFZpZXc/OiBTbGlja1Jvd0RldGFpbFZpZXc7XHJcblxyXG4gIC8vIHNlcnZpY2VzXHJcbiAgYmFja2VuZFV0aWxpdHlTZXJ2aWNlITogQmFja2VuZFV0aWxpdHlTZXJ2aWNlO1xyXG4gIGNvbGxlY3Rpb25TZXJ2aWNlOiBDb2xsZWN0aW9uU2VydmljZTtcclxuICBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlO1xyXG4gIGV4dGVuc2lvblV0aWxpdHk6IEV4dGVuc2lvblV0aWxpdHk7XHJcbiAgZmlsdGVyRmFjdG9yeSE6IEZpbHRlckZhY3Rvcnk7XHJcbiAgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZTtcclxuICBncmlkRXZlbnRTZXJ2aWNlOiBHcmlkRXZlbnRTZXJ2aWNlO1xyXG4gIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZTtcclxuICBncmlkU3RhdGVTZXJ2aWNlOiBHcmlkU3RhdGVTZXJ2aWNlO1xyXG4gIGdyb3VwaW5nU2VydmljZTogR3JvdXBpbmdBbmRDb2xzcGFuU2VydmljZTtcclxuICBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XHJcbiAgcmVzaXplclNlcnZpY2UhOiBSZXNpemVyU2VydmljZTtcclxuICByeGpzPzogUnhKc0ZhY2FkZTtcclxuICBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlO1xyXG4gIHNvcnRTZXJ2aWNlOiBTb3J0U2VydmljZTtcclxuICB0cmVlRGF0YVNlcnZpY2U6IFRyZWVEYXRhU2VydmljZTtcclxuXHJcbiAgQElucHV0KCkgY3VzdG9tRGF0YVZpZXc6IGFueTtcclxuICBASW5wdXQoKSBncmlkSWQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGdyaWRPcHRpb25zITogR3JpZE9wdGlvbjtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgcGFnaW5hdGlvbk9wdGlvbnMoKTogUGFnaW5hdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnM7XHJcbiAgfVxyXG4gIHNldCBwYWdpbmF0aW9uT3B0aW9ucyhuZXdQYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKG5ld1BhZ2luYXRpb25PcHRpb25zICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0geyAuLi50aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24sIC4uLnRoaXMuX3BhZ2luYXRpb25PcHRpb25zLCAuLi5uZXdQYWdpbmF0aW9uT3B0aW9ucyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgPSBuZXdQYWdpbmF0aW9uT3B0aW9ucztcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbiA9IHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID8/IHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbjtcclxuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlVG90YWxJdGVtcyh0aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgPz8gMCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb2x1bW5EZWZpbml0aW9ucyhjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICBpZiAodGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QoY29sdW1uRGVmaW5pdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jb3B5Q29sdW1uV2lkdGhzUmVmZXJlbmNlKGNvbHVtbkRlZmluaXRpb25zKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IENvbHVtbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRhdGFzZXQoKTogYW55W10ge1xyXG4gICAgcmV0dXJuICh0aGlzLmN1c3RvbURhdGFWaWV3ID8gdGhpcy5zbGlja0dyaWQ/LmdldERhdGE/LigpIDogdGhpcy5kYXRhVmlldz8uZ2V0SXRlbXM/LigpKSB8fCBbXTtcclxuICB9XHJcbiAgc2V0IGRhdGFzZXQobmV3RGF0YXNldDogYW55W10pIHtcclxuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcclxuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0RhdGFzZXQsIHRoaXMuX2RhdGFzZXQgfHwgW10pO1xyXG4gICAgbGV0IGRhdGEgPSBuZXdEYXRhc2V0O1xyXG5cclxuICAgIC8vIHdoZW4gVHJlZSBEYXRhIGlzIGVuYWJsZWQgYW5kIHdlIGRvbid0IHlldCBoYXZlIHRoZSBoaWVyYXJjaGljYWwgZGF0YXNldCBmaWxsZWQsIHdlIGNhbiBmb3JjZSBhIGNvbnZlcnQrc29ydCBvZiB0aGUgYXJyYXlcclxuICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVUcmVlRGF0YSAmJiBBcnJheS5pc0FycmF5KG5ld0RhdGFzZXQpICYmIChuZXdEYXRhc2V0Lmxlbmd0aCA+IDAgfHwgbmV3RGF0YXNldC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xyXG4gICAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICBkYXRhID0gdGhpcy5zb3J0VHJlZURhdGFzZXQobmV3RGF0YXNldCwgIWlzRGF0YXNldEVxdWFsKTsgLy8gaWYgZGF0YXNldCBjaGFuZ2VkLCB0aGVuIGZvcmNlIGEgcmVmcmVzaCBhbnl3YXlcclxuICAgIH1cclxuICAgIHRoaXMuX2RhdGFzZXQgPSBkYXRhO1xyXG4gICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoZGF0YSB8fCBbXSk7XHJcbiAgICB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aCA9IChuZXdEYXRhc2V0IHx8IFtdKS5sZW5ndGg7XHJcblxyXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcclxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCBpZiB0aGUgcHJldkRhdGFzZXQgd2FzIGVtcHR5IHRoZW4gd2UgYXJlIG9uIGZpcnN0IGxvYWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIHByZXZEYXRhc2V0TG4gPT09IDApIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuYXV0b3NpemVDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBkYXRhc2V0SGllcmFyY2hpY2FsKCk6IGFueVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldDtcclxuICB9XHJcbiAgc2V0IGRhdGFzZXRIaWVyYXJjaGljYWwobmV3SGllcmFyY2hpY2FsRGF0YXNldDogYW55W10gfCB1bmRlZmluZWQpIHtcclxuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQsIHRoaXMuc2hhcmVkU2VydmljZT8uaGllcmFyY2hpY2FsRGF0YXNldCA/PyBbXSk7XHJcbiAgICBjb25zdCBwcmV2RmxhdERhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBuZXdIaWVyYXJjaGljYWxEYXRhc2V0O1xyXG5cclxuICAgIGlmIChuZXdIaWVyYXJjaGljYWxEYXRhc2V0ICYmIHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgJiYgdGhpcy5maWx0ZXJTZXJ2aWNlPy5jbGVhckZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmNsZWFyRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gYSBoaWVyYXJjaGljYWwgZGF0YXNldCBpcyBzZXQgYWZ0ZXJ3YXJkLCB3ZSBjYW4gcmVzZXQgdGhlIGZsYXQgZGF0YXNldCBhbmQgY2FsbCBhIHRyZWUgZGF0YSBzb3J0IHRoYXQgd2lsbCBvdmVyd3JpdGUgdGhlIGZsYXQgZGF0YXNldFxyXG4gICAgaWYgKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQgJiYgdGhpcy5zbGlja0dyaWQgJiYgdGhpcy5zb3J0U2VydmljZT8ucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQpIHtcclxuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhbXSwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgPz8gJ2lkJyk7XHJcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQoKTtcclxuXHJcbiAgICAgIC8vIHdlIGFsc28gbmVlZCB0byByZXNldC9yZWZyZXNoIHRoZSBUcmVlIERhdGEgZmlsdGVycyBiZWNhdXNlIGlmIHdlIGluc2VydGVkIG5ldyBpdGVtKHMpIHRoZW4gaXQgbWlnaHQgbm90IHNob3cgdXAgd2l0aG91dCBkb2luZyB0aGlzIHJlZnJlc2hcclxuICAgICAgLy8gaG93ZXZlciB3ZSBuZWVkIDEgY3B1IGN5Y2xlIGJlZm9yZSBoYXZpbmcgdGhlIERhdGFWaWV3IHJlZnJlc2hlZCwgc28gd2UgbmVlZCB0byB3cmFwIHRoaXMgY2hlY2sgaW4gYSBzZXRUaW1lb3V0XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZsYXREYXRhc2V0TG4gPSB0aGlzLmRhdGFWaWV3LmdldEl0ZW1Db3VudCgpO1xyXG4gICAgICAgIGlmIChmbGF0RGF0YXNldExuID4gMCAmJiAoZmxhdERhdGFzZXRMbiAhPT0gcHJldkZsYXREYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZnJlc2hUcmVlRGF0YUZpbHRlcnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcclxuICAgIHJldHVybiB0aGlzLmVsbTtcclxuICB9XHJcblxyXG4gIGdldCBldmVudEhhbmRsZXIoKTogU2xpY2tFdmVudEhhbmRsZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50SGFuZGxlcjtcclxuICB9XHJcblxyXG4gIGdldCBncmlkQ29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZENvbnRhaW5lcklkIHx8ICcnfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdFVFRFUiB0byBrbm93IGlmIGRhdGFzZXQgd2FzIGluaXRpYWxpemVkIG9yIG5vdCAqL1xyXG4gIGdldCBpc0RhdGFzZXRJbml0aWFsaXplZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZDtcclxuICB9XHJcbiAgLyoqIFNFVFRFUiB0byBjaGFuZ2UgaWYgZGF0YXNldCB3YXMgaW5pdGlhbGl6ZWQgb3Igbm90IChzdHJpbmdseSB1c2VkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpICovXHJcbiAgc2V0IGlzRGF0YXNldEluaXRpYWxpemVkKGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkID0gaXNJbml0aWFsaXplZDtcclxuICB9XHJcbiAgc2V0IGlzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkKGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gaXNJbml0aWFsaXplZDtcclxuICB9XHJcblxyXG4gIGdldCByZWdpc3RlcmVkUmVzb3VyY2VzKCk6IEV4dGVybmFsUmVzb3VyY2VbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbmd1bGFyVXRpbFNlcnZpY2U6IEFuZ3VsYXJVdGlsU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJTZXJ2aWNlOiBDb250YWluZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbG06IEVsZW1lbnRSZWYsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlclNlcnZpY2U6IFRyYW5zbGF0ZXJTZXJ2aWNlLFxyXG4gICAgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBmb3JSb290Q29uZmlnOiBHcmlkT3B0aW9uLFxyXG4gICAgQEluamVjdCgnZXh0ZXJuYWxTZXJ2aWNlJykgZXh0ZXJuYWxTZXJ2aWNlczogRXh0ZXJuYWxUZXN0aW5nRGVwZW5kZW5jaWVzXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzbGlja2dyaWRDb25maWcgPSBuZXcgU2xpY2tncmlkQ29uZmlnKCk7XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZSBhbmQgYXNzaWduIGFsbCBTZXJ2aWNlIERlcGVuZGVuY2llc1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXZlbnRQdWJTdWJTZXJ2aWNlID8/IG5ldyBFdmVudFB1YlN1YlNlcnZpY2UodGhpcy5lbG0ubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZXZlbnROYW1pbmdTdHlsZSA9IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xyXG5cclxuICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uYmFja2VuZFV0aWxpdHlTZXJ2aWNlID8/IG5ldyBCYWNrZW5kVXRpbGl0eVNlcnZpY2UoKTtcclxuICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRFdmVudFNlcnZpY2UgPz8gbmV3IEdyaWRFdmVudFNlcnZpY2UoKTtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnNoYXJlZFNlcnZpY2UgPz8gbmV3IFNoYXJlZFNlcnZpY2UoKTtcclxuICAgIHRoaXMuY29sbGVjdGlvblNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5jb2xsZWN0aW9uU2VydmljZSA/PyBuZXcgQ29sbGVjdGlvblNlcnZpY2UodGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkgPSBleHRlcm5hbFNlcnZpY2VzPy5leHRlbnNpb25VdGlsaXR5ID8/IG5ldyBFeHRlbnNpb25VdGlsaXR5KHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gbmV3IEZpbHRlckZhY3Rvcnkoc2xpY2tncmlkQ29uZmlnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlLCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuZmlsdGVyU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmZpbHRlclNlcnZpY2UgPz8gbmV3IEZpbHRlclNlcnZpY2UodGhpcy5maWx0ZXJGYWN0b3J5IGFzIGFueSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMucmVzaXplclNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5yZXNpemVyU2VydmljZSA/PyBuZXcgUmVzaXplclNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuc29ydFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zb3J0U2VydmljZSA/PyBuZXcgU29ydFNlcnZpY2UodGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8udHJlZURhdGFTZXJ2aWNlID8/IG5ldyBUcmVlRGF0YVNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnBhZ2luYXRpb25TZXJ2aWNlID8/IG5ldyBQYWdpbmF0aW9uU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmV4dGVuc2lvblNlcnZpY2UgPz8gbmV3IEV4dGVuc2lvblNlcnZpY2UoXHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSxcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLFxyXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsXHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZSxcclxuICAgICAgdGhpcy5zb3J0U2VydmljZSxcclxuICAgICAgdGhpcy50cmVlRGF0YVNlcnZpY2UsXHJcbiAgICAgIHRoaXMudHJhbnNsYXRlclNlcnZpY2UsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRTdGF0ZVNlcnZpY2UgPz8gbmV3IEdyaWRTdGF0ZVNlcnZpY2UodGhpcy5leHRlbnNpb25TZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZ3JpZFNlcnZpY2UgPz8gbmV3IEdyaWRTZXJ2aWNlKHRoaXMuZ3JpZFN0YXRlU2VydmljZSwgdGhpcy5maWx0ZXJTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSwgdGhpcy50cmVlRGF0YVNlcnZpY2UpO1xyXG4gICAgdGhpcy5ncm91cGluZ1NlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlID8/IG5ldyBHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuXHJcbiAgICB0aGlzLnNlcnZpY2VMaXN0ID0gW1xyXG4gICAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSxcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSxcclxuICAgICAgdGhpcy5ncm91cGluZ1NlcnZpY2UsXHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UsXHJcbiAgICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlLFxyXG4gICAgXTtcclxuXHJcbiAgICAvLyByZWdpc3RlciBhbGwgU2VydmljZSBpbnN0YW5jZXMgaW4gdGhlIGNvbnRhaW5lclxyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V4dGVuc2lvblV0aWxpdHknLCB0aGlzLmV4dGVuc2lvblV0aWxpdHkpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0ZpbHRlclNlcnZpY2UnLCB0aGlzLmZpbHRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0NvbGxlY3Rpb25TZXJ2aWNlJywgdGhpcy5jb2xsZWN0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXh0ZW5zaW9uU2VydmljZScsIHRoaXMuZXh0ZW5zaW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZEV2ZW50U2VydmljZScsIHRoaXMuZ3JpZEV2ZW50U2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZFNlcnZpY2UnLCB0aGlzLmdyaWRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkU3RhdGVTZXJ2aWNlJywgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlJywgdGhpcy5ncm91cGluZ1NlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1BhZ2luYXRpb25TZXJ2aWNlJywgdGhpcy5wYWdpbmF0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUmVzaXplclNlcnZpY2UnLCB0aGlzLnJlc2l6ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTaGFyZWRTZXJ2aWNlJywgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTb3J0U2VydmljZScsIHRoaXMuc29ydFNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V2ZW50UHViU3ViU2VydmljZScsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUHViU3ViU2VydmljZScsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnVHJhbnNsYXRlclNlcnZpY2UnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdUcmVlRGF0YVNlcnZpY2UnLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMgfHwgIXRoaXMuY29sdW1uRGVmaW5pdGlvbnMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBgPGFuZ3VsYXItc2xpY2tncmlkPmAgcmVxdWlyZXMgW2dyaWRPcHRpb25zXSBhbmQgW2NvbHVtbkRlZmluaXRpb25zXSwgaXQgc2VlbXMgdGhhdCB5b3UgbWlnaHQgaGF2ZSBmb3Jnb3QgdG8gcHJvdmlkZSB0aGVtIHNpbmNlIGF0IGxlYXN0IG9mIHRoZW0gaXMgdW5kZWZpbmVkLicpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0aWFsaXphdGlvbih0aGlzLl9ldmVudEhhbmRsZXIpO1xyXG4gICAgdGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICAgIC8vIHJlY2hlY2sgdGhlIGVtcHR5IHdhcm5pbmcgbWVzc2FnZSBhZnRlciBncmlkIGlzIHNob3duIHNvIHRoYXQgaXQgd29ya3MgaW4gZXZlcnkgdXNlIGNhc2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFzZXQpKSB7XHJcbiAgICAgIGNvbnN0IGZpbmFsVG90YWxDb3VudCA9IHRoaXMuZGF0YXNldC5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoZmluYWxUb3RhbENvdW50IDwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkJlZm9yZUdyaWREZXN0cm95JywgdGhpcy5zbGlja0dyaWQpO1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25BZnRlckdyaWREZXN0cm95ZWQnLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyID0gZmFsc2UpIHtcclxuICAgIC8vIGRpc3Bvc2Ugb2YgYWxsIFNlcnZpY2VzXHJcbiAgICB0aGlzLnNlcnZpY2VMaXN0LmZvckVhY2goKHNlcnZpY2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoc2VydmljZSAmJiBzZXJ2aWNlLmRpc3Bvc2UpIHtcclxuICAgICAgICBzZXJ2aWNlLmRpc3Bvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlcnZpY2VMaXN0ID0gW107XHJcblxyXG4gICAgLy8gZGlzcG9zZSBhbGwgcmVnaXN0ZXJlZCBleHRlcm5hbCByZXNvdXJjZXNcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpKSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucG9wKCk7XHJcbiAgICAgICAgaWYgKHJlc291cmNlPy5kaXNwb3NlKSB7XHJcbiAgICAgICAgICByZXNvdXJjZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkaXNwb3NlIHRoZSBDb21wb25lbnRzXHJcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnNsaWNrRm9vdGVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9ldmVudEhhbmRsZXI/LnVuc3Vic2NyaWJlQWxsKSB7XHJcbiAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci51bnN1YnNjcmliZUFsbCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlPy51bnN1YnNjcmliZUFsbCgpO1xyXG4gICAgaWYgKHRoaXMuZGF0YVZpZXcpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YVZpZXc/LnNldEl0ZW1zKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhbXSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuZGVzdHJveSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcuZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbGlja0dyaWQ/LmRlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuZGVzdHJveShzaG91bGRFbXB0eURvbUVsZW1lbnRDb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpW3Byb3AgYXMga2V5b2YgQmFja2VuZFNlcnZpY2VBcGldO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXModGhpcy5jb2x1bW5EZWZpbml0aW9ucykpIHtcclxuICAgICAgKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgYXMgYW55KVtwcm9wXSA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXModGhpcy5zaGFyZWRTZXJ2aWNlKSkge1xyXG4gICAgICAodGhpcy5zaGFyZWRTZXJ2aWNlIGFzIGFueSlbcHJvcF0gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdlIGNvdWxkIG9wdGlvbmFsbHkgYWxzbyBlbXB0eSB0aGUgY29udGVudCBvZiB0aGUgZ3JpZCBjb250YWluZXIgRE9NIGVsZW1lbnRcclxuICAgIGlmIChzaG91bGRFbXB0eURvbUVsZW1lbnRDb250YWluZXIpIHtcclxuICAgICAgdGhpcy5lbXB0eUdyaWRDb250YWluZXJFbG0oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbHNvIHVuc3Vic2NyaWJlIGFsbCBSeEpTIHN1YnNjcmlwdGlvbnNcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHVuc3Vic2NyaWJlQWxsKHRoaXMuc3Vic2NyaXB0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5fZGF0YXNldCA9IG51bGw7XHJcbiAgICB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNsaWNrR3JpZCA9IHVuZGVmaW5lZCBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICBlbXB0eUdyaWRDb250YWluZXJFbG0oKSB7XHJcbiAgICBjb25zdCBncmlkQ29udGFpbmVySWQgPSB0aGlzLmdyaWRPcHRpb25zPy5ncmlkQ29udGFpbmVySWQgPz8gJ2dyaWQxJztcclxuICAgIGNvbnN0IGdyaWRDb250YWluZXJFbG0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtncmlkQ29udGFpbmVySWR9YCk7XHJcbiAgICBlbXB0eUVsZW1lbnQoZ3JpZENvbnRhaW5lckVsbSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgb3VyIGludGVybmFsIFBvc3QgUHJvY2VzcyBjYWxsYmFjaywgaXQgd2lsbCBleGVjdXRlIGludGVybmFsbHkgYWZ0ZXIgd2UgZ2V0IGJhY2sgcmVzdWx0IGZyb20gdGhlIFByb2Nlc3MgYmFja2VuZCBjYWxsXHJcbiAgICogRm9yIG5vdywgdGhpcyBpcyBHcmFwaFFMIFNlcnZpY2UgT05MWSBmZWF0dXJlIGFuZCBpdCB3aWxsIGJhc2ljYWxseSByZWZyZXNoIHRoZSBEYXRhc2V0ICYgUGFnaW5hdGlvbiB3aXRob3V0IGhhdmluZyB0aGUgdXNlciB0byBjcmVhdGUgaGlzIG93biBQb3N0UHJvY2VzcyBldmVyeSB0aW1lXHJcbiAgICovXHJcbiAgY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayhncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlKSB7XHJcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGlTZXJ2aWNlID0gYmFja2VuZEFwaS5zZXJ2aWNlO1xyXG5cclxuICAgICAgLy8gaW50ZXJuYWxQb3N0UHJvY2VzcyBvbmx5IHdvcmtzIChmb3Igbm93KSB3aXRoIGEgR3JhcGhRTCBTZXJ2aWNlLCBzbyBtYWtlIHN1cmUgaXQgaXMgb2YgdGhhdCB0eXBlXHJcbiAgICAgIGlmICh0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuZ2V0RGF0YXNldE5hbWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBiYWNrZW5kQXBpLmludGVybmFsUG9zdFByb2Nlc3MgPSAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSgpIDogJyc7XHJcbiAgICAgICAgICBpZiAocHJvY2Vzc1Jlc3VsdD8uZGF0YVtkYXRhc2V0TmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ25vZGVzJykgPyAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdLm5vZGVzIDogKHByb2Nlc3NSZXN1bHQgYXMgYW55KS5kYXRhW2RhdGFzZXROYW1lXTtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ3RvdGFsQ291bnQnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0udG90YWxDb3VudCA6IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hHcmlkRGF0YShkYXRhLCB0b3RhbENvdW50IHx8IDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemF0aW9uKGV2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIpIHtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMudHJhbnNsYXRlciA9IHRoaXMudHJhbnNsYXRlclNlcnZpY2U7XHJcbiAgICB0aGlzLl9ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXI7XHJcblxyXG4gICAgLy8gd2hlbiBkZXRlY3RpbmcgYSBmcm96ZW4gZ3JpZCwgd2UnbGwgYXV0b21hdGljYWxseSBlbmFibGUgdGhlIG1vdXNld2hlZWwgc2Nyb2xsIGhhbmRsZXIgc28gdGhhdCB3ZSBjYW4gc2Nyb2xsIGZyb20gYm90aCBsZWZ0L3JpZ2h0IGZyb3plbiBjb250YWluZXJzXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiAoKHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuUm93ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Sb3cgPj0gMCkgfHwgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA+PSAwKSAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZU1vdXNlV2hlZWxTY3JvbGxIYW5kbGVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVNb3VzZVdoZWVsU2Nyb2xsSGFuZGxlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSB0aGlzLmdyaWRPcHRpb25zPy5ldmVudE5hbWluZ1N0eWxlID8/IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZENyZWF0ZScsIHRydWUpO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YXNldCBpcyBpbml0aWFsaXplZCAoaWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpdCBjYW5ub3QgZ2V0TGVuZ3RoIG9mIG51bGwpXHJcbiAgICB0aGlzLl9kYXRhc2V0ID0gdGhpcy5fZGF0YXNldCB8fCBbXTtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB0aGlzLm1lcmdlR3JpZE9wdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb247XHJcbiAgICB0aGlzLmxvY2FsZXMgPSB0aGlzLmdyaWRPcHRpb25zPy5sb2NhbGVzID8/IENvbnN0YW50cy5sb2NhbGVzO1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZUFwaSA9IHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgdGhpcy5faXNMb2NhbEdyaWQgPSAhdGhpcy5iYWNrZW5kU2VydmljZUFwaTsgLy8gY29uc2lkZXJlZCBhIGxvY2FsIGdyaWQgaWYgaXQgZG9lc24ndCBoYXZlIGEgYmFja2VuZCBzZXJ2aWNlIHNldFxyXG5cclxuICAgIHRoaXMuY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgY29uc3QgZGF0YXZpZXdJbmxpbmVGaWx0ZXJzID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LmlubGluZUZpbHRlcnMgfHwgZmFsc2U7XHJcbiAgICAgIGxldCBkYXRhVmlld09wdGlvbnM6IERhdGFWaWV3T3B0aW9uID0geyBpbmxpbmVGaWx0ZXJzOiBkYXRhdmlld0lubGluZUZpbHRlcnMgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmRyYWdnYWJsZUdyb3VwaW5nIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlR3JvdXBpbmcpIHtcclxuICAgICAgICB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSBuZXcgU2xpY2tHcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyKCk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XHJcbiAgICAgICAgZGF0YVZpZXdPcHRpb25zID0geyAuLi5kYXRhVmlld09wdGlvbnMsIGdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI6IHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciB9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgU2xpY2suRGF0YS5EYXRhVmlldyhkYXRhVmlld09wdGlvbnMpO1xyXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25EYXRhdmlld0NyZWF0ZWQnLCB0aGlzLmRhdGFWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgYW55IHBvc3NpYmxlIFNlcnZpY2VzIHRoYXQgdXNlciB3YW50IHRvIHJlZ2lzdGVyIHdoaWNoIGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZFxyXG4gICAgLy8gUnhKUyBSZXNvdXJjZSBpcyBpbiB0aGlzIGxvdCBiZWNhdXNlIGl0IGhhcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGFuZCBkb2Vzbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluaXRpYWxpemVkXHJcbiAgICB0aGlzLnByZVJlZ2lzdGVyUmVzb3VyY2VzKCk7XHJcblxyXG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyLCB3ZSBwcm92aWRlIHRoZSBwcm9wZXJ0eSBcImVkaXRvclwiIGFzIGFuIEFuZ3VsYXItU2xpY2tncmlkIGVkaXRvciBjb21wbGV4IG9iamVjdFxyXG4gICAgLy8gaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XHJcbiAgICAvLyBzbyBpbiBvdXIgbGliIHdlIHdpbGwgc3dhcCBcImVkaXRvclwiIGFuZCBjb3B5IGl0IGludG8gYSBuZXcgcHJvcGVydHkgY2FsbGVkIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIlxyXG4gICAgLy8gdGhlbiB0YWtlIGJhY2sgXCJlZGl0b3IubW9kZWxcIiBhbmQgbWFrZSBpdCB0aGUgbmV3IFwiZWRpdG9yXCIgc28gdGhhdCBTbGlja0dyaWQgRWRpdG9yIEZhY3Rvcnkgc3RpbGwgd29ya3NcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gdGhpcy5zd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xyXG5cclxuICAgIC8vIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGF1dG9tYXRpY2FsbHkgYWRkIGEgQ3VzdG9tIEVkaXRvciBGb3JtYXR0ZXIsIHdlIG5lZWQgdG8gY2FsbCB0aGUgYXV0byBhZGQgZnVuY3Rpb24gYWdhaW5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpIHtcclxuICAgICAgYXV0b0FkZEVkaXRvckZvcm1hdHRlclRvQ29sdW1uc1dpdGhFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMsIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b0FkZEN1c3RvbUVkaXRvckZvcm1hdHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSByZWZlcmVuY2UgZm9yIGFsbCBjb2x1bW5zIGJlZm9yZSB0aGV5IG9wdGlvbmFsbHkgYmVjb21lIGhpZGRlbi92aXNpYmxlXHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucyA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuY3JlYXRlRXh0ZW5zaW9uc0JlZm9yZUdyaWRDcmVhdGlvbih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcblxyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUGlubmluZy9Gcm96ZW4gXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gYXBwbHkgdGhlbSBpbiB0aGUgZ3JpZCBvcHRpb25zXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5waW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB7IC4uLnRoaXMuZ3JpZE9wdGlvbnMsIC4uLnRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5waW5uaW5nIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYnVpbGQgU2xpY2tHcmlkIEdyaWQsIGFsc28gdXNlciBtaWdodCBvcHRpb25hbGx5IHBhc3MgYSBjdXN0b20gZGF0YXZpZXcgKGUuZy4gcmVtb3RlIG1vZGVsKVxyXG4gICAgdGhpcy5zbGlja0dyaWQgPSBuZXcgU2xpY2suR3JpZChgIyR7dGhpcy5ncmlkSWR9YCwgdGhpcy5jdXN0b21EYXRhVmlldyB8fCB0aGlzLmRhdGFWaWV3LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGF0YVZpZXcgPSB0aGlzLmRhdGFWaWV3O1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNsaWNrR3JpZCA9IHRoaXMuc2xpY2tHcmlkO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyaWRDb250YWluZXJFbGVtZW50ID0gdGhpcy5lbG0ubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcclxuXHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYmluZERpZmZlcmVudEV4dGVuc2lvbnMoKTtcclxuICAgIHRoaXMuYmluZERpZmZlcmVudEhvb2tzKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLCB0aGlzLmRhdGFWaWV3KTtcclxuXHJcbiAgICAvLyB3aGVuIGl0J3MgYSBmcm96ZW4gZ3JpZCwgd2UgbmVlZCB0byBrZWVwIHRoZSBmcm96ZW4gY29sdW1uIGlkIGZvciByZWZlcmVuY2UgaWYgd2UgZXZlciBzaG93L2hpZGUgY29sdW1uIGZyb20gQ29sdW1uUGlja2VyL0dyaWRNZW51IGFmdGVyd2FyZFxyXG4gICAgY29uc3QgZnJvemVuQ29sdW1uSW5kZXggPSB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiAhPT0gdW5kZWZpbmVkID8gdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gOiAtMTtcclxuICAgIGlmIChmcm96ZW5Db2x1bW5JbmRleCA+PSAwICYmIGZyb3plbkNvbHVtbkluZGV4IDw9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZnJvemVuVmlzaWJsZUNvbHVtbklkID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnNbZnJvemVuQ29sdW1uSW5kZXhdLmlkIHx8ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBhbnkgcG9zc2libGUgU2VydmljZXMgdGhhdCB1c2VyIHdhbnQgdG8gcmVnaXN0ZXJcclxuICAgIHRoaXMucmVnaXN0ZXJSZXNvdXJjZXMoKTtcclxuXHJcbiAgICAvLyBpbml0aWFsaXplIHRoZSBTbGlja0dyaWQgZ3JpZFxyXG4gICAgdGhpcy5zbGlja0dyaWQuaW5pdCgpO1xyXG5cclxuICAgIC8vIGluaXRpYWxpemVkIHRoZSByZXNpemVyIHNlcnZpY2Ugb25seSBhZnRlciBTbGlja0dyaWQgaXMgaW5pdGlhbGl6ZWRcclxuICAgIC8vIGlmIHdlIGRvbid0IHdlIGVuZCB1cCBiaW5kaW5nIG91ciByZXNpemUgdG8gYSBncmlkIGVsZW1lbnQgdGhhdCBkb2Vzbid0IHlldCBleGlzdCBpbiB0aGUgRE9NIGFuZCB0aGUgcmVzaXplciBzZXJ2aWNlIHdpbGwgZmFpbCBzaWxlbnRseSAoYmVjYXVzZSBpdCBoYXMgYSB0cnkvY2F0Y2ggdGhhdCB1bmJpbmRzIHRoZSByZXNpemUgd2l0aG91dCB0aHJvd2luZyBiYWNrKVxyXG4gICAgaWYgKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5pbml0KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRDb250YWluZXJFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB1c2VyIGNvdWxkIHNob3cgYSBjdXN0b20gZm9vdGVyIHdpdGggdGhlIGRhdGEgbWV0cmljcyAoZGF0YXNldCBsZW5ndGggYW5kIGxhc3QgdXBkYXRlZCB0aW1lc3RhbXApXHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLmdyaWRPcHRpb25zLnNob3dDdXN0b21Gb290ZXIgJiYgdGhpcy5ncmlkT3B0aW9ucy5jdXN0b21Gb290ZXJPcHRpb25zICYmIHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5zbGlja0Zvb3RlciA9IG5ldyBTbGlja0Zvb3RlckNvbXBvbmVudCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucy5jdXN0b21Gb290ZXJPcHRpb25zLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyLnJlbmRlckZvb3Rlcih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldykge1xyXG4gICAgICAvLyBsb2FkIHRoZSBkYXRhIGluIHRoZSBEYXRhVmlldyAodW5sZXNzIGl0J3MgYSBoaWVyYXJjaGljYWwgZGF0YXNldCwgaWYgc28gaXQgd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgdGhlIGluaXRpYWwgdHJlZSBzb3J0KVxyXG4gICAgICBjb25zdCBpbml0aWFsRGF0YXNldCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVRyZWVEYXRhID8gdGhpcy5zb3J0VHJlZURhdGFzZXQodGhpcy5fZGF0YXNldCkgOiB0aGlzLl9kYXRhc2V0O1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoaW5pdGlhbERhdGFzZXQgfHwgW10sIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lID8/ICdpZCcpO1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LmVuZFVwZGF0ZSgpO1xyXG5cclxuICAgICAgLy8gaWYgeW91IGRvbid0IHdhbnQgdGhlIGl0ZW1zIHRoYXQgYXJlIG5vdCB2aXNpYmxlIChkdWUgdG8gYmVpbmcgZmlsdGVyZWQgb3V0IG9yIGJlaW5nIG9uIGEgZGlmZmVyZW50IHBhZ2UpXHJcbiAgICAgIC8vIHRvIHN0YXkgc2VsZWN0ZWQsIHBhc3MgJ2ZhbHNlJyB0byB0aGUgc2Vjb25kIGFyZ1xyXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQ/LmdldFNlbGVjdGlvbk1vZGVsKCkgJiYgdGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3ICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaGFzT3duUHJvcGVydHkoJ3N5bmNHcmlkU2VsZWN0aW9uJykpIHtcclxuICAgICAgICAvLyBpZiB3ZSBhcmUgdXNpbmcgYSBCYWNrZW5kIFNlcnZpY2UsIHdlIHdpbGwgZG8gYW4gZXh0cmEgZmxhZyBjaGVjaywgdGhlIHJlYXNvbiBpcyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgc29tZSB1bmludGVuZGVkIGJlaGF2aW9yc1xyXG4gICAgICAgIC8vIHdpdGggdGhlIEJhY2tlbmRTZXJ2aWNlQXBpIGJlY2F1c2UgdGVjaG5pY2FsbHkgdGhlIGRhdGEgaW4gdGhlIHBhZ2UgY2hhbmdlcyB0aGUgRGF0YVZpZXcgb24gZXZlcnkgcGFnZSBjaGFuZ2UuXHJcbiAgICAgICAgbGV0IHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5oYXNPd25Qcm9wZXJ0eSgnc3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2UnKSkge1xyXG4gICAgICAgICAgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQgPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlIGFzIGJvb2xlYW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzeW5jR3JpZFNlbGVjdGlvbiA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb247XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzeW5jR3JpZFNlbGVjdGlvbiA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICBsZXQgcHJlc2VydmVkUm93U2VsZWN0aW9uID0gc3luY0dyaWRTZWxlY3Rpb247XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgICAgICAgIC8vIHdoZW4gdXNpbmcgQmFja2VuZFNlcnZpY2VBcGksIHdlJ2xsIGJlIHVzaW5nIHRoZSBcInN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlXCIgZmxhZyBCVVQgXCJzeW5jR3JpZFNlbGVjdGlvblwiIG11c3QgYWxzbyBiZSBzZXQgdG8gVHJ1ZVxyXG4gICAgICAgICAgICBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24gPSBzeW5jR3JpZFNlbGVjdGlvbiAmJiBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb24odGhpcy5zbGlja0dyaWQsIHByZXNlcnZlZFJvd1NlbGVjdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3luY0dyaWRTZWxlY3Rpb24gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uKHRoaXMuc2xpY2tHcmlkLCBzeW5jR3JpZFNlbGVjdGlvbi5wcmVzZXJ2ZUhpZGRlbiwgc3luY0dyaWRTZWxlY3Rpb24ucHJlc2VydmVIaWRkZW5PblNlbGVjdGlvbkNoYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXRhc2V0TG4gPSB0aGlzLmRhdGFWaWV3LmdldExlbmd0aCgpIHx8IHRoaXMuX2RhdGFzZXQgJiYgdGhpcy5fZGF0YXNldC5sZW5ndGggfHwgMDtcclxuICAgICAgaWYgKGRhdGFzZXRMbiA+IDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24pKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcbiAgICAgICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXNlciBtaWdodCB3YW50IHRvIGhpZGUgdGhlIGhlYWRlciByb3cgb24gcGFnZSBsb2FkIGJ1dCBzdGlsbCBoYXZlIGBlbmFibGVGaWx0ZXJpbmc6IHRydWVgXHJcbiAgICAvLyBpZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBuZWVkIHRvIGhpZGUgdGhlIGhlYWRlclJvdyBPTkxZIEFGVEVSIGFsbCBmaWx0ZXJzIGdvdCBjcmVhdGVkICYgZGF0YVZpZXcgZXhpc3RcclxuICAgIGlmICh0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCkge1xyXG4gICAgICB0aGlzLnNob3dIZWFkZXJSb3coZmFsc2UpO1xyXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaXNoICYgZGlzcGF0Y2ggY2VydGFpbiBldmVudHNcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkdyaWRDcmVhdGVkJywgdGhpcy5zbGlja0dyaWQpO1xyXG5cclxuICAgIC8vIGFmdGVyIHRoZSBEYXRhVmlldyBpcyBjcmVhdGVkICYgdXBkYXRlZCBleGVjdXRlIHNvbWUgcHJvY2Vzc2VzXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgdGhpcy5leGVjdXRlQWZ0ZXJEYXRhdmlld0NyZWF0ZWQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGJpbmQgcmVzaXplIE9OTFkgYWZ0ZXIgdGhlIGRhdGFWaWV3IGlzIHJlYWR5XHJcbiAgICB0aGlzLmJpbmRSZXNpemVIb29rKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICAvLyBiaW5kIHRoZSBCYWNrZW5kIFNlcnZpY2UgQVBJIGNhbGxiYWNrIGZ1bmN0aW9ucyBvbmx5IGFmdGVyIHRoZSBncmlkIGlzIGluaXRpYWxpemVkXHJcbiAgICAvLyBiZWNhdXNlIHRoZSBwcmVQcm9jZXNzKCkgYW5kIG9uSW5pdCgpIG1pZ2h0IGdldCB0cmlnZ2VyZWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICB0aGlzLmJpbmRCYWNrZW5kQ2FsbGJhY2tGdW5jdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9jYWwgZ3JpZCwgY2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IHRoZSBQYWdpbmF0aW9uXHJcbiAgICAvLyBpZiBzbyB0aGVuIGFsc28gY2hlY2sgaWYgdGhlcmUncyBhbnkgcHJlc2V0cyBhbmQgZmluYWxseSBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uU2VydmljZVxyXG4gICAgLy8gYSBsb2NhbCBncmlkIHdpdGggUGFnaW5hdGlvbiBwcmVzZXRzIHdpbGwgcG90ZW50aWFsbHkgaGF2ZSBhIGRpZmZlcmVudCB0b3RhbCBvZiBpdGVtcywgd2UnbGwgbmVlZCB0byBnZXQgaXQgZnJvbSB0aGUgRGF0YVZpZXcgYW5kIHVwZGF0ZSBvdXIgdG90YWxcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLmxvYWRMb2NhbEdyaWRQYWdpbmF0aW9uKHRoaXMuZGF0YXNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB7XHJcbiAgICAgIC8vIFNsaWNrIEdyaWQgJiBEYXRhVmlldyBvYmplY3RzXHJcbiAgICAgIGRhdGFWaWV3OiB0aGlzLmRhdGFWaWV3LFxyXG4gICAgICBzbGlja0dyaWQ6IHRoaXMuc2xpY2tHcmlkLFxyXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvblNlcnZpY2U/LmV4dGVuc2lvbkxpc3QsXHJcblxyXG4gICAgICAvLyBwdWJsaWMgbWV0aG9kc1xyXG4gICAgICBkZXN0cm95OiB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIC8vIHJldHVybiBhbGwgYXZhaWxhYmxlIFNlcnZpY2VzIChub24tc2luZ2xldG9uKVxyXG4gICAgICBiYWNrZW5kU2VydmljZTogdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGk/LnNlcnZpY2UsXHJcbiAgICAgIGZpbHRlclNlcnZpY2U6IHRoaXMuZmlsdGVyU2VydmljZSxcclxuICAgICAgZ3JpZEV2ZW50U2VydmljZTogdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLFxyXG4gICAgICBncmlkU3RhdGVTZXJ2aWNlOiB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsXHJcbiAgICAgIGdyaWRTZXJ2aWNlOiB0aGlzLmdyaWRTZXJ2aWNlLFxyXG4gICAgICBncm91cGluZ1NlcnZpY2U6IHRoaXMuZ3JvdXBpbmdTZXJ2aWNlLFxyXG4gICAgICBleHRlbnNpb25TZXJ2aWNlOiB0aGlzLmV4dGVuc2lvblNlcnZpY2UsXHJcbiAgICAgIHBhZ2luYXRpb25TZXJ2aWNlOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLFxyXG4gICAgICByZXNpemVyU2VydmljZTogdGhpcy5yZXNpemVyU2VydmljZSxcclxuICAgICAgc29ydFNlcnZpY2U6IHRoaXMuc29ydFNlcnZpY2UsXHJcbiAgICAgIHRyZWVEYXRhU2VydmljZTogdGhpcy50cmVlRGF0YVNlcnZpY2UsXHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWxsIGluc3RhbmNlcyAoU2xpY2tHcmlkLCBEYXRhVmlldyAmIGFsbCBTZXJ2aWNlcylcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkFuZ3VsYXJHcmlkQ3JlYXRlZCcsIHRoaXMuX2FuZ3VsYXJHcmlkSW5zdGFuY2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIGEgUGFnaW5hdGlvbiBjaGFuZ2VkLCB3ZSB3aWxsIHRyaWdnZXIgYSBHcmlkIFN0YXRlIGNoYW5nZWQgd2l0aCB0aGUgbmV3IHBhZ2luYXRpb24gaW5mb1xyXG4gICAqIEFsc28gaWYgd2UgdXNlIFJvdyBTZWxlY3Rpb24gb3IgdGhlIENoZWNrYm94IFNlbGVjdG9yLCB3ZSBuZWVkIHRvIHJlc2V0IGFueSBzZWxlY3Rpb25cclxuICAgKi9cclxuICBwYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uOiBTZXJ2aWNlUGFnaW5hdGlvbikge1xyXG4gICAgY29uc3QgaXNTeW5jR3JpZFNlbGVjdGlvbkVuYWJsZWQgPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2U/Lm5lZWRUb1ByZXNlcnZlUm93U2VsZWN0aW9uKCkgPz8gZmFsc2U7XHJcbiAgICBpZiAoIWlzU3luY0dyaWRTZWxlY3Rpb25FbmFibGVkICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhbXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0gPSBwYWdpbmF0aW9uO1xyXG4gICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZSkge1xyXG4gICAgICBpZiAocGFnZVNpemUgIT09IHVuZGVmaW5lZCAmJiBwYWdlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY3VycmVudFBhZ2luYXRpb24gPSB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkdyaWRTdGF0ZUNoYW5nZWQnLCB7XHJcbiAgICAgIGNoYW5nZTogeyBuZXdWYWx1ZXM6IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfSwgdHlwZTogR3JpZFN0YXRlVHlwZS5wYWdpbmF0aW9uIH0sXHJcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEN1cnJlbnRHcmlkU3RhdGUoKVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBkYXRhc2V0IGNoYW5nZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgZW50aXJlIGdyaWQgVUkgJiBwb3NzaWJseSByZXNpemUgaXQgYXMgd2VsbFxyXG4gICAqIEBwYXJhbSBkYXRhc2V0XHJcbiAgICovXHJcbiAgcmVmcmVzaEdyaWREYXRhKGRhdGFzZXQ6IGFueVtdLCB0b3RhbENvdW50PzogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlICYmIEFycmF5LmlzQXJyYXkoZGF0YXNldCkpIHtcclxuICAgICAgY29uc3QgZmluYWxUb3RhbENvdW50ID0gdG90YWxDb3VudCB8fCBkYXRhc2V0Lmxlbmd0aDtcclxuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhc2V0KSAmJiB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmRhdGFWaWV3Py5zZXRJdGVtcykge1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKGRhdGFzZXQsIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lID8/ICdpZCcpO1xyXG4gICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlVHJlZURhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3LnJlU29ydCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF0YXNldC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFJvd1NlbGVjdGlvblByZXNldFdoZW5FeGlzdHMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF0YXNldCkge1xyXG4gICAgICAgIHRoaXMuc2xpY2tHcmlkLmludmFsaWRhdGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZGlzcGxheSB0aGUgUGFnaW5hdGlvbiBjb21wb25lbnQgb25seSBhZnRlciBjYWxsaW5nIHRoaXMgcmVmcmVzaCBkYXRhIGZpcnN0LCB3ZSBjYWxsIGl0IGhlcmUgc28gdGhhdCBpZiB3ZSBwcmVzZXQgcGFnaW5hdGlvbiBwYWdlIG51bWJlciBpdCB3aWxsIGJlIHNob3duIGNvcnJlY3RseVxyXG4gICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gKHRoaXMuZ3JpZE9wdGlvbnMgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiB8fCAodGhpcy5ncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gPT09IHVuZGVmaW5lZCkpKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgICAgY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSB0aGlzLnNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQodGhpcy5ncmlkT3B0aW9ucywgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgYXMgUGFnaW5hdGlvbik7XHJcbiAgICAgICAgLy8gd2hlbiB3ZSBoYXZlIGEgdG90YWxDb3VudCB1c2UgaXQsIGVsc2Ugd2UnbGwgdGFrZSBpdCBmcm9tIHRoZSBwYWdpbmF0aW9uIG9iamVjdFxyXG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0b3RhbCBpdGVtcyBpZiBpdCdzIGRpZmZlcmVudCB0byBhdm9pZCByZWZyZXNoaW5nIHRoZSBVSVxyXG4gICAgICAgIGNvbnN0IHRvdGFsUmVjb3JkcyA9ICh0b3RhbENvdW50ICE9PSB1bmRlZmluZWQpID8gdG90YWxDb3VudCA6ICh0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zKTtcclxuICAgICAgICBpZiAodG90YWxSZWNvcmRzICE9PSB1bmRlZmluZWQgJiYgdG90YWxSZWNvcmRzICE9PSB0aGlzLnRvdGFsSXRlbXMpIHtcclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9ICt0b3RhbFJlY29yZHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2Ugd2l0aCBuZXcgcGFnaW5hdGlvbiBvcHRpb25zICh3aGljaCBtaWdodCBoYXZlIHByZXNldHMpXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhZ2luYXRpb24gc2VydmljZSB3aXRoIHRoZSBuZXcgdG90YWxcclxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlVG90YWxJdGVtcyh0aGlzLnRvdGFsSXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzaXplIHRoZSBncmlkIGluc2lkZSBhIHNsaWdodCB0aW1lb3V0LCBpbiBjYXNlIG90aGVyIERPTSBlbGVtZW50IGNoYW5nZWQgcHJpb3IgdG8gdGhlIHJlc2l6ZSAobGlrZSBhIGZpbHRlci9wYWdpbmF0aW9uIGNoYW5nZWQpXHJcbiAgICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUF1dG9SZXNpemUpIHtcclxuICAgICAgICBjb25zdCBkZWxheSA9IHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1Jlc2l6ZSAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9SZXNpemUuZGVsYXk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKGRlbGF5IHx8IDEwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgdGhlcmUncyBhbnkgUGFnaW5hdGlvbiBQcmVzZXRzIGRlZmluZWQgaW4gdGhlIEdyaWQgT3B0aW9ucyxcclxuICAgKiBpZiB0aGVyZSBhcmUgdGhlbiBsb2FkIHRoZW0gaW4gdGhlIHBhZ2luYXRpb25PcHRpb25zIG9iamVjdFxyXG4gICAqL1xyXG4gIHNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24sIHBhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uKTogUGFnaW5hdGlvbiB7XHJcbiAgICBpZiAoZ3JpZE9wdGlvbnMucHJlc2V0cz8ucGFnaW5hdGlvbiAmJiBwYWdpbmF0aW9uT3B0aW9ucyAmJiAhdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgcGFnaW5hdGlvbk9wdGlvbnMucGFnZVNpemUgPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24ucGFnZVNpemU7XHJcbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLnBhZ2VOdW1iZXIgPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24ucGFnZU51bWJlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBwYWdpbmF0aW9uT3B0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIER5bmFtaWNhbGx5IGNoYW5nZSBvciB1cGRhdGUgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBsaXN0LlxyXG4gICAqIFdlIHdpbGwgcmUtcmVuZGVyIHRoZSBncmlkIHNvIHRoYXQgdGhlIG5ldyBoZWFkZXIgYW5kIGRhdGEgc2hvd3MgdXAgY29ycmVjdGx5LlxyXG4gICAqIElmIHVzaW5nIGkxOG4sIHdlIGFsc28gbmVlZCB0byB0cmlnZ2VyIGEgcmUtdHJhbnNsYXRlIG9mIHRoZSBjb2x1bW4gaGVhZGVyc1xyXG4gICAqL1xyXG4gIHVwZGF0ZUNvbHVtbkRlZmluaXRpb25zTGlzdChuZXdDb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcclxuICAgIC8vIG1hcC9zd2FwIHRoZSBpbnRlcm5hbCBsaWJyYXJ5IEVkaXRvciB0byB0aGUgU2xpY2tHcmlkIEVkaXRvciBmYWN0b3J5XHJcbiAgICBuZXdDb2x1bW5EZWZpbml0aW9ucyA9IHRoaXMuc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKG5ld0NvbHVtbkRlZmluaXRpb25zKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoZmFsc2UsIG5ld0NvbHVtbkRlZmluaXRpb25zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZW5kZXJDb2x1bW5IZWFkZXJzKG5ld0NvbHVtbkRlZmluaXRpb25zLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlQXV0b1NpemVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmF1dG9zaXplQ29sdW1ucygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQgJiYgdGhpcy5yZXNpemVyU2VydmljZT8ucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyB0aGUgZmlsdGVyIHJvdyBkaXNwbGF5ZWQgb24gZmlyc3Qgcm93LCB3ZSBjYW4gb3B0aW9uYWxseSBwYXNzIGZhbHNlIHRvIGhpZGUgaXQuXHJcbiAgICogQHBhcmFtIHNob3dpbmdcclxuICAgKi9cclxuICBzaG93SGVhZGVyUm93KHNob3dpbmcgPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNsaWNrR3JpZC5zZXRIZWFkZXJSb3dWaXNpYmlsaXR5KHNob3dpbmcsIGZhbHNlKTtcclxuICAgIGlmIChzaG93aW5nID09PSB0cnVlICYmIHRoaXMuX2lzR3JpZEluaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLnNldENvbHVtbnModGhpcy5jb2x1bW5EZWZpbml0aW9ucyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2hvd2luZztcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gcHJpdmF0ZSBmdW5jdGlvbnNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9vcCB0aHJvdWdoIGFsbCBjb2x1bW4gZGVmaW5pdGlvbnMgYW5kIGNvcHkgdGhlIG9yaWdpbmFsIG9wdGlvbmFsIGB3aWR0aGAgcHJvcGVydGllcyBvcHRpb25hbGx5IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAqIFdlIHdpbGwgdXNlIHRoaXMgd2hlbiBkb2luZyBhIHJlc2l6ZSBieSBjZWxsIGNvbnRlbnQsIGlmIHVzZXIgcHJvdmlkZWQgYSBgd2lkdGhgIGl0IHdvbid0IG92ZXJyaWRlIGl0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29weUNvbHVtbldpZHRoc1JlZmVyZW5jZShjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbkRlZmluaXRpb25zLmZvckVhY2goY29sID0+IGNvbC5vcmlnaW5hbFdpZHRoID0gY29sLndpZHRoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoc2hvd1dhcm5pbmcgPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nPy5zaG93RW1wdHlEYXRhTWVzc2FnZShzaG93V2FybmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmREaWZmZXJlbnRIb29rcyhncmlkOiBTbGlja0dyaWQsIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uLCBkYXRhVmlldzogU2xpY2tEYXRhVmlldykge1xyXG4gICAgLy8gb24gbG9jYWxlIGNoYW5nZSwgd2UgaGF2ZSB0byBtYW51YWxseSB0cmFuc2xhdGUgdGhlIEhlYWRlcnMsIEdyaWRNZW51XHJcbiAgICBpZiAodGhpcy50cmFuc2xhdGU/Lm9uTGFuZ0NoYW5nZSkge1xyXG4gICAgICAvLyB0cmFuc2xhdGUgc29tZSBvZiB0aGVtIG9uIGZpcnN0IGxvYWQsIHRoZW4gb24gZWFjaCBsYW5ndWFnZSBjaGFuZ2VcclxuICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVBbGxFeHRlbnNpb25zKCk7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVDb2x1bW5IZWFkZXJUaXRsZUtleXMoKTtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIC8vIHB1Ymxpc2ggZXZlbnQgb2YgdGhlIHNhbWUgbmFtZSB0aGF0IFNsaWNrZ3JpZC1Vbml2ZXJzYWwgdXNlcyBvbiBhIGxhbmd1YWdlIGNoYW5nZSBldmVudFxyXG4gICAgICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uTGFuZ3VhZ2VDaGFuZ2UnKTtcclxuXHJcbiAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVBbGxFeHRlbnNpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XHJcbiAgICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5jcmVhdGVQcmVIZWFkZXJQYW5lbCAmJiAhZ3JpZE9wdGlvbnMuZW5hYmxlRHJhZ2dhYmxlR3JvdXBpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nU2VydmljZS50cmFuc2xhdGVHcm91cGluZ0FuZENvbFNwYW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgdXNlciBzZXQgYW4gb25Jbml0IEJhY2tlbmQsIHdlJ2xsIHJ1biBpdCByaWdodCBhd2F5IChhbmQgaWYgc28sIHdlIGFsc28gbmVlZCB0byBydW4gcHJlUHJvY2VzcywgaW50ZXJuYWxQb3N0UHJvY2VzcyAmIHBvc3RQcm9jZXNzKVxyXG4gICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGkgPSBncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaTtcclxuXHJcbiAgICAgIGlmIChiYWNrZW5kQXBpPy5zZXJ2aWNlPy5pbml0KSB7XHJcbiAgICAgICAgYmFja2VuZEFwaS5zZXJ2aWNlLmluaXQoYmFja2VuZEFwaS5vcHRpb25zLCBncmlkT3B0aW9ucy5wYWdpbmF0aW9uLCB0aGlzLnNsaWNrR3JpZCwgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhVmlldyAmJiBncmlkKSB7XHJcbiAgICAgIGNvbnN0IHNsaWNrZ3JpZEV2ZW50UHJlZml4ID0gdGhpcy5ncmlkT3B0aW9ucz8uZGVmYXVsdFNsaWNrZ3JpZEV2ZW50UHJlZml4ID8/ICcnO1xyXG5cclxuICAgICAgLy8gZXhwb3NlIGFsbCBTbGljayBHcmlkIEV2ZW50cyB0aHJvdWdoIGRpc3BhdGNoXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBncmlkKSB7XHJcbiAgICAgICAgaWYgKGdyaWQuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcC5zdGFydHNXaXRoKCdvbicpKSB7XHJcbiAgICAgICAgICBjb25zdCBncmlkRXZlbnROYW1lID0gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmdldEV2ZW50TmFtZUJ5TmFtaW5nQ29udmVudGlvbihwcm9wLCBzbGlja2dyaWRFdmVudFByZWZpeCk7XHJcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKChncmlkIGFzIGFueSlbcHJvcF0sIChldmVudCwgYXJncykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZ3JpZEV2ZW50TmFtZSwgeyBldmVudERhdGE6IGV2ZW50LCBhcmdzIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleHBvc2UgYWxsIFNsaWNrIERhdGFWaWV3IEV2ZW50cyB0aHJvdWdoIGRpc3BhdGNoXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkYXRhVmlldykge1xyXG4gICAgICAgIGlmIChkYXRhVmlldy5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wLnN0YXJ0c1dpdGgoJ29uJykpIHtcclxuICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoKGRhdGFWaWV3IGFzIGFueSlbcHJvcF0sIChldmVudCwgYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhVmlld0V2ZW50TmFtZSA9IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5nZXRFdmVudE5hbWVCeU5hbWluZ0NvbnZlbnRpb24ocHJvcCwgc2xpY2tncmlkRXZlbnRQcmVmaXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZGF0YVZpZXdFdmVudE5hbWUsIHsgZXZlbnREYXRhOiBldmVudCwgYXJncyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb24gY2VsbCBjbGljaywgbWFpbmx5IHVzZWQgd2l0aCB0aGUgY29sdW1uRGVmLmFjdGlvbiBjYWxsYmFja1xyXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UuYmluZE9uQ2VsbENoYW5nZShncmlkKTtcclxuICAgICAgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLmJpbmRPbkNsaWNrKGdyaWQpO1xyXG5cclxuICAgICAgaWYgKGRhdGFWaWV3ICYmIGdyaWQpIHtcclxuICAgICAgICAvLyBiaW5kIGV4dGVybmFsIHNvcnRpbmcgKGJhY2tlbmQpIHdoZW4gYXZhaWxhYmxlIG9yIGRlZmF1bHQgb25Tb3J0IChkYXRhVmlldylcclxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlU29ydGluZykge1xyXG4gICAgICAgICAgLy8gYmluZCBleHRlcm5hbCBzb3J0aW5nIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXHJcbiAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgIWdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpLnVzZUxvY2FsU29ydGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmJpbmRCYWNrZW5kT25Tb3J0KGdyaWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0U2VydmljZS5iaW5kTG9jYWxPblNvcnQoZ3JpZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBiaW5kIGV4dGVybmFsIGZpbHRlciAoYmFja2VuZCkgd2hlbiBhdmFpbGFibGUgb3IgZGVmYXVsdCBvbkZpbHRlciAoZGF0YVZpZXcpXHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZUZpbHRlcmluZykge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmluaXQoZ3JpZCk7XHJcblxyXG4gICAgICAgICAgLy8gYmluZCBleHRlcm5hbCBmaWx0ZXIgKGJhY2tlbmQpIHVubGVzcyBzcGVjaWZpZWQgdG8gdXNlIHRoZSBsb2NhbCBvbmVcclxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkudXNlTG9jYWxGaWx0ZXJpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmJpbmRCYWNrZW5kT25GaWx0ZXIoZ3JpZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuYmluZExvY2FsT25GaWx0ZXIoZ3JpZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsb2FkIGFueSBwcmVzZXRzIGlmIGFueSAoYWZ0ZXIgZGF0YXNldCBpcyBpbml0aWFsaXplZClcclxuICAgICAgICB0aGlzLmxvYWRDb2x1bW5QcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xyXG4gICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcblxyXG4gICAgICAgIC8vIFdoZW4gZGF0YSBjaGFuZ2VzIGluIHRoZSBEYXRhVmlldywgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBtZXRyaWNzIGFuZC9vciBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgZGF0YXNldCBpcyBlbXB0eVxyXG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZGF0YVZpZXcub25Sb3dDb3VudENoYW5nZWQsICgpID0+IHtcclxuICAgICAgICAgIGdyaWQuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB8fCAwLCBkYXRhVmlldy5nZXRJdGVtQ291bnQoKSB8fCAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGRhdGFWaWV3Lm9uU2V0SXRlbXNDYWxsZWQsIChfZSwgYXJncykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB8fCAwLCBhcmdzLml0ZW1Db3VudCk7XHJcblxyXG4gICAgICAgICAgLy8gd2hlbiB1c2VyIGhhcyByZXNpemUgYnkgY29udGVudCBlbmFibGVkLCB3ZSdsbCBmb3JjZSBhIGZ1bGwgd2lkdGggY2FsY3VsYXRpb24gc2luY2Ugd2UgY2hhbmdlIG91ciBlbnRpcmUgZGF0YXNldFxyXG4gICAgICAgICAgaWYgKGFyZ3MuaXRlbUNvdW50ID4gMCAmJiAodGhpcy5ncmlkT3B0aW9ucy5hdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWQgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQoIXRoaXMuZ3JpZE9wdGlvbnM/LnJlc2l6ZUJ5Q29udGVudE9ubHlPbkZpcnN0TG9hZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChncmlkT3B0aW9ucz8uZW5hYmxlRmlsdGVyaW5nICYmICFncmlkT3B0aW9ucy5lbmFibGVSb3dEZXRhaWxWaWV3KSB7XHJcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGRhdGFWaWV3Lm9uUm93c0NoYW5nZWQsIChfZSwgYXJncykgPT4ge1xyXG4gICAgICAgICAgICAvLyBmaWx0ZXJpbmcgZGF0YSB3aXRoIGxvY2FsIGRhdGFzZXQgd2lsbCBub3QgYWx3YXlzIHNob3cgY29ycmVjdGx5IHVubGVzcyB3ZSBjYWxsIHRoaXMgdXBkYXRlUm93L3JlbmRlclxyXG4gICAgICAgICAgICAvLyBhbHNvIGRvbid0IHVzZSBcImludmFsaWRhdGVSb3dzXCIgc2luY2UgaXQgZGVzdHJveXMgdGhlIGVudGlyZSByb3cgYW5kIGFzIGJhZCB1c2VyIGV4cGVyaWVuY2Ugd2hlbiB1cGRhdGluZyBhIHJvd1xyXG4gICAgICAgICAgICAvLyBzZWUgY29tbWl0OiBodHRwczovL2dpdGh1Yi5jb20vZ2hpc2NvZGluZy9hdXJlbGlhLXNsaWNrZ3JpZC9jb21taXQvOGM1MDNhNGQ0NWZiYTExY2JkOGQ4Y2M0NjdmYWU4ZDE3N2NjNGY2MFxyXG4gICAgICAgICAgICBpZiAoYXJncz8ucm93cyAmJiBBcnJheS5pc0FycmF5KGFyZ3Mucm93cykpIHtcclxuICAgICAgICAgICAgICBhcmdzLnJvd3MuZm9yRWFjaCgocm93OiBudW1iZXIpID0+IGdyaWQudXBkYXRlUm93KHJvdykpO1xyXG4gICAgICAgICAgICAgIGdyaWQucmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRpZCB0aGUgdXNlciBhZGQgYSBjb2xzcGFuIGNhbGxiYWNrPyBJZiBzbywgaG9vayBpdCBpbnRvIHRoZSBEYXRhVmlldyBnZXRJdGVtTWV0YWRhdGFcclxuICAgIGlmIChncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2sgJiYgZGF0YVZpZXcgJiYgZGF0YVZpZXcuZ2V0SXRlbSAmJiBkYXRhVmlldy5nZXRJdGVtTWV0YWRhdGEpIHtcclxuICAgICAgZGF0YVZpZXcuZ2V0SXRlbU1ldGFkYXRhID0gKHJvd051bWJlcjogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgbGV0IGNhbGxiYWNrUmVzdWx0ID0gbnVsbDtcclxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrICYmIGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjaykge1xyXG4gICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2soZGF0YVZpZXcuZ2V0SXRlbShyb3dOdW1iZXIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrUmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiaW5kQmFja2VuZENhbGxiYWNrRnVuY3Rpb25zKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XHJcbiAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XHJcbiAgICBjb25zdCBiYWNrZW5kQXBpU2VydmljZSA9IGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlO1xyXG4gICAgY29uc3Qgc2VydmljZU9wdGlvbnM6IEJhY2tlbmRTZXJ2aWNlT3B0aW9uID0gYmFja2VuZEFwaVNlcnZpY2U/Lm9wdGlvbnMgPz8ge307XHJcbiAgICBjb25zdCBpc0V4ZWN1dGVDb21tYW5kT25Jbml0ID0gKCFzZXJ2aWNlT3B0aW9ucykgPyBmYWxzZSA6ICgoc2VydmljZU9wdGlvbnMgJiYgc2VydmljZU9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2V4ZWN1dGVQcm9jZXNzQ29tbWFuZE9uSW5pdCcpKSA/IHNlcnZpY2VPcHRpb25zWydleGVjdXRlUHJvY2Vzc0NvbW1hbmRPbkluaXQnXSA6IHRydWUpO1xyXG5cclxuICAgIGlmIChiYWNrZW5kQXBpU2VydmljZSkge1xyXG4gICAgICAvLyB1cGRhdGUgYmFja2VuZCBmaWx0ZXJzIChpZiBuZWVkIGJlKSBCRUZPUkUgdGhlIHF1ZXJ5IHJ1bnMgKHZpYSB0aGUgb25Jbml0IGNvbW1hbmQgYSBmZXcgbGluZXMgYmVsb3cpXHJcbiAgICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIGFueSBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBncmlkXHJcbiAgICAgIGlmIChncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5wcmVzZXRzKSB7XHJcbiAgICAgICAgLy8gRmlsdGVycyBcInByZXNldHNcIlxyXG4gICAgICAgIGlmIChiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzKSAmJiBncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyhncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTb3J0ZXJzIFwicHJlc2V0c1wiXHJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVNvcnRlcnMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMpICYmIGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAvLyB3aGVuIHVzaW5nIG11bHRpLWNvbHVtbiBzb3J0LCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBidXQgb24gc2luZ2xlIHNvcnQgdGhlbiBvbmx5IGdyYWIgdGhlIGZpcnN0IHNvcnQgcHJvdmlkZWRcclxuICAgICAgICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5tdWx0aUNvbHVtblNvcnQgPyBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMgOiBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMuc2xpY2UoMCwgMSk7XHJcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVTb3J0ZXJzKHVuZGVmaW5lZCwgc29ydENvbHVtbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQYWdpbmF0aW9uIFwicHJlc2V0c1wiXHJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb24gJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgICBjb25zdCB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0gPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb247XHJcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVQYWdpbmF0aW9uKHBhZ2VOdW1iZXIsIHBhZ2VTaXplKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uRmlsdGVycyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXRDb2x1bW5GaWx0ZXJzKCk7XHJcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcnMgJiYgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycykge1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyhjb2x1bW5GaWx0ZXJzLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleGVjdXRlIG9uSW5pdCBjb21tYW5kIHdoZW4gbmVjZXNzYXJ5XHJcbiAgICAgIGlmIChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIChiYWNrZW5kQXBpLm9uSW5pdCB8fCBpc0V4ZWN1dGVDb21tYW5kT25Jbml0KSkge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gKHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5idWlsZFF1ZXJ5ID09PSAnZnVuY3Rpb24nKSA/IGJhY2tlbmRBcGlTZXJ2aWNlLmJ1aWxkUXVlcnkoKSA6ICcnO1xyXG4gICAgICAgIGNvbnN0IHByb2Nlc3MgPSAoaXNFeGVjdXRlQ29tbWFuZE9uSW5pdCkgPyAoYmFja2VuZEFwaS5wcm9jZXNzICYmIGJhY2tlbmRBcGkucHJvY2VzcyhxdWVyeSkgfHwgbnVsbCkgOiAoYmFja2VuZEFwaS5vbkluaXQgJiYgYmFja2VuZEFwaS5vbkluaXQocXVlcnkpIHx8IG51bGwpO1xyXG5cclxuICAgICAgICAvLyB3cmFwIHRoaXMgaW5zaWRlIGEgc2V0VGltZW91dCB0byBhdm9pZCB0aW1pbmcgaXNzdWUgc2luY2UgdGhlIGdyaWRPcHRpb25zIG5lZWRzIHRvIGJlIHJlYWR5IGJlZm9yZSBydW5uaW5nIHRoaXMgb25Jbml0XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBiYWNrZW5kVXRpbGl0eVNlcnZpY2UgPSB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSBhcyBCYWNrZW5kVXRpbGl0eVNlcnZpY2U7XHJcblxyXG4gICAgICAgICAgLy8ga2VlcCBzdGFydCB0aW1lICYgZW5kIHRpbWVzdGFtcHMgJiByZXR1cm4gaXQgYWZ0ZXIgcHJvY2VzcyBleGVjdXRpb25cclxuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAgICAgLy8gcnVuIGFueSBwcmUtcHJvY2VzcywgaWYgZGVmaW5lZCwgZm9yIGV4YW1wbGUgYSBzcGlubmVyXHJcbiAgICAgICAgICBpZiAoYmFja2VuZEFwaS5wcmVQcm9jZXNzKSB7XHJcbiAgICAgICAgICAgIGJhY2tlbmRBcGkucHJlUHJvY2VzcygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoZSBwcm9jZXNzZXMgY2FuIGJlIGEgUHJvbWlzZSAobGlrZSBIdHRwKVxyXG4gICAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgPz8gMDtcclxuICAgICAgICAgIGlmIChwcm9jZXNzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICBwcm9jZXNzXHJcbiAgICAgICAgICAgICAgLnRoZW4oKHByb2Nlc3NSZXN1bHQ6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLmV4ZWN1dGVCYWNrZW5kUHJvY2Vzc2VzQ2FsbGJhY2soc3RhcnRUaW1lLCBwcm9jZXNzUmVzdWx0LCBiYWNrZW5kQXBpLCB0b3RhbEl0ZW1zKSlcclxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2Uub25CYWNrZW5kRXJyb3IoZXJyb3IsIGJhY2tlbmRBcGkpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2VzcyAmJiB0aGlzLnJ4anM/LmlzT2JzZXJ2YWJsZShwcm9jZXNzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgICAocHJvY2VzcyBhcyBPYnNlcnZhYmxlPGFueT4pLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2UuZXhlY3V0ZUJhY2tlbmRQcm9jZXNzZXNDYWxsYmFjayhzdGFydFRpbWUsIHByb2Nlc3NSZXN1bHQsIGJhY2tlbmRBcGksIHRvdGFsSXRlbXMpLFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2Uub25CYWNrZW5kRXJyb3IoZXJyb3IsIGJhY2tlbmRBcGkpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiaW5kUmVzaXplSG9vayhncmlkOiBTbGlja0dyaWQsIG9wdGlvbnM6IEdyaWRPcHRpb24pIHtcclxuICAgIGlmICgob3B0aW9ucy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIG9wdGlvbnMuYXV0b3NpemVDb2x1bW5zQnlDZWxsQ29udGVudE9uRmlyc3RMb2FkKSB8fCAob3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMgJiYgb3B0aW9ucy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0FuZ3VsYXItU2xpY2tncmlkXSBZb3UgY2Fubm90IGVuYWJsZSBib3RoIGF1dG9zaXplL2ZpdCB2aWV3cG9ydCAmIHJlc2l6ZSBieSBjb250ZW50LCB5b3UgbXVzdCBjaG9vc2Ugd2hpY2ggcmVzaXplIHRlY2huaXF1ZSB0byB1c2UuIFlvdSBjYW4gZW5hYmxlIHRoZXNlIDIgb3B0aW9ucyAoXCJhdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkXCIgYW5kIFwiZW5hYmxlQXV0b1NpemVDb2x1bW5zXCIpIE9SIHRoZXNlIG90aGVyIDIgb3B0aW9ucyAoXCJhdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWRcIiBhbmQgXCJlbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRcIikuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcclxuICAgIGlmIChncmlkICYmIG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xyXG4gICAgICBncmlkLmF1dG9zaXplQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGF1dG8tcmVzaXplIGdyaWQgb24gYnJvd3NlciByZXNpemVcclxuICAgIGlmIChvcHRpb25zLmdyaWRIZWlnaHQgfHwgb3B0aW9ucy5ncmlkV2lkdGgpIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKDAsIHsgaGVpZ2h0OiBvcHRpb25zLmdyaWRIZWlnaHQsIHdpZHRoOiBvcHRpb25zLmdyaWRXaWR0aCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZSkge1xyXG4gICAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcclxuICAgICAgICBncmlkLmF1dG9zaXplQ29sdW1ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4ZWN1dGVBZnRlckRhdGF2aWV3Q3JlYXRlZChfZ3JpZDogU2xpY2tHcmlkLCBncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgU29ydCBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBET01cclxuICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVTb3J0aW5nKSB7XHJcbiAgICAgIGlmIChncmlkT3B0aW9ucy5wcmVzZXRzICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzKSkge1xyXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbXVsdGktY29sdW1uIHNvcnQsIHdlIGNhbiBoYXZlIG11bHRpcGxlIGJ1dCBvbiBzaW5nbGUgc29ydCB0aGVuIG9ubHkgZ3JhYiB0aGUgZmlyc3Qgc29ydCBwcm92aWRlZFxyXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5tdWx0aUNvbHVtblNvcnQgPyBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMgOiBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMuc2xpY2UoMCwgMSk7XHJcbiAgICAgICAgdGhpcy5zb3J0U2VydmljZS5sb2FkR3JpZFNvcnRlcnMoc29ydENvbHVtbnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hlbiBkYXRhIGNoYW5nZXMgaW4gdGhlIERhdGFWaWV3LCB3ZSdsbCByZWZyZXNoIHRoZSBtZXRyaWNzIGFuZC9vciBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgZGF0YXNldCBpcyBlbXB0eSAqL1xyXG4gIHByaXZhdGUgaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKGN1cnJlbnRQYWdlUm93SXRlbUNvdW50OiBudW1iZXIsIHRvdGFsSXRlbUNvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoID0gdG90YWxJdGVtQ291bnQ7XHJcbiAgICB0aGlzLm1ldHJpY3MgPSB7XHJcbiAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKSxcclxuICAgICAgZW5kVGltZTogbmV3IERhdGUoKSxcclxuICAgICAgaXRlbUNvdW50OiBjdXJyZW50UGFnZVJvd0l0ZW1Db3VudCxcclxuICAgICAgdG90YWxJdGVtQ291bnRcclxuICAgIH07XHJcbiAgICAvLyBpZiBjdXN0b20gZm9vdGVyIGlzIGVuYWJsZWQsIHRoZW4gd2UnbGwgdXBkYXRlIGl0cyBtZXRyaWNzXHJcbiAgICBpZiAodGhpcy5zbGlja0Zvb3Rlcikge1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyLm1ldHJpY3MgPSB0aGlzLm1ldHJpY3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2luZyBsb2NhbCAoaW4tbWVtb3J5KSBkYXRhc2V0LCB3ZSdsbCBkaXNwbGF5IGEgd2FybmluZyBtZXNzYWdlIHdoZW4gZmlsdGVyZWQgZGF0YSBpcyBlbXB0eVxyXG4gICAgaWYgKHRoaXMuX2lzTG9jYWxHcmlkICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoY3VycmVudFBhZ2VSb3dJdGVtQ291bnQgPT09IDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24pIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEgPSB7XHJcbiAgICAgICAgZ3JpZE9wdGlvbnM6IHRoaXMuZ3JpZE9wdGlvbnMsXHJcbiAgICAgICAgcGFnaW5hdGlvblNlcnZpY2U6IHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5pbml0KHRoaXMuc2xpY2tHcmlkLCBwYWdpbmF0aW9uT3B0aW9ucywgdGhpcy5iYWNrZW5kU2VydmljZUFwaSk7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5zdWJzY3JpYmUoJ29uUGFnaW5hdGlvbkNoYW5nZWQnLCAocGFnaW5hdGlvbkNoYW5nZXM6IFNlcnZpY2VQYWdpbmF0aW9uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25DaGFuZ2VkKHBhZ2luYXRpb25DaGFuZ2VzKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlKCdvblBhZ2luYXRpb25WaXNpYmlsaXR5Q2hhbmdlZCcsICh2aXNpYmlsaXR5OiB7IHZpc2libGU6IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9IHZpc2liaWxpdHk/LnZpc2libGUgPz8gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkpIHtcclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2U/LnJlZnJlc2hCYWNrZW5kRGF0YXNldCh0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbih0aGlzLnNob3dQYWdpbmF0aW9uKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIHBhZ2luYXRpb24gY29tcG9uZW50XHJcbiAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbigpO1xyXG4gICAgICB0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBMb2FkIHRoZSBFZGl0b3IgQ29sbGVjdGlvbiBhc3luY2hyb25vdXNseSBhbmQgcmVwbGFjZSB0aGUgXCJjb2xsZWN0aW9uXCIgcHJvcGVydHkgd2hlbiBPYnNlcnZhYmxlIHJlc29sdmVzICovXHJcbiAgcHJpdmF0ZSBsb2FkRWRpdG9yQ29sbGVjdGlvbkFzeW5jKGNvbHVtbjogQ29sdW1uKSB7XHJcbiAgICBjb25zdCBjb2xsZWN0aW9uQXN5bmMgPSBjb2x1bW4gJiYgY29sdW1uLmVkaXRvciAmJiAoY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3IpLmNvbGxlY3Rpb25Bc3luYztcclxuICAgIGlmIChjb2xsZWN0aW9uQXN5bmMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIGNvbGxlY3Rpb25Bc3luYy5zdWJzY3JpYmUoKHJlc29sdmVkQ29sbGVjdGlvbikgPT4gdGhpcy51cGRhdGVFZGl0b3JDb2xsZWN0aW9uKGNvbHVtbiwgcmVzb2x2ZWRDb2xsZWN0aW9uKSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbkFzeW5jIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAvLyB3YWl0IGZvciB0aGUgXCJjb2xsZWN0aW9uQXN5bmNcIiwgb25jZSByZXNvbHZlZCB3ZSB3aWxsIHNhdmUgaXQgaW50byB0aGUgXCJjb2xsZWN0aW9uXCJcclxuICAgICAgLy8gdGhlIGNvbGxlY3Rpb25Bc3luYyBjYW4gYmUgb2YgMyB0eXBlcyBIdHRwQ2xpZW50LCBIdHRwRmV0Y2ggb3IgYSBQcm9taXNlXHJcbiAgICAgIGNvbGxlY3Rpb25Bc3luYy50aGVuKChyZXNwb25zZTogYW55IHwgYW55W10pID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlRWRpdG9yQ29sbGVjdGlvbihjb2x1bW4sIHJlc3BvbnNlKTsgLy8gZnJvbSBQcm9taXNlXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMb2FkIGFueSBwb3NzaWJsZSBDb2x1bW5zIEdyaWQgUHJlc2V0cyAqL1xyXG4gIHByaXZhdGUgbG9hZENvbHVtblByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCkge1xyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgQ29sdW1ucyBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBncmlkXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzICYmIEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMpICYmIHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZ3JpZENvbHVtbnM6IENvbHVtbltdID0gdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEFzc29jaWF0ZWRHcmlkQ29sdW1ucyh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMpO1xyXG4gICAgICBpZiAoZ3JpZENvbHVtbnMgJiYgQXJyYXkuaXNBcnJheShncmlkQ29sdW1ucykgJiYgZ3JpZENvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjaGVja2JveCBzZWxlY3RvciBpcyBhbHNvIHZpc2libGUgaWYgaXQgaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpIHtcclxuICAgICAgICAgIGNvbnN0IGNoZWNrYm94Q29sdW1uID0gKEFycmF5LmlzQXJyYXkodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpICYmIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLmxlbmd0aCA+IDApID8gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnNbMF0gOiBudWxsO1xyXG4gICAgICAgICAgaWYgKGNoZWNrYm94Q29sdW1uICYmIGNoZWNrYm94Q29sdW1uLmlkID09PSAnX2NoZWNrYm94X3NlbGVjdG9yJyAmJiBncmlkQ29sdW1uc1swXS5pZCAhPT0gJ19jaGVja2JveF9zZWxlY3RvcicpIHtcclxuICAgICAgICAgICAgZ3JpZENvbHVtbnMudW5zaGlmdChjaGVja2JveENvbHVtbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBrZWVwIGNvcHkgdGhlIG9yaWdpbmFsIG9wdGlvbmFsIGB3aWR0aGAgcHJvcGVydGllcyBvcHRpb25hbGx5IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAgICAgIC8vIFdlIHdpbGwgdXNlIHRoaXMgd2hlbiBkb2luZyBhIHJlc2l6ZSBieSBjZWxsIGNvbnRlbnQsIGlmIHVzZXIgcHJvdmlkZWQgYSBgd2lkdGhgIGl0IHdvbid0IG92ZXJyaWRlIGl0LlxyXG4gICAgICAgIGdyaWRDb2x1bW5zLmZvckVhY2goY29sID0+IGNvbC5vcmlnaW5hbFdpZHRoID0gY29sLndpZHRoKTtcclxuXHJcbiAgICAgICAgLy8gZmluYWxseSBzZXQgdGhlIG5ldyBwcmVzZXRzIGNvbHVtbnMgKGluY2x1ZGluZyBjaGVja2JveCBzZWxlY3RvciBpZiBuZWVkIGJlKVxyXG4gICAgICAgIHRoaXMuc2xpY2tHcmlkLnNldENvbHVtbnMoZ3JpZENvbHVtbnMpO1xyXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS52aXNpYmxlQ29sdW1ucyA9IGdyaWRDb2x1bW5zO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTG9hZCBhbnkgcG9zc2libGUgRmlsdGVycyBHcmlkIFByZXNldHMgKi9cclxuICBwcml2YXRlIGxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmICF0aGlzLmN1c3RvbURhdGFWaWV3KSB7XHJcbiAgICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIEZpbHRlciBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBET01cclxuICAgICAgLy8gYWxzbyBub3RlIHRoYXQgYSBwcmVzZXRzIG9mIFRyZWUgRGF0YSBUb2dnbGluZyB3aWxsIGFsc28gY2FsbCB0aGlzIG1ldGhvZCBiZWNhdXNlIFRyZWUgRGF0YSB0b2dnbGluZyBkb2VzIHdvcmsgd2l0aCBkYXRhIGZpbHRlcmluZ1xyXG4gICAgICAvLyAoY29sbGFwc2luZyBhIHBhcmVudCB3aWxsIGJhc2ljYWxseSB1c2UgRmlsdGVyIGZvciBoaWRkaW5nIChha2EgY29sbGFwc2luZykgYXdheSB0aGUgY2hpbGQgdW5kZXJuZWF0IGl0KVxyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzICYmIChBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzKSB8fCBBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cz8udHJlZURhdGE/LnRvZ2dsZWRJdGVtcykpKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnBvcHVsYXRlQ29sdW1uRmlsdGVyU2VhcmNoVGVybVByZXNldHModGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5maWx0ZXJzIHx8IFtdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogbG9jYWwgZ3JpZCwgY2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IHRoZSBQYWdpbmF0aW9uXHJcbiAgICogaWYgc28gdGhlbiBhbHNvIGNoZWNrIGlmIHRoZXJlJ3MgYW55IHByZXNldHMgYW5kIGZpbmFsbHkgaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvblNlcnZpY2VcclxuICAgKiBhIGxvY2FsIGdyaWQgd2l0aCBQYWdpbmF0aW9uIHByZXNldHMgd2lsbCBwb3RlbnRpYWxseSBoYXZlIGEgZGlmZmVyZW50IHRvdGFsIG9mIGl0ZW1zLCB3ZSdsbCBuZWVkIHRvIGdldCBpdCBmcm9tIHRoZSBEYXRhVmlldyBhbmQgdXBkYXRlIG91ciB0b3RhbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZExvY2FsR3JpZFBhZ2luYXRpb24oZGF0YXNldD86IGFueVtdKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucykge1xyXG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSBBcnJheS5pc0FycmF5KGRhdGFzZXQpID8gZGF0YXNldC5sZW5ndGggOiAwO1xyXG4gICAgICBpZiAodGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgJiYgdGhpcy5kYXRhVmlldz8uZ2V0UGFnaW5nSW5mbykge1xyXG4gICAgICAgIGNvbnN0IHNsaWNrUGFnaW5nSW5mbyA9IHRoaXMuZGF0YVZpZXcuZ2V0UGFnaW5nSW5mbygpO1xyXG4gICAgICAgIGlmIChzbGlja1BhZ2luZ0luZm8/Lmhhc093blByb3BlcnR5KCd0b3RhbFJvd3MnKSAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucy50b3RhbEl0ZW1zICE9PSBzbGlja1BhZ2luZ0luZm8udG90YWxSb3dzKSB7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBzbGlja1BhZ2luZ0luZm8udG90YWxSb3dzIHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zLnRvdGFsSXRlbXMgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgIGNvbnN0IHBhZ2luYXRpb25PcHRpb25zID0gdGhpcy5zZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIExvYWQgYW55IFJvdyBTZWxlY3Rpb25zIGludG8gdGhlIERhdGFWaWV3IHRoYXQgd2VyZSBwcmVzZXRzIGJ5IHRoZSB1c2VyICovXHJcbiAgcHJpdmF0ZSBsb2FkUm93U2VsZWN0aW9uUHJlc2V0V2hlbkV4aXN0cygpIHtcclxuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIFJvdyBTZWxlY3Rpb25zIFwicHJlc2V0c1wiXHJcbiAgICBjb25zdCBwcmVzZXRzID0gdGhpcy5ncmlkT3B0aW9ucz8ucHJlc2V0cztcclxuICAgIGNvbnN0IGVuYWJsZVJvd1NlbGVjdGlvbiA9IHRoaXMuZ3JpZE9wdGlvbnMgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3RvciB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbik7XHJcbiAgICBpZiAoZW5hYmxlUm93U2VsZWN0aW9uICYmIHRoaXMuc2xpY2tHcmlkPy5nZXRTZWxlY3Rpb25Nb2RlbCgpICYmIHByZXNldHM/LnJvd1NlbGVjdGlvbiAmJiAoQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcykgfHwgQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5kYXRhQ29udGV4dElkcykpKSB7XHJcbiAgICAgIGxldCBkYXRhQ29udGV4dElkcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmRhdGFDb250ZXh0SWRzO1xyXG4gICAgICBsZXQgZ3JpZFJvd0luZGV4ZXMgPSBwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcztcclxuXHJcbiAgICAgIC8vIG1hcHMgdGhlIElEcyB0byB0aGUgR3JpZCBSb3dzIGFuZCB2aWNlIHZlcnNhLCB0aGUgXCJkYXRhQ29udGV4dElkc1wiIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG90aGVyXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFDb250ZXh0SWRzKSAmJiBkYXRhQ29udGV4dElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ3JpZFJvd0luZGV4ZXMgPSB0aGlzLmRhdGFWaWV3Lm1hcElkc1RvUm93cyhkYXRhQ29udGV4dElkcykgfHwgW107XHJcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykgJiYgZ3JpZFJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGRhdGFDb250ZXh0SWRzID0gdGhpcy5kYXRhVmlldy5tYXBSb3dzVG9JZHMoZ3JpZFJvd0luZGV4ZXMpIHx8IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZS5zZWxlY3RlZFJvd0RhdGFDb250ZXh0SWRzID0gZGF0YUNvbnRleHRJZHM7XHJcblxyXG4gICAgICAvLyBjaGFuZ2UgdGhlIHNlbGVjdGVkIHJvd3MgZXhjZXB0IFVOTEVTUyBpdCdzIGEgTG9jYWwgR3JpZCB3aXRoIFBhZ2luYXRpb25cclxuICAgICAgLy8gbG9jYWwgUGFnaW5hdGlvbiB1c2VzIHRoZSBEYXRhVmlldyBhbmQgdGhhdCBhbHNvIHRyaWdnZXIgYSBjaGFuZ2UvcmVmcmVzaFxyXG4gICAgICAvLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIDIgR3JpZCBTdGF0ZSBjaGFuZ2VzIGp1c3QgMVxyXG4gICAgICBpZiAoKHRoaXMuX2lzTG9jYWxHcmlkICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24pIHx8ICF0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIEFycmF5LmlzQXJyYXkoZ3JpZFJvd0luZGV4ZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhncmlkUm93SW5kZXhlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogR3JpZE9wdGlvbik6IEdyaWRPcHRpb24ge1xyXG4gICAgZ3JpZE9wdGlvbnMuZ3JpZElkID0gdGhpcy5ncmlkSWQ7XHJcbiAgICBncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgPSBgc2xpY2tHcmlkQ29udGFpbmVyLSR7dGhpcy5ncmlkSWR9YDtcclxuXHJcbiAgICAvLyBpZiB3ZSBoYXZlIGEgYmFja2VuZFNlcnZpY2VBcGkgYW5kIHRoZSBlbmFibGVQYWdpbmF0aW9uIGlzIHVuZGVmaW5lZCwgd2UnbGwgYXNzdW1lIHRoYXQgd2UgZG8gd2FudCB0byBzZWUgaXQsIGVsc2UgZ2V0IHRoYXQgZGVmaW5lZCB2YWx1ZVxyXG4gICAgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9ICgoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uKSB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyB1c2UganF1ZXJ5IGV4dGVuZCB0byBkZWVwIG1lcmdlICYgY29weSB0byBhdm9pZCBpbW11dGFibGUgcHJvcGVydGllcyBiZWluZyBjaGFuZ2VkIGluIEdsb2JhbEdyaWRPcHRpb25zIGFmdGVyIGEgcm91dGUgY2hhbmdlXHJcbiAgICBjb25zdCBvcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIEdsb2JhbEdyaWRPcHRpb25zLCB0aGlzLmZvclJvb3RDb25maWcsIGdyaWRPcHRpb25zKSBhcyBHcmlkT3B0aW9uO1xyXG5cclxuICAgIC8vIHVzaW5nIGpRdWVyeSBleHRlbmQgdG8gZG8gYSBkZWVwIGNsb25lIGhhcyBhbiB1bndhbnRlZCBzaWRlIG9uIG9iamVjdHMgYW5kIHBhZ2VTaXplcyBidXQgRVM2IHNwcmVhZCBoYXMgb3RoZXIgd29yc3Qgc2lkZSBlZmZlY3RzXHJcbiAgICAvLyBzbyB3ZSB3aWxsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwYWdlU2l6ZXMgd2hlbiBuZWVkZWQsIHRoaXMgaXMgdGhlIG9ubHkgb25lIGNhdXNpbmcgaXNzdWVzIHNvIGZhci5cclxuICAgIC8vIGpRdWVyeSB3cm90ZSB0aGlzIG9uIHRoZWlyIGRvY3M6OiBPbiBhIGRlZXAgZXh0ZW5kLCBPYmplY3QgYW5kIEFycmF5IGFyZSBleHRlbmRlZCwgYnV0IG9iamVjdCB3cmFwcGVycyBvbiBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBTdHJpbmcsIEJvb2xlYW4sIGFuZCBOdW1iZXIgYXJlIG5vdC5cclxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uICYmIChncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uIHx8IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpKSAmJiAodGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24gfHwgZ3JpZE9wdGlvbnMucGFnaW5hdGlvbikpIHtcclxuICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8ucGFnZVNpemUgPz8gdGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplID8/IEdsb2JhbEdyaWRPcHRpb25zLnBhZ2luYXRpb24hLnBhZ2VTaXplO1xyXG4gICAgICBvcHRpb25zLnBhZ2luYXRpb24ucGFnZVNpemVzID0gZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8ucGFnZVNpemVzID8/IHRoaXMuZm9yUm9vdENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZXMgPz8gR2xvYmFsR3JpZE9wdGlvbnMucGFnaW5hdGlvbiEucGFnZVNpemVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsc28gbWFrZSBzdXJlIHRvIHNob3cgdGhlIGhlYWRlciByb3cgaWYgdXNlciBoYXZlIGVuYWJsZWQgZmlsdGVyaW5nXHJcbiAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IChvcHRpb25zLnNob3dIZWFkZXJSb3cgPT09IGZhbHNlKTtcclxuICAgIGlmIChvcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiAhb3B0aW9ucy5zaG93SGVhZGVyUm93KSB7XHJcbiAgICAgIG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9IG9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gd2UgdXNlIFBhZ2luYXRpb24gb24gTG9jYWwgR3JpZCwgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgd2l0aG91dCBlbmFibGVGaWx0ZXJpbmdcclxuICAgIC8vIHNvIHdlJ2xsIGVuYWJsZSB0aGUgZmlsdGVyaW5nIGJ1dCB3ZSdsbCBrZWVwIHRoZSBoZWFkZXIgcm93IGhpZGRlblxyXG4gICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nICYmIG9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICBvcHRpb25zLmVuYWJsZUZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKiogUHJlLVJlZ2lzdGVyIGFueSBSZXNvdXJjZSB0aGF0IGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZCAoZm9yIGV4YW1wbGUgUnhKUyBSZXNvdXJjZSAmIFJvd0RldGFpbCkgKi9cclxuICBwcml2YXRlIHByZVJlZ2lzdGVyUmVzb3VyY2VzKCkge1xyXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IHRoaXMuZ3JpZE9wdGlvbnMucmVnaXN0ZXJFeHRlcm5hbFJlc291cmNlcyB8fCBbXTtcclxuXHJcbiAgICAvLyBBbmd1bGFyLVNsaWNrZ3JpZCByZXF1aXJlcyBSeEpTLCBzbyB3ZSdsbCByZWdpc3RlciBpdCBhcyB0aGUgZmlyc3QgcmVzb3VyY2VcclxuICAgIHRoaXMucmVnaXN0ZXJSeEpzUmVzb3VyY2UobmV3IFJ4SnNSZXNvdXJjZSgpIGFzIFJ4SnNGYWNhZGUpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd0RldGFpbFZpZXcpIHtcclxuICAgICAgdGhpcy5zbGlja1Jvd0RldGFpbFZpZXcgPSBuZXcgU2xpY2tSb3dEZXRhaWxWaWV3KHRoaXMuYW5ndWxhclV0aWxTZXJ2aWNlLCB0aGlzLmFwcFJlZiwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLmVsbS5uYXRpdmVFbGVtZW50LCB0aGlzLnJ4anMpO1xyXG4gICAgICB0aGlzLnNsaWNrUm93RGV0YWlsVmlldy5jcmVhdGUodGhpcy5jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnNsaWNrUm93RGV0YWlsVmlldyk7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRFeHRlbnNpb25Ub0xpc3QoRXh0ZW5zaW9uTmFtZS5yb3dEZXRhaWxWaWV3LCB7IG5hbWU6IEV4dGVuc2lvbk5hbWUucm93RGV0YWlsVmlldywgaW5zdGFuY2U6IHRoaXMuc2xpY2tSb3dEZXRhaWxWaWV3IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3RlclJlc291cmNlcygpIHtcclxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIHdlIGNvbnNpZGVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlcyBhcyBleHRlcm5hbCBzZXJ2aWNlcywgYW55dGhpbmcgZWxzZSByZWdpc3RlcmVkIGFmdGVyd2FyZCBhcmVuJ3QgZXh0ZXJuYWxcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpKSB7XHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5leHRlcm5hbFJlZ2lzdGVyZWRSZXNvdXJjZXMgPSB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1c2ggYWxsIG90aGVyIFNlcnZpY2VzIHRoYXQgd2Ugd2FudCB0byBiZSByZWdpc3RlcmVkXHJcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5ncmlkU2VydmljZSwgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlKTtcclxuXHJcbiAgICAvLyB3aGVuIHVzaW5nIEdyb3VwaW5nL0RyYWdnYWJsZUdyb3VwaW5nL0NvbHNwYW4gcmVnaXN0ZXIgaXRzIFNlcnZpY2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNyZWF0ZVByZUhlYWRlclBhbmVsICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZURyYWdnYWJsZUdyb3VwaW5nKSB7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLmdyb3VwaW5nU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2luZyBUcmVlIERhdGEgVmlldywgcmVnaXN0ZXIgaXRzIFNlcnZpY2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyZWVEYXRhKSB7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2VyIGVuYWJsZXMgdHJhbnNsYXRpb24sIHdlIG5lZWQgdG8gdHJhbnNsYXRlIEhlYWRlcnMgb24gZmlyc3QgcGFzcyAmIHN1YnNlcXVlbnRseSBpbiB0aGUgYmluZERpZmZlcmVudEhvb2tzXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIGVtcHR5IHdhcm5pbmcgY29tcG9uZW50XHJcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nID0gbmV3IFNsaWNrRW1wdHlXYXJuaW5nQ29tcG9uZW50KCk7XHJcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5zbGlja0VtcHR5V2FybmluZyk7XHJcblxyXG4gICAgLy8gYmluZCAmIGluaXRpYWxpemUgYWxsIENvbXBvbmVudHMvU2VydmljZXMgdGhhdCB3ZXJlIHRhZ2dlZCBhcyBlbmFibGVkXHJcbiAgICAvLyByZWdpc3RlciBhbGwgc2VydmljZXMgYnkgZXhlY3V0aW5nIHRoZWlyIGluaXQgbWV0aG9kIGFuZCBwcm92aWRpbmcgdGhlbSB3aXRoIHRoZSBHcmlkIG9iamVjdFxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcclxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIHR5cGVvZiByZXNvdXJjZS5pbml0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICByZXNvdXJjZS5pbml0KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmNvbnRhaW5lclNlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlZ2lzdGVyIHRoZSBSeEpTIFJlc291cmNlIGluIGFsbCBuZWNlc3Nhcnkgc2VydmljZXMgd2hpY2ggdXNlcyAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJSeEpzUmVzb3VyY2UocmVzb3VyY2U6IFJ4SnNGYWNhZGUpIHtcclxuICAgIHRoaXMucnhqcyA9IHJlc291cmNlO1xyXG4gICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLnNvcnRTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdSeEpzUmVzb3VyY2UnLCB0aGlzLnJ4anMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVyIChvciBkaXNwb3NlKSB0aGUgUGFnaW5hdGlvbiBDb21wb25lbnQsIHVzZXIgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBGYWxzZSAodG8gbm90IHNob3cgaXQpIHdoaWNoIHdpbGwgaW4gdGVybSBkaXNwb3NlIG9mIHRoZSBQYWdpbmF0aW9uLFxyXG4gICAqIGFsc28gd2hpbGUgZGlzcG9zaW5nIHdlIGNhbiBjaG9vc2UgdG8gb21pdCB0aGUgZGlzcG9zYWJsZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlIChpZiB3ZSBhcmUgc2ltcGx5IHRvZ2dsaW5nIHRoZSBQYWdpbmF0aW9uLCB3ZSB3YW50IHRvIGtlZXAgdGhlIFNlcnZpY2UgYWxpdmUpXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBzaG93UGFnaW5hdGlvbiAtIHNob3cgKG5ldyByZW5kZXIpIG9yIG5vdCAoZGlzcG9zZSkgdGhlIFBhZ2luYXRpb25cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3VsZERpc3Bvc2VQYWdpbmF0aW9uU2VydmljZSAtIHdoZW4gZGlzcG9zaW5nIHRoZSBQYWdpbmF0aW9uLCBkbyB3ZSBhbHNvIHdhbnQgdG8gZGlzcG9zZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlPyAoZGVmYXVsdHMgdG8gVHJ1ZSlcclxuICAgKi9cclxuICBwcml2YXRlIHJlbmRlclBhZ2luYXRpb24oc2hvd1BhZ2luYXRpb24gPSB0cnVlKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlUGFnaW5hdGlvbiAmJiAhdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgJiYgc2hvd1BhZ2luYXRpb24pIHtcclxuICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24gPSBuZXcgU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50KHRoaXMucGFnaW5hdGlvblNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24ucmVuZGVyUGFnaW5hdGlvbih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICghc2hvd1BhZ2luYXRpb24pIHtcclxuICAgICAgaWYgKHRoaXMuc2xpY2tQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24uZGlzcG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYWtlcyBhIGZsYXQgZGF0YXNldCB3aXRoIHBhcmVudC9jaGlsZCByZWxhdGlvbnNoaXAsIHNvcnQgaXQgKHZpYSBpdHMgdHJlZSBzdHJ1Y3R1cmUpIGFuZCByZXR1cm4gdGhlIHNvcnRlZCBmbGF0IGFycmF5XHJcbiAgICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmbGF0RGF0YXNldElucHV0IC0gZmxhdCBkYXRhc2V0IGlucHV0XHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUdyaWRSZWZyZXNoIC0gb3B0aW9uYWxseSBmb3JjZSBhIGZ1bGwgZ3JpZCByZWZyZXNoXHJcbiAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IHNvcnQgZmxhdCBwYXJlbnQvY2hpbGQgZGF0YXNldFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFRyZWVEYXRhc2V0PFQ+KGZsYXREYXRhc2V0SW5wdXQ6IFRbXSwgZm9yY2VHcmlkUmVmcmVzaCA9IGZhbHNlKTogVFtdIHtcclxuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcclxuICAgIGxldCBzb3J0ZWREYXRhc2V0UmVzdWx0O1xyXG4gICAgbGV0IGZsYXREYXRhc2V0T3V0cHV0OiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoaWVyYXJjaGljYWwgZGF0YXNldCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCB0aGVuIG5vIG5lZWQgdG8gcmUtY29udmVydCBpdCwgd2UgY2FuIHVzZSBpdCBkaXJlY3RseSBmcm9tIHRoZSBzaGFyZWQgc2VydmljZSByZWZcclxuICAgIGlmICh0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCAmJiB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwpIHtcclxuICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLnNvcnRIaWVyYXJjaGljYWxEYXRhc2V0KHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCk7XHJcbiAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5mbGF0O1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZsYXREYXRhc2V0SW5wdXQpICYmIGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8udHJlZURhdGFPcHRpb25zPy5pbml0aWFsU29ydCkge1xyXG4gICAgICAgIC8vIGVsc2Ugd2UgbmVlZCB0byBmaXJzdCBjb252ZXJ0IHRoZSBmbGF0IGRhdGFzZXQgdG8gYSBoaWVyYXJjaGljYWwgZGF0YXNldCBhbmQgdGhlbiBzb3J0XHJcbiAgICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0QW5kU29ydChmbGF0RGF0YXNldElucHV0LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmhpZXJhcmNoaWNhbDtcclxuICAgICAgICBmbGF0RGF0YXNldE91dHB1dCA9IHNvcnRlZERhdGFzZXRSZXN1bHQuZmxhdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBlbHNlIHdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIHByb3ZpZGVkIGFuIGFycmF5IHRoYXQgaXMgYWxyZWFkeSBzb3J0ZWQgKHVzZXIncyByZXNwb25zYWJpbGl0eSlcclxuICAgICAgICAvLyBhbmQgc28gd2UgY2FuIHNpbXBseSBjb252ZXJ0IHRoZSBhcnJheSB0byBhIHRyZWUgc3RydWN0dXJlIGFuZCB3ZSdyZSBkb25lLCBubyBuZWVkIHRvIHNvcnRcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gZmxhdERhdGFzZXRJbnB1dCB8fCBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHdlIGFkZC9yZW1vdmUgaXRlbShzKSBmcm9tIHRoZSBkYXRhc2V0LCB3ZSBuZWVkIHRvIGFsc28gcmVmcmVzaCBvdXIgdHJlZSBkYXRhIGZpbHRlcnNcclxuICAgIGlmIChmbGF0RGF0YXNldElucHV0Lmxlbmd0aCA+IDAgJiYgKGZvcmNlR3JpZFJlZnJlc2ggfHwgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4pKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWZyZXNoVHJlZURhdGFGaWx0ZXJzKGZsYXREYXRhc2V0T3V0cHV0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmxhdERhdGFzZXRPdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIsIHdlIHByb3ZpZGUgdGhlIHByb3BlcnR5IFwiZWRpdG9yXCIgYXMgYW4gQW5ndWxhci1TbGlja2dyaWQgZWRpdG9yIGNvbXBsZXggb2JqZWN0XHJcbiAgICogaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XHJcbiAgICogc28gaW4gb3VyIGxpYiB3ZSB3aWxsIHN3YXAgXCJlZGl0b3JcIiBhbmQgY29weSBpdCBpbnRvIGEgbmV3IHByb3BlcnR5IGNhbGxlZCBcImludGVybmFsQ29sdW1uRWRpdG9yXCJcclxuICAgKiB0aGVuIHRha2UgYmFjayBcImVkaXRvci5tb2RlbFwiIGFuZCBtYWtlIGl0IHRoZSBuZXcgXCJlZGl0b3JcIiBzbyB0aGF0IFNsaWNrR3JpZCBFZGl0b3IgRmFjdG9yeSBzdGlsbCB3b3Jrc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xyXG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLnNvbWUoY29sID0+IGAke2NvbC5pZH1gLmluY2x1ZGVzKCcuJykpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tBbmd1bGFyLVNsaWNrZ3JpZF0gTWFrZSBzdXJlIHRoYXQgbm9uZSBvZiB5b3VyIENvbHVtbiBEZWZpbml0aW9uIFwiaWRcIiBwcm9wZXJ0eSBpbmNsdWRlcyBhIGRvdCBpbiBpdHMgbmFtZSBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSBzb21lIHByb2JsZW1zIHdpdGggdGhlIEVkaXRvcnMuIEZvciBleGFtcGxlIGlmIHlvdXIgY29sdW1uIGRlZmluaXRpb24gXCJmaWVsZFwiIHByb3BlcnR5IGlzIFwidXNlci5maXJzdE5hbWVcIiB0aGVuIHVzZSBcImZpcnN0TmFtZVwiIGFzIHRoZSBjb2x1bW4gXCJpZFwiLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW5EZWZpbml0aW9ucy5tYXAoKGNvbHVtbjogQ29sdW1uIHwgYW55KSA9PiB7XHJcbiAgICAgIC8vIG9uIGV2ZXJ5IEVkaXRvciB0aGF0IGhhdmUgYSBcImNvbGxlY3Rpb25Bc3luY1wiLCByZXNvbHZlIHRoZSBkYXRhIGFuZCBhc3NpZ24gaXQgdG8gdGhlIFwiY29sbGVjdGlvblwiIHByb3BlcnR5XHJcbiAgICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmVkaXRvciAmJiBjb2x1bW4uZWRpdG9yLmNvbGxlY3Rpb25Bc3luYykge1xyXG4gICAgICAgIHRoaXMubG9hZEVkaXRvckNvbGxlY3Rpb25Bc3luYyhjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgZWRpdG9yOiBjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IubW9kZWwsIGludGVybmFsQ29sdW1uRWRpdG9yOiB7IC4uLmNvbHVtbi5lZGl0b3IgfSB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpIHtcclxuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1ucyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LnRyYW5zbGF0ZUl0ZW1zKHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zLCAnbmFtZUtleScsICduYW1lJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpIHtcclxuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1uIGdyb3VwcyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LnRyYW5zbGF0ZUl0ZW1zKHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zLCAnY29sdW1uR3JvdXBLZXknLCAnY29sdW1uR3JvdXAnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgXCJpbnRlcm5hbENvbHVtbkVkaXRvci5jb2xsZWN0aW9uXCIgcHJvcGVydHkuXHJcbiAgICogU2luY2UgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzeW5jIGNhbGwgcmVzb2x2ZXMsIHRoZSBwb2ludGVyIHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBcImNvbHVtblwiIGFyZ3VtZW50IHBhc3NlZC5cclxuICAgKiBPbmNlIHdlIGZvdW5kIHRoZSBuZXcgcG9pbnRlciwgd2Ugd2lsbCByZWFzc2lnbiB0aGUgXCJlZGl0b3JcIiBhbmQgXCJjb2xsZWN0aW9uXCIgdG8gdGhlIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIiBzbyBpdCBoYXMgbmV3ZXN0IGNvbGxlY3Rpb25cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUVkaXRvckNvbGxlY3Rpb248VCA9IGFueT4oY29sdW1uOiBDb2x1bW48VD4sIG5ld0NvbGxlY3Rpb246IFRbXSkge1xyXG4gICAgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5jb2xsZWN0aW9uID0gbmV3Q29sbGVjdGlvbjtcclxuICAgIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBmaW5kIHRoZSBuZXcgY29sdW1uIHJlZmVyZW5jZSBwb2ludGVyICYgcmUtYXNzaWduIHRoZSBuZXcgZWRpdG9yIHRvIHRoZSBpbnRlcm5hbENvbHVtbkVkaXRvclxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jb2x1bW5EZWZpbml0aW9ucykpIHtcclxuICAgICAgY29uc3QgY29sdW1uUmVmID0gdGhpcy5jb2x1bW5EZWZpbml0aW9ucy5maW5kKChjb2w6IENvbHVtbikgPT4gY29sLmlkID09PSBjb2x1bW4uaWQpO1xyXG4gICAgICBpZiAoY29sdW1uUmVmKSB7XHJcbiAgICAgICAgY29sdW1uUmVmLmludGVybmFsQ29sdW1uRWRpdG9yID0gY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgY3VycmVudCBFZGl0b3IsIHJlbW92ZSBpdCBmcm9tIHRoZSBET00gdGhlbiByZS1lbmFibGUgaXQgYW5kIHJlLXJlbmRlciBpdCB3aXRoIHRoZSBuZXcgY29sbGVjdGlvbi5cclxuICAgIGNvbnN0IGN1cnJlbnRFZGl0b3IgPSB0aGlzLnNsaWNrR3JpZC5nZXRDZWxsRWRpdG9yKCkgYXMgQXV0b2NvbXBsZXRlckVkaXRvciB8IFNlbGVjdEVkaXRvcjtcclxuICAgIGlmIChjdXJyZW50RWRpdG9yPy5kaXNhYmxlICYmIGN1cnJlbnRFZGl0b3I/LnJlbmRlckRvbUVsZW1lbnQpIHtcclxuICAgICAgY3VycmVudEVkaXRvci5kZXN0cm95KCk7XHJcbiAgICAgIGN1cnJlbnRFZGl0b3IuZGlzYWJsZShmYWxzZSk7XHJcbiAgICAgIGN1cnJlbnRFZGl0b3IucmVuZGVyRG9tRWxlbWVudChuZXdDb2xsZWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBpZD1cInNsaWNrR3JpZENvbnRhaW5lci17e2dyaWRJZH19XCIgY2xhc3M9XCJncmlkUGFuZVwiPlxyXG4gIDxkaXYgYXR0ci5pZD0ne3tncmlkSWR9fScgY2xhc3M9XCJzbGlja2dyaWQtY29udGFpbmVyXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
1178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTyx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sbUNBQW1DLENBQUM7QUFFM0MsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUVuSyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFTTCxhQUFhO0FBWWIsV0FBVztBQUNYLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFFZCxhQUFhLEVBQ2IsZUFBZSxFQUNmLDhCQUE4QixFQUM5QixXQUFXLEVBQ1gsZUFBZTtBQUVmLFlBQVk7QUFDWix5Q0FBeUMsRUFDekMsWUFBWSxFQUNaLGFBQWEsRUFDYixjQUFjLEdBQ2YsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsa0JBQWtCLEVB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LGlCQUFpQjs0Q0FoSWxCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWVGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFnQkksdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUdILE9BQU87c0JBRFYsS0FBSztnQkEwQkYsbUJBQW1CO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IDNyZCBwYXJ0eSB2ZW5kb3IgbGlic1xuaW1wb3J0ICdzbGlja2dyaWQvZGlzdC9zbGljay5jb3JlLm1pbic7XG5pbXBvcnQgJ3NsaWNrZ3JpZC9kaXN0L3NsaWNrLmludGVyYWN0aW9ucy5taW4nO1xuaW1wb3J0ICdzbGlja2dyaWQvZGlzdC9zbGljay5ncmlkLm1pbic7XG5pbXBvcnQgJ3NsaWNrZ3JpZC9kaXN0L3NsaWNrLmRhdGF2aWV3Lm1pbic7XG5cbi8vIC4uLnRoZW4gZXZlcnl0aGluZyBlbHNlLi4uXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBBcHBsaWNhdGlvblJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBPdXRwdXQsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIC8vIGludGVyZmFjZXMvdHlwZXNcbiAgQXV0b2NvbXBsZXRlckVkaXRvcixcbiAgQmFja2VuZFNlcnZpY2VBcGksXG4gIEJhY2tlbmRTZXJ2aWNlT3B0aW9uLFxuICBDb2x1bW4sXG4gIENvbHVtbkVkaXRvcixcbiAgRGF0YVZpZXdPcHRpb24sXG4gIEV2ZW50U3Vic2NyaXB0aW9uLFxuICBFeHRlbnNpb25OYW1lLFxuICBFeHRlcm5hbFJlc291cmNlLFxuICBMb2NhbGUsXG4gIE1ldHJpY3MsXG4gIFBhZ2luYXRpb24sXG4gIFNlbGVjdEVkaXRvcixcbiAgU2VydmljZVBhZ2luYXRpb24sXG4gIFNsaWNrRGF0YVZpZXcsXG4gIFNsaWNrRXZlbnRIYW5kbGVyLFxuICBTbGlja0dyaWQsXG4gIFNsaWNrTmFtZXNwYWNlLFxuXG4gIC8vIHNlcnZpY2VzXG4gIEJhY2tlbmRVdGlsaXR5U2VydmljZSxcbiAgQ29sbGVjdGlvblNlcnZpY2UsXG4gIEV2ZW50TmFtaW5nU3R5bGUsXG4gIEV4dGVuc2lvblNlcnZpY2UsXG4gIEV4dGVuc2lvblV0aWxpdHksXG4gIEZpbHRlckZhY3RvcnksXG4gIEZpbHRlclNlcnZpY2UsXG4gIEdyaWRFdmVudFNlcnZpY2UsXG4gIEdyaWRTZXJ2aWNlLFxuICBHcmlkU3RhdGVTZXJ2aWNlLFxuICBHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlLFxuICBQYWdpbmF0aW9uU2VydmljZSxcbiAgUmVzaXplclNlcnZpY2UsXG4gIFJ4SnNGYWNhZGUsXG4gIFNoYXJlZFNlcnZpY2UsXG4gIFNsaWNrZ3JpZENvbmZpZyxcbiAgU2xpY2tHcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyLFxuICBTb3J0U2VydmljZSxcbiAgVHJlZURhdGFTZXJ2aWNlLFxuXG4gIC8vIHV0aWxpdGllc1xuICBhdXRvQWRkRWRpdG9yRm9ybWF0dGVyVG9Db2x1bW5zV2l0aEVkaXRvcixcbiAgZW1wdHlFbGVtZW50LFxuICBHcmlkU3RhdGVUeXBlLFxuICB1bnN1YnNjcmliZUFsbCxcbn0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY29tbW9uJztcbmltcG9ydCB7IEV2ZW50UHViU3ViU2VydmljZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2V2ZW50LXB1Yi1zdWInO1xuaW1wb3J0IHsgU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9lbXB0eS13YXJuaW5nLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGlja0Zvb3RlckNvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2N1c3RvbS1mb290ZXItY29tcG9uZW50JztcbmltcG9ydCB7IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3BhZ2luYXRpb24tY29tcG9uZW50JztcbmltcG9ydCB7IFJ4SnNSZXNvdXJjZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3J4anMtb2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBkZXF1YWwgfSBmcm9tICdkZXF1YWwvbGl0ZSc7XG5cbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBbmd1bGFyR3JpZEluc3RhbmNlLCBFeHRlcm5hbFRlc3RpbmdEZXBlbmRlbmNpZXMsIEdyaWRPcHRpb24sIH0gZnJvbSAnLi8uLi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHsgR2xvYmFsR3JpZE9wdGlvbnMgfSBmcm9tICcuLy4uL2dsb2JhbC1ncmlkLW9wdGlvbnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90cmFuc2xhdGVyLnNlcnZpY2UnO1xuXG4vLyBTZXJ2aWNlc1xuaW1wb3J0IHsgQW5ndWxhclV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYW5ndWxhclV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBTbGlja1Jvd0RldGFpbFZpZXcgfSBmcm9tICcuLi9leHRlbnNpb25zL3NsaWNrUm93RGV0YWlsVmlldyc7XG5pbXBvcnQgeyBDb250YWluZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29udGFpbmVyLnNlcnZpY2UnO1xuXG4vLyB1c2luZyBleHRlcm5hbCBub24tdHlwZWQganMgbGlicmFyaWVzXG5kZWNsYXJlIGNvbnN0IFNsaWNrOiBTbGlja05hbWVzcGFjZTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYW5ndWxhci1zbGlja2dyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBtYWtlIGV2ZXJ5dGhpbmcgdHJhbnNpZW50IChub24tc2luZ2xldG9uKVxuICAgIEFuZ3VsYXJVdGlsU2VydmljZSxcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBUcmFuc2xhdGVyU2VydmljZSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyU2xpY2tncmlkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfZGF0YXNldD86IGFueVtdIHwgbnVsbDtcbiAgcHJpdmF0ZSBfY29sdW1uRGVmaW5pdGlvbnMhOiBDb2x1bW5bXTtcbiAgcHJpdmF0ZSBfY3VycmVudERhdGFzZXRMZW5ndGggPSAwO1xuICBwcml2YXRlIF9ldmVudEhhbmRsZXI6IFNsaWNrRXZlbnRIYW5kbGVyID0gbmV3IFNsaWNrLkV2ZW50SGFuZGxlcigpO1xuICBwcml2YXRlIF9ldmVudFB1YlN1YlNlcnZpY2UhOiBFdmVudFB1YlN1YlNlcnZpY2U7XG4gIHByaXZhdGUgX2FuZ3VsYXJHcmlkSW5zdGFuY2VzOiBBbmd1bGFyR3JpZEluc3RhbmNlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0dyaWRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0RhdGFzZXRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0xvY2FsR3JpZCA9IHRydWU7XG4gIHByaXZhdGUgX3BhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZWdpc3RlcmVkUmVzb3VyY2VzOiBFeHRlcm5hbFJlc291cmNlW10gPSBbXTtcbiAgZGF0YVZpZXchOiBTbGlja0RhdGFWaWV3O1xuICBzbGlja0dyaWQhOiBTbGlja0dyaWQ7XG4gIGdyb3VwaW5nRGVmaW5pdGlvbjogYW55ID0ge307XG4gIGdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI/OiBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XG4gIGJhY2tlbmRTZXJ2aWNlQXBpPzogQmFja2VuZFNlcnZpY2VBcGk7XG4gIGxvY2FsZXMhOiBMb2NhbGU7XG4gIG1ldHJpY3M/OiBNZXRyaWNzO1xuICBzaG93UGFnaW5hdGlvbiA9IGZhbHNlO1xuICBzZXJ2aWNlTGlzdDogYW55W10gPSBbXTtcbiAgdG90YWxJdGVtcyA9IDA7XG4gIHBhZ2luYXRpb25EYXRhPzoge1xuICAgIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uO1xuICAgIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZTtcbiAgfTtcbiAgc3Vic2NyaXB0aW9uczogRXZlbnRTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIC8vIGNvbXBvbmVudHMgLyBwbHVnaW5zXG4gIHNsaWNrRW1wdHlXYXJuaW5nPzogU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQ7XG4gIHNsaWNrRm9vdGVyPzogU2xpY2tGb290ZXJDb21wb25lbnQ7XG4gIHNsaWNrUGFnaW5hdGlvbj86IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudDtcbiAgc2xpY2tSb3dEZXRhaWxWaWV3PzogU2xpY2tSb3dEZXRhaWxWaWV3O1xuXG4gIC8vIHNlcnZpY2VzXG4gIGJhY2tlbmRVdGlsaXR5U2VydmljZSE6IEJhY2tlbmRVdGlsaXR5U2VydmljZTtcbiAgY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlO1xuICBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlO1xuICBleHRlbnNpb25VdGlsaXR5OiBFeHRlbnNpb25VdGlsaXR5O1xuICBmaWx0ZXJGYWN0b3J5ITogRmlsdGVyRmFjdG9yeTtcbiAgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZTtcbiAgZ3JpZEV2ZW50U2VydmljZTogR3JpZEV2ZW50U2VydmljZTtcbiAgZ3JpZFNlcnZpY2U6IEdyaWRTZXJ2aWNlO1xuICBncmlkU3RhdGVTZXJ2aWNlOiBHcmlkU3RhdGVTZXJ2aWNlO1xuICBncm91cGluZ1NlcnZpY2U6IEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2U7XG4gIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZTtcbiAgcmVzaXplclNlcnZpY2UhOiBSZXNpemVyU2VydmljZTtcbiAgcnhqcz86IFJ4SnNGYWNhZGU7XG4gIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2U7XG4gIHNvcnRTZXJ2aWNlOiBTb3J0U2VydmljZTtcbiAgdHJlZURhdGFTZXJ2aWNlOiBUcmVlRGF0YVNlcnZpY2U7XG5cbiAgQElucHV0KCkgY3VzdG9tRGF0YVZpZXc6IGFueTtcbiAgQElucHV0KCkgZ3JpZElkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZ3JpZE9wdGlvbnMhOiBHcmlkT3B0aW9uO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdpbmF0aW9uT3B0aW9ucygpOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnM7XG4gIH1cbiAgc2V0IHBhZ2luYXRpb25PcHRpb25zKG5ld1BhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5ld1BhZ2luYXRpb25PcHRpb25zICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKSB7XG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHsgLi4udGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uLCAuLi50aGlzLl9wYWdpbmF0aW9uT3B0aW9ucywgLi4ubmV3UGFnaW5hdGlvbk9wdGlvbnMgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgPSBuZXdQYWdpbmF0aW9uT3B0aW9ucztcbiAgICB9XG4gICAgdGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uID0gdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgPz8gdGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uO1xuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlVG90YWxJdGVtcyh0aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgPz8gMCwgdHJ1ZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgY29sdW1uRGVmaW5pdGlvbnMoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XG4gICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSBjb2x1bW5EZWZpbml0aW9ucztcbiAgICBpZiAodGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uRGVmaW5pdGlvbnNMaXN0KGNvbHVtbkRlZmluaXRpb25zKTtcbiAgICB9XG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29weUNvbHVtbldpZHRoc1JlZmVyZW5jZShjb2x1bW5EZWZpbml0aW9ucyk7XG4gICAgfVxuICB9XG4gIGdldCBjb2x1bW5EZWZpbml0aW9ucygpOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xuICB9XG5cbiAgLy8gbWFrZSB0aGUgY29sdW1uRGVmaW5pdGlvbnMgYSAyLXdheSBiaW5kaW5nIHNvIHRoYXQgcGx1Z2luIGFkZGluZyBjb2xzXG4gIC8vIGFyZSBzeW5jaGVkIG9uIHVzZXIncyBzaWRlIGFzIHdlbGwgKFJvd01vdmUsIFJvd0RldGFpbCwgUm93U2VsZWN0aW9ucylcbiAgQE91dHB1dCgpIGNvbHVtbkRlZmluaXRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTtcblxuICBASW5wdXQoKVxuICBnZXQgZGF0YXNldCgpOiBhbnlbXSB7XG4gICAgcmV0dXJuICh0aGlzLmN1c3RvbURhdGFWaWV3ID8gdGhpcy5zbGlja0dyaWQ/LmdldERhdGE/LigpIDogdGhpcy5kYXRhVmlldz8uZ2V0SXRlbXM/LigpKSB8fCBbXTtcbiAgfVxuICBzZXQgZGF0YXNldChuZXdEYXRhc2V0OiBhbnlbXSkge1xuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcbiAgICBjb25zdCBpc0RhdGFzZXRFcXVhbCA9IGRlcXVhbChuZXdEYXRhc2V0LCB0aGlzLl9kYXRhc2V0IHx8IFtdKTtcbiAgICBsZXQgZGF0YSA9IG5ld0RhdGFzZXQ7XG5cbiAgICAvLyB3aGVuIFRyZWUgRGF0YSBpcyBlbmFibGVkIGFuZCB3ZSBkb24ndCB5ZXQgaGF2ZSB0aGUgaGllcmFyY2hpY2FsIGRhdGFzZXQgZmlsbGVkLCB3ZSBjYW4gZm9yY2UgYSBjb252ZXJ0K3NvcnQgb2YgdGhlIGFycmF5XG4gICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVRyZWVEYXRhICYmIEFycmF5LmlzQXJyYXkobmV3RGF0YXNldCkgJiYgKG5ld0RhdGFzZXQubGVuZ3RoID4gMCB8fCBuZXdEYXRhc2V0Lmxlbmd0aCAhPT0gcHJldkRhdGFzZXRMbiB8fCAhaXNEYXRhc2V0RXF1YWwpKSB7XG4gICAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgZGF0YSA9IHRoaXMuc29ydFRyZWVEYXRhc2V0KG5ld0RhdGFzZXQsICFpc0RhdGFzZXRFcXVhbCk7IC8vIGlmIGRhdGFzZXQgY2hhbmdlZCwgdGhlbiBmb3JjZSBhIHJlZnJlc2ggYW55d2F5XG4gICAgfVxuICAgIHRoaXMuX2RhdGFzZXQgPSBkYXRhO1xuICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKGRhdGEgfHwgW10pO1xuICAgIHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoID0gKG5ld0RhdGFzZXQgfHwgW10pLmxlbmd0aDtcblxuICAgIC8vIGV4cGFuZC9hdXRvZml0IGNvbHVtbnMgb24gZmlyc3QgcGFnZSBsb2FkXG4gICAgLy8gd2UgY2FuIGFzc3VtZSB0aGF0IGlmIHRoZSBwcmV2RGF0YXNldCB3YXMgZW1wdHkgdGhlbiB3ZSBhcmUgb24gZmlyc3QgbG9hZFxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIHByZXZEYXRhc2V0TG4gPT09IDApIHtcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmF1dG9zaXplQ29sdW1ucygpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBkYXRhc2V0SGllcmFyY2hpY2FsKCk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQ7XG4gIH1cbiAgc2V0IGRhdGFzZXRIaWVyYXJjaGljYWwobmV3SGllcmFyY2hpY2FsRGF0YXNldDogYW55W10gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpc0RhdGFzZXRFcXVhbCA9IGRlcXVhbChuZXdIaWVyYXJjaGljYWxEYXRhc2V0LCB0aGlzLnNoYXJlZFNlcnZpY2U/LmhpZXJhcmNoaWNhbERhdGFzZXQgPz8gW10pO1xuICAgIGNvbnN0IHByZXZGbGF0RGF0YXNldExuID0gdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGg7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBuZXdIaWVyYXJjaGljYWxEYXRhc2V0O1xuXG4gICAgaWYgKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQgJiYgdGhpcy5jb2x1bW5EZWZpbml0aW9ucyAmJiB0aGlzLmZpbHRlclNlcnZpY2U/LmNsZWFyRmlsdGVycykge1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmNsZWFyRmlsdGVycygpO1xuICAgIH1cblxuICAgIC8vIHdoZW4gYSBoaWVyYXJjaGljYWwgZGF0YXNldCBpcyBzZXQgYWZ0ZXJ3YXJkLCB3ZSBjYW4gcmVzZXQgdGhlIGZsYXQgZGF0YXNldCBhbmQgY2FsbCBhIHRyZWUgZGF0YSBzb3J0IHRoYXQgd2lsbCBvdmVyd3JpdGUgdGhlIGZsYXQgZGF0YXNldFxuICAgIGlmIChuZXdIaWVyYXJjaGljYWxEYXRhc2V0ICYmIHRoaXMuc2xpY2tHcmlkICYmIHRoaXMuc29ydFNlcnZpY2U/LnByb2Nlc3NUcmVlRGF0YUluaXRpYWxTb3J0KSB7XG4gICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKFtdLCB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSA/PyAnaWQnKTtcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQoKTtcblxuICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHJlc2V0L3JlZnJlc2ggdGhlIFRyZWUgRGF0YSBmaWx0ZXJzIGJlY2F1c2UgaWYgd2UgaW5zZXJ0ZWQgbmV3IGl0ZW0ocykgdGhlbiBpdCBtaWdodCBub3Qgc2hvdyB1cCB3aXRob3V0IGRvaW5nIHRoaXMgcmVmcmVzaFxuICAgICAgLy8gaG93ZXZlciB3ZSBuZWVkIDEgY3B1IGN5Y2xlIGJlZm9yZSBoYXZpbmcgdGhlIERhdGFWaWV3IHJlZnJlc2hlZCwgc28gd2UgbmVlZCB0byB3cmFwIHRoaXMgY2hlY2sgaW4gYSBzZXRUaW1lb3V0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZmxhdERhdGFzZXRMbiA9IHRoaXMuZGF0YVZpZXcuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIGlmIChmbGF0RGF0YXNldExuID4gMCAmJiAoZmxhdERhdGFzZXRMbiAhPT0gcHJldkZsYXREYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xuICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWZyZXNoVHJlZURhdGFGaWx0ZXJzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiB0aGlzLmVsbTtcbiAgfVxuXG4gIGdldCBldmVudEhhbmRsZXIoKTogU2xpY2tFdmVudEhhbmRsZXIge1xuICAgIHJldHVybiB0aGlzLl9ldmVudEhhbmRsZXI7XG4gIH1cblxuICBnZXQgZ3JpZENvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgfHwgJyd9YCk7XG4gIH1cblxuICAvKiogR0VUVEVSIHRvIGtub3cgaWYgZGF0YXNldCB3YXMgaW5pdGlhbGl6ZWQgb3Igbm90ICovXG4gIGdldCBpc0RhdGFzZXRJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQ7XG4gIH1cbiAgLyoqIFNFVFRFUiB0byBjaGFuZ2UgaWYgZGF0YXNldCB3YXMgaW5pdGlhbGl6ZWQgb3Igbm90IChzdHJpbmdseSB1c2VkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpICovXG4gIHNldCBpc0RhdGFzZXRJbml0aWFsaXplZChpc0luaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSBpc0luaXRpYWxpemVkO1xuICB9XG4gIHNldCBpc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZChpc0luaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSBpc0luaXRpYWxpemVkO1xuICB9XG5cbiAgZ2V0IHJlZ2lzdGVyZWRSZXNvdXJjZXMoKTogRXh0ZXJuYWxSZXNvdXJjZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhclV0aWxTZXJ2aWNlOiBBbmd1bGFyVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyU2VydmljZTogQ29udGFpbmVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsbTogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZXJTZXJ2aWNlOiBUcmFuc2xhdGVyU2VydmljZSxcbiAgICBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIGZvclJvb3RDb25maWc6IEdyaWRPcHRpb24sXG4gICAgQEluamVjdCgnZXh0ZXJuYWxTZXJ2aWNlJykgZXh0ZXJuYWxTZXJ2aWNlczogRXh0ZXJuYWxUZXN0aW5nRGVwZW5kZW5jaWVzXG4gICkge1xuICAgIGNvbnN0IHNsaWNrZ3JpZENvbmZpZyA9IG5ldyBTbGlja2dyaWRDb25maWcoKTtcblxuICAgIC8vIGluaXRpYWxpemUgYW5kIGFzc2lnbiBhbGwgU2VydmljZSBEZXBlbmRlbmNpZXNcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ldmVudFB1YlN1YlNlcnZpY2UgPz8gbmV3IEV2ZW50UHViU3ViU2VydmljZSh0aGlzLmVsbS5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZXZlbnROYW1pbmdTdHlsZSA9IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xuXG4gICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgPz8gbmV3IEJhY2tlbmRVdGlsaXR5U2VydmljZSgpO1xuICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRFdmVudFNlcnZpY2UgPz8gbmV3IEdyaWRFdmVudFNlcnZpY2UoKTtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zaGFyZWRTZXJ2aWNlID8/IG5ldyBTaGFyZWRTZXJ2aWNlKCk7XG4gICAgdGhpcy5jb2xsZWN0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmNvbGxlY3Rpb25TZXJ2aWNlID8/IG5ldyBDb2xsZWN0aW9uU2VydmljZSh0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkgPSBleHRlcm5hbFNlcnZpY2VzPy5leHRlbnNpb25VdGlsaXR5ID8/IG5ldyBFeHRlbnNpb25VdGlsaXR5KHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IG5ldyBGaWx0ZXJGYWN0b3J5KHNsaWNrZ3JpZENvbmZpZywgdGhpcy50cmFuc2xhdGVyU2VydmljZSwgdGhpcy5jb2xsZWN0aW9uU2VydmljZSk7XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZmlsdGVyU2VydmljZSA/PyBuZXcgRmlsdGVyU2VydmljZSh0aGlzLmZpbHRlckZhY3RvcnkgYXMgYW55LCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xuICAgIHRoaXMucmVzaXplclNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5yZXNpemVyU2VydmljZSA/PyBuZXcgUmVzaXplclNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcbiAgICB0aGlzLnNvcnRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uc29ydFNlcnZpY2UgPz8gbmV3IFNvcnRTZXJ2aWNlKHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSk7XG4gICAgdGhpcy50cmVlRGF0YVNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy50cmVlRGF0YVNlcnZpY2UgPz8gbmV3IFRyZWVEYXRhU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSk7XG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnBhZ2luYXRpb25TZXJ2aWNlID8/IG5ldyBQYWdpbmF0aW9uU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xuXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXh0ZW5zaW9uU2VydmljZSA/PyBuZXcgRXh0ZW5zaW9uU2VydmljZShcbiAgICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSxcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZSxcbiAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSxcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZSxcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UsXG4gICAgICB0aGlzLnRyZWVEYXRhU2VydmljZSxcbiAgICAgIHRoaXMudHJhbnNsYXRlclNlcnZpY2UsXG4gICAgKTtcblxuICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRTdGF0ZVNlcnZpY2UgPz8gbmV3IEdyaWRTdGF0ZVNlcnZpY2UodGhpcy5leHRlbnNpb25TZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XG4gICAgdGhpcy5ncmlkU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRTZXJ2aWNlID8/IG5ldyBHcmlkU2VydmljZSh0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsIHRoaXMuZmlsdGVyU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UsIHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcbiAgICB0aGlzLmdyb3VwaW5nU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/Lmdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UgPz8gbmV3IEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UodGhpcy5leHRlbnNpb25VdGlsaXR5LCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UpO1xuXG4gICAgdGhpcy5zZXJ2aWNlTGlzdCA9IFtcbiAgICAgIHRoaXMuY29udGFpbmVyU2VydmljZSxcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSxcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZSxcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSxcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UsXG4gICAgICB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsXG4gICAgICB0aGlzLmdyb3VwaW5nU2VydmljZSxcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLFxuICAgICAgdGhpcy5zb3J0U2VydmljZSxcbiAgICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlLFxuICAgIF07XG5cbiAgICAvLyByZWdpc3RlciBhbGwgU2VydmljZSBpbnN0YW5jZXMgaW4gdGhlIGNvbnRhaW5lclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdFeHRlbnNpb25VdGlsaXR5JywgdGhpcy5leHRlbnNpb25VdGlsaXR5KTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRmlsdGVyU2VydmljZScsIHRoaXMuZmlsdGVyU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0NvbGxlY3Rpb25TZXJ2aWNlJywgdGhpcy5jb2xsZWN0aW9uU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V4dGVuc2lvblNlcnZpY2UnLCB0aGlzLmV4dGVuc2lvblNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkRXZlbnRTZXJ2aWNlJywgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZFNlcnZpY2UnLCB0aGlzLmdyaWRTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZFN0YXRlU2VydmljZScsIHRoaXMuZ3JpZFN0YXRlU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UnLCB0aGlzLmdyb3VwaW5nU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1BhZ2luYXRpb25TZXJ2aWNlJywgdGhpcy5wYWdpbmF0aW9uU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1Jlc2l6ZXJTZXJ2aWNlJywgdGhpcy5yZXNpemVyU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1NoYXJlZFNlcnZpY2UnLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTb3J0U2VydmljZScsIHRoaXMuc29ydFNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdFdmVudFB1YlN1YlNlcnZpY2UnLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdQdWJTdWJTZXJ2aWNlJywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnVHJhbnNsYXRlclNlcnZpY2UnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnVHJlZURhdGFTZXJ2aWNlJywgdGhpcy50cmVlRGF0YVNlcnZpY2UpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucyB8fCAhdGhpcy5jb2x1bW5EZWZpbml0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBgPGFuZ3VsYXItc2xpY2tncmlkPmAgcmVxdWlyZXMgW2dyaWRPcHRpb25zXSBhbmQgW2NvbHVtbkRlZmluaXRpb25zXSwgaXQgc2VlbXMgdGhhdCB5b3UgbWlnaHQgaGF2ZSBmb3Jnb3QgdG8gcHJvdmlkZSB0aGVtIHNpbmNlIGF0IGxlYXN0IG9mIHRoZW0gaXMgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemF0aW9uKHRoaXMuX2V2ZW50SGFuZGxlcik7XG4gICAgdGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgLy8gcmVjaGVjayB0aGUgZW1wdHkgd2FybmluZyBtZXNzYWdlIGFmdGVyIGdyaWQgaXMgc2hvd24gc28gdGhhdCBpdCB3b3JrcyBpbiBldmVyeSB1c2UgY2FzZVxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFzZXQpKSB7XG4gICAgICBjb25zdCBmaW5hbFRvdGFsQ291bnQgPSB0aGlzLmRhdGFzZXQubGVuZ3RoO1xuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25CZWZvcmVHcmlkRGVzdHJveScsIHRoaXMuc2xpY2tHcmlkKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25BZnRlckdyaWREZXN0cm95ZWQnLCB0cnVlKTtcbiAgfVxuXG4gIGRlc3Ryb3koc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyID0gZmFsc2UpIHtcbiAgICAvLyBkaXNwb3NlIG9mIGFsbCBTZXJ2aWNlc1xuICAgIHRoaXMuc2VydmljZUxpc3QuZm9yRWFjaCgoc2VydmljZTogYW55KSA9PiB7XG4gICAgICBpZiAoc2VydmljZSAmJiBzZXJ2aWNlLmRpc3Bvc2UpIHtcbiAgICAgICAgc2VydmljZS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2aWNlTGlzdCA9IFtdO1xuXG4gICAgLy8gZGlzcG9zZSBhbGwgcmVnaXN0ZXJlZCBleHRlcm5hbCByZXNvdXJjZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSkge1xuICAgICAgd2hpbGUgKHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucG9wKCk7XG4gICAgICAgIGlmIChyZXNvdXJjZT8uZGlzcG9zZSkge1xuICAgICAgICAgIHJlc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIGRpc3Bvc2UgdGhlIENvbXBvbmVudHNcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zbGlja0Zvb3Rlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2xpY2tQYWdpbmF0aW9uPy5kaXNwb3NlKCk7XG5cbiAgICBpZiAodGhpcy5fZXZlbnRIYW5kbGVyPy51bnN1YnNjcmliZUFsbCkge1xuICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZT8udW5zdWJzY3JpYmVBbGwoKTtcbiAgICBpZiAodGhpcy5kYXRhVmlldykge1xuICAgICAgaWYgKHRoaXMuZGF0YVZpZXc/LnNldEl0ZW1zKSB7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoW10pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuZGVzdHJveSkge1xuICAgICAgICB0aGlzLmRhdGFWaWV3LmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc2xpY2tHcmlkPy5kZXN0cm95KSB7XG4gICAgICB0aGlzLnNsaWNrR3JpZC5kZXN0cm95KHNob3VsZEVtcHR5RG9tRWxlbWVudENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFja2VuZFNlcnZpY2VBcGkpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKSkge1xuICAgICAgICBkZWxldGUgdGhpcy5iYWNrZW5kU2VydmljZUFwaVtwcm9wIGFzIGtleW9mIEJhY2tlbmRTZXJ2aWNlQXBpXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbkRlZmluaXRpb25zKSkge1xuICAgICAgKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgYXMgYW55KVtwcm9wXSA9IG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLnNoYXJlZFNlcnZpY2UpKSB7XG4gICAgICAodGhpcy5zaGFyZWRTZXJ2aWNlIGFzIGFueSlbcHJvcF0gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIHdlIGNvdWxkIG9wdGlvbmFsbHkgYWxzbyBlbXB0eSB0aGUgY29udGVudCBvZiB0aGUgZ3JpZCBjb250YWluZXIgRE9NIGVsZW1lbnRcbiAgICBpZiAoc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyKSB7XG4gICAgICB0aGlzLmVtcHR5R3JpZENvbnRhaW5lckVsbSgpO1xuICAgIH1cblxuICAgIC8vIGFsc28gdW5zdWJzY3JpYmUgYWxsIFJ4SlMgc3Vic2NyaXB0aW9uc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHVuc3Vic2NyaWJlQWxsKHRoaXMuc3Vic2NyaXB0aW9ucyk7XG5cbiAgICB0aGlzLl9kYXRhc2V0ID0gbnVsbDtcbiAgICB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNsaWNrR3JpZCA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cblxuICBlbXB0eUdyaWRDb250YWluZXJFbG0oKSB7XG4gICAgY29uc3QgZ3JpZENvbnRhaW5lcklkID0gdGhpcy5ncmlkT3B0aW9ucz8uZ3JpZENvbnRhaW5lcklkID8/ICdncmlkMSc7XG4gICAgY29uc3QgZ3JpZENvbnRhaW5lckVsbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2dyaWRDb250YWluZXJJZH1gKTtcbiAgICBlbXB0eUVsZW1lbnQoZ3JpZENvbnRhaW5lckVsbSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIG91ciBpbnRlcm5hbCBQb3N0IFByb2Nlc3MgY2FsbGJhY2ssIGl0IHdpbGwgZXhlY3V0ZSBpbnRlcm5hbGx5IGFmdGVyIHdlIGdldCBiYWNrIHJlc3VsdCBmcm9tIHRoZSBQcm9jZXNzIGJhY2tlbmQgY2FsbFxuICAgKiBGb3Igbm93LCB0aGlzIGlzIEdyYXBoUUwgU2VydmljZSBPTkxZIGZlYXR1cmUgYW5kIGl0IHdpbGwgYmFzaWNhbGx5IHJlZnJlc2ggdGhlIERhdGFzZXQgJiBQYWdpbmF0aW9uIHdpdGhvdXQgaGF2aW5nIHRoZSB1c2VyIHRvIGNyZWF0ZSBoaXMgb3duIFBvc3RQcm9jZXNzIGV2ZXJ5IHRpbWVcbiAgICovXG4gIGNyZWF0ZUJhY2tlbmRBcGlJbnRlcm5hbFBvc3RQcm9jZXNzQ2FsbGJhY2soZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pIHtcbiAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XG4gICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlKSB7XG4gICAgICBjb25zdCBiYWNrZW5kQXBpU2VydmljZSA9IGJhY2tlbmRBcGkuc2VydmljZTtcblxuICAgICAgLy8gaW50ZXJuYWxQb3N0UHJvY2VzcyBvbmx5IHdvcmtzIChmb3Igbm93KSB3aXRoIGEgR3JhcGhRTCBTZXJ2aWNlLCBzbyBtYWtlIHN1cmUgaXQgaXMgb2YgdGhhdCB0eXBlXG4gICAgICBpZiAodHlwZW9mIGJhY2tlbmRBcGlTZXJ2aWNlLmdldERhdGFzZXROYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGJhY2tlbmRBcGkuaW50ZXJuYWxQb3N0UHJvY2VzcyA9IChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSgpIDogJyc7XG4gICAgICAgICAgaWYgKHByb2Nlc3NSZXN1bHQ/LmRhdGFbZGF0YXNldE5hbWVdKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcHJvY2Vzc1Jlc3VsdC5kYXRhW2RhdGFzZXROYW1lXS5oYXNPd25Qcm9wZXJ0eSgnbm9kZXMnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubm9kZXMgOiAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdO1xuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ3RvdGFsQ291bnQnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0udG90YWxDb3VudCA6IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoZGF0YSwgdG90YWxDb3VudCB8fCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6YXRpb24oZXZlbnRIYW5kbGVyOiBTbGlja0V2ZW50SGFuZGxlcikge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMudHJhbnNsYXRlciA9IHRoaXMudHJhbnNsYXRlclNlcnZpY2U7XG4gICAgdGhpcy5fZXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyO1xuXG4gICAgLy8gd2hlbiBkZXRlY3RpbmcgYSBmcm96ZW4gZ3JpZCwgd2UnbGwgYXV0b21hdGljYWxseSBlbmFibGUgdGhlIG1vdXNld2hlZWwgc2Nyb2xsIGhhbmRsZXIgc28gdGhhdCB3ZSBjYW4gc2Nyb2xsIGZyb20gYm90aCBsZWZ0L3JpZ2h0IGZyb3plbiBjb250YWluZXJzXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgKCh0aGlzLmdyaWRPcHRpb25zLmZyb3plblJvdyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuUm93ID49IDApIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gPj0gMCkgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVNb3VzZVdoZWVsU2Nyb2xsSGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZU1vdXNlV2hlZWxTY3JvbGxIYW5kbGVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZXZlbnROYW1pbmdTdHlsZSA9IHRoaXMuZ3JpZE9wdGlvbnM/LmV2ZW50TmFtaW5nU3R5bGUgPz8gRXZlbnROYW1pbmdTdHlsZS5jYW1lbENhc2U7XG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZENyZWF0ZScsIHRydWUpO1xuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBkYXRhc2V0IGlzIGluaXRpYWxpemVkIChpZiBub3QgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB0aGF0IGl0IGNhbm5vdCBnZXRMZW5ndGggb2YgbnVsbClcbiAgICB0aGlzLl9kYXRhc2V0ID0gdGhpcy5fZGF0YXNldCB8fCBbXTtcbiAgICB0aGlzLmdyaWRPcHRpb25zID0gdGhpcy5tZXJnZUdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0gdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbjtcbiAgICB0aGlzLmxvY2FsZXMgPSB0aGlzLmdyaWRPcHRpb25zPy5sb2NhbGVzID8/IENvbnN0YW50cy5sb2NhbGVzO1xuICAgIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkgPSB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaTtcbiAgICB0aGlzLl9pc0xvY2FsR3JpZCA9ICF0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpOyAvLyBjb25zaWRlcmVkIGEgbG9jYWwgZ3JpZCBpZiBpdCBkb2Vzbid0IGhhdmUgYSBiYWNrZW5kIHNlcnZpY2Ugc2V0XG5cbiAgICB0aGlzLmNyZWF0ZUJhY2tlbmRBcGlJbnRlcm5hbFBvc3RQcm9jZXNzQ2FsbGJhY2sodGhpcy5ncmlkT3B0aW9ucyk7XG5cbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcbiAgICAgIGNvbnN0IGRhdGF2aWV3SW5saW5lRmlsdGVycyA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5pbmxpbmVGaWx0ZXJzIHx8IGZhbHNlO1xuICAgICAgbGV0IGRhdGFWaWV3T3B0aW9uczogRGF0YVZpZXdPcHRpb24gPSB7IGlubGluZUZpbHRlcnM6IGRhdGF2aWV3SW5saW5lRmlsdGVycyB9O1xuXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kcmFnZ2FibGVHcm91cGluZyB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUdyb3VwaW5nKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciA9IG5ldyBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XG4gICAgICAgIGRhdGFWaWV3T3B0aW9ucyA9IHsgLi4uZGF0YVZpZXdPcHRpb25zLCBncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyOiB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgU2xpY2suRGF0YS5EYXRhVmlldyhkYXRhVmlld09wdGlvbnMpO1xuICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uRGF0YXZpZXdDcmVhdGVkJywgdGhpcy5kYXRhVmlldyk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwb3NzaWJsZSBTZXJ2aWNlcyB0aGF0IHVzZXIgd2FudCB0byByZWdpc3RlciB3aGljaCBkb24ndCByZXF1aXJlIFNsaWNrR3JpZCB0byBiZSBpbnN0YW50aWF0ZWRcbiAgICAvLyBSeEpTIFJlc291cmNlIGlzIGluIHRoaXMgbG90IGJlY2F1c2UgaXQgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgYW5kIGRvZXNuJ3QgcmVxdWlyZSBTbGlja0dyaWQgdG8gYmUgaW5pdGlhbGl6ZWRcbiAgICB0aGlzLnByZVJlZ2lzdGVyUmVzb3VyY2VzKCk7XG5cbiAgICAvLyBmb3IgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIsIHdlIHByb3ZpZGUgdGhlIHByb3BlcnR5IFwiZWRpdG9yXCIgYXMgYW4gQW5ndWxhci1TbGlja2dyaWQgZWRpdG9yIGNvbXBsZXggb2JqZWN0XG4gICAgLy8gaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XG4gICAgLy8gc28gaW4gb3VyIGxpYiB3ZSB3aWxsIHN3YXAgXCJlZGl0b3JcIiBhbmQgY29weSBpdCBpbnRvIGEgbmV3IHByb3BlcnR5IGNhbGxlZCBcImludGVybmFsQ29sdW1uRWRpdG9yXCJcbiAgICAvLyB0aGVuIHRha2UgYmFjayBcImVkaXRvci5tb2RlbFwiIGFuZCBtYWtlIGl0IHRoZSBuZXcgXCJlZGl0b3JcIiBzbyB0aGF0IFNsaWNrR3JpZCBFZGl0b3IgRmFjdG9yeSBzdGlsbCB3b3Jrc1xuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gdGhpcy5zd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xuXG4gICAgLy8gaWYgdGhlIHVzZXIgd2FudHMgdG8gYXV0b21hdGljYWxseSBhZGQgYSBDdXN0b20gRWRpdG9yIEZvcm1hdHRlciwgd2UgbmVlZCB0byBjYWxsIHRoZSBhdXRvIGFkZCBmdW5jdGlvbiBhZ2FpblxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpIHtcbiAgICAgIGF1dG9BZGRFZGl0b3JGb3JtYXR0ZXJUb0NvbHVtbnNXaXRoRWRpdG9yKHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpO1xuICAgIH1cblxuICAgIC8vIHNhdmUgcmVmZXJlbmNlIGZvciBhbGwgY29sdW1ucyBiZWZvcmUgdGhleSBvcHRpb25hbGx5IGJlY29tZSBoaWRkZW4vdmlzaWJsZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG5cbiAgICAvLyBiZWZvcmUgY2VydGFpbiBleHRlbnRpb25zL3BsdWdpbnMgcG90ZW50aWFsbHkgYWRkcyBleHRyYSBjb2x1bW5zIG5vdCBjcmVhdGVkIGJ5IHRoZSB1c2VyIGl0c2VsZiAoUm93TW92ZSwgUm93RGV0YWlsLCBSb3dTZWxlY3Rpb25zKVxuICAgIC8vIHdlJ2xsIHN1YnNjcmliZSB0byB0aGUgZXZlbnQgYW5kIHB1c2ggYmFjayB0aGUgY2hhbmdlIHRvIHRoZSB1c2VyIHNvIHRoZXkgYWx3YXlzIHVzZSBmdWxsIGNvbHVtbiBkZWZzIGFycmF5IGluY2x1ZGluZyBleHRyYSBjb2xzXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlPHsgY29sdW1uczogQ29sdW1uW107IGdyaWQ6IFNsaWNrR3JpZCB9Pignb25QbHVnaW5Db2x1bW5zQ2hhbmdlZCcsIGRhdGEgPT4ge1xuICAgICAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IGRhdGEuY29sdW1ucztcbiAgICAgICAgdGhpcy5jb2x1bW5EZWZpbml0aW9uc0NoYW5nZS5lbWl0KHRoaXMuX2NvbHVtbkRlZmluaXRpb25zKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIGFmdGVyIHN1YnNjcmliaW5nIHRvIHBvdGVudGlhbCBjb2x1bW5zIGNoYW5nZWQsIHdlIGFyZSByZWFkeSB0byBjcmVhdGUgdGhlc2Ugb3B0aW9uYWwgZXh0ZW5zaW9uc1xuICAgIC8vIHdoZW4gd2UgZGlkIGZpbmQgc29tZSB0byBjcmVhdGUgKFJvd01vdmUsIFJvd0RldGFpbCwgUm93U2VsZWN0aW9ucyksIGl0IHdpbGwgYXV0b21hdGljYWxseSBtb2RpZnkgY29sdW1uIGRlZmluaXRpb25zIChieSBwcmV2aW91cyBzdWJzY3JpYmUpXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmNyZWF0ZUV4dGVuc2lvbnNCZWZvcmVHcmlkQ3JlYXRpb24odGhpcy5fY29sdW1uRGVmaW5pdGlvbnMsIHRoaXMuZ3JpZE9wdGlvbnMpO1xuXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUGlubmluZy9Gcm96ZW4gXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gYXBwbHkgdGhlbSBpbiB0aGUgZ3JpZCBvcHRpb25zXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cz8ucGlubmluZykge1xuICAgICAgdGhpcy5ncmlkT3B0aW9ucyA9IHsgLi4udGhpcy5ncmlkT3B0aW9ucywgLi4udGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLnBpbm5pbmcgfTtcbiAgICB9XG5cbiAgICAvLyBidWlsZCBTbGlja0dyaWQgR3JpZCwgYWxzbyB1c2VyIG1pZ2h0IG9wdGlvbmFsbHkgcGFzcyBhIGN1c3RvbSBkYXRhdmlldyAoZS5nLiByZW1vdGUgbW9kZWwpXG4gICAgdGhpcy5zbGlja0dyaWQgPSBuZXcgU2xpY2suR3JpZChgIyR7dGhpcy5ncmlkSWR9YCwgdGhpcy5jdXN0b21EYXRhVmlldyB8fCB0aGlzLmRhdGFWaWV3LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmRhdGFWaWV3ID0gdGhpcy5kYXRhVmlldztcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2xpY2tHcmlkID0gdGhpcy5zbGlja0dyaWQ7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyaWRDb250YWluZXJFbGVtZW50ID0gdGhpcy5lbG0ubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcblxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5iaW5kRGlmZmVyZW50RXh0ZW5zaW9ucygpO1xuICAgIHRoaXMuYmluZERpZmZlcmVudEhvb2tzKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLCB0aGlzLmRhdGFWaWV3KTtcblxuICAgIC8vIHdoZW4gaXQncyBhIGZyb3plbiBncmlkLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGZyb3plbiBjb2x1bW4gaWQgZm9yIHJlZmVyZW5jZSBpZiB3ZSBldmVyIHNob3cvaGlkZSBjb2x1bW4gZnJvbSBDb2x1bW5QaWNrZXIvR3JpZE1lbnUgYWZ0ZXJ3YXJkXG4gICAgY29uc3QgZnJvemVuQ29sdW1uSW5kZXggPSB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiAhPT0gdW5kZWZpbmVkID8gdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gOiAtMTtcbiAgICBpZiAoZnJvemVuQ29sdW1uSW5kZXggPj0gMCAmJiBmcm96ZW5Db2x1bW5JbmRleCA8PSB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5mcm96ZW5WaXNpYmxlQ29sdW1uSWQgPSB0aGlzLl9jb2x1bW5EZWZpbml0aW9uc1tmcm96ZW5Db2x1bW5JbmRleF0uaWQgfHwgJyc7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwb3NzaWJsZSBTZXJ2aWNlcyB0aGF0IHVzZXIgd2FudCB0byByZWdpc3RlclxuICAgIHRoaXMucmVnaXN0ZXJSZXNvdXJjZXMoKTtcblxuICAgIC8vIGluaXRpYWxpemUgdGhlIFNsaWNrR3JpZCBncmlkXG4gICAgdGhpcy5zbGlja0dyaWQuaW5pdCgpO1xuXG4gICAgLy8gaW5pdGlhbGl6ZWQgdGhlIHJlc2l6ZXIgc2VydmljZSBvbmx5IGFmdGVyIFNsaWNrR3JpZCBpcyBpbml0aWFsaXplZFxuICAgIC8vIGlmIHdlIGRvbid0IHdlIGVuZCB1cCBiaW5kaW5nIG91ciByZXNpemUgdG8gYSBncmlkIGVsZW1lbnQgdGhhdCBkb2Vzbid0IHlldCBleGlzdCBpbiB0aGUgRE9NIGFuZCB0aGUgcmVzaXplciBzZXJ2aWNlIHdpbGwgZmFpbCBzaWxlbnRseSAoYmVjYXVzZSBpdCBoYXMgYSB0cnkvY2F0Y2ggdGhhdCB1bmJpbmRzIHRoZSByZXNpemUgd2l0aG91dCB0aHJvd2luZyBiYWNrKVxuICAgIGlmICh0aGlzLmdyaWRDb250YWluZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIHVzZXIgY291bGQgc2hvdyBhIGN1c3RvbSBmb290ZXIgd2l0aCB0aGUgZGF0YSBtZXRyaWNzIChkYXRhc2V0IGxlbmd0aCBhbmQgbGFzdCB1cGRhdGVkIHRpbWVzdGFtcClcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLmdyaWRPcHRpb25zLnNob3dDdXN0b21Gb290ZXIgJiYgdGhpcy5ncmlkT3B0aW9ucy5jdXN0b21Gb290ZXJPcHRpb25zICYmIHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2xpY2tGb290ZXIgPSBuZXcgU2xpY2tGb290ZXJDb21wb25lbnQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tRm9vdGVyT3B0aW9ucywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcbiAgICAgIHRoaXMuc2xpY2tGb290ZXIucmVuZGVyRm9vdGVyKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jdXN0b21EYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3KSB7XG4gICAgICAvLyBsb2FkIHRoZSBkYXRhIGluIHRoZSBEYXRhVmlldyAodW5sZXNzIGl0J3MgYSBoaWVyYXJjaGljYWwgZGF0YXNldCwgaWYgc28gaXQgd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgdGhlIGluaXRpYWwgdHJlZSBzb3J0KVxuICAgICAgY29uc3QgaW5pdGlhbERhdGFzZXQgPSB0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVUcmVlRGF0YSA/IHRoaXMuc29ydFRyZWVEYXRhc2V0KHRoaXMuX2RhdGFzZXQpIDogdGhpcy5fZGF0YXNldDtcbiAgICAgIHRoaXMuZGF0YVZpZXcuYmVnaW5VcGRhdGUoKTtcbiAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoaW5pdGlhbERhdGFzZXQgfHwgW10sIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lID8/ICdpZCcpO1xuICAgICAgdGhpcy5kYXRhVmlldy5lbmRVcGRhdGUoKTtcblxuICAgICAgLy8gaWYgeW91IGRvbid0IHdhbnQgdGhlIGl0ZW1zIHRoYXQgYXJlIG5vdCB2aXNpYmxlIChkdWUgdG8gYmVpbmcgZmlsdGVyZWQgb3V0IG9yIGJlaW5nIG9uIGEgZGlmZmVyZW50IHBhZ2UpXG4gICAgICAvLyB0byBzdGF5IHNlbGVjdGVkLCBwYXNzICdmYWxzZScgdG8gdGhlIHNlY29uZCBhcmdcbiAgICAgIGlmICh0aGlzLnNsaWNrR3JpZD8uZ2V0U2VsZWN0aW9uTW9kZWwoKSAmJiB0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5oYXNPd25Qcm9wZXJ0eSgnc3luY0dyaWRTZWxlY3Rpb24nKSkge1xuICAgICAgICAvLyBpZiB3ZSBhcmUgdXNpbmcgYSBCYWNrZW5kIFNlcnZpY2UsIHdlIHdpbGwgZG8gYW4gZXh0cmEgZmxhZyBjaGVjaywgdGhlIHJlYXNvbiBpcyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgc29tZSB1bmludGVuZGVkIGJlaGF2aW9yc1xuICAgICAgICAvLyB3aXRoIHRoZSBCYWNrZW5kU2VydmljZUFwaSBiZWNhdXNlIHRlY2huaWNhbGx5IHRoZSBkYXRhIGluIHRoZSBwYWdlIGNoYW5nZXMgdGhlIERhdGFWaWV3IG9uIGV2ZXJ5IHBhZ2UgY2hhbmdlLlxuICAgICAgICBsZXQgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5oYXNPd25Qcm9wZXJ0eSgnc3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2UnKSkge1xuICAgICAgICAgIHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbldpdGhCYWNrZW5kU2VydmljZSBhcyBib29sZWFuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3luY0dyaWRTZWxlY3Rpb24gPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uO1xuICAgICAgICBpZiAodHlwZW9mIHN5bmNHcmlkU2VsZWN0aW9uID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBsZXQgcHJlc2VydmVkUm93U2VsZWN0aW9uID0gc3luY0dyaWRTZWxlY3Rpb247XG4gICAgICAgICAgaWYgKCF0aGlzLl9pc0xvY2FsR3JpZCkge1xuICAgICAgICAgICAgLy8gd2hlbiB1c2luZyBCYWNrZW5kU2VydmljZUFwaSwgd2UnbGwgYmUgdXNpbmcgdGhlIFwic3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2VcIiBmbGFnIEJVVCBcInN5bmNHcmlkU2VsZWN0aW9uXCIgbXVzdCBhbHNvIGJlIHNldCB0byBUcnVlXG4gICAgICAgICAgICBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24gPSBzeW5jR3JpZFNlbGVjdGlvbiAmJiBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbih0aGlzLnNsaWNrR3JpZCwgcHJlc2VydmVkUm93U2VsZWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3luY0dyaWRTZWxlY3Rpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbih0aGlzLnNsaWNrR3JpZCwgc3luY0dyaWRTZWxlY3Rpb24ucHJlc2VydmVIaWRkZW4sIHN5bmNHcmlkU2VsZWN0aW9uLnByZXNlcnZlSGlkZGVuT25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRMbiA9IHRoaXMuZGF0YVZpZXcuZ2V0TGVuZ3RoKCkgfHwgdGhpcy5fZGF0YXNldCAmJiB0aGlzLl9kYXRhc2V0Lmxlbmd0aCB8fCAwO1xuICAgICAgaWYgKGRhdGFzZXRMbiA+IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKSkge1xuICAgICAgICAgIHRoaXMubG9hZFJvd1NlbGVjdGlvblByZXNldFdoZW5FeGlzdHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xuICAgICAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXNlciBtaWdodCB3YW50IHRvIGhpZGUgdGhlIGhlYWRlciByb3cgb24gcGFnZSBsb2FkIGJ1dCBzdGlsbCBoYXZlIGBlbmFibGVGaWx0ZXJpbmc6IHRydWVgXG4gICAgLy8gaWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UgbmVlZCB0byBoaWRlIHRoZSBoZWFkZXJSb3cgT05MWSBBRlRFUiBhbGwgZmlsdGVycyBnb3QgY3JlYXRlZCAmIGRhdGFWaWV3IGV4aXN0XG4gICAgaWYgKHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkKSB7XG4gICAgICB0aGlzLnNob3dIZWFkZXJSb3coZmFsc2UpO1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gdGhpcy5faGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQ7XG4gICAgfVxuXG4gICAgLy8gcHVibGlzaCAmIGRpc3BhdGNoIGNlcnRhaW4gZXZlbnRzXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uR3JpZENyZWF0ZWQnLCB0aGlzLnNsaWNrR3JpZCk7XG5cbiAgICAvLyBhZnRlciB0aGUgRGF0YVZpZXcgaXMgY3JlYXRlZCAmIHVwZGF0ZWQgZXhlY3V0ZSBzb21lIHByb2Nlc3Nlc1xuICAgIGlmICghdGhpcy5jdXN0b21EYXRhVmlldykge1xuICAgICAgdGhpcy5leGVjdXRlQWZ0ZXJEYXRhdmlld0NyZWF0ZWQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIGJpbmQgcmVzaXplIE9OTFkgYWZ0ZXIgdGhlIGRhdGFWaWV3IGlzIHJlYWR5XG4gICAgdGhpcy5iaW5kUmVzaXplSG9vayh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucyk7XG5cbiAgICAvLyBiaW5kIHRoZSBCYWNrZW5kIFNlcnZpY2UgQVBJIGNhbGxiYWNrIGZ1bmN0aW9ucyBvbmx5IGFmdGVyIHRoZSBncmlkIGlzIGluaXRpYWxpemVkXG4gICAgLy8gYmVjYXVzZSB0aGUgcHJlUHJvY2VzcygpIGFuZCBvbkluaXQoKSBtaWdodCBnZXQgdHJpZ2dlcmVkXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XG4gICAgICB0aGlzLmJpbmRCYWNrZW5kQ2FsbGJhY2tGdW5jdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gbG9jYWwgZ3JpZCwgY2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IHRoZSBQYWdpbmF0aW9uXG4gICAgLy8gaWYgc28gdGhlbiBhbHNvIGNoZWNrIGlmIHRoZXJlJ3MgYW55IHByZXNldHMgYW5kIGZpbmFsbHkgaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvblNlcnZpY2VcbiAgICAvLyBhIGxvY2FsIGdyaWQgd2l0aCBQYWdpbmF0aW9uIHByZXNldHMgd2lsbCBwb3RlbnRpYWxseSBoYXZlIGEgZGlmZmVyZW50IHRvdGFsIG9mIGl0ZW1zLCB3ZSdsbCBuZWVkIHRvIGdldCBpdCBmcm9tIHRoZSBEYXRhVmlldyBhbmQgdXBkYXRlIG91ciB0b3RhbFxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuX2lzTG9jYWxHcmlkKSB7XG4gICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZExvY2FsR3JpZFBhZ2luYXRpb24odGhpcy5kYXRhc2V0KTtcbiAgICB9XG5cbiAgICB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyA9IHtcbiAgICAgIC8vIFNsaWNrIEdyaWQgJiBEYXRhVmlldyBvYmplY3RzXG4gICAgICBkYXRhVmlldzogdGhpcy5kYXRhVmlldyxcbiAgICAgIHNsaWNrR3JpZDogdGhpcy5zbGlja0dyaWQsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvblNlcnZpY2U/LmV4dGVuc2lvbkxpc3QsXG5cbiAgICAgIC8vIHB1YmxpYyBtZXRob2RzXG4gICAgICBkZXN0cm95OiB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSxcblxuICAgICAgLy8gcmV0dXJuIGFsbCBhdmFpbGFibGUgU2VydmljZXMgKG5vbi1zaW5nbGV0b24pXG4gICAgICBiYWNrZW5kU2VydmljZTogdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGk/LnNlcnZpY2UsXG4gICAgICBldmVudFB1YlN1YlNlcnZpY2U6IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSxcbiAgICAgIGZpbHRlclNlcnZpY2U6IHRoaXMuZmlsdGVyU2VydmljZSxcbiAgICAgIGdyaWRFdmVudFNlcnZpY2U6IHRoaXMuZ3JpZEV2ZW50U2VydmljZSxcbiAgICAgIGdyaWRTdGF0ZVNlcnZpY2U6IHRoaXMuZ3JpZFN0YXRlU2VydmljZSxcbiAgICAgIGdyaWRTZXJ2aWNlOiB0aGlzLmdyaWRTZXJ2aWNlLFxuICAgICAgZ3JvdXBpbmdTZXJ2aWNlOiB0aGlzLmdyb3VwaW5nU2VydmljZSxcbiAgICAgIGV4dGVuc2lvblNlcnZpY2U6IHRoaXMuZXh0ZW5zaW9uU2VydmljZSxcbiAgICAgIHBhZ2luYXRpb25TZXJ2aWNlOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLFxuICAgICAgcmVzaXplclNlcnZpY2U6IHRoaXMucmVzaXplclNlcnZpY2UsXG4gICAgICBzb3J0U2VydmljZTogdGhpcy5zb3J0U2VydmljZSxcbiAgICAgIHRyZWVEYXRhU2VydmljZTogdGhpcy50cmVlRGF0YVNlcnZpY2UsXG4gICAgfVxuXG4gICAgLy8gYWxsIGluc3RhbmNlcyAoU2xpY2tHcmlkLCBEYXRhVmlldyAmIGFsbCBTZXJ2aWNlcylcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25Bbmd1bGFyR3JpZENyZWF0ZWQnLCB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyk7XG4gIH1cblxuICAvKipcbiAgICogT24gYSBQYWdpbmF0aW9uIGNoYW5nZWQsIHdlIHdpbGwgdHJpZ2dlciBhIEdyaWQgU3RhdGUgY2hhbmdlZCB3aXRoIHRoZSBuZXcgcGFnaW5hdGlvbiBpbmZvXG4gICAqIEFsc28gaWYgd2UgdXNlIFJvdyBTZWxlY3Rpb24gb3IgdGhlIENoZWNrYm94IFNlbGVjdG9yLCB3ZSBuZWVkIHRvIHJlc2V0IGFueSBzZWxlY3Rpb25cbiAgICovXG4gIHBhZ2luYXRpb25DaGFuZ2VkKHBhZ2luYXRpb246IFNlcnZpY2VQYWdpbmF0aW9uKSB7XG4gICAgY29uc3QgaXNTeW5jR3JpZFNlbGVjdGlvbkVuYWJsZWQgPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2U/Lm5lZWRUb1ByZXNlcnZlUm93U2VsZWN0aW9uKCkgPz8gZmFsc2U7XG4gICAgaWYgKCFpc1N5bmNHcmlkU2VsZWN0aW9uRW5hYmxlZCAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yKSkge1xuICAgICAgdGhpcy5zbGlja0dyaWQuc2V0U2VsZWN0ZWRSb3dzKFtdKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9ID0gcGFnaW5hdGlvbjtcbiAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlKSB7XG4gICAgICBpZiAocGFnZVNpemUgIT09IHVuZGVmaW5lZCAmJiBwYWdlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmN1cnJlbnRQYWdpbmF0aW9uID0geyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25HcmlkU3RhdGVDaGFuZ2VkJywge1xuICAgICAgY2hhbmdlOiB7IG5ld1ZhbHVlczogeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9LCB0eXBlOiBHcmlkU3RhdGVUeXBlLnBhZ2luYXRpb24gfSxcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEN1cnJlbnRHcmlkU3RhdGUoKVxuICAgIH0pO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBkYXRhc2V0IGNoYW5nZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgZW50aXJlIGdyaWQgVUkgJiBwb3NzaWJseSByZXNpemUgaXQgYXMgd2VsbFxuICAgKiBAcGFyYW0gZGF0YXNldFxuICAgKi9cbiAgcmVmcmVzaEdyaWREYXRhKGRhdGFzZXQ6IGFueVtdLCB0b3RhbENvdW50PzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVFbXB0eURhdGFXYXJuaW5nTWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KGRhdGFzZXQpKSB7XG4gICAgICBjb25zdCBmaW5hbFRvdGFsQ291bnQgPSB0b3RhbENvdW50IHx8IGRhdGFzZXQubGVuZ3RoO1xuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhc2V0KSAmJiB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmRhdGFWaWV3Py5zZXRJdGVtcykge1xuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhkYXRhc2V0LCB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSA/PyAnaWQnKTtcbiAgICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmVlRGF0YSkge1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnJlU29ydCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YXNldC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5sb2FkUm93U2VsZWN0aW9uUHJlc2V0V2hlbkV4aXN0cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhc2V0KSB7XG4gICAgICAgIHRoaXMuc2xpY2tHcmlkLmludmFsaWRhdGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gZGlzcGxheSB0aGUgUGFnaW5hdGlvbiBjb21wb25lbnQgb25seSBhZnRlciBjYWxsaW5nIHRoaXMgcmVmcmVzaCBkYXRhIGZpcnN0LCB3ZSBjYWxsIGl0IGhlcmUgc28gdGhhdCBpZiB3ZSBwcmVzZXQgcGFnaW5hdGlvbiBwYWdlIG51bWJlciBpdCB3aWxsIGJlIHNob3duIGNvcnJlY3RseVxuICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9ICh0aGlzLmdyaWRPcHRpb25zICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID09PSB1bmRlZmluZWQpKSkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25PcHRpb25zID0gdGhpcy5zZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zIGFzIFBhZ2luYXRpb24pO1xuICAgICAgICAvLyB3aGVuIHdlIGhhdmUgYSB0b3RhbENvdW50IHVzZSBpdCwgZWxzZSB3ZSdsbCB0YWtlIGl0IGZyb20gdGhlIHBhZ2luYXRpb24gb2JqZWN0XG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0b3RhbCBpdGVtcyBpZiBpdCdzIGRpZmZlcmVudCB0byBhdm9pZCByZWZyZXNoaW5nIHRoZSBVSVxuICAgICAgICBjb25zdCB0b3RhbFJlY29yZHMgPSAodG90YWxDb3VudCAhPT0gdW5kZWZpbmVkKSA/IHRvdGFsQ291bnQgOiAodGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbj8udG90YWxJdGVtcyk7XG4gICAgICAgIGlmICh0b3RhbFJlY29yZHMgIT09IHVuZGVmaW5lZCAmJiB0b3RhbFJlY29yZHMgIT09IHRoaXMudG90YWxJdGVtcykge1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9ICt0b3RhbFJlY29yZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2Ugd2l0aCBuZXcgcGFnaW5hdGlvbiBvcHRpb25zICh3aGljaCBtaWdodCBoYXZlIHByZXNldHMpXG4gICAgICAgIGlmICghdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVQYWdpbmF0aW9uU2VydmljZShwYWdpbmF0aW9uT3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBwYWdpbmF0aW9uIHNlcnZpY2Ugd2l0aCB0aGUgbmV3IHRvdGFsXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVUb3RhbEl0ZW1zKHRoaXMudG90YWxJdGVtcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmVzaXplIHRoZSBncmlkIGluc2lkZSBhIHNsaWdodCB0aW1lb3V0LCBpbiBjYXNlIG90aGVyIERPTSBlbGVtZW50IGNoYW5nZWQgcHJpb3IgdG8gdGhlIHJlc2l6ZSAobGlrZSBhIGZpbHRlci9wYWdpbmF0aW9uIGNoYW5nZWQpXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5ncmlkT3B0aW9ucy5hdXRvUmVzaXplICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1Jlc2l6ZS5kZWxheTtcbiAgICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKGRlbGF5IHx8IDEwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUncyBhbnkgUGFnaW5hdGlvbiBQcmVzZXRzIGRlZmluZWQgaW4gdGhlIEdyaWQgT3B0aW9ucyxcbiAgICogaWYgdGhlcmUgYXJlIHRoZW4gbG9hZCB0aGVtIGluIHRoZSBwYWdpbmF0aW9uT3B0aW9ucyBvYmplY3RcbiAgICovXG4gIHNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24sIHBhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uKTogUGFnaW5hdGlvbiB7XG4gICAgaWYgKGdyaWRPcHRpb25zLnByZXNldHM/LnBhZ2luYXRpb24gJiYgcGFnaW5hdGlvbk9wdGlvbnMgJiYgIXRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkKSB7XG4gICAgICBwYWdpbmF0aW9uT3B0aW9ucy5wYWdlU2l6ZSA9IGdyaWRPcHRpb25zLnByZXNldHMucGFnaW5hdGlvbi5wYWdlU2l6ZTtcbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLnBhZ2VOdW1iZXIgPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24ucGFnZU51bWJlcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2luYXRpb25PcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIER5bmFtaWNhbGx5IGNoYW5nZSBvciB1cGRhdGUgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBsaXN0LlxuICAgKiBXZSB3aWxsIHJlLXJlbmRlciB0aGUgZ3JpZCBzbyB0aGF0IHRoZSBuZXcgaGVhZGVyIGFuZCBkYXRhIHNob3dzIHVwIGNvcnJlY3RseS5cbiAgICogSWYgdXNpbmcgaTE4biwgd2UgYWxzbyBuZWVkIHRvIHRyaWdnZXIgYSByZS10cmFuc2xhdGUgb2YgdGhlIGNvbHVtbiBoZWFkZXJzXG4gICAqL1xuICB1cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QobmV3Q29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XG4gICAgLy8gbWFwL3N3YXAgdGhlIGludGVybmFsIGxpYnJhcnkgRWRpdG9yIHRvIHRoZSBTbGlja0dyaWQgRWRpdG9yIGZhY3RvcnlcbiAgICBuZXdDb2x1bW5EZWZpbml0aW9ucyA9IHRoaXMuc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKG5ld0NvbHVtbkRlZmluaXRpb25zKTtcblxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoZmFsc2UsIG5ld0NvbHVtbkRlZmluaXRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnJlbmRlckNvbHVtbkhlYWRlcnMobmV3Q29sdW1uRGVmaW5pdGlvbnMsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmF1dG9zaXplQ29sdW1ucygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50ICYmIHRoaXMucmVzaXplclNlcnZpY2U/LnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSB7XG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIGZpbHRlciByb3cgZGlzcGxheWVkIG9uIGZpcnN0IHJvdywgd2UgY2FuIG9wdGlvbmFsbHkgcGFzcyBmYWxzZSB0byBoaWRlIGl0LlxuICAgKiBAcGFyYW0gc2hvd2luZ1xuICAgKi9cbiAgc2hvd0hlYWRlclJvdyhzaG93aW5nID0gdHJ1ZSkge1xuICAgIHRoaXMuc2xpY2tHcmlkLnNldEhlYWRlclJvd1Zpc2liaWxpdHkoc2hvd2luZywgZmFsc2UpO1xuICAgIGlmIChzaG93aW5nID09PSB0cnVlICYmIHRoaXMuX2lzR3JpZEluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLnNsaWNrR3JpZC5zZXRDb2x1bW5zKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gc2hvd2luZztcbiAgfVxuXG4gIC8vXG4gIC8vIHByaXZhdGUgZnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBMb29wIHRocm91Z2ggYWxsIGNvbHVtbiBkZWZpbml0aW9ucyBhbmQgY29weSB0aGUgb3JpZ2luYWwgb3B0aW9uYWwgYHdpZHRoYCBwcm9wZXJ0aWVzIG9wdGlvbmFsbHkgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAqIFdlIHdpbGwgdXNlIHRoaXMgd2hlbiBkb2luZyBhIHJlc2l6ZSBieSBjZWxsIGNvbnRlbnQsIGlmIHVzZXIgcHJvdmlkZWQgYSBgd2lkdGhgIGl0IHdvbid0IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBjb3B5Q29sdW1uV2lkdGhzUmVmZXJlbmNlKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xuICAgIGNvbHVtbkRlZmluaXRpb25zLmZvckVhY2goY29sID0+IGNvbC5vcmlnaW5hbFdpZHRoID0gY29sLndpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoc2hvd1dhcm5pbmcgPSB0cnVlKSB7XG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZz8uc2hvd0VtcHR5RGF0YU1lc3NhZ2Uoc2hvd1dhcm5pbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRGlmZmVyZW50SG9va3MoZ3JpZDogU2xpY2tHcmlkLCBncmlkT3B0aW9uczogR3JpZE9wdGlvbiwgZGF0YVZpZXc6IFNsaWNrRGF0YVZpZXcpIHtcbiAgICAvLyBvbiBsb2NhbGUgY2hhbmdlLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHRyYW5zbGF0ZSB0aGUgSGVhZGVycywgR3JpZE1lbnVcbiAgICBpZiAodGhpcy50cmFuc2xhdGU/Lm9uTGFuZ0NoYW5nZSkge1xuICAgICAgLy8gdHJhbnNsYXRlIHNvbWUgb2YgdGhlbSBvbiBmaXJzdCBsb2FkLCB0aGVuIG9uIGVhY2ggbGFuZ3VhZ2UgY2hhbmdlXG4gICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVBbGxFeHRlbnNpb25zKCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyBwdWJsaXNoIGV2ZW50IG9mIHRoZSBzYW1lIG5hbWUgdGhhdCBTbGlja2dyaWQtVW5pdmVyc2FsIHVzZXMgb24gYSBsYW5ndWFnZSBjaGFuZ2UgZXZlbnRcbiAgICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25MYW5ndWFnZUNoYW5nZScpO1xuXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUFsbEV4dGVuc2lvbnMoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpO1xuICAgICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmNyZWF0ZVByZUhlYWRlclBhbmVsICYmICFncmlkT3B0aW9ucy5lbmFibGVEcmFnZ2FibGVHcm91cGluZykge1xuICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nU2VydmljZS50cmFuc2xhdGVHcm91cGluZ0FuZENvbFNwYW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGlmIHVzZXIgc2V0IGFuIG9uSW5pdCBCYWNrZW5kLCB3ZSdsbCBydW4gaXQgcmlnaHQgYXdheSAoYW5kIGlmIHNvLCB3ZSBhbHNvIG5lZWQgdG8gcnVuIHByZVByb2Nlc3MsIGludGVybmFsUG9zdFByb2Nlc3MgJiBwb3N0UHJvY2VzcylcbiAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpIHtcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGkgPSBncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaTtcblxuICAgICAgaWYgKGJhY2tlbmRBcGk/LnNlcnZpY2U/LmluaXQpIHtcbiAgICAgICAgYmFja2VuZEFwaS5zZXJ2aWNlLmluaXQoYmFja2VuZEFwaS5vcHRpb25zLCBncmlkT3B0aW9ucy5wYWdpbmF0aW9uLCB0aGlzLnNsaWNrR3JpZCwgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGF0YVZpZXcgJiYgZ3JpZCkge1xuICAgICAgY29uc3Qgc2xpY2tncmlkRXZlbnRQcmVmaXggPSB0aGlzLmdyaWRPcHRpb25zPy5kZWZhdWx0U2xpY2tncmlkRXZlbnRQcmVmaXggPz8gJyc7XG5cbiAgICAgIC8vIGV4cG9zZSBhbGwgU2xpY2sgR3JpZCBFdmVudHMgdGhyb3VnaCBkaXNwYXRjaFxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGdyaWQpIHtcbiAgICAgICAgaWYgKGdyaWQuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcC5zdGFydHNXaXRoKCdvbicpKSB7XG4gICAgICAgICAgY29uc3QgZ3JpZEV2ZW50TmFtZSA9IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5nZXRFdmVudE5hbWVCeU5hbWluZ0NvbnZlbnRpb24ocHJvcCwgc2xpY2tncmlkRXZlbnRQcmVmaXgpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoKGdyaWQgYXMgYW55KVtwcm9wXSwgKGV2ZW50LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZ3JpZEV2ZW50TmFtZSwgeyBldmVudERhdGE6IGV2ZW50LCBhcmdzIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cG9zZSBhbGwgU2xpY2sgRGF0YVZpZXcgRXZlbnRzIHRocm91Z2ggZGlzcGF0Y2hcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkYXRhVmlldykge1xuICAgICAgICBpZiAoZGF0YVZpZXcuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcC5zdGFydHNXaXRoKCdvbicpKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZSgoZGF0YVZpZXcgYXMgYW55KVtwcm9wXSwgKGV2ZW50LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhVmlld0V2ZW50TmFtZSA9IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5nZXRFdmVudE5hbWVCeU5hbWluZ0NvbnZlbnRpb24ocHJvcCwgc2xpY2tncmlkRXZlbnRQcmVmaXgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5kaXNwYXRjaEN1c3RvbUV2ZW50KGRhdGFWaWV3RXZlbnROYW1lLCB7IGV2ZW50RGF0YTogZXZlbnQsIGFyZ3MgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb24gY2VsbCBjbGljaywgbWFpbmx5IHVzZWQgd2l0aCB0aGUgY29sdW1uRGVmLmFjdGlvbiBjYWxsYmFja1xuICAgICAgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLmJpbmRPbkNlbGxDaGFuZ2UoZ3JpZCk7XG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UuYmluZE9uQ2xpY2soZ3JpZCk7XG5cbiAgICAgIGlmIChkYXRhVmlldyAmJiBncmlkKSB7XG4gICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgc29ydGluZyAoYmFja2VuZCkgd2hlbiBhdmFpbGFibGUgb3IgZGVmYXVsdCBvblNvcnQgKGRhdGFWaWV3KVxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlU29ydGluZykge1xuICAgICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgc29ydGluZyAoYmFja2VuZCkgdW5sZXNzIHNwZWNpZmllZCB0byB1c2UgdGhlIGxvY2FsIG9uZVxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkudXNlTG9jYWxTb3J0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmJpbmRCYWNrZW5kT25Tb3J0KGdyaWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmJpbmRMb2NhbE9uU29ydChncmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiaW5kIGV4dGVybmFsIGZpbHRlciAoYmFja2VuZCkgd2hlbiBhdmFpbGFibGUgb3IgZGVmYXVsdCBvbkZpbHRlciAoZGF0YVZpZXcpXG4gICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcpIHtcbiAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuaW5pdChncmlkKTtcblxuICAgICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgZmlsdGVyIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICFncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaS51c2VMb2NhbEZpbHRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmJpbmRCYWNrZW5kT25GaWx0ZXIoZ3JpZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5iaW5kTG9jYWxPbkZpbHRlcihncmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsb2FkIGFueSBwcmVzZXRzIGlmIGFueSAoYWZ0ZXIgZGF0YXNldCBpcyBpbml0aWFsaXplZClcbiAgICAgICAgdGhpcy5sb2FkQ29sdW1uUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdGhpcy5sb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcblxuICAgICAgICAvLyBXaGVuIGRhdGEgY2hhbmdlcyBpbiB0aGUgRGF0YVZpZXcsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgbWV0cmljcyBhbmQvb3IgZGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlIGRhdGFzZXQgaXMgZW1wdHlcbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZShkYXRhVmlldy5vblJvd0NvdW50Q2hhbmdlZCwgKCkgPT4ge1xuICAgICAgICAgIGdyaWQuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKGRhdGFWaWV3LmdldEZpbHRlcmVkSXRlbUNvdW50KCkgfHwgMCwgZGF0YVZpZXcuZ2V0SXRlbUNvdW50KCkgfHwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGRhdGFWaWV3Lm9uU2V0SXRlbXNDYWxsZWQsIChfZSwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKGRhdGFWaWV3LmdldEZpbHRlcmVkSXRlbUNvdW50KCkgfHwgMCwgYXJncy5pdGVtQ291bnQpO1xuXG4gICAgICAgICAgLy8gd2hlbiB1c2VyIGhhcyByZXNpemUgYnkgY29udGVudCBlbmFibGVkLCB3ZSdsbCBmb3JjZSBhIGZ1bGwgd2lkdGggY2FsY3VsYXRpb24gc2luY2Ugd2UgY2hhbmdlIG91ciBlbnRpcmUgZGF0YXNldFxuICAgICAgICAgIGlmIChhcmdzLml0ZW1Db3VudCA+IDAgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuYXV0b3NpemVDb2x1bW5zQnlDZWxsQ29udGVudE9uRmlyc3RMb2FkIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCghdGhpcy5ncmlkT3B0aW9ucz8ucmVzaXplQnlDb250ZW50T25seU9uRmlyc3RMb2FkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChncmlkT3B0aW9ucz8uZW5hYmxlRmlsdGVyaW5nICYmICFncmlkT3B0aW9ucy5lbmFibGVSb3dEZXRhaWxWaWV3KSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZShkYXRhVmlldy5vblJvd3NDaGFuZ2VkLCAoX2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIC8vIGZpbHRlcmluZyBkYXRhIHdpdGggbG9jYWwgZGF0YXNldCB3aWxsIG5vdCBhbHdheXMgc2hvdyBjb3JyZWN0bHkgdW5sZXNzIHdlIGNhbGwgdGhpcyB1cGRhdGVSb3cvcmVuZGVyXG4gICAgICAgICAgICAvLyBhbHNvIGRvbid0IHVzZSBcImludmFsaWRhdGVSb3dzXCIgc2luY2UgaXQgZGVzdHJveXMgdGhlIGVudGlyZSByb3cgYW5kIGFzIGJhZCB1c2VyIGV4cGVyaWVuY2Ugd2hlbiB1cGRhdGluZyBhIHJvd1xuICAgICAgICAgICAgLy8gc2VlIGNvbW1pdDogaHR0cHM6Ly9naXRodWIuY29tL2doaXNjb2RpbmcvYXVyZWxpYS1zbGlja2dyaWQvY29tbWl0LzhjNTAzYTRkNDVmYmExMWNiZDhkOGNjNDY3ZmFlOGQxNzdjYzRmNjBcbiAgICAgICAgICAgIGlmIChhcmdzPy5yb3dzICYmIEFycmF5LmlzQXJyYXkoYXJncy5yb3dzKSkge1xuICAgICAgICAgICAgICBhcmdzLnJvd3MuZm9yRWFjaCgocm93OiBudW1iZXIpID0+IGdyaWQudXBkYXRlUm93KHJvdykpO1xuICAgICAgICAgICAgICBncmlkLnJlbmRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGlkIHRoZSB1c2VyIGFkZCBhIGNvbHNwYW4gY2FsbGJhY2s/IElmIHNvLCBob29rIGl0IGludG8gdGhlIERhdGFWaWV3IGdldEl0ZW1NZXRhZGF0YVxuICAgIGlmIChncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2sgJiYgZGF0YVZpZXcgJiYgZGF0YVZpZXcuZ2V0SXRlbSAmJiBkYXRhVmlldy5nZXRJdGVtTWV0YWRhdGEpIHtcbiAgICAgIGRhdGFWaWV3LmdldEl0ZW1NZXRhZGF0YSA9IChyb3dOdW1iZXI6IG51bWJlcikgPT4ge1xuICAgICAgICBsZXQgY2FsbGJhY2tSZXN1bHQgPSBudWxsO1xuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrICYmIGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrKGRhdGFWaWV3LmdldEl0ZW0ocm93TnVtYmVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrUmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJpbmRCYWNrZW5kQ2FsbGJhY2tGdW5jdGlvbnMoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pIHtcbiAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XG4gICAgY29uc3QgYmFja2VuZEFwaVNlcnZpY2UgPSBiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGkuc2VydmljZTtcbiAgICBjb25zdCBzZXJ2aWNlT3B0aW9uczogQmFja2VuZFNlcnZpY2VPcHRpb24gPSBiYWNrZW5kQXBpU2VydmljZT8ub3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBpc0V4ZWN1dGVDb21tYW5kT25Jbml0ID0gKCFzZXJ2aWNlT3B0aW9ucykgPyBmYWxzZSA6ICgoc2VydmljZU9wdGlvbnMgJiYgc2VydmljZU9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2V4ZWN1dGVQcm9jZXNzQ29tbWFuZE9uSW5pdCcpKSA/IHNlcnZpY2VPcHRpb25zWydleGVjdXRlUHJvY2Vzc0NvbW1hbmRPbkluaXQnXSA6IHRydWUpO1xuXG4gICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlKSB7XG4gICAgICAvLyB1cGRhdGUgYmFja2VuZCBmaWx0ZXJzIChpZiBuZWVkIGJlKSBCRUZPUkUgdGhlIHF1ZXJ5IHJ1bnMgKHZpYSB0aGUgb25Jbml0IGNvbW1hbmQgYSBmZXcgbGluZXMgYmVsb3cpXG4gICAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBhbnkgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgZ3JpZFxuICAgICAgaWYgKGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLnByZXNldHMpIHtcbiAgICAgICAgLy8gRmlsdGVycyBcInByZXNldHNcIlxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycykgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzKGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGVycyBcInByZXNldHNcIlxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlU29ydGVycyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycykgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyB3aGVuIHVzaW5nIG11bHRpLWNvbHVtbiBzb3J0LCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBidXQgb24gc2luZ2xlIHNvcnQgdGhlbiBvbmx5IGdyYWIgdGhlIGZpcnN0IHNvcnQgcHJvdmlkZWRcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMubXVsdGlDb2x1bW5Tb3J0ID8gZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzIDogZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLnNsaWNlKDAsIDEpO1xuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVNvcnRlcnModW5kZWZpbmVkLCBzb3J0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFnaW5hdGlvbiBcInByZXNldHNcIlxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlUGFnaW5hdGlvbiAmJiBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24pIHtcbiAgICAgICAgICBjb25zdCB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0gPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb247XG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlUGFnaW5hdGlvbihwYWdlTnVtYmVyLCBwYWdlU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0Q29sdW1uRmlsdGVycygpO1xuICAgICAgICBpZiAoY29sdW1uRmlsdGVycyAmJiBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzKSB7XG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyhjb2x1bW5GaWx0ZXJzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZXhlY3V0ZSBvbkluaXQgY29tbWFuZCB3aGVuIG5lY2Vzc2FyeVxuICAgICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaVNlcnZpY2UgJiYgKGJhY2tlbmRBcGkub25Jbml0IHx8IGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gKHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5idWlsZFF1ZXJ5ID09PSAnZnVuY3Rpb24nKSA/IGJhY2tlbmRBcGlTZXJ2aWNlLmJ1aWxkUXVlcnkoKSA6ICcnO1xuICAgICAgICBjb25zdCBwcm9jZXNzID0gKGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQpID8gKGJhY2tlbmRBcGkucHJvY2VzcyAmJiBiYWNrZW5kQXBpLnByb2Nlc3MocXVlcnkpIHx8IG51bGwpIDogKGJhY2tlbmRBcGkub25Jbml0ICYmIGJhY2tlbmRBcGkub25Jbml0KHF1ZXJ5KSB8fCBudWxsKTtcblxuICAgICAgICAvLyB3cmFwIHRoaXMgaW5zaWRlIGEgc2V0VGltZW91dCB0byBhdm9pZCB0aW1pbmcgaXNzdWUgc2luY2UgdGhlIGdyaWRPcHRpb25zIG5lZWRzIHRvIGJlIHJlYWR5IGJlZm9yZSBydW5uaW5nIHRoaXMgb25Jbml0XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhY2tlbmRVdGlsaXR5U2VydmljZSA9IHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlIGFzIEJhY2tlbmRVdGlsaXR5U2VydmljZTtcblxuICAgICAgICAgIC8vIGtlZXAgc3RhcnQgdGltZSAmIGVuZCB0aW1lc3RhbXBzICYgcmV0dXJuIGl0IGFmdGVyIHByb2Nlc3MgZXhlY3V0aW9uXG4gICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcblxuICAgICAgICAgIC8vIHJ1biBhbnkgcHJlLXByb2Nlc3MsIGlmIGRlZmluZWQsIGZvciBleGFtcGxlIGEgc3Bpbm5lclxuICAgICAgICAgIGlmIChiYWNrZW5kQXBpLnByZVByb2Nlc3MpIHtcbiAgICAgICAgICAgIGJhY2tlbmRBcGkucHJlUHJvY2VzcygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHRoZSBwcm9jZXNzZXMgY2FuIGJlIGEgUHJvbWlzZSAobGlrZSBIdHRwKVxuICAgICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zID8/IDA7XG4gICAgICAgICAgaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBwcm9jZXNzXG4gICAgICAgICAgICAgIC50aGVuKChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5leGVjdXRlQmFja2VuZFByb2Nlc3Nlc0NhbGxiYWNrKHN0YXJ0VGltZSwgcHJvY2Vzc1Jlc3VsdCwgYmFja2VuZEFwaSwgdG90YWxJdGVtcykpXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5vbkJhY2tlbmRFcnJvcihlcnJvciwgYmFja2VuZEFwaSkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2VzcyAmJiB0aGlzLnJ4anM/LmlzT2JzZXJ2YWJsZShwcm9jZXNzKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgIChwcm9jZXNzIGFzIE9ic2VydmFibGU8YW55Pikuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2UuZXhlY3V0ZUJhY2tlbmRQcm9jZXNzZXNDYWxsYmFjayhzdGFydFRpbWUsIHByb2Nlc3NSZXN1bHQsIGJhY2tlbmRBcGksIHRvdGFsSXRlbXMpLFxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLm9uQmFja2VuZEVycm9yKGVycm9yLCBiYWNrZW5kQXBpKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZFJlc2l6ZUhvb2soZ3JpZDogU2xpY2tHcmlkLCBvcHRpb25zOiBHcmlkT3B0aW9uKSB7XG4gICAgaWYgKChvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5hdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWQpIHx8IChvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucyAmJiBvcHRpb25zLmVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0FuZ3VsYXItU2xpY2tncmlkXSBZb3UgY2Fubm90IGVuYWJsZSBib3RoIGF1dG9zaXplL2ZpdCB2aWV3cG9ydCAmIHJlc2l6ZSBieSBjb250ZW50LCB5b3UgbXVzdCBjaG9vc2Ugd2hpY2ggcmVzaXplIHRlY2huaXF1ZSB0byB1c2UuIFlvdSBjYW4gZW5hYmxlIHRoZXNlIDIgb3B0aW9ucyAoXCJhdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkXCIgYW5kIFwiZW5hYmxlQXV0b1NpemVDb2x1bW5zXCIpIE9SIHRoZXNlIG90aGVyIDIgb3B0aW9ucyAoXCJhdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWRcIiBhbmQgXCJlbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRcIikuYCk7XG4gICAgfVxuXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcbiAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcbiAgICAgIGdyaWQuYXV0b3NpemVDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gYXV0by1yZXNpemUgZ3JpZCBvbiBicm93c2VyIHJlc2l6ZVxuICAgIGlmIChvcHRpb25zLmdyaWRIZWlnaHQgfHwgb3B0aW9ucy5ncmlkV2lkdGgpIHtcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgwLCB7IGhlaWdodDogb3B0aW9ucy5ncmlkSGVpZ2h0LCB3aWR0aDogb3B0aW9ucy5ncmlkV2lkdGggfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lbmFibGVBdXRvUmVzaXplKSB7XG4gICAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcbiAgICAgICAgZ3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVBZnRlckRhdGF2aWV3Q3JlYXRlZChfZ3JpZDogU2xpY2tHcmlkLCBncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIFNvcnQgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgRE9NXG4gICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVNvcnRpbmcpIHtcbiAgICAgIGlmIChncmlkT3B0aW9ucy5wcmVzZXRzICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzKSkge1xuICAgICAgICAvLyB3aGVuIHVzaW5nIG11bHRpLWNvbHVtbiBzb3J0LCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBidXQgb24gc2luZ2xlIHNvcnQgdGhlbiBvbmx5IGdyYWIgdGhlIGZpcnN0IHNvcnQgcHJvdmlkZWRcbiAgICAgICAgY29uc3Qgc29ydENvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLm11bHRpQ29sdW1uU29ydCA/IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycyA6IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5zbGljZSgwLCAxKTtcbiAgICAgICAgdGhpcy5zb3J0U2VydmljZS5sb2FkR3JpZFNvcnRlcnMoc29ydENvbHVtbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBXaGVuIGRhdGEgY2hhbmdlcyBpbiB0aGUgRGF0YVZpZXcsIHdlJ2xsIHJlZnJlc2ggdGhlIG1ldHJpY3MgYW5kL29yIGRpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZSBkYXRhc2V0IGlzIGVtcHR5ICovXG4gIHByaXZhdGUgaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKGN1cnJlbnRQYWdlUm93SXRlbUNvdW50OiBudW1iZXIsIHRvdGFsSXRlbUNvdW50OiBudW1iZXIpIHtcbiAgICB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aCA9IHRvdGFsSXRlbUNvdW50O1xuICAgIHRoaXMubWV0cmljcyA9IHtcbiAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKSxcbiAgICAgIGVuZFRpbWU6IG5ldyBEYXRlKCksXG4gICAgICBpdGVtQ291bnQ6IGN1cnJlbnRQYWdlUm93SXRlbUNvdW50LFxuICAgICAgdG90YWxJdGVtQ291bnRcbiAgICB9O1xuICAgIC8vIGlmIGN1c3RvbSBmb290ZXIgaXMgZW5hYmxlZCwgdGhlbiB3ZSdsbCB1cGRhdGUgaXRzIG1ldHJpY3NcbiAgICBpZiAodGhpcy5zbGlja0Zvb3Rlcikge1xuICAgICAgdGhpcy5zbGlja0Zvb3Rlci5tZXRyaWNzID0gdGhpcy5tZXRyaWNzO1xuICAgIH1cblxuICAgIC8vIHdoZW4gdXNpbmcgbG9jYWwgKGluLW1lbW9yeSkgZGF0YXNldCwgd2UnbGwgZGlzcGxheSBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIGZpbHRlcmVkIGRhdGEgaXMgZW1wdHlcbiAgICBpZiAodGhpcy5faXNMb2NhbEdyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UpIHtcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoY3VycmVudFBhZ2VSb3dJdGVtQ291bnQgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVBhZ2luYXRpb25TZXJ2aWNlKHBhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uKSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMpIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEgPSB7XG4gICAgICAgIGdyaWRPcHRpb25zOiB0aGlzLmdyaWRPcHRpb25zLFxuICAgICAgICBwYWdpbmF0aW9uU2VydmljZTogdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcbiAgICAgIH07XG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnRvdGFsSXRlbXMgPSB0aGlzLnRvdGFsSXRlbXM7XG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHBhZ2luYXRpb25PcHRpb25zLCB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlKCdvblBhZ2luYXRpb25DaGFuZ2VkJywgKHBhZ2luYXRpb25DaGFuZ2VzOiBTZXJ2aWNlUGFnaW5hdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZWQocGFnaW5hdGlvbkNoYW5nZXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnN1YnNjcmliZSgnb25QYWdpbmF0aW9uVmlzaWJpbGl0eUNoYW5nZWQnLCAodmlzaWJpbGl0eTogeyB2aXNpYmxlOiBib29sZWFuIH0pID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gdmlzaWJpbGl0eT8udmlzaWJsZSA/PyBmYWxzZTtcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlPy5yZWZyZXNoQmFja2VuZERhdGFzZXQodGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbih0aGlzLnNob3dQYWdpbmF0aW9uKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIHBhZ2luYXRpb24gY29tcG9uZW50XG4gICAgICB0aGlzLnJlbmRlclBhZ2luYXRpb24oKTtcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogTG9hZCB0aGUgRWRpdG9yIENvbGxlY3Rpb24gYXN5bmNocm9ub3VzbHkgYW5kIHJlcGxhY2UgdGhlIFwiY29sbGVjdGlvblwiIHByb3BlcnR5IHdoZW4gT2JzZXJ2YWJsZSByZXNvbHZlcyAqL1xuICBwcml2YXRlIGxvYWRFZGl0b3JDb2xsZWN0aW9uQXN5bmMoY29sdW1uOiBDb2x1bW4pIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uQXN5bmMgPSBjb2x1bW4gJiYgY29sdW1uLmVkaXRvciAmJiAoY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3IpLmNvbGxlY3Rpb25Bc3luYztcbiAgICBpZiAoY29sbGVjdGlvbkFzeW5jIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbGxlY3Rpb25Bc3luYy5zdWJzY3JpYmUoKHJlc29sdmVkQ29sbGVjdGlvbikgPT4gdGhpcy51cGRhdGVFZGl0b3JDb2xsZWN0aW9uKGNvbHVtbiwgcmVzb2x2ZWRDb2xsZWN0aW9uKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uQXN5bmMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAvLyB3YWl0IGZvciB0aGUgXCJjb2xsZWN0aW9uQXN5bmNcIiwgb25jZSByZXNvbHZlZCB3ZSB3aWxsIHNhdmUgaXQgaW50byB0aGUgXCJjb2xsZWN0aW9uXCJcbiAgICAgIC8vIHRoZSBjb2xsZWN0aW9uQXN5bmMgY2FuIGJlIG9mIDMgdHlwZXMgSHR0cENsaWVudCwgSHR0cEZldGNoIG9yIGEgUHJvbWlzZVxuICAgICAgY29sbGVjdGlvbkFzeW5jLnRoZW4oKHJlc3BvbnNlOiBhbnkgfCBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUVkaXRvckNvbGxlY3Rpb24oY29sdW1uLCByZXNwb25zZSk7IC8vIGZyb20gUHJvbWlzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogTG9hZCBhbnkgcG9zc2libGUgQ29sdW1ucyBHcmlkIFByZXNldHMgKi9cbiAgcHJpdmF0ZSBsb2FkQ29sdW1uUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKSB7XG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgQ29sdW1ucyBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBncmlkXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cyAmJiBBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5jb2x1bW5zKSAmJiB0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBncmlkQ29sdW1uczogQ29sdW1uW10gPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UuZ2V0QXNzb2NpYXRlZEdyaWRDb2x1bW5zKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucyk7XG4gICAgICBpZiAoZ3JpZENvbHVtbnMgJiYgQXJyYXkuaXNBcnJheShncmlkQ29sdW1ucykgJiYgZ3JpZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY2hlY2tib3ggc2VsZWN0b3IgaXMgYWxzbyB2aXNpYmxlIGlmIGl0IGlzIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGNoZWNrYm94Q29sdW1uID0gKEFycmF5LmlzQXJyYXkodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpICYmIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLmxlbmd0aCA+IDApID8gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnNbMF0gOiBudWxsO1xuICAgICAgICAgIGlmIChjaGVja2JveENvbHVtbiAmJiBjaGVja2JveENvbHVtbi5pZCA9PT0gJ19jaGVja2JveF9zZWxlY3RvcicgJiYgZ3JpZENvbHVtbnNbMF0uaWQgIT09ICdfY2hlY2tib3hfc2VsZWN0b3InKSB7XG4gICAgICAgICAgICBncmlkQ29sdW1ucy51bnNoaWZ0KGNoZWNrYm94Q29sdW1uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBrZWVwIGNvcHkgdGhlIG9yaWdpbmFsIG9wdGlvbmFsIGB3aWR0aGAgcHJvcGVydGllcyBvcHRpb25hbGx5IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAgICAvLyBXZSB3aWxsIHVzZSB0aGlzIHdoZW4gZG9pbmcgYSByZXNpemUgYnkgY2VsbCBjb250ZW50LCBpZiB1c2VyIHByb3ZpZGVkIGEgYHdpZHRoYCBpdCB3b24ndCBvdmVycmlkZSBpdC5cbiAgICAgICAgZ3JpZENvbHVtbnMuZm9yRWFjaChjb2wgPT4gY29sLm9yaWdpbmFsV2lkdGggPSBjb2wud2lkdGgpO1xuXG4gICAgICAgIC8vIGZpbmFsbHkgc2V0IHRoZSBuZXcgcHJlc2V0cyBjb2x1bW5zIChpbmNsdWRpbmcgY2hlY2tib3ggc2VsZWN0b3IgaWYgbmVlZCBiZSlcbiAgICAgICAgdGhpcy5zbGlja0dyaWQuc2V0Q29sdW1ucyhncmlkQ29sdW1ucyk7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS52aXNpYmxlQ29sdW1ucyA9IGdyaWRDb2x1bW5zO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGFueSBwb3NzaWJsZSBGaWx0ZXJzIEdyaWQgUHJlc2V0cyAqL1xuICBwcml2YXRlIGxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiAhdGhpcy5jdXN0b21EYXRhVmlldykge1xuICAgICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgRmlsdGVyIFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIERPTVxuICAgICAgLy8gYWxzbyBub3RlIHRoYXQgYSBwcmVzZXRzIG9mIFRyZWUgRGF0YSBUb2dnbGluZyB3aWxsIGFsc28gY2FsbCB0aGlzIG1ldGhvZCBiZWNhdXNlIFRyZWUgRGF0YSB0b2dnbGluZyBkb2VzIHdvcmsgd2l0aCBkYXRhIGZpbHRlcmluZ1xuICAgICAgLy8gKGNvbGxhcHNpbmcgYSBwYXJlbnQgd2lsbCBiYXNpY2FsbHkgdXNlIEZpbHRlciBmb3IgaGlkZGluZyAoYWthIGNvbGxhcHNpbmcpIGF3YXkgdGhlIGNoaWxkIHVuZGVybmVhdCBpdClcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMgJiYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMpIHx8IEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy50cmVlRGF0YT8udG9nZ2xlZEl0ZW1zKSkpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnBvcHVsYXRlQ29sdW1uRmlsdGVyU2VhcmNoVGVybVByZXNldHModGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5maWx0ZXJzIHx8IFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogbG9jYWwgZ3JpZCwgY2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IHRoZSBQYWdpbmF0aW9uXG4gICAqIGlmIHNvIHRoZW4gYWxzbyBjaGVjayBpZiB0aGVyZSdzIGFueSBwcmVzZXRzIGFuZCBmaW5hbGx5IGluaXRpYWxpemUgdGhlIFBhZ2luYXRpb25TZXJ2aWNlXG4gICAqIGEgbG9jYWwgZ3JpZCB3aXRoIFBhZ2luYXRpb24gcHJlc2V0cyB3aWxsIHBvdGVudGlhbGx5IGhhdmUgYSBkaWZmZXJlbnQgdG90YWwgb2YgaXRlbXMsIHdlJ2xsIG5lZWQgdG8gZ2V0IGl0IGZyb20gdGhlIERhdGFWaWV3IGFuZCB1cGRhdGUgb3VyIHRvdGFsXG4gICAqL1xuICBwcml2YXRlIGxvYWRMb2NhbEdyaWRQYWdpbmF0aW9uKGRhdGFzZXQ/OiBhbnlbXSkge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKSB7XG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSBBcnJheS5pc0FycmF5KGRhdGFzZXQpID8gZGF0YXNldC5sZW5ndGggOiAwO1xuICAgICAgaWYgKHRoaXMuX3BhZ2luYXRpb25PcHRpb25zICYmIHRoaXMuZGF0YVZpZXc/LmdldFBhZ2luZ0luZm8pIHtcbiAgICAgICAgY29uc3Qgc2xpY2tQYWdpbmdJbmZvID0gdGhpcy5kYXRhVmlldy5nZXRQYWdpbmdJbmZvKCk7XG4gICAgICAgIGlmIChzbGlja1BhZ2luZ0luZm8/Lmhhc093blByb3BlcnR5KCd0b3RhbFJvd3MnKSAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucy50b3RhbEl0ZW1zICE9PSBzbGlja1BhZ2luZ0luZm8udG90YWxSb3dzKSB7XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gc2xpY2tQYWdpbmdJbmZvLnRvdGFsUm93cyB8fCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucy50b3RhbEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xuICAgICAgY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSB0aGlzLnNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQodGhpcy5ncmlkT3B0aW9ucywgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMpO1xuICAgICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGFueSBSb3cgU2VsZWN0aW9ucyBpbnRvIHRoZSBEYXRhVmlldyB0aGF0IHdlcmUgcHJlc2V0cyBieSB0aGUgdXNlciAqL1xuICBwcml2YXRlIGxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCkge1xuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIFJvdyBTZWxlY3Rpb25zIFwicHJlc2V0c1wiXG4gICAgY29uc3QgcHJlc2V0cyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnByZXNldHM7XG4gICAgY29uc3QgZW5hYmxlUm93U2VsZWN0aW9uID0gdGhpcy5ncmlkT3B0aW9ucyAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKTtcbiAgICBpZiAoZW5hYmxlUm93U2VsZWN0aW9uICYmIHRoaXMuc2xpY2tHcmlkPy5nZXRTZWxlY3Rpb25Nb2RlbCgpICYmIHByZXNldHM/LnJvd1NlbGVjdGlvbiAmJiAoQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcykgfHwgQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5kYXRhQ29udGV4dElkcykpKSB7XG4gICAgICBsZXQgZGF0YUNvbnRleHRJZHMgPSBwcmVzZXRzLnJvd1NlbGVjdGlvbi5kYXRhQ29udGV4dElkcztcbiAgICAgIGxldCBncmlkUm93SW5kZXhlcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmdyaWRSb3dJbmRleGVzO1xuXG4gICAgICAvLyBtYXBzIHRoZSBJRHMgdG8gdGhlIEdyaWQgUm93cyBhbmQgdmljZSB2ZXJzYSwgdGhlIFwiZGF0YUNvbnRleHRJZHNcIiBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBvdGhlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUNvbnRleHRJZHMpICYmIGRhdGFDb250ZXh0SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZ3JpZFJvd0luZGV4ZXMgPSB0aGlzLmRhdGFWaWV3Lm1hcElkc1RvUm93cyhkYXRhQ29udGV4dElkcykgfHwgW107XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZ3JpZFJvd0luZGV4ZXMpICYmIGdyaWRSb3dJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGF0YUNvbnRleHRJZHMgPSB0aGlzLmRhdGFWaWV3Lm1hcFJvd3NUb0lkcyhncmlkUm93SW5kZXhlcykgfHwgW107XG4gICAgICB9XG4gICAgICB0aGlzLmdyaWRTdGF0ZVNlcnZpY2Uuc2VsZWN0ZWRSb3dEYXRhQ29udGV4dElkcyA9IGRhdGFDb250ZXh0SWRzO1xuXG4gICAgICAvLyBjaGFuZ2UgdGhlIHNlbGVjdGVkIHJvd3MgZXhjZXB0IFVOTEVTUyBpdCdzIGEgTG9jYWwgR3JpZCB3aXRoIFBhZ2luYXRpb25cbiAgICAgIC8vIGxvY2FsIFBhZ2luYXRpb24gdXNlcyB0aGUgRGF0YVZpZXcgYW5kIHRoYXQgYWxzbyB0cmlnZ2VyIGEgY2hhbmdlL3JlZnJlc2hcbiAgICAgIC8vIGFuZCB3ZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgMiBHcmlkIFN0YXRlIGNoYW5nZXMganVzdCAxXG4gICAgICBpZiAoKHRoaXMuX2lzTG9jYWxHcmlkICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24pIHx8ICF0aGlzLl9pc0xvY2FsR3JpZCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhncmlkUm93SW5kZXhlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlR3JpZE9wdGlvbnMoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pOiBHcmlkT3B0aW9uIHtcbiAgICBncmlkT3B0aW9ucy5ncmlkSWQgPSB0aGlzLmdyaWRJZDtcbiAgICBncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgPSBgc2xpY2tHcmlkQ29udGFpbmVyLSR7dGhpcy5ncmlkSWR9YDtcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBiYWNrZW5kU2VydmljZUFwaSBhbmQgdGhlIGVuYWJsZVBhZ2luYXRpb24gaXMgdW5kZWZpbmVkLCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBkbyB3YW50IHRvIHNlZSBpdCwgZWxzZSBnZXQgdGhhdCBkZWZpbmVkIHZhbHVlXG4gICAgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9ICgoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uKSB8fCBmYWxzZTtcblxuICAgIC8vIHVzZSBqcXVlcnkgZXh0ZW5kIHRvIGRlZXAgbWVyZ2UgJiBjb3B5IHRvIGF2b2lkIGltbXV0YWJsZSBwcm9wZXJ0aWVzIGJlaW5nIGNoYW5nZWQgaW4gR2xvYmFsR3JpZE9wdGlvbnMgYWZ0ZXIgYSByb3V0ZSBjaGFuZ2VcbiAgICBjb25zdCBvcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIEdsb2JhbEdyaWRPcHRpb25zLCB0aGlzLmZvclJvb3RDb25maWcsIGdyaWRPcHRpb25zKSBhcyBHcmlkT3B0aW9uO1xuXG4gICAgLy8gdXNpbmcgalF1ZXJ5IGV4dGVuZCB0byBkbyBhIGRlZXAgY2xvbmUgaGFzIGFuIHVud2FudGVkIHNpZGUgb24gb2JqZWN0cyBhbmQgcGFnZVNpemVzIGJ1dCBFUzYgc3ByZWFkIGhhcyBvdGhlciB3b3JzdCBzaWRlIGVmZmVjdHNcbiAgICAvLyBzbyB3ZSB3aWxsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwYWdlU2l6ZXMgd2hlbiBuZWVkZWQsIHRoaXMgaXMgdGhlIG9ubHkgb25lIGNhdXNpbmcgaXNzdWVzIHNvIGZhci5cbiAgICAvLyBqUXVlcnkgd3JvdGUgdGhpcyBvbiB0aGVpciBkb2NzOjogT24gYSBkZWVwIGV4dGVuZCwgT2JqZWN0IGFuZCBBcnJheSBhcmUgZXh0ZW5kZWQsIGJ1dCBvYmplY3Qgd3JhcHBlcnMgb24gcHJpbWl0aXZlIHR5cGVzIHN1Y2ggYXMgU3RyaW5nLCBCb29sZWFuLCBhbmQgTnVtYmVyIGFyZSBub3QuXG4gICAgaWYgKG9wdGlvbnM/LnBhZ2luYXRpb24gJiYgKGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpICYmICh0aGlzLmZvclJvb3RDb25maWcucGFnaW5hdGlvbiB8fCBncmlkT3B0aW9ucy5wYWdpbmF0aW9uKSkge1xuICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8ucGFnZVNpemUgPz8gdGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplID8/IEdsb2JhbEdyaWRPcHRpb25zLnBhZ2luYXRpb24hLnBhZ2VTaXplO1xuICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplcyA9IGdyaWRPcHRpb25zLnBhZ2luYXRpb24/LnBhZ2VTaXplcyA/PyB0aGlzLmZvclJvb3RDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVzID8/IEdsb2JhbEdyaWRPcHRpb25zLnBhZ2luYXRpb24hLnBhZ2VTaXplcztcbiAgICB9XG5cbiAgICAvLyBhbHNvIG1ha2Ugc3VyZSB0byBzaG93IHRoZSBoZWFkZXIgcm93IGlmIHVzZXIgaGF2ZSBlbmFibGVkIGZpbHRlcmluZ1xuICAgIHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gKG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9PT0gZmFsc2UpO1xuICAgIGlmIChvcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiAhb3B0aW9ucy5zaG93SGVhZGVyUm93KSB7XG4gICAgICBvcHRpb25zLnNob3dIZWFkZXJSb3cgPSBvcHRpb25zLmVuYWJsZUZpbHRlcmluZztcbiAgICB9XG5cbiAgICAvLyB3aGVuIHdlIHVzZSBQYWdpbmF0aW9uIG9uIExvY2FsIEdyaWQsIGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHdpdGhvdXQgZW5hYmxlRmlsdGVyaW5nXG4gICAgLy8gc28gd2UnbGwgZW5hYmxlIHRoZSBmaWx0ZXJpbmcgYnV0IHdlJ2xsIGtlZXAgdGhlIGhlYWRlciByb3cgaGlkZGVuXG4gICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nICYmIG9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLl9pc0xvY2FsR3JpZCkge1xuICAgICAgb3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcgPSB0cnVlO1xuICAgICAgb3B0aW9ucy5zaG93SGVhZGVyUm93ID0gZmFsc2U7XG4gICAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICAvKiogUHJlLVJlZ2lzdGVyIGFueSBSZXNvdXJjZSB0aGF0IGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZCAoZm9yIGV4YW1wbGUgUnhKUyBSZXNvdXJjZSAmIFJvd0RldGFpbCkgKi9cbiAgcHJpdmF0ZSBwcmVSZWdpc3RlclJlc291cmNlcygpIHtcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzID0gdGhpcy5ncmlkT3B0aW9ucy5yZWdpc3RlckV4dGVybmFsUmVzb3VyY2VzIHx8IFtdO1xuXG4gICAgLy8gQW5ndWxhci1TbGlja2dyaWQgcmVxdWlyZXMgUnhKUywgc28gd2UnbGwgcmVnaXN0ZXIgaXQgYXMgdGhlIGZpcnN0IHJlc291cmNlXG4gICAgdGhpcy5yZWdpc3RlclJ4SnNSZXNvdXJjZShuZXcgUnhKc1Jlc291cmNlKCkgYXMgUnhKc0ZhY2FkZSk7XG5cbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dEZXRhaWxWaWV3KSB7XG4gICAgICB0aGlzLnNsaWNrUm93RGV0YWlsVmlldyA9IG5ldyBTbGlja1Jvd0RldGFpbFZpZXcodGhpcy5hbmd1bGFyVXRpbFNlcnZpY2UsIHRoaXMuYXBwUmVmLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQsIHRoaXMucnhqcyk7XG4gICAgICB0aGlzLnNsaWNrUm93RGV0YWlsVmlldy5jcmVhdGUodGhpcy5jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5zbGlja1Jvd0RldGFpbFZpZXcpO1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmFkZEV4dGVuc2lvblRvTGlzdChFeHRlbnNpb25OYW1lLnJvd0RldGFpbFZpZXcsIHsgbmFtZTogRXh0ZW5zaW9uTmFtZS5yb3dEZXRhaWxWaWV3LCBpbnN0YW5jZTogdGhpcy5zbGlja1Jvd0RldGFpbFZpZXcgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclJlc291cmNlcygpIHtcbiAgICAvLyBhdCB0aGlzIHBvaW50LCB3ZSBjb25zaWRlciBhbGwgdGhlIHJlZ2lzdGVyZWQgc2VydmljZXMgYXMgZXh0ZXJuYWwgc2VydmljZXMsIGFueXRoaW5nIGVsc2UgcmVnaXN0ZXJlZCBhZnRlcndhcmQgYXJlbid0IGV4dGVybmFsXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5leHRlcm5hbFJlZ2lzdGVyZWRSZXNvdXJjZXMgPSB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzO1xuICAgIH1cblxuICAgIC8vIHB1c2ggYWxsIG90aGVyIFNlcnZpY2VzIHRoYXQgd2Ugd2FudCB0byBiZSByZWdpc3RlcmVkXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuZ3JpZFNlcnZpY2UsIHRoaXMuZ3JpZFN0YXRlU2VydmljZSk7XG5cbiAgICAvLyB3aGVuIHVzaW5nIEdyb3VwaW5nL0RyYWdnYWJsZUdyb3VwaW5nL0NvbHNwYW4gcmVnaXN0ZXIgaXRzIFNlcnZpY2VcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jcmVhdGVQcmVIZWFkZXJQYW5lbCAmJiAhdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVEcmFnZ2FibGVHcm91cGluZykge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuZ3JvdXBpbmdTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvLyB3aGVuIHVzaW5nIFRyZWUgRGF0YSBWaWV3LCByZWdpc3RlciBpdHMgU2VydmljZVxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyZWVEYXRhKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy50cmVlRGF0YVNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8vIHdoZW4gdXNlciBlbmFibGVzIHRyYW5zbGF0aW9uLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBIZWFkZXJzIG9uIGZpcnN0IHBhc3MgJiBzdWJzZXF1ZW50bHkgaW4gdGhlIGJpbmREaWZmZXJlbnRIb29rc1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoKTtcbiAgICB9XG5cbiAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIGVtcHR5IHdhcm5pbmcgY29tcG9uZW50XG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZyA9IG5ldyBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudCgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnNsaWNrRW1wdHlXYXJuaW5nKTtcblxuICAgIC8vIGJpbmQgJiBpbml0aWFsaXplIGFsbCBDb21wb25lbnRzL1NlcnZpY2VzIHRoYXQgd2VyZSB0YWdnZWQgYXMgZW5hYmxlZFxuICAgIC8vIHJlZ2lzdGVyIGFsbCBzZXJ2aWNlcyBieSBleGVjdXRpbmcgdGhlaXIgaW5pdCBtZXRob2QgYW5kIHByb3ZpZGluZyB0aGVtIHdpdGggdGhlIEdyaWQgb2JqZWN0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykge1xuICAgICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdHlwZW9mIHJlc291cmNlLmluaXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXNvdXJjZS5pbml0KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmNvbnRhaW5lclNlcnZpY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBSeEpTIFJlc291cmNlIGluIGFsbCBuZWNlc3Nhcnkgc2VydmljZXMgd2hpY2ggdXNlcyAqL1xuICBwcml2YXRlIHJlZ2lzdGVyUnhKc1Jlc291cmNlKHJlc291cmNlOiBSeEpzRmFjYWRlKSB7XG4gICAgdGhpcy5yeGpzID0gcmVzb3VyY2U7XG4gICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5LmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xuICAgIHRoaXMuZmlsdGVyU2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcbiAgICB0aGlzLnNvcnRTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1J4SnNSZXNvdXJjZScsIHRoaXMucnhqcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIChvciBkaXNwb3NlKSB0aGUgUGFnaW5hdGlvbiBDb21wb25lbnQsIHVzZXIgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBGYWxzZSAodG8gbm90IHNob3cgaXQpIHdoaWNoIHdpbGwgaW4gdGVybSBkaXNwb3NlIG9mIHRoZSBQYWdpbmF0aW9uLFxuICAgKiBhbHNvIHdoaWxlIGRpc3Bvc2luZyB3ZSBjYW4gY2hvb3NlIHRvIG9taXQgdGhlIGRpc3Bvc2FibGUgb2YgdGhlIFBhZ2luYXRpb24gU2VydmljZSAoaWYgd2UgYXJlIHNpbXBseSB0b2dnbGluZyB0aGUgUGFnaW5hdGlvbiwgd2Ugd2FudCB0byBrZWVwIHRoZSBTZXJ2aWNlIGFsaXZlKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3dQYWdpbmF0aW9uIC0gc2hvdyAobmV3IHJlbmRlcikgb3Igbm90IChkaXNwb3NlKSB0aGUgUGFnaW5hdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3VsZERpc3Bvc2VQYWdpbmF0aW9uU2VydmljZSAtIHdoZW4gZGlzcG9zaW5nIHRoZSBQYWdpbmF0aW9uLCBkbyB3ZSBhbHNvIHdhbnQgdG8gZGlzcG9zZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlPyAoZGVmYXVsdHMgdG8gVHJ1ZSlcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyUGFnaW5hdGlvbihzaG93UGFnaW5hdGlvbiA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlUGFnaW5hdGlvbiAmJiAhdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgJiYgc2hvd1BhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2xpY2tQYWdpbmF0aW9uID0gbmV3IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudCh0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XG4gICAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbi5yZW5kZXJQYWdpbmF0aW9uKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXNob3dQYWdpbmF0aW9uKSB7XG4gICAgICBpZiAodGhpcy5zbGlja1BhZ2luYXRpb24pIHtcbiAgICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24uZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBmbGF0IGRhdGFzZXQgd2l0aCBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwLCBzb3J0IGl0ICh2aWEgaXRzIHRyZWUgc3RydWN0dXJlKSBhbmQgcmV0dXJuIHRoZSBzb3J0ZWQgZmxhdCBhcnJheVxuICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGZsYXREYXRhc2V0SW5wdXQgLSBmbGF0IGRhdGFzZXQgaW5wdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUdyaWRSZWZyZXNoIC0gb3B0aW9uYWxseSBmb3JjZSBhIGZ1bGwgZ3JpZCByZWZyZXNoXG4gICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBzb3J0IGZsYXQgcGFyZW50L2NoaWxkIGRhdGFzZXRcbiAgICovXG4gIHByaXZhdGUgc29ydFRyZWVEYXRhc2V0PFQ+KGZsYXREYXRhc2V0SW5wdXQ6IFRbXSwgZm9yY2VHcmlkUmVmcmVzaCA9IGZhbHNlKTogVFtdIHtcbiAgICBjb25zdCBwcmV2RGF0YXNldExuID0gdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGg7XG4gICAgbGV0IHNvcnRlZERhdGFzZXRSZXN1bHQ7XG4gICAgbGV0IGZsYXREYXRhc2V0T3V0cHV0OiBhbnlbXSA9IFtdO1xuXG4gICAgLy8gaWYgdGhlIGhpZXJhcmNoaWNhbCBkYXRhc2V0IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIHRoZW4gbm8gbmVlZCB0byByZS1jb252ZXJ0IGl0LCB3ZSBjYW4gdXNlIGl0IGRpcmVjdGx5IGZyb20gdGhlIHNoYXJlZCBzZXJ2aWNlIHJlZlxuICAgIGlmICh0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCAmJiB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwpIHtcbiAgICAgIHNvcnRlZERhdGFzZXRSZXN1bHQgPSB0aGlzLnRyZWVEYXRhU2VydmljZS5zb3J0SGllcmFyY2hpY2FsRGF0YXNldCh0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwpO1xuICAgICAgZmxhdERhdGFzZXRPdXRwdXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmZsYXQ7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZsYXREYXRhc2V0SW5wdXQpICYmIGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LnRyZWVEYXRhT3B0aW9ucz8uaW5pdGlhbFNvcnQpIHtcbiAgICAgICAgLy8gZWxzZSB3ZSBuZWVkIHRvIGZpcnN0IGNvbnZlcnQgdGhlIGZsYXQgZGF0YXNldCB0byBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGFuZCB0aGVuIHNvcnRcbiAgICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0QW5kU29ydChmbGF0RGF0YXNldElucHV0LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5oaWVyYXJjaGljYWw7XG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5mbGF0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZWxzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgdXNlciBwcm92aWRlZCBhbiBhcnJheSB0aGF0IGlzIGFscmVhZHkgc29ydGVkICh1c2VyJ3MgcmVzcG9uc2FiaWxpdHkpXG4gICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gc2ltcGx5IGNvbnZlcnQgdGhlIGFycmF5IHRvIGEgdHJlZSBzdHJ1Y3R1cmUgYW5kIHdlJ3JlIGRvbmUsIG5vIG5lZWQgdG8gc29ydFxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgICAgICBmbGF0RGF0YXNldE91dHB1dCA9IGZsYXREYXRhc2V0SW5wdXQgfHwgW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYWRkL3JlbW92ZSBpdGVtKHMpIGZyb20gdGhlIGRhdGFzZXQsIHdlIG5lZWQgdG8gYWxzbyByZWZyZXNoIG91ciB0cmVlIGRhdGEgZmlsdGVyc1xuICAgIGlmIChmbGF0RGF0YXNldElucHV0Lmxlbmd0aCA+IDAgJiYgKGZvcmNlR3JpZFJlZnJlc2ggfHwgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4pKSB7XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVmcmVzaFRyZWVEYXRhRmlsdGVycyhmbGF0RGF0YXNldE91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXREYXRhc2V0T3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBjb252ZW5pZW5jZSB0byB0aGUgdXNlciwgd2UgcHJvdmlkZSB0aGUgcHJvcGVydHkgXCJlZGl0b3JcIiBhcyBhbiBBbmd1bGFyLVNsaWNrZ3JpZCBlZGl0b3IgY29tcGxleCBvYmplY3RcbiAgICogaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XG4gICAqIHNvIGluIG91ciBsaWIgd2Ugd2lsbCBzd2FwIFwiZWRpdG9yXCIgYW5kIGNvcHkgaXQgaW50byBhIG5ldyBwcm9wZXJ0eSBjYWxsZWQgXCJpbnRlcm5hbENvbHVtbkVkaXRvclwiXG4gICAqIHRoZW4gdGFrZSBiYWNrIFwiZWRpdG9yLm1vZGVsXCIgYW5kIG1ha2UgaXQgdGhlIG5ldyBcImVkaXRvclwiIHNvIHRoYXQgU2xpY2tHcmlkIEVkaXRvciBGYWN0b3J5IHN0aWxsIHdvcmtzXG4gICAqL1xuICBwcml2YXRlIHN3YXBJbnRlcm5hbEVkaXRvclRvU2xpY2tHcmlkRmFjdG9yeUVkaXRvcihjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcbiAgICBpZiAoY29sdW1uRGVmaW5pdGlvbnMuc29tZShjb2wgPT4gYCR7Y29sLmlkfWAuaW5jbHVkZXMoJy4nKSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tBbmd1bGFyLVNsaWNrZ3JpZF0gTWFrZSBzdXJlIHRoYXQgbm9uZSBvZiB5b3VyIENvbHVtbiBEZWZpbml0aW9uIFwiaWRcIiBwcm9wZXJ0eSBpbmNsdWRlcyBhIGRvdCBpbiBpdHMgbmFtZSBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSBzb21lIHByb2JsZW1zIHdpdGggdGhlIEVkaXRvcnMuIEZvciBleGFtcGxlIGlmIHlvdXIgY29sdW1uIGRlZmluaXRpb24gXCJmaWVsZFwiIHByb3BlcnR5IGlzIFwidXNlci5maXJzdE5hbWVcIiB0aGVuIHVzZSBcImZpcnN0TmFtZVwiIGFzIHRoZSBjb2x1bW4gXCJpZFwiLicpO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5EZWZpbml0aW9ucy5tYXAoKGNvbHVtbjogQ29sdW1uIHwgYW55KSA9PiB7XG4gICAgICAvLyBvbiBldmVyeSBFZGl0b3IgdGhhdCBoYXZlIGEgXCJjb2xsZWN0aW9uQXN5bmNcIiwgcmVzb2x2ZSB0aGUgZGF0YSBhbmQgYXNzaWduIGl0IHRvIHRoZSBcImNvbGxlY3Rpb25cIiBwcm9wZXJ0eVxuICAgICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IuY29sbGVjdGlvbkFzeW5jKSB7XG4gICAgICAgIHRoaXMubG9hZEVkaXRvckNvbGxlY3Rpb25Bc3luYyhjb2x1bW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uY29sdW1uLCBlZGl0b3I6IGNvbHVtbi5lZGl0b3IgJiYgY29sdW1uLmVkaXRvci5tb2RlbCwgaW50ZXJuYWxDb2x1bW5FZGl0b3I6IHsgLi4uY29sdW1uLmVkaXRvciB9IH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpIHtcbiAgICAvLyB0cmFuc2xhdGUgYWxsIGNvbHVtbnMgKGluY2x1ZGluZyBoaWRkZW4gY29sdW1ucylcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkudHJhbnNsYXRlSXRlbXModGhpcy5zaGFyZWRTZXJ2aWNlLmFsbENvbHVtbnMsICduYW1lS2V5JywgJ25hbWUnKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCkge1xuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1uIGdyb3VwcyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxuICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eS50cmFuc2xhdGVJdGVtcyh0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucywgJ2NvbHVtbkdyb3VwS2V5JywgJ2NvbHVtbkdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBcImludGVybmFsQ29sdW1uRWRpdG9yLmNvbGxlY3Rpb25cIiBwcm9wZXJ0eS5cbiAgICogU2luY2UgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzeW5jIGNhbGwgcmVzb2x2ZXMsIHRoZSBwb2ludGVyIHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBcImNvbHVtblwiIGFyZ3VtZW50IHBhc3NlZC5cbiAgICogT25jZSB3ZSBmb3VuZCB0aGUgbmV3IHBvaW50ZXIsIHdlIHdpbGwgcmVhc3NpZ24gdGhlIFwiZWRpdG9yXCIgYW5kIFwiY29sbGVjdGlvblwiIHRvIHRoZSBcImludGVybmFsQ29sdW1uRWRpdG9yXCIgc28gaXQgaGFzIG5ld2VzdCBjb2xsZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUVkaXRvckNvbGxlY3Rpb248VCA9IGFueT4oY29sdW1uOiBDb2x1bW48VD4sIG5ld0NvbGxlY3Rpb246IFRbXSkge1xuICAgIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuY29sbGVjdGlvbiA9IG5ld0NvbGxlY3Rpb247XG4gICAgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLy8gZmluZCB0aGUgbmV3IGNvbHVtbiByZWZlcmVuY2UgcG9pbnRlciAmIHJlLWFzc2lnbiB0aGUgbmV3IGVkaXRvciB0byB0aGUgaW50ZXJuYWxDb2x1bW5FZGl0b3JcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvbHVtbkRlZmluaXRpb25zKSkge1xuICAgICAgY29uc3QgY29sdW1uUmVmID0gdGhpcy5jb2x1bW5EZWZpbml0aW9ucy5maW5kKChjb2w6IENvbHVtbikgPT4gY29sLmlkID09PSBjb2x1bW4uaWQpO1xuICAgICAgaWYgKGNvbHVtblJlZikge1xuICAgICAgICBjb2x1bW5SZWYuaW50ZXJuYWxDb2x1bW5FZGl0b3IgPSBjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgY3VycmVudCBFZGl0b3IsIHJlbW92ZSBpdCBmcm9tIHRoZSBET00gdGhlbiByZS1lbmFibGUgaXQgYW5kIHJlLXJlbmRlciBpdCB3aXRoIHRoZSBuZXcgY29sbGVjdGlvbi5cbiAgICBjb25zdCBjdXJyZW50RWRpdG9yID0gdGhpcy5zbGlja0dyaWQuZ2V0Q2VsbEVkaXRvcigpIGFzIEF1dG9jb21wbGV0ZXJFZGl0b3IgfCBTZWxlY3RFZGl0b3I7XG4gICAgaWYgKGN1cnJlbnRFZGl0b3I/LmRpc2FibGUgJiYgY3VycmVudEVkaXRvcj8ucmVuZGVyRG9tRWxlbWVudCkge1xuICAgICAgY3VycmVudEVkaXRvci5kZXN0cm95KCk7XG4gICAgICBjdXJyZW50RWRpdG9yLmRpc2FibGUoZmFsc2UpO1xuICAgICAgY3VycmVudEVkaXRvci5yZW5kZXJEb21FbGVtZW50KG5ld0NvbGxlY3Rpb24pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBpZD1cInNsaWNrR3JpZENvbnRhaW5lci17e2dyaWRJZH19XCIgY2xhc3M9XCJncmlkUGFuZVwiPlxuICA8ZGl2IGF0dHIuaWQ9J3t7Z3JpZElkfX0nIGNsYXNzPVwic2xpY2tncmlkLWNvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=