@bpost/bp-address-auto-complete-by-component 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/VERSION.md +30 -0
  2. package/bpost-bp-address-auto-complete-by-component.d.ts +1 -11
  3. package/esm2020/bpost-bp-address-auto-complete-by-component.mjs +5 -0
  4. package/esm2020/lib/box-number/box-number.component.mjs +800 -0
  5. package/esm2020/lib/enum/address-level.enum.mjs +8 -0
  6. package/esm2020/lib/enum/index.mjs +7 -0
  7. package/esm2020/lib/enum/input-name.enum.mjs +8 -0
  8. package/esm2020/lib/enum/source-type.enum.mjs +5 -0
  9. package/esm2020/lib/enum/suggestion-level-type.enum.mjs +8 -0
  10. package/esm2020/lib/enum/validation-message-option-type.enum.mjs +6 -0
  11. package/esm2020/lib/enum/validation-message-type.enum.mjs +7 -0
  12. package/esm2020/lib/lib-address-autocomplete-by-component.component.mjs +1233 -0
  13. package/esm2020/lib/lib-address-autocomplete-by-component.module.mjs +65 -0
  14. package/esm2020/lib/lib-address-autocomplete-by-component.service.mjs +14 -0
  15. package/esm2020/lib/locality/locality.component.mjs +747 -0
  16. package/{esm2015/lib/model/Locality.js → esm2020/lib/model/Box.mjs} +2 -2
  17. package/esm2020/lib/model/Locality.mjs +30 -0
  18. package/esm2020/lib/model/Street.mjs +30 -0
  19. package/esm2020/lib/model/query-parameters.model.mjs +21 -0
  20. package/esm2020/lib/services/adress.service.mjs +64 -0
  21. package/esm2020/lib/services/http.service.mjs +57 -0
  22. package/esm2020/lib/services/locale.service.mjs +37 -0
  23. package/esm2020/lib/services/nis9.service.mjs +26 -0
  24. package/esm2020/lib/services/unicode.service.mjs +376 -0
  25. package/esm2020/lib/street/street.component.mjs +725 -0
  26. package/esm2020/lib/street-number/street-number.component.mjs +891 -0
  27. package/esm2020/lib/utils/constants.mjs +2 -0
  28. package/esm2020/lib/utils/domhandler.mjs +47 -0
  29. package/esm2020/lib/utils/highlight-suggestion.pipe.mjs +62 -0
  30. package/{esm5/lib/utils/prefill-data.js → esm2020/lib/utils/prefill-data.mjs} +5 -7
  31. package/esm2020/lib/utils/prefilled-parameters.mjs +23 -0
  32. package/esm2020/lib/utils/preflll.event.mjs +7 -0
  33. package/esm2020/lib/utils/visible-suggestion.directive.mjs +39 -0
  34. package/esm2020/public-api.mjs +9 -0
  35. package/fesm2015/{bpost-bp-address-auto-complete-by-component.js → bpost-bp-address-auto-complete-by-component.mjs} +833 -811
  36. package/fesm2015/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  37. package/{fesm5/bpost-bp-address-auto-complete-by-component.js → fesm2020/bpost-bp-address-auto-complete-by-component.mjs} +1768 -1951
  38. package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  39. package/lib/box-number/box-number.component.d.ts +6 -0
  40. package/lib/enum/index.d.ts +3 -0
  41. package/lib/enum/suggestion-level-type.enum.d.ts +5 -0
  42. package/lib/lib-address-autocomplete-by-component.component.d.ts +7 -0
  43. package/lib/lib-address-autocomplete-by-component.module.d.ts +15 -0
  44. package/lib/lib-address-autocomplete-by-component.service.d.ts +3 -0
  45. package/lib/locality/locality.component.d.ts +3 -0
  46. package/lib/services/adress.service.d.ts +3 -0
  47. package/lib/services/http.service.d.ts +5 -0
  48. package/lib/services/locale.service.d.ts +3 -0
  49. package/lib/services/nis9.service.d.ts +3 -0
  50. package/lib/services/unicode.service.d.ts +3 -0
  51. package/lib/street/street.component.d.ts +3 -0
  52. package/lib/street-number/street-number.component.d.ts +6 -1
  53. package/lib/utils/constants.d.ts +1 -0
  54. package/lib/utils/highlight-suggestion.pipe.d.ts +3 -0
  55. package/lib/utils/visible-suggestion.directive.d.ts +3 -0
  56. package/package.json +23 -13
  57. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/.editorconfig +0 -0
  58. package/tutorial/tutorial/aacwidget-tutorial/README.md +27 -0
  59. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/angular.json +0 -0
  60. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/browserslist +0 -0
  61. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/protractor.conf.js +0 -0
  62. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/src/app.e2e-spec.ts +0 -0
  63. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/src/app.po.ts +0 -0
  64. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/tsconfig.json +0 -0
  65. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/karma.conf.js +0 -0
  66. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/package-lock.json +0 -0
  67. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/package.json +0 -0
  68. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app-routing.module.ts +0 -0
  69. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.html +0 -0
  70. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.scss +0 -0
  71. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.spec.ts +0 -0
  72. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.ts +0 -0
  73. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.module.ts +0 -0
  74. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.html +0 -0
  75. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.scss +0 -0
  76. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.ts +0 -0
  77. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.html +0 -0
  78. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.scss +0 -0
  79. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.spec.ts +0 -0
  80. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.ts +0 -0
  81. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/.gitkeep +0 -0
  82. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/de.json +0 -0
  83. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/en.json +0 -0
  84. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/fr.json +0 -0
  85. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/nl.json +0 -0
  86. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/scss/aacwidget-custom.scss +0 -0
  87. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/scss/aacwidget-default.scss +0 -0
  88. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/environments/environment.prod.ts +0 -0
  89. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/environments/environment.ts +0 -0
  90. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/favicon.ico +0 -0
  91. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/index.html +0 -0
  92. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/main.ts +0 -0
  93. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/polyfills.ts +0 -0
  94. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/styles.scss +0 -0
  95. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/test.ts +0 -0
  96. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.app.json +0 -0
  97. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.json +0 -0
  98. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.spec.json +0 -0
  99. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tslint.json +0 -0
  100. package/tutorial/{tutorial-videos.txt → tutorial/tutorial-videos.txt} +0 -0
  101. package/bpost-bp-address-auto-complete-by-component.metadata.json +0 -1
  102. package/bundles/bpost-bp-address-auto-complete-by-component.umd.js +0 -5691
  103. package/bundles/bpost-bp-address-auto-complete-by-component.umd.js.map +0 -1
  104. package/bundles/bpost-bp-address-auto-complete-by-component.umd.min.js +0 -16
  105. package/bundles/bpost-bp-address-auto-complete-by-component.umd.min.js.map +0 -1
  106. package/esm2015/bpost-bp-address-auto-complete-by-component.js +0 -16
  107. package/esm2015/lib/box-number/box-number.component.js +0 -811
  108. package/esm2015/lib/enum/address-level.enum.js +0 -8
  109. package/esm2015/lib/enum/index.js +0 -4
  110. package/esm2015/lib/enum/input-name.enum.js +0 -8
  111. package/esm2015/lib/enum/source-type.enum.js +0 -5
  112. package/esm2015/lib/enum/validation-message-option-type.enum.js +0 -6
  113. package/esm2015/lib/enum/validation-message-type.enum.js +0 -7
  114. package/esm2015/lib/lib-address-autocomplete-by-component.component.js +0 -1169
  115. package/esm2015/lib/lib-address-autocomplete-by-component.module.js +0 -42
  116. package/esm2015/lib/lib-address-autocomplete-by-component.service.js +0 -14
  117. package/esm2015/lib/locality/locality.component.js +0 -769
  118. package/esm2015/lib/model/Box.js +0 -30
  119. package/esm2015/lib/model/Street.js +0 -30
  120. package/esm2015/lib/model/query-parameters.model.js +0 -21
  121. package/esm2015/lib/services/adress.service.js +0 -68
  122. package/esm2015/lib/services/http.service.js +0 -53
  123. package/esm2015/lib/services/locale.service.js +0 -39
  124. package/esm2015/lib/services/nis9.service.js +0 -30
  125. package/esm2015/lib/services/unicode.service.js +0 -376
  126. package/esm2015/lib/street/street.component.js +0 -749
  127. package/esm2015/lib/street-number/street-number.component.js +0 -900
  128. package/esm2015/lib/utils/domhandler.js +0 -47
  129. package/esm2015/lib/utils/highlight-suggestion.pipe.js +0 -63
  130. package/esm2015/lib/utils/prefill-data.js +0 -24
  131. package/esm2015/lib/utils/prefilled-parameters.js +0 -23
  132. package/esm2015/lib/utils/preflll.event.js +0 -7
  133. package/esm2015/lib/utils/visible-suggestion.directive.js +0 -42
  134. package/esm2015/public-api.js +0 -9
  135. package/esm5/bpost-bp-address-auto-complete-by-component.js +0 -16
  136. package/esm5/lib/box-number/box-number.component.js +0 -831
  137. package/esm5/lib/enum/address-level.enum.js +0 -8
  138. package/esm5/lib/enum/index.js +0 -4
  139. package/esm5/lib/enum/input-name.enum.js +0 -8
  140. package/esm5/lib/enum/source-type.enum.js +0 -5
  141. package/esm5/lib/enum/validation-message-option-type.enum.js +0 -6
  142. package/esm5/lib/enum/validation-message-type.enum.js +0 -7
  143. package/esm5/lib/lib-address-autocomplete-by-component.component.js +0 -1185
  144. package/esm5/lib/lib-address-autocomplete-by-component.module.js +0 -45
  145. package/esm5/lib/lib-address-autocomplete-by-component.service.js +0 -16
  146. package/esm5/lib/locality/locality.component.js +0 -825
  147. package/esm5/lib/model/Box.js +0 -35
  148. package/esm5/lib/model/Locality.js +0 -35
  149. package/esm5/lib/model/Street.js +0 -35
  150. package/esm5/lib/model/query-parameters.model.js +0 -23
  151. package/esm5/lib/services/adress.service.js +0 -72
  152. package/esm5/lib/services/http.service.js +0 -55
  153. package/esm5/lib/services/locale.service.js +0 -40
  154. package/esm5/lib/services/nis9.service.js +0 -31
  155. package/esm5/lib/services/unicode.service.js +0 -379
  156. package/esm5/lib/street/street.component.js +0 -794
  157. package/esm5/lib/street-number/street-number.component.js +0 -920
  158. package/esm5/lib/utils/domhandler.js +0 -51
  159. package/esm5/lib/utils/highlight-suggestion.pipe.js +0 -75
  160. package/esm5/lib/utils/prefilled-parameters.js +0 -25
  161. package/esm5/lib/utils/preflll.event.js +0 -9
  162. package/esm5/lib/utils/visible-suggestion.directive.js +0 -43
  163. package/esm5/public-api.js +0 -9
  164. package/fesm2015/bpost-bp-address-auto-complete-by-component.js.map +0 -1
  165. package/fesm5/bpost-bp-address-auto-complete-by-component.js.map +0 -1
