@magic-xpa/gui 4.800.0-dev480.94 → 4.801.0-dev000.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
  3. package/esm2020/src/Commands.mjs +186 -0
  4. package/esm2020/src/Events.mjs +420 -0
  5. package/esm2020/src/EventsProcessor.mjs +67 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
  8. package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +126 -127
  9. package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
  10. package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +2 -1
  11. package/esm2020/src/Manager.mjs +192 -0
  12. package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
  13. package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +2 -1
  14. package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
  15. package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
  16. package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
  17. package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
  18. package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
  19. package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
  20. package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
  21. package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
  22. package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
  23. package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
  24. package/esm2020/src/gui/low/GuiInteractive.mjs +545 -0
  25. package/esm2020/src/gui/low/Style.mjs +47 -0
  26. package/esm2020/src/management/RuntimeContextBase.mjs +52 -0
  27. package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
  28. package/esm2020/src/management/data/DcValues.mjs +214 -0
  29. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +97 -0
  30. package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
  31. package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
  32. package/esm2020/src/management/data/GuiDataViewBase.mjs +90 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
  35. package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
  36. package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
  37. package/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
  39. package/esm2020/src/management/data/RecordUtils.mjs +361 -0
  40. package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
  41. package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
  42. package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
  43. package/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
  44. package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +2 -1
  45. package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +333 -0
  46. package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
  47. package/esm2020/src/management/gui/DisplayConvertor.mjs +1706 -0
  48. package/esm2020/src/management/gui/FieldValidator.mjs +1507 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
  51. package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
  52. package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
  55. package/esm2020/src/management/gui/PIC.mjs +1178 -0
  56. package/esm2020/src/management/gui/PropDefaults.mjs +230 -0
  57. package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +2 -4
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1382 -0
  60. package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
  61. package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
  62. package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
  63. package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
  65. package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
  66. package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
  67. package/esm2020/src/management/tasks/MgTimer.mjs +21 -0
  68. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +54 -0
  69. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
  71. package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
  72. package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
  73. package/esm2020/src/util/ProcessLauncher.mjs +32 -0
  74. package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
  75. package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +305 -365
  76. package/fesm2015/magic-xpa-gui.mjs.map +1 -0
  77. package/fesm2020/magic-xpa-gui.mjs +17805 -0
  78. package/fesm2020/magic-xpa-gui.mjs.map +1 -0
  79. package/package.json +27 -14
  80. package/src/Commands.d.ts +1 -0
  81. package/src/Events.d.ts +2 -2
  82. package/src/EventsProcessor.d.ts +1 -1
  83. package/src/GuiEnums.d.ts +125 -126
  84. package/src/IFlowMonitorQueue.d.ts +1 -1
  85. package/src/Manager.d.ts +2 -3
  86. package/src/env/IEnvironment.d.ts +1 -0
  87. package/src/gui/low/GuiInteractive.d.ts +3 -1
  88. package/src/gui/low/Style.d.ts +0 -3
  89. package/src/management/RuntimeContextBase.d.ts +2 -0
  90. package/src/management/data/DcValues.d.ts +1 -1
  91. package/src/management/data/DcValuesBuilderBase.d.ts +1 -1
  92. package/src/management/data/RecordUtils.d.ts +0 -3
  93. package/src/management/events/IGuiEventsManager.d.ts +5 -5
  94. package/src/management/exp/ExpressionInterface.d.ts +1 -0
  95. package/src/management/exp/GuiExpressionEvaluator.d.ts +2 -2
  96. package/src/management/gui/DisplayConvertor.d.ts +6 -6
  97. package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
  98. package/src/management/gui/MgControlBase.d.ts +4 -5
  99. package/src/management/gui/MgFormBase.d.ts +1 -1
  100. package/src/management/gui/PropInterface.d.ts +2 -4
  101. package/src/management/gui/PropTable.d.ts +1 -1
  102. package/src/management/gui/Property.d.ts +3 -3
  103. package/src/management/tasks/GuiTaskBase.d.ts +3 -8
  104. package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
  105. package/src/util/ProcessLauncher.d.ts +1 -3
  106. package/bundles/magic-xpa-gui.umd.js +0 -19459
  107. package/bundles/magic-xpa-gui.umd.js.map +0 -1
  108. package/bundles/magic-xpa-gui.umd.min.js +0 -16
  109. package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
  110. package/esm2015/src/Commands.js +0 -185
  111. package/esm2015/src/Events.js +0 -420
  112. package/esm2015/src/EventsProcessor.js +0 -68
  113. package/esm2015/src/FocusManager.js +0 -41
  114. package/esm2015/src/Manager.js +0 -197
  115. package/esm2015/src/gui/low/GuiInteractive.js +0 -539
  116. package/esm2015/src/gui/low/Style.js +0 -50
  117. package/esm2015/src/management/RuntimeContextBase.js +0 -50
  118. package/esm2015/src/management/data/DcValues.js +0 -214
  119. package/esm2015/src/management/data/DcValuesBuilderBase.js +0 -97
  120. package/esm2015/src/management/data/GuiDataViewBase.js +0 -90
  121. package/esm2015/src/management/data/GuiFieldBase.js +0 -85
  122. package/esm2015/src/management/data/ObjectReferenceBase.js +0 -48
  123. package/esm2015/src/management/data/RecordUtils.js +0 -447
  124. package/esm2015/src/management/events/IGuiEventsManager.js +0 -1
  125. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +0 -333
  126. package/esm2015/src/management/gui/DisplayConvertor.js +0 -1706
  127. package/esm2015/src/management/gui/FieldValidator.js +0 -1507
  128. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
  129. package/esm2015/src/management/gui/MgControlBase.js +0 -1979
  130. package/esm2015/src/management/gui/MgFormBase.js +0 -763
  131. package/esm2015/src/management/gui/PIC.js +0 -1176
  132. package/esm2015/src/management/gui/PropDefaults.js +0 -232
  133. package/esm2015/src/management/gui/PropTable.js +0 -224
  134. package/esm2015/src/management/gui/Property.js +0 -1409
  135. package/esm2015/src/management/tasks/GuiTaskBase.js +0 -533
  136. package/esm2015/src/management/tasks/MgTimer.js +0 -21
  137. package/esm2015/src/management/tasks/TaskDefinitionId.js +0 -47
  138. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
  139. package/esm2015/src/util/ProcessLauncher.js +0 -32
  140. package/esm2015/src/util/UsernamePasswordCredentials.js +0 -52
  141. package/fesm2015/magic-xpa-gui.js.map +0 -1
