@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
@@ -0,0 +1,1706 @@
1
+ import { PIC } from './PIC';
2
+ import { DateTime, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
3
+ import { DateUtil, HTML_2_STR, MsgInterface, PICInterface, SEQ_2_HTML, StorageAttribute, StrUtil, UtilDateJpn, UtilStrByteMode } from '@magic-xpa/utils';
4
+ import { BlobType } from '../data/BlobType';
5
+ import { ValidationDetailsBase } from './ValidationDetailsBase';
6
+ import { NUM_TYPE } from '../data/NUM_TYPE';
7
+ import { HebrewDate } from './HebrewDate';
8
+ import { Events } from '../../Events';
9
+ import { GuiEnvironment } from '../../GuiEnvironment';
10
+ import { MemoryUtil } from '../../util/MemoryUtil';
11
+ export class DisplayConvertor {
12
+ constructor() {
13
+ this._environment = null;
14
+ this.DATECHAR = 0;
15
+ this._environment = GuiEnvironment.Environment;
16
+ }
17
+ static get Instance() {
18
+ if (DisplayConvertor._instance === null) {
19
+ DisplayConvertor._instance = new DisplayConvertor();
20
+ }
21
+ return DisplayConvertor._instance;
22
+ }
23
+ getNewDateBreakParams() {
24
+ return new DateBreakParams();
25
+ }
26
+ getNewTimeBreakParams() {
27
+ return new TimeBreakParams();
28
+ }
29
+ mg2disp(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase, time_date_num_pic_Z_edt) {
30
+ if (arguments.length === 6)
31
+ return this.mg2disp_0(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx);
32
+ else if (arguments.length === 7)
33
+ return this.mg2disp_1(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase);
34
+ else
35
+ return this.mg2disp_2(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase, time_date_num_pic_Z_edt);
36
+ }
37
+ mg2disp_0(mgValue, rangeStr, pic, useNative, compIdx, time_date_pic_Z_edt) {
38
+ return this.mg2disp(mgValue, rangeStr, pic, useNative, false, compIdx, time_date_pic_Z_edt);
39
+ }
40
+ mg2disp_1(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, time_date_pic_Z_edt) {
41
+ return this.mg2disp(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, false, time_date_pic_Z_edt);
42
+ }
43
+ mg2disp_2(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, convertCase, time_date_num_pic_Z_edt) {
44
+ let str = "";
45
+ let tmpRange = (rangeStr === null) ? "" : rangeStr;
46
+ switch (pic.getAttr()) {
47
+ case StorageAttribute.ALPHA:
48
+ case StorageAttribute.UNICODE:
49
+ str = this.fromAlpha(mgValue, pic, tmpRange, alwaysFill, convertCase);
50
+ break;
51
+ case StorageAttribute.NUMERIC: {
52
+ let newPic = pic.getUnformattedNumericPic();
53
+ let dec = GuiEnvironment.Environment.GetDecimal();
54
+ let thou = GuiEnvironment.Environment.GetThousands();
55
+ GuiEnvironment.Environment.setDecimalSeparator('.');
56
+ GuiEnvironment.Environment.setThousandsSeparator(',');
57
+ str = this.fromNum(mgValue, newPic);
58
+ GuiEnvironment.Environment.setDecimalSeparator(dec);
59
+ GuiEnvironment.Environment.setThousandsSeparator(thou);
60
+ if (newPic.getMaskChars() === 0 || !time_date_num_pic_Z_edt)
61
+ str = StrUtil.ltrim(str);
62
+ if (useNative) {
63
+ if (str == "")
64
+ return null;
65
+ let dbl = Number(str);
66
+ return dbl;
67
+ }
68
+ else
69
+ return str;
70
+ }
71
+ case StorageAttribute.DATE: {
72
+ if (useNative) {
73
+ let dt;
74
+ dt = this.fromMgDateToNativeDate(mgValue, compIdx);
75
+ return dt;
76
+ }
77
+ else {
78
+ str = this.fromDate(mgValue, pic, compIdx, time_date_num_pic_Z_edt);
79
+ break;
80
+ }
81
+ }
82
+ case StorageAttribute.TIME: {
83
+ if (useNative) {
84
+ let dt;
85
+ dt = this.fromMgTimeToNativeTime(mgValue, pic);
86
+ return dt;
87
+ }
88
+ else {
89
+ str = this.fromTime(mgValue, pic, time_date_num_pic_Z_edt);
90
+ break;
91
+ }
92
+ }
93
+ case StorageAttribute.BOOLEAN: {
94
+ let logVal;
95
+ logVal = this.fromMgLogicalToNativeLogical(mgValue);
96
+ return logVal;
97
+ }
98
+ case StorageAttribute.BLOB:
99
+ str = BlobType.getString(mgValue);
100
+ break;
101
+ case StorageAttribute.BLOB_VECTOR:
102
+ str = mgValue;
103
+ break;
104
+ }
105
+ return str;
106
+ }
107
+ disp2mg(dispValue, pic, compIdx, blobContentType) {
108
+ let str = "";
109
+ switch (pic.getAttr()) {
110
+ case StorageAttribute.ALPHA:
111
+ case StorageAttribute.UNICODE:
112
+ str = this.toAlpha(dispValue, pic);
113
+ break;
114
+ case StorageAttribute.NUMERIC:
115
+ {
116
+ dispValue = String(dispValue);
117
+ let len = dispValue.length;
118
+ while (len > 0) {
119
+ if (!pic.picIsMask(len - 1) && dispValue[len - 1] !== (' '))
120
+ break;
121
+ len--;
122
+ }
123
+ if (dispValue.length > len)
124
+ dispValue = NString.Remove(dispValue, len, (dispValue.length - len));
125
+ if (pic.isNegative() && dispValue.trim().startsWith("-"))
126
+ dispValue = StrUtil.ltrim(dispValue);
127
+ let dec = GuiEnvironment.Environment.GetDecimal();
128
+ let thou = GuiEnvironment.Environment.GetThousands();
129
+ GuiEnvironment.Environment.setDecimalSeparator('.');
130
+ GuiEnvironment.Environment.setThousandsSeparator(',');
131
+ let newPic = pic.getUnformattedNumericPic();
132
+ str = this.toNum(dispValue, newPic, compIdx);
133
+ GuiEnvironment.Environment.setDecimalSeparator(dec);
134
+ GuiEnvironment.Environment.setThousandsSeparator(thou);
135
+ }
136
+ break;
137
+ case StorageAttribute.DATE:
138
+ {
139
+ let dt;
140
+ if (typeof dispValue === 'string')
141
+ dt = new Date(dispValue);
142
+ else
143
+ dt = dispValue;
144
+ str = this.fromNativeDateToMgDate(dt, pic);
145
+ }
146
+ break;
147
+ case StorageAttribute.TIME:
148
+ {
149
+ let dt;
150
+ if (typeof dispValue === 'string') {
151
+ dt = new Date();
152
+ if (dispValue !== null) {
153
+ dt.setHours(+String(dispValue).substr(0, 2));
154
+ dt.setMinutes(+String(dispValue).substr(0, 2));
155
+ if (String(dispValue).length > 5)
156
+ dt.setSeconds(+String(dispValue).substr(0, 2));
157
+ }
158
+ }
159
+ else
160
+ dt = dispValue;
161
+ str = this.fromNativeTimeToMgTime(dt);
162
+ }
163
+ break;
164
+ case StorageAttribute.BOOLEAN:
165
+ str = this.fromNativeLogicalToMgLogical(dispValue);
166
+ break;
167
+ case StorageAttribute.BLOB:
168
+ str = BlobType.createFromString(dispValue, blobContentType);
169
+ break;
170
+ }
171
+ return str;
172
+ }
173
+ fromNum(mgValue, pic) {
174
+ let mgNum = new NUM_TYPE(mgValue);
175
+ return mgNum.toDisplayValue(pic);
176
+ }
177
+ fromAlpha(dataStr, pic, rangeStr, alwaysFill, convertCase) {
178
+ let len = pic.getMaskSize();
179
+ let min_len = len;
180
+ let maskStr = pic.getMask();
181
+ let resStr;
182
+ if (pic.getMaskChars() > 0) {
183
+ resStr = this.win_data_cpy(NString.ToCharArray(maskStr), len, NString.ToCharArray(dataStr), pic.isAttrAlpha(), convertCase);
184
+ }
185
+ else {
186
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha()) {
187
+ let intDataStrLenB = UtilStrByteMode.lenB(dataStr);
188
+ if (min_len > intDataStrLenB) {
189
+ min_len = intDataStrLenB;
190
+ }
191
+ resStr = UtilStrByteMode.leftB(dataStr, min_len);
192
+ }
193
+ else if (dataStr !== null) {
194
+ if (min_len > dataStr.length) {
195
+ min_len = dataStr.length;
196
+ }
197
+ if (convertCase) {
198
+ resStr = this.win_data_cpy(NString.ToCharArray(maskStr), len, NString.ToCharArray(dataStr), pic.isAttrAlpha(), convertCase);
199
+ }
200
+ else {
201
+ resStr = dataStr.substr(0, min_len);
202
+ }
203
+ }
204
+ }
205
+ if (alwaysFill || (rangeStr !== null && rangeStr.length > 0 && resStr.length < len)) {
206
+ let vd = new ValidationDetailsBase(rangeStr);
207
+ let continuousRangeValues = vd.getContinuousRangeValues();
208
+ let discreteRangeValues = vd.getDiscreteRangeValues();
209
+ if (continuousRangeValues !== null || discreteRangeValues !== null) {
210
+ resStr = this.fillAlphaByRange(continuousRangeValues, discreteRangeValues, resStr);
211
+ }
212
+ }
213
+ return resStr;
214
+ }
215
+ caseConvertedChar(data, mask) {
216
+ let ch;
217
+ if (mask.charCodeAt(0) === PICInterface.PIC_U) {
218
+ ch = data.toUpperCase();
219
+ }
220
+ else {
221
+ if (mask.charCodeAt(0) === PICInterface.PIC_L) {
222
+ ch = data.toLowerCase();
223
+ }
224
+ else {
225
+ ch = data;
226
+ }
227
+ }
228
+ return ch;
229
+ }
230
+ win_data_cpy(maskStr, maskLen, dataStr, isAttrAlpha, convertCase) {
231
+ if (arguments.length === 4)
232
+ return this.win_data_cpy_0(maskStr, maskLen, dataStr, isAttrAlpha);
233
+ return this.win_data_cpy_1(maskStr, maskLen, dataStr, isAttrAlpha, convertCase);
234
+ }
235
+ win_data_cpy_0(maskStr, maskLen, dataStr, isAttrAlpha) {
236
+ return this.win_data_cpy(maskStr, maskLen, dataStr, isAttrAlpha, false);
237
+ }
238
+ win_data_cpy_1(maskStr, maskLen, dataStr, isAttrAlpha, convertCase) {
239
+ let maskIdx = 0;
240
+ let dataIdx = 0;
241
+ let resStr = new Array(maskLen);
242
+ if (isAttrAlpha && UtilStrByteMode.isLocaleDefLangDBCS()) {
243
+ let num2 = 0;
244
+ while (maskIdx < maskLen && num2 < maskLen) {
245
+ if (maskStr[maskIdx].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
246
+ if (dataIdx < dataStr.length) {
247
+ let strVal = NString.FromChars(dataStr, dataIdx, 1);
248
+ if (UtilStrByteMode.lenB(strVal) === 2) {
249
+ if (maskIdx + 1 < maskLen) {
250
+ if (maskStr[maskIdx + 1].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
251
+ if (convertCase) {
252
+ resStr[num2++] = this.caseConvertedChar(dataStr[dataIdx++], maskStr[maskIdx + 1]);
253
+ }
254
+ else {
255
+ resStr[num2++] = dataStr[dataIdx++];
256
+ }
257
+ maskIdx = maskIdx + 1;
258
+ }
259
+ else {
260
+ resStr[num2++] = ' ';
261
+ }
262
+ }
263
+ else {
264
+ resStr[num2++] = ' ';
265
+ }
266
+ }
267
+ else {
268
+ if (convertCase) {
269
+ resStr[num2++] = this.caseConvertedChar(dataStr[dataIdx++], maskStr[maskIdx + 1]);
270
+ }
271
+ else {
272
+ resStr[num2++] = dataStr[dataIdx++];
273
+ }
274
+ }
275
+ }
276
+ else {
277
+ resStr[num2++] = ' ';
278
+ }
279
+ }
280
+ else {
281
+ resStr[num2++] = maskStr[maskIdx];
282
+ }
283
+ maskIdx = maskIdx + 1;
284
+ }
285
+ return NString.FromChars(resStr).substr(0, num2);
286
+ }
287
+ while (maskIdx < maskLen) {
288
+ if (maskStr[maskIdx].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
289
+ if (dataIdx < dataStr.length) {
290
+ resStr[maskIdx] = dataStr[dataIdx];
291
+ if (convertCase) {
292
+ resStr[maskIdx] = this.caseConvertedChar(dataStr[dataIdx], maskStr[maskIdx]);
293
+ }
294
+ else {
295
+ resStr[maskIdx] = dataStr[dataIdx];
296
+ }
297
+ dataIdx = dataIdx + 1;
298
+ }
299
+ else {
300
+ resStr[maskIdx] = ' ';
301
+ }
302
+ }
303
+ else {
304
+ resStr[maskIdx] = maskStr[maskIdx];
305
+ }
306
+ maskIdx = maskIdx + 1;
307
+ }
308
+ return NString.FromChars(resStr);
309
+ }
310
+ fromDate(dataStr, pic, compIdx, time_date_pic_Z_edt) {
311
+ let mask = pic.getMask();
312
+ let maskSize = pic.getMaskSize();
313
+ let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
314
+ return this.to_a_pic_datemode(mask, maskSize, date, pic, time_date_pic_Z_edt, false, compIdx);
315
+ }
316
+ fromTime(dataStr, pic, time_date_pic_Z_edt) {
317
+ let mask = pic.getMask();
318
+ let maskSize = pic.getMaskSize();
319
+ let time = new NUM_TYPE(dataStr).NUM_2_ULONG();
320
+ return this.time_2_a_pic(mask, maskSize, time, pic, time_date_pic_Z_edt, false);
321
+ }
322
+ fromMgDateToNativeDate(dataStr, compIdx) {
323
+ let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
324
+ let breakParams;
325
+ let outIdx = 0;
326
+ breakParams = new DateBreakParams();
327
+ this.date_break_datemode(breakParams, date, false, compIdx);
328
+ if (breakParams.month > 0)
329
+ breakParams.month = breakParams.month - 1;
330
+ if (breakParams.year == 0 && breakParams.month == 0 && breakParams.day == 0)
331
+ return null;
332
+ let nativeDt = new Date(breakParams.year, breakParams.month, breakParams.day);
333
+ return nativeDt;
334
+ }
335
+ fromNativeDateToMgDateNumber(nativeDate, pic) {
336
+ let mgNum = new NUM_TYPE();
337
+ let numVal;
338
+ let dateParams;
339
+ let millenium = 0;
340
+ let year = nativeDate.getFullYear();
341
+ let day = nativeDate.getDate();
342
+ let month = nativeDate.getMonth() + 1;
343
+ if (pic.isHebrew()) {
344
+ if (year > 0) {
345
+ if (millenium === 0)
346
+ millenium = 5;
347
+ year += millenium * 1000;
348
+ }
349
+ numVal = (HebrewDate.dateheb_2_d(year, month, day));
350
+ }
351
+ else {
352
+ if (year === 0) {
353
+ dateParams = this.date_sys();
354
+ year = dateParams.year;
355
+ }
356
+ numVal = this.date_4_calender(year, month, day, 0, false);
357
+ }
358
+ return numVal;
359
+ }
360
+ fromNativeDateToMgDate(nativeDate, pic) {
361
+ let mgNum = new NUM_TYPE();
362
+ let numVal = nativeDate == null ? 0 : this.fromNativeDateToMgDateNumber(nativeDate, pic);
363
+ mgNum.NUM_4_LONG(numVal);
364
+ return mgNum.toXMLrecord();
365
+ }
366
+ to_a_pic_datemode(outStr, out_len, date, pic, date_pic_Z_edt, ignore_dt_fmt, compIdx) {
367
+ let len;
368
+ let day = 0;
369
+ let doy = 0;
370
+ let dow = 0;
371
+ let year = 0;
372
+ let month = 0;
373
+ let hday = 0;
374
+ let hyear = 0;
375
+ let hmonth = 0;
376
+ let leap = false;
377
+ let i;
378
+ let p;
379
+ let outVal = NString.ToCharArray(outStr);
380
+ let breakParams;
381
+ let dateNameParams;
382
+ let outIdx = 0;
383
+ let strOut = null;
384
+ if (pic.getMaskSize() > out_len) {
385
+ for (; i < out_len; i++)
386
+ outVal[i] = '*';
387
+ return NString.FromChars(outVal);
388
+ }
389
+ out_len = len = pic.getMaskSize();
390
+ if (pic.zeroFill() && date === 0 && !date_pic_Z_edt) {
391
+ for (; i < out_len; i++)
392
+ outVal[i] = pic.getZeroPad();
393
+ return NString.FromChars(outVal);
394
+ }
395
+ if (pic.isHebrew() && (date === 0 || date === 1000000000)) {
396
+ for (; i < out_len; i++)
397
+ outVal[i] = ' ';
398
+ return NString.FromChars(outVal);
399
+ }
400
+ breakParams = new DateBreakParams(year, month, day, doy, dow);
401
+ this.date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx);
402
+ if (pic.isHebrew()) {
403
+ let refhday = new RefParam(hday);
404
+ let refhmonth = new RefParam(hmonth);
405
+ let refhyear = new RefParam(hyear);
406
+ leap = HebrewDate.dateheb_4_d(date, refhday, refhmonth, refhyear);
407
+ hday = refhday.value;
408
+ hmonth = refhmonth.value;
409
+ hyear = refhyear.value;
410
+ }
411
+ year = breakParams.year;
412
+ month = breakParams.month;
413
+ day = breakParams.day;
414
+ doy = breakParams.doy;
415
+ dow = breakParams.dow;
416
+ breakParams = null;
417
+ while (len > 0) {
418
+ let refOutLen = new RefParam(out_len);
419
+ switch (outVal[outIdx].charCodeAt(0)) {
420
+ case PICInterface.PIC_YY:
421
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
422
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
423
+ else
424
+ this.int_2_a(outVal, outIdx, 2, year, '0');
425
+ outIdx += 2;
426
+ len -= 2;
427
+ break;
428
+ case PICInterface.PIC_HYYYYY:
429
+ i = HebrewDate.dateheb_2_str(outVal, outIdx, len, refOutLen, 5, hyear, pic.isTrimed(), true);
430
+ out_len = refOutLen.value;
431
+ outIdx += i;
432
+ len -= i;
433
+ break;
434
+ case PICInterface.PIC_HL:
435
+ i = HebrewDate.dateheb_i_2_h((hyear / 1000) % 10, outVal, outIdx, false, false);
436
+ outIdx++;
437
+ len--;
438
+ break;
439
+ case PICInterface.PIC_HDD:
440
+ i = HebrewDate.dateheb_2_str(outVal, outIdx, len, refOutLen, 2, hday, pic.isTrimed(), false);
441
+ out_len = refOutLen.value;
442
+ outIdx += i;
443
+ len -= i;
444
+ break;
445
+ case PICInterface.PIC_YYYY:
446
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
447
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 4);
448
+ else
449
+ this.int_2_a(outVal, outIdx, 4, year, '0');
450
+ outIdx += 4;
451
+ len -= 4;
452
+ break;
453
+ case PICInterface.PIC_MMD:
454
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
455
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
456
+ else
457
+ this.int_2_a(outVal, outIdx, 2, month, '0');
458
+ outIdx += 2;
459
+ len -= 2;
460
+ break;
461
+ case PICInterface.PIC_MMM:
462
+ if (pic.isHebrew()) {
463
+ if (leap && hmonth === 6)
464
+ hmonth = 14;
465
+ let monthNames = HebrewDate.GetLocalMonths();
466
+ p = NString.ToCharArray(monthNames[hmonth]);
467
+ }
468
+ else {
469
+ let monthStr = Events.GetMessageString(MsgInterface.MONTHS_PTR);
470
+ let monthNames = DateUtil.getLocalMonths(monthStr);
471
+ p = NString.ToCharArray(monthNames[month]);
472
+ }
473
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
474
+ out_len -= this.date_i_2_nm(dateNameParams, p, pic.isTrimed());
475
+ outIdx = dateNameParams.outIdx;
476
+ len = dateNameParams.len;
477
+ dateNameParams = null;
478
+ break;
479
+ case PICInterface.PIC_DD:
480
+ let isZero = pic.zeroFill();
481
+ if (isZero && date === 0 && date_pic_Z_edt)
482
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
483
+ else
484
+ this.int_2_a(outVal, outIdx, 2, day, '0');
485
+ outIdx += 2;
486
+ len -= 2;
487
+ break;
488
+ case PICInterface.PIC_DDD:
489
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
490
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 3);
491
+ else
492
+ this.int_2_a(outVal, outIdx, 3, doy, '0');
493
+ len -= 3;
494
+ outIdx += 3;
495
+ break;
496
+ case PICInterface.PIC_DDDD:
497
+ i = this.date_2_DDDD(day, outVal, outIdx, len, pic.isTrimed());
498
+ outIdx += i;
499
+ out_len += i - 4;
500
+ len -= 4;
501
+ break;
502
+ case PICInterface.PIC_W:
503
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
504
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 1);
505
+ else
506
+ this.int_2_a(outVal, outIdx, 1, dow, '0');
507
+ len--;
508
+ outIdx++;
509
+ break;
510
+ case PICInterface.PIC_WWW:
511
+ if (pic.isHebrew()) {
512
+ let dowsNames = HebrewDate.GetLocalDows();
513
+ p = NString.ToCharArray(dowsNames[dow]);
514
+ }
515
+ else {
516
+ let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
517
+ let dayNames = DateUtil.getLocalDays(dayStr);
518
+ p = NString.ToCharArray(dayNames[dow]);
519
+ }
520
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
521
+ out_len -= this.date_i_2_nm(dateNameParams, p, pic.isTrimed());
522
+ outIdx = dateNameParams.outIdx;
523
+ len = dateNameParams.len;
524
+ dateNameParams = null;
525
+ break;
526
+ case PICInterface.PIC_BB:
527
+ p = NString.ToCharArray(UtilDateJpn.getStrDow(dow));
528
+ strOut = null;
529
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
530
+ strOut = this.date_i_2_nm_bytemode(strOut, dateNameParams, NString.FromChars(p), out_len);
531
+ outVal = new Array(strOut.length);
532
+ NString.CopyTo(strOut, 0, outVal, 0, strOut.length);
533
+ outIdx = dateNameParams.outIdx;
534
+ len = dateNameParams.len;
535
+ strOut = null;
536
+ dateNameParams = null;
537
+ break;
538
+ case PICInterface.PIC_JY1:
539
+ case PICInterface.PIC_JY2:
540
+ case PICInterface.PIC_JY4:
541
+ let strNum = null;
542
+ if (outVal[outIdx].charCodeAt(0) === PICInterface.PIC_JY1)
543
+ strNum = UtilDateJpn.getInstance().date_jpn_yr_2_a(year, doy, false);
544
+ else
545
+ strNum = UtilDateJpn.getInstance().date_jpn_yr_2_a(year, doy, true);
546
+ strOut = null;
547
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
548
+ strOut = this.date_i_2_nm_bytemode(strOut, dateNameParams, strNum, out_len);
549
+ outVal = null;
550
+ outVal = new Array(strOut.length);
551
+ NString.CopyTo(strOut, 0, outVal, 0, strOut.length);
552
+ outIdx = dateNameParams.outIdx;
553
+ len = dateNameParams.len;
554
+ strOut = null;
555
+ dateNameParams = null;
556
+ break;
557
+ case PICInterface.PIC_YJ:
558
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
559
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
560
+ else
561
+ this.int_2_a(outVal, outIdx, 2, UtilDateJpn.getInstance().date_jpn_year_ofs(year, doy), '0');
562
+ outIdx += 2;
563
+ len -= 2;
564
+ break;
565
+ default:
566
+ outIdx++;
567
+ len--;
568
+ break;
569
+ }
570
+ }
571
+ if (out_len < outVal.length)
572
+ MemoryUtil.char_memset(outVal, out_len, ' ', outVal.length - out_len);
573
+ return NString.FromChars(outVal);
574
+ }
575
+ date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx) {
576
+ let year = breakParams.year;
577
+ let month = breakParams.month;
578
+ let day = breakParams.day;
579
+ let doy = breakParams.doy;
580
+ let dow = breakParams.dow;
581
+ if (date <= 0) {
582
+ breakParams.day = 0;
583
+ breakParams.doy = 0;
584
+ breakParams.dow = 0;
585
+ breakParams.year = 0;
586
+ breakParams.month = 0;
587
+ }
588
+ else {
589
+ dow = date % 7 + 1;
590
+ date = date - 1;
591
+ let cent4 = Math.floor(date / PICInterface.DAYSINFOURCENT);
592
+ date = date - cent4 * PICInterface.DAYSINFOURCENT;
593
+ let cent = Math.floor(date / PICInterface.DAYSINCENTURY);
594
+ if (cent > 3) {
595
+ cent = 3;
596
+ }
597
+ date = date - cent * PICInterface.DAYSINCENTURY;
598
+ let year4 = Math.floor(date / PICInterface.DAYSINFOURYEAR);
599
+ date = date - year4 * PICInterface.DAYSINFOURYEAR;
600
+ year = Math.floor(date / PICInterface.DAYSINYEAR);
601
+ if (year > 3) {
602
+ year = 3;
603
+ }
604
+ date = date - year * PICInterface.DAYSINYEAR;
605
+ year = cent4 * 400 + cent * 100 + year4 * 4 + year + 1;
606
+ let leapyear = 0;
607
+ if (year % 4 === 0) {
608
+ if (year % 100 !== 0 || year % 400 === 0) {
609
+ leapyear = 1;
610
+ }
611
+ }
612
+ if (!ignore_dt_fmt && this._environment.GetDateMode(compIdx) === 'B') {
613
+ year = year + PICInterface.DATE_BUDDHIST_GAP;
614
+ }
615
+ month = (Math.floor(date / PICInterface.DAYSINMONTH) + 1);
616
+ day = PICInterface.date_day_tab[month];
617
+ if (leapyear > 0) {
618
+ if (month > 1) {
619
+ day = day + 1;
620
+ }
621
+ }
622
+ if (date >= day) {
623
+ month = month + 1;
624
+ }
625
+ else {
626
+ day = PICInterface.date_day_tab[month - 1];
627
+ if (leapyear > 0) {
628
+ if (month > 2) {
629
+ day = day + 1;
630
+ }
631
+ }
632
+ }
633
+ day = date - day + 1;
634
+ doy = date + 1;
635
+ breakParams.year = year;
636
+ breakParams.month = month;
637
+ breakParams.day = day;
638
+ breakParams.doy = doy;
639
+ breakParams.dow = dow;
640
+ }
641
+ }
642
+ int_2_a(str, strPos, len, n, lead) {
643
+ let neg = n < 0;
644
+ if (len <= 0)
645
+ return;
646
+ n = Math.abs(n);
647
+ let pos = len;
648
+ do {
649
+ str[strPos + (pos = pos - 1)] = String.fromCharCode(48 + n % 10);
650
+ n = Math.floor(n / 10);
651
+ } while (pos > 0 && n > 0);
652
+ if (neg && pos > 0) {
653
+ str[strPos + (pos = pos - 1)] = '-';
654
+ }
655
+ return this.lib_a_fill(str, strPos, len, pos, lead.charCodeAt(0));
656
+ }
657
+ lib_a_fill(str, strPos, len, pos, lead) {
658
+ if (lead === 0) {
659
+ len = len - pos;
660
+ if (len > 0 && pos > 0) {
661
+ MemoryUtil.char_memcpy(str, strPos, str, pos, len);
662
+ MemoryUtil.char_memset(str, strPos + len, ' ', pos);
663
+ }
664
+ }
665
+ else {
666
+ if (pos > 0) {
667
+ MemoryUtil.char_memset(str, strPos, String.fromCharCode(lead), pos);
668
+ }
669
+ }
670
+ return len;
671
+ }
672
+ date_i_2_nm(dateNameParams, nm, trim) {
673
+ let n = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
674
+ let l;
675
+ if (trim) {
676
+ l = MemoryUtil.mem_trim(nm, 0, n);
677
+ }
678
+ else {
679
+ l = n;
680
+ }
681
+ l = Math.min(l, dateNameParams.len);
682
+ MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, nm, 0, l);
683
+ dateNameParams.outIdx = dateNameParams.outIdx + l;
684
+ dateNameParams.len = dateNameParams.len - n;
685
+ n = n - l;
686
+ if (n > 0) {
687
+ MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.outVal, dateNameParams.outIdx + n, dateNameParams.len);
688
+ }
689
+ return n;
690
+ }
691
+ date_i_2_nm_bytemode(strOut, dateNameParams, strNm, intOutLen) {
692
+ let intMskCnt = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
693
+ let strWork = NString.FromChars(dateNameParams.outVal);
694
+ strWork = strWork.substr(0, dateNameParams.outIdx);
695
+ let intOfs = UtilStrByteMode.lenB(strWork);
696
+ strNm = UtilStrByteMode.leftB(strNm, intMskCnt);
697
+ strOut = UtilStrByteMode.repB(NString.FromChars(dateNameParams.outVal), strNm, intOfs + 1, intMskCnt);
698
+ dateNameParams.outIdx = dateNameParams.outIdx + strNm.length;
699
+ dateNameParams.len = dateNameParams.len - intMskCnt;
700
+ intOutLen = intOutLen - intMskCnt;
701
+ return strOut;
702
+ }
703
+ date_msk_cnt(msk, mskPos, len) {
704
+ let c = msk[mskPos++];
705
+ let i = 1;
706
+ while (i < len) {
707
+ if (msk[mskPos] !== c) {
708
+ break;
709
+ }
710
+ mskPos = mskPos + 1;
711
+ i = i + 1;
712
+ }
713
+ return i;
714
+ }
715
+ date_2_DDDD(day, outVal, outIdx, len, trim) {
716
+ let ret = 4;
717
+ let ext;
718
+ if (day > 9) {
719
+ this.int_2_a(outVal, outIdx, 2, day, 0..toString());
720
+ outIdx += 2;
721
+ }
722
+ else {
723
+ if (trim) {
724
+ MemoryUtil.char_memcpy(outVal, outIdx, outVal, outIdx + 1, len - 1);
725
+ ret--;
726
+ }
727
+ else {
728
+ outVal[outIdx++] = ' ';
729
+ }
730
+ this.int_2_a(outVal, outIdx, 1, day, 0..toString());
731
+ outIdx++;
732
+ }
733
+ switch (day) {
734
+ case 1:
735
+ case 21:
736
+ case 31:
737
+ ext = NString.ToCharArray("st");
738
+ break;
739
+ case 2:
740
+ case 22:
741
+ ext = NString.ToCharArray("nd");
742
+ break;
743
+ case 3:
744
+ case 23:
745
+ ext = NString.ToCharArray("rd");
746
+ break;
747
+ default:
748
+ ext = NString.ToCharArray("th");
749
+ break;
750
+ }
751
+ outVal[outIdx++] = ext[0];
752
+ outVal[outIdx] = ext[1];
753
+ return (ret);
754
+ }
755
+ fromMgTimeToNativeTime(dataStr, pic) {
756
+ let mask = pic.getMask();
757
+ let maskSize = pic.getMaskSize();
758
+ let time = new NUM_TYPE(dataStr).NUM_2_ULONG();
759
+ let breakParams = new TimeBreakParams();
760
+ DisplayConvertor.time_break(breakParams, time);
761
+ let nativeDt = new Date();
762
+ nativeDt.setHours(breakParams.hour);
763
+ nativeDt.setMinutes(breakParams.minute);
764
+ nativeDt.setSeconds(breakParams.second);
765
+ return nativeDt;
766
+ }
767
+ time_2_a_pic(AsciiStr, AsciiL, time, pic, time_pic_Z_edt, milliSeconds) {
768
+ let hour = 0;
769
+ let minute = 0;
770
+ let second = 0;
771
+ let millisec = 0;
772
+ let Ascii = NString.ToCharArray(AsciiStr);
773
+ let breakParams = new TimeBreakParams(hour, minute, second);
774
+ let timeSec;
775
+ if (milliSeconds) {
776
+ timeSec = Math.floor(time / 1000);
777
+ millisec = time - timeSec * 1000;
778
+ }
779
+ else {
780
+ timeSec = time;
781
+ }
782
+ DisplayConvertor.time_break(breakParams, timeSec);
783
+ hour = breakParams.hour;
784
+ minute = breakParams.minute;
785
+ second = breakParams.second;
786
+ let result;
787
+ if (pic.getMaskSize() > AsciiL) {
788
+ MemoryUtil.char_memset(Ascii, 0, '*', AsciiL);
789
+ result = NString.FromChars(Ascii);
790
+ }
791
+ else {
792
+ if (pic.zeroFill()) {
793
+ if (timeSec === 0 && (!milliSeconds || millisec === 0)) {
794
+ if (time_pic_Z_edt) {
795
+ for (let intx = 0; intx < pic.getMaskSize(); intx = intx + 1) {
796
+ if (Ascii[intx] <= '\u001f') {
797
+ Ascii[intx] = pic.getZeroPad();
798
+ }
799
+ }
800
+ result = NString.FromChars(Ascii);
801
+ return result;
802
+ }
803
+ MemoryUtil.char_memset(Ascii, 0, pic.getZeroPad(), pic.getMaskSize());
804
+ result = NString.FromChars(Ascii);
805
+ return result;
806
+ }
807
+ }
808
+ let I = 0;
809
+ let am = 0;
810
+ let len = pic.getMaskSize();
811
+ let HourI = -1;
812
+ while (I < len) {
813
+ switch (Ascii[I].charCodeAt(0)) {
814
+ case (PICInterface.PIC_HH):
815
+ HourI = I;
816
+ I += 2;
817
+ break;
818
+ case (PICInterface.PIC_MMT):
819
+ this.int_2_a(Ascii, I, 2, minute, '0');
820
+ I += 2;
821
+ break;
822
+ case (PICInterface.PIC_SS):
823
+ this.int_2_a(Ascii, I, 2, second, '0');
824
+ I += 2;
825
+ break;
826
+ case (PICInterface.PIC_MS):
827
+ this.int_2_a(Ascii, I, 3, millisec, '0');
828
+ I += 3;
829
+ break;
830
+ case (PICInterface.PIC_PM):
831
+ am = 1;
832
+ let tmpHour = hour % 24;
833
+ if (tmpHour < 12 || tmpHour === 0)
834
+ MemoryUtil.char_memcpy(Ascii, I, NString.ToCharArray("am"), 0, 2);
835
+ else
836
+ MemoryUtil.char_memcpy(Ascii, I, NString.ToCharArray("pm"), 0, 2);
837
+ I += 2;
838
+ break;
839
+ default:
840
+ I++;
841
+ break;
842
+ }
843
+ }
844
+ if (HourI >= 0) {
845
+ if (am > 0) {
846
+ hour = hour % 24;
847
+ if (hour === 0) {
848
+ hour = 12;
849
+ }
850
+ else {
851
+ hour = hour % 12;
852
+ if (hour === 0) {
853
+ hour = 12;
854
+ }
855
+ }
856
+ }
857
+ this.int_2_a(Ascii, HourI, 2, hour, (am !== 0 && hour < 10) ? ' ' : '0');
858
+ }
859
+ result = NString.FromChars(Ascii);
860
+ }
861
+ return result;
862
+ }
863
+ static time_break(breakParams, time) {
864
+ if (time <= 0) {
865
+ breakParams.second = 0;
866
+ breakParams.minute = 0;
867
+ breakParams.hour = 0;
868
+ }
869
+ else {
870
+ breakParams.hour = Math.floor(time / 3600);
871
+ time = time - breakParams.hour * 3600;
872
+ breakParams.minute = Math.floor(time / 60);
873
+ breakParams.second = time - breakParams.minute * 60;
874
+ }
875
+ }
876
+ fromLogical(dataStr, pic, rangeStr) {
877
+ let Str = NString.ToCharArray(pic.getMask());
878
+ if (pic.getMaskSize() > Str.length) {
879
+ MemoryUtil.char_memset(Str, 0, '*', Str.length);
880
+ return NString.FromChars(Str);
881
+ }
882
+ else {
883
+ let array2 = new Array(50);
884
+ for (let _ai = 0; _ai < array2.length; ++_ai)
885
+ array2[_ai] = (0).toString();
886
+ this.win_rng_bool_sub(array2, array2.length, dataStr.charAt(0) === '1', rangeStr);
887
+ let len = pic.getMaskSize();
888
+ let resStr = this.win_data_cpy(Str, len, array2, pic.isAttrAlpha());
889
+ return resStr;
890
+ }
891
+ }
892
+ fromMgLogicalToNativeLogical(dataStr) {
893
+ let nativeVal;
894
+ nativeVal = (dataStr.charAt(0) === '1') ? true : false;
895
+ return nativeVal;
896
+ }
897
+ fromNativeLogicalToMgLogical(dispVal) {
898
+ let mgVal;
899
+ mgVal = (dispVal === true) ? "1" : "0";
900
+ return mgVal;
901
+ }
902
+ win_rng_bool_sub(Sub, SubSiz, BoolVal, rng) {
903
+ let crk = new Array(PICInterface.DB_STR_MAX + 2);
904
+ for (let _ai = 0; _ai < crk.length; ++_ai)
905
+ crk[_ai] = (0).toString();
906
+ let gap = new Array(PICInterface.DB_STR_MAX + 2);
907
+ for (let _ai = 0; _ai < gap.length; ++_ai)
908
+ gap[_ai] = (0).toString();
909
+ let i = 0;
910
+ rng = this.win_rng_bool(rng);
911
+ this.win_rng_crk(crk, gap, rng);
912
+ let s;
913
+ if (BoolVal) {
914
+ s = 0;
915
+ }
916
+ else {
917
+ while (crk[i] > '\0') {
918
+ i = i + 1;
919
+ }
920
+ s = i + 1;
921
+ }
922
+ let len = s;
923
+ while (crk[len] > '\0') {
924
+ len = len + 1;
925
+ }
926
+ len = len - s;
927
+ MemoryUtil.char_memcpy(Sub, 0, crk, s, Math.min(len, SubSiz));
928
+ if (len < SubSiz) {
929
+ MemoryUtil.char_memset(Sub, len, ' ', SubSiz - len);
930
+ }
931
+ }
932
+ win_rng_bool(rng) {
933
+ if (rng === null || rng.length === 0) {
934
+ rng = "True, False";
935
+ }
936
+ return rng;
937
+ }
938
+ win_rng_crk(crk, gap, range) {
939
+ let rngLen = range.length;
940
+ let rng = NString.ToCharArray(range);
941
+ let crkPos = 0;
942
+ let rngPos = 0;
943
+ let gapPos = 0;
944
+ while (rngPos < rngLen) {
945
+ if (rng[rngPos] === ',' || rng[rngPos] === '-') {
946
+ gap[gapPos++] = rng[rngPos++];
947
+ crk[crkPos++] = '\0';
948
+ if (rngPos < rngLen) {
949
+ while (rng[rngPos] === ' ') {
950
+ rngPos = rngPos + 1;
951
+ }
952
+ }
953
+ }
954
+ else {
955
+ if (rng[rngPos] === '\\') {
956
+ rngPos = rngPos + 1;
957
+ }
958
+ crk[crkPos] = rng[rngPos++];
959
+ crkPos = crkPos + 1;
960
+ }
961
+ }
962
+ gap[gapPos] = '\0';
963
+ crk[crkPos++] = '\0';
964
+ crk[crkPos] = '\0';
965
+ }
966
+ toNum(dispValue, pic, compIdx) {
967
+ let mgNum = new NUM_TYPE(dispValue, pic, compIdx);
968
+ return mgNum.toXMLrecord();
969
+ }
970
+ a_2_date_pic_datemode(str, str_len, pic, mask, compIdx) {
971
+ let pos = 0;
972
+ let year_in_pic = false;
973
+ let month_in_pic = false;
974
+ let day_in_pic = false;
975
+ let inp = false;
976
+ let bYearIsZero = false;
977
+ let era_year = 0;
978
+ let intRef = new IntRef(0);
979
+ let intPicIdxOfs = 0;
980
+ let millenium = 0;
981
+ let dateParams;
982
+ let len = Math.min(str.length, pic.getMaskSize());
983
+ if (str.length < mask.length)
984
+ str.length = mask.length;
985
+ let year = 0;
986
+ let month = 1;
987
+ let day = 1;
988
+ let doy = 1;
989
+ let usedoy = false;
990
+ let i;
991
+ for (i = 0; i < str_len; i = i + 1) {
992
+ if (str[i] !== '0' && str[i] !== ' ') {
993
+ break;
994
+ }
995
+ }
996
+ if (i === str_len)
997
+ return 0;
998
+ while (pos < str_len && pos + intPicIdxOfs < len) {
999
+ switch (mask[pos + intPicIdxOfs].charCodeAt(0)) {
1000
+ case PICInterface.PIC_YY:
1001
+ year_in_pic = true;
1002
+ inp = true;
1003
+ year = this.date_a_2_i(str, 2, pos);
1004
+ pos += 2;
1005
+ if (year === 0)
1006
+ bYearIsZero = true;
1007
+ let century_year = this._environment.GetCentury(compIdx) % 100;
1008
+ if (year < century_year)
1009
+ year += 100;
1010
+ year += this._environment.GetCentury(compIdx) - century_year;
1011
+ if (this._environment.GetDateMode(compIdx) === 'B')
1012
+ year -= PICInterface.DATE_BUDDHIST_GAP;
1013
+ break;
1014
+ case (PICInterface.PIC_YYYY):
1015
+ year_in_pic = true;
1016
+ inp = true;
1017
+ let YearDigitsNo;
1018
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1019
+ for (YearDigitsNo = 0; YearDigitsNo < 4 && pos + YearDigitsNo < str.length && UtilStrByteMode.isDigit(str[pos + YearDigitsNo]); YearDigitsNo++) {
1020
+ }
1021
+ i = YearDigitsNo;
1022
+ }
1023
+ else {
1024
+ for (i = 0; pos + i < str.length && str[pos + i] !== this.DATECHAR.toString() && i < 4; i++) {
1025
+ }
1026
+ for (YearDigitsNo = 0; pos + YearDigitsNo < str.length && UtilStrByteMode.isDigit(str[pos + YearDigitsNo]) &&
1027
+ YearDigitsNo < 4; YearDigitsNo++) {
1028
+ }
1029
+ }
1030
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1031
+ if (i < 4 && str.length < mask.length)
1032
+ this.move_date(str, pos, 4 - i, str.length);
1033
+ }
1034
+ else {
1035
+ if (i < 4 && len < mask.length) {
1036
+ this.move_date(str, pos, 4 - i, len);
1037
+ len = len + 4 - i;
1038
+ }
1039
+ }
1040
+ year = this.date_a_2_i(str, 4, pos);
1041
+ pos += 4;
1042
+ if (year === 0)
1043
+ bYearIsZero = true;
1044
+ if (YearDigitsNo <= 2) {
1045
+ century_year = this._environment.GetCentury(compIdx) % 100;
1046
+ if (year < century_year)
1047
+ year += 100;
1048
+ year += this._environment.GetCentury(compIdx) - century_year;
1049
+ }
1050
+ if (this._environment.GetDateMode(compIdx) === 'B')
1051
+ year -= PICInterface.DATE_BUDDHIST_GAP;
1052
+ break;
1053
+ case PICInterface.PIC_HYYYYY:
1054
+ inp = true;
1055
+ let quotes = 0;
1056
+ if (len > pos + 5 && mask[pos + 5].charCodeAt(0) === (PICInterface.PIC_HYYYYY))
1057
+ quotes = 1;
1058
+ year = HebrewDate.dateheb_h_2_i(str, 5 + quotes, pos);
1059
+ pos += 5 + quotes;
1060
+ if (year === 0)
1061
+ bYearIsZero = true;
1062
+ break;
1063
+ case PICInterface.PIC_HL:
1064
+ intPicIdxOfs = HebrewDate.dateheb_h_2_i(str, 1, pos);
1065
+ pos++;
1066
+ break;
1067
+ case PICInterface.PIC_HDD:
1068
+ inp = true;
1069
+ quotes = 0;
1070
+ if (len > pos + 2 && mask[pos + 2].charCodeAt(0) === PICInterface.PIC_HDD)
1071
+ quotes = 1;
1072
+ day = HebrewDate.dateheb_h_2_i(str, 2 + quotes, pos);
1073
+ pos += 2 + quotes;
1074
+ break;
1075
+ case PICInterface.PIC_MMD:
1076
+ inp = true;
1077
+ month_in_pic = true;
1078
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1079
+ if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
1080
+ this.move_date(str, pos, 1, str.length);
1081
+ }
1082
+ else {
1083
+ if (str[pos + 1].charCodeAt(0) === this.DATECHAR && len < mask.length) {
1084
+ this.move_date(str, pos, 1, len);
1085
+ len += 1;
1086
+ }
1087
+ }
1088
+ month = this.date_a_2_i(str, 2, pos);
1089
+ pos += 2;
1090
+ break;
1091
+ case PICInterface.PIC_MMM:
1092
+ inp = true;
1093
+ month_in_pic = true;
1094
+ intRef.val = pos;
1095
+ month = this.date_MMM_2_m(str, mask, intRef, len, pic.isHebrew());
1096
+ pos = intRef.val;
1097
+ if (pic.isHebrew() && month === 14)
1098
+ month = 6;
1099
+ break;
1100
+ case (PICInterface.PIC_DD):
1101
+ inp = true;
1102
+ day_in_pic = true;
1103
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1104
+ if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
1105
+ this.move_date(str, pos, 1, str.length);
1106
+ }
1107
+ else {
1108
+ if (str[pos + 1].charCodeAt(0) === this.DATECHAR && len < mask.length) {
1109
+ this.move_date(str, pos, 1, len);
1110
+ len += 1;
1111
+ }
1112
+ }
1113
+ day = this.date_a_2_i(str, 2, pos);
1114
+ pos += 2;
1115
+ break;
1116
+ case (PICInterface.PIC_DDD):
1117
+ inp = true;
1118
+ usedoy = true;
1119
+ day_in_pic = true;
1120
+ doy = this.date_a_2_i(str, 3, pos);
1121
+ pos += 3;
1122
+ break;
1123
+ case (PICInterface.PIC_DDDD):
1124
+ inp = true;
1125
+ day_in_pic = true;
1126
+ day = this.date_a_2_i(str, 2, pos);
1127
+ pos += 2 + 2;
1128
+ break;
1129
+ case (PICInterface.PIC_YJ):
1130
+ year_in_pic = true;
1131
+ inp = true;
1132
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1133
+ if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
1134
+ this.move_date(str, pos, 1, str.length);
1135
+ }
1136
+ year = this.date_a_2_i(str, 2, pos);
1137
+ pos += 2;
1138
+ let str1 = NString.FromChars(str);
1139
+ era_year = UtilDateJpn.getInstance().getStartYearOfEra(str1, pic.getMask());
1140
+ if (era_year === 0)
1141
+ return 0;
1142
+ year += era_year - 1;
1143
+ if (year === 0)
1144
+ bYearIsZero = true;
1145
+ break;
1146
+ default:
1147
+ if (UtilStrByteMode.isLocaleDefLangDBCS()) {
1148
+ if (UtilStrByteMode.isHalfWidth(str[pos]) === false &&
1149
+ UtilStrByteMode.isHalfWidth(mask[pos + intPicIdxOfs]))
1150
+ intPicIdxOfs++;
1151
+ }
1152
+ pos += 1;
1153
+ break;
1154
+ }
1155
+ }
1156
+ if (bYearIsZero) {
1157
+ if (!month_in_pic)
1158
+ month = 0;
1159
+ if (!day_in_pic && month === 0)
1160
+ day = 0;
1161
+ }
1162
+ if (day === 0 && month === 0 && (bYearIsZero || year === 0))
1163
+ return (0);
1164
+ if (!inp)
1165
+ return (0);
1166
+ if (pic.isHebrew()) {
1167
+ if (year > 0) {
1168
+ if (millenium === 0)
1169
+ millenium = 5;
1170
+ year += millenium * 1000;
1171
+ }
1172
+ return (HebrewDate.dateheb_2_d(year, month, day));
1173
+ }
1174
+ if ((year === 0) && !year_in_pic) {
1175
+ dateParams = this.date_sys();
1176
+ year = dateParams.year;
1177
+ }
1178
+ return (this.date_4_calender(year, month, day, doy, usedoy));
1179
+ }
1180
+ date_a_2_i(s, len, pos) {
1181
+ if (arguments.length === 3 && (s === null || s instanceof Array) && (len === null || len.constructor === Number) && (pos === null || pos.constructor === Number)) {
1182
+ return this.date_a_2_i_0(s, len, pos);
1183
+ }
1184
+ return this.date_a_2_i_1(s, len, pos);
1185
+ }
1186
+ date_a_2_i_0(s, len, pos) {
1187
+ let array = new Array(len);
1188
+ let mgNum = new NUM_TYPE();
1189
+ for (let i = 0; i < len; i = i + 1) {
1190
+ array[i] = s[pos + i];
1191
+ }
1192
+ return mgNum.a_2_long(NString.FromChars(array));
1193
+ }
1194
+ move_date(str, pos, moveby, len) {
1195
+ if (arguments.length === 4 && (str === null || str instanceof Array) && (pos === null || pos.constructor === Number) && (moveby === null || moveby.constructor === Number) && (len === null || len.constructor === Number)) {
1196
+ this.move_date_0(str, pos, moveby, len);
1197
+ return;
1198
+ }
1199
+ this.move_date_1(str, pos, moveby, len);
1200
+ }
1201
+ move_date_0(str, pos, moveby, len) {
1202
+ MemoryUtil.char_memmove(str, pos + moveby, str, pos, len - (pos + moveby) + 1);
1203
+ MemoryUtil.char_memset(str, pos, '0', moveby);
1204
+ }
1205
+ date_MMM_2_m(str, mask, pos, len, isHebrew) {
1206
+ let l;
1207
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1208
+ let maskPos = UtilStrByteMode.convPos(NString.FromChars(str), NString.FromChars(mask), pos.val, false);
1209
+ l = this.date_msk_cnt(mask, maskPos, (len - maskPos));
1210
+ }
1211
+ else {
1212
+ l = this.date_msk_cnt(mask, pos.val, (len - pos.val));
1213
+ }
1214
+ let strPos = pos.val;
1215
+ pos.val = pos.val + l;
1216
+ len = MemoryUtil.mem_trim(str, strPos, l);
1217
+ if (len === 0) {
1218
+ return 0;
1219
+ }
1220
+ else {
1221
+ let strB = NString.FromChars(str, strPos, len);
1222
+ let monthNames;
1223
+ if (isHebrew) {
1224
+ monthNames = HebrewDate.GetLocalMonths();
1225
+ }
1226
+ else {
1227
+ let months = Events.GetMessageString(MsgInterface.MONTHS_PTR);
1228
+ monthNames = DateUtil.getLocalMonths(months);
1229
+ }
1230
+ for (let i = 1; i < monthNames.length; i = i + 1) {
1231
+ if (NString.Compare(monthNames[i].substr(0, len), strB, true) === 0)
1232
+ return i;
1233
+ }
1234
+ }
1235
+ return 0;
1236
+ }
1237
+ date_sys() {
1238
+ let date = new DateBreakParams();
1239
+ let CurrDate = DateTime.Now;
1240
+ date.year = CurrDate.Year;
1241
+ date.month = CurrDate.Month;
1242
+ date.day = CurrDate.Day;
1243
+ return date;
1244
+ }
1245
+ date_magic(utcDate) {
1246
+ let dateTime;
1247
+ if (utcDate) {
1248
+ dateTime = DateTime.UtcNow;
1249
+ }
1250
+ else {
1251
+ dateTime = DateTime.Now;
1252
+ }
1253
+ let year = dateTime.Year;
1254
+ let month = dateTime.Month;
1255
+ let day = dateTime.Day;
1256
+ return this.date_4_calender(year, month, day, 1, false);
1257
+ }
1258
+ time_magic(utcTime) {
1259
+ return DateTime.GetTotalSecondsFromMidnight(utcTime, new Date());
1260
+ }
1261
+ mtime_magic(utcTime) {
1262
+ return DateTime.GetTotalMilliSecondsFromMidnight(utcTime, new Date());
1263
+ }
1264
+ date_4_calender(year, month, day, doy, usedoy) {
1265
+ let LeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
1266
+ if (usedoy) {
1267
+ if (doy === 0) {
1268
+ return 0;
1269
+ }
1270
+ if (doy > 366 || (!LeapYear && doy > 365)) {
1271
+ return (1000000000);
1272
+ }
1273
+ }
1274
+ else {
1275
+ if (day === 0 && month === 0 && year === 0) {
1276
+ return 0;
1277
+ }
1278
+ if (day === 0 || month === 0 || year === 0 || month > 12) {
1279
+ return 1000000000;
1280
+ }
1281
+ }
1282
+ year = year - 1;
1283
+ let num = Math.floor(year / 400);
1284
+ year = year - num * 400;
1285
+ let num2 = Math.floor(year / 100);
1286
+ year = year - num2 * 100;
1287
+ let num3 = Math.floor(year / 4);
1288
+ year = year - num3 * 4;
1289
+ if (!usedoy) {
1290
+ let num4 = PICInterface.date_day_tab[month - 1];
1291
+ let num5 = PICInterface.date_day_tab[month];
1292
+ if (LeapYear) {
1293
+ if (month > 1) {
1294
+ num5 = num5 + 1;
1295
+ if (month > 2) {
1296
+ num4 = num4 + 1;
1297
+ }
1298
+ }
1299
+ }
1300
+ if (day > num5 - num4) {
1301
+ return 1000000000;
1302
+ }
1303
+ doy = num4 + day;
1304
+ }
1305
+ return num * 146097 + num2 * 36524 + num3 * 1461 + year * 365 + doy;
1306
+ }
1307
+ fromNativeTimeToMgTime(dispValue) {
1308
+ let mgNum = new NUM_TYPE();
1309
+ let numVal = this.fromNativeTimeToMgTimeNumber(dispValue);
1310
+ mgNum.NUM_4_LONG(numVal);
1311
+ return mgNum.toXMLrecord();
1312
+ }
1313
+ fromNativeTimeToMgTimeNumber(dispValue) {
1314
+ let numVal = this.time_2_int(dispValue.getHours(), dispValue.getMinutes(), dispValue.getSeconds());
1315
+ return numVal;
1316
+ }
1317
+ a_2_time(Ascii, picOrAsciiL, milliSecondsOrMask, milliSeconds) {
1318
+ if (arguments.length === 3)
1319
+ return this.a_2_time_0(Ascii, picOrAsciiL, milliSecondsOrMask);
1320
+ return this.a_2_time_1(Ascii, picOrAsciiL, milliSecondsOrMask, milliSeconds);
1321
+ }
1322
+ a_2_time_0(Ascii, pic, milliSeconds) {
1323
+ return this.a_2_time(Ascii, Ascii.length, NString.ToCharArray(pic.getMask()), milliSeconds);
1324
+ }
1325
+ a_2_time_1(Ascii, AsciiL, mask, milliSeconds) {
1326
+ let mgNum = new NUM_TYPE();
1327
+ let I = 0;
1328
+ let len = mask.length;
1329
+ if (len > AsciiL) {
1330
+ len = AsciiL;
1331
+ }
1332
+ let ampm = 0;
1333
+ let hour = 0;
1334
+ let minute = 0;
1335
+ let second = 0;
1336
+ let millisecond = 0;
1337
+ while (I < len) {
1338
+ let maskLength;
1339
+ let maxMaskLen;
1340
+ switch (mask[I].charCodeAt(0)) {
1341
+ case (PICInterface.PIC_HH):
1342
+ case (PICInterface.PIC_MMT):
1343
+ case (PICInterface.PIC_SS):
1344
+ case (PICInterface.PIC_PM):
1345
+ maxMaskLen = 2;
1346
+ break;
1347
+ case (PICInterface.PIC_MS):
1348
+ maxMaskLen = 3;
1349
+ break;
1350
+ default:
1351
+ maxMaskLen = 1;
1352
+ break;
1353
+ }
1354
+ maskLength = Math.min(maxMaskLen, len - I);
1355
+ switch (mask[I].charCodeAt(0)) {
1356
+ case (PICInterface.PIC_HH):
1357
+ {
1358
+ hour = mgNum.a_2_long(Ascii.substr(I, maskLength));
1359
+ }
1360
+ break;
1361
+ case (PICInterface.PIC_MMT):
1362
+ {
1363
+ minute = mgNum.a_2_long(Ascii.substr(I, maskLength));
1364
+ }
1365
+ break;
1366
+ case (PICInterface.PIC_SS):
1367
+ {
1368
+ second = mgNum.a_2_long(Ascii.substr(I, maskLength));
1369
+ }
1370
+ break;
1371
+ case (PICInterface.PIC_MS):
1372
+ {
1373
+ millisecond = mgNum.a_2_long(Ascii.substr(I, maskLength));
1374
+ }
1375
+ break;
1376
+ case (PICInterface.PIC_PM):
1377
+ ampm = 0;
1378
+ let c0 = Ascii[I];
1379
+ let c1;
1380
+ c0 = c0.toUpperCase();
1381
+ if (I + 1 < len) {
1382
+ c1 = Ascii[I + 1];
1383
+ c1 = c1.toUpperCase();
1384
+ if (c1 === 'M') {
1385
+ if (c0 === 'A')
1386
+ ampm = -1;
1387
+ if (c0 === 'P')
1388
+ ampm = 1;
1389
+ }
1390
+ }
1391
+ break;
1392
+ default:
1393
+ break;
1394
+ }
1395
+ I += maskLength;
1396
+ }
1397
+ if (second > 59 || minute > 59)
1398
+ return (0);
1399
+ if (ampm !== 0)
1400
+ if (ampm === -1) {
1401
+ if (hour === 12)
1402
+ hour = 0;
1403
+ }
1404
+ else if (hour < 12)
1405
+ hour += 12;
1406
+ if (milliSeconds)
1407
+ return this.time_2_int(hour, minute, second) * 1000 + millisecond;
1408
+ else
1409
+ return this.time_2_int(hour, minute, second);
1410
+ }
1411
+ time_2_int(hour, minute, second) {
1412
+ return hour * 3600 + minute * 60 + second;
1413
+ }
1414
+ static toBoolean(boolStr) {
1415
+ return boolStr !== null && boolStr === "1";
1416
+ }
1417
+ a_2_date(str, Format, compIdx) {
1418
+ return this.a_2_date_datemode(str, Format, compIdx);
1419
+ }
1420
+ a_2_date_pic(str, pic, mask, compIdx) {
1421
+ if (str === null) {
1422
+ str = "";
1423
+ }
1424
+ return this.a_2_date_pic_datemode(NString.ToCharArray(str), str.length, pic, NString.ToCharArray(mask), compIdx);
1425
+ }
1426
+ to_a(outVal, out_len, date, Format, compIdx) {
1427
+ return this.to_a_datemode(outVal, out_len, date, Format, false, compIdx);
1428
+ }
1429
+ a_2_date_datemode(str, Format, compIdx) {
1430
+ let pIC = new PIC(Format, StorageAttribute.DATE, compIdx);
1431
+ if (str === null) {
1432
+ str = "";
1433
+ }
1434
+ return this.a_2_date_pic_datemode(NString.ToCharArray(str), str.length, pIC, NString.ToCharArray(pIC.getMask()), compIdx);
1435
+ }
1436
+ to_a_datemode(outVal, out_len, date, Format, ignore_dt_fmt, compIdx) {
1437
+ let pic = new PIC(Format, StorageAttribute.DATE, compIdx);
1438
+ if (outVal === null) {
1439
+ outVal = pic.getMask();
1440
+ }
1441
+ return this.to_a_pic_datemode(outVal, out_len, date, pic, true, ignore_dt_fmt, compIdx);
1442
+ }
1443
+ date_a_2_i_1(s, len, pos) {
1444
+ let mgNum = new NUM_TYPE();
1445
+ let str;
1446
+ str = s.substr(pos, len);
1447
+ return mgNum.a_2_long(str);
1448
+ }
1449
+ move_date_1(str, pos, moveby, len) {
1450
+ str = StrUtil.memmove(str, pos + moveby, str, pos, len - pos);
1451
+ str = StrUtil.memset(str, pos, '0', moveby);
1452
+ return str;
1453
+ }
1454
+ time_2_a(Ascii, AsciiL, time, Format, compIdx, milliSeconds) {
1455
+ if (StrUtil.rtrim(Format).length === 0) {
1456
+ Format = "HH:MM:SS";
1457
+ }
1458
+ let pic = new PIC(Format, StorageAttribute.TIME, compIdx);
1459
+ if (Ascii === null) {
1460
+ Ascii = pic.getMask();
1461
+ }
1462
+ return this.time_2_a_pic(Ascii, AsciiL, time, pic, false, milliSeconds);
1463
+ }
1464
+ toLogical(dispValue, pic, rangeStr) {
1465
+ dispValue = dispValue.trim();
1466
+ if (dispValue === null || dispValue.length === 0) {
1467
+ dispValue = "False";
1468
+ }
1469
+ return this.disp_2_logical(dispValue, pic.getMask(), rangeStr);
1470
+ }
1471
+ disp_2_logical(dispValue, mask, rangeStr) {
1472
+ let strippedValue = new StringBuilder(dispValue.length);
1473
+ rangeStr = this.win_rng_bool(rangeStr);
1474
+ rangeStr = StrUtil.makePrintableTokens(rangeStr, SEQ_2_HTML);
1475
+ let i = rangeStr.indexOf(',');
1476
+ let trueStr = rangeStr.substr(0, i);
1477
+ trueStr = StrUtil.makePrintableTokens(trueStr, HTML_2_STR);
1478
+ i = 0;
1479
+ for (i = 0; i < dispValue.length && i < mask.length; i++) {
1480
+ if (mask.charCodeAt(i) === PICInterface.PIC_X) {
1481
+ strippedValue.Append(dispValue.charAt(i));
1482
+ }
1483
+ }
1484
+ let val = strippedValue.ToString();
1485
+ if (trueStr.length < val.length) {
1486
+ val = val.substr(0, trueStr.length);
1487
+ }
1488
+ else {
1489
+ if (val.length < trueStr.length) {
1490
+ trueStr = trueStr.substr(0, val.length);
1491
+ }
1492
+ }
1493
+ return (val.toUpperCase() === trueStr.toUpperCase()) ? "1" : "0";
1494
+ }
1495
+ toAlpha(dispValue, pic) {
1496
+ let picture = pic.getMask();
1497
+ let buffer = new StringBuilder(pic.getMaskSize());
1498
+ let IsAlphaDBCS = UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha();
1499
+ let currPicture;
1500
+ let i = currPicture = 0;
1501
+ for (currPicture = i = 0; i < dispValue.length && currPicture < picture.length; i++, currPicture++) {
1502
+ if (DisplayConvertor.isAlphaPositionalDirective(picture.charAt(currPicture))) {
1503
+ buffer.Append(dispValue.charAt(i));
1504
+ if (IsAlphaDBCS) {
1505
+ let strDspValOneChar = dispValue.substr(i, 1);
1506
+ if (UtilStrByteMode.lenB(strDspValOneChar) === 2) {
1507
+ currPicture = currPicture + 1;
1508
+ }
1509
+ }
1510
+ }
1511
+ }
1512
+ return buffer.ToString();
1513
+ }
1514
+ static isAlphaPositionalDirective(toCheck) {
1515
+ let ascii = toCheck.charCodeAt(0);
1516
+ return (ascii === PICInterface.PIC_X || ascii === PICInterface.PIC_U || ascii === PICInterface.PIC_L ||
1517
+ ascii === PICInterface.PIC_N || ascii === PICInterface.PIC_J || ascii === PICInterface.PIC_G || ascii === PICInterface.PIC_S || ascii === PICInterface.PIC_T);
1518
+ }
1519
+ fillAlphaByRange(ContinuousRangeValues, discreteRangeValues, newValue) {
1520
+ let tmpBuffer = this.fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue);
1521
+ if (tmpBuffer !== null) {
1522
+ return tmpBuffer;
1523
+ }
1524
+ else {
1525
+ tmpBuffer = this.fillAlphaByContinuousRangeValues(ContinuousRangeValues, newValue);
1526
+ if (tmpBuffer !== null) {
1527
+ return tmpBuffer;
1528
+ }
1529
+ else {
1530
+ if (discreteRangeValues !== null) {
1531
+ tmpBuffer = this.completeAlphaByRange(discreteRangeValues, newValue);
1532
+ if (tmpBuffer !== null) {
1533
+ return tmpBuffer;
1534
+ }
1535
+ }
1536
+ }
1537
+ }
1538
+ return newValue;
1539
+ }
1540
+ fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue) {
1541
+ let result;
1542
+ if (discreteRangeValues !== null) {
1543
+ for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
1544
+ let discreteValue = discreteRangeValues.get_Item(i);
1545
+ let truncatedValue = discreteValue.substr(0, Math.min(newValue.length, discreteValue.length));
1546
+ if (newValue.toUpperCase() === truncatedValue.toUpperCase()) {
1547
+ return discreteValue;
1548
+ }
1549
+ }
1550
+ }
1551
+ return null;
1552
+ }
1553
+ fillAlphaByContinuousRangeValues(ContinuousRangeValues, newValue) {
1554
+ newValue = StrUtil.rtrim(newValue);
1555
+ if (ContinuousRangeValues !== null) {
1556
+ for (let i = 0; i < ContinuousRangeValues.length; i = i + 1) {
1557
+ let from = ContinuousRangeValues.get_Item(i);
1558
+ let to = ContinuousRangeValues.get_Item(i = i + 1);
1559
+ if (NString.CompareOrdinal(newValue, from) >= 0 && NString.CompareOrdinal(newValue, to) <= 0) {
1560
+ return newValue;
1561
+ }
1562
+ }
1563
+ }
1564
+ return null;
1565
+ }
1566
+ completeAlphaByRange(discreteRangeValues, newValue) {
1567
+ let maxCoincide = new Array(2);
1568
+ for (let _ai = 0; _ai < maxCoincide.length; ++_ai)
1569
+ maxCoincide[_ai] = 0;
1570
+ let bestItem = new Array(2);
1571
+ for (let _ai = 0; _ai < bestItem.length; ++_ai)
1572
+ bestItem[_ai] = null;
1573
+ let CHECK_CASE = 0;
1574
+ let IGNORE_CASE = 1;
1575
+ let caseLetters = CHECK_CASE;
1576
+ while (caseLetters === CHECK_CASE || caseLetters === IGNORE_CASE) {
1577
+ let lowerValue;
1578
+ if (caseLetters === CHECK_CASE) {
1579
+ lowerValue = newValue;
1580
+ }
1581
+ else {
1582
+ lowerValue = newValue.toLowerCase();
1583
+ }
1584
+ lowerValue = StrUtil.rtrim(lowerValue);
1585
+ for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
1586
+ let wrongLetter = false;
1587
+ let currCoincide = 0;
1588
+ let rangeItem;
1589
+ if (caseLetters === CHECK_CASE) {
1590
+ rangeItem = discreteRangeValues.get_Item(i);
1591
+ }
1592
+ else {
1593
+ rangeItem = discreteRangeValues.get_Item(i).toLowerCase();
1594
+ }
1595
+ let lowLength = lowerValue.length;
1596
+ let rangeLength = rangeItem.length;
1597
+ if (lowLength < rangeLength) {
1598
+ for (let j = 0; j < lowLength; j = j + 1) {
1599
+ if (!(lowerValue.charAt(j) === rangeItem.charAt(j))) {
1600
+ wrongLetter = true;
1601
+ break;
1602
+ }
1603
+ currCoincide = currCoincide + 1;
1604
+ }
1605
+ }
1606
+ else {
1607
+ wrongLetter = true;
1608
+ }
1609
+ if (currCoincide > maxCoincide[caseLetters] && !wrongLetter) {
1610
+ bestItem[caseLetters] = discreteRangeValues.get_Item(i);
1611
+ maxCoincide[caseLetters] = currCoincide;
1612
+ }
1613
+ }
1614
+ caseLetters = caseLetters + 1;
1615
+ }
1616
+ if (bestItem[CHECK_CASE] !== null)
1617
+ return bestItem[CHECK_CASE];
1618
+ else {
1619
+ if (bestItem[IGNORE_CASE] !== null)
1620
+ return bestItem[IGNORE_CASE];
1621
+ }
1622
+ return null;
1623
+ }
1624
+ setDateChar(dateChar) {
1625
+ this.DATECHAR = dateChar;
1626
+ }
1627
+ getDateChar() {
1628
+ return this.DATECHAR;
1629
+ }
1630
+ static StringValueToMgValue(value, storageAttribute, filler, length) {
1631
+ switch (storageAttribute) {
1632
+ case StorageAttribute.ALPHA:
1633
+ case StorageAttribute.UNICODE: {
1634
+ let newVal = value;
1635
+ newVal = NString.PadRight(newVal, length, filler);
1636
+ return newVal;
1637
+ }
1638
+ case StorageAttribute.NUMERIC:
1639
+ case StorageAttribute.DATE:
1640
+ case StorageAttribute.TIME:
1641
+ return new NUM_TYPE(value);
1642
+ default:
1643
+ return value;
1644
+ }
1645
+ }
1646
+ }
1647
+ DisplayConvertor._instance = null;
1648
+ export class TimeBreakParams {
1649
+ constructor(hour_, minute_, second_) {
1650
+ this.hour = 0;
1651
+ this.minute = 0;
1652
+ this.second = 0;
1653
+ if (arguments.length === 0) {
1654
+ this.constructor_0();
1655
+ return;
1656
+ }
1657
+ this.constructor_1(hour_, minute_, second_);
1658
+ }
1659
+ constructor_0() {
1660
+ }
1661
+ constructor_1(hour_, minute_, second_) {
1662
+ this.hour = hour_;
1663
+ this.minute = minute_;
1664
+ this.second = second_;
1665
+ }
1666
+ }
1667
+ class IntRef {
1668
+ constructor(val_) {
1669
+ this.val = 0;
1670
+ this.val = val_;
1671
+ }
1672
+ }
1673
+ class DateNameParams {
1674
+ constructor(out_, outIdx_, len_) {
1675
+ this.outVal = null;
1676
+ this.len = 0;
1677
+ this.outIdx = 0;
1678
+ this.outVal = out_;
1679
+ this.outIdx = outIdx_;
1680
+ this.len = len_;
1681
+ }
1682
+ }
1683
+ export class DateBreakParams {
1684
+ constructor(year_, month_, day_, doy_, dow_) {
1685
+ this.day = 0;
1686
+ this.dow = 0;
1687
+ this.doy = 0;
1688
+ this.month = 0;
1689
+ this.year = 0;
1690
+ if (arguments.length === 0) {
1691
+ this.constructor_0();
1692
+ return;
1693
+ }
1694
+ this.constructor_1(year_, month_, day_, doy_, dow_);
1695
+ }
1696
+ constructor_0() {
1697
+ }
1698
+ constructor_1(year_, month_, day_, doy_, dow_) {
1699
+ this.year = year_;
1700
+ this.month = month_;
1701
+ this.day = day_;
1702
+ this.doy = doy_;
1703
+ this.dow = dow_;
1704
+ }
1705
+ }
1706
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGxheUNvbnZlcnRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvRGlzcGxheUNvbnZlcnRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxRQUFRLEVBQVEsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RixPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdqRCxNQUFNLE9BQU8sZ0JBQWdCO0lBWTNCO1FBWFEsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBQ2xDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFXM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDO0lBQ2pELENBQUM7SUFURCxNQUFNLEtBQUssUUFBUTtRQUNqQixJQUFJLGdCQUFnQixDQUFDLFNBQVMsS0FBSyxJ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LElBQVksRUFBRSxJQUFZLEVBQUUsSUFBWTtRQUMzRixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lFbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vZW52L0lFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7UElDfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7RGF0ZVRpbWUsIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdHJpbmdCdWlsZGVyfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZVV0aWwsXHJcbiAgSFRNTF8yX1NUUixcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUElDSW50ZXJmYWNlLFxyXG4gIFNFUV8yX0hUTUwsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxEYXRlSnBuLFxyXG4gIFV0aWxTdHJCeXRlTW9kZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0Jsb2JUeXBlfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHtWYWxpZGF0aW9uRGV0YWlsc0Jhc2V9IGZyb20gJy4vVmFsaWRhdGlvbkRldGFpbHNCYXNlJztcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7SGVicmV3RGF0ZX0gZnJvbSAnLi9IZWJyZXdEYXRlJztcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7R3VpRW52aXJvbm1lbnR9IGZyb20gJy4uLy4uL0d1aUVudmlyb25tZW50JztcclxuaW1wb3J0IHtNZW1vcnlVdGlsfSBmcm9tICcuLi8uLi91dGlsL01lbW9yeVV0aWwnO1xyXG5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIERpc3BsYXlDb252ZXJ0b3Ige1xyXG4gIHByaXZhdGUgX2Vudmlyb25tZW50OiBJRW52aXJvbm1lbnQgPSBudWxsO1xyXG4gIHByaXZhdGUgREFURUNIQVI6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBEaXNwbGF5Q29udmVydG9yID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBEaXNwbGF5Q29udmVydG9yIHtcclxuICAgIGlmIChEaXNwbGF5Q29udmVydG9yLl9pbnN0YW5jZSA9PT0gbnVsbCkge1xyXG4gICAgICBEaXNwbGF5Q29udmVydG9yLl9pbnN0YW5jZSA9IG5ldyBEaXNwbGF5Q29udmVydG9yKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRGlzcGxheUNvbnZlcnRvci5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2Vudmlyb25tZW50ID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQ7XHJcbiAgfVxyXG5cclxuICBnZXROZXdEYXRlQnJlYWtQYXJhbXMoKTogRGF0ZUJyZWFrUGFyYW1zIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgfVxyXG5cclxuICBnZXROZXdUaW1lQnJlYWtQYXJhbXMoKTogVGltZUJyZWFrUGFyYW1zIHtcclxuICAgIHJldHVybiBuZXcgVGltZUJyZWFrUGFyYW1zKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBvZiBhIHZhbHVlIGZyb20gaXRzIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsdWVcIj4gIHRoZSBpbnRlcm5hbCB2YWx1ZSAoYXMgc2VudCBpbiB0aGUgWE1MKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFuZ2VTdHJcIj4gdmFsdWUgcmFuZ2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgIHRoZSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc3RyaW5nIHRvIGRpc3BsYXlcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIG1nMmRpc3AobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnk7XHJcbiAgbWcyZGlzcChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IGFueTtcclxuICBtZzJkaXNwKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCBjb252ZXJ0Q2FzZTogYm9vbGVhbiwgdGltZV9kYXRlX251bV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnk7XHJcbiAgbWcyZGlzcChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGNvbXBJZHhPckFsd2F5c0ZpbGw6IGFueSwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeDogYW55LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb252ZXJ0Q2FzZT86IGJvb2xlYW4sIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0PzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNilcclxuICAgICAgcmV0dXJuIHRoaXMubWcyZGlzcF8wKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgY29tcElkeE9yQWx3YXlzRmlsbCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeCk7XHJcblxyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNylcclxuICAgICAgcmV0dXJuIHRoaXMubWcyZGlzcF8xKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgY29tcElkeE9yQWx3YXlzRmlsbCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29udmVydENhc2UpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMubWcyZGlzcF8yKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgY29tcElkeE9yQWx3YXlzRmlsbCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29udmVydENhc2UsIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWcyZGlzcF8wKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm1nMmRpc3AobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBmYWxzZSwgY29tcElkeCwgdGltZV9kYXRlX3BpY19aX2VkdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1nMmRpc3BfMShtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZzJkaXNwKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgYWx3YXlzRmlsbCwgY29tcElkeCwgZmFsc2UsIHRpbWVfZGF0ZV9waWNfWl9lZHQpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIG9mIGEgdmFsdWUgZnJvbSBpdHMgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWx1ZVwiPnRoZSBpbnRlcm5hbCB2YWx1ZSAoYXMgc2VudCBpbiB0aGUgWE1MKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFuZ2VTdHJcIj52YWx1ZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+dGhlIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhbHdheXNGaWxsXCI+QWx3YXlzIGF1dG8gZmlsbCBhbHBoYSBvdmVyIGl0cyBwaWN0dXJlICh1c2VkIGZvciBzZWxlY3QgY29udHJvbHMpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmcgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHVibGljIG1nMmRpc3BfMihtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgY29udmVydENhc2U6IGJvb2xlYW4sIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0OiBib29sZWFuKTogYW55IHtcclxuICAgIGxldCBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgdG1wUmFuZ2U6IHN0cmluZyA9IChyYW5nZVN0ciA9PT0gbnVsbCkgPyBcIlwiIDogcmFuZ2VTdHI7XHJcblxyXG4gICAgc3dpdGNoIChwaWMuZ2V0QXR0cigpKSB7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbUFscGhhKG1nVmFsdWUsIHBpYywgdG1wUmFuZ2UsIGFsd2F5c0ZpbGwsIGNvbnZlcnRDYXNlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOiB7XHJcblxyXG4gICAgICAgIC8vIE5vdywgY3VycmVjeSBkaXJlY3RpdmUgc3VwcG9ydGVkLCBidXQgdGhpcyB3aWxsIGJlIGhhbmRsZWQgYnkgYW5ndWxhciBwYWNrYWdlcyBsaWtlIG5nLWN1cnJlbmN5XHJcbiAgICAgICAgLy8gaGVyZSBpdCBzaG91bGQgc2ltcGx5IHBhc3MgdGhlIGFjdHVhbCBuYXRpdmUgdmFsdWUgb2YgbnVtYmVyIGFuZCBtYXNrcyBzaG91bGQgbm90IGJlIGFwcGxpZWRcclxuICAgICAgICAvLyBTbywgcHJlcGFyZSB0ZW1wb3JhcnkgcGljdHVyZSB0byBnZW5lcmF0ZSBuYXRpdmUgdmFsdWUuXHJcbiAgICAgICAgbGV0ICBuZXdQaWMgPSBwaWMuZ2V0VW5mb3JtYXR0ZWROdW1lcmljUGljKCk7XHJcblxyXG4gICAgICAgIC8vc3RvcmUgYW5kIHJlc3RvcmUgZGVjaW1hbCBzZXAgYW5kIHRob3UuIHNlcFxyXG4gICAgICAgIGxldCAgZGVjOiBzdHJpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcbiAgICAgICAgbGV0IHRob3U6c3RyaW5nICA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRob3VzYW5kcygpO1xyXG5cclxuICAgICAgICAvL3NldCBkZWZhdWx0IHZhbHVlc1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoJy4nKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IoJywnKTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTnVtKG1nVmFsdWUsIG5ld1BpYyk7XHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0RGVjaW1hbFNlcGFyYXRvcihkZWMpO1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldFRob3VzYW5kc1NlcGFyYXRvcih0aG91KTtcclxuICAgICAgICAvLyBWYWx1ZSBzaG91bGQgYmUgdHJpbW1lZCB3aGVuIHdlIGFyZSBkaXNwbGF5aW5nIGNvbnRyb2wgaW4gb3JkZXIgdG8gZGlzcGxheSBhbGlnbm1lbnQgcHJvcGVybHkuIEJ1dCB3aGlsZSBlbnRlcmluZyBjb250cm9sLCBpdCBzaG91bGQgbm90IGJlIHRyaW1tZWRcclxuICAgICAgICAvLyBpbiBvcmRlciB0byByZWFkIGl0IHByb3Blcmx5LlxyXG4gICAgICAgIGlmIChuZXdQaWMuZ2V0TWFza0NoYXJzKCkgPT09IDAgfHwgIXRpbWVfZGF0ZV9udW1fcGljX1pfZWR0KVxyXG4gICAgICAgICAgc3RyID0gU3RyVXRpbC5sdHJpbShzdHIpO1xyXG5cclxuICAgICAgICBpZiAodXNlTmF0aXZlKSB7XHJcbiAgICAgICAgICBpZiAoc3RyID09IFwiXCIpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICAgIGxldCBkYmw6IG51bWJlciA9IE51bWJlcihzdHIpO1xyXG4gICAgICAgICAgcmV0dXJuIGRibDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURToge1xyXG4gICAgICAgIGlmICh1c2VOYXRpdmUpIHtcclxuICAgICAgICAgIGxldCBkdDogRGF0ZTtcclxuICAgICAgICAgIGR0ID0gdGhpcy5mcm9tTWdEYXRlVG9OYXRpdmVEYXRlKG1nVmFsdWUsIGNvbXBJZHgpO1xyXG4gICAgICAgICAgcmV0dXJuIGR0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0ciA9IHRoaXMuZnJvbURhdGUobWdWYWx1ZSwgcGljLCBjb21wSWR4LCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6IHtcclxuICAgICAgICBpZiAodXNlTmF0aXZlKSB7XHJcbiAgICAgICAgICBsZXQgZHQ6IERhdGU7XHJcbiAgICAgICAgICBkdCA9IHRoaXMuZnJvbU1nVGltZVRvTmF0aXZlVGltZShtZ1ZhbHVlLCBwaWMpO1xyXG4gICAgICAgICAgcmV0dXJuIGR0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0ciA9IHRoaXMuZnJvbVRpbWUobWdWYWx1ZSwgcGljLCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46IHtcclxuICAgICAgICBsZXQgbG9nVmFsOiBib29sZWFuO1xyXG4gICAgICAgIGxvZ1ZhbCA9IHRoaXMuZnJvbU1nTG9naWNhbFRvTmF0aXZlTG9naWNhbChtZ1ZhbHVlKTtcclxuICAgICAgICByZXR1cm4gbG9nVmFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICBzdHIgPSBCbG9iVHlwZS5nZXRTdHJpbmcobWdWYWx1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICBzdHIgPSBtZ1ZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGRpc3BsYXkgdmFsdWUgZnJvbSBpdHMgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+dGhlIHZhbHVlIGFzIGVudGVyZWQgYnkgdXNlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFuZ2VTdHJcIj52YWx1ZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+dGhlIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9iQ29udGVudFR5cGVcIj5pZiB0aGUgYXR0cmlidXRlIGlzIGJsb2IsIGl0cyBjb250ZW50IHR5cGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGludGVybmFsIGZvcm0gb2YgZGF0YSAoYXMgdXNlZCBpbiB0aGUgWE1MKVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZGlzcDJtZyhkaXNwVmFsdWU6IGFueSwgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlciwgYmxvYkNvbnRlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHN0cjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBzd2l0Y2ggKHBpYy5nZXRBdHRyKCkpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBzdHIgPSB0aGlzLnRvQWxwaGEoZGlzcFZhbHVlLCBwaWMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOiB7XHJcbiAgICAgICAgZGlzcFZhbHVlID0gU3RyaW5nKGRpc3BWYWx1ZSk7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBtYXNrIGZyb20gZGlzcGxheSB2YWx1ZS5cclxuICAgICAgICBsZXQgbGVuOiBudW1iZXIgPSBkaXNwVmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIHdoaWxlIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICBpZiAoIXBpYy5waWNJc01hc2sobGVuIC0gMSkgJiYgZGlzcFZhbHVlW2xlbiAtIDFdICE9PSAoJyAnKSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBsZW4tLTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3BWYWx1ZS5sZW5ndGggPiBsZW4pXHJcbiAgICAgICAgICBkaXNwVmFsdWUgPSBOU3RyaW5nLlJlbW92ZShkaXNwVmFsdWUsIGxlbiwgKGRpc3BWYWx1ZS5sZW5ndGggLSBsZW4pKTtcclxuXHJcbiAgICAgICAgaWYgKHBpYy5pc05lZ2F0aXZlKCkgJiYgZGlzcFZhbHVlLnRyaW0oKS5zdGFydHNXaXRoKFwiLVwiKSlcclxuICAgICAgICAgIGRpc3BWYWx1ZSA9IFN0clV0aWwubHRyaW0oZGlzcFZhbHVlKTtcclxuXHJcbiAgICAgICAgLy9zdG9yZSBhbmQgcmVzdG9yZSBkZWNpbWFsIHNlcCBhbmQgdGhvdS4gc2VwXHJcbiAgICAgICAgbGV0ICBkZWM6IHN0cmluZyA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuICAgICAgICBsZXQgdGhvdTpzdHJpbmcgID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0VGhvdXNhbmRzKCk7XHJcblxyXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgdmFsdWVzXHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0RGVjaW1hbFNlcGFyYXRvcignLicpO1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldFRob3VzYW5kc1NlcGFyYXRvcignLCcpO1xyXG5cclxuICAgICAgICAvLyBOb3csIGN1cnJlY3kgZGlyZWN0aXZlIHN1cHBvcnRlZCwgYnV0IHRoaXMgd2lsbCBiZSBoYW5kbGVkIGJ5IGFuZ3VsYXIgcGFja2FnZXMgbGlrZSBuZy1jdXJyZW5jeVxyXG4gICAgICAgIC8vIGhlcmUgaXQgc2hvdWxkIHNpbXBseSBwYXNzIHRoZSBhY3R1YWwgbmF0aXZlIHZhbHVlIG9mIG51bWJlciBhbmQgbWFza3Mgc2hvdWxkIG5vdCBiZSBhcHBsaWVkXHJcbiAgICAgICAgLy8gU28sIHByZXBhcmUgdGVtcG9yYXJ5IHBpY3R1cmUgdG8gZ2VuZXJhdGUgbmF0aXZlIHZhbHVlLlxyXG4gICAgICAgIGxldCAgbmV3UGljID0gcGljLmdldFVuZm9ybWF0dGVkTnVtZXJpY1BpYygpO1xyXG5cclxuICAgICAgICBzdHIgPSB0aGlzLnRvTnVtKGRpc3BWYWx1ZSwgbmV3UGljLCBjb21wSWR4KTtcclxuXHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0RGVjaW1hbFNlcGFyYXRvcihkZWMpO1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldFRob3VzYW5kc1NlcGFyYXRvcih0aG91KTtcclxuICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG4gICAgICAgIC8vd2hlbiBkYXRlIGlzIGluIGl0ZW0gbGlzdCBmb3IgY2hvaWNlIGN0cmwsIGl0IHdpbGwgY29tZSBoZXJlIGFzIHN0cmluZy4gc28gY29udmVydCBpdCB0byBEYXRlLlxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcFZhbHVlID09PSAnc3RyaW5nJylcclxuICAgICAgICAgIGR0ID0gbmV3IERhdGUgKGRpc3BWYWx1ZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZHQgPSBkaXNwVmFsdWU7XHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlKGR0LCBwaWMpO1xyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG5cclxuICAgICAgICAvL3doZW4gZGF0ZSBpcyBpbiBpdGVtIGxpc3QgZm9yIGNob2ljZSBjdHJsLCBpdCB3aWxsIGNvbWUgaGVyZSBhcyBzdHJpbmcuIHNvIGNvbnZlcnQgaXQgdG8gRGF0ZS5cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3BWYWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgaWYgKGRpc3BWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkdC5zZXRIb3VycygrU3RyaW5nKGRpc3BWYWx1ZSkuc3Vic3RyKDAsIDIpKTtcclxuICAgICAgICAgICAgZHQuc2V0TWludXRlcygrU3RyaW5nKGRpc3BWYWx1ZSkuc3Vic3RyKDAsIDIpKTtcclxuICAgICAgICAgICAgaWYgKFN0cmluZyhkaXNwVmFsdWUpLmxlbmd0aCA+IDUpXHJcbiAgICAgICAgICAgICAgZHQuc2V0U2Vjb25kcygrU3RyaW5nKGRpc3BWYWx1ZSkuc3Vic3RyKDAsIDIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGR0ID0gZGlzcFZhbHVlO1xyXG5cclxuICAgICAgICBzdHIgPSB0aGlzLmZyb21OYXRpdmVUaW1lVG9NZ1RpbWUoZHQpO1xyXG4gICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTmF0aXZlTG9naWNhbFRvTWdMb2dpY2FsKGRpc3BWYWx1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgc3RyID0gQmxvYlR5cGUuY3JlYXRlRnJvbVN0cmluZyhkaXNwVmFsdWUsIGJsb2JDb250ZW50VHlwZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyAgTWV0aG9kcyBmb3IgY292ZXJ0aW5nIElOVEVSTkFMIC0tLT4gRElQTEFZXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgbWFnaWMgbnVtYmVyIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nTnVtXCI+ICAgQSBNYWdpYyBOdW1iZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICBUaGUgcGljdHVyZSB0byB1c2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgcHVibGljIGZyb21OdW0obWdWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKG1nVmFsdWUpO1xyXG4gICAgcmV0dXJuIG1nTnVtLnRvRGlzcGxheVZhbHVlKHBpYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gYWxwaGEgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGFcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiAgVGhlIHJhbmdlIG9mIHZhbHVlcyB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWx3YXlzRmlsbFwiPkFsd2F5cyBhdXRvIGZpbGwgYWxwaGEgb3ZlciBpdHMgcGljdHVyZSAodXNlZCBmb3Igc2VsZWN0IGNvbnRyb2xzKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbUFscGhhKGRhdGFTdHI6IHN0cmluZywgcGljOiBQSUMsIHJhbmdlU3RyOiBzdHJpbmcsIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbnZlcnRDYXNlOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBsZW46IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgbGV0IG1pbl9sZW46IG51bWJlciA9IGxlbjtcclxuICAgIGxldCBtYXNrU3RyOiBzdHJpbmcgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgbGV0IHJlc1N0cjogc3RyaW5nO1xyXG5cclxuICAgIGlmIChwaWMuZ2V0TWFza0NoYXJzKCkgPiAwKSB7XHJcbiAgICAgIHJlc1N0ciA9IHRoaXMud2luX2RhdGFfY3B5KE5TdHJpbmcuVG9DaGFyQXJyYXkobWFza1N0ciksIGxlbiwgTlN0cmluZy5Ub0NoYXJBcnJheShkYXRhU3RyKSwgcGljLmlzQXR0ckFscGhhKCksIGNvbnZlcnRDYXNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBwaWMuaXNBdHRyQWxwaGEoKSlcclxuICAgICAgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuICAgICAge1xyXG4gICAgICAgIC8vIHN1YnN0cmluZyBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgICAgbGV0IGludERhdGFTdHJMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihkYXRhU3RyKTtcclxuICAgICAgICBpZiAobWluX2xlbiA+IGludERhdGFTdHJMZW5CKSB7XHJcbiAgICAgICAgICBtaW5fbGVuID0gaW50RGF0YVN0ckxlbkI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc1N0ciA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihkYXRhU3RyLCBtaW5fbGVuKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChkYXRhU3RyICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKG1pbl9sZW4gPiBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgbWluX2xlbiA9IGRhdGFTdHIubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgIHJlc1N0ciA9IHRoaXMud2luX2RhdGFfY3B5KE5TdHJpbmcuVG9DaGFyQXJyYXkobWFza1N0ciksIGxlbiwgTlN0cmluZy5Ub0NoYXJBcnJheShkYXRhU3RyKSwgcGljLmlzQXR0ckFscGhhKCksIGNvbnZlcnRDYXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXNTdHIgPSBkYXRhU3RyLnN1YnN0cigwLCBtaW5fbGVuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSBkbyBub3QgZmlsbCBBbHBoYSBmaWxlZCBvdmVyIGNvbnRyb2wncyBwaWN0dXJlIGxlbmd0aCBRQ1IgIyAyOTU0MDhcclxuICAgIGlmIChhbHdheXNGaWxsIHx8IChyYW5nZVN0ciAhPT0gbnVsbCAmJiByYW5nZVN0ci5sZW5ndGggPiAwICYmIHJlc1N0ci5sZW5ndGggPCBsZW4pKSB7XHJcbiAgICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHNCYXNlID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzQmFzZShyYW5nZVN0cik7XHJcbiAgICAgIGxldCBjb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHZkLmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpO1xyXG4gICAgICBsZXQgZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+ID0gdmQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpO1xyXG4gICAgICBpZiAoY29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsIHx8IGRpc2NyZXRlUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICByZXNTdHIgPSB0aGlzLmZpbGxBbHBoYUJ5UmFuZ2UoY29udGludW91c1JhbmdlVmFsdWVzLCBkaXNjcmV0ZVJhbmdlVmFsdWVzLCByZXNTdHIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzU3RyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXNlQ29udmVydGVkQ2hhcihkYXRhOiBzdHJpbmcsIG1hc2s6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IGNoOiBzdHJpbmc7XHJcbiAgICBpZiAobWFzay5jaGFyQ29kZUF0KDApID09PSBQSUNJbnRlcmZhY2UuUElDX1UpIHtcclxuICAgICAgY2ggPSBkYXRhLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG1hc2suY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19MKSB7XHJcbiAgICAgICAgY2ggPSBkYXRhLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY2ggPSBkYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2g7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdpbl9kYXRhX2NweShtYXNrU3RyOiBzdHJpbmdbXSwgbWFza0xlbjogbnVtYmVyLCBkYXRhU3RyOiBzdHJpbmdbXSwgaXNBdHRyQWxwaGE6IGJvb2xlYW4pOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB3aW5fZGF0YV9jcHkobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZztcclxuICBwcml2YXRlIHdpbl9kYXRhX2NweShtYXNrU3RyOiBhbnksIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogYW55LCBpc0F0dHJBbHBoYTogYm9vbGVhbiwgY29udmVydENhc2U/OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KVxyXG4gICAgICByZXR1cm4gdGhpcy53aW5fZGF0YV9jcHlfMChtYXNrU3RyLCBtYXNrTGVuLCBkYXRhU3RyLCBpc0F0dHJBbHBoYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2luX2RhdGFfY3B5XzEobWFza1N0ciwgbWFza0xlbiwgZGF0YVN0ciwgaXNBdHRyQWxwaGEsIGNvbnZlcnRDYXNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5XzAobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLndpbl9kYXRhX2NweShtYXNrU3RyLCBtYXNrTGVuLCBkYXRhU3RyLCBpc0F0dHJBbHBoYSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgYWxwaGEgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1N0clwiPiAgIFRoZSBtYXNrIHRvIGJlIHVzZWQgaW4gb3JkZXIgdG8gYnVpbGQgdGhlIHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5XzEobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFza0lkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBkYXRhSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHJlc1N0cjogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihtYXNrTGVuKTtcclxuXHJcbiAgICBpZiAoaXNBdHRyQWxwaGEgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICBsZXQgbnVtMjogbnVtYmVyID0gMDtcclxuICAgICAgd2hpbGUgKG1hc2tJZHggPCBtYXNrTGVuICYmIG51bTIgPCBtYXNrTGVuKSB7XHJcbiAgICAgICAgaWYgKG1hc2tTdHJbbWFza0lkeF0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgICAgaWYgKGRhdGFJZHggPCBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgc3RyVmFsOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhkYXRhU3RyLCBkYXRhSWR4LCAxKTtcclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clZhbCkgPT09IDIpIHtcclxuICAgICAgICAgICAgICBpZiAobWFza0lkeCArIDEgPCBtYXNrTGVuKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFza1N0clttYXNrSWR4ICsgMV0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IHRoaXMuY2FzZUNvbnZlcnRlZENoYXIoZGF0YVN0cltkYXRhSWR4KytdLCBtYXNrU3RyW21hc2tJZHggKyAxXSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSBkYXRhU3RyW2RhdGFJZHgrK107XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbWFza0lkeCA9IG1hc2tJZHggKyAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gJyAnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gJyAnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gdGhpcy5jYXNlQ29udmVydGVkQ2hhcihkYXRhU3RyW2RhdGFJZHgrK10sIG1hc2tTdHJbbWFza0lkeCArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IGRhdGFTdHJbZGF0YUlkeCsrXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9ICcgJy8qJyAnKi87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyW251bTIrK10gPSBtYXNrU3RyW21hc2tJZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtYXNrSWR4ID0gbWFza0lkeCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKHJlc1N0cikuc3Vic3RyKDAsIG51bTIpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChtYXNrSWR4IDwgbWFza0xlbikge1xyXG4gICAgICBpZiAobWFza1N0clttYXNrSWR4XS5jaGFyQ29kZUF0KDApIDw9IFBJQ0ludGVyZmFjZS5QSUNfTUFYX09QKSB7XHJcbiAgICAgICAgaWYgKGRhdGFJZHggPCBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gZGF0YVN0cltkYXRhSWR4XTtcclxuICAgICAgICAgIGlmIChjb252ZXJ0Q2FzZSkge1xyXG4gICAgICAgICAgICByZXNTdHJbbWFza0lkeF0gPSB0aGlzLmNhc2VDb252ZXJ0ZWRDaGFyKGRhdGFTdHJbZGF0YUlkeF0sIG1hc2tTdHJbbWFza0lkeF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc1N0clttYXNrSWR4XSA9IGRhdGFTdHJbZGF0YUlkeF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhSWR4ID0gZGF0YUlkeCArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gJyAnLyonICcqLztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gbWFza1N0clttYXNrSWR4XTtcclxuICAgICAgfVxyXG4gICAgICBtYXNrSWR4ID0gbWFza0lkeCArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMocmVzU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhbiBkYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21EYXRlKGRhdGFTdHI6IHN0cmluZywgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFzazogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBtYXNrU2l6ZTogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBsZXQgZGF0ZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcbiAgICByZXR1cm4gdGhpcy50b19hX3BpY19kYXRlbW9kZShtYXNrLCBtYXNrU2l6ZSwgZGF0ZSwgcGljLCB0aW1lX2RhdGVfcGljX1pfZWR0LCBmYWxzZSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gdGltZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tVGltZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBtYXNrOiBzdHJpbmcgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgbGV0IG1hc2tTaXplOiBudW1iZXIgPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuICAgIGxldCB0aW1lOiBudW1iZXIgPSBuZXcgTlVNX1RZUEUoZGF0YVN0cikuTlVNXzJfVUxPTkcoKTtcclxuICAgIHJldHVybiB0aGlzLnRpbWVfMl9hX3BpYyhtYXNrLCBtYXNrU2l6ZSwgdGltZSwgcGljLCB0aW1lX2RhdGVfcGljX1pfZWR0LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tTWdEYXRlVG9OYXRpdmVEYXRlKGRhdGFTdHI6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogRGF0ZSB7XHJcblxyXG4gICAgbGV0IGRhdGU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICBsZXQgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIEJyZWFrIGRhdGEgaW50byBpdHMgY29tcG9uZW50c1xyXG4gICAgYnJlYWtQYXJhbXMgPSBuZXcgRGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICB0aGlzLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGUsIGZhbHNlLCBjb21wSWR4KTtcclxuICAgIGlmIChicmVha1BhcmFtcy5tb250aCA+IDApXHJcbiAgICAgIGJyZWFrUGFyYW1zLm1vbnRoID0gYnJlYWtQYXJhbXMubW9udGggLSAxOyAvL21vbnRoIGlzIDAgYmFzZWQgaW4gRGF0ZSBjbGFzc1xyXG5cclxuICAgIGlmIChicmVha1BhcmFtcy55ZWFyID09IDAgJiYgYnJlYWtQYXJhbXMubW9udGggPT0gMCAmJiBicmVha1BhcmFtcy5kYXkgPT0gMClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgbmF0aXZlRHQ6IERhdGUgPSBuZXcgRGF0ZShicmVha1BhcmFtcy55ZWFyLCBicmVha1BhcmFtcy5tb250aCwgYnJlYWtQYXJhbXMuZGF5KTtcclxuXHJcbiAgICByZXR1cm4gbmF0aXZlRHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIGRhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU5hdGl2ZURhdGVUb01nRGF0ZU51bWJlcihuYXRpdmVEYXRlOiBEYXRlLCBwaWM6IFBJQyk6IG51bWJlciB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXI7XHJcbiAgICBsZXQgZGF0ZVBhcmFtczogRGF0ZUJyZWFrUGFyYW1zO1xyXG4gICAgbGV0IG1pbGxlbml1bTogbnVtYmVyID0gMDtcclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldERhdGUoKTtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gbmF0aXZlRGF0ZS5nZXRNb250aCgpICsgMTtcclxuXHJcbiAgICAvLyBIZWJyZXcgWWVhclxyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGlmICh5ZWFyID4gMCkge1xyXG4gICAgICAgIGlmIChtaWxsZW5pdW0gPT09IDApXHJcbiAgICAgICAgICBtaWxsZW5pdW0gPSA1O1xyXG4gICAgICAgIHllYXIgKz0gbWlsbGVuaXVtICogMTAwMDtcclxuICAgICAgfVxyXG4gICAgICBudW1WYWwgPSAoSGVicmV3RGF0ZS5kYXRlaGViXzJfZCh5ZWFyLCBtb250aCwgZGF5KSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gdGhlIG5leHQgMiBsaW5lcyBzdXBwb3J0IDQueHggREQvTU0gcGljdHVyZXNcclxuICAgICAgaWYgKHllYXIgPT09IDApIHtcclxuICAgICAgICBkYXRlUGFyYW1zID0gdGhpcy5kYXRlX3N5cygpO1xyXG4gICAgICAgIHllYXIgPSBkYXRlUGFyYW1zLnllYXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG51bVZhbCA9IHRoaXMuZGF0ZV80X2NhbGVuZGVyKHllYXIsIG1vbnRoLCBkYXksIDAsIGZhbHNlKTsgICAgLy8gd2UgYXJlIGFkZGluZyBhIGxpdHRsZSBlbXB0eSBzcGFjZSB0byB0aGUgdmFyaWFibGUsIGJlY2F1c2Ugd2UgbWlnaHQgbGF0ZXJcclxuICAgIH1cclxuICAgIHJldHVybiBudW1WYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tTmF0aXZlRGF0ZVRvTWdEYXRlKG5hdGl2ZURhdGU6IERhdGUsIHBpYzogUElDKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSBuYXRpdmVEYXRlID09IG51bGwgPyAwIDogdGhpcy5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlTnVtYmVyKG5hdGl2ZURhdGUsIHBpYyk7XHJcbiAgICBtZ051bS5OVU1fNF9MT05HKG51bVZhbCk7XHJcblxyXG4gICAgcmV0dXJuIG1nTnVtLnRvWE1McmVjb3JkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIGRhdGUgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3V0U3RyXCI+ICAgICAgICAgIFRoZSBtYXNrIHRvIGJlIHVzZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm91dF9sZW5cIj4gICAgICAgICBNYXNrIGxlbmd0aFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgICAgICAgIFRoZSBwaWN1cmUgaW5mb3JtYXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVfcGljX1pfZWR0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZ25vcmVfZHRfZm10XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgdG9fYV9waWNfZGF0ZW1vZGUob3V0U3RyOiBzdHJpbmcsIG91dF9sZW46IG51bWJlciwgZGF0ZTogbnVtYmVyLCBwaWM6IFBJQywgZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4sIGlnbm9yZV9kdF9mbXQ6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGRveTogbnVtYmVyID0gMDtcclxuICAgIGxldCBkb3c6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gMDtcclxuICAgIGxldCBoZGF5OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGh5ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGhtb250aDogbnVtYmVyID0gMDtcclxuICAgIGxldCBsZWFwOiBCb29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHA6IHN0cmluZ1tdO1xyXG4gICAgbGV0IG91dFZhbDogc3RyaW5nW10gPSBOU3RyaW5nLlRvQ2hhckFycmF5KG91dFN0cik7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcztcclxuICAgIGxldCBkYXRlTmFtZVBhcmFtczogRGF0ZU5hbWVQYXJhbXM7XHJcbiAgICBsZXQgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHN0ck91dDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAvLyBJZiByZXN1bHQgb3ZlcmZsb3dzIHJldHVybiBidWZmZXIsIGZpbGwgd2l0aCBhc3Rlcml4cyBhbmQgYmFpbCBvdXRcclxuICAgIGlmIChwaWMuZ2V0TWFza1NpemUoKSA+IG91dF9sZW4pIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gJyonO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB6ZXJvIGZpbGwgcmVxdWVzdGVkIGFuZCBkYXRlIHZhbHVlIGlzIHplcm8sIGZpbGwgaXQgYW5kIGJhaWwgb3V0XHJcbiAgICBvdXRfbGVuID0gbGVuID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiAhZGF0ZV9waWNfWl9lZHQpIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gcGljLmdldFplcm9QYWQoKTtcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgICB9XHJcbiAgICBpZiAocGljLmlzSGVicmV3KCkgJiYgKGRhdGUgPT09IDAgfHwgZGF0ZSA9PT0gMTAwMDAwMDAwMCkpIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gJyAnO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCcmVhayBkYXRhIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAgIGJyZWFrUGFyYW1zID0gbmV3IERhdGVCcmVha1BhcmFtcyh5ZWFyLCBtb250aCwgZGF5LCBkb3ksIGRvdyk7XHJcbiAgICB0aGlzLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGUsIGlnbm9yZV9kdF9mbXQsIGNvbXBJZHgpO1xyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGxldCByZWZoZGF5OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oaGRheSk7XHJcbiAgICAgIGxldCByZWZobW9udGg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihobW9udGgpO1xyXG4gICAgICBsZXQgcmVmaHllYXI6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihoeWVhcik7XHJcbiAgICAgIGxlYXAgPSBIZWJyZXdEYXRlLmRhdGVoZWJfNF9kKGRhdGUsIHJlZmhkYXksIHJlZmhtb250aCwgcmVmaHllYXIpO1xyXG5cclxuICAgICAgaGRheSA9IHJlZmhkYXkudmFsdWU7XHJcbiAgICAgIGhtb250aCA9IHJlZmhtb250aC52YWx1ZTtcclxuICAgICAgaHllYXIgPSByZWZoeWVhci52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB5ZWFyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIG1vbnRoID0gYnJlYWtQYXJhbXMubW9udGg7XHJcbiAgICBkYXkgPSBicmVha1BhcmFtcy5kYXk7XHJcbiAgICBkb3kgPSBicmVha1BhcmFtcy5kb3k7XHJcbiAgICBkb3cgPSBicmVha1BhcmFtcy5kb3c7XHJcbiAgICBicmVha1BhcmFtcyA9IG51bGw7XHJcbiAgICB3aGlsZSAobGVuID4gMCkge1xyXG4gICAgICBsZXQgcmVmT3V0TGVuOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4ob3V0X2xlbik7XHJcbiAgICAgIHN3aXRjaCAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCB5ZWFyLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk6XHJcbiAgICAgICAgICBpID0gSGVicmV3RGF0ZS5kYXRlaGViXzJfc3RyKG91dFZhbCwgb3V0SWR4LCBsZW4sIHJlZk91dExlbiwgNSwgaHllYXIsIHBpYy5pc1RyaW1lZCgpLCB0cnVlKTtcclxuICAgICAgICAgIG91dF9sZW4gPSByZWZPdXRMZW4udmFsdWU7XHJcbiAgICAgICAgICBvdXRJZHggKz0gaTtcclxuICAgICAgICAgIGxlbiAtPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl9pXzJfaCgoaHllYXIgLyAxMDAwKSAlIDEwLCBvdXRWYWwsIG91dElkeCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIG91dElkeCsrO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEREOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl8yX3N0cihvdXRWYWwsIG91dElkeCwgbGVuLCByZWZPdXRMZW4sIDIsIGhkYXksIHBpYy5pc1RyaW1lZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICBvdXRfbGVuID0gcmVmT3V0TGVuLnZhbHVlO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBsZW4gLT0gaTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWVlZOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDQpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDQsIHllYXIsICcwJyk7XHJcbiAgICAgICAgICBvdXRJZHggKz0gNDtcclxuICAgICAgICAgIGxlbiAtPSA0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCBtb250aCwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgICAgICAgIGlmIChsZWFwICYmIGhtb250aCA9PT0gNilcclxuICAgICAgICAgICAgICBobW9udGggPSAxNDtcclxuICAgICAgICAgICAgbGV0IG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShtb250aE5hbWVzW2htb250aF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBtb250aFN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgICAgICBsZXQgbW9udGhOYW1lczogc3RyaW5nW10gPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aFN0cik7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KG1vbnRoTmFtZXNbbW9udGhdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgb3V0X2xlbiAtPSB0aGlzLmRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zLCBwLCBwaWMuaXNUcmltZWQoKSk7XHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfREQ6XHJcbiAgICAgICAgICBsZXQgaXNaZXJvOiBib29sZWFuID0gcGljLnplcm9GaWxsKCk7XHJcbiAgICAgICAgICBpZiAoaXNaZXJvICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDIsIGRheSwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfREREOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDMpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDMsIGRveSwgJzAnKTtcclxuICAgICAgICAgIGxlbiAtPSAzO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgICAgIGkgPSB0aGlzLmRhdGVfMl9EREREKGRheSwgb3V0VmFsLCBvdXRJZHgsIGxlbiwgcGljLmlzVHJpbWVkKCkpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBvdXRfbGVuICs9IGkgLSA0O1xyXG4gICAgICAgICAgbGVuIC09IDQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAxKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAxLCBkb3csICcwJyk7XHJcbiAgICAgICAgICBsZW4tLTtcclxuICAgICAgICAgIG91dElkeCsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICAgICAgICBsZXQgZG93c05hbWVzOiBzdHJpbmdbXSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KGRvd3NOYW1lc1tkb3ddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgICBsZXQgZGF5TmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KGRheU5hbWVzW2Rvd10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBuZXcgRGF0ZU5hbWVQYXJhbXMob3V0VmFsLCBvdXRJZHgsIGxlbik7XHJcbiAgICAgICAgICBvdXRfbGVuIC09IHRoaXMuZGF0ZV9pXzJfbm0oZGF0ZU5hbWVQYXJhbXMsIHAsIHBpYy5pc1RyaW1lZCgpKTtcclxuICAgICAgICAgIG91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeDtcclxuICAgICAgICAgIGxlbiA9IGRhdGVOYW1lUGFyYW1zLmxlbjtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgLy8gSmFwYW5lc2UgZGF5IG9mIHRoZSB3ZWVrXHJcbiAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShVdGlsRGF0ZUpwbi5nZXRTdHJEb3coZG93KSk7XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBuZXcgRGF0ZU5hbWVQYXJhbXMob3V0VmFsLCBvdXRJZHgsIGxlbik7XHJcbiAgICAgICAgICBzdHJPdXQgPSB0aGlzLmRhdGVfaV8yX25tX2J5dGVtb2RlKHN0ck91dCwgZGF0ZU5hbWVQYXJhbXMsIE5TdHJpbmcuRnJvbUNoYXJzKHApLCBvdXRfbGVuKTtcclxuICAgICAgICAgIG91dFZhbCA9IG5ldyBBcnJheShzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIE5TdHJpbmcuQ29weVRvKHN0ck91dCwgMCwgb3V0VmFsLCAwLCBzdHJPdXQubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMTpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlkyOlxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTQ6XHJcbiAgICAgICAgICAvLyBKYXBhbmVzZSB0aGUgbmFtZSBvZiBhbiBlcmFcclxuICAgICAgICAgIGxldCBzdHJOdW06IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICBpZiAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEpXHJcbiAgICAgICAgICAgIHN0ck51bSA9IFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feXJfMl9hKHllYXIsIGRveSwgZmFsc2UpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBzdHJOdW0gPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYSh5ZWFyLCBkb3ksIHRydWUpO1xyXG4gICAgICAgICAgc3RyT3V0ID0gbnVsbDtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgc3RyT3V0ID0gdGhpcy5kYXRlX2lfMl9ubV9ieXRlbW9kZShzdHJPdXQsIGRhdGVOYW1lUGFyYW1zLCBzdHJOdW0sIG91dF9sZW4pO1xyXG4gICAgICAgICAgb3V0VmFsID0gbnVsbDtcclxuICAgICAgICAgIG91dFZhbCA9IG5ldyBBcnJheShzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIE5TdHJpbmcuQ29weVRvKHN0ck91dCwgMCwgb3V0VmFsLCAwLCBzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIG91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeDtcclxuICAgICAgICAgIGxlbiA9IGRhdGVOYW1lUGFyYW1zLmxlbjtcclxuICAgICAgICAgIHN0ck91dCA9IG51bGw7XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95ZWFyX29mcyh5ZWFyLCBkb3kpLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBvdXRJZHgrKztcclxuICAgICAgICAgIGxlbi0tO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChvdXRfbGVuIDwgb3V0VmFsLmxlbmd0aClcclxuICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dF9sZW4sICcgJywgb3V0VmFsLmxlbmd0aCAtIG91dF9sZW4pO1xyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhvdXRWYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJyZWFrIGEgZGF0ZSBpbnRvIFllYXIsIE1vbnRoLCBEYXkgaW4gbW9udGgsIERheSBpbiB5ZWFyIGFuZCBEYXkgaW4gd2Vla1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZGF0ZV9icmVha19kYXRlbW9kZShicmVha1BhcmFtczogRGF0ZUJyZWFrUGFyYW1zLCBkYXRlOiBudW1iZXIsIGlnbm9yZV9kdF9mbXQ6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBicmVha1BhcmFtcy55ZWFyO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSBicmVha1BhcmFtcy5tb250aDtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRheTtcclxuICAgIGxldCBkb3k6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRveTtcclxuICAgIGxldCBkb3c6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRvdztcclxuXHJcbiAgICBpZiAoZGF0ZSA8PSAwKSB7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRheSA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRveSA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRvdyA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLnllYXIgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5tb250aCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZG93ID0gZGF0ZSAlIDcgKyAxO1xyXG4gICAgICBkYXRlID0gZGF0ZSAtIDE7XHJcbiAgICAgIGxldCBjZW50NDogbnVtYmVyID0gTWF0aC5mbG9vcihkYXRlIC8gUElDSW50ZXJmYWNlLkRBWVNJTkZPVVJDRU5UKTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSBjZW50NCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSQ0VOVDtcclxuICAgICAgbGV0IGNlbnQ6IG51bWJlciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5DRU5UVVJZKTtcclxuICAgICAgaWYgKGNlbnQgPiAzKSB7XHJcbiAgICAgICAgY2VudCA9IDM7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZSA9IGRhdGUgLSBjZW50ICogUElDSW50ZXJmYWNlLkRBWVNJTkNFTlRVUlk7XHJcbiAgICAgIGxldCB5ZWFyNDogbnVtYmVyID0gTWF0aC5mbG9vcihkYXRlIC8gUElDSW50ZXJmYWNlLkRBWVNJTkZPVVJZRUFSKTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSB5ZWFyNCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSWUVBUjtcclxuICAgICAgeWVhciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5ZRUFSKTtcclxuICAgICAgaWYgKHllYXIgPiAzKSB7XHJcbiAgICAgICAgeWVhciA9IDM7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZSA9IGRhdGUgLSB5ZWFyICogUElDSW50ZXJmYWNlLkRBWVNJTllFQVI7XHJcbiAgICAgIHllYXIgPSBjZW50NCAqIDQwMCArIGNlbnQgKiAxMDAgKyB5ZWFyNCAqIDQgKyB5ZWFyICsgMTtcclxuICAgICAgbGV0IGxlYXB5ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAoeWVhciAlIDQgPT09IDApIHtcclxuICAgICAgICBpZiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKSB7XHJcbiAgICAgICAgICBsZWFweWVhciA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlnbm9yZV9kdF9mbXQgJiYgdGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUoY29tcElkeCkgPT09ICdCJykge1xyXG4gICAgICAgIHllYXIgPSB5ZWFyICsgUElDSW50ZXJmYWNlLkRBVEVfQlVEREhJU1RfR0FQO1xyXG4gICAgICB9XHJcbiAgICAgIG1vbnRoID0gKE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5NT05USCkgKyAxKTtcclxuICAgICAgZGF5ID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aF07XHJcbiAgICAgIGlmIChsZWFweWVhciA+IDApIHtcclxuICAgICAgICBpZiAobW9udGggPiAxKSB7XHJcbiAgICAgICAgICBkYXkgPSBkYXkgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGUgPj0gZGF5KSB7XHJcbiAgICAgICAgbW9udGggPSBtb250aCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZGF5ID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aCAtIDFdO1xyXG4gICAgICAgIGlmIChsZWFweWVhciA+IDApIHtcclxuICAgICAgICAgIGlmIChtb250aCA+IDIpIHtcclxuICAgICAgICAgICAgZGF5ID0gZGF5ICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZGF5ID0gZGF0ZSAtIGRheSArIDE7XHJcbiAgICAgIGRveSA9IGRhdGUgKyAxO1xyXG4gICAgICBicmVha1BhcmFtcy55ZWFyID0geWVhcjtcclxuICAgICAgYnJlYWtQYXJhbXMubW9udGggPSBtb250aDtcclxuICAgICAgYnJlYWtQYXJhbXMuZGF5ID0gZGF5O1xyXG4gICAgICBicmVha1BhcmFtcy5kb3kgPSBkb3k7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRvdyA9IGRvdztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYWxwaGEgc3RyaW5nIGZyb20gaW50IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgICAgdGhlIG91dHB1dCBzdHJpbmcgKGFzIGFuIGNoYXIgYXJyYXkpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQb3NcIj4gIHN0YXJ0aW5nIHBvc2l0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj4gICAgIHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5cIj4gICAgICAgdGhlIG51bWJlciB0byBjb252ZXJ0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZWFkXCI+ICAgIGxlYWRpbmcgY2hhcmFjdGVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVzdWx0IHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW50XzJfYShzdHI6IHN0cmluZ1tdLCBzdHJQb3M6IG51bWJlciwgbGVuOiBudW1iZXIsIG46IG51bWJlciwgbGVhZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBuZWc6IGJvb2xlYW4gPSBuIDwgMDtcclxuXHJcbiAgICBpZiAobGVuIDw9IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBuID0gTWF0aC5hYnMobik7XHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSBsZW47XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICBzdHJbc3RyUG9zICsgKHBvcyA9IHBvcyAtIDEpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNDggKyBuICUgMTApO1xyXG4gICAgICBuID0gTWF0aC5mbG9vcihuIC8gMTApO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKHBvcyA+IDAgJiYgbiA+IDApO1xyXG5cclxuICAgIGlmIChuZWcgJiYgcG9zID4gMCkge1xyXG4gICAgICBzdHJbc3RyUG9zICsgKHBvcyA9IHBvcyAtIDEpXSA9ICctJy8qJy0nKi87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5saWJfYV9maWxsKHN0ciwgc3RyUG9zLCBsZW4sIHBvcywgbGVhZC5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCB0aGUgY2hhciBhcnJheSBmb3IgdGhlIGNvbnZlcnRpbmcgb2YgaW50LT5zdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyXCI+ICAgICB0aGUgb3V0cHV0IHN0cmluZyAoYXMgYW4gY2hhciBhcnJheSlcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clBvc1wiPiAgc3RhcnRpbmcgcG9zaXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlblwiPiAgICAgc3RyaW5nIGxlbmd0aFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVhZFwiPiAgICBsZWFkaW5nIGNoYXJhY3RlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGxpYl9hX2ZpbGwoc3RyOiBzdHJpbmdbXSwgc3RyUG9zOiBudW1iZXIsIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlciwgbGVhZDogbnVtYmVyKTogbnVtYmVyIHtcclxuXHJcbiAgICBpZiAobGVhZCA9PT0gMCkge1xyXG4gICAgICBsZW4gPSBsZW4gLSBwb3M7XHJcblxyXG4gICAgICBpZiAobGVuID4gMCAmJiBwb3MgPiAwKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShzdHIsIHN0clBvcywgc3RyLCBwb3MsIGxlbik7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHN0clBvcyArIGxlbiwgJyAnLCAvKicgJyovcG9zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChwb3MgPiAwKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHN0clBvcywgU3RyaW5nLmZyb21DaGFyQ29kZShsZWFkKSwgcG9zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IGluZGV4IHRvIE5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0ZU5hbWVQYXJhbXNcIj4gIG91dHB1dCBzdGluZyBkZXRhaWxzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJubVwiPiAgICAgICAgICAgICAgbmFtZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHJpbVwiPiAgICAgICAgICAgIG91dHB1dCBzdHJpbmcgc2hvdWxkIGJlIHRyaW1lZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zOiBEYXRlTmFtZVBhcmFtcywgbm06IHN0cmluZ1tdLCB0cmltOiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgbjogbnVtYmVyID0gdGhpcy5kYXRlX21za19jbnQoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIDxudW1iZXI+ZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIGxldCBsOiBudW1iZXI7XHJcbiAgICBpZiAodHJpbSkge1xyXG4gICAgICBsID0gTWVtb3J5VXRpbC5tZW1fdHJpbShubSwgMCwgbik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbCA9IG47XHJcbiAgICB9XHJcbiAgICBsID0gTWF0aC5taW4obCwgZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIG5tLCAwLCBsKTtcclxuICAgIGRhdGVOYW1lUGFyYW1zLm91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeCArIGw7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5sZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW4gLSBuO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBUcmltZWQgPyBKdW1wIG90aGVyIHRyaW1lZCBtYXNrIDogbm90aGluZ1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBuID0gbiAtIGw7XHJcblxyXG4gICAgaWYgKG4gPiAwKSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4ICsgbiwgZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIH1cclxuICAgIHJldHVybiA8bnVtYmVyPm47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gIC8vLyAgIENvbnZlcnQgaW5kZXggdG8gTmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJPdXRcIj4gICAgICAgICAgb3V0cHV0IHN0aW5nIChvcmlnaW5hbClcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVOYW1lUGFyYW1zXCI+ICBvdXRwdXQgc3RpbmcgZGV0YWlsc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyTm1cIj4gICAgICAgICAgIG5hbWUgd2hpY2ggd2lsbCBiZSBlbWJlZGRlZCBpbiBvdXRwdXQgc3RyaW5nXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRPdXRMZW5cIj4gICAgICAgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgdGhlIG91dHB1dCBzdHJpbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+ICAgICAgICAgICAgICAgICBvdXRwdXQgc3RpbmcgKHByb2Nlc3NlZClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZGF0ZV9pXzJfbm1fYnl0ZW1vZGUoc3RyT3V0OiBzdHJpbmcsIGRhdGVOYW1lUGFyYW1zOiBEYXRlTmFtZVBhcmFtcywgc3RyTm06IHN0cmluZywgaW50T3V0TGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGludE1za0NudDogbnVtYmVyID0gdGhpcy5kYXRlX21za19jbnQoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIDxudW1iZXI+ZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIGxldCBzdHJXb3JrOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhkYXRlTmFtZVBhcmFtcy5vdXRWYWwpO1xyXG5cclxuICAgIHN0cldvcmsgPSBzdHJXb3JrLnN1YnN0cigwLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgpO1xyXG5cclxuICAgIGxldCBpbnRPZnM6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0cldvcmspO1xyXG4gICAgc3RyTm0gPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIoc3RyTm0sIGludE1za0NudCk7XHJcbiAgICBzdHJPdXQgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQihOU3RyaW5nLkZyb21DaGFycyhkYXRlTmFtZVBhcmFtcy5vdXRWYWwpLCBzdHJObSwgaW50T2ZzICsgMSwgaW50TXNrQ250KTtcclxuXHJcbiAgICBkYXRlTmFtZVBhcmFtcy5vdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHggKyBzdHJObS5sZW5ndGg7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5sZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW4gLSBpbnRNc2tDbnQ7XHJcbiAgICBpbnRPdXRMZW4gPSBpbnRPdXRMZW4gLSBpbnRNc2tDbnQ7XHJcbiAgICByZXR1cm4gc3RyT3V0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBOIG9mIGNvbnNlY3V0aXZlIE1hc2sgY2hhcmFjdGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtc2tcIj4gICAgIHRoZSBtYXNrIHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtc2tQb3NcIj4gIGluZGV4IG9mIGZpcnN0IGNoYXIgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlblwiPiAgICAgbGVuZ3RoIG9mIHRoZSBtYXNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgY29uc2VjdXRpdmUgTWFzayBjaGFyYWN0ZXJzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfbXNrX2NudChtc2s6IHN0cmluZ1tdLCBtc2tQb3M6IG51bWJlciwgbGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGM6IHN0cmluZyA9IG1za1ttc2tQb3MrK107XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMTtcclxuICAgIHdoaWxlICg8bnVtYmVyPmkgPCBsZW4pIHtcclxuICAgICAgaWYgKG1za1ttc2tQb3NdICE9PSBjKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbXNrUG9zID0gbXNrUG9zICsgMTtcclxuICAgICAgaSA9IGkgKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcHV0ZSBEYXkgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBkYXRlXzJfRERERChkYXk6IG51bWJlciwgb3V0VmFsOiBzdHJpbmdbXSwgb3V0SWR4OiBudW1iZXIsIGxlbjogbnVtYmVyLCB0cmltOiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcblxyXG4gICAgbGV0IHJldDogbnVtYmVyID0gNDtcclxuICAgIGxldCBleHQ6IHN0cmluZ1tdO1xyXG5cclxuICAgIGlmIChkYXkgPiA5KSB7XHJcbiAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgZGF5LCAoPG51bWJlcj4wKS50b1N0cmluZygpKTtcclxuICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRyaW0pIHtcclxuICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KG91dFZhbCwgb3V0SWR4LCBvdXRWYWwsIG91dElkeCArIDEsIGxlbiAtIDEpO1xyXG4gICAgICAgIC8qMTctTWF5LTkwKi9cclxuICAgICAgICByZXQtLTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyAqKG91dCsrKSA9ICcgJzsgLy8gT3JpZ2luYWwgTGluZVxyXG4gICAgICAgIG91dFZhbFtvdXRJZHgrK10gPSAnICc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAxLCBkYXksICg8bnVtYmVyPjApLnRvU3RyaW5nKCkpO1xyXG4gICAgICBvdXRJZHgrKztcclxuICAgIH1cclxuICAgIHN3aXRjaCAoZGF5KSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAyMTpcclxuICAgICAgY2FzZSAzMTpcclxuICAgICAgICBleHQgPSBOU3RyaW5nLlRvQ2hhckFycmF5KFwic3RcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgIGNhc2UgMjI6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcIm5kXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAzOlxyXG4gICAgICBjYXNlIDIzOlxyXG4gICAgICAgIGV4dCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJyZFwiKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcInRoXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgb3V0VmFsW291dElkeCsrXSA9IGV4dFswXTtcclxuICAgIG91dFZhbFtvdXRJZHhdID0gZXh0WzFdO1xyXG5cclxuICAgIHJldHVybiAocmV0KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIHRpbWUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU1nVGltZVRvTmF0aXZlVGltZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDKTogRGF0ZSB7XHJcbiAgICBsZXQgbWFzazogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBtYXNrU2l6ZTogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBsZXQgdGltZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcblxyXG5cclxuICAgICAgbGV0IGJyZWFrUGFyYW1zOiBUaW1lQnJlYWtQYXJhbXMgPSBuZXcgVGltZUJyZWFrUGFyYW1zKCk7XHJcblxyXG4gICAgICBEaXNwbGF5Q29udmVydG9yLnRpbWVfYnJlYWsoYnJlYWtQYXJhbXMsIHRpbWUpO1xyXG5cclxuICAgICAgbGV0IG5hdGl2ZUR0OiBEYXRlID0gbmV3IERhdGUoKTtcclxuXHJcbiAgICAgIG5hdGl2ZUR0LnNldEhvdXJzKGJyZWFrUGFyYW1zLmhvdXIpO1xyXG4gICAgICBuYXRpdmVEdC5zZXRNaW51dGVzKGJyZWFrUGFyYW1zLm1pbnV0ZSk7XHJcbiAgICAgIG5hdGl2ZUR0LnNldFNlY29uZHMoYnJlYWtQYXJhbXMuc2Vjb25kKTtcclxuICAgICAgcmV0dXJuIG5hdGl2ZUR0O1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHRpbWUgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQXNjaWlTdHJcIj4gICAgICAgIFRoZSBtYXNrIHRvIGJlIHVzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQXNjaWlMXCI+ICAgICAgICAgIE1hc2sgbGVuZ3RoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgICAgICAgICBUaGUgcGljdXJlIGluZm9ybWF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRpbWVfcGljX1pfZWR0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlY29uZHNcIj4vIG1pbGxpU2Vjb25kcyBmbGFnPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHRpbWVfMl9hX3BpYyhBc2NpaVN0cjogc3RyaW5nLCBBc2NpaUw6IG51bWJlciwgdGltZTogbnVtYmVyLCBwaWM6IFBJQywgdGltZV9waWNfWl9lZHQ6IGJvb2xlYW4sIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IHN0cmluZyB7XHJcblxyXG4gICAgLy8gT3JpZ2luYWwgdmFyc1xyXG4gICAgbGV0IGhvdXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlY29uZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsaXNlYzogbnVtYmVyID0gMDtcclxuXHJcbiAgICBsZXQgQXNjaWk6IHN0cmluZ1tdID0gTlN0cmluZy5Ub0NoYXJBcnJheShBc2NpaVN0cik7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcyA9IG5ldyBUaW1lQnJlYWtQYXJhbXMoaG91ciwgbWludXRlLCBzZWNvbmQpO1xyXG4gICAgbGV0IHRpbWVTZWM6IG51bWJlcjtcclxuICAgIGlmIChtaWxsaVNlY29uZHMpIHtcclxuICAgICAgdGltZVNlYyA9IE1hdGguZmxvb3IodGltZSAvIDEwMDApO1xyXG4gICAgICBtaWxsaXNlYyA9IHRpbWUgLSB0aW1lU2VjICogMTAwMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aW1lU2VjID0gdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLnRpbWVfYnJlYWsoYnJlYWtQYXJhbXMsIHRpbWVTZWMpO1xyXG4gICAgaG91ciA9IGJyZWFrUGFyYW1zLmhvdXI7XHJcbiAgICBtaW51dGUgPSBicmVha1BhcmFtcy5taW51dGU7XHJcbiAgICBzZWNvbmQgPSBicmVha1BhcmFtcy5zZWNvbmQ7XHJcblxyXG4gICAgLy8gSWYgYXNjaWkgcmVwcmVzZW50YXRpb24gb3ZlcmZsb3dzIG91dHB1dCBidWZmZXJcclxuICAgIC8vIGZpbGwgd2l0aCAnKicgYW5kIGJhaWwgb3V0XHJcblxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKHBpYy5nZXRNYXNrU2l6ZSgpID4gQXNjaWlMKSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoQXNjaWksIDAsICcqJywgLyonKicqL0FzY2lpTCk7XHJcbiAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRnJvbUNoYXJzKEFzY2lpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocGljLnplcm9GaWxsKCkpIHtcclxuICAgICAgICBpZiAodGltZVNlYyA9PT0gMCAmJiAoIW1pbGxpU2Vjb25kcyB8fCBtaWxsaXNlYyA9PT0gMCkpIHtcclxuICAgICAgICAgIGlmICh0aW1lX3BpY19aX2VkdCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbnR4OiBudW1iZXIgPSAwOyBpbnR4IDwgcGljLmdldE1hc2tTaXplKCk7IGludHggPSBpbnR4ICsgMSkge1xyXG4gICAgICAgICAgICAgIGlmIChBc2NpaVtpbnR4XSA8PSAnXFx1MDAxZicpIHtcclxuICAgICAgICAgICAgICAgIEFzY2lpW2ludHhdID0gcGljLmdldFplcm9QYWQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChBc2NpaSwgMCwgcGljLmdldFplcm9QYWQoKSwgcGljLmdldE1hc2tTaXplKCkpO1xyXG4gICAgICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IEk6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBhbTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICAgIGxldCBIb3VySTogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgICB3aGlsZSAoSSA8IGxlbikge1xyXG4gICAgICAgIHN3aXRjaCAoQXNjaWlbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ISCk6XHJcbiAgICAgICAgICAgIEhvdXJJID0gSTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEksIDIsIG1pbnV0ZSwgJzAnKTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKTpcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKEFzY2lpLCBJLCAyLCBzZWNvbmQsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6XHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShBc2NpaSwgSSwgMywgbWlsbGlzZWMsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMztcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19QTSk6XHJcbiAgICAgICAgICAgIGFtID0gMTtcclxuICAgICAgICAgICAgbGV0IHRtcEhvdXI6IG51bWJlciA9IGhvdXIgJSAyNDtcclxuICAgICAgICAgICAgaWYgKHRtcEhvdXIgPCAxMiB8fCB0bXBIb3VyID09PSAwKVxyXG4gICAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoQXNjaWksIEksIE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJhbVwiKSwgMCwgMik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KEFzY2lpLCBJLCBOU3RyaW5nLlRvQ2hhckFycmF5KFwicG1cIiksIDAsIDIpO1xyXG4gICAgICAgICAgICBJICs9IDI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEkrKztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChIb3VySSA+PSAwKSB7XHJcbiAgICAgICAgaWYgKGFtID4gMCkge1xyXG4gICAgICAgICAgaG91ciA9IGhvdXIgJSAyNDtcclxuICAgICAgICAgIGlmIChob3VyID09PSAwKSB7XHJcbiAgICAgICAgICAgIGhvdXIgPSAxMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBob3VyID0gaG91ciAlIDEyO1xyXG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGhvdXIgPSAxMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEhvdXJJLCAyLCBob3VyLCAoYW0gIT09IDAgJiYgaG91ciA8IDEwKSA/ICcgJyA6IC8qJyAnKi8nMCcvKicwJyovKTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSBOU3RyaW5nLkZyb21DaGFycyhBc2NpaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJyZWFrIHRpbWUgaW50byBpdHMgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIHRpbWVfYnJlYWsoYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcywgdGltZTogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRpbWUgPD0gMCkge1xyXG4gICAgICBicmVha1BhcmFtcy5zZWNvbmQgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5taW51dGUgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5ob3VyID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBicmVha1BhcmFtcy5ob3VyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgIHRpbWUgPSB0aW1lIC0gYnJlYWtQYXJhbXMuaG91ciAqIDM2MDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLm1pbnV0ZSA9IE1hdGguZmxvb3IodGltZSAvIDYwKTtcclxuICAgICAgYnJlYWtQYXJhbXMuc2Vjb25kID0gdGltZSAtIGJyZWFrUGFyYW1zLm1pbnV0ZSAqIDYwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGEgbG9naWNhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFwiMFwiIGZvciBmYWxzZSBvciBcIjFcIiBmb3IgdHJ1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXlcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+ICBUaGUgcmFuZ2Ugb2YgdmFsdWVzIHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmcm9tTG9naWNhbChkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCByYW5nZVN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgU3RyOiBzdHJpbmdbXSA9IE5TdHJpbmcuVG9DaGFyQXJyYXkocGljLmdldE1hc2soKSk7XHJcblxyXG4gICAgLy8gSWYgcGljdHVyZSBvdmVyZmxvd3Mgc3RyaW5nLCByZXNldCB3aXRoICcqJ1xyXG4gICAgaWYgKHBpYy5nZXRNYXNrU2l6ZSgpID4gU3RyLmxlbmd0aCkge1xyXG4gICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KFN0ciwgMCwgJyonLCAvKicqJyovU3RyLmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhTdHIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG4gICAgICAvLyBDcmFjayByYW5nZSBhbmQgY29weSB0aGUgZGF0YVxyXG5cclxuICAgICAgbGV0IGFycmF5Mjogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPig1MCk7XHJcbiAgICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgYXJyYXkyLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgICAgYXJyYXkyW19haV0gPSAoMCkudG9TdHJpbmcoKTtcclxuICAgICAgdGhpcy53aW5fcm5nX2Jvb2xfc3ViKGFycmF5MiwgYXJyYXkyLmxlbmd0aCwgZGF0YVN0ci5jaGFyQXQoMCkgPT09ICcxJy8qJzEnKi8sIHJhbmdlU3RyKTtcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcblxyXG4gICAgICAvLyBPcmlnaW5hbCBDb2RlIC0gbm90IHJlbGV2YW50IGluIGphdmEgYmVjYXVzZSB0aGUgcmVzdWx0IGlzIGFsbHdheXMgdGhlIG1hc2sgbGVuXHJcbiAgICAgIC8vIGlmIChsZW4gPCBTdHJMZW4pXHJcbiAgICAgIC8vIGNoYXJfbWVtc2V0IChTdHIsIGxlbiwgJyAnLCBTdHJMZW4gLSBsZW4pO1xyXG4gICAgICBsZXQgcmVzU3RyOiBzdHJpbmcgPSB0aGlzLndpbl9kYXRhX2NweShTdHIsIGxlbiwgYXJyYXkyLCBwaWMuaXNBdHRyQWxwaGEoKSk7XHJcbiAgICAgIHJldHVybiByZXNTdHI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYSBsb2dpY2FsIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgXCIwXCIgZm9yIGZhbHNlIG9yIFwiMVwiIGZvciB0cnVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZyb21NZ0xvZ2ljYWxUb05hdGl2ZUxvZ2ljYWwoZGF0YVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IG5hdGl2ZVZhbDogYm9vbGVhbjtcclxuICAgIG5hdGl2ZVZhbCA9IChkYXRhU3RyLmNoYXJBdCgwKSA9PT0gJzEnKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIHJldHVybiBuYXRpdmVWYWw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgbWcgc3RyaW5nIGZvciBhIGxvZ2ljYWwgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBib29sZWFuIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWxcIj4gIGJvb2xlYW5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHN0cmluZ1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmcm9tTmF0aXZlTG9naWNhbFRvTWdMb2dpY2FsKGRpc3BWYWw6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nO1xyXG4gICAgbWdWYWwgPSAoZGlzcFZhbCA9PT0gdHJ1ZSkgPyBcIjFcIiA6IFwiMFwiO1xyXG5cclxuICAgIHJldHVybiBtZ1ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgYSBib29sZWFuIHZhbHVlIGZyb20gdGhlIHJhbmdlIHNwZWNpZmllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJTdWJcIj4gICAgICB0aGUgcmVzdWx0IHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJTdWJTaXpcIj4gICB0aGUgcmVzdWx0IHN0cmluZyBsZW5ndGg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQm9vbFZhbFwiPiAgJzEnIGlmIHRydWUgb3IgJzAnIGlmIGZhbHNlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJuZ1wiPiAgICAgIHJhbmdlIG9mIHZhbHVlczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSB3aW5fcm5nX2Jvb2xfc3ViKFN1Yjogc3RyaW5nW10sIFN1YlNpejogbnVtYmVyLCBCb29sVmFsOiBib29sZWFuLCBybmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGxldCBjcms6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oUElDSW50ZXJmYWNlLkRCX1NUUl9NQVggKyAyKTtcclxuICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgY3JrLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIGNya1tfYWldID0gKDApLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgbGV0IGdhcDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihQSUNJbnRlcmZhY2UuREJfU1RSX01BWCArIDIpO1xyXG4gICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCBnYXAubGVuZ3RoOyArK19haSlcclxuICAgICAgZ2FwW19haV0gPSAoMCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcmFuZ2UgaWYgbm9uZSBpcyBzcGVjaWZpZWRcclxuICAgIHJuZyA9IHRoaXMud2luX3JuZ19ib29sKHJuZyk7XHJcblxyXG4gICAgLy8gQ3JhY2sgcmFuZ2UgYW5kIGNob29zZSB0aGUgZmlyc3QgZWxlbWVudCBhcyBUcnVlIHZhbHVlXHJcbiAgICAvLyBvciB0aGUgc2Vjb25kIGVsZW1lbnQgYXMgdGhlIEZhbHNlIHZhbHVlLlxyXG4gICAgdGhpcy53aW5fcm5nX2NyayhjcmssIGdhcCwgcm5nKTtcclxuICAgIGxldCBzOiBudW1iZXI7XHJcbiAgICBpZiAoQm9vbFZhbCkge1xyXG4gICAgICBzID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB3aGlsZSAoY3JrW2ldID4gJ1xcMCcvKidcdTAwMDAnKi8pIHtcclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgcyA9IGkgKyAxO1xyXG4gICAgfVxyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gcztcclxuICAgIHdoaWxlIChjcmtbbGVuXSA+ICdcXDAnLyonXHUwMDAwJyovKSB7XHJcbiAgICAgIGxlbiA9IGxlbiArIDE7XHJcbiAgICB9XHJcbiAgICBsZW4gPSBsZW4gLSBzO1xyXG4gICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShTdWIsIDAsIGNyaywgcywgTWF0aC5taW4obGVuLCBTdWJTaXopKTtcclxuICAgIGlmIChsZW4gPCBTdWJTaXopIHtcclxuICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChTdWIsIGxlbiwgJyAnLCAvKicgJyovU3ViU2l6IC0gbGVuKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGRlZmF1bHQgcmFuZ2UgZm9yIGxvZ2ljYWwgdmFsdWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJuZ1wiPiAgY3VycmVudCByYW5nZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZGVmYXVsdCByYW5nZSBpZiB0aGUgaW5wdXQgcmFuZ2UgaXMgZW1wdHk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSB3aW5fcm5nX2Jvb2wocm5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGlmIChybmcgPT09IG51bGwgfHwgcm5nLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBybmcgPSBcIlRydWUsIEZhbHNlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcm5nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENyYWNrIGEgJ3JhbmdlJyBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSB3aW5fcm5nX2Nyayhjcms6IHN0cmluZ1tdLCBnYXA6IHN0cmluZ1tdLCByYW5nZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcm5nTGVuOiBudW1iZXIgPSByYW5nZS5sZW5ndGg7XHJcbiAgICBsZXQgcm5nOiBzdHJpbmdbXSA9IE5TdHJpbmcuVG9DaGFyQXJyYXkocmFuZ2UpO1xyXG4gICAgbGV0IGNya1BvczogbnVtYmVyID0gMDtcclxuICAgIGxldCBybmdQb3M6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZ2FwUG9zOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHdoaWxlIChybmdQb3MgPCBybmdMZW4pIHtcclxuICAgICAgaWYgKHJuZ1tybmdQb3NdID09PSAnLCcgfHwgcm5nW3JuZ1Bvc10gPT09ICctJykge1xyXG4gICAgICAgIGdhcFtnYXBQb3MrK10gPSBybmdbcm5nUG9zKytdO1xyXG4gICAgICAgIGNya1tjcmtQb3MrK10gPSAnXFwwJztcclxuXHJcbiAgICAgICAgaWYgKHJuZ1BvcyA8IHJuZ0xlbikge1xyXG4gICAgICAgICAgd2hpbGUgKHJuZ1tybmdQb3NdID09PSAnICcpIHtcclxuICAgICAgICAgICAgcm5nUG9zID0gcm5nUG9zICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gMDUvMTAvOTUgLSBNci4gVGFrYWRhIDpcclxuICAgICAgICAvLyBKYXBhbmVzZSBjaGFyIG1heSBoYXZlICdcXCcgY29kZSBvZiBpdHMgc2Vjb25kIGJ5dGUuXHJcbiAgICAgICAgLy8gc3RyX2Nocl8xX2J5dCBuZWVkcyBtZ2xvY2FsLmguXHJcbiAgICAgICAgLy8gYWNjb3JkaW5nIHRvIE1yLiBNYXJ1b2thOlxyXG4gICAgICAgIGlmIChybmdbcm5nUG9zXSA9PT0gJ1xcXFwnKSB7XHJcbiAgICAgICAgICBybmdQb3MgPSBybmdQb3MgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjcmtbY3JrUG9zXSA9IHJuZ1tybmdQb3MrK107XHJcbiAgICAgICAgY3JrUG9zID0gY3JrUG9zICsgMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEpQTjogMDEvMTEvOTUgWWFtYSovXHJcbiAgICAvLyBVcHBlciBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiBzdHIuYyBhbmRcclxuICAgIC8vIGl0IGlzIGFsc28gb3ZlcnJpZGVkIGJ5IG1nbG9jYWwgZnVuY3Rpb24uXHJcbiAgICAvLyBTbyBNQUdJQyBuZWVkcyB0byBjYWxsIHRoaXMgZnVuY3Rpb25cclxuICAgIC8vIGluc3RlYWQgb2YgQ1NUX2hkci51cHByX3RhYltdLlxyXG5cclxuICAgIC8vIGlmICh1cClcclxuICAgIC8vIFx0c3RyX3VwcGVyIChvcmdfY3JrLCAobG9uZykoY3JrLW9yZ19jcmspKTtcclxuXHJcblxyXG4gICAgZ2FwW2dhcFBvc10gPSAnXFwwJztcclxuICAgIGNya1tjcmtQb3MrK10gPSAnXFwwJztcclxuICAgIGNya1tjcmtQb3NdID0gJ1xcMCc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIE1ldGhvZHMgZm9yIGNvdmVydGluZyBESVBMQVkgLS0tPiBJTlRFUk5BTFxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcmFuc2xhdGVzIGEgc3RyaW5nIG51bWJlciB0byBtYWdpYyBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+ICAgQSBzdHJpbmcgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICAgIFRoZSBwaWN0dXJlIHRvIHVzZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbWFnaWMgbnVtYmVyPC9yZXR1cm5zPlxyXG4gIHRvTnVtKGRpc3BWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoZGlzcFZhbHVlLCBwaWMsIGNvbXBJZHgpO1xyXG4gICAgcmV0dXJuIG1nTnVtLnRvWE1McmVjb3JkKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkcyB0aGUgZGF0ZSBtYWdpYyBudW1iZXIgZnJvbSB0aGUgc3RyaW5nIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgICAgICAgICAgIHRoZSBkYXRlIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJfbGVuXCI+ICAgICAgICBsZW5ndGggb2Ygc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgICAgICAgIHRoZSBwaWN0dXJlIGluZm88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1wiPiAgICAgICAgICAgdGhlIG1hc2sgb2YgdGhlIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZ25vcmVfZHRfZm10XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBtYWdpYyBudW1iZXI8L3JldHVybnM+XHJcbiAgYV8yX2RhdGVfcGljX2RhdGVtb2RlKHN0cjogc3RyaW5nW10sIHN0cl9sZW46IG51bWJlciwgcGljOiBQSUMsIG1hc2s6IHN0cmluZ1tdLCBjb21wSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHBvczogbnVtYmVyID0gMDtcclxuICAgIGxldCB5ZWFyX2luX3BpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1vbnRoX2luX3BpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGRheV9pbl9waWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpbnA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBiWWVhcklzWmVybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVyYV95ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGludFJlZjogSW50UmVmID0gbmV3IEludFJlZigwKTtcclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWlsbGVuaXVtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGRhdGVQYXJhbXM6IERhdGVCcmVha1BhcmFtcztcclxuXHJcbiAgICBsZXQgbGVuOiBudW1iZXIgPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBwaWMuZ2V0TWFza1NpemUoKSk7XHJcblxyXG4gICAgaWYgKHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgc3RyLmxlbmd0aCA9IG1hc2subGVuZ3RoO1xyXG5cclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IGRheTogbnVtYmVyID0gMTtcclxuICAgIGxldCBkb3k6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgdXNlZG95OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHJfbGVuOyBpID0gaSArIDEpIHtcclxuICAgICAgaWYgKHN0cltpXSAhPT0gJzAnICYmIHN0cltpXSAhPT0gJyAnKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaSA9PT0gc3RyX2xlbilcclxuICAgICAgcmV0dXJuIDA7XHJcblxyXG4gICAgd2hpbGUgKHBvcyA8IHN0cl9sZW4gJiYgcG9zICsgaW50UGljSWR4T2ZzIDwgbGVuKSB7XHJcblxyXG4gICAgICBzd2l0Y2ggKG1hc2tbcG9zICsgaW50UGljSWR4T2ZzXS5jaGFyQ29kZUF0KDApKSB7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZOlxyXG4gICAgICAgICAgeWVhcl9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIHllYXIgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDI7XHJcbiAgICAgICAgICAvLyBIZW4gMTYvMTEvOTcgOiBGaXggIzc2ODQ0MlxyXG4gICAgICAgICAgaWYgKHllYXIgPT09IDApXHJcbiAgICAgICAgICAgIGJZZWFySXNaZXJvID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBjZW50dXJ5X3llYXI6IG51bWJlciA9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkoY29tcElkeCkgJSAxMDA7IC8vIERFRl9jZW50dXJ5XHJcbiAgICAgICAgICBpZiAoeWVhciA8IGNlbnR1cnlfeWVhcilcclxuICAgICAgICAgICAgeWVhciArPSAxMDA7XHJcbiAgICAgICAgICB5ZWFyICs9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkoY29tcElkeCkgLSBjZW50dXJ5X3llYXI7IC8vIERFRl9jZW50dXJ5XHJcbiAgICAgICAgICBpZiAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUoY29tcElkeCkgPT09ICdCJylcclxuICAgICAgICAgIC8vIERFRl9kYXRlX21vZGVcclxuICAgICAgICAgICAgeWVhciAtPSBQSUNJbnRlcmZhY2UuREFURV9CVURESElTVF9HQVA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfWVlZWSk6XHJcbiAgICAgICAgICB5ZWFyX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IFllYXJEaWdpdHNObzogbnVtYmVyO1xyXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIDQgeWVhciBkaWdpdC4gSWYgbm90LCBhZGp1c3QgaXRcclxuICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgJ2NlbnR1cnkgeWVhcidcclxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICAgIGZvciAoWWVhckRpZ2l0c05vID0gMDsgWWVhckRpZ2l0c05vIDwgNCAmJiBwb3MgKyBZZWFyRGlnaXRzTm8gPCBzdHIubGVuZ3RoICYmIFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyBZZWFyRGlnaXRzTm9dKTsgWWVhckRpZ2l0c05vKyspIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpID0gWWVhckRpZ2l0c05vO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IHBvcyArIGkgPCBzdHIubGVuZ3RoICYmIHN0cltwb3MgKyBpXSAhPT0gdGhpcy5EQVRFQ0hBUi50b1N0cmluZygpICYmIGkgPCA0OyBpKyspIHtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChZZWFyRGlnaXRzTm8gPSAwO1xyXG4gICAgICAgICAgICAgICAgIHBvcyArIFllYXJEaWdpdHNObyA8IHN0ci5sZW5ndGggJiYgVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW3BvcyArIFllYXJEaWdpdHNOb10pICYmXHJcbiAgICAgICAgICAgICAgICAgWWVhckRpZ2l0c05vIDwgNDtcclxuICAgICAgICAgICAgICAgICBZZWFyRGlnaXRzTm8rKykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBpZiAoaSA8IDQgJiYgc3RyLmxlbmd0aCA8IG1hc2subGVuZ3RoKVxyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCA0IC0gaSwgc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGkgPCA0ICYmIGxlbiA8IG1hc2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDQgLSBpLCBsZW4pO1xyXG4gICAgICAgICAgICAgIGxlbiA9IGxlbiArIDQgLSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgeWVhciA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDQsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gNDtcclxuXHJcbiAgICAgICAgICAvLyBIZW4gMTYvMTEvOTcgOiBGaXggIzc2ODQ0MlxyXG4gICAgICAgICAgaWYgKHllYXIgPT09IDApXHJcbiAgICAgICAgICAgIGJZZWFySXNaZXJvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBpZiAoWWVhckRpZ2l0c05vIDw9IDIpIHtcclxuICAgICAgICAgICAgY2VudHVyeV95ZWFyID0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeShjb21wSWR4KSAlIDEwMDsgLy8gREVGX2NlbnR1cnlcclxuICAgICAgICAgICAgaWYgKHllYXIgPCBjZW50dXJ5X3llYXIpXHJcbiAgICAgICAgICAgICAgeWVhciArPSAxMDA7XHJcbiAgICAgICAgICAgIHllYXIgKz0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeShjb21wSWR4KSAtIGNlbnR1cnlfeWVhcjsgLy8gREVGX2NlbnR1cnlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUoY29tcElkeCkgPT09ICdCJylcclxuICAgICAgICAgIC8vIERFRl9kYXRlX21vZGVcclxuICAgICAgICAgICAgeWVhciAtPSBQSUNJbnRlcmZhY2UuREFURV9CVURESElTVF9HQVA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IHF1b3RlczogbnVtYmVyID0gMDtcclxuICAgICAgICAgIGlmIChsZW4gPiBwb3MgKyA1ICYmIG1hc2tbcG9zICsgNV0uY2hhckNvZGVBdCgwKSA9PT0gKFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZKSlcclxuICAgICAgICAgICAgcXVvdGVzID0gMTtcclxuICAgICAgICAgIHllYXIgPSBIZWJyZXdEYXRlLmRhdGVoZWJfaF8yX2koc3RyLCA1ICsgcXVvdGVzLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDUgKyBxdW90ZXM7XHJcbiAgICAgICAgICBpZiAoeWVhciA9PT0gMClcclxuICAgICAgICAgICAgYlllYXJJc1plcm8gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ITDpcclxuICAgICAgICAgIGludFBpY0lkeE9mcyA9IEhlYnJld0RhdGUuZGF0ZWhlYl9oXzJfaShzdHIsIDEsIHBvcyk7XHJcbiAgICAgICAgICBwb3MrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEREOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIHF1b3RlcyA9IDA7XHJcbiAgICAgICAgICBpZiAobGVuID4gcG9zICsgMiAmJiBtYXNrW3BvcyArIDJdLmNoYXJDb2RlQXQoMCkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEREKVxyXG4gICAgICAgICAgICBxdW90ZXMgPSAxO1xyXG4gICAgICAgICAgZGF5ID0gSGVicmV3RGF0ZS5kYXRlaGViX2hfMl9pKHN0ciwgMiArIHF1b3RlcywgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyICsgcXVvdGVzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgbW9udGhfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgaWYgKChzdHIubGVuZ3RoID09PSBwb3MgKyAxIHx8IHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSIHx8ICFVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgMV0pKSAmJiBzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzdHJbcG9zICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gdGhpcy5EQVRFQ0hBUiAmJiBsZW4gPCBtYXNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCAxLCBsZW4pO1xyXG4gICAgICAgICAgICAgIGxlbiArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBtb250aCA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NTTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBtb250aF9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaW50UmVmLnZhbCA9IHBvcztcclxuICAgICAgICAgIG1vbnRoID0gdGhpcy5kYXRlX01NTV8yX20oc3RyLCBtYXNrLCBpbnRSZWYsIGxlbiwgcGljLmlzSGVicmV3KCkpO1xyXG4gICAgICAgICAgcG9zID0gaW50UmVmLnZhbDtcclxuICAgICAgICAgIGlmIChwaWMuaXNIZWJyZXcoKSAmJiBtb250aCA9PT0gMTQpXHJcbiAgICAgICAgICAgIG1vbnRoID0gNjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ERCk6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgZGF5X2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICAgIGlmICgoc3RyLmxlbmd0aCA9PT0gcG9zICsgMSB8fCBzdHJbcG9zICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gdGhpcy5EQVRFQ0hBUiB8fCAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW3BvcyArIDFdKSkgJiYgc3RyLmxlbmd0aCA8IG1hc2subGVuZ3RoKVxyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCAxLCBzdHIubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgJiYgbGVuIDwgbWFzay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgbGVuKTtcclxuICAgICAgICAgICAgICBsZW4gKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF5ID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0RERCk6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgdXNlZG95ID0gdHJ1ZTtcclxuICAgICAgICAgIGRheV9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgZG95ID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMywgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0REREQpOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGRheV9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgZGF5ID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyICsgMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ZSik6IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIHllYXJfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICAgIGlmICgoc3RyLmxlbmd0aCA9PT0gcG9zICsgMSB8fCBzdHJbcG9zICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gdGhpcy5EQVRFQ0hBUiB8fCAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW3BvcyArIDFdKSkgJiYgc3RyLmxlbmd0aCA8IG1hc2subGVuZ3RoKVxyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCAxLCBzdHIubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHllYXIgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDI7XHJcblxyXG4gICAgICAgICAgbGV0IHN0cjE6IHN0cmluZyA9IE5TdHJpbmcuRnJvbUNoYXJzKHN0cik7XHJcbiAgICAgICAgICBlcmFfeWVhciA9IFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZ2V0U3RhcnRZZWFyT2ZFcmEoc3RyMSwgcGljLmdldE1hc2soKSk7XHJcblxyXG4gICAgICAgICAgaWYgKGVyYV95ZWFyID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIHllYXIgKz0gZXJhX3llYXIgLSAxO1xyXG5cclxuICAgICAgICAgIGlmICh5ZWFyID09PSAwKVxyXG4gICAgICAgICAgICBiWWVhcklzWmVybyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAgICAgICAvLyBpZiBcInN0cltwb3NdXCIgY29udGFpbnMgREJDUywgdGhlIG5leHQgaW5kZXggb2YgXCJtYXNrXCIgaGFzIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoc3RyW3Bvc10pID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgICAgIFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChtYXNrW3BvcyArIGludFBpY0lkeE9mc10pKVxyXG4gICAgICAgICAgICAgIGludFBpY0lkeE9mcysrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHBvcyArPSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYlllYXJJc1plcm8pIHtcclxuICAgICAgaWYgKCFtb250aF9pbl9waWMpXHJcbiAgICAgICAgbW9udGggPSAwO1xyXG4gICAgICBpZiAoIWRheV9pbl9waWMgJiYgbW9udGggPT09IDApXHJcbiAgICAgICAgZGF5ID0gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIZW4gMTYvMTEvOTcgOiBGaXggIzc2ODQ0MlxyXG4gICAgLy8gWmVybyBkYXRlIGlzIHZhbGlkIGFuZCBzaG91bGQgcmV0dXJuIDBMLiBUaGlzIGNoZWNrIG11c3QgYmUgaGVyZVxyXG4gICAgLy8gYmVjYXVzZSB0aGUgeWVhciB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGNlbnR1cnkgeWVhci5cclxuICAgIGlmIChkYXkgPT09IDAgJiYgbW9udGggPT09IDAgJiYgKGJZZWFySXNaZXJvIHx8IHllYXIgPT09IDApKVxyXG4gICAgICByZXR1cm4gKDApO1xyXG5cclxuICAgIGlmICghaW5wKVxyXG4gICAgICByZXR1cm4gKDApO1xyXG5cclxuICAgIC8vIEhlYnJldyBZZWFyXHJcbiAgICBpZiAocGljLmlzSGVicmV3KCkpIHtcclxuICAgICAgaWYgKHllYXIgPiAwKSB7XHJcbiAgICAgICAgaWYgKG1pbGxlbml1bSA9PT0gMClcclxuICAgICAgICAgIG1pbGxlbml1bSA9IDU7XHJcbiAgICAgICAgeWVhciArPSBtaWxsZW5pdW0gKiAxMDAwO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoSGVicmV3RGF0ZS5kYXRlaGViXzJfZCh5ZWFyLCBtb250aCwgZGF5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhlIG5leHQgMiBsaW5lcyBzdXBwb3J0IDQueHggREQvTU0gcGljdHVyZXNcclxuICAgIGlmICgoeWVhciA9PT0gMCkgJiYgIXllYXJfaW5fcGljKSB7XHJcbiAgICAgIGRhdGVQYXJhbXMgPSB0aGlzLmRhdGVfc3lzKCk7XHJcbiAgICAgIHllYXIgPSBkYXRlUGFyYW1zLnllYXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHRoaXMuZGF0ZV80X2NhbGVuZGVyKHllYXIsIG1vbnRoLCBkYXksIGRveSwgdXNlZG95KSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVjb2RlIGRpZ2l0cyBmcm9tIGEgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaShzOiBzdHJpbmdbXSwgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyO1xyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaShzOiBzdHJpbmcsIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlcik6IG51bWJlcjtcclxuICBwcml2YXRlIGRhdGVfYV8yX2koczogYW55LCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgKHMgPT09IG51bGwgfHwgcyBpbnN0YW5jZW9mIEFycmF5KSAmJiAobGVuID09PSBudWxsIHx8IGxlbi5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAocG9zID09PSBudWxsIHx8IHBvcy5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRlX2FfMl9pXzAocywgbGVuLCBwb3MpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZV9hXzJfaV8xKHMsIGxlbiwgcG9zKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBEZWNvZGUgZGlnaXRzIGZyb20gYSBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBkYXRlX2FfMl9pXzAoczogc3RyaW5nW10sIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYXJyYXk6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4obGVuKTtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkgPSBpICsgMSkge1xyXG4gICAgICBhcnJheVtpXSA9IHNbcG9zICsgaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWdOdW0uYV8yX2xvbmcoTlN0cmluZy5Gcm9tQ2hhcnMoYXJyYXkpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZpbmcgcGFydCBvZiB0aGUgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgbW92ZV9kYXRlKHN0cjogc3RyaW5nW10sIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiB2b2lkO1xyXG4gIHByaXZhdGUgbW92ZV9kYXRlKHN0cjogc3RyaW5nLCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogdm9pZDtcclxuICBwcml2YXRlIG1vdmVfZGF0ZShzdHI6IGFueSwgcG9zOiBudW1iZXIsIG1vdmVieTogbnVtYmVyLCBsZW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgKHN0ciA9PT0gbnVsbCB8fCBzdHIgaW5zdGFuY2VvZiBBcnJheSkgJiYgKHBvcyA9PT0gbnVsbCB8fCBwb3MuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKG1vdmVieSA9PT0gbnVsbCB8fCBtb3ZlYnkuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKGxlbiA9PT0gbnVsbCB8fCBsZW4uY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgdGhpcy5tb3ZlX2RhdGVfMChzdHIsIHBvcywgbW92ZWJ5LCBsZW4pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vdmVfZGF0ZV8xKHN0ciwgcG9zLCBtb3ZlYnksIGxlbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbW92aW5nIHBhcnQgb2YgdGhlIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG1vdmVfZGF0ZV8wKHN0cjogc3RyaW5nW10sIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1tb3ZlKHN0ciwgcG9zICsgbW92ZWJ5LCBzdHIsIHBvcywgbGVuIC0gKHBvcyArIG1vdmVieSkgKyAxKTtcclxuICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoc3RyLCBwb3MsICcwJywgLyonMCcqL21vdmVieSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlIGEgbW9udGggbmFtZSAtPiBtb250aCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJpbmdcIj50byBldmFsdWF0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljdHVyZVwiPm1hc2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBvc1wiPmN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmluZyB0aGUgaW50UmVmIG5vdCBleGFjdGx5IHRoZSBzYW1lIHJlZmVyZW5jZSB0byBpbnRlZ2VyICwgbGlrZSBpbiBDKyssXHJcbiAgLy8vICAgc28gdGhlIGdsb2JhbCBwb3MgTVVTVCBiZSB1cGRhdGVkIGJ5IHRoZSBwb3MudmFsdWUgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHJldHVybnMuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBkYXRlX01NTV8yX20oc3RyOiBzdHJpbmdbXSwgbWFzazogc3RyaW5nW10sIHBvczogSW50UmVmLCBsZW46IG51bWJlciwgaXNIZWJyZXc6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IGw6IG51bWJlcjtcclxuXHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgIGxldCBtYXNrUG9zOiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUuY29udlBvcyhOU3RyaW5nLkZyb21DaGFycyhzdHIpLCBOU3RyaW5nLkZyb21DaGFycyhtYXNrKSwgcG9zLnZhbCwgZmFsc2UpO1xyXG4gICAgICBsID0gdGhpcy5kYXRlX21za19jbnQobWFzaywgbWFza1BvcywgPG51bWJlcj4obGVuIC0gbWFza1BvcykpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGwgPSB0aGlzLmRhdGVfbXNrX2NudChtYXNrLCBwb3MudmFsLCA8bnVtYmVyPihsZW4gLSBwb3MudmFsKSk7XHJcbiAgICB9XHJcbiAgICBsZXQgc3RyUG9zOiBudW1iZXIgPSBwb3MudmFsO1xyXG4gICAgcG9zLnZhbCA9IHBvcy52YWwgKyBsO1xyXG4gICAgbGVuID0gTWVtb3J5VXRpbC5tZW1fdHJpbShzdHIsIHN0clBvcywgbCk7XHJcblxyXG4gICAgaWYgKGxlbiA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgc3RyQjogc3RyaW5nID0gTlN0cmluZy5Gcm9tQ2hhcnMoc3RyLCBzdHJQb3MsIGxlbik7XHJcbiAgICAgIGxldCBtb250aE5hbWVzOiBzdHJpbmdbXTtcclxuICAgICAgaWYgKGlzSGVicmV3KSB7XHJcbiAgICAgICAgbW9udGhOYW1lcyA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgbW9udGhzOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuTU9OVEhTX1BUUik7XHJcbiAgICAgICAgbW9udGhOYW1lcyA9IERhdGVVdGlsLmdldExvY2FsTW9udGhzKG1vbnRocyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBtb250aE5hbWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKE5TdHJpbmcuQ29tcGFyZShtb250aE5hbWVzW2ldLnN1YnN0cigwLCBsZW4pLCBzdHJCLCB0cnVlKSA9PT0gMClcclxuICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGN1cnJldCBkYXllIHNlcGVyYXRlZCB0byB5ZWFyLCBtb250aCwgZGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBkYXRlX3N5cygpOiBEYXRlQnJlYWtQYXJhbXMge1xyXG4gICAgbGV0IGRhdGU6IERhdGVCcmVha1BhcmFtcyA9IG5ldyBEYXRlQnJlYWtQYXJhbXMoKTtcclxuICAgIGxldCBDdXJyRGF0ZTogRGF0ZVRpbWUgPSBEYXRlVGltZS5Ob3c7XHJcblxyXG4gICAgZGF0ZS55ZWFyID0gQ3VyckRhdGUuWWVhcjtcclxuICAgIGRhdGUubW9udGggPSBDdXJyRGF0ZS5Nb250aDtcclxuICAgIGRhdGUuZGF5ID0gQ3VyckRhdGUuRGF5O1xyXG5cclxuICAgIHJldHVybiBkYXRlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRvIGdldCBjdXJyZW50IGRhdGUgaW4gbWFnaWMgcmVwcmVzZW50YXRpb24gUXVlcnkgTWFnaWMncyBEYXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSAnTWFnaWMnIGN1cnJlbnQgZGF0ZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZGF0ZV9tYWdpYyh1dGNEYXRlOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBkYXRlVGltZTogRGF0ZVRpbWU7XHJcbiAgICBpZiAodXRjRGF0ZSkge1xyXG4gICAgICBkYXRlVGltZSA9IERhdGVUaW1lLlV0Y05vdztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkYXRlVGltZSA9IERhdGVUaW1lLk5vdztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gZGF0ZVRpbWUuWWVhcjtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gZGF0ZVRpbWUuTW9udGg7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSBkYXRlVGltZS5EYXk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZV80X2NhbGVuZGVyKHllYXIsIG1vbnRoLCBkYXksIDEsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0byBnZXQgIHRoZSBzeXN0ZW0gdGltZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgJ01hZ2ljJyBjdXJyZW50IHRpbWVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRpbWVfbWFnaWModXRjVGltZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gRGF0ZVRpbWUuR2V0VG90YWxTZWNvbmRzRnJvbU1pZG5pZ2h0KHV0Y1RpbWUsIG5ldyBEYXRlKCkpO1xyXG4gIH1cclxuXHJcbiAgbXRpbWVfbWFnaWModXRjVGltZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gRGF0ZVRpbWUuR2V0VG90YWxNaWxsaVNlY29uZHNGcm9tTWlkbmlnaHQodXRjVGltZSwgbmV3IERhdGUoKSkgO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbXB1dGUgTUFHSUMgZGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZGF0ZV80X2NhbGVuZGVyKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIsIGRveTogbnVtYmVyLCB1c2Vkb3k6IGJvb2xlYW4pOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBMZWFwWWVhcjogYm9vbGVhbiA9IHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO1xyXG5cclxuICAgIC8vIDMuMTEuOTcgLSBIZW4gKEZpeGVkIGJ1ZyAjNzY0MjY1IGFuZCAjODE4NikgOlxyXG4gICAgLy8gSWYgdGhlIGRhdGUgaXMgMCB0aGVuIHJldHVybiAwTCAoemVybyB2YWx1ZSBpcyB2YWxpZCksIGVsc2UgaWYgdGhlIGRhdGVcclxuICAgIC8vIGlzIGlsbGVnYWwgdGhlbiByZXR1cm4gMTAwMDAwMDAwMEwgKHdyb25nIGRhdGUpLlxyXG4gICAgaWYgKHVzZWRveSkge1xyXG4gICAgICBpZiAoZG95ID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRveSA+IDM2NiB8fCAoIUxlYXBZZWFyICYmIGRveSA+IDM2NSkpIHtcclxuICAgICAgICByZXR1cm4gKDEwMDAwMDAwMDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGRheSA9PT0gMCAmJiBtb250aCA9PT0gMCAmJiB5ZWFyID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRheSA9PT0gMCB8fCBtb250aCA9PT0gMCB8fCB5ZWFyID09PSAwIHx8IG1vbnRoID4gMTIpIHtcclxuICAgICAgICByZXR1cm4gMTAwMDAwMDAwMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgeWVhciA9IHllYXIgLSAxO1xyXG4gICAgbGV0IG51bTogbnVtYmVyID0gTWF0aC5mbG9vcih5ZWFyIC8gNDAwKTtcclxuICAgIHllYXIgPSB5ZWFyIC0gbnVtICogNDAwO1xyXG4gICAgbGV0IG51bTI6IG51bWJlciA9IE1hdGguZmxvb3IoeWVhciAvIDEwMCk7XHJcbiAgICB5ZWFyID0geWVhciAtIG51bTIgKiAxMDA7XHJcbiAgICBsZXQgbnVtMzogbnVtYmVyID0gTWF0aC5mbG9vcih5ZWFyIC8gNCk7XHJcbiAgICB5ZWFyID0geWVhciAtIG51bTMgKiA0O1xyXG5cclxuICAgIGlmICghdXNlZG95KSB7XHJcbiAgICAgIGxldCBudW00OiBudW1iZXIgPSBQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW21vbnRoIC0gMV07XHJcbiAgICAgIGxldCBudW01OiBudW1iZXIgPSBQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW21vbnRoXTtcclxuXHJcbiAgICAgIGlmIChMZWFwWWVhcikge1xyXG4gICAgICAgIGlmIChtb250aCA+IDEpIHtcclxuICAgICAgICAgIG51bTUgPSBudW01ICsgMTtcclxuICAgICAgICAgIGlmIChtb250aCA+IDIpIHtcclxuICAgICAgICAgICAgbnVtNCA9IG51bTQgKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRheSA+IG51bTUgLSBudW00KSB7XHJcbiAgICAgICAgcmV0dXJuIDEwMDAwMDAwMDA7XHJcbiAgICAgIH1cclxuICAgICAgZG95ID0gbnVtNCArIGRheTtcclxuICAgIH1cclxuICAgIHJldHVybiBudW0gKiAxNDYwOTcgKyBudW0yICogMzY1MjQgKyBudW0zICogMTQ2MSArIHllYXIgKiAzNjUgKyBkb3k7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlcyBhIHN0cmluZyB0aW1lIHRvIG1hZ2ljIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsdWVcIj4gICBBIHN0cmluZyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgICBUaGUgcGljdHVyZSB0byB1c2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIG1hZ2ljIG51bWJlcjwvcmV0dXJucz5cclxuICBmcm9tTmF0aXZlVGltZVRvTWdUaW1lKGRpc3BWYWx1ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSB0aGlzLmZyb21OYXRpdmVUaW1lVG9NZ1RpbWVOdW1iZXIoZGlzcFZhbHVlKTtcclxuICAgIG1nTnVtLk5VTV80X0xPTkcobnVtVmFsKTtcclxuICAgIHJldHVybiBtZ051bS50b1hNTHJlY29yZCgpO1xyXG4gIH1cclxuXHJcbiAgZnJvbU5hdGl2ZVRpbWVUb01nVGltZU51bWJlcihkaXNwVmFsdWU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgbGV0IG51bVZhbDogbnVtYmVyID0gdGhpcy50aW1lXzJfaW50KGRpc3BWYWx1ZS5nZXRIb3VycygpLCBkaXNwVmFsdWUuZ2V0TWludXRlcygpLCBkaXNwVmFsdWUuZ2V0U2Vjb25kcygpKTtcclxuICAgIHJldHVybiBudW1WYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBBbHBoYSBpbnRvIGEgVGltZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhXzJfdGltZShBc2NpaTogc3RyaW5nLCBwaWM6IFBJQywgbWlsbGlTZWNvbmRzOiBib29sZWFuKTogbnVtYmVyO1xyXG4gIGFfMl90aW1lKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCBtYXNrOiBzdHJpbmdbXSwgbWlsbGlTZWNvbmRzOiBib29sZWFuKTogbnVtYmVyO1xyXG4gIGFfMl90aW1lKEFzY2lpOiBhbnksIHBpY09yQXNjaWlMOiBhbnksIG1pbGxpU2Vjb25kc09yTWFzazogYW55LCBtaWxsaVNlY29uZHM/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKVxyXG4gICAgICByZXR1cm4gdGhpcy5hXzJfdGltZV8wKEFzY2lpLCBwaWNPckFzY2lpTCwgbWlsbGlTZWNvbmRzT3JNYXNrKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5hXzJfdGltZV8xKEFzY2lpLCBwaWNPckFzY2lpTCwgbWlsbGlTZWNvbmRzT3JNYXNrLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgQWxwaGEgaW50byBhIFRpbWUgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhXzJfdGltZV8wKEFzY2lpOiBzdHJpbmcsIHBpYzogUElDLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuYV8yX3RpbWUoQXNjaWksIEFzY2lpLmxlbmd0aCwgTlN0cmluZy5Ub0NoYXJBcnJheShwaWMuZ2V0TWFzaygpKSwgbWlsbGlTZWNvbmRzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IEFscGhhIGludG8gYSBUaW1lIGFjY29yZGluZyB0byBhIGdpdmVuIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYV8yX3RpbWVfMShBc2NpaTogc3RyaW5nLCBBc2NpaUw6IG51bWJlciwgbWFzazogc3RyaW5nW10sIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgSTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsZW46IG51bWJlciA9IG1hc2subGVuZ3RoOyAvLyBMZW5ndGggb2YgbWFzayBvciBzdHJpbmcgdG8gc2NhblxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgY291bnRlcnMgYW5kIGZsYWdzXHJcbiAgICBpZiAobGVuID4gQXNjaWlMKSB7XHJcbiAgICAgIGxlbiA9IEFzY2lpTDtcclxuICAgIH1cclxuICAgIGxldCBhbXBtOiBudW1iZXIgPSAwOyAvLyBBTS9QTSBpbmRpY2F0b3JcclxuICAgIGxldCBob3VyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IG1pbnV0ZTogbnVtYmVyID0gMDtcclxuICAgIGxldCBzZWNvbmQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWlsbGlzZWNvbmQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgd2hpbGUgKEkgPCBsZW4pIHtcclxuICAgICAgbGV0IG1hc2tMZW5ndGg6IG51bWJlcjtcclxuICAgICAgbGV0IG1heE1hc2tMZW46IG51bWJlcjtcclxuXHJcbiAgICAgIC8vIFRvIGdldCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGggb2YgdGhlIGNvbnN0YW50cyBpbiB0aGUgbWFza1xyXG4gICAgICBzd2l0Y2ggKG1hc2tbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTU1UKTpcclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKTpcclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1BNKTpcclxuICAgICAgICAgIG1heE1hc2tMZW4gPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTVMpOlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIG1heE1hc2tMZW4gPSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIFRvIGdldCB0aGUgbWluaW11bSBvZiBtYXhNYXNrTGVuICYgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluZWQgaW4gc3RyaW5nXHJcbiAgICAgIGJlY2F1c2UgaWYgdGhlIEFzY2lpIGlzIHNob3J0ZXIoaGFzIGxlc3MgY2hhcmFjdGVycyl0aGVuIGNyZWF0ZSBTdHJpbmcgb25seVxyXG4gICAgICBvZiB0aGF0IG5vLiBvZiBjaGFyYWN0ZXJzIChtYXNrTGVuZ3RoKSwgbm90IG9mIG1heE1hc2tMZW5ndGggKi9cclxuICAgICAgbWFza0xlbmd0aCA9IE1hdGgubWluKG1heE1hc2tMZW4sIGxlbiAtIEkpO1xyXG5cclxuICAgICAgc3dpdGNoIChtYXNrW0ldLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0hIKToge1xyXG4gICAgICAgICAgaG91ciA9IG1nTnVtLmFfMl9sb25nKEFzY2lpLnN1YnN0cihJLCBtYXNrTGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTU1UKToge1xyXG4gICAgICAgICAgbWludXRlID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19TUyk6IHtcclxuICAgICAgICAgIHNlY29uZCA9IG1nTnVtLmFfMl9sb25nKEFzY2lpLnN1YnN0cihJLCBtYXNrTGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTVMpOiB7XHJcbiAgICAgICAgICBtaWxsaXNlY29uZCA9IG1nTnVtLmFfMl9sb25nKEFzY2lpLnN1YnN0cihJLCBtYXNrTGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfUE0pOlxyXG4gICAgICAgICAgYW1wbSA9IDA7XHJcbiAgICAgICAgICBsZXQgYzA6IHN0cmluZyA9IEFzY2lpW0ldO1xyXG4gICAgICAgICAgbGV0IGMxOiBzdHJpbmc7XHJcbiAgICAgICAgICBjMCA9IGMwLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAoSSArIDEgPCBsZW4pIHtcclxuICAgICAgICAgICAgYzEgPSBBc2NpaVtJICsgMV07XHJcbiAgICAgICAgICAgIGMxID0gYzEudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjMSA9PT0gJ00nKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGMwID09PSAnQScpXHJcbiAgICAgICAgICAgICAgICBhbXBtID0gLTE7XHJcbiAgICAgICAgICAgICAgaWYgKGMwID09PSAnUCcpXHJcbiAgICAgICAgICAgICAgICBhbXBtID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBJICs9IG1hc2tMZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgdmFsaWRpdHkgb2YgbWludXRlcyBhbmQgc2Vjb25kc1xyXG4gICAgaWYgKHNlY29uZCA+IDU5IHx8IG1pbnV0ZSA+IDU5KVxyXG4gICAgICByZXR1cm4gKDApO1xyXG5cclxuICAgIC8vIENvbnZlcnQgaG91ciB0byBQTSBpZiBzcGVjaWZpZWQgYXMgQU1cclxuICAgIGlmIChhbXBtICE9PSAwKVxyXG4gICAgICBpZiAoYW1wbSA9PT0gLTEpXHJcbiAgICAgIC8vIEFNXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaG91ciA9PT0gMTIpXHJcbiAgICAgICAgICBob3VyID0gMDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChob3VyIDwgMTIpXHJcbiAgICAgIC8vIFBNXHJcbiAgICAgICAgaG91ciArPSAxMjtcclxuICAgIGlmIChtaWxsaVNlY29uZHMpXHJcbiAgICAgIHJldHVybiB0aGlzLnRpbWVfMl9pbnQoaG91ciwgbWludXRlLCBzZWNvbmQpICogMTAwMCArIG1pbGxpc2Vjb25kO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy50aW1lXzJfaW50KGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTtcclxuICB9XHJcblxyXG4gIHRpbWVfMl9pbnQoaG91cjogbnVtYmVyLCBtaW51dGU6IG51bWJlciwgc2Vjb25kOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGhvdXIgKiAzNjAwICsgbWludXRlICogNjAgKyBzZWNvbmQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBcIjBcIi9cIjFcIiB0byBmYWxzZS90cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJvb2xTdHJcIj4gIFwiMFwiL1wiMVwiXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIFwiMVwiIG9yIGZhbHNlIGlmIG90aGVyc1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIHRvQm9vbGVhbihib29sU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBib29sU3RyICE9PSBudWxsICYmIGJvb2xTdHIgPT09IFwiMVwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFN0cmluZyB0byBEYXRlIGZ1bmN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhXzJfZGF0ZShzdHI6IHN0cmluZywgRm9ybWF0OiBzdHJpbmcsIGNvbXBJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfZGF0ZV9kYXRlbW9kZShzdHIsIEZvcm1hdCwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICBhXzJfZGF0ZV9waWMoc3RyOiBzdHJpbmcsIHBpYzogUElDLCBtYXNrOiBzdHJpbmcsIGNvbXBJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoc3RyID09PSBudWxsKSB7XHJcbiAgICAgIHN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfZGF0ZV9waWNfZGF0ZW1vZGUoTlN0cmluZy5Ub0NoYXJBcnJheShzdHIpLCBzdHIubGVuZ3RoLCBwaWMsIE5TdHJpbmcuVG9DaGFyQXJyYXkobWFzayksIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgdG9fYShvdXRWYWw6IHN0cmluZywgb3V0X2xlbjogbnVtYmVyLCBkYXRlOiBudW1iZXIsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudG9fYV9kYXRlbW9kZShvdXRWYWwsIG91dF9sZW4sIGRhdGUsIEZvcm1hdCwgZmFsc2UsIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgc3RyaW5nIC0+IGRhdGUgdXNpbmcgYSBmb3JtYXQgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFfMl9kYXRlX2RhdGVtb2RlKHN0cjogc3RyaW5nLCBGb3JtYXQ6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBwSUM6IFBJQyA9IG5ldyBQSUMoRm9ybWF0LCBTdG9yYWdlQXR0cmlidXRlLkRBVEUsIGNvbXBJZHgpO1xyXG4gICAgaWYgKHN0ciA9PT0gbnVsbCkge1xyXG4gICAgICBzdHIgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuYV8yX2RhdGVfcGljX2RhdGVtb2RlKE5TdHJpbmcuVG9DaGFyQXJyYXkoc3RyKSwgc3RyLmxlbmd0aCwgcElDLCBOU3RyaW5nLlRvQ2hhckFycmF5KHBJQy5nZXRNYXNrKCkpLCBjb21wSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTdHJpbmcgdG8gYSBkYXRlbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSB0b19hX2RhdGVtb2RlKG91dFZhbDogc3RyaW5nLCBvdXRfbGVuOiBudW1iZXIsIGRhdGU6IG51bWJlciwgRm9ybWF0OiBzdHJpbmcsIGlnbm9yZV9kdF9mbXQ6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcblxyXG4gICAgLy8gUGFyc2UgdGhlIHBpY3R1cmVcclxuICAgIGxldCBwaWM6IFBJQyA9IG5ldyBQSUMoRm9ybWF0LCBTdG9yYWdlQXR0cmlidXRlLkRBVEUsIGNvbXBJZHgpO1xyXG5cclxuICAgIC8vIENvbnZlcnQgdGhlICBkYXRlIC0+IHN0cmluZ1xyXG4gICAgaWYgKG91dFZhbCA9PT0gbnVsbCkge1xyXG4gICAgICBvdXRWYWwgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudG9fYV9waWNfZGF0ZW1vZGUob3V0VmFsLCBvdXRfbGVuLCBkYXRlLCBwaWMsIHRydWUsIGlnbm9yZV9kdF9mbXQsIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIERlY29kZSBkaWdpdHMgZnJvbSBhIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGRhdGVfYV8yX2lfMShzOiBzdHJpbmcsIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlcik6IG51bWJlciB7XHJcblxyXG4gICAgLy8gZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGUgJ3Bvcys9bGVuJyBhZnRlciB0aGUgdXNpbmcgb2YgdGhlIGZ1bmN0aW9uXHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgc3RyOiBzdHJpbmc7XHJcblxyXG4gICAgc3RyID0gcy5zdWJzdHIocG9zLCBsZW4pO1xyXG4gICAgcmV0dXJuIG1nTnVtLmFfMl9sb25nKHN0cik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1vdmVfZGF0ZV8xKHN0cjogc3RyaW5nLCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHN0ciA9IFN0clV0aWwubWVtbW92ZShzdHIsIHBvcyArIG1vdmVieSwgc3RyLCBwb3MsIGxlbiAtIHBvcyk7XHJcblxyXG4gICAgc3RyID0gU3RyVXRpbC5tZW1zZXQoc3RyLCBwb3MsICcwJywgbW92ZWJ5KTtcclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICB0aW1lXzJfYShBc2NpaTogc3RyaW5nLCBBc2NpaUw6IG51bWJlciwgdGltZTogbnVtYmVyLCBGb3JtYXQ6IHN0cmluZywgY29tcElkeDogbnVtYmVyLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG5cclxuICAgIGlmIChTdHJVdGlsLnJ0cmltKEZvcm1hdCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIEZvcm1hdCA9IFwiSEg6TU06U1NcIjtcclxuICAgIH1cclxuICAgIGxldCBwaWM6IFBJQyA9IG5ldyBQSUMoRm9ybWF0LCBTdG9yYWdlQXR0cmlidXRlLlRJTUUsIGNvbXBJZHgpO1xyXG4gICAgaWYgKEFzY2lpID09PSBudWxsKSB7XHJcbiAgICAgIEFzY2lpID0gcGljLmdldE1hc2soKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRpbWVfMl9hX3BpYyhBc2NpaSwgQXNjaWlMLCB0aW1lLCBwaWMsIGZhbHNlLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZXMgYSBzdHJpbmcgdG8gbWFnaWMgbG9naWNhbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsdWVcIj4gICBBIHN0cmluZyB2YWx1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgICAgVGhlIHBpY3R1cmUgdG8gdXNlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiAgICBUaGUgcmFuZ2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsb2dpY2FsIHZhbHVlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICB0b0xvZ2ljYWwoZGlzcFZhbHVlOiBzdHJpbmcsIHBpYzogUElDLCByYW5nZVN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGRpc3BWYWx1ZSA9IGRpc3BWYWx1ZS50cmltKCk7XHJcbiAgICBpZiAoZGlzcFZhbHVlID09PSBudWxsIHx8IGRpc3BWYWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgZGlzcFZhbHVlID0gXCJGYWxzZVwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGlzcF8yX2xvZ2ljYWwoZGlzcFZhbHVlLCBwaWMuZ2V0TWFzaygpLCByYW5nZVN0cik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIHRoZSBkaXNwbGF5ZWQgdmFsdWUgdG8gYSBtYWdpYyBsb2dpY2FsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPnRoZSBkaXNwbGF5ZWQgdmFsdWUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1hc2tcIj50aGUgbWFzayBvZiB0aGUgZGlzcGxheWVkIHZhbHVlIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPnRoZSByYW5nZSBzdHJpbmcgPC9wYXJhbT5cclxuICBwcml2YXRlIGRpc3BfMl9sb2dpY2FsKGRpc3BWYWx1ZTogc3RyaW5nLCBtYXNrOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBzdHJpcHBlZFZhbHVlOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoZGlzcFZhbHVlLmxlbmd0aCk7XHJcblxyXG4gICAgcmFuZ2VTdHIgPSB0aGlzLndpbl9ybmdfYm9vbChyYW5nZVN0cik7XHJcbiAgICByYW5nZVN0ciA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2VucyhyYW5nZVN0ciwgU0VRXzJfSFRNTCk7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gcmFuZ2VTdHIuaW5kZXhPZignLCcpO1xyXG4gICAgbGV0IHRydWVTdHI6IHN0cmluZyA9IHJhbmdlU3RyLnN1YnN0cigwLCBpKTtcclxuICAgIHRydWVTdHIgPSBTdHJVdGlsLm1ha2VQcmludGFibGVUb2tlbnModHJ1ZVN0ciwgSFRNTF8yX1NUUik7XHJcbiAgICBpID0gMDtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgZGlzcFZhbHVlLmxlbmd0aCAmJiBpIDwgbWFzay5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAobWFzay5jaGFyQ29kZUF0KGkpID09PSBQSUNJbnRlcmZhY2UuUElDX1gpIHtcclxuICAgICAgICBzdHJpcHBlZFZhbHVlLkFwcGVuZChkaXNwVmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHZhbDogc3RyaW5nID0gc3RyaXBwZWRWYWx1ZS5Ub1N0cmluZygpO1xyXG4gICAgaWYgKHRydWVTdHIubGVuZ3RoIDwgdmFsLmxlbmd0aCkge1xyXG4gICAgICB2YWwgPSB2YWwuc3Vic3RyKDAsIHRydWVTdHIubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodmFsLmxlbmd0aCA8IHRydWVTdHIubGVuZ3RoKSB7XHJcbiAgICAgICAgdHJ1ZVN0ciA9IHRydWVTdHIuc3Vic3RyKDAsIHZhbC5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHZhbC50b1VwcGVyQ2FzZSgpID09PSB0cnVlU3RyLnRvVXBwZXJDYXNlKCkpID8gXCIxXCIgOiBcIjBcIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb252ZXJ0aW5nIHRoZSBkaXNwbGF5ZWQgdmFsdWUgb2YgYSBzdHJpbmcgdG8gaW50ZXJuYWxcclxuICAvLy8gICByZXByZXNlbnRhdGlvbiBtdXN0IHJlbW92ZSB0aGUgbWFza2luZyBjaGFyYWN0ZXJzIGZyb20gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgdG9BbHBoYShkaXNwVmFsdWU6IHN0cmluZywgcGljOiBQSUMpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBwaWN0dXJlOiBzdHJpbmcgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHBpYy5nZXRNYXNrU2l6ZSgpKTtcclxuICAgIGxldCBJc0FscGhhREJDUzogYm9vbGVhbiA9IFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgcGljLmlzQXR0ckFscGhhKCk7XHJcbiAgICBsZXQgY3VyclBpY3R1cmU6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXIgPSBjdXJyUGljdHVyZSA9IDA7XHJcblxyXG4gICAgZm9yIChjdXJyUGljdHVyZSA9IGkgPSAwOyBpIDwgZGlzcFZhbHVlLmxlbmd0aCAmJiBjdXJyUGljdHVyZSA8IHBpY3R1cmUubGVuZ3RoOyBpKyssIGN1cnJQaWN0dXJlKyspIHtcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUocGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSkge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoZGlzcFZhbHVlLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgIGlmIChJc0FscGhhREJDUykge1xyXG4gICAgICAgICAgLy8gYSBEQkNTIGNoYXJhY3RlciBpbiBcImRpc3BWYWx1ZVwiIGNvbnN1bWVzIHR3byBjaGFyYWN0ZXJzIGluIFwicGljdHVyZVwiXHJcbiAgICAgICAgICBsZXQgc3RyRHNwVmFsT25lQ2hhcjogc3RyaW5nID0gZGlzcFZhbHVlLnN1YnN0cihpLCAxKTtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJEc3BWYWxPbmVDaGFyKSA9PT0gMikge1xyXG4gICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIGNoYXIgQWxwaGEgUG9zaXRpb25hbCBEaXJlY3RpdmU8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1ggfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfVSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19MIHx8XHJcbiAgICAgIGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX04gfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19HIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1MgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfVCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbXBhcmF0aXZlIG5ld1ZhbHVlIHdpdGggcG9zc2libGUgUmFuZ2UgaW4gQ29udGludW91c1JhbmdlVmFsdWVzL2Rpc2NyZXRlUmFuZ2VWYWx1ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3VmFsdWUgaWYgaXQgcG9zc2libGUsIG9sZCB2YWx1ZSBvd2VydmlzZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmaWxsQWxwaGFCeVJhbmdlKENvbnRpbnVvdXNSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBkaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIG5ld1ZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB0bXBCdWZmZXI6IHN0cmluZyA9IHRoaXMuZmlsbEFscGhhQnlEaXNjcmV0ZVJhbmdlVmFsdWVzKGRpc2NyZXRlUmFuZ2VWYWx1ZXMsIG5ld1ZhbHVlKTtcclxuICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0bXBCdWZmZXIgPSB0aGlzLmZpbGxBbHBoYUJ5Q29udGludW91c1JhbmdlVmFsdWVzKENvbnRpbnVvdXNSYW5nZVZhbHVlcywgbmV3VmFsdWUpO1xyXG4gICAgICBpZiAodG1wQnVmZmVyICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoZGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdG1wQnVmZmVyID0gdGhpcy5jb21wbGV0ZUFscGhhQnlSYW5nZShkaXNjcmV0ZVJhbmdlVmFsdWVzLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICBpZiAodG1wQnVmZmVyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0bXBCdWZmZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB1bnBvc3NpYmxlIHRvIGZpbmQgaXQgaW4gdGhlIHJhbmdlIHJldHVybiBub3QgY2hhbmdlZCBvbGR2YWx1ZVxyXG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbGwgQWxwaGEgc3RyaW5nIGJ5IGRpc2NyZXRlIHJhbmdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc2NyZXRlUmFuZ2VWYWx1ZXNcIj52ZWN0b3Igb2YgZGlzY3JldGUgcmFuZ2UgdmFsdWVzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnZhbHVlLCB0cnkgZm91bmQgaW4gdGhlIHZlY3RvciBvZiBkaXNjcmV0ZSByYW5nZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGZvdW5kIHZhbHVlIG9yIG51bGwobm90IGZvdW5kKVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZmlsbEFscGhhQnlEaXNjcmV0ZVJhbmdlVmFsdWVzKGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKGRpc2NyZXRlUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRpc2NyZXRlUmFuZ2VWYWx1ZXMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgZGlzY3JldGVWYWx1ZTogc3RyaW5nID0gZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgdHJ1bmNhdGVkVmFsdWU6IHN0cmluZyA9IGRpc2NyZXRlVmFsdWUuc3Vic3RyKDAsIE1hdGgubWluKG5ld1ZhbHVlLmxlbmd0aCwgZGlzY3JldGVWYWx1ZS5sZW5ndGgpKTtcclxuICAgICAgICBpZiAobmV3VmFsdWUudG9VcHBlckNhc2UoKSA9PT0gdHJ1bmNhdGVkVmFsdWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGRpc2NyZXRlVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaWxsIEFscGhhIHN0cmluZyBieSBjb250aW51b3VzIHJhbmdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkNvbnRpbnVvdXNSYW5nZVZhbHVlc1wiPnZlY3RvciBvZiBjb250aW51b3VzIHJhbmdlIHZhbHVlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj52YWx1ZSwgdHJ5IGZvdW5kIGluIHRoZSB2ZWN0b3Igb2YgY29udGludW91cyByYW5nZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGZvdW5kIHZhbHVlIG9yIG51bGwobm90IGZvdW5kKVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZmlsbEFscGhhQnlDb250aW51b3VzUmFuZ2VWYWx1ZXMoQ29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIG5ld1ZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbmV3VmFsdWUgPSBTdHJVdGlsLnJ0cmltKG5ld1ZhbHVlKTtcclxuXHJcblxyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZVZhbHVlcyAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQ29udGludW91c1JhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGZyb206IHN0cmluZyA9IENvbnRpbnVvdXNSYW5nZVZhbHVlcy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgdG86IHN0cmluZyA9IENvbnRpbnVvdXNSYW5nZVZhbHVlcy5nZXRfSXRlbShpID0gaSArIDEpO1xyXG4gICAgICAgIGlmIChOU3RyaW5nLkNvbXBhcmVPcmRpbmFsKG5ld1ZhbHVlLCBmcm9tKSA+PSAwICYmIE5TdHJpbmcuQ29tcGFyZU9yZGluYWwobmV3VmFsdWUsIHRvKSA8PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJ5IHRvIGNvbXBsZXRlIHRoZSBuZXdWYWx1ZSB1c2luZyB0aGUgUmFuZ2VcclxuICAvLy8gICBmaXJzdCB0cnkgdG8gY29tbGV0ZSB0aGUgdmFsdWUgZm9yIGNhc2UgbWVhbmluZyBhbmQgYWZ0ZXIgdGhhdCBmb3IgaWdub3JlIGNhc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmVjdG9yXCI+b2YgcmFuZ2VzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja2VkXCI+dmFsdWVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHZhbHVlIGNvbXBsZXRlZCBieSByYW5nZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgY29tcGxldGVBbHBoYUJ5UmFuZ2UoZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWF4Q29pbmNpZGU6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oMik7XHJcbiAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IG1heENvaW5jaWRlLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIG1heENvaW5jaWRlW19haV0gPSAwO1xyXG5cclxuICAgIGxldCBiZXN0SXRlbTogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigyKTtcclxuICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgYmVzdEl0ZW0ubGVuZ3RoOyArK19haSlcclxuICAgICAgYmVzdEl0ZW1bX2FpXSA9IG51bGw7XHJcblxyXG4gICAgbGV0IENIRUNLX0NBU0U6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgSUdOT1JFX0NBU0U6IG51bWJlciA9IDE7XHJcblxyXG4gICAgbGV0IGNhc2VMZXR0ZXJzOiBudW1iZXIgPSBDSEVDS19DQVNFO1xyXG5cclxuICAgIHdoaWxlIChjYXNlTGV0dGVycyA9PT0gQ0hFQ0tfQ0FTRSB8fCBjYXNlTGV0dGVycyA9PT0gSUdOT1JFX0NBU0UpIHtcclxuICAgICAgbGV0IGxvd2VyVmFsdWU6IHN0cmluZztcclxuICAgICAgaWYgKGNhc2VMZXR0ZXJzID09PSBDSEVDS19DQVNFKSB7XHJcbiAgICAgICAgbG93ZXJWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxvd2VyVmFsdWUgPSBuZXdWYWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGxvd2VyVmFsdWUgPSBTdHJVdGlsLnJ0cmltKGxvd2VyVmFsdWUpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGlzY3JldGVSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCB3cm9uZ0xldHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBjdXJyQ29pbmNpZGU6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IHJhbmdlSXRlbTogc3RyaW5nO1xyXG4gICAgICAgIGlmIChjYXNlTGV0dGVycyA9PT0gQ0hFQ0tfQ0FTRSkge1xyXG4gICAgICAgICAgcmFuZ2VJdGVtID0gZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByYW5nZUl0ZW0gPSBkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsb3dMZW5ndGg6IG51bWJlciA9IGxvd2VyVmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGxldCByYW5nZUxlbmd0aDogbnVtYmVyID0gcmFuZ2VJdGVtLmxlbmd0aDtcclxuICAgICAgICBpZiAobG93TGVuZ3RoIDwgcmFuZ2VMZW5ndGgpIHtcclxuICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBsb3dMZW5ndGg7IGogPSBqICsgMSkge1xyXG4gICAgICAgICAgICBpZiAoIShsb3dlclZhbHVlLmNoYXJBdChqKSA9PT0gcmFuZ2VJdGVtLmNoYXJBdChqKSkpIHtcclxuICAgICAgICAgICAgICB3cm9uZ0xldHRlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VyckNvaW5jaWRlID0gY3VyckNvaW5jaWRlICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB3cm9uZ0xldHRlciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3VyckNvaW5jaWRlID4gbWF4Q29pbmNpZGVbY2FzZUxldHRlcnNdICYmICF3cm9uZ0xldHRlcikge1xyXG4gICAgICAgICAgYmVzdEl0ZW1bY2FzZUxldHRlcnNdID0gZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKTtcclxuICAgICAgICAgIG1heENvaW5jaWRlW2Nhc2VMZXR0ZXJzXSA9IGN1cnJDb2luY2lkZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2FzZUxldHRlcnMgPSBjYXNlTGV0dGVycyArIDE7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmIChiZXN0SXRlbVtDSEVDS19DQVNFXSAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGJlc3RJdGVtW0NIRUNLX0NBU0VdO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChiZXN0SXRlbVtJR05PUkVfQ0FTRV0gIT09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGJlc3RJdGVtW0lHTk9SRV9DQVNFXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHNldERhdGVDaGFyKGRhdGVDaGFyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuREFURUNIQVIgPSBkYXRlQ2hhcjtcclxuICB9XHJcblxyXG4gIGdldERhdGVDaGFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5EQVRFQ0hBUjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdG9yYWdlQXR0cmlidXRlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTdHJpbmdWYWx1ZVRvTWdWYWx1ZSh2YWx1ZTogc3RyaW5nLCBzdG9yYWdlQXR0cmlidXRlOiBTdG9yYWdlQXR0cmlidXRlLCBmaWxsZXI6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpOiBhbnkge1xyXG4gICAgc3dpdGNoIChzdG9yYWdlQXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6IHtcclxuICAgICAgICBsZXQgbmV3VmFsOiBzdHJpbmcgPSB2YWx1ZTtcclxuICAgICAgICBuZXdWYWwgPSBOU3RyaW5nLlBhZFJpZ2h0KG5ld1ZhbCwgbGVuZ3RoLCBmaWxsZXIpO1xyXG4gICAgICAgIHJldHVybiBuZXdWYWw7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICByZXR1cm4gbmV3IE5VTV9UWVBFKHZhbHVlKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIEJlaW5nIHVzZWQgdG8gc2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSAndGltZV9icmVhaycgbWV0aG9kXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBUaW1lQnJlYWtQYXJhbXMge1xyXG4gIGhvdXI6IG51bWJlciA9IDA7XHJcbiAgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gIHNlY29uZDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3Rvcihob3VyXzogbnVtYmVyLCBtaW51dGVfOiBudW1iZXIsIHNlY29uZF86IG51bWJlcik7XHJcbiAgY29uc3RydWN0b3IoaG91cl8/OiBudW1iZXIsIG1pbnV0ZV8/OiBudW1iZXIsIHNlY29uZF8/OiBudW1iZXIpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoaG91cl8sIG1pbnV0ZV8sIHNlY29uZF8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGhvdXJfOiBudW1iZXIsIG1pbnV0ZV86IG51bWJlciwgc2Vjb25kXzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhvdXIgPSBob3VyXztcclxuICAgIHRoaXMubWludXRlID0gbWludXRlXztcclxuICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kXztcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQmVpbmcgdXNlZCB0byBzZW5kIGludCBieSBSZWZcclxuLy8vIDwvc3VtbWFyeT5cclxuY2xhc3MgSW50UmVmIHtcclxuICB2YWw6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbF86IG51bWJlcikge1xyXG4gICAgdGhpcy52YWwgPSB2YWxfO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBCZWluZyB1c2VkIHRvIHNlbmQgcGFyYW1ldGVycyB0byB0aGUgJ2RhdGVfaV8yX25tJyBtZXRob2RcclxuLy8vIDwvc3VtbWFyeT5cclxuY2xhc3MgRGF0ZU5hbWVQYXJhbXMge1xyXG4gIG91dFZhbDogc3RyaW5nW10gPSBudWxsO1xyXG4gIGxlbjogbnVtYmVyID0gMDtcclxuICBvdXRJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG91dF86IHN0cmluZ1tdLCBvdXRJZHhfOiBudW1iZXIsIGxlbl86IG51bWJlcikge1xyXG4gICAgdGhpcy5vdXRWYWwgPSBvdXRfO1xyXG4gICAgdGhpcy5vdXRJZHggPSBvdXRJZHhfO1xyXG4gICAgdGhpcy5sZW4gPSBsZW5fO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBCZWluZyB1c2VkIHRvIHNlbmQgcGFyYW1ldGVycyB0byB0aGUgJ2RhdGVfYnJlYWtfZGF0ZW1vZGUnIG1ldGhvZFxyXG4vLy8gICBpdCdzIHN0cnVjdFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRGF0ZUJyZWFrUGFyYW1zIHtcclxuICBkYXk6IG51bWJlciA9IDA7XHJcbiAgZG93OiBudW1iZXIgPSAwO1xyXG4gIGRveTogbnVtYmVyID0gMDtcclxuICBtb250aDogbnVtYmVyID0gMDtcclxuICB5ZWFyOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHllYXJfOiBudW1iZXIsIG1vbnRoXzogbnVtYmVyLCBkYXlfOiBudW1iZXIsIGRveV86IG51bWJlciwgZG93XzogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3Rvcih5ZWFyXz86IG51bWJlciwgbW9udGhfPzogbnVtYmVyLCBkYXlfPzogbnVtYmVyLCBkb3lfPzogbnVtYmVyLCBkb3dfPzogbnVtYmVyKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHllYXJfLCBtb250aF8sIGRheV8sIGRveV8sIGRvd18pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHllYXJfOiBudW1iZXIsIG1vbnRoXzogbnVtYmVyLCBkYXlfOiBudW1iZXIsIGRveV86IG51bWJlciwgZG93XzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnllYXIgPSB5ZWFyXztcclxuICAgIHRoaXMubW9udGggPSBtb250aF87XHJcbiAgICB0aGlzLmRheSA9IGRheV87XHJcbiAgICB0aGlzLmRveSA9IGRveV87XHJcbiAgICB0aGlzLmRvdyA9IGRvd187XHJcbiAgfVxyXG59XHJcbiJdfQ==