@@ -1,1169 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
3
- import { ValidationMessageOptionType } from './enum/validation-message-option-type.enum';
4
- import { LocalityComponent } from './locality/locality.component';
5
- import { StreetComponent } from './street/street.component';
6
- import { StreetNumberComponent } from './street-number/street-number.component';
7
- import { BoxNumberComponent } from './box-number/box-number.component';
8
- import { ADDRESSLEVEL } from './enum';
9
- import { PrefillData } from './utils/prefill-data';
10
- import { InputNameType } from './enum/input-name.enum';
11
- import { HttpService } from './services/http.service';
12
- import { Nis9Service } from './services/nis9.service';
13
- let LibAddressAutocompleteByComponentComponent = class LibAddressAutocompleteByComponentComponent {
14
- constructor(nis9Service, httpService) {
15
- this.nis9Service = nis9Service;
16
- this.httpService = httpService;
17
- this.selectedLanguage = null;
18
- this.baseUrl = "https://api.mailops.bpost.cloud/roa-info/externalMailingAddressProofingRest/autocomplete/";
19
- this.defaultApiKey = 'cyRkKOD73O1DOdgcDLLnsaOiDh6OyOkt3BBT5JU1';
20
- this.usedLocalityUrl = this.baseUrl + 'locality';
21
- this.usedStreetUrl = this.baseUrl + 'street';
22
- this.usedStreetNumberUrl = this.baseUrl + 'streetNumber';
23
- this.usedBoxNumberUrl = this.baseUrl + 'boxNumber';
24
- this.showDebugMessageToConsole = false;
25
- this.notInListAllowed = true;
26
- this.messageOption = 'Y';
27
- // LOCALITY
28
- this.localityUrl = this.baseUrl + 'locality';
29
- this.maxSuggestionLocality = 5;
30
- this.visibleSuggestionLocalityCount = 5;
31
- // localityParams: PrefilledParameters;
32
- this.localityPrefillData = null;
33
- // STREET
34
- this.streetUrl = this.baseUrl + 'street';
35
- this.maxSuggestionStreet = 5;
36
- this.visibleSuggestionStreetCount = 5;
37
- // streetParams: PrefilledParameters;
38
- this.streetPrefillData = null;
39
- // STREET NUMBER
40
- // tslint:disable-next-line:max-line-length
41
- this.streetNumberUrl = this.baseUrl + 'streetNumber';
42
- this.maxSuggestionStreetNb = 5;
43
- this.visibleSuggestionStreetNbCount = 5;
44
- // streetNumberParams: PrefilledParameters;
45
- this.streetNumberPrefillData = null;
46
- // BOX NUMBER
47
- this.boxNumberUrl = this.baseUrl + 'boxNumber';
48
- this.maxSuggestionBoxNb = 5;
49
- this.visibleSuggestionBoxNbCount = 5;
50
- // boxParams: PrefilledParameters;
51
- this.boxNumberPrefillData = null;
52
- this.emittedAddress = null;
53
- this.validationMessage = { messageType: null, translatedMessage: '' };
54
- this.addressCompleteEventEmitter = new EventEmitter();
55
- this.validationMessageEventEmitter = new EventEmitter();
56
- this.clearInputEventEmitter = new EventEmitter();
57
- this.processingPrefillData = false;
58
- // Pass the API key as a property of the library !
59
- this.apiKey = this.defaultApiKey;
60
- // set the widget as readonly and add NIS9 query parameter
61
- this.isReadonly = false;
62
- this.nis9InResponse = false;
63
- // https://bgs.bpost.be/set-selection-circle?lng=4.360537572541948&lat=50.84063582806037&radius=0.001
64
- this.nis9ServiceURL = '';
65
- this.isComponentReady = false;
66
- }
67
- // @ts-ignore
68
- set inputLang(val) {
69
- this.setLanguage(val);
70
- }
71
- // @ts-ignore
72
- set clearInput(focus) {
73
- this.onClearInput(focus);
74
- }
75
- // @ts-ignore
76
- set validationMessageOption(option) {
77
- this.setValidationMessageOptionFromInput(option);
78
- }
79
- ngOnInit() {
80
- //console.warn('lib - ngOnInit');
81
- this.nis9Service.setNis9ServiceURL(this.nis9ServiceURL);
82
- const apiKey = this.isValidData(this.apiKey) ? this.apiKey : this.defaultApiKey;
83
- this.httpService.setApiKey(apiKey);
84
- if (this.isValidData(this.localityUrl))
85
- this.usedLocalityUrl = this.localityUrl;
86
- if (this.isValidData(this.streetUrl))
87
- this.usedStreetUrl = this.streetUrl;
88
- if (this.isValidData(this.streetNumberUrl))
89
- this.usedStreetNumberUrl = this.streetNumberUrl;
90
- if (this.isValidData(this.boxNumberUrl))
91
- this.usedBoxNumberUrl = this.boxNumberUrl;
92
- if (this.addressParams) {
93
- this.prefillData = this.addressParams;
94
- }
95
- this.isComponentReady = true;
96
- }
97
- isValidData(str) {
98
- return str !== undefined && str !== null && str.length > 0;
99
- }
100
- ngOnDestroy() {
101
- if (this.subscription) {
102
- this.subscription.unsubscribe();
103
- }
104
- }
105
- ngOnChanges(changes) {
106
- if (changes) {
107
- // code for tracing
108
- // visibleSuggestionStreetNbCount
109
- if (this.showDebugMessageToConsole) {
110
- this.displayParametersChangesToConsole(changes);
111
- }
112
- /*
113
- if (changes.hasOwnProperty('apiKey') && !changes.apiKey.firstChange) {
114
- const apiKey = this.apiKey!==null && this.apiKey!==undefined && this.apiKey.length>0
115
- ? this.apiKey
116
- : this.defaultApiKey;
117
- this.httpService.setApiKey( apiKey );
118
- }
119
-
120
- if (changes.hasOwnProperty('localityUrl') && !changes.localityUrl.firstChange) {
121
- const localityUrl = this.localityUrl!==null && this.localityUrl!==undefined && this.localityUrl.length>0
122
- ? this.localityUrl
123
- : this.baseUrl + 'locality';
124
- this.usedLocalityUrl=localityUrl;
125
- console.log('ngOnChanges - localityUrl: ', localityUrl);
126
- }
127
- if (changes.hasOwnProperty('streetUrl') && !changes.streetUrl.firstChange) {
128
- const streetUrl = this.streetUrl!==null && this.streetUrl!==undefined && this.streetUrl.length>0
129
- ? this.streetUrl
130
- : this.baseUrl + 'street';
131
- this.streetUrl=streetUrl;
132
- }
133
- if (changes.hasOwnProperty('streetNumberUrl') && !changes.streetNumberUrl.firstChange) {
134
- const streetNumberUrl = this.streetNumberUrl!==null && this.streetNumberUrl!==undefined && this.streetNumberUrl.length>0
135
- ? this.streetNumberUrl
136
- : this.baseUrl + 'streetNumber';
137
- this.streetNumberUrl=streetNumberUrl;
138
- }
139
- if (changes.hasOwnProperty('boxNumberUrl') && !changes.boxNumberUrl.firstChange) {
140
- const boxNumberUrl = this.boxNumberUrl!==null && this.boxNumberUrl!==undefined && this.boxNumberUrl.length>0
141
- ? this.boxNumberUrl
142
- : this.baseUrl + 'boxNumber';
143
- this.boxNumberUrl=boxNumberUrl;
144
- }
145
- */
146
- if (changes.hasOwnProperty('addressParams') && !changes.addressParams.firstChange) {
147
- // if (changes.hasOwnProperty('addressParams')) {
148
- this.processingPrefillData = true;
149
- this.enterPrefillMode();
150
- this.selectedAddress = null;
151
- this.notifyAddressComplete();
152
- this.clearWidget();
153
- /*
154
- if (this.localityPrefillData !== null && this.localityPrefillData !== undefined) {
155
- // this.onClearInputEventEmitter(InputNameType.LOCALITY);
156
- this.clearWidget();
157
- }
158
- */
159
- this.boxNumberPrefillData = null;
160
- this.streetNumberPrefillData = null;
161
- this.streetPrefillData = null;
162
- if (this.showDebugMessageToConsole) {
163
- console.log('lib::widget detected prefilling', this.addressParams);
164
- }
165
- this.addressParams.minLevel = /*4*/ ADDRESSLEVEL.LOCALITY;
166
- // this.localityPrefillData = this.addressParams; // as any as PrefillData;
167
- this.localityPrefillData = new PrefillData(this.addressParams);
168
- // Object.assign(this.localityPrefillData, this.addressParams);
169
- if (this.showDebugMessageToConsole) {
170
- console.log('lib::checking locality match... ', this.localityPrefillData);
171
- }
172
- }
173
- }
174
- }
175
- displayParametersChangesToConsole(changes) {
176
- // messageOption
177
- if (changes.hasOwnProperty('messageOption') && !changes.messageOption.firstChange) {
178
- const wcChanges = changes.messageOption.currentValue;
179
- console.log('lib widget9 - messageOption', wcChanges);
180
- }
181
- // maxSuggestionLocality
182
- if (changes.hasOwnProperty('maxSuggestionLocality') && !changes.maxSuggestionLocality.firstChange) {
183
- const wcChanges = changes.maxSuggestionLocality.currentValue;
184
- console.log('lib widget9 - maxSuggestionLocality', wcChanges);
185
- }
186
- // visibleSuggestionLocalityCount
187
- if (changes.hasOwnProperty('visibleSuggestionLocalityCount') && !changes.visibleSuggestionLocalityCount.firstChange) {
188
- const wcChanges = changes.visibleSuggestionLocalityCount.currentValue;
189
- console.log('lib widget9 - visibleSuggestionLocalityCount', wcChanges);
190
- }
191
- // sortCriteriaLocality
192
- if (changes.hasOwnProperty('sortCriteriaLocality') && !changes.sortCriteriaLocality.firstChange) {
193
- const wcChanges = changes.sortCriteriaLocality.currentValue;
194
- console.log('lib widget9 - sortCriteriaLocality', wcChanges);
195
- }
196
- // maxSuggestionStreet
197
- if (changes.hasOwnProperty('maxSuggestionStreet') && !changes.maxSuggestionStreet.firstChange) {
198
- const wcChanges = changes.maxSuggestionStreet.currentValue;
199
- console.log('lib widget9 - maxSuggestionStreet', wcChanges);
200
- }
201
- // visibleSuggestionStreetCount
202
- if (changes.hasOwnProperty('visibleSuggestionStreetCount') && !changes.visibleSuggestionStreetCount.firstChange) {
203
- const wcChanges = changes.visibleSuggestionStreetCount.currentValue;
204
- console.log('lib widget9 - visibleSuggestionStreetCount', wcChanges);
205
- }
206
- // sortCriteriaStreet
207
- if (changes.hasOwnProperty('sortCriteriaStreet') && !changes.sortCriteriaStreet.firstChange) {
208
- const wcChanges = changes.sortCriteriaStreet.currentValue;
209
- console.log('lib widget9 - sortCriteriaStreet', wcChanges);
210
- }
211
- // maxSuggestionStreetNb
212
- if (changes.hasOwnProperty('maxSuggestionStreetNb') && !changes.maxSuggestionStreetNb.firstChange) {
213
- const wcChanges = changes.maxSuggestionStreetNb.currentValue;
214
- console.log('lib widget9 - maxSuggestionStreetNb', wcChanges);
215
- }
216
- // visibleSuggestionStreetNbCount
217
- if (changes.hasOwnProperty('visibleSuggestionStreetNbCount') && !changes.visibleSuggestionStreetNbCount.firstChange) {
218
- const wcChanges = changes.visibleSuggestionStreetNbCount.currentValue;
219
- console.log('lib widget9 - visibleSuggestionStreetNbCount', wcChanges);
220
- }
221
- // sortCriteriaStreetNb
222
- if (changes.hasOwnProperty('sortCriteriaStreetNb') && !changes.sortCriteriaStreetNb.firstChange) {
223
- const wcChanges = changes.sortCriteriaStreetNb.currentValue;
224
- console.log('lib widget9 - sortCriteriaStreetNb', wcChanges);
225
- }
226
- // maxSuggestionBoxNb
227
- if (changes.hasOwnProperty('maxSuggestionBoxNb') && !changes.maxSuggestionBoxNb.firstChange) {
228
- const wcChanges = changes.maxSuggestionBoxNb.currentValue;
229
- console.log('lib widget9 - maxSuggestionBoxNb', wcChanges);
230
- }
231
- // visibleSuggestionBoxNbCount
232
- if (changes.hasOwnProperty('visibleSuggestionBoxNbCount') && !changes.visibleSuggestionBoxNbCount.firstChange) {
233
- const wcChanges = changes.visibleSuggestionBoxNbCount.currentValue;
234
- console.log('lib widget9 - visibleSuggestionBoxNbCount', wcChanges);
235
- }
236
- // sortCriteriaBoxNb
237
- if (changes.hasOwnProperty('sortCriteriaBoxNb') && !changes.sortCriteriaBoxNb.firstChange) {
238
- const wcChanges = changes.sortCriteriaBoxNb.currentValue;
239
- console.log('lib widget9 - sortCriteriaBoxNb', wcChanges);
240
- }
241
- }
242
- clearWidget() {
243
- this.autocompleteBoxNb.clearWidget();
244
- this.autocompleteStreetNb.clearWidget();
245
- this.autocompleteStreet.clearWidget();
246
- this.autocompleteLocality.clearWidget();
247
- }
248
- changeMinLevel(minLevel) {
249
- this.minLevel = minLevel;
250
- }
251
- // Called by the specific buttons in the app
252
- onClearInput(focus) {
253
- if (this.showDebugMessageToConsole) {
254
- console.log('lib::onClearInput', focus);
255
- }
256
- /*
257
- if (focus === null || focus === undefined) {
258
- return;
259
- }*/
260
- this.quitPrefillMode();
261
- const setFocus = (focus === null || focus === undefined) ? false : focus.setFocus;
262
- switch (this.minLevel) {
263
- case 1:
264
- this.boxNumber = '';
265
- this.autocompleteBoxNb.clearInput(setFocus, false);
266
- this.clearInputEventEmitter.emit('BOX_NUMBER');
267
- break;
268
- case 2:
269
- this.boxNumber = '';
270
- this.streetNumber = '';
271
- this.autocompleteBoxNb.searchText = '';
272
- this.autocompleteBoxNb.streetNumber = '';
273
- this.autocompleteBoxNb.clearInput(setFocus, false);
274
- this.autocompleteStreetNb.onClearStreetNumberInput(setFocus, false);
275
- this.clearInputEventEmitter.emit('STREET_NUMBER');
276
- break;
277
- case 3:
278
- this.boxNumber = '';
279
- this.streetNumber = '';
280
- this.street = '';
281
- this.autocompleteBoxNb.searchText = '';
282
- this.autocompleteBoxNb.streetNumber = '';
283
- this.autocompleteBoxNb.clearInput(setFocus, false);
284
- this.autocompleteBoxNb.clearWidget();
285
- this.autocompleteStreetNb.searchText = '';
286
- this.autocompleteStreetNb.streetName = '';
287
- this.autocompleteStreetNb.onClearStreetNumberInput(setFocus, false);
288
- this.autocompleteStreet.clearInput(setFocus, false);
289
- this.clearInputEventEmitter.emit('STREET');
290
- break;
291
- default:
292
- // Box number
293
- this.boxNumber = '';
294
- if (this.autocompleteBoxNb) {
295
- this.autocompleteBoxNb.searchText = '';
296
- this.autocompleteBoxNb.streetNumber = '';
297
- this.autocompleteBoxNb.clearInput(setFocus, false);
298
- }
299
- // Street number
300
- this.streetNumber = '';
301
- if (this.autocompleteStreetNb) {
302
- this.autocompleteStreetNb.searchText = '';
303
- this.autocompleteStreetNb.streetName = '';
304
- this.autocompleteStreetNb.onClearStreetNumberInput(setFocus, false);
305
- }
306
- // Street name
307
- this.street = '';
308
- if (this.autocompleteStreet) {
309
- this.autocompleteStreet.searchText = '';
310
- this.autocompleteStreet.clearInput(setFocus, false);
311
- }
312
- // Locality
313
- this.locality = '';
314
- if (this.autocompleteLocality) {
315
- this.autocompleteLocality.searchText = '';
316
- this.autocompleteLocality.clearInput(setFocus, false);
317
- }
318
- this.clearInputEventEmitter.emit('LOCALITY');
319
- break;
320
- }
321
- }
322
- getBoxPrefix() {
323
- let prefix = '';
324
- switch (this.selectedLanguage) {
325
- case 'fr':
326
- prefix = 'BTE';
327
- break;
328
- case 'nl':
329
- prefix = 'BUS';
330
- break;
331
- default:
332
- prefix = 'BOX';
333
- break;
334
- }
335
- return prefix;
336
- }
337
- notifyAddressComplete() {
338
- // console.log('notify for address complete');
339
- if (this.showDebugMessageToConsole) {
340
- console.log('notifyAddressComplete', this.selectedAddress, 'nis9InResponse:' + this.nis9InResponse, typeof this.nis9InResponse);
341
- }
342
- if ((this.nis9InResponse === true || '' + this.nis9InResponse === 'true')
343
- && this.selectedAddress !== undefined && this.selectedAddress !== null
344
- && this.selectedAddress.hasOwnProperty('latitude') && this.selectedAddress.hasOwnProperty('longitude')) {
345
- const latitude = this.selectedAddress.latitude;
346
- const longitude = this.selectedAddress.longitude;
347
- if (this.showDebugMessageToConsole)
348
- console.log('calling nis9 service to get nis9 data (1):', longitude, latitude);
349
- this.nis9Service.determineNis9Data(longitude, latitude)
350
- .subscribe(data => {
351
- console.log('nis DATA:', data);
352
- /*
353
- nis DATA:
354
- {Status: 'success', data: Array(1)}
355
- Status: "success"
356
- data: ['25112A21-']
357
- */
358
- if (data !== undefined && data !== null && data.hasOwnProperty('Status') && data.Status === 'success') {
359
- const nis9Data = data.data;
360
- if (Array.isArray(nis9Data) && nis9Data.length === 1) {
361
- this.selectedAddress.nis9 = nis9Data[0];
362
- }
363
- }
364
- this.addressCompleteEventEmitter.emit(this.selectedAddress);
365
- this.emittedAddress = this.selectedAddress;
366
- this.updatePostalCodeLocality(this.emittedAddress);
367
- });
368
- }
369
- else {
370
- if (this.showDebugMessageToConsole)
371
- console.log('NOT calling nis9 service to get nis9 data (1)');
372
- this.addressCompleteEventEmitter.emit(this.selectedAddress);
373
- this.emittedAddress = this.selectedAddress;
374
- this.updatePostalCodeLocality(this.emittedAddress);
375
- }
376
- }
377
- onClearInputEventEmitter(event) {
378
- if (this.showDebugMessageToConsole) {
379
- console.log('lib::onClearInputEventEmitter', event);
380
- }
381
- this.quitPrefillMode();
382
- let nextAddress = this.selectedAddress; // this.emittedAddress;
383
- if (event === InputNameType.LOCALITY) {
384
- // Box number
385
- this.boxNumber = '';
386
- if (this.autocompleteBoxNb) {
387
- this.autocompleteBoxNb.searchText = '';
388
- this.autocompleteBoxNb.streetNumber = '';
389
- this.autocompleteBoxNb.clearInput(false, false);
390
- }
391
- // Street number
392
- this.streetNumber = '';
393
- if (this.autocompleteStreetNb) {
394
- this.autocompleteStreetNb.searchText = '';
395
- this.autocompleteStreetNb.streetName = '';
396
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
397
- }
398
- // Street name
399
- this.street = '';
400
- if (this.autocompleteStreet) {
401
- this.autocompleteStreet.searchText = '';
402
- this.autocompleteStreet.clearInput(false, false);
403
- }
404
- // Locality
405
- this.locality = '';
406
- if (this.autocompleteLocality) {
407
- this.autocompleteLocality.searchText = '';
408
- this.autocompleteLocality.clearInput(false, false);
409
- }
410
- nextAddress = null;
411
- }
412
- else if (event === InputNameType.STREET) {
413
- // Box number
414
- this.boxNumber = '';
415
- if (this.autocompleteBoxNb) {
416
- this.autocompleteBoxNb.searchText = '';
417
- this.autocompleteBoxNb.streetNumber = '';
418
- this.autocompleteBoxNb.clearInput(false, false);
419
- }
420
- // Street number
421
- this.streetNumber = '';
422
- if (this.autocompleteStreetNb) {
423
- this.autocompleteStreetNb.searchText = '';
424
- this.autocompleteStreetNb.streetName = '';
425
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
426
- }
427
- // Street name
428
- this.street = '';
429
- if (this.autocompleteStreet) {
430
- this.autocompleteStreet.searchText = '';
431
- this.autocompleteStreet.clearInput(false, false);
432
- }
433
- nextAddress = null;
434
- }
435
- else if (event === InputNameType.STREET_NUMBER) {
436
- // Box number
437
- this.boxNumber = '';
438
- if (this.autocompleteBoxNb) {
439
- this.autocompleteBoxNb.searchText = '';
440
- this.autocompleteBoxNb.streetNumber = '';
441
- this.autocompleteBoxNb.clearInput(false, false);
442
- }
443
- // Street number
444
- this.streetNumber = '';
445
- if (this.autocompleteStreetNb) {
446
- this.autocompleteStreetNb.searchText = '';
447
- // this.autocompleteStreetNb.streetName = '';
448
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
449
- }
450
- nextAddress = null;
451
- }
452
- else if (event === InputNameType.BOX_NUMBER) {
453
- // Box number
454
- this.boxNumber = '';
455
- if (this.autocompleteBoxNb) {
456
- this.autocompleteBoxNb.searchText = '';
457
- // this.autocompleteBoxNb.streetNumber = '';
458
- this.autocompleteBoxNb.clearInput(false, false);
459
- }
460
- // Attention: if not-in-list don't reset the address, just modify it
461
- const addressIsNotInList = nextAddress !== undefined && nextAddress !== null
462
- && nextAddress.hasOwnProperty('not-in-list') && nextAddress['not-in-list'] === true
463
- ? true : false;
464
- /*
465
- if (addressIsNotInList)
466
- {
467
- delete nextAddress.boxNumber;
468
- nextAddress.isCompleteNotificationDone = false;
469
- if (this.streetNumberAddress !== null )
470
- {
471
- console.warn('reset box on not-in-list', this.streetNumberAddress);
472
-
473
- }
474
- }
475
- else
476
- {
477
- nextAddress = null;
478
- }
479
- */
480
- nextAddress = this.streetNumberAddress !== null ? this.streetNumberAddress : null;
481
- /*
482
- const addressIsNotInList
483
- = nextAddress !== null && nextAddress.hasOwnProperty('not-in-list') && nextAddress['not-in-list'] === true
484
- ? true : false;
485
- */
486
- const addressIsComplete = nextAddress !== undefined && nextAddress !== null
487
- && nextAddress.hasOwnProperty('isComplete') && nextAddress.isComplete === true ? true : false;
488
- this.autocompleteStreetNb.addressIsComplete = addressIsComplete;
489
- }
490
- this.clearInputEventEmitter.emit(event);
491
- if (this.emittedAddress !== null) {
492
- if (nextAddress !== undefined && nextAddress !== null && nextAddress.hasOwnProperty('latitude') && nextAddress.hasOwnProperty('longitude')) {
493
- const latitude = nextAddress.latitude;
494
- const longitude = nextAddress.longitude;
495
- if (this.showDebugMessageToConsole)
496
- console.log('calling nis9 service to get nis9 data (2)', longitude, latitude);
497
- }
498
- else {
499
- if (this.showDebugMessageToConsole)
500
- console.log('NOT calling nis9 service to get nis9 data (2)');
501
- }
502
- this.addressCompleteEventEmitter.emit(nextAddress);
503
- this.emittedAddress = nextAddress;
504
- }
505
- // gka
506
- /*
507
- if (event === InputNameType.LOCALITY)
508
- {
509
- this.minLevel = ADDRESSLEVEL.LOCALITY;
510
- this.boxNumberPrefillData = null;
511
- this.streetNumberPrefillData = null;
512
- this.streetPrefillData = null;
513
- this.localityPrefillData = null;
514
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
515
- this.locality = '';
516
- this.postalCode = '';
517
- this.street = null;
518
- this.streetNumber = null;
519
- this.boxNumber = null;
520
- this.autocompleteBoxNb.clearInput(false, false);
521
- this.autocompleteBoxNb.streetName = '';
522
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
523
- this.autocompleteStreetNb.streetName = '';
524
- this.autocompleteStreet.clearInput(false, false);
525
- this.autocompleteStreet.locality = '';
526
- this.autocompleteLocality.clearInput(false, false);
527
- }
528
- if (event === InputNameType.STREET)
529
- {
530
- this.minLevel = ADDRESSLEVEL.STREET;
531
- this.boxNumberPrefillData = null;
532
- this.streetNumberPrefillData = null;
533
- this.streetPrefillData = null;
534
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
535
- this.street = null;
536
- this.streetNumber = null;
537
- this.boxNumber = null;
538
- this.autocompleteBoxNb.clearInput(false, false);
539
- this.autocompleteBoxNb.streetName = '';
540
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
541
- this.autocompleteStreetNb.streetName = '';
542
- this.autocompleteStreet.clearInput(false, false);
543
- // this.autocompleteLocality.clearInput(false, false);
544
- }
545
- if (event === InputNameType.STREET_NUMBER)
546
- {
547
- this.minLevel = ADDRESSLEVEL.STREET_NUMBER;
548
- this.boxNumberPrefillData = null;
549
- this.streetNumberPrefillData = null;
550
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
551
- this.streetNumber = null;
552
- this.boxNumber = null;
553
- this.autocompleteBoxNb.clearInput(false, false);
554
- this.autocompleteBoxNb.streetName = '';
555
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
556
- // this.autocompleteStreet.clearInput(false, false);
557
- // this.autocompleteLocality.clearInput(false, false);
558
- }
559
- if (event === InputNameType.BOX_NUMBER)
560
- {
561
- this.minLevel = ADDRESSLEVEL.BOX_NUMBER;
562
- this.boxNumberPrefillData = null;
563
- this.boxNumber = null;
564
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
565
- this.autocompleteBoxNb.clearInput(false, false);
566
- // this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
567
- // this.autocompleteStreet.clearInput(false, false);
568
- // this.autocompleteLocality.clearInput(false, false);
569
- }
570
- */
571
- }
572
- resetLocality(event) {
573
- this.postalCode = '';
574
- this.locality = '';
575
- this.quitPrefillMode();
576
- this.onClearInputEventEmitter(InputNameType.STREET);
577
- this.setAddress(null, 4);
578
- }
579
- resetStreet(event) {
580
- this.street = '';
581
- this.quitPrefillMode();
582
- this.onClearInputEventEmitter(InputNameType.STREET_NUMBER);
583
- this.autocompleteStreetNb.addressIsComplete = false;
584
- this.autocompleteStreetNb.streetName = '';
585
- this.setAddress(null, 3);
586
- }
587
- resetStreetNumber(event, resetAddress = false) {
588
- // console.log('reset street numner!', event, resetAddress);
589
- this.streetNumber = '';
590
- this.quitPrefillMode();
591
- this.onClearInputEventEmitter(InputNameType.BOX_NUMBER);
592
- this.autocompleteBoxNb.addressIsComplete = false;
593
- this.autocompleteBoxNb.streetNumber = '';
594
- this.setAddress(null, 2);
595
- // $$ 7 this.setAddress(null, 2); // $$ ?????
596
- /*
597
- if (resetAddress === true) {
598
- this.setAddress(/ *null* / this.selectedAddress);
599
- }*/
600
- }
601
- resetBoxNumber(event, resetAddress = false) {
602
- // console.log('reset street numner!', event, resetAddress);
603
- this.boxNumber = '';
604
- this.quitPrefillMode();
605
- this.autocompleteBoxNb.addressIsComplete = false;
606
- this.setAddress(null, 1);
607
- // this.onClearInputEventEmitter(InputNameType.BOX_NUMBER);
608
- // $$ 7 this.setAddress(null, 1); // $$ ?????
609
- /*
610
- if (resetAddress === true) {
611
- this.setAddress(/ *null* / this.selectedAddress);
612
- }*/
613
- }
614
- enterPrefillMode() {
615
- if (this.showDebugMessageToConsole) {
616
- console.log('lib::enterPrefillMode()');
617
- }
618
- if (this.autocompleteBoxNb && this.autocompleteStreetNb && this.autocompleteStreet && this.autocompleteLocality) {
619
- this.autocompleteBoxNb.prefilling = true;
620
- this.autocompleteStreetNb.prefilling = true;
621
- this.autocompleteStreet.prefilling = true;
622
- this.autocompleteLocality.prefilling = true;
623
- this.autocompleteStreet.locality = '';
624
- this.autocompleteStreetNb.streetName = '';
625
- this.autocompleteBoxNb.streetNumber = '';
626
- }
627
- }
628
- quitPrefillMode() {
629
- if (this.showDebugMessageToConsole) {
630
- console.log('lib::quitPrefillMode()');
631
- }
632
- if (this.autocompleteBoxNb && this.autocompleteStreetNb && this.autocompleteStreet && this.autocompleteLocality) {
633
- this.autocompleteBoxNb.prefilling = false;
634
- this.autocompleteStreetNb.prefilling = false;
635
- this.autocompleteStreet.prefilling = false;
636
- this.autocompleteLocality.prefilling = false;
637
- }
638
- this.processingPrefillData = false;
639
- }
640
- setAddress(address, level) {
641
- if (this.showDebugMessageToConsole) {
642
- console.log('lib::setAddress - address part, level', address, level);
643
- }
644
- /* $$ $$
645
- if (this.selectedAddress && !address) {
646
- // console.log('reset address!');
647
- this.selectedAddress = null;
648
- this.streetAddress = null;
649
- this.streetNumberAddress = null;
650
- this.notifyAddressComplete();
651
- return;
652
- }
653
- */
654
- if (address === null || address === undefined) {
655
- const doNotify = (this.selectedAddress !== null && this.selectedAddress !== undefined) ? true : false;
656
- this.selectedAddress = null;
657
- this.autocompleteStreetNb.addressIsComplete = false;
658
- this.autocompleteBoxNb.addressIsComplete = false;
659
- if (doNotify) {
660
- this.notifyAddressComplete();
661
- }
662
- }
663
- if (address) {
664
- delete address.messages;
665
- this.selectedAddress = address;
666
- this.updateCompleteAddress();
667
- this.postalCode = address.postalCode ? address.postalCode : '';
668
- this.locality = address.localityName ? address.localityName : '';
669
- this.street = address.streetName ? address.streetName : '';
670
- // const notInList = address['not-in-list'];
671
- // const isNotInList = notInList !== null && notInList !== undefined && notInList === true;
672
- /*
673
- if (address.houseNumber) {
674
- if (!address.isComplete || isNotInList) {
675
- this.streetNumber = address.houseNumber ? address.houseNumber : '';
676
- } else {
677
- if (!address.boxNumber) {
678
- // console.log('calling reset street number !');
679
- if ( !this.processingPrefillData ) {
680
- this.resetStreetNumber(null, false);
681
- }
682
- // this.streetNumber = '';
683
- }
684
- }
685
- }
686
- */
687
- const addressIsComplete = address !== null && address !== undefined
688
- && address.hasOwnProperty('isComplete') && address.isComplete === true ? true : false;
689
- const addressIsNotInList = address !== null && address !== undefined
690
- && address.hasOwnProperty('not-in-list') && address['not-in-list'] === true ? true : false;
691
- switch (level) {
692
- // Locality / Municipality and POstalCode
693
- case 4:
694
- this.updatePostalCodeLocality(address);
695
- /*
696
- this.autocompleteStreet.clearWidget();
697
- this.autocompleteStreetNb.searchText = '';
698
- this.autocompleteStreetNb.clearWidget();
699
- this.autocompleteStreetNb.searchText = '';
700
- this.autocompleteBoxNb.clearWidget();
701
- this.autocompleteBoxNb.searchText = '';
702
- */
703
- this.streetAddress = null;
704
- this.streetNumberAddress = null;
705
- //
706
- this.autocompleteStreet.searchText = '';
707
- this.autocompleteStreetNb.searchText = '';
708
- this.autocompleteStreetNb.streetName = '';
709
- this.autocompleteBoxNb.searchText = '';
710
- this.autocompleteBoxNb.streetNumber = '';
711
- break;
712
- // Street Name
713
- case 3:
714
- this.updatePostalCodeLocality(address);
715
- this.updateStreetName(address);
716
- this.streetAddress = address;
717
- this.streetNumberAddress = null;
718
- /*
719
- this.autocompleteStreetNb.clearWidget();
720
- this.autocompleteStreetNb.searchText = '';
721
- this.autocompleteBoxNb.clearWidget();
722
- this.autocompleteBoxNb.searchText = '';
723
- */
724
- this.autocompleteStreetNb.searchText = '';
725
- this.autocompleteBoxNb.searchText = '';
726
- this.autocompleteBoxNb.streetNumber = '';
727
- break;
728
- // STREET Number
729
- case 2:
730
- this.updatePostalCodeLocality(address);
731
- this.updateStreetName(address);
732
- this.updateStreetNumber(address); // $$
733
- this.streetAddress = address;
734
- this.streetNumberAddress = address;
735
- if (address.hasOwnProperty('isComplete') && address.isComplete === true) {
736
- this.autocompleteStreetNb.addressIsComplete = true;
737
- if (addressIsNotInList) {
738
- this.autocompleteBoxNb.streetNumber = address.houseNumber;
739
- }
740
- else {
741
- this.autocompleteBoxNb.streetNumber = '';
742
- }
743
- }
744
- else {
745
- this.autocompleteBoxNb.streetNumber = address.houseNumber;
746
- }
747
- /*
748
- this.autocompleteBoxNb.clearWidget();
749
- this.autocompleteBoxNb.searchText = '';
750
- */
751
- this.autocompleteBoxNb.searchText = '';
752
- break;
753
- // BOX Number
754
- case 1:
755
- {
756
- if (addressIsNotInList) {
757
- this.autocompleteStreetNb.addressIsComplete = false;
758
- }
759
- }
760
- break;
761
- default:
762
- break;
763
- }
764
- if (this.selectedAddress && this.selectedAddress.isComplete === undefined) {
765
- this.selectedAddress.isComplete = false;
766
- }
767
- /*
768
- if (address.isComplete === true ) {
769
- if (!this.selectedAddress.isCompleteNotificationDone) {
770
- this.selectedAddress.isCompleteNotificationDone = true;
771
- this.notifyAddressComplete();
772
- }
773
- } else {
774
- this.notifyAddressComplete();
775
- }
776
- */
777
- this.selectedAddress.isCompleteNotificationDone = true;
778
- this.notifyAddressComplete();
779
- }
780
- }
781
- setLanguage(lang) {
782
- this.selectedLanguage = lang;
783
- }
784
- setValidationMessage(/*message: string*/ message) {
785
- this.validationMessage = message;
786
- if (this.validationMessageOptionType === ValidationMessageOptionType.EMIT) {
787
- this.validationMessageEventEmitter.emit(message);
788
- }
789
- }
790
- updatePostalCodeLocality(address) {
791
- if (address && address.postalCode && address.localityName) {
792
- this.postalCodeLocality = address.postalCode + ' ' + address.localityName;
793
- this.autocompleteLocality.searchText = this.postalCodeLocality;
794
- }
795
- }
796
- updateStreetName(address) {
797
- if (address && address.streetName) {
798
- this.streetNameInput = address.streetName;
799
- }
800
- }
801
- updateStreetNumber(address) {
802
- if (address && address.houseNumber) {
803
- this.streetNumberInput = address.houseNumber;
804
- }
805
- }
806
- updateCompleteAddress() {
807
- let concatStr = '';
808
- concatStr += this.selectedAddress.streetName ? `${this.selectedAddress.streetName} ` : '';
809
- concatStr += this.selectedAddress.houseNumber ? `${this.selectedAddress.houseNumber} ` : '';
810
- concatStr += this.selectedAddress.boxNumber ? `${this.getBoxPrefix()} ${this.selectedAddress.boxNumber} ` : '';
811
- concatStr += this.selectedAddress.postalCode ? `${this.selectedAddress.postalCode} ` : '';
812
- concatStr += this.selectedAddress.municipalityName ? `${this.selectedAddress.municipalityName} ` : '';
813
- this.completeAddress = concatStr;
814
- }
815
- setValidationMessageOptionFromInput(option) {
816
- this.validationMessageOptionType = option.validationType;
817
- // console.log('addresse autocomplete - validation message option', this.validationMessageOptionType);
818
- }
819
- onLocalityPrefillEvent(event) {
820
- if (this.showDebugMessageToConsole) {
821
- console.log('lib::locality prefill event received:', event);
822
- }
823
- /*
824
- if (event.perfectMatch)
825
- {
826
- this.addressParams.minLevel = / *3* / ADDRESSLEVEL.STREET;
827
- this.streetParams = this.addressParams;
828
- }
829
- */
830
- const data = event.prefillData;
831
- if (event.prefillData.prefillMunicipalityPerfectMatchFound === true) {
832
- const suggestion = data.prefillMunicipalityPerfectMatchSuggestion;
833
- const address = suggestion.address;
834
- this.updatePostalCodeLocality(address);
835
- this.addressParams.minLevel = /*4*/ ADDRESSLEVEL.STREET;
836
- // this.localityPrefillData = this.addressParams; // as any as PrefillData;
837
- // this.localityPrefillData = new PrefillData(this.addressParams);
838
- // Object.assign(this.localityPrefillData, this.addressParams);
839
- this.prefillData = event.prefillData;
840
- this.prefillData.ts = new Date();
841
- this.prefillData.parameters.minLevel = ADDRESSLEVEL.STREET;
842
- // Be sure to propagate the localityName in place of the municipalityName !
843
- const suggestionAddress = this.prefillData.prefillMunicipalityPerfectMatchSuggestion.address;
844
- const suggestionAddressLocalityName = suggestionAddress.localityName;
845
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
846
- this.prefillData.parameters.postalCode = suggestionAddress.postalCode;
847
- // this.updatePostalCodeLocality(suggestionAddress);
848
- const streetName = this.prefillData.parameters.streetName;
849
- if (streetName === null || streetName === undefined || streetName === '') {
850
- this.setAddress(address, ADDRESSLEVEL.LOCALITY);
851
- // this.quitPrefillMode();
852
- // this.updatePostalCodeLocality(suggestionAddress);
853
- }
854
- /*
855
- const streetName = this.prefillData.parameters.streetName;
856
- if (streetName === null || streetName === undefined || streetName === '')
857
- {
858
- this.setAddress(address, ADDRESSLEVEL.LOCALITY);
859
- this.quitPrefillMode();
860
- // this.updatePostalCodeLocality(suggestionAddress);
861
- }
862
- else
863
- {
864
- if (this.showDebugMessageToConsole) { console.log('lib::prefill: trigger checking street match... ', this.prefillData); }
865
- this.streetPrefillData = this.prefillData;
866
- }
867
- */
868
- this.streetPrefillData = this.prefillData;
869
- }
870
- else {
871
- // const cpAndLocality = this.prefillData.parameters.postalCode + this.prefillData.parameters.municipalityName;
872
- const cpAndLocality = data.parameters.postalCode + data.parameters.municipalityName;
873
- this.autocompleteStreet.locality = '';
874
- if (cpAndLocality === null || cpAndLocality === undefined || cpAndLocality.length === 0) {
875
- this.setAddress(null, ADDRESSLEVEL.LOCALITY);
876
- }
877
- this.quitPrefillMode();
878
- }
879
- }
880
- onStreetPrefillEvent(event) {
881
- if (this.showDebugMessageToConsole) {
882
- console.log('lib::street: prefill event received', event);
883
- }
884
- /*
885
- const data: PrefillData = event.prefillData;
886
- if (data.prefillStreetPerfectMatchFound === true )
887
- {
888
- console.log('lib::onStreetPrefillEvent: MATCH FOUND', data);
889
- this.postalCodeLocality = 'TRUC-MUCHE';
890
- this.postalCodeLocality = 'TRUC-MUCHE 2';
891
- this.autocompleteLocality.searchText = this.postalCodeLocality;
892
- }
893
- */
894
- const data = event.prefillData;
895
- if (event.prefillData.prefillStreetPerfectMatchFound === true) {
896
- // if (this.showDebugMessageToConsole) { console.log('lib::onStreetPrefillEvent: MATCH FOUND', data); }
897
- const suggestion = data.prefillStreetPerfectMatchSuggestion;
898
- const address = suggestion.address;
899
- this.updateStreetName(address);
900
- this.addressParams.minLevel = ADDRESSLEVEL.STREET_NUMBER;
901
- // this.localityPrefillData = this.addressParams; // as any as PrefillData;
902
- // this.localityPrefillData = new PrefillData(this.addressParams);
903
- // Object.assign(this.localityPrefillData, this.addressParams);
904
- this.prefillData = event.prefillData;
905
- this.prefillData.ts = new Date();
906
- this.prefillData.parameters.minLevel = ADDRESSLEVEL.STREET_NUMBER;
907
- const suggestionAddress = this.prefillData.prefillStreetPerfectMatchSuggestion.address;
908
- const suggestionAddressLocalityName = suggestionAddress.localityName;
909
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
910
- this.prefillData.parameters.postalCode = suggestionAddress.postalCode;
911
- this.prefillData.parameters.streetName = suggestionAddress.streetName;
912
- // this.updatePostalCodeLocality(suggestionAddress);
913
- // this.updatePostalCodeLocality(suggestionAddress);
914
- const streetNumber = this.prefillData.parameters.streetNumber;
915
- if (streetNumber === null || streetNumber === undefined || streetNumber === '') {
916
- this.setAddress(address, ADDRESSLEVEL.STREET);
917
- // this.quitPrefillMode();
918
- }
919
- /*
920
- const streetNumber = this.prefillData.parameters.streetNumber;
921
- if (streetNumber === null || streetNumber === undefined || streetNumber === '')
922
- {
923
- this.setAddress(address, ADDRESSLEVEL.STREET);
924
- this.quitPrefillMode();
925
- }
926
- else
927
- {
928
- if (this.showDebugMessageToConsole) {console.log('lib::prefill: trigger checking street number match... ', this.prefillData);}
929
- this.streetNumberPrefillData = this.prefillData;
930
- }
931
- */
932
- this.streetNumberPrefillData = this.prefillData;
933
- }
934
- else {
935
- const prefillStreetName = this.prefillData.parameters.streetName;
936
- const address = this.prefillData.prefillMunicipalityPerfectMatchSuggestion.address;
937
- this.autocompleteStreetNb.streetName = '';
938
- if (this.showDebugMessageToConsole) {
939
- console.error('lib::onStreetPrefillEvent - NO MATCH AT STREET LEVEL', prefillStreetName);
940
- }
941
- if (prefillStreetName === null || prefillStreetName === undefined || prefillStreetName.length === 0) {
942
- // if (this.showDebugMessageToConsole) {console.log('lib::onStreetPrefillEvent: NO MATCH FOUND - set address', data, address); }
943
- this.setAddress(address, ADDRESSLEVEL.LOCALITY);
944
- }
945
- else {
946
- // address.streetName = prefillStreetName;
947
- address.searchBarString = prefillStreetName;
948
- this.setAddress(address, ADDRESSLEVEL.STREET);
949
- }
950
- this.quitPrefillMode();
951
- }
952
- }
953
- onStreetNumberPrefillEvent(event) {
954
- if (this.showDebugMessageToConsole) {
955
- console.log('lib::street number prefill event received:', event);
956
- }
957
- const data = event.prefillData;
958
- if (data.prefillStreetNumberPerfectMatchFound === true) {
959
- const suggestion = data.prefillStreetNumberPerfectMatchSuggestion;
960
- const address = suggestion.address;
961
- this.updateStreetNumber(address);
962
- this.autocompleteStreetNb.selectedAddress = address;
963
- const addressIsComplete = address && address.hasOwnProperty('isComplete') && address.isComplete === true ? true : false;
964
- const addressIsNotInList = address && address.hasOwnProperty('not-in-list') && address['not-in-list'] === true ? true : false;
965
- if (addressIsComplete && !addressIsNotInList) {
966
- // found address - perfect matchat street number level
967
- // Nothing to do anymore
968
- this.autocompleteStreetNb.addressIsComplete = true;
969
- this.quitPrefillMode();
970
- }
971
- else {
972
- this.addressParams.minLevel = ADDRESSLEVEL.BOX_NUMBER;
973
- this.prefillData = event.prefillData;
974
- this.prefillData.ts = new Date();
975
- this.prefillData.parameters.minLevel = ADDRESSLEVEL.BOX_NUMBER;
976
- // const suggestionAddressLocalityName
977
- // = this.prefillData.prefillStreetNumberPerfectMatchSuggestion.address.localityName;
978
- const suggestionAddress = this.prefillData.prefillStreetNumberPerfectMatchSuggestion.address;
979
- const suggestionAddressLocalityName = suggestionAddress.localityName;
980
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
981
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
982
- this.prefillData.parameters.postalCode = suggestionAddress.postalCode;
983
- this.prefillData.parameters.streetName = suggestionAddress.streetName;
984
- this.prefillData.parameters.streetNumber = suggestionAddress.houseNumber;
985
- // this.updatePostalCodeLocality(suggestionAddress);
986
- // this.updatePostalCodeLocality(suggestionAddress);
987
- const boxNumber = this.prefillData.parameters.boxNumber;
988
- if (!addressIsNotInList && (boxNumber === null || boxNumber === undefined || boxNumber === '')) {
989
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
990
- // this.quitPrefillMode();
991
- }
992
- /*
993
- const boxNumber = this.prefillData.parameters.boxNumber;
994
- if ( ! addressIsNotInList && (boxNumber === null || boxNumber === undefined || boxNumber === '') )
995
- {
996
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
997
- this.quitPrefillMode();
998
- }
999
- else
1000
- {
1001
- if (this.showDebugMessageToConsole) { console.log('lib::prefill: trigger checking box number match... ', this.prefillData); }
1002
- this.boxNumberPrefillData = this.prefillData;
1003
- }
1004
- */
1005
- this.boxNumberPrefillData = this.prefillData;
1006
- }
1007
- }
1008
- else {
1009
- const prefillStreetNumber = this.prefillData.parameters.streetNumber;
1010
- const address = this.prefillData.prefillStreetPerfectMatchSuggestion.address;
1011
- this.autocompleteBoxNb.streetNumber = '';
1012
- if (prefillStreetNumber === null || prefillStreetNumber === undefined || prefillStreetNumber.length === 0) {
1013
- this.setAddress(address, ADDRESSLEVEL.STREET);
1014
- }
1015
- else {
1016
- // address.houseNumber = prefillStreetNumber;
1017
- address.searchBarString = prefillStreetNumber;
1018
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
1019
- }
1020
- this.quitPrefillMode();
1021
- }
1022
- }
1023
- onBoxNumberPrefillEvent(event) {
1024
- if (this.showDebugMessageToConsole) {
1025
- console.log('lib::prefill: box number event received:', event);
1026
- }
1027
- const data = event.prefillData;
1028
- if (data.prefillBoxNumberPerfectMatchFound === true) {
1029
- const suggestion = data.prefillBoxNumberPerfectMatchSuggestion;
1030
- const address = suggestion.address;
1031
- this.autocompleteBoxNb.selectedAddress = address;
1032
- this.setAddress(address, ADDRESSLEVEL.BOX_NUMBER);
1033
- }
1034
- else {
1035
- const prefillBoxNumber = this.prefillData.parameters.boxNumber;
1036
- const address = this.prefillData.prefillStreetNumberPerfectMatchSuggestion.address;
1037
- if (prefillBoxNumber === null || prefillBoxNumber === undefined || prefillBoxNumber.length === 0) {
1038
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
1039
- }
1040
- else {
1041
- // address.boxNumber = prefillBoxNumber;
1042
- address.searchBarString = prefillBoxNumber;
1043
- this.setAddress(address, ADDRESSLEVEL.BOX_NUMBER);
1044
- }
1045
- }
1046
- this.quitPrefillMode();
1047
- }
1048
- };
1049
- LibAddressAutocompleteByComponentComponent.ctorParameters = () => [
1050
- { type: Nis9Service },
1051
- { type: HttpService }
1052
- ];
1053
- __decorate([
1054
- ViewChild(LocalityComponent, { static: false })
1055
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteLocality", void 0);
1056
- __decorate([
1057
- ViewChild(StreetComponent, { static: false })
1058
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteStreet", void 0);
1059
- __decorate([
1060
- ViewChild(StreetNumberComponent, { static: false })
1061
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteStreetNb", void 0);
1062
- __decorate([
1063
- ViewChild(BoxNumberComponent, { static: false })
1064
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteBoxNb", void 0);
1065
- __decorate([
1066
- Input()
1067
- ], LibAddressAutocompleteByComponentComponent.prototype, "inputLang", null);
1068
- __decorate([
1069
- Input()
1070
- ], LibAddressAutocompleteByComponentComponent.prototype, "clearInput", null);
1071
- __decorate([
1072
- Input()
1073
- ], LibAddressAutocompleteByComponentComponent.prototype, "validationMessageOption", null);
1074
- __decorate([
1075
- Input()
1076
- ], LibAddressAutocompleteByComponentComponent.prototype, "defaultLang", void 0);
1077
- __decorate([
1078
- Input()
1079
- ], LibAddressAutocompleteByComponentComponent.prototype, "showDebugMessageToConsole", void 0);
1080
- __decorate([
1081
- Input()
1082
- ], LibAddressAutocompleteByComponentComponent.prototype, "minLevel", void 0);
1083
- __decorate([
1084
- Input()
1085
- ], LibAddressAutocompleteByComponentComponent.prototype, "notInListAllowed", void 0);
1086
- __decorate([
1087
- Input()
1088
- ], LibAddressAutocompleteByComponentComponent.prototype, "addressParams", void 0);
1089
- __decorate([
1090
- Input()
1091
- ], LibAddressAutocompleteByComponentComponent.prototype, "messageOption", void 0);
1092
- __decorate([
1093
- Input()
1094
- ], LibAddressAutocompleteByComponentComponent.prototype, "localityUrl", void 0);
1095
- __decorate([
1096
- Input()
1097
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionLocality", void 0);
1098
- __decorate([
1099
- Input()
1100
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionLocalityCount", void 0);
1101
- __decorate([
1102
- Input()
1103
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaLocality", void 0);
1104
- __decorate([
1105
- Input()
1106
- ], LibAddressAutocompleteByComponentComponent.prototype, "streetUrl", void 0);
1107
- __decorate([
1108
- Input()
1109
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionStreet", void 0);
1110
- __decorate([
1111
- Input()
1112
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionStreetCount", void 0);
1113
- __decorate([
1114
- Input()
1115
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaStreet", void 0);
1116
- __decorate([
1117
- Input()
1118
- ], LibAddressAutocompleteByComponentComponent.prototype, "streetNumberUrl", void 0);
1119
- __decorate([
1120
- Input()
1121
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionStreetNb", void 0);
1122
- __decorate([
1123
- Input()
1124
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionStreetNbCount", void 0);
1125
- __decorate([
1126
- Input()
1127
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaStreetNb", void 0);
1128
- __decorate([
1129
- Input()
1130
- ], LibAddressAutocompleteByComponentComponent.prototype, "boxNumberUrl", void 0);
1131
- __decorate([
1132
- Input()
1133
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionBoxNb", void 0);
1134
- __decorate([
1135
- Input()
1136
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionBoxNbCount", void 0);
1137
- __decorate([
1138
- Input()
1139
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaBoxNb", void 0);
1140
- __decorate([
1141
- Output()
1142
- ], LibAddressAutocompleteByComponentComponent.prototype, "addressCompleteEventEmitter", void 0);
1143
- __decorate([
1144
- Output()
1145
- ], LibAddressAutocompleteByComponentComponent.prototype, "validationMessageEventEmitter", void 0);
1146
- __decorate([
1147
- Output()
1148
- ], LibAddressAutocompleteByComponentComponent.prototype, "clearInputEventEmitter", void 0);
1149
- __decorate([
1150
- Input()
1151
- ], LibAddressAutocompleteByComponentComponent.prototype, "apiKey", void 0);
1152
- __decorate([
1153
- Input()
1154
- ], LibAddressAutocompleteByComponentComponent.prototype, "isReadonly", void 0);
1155
- __decorate([
1156
- Input()
1157
- ], LibAddressAutocompleteByComponentComponent.prototype, "nis9InResponse", void 0);
1158
- __decorate([
1159
- Input()
1160
- ], LibAddressAutocompleteByComponentComponent.prototype, "nis9ServiceURL", void 0);
1161
- LibAddressAutocompleteByComponentComponent = __decorate([
1162
- Component({
1163
- selector: 'bp-lib-address-autocomplete-by-component',
1164
- template: "\r\n<div class=\"aacwidget-address-container\">\r\n\r\n <div class=\"bpaac-dropdown-validation\" *ngIf=\"validationMessageOptionType === 'SHOW' \">\r\n <div class=\"bpaac-validated-icon\" *ngIf=\"selectedAddress && validationMessage!==null && validationMessage.messageType!==null\"></div>\r\n <!-- {{ validationMessage | translate }} -->\r\n {{ validationMessage.translatedMessage }}\r\n </div>\r\n\r\n <!-- bp-aacwidget-autocomplete-locality -->\r\n <bp-locality class=\"aacwidget-address-locality\" *ngIf=\"isComponentReady\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedLocalityUrl\"\r\n [prefillData]=\"localityPrefillData\"\r\n [labelResourceKey]=\"'common.label.postalCode'\"\r\n [inputText]=\"postalCodeLocality\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [sortCriteria]=\"sortCriteriaLocality\"\r\n [maxSuggesionCount]=\"maxSuggestionLocality\" \r\n [visibleSuggestionCount]=\"visibleSuggestionLocalityCount\"\r\n (addressChanged)=\"setAddress($event, 4)\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (focusEvent)=\"changeMinLevel($event)\" \r\n (textChangeEvent)=\"resetLocality($event)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onLocalityPrefillEvent($event)\"></bp-locality>\r\n\r\n <bp-street class=\"aacwidget-address-street\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedStreetUrl\"\r\n [prefillData]=\"streetPrefillData\"\r\n [labelResourceKey]=\"'common.label.streetName'\"\r\n [inputText]=\"streetNameInput\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [postalCode]=\"postalCode\"\r\n [locality]=\"locality\"\r\n [sortCriteria]=\"sortCriteriaStreet\" \r\n [maxSuggesionCount]=\"maxSuggestionStreet\"\r\n [visibleSuggesionCount]=\"visibleSuggestionStreetCount\"\r\n (addressChanged)=\"setAddress($event, 3)\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (focusEvent)=\"changeMinLevel($event)\"\r\n (textChangeEvent)=\"resetStreet($event)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onStreetPrefillEvent($event)\"></bp-street>\r\n\r\n <bp-street-number class=\"aacwidget-address-streetnumber\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedStreetNumberUrl\"\r\n [selectedAddress]=\"streetAddress\"\r\n [prefillData]=\"streetNumberPrefillData\"\r\n [labelResourceKey]=\"'common.label.streetNumber'\"\r\n [inputText]=\"streetNumberInput\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [postalCode]=\"postalCode\" \r\n [locality]=\"locality\" \r\n [streetName]=\"street\"\r\n [sortCriteria]=\"sortCriteriaStreetNb\"\r\n [maxSuggesionCount]=\"maxSuggestionStreetNb\" \r\n [visibleSuggesionCount]=\"visibleSuggestionStreetNbCount\"\r\n [notInListAllowed]=\"notInListAllowed\"\r\n (addressChanged)=\"setAddress($event, 2)\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (focusEvent)=\"changeMinLevel($event)\"\r\n (textChangeEvent)=\"resetStreetNumber($event, false)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onStreetNumberPrefillEvent($event)\"></bp-street-number>\r\n\r\n <bp-box-number class=\"aacwidget-address-boxnumber\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedBoxNumberUrl\"\r\n [selectedAddress]=\"streetNumberAddress\"\r\n [prefillData]=\"boxNumberPrefillData\"\r\n [labelResourceKey]=\"'common.label.boxNumber'\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [postalCode]=\"postalCode\" \r\n [locality]=\"locality\" \r\n [streetName]=\"street\" \r\n [streetNumber]=\"streetNumber\"\r\n [sortCriteria]=\"sortCriteriaBoxNb\" \r\n [maxSuggesionCount]=\"maxSuggestionBoxNb\"\r\n [visibleSuggesionCount]=\"visibleSuggestionBoxNbCount\"\r\n [notInListAllowed]=\"notInListAllowed\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (addressChanged)=\"setAddress($event, 1)\" \r\n (focusEvent)=\"changeMinLevel($event)\"\r\n (textChangeEvent)=\"resetBoxNumber($event, false)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onBoxNumberPrefillEvent($event)\"></bp-box-number>\r\n</div>",
1165
- styles: [""]
1166
- })
1167
- ], LibAddressAutocompleteByComponentComponent);
1168
- export { LibAddressAutocompleteByComponentComponent };
1169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLWFkZHJlc3MtYXV0b2NvbXBsZXRlLWJ5LWNvbXBvbmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYnBvc3QvYnAtYWRkcmVzcy1hdXRvLWNvbXBsZXRlLWJ5LWNvbXBvbmVudC8iLCJzb3VyY2VzIjpbImxpYi9saWItYWRkcmVzcy1hdXRvY29tcGxldGUtYnktY29tcG9uZW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBRy9ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXpGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU90RCxJQUFhLDBDQUEwQyxHQUF2RCxNQUFhLDBDQUEwQztJQXdIckQsWUFDVSxXQUF3QixFQUN4QixXQUF3QjtRQUR4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQW5IbEMscUJBQWdCLEdBQVcsSUFBSSxDQUFDO1FB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WSwwQ0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByZWZpbGxlZFBhcmFtZXRlcnMgfSBmcm9tICcuL3V0aWxzL3ByZWZpbGxlZC1wYXJhbWV0ZXJzJztcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlT3B0aW9uVHlwZSB9IGZyb20gJy4vZW51bS92YWxpZGF0aW9uLW1lc3NhZ2Utb3B0aW9uLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW0vdmFsaWRhdGlvbi1tZXNzYWdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBMb2NhbGl0eUNvbXBvbmVudCB9IGZyb20gJy4vbG9jYWxpdHkvbG9jYWxpdHkuY29tcG9uZW50JztcbmltcG9ydCB7IFN0cmVldENvbXBvbmVudCB9IGZyb20gJy4vc3RyZWV0L3N0cmVldC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RyZWV0TnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnLi9zdHJlZXQtbnVtYmVyL3N0cmVldC1udW1iZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJveE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vYm94LW51bWJlci9ib3gtbnVtYmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBRERSRVNTTEVWRUwgfSBmcm9tICcuL2VudW0nO1xuaW1wb3J0IHsgUHJlZmlsbERhdGEgfSBmcm9tICcuL3V0aWxzL3ByZWZpbGwtZGF0YSc7XG5pbXBvcnQgeyBQcmVmaWxsRXZlbnQgfSBmcm9tICcuL3V0aWxzL3ByZWZsbGwuZXZlbnQnO1xuaW1wb3J0IHsgSW5wdXROYW1lVHlwZSB9IGZyb20gJy4vZW51bS9pbnB1dC1uYW1lLmVudW0nO1xuaW1wb3J0IHsgSHR0cFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2h0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBOaXM5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbmlzOS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnAtbGliLWFkZHJlc3MtYXV0b2NvbXBsZXRlLWJ5LWNvbXBvbmVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saWItYWRkcmVzcy1hdXRvY29tcGxldGUtYnktY29tcG9uZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL2xpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJBZGRyZXNzQXV0b2NvbXBsZXRlQnlDb21wb25lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBAVmlld0NoaWxkKExvY2FsaXR5Q29tcG9uZW50LCB7c3RhdGljOiBmYWxzZX0gKSBhdXRvY29tcGxldGVMb2NhbGl0eTtcbiAgQFZpZXdDaGlsZChTdHJlZXRDb21wb25lbnQsIHtzdGF0aWM6IGZhbHNlfSApIGF1dG9jb21wbGV0ZVN0cmVldDtcbiAgQFZpZXdDaGlsZChTdHJlZXROdW1iZXJDb21wb25lbnQsIHtzdGF0aWM6IGZhbHNlfSApIGF1dG9jb21wbGV0ZVN0cmVldE5iO1xuICBAVmlld0NoaWxkKEJveE51bWJlckNvbXBvbmVudCwge3N0YXRpYzogZmFsc2V9ICkgYXV0b2NvbXBsZXRlQm94TmI7XG5cbiAgc2VsZWN0ZWRMYW5ndWFnZTogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIGJhc2VVcmwgPSBcImh0dHBzOi8vYXBpLm1haWxvcHMuYnBvc3QuY2xvdWQvcm9hLWluZm8vZXh0ZXJuYWxNYWlsaW5nQWRkcmVzc1Byb29maW5nUmVzdC9hdXRvY29tcGxldGUvXCI7XG4gIHByaXZhdGUgZGVmYXVsdEFwaUtleT0nY3lSa0tPRDczTzFET2RnY0RMTG5zYU9pRGg2T3lPa3QzQkJUNUpVMSc7XG4gIFxuICB1c2VkTG9jYWxpdHlVcmwgPSB0aGlzLmJhc2VVcmwgKyAnbG9jYWxpdHknO1xuICB1c2VkU3RyZWV0VXJsID0gdGhpcy5iYXNlVXJsICsgJ3N0cmVldCc7XG4gIHVzZWRTdHJlZXROdW1iZXJVcmwgPSB0aGlzLmJhc2VVcmwgKyAnc3RyZWV0TnVtYmVyJztcbiAgdXNlZEJveE51bWJlclVybCA9IHRoaXMuYmFzZVVybCArICdib3hOdW1iZXInO1xuXG4gIC8vIEB0cy1pZ25vcmVcbiAgQElucHV0KCkgc2V0IGlucHV0TGFuZyh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TGFuZ3VhZ2UodmFsKTtcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgQElucHV0KCkgc2V0IGNsZWFySW5wdXQoZm9jdXM6IHtzZXRGb2N1czogYm9vbGVhbiwgdGltZXN0YW1wOiBEYXRlfSkge1xuICAgIHRoaXMub25DbGVhcklucHV0KGZvY3VzKTtcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgQElucHV0KCkgc2V0IHZhbGlkYXRpb25NZXNzYWdlT3B0aW9uKG9wdGlvbjoge3ZhbGlkYXRpb25UeXBlOiBWYWxpZGF0aW9uTWVzc2FnZU9wdGlvblR5cGUsIHRpbWVzdGFtcDogRGF0ZX0pIHtcbiAgICB0aGlzLnNldFZhbGlkYXRpb25NZXNzYWdlT3B0aW9uRnJvbUlucHV0KG9wdGlvbik7XG4gIH1cblxuICBASW5wdXQoKVxuICBkZWZhdWx0TGFuZzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbWluTGV2ZWw6IG51bWJlcjtcbiAgQElucHV0KCkgbm90SW5MaXN0QWxsb3dlZCA9IHRydWU7XG4gIEBJbnB1dCgpIGFkZHJlc3NQYXJhbXM6IFByZWZpbGxlZFBhcmFtZXRlcnM7XG4gIEBJbnB1dCgpIG1lc3NhZ2VPcHRpb24gPSAnWSc7XG5cbiAgLy8gTE9DQUxJVFlcbiAgQElucHV0KCkgbG9jYWxpdHlVcmwgPSB0aGlzLmJhc2VVcmwgKyAnbG9jYWxpdHknO1xuICBASW5wdXQoKSBtYXhTdWdnZXN0aW9uTG9jYWxpdHkgPSA1O1xuICBASW5wdXQoKSB2aXNpYmxlU3VnZ2VzdGlvbkxvY2FsaXR5Q291bnQgPSA1O1xuICBASW5wdXQoKSBzb3J0Q3JpdGVyaWFMb2NhbGl0eTogc3RyaW5nO1xuICBwb3N0YWxDb2RlTG9jYWxpdHk6IHN0cmluZztcbiAgLy8gbG9jYWxpdHlQYXJhbXM6IFByZWZpbGxlZFBhcmFtZXRlcnM7XG4gIGxvY2FsaXR5UHJlZmlsbERhdGE6IFByZWZpbGxEYXRhID0gbnVsbDtcblxuICAvLyBTVFJFRVRcbiAgQElucHV0KCkgc3RyZWV0VXJsID0gdGhpcy5iYXNlVXJsICsgJ3N0cmVldCc7XG4gIEBJbnB1dCgpIG1heFN1Z2dlc3Rpb25TdHJlZXQgPSA1O1xuICBASW5wdXQoKSB2aXNpYmxlU3VnZ2VzdGlvblN0cmVldENvdW50ID0gNTtcbiAgQElucHV0KCkgc29ydENyaXRlcmlhU3RyZWV0OiBzdHJpbmc7XG4gIC8vIHN0cmVldFBhcmFtczogUHJlZmlsbGVkUGFyYW1ldGVycztcbiAgc3RyZWV0UHJlZmlsbERhdGE6IFByZWZpbGxEYXRhID0gbnVsbDtcblxuICAvLyBTVFJFRVQgTlVNQkVSXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgQElucHV0KCkgc3RyZWV0TnVtYmVyVXJsID0gdGhpcy5iYXNlVXJsICsgJ3N0cmVldE51bWJlcic7XG4gIEBJbnB1dCgpIG1heFN1Z2dlc3Rpb25TdHJlZXROYiA9IDU7XG4gIEBJbnB1dCgpIHZpc2libGVTdWdnZXN0aW9uU3RyZWV0TmJDb3VudCA9IDU7XG4gIEBJbnB1dCgpIHNvcnRDcml0ZXJpYVN0cmVldE5iOiBzdHJpbmc7XG4gIC8vIHN0cmVldE51bWJlclBhcmFtczogUHJlZmlsbGVkUGFyYW1ldGVycztcbiAgc3RyZWV0TnVtYmVyUHJlZmlsbERhdGE6IFByZWZpbGxEYXRhID0gbnVsbDtcblxuICAvLyBCT1ggTlVNQkVSXG4gIEBJbnB1dCgpIGJveE51bWJlclVybCA9IHRoaXMuYmFzZVVybCArICdib3hOdW1iZXInO1xuICBASW5wdXQoKSBtYXhTdWdnZXN0aW9uQm94TmIgPSA1O1xuICBASW5wdXQoKSB2aXNpYmxlU3VnZ2VzdGlvbkJveE5iQ291bnQgPSA1O1xuICBASW5wdXQoKSBzb3J0Q3JpdGVyaWFCb3hOYjogc3RyaW5nO1xuICAvLyBib3hQYXJhbXM6IFByZWZpbGxlZFBhcmFtZXRlcnM7XG4gIGJveE51bWJlclByZWZpbGxEYXRhOiBQcmVmaWxsRGF0YSA9IG51bGw7XG5cblxuICBib3hOdW1iZXI6IHN0cmluZztcbiAgY29tcGxldGVBZGRyZXNzOiBzdHJpbmc7XG4gIGVtaXR0ZWRBZGRyZXNzOiBhbnkgPSBudWxsO1xuICBsb2NhbGl0eTogc3RyaW5nO1xuICBwb3N0YWxDb2RlOiBzdHJpbmc7XG4gIHNlbGVjdGVkQWRkcmVzczogYW55O1xuICBzdHJlZXQ6IHN0cmluZztcbiAgc3RyZWV0QWRkcmVzczogYW55O1xuICBzdHJlZXROYW1lSW5wdXQ6IHN0cmluZztcbiAgc3RyZWV0TnVtYmVyOiBzdHJpbmc7XG4gIHN0cmVldE51bWJlckFkZHJlc3M6IGFueTtcbiAgc3RyZWV0TnVtYmVySW5wdXQ6IHN0cmluZztcbiAgdmFsaWRhdGlvbk1lc3NhZ2U6IHttZXNzYWdlVHlwZTogVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLCB0cmFuc2xhdGVkTWVzc2FnZTogc3RyaW5nfSA9IHttZXNzYWdlVHlwZTogbnVsbCwgdHJhbnNsYXRlZE1lc3NhZ2U6ICcnfTtcbiAgdmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25UeXBlOiBWYWxpZGF0aW9uTWVzc2FnZU9wdGlvblR5cGU7XG5cblxuICBAT3V0cHV0KCkgYWRkcmVzc0NvbXBsZXRlRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25NZXNzYWdlRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGNsZWFySW5wdXRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cbiAgcHJlZmlsbERhdGE6IFByZWZpbGxEYXRhO1xuICBwcm9jZXNzaW5nUHJlZmlsbERhdGEgPSBmYWxzZTtcblxuXG4gIC8vIFBhc3MgdGhlIEFQSSBrZXkgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgbGlicmFyeSAhXG4gIEBJbnB1dCgpXG4gIGFwaUtleT10aGlzLmRlZmF1bHRBcGlLZXk7XG5cblxuICAvLyBzZXQgdGhlIHdpZGdldCBhcyByZWFkb25seSBhbmQgYWRkIE5JUzkgcXVlcnkgcGFyYW1ldGVyXG4gIEBJbnB1dCgpXG4gIGlzUmVhZG9ubHk9ZmFsc2U7XG5cbiAgQElucHV0KClcbiAgbmlzOUluUmVzcG9uc2U9ZmFsc2U7XG5cbiAgLy8gaHR0cHM6Ly9iZ3MuYnBvc3QuYmUvc2V0LXNlbGVjdGlvbi1jaXJjbGU/bG5nPTQuMzYwNTM3NTcyNTQxOTQ4JmxhdD01MC44NDA2MzU4MjgwNjAzNyZyYWRpdXM9MC4wMDFcbiAgQElucHV0KClcbiAgbmlzOVNlcnZpY2VVUkw9Jyc7XG5cbiAgaXNDb21wb25lbnRSZWFkeSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmlzOVNlcnZpY2U6IE5pczlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHR0cFNlcnZpY2U6IEh0dHBTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZFxuICB7XG4gICAgLy9jb25zb2xlLndhcm4oJ2xpYiAtIG5nT25Jbml0Jyk7XG5cbiAgICB0aGlzLm5pczlTZXJ2aWNlLnNldE5pczlTZXJ2aWNlVVJMKHRoaXMubmlzOVNlcnZpY2VVUkwpO1xuXG4gICAgY29uc3QgYXBpS2V5ID0gdGhpcy5pc1ZhbGlkRGF0YSh0aGlzLmFwaUtleSkgPyB0aGlzLmFwaUtleSA6IHRoaXMuZGVmYXVsdEFwaUtleTtcbiAgICB0aGlzLmh0dHBTZXJ2aWNlLnNldEFwaUtleSggYXBpS2V5ICk7XG4gICAgXG4gICAgaWYoIHRoaXMuaXNWYWxpZERhdGEodGhpcy5sb2NhbGl0eVVybCkgKSB0aGlzLnVzZWRMb2NhbGl0eVVybD10aGlzLmxvY2FsaXR5VXJsO1xuICAgIGlmKCB0aGlzLmlzVmFsaWREYXRhKHRoaXMuc3RyZWV0VXJsKSApIHRoaXMudXNlZFN0cmVldFVybD10aGlzLnN0cmVldFVybDtcbiAgICBpZiggdGhpcy5pc1ZhbGlkRGF0YSh0aGlzLnN0cmVldE51bWJlclVybCkgKSB0aGlzLnVzZWRTdHJlZXROdW1iZXJVcmw9dGhpcy5zdHJlZXROdW1iZXJVcmw7XG4gICAgaWYoIHRoaXMuaXNWYWxpZERhdGEodGhpcy5ib3hOdW1iZXJVcmwpICkgdGhpcy51c2VkQm94TnVtYmVyVXJsPXRoaXMuYm94TnVtYmVyVXJsO1xuXG4gICAgaWYgKHRoaXMuYWRkcmVzc1BhcmFtcylcbiAgICB7XG4gICAgICB0aGlzLnByZWZpbGxEYXRhID0gdGhpcy5hZGRyZXNzUGFyYW1zIGFzIGFueSBhcyBQcmVmaWxsRGF0YTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5pc0NvbXBvbmVudFJlYWR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGlzVmFsaWREYXRhKCBzdHI6IHN0cmluZyk6IGJvb2xlYW5cbiAge1xuICAgIHJldHVybiBzdHIhPT11bmRlZmluZWQgJiYgc3RyIT09bnVsbCAmJiBzdHIubGVuZ3RoPjA7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpXG4gIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pXG4gICAge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKVxuICB7XG4gICAgaWYgKGNoYW5nZXMpXG4gICAge1xuICAgICAgLy8gY29kZSBmb3IgdHJhY2luZ1xuICAgICAgLy8gdmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXROYkNvdW50XG4gICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheVBhcmFtZXRlcnNDaGFuZ2VzVG9Db25zb2xlKGNoYW5nZXMpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2FwaUtleScpICYmICFjaGFuZ2VzLmFwaUtleS5maXJzdENoYW5nZSkge1xuICAgICAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmFwaUtleSE9PW51bGwgJiYgdGhpcy5hcGlLZXkhPT11bmRlZmluZWQgJiYgdGhpcy5hcGlLZXkubGVuZ3RoPjAgXG4gICAgICAgICAgICA/IHRoaXMuYXBpS2V5XG4gICAgICAgICAgICA6IHRoaXMuZGVmYXVsdEFwaUtleTtcbiAgICAgICAgdGhpcy5odHRwU2VydmljZS5zZXRBcGlLZXkoIGFwaUtleSApO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbG9jYWxpdHlVcmwnKSAmJiAhY2hhbmdlcy5sb2NhbGl0eVVybC5maXJzdENoYW5nZSkge1xuICAgICAgICBjb25zdCBsb2NhbGl0eVVybCA9IHRoaXMubG9jYWxpdHlVcmwhPT1udWxsICYmIHRoaXMubG9jYWxpdHlVcmwhPT11bmRlZmluZWQgJiYgdGhpcy5sb2NhbGl0eVVybC5sZW5ndGg+MCBcbiAgICAgICAgICAgID8gdGhpcy5sb2NhbGl0eVVybFxuICAgICAgICAgICAgOiB0aGlzLmJhc2VVcmwgKyAnbG9jYWxpdHknO1xuICAgICAgICB0aGlzLnVzZWRMb2NhbGl0eVVybD1sb2NhbGl0eVVybDtcbiAgICAgICAgY29uc29sZS5sb2coJ25nT25DaGFuZ2VzIC0gbG9jYWxpdHlVcmw6ICcsIGxvY2FsaXR5VXJsKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdzdHJlZXRVcmwnKSAmJiAhY2hhbmdlcy5zdHJlZXRVcmwuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgY29uc3Qgc3RyZWV0VXJsID0gdGhpcy5zdHJlZXRVcmwhPT1udWxsICYmIHRoaXMuc3RyZWV0VXJsIT09dW5kZWZpbmVkICYmIHRoaXMuc3RyZWV0VXJsLmxlbmd0aD4wIFxuICAgICAgICAgICAgPyB0aGlzLnN0cmVldFVybFxuICAgICAgICAgICAgOiB0aGlzLmJhc2VVcmwgKyAnc3RyZWV0JztcbiAgICAgICAgdGhpcy5zdHJlZXRVcmw9c3RyZWV0VXJsO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3N0cmVldE51bWJlclVybCcpICYmICFjaGFuZ2VzLnN0cmVldE51bWJlclVybC5maXJzdENoYW5nZSkge1xuICAgICAgICBjb25zdCBzdHJlZXROdW1iZXJVcmwgPSB0aGlzLnN0cmVldE51bWJlclVybCE9PW51bGwgJiYgdGhpcy5zdHJlZXROdW1iZXJVcmwhPT11bmRlZmluZWQgJiYgdGhpcy5zdHJlZXROdW1iZXJVcmwubGVuZ3RoPjAgXG4gICAgICAgICAgICA/IHRoaXMuc3RyZWV0TnVtYmVyVXJsXG4gICAgICAgICAgICA6IHRoaXMuYmFzZVVybCArICdzdHJlZXROdW1iZXInO1xuICAgICAgICB0aGlzLnN0cmVldE51bWJlclVybD1zdHJlZXROdW1iZXJVcmw7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnYm94TnVtYmVyVXJsJykgJiYgIWNoYW5nZXMuYm94TnVtYmVyVXJsLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGJveE51bWJlclVybCA9IHRoaXMuYm94TnVtYmVyVXJsIT09bnVsbCAmJiB0aGlzLmJveE51bWJlclVybCE9PXVuZGVmaW5lZCAmJiB0aGlzLmJveE51bWJlclVybC5sZW5ndGg+MCBcbiAgICAgICAgICAgID8gdGhpcy5ib3hOdW1iZXJVcmxcbiAgICAgICAgICAgIDogdGhpcy5iYXNlVXJsICsgJ2JveE51bWJlcic7XG4gICAgICAgIHRoaXMuYm94TnVtYmVyVXJsPWJveE51bWJlclVybDtcbiAgICAgIH1cbiAgICAgICovXG5cbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdhZGRyZXNzUGFyYW1zJykgJiYgIWNoYW5nZXMuYWRkcmVzc1BhcmFtcy5maXJzdENoYW5nZSkge1xuICAgICAgLy8gaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2FkZHJlc3NQYXJhbXMnKSkge1xuICAgICAgICB0aGlzLnByb2Nlc3NpbmdQcmVmaWxsRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMuZW50ZXJQcmVmaWxsTW9kZSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcyA9IG51bGw7XG4gICAgICAgIHRoaXMubm90aWZ5QWRkcmVzc0NvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgLypcbiAgICAgICAgaWYgKHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSAhPT0gbnVsbCAmJiB0aGlzLmxvY2FsaXR5UHJlZmlsbERhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoaXMub25DbGVhcklucHV0RXZlbnRFbWl0dGVyKElucHV0TmFtZVR5cGUuTE9DQUxJVFkpO1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgfVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmJveE51bWJlclByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdHJlZXROdW1iZXJQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RyZWV0UHJlZmlsbERhdGEgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHtjb25zb2xlLmxvZygnbGliOjp3aWRnZXQgZGV0ZWN0ZWQgcHJlZmlsbGluZycsIHRoaXMuYWRkcmVzc1BhcmFtcyk7IH1cbiAgICAgICAgdGhpcy5hZGRyZXNzUGFyYW1zLm1pbkxldmVsID0gLyo0Ki8gQUREUkVTU0xFVkVMLkxPQ0FMSVRZO1xuICAgICAgICAvLyB0aGlzLmxvY2FsaXR5UHJlZmlsbERhdGEgPSB0aGlzLmFkZHJlc3NQYXJhbXM7IC8vIGFzIGFueSBhcyBQcmVmaWxsRGF0YTtcbiAgICAgICAgdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhID0gbmV3IFByZWZpbGxEYXRhKHRoaXMuYWRkcmVzc1BhcmFtcyk7XG4gICAgICAgIC8vIE9iamVjdC5hc3NpZ24odGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhLCB0aGlzLmFkZHJlc3NQYXJhbXMpO1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6Y2hlY2tpbmcgbG9jYWxpdHkgbWF0Y2guLi4gJywgdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhKTsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRpc3BsYXlQYXJhbWV0ZXJzQ2hhbmdlc1RvQ29uc29sZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKVxuICB7XG4gICAgLy8gbWVzc2FnZU9wdGlvblxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdtZXNzYWdlT3B0aW9uJykgJiYgIWNoYW5nZXMubWVzc2FnZU9wdGlvbi5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5tZXNzYWdlT3B0aW9uLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIG1lc3NhZ2VPcHRpb24nLCB3Y0NoYW5nZXMpO1xuICAgIH1cblxuICAgIC8vIG1heFN1Z2dlc3Rpb25Mb2NhbGl0eVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdtYXhTdWdnZXN0aW9uTG9jYWxpdHknKSAmJiAhY2hhbmdlcy5tYXhTdWdnZXN0aW9uTG9jYWxpdHkuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IHdjQ2hhbmdlcyA9IGNoYW5nZXMubWF4U3VnZ2VzdGlvbkxvY2FsaXR5LmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIG1heFN1Z2dlc3Rpb25Mb2NhbGl0eScsIHdjQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gdmlzaWJsZVN1Z2dlc3Rpb25Mb2NhbGl0eUNvdW50XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3Zpc2libGVTdWdnZXN0aW9uTG9jYWxpdHlDb3VudCcpICYmICFjaGFuZ2VzLnZpc2libGVTdWdnZXN0aW9uTG9jYWxpdHlDb3VudC5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy52aXNpYmxlU3VnZ2VzdGlvbkxvY2FsaXR5Q291bnQuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gdmlzaWJsZVN1Z2dlc3Rpb25Mb2NhbGl0eUNvdW50Jywgd2NDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBzb3J0Q3JpdGVyaWFMb2NhbGl0eVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdzb3J0Q3JpdGVyaWFMb2NhbGl0eScpICYmICFjaGFuZ2VzLnNvcnRDcml0ZXJpYUxvY2FsaXR5LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLnNvcnRDcml0ZXJpYUxvY2FsaXR5LmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIHNvcnRDcml0ZXJpYUxvY2FsaXR5Jywgd2NDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBtYXhTdWdnZXN0aW9uU3RyZWV0XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21heFN1Z2dlc3Rpb25TdHJlZXQnKSAmJiAhY2hhbmdlcy5tYXhTdWdnZXN0aW9uU3RyZWV0LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLm1heFN1Z2dlc3Rpb25TdHJlZXQuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gbWF4U3VnZ2VzdGlvblN0cmVldCcsIHdjQ2hhbmdlcyk7XG4gICAgfVxuICAgIC8vIHZpc2libGVTdWdnZXN0aW9uU3RyZWV0Q291bnRcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXRDb3VudCcpICYmICFjaGFuZ2VzLnZpc2libGVTdWdnZXN0aW9uU3RyZWV0Q291bnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IHdjQ2hhbmdlcyA9IGNoYW5nZXMudmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXRDb3VudC5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSB2aXNpYmxlU3VnZ2VzdGlvblN0cmVldENvdW50Jywgd2NDaGFuZ2VzKTtcbiAgICB9XG4gICAgLy8gc29ydENyaXRlcmlhU3RyZWV0XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3NvcnRDcml0ZXJpYVN0cmVldCcpICYmICFjaGFuZ2VzLnNvcnRDcml0ZXJpYVN0cmVldC5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5zb3J0Q3JpdGVyaWFTdHJlZXQuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gc29ydENyaXRlcmlhU3RyZWV0Jywgd2NDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBtYXhTdWdnZXN0aW9uU3RyZWV0TmJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWF4U3VnZ2VzdGlvblN0cmVldE5iJykgJiYgIWNoYW5nZXMubWF4U3VnZ2VzdGlvblN0cmVldE5iLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLm1heFN1Z2dlc3Rpb25TdHJlZXROYi5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSBtYXhTdWdnZXN0aW9uU3RyZWV0TmInLCB3Y0NoYW5nZXMpO1xuICAgIH1cbiAgICAvLyB2aXNpYmxlU3VnZ2VzdGlvblN0cmVldE5iQ291bnRcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXROYkNvdW50JykgJiYgIWNoYW5nZXMudmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXROYkNvdW50LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLnZpc2libGVTdWdnZXN0aW9uU3RyZWV0TmJDb3VudC5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSB2aXNpYmxlU3VnZ2VzdGlvblN0cmVldE5iQ291bnQnLCB3Y0NoYW5nZXMpO1xuICAgIH1cbiAgICAvLyBzb3J0Q3JpdGVyaWFTdHJlZXROYlxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdzb3J0Q3JpdGVyaWFTdHJlZXROYicpICYmICFjaGFuZ2VzLnNvcnRDcml0ZXJpYVN0cmVldE5iLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLnNvcnRDcml0ZXJpYVN0cmVldE5iLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIHNvcnRDcml0ZXJpYVN0cmVldE5iJywgd2NDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBtYXhTdWdnZXN0aW9uQm94TmJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWF4U3VnZ2VzdGlvbkJveE5iJykgJiYgIWNoYW5nZXMubWF4U3VnZ2VzdGlvbkJveE5iLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLm1heFN1Z2dlc3Rpb25Cb3hOYi5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSBtYXhTdWdnZXN0aW9uQm94TmInLCB3Y0NoYW5nZXMpO1xuICAgIH1cbiAgICAvLyB2aXNpYmxlU3VnZ2VzdGlvbkJveE5iQ291bnRcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZVN1Z2dlc3Rpb25Cb3hOYkNvdW50JykgJiYgIWNoYW5nZXMudmlzaWJsZVN1Z2dlc3Rpb25Cb3hOYkNvdW50LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLnZpc2libGVTdWdnZXN0aW9uQm94TmJDb3VudC5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSB2aXNpYmxlU3VnZ2VzdGlvbkJveE5iQ291bnQnLCB3Y0NoYW5nZXMpO1xuICAgIH1cbiAgICAvLyBzb3J0Q3JpdGVyaWFCb3hOYlxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdzb3J0Q3JpdGVyaWFCb3hOYicpICYmICFjaGFuZ2VzLnNvcnRDcml0ZXJpYUJveE5iLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLnNvcnRDcml0ZXJpYUJveE5iLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIHNvcnRDcml0ZXJpYUJveE5iJywgd2NDaGFuZ2VzKTtcbiAgICB9XG4gIH1cblxuICBjbGVhcldpZGdldCgpIHtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFyV2lkZ2V0KCk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5jbGVhcldpZGdldCgpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmNsZWFyV2lkZ2V0KCk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5jbGVhcldpZGdldCgpO1xuICB9XG5cbiAgY2hhbmdlTWluTGV2ZWwobWluTGV2ZWw6IG51bWJlcikge1xuICAgIHRoaXMubWluTGV2ZWwgPSBtaW5MZXZlbDtcbiAgfVxuXG4gIC8vIENhbGxlZCBieSB0aGUgc3BlY2lmaWMgYnV0dG9ucyBpbiB0aGUgYXBwXG4gIG9uQ2xlYXJJbnB1dChmb2N1czoge3NldEZvY3VzOiBib29sZWFuLCB0aW1lc3RhbXA6IERhdGV9KSB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnbGliOjpvbkNsZWFySW5wdXQnLCBmb2N1cyk7IH1cblxuICAgIC8qXG4gICAgaWYgKGZvY3VzID09PSBudWxsIHx8IGZvY3VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9Ki9cblxuICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG5cbiAgICBjb25zdCBzZXRGb2N1cyA9IChmb2N1cyA9PT0gbnVsbCB8fCBmb2N1cyA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogZm9jdXMuc2V0Rm9jdXM7XG5cbiAgICBzd2l0Y2ggKHRoaXMubWluTGV2ZWwpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMuYm94TnVtYmVyID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KHNldEZvY3VzLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5jbGVhcklucHV0RXZlbnRFbWl0dGVyLmVtaXQoJ0JPWF9OVU1CRVInKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRoaXMuYm94TnVtYmVyID0gJyc7XG4gICAgICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KHNldEZvY3VzLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5jbGVhcklucHV0RXZlbnRFbWl0dGVyLmVtaXQoJ1NUUkVFVF9OVU1CRVInKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHRoaXMuYm94TnVtYmVyID0gJyc7XG4gICAgICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgICB0aGlzLnN0cmVldCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KHNldEZvY3VzLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcldpZGdldCgpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KHNldEZvY3VzLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuY2xlYXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dEV2ZW50RW1pdHRlci5lbWl0KCdTVFJFRVQnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBCb3ggbnVtYmVyXG4gICAgICAgICAgdGhpcy5ib3hOdW1iZXIgPSAnJztcbiAgICAgICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVCb3hOYilcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFySW5wdXQoc2V0Rm9jdXMsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU3RyZWV0IG51bWJlclxuICAgICAgICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIpXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KHNldEZvY3VzLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFN0cmVldCBuYW1lXG4gICAgICAgICAgdGhpcy5zdHJlZXQgPSAnJztcbiAgICAgICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVTdHJlZXQpXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuY2xlYXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBMb2NhbGl0eVxuICAgICAgICAgIHRoaXMubG9jYWxpdHkgPSAnJztcbiAgICAgICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eSlcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkuY2xlYXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dEV2ZW50RW1pdHRlci5lbWl0KCdMT0NBTElUWScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGdldEJveFByZWZpeCgpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSkge1xuICAgICAgY2FzZSAnZnInOlxuICAgICAgICBwcmVmaXggPSAnQlRFJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdubCc6XG4gICAgICAgICAgcHJlZml4ID0gJ0JVUyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwcmVmaXggPSAnQk9YJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXg7XG4gIH1cblxuICBub3RpZnlBZGRyZXNzQ29tcGxldGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ25vdGlmeSBmb3IgYWRkcmVzcyBjb21wbGV0ZScpO1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpXG4gICAge1xuICAgICAgY29uc29sZS5sb2coJ25vdGlmeUFkZHJlc3NDb21wbGV0ZScsIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLCAnbmlzOUluUmVzcG9uc2U6Jyt0aGlzLm5pczlJblJlc3BvbnNlLCB0eXBlb2YgdGhpcy5uaXM5SW5SZXNwb25zZSk7XG4gICAgfVxuXG4gICAgaWYoICh0aGlzLm5pczlJblJlc3BvbnNlID09PSB0cnVlIHx8ICcnK3RoaXMubmlzOUluUmVzcG9uc2UgPT09ICd0cnVlJykgXG4gICAgXG4gICAgICAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcyAhPT11bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RlZEFkZHJlc3MhPT1udWxsXG4gICAgICAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnbGF0aXR1ZGUnKSAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnbG9uZ2l0dWRlJykpXG4gICAge1xuICAgICAgY29uc3QgbGF0aXR1ZGUgPSB0aGlzLnNlbGVjdGVkQWRkcmVzcy5sYXRpdHVkZTtcbiAgICAgIGNvbnN0IGxvbmdpdHVkZSA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmxvbmdpdHVkZTtcbiAgICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIGNvbnNvbGUubG9nKCdjYWxsaW5nIG5pczkgc2VydmljZSB0byBnZXQgbmlzOSBkYXRhICgxKTonLCBsb25naXR1ZGUsIGxhdGl0dWRlKTtcblxuICAgICAgdGhpcy5uaXM5U2VydmljZS5kZXRlcm1pbmVOaXM5RGF0YShsb25naXR1ZGUsIGxhdGl0dWRlKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ25pcyBEQVRBOicsIGRhdGEpO1xuICAgICAgICAgIC8qXG4gICAgICAgICAgbmlzIERBVEE6IFxuICAgICAgICAgIHtTdGF0dXM6ICdzdWNjZXNzJywgZGF0YTogQXJyYXkoMSl9XG4gICAgICAgICAgU3RhdHVzOiBcInN1Y2Nlc3NcIlxuICAgICAgICAgIGRhdGE6IFsnMjUxMTJBMjEtJ11cbiAgICAgICAgICAqL1xuICAgICAgICAgIGlmKGRhdGEhPT11bmRlZmluZWQgJiYgZGF0YSAhPT1udWxsICYmIGRhdGEuaGFzT3duUHJvcGVydHkoJ1N0YXR1cycpICYmIGRhdGEuU3RhdHVzPT09J3N1Y2Nlc3MnKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG5pczlEYXRhID0gZGF0YS5kYXRhO1xuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShuaXM5RGF0YSkgJiYgbmlzOURhdGEubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcy5uaXM5ID0gbmlzOURhdGFbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5hZGRyZXNzQ29tcGxldGVFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLnNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgdGhpcy5lbWl0dGVkQWRkcmVzcyA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzO1xuICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHRoaXMuZW1pdHRlZEFkZHJlc3MpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgY29uc29sZS5sb2coJ05PVCBjYWxsaW5nIG5pczkgc2VydmljZSB0byBnZXQgbmlzOSBkYXRhICgxKScpO1xuICAgICAgdGhpcy5hZGRyZXNzQ29tcGxldGVFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLnNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICB0aGlzLmVtaXR0ZWRBZGRyZXNzID0gdGhpcy5zZWxlY3RlZEFkZHJlc3M7XG4gICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eSh0aGlzLmVtaXR0ZWRBZGRyZXNzKTtcbiAgICB9XG5cbiAgfVxuXG4gIG9uQ2xlYXJJbnB1dEV2ZW50RW1pdHRlcihldmVudCkge1xuXG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnbGliOjpvbkNsZWFySW5wdXRFdmVudEVtaXR0ZXInLCBldmVudCk7IH1cblxuICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG5cbiAgICBsZXQgbmV4dEFkZHJlc3MgPSB0aGlzLnNlbGVjdGVkQWRkcmVzczsgLy8gdGhpcy5lbWl0dGVkQWRkcmVzcztcblxuICAgIGlmIChldmVudCA9PT0gSW5wdXROYW1lVHlwZS5MT0NBTElUWSlcbiAgICB7XG4gICAgICAvLyBCb3ggbnVtYmVyXG4gICAgICB0aGlzLmJveE51bWJlciA9ICcnO1xuICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlQm94TmIpXG4gICAgICB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0cmVldCBudW1iZXJcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVTdHJlZXROYilcbiAgICAgIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gU3RyZWV0IG5hbWVcbiAgICAgIHRoaXMuc3RyZWV0ID0gJyc7XG4gICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVTdHJlZXQpXG4gICAgICB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gTG9jYWxpdHlcbiAgICAgIHRoaXMubG9jYWxpdHkgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5KVxuICAgICAge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIG5leHRBZGRyZXNzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQgPT09IElucHV0TmFtZVR5cGUuU1RSRUVUKVxuICAgIHtcbiAgICAgIC8vIEJveCBudW1iZXJcbiAgICAgIHRoaXMuYm94TnVtYmVyID0gJyc7XG4gICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVCb3hOYilcbiAgICAgIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gU3RyZWV0IG51bWJlclxuICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iKVxuICAgICAge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBTdHJlZXQgbmFtZVxuICAgICAgdGhpcy5zdHJlZXQgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZVN0cmVldClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIG5leHRBZGRyZXNzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQgPT09IElucHV0TmFtZVR5cGUuU1RSRUVUX05VTUJFUilcbiAgICB7XG4gICAgICAvLyBCb3ggbnVtYmVyXG4gICAgICB0aGlzLmJveE51bWJlciA9ICcnO1xuICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlQm94TmIpXG4gICAgICB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0cmVldCBudW1iZXJcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVTdHJlZXROYilcbiAgICAgIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgIC8vIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBuZXh0QWRkcmVzcyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50ID09PSBJbnB1dE5hbWVUeXBlLkJPWF9OVU1CRVIpXG4gICAge1xuICAgICAgLy8gQm94IG51bWJlclxuICAgICAgdGhpcy5ib3hOdW1iZXIgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUJveE5iKVxuICAgICAge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgLy8gdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVudGlvbjogaWYgbm90LWluLWxpc3QgZG9uJ3QgcmVzZXQgdGhlIGFkZHJlc3MsIGp1c3QgbW9kaWZ5IGl0XG4gICAgICBjb25zdCBhZGRyZXNzSXNOb3RJbkxpc3RcbiAgICAgICAgPSBuZXh0QWRkcmVzcyAhPT0gdW5kZWZpbmVkICYmICBuZXh0QWRkcmVzcyAhPT0gbnVsbFxuICAgICAgICAgICYmIG5leHRBZGRyZXNzLmhhc093blByb3BlcnR5KCdub3QtaW4tbGlzdCcpICYmIG5leHRBZGRyZXNzWydub3QtaW4tbGlzdCddID09PSB0cnVlXG4gICAgICAgID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIC8qXG4gICAgICBpZiAoYWRkcmVzc0lzTm90SW5MaXN0KVxuICAgICAge1xuICAgICAgICBkZWxldGUgbmV4dEFkZHJlc3MuYm94TnVtYmVyO1xuICAgICAgICBuZXh0QWRkcmVzcy5pc0NvbXBsZXRlTm90aWZpY2F0aW9uRG9uZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdHJlZXROdW1iZXJBZGRyZXNzICE9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgIGNvbnNvbGUud2FybigncmVzZXQgYm94IG9uIG5vdC1pbi1saXN0JywgdGhpcy5zdHJlZXROdW1iZXJBZGRyZXNzKTtcblxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlXG4gICAgICB7XG4gICAgICAgIG5leHRBZGRyZXNzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgICovXG5cbiAgICAgIG5leHRBZGRyZXNzID0gdGhpcy5zdHJlZXROdW1iZXJBZGRyZXNzICE9PSBudWxsID8gdGhpcy5zdHJlZXROdW1iZXJBZGRyZXNzIDogbnVsbDtcbiAgICAgIC8qXG4gICAgICBjb25zdCBhZGRyZXNzSXNOb3RJbkxpc3RcbiAgICAgICAgPSBuZXh0QWRkcmVzcyAhPT0gbnVsbCAmJiBuZXh0QWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnbm90LWluLWxpc3QnKSAmJiBuZXh0QWRkcmVzc1snbm90LWluLWxpc3QnXSA9PT0gdHJ1ZVxuICAgICAgICA/IHRydWUgOiBmYWxzZTtcbiAgICAgICovXG4gICAgICBjb25zdCBhZGRyZXNzSXNDb21wbGV0ZVxuICAgICAgICA9IG5leHRBZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgbmV4dEFkZHJlc3MgIT09IG51bGxcbiAgICAgICAgICAmJiBuZXh0QWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnaXNDb21wbGV0ZScpICYmIG5leHRBZGRyZXNzLmlzQ29tcGxldGUgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLmFkZHJlc3NJc0NvbXBsZXRlID0gYWRkcmVzc0lzQ29tcGxldGU7XG4gICAgfVxuXG4gICAgdGhpcy5jbGVhcklucHV0RXZlbnRFbWl0dGVyLmVtaXQoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuZW1pdHRlZEFkZHJlc3MgIT09IG51bGwgKSB7XG4gICAgICBpZihuZXh0QWRkcmVzcyAhPT0gdW5kZWZpbmVkICYmIG5leHRBZGRyZXNzICE9PSBudWxsICYmIG5leHRBZGRyZXNzLmhhc093blByb3BlcnR5KCdsYXRpdHVkZScpICYmIG5leHRBZGRyZXNzLmhhc093blByb3BlcnR5KCdsb25naXR1ZGUnKSlcbiAgICAgIHtcbiAgICAgICAgY29uc3QgbGF0aXR1ZGUgPSBuZXh0QWRkcmVzcy5sYXRpdHVkZTtcbiAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gbmV4dEFkZHJlc3MubG9uZ2l0dWRlO1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSBjb25zb2xlLmxvZygnY2FsbGluZyBuaXM5IHNlcnZpY2UgdG8gZ2V0IG5pczkgZGF0YSAoMiknLCBsb25naXR1ZGUsIGxhdGl0dWRlKTtcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgY29uc29sZS5sb2coJ05PVCBjYWxsaW5nIG5pczkgc2VydmljZSB0byBnZXQgbmlzOSBkYXRhICgyKScpO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRyZXNzQ29tcGxldGVFdmVudEVtaXR0ZXIuZW1pdChuZXh0QWRkcmVzcyk7XG4gICAgICB0aGlzLmVtaXR0ZWRBZGRyZXNzID0gbmV4dEFkZHJlc3M7XG4gICAgfVxuXG5cbiAgICAvLyBna2FcbiAgICAvKlxuICAgIGlmIChldmVudCA9PT0gSW5wdXROYW1lVHlwZS5MT0NBTElUWSlcbiAgICB7XG4gICAgICB0aGlzLm1pbkxldmVsID0gQUREUkVTU0xFVkVMLkxPQ0FMSVRZO1xuICAgICAgdGhpcy5ib3hOdW1iZXJQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnN0cmVldE51bWJlclByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuc3RyZWV0UHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgIC8vIHRoaXMuY2xlYXJJbnB1dChmb2N1czoge3NldEZvY3VzOiBib29sZWFuLCB0aW1lc3RhbXA6IERhdGV9KTtcbiAgICAgIHRoaXMubG9jYWxpdHkgPSAnJztcbiAgICAgIHRoaXMucG9zdGFsQ29kZSA9ICcnO1xuICAgICAgdGhpcy5zdHJlZXQgPSBudWxsO1xuICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSBudWxsO1xuICAgICAgdGhpcy5ib3hOdW1iZXIgPSBudWxsO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmxvY2FsaXR5ID0gJyc7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50ID09PSBJbnB1dE5hbWVUeXBlLlNUUkVFVClcbiAgICB7XG4gICAgICB0aGlzLm1pbkxldmVsID0gQUREUkVTU0xFVkVMLlNUUkVFVDtcbiAgICAgIHRoaXMuYm94TnVtYmVyUHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgdGhpcy5zdHJlZXROdW1iZXJQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnN0cmVldFByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgIC8vIHRoaXMuY2xlYXJJbnB1dChmb2N1czoge3NldEZvY3VzOiBib29sZWFuLCB0aW1lc3RhbXA6IERhdGV9KTtcbiAgICAgIHRoaXMuc3RyZWV0ID0gbnVsbDtcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gbnVsbDtcbiAgICAgIHRoaXMuYm94TnVtYmVyID0gbnVsbDtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAvLyB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50ID09PSBJbnB1dE5hbWVUeXBlLlNUUkVFVF9OVU1CRVIpXG4gICAge1xuICAgICAgdGhpcy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5TVFJFRVRfTlVNQkVSO1xuICAgICAgdGhpcy5ib3hOdW1iZXJQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnN0cmVldE51bWJlclByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgIC8vIHRoaXMuY2xlYXJJbnB1dChmb2N1czoge3NldEZvY3VzOiBib29sZWFuLCB0aW1lc3RhbXA6IERhdGV9KTtcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gbnVsbDtcbiAgICAgIHRoaXMuYm94TnVtYmVyID0gbnVsbDtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgLy8gdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgLy8gdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChldmVudCA9PT0gSW5wdXROYW1lVHlwZS5CT1hfTlVNQkVSKVxuICAgIHtcbiAgICAgIHRoaXMubWluTGV2ZWwgPSBBRERSRVNTTEVWRUwuQk9YX05VTUJFUjtcbiAgICAgIHRoaXMuYm94TnVtYmVyUHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgdGhpcy5ib3hOdW1iZXIgPSBudWxsO1xuICAgICAgLy8gdGhpcy5jbGVhcklucHV0KGZvY3VzOiB7c2V0Rm9jdXM6IGJvb2xlYW4sIHRpbWVzdGFtcDogRGF0ZX0pO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAvLyB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgLy8gdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgLy8gdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICAgICovXG4gIH1cblxuICByZXNldExvY2FsaXR5KGV2ZW50KSB7XG4gICAgdGhpcy5wb3N0YWxDb2RlID0gJyc7XG4gICAgdGhpcy5sb2NhbGl0eSA9ICcnO1xuICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgdGhpcy5vbkNsZWFySW5wdXRFdmVudEVtaXR0ZXIoSW5wdXROYW1lVHlwZS5TVFJFRVQpO1xuICAgIHRoaXMuc2V0QWRkcmVzcyhudWxsLCA0KTtcbiAgfVxuXG4gIHJlc2V0U3RyZWV0KGV2ZW50KSB7XG4gICAgdGhpcy5zdHJlZXQgPSAnJztcbiAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgIHRoaXMub25DbGVhcklucHV0RXZlbnRFbWl0dGVyKElucHV0TmFtZVR5cGUuU1RSRUVUX05VTUJFUik7XG4gICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5hZGRyZXNzSXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgIHRoaXMuc2V0QWRkcmVzcyhudWxsLCAzKTtcbiAgfVxuXG4gIHJlc2V0U3RyZWV0TnVtYmVyKGV2ZW50LCByZXNldEFkZHJlc3M6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdyZXNldCBzdHJlZXQgbnVtbmVyIScsIGV2ZW50LCByZXNldEFkZHJlc3MpO1xuICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICB0aGlzLm9uQ2xlYXJJbnB1dEV2ZW50RW1pdHRlcihJbnB1dE5hbWVUeXBlLkJPWF9OVU1CRVIpO1xuXG4gICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5hZGRyZXNzSXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgdGhpcy5zZXRBZGRyZXNzKG51bGwsIDIpO1xuICAgIC8vICQkIDcgdGhpcy5zZXRBZGRyZXNzKG51bGwsIDIpOyAvLyAkJCA/Pz8/P1xuICAgIC8qXG4gICAgaWYgKHJlc2V0QWRkcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRBZGRyZXNzKC8gKm51bGwqIC8gdGhpcy5zZWxlY3RlZEFkZHJlc3MpO1xuICAgIH0qL1xuICB9XG5cbiAgcmVzZXRCb3hOdW1iZXIoZXZlbnQsIHJlc2V0QWRkcmVzczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3Jlc2V0IHN0cmVldCBudW1uZXIhJywgZXZlbnQsIHJlc2V0QWRkcmVzcyk7XG4gICAgdGhpcy5ib3hOdW1iZXIgPSAnJztcbiAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuYWRkcmVzc0lzQ29tcGxldGUgPSBmYWxzZTtcbiAgICB0aGlzLnNldEFkZHJlc3MobnVsbCwgMSk7XG4gICAgLy8gdGhpcy5vbkNsZWFySW5wdXRFdmVudEVtaXR0ZXIoSW5wdXROYW1lVHlwZS5CT1hfTlVNQkVSKTtcbiAgICAvLyAkJCA3IHRoaXMuc2V0QWRkcmVzcyhudWxsLCAxKTsgLy8gJCQgPz8/Pz9cbiAgICAvKlxuICAgIGlmIChyZXNldEFkZHJlc3MgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2V0QWRkcmVzcygvICpudWxsKiAvIHRoaXMuc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICB9Ki9cbiAgfVxuXG4gIGVudGVyUHJlZmlsbE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge2NvbnNvbGUubG9nKCdsaWI6OmVudGVyUHJlZmlsbE1vZGUoKScpOyB9XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlQm94TmIgJiYgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYiAmJiB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldCAmJiB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5IClcbiAgICB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnByZWZpbGxpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5wcmVmaWxsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LnByZWZpbGxpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5wcmVmaWxsaW5nID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQubG9jYWxpdHkgPSAnJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROdW1iZXIgPSAnJztcbiAgICB9XG5cbiAgfVxuXG4gIHF1aXRQcmVmaWxsTW9kZSgpIHtcbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6cXVpdFByZWZpbGxNb2RlKCknKTsgfVxuICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUJveE5iICYmIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIgJiYgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQgJiYgdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eSApXG4gICAge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkucHJlZmlsbGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucHJvY2Vzc2luZ1ByZWZpbGxEYXRhID0gZmFsc2U7XG4gIH1cblxuICBzZXRBZGRyZXNzKGFkZHJlc3M6IGFueSwgbGV2ZWw/OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6c2V0QWRkcmVzcyAtIGFkZHJlc3MgcGFydCwgbGV2ZWwnLCBhZGRyZXNzLCBsZXZlbCk7IH1cblxuICAgIC8qICQkICQkXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRBZGRyZXNzICYmICFhZGRyZXNzKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygncmVzZXQgYWRkcmVzcyEnKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzID0gbnVsbDtcbiAgICAgIHRoaXMuc3RyZWV0QWRkcmVzcyA9IG51bGw7XG4gICAgICB0aGlzLnN0cmVldE51bWJlckFkZHJlc3MgPSBudWxsO1xuICAgICAgdGhpcy5ub3RpZnlBZGRyZXNzQ29tcGxldGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKi9cbiAgICBpZiAoYWRkcmVzcyA9PT0gbnVsbCB8fCBhZGRyZXNzID09PSB1bmRlZmluZWQgKVxuICAgIHtcbiAgICAgIGNvbnN0IGRvTm90aWZ5ID0gKHRoaXMuc2VsZWN0ZWRBZGRyZXNzICE9PSBudWxsICYmIHRoaXMuc2VsZWN0ZWRBZGRyZXNzICE9PSB1bmRlZmluZWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBudWxsO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5hZGRyZXNzSXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5hZGRyZXNzSXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgaWYgKGRvTm90aWZ5KSB7XG4gICAgICAgIHRoaXMubm90aWZ5QWRkcmVzc0NvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFkZHJlc3MpIHtcbiAgICAgIGRlbGV0ZSBhZGRyZXNzLm1lc3NhZ2VzO1xuICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZUFkZHJlc3MoKTtcbiAgICAgIHRoaXMucG9zdGFsQ29kZSA9IGFkZHJlc3MucG9zdGFsQ29kZSA/IGFkZHJlc3MucG9zdGFsQ29kZSA6ICcnO1xuICAgICAgdGhpcy5sb2NhbGl0eSA9IGFkZHJlc3MubG9jYWxpdHlOYW1lID8gYWRkcmVzcy5sb2NhbGl0eU5hbWUgOiAnJztcbiAgICAgIHRoaXMuc3RyZWV0ID0gYWRkcmVzcy5zdHJlZXROYW1lID8gYWRkcmVzcy5zdHJlZXROYW1lIDogJyc7XG4gICAgICAvLyBjb25zdCBub3RJbkxpc3QgPSBhZGRyZXNzWydub3QtaW4tbGlzdCddO1xuICAgICAgLy8gY29uc3QgaXNOb3RJbkxpc3QgPSBub3RJbkxpc3QgIT09IG51bGwgJiYgbm90SW5MaXN0ICE9PSB1bmRlZmluZWQgJiYgbm90SW5MaXN0ID09PSB0cnVlO1xuICAgICAgLypcbiAgICAgIGlmIChhZGRyZXNzLmhvdXNlTnVtYmVyKSB7XG4gICAgICAgIGlmICghYWRkcmVzcy5pc0NvbXBsZXRlIHx8IGlzTm90SW5MaXN0KSB7XG4gICAgICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSBhZGRyZXNzLmhvdXNlTnVtYmVyID8gYWRkcmVzcy5ob3VzZU51bWJlciA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghYWRkcmVzcy5ib3hOdW1iZXIpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsaW5nIHJlc2V0IHN0cmVldCBudW1iZXIgIScpO1xuICAgICAgICAgICAgaWYgKCAhdGhpcy5wcm9jZXNzaW5nUHJlZmlsbERhdGEgKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzZXRTdHJlZXROdW1iZXIobnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcy5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICovXG5cbiAgICAgIGNvbnN0IGFkZHJlc3NJc0NvbXBsZXRlID0gYWRkcmVzcyAhPT0gbnVsbCAmJiBhZGRyZXNzICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgYWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnaXNDb21wbGV0ZScpICYmIGFkZHJlc3MuaXNDb21wbGV0ZSA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIGNvbnN0IGFkZHJlc3NJc05vdEluTGlzdCA9IGFkZHJlc3MgIT09IG51bGwgJiYgYWRkcmVzcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIGFkZHJlc3MuaGFzT3duUHJvcGVydHkoJ25vdC1pbi1saXN0JykgJiYgYWRkcmVzc1snbm90LWluLWxpc3QnXSA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgc3dpdGNoIChsZXZlbCkge1xuXG4gICAgICAgIC8vIExvY2FsaXR5IC8gTXVuaWNpcGFsaXR5IGFuZCBQT3N0YWxDb2RlXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eShhZGRyZXNzKTtcbiAgICAgICAgICAvKlxuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5jbGVhcldpZGdldCgpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuc3RyZWV0QWRkcmVzcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5zdHJlZXROdW1iZXJBZGRyZXNzID0gbnVsbDtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIFN0cmVldCBOYW1lXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eShhZGRyZXNzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0cmVldE5hbWUoYWRkcmVzcyk7XG4gICAgICAgICAgdGhpcy5zdHJlZXRBZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgICB0aGlzLnN0cmVldE51bWJlckFkZHJlc3MgPSBudWxsO1xuICAgICAgICAgIC8qXG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5jbGVhcldpZGdldCgpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gU1RSRUVUIE51bWJlclxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlTG9jYWxpdHkoYWRkcmVzcyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVTdHJlZXROYW1lKGFkZHJlc3MpO1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RyZWV0TnVtYmVyKGFkZHJlc3MpOyAvLyAkJFxuICAgICAgICAgIHRoaXMuc3RyZWV0QWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgICAgdGhpcy5zdHJlZXROdW1iZXJBZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgICBpZiAoYWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnaXNDb21wbGV0ZScpICYmIGFkZHJlc3MuaXNDb21wbGV0ZSA9PT0gdHJ1ZSApXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5hZGRyZXNzSXNDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoYWRkcmVzc0lzTm90SW5MaXN0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9IGFkZHJlc3MuaG91c2VOdW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9IGFkZHJlc3MuaG91c2VOdW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qXG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcldpZGdldCgpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gQk9YIE51bWJlclxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGFkZHJlc3NJc05vdEluTGlzdClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5hZGRyZXNzSXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIHRoaXMuc2VsZWN0ZWRBZGRyZXNzICYmIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmlzQ29tcGxldGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcy5pc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICBpZiAoYWRkcmVzcy5pc0NvbXBsZXRlID09PSB0cnVlICkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRBZGRyZXNzLmlzQ29tcGxldGVOb3RpZmljYXRpb25Eb25lKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MuaXNDb21wbGV0ZU5vdGlmaWNhdGlvbkRvbmUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubm90aWZ5QWRkcmVzc0NvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm90aWZ5QWRkcmVzc0NvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgICAqL1xuXG4gICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcy5pc0NvbXBsZXRlTm90aWZpY2F0aW9uRG9uZSA9IHRydWU7XG4gICAgICB0aGlzLm5vdGlmeUFkZHJlc3NDb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldExhbmd1YWdlKGxhbmc6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IGxhbmc7XG4gIH1cblxuICBzZXRWYWxpZGF0aW9uTWVzc2FnZSgvKm1lc3NhZ2U6IHN0cmluZyovbWVzc2FnZToge21lc3NhZ2VUeXBlOiBWYWxpZGF0aW9uTWVzc2FnZVR5cGUsIHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmd9KSB7XG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgaWYgKHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25UeXBlID09PSBWYWxpZGF0aW9uTWVzc2FnZU9wdGlvblR5cGUuRU1JVCkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZUV2ZW50RW1pdHRlci5lbWl0KG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG5cbiAgdXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KGFkZHJlc3MpIHtcbiAgICBpZiAoYWRkcmVzcyAmJiBhZGRyZXNzLnBvc3RhbENvZGUgJiYgYWRkcmVzcy5sb2NhbGl0eU5hbWUpIHtcbiAgICAgIHRoaXMucG9zdGFsQ29kZUxvY2FsaXR5ID0gIGFkZHJlc3MucG9zdGFsQ29kZSAgKyAnICcgKyBhZGRyZXNzLmxvY2FsaXR5TmFtZTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkuc2VhcmNoVGV4dCA9IHRoaXMucG9zdGFsQ29kZUxvY2FsaXR5O1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVN0cmVldE5hbWUoYWRkcmVzcykge1xuICAgIGlmIChhZGRyZXNzICYmIGFkZHJlc3Muc3RyZWV0TmFtZSkge1xuICAgICAgdGhpcy5zdHJlZXROYW1lSW5wdXQgPSBhZGRyZXNzLnN0cmVldE5hbWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlU3RyZWV0TnVtYmVyKGFkZHJlc3MpIHtcbiAgICBpZiAoYWRkcmVzcyAmJiBhZGRyZXNzLmhvdXNlTnVtYmVyKSB7XG4gICAgICB0aGlzLnN0cmVldE51bWJlcklucHV0ID0gYWRkcmVzcy5ob3VzZU51bWJlcjtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb21wbGV0ZUFkZHJlc3MoKSB7XG4gICAgbGV0IGNvbmNhdFN0ciA9ICcnO1xuICAgIGNvbmNhdFN0ciArPSB0aGlzLnNlbGVjdGVkQWRkcmVzcy5zdHJlZXROYW1lID8gYCR7dGhpcy5zZWxlY3RlZEFkZHJlc3Muc3RyZWV0TmFtZX0gYCA6ICcnO1xuICAgIGNvbmNhdFN0ciArPSB0aGlzLnNlbGVjdGVkQWRkcmVzcy5ob3VzZU51bWJlciA/IGAke3RoaXMuc2VsZWN0ZWRBZGRyZXNzLmhvdXNlTnVtYmVyfSBgIDogJyc7XG4gICAgY29uY2F0U3RyICs9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmJveE51bWJlciA/IGAke3RoaXMuZ2V0Qm94UHJlZml4KCl9ICR7dGhpcy5zZWxlY3RlZEFkZHJlc3MuYm94TnVtYmVyfSBgIDogJyc7XG4gICAgY29uY2F0U3RyICs9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzLnBvc3RhbENvZGUgPyBgJHt0aGlzLnNlbGVjdGVkQWRkcmVzcy5wb3N0YWxDb2RlfSBgIDogJyc7XG4gICAgY29uY2F0U3RyICs9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzLm11bmljaXBhbGl0eU5hbWUgPyBgJHt0aGlzLnNlbGVjdGVkQWRkcmVzcy5tdW5pY2lwYWxpdHlOYW1lfSBgIDogJyc7XG4gICAgdGhpcy5jb21wbGV0ZUFkZHJlc3MgPSBjb25jYXRTdHI7XG4gIH1cblxuICBzZXRWYWxpZGF0aW9uTWVzc2FnZU9wdGlvbkZyb21JbnB1dChvcHRpb246IHt2YWxpZGF0aW9uVHlwZTogVmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25UeXBlLCB0aW1lc3RhbXA6IERhdGV9KSB7XG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZU9wdGlvblR5cGUgPSBvcHRpb24udmFsaWRhdGlvblR5cGU7XG4gICAgLy8gY29uc29sZS5sb2coJ2FkZHJlc3NlIGF1dG9jb21wbGV0ZSAtIHZhbGlkYXRpb24gbWVzc2FnZSBvcHRpb24nLCB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9uVHlwZSk7XG4gIH1cblxuICBvbkxvY2FsaXR5UHJlZmlsbEV2ZW50KGV2ZW50OiBQcmVmaWxsRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6bG9jYWxpdHkgcHJlZmlsbCBldmVudCByZWNlaXZlZDonLCBldmVudCk7IH1cbiAgICAvKlxuICAgIGlmIChldmVudC5wZXJmZWN0TWF0Y2gpXG4gICAge1xuICAgICAgdGhpcy5hZGRyZXNzUGFyYW1zLm1pbkxldmVsID0gLyAqMyogLyBBRERSRVNTTEVWRUwuU1RSRUVUO1xuICAgICAgdGhpcy5zdHJlZXRQYXJhbXMgPSB0aGlzLmFkZHJlc3NQYXJhbXM7XG4gICAgfVxuICAgICovXG4gICAgY29uc3QgZGF0YSA9IGV2ZW50LnByZWZpbGxEYXRhO1xuICAgIGlmIChldmVudC5wcmVmaWxsRGF0YS5wcmVmaWxsTXVuaWNpcGFsaXR5UGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUgKVxuICAgIHtcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBkYXRhLnByZWZpbGxNdW5pY2lwYWxpdHlQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KGFkZHJlc3MpO1xuICAgICAgdGhpcy5hZGRyZXNzUGFyYW1zLm1pbkxldmVsID0gLyo0Ki8gQUREUkVTU0xFVkVMLlNUUkVFVDtcbiAgICAgIC8vIHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSA9IHRoaXMuYWRkcmVzc1BhcmFtczsgLy8gYXMgYW55IGFzIFByZWZpbGxEYXRhO1xuICAgICAgLy8gdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhID0gbmV3IFByZWZpbGxEYXRhKHRoaXMuYWRkcmVzc1BhcmFtcyk7XG4gICAgICAvLyBPYmplY3QuYXNzaWduKHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSwgdGhpcy5hZGRyZXNzUGFyYW1zKTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEgPSBldmVudC5wcmVmaWxsRGF0YTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEudHMgPSBuZXcgRGF0ZSgpO1xuICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm1pbkxldmVsID0gQUREUkVTU0xFVkVMLlNUUkVFVDtcbiAgICAgIC8vIEJlIHN1cmUgdG8gcHJvcGFnYXRlIHRoZSBsb2NhbGl0eU5hbWUgaW4gcGxhY2Ugb2YgdGhlIG11bmljaXBhbGl0eU5hbWUgIVxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbkFkZHJlc3MgPSB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxNdW5pY2lwYWxpdHlQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uLmFkZHJlc3M7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uQWRkcmVzc0xvY2FsaXR5TmFtZSA9IHN1Z2dlc3Rpb25BZGRyZXNzLmxvY2FsaXR5TmFtZTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5tdW5pY2lwYWxpdHlOYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3NMb2NhbGl0eU5hbWU7XG4gICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZSA9IHN1Z2dlc3Rpb25BZGRyZXNzLnBvc3RhbENvZGU7XG4gICAgICAvLyB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eShzdWdnZXN0aW9uQWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHN0cmVldE5hbWUgPSB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TmFtZTtcbiAgICAgIGlmIChzdHJlZXROYW1lID09PSBudWxsIHx8IHN0cmVldE5hbWUgPT09IHVuZGVmaW5lZCB8fCBzdHJlZXROYW1lID09PSAnJylcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5MT0NBTElUWSk7XG4gICAgICAgIC8vIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHN1Z2dlc3Rpb25BZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgIGNvbnN0IHN0cmVldE5hbWUgPSB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TmFtZTtcbiAgICAgIGlmIChzdHJlZXROYW1lID09PSBudWxsIHx8IHN0cmVldE5hbWUgPT09IHVuZGVmaW5lZCB8fCBzdHJlZXROYW1lID09PSAnJylcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5MT0NBTElUWSk7XG4gICAgICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHN1Z2dlc3Rpb25BZGRyZXNzKTtcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnbGliOjpwcmVmaWxsOiB0cmlnZ2VyIGNoZWNraW5nIHN0cmVldCBtYXRjaC4uLiAnLCB0aGlzLnByZWZpbGxEYXRhKTsgfVxuICAgICAgICB0aGlzLnN0cmVldFByZWZpbGxEYXRhID0gdGhpcy5wcmVmaWxsRGF0YTtcbiAgICAgIH1cbiAgICAgICovXG5cbiAgICAgIHRoaXMuc3RyZWV0UHJlZmlsbERhdGEgPSB0aGlzLnByZWZpbGxEYXRhO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgLy8gY29uc3QgY3BBbmRMb2NhbGl0eSA9IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5wb3N0YWxDb2RlICsgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm11bmljaXBhbGl0eU5hbWU7XG4gICAgICBjb25zdCBjcEFuZExvY2FsaXR5ID0gZGF0YS5wYXJhbWV0ZXJzLnBvc3RhbENvZGUgKyBkYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmxvY2FsaXR5ID0gJyc7XG4gICAgICBpZiAoIGNwQW5kTG9jYWxpdHkgPT09IG51bGwgfHwgY3BBbmRMb2NhbGl0eSA9PT0gdW5kZWZpbmVkIHx8IGNwQW5kTG9jYWxpdHkubGVuZ3RoID09PSAwIClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKG51bGwsIEFERFJFU1NMRVZFTC5MT0NBTElUWSk7XG4gICAgICB9XG4gICAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RyZWV0UHJlZmlsbEV2ZW50KGV2ZW50OiBQcmVmaWxsRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6c3RyZWV0OiBwcmVmaWxsIGV2ZW50IHJlY2VpdmVkJywgZXZlbnQpOyB9XG4gICAgLypcbiAgICBjb25zdCBkYXRhOiBQcmVmaWxsRGF0YSA9IGV2ZW50LnByZWZpbGxEYXRhO1xuICAgIGlmIChkYXRhLnByZWZpbGxTdHJlZXRQZXJmZWN0TWF0Y2hGb3VuZCA9PT0gdHJ1ZSApXG4gICAge1xuICAgICAgY29uc29sZS5sb2coJ2xpYjo6b25TdHJlZXRQcmVmaWxsRXZlbnQ6IE1BVENIIEZPVU5EJywgZGF0YSk7XG4gICAgICB0aGlzLnBvc3RhbENvZGVMb2NhbGl0eSA9ICdUUlVDLU1VQ0hFJztcbiAgICAgIHRoaXMucG9zdGFsQ29kZUxvY2FsaXR5ID0gJ1RSVUMtTVVDSEUgMic7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LnNlYXJjaFRleHQgPSB0aGlzLnBvc3RhbENvZGVMb2NhbGl0eTtcbiAgICB9XG4gICAgKi9cbiAgICBjb25zdCBkYXRhID0gZXZlbnQucHJlZmlsbERhdGE7XG4gICAgaWYgKGV2ZW50LnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXRQZXJmZWN0TWF0Y2hGb3VuZCA9PT0gdHJ1ZSApXG4gICAge1xuICAgICAgLy8gaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnbGliOjpvblN0cmVldFByZWZpbGxFdmVudDogTUFUQ0ggRk9VTkQnLCBkYXRhKTsgfVxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGRhdGEucHJlZmlsbFN0cmVldFBlcmZlY3RNYXRjaFN1Z2dlc3Rpb247XG4gICAgICBjb25zdCBhZGRyZXNzID0gc3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgICAgdGhpcy51cGRhdGVTdHJlZXROYW1lKGFkZHJlc3MpO1xuICAgICAgdGhpcy5hZGRyZXNzUGFyYW1zLm1pbkxldmVsID0gQUREUkVTU0xFVkVMLlNUUkVFVF9OVU1CRVI7XG4gICAgICAvLyB0aGlzLmxvY2FsaXR5UHJlZmlsbERhdGEgPSB0aGlzLmFkZHJlc3NQYXJhbXM7IC8vIGFzIGFueSBhcyBQcmVmaWxsRGF0YTtcbiAgICAgIC8vIHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSA9IG5ldyBQcmVmaWxsRGF0YSh0aGlzLmFkZHJlc3NQYXJhbXMpO1xuICAgICAgLy8gT2JqZWN0LmFzc2lnbih0aGlzLmxvY2FsaXR5UHJlZmlsbERhdGEsIHRoaXMuYWRkcmVzc1BhcmFtcyk7XG4gICAgICB0aGlzLnByZWZpbGxEYXRhID0gZXZlbnQucHJlZmlsbERhdGE7XG4gICAgICB0aGlzLnByZWZpbGxEYXRhLnRzID0gbmV3IERhdGUoKTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5TVFJFRVRfTlVNQkVSO1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbkFkZHJlc3MgPSB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXRQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uLmFkZHJlc3M7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uQWRkcmVzc0xvY2FsaXR5TmFtZSA9IHN1Z2dlc3Rpb25BZGRyZXNzLmxvY2FsaXR5TmFtZTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5tdW5pY2lwYWxpdHlOYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3NMb2NhbGl0eU5hbWU7XG4gICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZSA9IHN1Z2dlc3Rpb25BZGRyZXNzLnBvc3RhbENvZGU7XG4gICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TmFtZSA9IHN1Z2dlc3Rpb25BZGRyZXNzLnN0cmVldE5hbWU7XG4gICAgICAvLyB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eShzdWdnZXN0aW9uQWRkcmVzcyk7XG4gICAgICAvLyB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eShzdWdnZXN0aW9uQWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHN0cmVldE51bWJlciA9IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROdW1iZXI7XG4gICAgICBpZiAoc3RyZWV0TnVtYmVyID09PSBudWxsIHx8IHN0cmVldE51bWJlciA9PT0gdW5kZWZpbmVkIHx8IHN0cmVldE51bWJlciA9PT0gJycpXG4gICAgICB7XG4gICAgICAgIHRoaXMuc2V0QWRkcmVzcyhhZGRyZXNzLCBBRERSRVNTTEVWRUwuU1RSRUVUKTtcbiAgICAgICAgLy8gdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgIGNvbnN0IHN0cmVldE51bWJlciA9IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROdW1iZXI7XG4gICAgICBpZiAoc3RyZWV0TnVtYmVyID09PSBudWxsIHx8IHN0cmVldE51bWJlciA9PT0gdW5kZWZpbmVkIHx8IHN0cmVldE51bWJlciA9PT0gJycpXG4gICAgICB7XG4gICAgICAgIHRoaXMuc2V0QWRkcmVzcyhhZGRyZXNzLCBBRERSRVNTTEVWRUwuU1RSRUVUKTtcbiAgICAgICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge2NvbnNvbGUubG9nKCdsaWI6OnByZWZpbGw6IHRyaWdnZXIgY2hlY2tpbmcgc3RyZWV0IG51bWJlciBtYXRjaC4uLiAnLCB0aGlzLnByZWZpbGxEYXRhKTt9XG4gICAgICAgIHRoaXMuc3RyZWV0TnVtYmVyUHJlZmlsbERhdGEgPSB0aGlzLnByZWZpbGxEYXRhO1xuICAgICAgfVxuICAgICAgKi9cblxuICAgICAgdGhpcy5zdHJlZXROdW1iZXJQcmVmaWxsRGF0YSA9IHRoaXMucHJlZmlsbERhdGE7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBjb25zdCBwcmVmaWxsU3RyZWV0TmFtZSA9IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eVBlcmZlY3RNYXRjaFN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuXG4gICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2xpYjo6b25TdHJlZXRQcmVmaWxsRXZlbnQgLSBOTyBNQVRDSCBBVCBTVFJFRVQgTEVWRUwnLCBwcmVmaWxsU3RyZWV0TmFtZSApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIHByZWZpbGxTdHJlZXROYW1lID09PSBudWxsIHx8IHByZWZpbGxTdHJlZXROYW1lID09PSB1bmRlZmluZWQgfHwgcHJlZmlsbFN0cmVldE5hbWUubGVuZ3RoID09PSAwIClcbiAgICAgIHtcbiAgICAgICAgLy8gaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge2NvbnNvbGUubG9nKCdsaWI6Om9uU3RyZWV0UHJlZmlsbEV2ZW50OiBOTyBNQVRDSCBGT1VORCAtIHNldCBhZGRyZXNzJywgZGF0YSwgYWRkcmVzcyk7IH1cbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5MT0NBTElUWSk7XG4gICAgICB9XG4gICAgICBlbHNlXG4gICAgICB7XG4gICAgICAgIC8vIGFkZHJlc3Muc3RyZWV0TmFtZSA9IHByZWZpbGxTdHJlZXROYW1lO1xuICAgICAgICBhZGRyZXNzLnNlYXJjaEJhclN0cmluZyA9IHByZWZpbGxTdHJlZXROYW1lO1xuICAgICAgICB0aGlzLnNldEFkZHJlc3MoYWRkcmVzcywgQUREUkVTU0xFVkVMLlNUUkVFVCk7XG4gICAgICB9XG4gICAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RyZWV0TnVtYmVyUHJlZmlsbEV2ZW50KGV2ZW50OiBQcmVmaWxsRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdsaWI6OnN0cmVldCBudW1iZXIgcHJlZmlsbCBldmVudCByZWNlaXZlZDonLCBldmVudCk7IH1cbiAgICBjb25zdCBkYXRhID0gZXZlbnQucHJlZmlsbERhdGE7XG4gICAgaWYgKGRhdGEucHJlZmlsbFN0cmVldE51bWJlclBlcmZlY3RNYXRjaEZvdW5kID09PSB0cnVlKVxuICAgIHtcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBkYXRhLnByZWZpbGxTdHJlZXROdW1iZXJQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIHRoaXMudXBkYXRlU3RyZWV0TnVtYmVyKGFkZHJlc3MpO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWxlY3RlZEFkZHJlc3MgPSBhZGRyZXNzO1xuXG4gICAgICBjb25zdCBhZGRyZXNzSXNDb21wbGV0ZSA9IGFkZHJlc3MgJiYgYWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnaXNDb21wbGV0ZScpICYmIGFkZHJlc3MuaXNDb21wbGV0ZSA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIGNvbnN0IGFkZHJlc3NJc05vdEluTGlzdCA9IGFkZHJlc3MgJiYgYWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnbm90LWluLWxpc3QnKSAmJiBhZGRyZXNzWydub3QtaW4tbGlzdCddID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICBpZiAoYWRkcmVzc0lzQ29tcGxldGUgJiYgISBhZGRyZXNzSXNOb3RJbkxpc3QgKVxuICAgICAge1xuICAgICAgICAvLyBmb3VuZCBhZGRyZXNzIC0gcGVyZmVjdCBtYXRjaGF0IHN0cmVldCBudW1iZXIgbGV2ZWxcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBhbnltb3JlXG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuYWRkcmVzc0lzQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICB0aGlzLmFkZHJlc3NQYXJhbXMubWluTGV2ZWwgPSBBRERSRVNTTEVWRUwuQk9YX05VTUJFUjtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YSA9IGV2ZW50LnByZWZpbGxEYXRhO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnRzID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm1pbkxldmVsID0gQUREUkVTU0xFVkVMLkJPWF9OVU1CRVI7XG4gICAgICAgIC8vIGNvbnN0IHN1Z2dlc3Rpb25BZGRyZXNzTG9jYWxpdHlOYW1lXG4gICAgICAgIC8vICA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbFN0cmVldE51bWJlclBlcmZlY3RNYXRjaFN1Z2dlc3Rpb24uYWRkcmVzcy5sb2NhbGl0eU5hbWU7XG5cbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbkFkZHJlc3MgPSB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXROdW1iZXJQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uLmFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25BZGRyZXNzTG9jYWxpdHlOYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3MubG9jYWxpdHlOYW1lO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZSA9IHN1Z2dlc3Rpb25BZGRyZXNzTG9jYWxpdHlOYW1lO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZSA9IHN1Z2dlc3Rpb25BZGRyZXNzTG9jYWxpdHlOYW1lO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZSA9IHN1Z2dlc3Rpb25BZGRyZXNzLnBvc3RhbENvZGU7XG4gICAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3Muc3RyZWV0TmFtZTtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE51bWJlciA9IHN1Z2dlc3Rpb25BZGRyZXNzLmhvdXNlTnVtYmVyO1xuICAgICAgICAvLyB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eShzdWdnZXN0aW9uQWRkcmVzcyk7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHN1Z2dlc3Rpb25BZGRyZXNzKTtcblxuICAgICAgICBjb25zdCBib3hOdW1iZXIgPSB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuYm94TnVtYmVyO1xuICAgICAgICBpZiAoICEgYWRkcmVzc0lzTm90SW5MaXN0ICYmIChib3hOdW1iZXIgPT09IG51bGwgfHwgYm94TnVtYmVyID09PSB1bmRlZmluZWQgfHwgYm94TnVtYmVyID09PSAnJykgKVxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5TVFJFRVRfTlVNQkVSKTtcbiAgICAgICAgICAvLyB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgY29uc3QgYm94TnVtYmVyID0gdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmJveE51bWJlcjtcbiAgICAgICAgaWYgKCAhIGFkZHJlc3NJc05vdEluTGlzdCAmJiAoYm94TnVtYmVyID09PSBudWxsIHx8IGJveE51bWJlciA9PT0gdW5kZWZpbmVkIHx8IGJveE51bWJlciA9PT0gJycpIClcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMuc2V0QWRkcmVzcyhhZGRyZXNzLCBBRERSRVNTTEVWRUwuU1RSRUVUX05VTUJFUik7XG4gICAgICAgICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdsaWI6OnByZWZpbGw6IHRyaWdnZXIgY2hlY2tpbmcgYm94IG51bWJlciBtYXRjaC4uLiAnLCB0aGlzLnByZWZpbGxEYXRhKTsgfVxuICAgICAgICAgIHRoaXMuYm94TnVtYmVyUHJlZmlsbERhdGEgPSB0aGlzLnByZWZpbGxEYXRhO1xuICAgICAgICB9XG4gICAgICAgICovXG5cbiAgICAgICAgdGhpcy5ib3hOdW1iZXJQcmVmaWxsRGF0YSA9IHRoaXMucHJlZmlsbERhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBjb25zdCBwcmVmaWxsU3RyZWV0TnVtYmVyID0gdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE51bWJlcjtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXRQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uLmFkZHJlc3M7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgaWYgKCBwcmVmaWxsU3RyZWV0TnVtYmVyID09PSBudWxsIHx8IHByZWZpbGxTdHJlZXROdW1iZXIgPT09IHVuZGVmaW5lZCB8fCBwcmVmaWxsU3RyZWV0TnVtYmVyLmxlbmd0aCA9PT0gMCApXG4gICAgICB7XG4gICAgICAgIHRoaXMuc2V0QWRkcmVzcyhhZGRyZXNzLCBBRERSRVNTTEVWRUwuU1RSRUVUKTtcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgIHtcbiAgICAgICAgLy8gYWRkcmVzcy5ob3VzZU51bWJlciA9IHByZWZpbGxTdHJlZXROdW1iZXI7XG4gICAgICAgIGFkZHJlc3Muc2VhcmNoQmFyU3RyaW5nID0gcHJlZmlsbFN0cmVldE51bWJlcjtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5TVFJFRVRfTlVNQkVSKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgb25Cb3hOdW1iZXJQcmVmaWxsRXZlbnQoZXZlbnQ6IFByZWZpbGxFdmVudCkge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ2xpYjo6cHJlZmlsbDogYm94IG51bWJlciBldmVudCByZWNlaXZlZDonLCBldmVudCk7IH1cbiAgICBjb25zdCBkYXRhID0gZXZlbnQucHJlZmlsbERhdGE7XG4gICAgaWYgKGRhdGEucHJlZmlsbEJveE51bWJlclBlcmZlY3RNYXRjaEZvdW5kID09PSB0cnVlKVxuICAgIHtcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBkYXRhLnByZWZpbGxCb3hOdW1iZXJQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VsZWN0ZWRBZGRyZXNzID0gYWRkcmVzcztcbiAgICAgIHRoaXMuc2V0QWRkcmVzcyhhZGRyZXNzLCBBRERSRVNTTEVWRUwuQk9YX05VTUJFUik7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBjb25zdCBwcmVmaWxsQm94TnVtYmVyID0gdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmJveE51bWJlcjtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXROdW1iZXJQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uLmFkZHJlc3M7XG4gICAgICBpZiAoIHByZWZpbGxCb3hOdW1iZXIgPT09IG51bGwgfHwgcHJlZmlsbEJveE51bWJlciA9PT0gdW5kZWZpbmVkIHx8IHByZWZpbGxCb3hOdW1iZXIubGVuZ3RoID09PSAwIClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5TVFJFRVRfTlVNQkVSKTtcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgIHtcbiAgICAgICAgLy8gYWRkcmVzcy5ib3hOdW1iZXIgPSBwcmVmaWxsQm94TnVtYmVyO1xuICAgICAgICBhZGRyZXNzLnNlYXJjaEJhclN0cmluZyA9IHByZWZpbGxCb3hOdW1iZXI7XG4gICAgICAgIHRoaXMuc2V0QWRkcmVzcyhhZGRyZXNzLCBBRERSRVNTTEVWRUwuQk9YX05VTUJFUik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gIH1cbn1cbiJdfQ==