@@ -1,1176 +0,0 @@
1
- import { MsgInterface, PICInterface, StorageAttribute, UtilImeJpn, UtilStrByteMode } from '@magic-xpa/utils';
2
- import { Events } from '../../Events';
3
- import { ApplicationException, Int32, NString, StringBuilder } from '@magic-xpa/mscorelib';
4
- import { GuiEnvironment } from '../../GuiEnvironment';
5
- export class PIC {
6
- constructor(picStr, attr, compIdx) {
7
- this._mskLen = 0;
8
- this._negPref = new StringBuilder();
9
- this._negSuff = new StringBuilder();
10
- this._picAttr = StorageAttribute.NONE;
11
- this._posPref = new StringBuilder();
12
- this._posSuff = new StringBuilder();
13
- this._autoSkip_ = false;
14
- this._padFill = false;
15
- this._zeroFill = false;
16
- this._comma = false;
17
- this._decimalDigits = 0;
18
- this._decPointIsFirst = false;
19
- this._decimal = false;
20
- this._embeded = false;
21
- this._formatIdx = 0;
22
- this._format = null;
23
- this.hebrew = false;
24
- this._imeMode = -1;
25
- this._left = false;
26
- this._maskLength = 0;
27
- this._maskChars = 0;
28
- this._maskSize = 0;
29
- this._mixed = false;
30
- this._msk = null;
31
- this._needLength = false;
32
- this._negative = false;
33
- this._pad = '\0';
34
- this._prefLen = 0;
35
- this._size = 0;
36
- this._suffLen = 0;
37
- this._termFlag = false;
38
- this._trim = false;
39
- this._whole = 0;
40
- this._zero = '\0';
41
- this._picAttr = attr;
42
- if (this._picAttr === StorageAttribute.BLOB ||
43
- this._picAttr === StorageAttribute.BLOB_VECTOR) {
44
- if (picStr.trim().length > 0) {
45
- Events.WriteDevToLog("PIC.PIC the picture of BLOB must be empty string");
46
- }
47
- return;
48
- }
49
- this._format = NString.ToCharArray(picStr);
50
- this._formatIdx = 0;
51
- this._mskLen = this.getMaskLen(compIdx);
52
- this.prs_all(compIdx);
53
- }
54
- isHebrew() {
55
- return this.hebrew;
56
- }
57
- isMixed() {
58
- return this._mixed;
59
- }
60
- embededChars() {
61
- return this._embeded;
62
- }
63
- isNegative() {
64
- return this._negative;
65
- }
66
- withComa() {
67
- return this._comma;
68
- }
69
- isLeft() {
70
- return this._left;
71
- }
72
- padFill() {
73
- return this._padFill;
74
- }
75
- getPad() {
76
- return this._pad;
77
- }
78
- zeroFill() {
79
- return this._zeroFill;
80
- }
81
- getZeroPad() {
82
- return this._zero;
83
- }
84
- isTrimed() {
85
- return this._trim;
86
- }
87
- autoSkip() {
88
- return this._autoSkip_;
89
- }
90
- withDecimal() {
91
- return this._decimal;
92
- }
93
- withTerm() {
94
- return this._termFlag;
95
- }
96
- getMaskChars() {
97
- return this._maskChars;
98
- }
99
- getWholes() {
100
- return this._whole;
101
- }
102
- getDec() {
103
- return this._decimalDigits;
104
- }
105
- getSize() {
106
- return this._size;
107
- }
108
- getMaskSize() {
109
- return this._maskSize;
110
- }
111
- getMaskLength() {
112
- return this._maskLength;
113
- }
114
- decInFirstPos() {
115
- return this._decPointIsFirst;
116
- }
117
- getPosPref_() {
118
- return this._posPref.ToString();
119
- }
120
- getPosSuff_() {
121
- return this._posSuff.ToString();
122
- }
123
- getNegPref_() {
124
- return this._negPref.ToString();
125
- }
126
- getNegSuff_() {
127
- return this._negSuff.ToString();
128
- }
129
- getMask() {
130
- return NString.FromChars(this._msk);
131
- }
132
- getFormat() {
133
- return NString.FromChars(this._format);
134
- }
135
- getAttr() {
136
- return this._picAttr;
137
- }
138
- setAttr(set) {
139
- this._picAttr == set;
140
- }
141
- getImeMode() {
142
- return this._imeMode;
143
- }
144
- prs_all(compIdx) {
145
- if (!this._needLength) {
146
- this._msk = new Array(this._mskLen);
147
- for (let _ai = 0; _ai < this._msk.length; ++_ai)
148
- this._msk[_ai] = '\0';
149
- }
150
- switch (this._picAttr) {
151
- case StorageAttribute.ALPHA:
152
- case StorageAttribute.UNICODE:
153
- this.alpha_prs();
154
- break;
155
- case StorageAttribute.NUMERIC:
156
- this.num_prs();
157
- break;
158
- case StorageAttribute.DATE:
159
- this.date_prs(compIdx);
160
- break;
161
- case StorageAttribute.TIME:
162
- this.time_prs();
163
- break;
164
- case StorageAttribute.BOOLEAN:
165
- this.bool_prs();
166
- break;
167
- case StorageAttribute.BLOB:
168
- case StorageAttribute.BLOB_VECTOR:
169
- break;
170
- }
171
- }
172
- alpha_prs() {
173
- let currChr;
174
- let drv;
175
- let count;
176
- while (this._formatIdx < this._format.length) {
177
- currChr = this._format[this._formatIdx];
178
- switch (currChr) {
179
- case 'H':
180
- this._formatIdx++;
181
- this.setHebrew();
182
- break;
183
- case 'A':
184
- this._autoSkip_ = true;
185
- this._formatIdx++;
186
- break;
187
- case '#':
188
- case 'L':
189
- case 'U':
190
- case 'X':
191
- drv = 0;
192
- switch (currChr) {
193
- case '#':
194
- drv = PICInterface.PIC_N;
195
- break;
196
- case 'L':
197
- drv = PICInterface.PIC_L;
198
- break;
199
- case 'U':
200
- drv = PICInterface.PIC_U;
201
- break;
202
- case 'X':
203
- drv = PICInterface.PIC_X;
204
- break;
205
- }
206
- this._formatIdx++;
207
- count = this.pik_count();
208
- this.pik_drv_fill(drv, count);
209
- break;
210
- default:
211
- if (UtilStrByteMode.isLocaleDefLangDBCS()) {
212
- let useImeJpn = UtilStrByteMode.isLocaleDefLangJPN();
213
- if (currChr === 'K' && useImeJpn) {
214
- if (this.pic_kanji())
215
- break;
216
- }
217
- if (GuiEnvironment.Environment.GetLocalAs400Set()) {
218
- drv = 0;
219
- if (currChr === 'J')
220
- drv = PICInterface.PIC_J;
221
- else if (currChr === 'T')
222
- drv = PICInterface.PIC_T;
223
- else if (currChr === 'G')
224
- drv = PICInterface.PIC_G;
225
- else if (currChr === 'S')
226
- drv = PICInterface.PIC_S;
227
- if (drv !== 0) {
228
- if (this._imeMode === -1 && useImeJpn) {
229
- if (drv === PICInterface.PIC_J || drv === PICInterface.PIC_G)
230
- this._imeMode = UtilImeJpn.IME_ZEN_HIRAGANA_ROMAN;
231
- else if (drv === PICInterface.PIC_S)
232
- this._imeMode = UtilImeJpn.IME_FORCE_OFF;
233
- }
234
- this._formatIdx++;
235
- count = this.pik_count();
236
- this.pik_drv_fill(drv, count);
237
- break;
238
- }
239
- }
240
- }
241
- if (UtilStrByteMode.isDigit(currChr)) {
242
- count = this.pik_count();
243
- this.pik_drv_fill(PICInterface.PIC_X, count);
244
- }
245
- else
246
- this.pik_mask();
247
- break;
248
- }
249
- }
250
- if (this._maskSize === 0)
251
- this.pik_drv_fill(PICInterface.PIC_X, this._mskLen);
252
- this._size = this._maskSize;
253
- if (!this._embeded)
254
- this._size -= this._maskChars;
255
- }
256
- num_prs() {
257
- let i;
258
- let j;
259
- let currChr;
260
- let count;
261
- let tmp;
262
- let tmps;
263
- let tmp_c = 0;
264
- let first = true;
265
- this._zero = ' ';
266
- this._pad = ' ';
267
- this._negPref.Append('-');
268
- for (i = 0; i < this._format.length; i = i + 1) {
269
- if (this._format[i] === '+' || this._format[i] === '-') {
270
- break;
271
- }
272
- if (this._format[i] === '\\' || this._format[i] === 'P') {
273
- i = i + 1;
274
- }
275
- if (this._format[i] === 'C') {
276
- this._comma = true;
277
- }
278
- }
279
- while (this._formatIdx < this._format.length) {
280
- currChr = this._format[this._formatIdx];
281
- switch (currChr) {
282
- case 'N':
283
- this._formatIdx++;
284
- this._negative = true;
285
- break;
286
- case 'C':
287
- this._formatIdx++;
288
- this._comma = true;
289
- break;
290
- case 'L':
291
- this._formatIdx++;
292
- this._left = true;
293
- break;
294
- case 'P':
295
- this._formatIdx++;
296
- this._padFill = true;
297
- if (this._formatIdx < this._format.length)
298
- this._pad = this._format[this._formatIdx++];
299
- break;
300
- case 'Z':
301
- this._formatIdx++;
302
- this._zeroFill = true;
303
- if (this._formatIdx < this._format.length)
304
- this._zero = this._format[this._formatIdx++];
305
- break;
306
- case 'A':
307
- this._formatIdx++;
308
- this._autoSkip_ = true;
309
- break;
310
- case '.':
311
- this._formatIdx++;
312
- if (this._needLength)
313
- this._maskLength++;
314
- this._decimal = true;
315
- if (this._maskSize < this._mskLen)
316
- this._msk[this._maskSize] = String.fromCharCode(PICInterface.PIC_N);
317
- if (this._maskSize === 0)
318
- this._decPointIsFirst = true;
319
- this._maskSize++;
320
- break;
321
- case '+':
322
- case '-':
323
- this.pik_sign();
324
- break;
325
- default:
326
- if (UtilStrByteMode.isDigit(currChr) || currChr === '#') {
327
- tmp = this._formatIdx;
328
- if (currChr === '#')
329
- this._formatIdx++;
330
- count = this.pik_count();
331
- this.pik_drv_fill(PICInterface.PIC_N, count);
332
- if (this._format[tmp] === '#') {
333
- if (count === 1) {
334
- tmps = this._formatIdx;
335
- this._formatIdx = tmp;
336
- tmp_c = this.pik_dup();
337
- this._formatIdx = tmps;
338
- }
339
- if (first && (tmp_c > 0 || count > 1)) {
340
- if (count > 1)
341
- tmp_c = count;
342
- if (this._comma && !this._decimal)
343
- this.pik_drv_fill(PICInterface.PIC_N, Math.floor((tmp_c - 1) / 3));
344
- first = false;
345
- }
346
- }
347
- else if (this._comma && !this._decimal)
348
- this.pik_drv_fill(PICInterface.PIC_N, Math.floor((count - 1) / 3));
349
- if (this._decimal)
350
- this._decimalDigits += count;
351
- else
352
- this._whole += count;
353
- }
354
- else
355
- this.pik_mask();
356
- break;
357
- }
358
- }
359
- this._prefLen = this._posPref.Length;
360
- this._suffLen = this._posSuff.Length;
361
- if (this._negative) {
362
- if (this._negPref.Length > this._prefLen) {
363
- this._prefLen = this._negPref.Length;
364
- }
365
- if (this._negSuff.Length > this._suffLen) {
366
- this._suffLen = this._negSuff.Length;
367
- }
368
- }
369
- if (this._whole === 0 && this._decimalDigits === 0) {
370
- count = PICInterface.PIC_MAX_MSK_LEN - this._prefLen - this._suffLen;
371
- if (this._maskSize < count) {
372
- this._whole = count - this._maskSize;
373
- if (this._comma)
374
- this._whole -= Math.floor(this._whole / 4);
375
- this.pik_drv_fill(PICInterface.PIC_N, this._whole);
376
- }
377
- }
378
- if (this._comma) {
379
- count = Math.floor((this._whole - 1) / 3);
380
- this.pik_drv_fill(PICInterface.PIC_N, count);
381
- this._maskSize -= count;
382
- }
383
- i = this._prefLen;
384
- if (i > 0 && this._msk != null) {
385
- if ((this._maskSize + i) <= this._mskLen) {
386
- for (j = this._maskSize - 1; j >= 0; j--)
387
- this._msk[j + i] = this._msk[j];
388
- for (j = 0; j < i; j++)
389
- if (this._msk != null && j < this._msk.length)
390
- this._msk[j] = String.fromCharCode(PICInterface.PIC_N);
391
- }
392
- this._maskSize += i;
393
- }
394
- i = this._suffLen;
395
- if (i > 0 && this._msk != null) {
396
- if (this._maskSize + this._suffLen <= this._mskLen)
397
- for (j = 0; j < this._suffLen; j++)
398
- this._msk[this._maskSize + j] = String.fromCharCode(PICInterface.PIC_N);
399
- this._maskSize += i;
400
- }
401
- }
402
- getUnformattedNumericPic() {
403
- let picStr = '';
404
- if (this.isNegative())
405
- picStr = this.isNegative() ? 'N' : '';
406
- picStr += this.getWholes().toString();
407
- if (this.getDec() > 0)
408
- picStr += '.' + this.getDec().toString();
409
- let newPic = new PIC(picStr, StorageAttribute.NUMERIC, 0);
410
- return newPic;
411
- }
412
- date_prs(compIdx) {
413
- let i;
414
- let ocr;
415
- let count;
416
- let drv = 0;
417
- let SwitchAndExpandDate = false;
418
- let SWExpandDateChecked = false;
419
- let currChr;
420
- let isJpnEraYear = false;
421
- this._zero = ' ';
422
- ocr = 0;
423
- if (this._format.length === 0 || this._format[0] === '\0')
424
- this._format = NString.ToCharArray(PIC.getDefaultDateMask(GuiEnvironment.Environment.GetDateMode(compIdx)));
425
- for (let j = 0; j < this._format.length; j++)
426
- if (this._format[j] === 'H')
427
- this.setHebrew();
428
- while (this._formatIdx < this._format.length) {
429
- currChr = this._format[this._formatIdx];
430
- switch (currChr) {
431
- case 'H':
432
- this._formatIdx++;
433
- break;
434
- case 'Z':
435
- this._formatIdx++;
436
- this._zeroFill = true;
437
- if (this._formatIdx < this._format.length)
438
- this._zero = this._format[this._formatIdx++];
439
- break;
440
- case 'T':
441
- this._formatIdx++;
442
- this._trim = true;
443
- break;
444
- case 'A':
445
- this._formatIdx++;
446
- this._autoSkip_ = true;
447
- break;
448
- case 'L':
449
- if (this.hebrew) {
450
- this._formatIdx++;
451
- this.pik_drv_fill(PICInterface.PIC_HL, 1);
452
- }
453
- else
454
- this.pik_mask();
455
- break;
456
- case 'Y':
457
- count = this.pik_dup();
458
- drv = 0;
459
- i = count;
460
- switch (count) {
461
- case 1:
462
- break;
463
- case 2:
464
- if (!this.hebrew)
465
- drv = PICInterface.PIC_YY;
466
- break;
467
- case 4:
468
- if (!this.hebrew)
469
- drv = PICInterface.PIC_YYYY;
470
- else
471
- drv = PICInterface.PIC_HYYYYY;
472
- break;
473
- case 5:
474
- case 6:
475
- if (this.hebrew)
476
- drv = PICInterface.PIC_HYYYYY;
477
- break;
478
- }
479
- if (drv !== 0) {
480
- this._formatIdx += count;
481
- this.pik_drv_fill(drv, i);
482
- }
483
- else
484
- this.pik_mask();
485
- break;
486
- case 'M':
487
- count = this.pik_dup();
488
- drv = 0;
489
- if (count === 2)
490
- drv = PICInterface.PIC_MMD;
491
- else if (count > 2) {
492
- drv = PICInterface.PIC_MMM;
493
- if (count > 10)
494
- drv = 0;
495
- }
496
- if (drv !== 0) {
497
- this._formatIdx += count;
498
- this.pik_drv_fill(drv, count);
499
- }
500
- else
501
- this.pik_mask();
502
- break;
503
- case 'D':
504
- count = this.pik_dup();
505
- drv = 0;
506
- switch (count) {
507
- case 2:
508
- if (!this.hebrew) {
509
- drv = PICInterface.PIC_DD;
510
- break;
511
- }
512
- case 3:
513
- if (!this.hebrew)
514
- drv = PICInterface.PIC_DDD;
515
- else
516
- drv = PICInterface.PIC_HDD;
517
- break;
518
- case 4:
519
- if (!this.hebrew)
520
- drv = PICInterface.PIC_DDDD;
521
- else
522
- this.pik_mask();
523
- break;
524
- default:
525
- this.pik_mask();
526
- break;
527
- }
528
- if (drv !== 0) {
529
- this.pik_drv_fill(drv, count);
530
- this._formatIdx += count;
531
- }
532
- break;
533
- case '#':
534
- count = this.pik_dup();
535
- if (count === 2) {
536
- drv = 0;
537
- ocr++;
538
- if (!this.hebrew)
539
- switch (GuiEnvironment.Environment.GetDateMode(compIdx)) {
540
- case 'B':
541
- case 'E':
542
- switch (ocr) {
543
- case 1:
544
- drv = PICInterface.PIC_DD;
545
- break;
546
- case 2:
547
- drv = PICInterface.PIC_MMD;
548
- break;
549
- case 3:
550
- drv = PICInterface.PIC_YY;
551
- break;
552
- }
553
- break;
554
- case 'A':
555
- switch (ocr) {
556
- case 1:
557
- drv = PICInterface.PIC_MMD;
558
- break;
559
- case 2:
560
- drv = PICInterface.PIC_DD;
561
- break;
562
- case 3:
563
- drv = PICInterface.PIC_YY;
564
- break;
565
- }
566
- break;
567
- case 'J':
568
- case 'S':
569
- switch (ocr) {
570
- case 1:
571
- if (!SWExpandDateChecked) {
572
- SwitchAndExpandDate = NString.FromChars(this._format).indexOf("####") > -1;
573
- SWExpandDateChecked = true;
574
- }
575
- if (SwitchAndExpandDate)
576
- this.pik_drv_fill(PICInterface.PIC_YYYY, 4);
577
- else
578
- drv = PICInterface.PIC_YY;
579
- break;
580
- case 2:
581
- drv = PICInterface.PIC_MMD;
582
- break;
583
- case 3:
584
- drv = PICInterface.PIC_DD;
585
- break;
586
- }
587
- break;
588
- }
589
- if (drv !== 0)
590
- this.pik_drv_fill(drv, 2);
591
- }
592
- else if (count === 4) {
593
- drv = 0;
594
- ocr++;
595
- if (!this.hebrew)
596
- switch (GuiEnvironment.Environment.GetDateMode(compIdx)) {
597
- case 'B':
598
- case 'E':
599
- case 'A':
600
- if (ocr === 3)
601
- drv = PICInterface.PIC_YYYY;
602
- break;
603
- case 'J':
604
- case 'S':
605
- if (ocr === 1)
606
- drv = PICInterface.PIC_YYYY;
607
- else {
608
- if (!SWExpandDateChecked) {
609
- SwitchAndExpandDate = NString.FromChars(this._format).indexOf("####") > -1;
610
- SWExpandDateChecked = true;
611
- }
612
- if (SwitchAndExpandDate && ocr === 3)
613
- this.pik_drv_fill(PICInterface.PIC_DD, 2);
614
- }
615
- break;
616
- }
617
- if (drv !== 0)
618
- this.pik_drv_fill(drv, 4);
619
- }
620
- this._formatIdx += count;
621
- break;
622
- case 'W':
623
- count = this.pik_dup();
624
- i = count;
625
- if (count === 1)
626
- drv = PICInterface.PIC_W;
627
- else if (this.hebrew)
628
- if (count === 5)
629
- drv = PICInterface.PIC_WWW;
630
- else
631
- i = 0;
632
- else if (count > 2 && count <= 10)
633
- drv = PICInterface.PIC_WWW;
634
- else
635
- i = 0;
636
- this._formatIdx += count;
637
- this.pik_drv_fill(drv, i);
638
- break;
639
- case '/':
640
- this._formatIdx++;
641
- this.pik_drv_fill(GuiEnvironment.Environment.GetDate().charCodeAt(0), 1);
642
- break;
643
- case 'S':
644
- if (UtilStrByteMode.isLocaleDefLangJPN()) {
645
- count = this.pik_dup();
646
- i = count;
647
- if (count !== 2 && count !== 4 && count !== 6)
648
- i = 0;
649
- drv = PICInterface.PIC_BB;
650
- this._formatIdx += count;
651
- this.pik_drv_fill(drv, i);
652
- }
653
- else {
654
- this.pik_mask();
655
- }
656
- break;
657
- case 'J':
658
- if (UtilStrByteMode.isLocaleDefLangJPN()) {
659
- count = this.pik_dup();
660
- i = count;
661
- isJpnEraYear = true;
662
- switch (count) {
663
- case 1:
664
- drv = PICInterface.PIC_JY1;
665
- break;
666
- case 2:
667
- drv = PICInterface.PIC_JY2;
668
- break;
669
- case 4:
670
- drv = PICInterface.PIC_JY4;
671
- break;
672
- default:
673
- i = 0;
674
- isJpnEraYear = false;
675
- break;
676
- }
677
- this._formatIdx += count;
678
- this.pik_drv_fill(drv, i);
679
- }
680
- else {
681
- this.pik_mask();
682
- }
683
- break;
684
- default:
685
- this.pik_mask();
686
- break;
687
- }
688
- }
689
- if (!this._needLength && isJpnEraYear) {
690
- for (i = 0; i < this._msk.length; i++) {
691
- if (this._msk[i].charCodeAt(0) === PICInterface.PIC_YY)
692
- this._msk[i] = String.fromCharCode(PICInterface.PIC_YJ);
693
- else if (this._msk[i].charCodeAt(0) === PICInterface.PIC_YYYY)
694
- this._msk[i] = 'Y';
695
- }
696
- }
697
- }
698
- time_prs() {
699
- let drv;
700
- let NoFormat;
701
- let currChr;
702
- this._zero = ' ';
703
- if (this._format.length === 0 || this._format[0].charCodeAt(0) === 0) {
704
- NoFormat = "HH:MM:SS";
705
- if (this._mskLen < 8)
706
- NoFormat = NoFormat.substr(0, this._mskLen);
707
- this._format = NString.ToCharArray(NoFormat);
708
- }
709
- while (this._formatIdx < this._format.length) {
710
- currChr = this._format[this._formatIdx];
711
- let maskLength;
712
- switch (currChr) {
713
- case 'H':
714
- case 'M':
715
- case 'S':
716
- maskLength = 2;
717
- if (this._formatIdx + 1 < this._format.length && this._format[this._formatIdx] === this._format[this._formatIdx + 1]) {
718
- switch (currChr) {
719
- case 'H':
720
- drv = PICInterface.PIC_HH;
721
- break;
722
- case 'M':
723
- drv = PICInterface.PIC_MMT;
724
- break;
725
- case 'S':
726
- drv = PICInterface.PIC_SS;
727
- break;
728
- default:
729
- drv = PICInterface.NULL_CHAR;
730
- break;
731
- }
732
- this._formatIdx += maskLength;
733
- this.pik_drv_fill(drv, maskLength);
734
- }
735
- else
736
- this.pik_mask();
737
- break;
738
- case 'm':
739
- maskLength = 3;
740
- if (this._formatIdx + 2 < this._format.length &&
741
- (this._format[this._formatIdx] === this._format[this._formatIdx + 1] &&
742
- this._format[this._formatIdx + 1] === this._format[this._formatIdx + 2])) {
743
- drv = PICInterface.PIC_MS;
744
- this._formatIdx += maskLength;
745
- this.pik_drv_fill(drv, maskLength);
746
- }
747
- else
748
- this.pik_mask();
749
- break;
750
- case ':':
751
- this._formatIdx++;
752
- this.pik_drv_fill(GuiEnvironment.Environment.GetTime().charCodeAt(0), 1);
753
- break;
754
- case 'Z':
755
- this._formatIdx++;
756
- this._zeroFill = true;
757
- if (this._formatIdx < this._format.length)
758
- this._zero = this._format[this._formatIdx++];
759
- break;
760
- case 'A':
761
- this._formatIdx++;
762
- this._autoSkip_ = true;
763
- break;
764
- case 'P':
765
- if (this._format[this._formatIdx + 1] === 'M') {
766
- this._formatIdx += 2;
767
- this.pik_drv_fill(PICInterface.PIC_PM, 2);
768
- }
769
- else
770
- this.pik_mask();
771
- break;
772
- default:
773
- this.pik_mask();
774
- break;
775
- }
776
- }
777
- }
778
- static buildPicture(type, val, compIdx, useDecimal) {
779
- let pic = null;
780
- let mask = new StringBuilder(10);
781
- let decimalSeparator;
782
- let thousands;
783
- let currChar;
784
- let counter;
785
- let length;
786
- let beforeDec;
787
- let afterDec;
788
- let decimalDelimFound;
789
- let isThousandsDelim;
790
- let isNegative;
791
- switch (type) {
792
- case StorageAttribute.NUMERIC:
793
- decimalSeparator = GuiEnvironment.Environment.GetDecimal();
794
- thousands = GuiEnvironment.Environment.GetThousands();
795
- beforeDec = afterDec = 0;
796
- decimalDelimFound = false;
797
- isThousandsDelim = false;
798
- isNegative = false;
799
- if (val === null || val.length === 0)
800
- beforeDec = afterDec = 1;
801
- else {
802
- length = val.length;
803
- counter = 0;
804
- while (counter < length) {
805
- currChar = val[counter];
806
- switch (currChar) {
807
- case '+':
808
- case '-':
809
- isNegative = true;
810
- break;
811
- default:
812
- if (useDecimal && currChar === decimalSeparator)
813
- decimalDelimFound = true;
814
- else if (currChar === thousands)
815
- isThousandsDelim = true;
816
- else if (decimalDelimFound)
817
- afterDec++;
818
- else
819
- beforeDec++;
820
- break;
821
- }
822
- counter++;
823
- }
824
- mask.Append("" + beforeDec + decimalSeparator + afterDec);
825
- if (isNegative)
826
- mask.Append('N');
827
- if (isThousandsDelim)
828
- mask.Append('C');
829
- }
830
- break;
831
- case StorageAttribute.DATE:
832
- mask.Append(this.getDefaultDateMask(GuiEnvironment.Environment.GetDateMode(compIdx)));
833
- break;
834
- case StorageAttribute.TIME:
835
- mask.Append("HH" + GuiEnvironment.Environment.GetTime() + "MM" + GuiEnvironment.Environment.GetTime() + "SS");
836
- break;
837
- default:
838
- Events.WriteDevToLog("Event.buildPicture() there is no PICTURE building for type :" + type +
839
- " and value :" + val);
840
- return pic;
841
- }
842
- pic = new PIC(mask.ToString(), type, compIdx);
843
- return pic;
844
- }
845
- setHebrew() {
846
- if (GuiEnvironment.Environment.Language === 'H')
847
- this.hebrew = true;
848
- }
849
- static getDefaultDateMask(dataMode) {
850
- let frmt;
851
- switch (dataMode) {
852
- case 'J':
853
- case 'S':
854
- frmt = "####/##/##";
855
- break;
856
- case 'B':
857
- case 'E':
858
- case 'A':
859
- default:
860
- frmt = "##/##/####";
861
- break;
862
- }
863
- return frmt;
864
- }
865
- bool_prs() {
866
- let count;
867
- let currChr;
868
- while (this._formatIdx < this._format.length) {
869
- currChr = this._format[this._formatIdx];
870
- switch (currChr) {
871
- case 'H':
872
- this._formatIdx++;
873
- this.setHebrew();
874
- break;
875
- case 'A':
876
- this._formatIdx++;
877
- this._autoSkip_ = true;
878
- break;
879
- case 'X':
880
- this._formatIdx++;
881
- count = this.pik_count();
882
- this.pik_drv_fill(PICInterface.PIC_X, count);
883
- break;
884
- default:
885
- if (UtilStrByteMode.isDigit(currChr)) {
886
- count = this.pik_count();
887
- this.pik_drv_fill(PICInterface.PIC_X, count);
888
- }
889
- else
890
- this.pik_mask();
891
- break;
892
- }
893
- }
894
- if (this._maskSize === 0)
895
- this.pik_drv_fill(PICInterface.PIC_X, this._mskLen);
896
- }
897
- pik_sign() {
898
- let posSign;
899
- let signStr;
900
- let currChr;
901
- posSign = this._format[this._formatIdx] === '+'
902
- ? true
903
- : false;
904
- this._formatIdx++;
905
- if (posSign)
906
- signStr = this._posPref;
907
- else {
908
- this._negPref.Remove(0, this._negPref.Length);
909
- signStr = this._negPref;
910
- }
911
- while (this._formatIdx < this._format.length) {
912
- currChr = this._format[this._formatIdx];
913
- switch (currChr) {
914
- case ';':
915
- this._formatIdx++;
916
- return;
917
- case ',':
918
- this._formatIdx++;
919
- if (posSign)
920
- signStr = this._posSuff;
921
- else
922
- signStr = this._negSuff;
923
- break;
924
- case '\\':
925
- this._formatIdx++;
926
- if (this._formatIdx >= this._format.length)
927
- return;
928
- currChr = this._format[this._formatIdx];
929
- default:
930
- signStr.Append(currChr);
931
- this._formatIdx++;
932
- break;
933
- }
934
- }
935
- }
936
- pik_count() {
937
- let specialValNewPolicy = GuiEnvironment.Environment.GetSpecialValNewPolicy();
938
- let val;
939
- let isDigit = false;
940
- val = 0;
941
- while (this._formatIdx < this._format.length && UtilStrByteMode.isDigit(this._format[this._formatIdx])) {
942
- val *= 10;
943
- isDigit = true;
944
- val += this._format[this._formatIdx].charCodeAt(0) - '0'.charCodeAt(0);
945
- this._formatIdx++;
946
- }
947
- if (val > 32000)
948
- val = 32000;
949
- else if (val <= 0) {
950
- if (specialValNewPolicy && isDigit && val === 0)
951
- return 0;
952
- else
953
- val = 1;
954
- }
955
- if (val > Int32.MaxValue)
956
- throw new ApplicationException(Events.GetMessageString(MsgInterface.STR_ERR_MAX_VAR_SIZE));
957
- return (val);
958
- }
959
- pik_drv_fill(drv, count) {
960
- let MskZ;
961
- let i = 0;
962
- if (this._needLength) {
963
- this._maskLength += count;
964
- return;
965
- }
966
- MskZ = this._maskSize;
967
- this._maskSize += count;
968
- if (MskZ + count > this._mskLen)
969
- count = this._mskLen - MskZ;
970
- if (count > 0) {
971
- for (i = 0; i < count; i++)
972
- this._msk[MskZ + i] = String.fromCharCode(drv);
973
- return;
974
- }
975
- }
976
- pik_mask() {
977
- let currChr;
978
- let count;
979
- if (this._format[this._formatIdx] === '\\')
980
- this._formatIdx++;
981
- if (this._formatIdx < this._format.length) {
982
- currChr = this._format[this._formatIdx];
983
- this._formatIdx++;
984
- count = this.pik_count();
985
- this.pik_drv_fill(currChr.charCodeAt(0), count);
986
- this._maskChars += count;
987
- }
988
- }
989
- pik_dup() {
990
- let dupCount = 1;
991
- let c;
992
- let tmpIdx = this._formatIdx;
993
- c = this._format[tmpIdx];
994
- tmpIdx++;
995
- while (tmpIdx < this._format.length && c === this._format[tmpIdx]) {
996
- dupCount++;
997
- tmpIdx++;
998
- }
999
- return dupCount;
1000
- }
1001
- pic_kanji() {
1002
- let count;
1003
- if (this._formatIdx + 1 >= this._format.length)
1004
- return false;
1005
- if (!UtilStrByteMode.isDigit(this._format[this._formatIdx + 1]))
1006
- return false;
1007
- this._formatIdx++;
1008
- if (this._format[this._formatIdx] === '0') {
1009
- this._imeMode = UtilImeJpn.IME_FORCE_OFF;
1010
- this._formatIdx++;
1011
- }
1012
- else {
1013
- count = this.pik_count();
1014
- if (1 <= count && count <= 9)
1015
- this._imeMode = count;
1016
- }
1017
- return true;
1018
- }
1019
- getMaskLen(compIdx) {
1020
- this._needLength = true;
1021
- this._maskLength = 0;
1022
- this._formatIdx = 0;
1023
- this.prs_all(compIdx);
1024
- if (this._picAttr === StorageAttribute.NUMERIC && (this._prefLen > 0 || this._suffLen > 0))
1025
- this._maskLength += (this._prefLen + this._suffLen);
1026
- this._needLength = false;
1027
- this._formatIdx = this._maskChars = this._whole = this._decimalDigits = this._size = this._maskSize = this._prefLen = this._suffLen = 0;
1028
- this._pad = this._zero = String.fromCharCode(0);
1029
- this.hebrew = this._mixed = this._embeded = this._negative = this._comma = this._left = this._padFill = this._zeroFill = this._trim = this._autoSkip_ = this._decimal = this._termFlag = this._decPointIsFirst = false;
1030
- this._posPref.Remove(0, this._posPref.Length);
1031
- this._posSuff.Remove(0, this._posSuff.Length);
1032
- this._negPref.Remove(0, this._negPref.Length);
1033
- this._negSuff.Remove(0, this._negSuff.Length);
1034
- return this._maskLength;
1035
- }
1036
- picIsMask(pos) {
1037
- if (pos < 0 || pos >= this._maskLength)
1038
- pos = 0;
1039
- return this._msk[pos].charCodeAt(0) > PICInterface.PIC_MAX_OP;
1040
- }
1041
- getDirectiveLen(posOrMskPos, bufPos, buf) {
1042
- if (arguments.length === 1)
1043
- return this.getDirectiveLen_0(posOrMskPos);
1044
- else
1045
- return this.getDirectiveLen_1(posOrMskPos, bufPos, buf);
1046
- }
1047
- getDirectiveLen_0(pos) {
1048
- let c = this._msk[pos];
1049
- let num = pos;
1050
- while (num < this._maskSize && c === this._msk[num]) {
1051
- num = num + 1;
1052
- }
1053
- return num - pos;
1054
- }
1055
- getDirectiveLen_1(mskPos, bufPos, buf) {
1056
- let drv = this._msk[mskPos];
1057
- let currMskPos = mskPos;
1058
- let currBufPos = bufPos;
1059
- while (currMskPos < this._maskSize && drv === this._msk[currMskPos]) {
1060
- if (currBufPos < buf.length && UtilStrByteMode.isLocaleDefLangDBCS() && this.isAttrAlphaOrDate()) {
1061
- if (!UtilStrByteMode.isHalfWidth(buf[currBufPos++]))
1062
- currMskPos++;
1063
- }
1064
- currMskPos++;
1065
- }
1066
- return (currMskPos - mskPos);
1067
- }
1068
- validateChar(charToValidate, pos) {
1069
- let charReturned = charToValidate;
1070
- if (pos >= this.getMaskSize())
1071
- return charReturned;
1072
- while (this.picIsMask(pos))
1073
- pos++;
1074
- switch (this._msk[pos].charCodeAt(0)) {
1075
- case PICInterface.PIC_U:
1076
- charReturned = charToValidate.toUpperCase();
1077
- break;
1078
- case PICInterface.PIC_L:
1079
- charReturned = charToValidate.toLowerCase();
1080
- default:
1081
- if (!UtilStrByteMode.isDigit(charToValidate))
1082
- for (let i = 0; i < PICInterface.NumDirective.length; i++)
1083
- if (this._msk[pos].charCodeAt(0) === PICInterface.NumDirective[i]) {
1084
- charReturned = this.isValidInNum(charToValidate);
1085
- break;
1086
- }
1087
- break;
1088
- }
1089
- return charReturned;
1090
- }
1091
- isValidInNum(letter) {
1092
- let charRet = '\0';
1093
- let decimalChar = GuiEnvironment.Environment.GetDecimal();
1094
- if (GuiEnvironment.Environment.CanReplaceDecimalSeparator() && this.isAttrNumeric())
1095
- if (letter === '.')
1096
- letter = decimalChar;
1097
- switch (letter) {
1098
- case ' ':
1099
- case '-':
1100
- case '*':
1101
- case '+':
1102
- case '/':
1103
- charRet = letter;
1104
- break;
1105
- default:
1106
- if (letter === decimalChar || letter === GuiEnvironment.Environment.GetThousands())
1107
- charRet = letter;
1108
- break;
1109
- }
1110
- return charRet;
1111
- }
1112
- isAttrLogical() {
1113
- return (this._picAttr === StorageAttribute.BOOLEAN);
1114
- }
1115
- isAttrNumeric() {
1116
- return (this._picAttr === StorageAttribute.NUMERIC);
1117
- }
1118
- isAttrAlpha() {
1119
- return (this._picAttr === StorageAttribute.ALPHA);
1120
- }
1121
- isAttrUnicode() {
1122
- return (this._picAttr === StorageAttribute.UNICODE);
1123
- }
1124
- isAttrAlphaOrDate() {
1125
- return (this._picAttr === StorageAttribute.ALPHA || this._picAttr === StorageAttribute.DATE);
1126
- }
1127
- isAttrDateOrTime() {
1128
- return (this._picAttr === StorageAttribute.TIME || this._picAttr === StorageAttribute.DATE);
1129
- }
1130
- isAttrBlob() {
1131
- return (this._picAttr === StorageAttribute.BLOB ||
1132
- this._picAttr === StorageAttribute.BLOB_VECTOR);
1133
- }
1134
- isNumeric(pos) {
1135
- return this._msk[pos] === String.fromCharCode(PICInterface.PIC_N);
1136
- }
1137
- isAllX() {
1138
- return (this._msk[0] === String.fromCharCode(PICInterface.PIC_X) && this.getDirectiveLen(0) === this._maskSize);
1139
- }
1140
- isMaskPicEq(pos, maskPic) {
1141
- return this._msk[pos] === String.fromCharCode(maskPic);
1142
- }
1143
- isValidChar_as400(charToValidate, firstChar, pos) {
1144
- let ret = true;
1145
- switch (this._msk[pos].charCodeAt(0)) {
1146
- case PICInterface.PIC_J:
1147
- case PICInterface.PIC_G:
1148
- ret = !UtilStrByteMode.isHalfWidth(charToValidate);
1149
- break;
1150
- case (PICInterface.PIC_T):
1151
- if (firstChar === '\x0000')
1152
- ret = true;
1153
- else if (UtilStrByteMode.isHalfWidth(firstChar))
1154
- ret = UtilStrByteMode.isHalfWidth(charToValidate);
1155
- else
1156
- ret = !UtilStrByteMode.isHalfWidth(charToValidate);
1157
- break;
1158
- case (PICInterface.PIC_S):
1159
- ret = UtilStrByteMode.isHalfWidth(charToValidate);
1160
- break;
1161
- default:
1162
- break;
1163
- }
1164
- return ret;
1165
- }
1166
- getMinimumValueLength() {
1167
- let minLength = this.getMaskLength();
1168
- while (minLength > 0 && !this.picIsMask(minLength - 1))
1169
- minLength--;
1170
- return minLength;
1171
- }
1172
- toString() {
1173
- return "{Picture: " + this._format + "}";
1174
- }
1175
- }
1176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUElDLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9QSUMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBUXRELE1BQU0sT0FBTyxHQUFHO0lBaURkLFlBQVksTUFBYyxFQUFFLElBQXNCLEVBQUUsT0FBZTtRQTdDM0QsWUFBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixhQUFRLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFDOUMsYUFBUSxHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQzlDLGFBQVEsR0FBcUIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1FBQ25ELGFBQVEsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUM5QyxhQUFRLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFDOUMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUMzQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIs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Y0FBYyxDQUFDLENBQUM7O29CQUVsRCxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBRVIsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLEdBQUcsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNO1lBRVI7Z0JBQ0UsTUFBTTtTQUNUO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBS0QscUJBQXFCO1FBQ25CLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUdyQyxPQUFPLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDcEQsU0FBUyxFQUFFLENBQUM7UUFFZCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1zZ0ludGVyZmFjZSwgUElDSW50ZXJmYWNlLCBTdG9yYWdlQXR0cmlidXRlLCBVdGlsSW1lSnBuLCBVdGlsU3RyQnl0ZU1vZGUgfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHsgQXBwbGljYXRpb25FeGNlcHRpb24sIEludDMyLCBOU3RyaW5nLCBTdHJpbmdCdWlsZGVyIH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBHdWlFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL0d1aUVudmlyb25tZW50JztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgVGhlIGNsYXNzIGhhbmRsZXMgdGhlIHByb2Nlc3Mgb2YgY29udmVydGluZyBpbnRlcm5hbCBkYXRhIHRvIGRpc3BsYXllZCBkYXRhXHJcbi8vLyAgIGJ5IHVzaW5nIGEgc3BlY2lmaWMgZm9ybWF0LlxyXG4vLy8gICBUaGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgUElDIHN0cnVjdHVyZSBvZiBNYWdpYywgYW5kIGFsbCBpdHMgcmVsYXRlZCBvcGVyYXRpb25zLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgUElDIHtcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIE9yaWdpbmFsIG1lbWJlcnMgb2YgdGhlIE1hZ2ljIFBJQyBzdHJ1Y3R1cmVcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIHByaXZhdGUgX21za0xlbjogbnVtYmVyID0gMDsgLy8gVGhlIG1hc2sgbGVuXHJcbiAgcHJpdmF0ZSBfbmVnUHJlZjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgcHJpdmF0ZSBfbmVnU3VmZjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgcHJpdmF0ZSBfcGljQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICBwcml2YXRlIF9wb3NQcmVmOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICBwcml2YXRlIF9wb3NTdWZmOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICBwcml2YXRlIF9hdXRvU2tpcF86IGJvb2xlYW4gPSBmYWxzZTsgIC8vIEF1dG9za2lwID9cclxuICBwcml2YXRlIF9wYWRGaWxsOiBib29sZWFuID0gZmFsc2U7IC8vIFBhZCBmaWxsID9cclxuICBwcml2YXRlIF96ZXJvRmlsbDogYm9vbGVhbiA9IGZhbHNlOyAgLy8gWmVybyBmaWxsID9cclxuICBwcml2YXRlIF9jb21tYTogYm9vbGVhbiA9IGZhbHNlOyAvLyBEaXNwbGF5IG51bWJlcnMgd2l0aCBjb21tYXMgP1xyXG4gIHByaXZhdGUgX2RlY2ltYWxEaWdpdHM6IG51bWJlciA9IDA7IC8vIERlY2ltYWwgZGlnaXRzXHJcbiAgcHJpdmF0ZSBfZGVjUG9pbnRJc0ZpcnN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZGVjaW1hbDogYm9vbGVhbiA9IGZhbHNlOyAvLyBEZWNpbWFscyA/XHJcbiAgcHJpdmF0ZSBfZW1iZWRlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBFbWJlZGVkIGNoYXJhY3RlcnMgP1xyXG4gIHByaXZhdGUgX2Zvcm1hdElkeDogbnVtYmVyID0gMDsgLy8gQ3VycmVudCBjaGFyIHByb2Nlc3NlZCBpbiBmb3JtYXRfO1xyXG4gIHByaXZhdGUgX2Zvcm1hdDogc3RyaW5nW10gPSBudWxsOyAvLyBUaGUgZm9ybWF0IHByb2Nlc3NlZFxyXG4gIHByaXZhdGUgaGVicmV3OiBib29sZWFuID0gZmFsc2U7IC8vIEhlYnJldyA/XHJcbiAgcHJpdmF0ZSBfaW1lTW9kZTogbnVtYmVyID0gLTE7IC8vIEpQTjogSU1FIHN1cHBvcnRcclxuICBwcml2YXRlIF9sZWZ0OiBib29sZWFuID0gZmFsc2U7IC8vIExlZnQganVzdGlmaWVkID9cclxuICBwcml2YXRlIF9tYXNrTGVuZ3RoOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX21hc2tDaGFyczogbnVtYmVyID0gMDsgLy8gTWFzayBjaGFycyBjb3VudFxyXG4gIHByaXZhdGUgX21hc2tTaXplOiBudW1iZXIgPSAwOyAvLyBTaXplIG9mIHBpY3R1cmUgaS9vIG1hc2tcclxuICBwcml2YXRlIF9taXhlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBNaXhlZCBsYW5ndWFnZSA/XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQWRkZWQgdmFyaWFibGVzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwcml2YXRlIF9tc2s6IHN0cmluZ1tdID0gbnVsbDsgLy8gVGhlIG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgcGljdHVyZSBmb3JtYXRcclxuICBwcml2YXRlIF9uZWVkTGVuZ3RoOiBib29sZWFuID0gZmFsc2U7IC8vIGdldCBsZW5ndGggb2YgdGhlIHBpY3R1cmUgYWZ0ZXIgcGFyc2luZ1xyXG4gIHByaXZhdGUgX25lZ2F0aXZlOiBib29sZWFuID0gZmFsc2U7IC8vIE5lZ2F0aXZlIHZhbHVlcyBhbGxvd2VkID9cclxuICBwcml2YXRlIF9wYWQ6IHN0cmluZyA9ICdcXDAnOyAvLyBQYWQgY2hhcmFjdGVyXHJcbiAgcHJpdmF0ZSBfcHJlZkxlbjogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9zaXplOiBudW1iZXIgPSAwOyAvLyBTaXplIG9mIEFscGhhIGRhdGEgIHdpdGhvdXQgbWFzayBjaGFyYWN0ZXJzXHJcbiAgcHJpdmF0ZSBfc3VmZkxlbjogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF90ZXJtRmxhZzogYm9vbGVhbiA9IGZhbHNlOyAvLyBhcmUgdGVybWluYXRvcnMgc3BlY2lmaWVkID9cclxuICBwcml2YXRlIF90cmltOiBib29sZWFuID0gZmFsc2U7IC8vIFRyaW0gP1xyXG4gIHByaXZhdGUgX3dob2xlOiBudW1iZXIgPSAwOyAvLyBXaG9sZSBkaWdpdHNcclxuICBwcml2YXRlIF96ZXJvOiBzdHJpbmcgPSAnXFwwJzsgLy8gWmVybyBjaGFyYWN0ZXJcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZHMgYSBQSUMgY2xhc3MgZnJvbSBwaWN0dXJlIGZvcm1hdCBhbmQgYXR0cmlidXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPlRoZSBwaWN0dXJlIGZvcm1hdCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXR0clwiPlRoZSBkYXRhIGF0dHJpYnV0ZSAoTi9BL0QvVC8uLi4pPC9wYXJhbT5cclxuICBjb25zdHJ1Y3RvcihwaWNTdHI6IHN0cmluZywgYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgY29tcElkeDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9waWNBdHRyID0gYXR0cjtcclxuXHJcbiAgICBpZiAodGhpcy5fcGljQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8XHJcbiAgICAgIHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgaWYgKHBpY1N0ci50cmltKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKFwiUElDLlBJQyB0aGUgcGljdHVyZSBvZiBCTE9CIG11c3QgYmUgZW1wdHkgc3RyaW5nXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9mb3JtYXQgPSBOU3RyaW5nLlRvQ2hhckFycmF5KHBpY1N0cik7XHJcbiAgICB0aGlzLl9mb3JtYXRJZHggPSAwO1xyXG5cclxuICAgIHRoaXMuX21za0xlbiA9IHRoaXMuZ2V0TWFza0xlbihjb21wSWR4KTtcclxuICAgIHRoaXMucHJzX2FsbChjb21wSWR4KTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCBpbmZvcm1hdGlvbiBtZXRob2RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzSGVicmV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVicmV3O1xyXG4gIH1cclxuXHJcbiAgaXNNaXhlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9taXhlZDtcclxuICB9XHJcblxyXG4gIGVtYmVkZWRDaGFycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbWJlZGVkO1xyXG4gIH1cclxuXHJcbiAgaXNOZWdhdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9uZWdhdGl2ZTtcclxuICB9XHJcblxyXG4gIHdpdGhDb21hKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbW1hO1xyXG4gIH1cclxuXHJcbiAgaXNMZWZ0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xlZnQ7XHJcbiAgfVxyXG5cclxuICBwYWRGaWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZEZpbGw7XHJcbiAgfVxyXG5cclxuICBnZXRQYWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWQ7XHJcbiAgfVxyXG5cclxuICB6ZXJvRmlsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl96ZXJvRmlsbDtcclxuICB9XHJcblxyXG4gIGdldFplcm9QYWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl96ZXJvO1xyXG4gIH1cclxuXHJcbiAgaXNUcmltZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJpbTtcclxuICB9XHJcblxyXG4gIGF1dG9Ta2lwKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Ta2lwXztcclxuICB9XHJcblxyXG4gIHdpdGhEZWNpbWFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY2ltYWw7XHJcbiAgfVxyXG5cclxuICB3aXRoVGVybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90ZXJtRmxhZztcclxuICB9XHJcblxyXG4gIGdldE1hc2tDaGFycygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21hc2tDaGFycztcclxuICB9XHJcblxyXG4gIGdldFdob2xlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dob2xlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVjKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVjaW1hbERpZ2l0cztcclxuICB9XHJcblxyXG4gIGdldFNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zaXplO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFza1NpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXNrU2l6ZTtcclxuICB9XHJcblxyXG4gIGdldE1hc2tMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXNrTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZGVjSW5GaXJzdFBvcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNQb2ludElzRmlyc3Q7XHJcbiAgfVxyXG5cclxuICBnZXRQb3NQcmVmXygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Bvc1ByZWYuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIGdldFBvc1N1ZmZfKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcG9zU3VmZi5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TmVnUHJlZl8oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9uZWdQcmVmLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBnZXROZWdTdWZmXygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX25lZ1N1ZmYuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIGdldE1hc2soKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyh0aGlzLl9tc2spO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fZm9ybWF0KTtcclxuICB9XHJcblxyXG4gIGdldEF0dHIoKTogU3RvcmFnZUF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGljQXR0cjtcclxuICB9XHJcblxyXG5cclxuICBzZXRBdHRyKHNldDpTdG9yYWdlQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9waWNBdHRyID09IHNldDtcclxuICB9XHJcblxyXG4gIGdldEltZU1vZGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pbWVNb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBhcnNlIHRoZSBwaWN0dXJlIGZvcm1hdCBieSB0aGUgYXR0cmlidXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHByc19hbGwoY29tcElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX25lZWRMZW5ndGgpIHtcclxuICAgICAgdGhpcy5fbXNrID0gbmV3IEFycmF5PHN0cmluZz4odGhpcy5fbXNrTGVuKTtcclxuICAgICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCB0aGlzLl9tc2subGVuZ3RoOyArK19haSlcclxuICAgICAgICB0aGlzLl9tc2tbX2FpXSA9ICdcXDAnO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoICh0aGlzLl9waWNBdHRyKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgdGhpcy5hbHBoYV9wcnMoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIHRoaXMubnVtX3BycygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgdGhpcy5kYXRlX3Bycyhjb21wSWR4KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHRoaXMudGltZV9wcnMoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHRoaXMuYm9vbF9wcnMoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICAvLyBkbyBub3RoaW5nXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQYXJzZSBhbiBhbHBoYSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhbHBoYV9wcnMoKTogdm9pZCB7XHJcbiAgICBsZXQgY3VyckNocjogc3RyaW5nO1xyXG4gICAgbGV0IGRydjogbnVtYmVyO1xyXG4gICAgbGV0IGNvdW50OiBudW1iZXI7XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdO1xyXG4gICAgICBzd2l0Y2ggKGN1cnJDaHIpIHtcclxuICAgICAgICBjYXNlICdIJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5zZXRIZWJyZXcoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgIHRoaXMuX2F1dG9Ta2lwXyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICcjJzpcclxuICAgICAgICBjYXNlICdMJzpcclxuICAgICAgICBjYXNlICdVJzpcclxuICAgICAgICBjYXNlICdYJzpcclxuICAgICAgICAgIGRydiA9IDA7XHJcbiAgICAgICAgICBzd2l0Y2ggKGN1cnJDaHIpIHtcclxuICAgICAgICAgICAgY2FzZSAnIyc6XHJcbiAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19OO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnTCc6XHJcbiAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19MO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnVSc6XHJcbiAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19VO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnWCc6XHJcbiAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19YO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2NvdW50KCk7XHJcbiAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIGNvdW50KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIC8vIEpQTjogREJDUyBzdXBwb3J0XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIEpQTjogSU1FIHN1cHBvcnRcclxuICAgICAgICAgICAgbGV0IHVzZUltZUpwbjogYm9vbGVhbiA9IFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKTtcclxuICAgICAgICAgICAgaWYgKGN1cnJDaHIgPT09ICdLJyAmJiB1c2VJbWVKcG4pIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5waWNfa2FuamkoKSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0TG9jYWxBczQwMFNldCgpKSB7XHJcbiAgICAgICAgICAgICAgZHJ2ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGN1cnJDaHIgPT09ICdKJylcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfSjtcclxuICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyQ2hyID09PSAnVCcpXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1Q7XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyckNociA9PT0gJ0cnKVxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19HO1xyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJDaHIgPT09ICdTJylcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfUztcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGRydiAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSlBOOiBJTUUgc3VwcG9ydFxyXG4gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIElNRSBtb2RlIGZyb20gQVMvNDAwIHBpY3R1cmVzIGlmIEthbmppIHBhcmFtZXRlciBpc24ndCBzcGVjaWZpZWQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faW1lTW9kZSA9PT0gLTEgJiYgdXNlSW1lSnBuKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChkcnYgPT09IFBJQ0ludGVyZmFjZS5QSUNfSiB8fCBkcnYgPT09IFBJQ0ludGVyZmFjZS5QSUNfRylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbWVNb2RlID0gVXRpbEltZUpwbi5JTUVfWkVOX0hJUkFHQU5BX1JPTUFOO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGlmIChkcnYgPT09IFBJQ0ludGVyZmFjZS5QSUNfUylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbWVNb2RlID0gVXRpbEltZUpwbi5JTUVfRk9SQ0VfT0ZGO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2NvdW50KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIGNvdW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChjdXJyQ2hyKSkge1xyXG4gICAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2NvdW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfWCwgY291bnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEluIGNhc2UgdGhhdCBubyBwaWN0dXJlIGlzIHNwZWNpZmllZCwgYXNzdW1lIGFsbCBpcyBYc1xyXG4gICAgaWYgKHRoaXMuX21hc2tTaXplID09PSAwKVxyXG4gICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX1gsIHRoaXMuX21za0xlbik7XHJcblxyXG4gICAgLy8gQ29tcHV0ZSBtYXNrIHNpemUgd2l0aG91dCB0aGUgbWFzayBjaGFyYWN0ZXJzXHJcbiAgICB0aGlzLl9zaXplID0gdGhpcy5fbWFza1NpemU7XHJcbiAgICBpZiAoIXRoaXMuX2VtYmVkZWQpXHJcbiAgICAgIHRoaXMuX3NpemUgLT0gdGhpcy5fbWFza0NoYXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBhcnNlIGEgbnVtZXJpYyBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBudW1fcHJzKCk6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBsZXQgY3VyckNocjogc3RyaW5nO1xyXG4gICAgbGV0IGNvdW50OiBudW1iZXI7XHJcbiAgICBsZXQgdG1wOiBudW1iZXI7XHJcbiAgICBsZXQgdG1wczogbnVtYmVyO1xyXG4gICAgbGV0IHRtcF9jOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgdGhpcy5femVybyA9ICcgJy8qJyAnKi87XHJcbiAgICB0aGlzLl9wYWQgPSAnICcvKicgJyovO1xyXG4gICAgdGhpcy5fbmVnUHJlZi5BcHBlbmQoJy0nKS8qJy0nKi87XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Zvcm1hdC5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAodGhpcy5fZm9ybWF0W2ldID09PSAnKycgLyonKycqLyB8fCB0aGlzLl9mb3JtYXRbaV0gPT09ICctJy8qJy0nKi8pIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fZm9ybWF0W2ldID09PSAnXFxcXCcgLyonXFwnKi8gfHwgdGhpcy5fZm9ybWF0W2ldID09PSAnUCcvKidQJyovKSB7XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9mb3JtYXRbaV0gPT09ICdDJy8qJ0MnKi8pIHtcclxuICAgICAgICB0aGlzLl9jb21tYSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAodGhpcy5fZm9ybWF0SWR4IDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCkge1xyXG4gICAgICBjdXJyQ2hyID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeF07XHJcbiAgICAgIHN3aXRjaCAoY3VyckNocikge1xyXG4gICAgICAgIGNhc2UgJ04nOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLl9uZWdhdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnQyc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX2NvbW1hID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdMJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5fbGVmdCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnUCc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX3BhZEZpbGwgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX3BhZCA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHgrK107XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnWic6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX3plcm9GaWxsID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLl96ZXJvID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCsrXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5fYXV0b1NraXBfID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICcuJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX25lZWRMZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX21hc2tMZW5ndGgrKztcclxuICAgICAgICAgIHRoaXMuX2RlY2ltYWwgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX21hc2tTaXplIDwgdGhpcy5fbXNrTGVuKVxyXG4gICAgICAgICAgICB0aGlzLl9tc2tbdGhpcy5fbWFza1NpemVdID0gIFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19OKTtcclxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgICAvLyAyNi8xMS85NyBTaGF5IFouIEJ1ZyAjNzcwNTI2IC0gTWFyayB0aGF0XHJcbiAgICAgICAgICAvLyBEZWNpbWFsIFBvaW50IGlzIGluIEZpcnN0IFBvc2l0aW9uOlxyXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2l6ZSA9PT0gMClcclxuICAgICAgICAgICAgdGhpcy5fZGVjUG9pbnRJc0ZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX21hc2tTaXplKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnKyc6XHJcbiAgICAgICAgY2FzZSAnLSc6XHJcbiAgICAgICAgICB0aGlzLnBpa19zaWduKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChjdXJyQ2hyKSB8fCBjdXJyQ2hyID09PSAnIycpIHtcclxuICAgICAgICAgICAgdG1wID0gdGhpcy5fZm9ybWF0SWR4O1xyXG4gICAgICAgICAgICBpZiAoY3VyckNociA9PT0gJyMnKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2NvdW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfTiwgY291bnQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZm9ybWF0W3RtcF0gPT09ICcjJykge1xyXG4gICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdG1wcyA9IHRoaXMuX2Zvcm1hdElkeDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCA9IHRtcDtcclxuICAgICAgICAgICAgICAgIHRtcF9jID0gdGhpcy5waWtfZHVwKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHggPSB0bXBzO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZmlyc3QgJiYgKHRtcF9jID4gMCB8fCBjb3VudCA+IDEpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAxKVxyXG4gICAgICAgICAgICAgICAgICB0bXBfYyA9IGNvdW50O1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIGNvbW1hcyBiZWZvciBwbGFjZXNcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb21tYSAmJiAhdGhpcy5fZGVjaW1hbClcclxuICAgICAgICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19OLCBNYXRoLmZsb29yKCh0bXBfYyAtIDEpIC8gMykpO1xyXG4gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gYWRkIGNvbW1hcyBiZWZvciBwbGFjZXNcclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fY29tbWEgJiYgIXRoaXMuX2RlY2ltYWwpXHJcbiAgICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19OLCBNYXRoLmZsb29yKChjb3VudCAtIDEpIC8gMykpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlY2ltYWwpXHJcbiAgICAgICAgICAgICAgdGhpcy5fZGVjaW1hbERpZ2l0cyArPSBjb3VudDtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX3dob2xlICs9IGNvdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuLy8gU3RvcmUgdGhlIG1heGltYWwgbGVuZ3RoIG9mIHNpZ24gcHJlZml4IGFuZCBzdWZmaXggYmV0d2VlbiBuZWdhdGl2ZSBhbmQgcG9zaXRpdmVcclxuICAgIHRoaXMuX3ByZWZMZW4gPSB0aGlzLl9wb3NQcmVmLkxlbmd0aDtcclxuICAgIHRoaXMuX3N1ZmZMZW4gPSB0aGlzLl9wb3NTdWZmLkxlbmd0aDtcclxuICAgIGlmICh0aGlzLl9uZWdhdGl2ZSkge1xyXG4gICAgICBpZiAodGhpcy5fbmVnUHJlZi5MZW5ndGggPiB0aGlzLl9wcmVmTGVuKSB7XHJcbiAgICAgICAgdGhpcy5fcHJlZkxlbiA9IHRoaXMuX25lZ1ByZWYuTGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9uZWdTdWZmLkxlbmd0aCA+IHRoaXMuX3N1ZmZMZW4pIHtcclxuICAgICAgICB0aGlzLl9zdWZmTGVuID0gdGhpcy5fbmVnU3VmZi5MZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBmb3IgYSBmb3JtYXQgd2l0aG91dCBkaWdpdHNcclxuICAgIGlmICh0aGlzLl93aG9sZSA9PT0gMCAmJiB0aGlzLl9kZWNpbWFsRGlnaXRzID09PSAwKSB7XHJcbiAgICAgIGNvdW50ID0gUElDSW50ZXJmYWNlLlBJQ19NQVhfTVNLX0xFTiAtIHRoaXMuX3ByZWZMZW4gLSB0aGlzLl9zdWZmTGVuO1xyXG4gICAgICBpZiAodGhpcy5fbWFza1NpemUgPCBjb3VudCkge1xyXG4gICAgICAgIHRoaXMuX3dob2xlID0gY291bnQgLSB0aGlzLl9tYXNrU2l6ZTtcclxuICAgICAgICBpZiAodGhpcy5fY29tbWEpXHJcbiAgICAgICAgICB0aGlzLl93aG9sZSAtPSBNYXRoLmZsb29yKHRoaXMuX3dob2xlIC8gNCk7XHJcbiAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19OLCB0aGlzLl93aG9sZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhZGQgZXh0cmEgZm9yIHByZWYvc3VmZiBhbmQgY29tbWFzXHJcbiAgICBpZiAodGhpcy5fY29tbWEpIHtcclxuICAgICAgY291bnQgPSBNYXRoLmZsb29yKCh0aGlzLl93aG9sZSAtIDEpIC8gMyk7XHJcbiAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfTiwgY291bnQpO1xyXG4gICAgICAvLyByZW1vdmUgY29tbWFzIHBsYWNlc1xyXG4gICAgICB0aGlzLl9tYXNrU2l6ZSAtPSBjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBpID0gdGhpcy5fcHJlZkxlbjtcclxuICAgIGlmIChpID4gMCAmJiB0aGlzLl9tc2sgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoKHRoaXMuX21hc2tTaXplICsgaSkgPD0gdGhpcy5fbXNrTGVuKSB7XHJcbiAgICAgICAgZm9yIChqID0gdGhpcy5fbWFza1NpemUgLSAxO1xyXG4gICAgICAgICAgICAgaiA+PSAwO1xyXG4gICAgICAgICAgICAgai0tKVxyXG4gICAgICAgICAgdGhpcy5fbXNrW2ogKyBpXSA9IHRoaXMuX21za1tqXTtcclxuICAgICAgICAvLyBtZW1zZXQgKHRoaXMtPm1zaywgUElDX04sIGkpOyAvLyBPcmlnaW5hbCBMaW5lXHJcbiAgICAgICAgZm9yIChqID0gMDtcclxuICAgICAgICAgICAgIGogPCBpO1xyXG4gICAgICAgICAgICAgaisrKVxyXG4gICAgICAgICAgaWYgKHRoaXMuX21zayAhPSBudWxsICYmIGogPCB0aGlzLl9tc2subGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLl9tc2tbal0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFBJQ0ludGVyZmFjZS5QSUNfTik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbWFza1NpemUgKz0gaTtcclxuICAgIH1cclxuICAgIGkgPSB0aGlzLl9zdWZmTGVuO1xyXG4gICAgaWYgKGkgPiAwICYmIHRoaXMuX21zayAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLl9tYXNrU2l6ZSArIHRoaXMuX3N1ZmZMZW4gPD0gdGhpcy5fbXNrTGVuKVxyXG4gICAgICAvLyBtZW1zZXQgKCZNc2tbdGhpcy0+cGljLT5tYXNrX3NpemVdLCBQSUNfTiwgdGhpcy0+cGljLT5zdWZmX2xlbik7IC8vIE9yaWdpbmFsIExpbmVcclxuICAgICAgICBmb3IgKGogPSAwO1xyXG4gICAgICAgICAgICAgaiA8IHRoaXMuX3N1ZmZMZW47XHJcbiAgICAgICAgICAgICBqKyspXHJcbiAgICAgICAgICB0aGlzLl9tc2tbdGhpcy5fbWFza1NpemUgKyBqXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19OKTtcclxuICAgICAgdGhpcy5fbWFza1NpemUgKz0gaTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRVbmZvcm1hdHRlZE51bWVyaWNQaWMgZnJvbSBjdXJyZW50IHBpY1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldFVuZm9ybWF0dGVkTnVtZXJpY1BpYygpOiBQSUMge1xyXG4gICAgbGV0IHBpY1N0ciA9ICcnO1xyXG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICBwaWNTdHIgPSB0aGlzLmlzTmVnYXRpdmUoKSA/ICdOJzogJyc7XHJcblxyXG4gICAgcGljU3RyICs9IHRoaXMuZ2V0V2hvbGVzKCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICBpZiAodGhpcy5nZXREZWMoKSA+IDApXHJcbiAgICAgIHBpY1N0ciArPSAgJy4nICsgdGhpcy5nZXREZWMoKS50b1N0cmluZygpO1xyXG4gICAgbGV0ICBuZXdQaWMgPSBuZXcgUElDIChwaWNTdHIsIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgMCk7XHJcblxyXG4gICAgcmV0dXJuIG5ld1BpYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQYXJzZSBhIGRhdGUgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9wcnMoY29tcElkeDogbnVtYmVyKSB7XHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gT3JpZ2luYWwgdmFyc1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgb2NyOiBudW1iZXI7XHJcbiAgICBsZXQgY291bnQ6IG51bWJlcjtcclxuICAgIGxldCBkcnY6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgU3dpdGNoQW5kRXhwYW5kRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IFNXRXhwYW5kRGF0ZUNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gQWRkZWQgdmFyc1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcbiAgICBsZXQgaXNKcG5FcmFZZWFyOiBib29sZWFuID0gZmFsc2U7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIHRoaXMuX3plcm8gPSAnICc7XHJcbiAgICBvY3IgPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLl9mb3JtYXQubGVuZ3RoID09PSAwIHx8IHRoaXMuX2Zvcm1hdFswXSA9PT0gJ1xcMCcpXHJcbiAgICAgIHRoaXMuX2Zvcm1hdCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoUElDLmdldERlZmF1bHREYXRlTWFzayhHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREYXRlTW9kZShjb21wSWR4KSkpO1xyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fZm9ybWF0Lmxlbmd0aDsgaisrKVxyXG4gICAgICBpZiAodGhpcy5fZm9ybWF0W2pdID09PSAnSCcpXHJcbiAgICAgICAgdGhpcy5zZXRIZWJyZXcoKTtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5fZm9ybWF0SWR4IDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCkge1xyXG4gICAgICBjdXJyQ2hyID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeF07XHJcbiAgICAgIHN3aXRjaCAoY3VyckNocikge1xyXG4gICAgICAgIGNhc2UgJ0gnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnWic6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX3plcm9GaWxsID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLl96ZXJvID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCsrXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdUJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5fdHJpbSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX2F1dG9Ta2lwXyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnTCc6XHJcbiAgICAgICAgICBpZiAodGhpcy5oZWJyZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfSEwsIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2R1cCgpO1xyXG4gICAgICAgICAgZHJ2ID0gMDtcclxuICAgICAgICAgIGkgPSBjb3VudDtcclxuICAgICAgICAgIHN3aXRjaCAoY291bnQpIHtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1lZO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1lZWVk7XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgIGNhc2UgNjpcclxuICAgICAgICAgICAgICBpZiAodGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChkcnYgIT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIGkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnTSc6XHJcbiAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2R1cCgpO1xyXG4gICAgICAgICAgZHJ2ID0gMDtcclxuICAgICAgICAgIGlmIChjb3VudCA9PT0gMilcclxuICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19NTUQ7XHJcbiAgICAgICAgICBlbHNlIGlmIChjb3VudCA+IDIpIHtcclxuICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19NTU07XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDEwKVxyXG4gICAgICAgICAgICAgIGRydiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZHJ2ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCArPSBjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoZHJ2LCBjb3VudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdEJzpcclxuICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfZHVwKCk7XHJcbiAgICAgICAgICBkcnYgPSAwO1xyXG4gICAgICAgICAgc3dpdGNoIChjb3VudCkge1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmhlYnJldykge1xyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ERDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyogIGZhbGxzIHRocm91Z2ggKi9cclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0RERDtcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0hERDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19EREREO1xyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGRydiAhPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIGNvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IGNvdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJyMnOlxyXG4gICAgICAgICAgY291bnQgPSB0aGlzLnBpa19kdXAoKTtcclxuICAgICAgICAgIGlmIChjb3VudCA9PT0gMikge1xyXG4gICAgICAgICAgICBkcnYgPSAwO1xyXG4gICAgICAgICAgICBvY3IrKztcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmhlYnJldylcclxuICAgICAgICAgICAgICBzd2l0Y2ggKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdCJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0UnOlxyXG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9jcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfREQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19NTUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ZWTtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9jcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfTU1EO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfREQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ZWTtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0onOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnUyc6XHJcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2NyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFTV0V4cGFuZERhdGVDaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm1hdF8gY29udGFpbnMgXCIjIyMjXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoQW5kRXhwYW5kRGF0ZSA9IE5TdHJpbmcuRnJvbUNoYXJzKHRoaXMuX2Zvcm1hdCkuaW5kZXhPZihcIiMjIyNcIikgPiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU1dFeHBhbmREYXRlQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoU3dpdGNoQW5kRXhwYW5kRGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19ZWVlZLCA0KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ZWTtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX01NRDtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0REO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZHJ2ICE9PSAwKVxyXG4gICAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgMik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChjb3VudCA9PT0gNCkge1xyXG4gICAgICAgICAgICBkcnYgPSAwO1xyXG4gICAgICAgICAgICBvY3IrKztcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmhlYnJldylcclxuICAgICAgICAgICAgICBzd2l0Y2ggKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdCJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0UnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgICAgICAgICAgIGlmIChvY3IgPT09IDMpXHJcbiAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdKJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1MnOlxyXG4gICAgICAgICAgICAgICAgICBpZiAob2NyID09PSAxKVxyXG4gICAgICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfWVlZWTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTV0V4cGFuZERhdGVDaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBmb3JtYXRfIGNvbnRhaW5zIFwiIyMjI1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hBbmRFeHBhbmREYXRlID0gIE5TdHJpbmcuRnJvbUNoYXJzKHRoaXMuX2Zvcm1hdCkuaW5kZXhPZihcIiMjIyNcIikgPiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgIFNXRXhwYW5kRGF0ZUNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoU3dpdGNoQW5kRXhwYW5kRGF0ZSAmJiBvY3IgPT09IDMpXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX0RELCAyKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRydiAhPT0gMClcclxuICAgICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIDQpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCArPSBjb3VudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAnVyc6XHJcbiAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2R1cCgpO1xyXG4gICAgICAgICAgaSA9IGNvdW50O1xyXG4gICAgICAgICAgaWYgKGNvdW50ID09PSAxKVxyXG4gICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1c7XHJcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLmhlYnJldylcclxuICAgICAgICAgICAgaWYgKGNvdW50ID09PSA1KVxyXG4gICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfV1dXO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgaSA9IDA7XHJcbiAgICAgICAgICBlbHNlIGlmIChjb3VudCA+IDIgJiYgY291bnQgPD0gMTApXHJcbiAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfV1dXO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpID0gMDtcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCArPSBjb3VudDtcclxuICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgaSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnLyc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERhdGUoKS5jaGFyQ29kZUF0KDApLCAxKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdTJzogLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgY291bnQgPSB0aGlzLnBpa19kdXAoKTtcclxuICAgICAgICAgICAgaSA9IGNvdW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvdW50ICE9PSAyICYmIGNvdW50ICE9PSA0ICYmIGNvdW50ICE9PSA2KVxyXG4gICAgICAgICAgICAgIGkgPSAwO1xyXG5cclxuICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19CQjtcclxuICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIGkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdKJzogLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgY291bnQgPSB0aGlzLnBpa19kdXAoKTtcclxuICAgICAgICAgICAgaSA9IGNvdW50O1xyXG4gICAgICAgICAgICBpc0pwbkVyYVllYXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChjb3VudCkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfSlkxO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfSlkyO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfSlk0O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpID0gMDtcclxuICAgICAgICAgICAgICAgIGlzSnBuRXJhWWVhciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCArPSBjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoZHJ2LCBpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fbmVlZExlbmd0aCAmJiBpc0pwbkVyYVllYXIpXHJcbi8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDtcclxuICAgICAgICAgICBpIDwgdGhpcy5fbXNrLmxlbmd0aDtcclxuICAgICAgICAgICBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5fbXNrW2ldLmNoYXJDb2RlQXQoMCkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVkpXHJcbiAgICAgICAgICB0aGlzLl9tc2tbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBQSUNJbnRlcmZhY2UuUElDX1lKKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9tc2tbaV0uY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZKVxyXG4gICAgICAgICAgdGhpcy5fbXNrW2ldID0gJ1knO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGFyc2UgYSBudW1lcmljIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHRpbWVfcHJzKCk6IHZvaWQge1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIE9yaWdpbmFsIHZhcnNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBsZXQgZHJ2OiBudW1iZXI7XHJcbiAgICBsZXQgTm9Gb3JtYXQ6IHN0cmluZztcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBBZGRlZCB2YXJzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgbGV0IGN1cnJDaHI6IHN0cmluZztcclxuXHJcbiAgICB0aGlzLl96ZXJvID0gJyAnO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBVc2UgYSBkZWZhdWx0IGZvcm1hdCwgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWRcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBpZiAodGhpcy5fZm9ybWF0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9mb3JtYXRbMF0uY2hhckNvZGVBdCgwKSA9PT0gMCkge1xyXG4gICAgICBOb0Zvcm1hdCA9IFwiSEg6TU06U1NcIjtcclxuICAgICAgaWYgKHRoaXMuX21za0xlbiA8IDgpXHJcbiAgICAgICAgTm9Gb3JtYXQgPSBOb0Zvcm1hdC5zdWJzdHIoMCwgdGhpcy5fbXNrTGVuKTsgLy8gTm9Gb3JtYXRbdGhpcy0+bXNrX2xlbl0gPSAwOyAvLyBPcmlnaW5hbCBMaW5lXHJcbiAgICAgIHRoaXMuX2Zvcm1hdCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoTm9Gb3JtYXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKSB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XTtcclxuXHJcbiAgICAgIGxldCBtYXNrTGVuZ3RoOiBudW1iZXI7XHJcbiAgICAgIHN3aXRjaCAoY3VyckNocikge1xyXG4gICAgICAgIGNhc2UgJ0gnOlxyXG4gICAgICAgIGNhc2UgJ00nOlxyXG4gICAgICAgIGNhc2UgJ1MnOlxyXG4gICAgICAgICAgbWFza0xlbmd0aCA9IDI7XHJcbiAgICAgICAgICAvKiB3ZSBwYXJzZSAnSC9NL1MnIG9ubHkgaWYgaXQgaGFzIG9uZSBzaW1pbGFyIGNoYXJhY3RlciBhZnRlciBpdCAoaS5lLiAnSEgnLydNTScvJ1NTJykgKi9cclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRJZHggKyAxIDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCAmJiB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XSA9PT0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCArIDFdKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY3VyckNocikge1xyXG4gICAgICAgICAgICAgIGNhc2UgJ0gnOlxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ISDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdNJzpcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfTU1UO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ1MnOlxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19TUztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLk5VTExfQ0hBUjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCArPSBtYXNrTGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIG1hc2tMZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnbSc6XHJcbiAgICAgICAgICBtYXNrTGVuZ3RoID0gMztcclxuICAgICAgICAgIC8qIHdlIHBhcnNlICdtJyBvbmx5IGlmIGl0IGhhcyAyIHNpbWlsYXIgY2hhcmFjdGVycyBhZnRlciBpdCAoaS5lLiAnbW1tJykgKi9cclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRJZHggKyAyIDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAodGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeF0gPT09IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHggKyAxXSAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHggKyAxXSA9PT0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCArIDJdKSkge1xyXG4gICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX01TO1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHggKz0gbWFza0xlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoZHJ2LCBtYXNrTGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJzonOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRUaW1lKCkuY2hhckNvZGVBdCgwKSwgMSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnWic6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX3plcm9GaWxsID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLl96ZXJvID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCsrXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5fYXV0b1NraXBfID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdQJzpcclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4ICsgMV0gPT09ICdNJylcclxuICAgICAgICAgIC8vIGNoYW5nZWQgZnJvbSBmb3JtYXRfWzFdIC0+IGZvcm1hdF9bZm9ybWF0SWR4XysxXVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHggKz0gMjtcclxuICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19QTSwgMik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgUGljdHVyZSBmb3IgdGhlIHZhcmlhYmxlIG9mIHRoZSAndHlwZScgd2l0aCAndmFsdWUnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInR5cGVcIj5vZiB0aGUgcGljdHVyZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVwiPmlzIG5lZWRlZCB0byBiZSBldmFsdWF0ZWQgd2l0aCB0aGUgcGljdHVyZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBQSUN0dXJlIG9mIHRoZSBuZWVkZWQgJ3R5cGUnPC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRQaWN0dXJlKHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHZhbDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIsIHVzZURlY2ltYWw6IGJvb2xlYW4pOiBQSUMge1xyXG4gICAgbGV0IHBpYzogUElDID0gbnVsbDtcclxuICAgIGxldCBtYXNrOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMTApO1xyXG4gICAgbGV0IGRlY2ltYWxTZXBhcmF0b3I6IHN0cmluZztcclxuICAgIGxldCB0aG91c2FuZHM6IHN0cmluZztcclxuICAgIGxldCBjdXJyQ2hhcjogc3RyaW5nO1xyXG4gICAgbGV0IGNvdW50ZXI6IG51bWJlcjtcclxuICAgIGxldCBsZW5ndGg6IG51bWJlcjtcclxuICAgIGxldCBiZWZvcmVEZWM6IG51bWJlcjtcclxuICAgIGxldCBhZnRlckRlYzogbnVtYmVyO1xyXG4gICAgbGV0IGRlY2ltYWxEZWxpbUZvdW5kOiBib29sZWFuO1xyXG4gICAgbGV0IGlzVGhvdXNhbmRzRGVsaW06IGJvb2xlYW47XHJcbiAgICBsZXQgaXNOZWdhdGl2ZTogYm9vbGVhbjtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgZGVjaW1hbFNlcGFyYXRvciA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuICAgICAgICB0aG91c2FuZHMgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRUaG91c2FuZHMoKTtcclxuICAgICAgICBiZWZvcmVEZWMgPSBhZnRlckRlYyA9IDA7XHJcbiAgICAgICAgZGVjaW1hbERlbGltRm91bmQgPSBmYWxzZTtcclxuICAgICAgICBpc1Rob3VzYW5kc0RlbGltID0gZmFsc2U7XHJcbiAgICAgICAgaXNOZWdhdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbC5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICBiZWZvcmVEZWMgPSBhZnRlckRlYyA9IDE7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZW5ndGggPSB2YWwubGVuZ3RoO1xyXG4gICAgICAgICAgY291bnRlciA9IDA7XHJcblxyXG4gICAgICAgICAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcclxuICAgICAgICAgICAgY3VyckNoYXIgPSB2YWxbY291bnRlcl07XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY3VyckNoYXIpIHtcclxuICAgICAgICAgICAgICBjYXNlICcrJzpcclxuICAgICAgICAgICAgICBjYXNlICctJzpcclxuICAgICAgICAgICAgICAgIGlzTmVnYXRpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaWYgKHVzZURlY2ltYWwgJiYgY3VyckNoYXIgPT09IGRlY2ltYWxTZXBhcmF0b3IpXHJcbiAgICAgICAgICAgICAgICAgIGRlY2ltYWxEZWxpbUZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJDaGFyID09PSB0aG91c2FuZHMpXHJcbiAgICAgICAgICAgICAgICAgIGlzVGhvdXNhbmRzRGVsaW0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVjaW1hbERlbGltRm91bmQpXHJcbiAgICAgICAgICAgICAgICAgIGFmdGVyRGVjKys7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGJlZm9yZURlYysrO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY291bnRlcisrO1xyXG4gICAgICAgICAgfSAvLyBlbmQgb2Ygd2hpbGUgZm9yIGxvb2tpbmcgaW4gdGhlIHZhbHVlXHJcblxyXG4gICAgICAgICAgbWFzay5BcHBlbmQoXCJcIiArIGJlZm9yZURlYyArIGRlY2ltYWxTZXBhcmF0b3IgKyBhZnRlckRlYyk7XHJcbiAgICAgICAgICBpZiAoaXNOZWdhdGl2ZSlcclxuICAgICAgICAgICAgbWFzay5BcHBlbmQoJ04nKTtcclxuICAgICAgICAgIGlmIChpc1Rob3VzYW5kc0RlbGltKVxyXG4gICAgICAgICAgICBtYXNrLkFwcGVuZCgnQycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICBtYXNrLkFwcGVuZCh0aGlzLmdldERlZmF1bHREYXRlTWFzayhHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREYXRlTW9kZShjb21wSWR4KSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIG1hc2suQXBwZW5kKFwiSEhcIiArIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRpbWUoKSArIFwiTU1cIiArIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRpbWUoKSArIFwiU1NcIik7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coXCJFdmVudC5idWlsZFBpY3R1cmUoKSB0aGVyZSBpcyBubyBQSUNUVVJFIGJ1aWxkaW5nIGZvciB0eXBlIDpcIiArIHR5cGUgK1xyXG4gICAgICAgICAgXCIgYW5kIHZhbHVlIDpcIiArIHZhbCk7XHJcbiAgICAgICAgcmV0dXJuIHBpYzsgLy8gbnVsbCwgdGhlIFBJQyBkaWRuJ3QgYnVpbGRcclxuICAgIH1cclxuXHJcbiAgICBwaWMgPSBuZXcgUElDKG1hc2suVG9TdHJpbmcoKSwgdHlwZSwgY29tcElkeCk7XHJcbiAgICByZXR1cm4gcGljO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgc2V0IEhlYnJldyB0byB0cnVlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SGVicmV3KCk6IHZvaWQge1xyXG4gICAgLy8gRGVmZWN0IDExNjI1OC4gU2V0IGhlYnJldyBmbGFnIG9ubHkgZm9yIGhlYnJldyBtZ2NvbnN0LlxyXG4gICAgaWYgKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50Lkxhbmd1YWdlID09PSAnSCcpXHJcbiAgICAgIHRoaXMuaGVicmV3ID0gdHJ1ZTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGdldCBkZWZhdWx0IG1hc2sgZm9yIERhdGUgdHlwZVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFNb2RlXCI+LSBkYXRhIG1vZGUgKEosUyxCLEUsQSk8L3BhcmFtPlxyXG4vLy8gPHJldHVybnM+IG1hc2sgb2YgZGVmYXVsdCBkYXRlPC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0RGVmYXVsdERhdGVNYXNrKGRhdGFNb2RlOiBzdHJpbmcpIHtcclxuICAgIGxldCBmcm10OiBzdHJpbmc7XHJcbiAgICBzd2l0Y2ggKGRhdGFNb2RlKSB7XHJcbiAgICAgIGNhc2UgJ0onOlxyXG4gICAgICBjYXNlICdTJzpcclxuICAgICAgICBmcm10ID0gXCIjIyMjLyMjLyMjXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdCJzpcclxuICAgICAgY2FzZSAnRSc6XHJcbiAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGZybXQgPSBcIiMjLyMjLyMjIyNcIjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBmcm10O1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgUGFyc2UgYSBudW1lcmljIHBpY3R1cmUgZm9ybWF0XHJcbi8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBib29sX3BycygpOiB2b2lkIHtcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBPcmlnaW5hbCB2YXJzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgbGV0IGNvdW50OiBudW1iZXI7IC8vIENvdW50IG9mIGRpcmV2dGl2ZSBvciBtYXNrIGNoYXJhY3RlclxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEFkZGVkIHZhcnNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBsZXQgY3VyckNocjogc3RyaW5nO1xyXG5cclxuICAgIHdoaWxlICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKSB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XTtcclxuICAgICAgc3dpdGNoIChjdXJyQ2hyKSB7XHJcbiAgICAgICAgY2FzZSAnSCc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuc2V0SGVicmV3KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLl9hdXRvU2tpcF8gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlICdYJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgY291bnQgPSB0aGlzLnBpa19jb3VudCgpO1xyXG4gICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19YLCBjb3VudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoY3VyckNocikpIHtcclxuICAgICAgICAgICAgY291bnQgPSB0aGlzLnBpa19jb3VudCgpO1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX1gsIGNvdW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gRmlsbCBpbiBhbiBlbXB0eSBmb3JtYXRcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBpZiAodGhpcy5fbWFza1NpemUgPT09IDApXHJcbiAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfWCwgdGhpcy5fbXNrTGVuKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIFBhcnNlIHRoZSBzaWduIHByZWZpeC9zdWZmaXggZnJvbSB0aGUgZm9ybWF0XHJcbi8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBwaWtfc2lnbigpOiB2b2lkIHtcclxuICAgIGxldCBwb3NTaWduOiBib29sZWFuO1xyXG4gICAgbGV0IHNpZ25TdHI6IFN0cmluZ0J1aWxkZXI7XHJcbiAgICBsZXQgY3VyckNocjogc3RyaW5nO1xyXG5cclxuICAgIHBvc1NpZ24gPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XSA9PT0gJysnXHJcbiAgICAgID8gdHJ1ZVxyXG4gICAgICA6IGZhbHNlO1xyXG4gICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcblxyXG4gICAgaWYgKHBvc1NpZ24pXHJcbiAgICAgIHNpZ25TdHIgPSB0aGlzLl9wb3NQcmVmO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX25lZ1ByZWYuUmVtb3ZlKDAsIHRoaXMuX25lZ1ByZWYuTGVuZ3RoKTtcclxuICAgICAgc2lnblN0ciA9IHRoaXMuX25lZ1ByZWY7XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdO1xyXG4gICAgICBzd2l0Y2ggKGN1cnJDaHIpIHtcclxuICAgICAgICBjYXNlICc7JzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAnLCc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIGlmIChwb3NTaWduKVxyXG4gICAgICAgICAgICBzaWduU3RyID0gdGhpcy5fcG9zU3VmZjtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgc2lnblN0ciA9IHRoaXMuX25lZ1N1ZmY7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgJ1xcXFwnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICBpZiAodGhpcy5fZm9ybWF0SWR4ID49IHRoaXMuX2Zvcm1hdC5sZW5ndGgpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIGN1cnJDaHIgPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XTtcclxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHNpZ25TdHIuQXBwZW5kKGN1cnJDaHIpO1xyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgUGFyc2UgYSBudW1iZXIgd2hpY2ggaXMgYSBjb3VudGVyIG9mIHNwZWNpZmljIGNoYXIgaW4gdGhlIGZvcm1hdFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgcGlrX2NvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgc3BlY2lhbFZhbE5ld1BvbGljeTogYm9vbGVhbiA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNwZWNpYWxWYWxOZXdQb2xpY3koKTtcclxuICAgIGxldCB2YWw6IG51bWJlcjtcclxuICAgIGxldCBpc0RpZ2l0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgdmFsID0gMDtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5fZm9ybWF0SWR4IDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XSkpIHtcclxuICAgICAgdmFsICo9IDEwO1xyXG4gICAgICBpc0RpZ2l0ID0gdHJ1ZTtcclxuICAgICAgdmFsICs9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdLmNoYXJDb2RlQXQoMCkgLSAnMCcuY2hhckNvZGVBdCgwKTtcclxuICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbCA+IDMyMDAwKVxyXG4gICAgICB2YWwgPSAzMjAwMDtcclxuICAgIGVsc2UgaWYgKHZhbCA8PSAwKSB7XHJcbiAgICAgIC8vIElmICBmbGFnIFNwZWNpYWxWYWxOZXdQb2xpY3kgaXMgc2V0LCB0aGVuIHBpY3R1cmUgaGF2aW5nIHdob2xlL2RlYyBhcyAwIGUuZy4gJzMuMCcgc2hvdWxkIHJldHVybiBhcyAwLlxyXG4gICAgICBpZiAoc3BlY2lhbFZhbE5ld1BvbGljeSAmJiBpc0RpZ2l0ICYmIHZhbCA9PT0gMClcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHZhbCA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbCA+IEludDMyLk1heFZhbHVlKVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLlNUUl9FUlJfTUFYX1ZBUl9TSVpFKSk7XHJcblxyXG4gICAgcmV0dXJuICh2YWwpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgRmlsbCBhIHNwZWNpZmljIG1hc2sgY2hhcmFjdGVyIGluIHRoZSBtYXNrIHN0cmluZ1xyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcImRydlwiPiAgICBUaGUgbWFzayBjaGFyYWN0ZXIgdG8gZmlsbDwvcGFyYW0+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwiY291bnRcIj4gIE51bWJlciBvZiB0aW1lcyBmb3IgdGhlIG1hc2sgY2hhcmFjdGVyIHRvIGFwZWFyPC9wYXJhbT5cclxuICBwcml2YXRlIHBpa19kcnZfZmlsbChkcnY6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGxldCBNc2taOiBudW1iZXI7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuX25lZWRMZW5ndGgpIHtcclxuICAgICAgdGhpcy5fbWFza0xlbmd0aCArPSBjb3VudDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIE1za1ogPSB0aGlzLl9tYXNrU2l6ZTtcclxuICAgIHRoaXMuX21hc2tTaXplICs9IGNvdW50O1xyXG5cclxuICAgIGlmIChNc2taICsgY291bnQgPiB0aGlzLl9tc2tMZW4pXHJcbiAgICAgIGNvdW50ID0gdGhpcy5fbXNrTGVuIC0gTXNrWjtcclxuXHJcbiAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgIC8vIG1lbXNldCAoJnRoaXMtPm1za1t0aGlzLk1za1pdLCAoVWNoYXIpIGRydiwgY291bnQpOyAvLyBPcmlnaW5hbCBMaW5lXHJcbiAgICAgIGZvciAoaSA9IDA7XHJcbiAgICAgICAgICAgaSA8IGNvdW50O1xyXG4gICAgICAgICAgIGkrKylcclxuICAgICAgICB0aGlzLl9tc2tbTXNrWiArIGldID0gU3RyaW5nLmZyb21DaGFyQ29kZShkcnYpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBQYXJzZSBhIGdlbmVyYWwgbWFzayBjaGFyYWN0ZXJcclxuLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHBpa19tYXNrKCk6IHZvaWQge1xyXG4gICAgbGV0IGN1cnJDaHI6IHN0cmluZztcclxuICAgIGxldCBjb3VudDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XSA9PT0gJ1xcXFwnKVxyXG4gICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgIGlmICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKSB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XTtcclxuICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgIGNvdW50ID0gdGhpcy5waWtfY291bnQoKTtcclxuICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoY3VyckNoci5jaGFyQ29kZUF0KDApLCBjb3VudCk7XHJcbiAgICAgIHRoaXMuX21hc2tDaGFycyArPSBjb3VudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIENvdW50IGNvbnRpbnVlcyBvY2N1cnJlbmNlcyBvZiBhIG1hc2sgY2hhcmFjdGVyIGluIHRoZSBmb3JtYXQgc3RyaW5nXHJcbi8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBwaWtfZHVwKCk6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGR1cENvdW50ID0gMTtcclxuXHJcbiAgICBsZXQgYzogc3RyaW5nO1xyXG5cclxuICAgIGxldCB0bXBJZHggPSB0aGlzLl9mb3JtYXRJZHg7XHJcblxyXG4gICAgYyA9IHRoaXMuX2Zvcm1hdFt0bXBJZHhdO1xyXG4gICAgdG1wSWR4Kys7XHJcbiAgICB3aGlsZSAodG1wSWR4IDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCAmJiBjID09PSB0aGlzLl9mb3JtYXRbdG1wSWR4XSkge1xyXG4gICAgICBkdXBDb3VudCsrO1xyXG4gICAgICB0bXBJZHgrKztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHVwQ291bnQ7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBzZXQgSU1FIG1vZGUgZGVwZW5kcyBvbiBLIHBpY3R1cmUgKEswIC0gSzkpXHJcbi8vLyAgIChKUE46IElNRSBzdXBwb3J0KVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgcGljX2thbmppKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvdW50O1xyXG5cclxuICAgIGlmICh0aGlzLl9mb3JtYXRJZHggKyAxID49IHRoaXMuX2Zvcm1hdC5sZW5ndGgpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHggKyAxXSkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuXHJcbiAgICBpZiAodGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeF0gPT09ICcwJykgIC8vIEswXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX2ltZU1vZGUgPSBVdGlsSW1lSnBuLklNRV9GT1JDRV9PRkY7XHJcbiAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvdW50ID0gdGhpcy5waWtfY291bnQoKTtcclxuICAgICAgaWYgKDEgPD0gY291bnQgJiYgY291bnQgPD0gOSkgLy8gSzEgLSBLOVxyXG4gICAgICAgIHRoaXMuX2ltZU1vZGUgPSBjb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgRmluZCBsZW5ndGggb2YgdGhlIHBpY3R1cmUgYWZ0ZXIgcGFyc2luZyB0aGUgcGljdHVyZVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHJldHVybnM+IGxlbmd0aCBvZiB0aGUgcGljdHVyZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE1hc2tMZW4oY29tcElkeDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9uZWVkTGVuZ3RoID0gdHJ1ZTtcclxuICAgIHRoaXMuX21hc2tMZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fZm9ybWF0SWR4ID0gMDtcclxuXHJcbiAgICB0aGlzLnByc19hbGwoY29tcElkeCk7XHJcblxyXG4gICAgLy8gYWRkIHByZWZpeCBhbmQgc3VmZml4IGxlbmd0aCB0byB0aGUgbWFza1xyXG4gICAgaWYgKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyAmJiAodGhpcy5fcHJlZkxlbiA+IDAgfHwgdGhpcy5fc3VmZkxlbiA+IDApKVxyXG4gICAgICB0aGlzLl9tYXNrTGVuZ3RoICs9ICh0aGlzLl9wcmVmTGVuICsgdGhpcy5fc3VmZkxlbik7XHJcblxyXG4gICAgdGhpcy5fbmVlZExlbmd0aCA9IGZhbHNlO1xyXG4gICAgLy8gaW5pdCBmb3IgbmV4dCBydW5uaW5nIDpcclxuICAgIHRoaXMuX2Zvcm1hdElkeCA9IHRoaXMuX21hc2tDaGFycyA9IHRoaXMuX3dob2xlID0gdGhpcy5fZGVjaW1hbERpZ2l0cyA9IHRoaXMuX3NpemUgPSB0aGlzLl9tYXNrU2l6ZSA9IHRoaXMuX3ByZWZMZW4gPSB0aGlzLl9zdWZmTGVuID0gMDtcclxuICAgIHRoaXMuX3BhZCA9IHRoaXMuX3plcm8gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDApO1xyXG4gICAgdGhpcy5oZWJyZXcgPSB0aGlzLl9taXhlZCA9IHRoaXMuX2VtYmVkZWQgPSB0aGlzLl9uZWdhdGl2ZSA9IHRoaXMuX2NvbW1hID0gdGhpcy5fbGVmdCA9IHRoaXMuX3BhZEZpbGwgPSB0aGlzLl96ZXJvRmlsbCA9IHRoaXMuX3RyaW0gPSB0aGlzLl9hdXRvU2tpcF8gPSB0aGlzLl9kZWNpbWFsID0gdGhpcy5fdGVybUZsYWcgPSB0aGlzLl9kZWNQb2ludElzRmlyc3QgPSBmYWxzZTtcclxuICAgIHRoaXMuX3Bvc1ByZWYuUmVtb3ZlKDAsIHRoaXMuX3Bvc1ByZWYuTGVuZ3RoKTtcclxuICAgIHRoaXMuX3Bvc1N1ZmYuUmVtb3ZlKDAsIHRoaXMuX3Bvc1N1ZmYuTGVuZ3RoKTtcclxuICAgIHRoaXMuX25lZ1ByZWYuUmVtb3ZlKDAsIHRoaXMuX25lZ1ByZWYuTGVuZ3RoKTtcclxuICAgIHRoaXMuX25lZ1N1ZmYuUmVtb3ZlKDAsIHRoaXMuX25lZ1N1ZmYuTGVuZ3RoKTtcclxuICAgIHJldHVybiB0aGlzLl9tYXNrTGVuZ3RoO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGVtYmVkZWQgY2hhciBpbiB0aGUgbWFzayBpbiBhIGdpdnZlbiBwb3NpdGlvbi5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj48L3BhcmFtPlxyXG4vLy8gPHJldHVybnM+IHRydWUgaWYgcGljIGlzIG1hc2s8L3JldHVybnM+XHJcbiAgcHVibGljIHBpY0lzTWFzayhwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHBvcyA8IDAgfHwgcG9zID49IHRoaXMuX21hc2tMZW5ndGgpXHJcbiAgICAgIHBvcyA9IDA7XHJcbiAgICByZXR1cm4gdGhpcy5fbXNrW3Bvc10uY2hhckNvZGVBdCgwKSA+IFBJQ0ludGVyZmFjZS5QSUNfTUFYX09QO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHRpbGwgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwibXNrUG9zXCI+PC9wYXJhbT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJidWZQb3NcIj48L3BhcmFtPlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcImJ1ZlwiPjwvcGFyYW0+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0RGlyZWN0aXZlTGVuKHBvczogbnVtYmVyKTogbnVtYmVyO1xyXG4gIGdldERpcmVjdGl2ZUxlbihtc2tQb3M6IG51bWJlciwgYnVmUG9zOiBudW1iZXIsIGJ1Zjogc3RyaW5nKTogbnVtYmVyO1xyXG4gIGdldERpcmVjdGl2ZUxlbihwb3NPck1za1BvczogbnVtYmVyLCBidWZQb3M/OiBudW1iZXIsIGJ1Zj86IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlyZWN0aXZlTGVuXzAocG9zT3JNc2tQb3MpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXREaXJlY3RpdmVMZW5fMShwb3NPck1za1BvcywgYnVmUG9zLCBidWYpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFycyB0aWxsIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVtYmVyIG9mIGNoYXJzIHRpbGwgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXREaXJlY3RpdmVMZW5fMChwb3M6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYzogc3RyaW5nID0gdGhpcy5fbXNrW3Bvc107XHJcbiAgICBsZXQgbnVtOiBudW1iZXIgPSBwb3M7XHJcbiAgICB3aGlsZSAobnVtIDwgdGhpcy5fbWFza1NpemUgJiYgYyA9PT0gdGhpcy5fbXNrW251bV0pIHtcclxuICAgICAgbnVtID0gbnVtICsgMTtcclxuICAgIH1cclxuICAgIHJldHVybiBudW0gLSBwb3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHRpbGwgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1za1Bvc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJidWZQb3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RGlyZWN0aXZlTGVuXzEobXNrUG9zOiBudW1iZXIsIGJ1ZlBvczogbnVtYmVyLCBidWY6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgZHJ2OiBzdHJpbmcgPSB0aGlzLl9tc2tbbXNrUG9zXTtcclxuICAgIGxldCBjdXJyTXNrUG9zOiBudW1iZXIgPSBtc2tQb3M7XHJcbiAgICBsZXQgY3VyckJ1ZlBvczogbnVtYmVyID0gYnVmUG9zO1xyXG5cclxuICAgIC8vIHRpbGwgdGhlIGVuZCBvZiB0aGUgbWFzaywgaWYgbWFza1twb3NdIGhhcyBzYW1lIGRpcmVjdGl2ZSBhcyBvdXJzLCB0aGlzIGlzIHRoZSBzYW1lIHNlcXVlbmNlLlxyXG4gICAgd2hpbGUgKGN1cnJNc2tQb3MgPCB0aGlzLl9tYXNrU2l6ZSAmJiBkcnYgPT09IHRoaXMuX21za1tjdXJyTXNrUG9zXSkge1xyXG4gICAgICAvLyBJZ25vcmUgdGhlIGNoYW5nZSBvZiBzZXF1ZW5jZSBpZiBpdCBpcyBpbi1iZXR3ZWVuIGEgREJDUyBjaGFyLlxyXG4gICAgICAvLyBJZiB0aGUgY3VycmVudCBjaGFyIGlzIGEgRnVsbCBXaWR0aCBjaGFyLCB0aGVuIHRoZSBuZXh0IG1hc2sgYml0XHJcbiAgICAgIC8vIGlzIGFjdHVhbGx5IG5vdCB1c2VkLiBTbywgaWdub3JlIHRoYXQgYml0IGFuZCBtb3ZlIG9uLlxyXG4gICAgICBpZiAoY3VyckJ1ZlBvcyA8IGJ1Zi5sZW5ndGggJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiB0aGlzLmlzQXR0ckFscGhhT3JEYXRlKCkpIHtcclxuICAgICAgICBpZiAoIVV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChidWZbY3VyckJ1ZlBvcysrXSkpXHJcbiAgICAgICAgICBjdXJyTXNrUG9zKys7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1cnJNc2tQb3MrKztcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm4gb25seSBob3cgbWFueSBjaGFycyB0byB0aGUgZW5kLCBpbmNsdWRpbmcgb3VyIHBvcy5cclxuICAgIHJldHVybiAoY3Vyck1za1BvcyAtIG1za1Bvcyk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBjaGVjayBpZiBjaGFyIGlzIHZhbGlkIGluIHRoZSBnaXZlbiBtYXNrIHBvc2l0aW9uXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwiY2hhclRvVmFsaWRhdGVcIj5cclxuLy8vIDwvcGFyYW0+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwicG9zXCI+b2YgZGlyZWN0aXZlIG1hc2sgdG8gY2hlY2tcclxuLy8vICAgVGhlIHJldHVybmVkIGNoYXIgbWlnaHQgYmUgZGlmZmVyZW50IHRoZW4gdGhlIGNoYXIgdGhhdCB3YXMgY2hlY2tlZC5cclxuLy8vICAgVGhlIHJlYXNvbiBpcyB0aGF0ICdVJyBhbmQgJ0wnIGRpcmVjdGl2ZSBtaWdodCBjaGFuZ2UgaXQsIGFuZCBpbiBudW1lcmljLFxyXG4vLy8gICBkZWNpbWFsIHNlcGFyYXRvciBhbmQgdGhvdXNhbmQgc2VwYXJhdG9yIG1pZ2h0IGJlIGNoYW5nZWQgYXMgd2VsbCB3aGlsZSB0eXBpbmcuXHJcbi8vLyA8L3BhcmFtPlxyXG4vLy8gPHJldHVybnM+IDAgaWYgbm90IHZhbGlkIG9yIGEgY2hhciBpZiB2YWxpZC48L3JldHVybnM+XHJcbiAgcHVibGljIHZhbGlkYXRlQ2hhcihjaGFyVG9WYWxpZGF0ZTogc3RyaW5nLCBwb3M6IG51bWJlcikge1xyXG4gICAgbGV0IGNoYXJSZXR1cm5lZCA9IGNoYXJUb1ZhbGlkYXRlO1xyXG4gICAgaWYgKHBvcyA+PSB0aGlzLmdldE1hc2tTaXplKCkpXHJcbiAgICAgIHJldHVybiBjaGFyUmV0dXJuZWQ7XHJcblxyXG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGFueSBjaGFyYWN0ZXJzIHdoaWNoIGFyZSBlbWJlZGVkIGludG8gdGhlIHBpY3R1cmVcclxuICAgIHdoaWxlICh0aGlzLnBpY0lzTWFzayhwb3MpKVxyXG4gICAgICBwb3MrKztcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX21za1twb3NdLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1U6XHJcbiAgICAgICAgY2hhclJldHVybmVkID0gY2hhclRvVmFsaWRhdGUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19MOlxyXG4gICAgICAgIGNoYXJSZXR1cm5lZCA9IGNoYXJUb1ZhbGlkYXRlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaWYgKCFVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChjaGFyVG9WYWxpZGF0ZSkpXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBJQ0ludGVyZmFjZS5OdW1EaXJlY3RpdmUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tc2tbcG9zXS5jaGFyQ29kZUF0KDApID09PSBQSUNJbnRlcmZhY2UuTnVtRGlyZWN0aXZlW2ldKSB7XHJcbiAgICAgICAgICAgICAgY2hhclJldHVybmVkID0gdGhpcy5pc1ZhbGlkSW5OdW0oY2hhclRvVmFsaWRhdGUpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hhclJldHVybmVkO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQ2hlY2tzIHdoZXRoZXIgYSBub24gZGlnaXQgY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgbnVtZXJpYyBtYXNrXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwibGV0dGVyOlwiPmEgY2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQuPC9wYXJhbT5cclxuLy8vIDxyZXR1cm5zPiAwIGlmIG5vdCB2YWxpZC4gY2hhciBpZiB2YWxpZC4gY2hhciBtaWdodCBiZSBkaWZmZXJlbnQgdGhlbiBsZXR0ZXIuPC9yZXR1cm5zPlxyXG4gIGlzVmFsaWRJbk51bShsZXR0ZXI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY2hhclJldCA9ICdcXDAnO1xyXG4gICAgbGV0IGRlY2ltYWxDaGFyOiBzdHJpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgLyogIHJlcGxhY2UgJy4nIHdpdGggYSBkaWZmZXJlbnQgY2hhciBmb3IgbnVtZXJpYyBzZXBlcmF0b3Igb25seSBpZlxyXG4gICAgKiAgU3BlY2lhbE1vZGlmaWVkRGVjaW1hbFNlcGFyYXRvciA9IFkqL1xyXG4gICAgLy8gZm9yIG51bWVyaWMsIGlmICcuJyB3YXMgZW50ZXJlZCwgY2hhbmdlIGl0IHRvIHRoZSBlbnYgc2VwZXJhdG9yLlxyXG4gICAgLy8gIzkzMTc4NDogSWYgU3BlY2lhbE1vZGlmaWVkRGVjaW1hbFNlcGFyYXRvciA9IFkgdGhlbiByZXBsYWNlICcuJyBieSBkZWNpbWFsIHNlcGFyYXRvci5cclxuICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5DYW5SZXBsYWNlRGVjaW1hbFNlcGFyYXRvcigpICYmIHRoaXMuaXNBdHRyTnVtZXJpYygpKVxyXG4gICAgICBpZiAobGV0dGVyID09PSAnLicpXHJcbiAgICAgICAgbGV0dGVyID0gZGVjaW1hbENoYXI7XHJcblxyXG4gICAgc3dpdGNoIChsZXR0ZXIpIHtcclxuICAgICAgY2FzZSAnICc6XHJcbiAgICAgIGNhc2UgJy0nOlxyXG4gICAgICBjYXNlICcqJzpcclxuICAgICAgY2FzZSAnKyc6XHJcbiAgICAgIGNhc2UgJy8nOlxyXG4gICAgICAgIGNoYXJSZXQgPSBsZXR0ZXI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIC8vIHRoZSBlbnYgZGVjaW1hbCBzZXBlcmF0b3IgYW5kIHRob3VzYW5kcyBzZXBlcmF0b3IgYXJlIGFsc28gdmFsaWRcclxuICAgICAgICBpZiAobGV0dGVyID09PSBkZWNpbWFsQ2hhciB8fCBsZXR0ZXIgPT09IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRob3VzYW5kcygpKVxyXG4gICAgICAgICAgY2hhclJldCA9IGxldHRlcjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2hhclJldDtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbG9naWNhbFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc0F0dHJMb2dpY2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpcyBudW1lcmljXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQXR0ck51bWVyaWMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBjaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIGFscGhhXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQXR0ckFscGhhKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdW5pY29kZVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc0F0dHJVbmljb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbHBoYSBvciBkYXRlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQXR0ckFscGhhT3JEYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBjaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIHRpbWUgb3IgZGF0ZVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc0F0dHJEYXRlT3JUaW1lKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUgfHwgdGhpcy5fcGljQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYmxvYlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc0F0dHJCbG9iKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHxcclxuICAgICAgdGhpcy5fcGljQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUik7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBjaGVjayBpZiB0aGUgbWFzayBhdCBhIGdpdmVuIHBvc2l0aW9uIGlzIG51bWVyaWNcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj48L3BhcmFtPlxyXG4vLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc051bWVyaWMocG9zOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tc2sgW3Bvc10gPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19OKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBtYXNrIGlzIGFsbCBYXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQWxsWCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5fbXNrWzBdID09PSBTdHJpbmcuZnJvbUNoYXJDb2RlKFBJQ0ludGVyZmFjZS5QSUNfWCkgJiYgdGhpcy5nZXREaXJlY3RpdmVMZW4oMCkgPT09IHRoaXMuX21hc2tTaXplKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlzIG1hc2sgYXQgcG9zaXRpb24gcG9zIGlzIHNhbWUgYXMgcGFyYW1ldGVyIG1hc2tQaWNcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj48L3BhcmFtPlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcIm1hc2tQaWNcIj48L3BhcmFtPlxyXG4vLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc01hc2tQaWNFcShwb3M6IG51bWJlciwgbWFza1BpYzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbXNrW3Bvc10gPT09IFN0cmluZy5mcm9tQ2hhckNvZGUobWFza1BpYyk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBjaGVjayBpZiB0aGUgaW5wdXQgY2hhciBpcyB2YWxpZCBmb3IgbG9jYWwgQVM0MDAgKHN5c3RlbSBpKSBwaWN0dXJlcy5cclxuLy8vICAgKERCQ1MgU3VwcG9ydClcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJjaGFyVG9WYWxpZGF0ZVwiPjwvcGFyYW0+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwiZmlyc3RDaGFyXCI+PC9wYXJhbT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj48L3BhcmFtPlxyXG4vLy8gPHJldHVybnM+IDAgaWYgbm90IHZhbGlkIG9yIGEgY2hhciBpZiB2YWxpZC48L3JldHVybnM+XHJcbiAgcHVibGljIGlzVmFsaWRDaGFyX2FzNDAwKGNoYXJUb1ZhbGlkYXRlOiBzdHJpbmcsIGZpcnN0Q2hhcjogc3RyaW5nLCBwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldCA9IHRydWU7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9tc2tbcG9zXS5jaGFyQ29kZUF0KDApKSB7XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KOlxyXG4gICAgICAvLyBvbmx5IGZ1bGwtd2lkdGggY2hhcmFjdGVycyBhcmUgYWxsb3dlZFxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRzpcclxuICAgICAgICByZXQgPSAhVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKGNoYXJUb1ZhbGlkYXRlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfVCk6IC8vIG1peHR1cmUgb2YgZnVsbC13aWR0aCBhbmQgaGFsZi13aWR0aCBpcyBub3QgYWxsb3dlZFxyXG4gICAgICAgIGlmIChmaXJzdENoYXIgPT09ICdcXHgwMDAwJylcclxuICAgICAgICAgIHJldCA9IHRydWU7XHJcbiAgICAgICAgZWxzZSBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKGZpcnN0Q2hhcikpXHJcbiAgICAgICAgICByZXQgPSBVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoY2hhclRvVmFsaWRhdGUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJldCA9ICFVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoY2hhclRvVmFsaWRhdGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19TKTogLy8gb25seSBoYWxmLXdpZHRoIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWRcclxuICAgICAgICByZXQgPSBVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoY2hhclRvVmFsaWRhdGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICByZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGxlbmd0aFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1pbmltdW1WYWx1ZUxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbkxlbmd0aCA9IHRoaXMuZ2V0TWFza0xlbmd0aCgpO1xyXG5cclxuICAgIC8vIHRyYXZlcnNlIGZyb20gcmlnaHQgdGlsbCBhIHZhbGlkIG1hc2sgY2hhciBpcyBlbmNvdW50ZXJlZFxyXG4gICAgd2hpbGUgKG1pbkxlbmd0aCA+IDAgJiYgIXRoaXMucGljSXNNYXNrKG1pbkxlbmd0aCAtIDEpKVxyXG4gICAgICBtaW5MZW5ndGgtLTtcclxuXHJcbiAgICByZXR1cm4gbWluTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJ7UGljdHVyZTogXCIgKyB0aGlzLl9mb3JtYXQgKyBcIn1cIjtcclxuICB9XHJcbn1cclxuIl19