@magic-xpa/gui 4.1100.0-dev4110.24 → 4.1100.0-dev4110.240

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 (200) hide show
  1. package/{esm2020 → esm2022}/index.mjs +71 -71
  2. package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
  3. package/esm2022/src/Commands.mjs +184 -0
  4. package/esm2022/src/Events.mjs +425 -0
  5. package/esm2022/src/EventsProcessor.mjs +67 -0
  6. package/esm2022/src/FocusManager.mjs +34 -0
  7. package/esm2022/src/GuiConstants.mjs +68 -0
  8. package/{esm2020 → esm2022}/src/GuiEnums.mjs +299 -299
  9. package/esm2022/src/GuiEnvironment.mjs +4 -0
  10. package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
  11. package/{esm2020 → esm2022}/src/Manager.mjs +91 -91
  12. package/esm2022/src/UIBridge.mjs +33 -0
  13. package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
  14. package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
  15. package/esm2022/src/gui/GuiMgControl.mjs +123 -0
  16. package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
  17. package/esm2022/src/gui/KeyboardItem.mjs +135 -0
  18. package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
  19. package/esm2022/src/gui/MgValue.mjs +16 -0
  20. package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
  21. package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
  22. package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
  23. package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
  24. package/esm2022/src/gui/low/GuiInteractive.mjs +177 -0
  25. package/esm2022/src/gui/low/Style.mjs +20 -0
  26. package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
  27. package/esm2022/src/management/data/BlobType.mjs +281 -0
  28. package/{esm2020 → esm2022}/src/management/data/DcValues.mjs +214 -214
  29. package/esm2022/src/management/data/DcValuesBuilderBase.mjs +96 -0
  30. package/esm2022/src/management/data/FieldDef.mjs +331 -0
  31. package/esm2022/src/management/data/FieldsTable.mjs +54 -0
  32. package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
  33. package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
  35. package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
  36. package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
  37. package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
  39. package/esm2022/src/management/data/RecordUtils.mjs +361 -0
  40. package/esm2022/src/management/data/VectorType.mjs +612 -0
  41. package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
  42. package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
  43. package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
  44. package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
  45. package/{esm2020 → esm2022}/src/management/exp/GuiExpressionEvaluator.mjs +305 -307
  46. package/esm2022/src/management/gui/ControlTable.mjs +118 -0
  47. package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
  48. package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
  49. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
  50. package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
  51. package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
  52. package/esm2022/src/management/gui/Helps.mjs +237 -0
  53. package/esm2022/src/management/gui/MgControlBase.mjs +1859 -0
  54. package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
  55. package/esm2022/src/management/gui/PIC.mjs +1185 -0
  56. package/esm2022/src/management/gui/PropDefaults.mjs +230 -0
  57. package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
  58. package/esm2022/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2022/src/management/gui/Property.mjs +1362 -0
  60. package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
  61. package/esm2022/src/management/gui/ValidationDetailsBase.mjs +93 -0
  62. package/esm2022/src/management/gui/WrongFormatException.mjs +29 -0
  63. package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
  64. package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
  65. package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
  66. package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
  67. package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
  68. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
  69. package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/esm2022/src/util/MemoryUtil.mjs +35 -0
  71. package/{esm2020 → esm2022}/src/util/ObjectReference.mjs +36 -36
  72. package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
  73. package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16074 -16074
  74. package/fesm2022/magic-xpa-gui.mjs.map +1 -0
  75. package/index.d.ts +70 -70
  76. package/package.json +6 -12
  77. package/src/Commands.d.ts +40 -39
  78. package/src/Events.d.ts +157 -155
  79. package/src/EventsProcessor.d.ts +13 -13
  80. package/src/FocusManager.d.ts +8 -8
  81. package/src/GuiConstants.d.ts +65 -65
  82. package/src/GuiEnums.d.ts +282 -282
  83. package/src/GuiEnvironment.d.ts +4 -4
  84. package/src/IFlowMonitorQueue.d.ts +3 -3
  85. package/src/Manager.d.ts +26 -26
  86. package/src/UIBridge.d.ts +16 -16
  87. package/src/env/IEnvironment.d.ts +31 -31
  88. package/src/gui/ControlBase.d.ts +4 -4
  89. package/src/gui/GuiMgControl.d.ts +38 -38
  90. package/src/gui/GuiMgForm.d.ts +3 -3
  91. package/src/gui/KeyboardItem.d.ts +18 -18
  92. package/src/gui/LastFocusedVal.d.ts +7 -7
  93. package/src/gui/MgValue.d.ts +15 -15
  94. package/src/gui/PropParentInterface.d.ts +13 -13
  95. package/src/gui/low/DialogHandler.d.ts +4 -4
  96. package/src/gui/low/GuiCommand.d.ts +37 -37
  97. package/src/gui/low/GuiCommandQueue.d.ts +13 -13
  98. package/src/gui/low/GuiInteractive.d.ts +55 -53
  99. package/src/gui/low/Style.d.ts +19 -19
  100. package/src/management/RuntimeContextBase.d.ts +23 -23
  101. package/src/management/data/BlobType.d.ts +29 -29
  102. package/src/management/data/DcValues.d.ts +33 -33
  103. package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
  104. package/src/management/data/FieldDef.d.ts +53 -53
  105. package/src/management/data/FieldsTable.d.ts +16 -16
  106. package/src/management/data/GuiDataViewBase.d.ts +27 -27
  107. package/src/management/data/GuiFieldBase.d.ts +17 -17
  108. package/src/management/data/IRecord.d.ts +12 -12
  109. package/src/management/data/IReferencedObject.d.ts +5 -5
  110. package/src/management/data/NUM_TYPE.d.ts +103 -103
  111. package/src/management/data/ObjectReferenceBase.d.ts +16 -16
  112. package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
  113. package/src/management/data/RecordUtils.d.ts +21 -21
  114. package/src/management/data/VectorType.d.ts +52 -52
  115. package/src/management/data/VectorTypeBase.d.ts +8 -8
  116. package/src/management/events/IActionManager.d.ts +7 -7
  117. package/src/management/events/IGuiEventsManager.d.ts +20 -20
  118. package/src/management/exp/ExpressionInterface.d.ts +242 -242
  119. package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
  120. package/src/management/gui/ControlTable.d.ts +28 -28
  121. package/src/management/gui/DisplayConvertor.d.ts +103 -103
  122. package/src/management/gui/FieldValidator.d.ts +35 -35
  123. package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
  124. package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
  125. package/src/management/gui/HebrewDate.d.ts +46 -46
  126. package/src/management/gui/Helps.d.ts +51 -51
  127. package/src/management/gui/MgControlBase.d.ts +223 -223
  128. package/src/management/gui/MgFormBase.d.ts +160 -160
  129. package/src/management/gui/PIC.d.ts +108 -108
  130. package/src/management/gui/PropDefaults.d.ts +7 -7
  131. package/src/management/gui/PropInterface.d.ts +244 -243
  132. package/src/management/gui/PropTable.d.ts +33 -33
  133. package/src/management/gui/Property.d.ts +121 -121
  134. package/src/management/gui/ValidationDetails.d.ts +52 -52
  135. package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
  136. package/src/management/gui/WrongFormatException.d.ts +9 -9
  137. package/src/management/tasks/GuiDataCollection.d.ts +4 -4
  138. package/src/management/tasks/GuiTaskBase.d.ts +150 -150
  139. package/src/management/tasks/IMGDataTable.d.ts +10 -10
  140. package/src/management/tasks/ITask.d.ts +6 -6
  141. package/src/management/tasks/MgTimer.d.ts +8 -8
  142. package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
  143. package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
  144. package/src/util/MemoryUtil.d.ts +6 -6
  145. package/src/util/ObjectReference.d.ts +9 -9
  146. package/src/util/UsernamePasswordCredentials.d.ts +18 -18
  147. package/esm2020/src/Commands.mjs +0 -177
  148. package/esm2020/src/Events.mjs +0 -420
  149. package/esm2020/src/EventsProcessor.mjs +0 -67
  150. package/esm2020/src/FocusManager.mjs +0 -34
  151. package/esm2020/src/GuiConstants.mjs +0 -68
  152. package/esm2020/src/GuiEnvironment.mjs +0 -4
  153. package/esm2020/src/UIBridge.mjs +0 -32
  154. package/esm2020/src/gui/GuiMgControl.mjs +0 -125
  155. package/esm2020/src/gui/KeyboardItem.mjs +0 -135
  156. package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
  157. package/esm2020/src/gui/MgValue.mjs +0 -16
  158. package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
  159. package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
  160. package/esm2020/src/gui/low/GuiInteractive.mjs +0 -165
  161. package/esm2020/src/gui/low/Style.mjs +0 -20
  162. package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
  163. package/esm2020/src/management/data/BlobType.mjs +0 -281
  164. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +0 -96
  165. package/esm2020/src/management/data/FieldDef.mjs +0 -331
  166. package/esm2020/src/management/data/FieldsTable.mjs +0 -54
  167. package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
  168. package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
  169. package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
  170. package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
  171. package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
  172. package/esm2020/src/management/data/RecordUtils.mjs +0 -361
  173. package/esm2020/src/management/data/VectorType.mjs +0 -612
  174. package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
  175. package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
  176. package/esm2020/src/management/gui/ControlTable.mjs +0 -118
  177. package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
  178. package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
  179. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
  180. package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
  181. package/esm2020/src/management/gui/Helps.mjs +0 -237
  182. package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
  183. package/esm2020/src/management/gui/MgFormBase.mjs +0 -738
  184. package/esm2020/src/management/gui/PIC.mjs +0 -1185
  185. package/esm2020/src/management/gui/PropDefaults.mjs +0 -230
  186. package/esm2020/src/management/gui/PropTable.mjs +0 -221
  187. package/esm2020/src/management/gui/Property.mjs +0 -1356
  188. package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
  189. package/esm2020/src/management/gui/ValidationDetailsBase.mjs +0 -93
  190. package/esm2020/src/management/gui/WrongFormatException.mjs +0 -29
  191. package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
  192. package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
  193. package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
  194. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
  195. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
  196. package/esm2020/src/util/MemoryUtil.mjs +0 -35
  197. package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
  198. package/fesm2015/magic-xpa-gui.mjs +0 -16364
  199. package/fesm2015/magic-xpa-gui.mjs.map +0 -1
  200. package/fesm2020/magic-xpa-gui.mjs.map +0 -1
@@ -0,0 +1,612 @@
1
+ import { ApplicationException, Encoding, ISO_8859_1_Encoding, List, NNumber, NString, StringBuilder } from '@magic-xpa/mscorelib';
2
+ import { BlobType } from './BlobType';
3
+ import { StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode } from '@magic-xpa/utils';
4
+ import { DisplayConvertor } from '../gui/DisplayConvertor';
5
+ import { RecordUtils } from './RecordUtils';
6
+ import { GuiConstants } from '../../GuiConstants';
7
+ import { GuiEnvironment } from '../../GuiEnvironment';
8
+ import { VectorTypeBase } from './VectorTypeBase';
9
+ export class VectorType extends VectorTypeBase {
10
+ static VERSION = 5;
11
+ static EMPTY_BLOB_PREFIX_LEN = 7;
12
+ static BLOB_TYPE_STRUCT_SIZE = 28;
13
+ _cells = null;
14
+ _encoding = null;
15
+ _allowNull = false;
16
+ _cellContentType = null;
17
+ _cellSize = 0;
18
+ _cellsAttr = null;
19
+ _cellsDefaultVal = null;
20
+ _cellsIsNullDefault = false;
21
+ _dataBuf = null;
22
+ _initialized = false;
23
+ _nullBuf = null;
24
+ _originalflatData = null;
25
+ constructor(cellsTypeOrBlobStringOrFld, contentType, defualt, isDefNull, nullAlowed, length) {
26
+ super();
27
+ if (arguments.length === 6)
28
+ this.constructor_0(cellsTypeOrBlobStringOrFld, contentType, defualt, isDefNull, nullAlowed, length);
29
+ else if (arguments.length === 1 && (cellsTypeOrBlobStringOrFld === null || cellsTypeOrBlobStringOrFld.constructor === String))
30
+ this.constructor_1(cellsTypeOrBlobStringOrFld);
31
+ else
32
+ this.constructor_2(cellsTypeOrBlobStringOrFld);
33
+ }
34
+ constructor_0(cellsType, contentType, defualt, isDefNull, nullAlowed, length) {
35
+ this._cells = new List();
36
+ this._cellsAttr = cellsType;
37
+ this._cellContentType = contentType;
38
+ this._cellsDefaultVal = defualt;
39
+ this._cellsIsNullDefault = isDefNull;
40
+ this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (length * 2) : length);
41
+ this._initialized = true;
42
+ this._allowNull = nullAlowed;
43
+ this._nullBuf = new StringBuilder();
44
+ this._dataBuf = new StringBuilder();
45
+ this._originalflatData = this.toString();
46
+ this._encoding = GuiEnvironment.Environment.GetEncoding();
47
+ }
48
+ constructor_1(blobString) {
49
+ this._cells = new List();
50
+ this._initialized = false;
51
+ this._originalflatData = blobString;
52
+ this._encoding = GuiEnvironment.Environment.GetEncoding();
53
+ }
54
+ constructor_2(fld) {
55
+ this._cells = new List();
56
+ this._cellsAttr = fld.getCellsType();
57
+ this._cellContentType = fld.getVecCellsContentType();
58
+ this._cellsDefaultVal = fld.getCellDefualtValue();
59
+ this._cellsIsNullDefault = fld.isNullDefault();
60
+ this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (fld.getVecCellsSize() * 2) : fld.getVecCellsSize());
61
+ this._initialized = true;
62
+ this._allowNull = fld.NullAllowed;
63
+ this._nullBuf = new StringBuilder();
64
+ this._dataBuf = new StringBuilder();
65
+ this._originalflatData = this.toString();
66
+ this._encoding = GuiEnvironment.Environment.GetEncoding();
67
+ }
68
+ init() {
69
+ let tokens = null;
70
+ let tokenIdx = 0;
71
+ let currentToken = null;
72
+ let isFlatDataTranslated = this.isUnicode(this._originalflatData);
73
+ let isDbcsAlpha = false;
74
+ let pos = BlobType.blobPrefixLength(this._originalflatData);
75
+ tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
76
+ let vecSize = 0;
77
+ if (!this._initialized) {
78
+ if (VectorType.validateBlobContents(this._originalflatData)) {
79
+ let blobPrefix = BlobType.getPrefix(this._originalflatData);
80
+ this._cellContentType = BlobType.getContentType(blobPrefix);
81
+ pos = (pos + 4 + 5 + 1);
82
+ tokenIdx++;
83
+ currentToken = tokens[tokenIdx];
84
+ pos = pos + (currentToken.length + 1);
85
+ tokenIdx++;
86
+ currentToken = tokens[tokenIdx];
87
+ pos = pos + (currentToken.length + 1);
88
+ tokenIdx++;
89
+ currentToken = tokens[tokenIdx];
90
+ this._cellsAttr = currentToken.charAt(0);
91
+ pos = pos + 2;
92
+ tokenIdx++;
93
+ currentToken = tokens[tokenIdx];
94
+ this._cellSize = NNumber.Parse(currentToken);
95
+ pos = pos + (currentToken.length + 1);
96
+ if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
97
+ this._cellsDefaultVal = StrUtil.stringToHexaDump(this._originalflatData.substr(pos, this._cellSize), 2);
98
+ else if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO) {
99
+ if (UtilStrByteMode.isLocaleDefLangDBCS()) {
100
+ isDbcsAlpha = true;
101
+ isFlatDataTranslated = true;
102
+ this._cellsDefaultVal = UtilStrByteMode.leftB(this._originalflatData.substr(pos), this._cellSize);
103
+ }
104
+ else
105
+ this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
106
+ if (this._encoding !== null && !isFlatDataTranslated) {
107
+ try {
108
+ let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(this._cellsDefaultVal);
109
+ this._cellsDefaultVal = this._encoding.GetString(ba, 0, ba.length);
110
+ }
111
+ catch (Exception) {
112
+ }
113
+ }
114
+ }
115
+ else if (this._cellsAttr === StorageAttribute.UNICODE) {
116
+ this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
117
+ try {
118
+ let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(this._cellsDefaultVal);
119
+ this._cellsDefaultVal = Encoding.Unicode.GetString(ba, 0, ba.length);
120
+ }
121
+ catch (Exception) {
122
+ }
123
+ }
124
+ else
125
+ this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
126
+ if (isDbcsAlpha)
127
+ pos = pos + this._cellsDefaultVal.length + 1;
128
+ else
129
+ pos = (pos + this._cellSize + 1);
130
+ tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
131
+ tokenIdx = 0;
132
+ currentToken = tokens[tokenIdx];
133
+ this._cellsIsNullDefault = DisplayConvertor.toBoolean(currentToken);
134
+ pos = pos + (currentToken.length + 1);
135
+ tokenIdx++;
136
+ currentToken = tokens[tokenIdx];
137
+ this._allowNull = DisplayConvertor.toBoolean(currentToken);
138
+ pos = pos + (currentToken.length + 1);
139
+ tokenIdx++;
140
+ currentToken = tokens[tokenIdx];
141
+ pos = pos + (currentToken.length + 1);
142
+ tokenIdx++;
143
+ currentToken = tokens[tokenIdx];
144
+ vecSize = NNumber.Parse(currentToken);
145
+ pos = pos + (currentToken.length + 1);
146
+ tokenIdx++;
147
+ currentToken = tokens[tokenIdx];
148
+ pos = pos + (currentToken.length + 1);
149
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
150
+ tokenIdx++;
151
+ currentToken = tokens[tokenIdx];
152
+ pos = pos + (currentToken.length + 1);
153
+ }
154
+ let data;
155
+ if (isDbcsAlpha) {
156
+ data = UtilStrByteMode.leftB(this._originalflatData.substr(pos), (vecSize * this._cellSize));
157
+ pos = pos + data.length + 1;
158
+ }
159
+ else {
160
+ data = this._originalflatData.substr(pos, (vecSize * this._cellSize));
161
+ pos = (pos + vecSize * this._cellSize + 1);
162
+ }
163
+ this._dataBuf = new StringBuilder(data.length);
164
+ if (this._cellsAttr !== StorageAttribute.ALPHA && this._cellsAttr !== StorageAttribute.MEMO && this._cellsAttr !== StorageAttribute.UNICODE)
165
+ this._dataBuf.Append(data);
166
+ let nullBuf = this._originalflatData.substr(pos, vecSize);
167
+ pos = (pos + vecSize + 1);
168
+ this._nullBuf = new StringBuilder(nullBuf);
169
+ if (this._cellsAttr !== StorageAttribute.BLOB && this._cellsAttr !== StorageAttribute.BLOB_VECTOR) {
170
+ for (let i = 0; i < vecSize; i++) {
171
+ let isNull = nullBuf.charAt(i) > '\0';
172
+ if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
173
+ this._cells.push(new CellElement(StrUtil.stringToHexaDump(data.substr((i * this._cellSize), this._cellSize), 2), isNull));
174
+ else if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO) {
175
+ let cellData;
176
+ if (isDbcsAlpha)
177
+ cellData = UtilStrByteMode.midB(data, (i * this._cellSize), this._cellSize);
178
+ else
179
+ cellData = data.substr((i * this._cellSize), this._cellSize);
180
+ if (this._encoding !== null && !isFlatDataTranslated) {
181
+ try {
182
+ let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(cellData);
183
+ cellData = this._encoding.GetString(ba, 0, ba.length);
184
+ }
185
+ catch (SystemException) {
186
+ }
187
+ }
188
+ this._dataBuf.Append(cellData);
189
+ this._cells.push(new CellElement(cellData, isNull));
190
+ }
191
+ else if (this._cellsAttr === StorageAttribute.UNICODE) {
192
+ let cellData = data.substr((i * this._cellSize), this._cellSize);
193
+ try {
194
+ let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(cellData);
195
+ cellData = Encoding.Unicode.GetString(ba, 0, ba.length);
196
+ }
197
+ catch (SystemException) {
198
+ }
199
+ this._dataBuf.Append(cellData);
200
+ this._cells.push(new CellElement(cellData, isNull));
201
+ }
202
+ else
203
+ this._cells.push(new CellElement(data.substr((i * this._cellSize), this._cellSize), isNull));
204
+ }
205
+ }
206
+ else {
207
+ for (let i = 0; i < vecSize; i++) {
208
+ tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
209
+ tokenIdx = 0;
210
+ tokenIdx++;
211
+ currentToken = tokens[tokenIdx];
212
+ let size = NNumber.Parse(currentToken);
213
+ pos = pos + (currentToken.length + 1);
214
+ let blobHeader = "";
215
+ for (let j = 0; j < GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT; j++) {
216
+ tokenIdx++;
217
+ currentToken = tokens[tokenIdx];
218
+ blobHeader = blobHeader + currentToken;
219
+ pos = pos + (currentToken.length + 1);
220
+ if (j !== GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT - 1) {
221
+ blobHeader = blobHeader + ",";
222
+ }
223
+ }
224
+ let cellData = this._originalflatData.substr(pos, size);
225
+ let isNull = nullBuf.charAt(i) > '\0';
226
+ this._cells.push(new CellElement(cellData, isNull, blobHeader));
227
+ pos = (pos + size + 1);
228
+ }
229
+ }
230
+ if (this._dataBuf.Length === 0)
231
+ this._dataBuf = new StringBuilder(data.length);
232
+ this._initialized = true;
233
+ }
234
+ else
235
+ throw new ApplicationException("in VectorType.init wrong vector format");
236
+ }
237
+ }
238
+ toString() {
239
+ let res = "";
240
+ if (this._initialized) {
241
+ res = res + 0 + "," + 0 + "," + "0" + "," + this._cellsAttr + "," + this._cellContentType + ";";
242
+ res = res + this.buildHeadersString();
243
+ if (this._cellsAttr === StorageAttribute.UNICODE) {
244
+ let dataBufCharArry = new Array(this._dataBuf.Length * 2);
245
+ for (let i = 0; i < this._dataBuf.Length; i = i + 1) {
246
+ dataBufCharArry[i * 2] = String.fromCharCode((this._dataBuf.get_Item(i).charCodeAt(0)) % 256);
247
+ dataBufCharArry[i * 2 + 1] = String.fromCharCode((this._dataBuf.get_Item(i).charCodeAt(0)) / 256);
248
+ }
249
+ res = res + NString.FromChars(dataBufCharArry) + ",";
250
+ }
251
+ else
252
+ res = res + this._dataBuf + ",";
253
+ res = res + this._nullBuf + ",";
254
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
255
+ res = res + this.getBlobsBuf();
256
+ res = res + VectorType.BLOB_TABLE_STR;
257
+ }
258
+ else
259
+ res = this._originalflatData;
260
+ return res;
261
+ }
262
+ getCellsAttr() {
263
+ if (!this._initialized)
264
+ return VectorType.getCellsAttr(this._originalflatData);
265
+ else
266
+ return this._cellsAttr;
267
+ }
268
+ getCellSize() {
269
+ let retVal;
270
+ if (!this._initialized)
271
+ retVal = VectorType.getCellSize(this._originalflatData);
272
+ else
273
+ retVal = this._cellSize;
274
+ if (this.getCellsAttr() === StorageAttribute.UNICODE)
275
+ retVal = Math.floor(retVal / 2);
276
+ return retVal;
277
+ }
278
+ getVecSize() {
279
+ if (!this._initialized)
280
+ return VectorType.getVecSize(this._originalflatData);
281
+ else
282
+ return this._cells.length;
283
+ }
284
+ getVecCell(idx) {
285
+ let retVal = null;
286
+ if (idx > 0) {
287
+ this.init();
288
+ if (idx <= this.getVecSize()) {
289
+ retVal = this._cells.get_Item(idx - 1).data;
290
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
291
+ retVal = this._cells.get_Item(idx - 1).blobFieldPrefix + ";" + retVal;
292
+ if (StorageAttributeCheck.isTypeLogical(this._cellsAttr))
293
+ retVal = ((retVal.charAt(0) === '\0') ? "0" : "1");
294
+ if (this._cells.get_Item(idx - 1).isNull)
295
+ retVal = null;
296
+ }
297
+ else if (!this._cellsIsNullDefault)
298
+ retVal = this._cellsDefaultVal;
299
+ }
300
+ return retVal;
301
+ }
302
+ GetCellValues() {
303
+ let retVal = null;
304
+ let cellValues = null;
305
+ this.init();
306
+ if (this.getVecSize() > 0) {
307
+ cellValues = new Array(this.getVecSize());
308
+ for (let idx = 0; idx < this.getVecSize(); idx++) {
309
+ retVal = this._cells.get_Item(idx).data;
310
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
311
+ retVal = this._cells.get_Item(idx).blobFieldPrefix + ";" + retVal;
312
+ if (StorageAttributeCheck.isTypeLogical(this._cellsAttr))
313
+ retVal = ((retVal.charAt(0) === '\0') ? "0" : "1");
314
+ if (this._cells.get_Item(idx).isNull)
315
+ retVal = null;
316
+ cellValues[idx] = retVal;
317
+ }
318
+ }
319
+ else if (!this._cellsIsNullDefault) {
320
+ cellValues = [
321
+ this._cellsDefaultVal
322
+ ];
323
+ }
324
+ return cellValues;
325
+ }
326
+ setVecCell(idx, newValue, isNull) {
327
+ let res = false;
328
+ let createBufferValForNumType = true;
329
+ try {
330
+ if (idx > 0) {
331
+ this.init();
332
+ let localCellSize = (this._cellsAttr === StorageAttribute.UNICODE) ? Math.floor(this._cellSize / 2) : this._cellSize;
333
+ if (isNull && !this._allowNull) {
334
+ isNull = false;
335
+ newValue = this._cellsDefaultVal;
336
+ }
337
+ if (idx <= this._cells.length) {
338
+ let curr = this._cells.get_Item(idx - 1);
339
+ if (!isNull) {
340
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
341
+ let blobPrefixLength = BlobType.blobPrefixLength(newValue);
342
+ curr.blobFieldPrefix = newValue.substr(0, blobPrefixLength - 1);
343
+ if (newValue.length > blobPrefixLength)
344
+ curr.data = newValue.substr(blobPrefixLength);
345
+ else
346
+ curr.data = "";
347
+ }
348
+ else {
349
+ if (StorageAttributeCheck.isTypeLogical(this._cellsAttr)) {
350
+ curr.data = (DisplayConvertor.toBoolean(newValue) ? new StringBuilder().Append(1).ToString() : new StringBuilder().Append('\0').ToString());
351
+ newValue = curr.data;
352
+ }
353
+ else
354
+ curr.data = newValue;
355
+ let dataBufVal = newValue;
356
+ if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
357
+ dataBufVal = RecordUtils.byteStreamToString(dataBufVal);
358
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO)) {
359
+ let baDataBuf = this._encoding.GetBytes(this._dataBuf.ToString());
360
+ let baDataBufVal = this._encoding.GetBytes(dataBufVal);
361
+ for (let i = 0; i < baDataBufVal.length && i < localCellSize; i++)
362
+ baDataBuf[((idx - 1) * localCellSize) + i] = baDataBufVal[i];
363
+ for (let i = baDataBufVal.length; i < localCellSize; i++)
364
+ baDataBuf[((idx - 1) * localCellSize) + i] = ((this._cellsAttr === StorageAttribute.ALPHA) ? 32 : 0);
365
+ this._dataBuf = new StringBuilder(this._encoding.GetString(baDataBuf, 0, baDataBuf.length));
366
+ curr.data = this._encoding.GetString(baDataBuf, ((idx - 1) * localCellSize), localCellSize);
367
+ }
368
+ else {
369
+ for (let i = 0; i < dataBufVal.length && i < localCellSize; i++)
370
+ this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, dataBufVal.charAt(i));
371
+ for (let i = dataBufVal.length; i < localCellSize; i++)
372
+ this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE) ? ' ' : '\0');
373
+ if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE || this._cellsAttr === StorageAttribute.MEMO)
374
+ curr.data = this._dataBuf.ToString().substr(((idx - 1) * localCellSize), localCellSize);
375
+ }
376
+ }
377
+ this._nullBuf.set_Item(idx - 1, '\0');
378
+ curr.isNull = false;
379
+ }
380
+ else {
381
+ curr.data = null;
382
+ if (this._cellsAttr === StorageAttribute.BLOB_VECTOR)
383
+ curr.blobFieldPrefix = BlobType.getEmptyBlobPrefix('\u0001');
384
+ else
385
+ curr.blobFieldPrefix = BlobType.getEmptyBlobPrefix('\0');
386
+ curr.isNull = true;
387
+ this._nullBuf.set_Item(idx - 1, '\u0001');
388
+ for (let i = 0; i < localCellSize; i++)
389
+ this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, '\0');
390
+ this._nullBuf.set_Item(idx - 1, '\u0001');
391
+ }
392
+ res = true;
393
+ }
394
+ else {
395
+ let insertVal;
396
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
397
+ if (this._cellsAttr === StorageAttribute.BLOB_VECTOR)
398
+ insertVal = BlobType.getEmptyBlobPrefix('\u0001');
399
+ else
400
+ insertVal = BlobType.getEmptyBlobPrefix('\0');
401
+ if (!this._cellsIsNullDefault)
402
+ insertVal = insertVal + this._cellsDefaultVal;
403
+ }
404
+ else if (this._cellsIsNullDefault)
405
+ insertVal = null;
406
+ else
407
+ insertVal = this._cellsDefaultVal;
408
+ if (insertVal !== null && StorageAttributeCheck.isTypeLogical(this._cellsAttr))
409
+ insertVal = (DisplayConvertor.toBoolean(insertVal) ? new StringBuilder().Append('\u0001').ToString() : new StringBuilder().Append('\0').ToString());
410
+ let dataBufVal = insertVal;
411
+ while (this._cells.length < idx) {
412
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
413
+ this._cells.push(new CellElement(insertVal.substr(VectorType.EMPTY_BLOB_PREFIX_LEN), this._cellsIsNullDefault, insertVal.substr(0, VectorType.EMPTY_BLOB_PREFIX_LEN)));
414
+ this._dataBuf.Append(this.getNullString(VectorType.BLOB_TYPE_STRUCT_SIZE));
415
+ }
416
+ else {
417
+ this._cells.push(new CellElement(insertVal, this._cellsIsNullDefault));
418
+ if (insertVal !== null) {
419
+ if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME) {
420
+ if (createBufferValForNumType) {
421
+ createBufferValForNumType = false;
422
+ dataBufVal = RecordUtils.byteStreamToString(insertVal);
423
+ }
424
+ }
425
+ this._dataBuf.Append(dataBufVal);
426
+ let valLen;
427
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO))
428
+ valLen = UtilStrByteMode.lenB(dataBufVal);
429
+ else
430
+ valLen = dataBufVal.length;
431
+ for (let i = valLen; i < localCellSize; i++)
432
+ this._dataBuf.Append((this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE) ? ' ' : '\0');
433
+ }
434
+ else
435
+ this._dataBuf.Append(this.getNullString(localCellSize));
436
+ }
437
+ this._nullBuf.Insert(this._cells.length - 1, this._cellsIsNullDefault ? '\u0001' : '\0');
438
+ }
439
+ res = this.setVecCell(idx, newValue, isNull);
440
+ }
441
+ }
442
+ }
443
+ catch (ApplicationException) {
444
+ res = false;
445
+ }
446
+ return res;
447
+ }
448
+ adjustToFit(field) {
449
+ if (field.getType() === StorageAttribute.BLOB_VECTOR) {
450
+ let srcAttr = this.getCellsAttr();
451
+ let dstAttr = field.getCellsType();
452
+ if (StorageAttributeCheck.isTheSameType(srcAttr, dstAttr)) {
453
+ this.init();
454
+ if (StorageAttributeCheck.IsTypeAlphaOrUnicode(srcAttr) && StorageAttributeCheck.IsTypeAlphaOrUnicode(dstAttr)) {
455
+ let dstSizeInChars = field.getVecCellsSize();
456
+ let srcSizeInChars = ((this._cellsAttr === StorageAttribute.UNICODE) ? Math.floor(this._cellSize / 2) : this._cellSize);
457
+ let isByteMode = UtilStrByteMode.isLocaleDefLangDBCS() && StorageAttributeCheck.isTypeAlpha(dstAttr);
458
+ if (srcSizeInChars !== dstSizeInChars) {
459
+ let adjData = new StringBuilder();
460
+ for (let i = 0; i < dstSizeInChars; i = i + 1) {
461
+ let curr = this._cells.get_Item(i);
462
+ if (!curr.isNull) {
463
+ if (srcSizeInChars > dstSizeInChars) {
464
+ if (isByteMode)
465
+ curr.data = UtilStrByteMode.leftB(curr.data, dstSizeInChars);
466
+ else
467
+ curr.data = curr.data.substr(0, dstSizeInChars);
468
+ adjData.Append(curr.data);
469
+ }
470
+ else {
471
+ let tmpData = new StringBuilder();
472
+ tmpData.Append(curr.data);
473
+ let dataLen = isByteMode ? UtilStrByteMode.lenB(curr.data) : curr.data.length;
474
+ for (let j = dataLen; j < dstSizeInChars; j = j + 1)
475
+ tmpData.Append(' ');
476
+ adjData.Append(tmpData.ToString());
477
+ curr.data = tmpData.ToString();
478
+ }
479
+ }
480
+ else {
481
+ let tmpData = new StringBuilder();
482
+ for (let j = 0; j < dstSizeInChars; j = j + 1)
483
+ tmpData.Append('\0');
484
+ adjData.Append(tmpData.ToString());
485
+ curr.data = tmpData.ToString();
486
+ }
487
+ }
488
+ this._dataBuf = adjData;
489
+ }
490
+ }
491
+ let newSize = field.getVecCellsSize();
492
+ this._cellsAttr = field.getCellsType();
493
+ this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (newSize * 2) : newSize);
494
+ this._cellsDefaultVal = field.getCellDefualtValue();
495
+ this._cellsIsNullDefault = field.isNullDefault();
496
+ this._allowNull = field.NullAllowed;
497
+ this._originalflatData = this.toString();
498
+ return;
499
+ }
500
+ else
501
+ throw new ApplicationException("in VectorType.adjustToFit vector basic types does not agree");
502
+ }
503
+ else
504
+ throw new ApplicationException("in VectorType.adjustToFit " + field.getName() + " is not of type vector");
505
+ }
506
+ buildHeadersString() {
507
+ let res = VectorType.BLOB_TABLE_STR + VectorType.VECTOR_STR + "," + VectorType.VERSION + "," + 1 + "," + this._cellsAttr + ",";
508
+ res = res + this._cellSize + ",";
509
+ let def = "";
510
+ if (this._cellsDefaultVal !== null)
511
+ if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
512
+ def = RecordUtils.byteStreamToString(this._cellsDefaultVal);
513
+ else
514
+ def = this._cellsDefaultVal;
515
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO))
516
+ def = def + this.getEmptyString(this._cellSize - UtilStrByteMode.lenB(def));
517
+ else
518
+ def = def + this.getEmptyString(this._cellSize - def.length);
519
+ res = res + def + "," + (this._cellsIsNullDefault ? "1" : "0") + ",";
520
+ res = res + (this._allowNull ? "1" : "0") + "," + this._cellSize + "," + this._cells.length + ",";
521
+ res = res + ((this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) ? "1" : "0") + ",";
522
+ if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
523
+ res = res + "0,";
524
+ return res;
525
+ }
526
+ getNullString(size) {
527
+ let res = new StringBuilder();
528
+ for (let i = 0; i < size; i = i + 1)
529
+ res.Append('\0');
530
+ return res.ToString();
531
+ }
532
+ getEmptyString(size) {
533
+ let res = new StringBuilder();
534
+ for (let i = 0; i < size; i = i + 1)
535
+ res.Append(' ');
536
+ return res.ToString();
537
+ }
538
+ getBlobsBuf() {
539
+ let res = new StringBuilder();
540
+ for (let i = 0; i < this._cells.length; i = i + 1) {
541
+ let data = "";
542
+ let blobSize = 0;
543
+ let curr = this._cells.get_Item(i);
544
+ if (curr.data !== null) {
545
+ data = curr.data;
546
+ blobSize = data.length;
547
+ }
548
+ res.Append(blobSize);
549
+ res.Append("," + curr.blobFieldPrefix + "," + data + ";");
550
+ }
551
+ return (res + ",");
552
+ }
553
+ static getCellsAttr(blob) {
554
+ if (VectorType.validateBlobContents(blob)) {
555
+ let tokens = StrUtil.tokenize(blob.substr(BlobType.blobPrefixLength(blob)), ",");
556
+ return tokens[3].charAt(0);
557
+ }
558
+ else
559
+ throw new ApplicationException("in static getCellsAttr the blob is in the wrong format");
560
+ }
561
+ static getCellSize(blob) {
562
+ let cellsType = VectorType.getCellsAttr(blob);
563
+ if (cellsType !== StorageAttribute.BLOB && cellsType !== StorageAttribute.BLOB_VECTOR) {
564
+ let tokens = StrUtil.tokenize(blob.substr(BlobType.blobPrefixLength(blob)), ",");
565
+ return NNumber.Parse(tokens[4]);
566
+ }
567
+ else {
568
+ return 2147483647;
569
+ }
570
+ }
571
+ static getVecSize(blob) {
572
+ if (VectorType.validateBlobContents(blob)) {
573
+ let pos = BlobType.blobPrefixLength(blob);
574
+ let tokens = StrUtil.tokenize(blob.substr(pos), ",");
575
+ pos = pos + (tokens[0].length + 1);
576
+ pos = pos + (tokens[1].length + 1);
577
+ pos = pos + (tokens[2].length + 1);
578
+ pos = pos + (tokens[3].length + 1);
579
+ let cellsSize = tokens[4];
580
+ pos = pos + (cellsSize.length + 1);
581
+ pos = pos + (NNumber.Parse(cellsSize) + 1);
582
+ tokens = StrUtil.tokenize(blob.substr(pos), ",");
583
+ return NNumber.Parse(tokens[3]);
584
+ }
585
+ throw new ApplicationException("in static getVecSize the blob is in the wrong format");
586
+ }
587
+ isUnicode(flatData) {
588
+ let start = BlobType.blobPrefixLength(flatData);
589
+ let catcher = flatData.substr(start, VectorType.BLOB_TABLE_STR_LEN);
590
+ return (catcher === VectorType.BLOB_TABLE_STR);
591
+ }
592
+ }
593
+ export class CellElement {
594
+ blobFieldPrefix = null;
595
+ data = null;
596
+ isNull = false;
597
+ constructor(val, is_null, ctrlData) {
598
+ if (arguments.length === 2)
599
+ this.constructor_0(val, is_null);
600
+ this.constructor_1(val, is_null, ctrlData);
601
+ }
602
+ constructor_0(val, is_null) {
603
+ this.data = val;
604
+ this.isNull = is_null;
605
+ }
606
+ constructor_1(val, is_null, ctrlData) {
607
+ this.data = val;
608
+ this.isNull = is_null;
609
+ this.blobFieldPrefix = ctrlData;
610
+ }
611
+ }
612
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yVHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9kYXRhL1ZlY3RvclR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixRQUFRLEVBQ1IsbUJBQW1CLEVBQ25CLElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBTWxELE1BQU0sT0FBTyxVQUFXLFNBQVEsY0FBYztJQUU1QyxNQUFNLENBQUMsT0FBTyxHQUFXLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMscUJBQXFCLEdBQVcsQ0FBQyxDQUFDO0lBR3pDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBVyxFQUFFLENBQUM7SUFFbEMsTUFBTSxHQUFzQixJQUFJLENBQUM7SUFDakMsU0FBUyxHQUFhLElBQUksQ0FBQztJQUMzQixVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLGdCQUFnQixHQUFXLElBQUksQ0FBQztJQUNoQyxTQUFTLEdBQVcsQ0FBQyxDQUFDO0lBQ3RCLFVBQVUsR0FBcUIsSUFBSSxDQUFD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QUFNLEdBQVksS0FBSyxDQUFDO0lBTXhCLFlBQVksR0FBVyxFQUFFLE9BQWdCLEVBQUUsUUFBaUI7UUFDMUQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFHTyxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQWdCO1FBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFHTyxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQWdCLEVBQUUsUUFBZ0I7UUFDbkUsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBFbmNvZGluZyxcclxuICBJU09fODg1OV8xX0VuY29kaW5nLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IEZpZWxkRGVmIH0gZnJvbSAnLi9GaWVsZERlZic7XHJcbmltcG9ydCB7IEJsb2JUeXBlIH0gZnJvbSAnLi9CbG9iVHlwZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VBdHRyaWJ1dGUsIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjaywgU3RyVXRpbCwgVXRpbFN0ckJ5dGVNb2RlIH0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IERpc3BsYXlDb252ZXJ0b3IgfSBmcm9tICcuLi9ndWkvRGlzcGxheUNvbnZlcnRvcic7XHJcbmltcG9ydCB7IFJlY29yZFV0aWxzIH0gZnJvbSAnLi9SZWNvcmRVdGlscyc7XHJcbmltcG9ydCB7IEd1aUNvbnN0YW50cyB9IGZyb20gJy4uLy4uL0d1aUNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEd1aUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBWZWN0b3JUeXBlQmFzZSB9IGZyb20gJy4vVmVjdG9yVHlwZUJhc2UnO1xyXG5cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgcmVwcmVzZW50cyB0aGUgbWFnaWMgdmVjdG9yIHR5cGVcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFZlY3RvclR5cGUgZXh0ZW5kcyBWZWN0b3JUeXBlQmFzZSB7XHJcblxyXG4gIHN0YXRpYyBWRVJTSU9OOiBudW1iZXIgPSA1OyAvLyB2ZXJzaW9uIG5vIDUgaW5jbHVkZXMgdGhlIGNvbnRlbnQgZmllbGRcclxuICBzdGF0aWMgRU1QVFlfQkxPQl9QUkVGSVhfTEVOOiBudW1iZXIgPSA3O1xyXG5cclxuICAvLyBGT1IgRVhQTEFOQVRJT05TIFJFR0FSRElORyBUSElTIE5VTUJFUiBQTEVBUyBTRUUgRE9DVU1FTlRBVElPTiBJTlNJREUgaW5pdCBNRVRIT0RcclxuICBzdGF0aWMgQkxPQl9UWVBFX1NUUlVDVF9TSVpFOiBudW1iZXIgPSAyODtcclxuXHJcbiAgcHJpdmF0ZSBfY2VsbHM6IExpc3Q8Q2VsbEVsZW1lbnQ+ID0gbnVsbDsgLy8gYSB2ZWN0b3IgY29udGFpbmluZyBDZWxsRWxlbWVudHNcclxuICBwcml2YXRlIF9lbmNvZGluZzogRW5jb2RpbmcgPSBudWxsOyAvLyB0byBiZSB1c2VkIG9ubHkgd2l0aCBhbHBoYSBvciBtZW1vXHJcbiAgcHJpdmF0ZSBfYWxsb3dOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2VsbENvbnRlbnRUeXBlOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NlbGxTaXplOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2NlbGxzQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IG51bGw7IC8vIGFsbCBjZWxscyBpbiB0aGUgdmVjdG9yIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZVxyXG4gIHByaXZhdGUgX2NlbGxzRGVmYXVsdFZhbDogc3RyaW5nID0gbnVsbDsgLy8gYWxsIGNlbGxzIGluIHRoZSBtYWdpYyB2ZWN0b3IgaGFzIHRoZSBzYW1lIGRlZmF1bHQgdmFsdWVcclxuICBwcml2YXRlIF9jZWxsc0lzTnVsbERlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gbnVsbCBkZWZhdWx0IGRlZmluaXRpb24gZm9yIGFsbCBjZWxscyBpbiB0aGUgbWFnaWMgdmVjdG9yXHJcblxyXG4gIC8vIGRhdGEgYnVmZmVycyB0aGF0IHdlIGNoYW5nZSBEeW5hbWljYWxseSB0byBmYWNpbGl0YXRlXHJcbiAgLy8gdGhlIGNyZWF0aW9uIG9mIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICBwcml2YXRlIF9kYXRhQnVmOiBTdHJpbmdCdWlsZGVyID0gbnVsbDtcclxuICBwcml2YXRlIF9pbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBtYXJrcyB3aGV0aGVyIHRoZSB2ZWN0b3Igd2FzIGluaXRpYWxpemVkIGlmIGl0IHdhcyBub3QgdGhhdCBpdCBpcyBhbiBpbnZhbGlkIHZlY3RvclxyXG4gIHByaXZhdGUgX251bGxCdWY6IFN0cmluZ0J1aWxkZXIgPSBudWxsO1xyXG4gIHByaXZhdGUgX29yaWdpbmFsZmxhdERhdGE6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNlbGxzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgY29udGVudFR5cGU6IHN0cmluZywgZGVmdWFsdDogc3RyaW5nLCBpc0RlZk51bGw6IGJvb2xlYW4sIG51bGxBbG93ZWQ6IGJvb2xlYW4sIGxlbmd0aDogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3RvcihibG9iU3RyaW5nOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKGZsZDogRmllbGREZWYpO1xyXG4gIGNvbnN0cnVjdG9yKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkOiBhbnksIGNvbnRlbnRUeXBlPzogc3RyaW5nLCBkZWZ1YWx0Pzogc3RyaW5nLCBpc0RlZk51bGw/OiBib29sZWFuLCBudWxsQWxvd2VkPzogYm9vbGVhbiwgbGVuZ3RoPzogbnVtYmVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDYpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZCwgY29udGVudFR5cGUsIGRlZnVhbHQsIGlzRGVmTnVsbCwgbnVsbEFsb3dlZCwgbGVuZ3RoKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIChjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZCA9PT0gbnVsbCB8fCBjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSlcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMihjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29uc3RydWN0IHRoZSBvYmplY3QgYnV0IGRvZXMgbm90IGZpbGwgaXQgd2l0aCBkYXRhIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhlIFZlY3RvciB3ZSBtdXN0IGludm9rZSBvblxyXG4gIC8vLyAgIGl0IHRoZSBpdHMgaW5pdCBtZXRob2QgYSBWZWN0b3JUeXBlIHdoaWNoIHdhcyBub3QgaW5pdGlhbGl6ZWQgaXMgYW4gdW52YWxpZCB2ZWN0b3IuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoY2VsbHNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBjb250ZW50VHlwZTogc3RyaW5nLCBkZWZ1YWx0OiBzdHJpbmcsIGlzRGVmTnVsbDogYm9vbGVhbiwgbnVsbEFsb3dlZDogYm9vbGVhbiwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NlbGxzID0gbmV3IExpc3Q8Q2VsbEVsZW1lbnQ+KCk7XHJcbiAgICB0aGlzLl9jZWxsc0F0dHIgPSBjZWxsc1R5cGU7XHJcbiAgICB0aGlzLl9jZWxsQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTtcclxuICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IGRlZnVhbHQ7XHJcbiAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBpc0RlZk51bGw7XHJcbiAgICB0aGlzLl9jZWxsU2l6ZSA9ICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gKGxlbmd0aCAqIDIpIDogbGVuZ3RoKTtcclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2FsbG93TnVsbCA9IG51bGxBbG93ZWQ7XHJcbiAgICB0aGlzLl9udWxsQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fb3JpZ2luYWxmbGF0RGF0YSA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuX2VuY29kaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3QgdGhlIG9iamVjdCBidXQgZG9lcyBub3QgZmlsbCBpdCB3aXRoIGRhdGEgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUgVmVjdG9yIHdlIG11c3QgaW52b2tlIG9uXHJcbiAgLy8vICAgaXQgdGhlIGl0cyBpbml0IG1ldGhvZCBhIFZlY3RvclR5cGUgd2hpY2ggd2FzIG5vdCBpbml0aWFsaXplZCBpcyBhbiBpbnZhbGlkIHZlY3Rvci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlN0cmluZ1wiPmEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBibG9iJ3MgZGF0YSBieXRlczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGJsb2JTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2VsbHMgPSBuZXcgTGlzdDxDZWxsRWxlbWVudD4oKTtcclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB0aGlzLl9vcmlnaW5hbGZsYXREYXRhID0gYmxvYlN0cmluZztcclxuICAgIHRoaXMuX2VuY29kaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3QgdGhlIG9iamVjdCB3aXRoIGEgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoYXJzXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzIoZmxkOiBGaWVsZERlZik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2VsbHMgPSBuZXcgTGlzdDxDZWxsRWxlbWVudD4oKTtcclxuICAgIHRoaXMuX2NlbGxzQXR0ciA9IGZsZC5nZXRDZWxsc1R5cGUoKTtcclxuICAgIHRoaXMuX2NlbGxDb250ZW50VHlwZSA9IGZsZC5nZXRWZWNDZWxsc0NvbnRlbnRUeXBlKCk7XHJcbiAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBmbGQuZ2V0Q2VsbERlZnVhbHRWYWx1ZSgpO1xyXG4gICAgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0ID0gZmxkLmlzTnVsbERlZmF1bHQoKTtcclxuICAgIHRoaXMuX2NlbGxTaXplID0gPG51bWJlcj4oKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IChmbGQuZ2V0VmVjQ2VsbHNTaXplKCkgKiAyKSA6IGZsZC5nZXRWZWNDZWxsc1NpemUoKSk7XHJcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB0aGlzLl9hbGxvd051bGwgPSBmbGQuTnVsbEFsbG93ZWQ7XHJcbiAgICB0aGlzLl9udWxsQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fb3JpZ2luYWxmbGF0RGF0YSA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuX2VuY29kaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZHMgYSBWZWN0b3JUeXBlIGZyb20gaXRzIGZsYXR0ZW5lZCBibG9iIHJlcHJlc2VudGF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2JTdHJpbmdcIj5hIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmxvYidzIGRhdGEgYnl0ZXM8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZmFsc2UgaXMgdGhlIGdpdmVuIGJsb2IgaXMgbm90IGEgdmVjdG9yICh0aGUgZmxhdHRlbiBmb3JtYXQgaXMgd3JvbmcpPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gbnVsbDtcclxuICAgIGxldCB0b2tlbklkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBjdXJyZW50VG9rZW46IHN0cmluZyA9IG51bGw7IC8vIHRoZSBjdXJyZW50IHRva2VuIHdlIGFyZSBwYXJpbmdcclxuICAgIGxldCBpc0ZsYXREYXRhVHJhbnNsYXRlZDogYm9vbGVhbiA9IHRoaXMuaXNVbmljb2RlKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgbGV0IGlzRGJjc0FscGhhOiBib29sZWFuID0gZmFsc2U7IC8vIEpQTjogREJDUyBzdXBwb3J0XHJcblxyXG4gICAgLy8gcG9zIGlzIHBvc2l0aW9uIGluIHRoZSBvcmlnaW5hbGZsYXREYXRhIHN0cmluZ1xyXG4gICAgbGV0IHBvczogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aCh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgIC8vIGJsb2JcclxuICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG4gICAgbGV0IHZlY1NpemU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICBpZiAoVmVjdG9yVHlwZS52YWxpZGF0ZUJsb2JDb250ZW50cyh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKSkge1xyXG4gICAgICAgIGxldCBibG9iUHJlZml4OiBzdHJpbmcgPSBCbG9iVHlwZS5nZXRQcmVmaXgodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICAgICAgdGhpcy5fY2VsbENvbnRlbnRUeXBlID0gQmxvYlR5cGUuZ2V0Q29udGVudFR5cGUoYmxvYlByZWZpeCk7XHJcblxyXG4gICAgICAgIC8vIHNraXAgdGhlIHRoZSBoZWFkZXJzIG9mIHRoZSB0YWJsZSBhbmQgdGhlIHZlY3RvciBhbmQgdGhlIGZpcnN0ICcsJztcclxuICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIDQgKyA1ICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgQ29sdW1uc0NvdW50XyBpbiB2ZWN0b3JzIGFsd2F5cyBjb250YWluIHZhbHVlIG9mIDFcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGNlbGwgYXR0cmlidXRlIGluIHZlY3RvciB0aGVyZSBpcyBvbmx5IG9uZSBhdHRyaWJ1dGUgZm8gdGhlIGVudGlyZSB2ZWN0b3JcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgdGhpcy5fY2VsbHNBdHRyID0gPFN0b3JhZ2VBdHRyaWJ1dGU+Y3VycmVudFRva2VuLmNoYXJBdCgwKTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAyO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgQ29sdW1uc0xlbl8gdGhhdCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNlbGxzIGluIHRoZSB2ZWN0b3JcclxuICAgICAgICAvLyBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBjb2x1bW4gd2UgaW5jcmVhc2UgcG9zIGJ5IGN1cnJlbnRUb2tlbi5sZW5ndGgoKVxyXG4gICAgICAgIC8vIHRoaXMgbnVtYmVyIGlzIHNhbWUgYXMgdGhlIENvbHVtbnNUb3RhbExlbl8gZm9yIHZlY3RvcnNcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgdGhpcy5fY2VsbFNpemUgPSA8bnVtYmVyPk5OdW1iZXIuUGFyc2UoY3VycmVudFRva2VuKTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgY2VsbCBkZWZhdWx0IHZhbHVlIGlzIGl0IGlzIG51bWVyaWMgaXQgaXMgc2VudCBhcyBOVU1fVFlQRVxyXG4gICAgICAgIC8vIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG1heSBjb250YWluIGFzIHZhbHVlIGNoYXJjdGVycyBhcyB0aGUgZGVsaW1ldGVyXHJcbiAgICAgICAgLy8gd2UgY2FuIG5vdCB1c2UgdGhlIFN0cmluZ1Rva2VuaXplci5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKSwgMik7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgNDI5NDQ1IHNpbmNlIHRoZSB2ZWN0b3IgaXMgZW5jb2RlZCB0byBiYXNlNjQvaGV4IHdoZW4gaXQgaXMgcmVjaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgIC8vIHdlIG11c3QgdXNlIHRoZSBjb3JyZWN0IGNoYXItc2V0IHdoZW4gcmVjaXZpbmcgdmVjdG9yIG9mIGFscGhhIG9yIG1lbW8gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAvLyBpbiB2ZWN0b3JzIHdlIG11c3QgY29uY2lkZXIgdGhlIGNoYXIgc2V0IHNpbmNlIHdoZW4gd2UgZ290IGl0IGZyb20gdGhlIHNlcnZlciBpdCB3YXMgZW5jb2RlZFxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgaXNEYmNzQWxwaGEgPSB0cnVlO1xyXG4gICAgICAgICAgICBpc0ZsYXREYXRhVHJhbnNsYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9lbmNvZGluZyAhPT0gbnVsbCAmJiAhaXNGbGF0RGF0YVRyYW5zbGF0ZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBsZXQgYmE6IFVpbnQ4QXJyYXkgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzEuR2V0Qnl0ZXModGhpcy5fY2VsbHNEZWZhdWx0VmFsKTtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmEsIDAsIGJhLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSB7XHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBiYTogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyh0aGlzLl9jZWxsc0RlZmF1bHRWYWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBFbmNvZGluZy5Vbmljb2RlLkdldFN0cmluZyhiYSwgMCwgYmEubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICBpZiAoaXNEYmNzQWxwaGEpXHJcbiAgICAgICAgICBwb3MgPSBwb3MgKyB0aGlzLl9jZWxsc0RlZmF1bHRWYWwubGVuZ3RoICsgMTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIHRoaXMuX2NlbGxTaXplICsgMSk7IC8vIHNpa3AgdGhlIGVuZGluZyAnLCdcclxuXHJcbiAgICAgICAgLy8gaW5yb3JkZXIgdG8gY29udGludWUgdXNpbmcgdGhlIHRva2VuaXplciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlcnMgcGFyc2luZ1xyXG4gICAgICAgIC8vIHJlaW5pdCBpdFxyXG4gICAgICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG4gICAgICAgIHRva2VuSWR4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGNlbGxzIG51bGwgZGVmYXVsdCBmbGFnXHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBjZWxscyBudWxsIGFsbG93ZWQgZmxhZ1xyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9hbGxvd051bGwgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHNraXAgdGhlIHBhcnNpbmcgb2YgQ29sdW1uc1RvdGFsTGVuX1xyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yICggUmVjb3Jkc0NvdW50XylcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgdmVjU2l6ZSA9IDxudW1iZXI+Tk51bWJlci5QYXJzZShjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHRoZSBibG9ic18gd2lsbCBhbHdheXMgY29udGFpbiB2YWx1ZSBvZiAxIHNpbmUgd2UgaGF2ZSBpbiB2ZWN0b3JzIG9ubHkgb25lIGNvbG1uXHJcbiAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIGJsb2JzIG9mZnNldCB0YWJsZSBpbiB0aGUgdmVjdG9yIGNhc2Ugd2lsbCBhbHdheSBjb250YWluIG9ubHkgb25lIHZhbHVlIGVxdWFscyB0byAwXHJcbiAgICAgICAgLy8gc2luY2UgdGhlcmUgaXMgb25seSBvbmUgY29sbXMgaW4gdGhlIHZlY3RvclxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBkYXRhIGFycmF5XHJcbiAgICAgICAgbGV0IGRhdGE6IHN0cmluZztcclxuICAgICAgICBpZiAoaXNEYmNzQWxwaGEpIHtcclxuICAgICAgICAgIGRhdGEgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgPG51bWJlcj4odmVjU2l6ZSAqIHRoaXMuX2NlbGxTaXplKSk7XHJcbiAgICAgICAgICBwb3MgPSBwb3MgKyBkYXRhLmxlbmd0aCArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgZGF0YSA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj4odmVjU2l6ZSAqIHRoaXMuX2NlbGxTaXplKSk7XHJcbiAgICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIHZlY1NpemUgKiB0aGlzLl9jZWxsU2l6ZSArIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWxsb2NhdGUgdGhlIGRhdGFCdWZcclxuICAgICAgICB0aGlzLl9kYXRhQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PICYmIHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKVxyXG4gICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoZGF0YSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgIGxldCBudWxsQnVmOiBzdHJpbmcgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dmVjU2l6ZSk7XHJcbiAgICAgICAgcG9zID0gPG51bWJlcj4oPG51bWJlcj5wb3MgKyB2ZWNTaXplICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHNhdmUgdGhlIG51bGxCdWZcclxuICAgICAgICB0aGlzLl9udWxsQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIobnVsbEJ1Zik7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIHRoZSB0eXBlIG9mIHRoZSBjZWxsc1xyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiAmJiB0aGlzLl9jZWxsc0F0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2ZWNTaXplOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IG51bGxCdWYuY2hhckF0KGkpID4gJ1xcMCc7XHJcbiAgICAgICAgICAgIC8vIG51bWVyaWMgdHlwZSBhcmUgc2VudCBhcyBOVU1fVFlQRSBzbyB3ZSB0cmFuc2xhdGUgdGhlbSB0byBoZXhcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChkYXRhLnN1YnN0cig8bnVtYmVyPig8bnVtYmVyPmkgKiB0aGlzLl9jZWxsU2l6ZSksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpLCAyKSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTykge1xyXG4gICAgICAgICAgICAgIC8vIFFDUiA0Mjk0NDUgc2luY2UgdGhlIHZlY3RvciBpcyBlbmNvZGVkIHRvIGJhc2U2NC9oZXggd2hlbiBpdCBpcyByZWNpdmVkIGZyb20gdGhlXHJcbiAgICAgICAgICAgICAgLy8gc2VydmVyIHdlIG11c3QgdXNlIHRoZSBjb3JyZWN0IGNoYXItc2V0IHdoZW4gcmVjaXZpbmcgdmVjdG9yIG9mIGFscGhhIG9yIG1lbW8gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgICAgbGV0IGNlbGxEYXRhOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgaWYgKGlzRGJjc0FscGhhKVxyXG4gICAgICAgICAgICAgICAgY2VsbERhdGEgPSBVdGlsU3RyQnl0ZU1vZGUubWlkQihkYXRhLCA8bnVtYmVyPig8bnVtYmVyPmkgKiB0aGlzLl9jZWxsU2l6ZSksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGNlbGxEYXRhID0gZGF0YS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj5pICogdGhpcy5fY2VsbFNpemUpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuY29kaW5nICE9PSBudWxsICYmICFpc0ZsYXREYXRhVHJhbnNsYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGJhOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgY2VsbERhdGEgPSB0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmEsIDAsIGJhLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChjZWxsRGF0YSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgICAgICAgICBsZXQgY2VsbERhdGE6IHN0cmluZyA9IGRhdGEuc3Vic3RyKDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCBiYTogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyhjZWxsRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBjZWxsRGF0YSA9IEVuY29kaW5nLlVuaWNvZGUuR2V0U3RyaW5nKGJhLCAwLCBiYS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChjZWxsRGF0YSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGRhdGEuc3Vic3RyKDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSksIGlzTnVsbCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGluIGNhc2Ugb2YgdmVjdG9ycyBvcmYgdmVjdG9ycyBvciB2ZWN0b3JzIG9mIGJsb2JzIHdlIG5lZWQgdG8gdHJlYXQgdGhlbSBkaWZmZXJlbnRsbHlcclxuICAgICAgICAgIC8vIGVhY2ggYmxvYiBvciB2ZWN0b3IgaXMgXCJmbGF0dGVuZWQgaW4gdGhlIGVuZCBvZiB0aGUgbnVsbCBidWZmXHJcbiAgICAgICAgICAvLyBhcyBhIHN0cmluZyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcclxuICAgICAgICAgIC8vIEJsb2JfU2l6ZSxPYmpIYW5kbGUsVmFyaWFudElkeCxUeXBlLFZlY0NlbGxBdHRyLC4uLi5kYXRhLi4uLjtuZXh0X2Jsb2I7XHJcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgZXIgYSBibG9iIGNvbWUgdG8gdGhlIGNsaWVudCBub3kgdmlhIHZlY3RvciBpdHMgZm9ybWF0IGlzOlxyXG4gICAgICAgICAgLy8gT2JqSGFuZGxlLFZhcmlhbnRJZHgsVHlwZSxWZWNDZWxsQXR0cjtkYXRhIHRoZXJlIGZvciB3ZSBuZWVkIHRvIG1ha2UgdGhlIGFkanVzdG1lbnRzXHJcbiAgICAgICAgICAvLyBpbiB0aGUgcGFyc2luZyBwcm9jZXNzIGFuZCBpbiB2ZWNHZXQgYW5kIGluIHRvU3RyaW5nXHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmVjU2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG4gICAgICAgICAgICB0b2tlbklkeCA9IDA7XHJcblxyXG4gICAgICAgICAgICAvLyBwYXJzZSBibG9iIHNpemVcclxuICAgICAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICAgICAgbGV0IHNpemU6IG51bWJlciA9IDxudW1iZXI+Tk51bWJlci5QYXJzZShjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIGJsb2IgaGVhZGVyXHJcbiAgICAgICAgICAgIGxldCBibG9iSGVhZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgR3VpQ29uc3RhbnRzLkJMT0JfUFJFRklYX0VMRU1FTlRTX0NPVU5UOyBqKyspIHtcclxuICAgICAgICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgICAgICAgYmxvYkhlYWRlciA9IGJsb2JIZWFkZXIgKyBjdXJyZW50VG9rZW47XHJcbiAgICAgICAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGogIT09IEd1aUNvbnN0YW50cy5CTE9CX1BSRUZJWF9FTEVNRU5UU19DT1VOVCAtIDEpIHtcclxuICAgICAgICAgICAgICAgIGJsb2JIZWFkZXIgPSBibG9iSGVhZGVyICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY2VsbERhdGE6IHN0cmluZyA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj5zaXplKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgY2VsbCB0byB0aGUgdmVjXHJcbiAgICAgICAgICAgIGxldCBpc051bGw6IGJvb2xlYW4gPSBudWxsQnVmLmNoYXJBdChpKSA+ICdcXDAnO1xyXG4gICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChjZWxsRGF0YSwgaXNOdWxsLCBibG9iSGVhZGVyKSk7XHJcbiAgICAgICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgc2l6ZSArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBkYXRhQnVmIHdhcyBub3QgYnVpbHQgZHVyaW5nIFwiY2VsbHMgZ3Jvd3RoXCIgLSBhbGxvY2F0ZSBpdCByaWdodCBub3csIGluIG9uZS1zaG90LlxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhQnVmLkxlbmd0aCA9PT0gMClcclxuICAgICAgICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcihkYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gVmVjdG9yVHlwZS5pbml0IHdyb25nIHZlY3RvciBmb3JtYXRcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGEgZmxhdHRlbiBibG9iIHN0cmluZyByZXByZXNlbnRhdGlvbiB3ZSBhc3N1bWUgaGVyZSB0aGF0IGFsbCBjaGFuZ2VzIGFyZSBkeW5hbWljYWxseSBzYXZlIGludG8gdGhlXHJcbiAgLy8vICAgYnVmZnMgZWFjaCB0aW1lIHRoZSB2ZWN0b3IgY2hhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIGxldCByZXM6IHN0cmluZyA9IFwiXCI7IC8vIHRha2VcclxuXHJcbiAgICAvLyBsYXp5IGV2YWx1YXRpb24gaWYgdGhlIHZlY3RvciB3YXMgbm90IGluaXRpYWxpemVkIGl0IHdhc24ndCBjaGFuZ2VkIHNvIHJldHVybiB0aGUgb3JpZ2luYWxcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICAvLyBidWlsZCB0aGUgaGVhZGVyc1xyXG4gICAgICByZXMgPSByZXMgKyAwICsgXCIsXCIgKyAwICsgXCIsXCIgKyBcIjBcIiArIFwiLFwiICsgPHN0cmluZz50aGlzLl9jZWxsc0F0dHIgKyBcIixcIiArIHRoaXMuX2NlbGxDb250ZW50VHlwZSArIFwiO1wiO1xyXG4gICAgICAvLyB0aGUgYmxvYiBoZWFkZXIgb2YgdGhpcyBibG9iXHJcbiAgICAgIHJlcyA9IHJlcyArIHRoaXMuYnVpbGRIZWFkZXJzU3RyaW5nKCk7XHJcbiAgICAgIC8vICsgZGF0YUJ1Zi50b1N0cmluZygpICsgXCIsXCIgKyBudWxsQnVmLnRvU3RyaW5nKCkgKyBcIixcIjtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkge1xyXG4gICAgICAgIGxldCBkYXRhQnVmQ2hhckFycnk6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4odGhpcy5fZGF0YUJ1Zi5MZW5ndGggKiAyKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2RhdGFCdWYuTGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgIGRhdGFCdWZDaGFyQXJyeVtpICogMl0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCh0aGlzLl9kYXRhQnVmLmdldF9JdGVtKGkpLmNoYXJDb2RlQXQoMCkpICUgMjU2KTtcclxuICAgICAgICAgIGRhdGFCdWZDaGFyQXJyeVtpICogMiArIDFdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgodGhpcy5fZGF0YUJ1Zi5nZXRfSXRlbShpKS5jaGFyQ29kZUF0KDApKSAvIDI1Nik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcyA9IHJlcyArIE5TdHJpbmcuRnJvbUNoYXJzKGRhdGFCdWZDaGFyQXJyeSkgKyBcIixcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVzID0gcmVzICsgdGhpcy5fZGF0YUJ1ZiArIFwiLFwiO1xyXG5cclxuICAgICAgcmVzID0gcmVzICsgdGhpcy5fbnVsbEJ1ZiArIFwiLFwiO1xyXG5cclxuICAgICAgLy8gaW4gYmxvYnMgYW5kIHZlY3RvciB3ZSBkbyBub3QgdXBkYXRlXHJcbiAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgcmVzID0gcmVzICsgdGhpcy5nZXRCbG9ic0J1ZigpO1xyXG5cclxuICAgICAgcmVzID0gcmVzICsgVmVjdG9yVHlwZS5CTE9CX1RBQkxFX1NUUjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmVzID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNlbGxzIGF0dHJpYnV0ZSAoIHRoZSBzYW5lIGZvciBhbGwgY2VsbHMgaW4gdGhlIHZlY3RvcilcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENlbGxzQXR0cigpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpXHJcbiAgICAgIHJldHVybiBWZWN0b3JUeXBlLmdldENlbGxzQXR0cih0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuX2NlbGxzQXR0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjZWxscyBzaXplICggc2FtZSBzaXplIGZvciBhbGwgY2VsbHMpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDZWxsU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldFZhbDogbnVtYmVyO1xyXG5cclxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpXHJcbiAgICAgIHJldFZhbCA9IFZlY3RvclR5cGUuZ2V0Q2VsbFNpemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxTaXplO1xyXG5cclxuICAgIC8vIHVuaWNvZGUgY2VsbCBzaXplIGlzIHNhdmVkIGludGVybmFsbHkgYXMgYnl0ZSBsZW5ndGggc2luY2UgdGhhdCBpcyB0aGUgd2F5IHRoZSBzZXJ2ZXIgc2F2ZSBpdFxyXG4gICAgaWYgKHRoaXMuZ2V0Q2VsbHNBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSlcclxuICAgICAgcmV0VmFsID0gTWF0aC5mbG9vcihyZXRWYWwgLyAyKTtcclxuXHJcbiAgICByZXR1cm4gcmV0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZlY3RvciBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRWZWNTaXplKCk6IG51bWJlciB7XHJcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKVxyXG4gICAgICByZXR1cm4gVmVjdG9yVHlwZS5nZXRWZWNTaXplKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gPG51bWJlcj50aGlzLl9jZWxscy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgYSBnaXZlIGNlbGwgY2VsbHMgaW5kZXhlcyBzdGFydCBmcm9tIDEgd3JvbmcgaW5kZXhlcyBvciBpbmRleGVzIHRoZSBkb2VzIG5vdCBleGlzdFxyXG4gIC8vLyAgIHdpbGwgcmV0dXJuIGRlZmF1bHQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGNlbGwgaW5kZXg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNlbGwgdmFsdWUgVE9ETzogeWFyaXYgY2hlY2sgd2l0aCByaW5hIHdoYXQgd2Ugc2hvdWxkIGRvIHdpdGhcclxuICAvLy8gICBibG9icyBleHRyYSBmaWVsZHNcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldFZlY0NlbGwoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJldFZhbDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChpZHggPiAwKSB7XHJcbiAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgICBpZiAoPG51bWJlcj5pZHggPD0gdGhpcy5nZXRWZWNTaXplKCkpIHtcclxuICAgICAgICByZXRWYWwgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpZHggLSAxKS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4IC0gMSkuYmxvYkZpZWxkUHJlZml4ICsgXCI7XCIgKyByZXRWYWw7XHJcblxyXG4gICAgICAgIC8vIFFDUiA1MDM2OTEgdGhlIHZhbHVlIG9mIHRydWUgb3IgZmFsc2UgaW4gdGhlIHNlcnZlciBhcmUgdGhlIG51bWVyaWMgdmFsdWVzIG9mIDEgYW5kIDBcclxuICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodGhpcy5fY2VsbHNBdHRyKSlcclxuICAgICAgICAgIHJldFZhbCA9ICgocmV0VmFsLmNoYXJBdCgwKSA9PT0gJ1xcMCcpID8gXCIwXCIgOiBcIjFcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxscy5nZXRfSXRlbShpZHggLSAxKS5pc051bGwpXHJcbiAgICAgICAgICByZXRWYWwgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKCF0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpXHJcbiAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHNEZWZhdWx0VmFsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgY2VsbCB2YWx1ZXMgb2YgYSB2ZWN0b3IgaW4gc3RyaW5nIGFycmF5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDZWxsVmFsdWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIGxldCByZXRWYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgY2VsbFZhbHVlczogc3RyaW5nW10gPSBudWxsO1xyXG5cclxuICAgIHRoaXMuaW5pdCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmdldFZlY1NpemUoKSA+IDApXHJcbiAgICB7XHJcbiAgICAgIGNlbGxWYWx1ZXMgPSBuZXcgQXJyYXk8c3RyaW5nPih0aGlzLmdldFZlY1NpemUoKSk7XHJcblxyXG4gICAgICAvLyBHZXQgdGhlIHZlY3RvciB2YWx1ZVxyXG4gICAgICBmb3IgKGxldCBpZHg6IG51bWJlciA9IDA7IGlkeCA8IHRoaXMuZ2V0VmVjU2l6ZSgpOyBpZHgrKylcclxuICAgICAge1xyXG4gICAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCkuZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCkuYmxvYkZpZWxkUHJlZml4ICsgXCI7XCIgKyByZXRWYWw7XHJcblxyXG4gICAgICAgIC8vIFFDUiA1MDM2OTEgdGhlIHZhbHVlIG9mIHRydWUgb3IgZmFsc2UgaW4gdGhlIHNlcnZlciBhcmUgdGhlIG51bWVyaWMgdmFsdWVzIG9mIDEgYW5kIDBcclxuICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodGhpcy5fY2VsbHNBdHRyKSlcclxuICAgICAgICAgIHJldFZhbCA9ICgocmV0VmFsLmNoYXJBdCgwKSA9PT0gJ1xcMCcpID8gXCIwXCIgOiBcIjFcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxscy5nZXRfSXRlbShpZHgpLmlzTnVsbClcclxuICAgICAgICAgIHJldFZhbCA9IG51bGw7XHJcblxyXG4gICAgICAgIGNlbGxWYWx1ZXNbaWR4XSA9IHJldFZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgIHtcclxuICAgICAgICBjZWxsVmFsdWVzID0gW1xyXG4gICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2VsbFZhbHVlcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbnNlcnRzIG9yIGNoYW5nZXMgYSBjZWxscyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgY2VsbCBpbmRleCBpZiB0aGUgaW5kZXggaXMgbm90IHNlcXVlbnRpYWwgY3JlYXRzIGVtcHR5IGNlbGwgdGlsbCB0aGUgaW5kZXg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj50aGUgbmV3IHZhbHVlICggaWYgaXQgaXMgYSBibG9iIHR5cGUgb3IgdmVjdG9yIGl0IGNvbnRhaW5zIHRoZSBwcmVmaXggb2YgdGhlIGNvbnRyb2wgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1bnM+ICBmYWxzZSBpZiB0aGUgaW5kZXggaXMgd3Jvbmcgb3IgdGhlIHZlY3RvciBpbGxmb3JtZWQgPC9yZXR1bnM+XHJcbiAgc2V0VmVjQ2VsbChpZHg6IG51bWJlciwgbmV3VmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3JlYXRlQnVmZmVyVmFsRm9yTnVtVHlwZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoaWR4ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgICAgICBsZXQgbG9jYWxDZWxsU2l6ZTogbnVtYmVyID0gKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IE1hdGguZmxvb3IodGhpcy5fY2VsbFNpemUgLyAyKSA6IHRoaXMuX2NlbGxTaXplO1xyXG4gICAgICAgIC8vIHRyeWluZyB0byBzZXQgbnVsbCB2YWx1ZSB3aGVuIG5vdCBhbGxvd2VkXHJcbiAgICAgICAgaWYgKGlzTnVsbCAmJiAhdGhpcy5fYWxsb3dOdWxsKSB7XHJcbiAgICAgICAgICBpc051bGwgPSBmYWxzZTtcclxuICAgICAgICAgIG5ld1ZhbHVlID0gdGhpcy5fY2VsbHNEZWZhdWx0VmFsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkeCA8PSB0aGlzLl9jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAgIGxldCBjdXJyOiBDZWxsRWxlbWVudCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCAtIDEpO1xyXG4gICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBub3QgbnVsbFxyXG4gICAgICAgICAgaWYgKCFpc051bGwpIHtcclxuICAgICAgICAgICAgLy8gc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGJsb2JzIGFuZCB2ZWN0b3JzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgdGhlIGRhdGEgaW4gdGhlIGNlbGxcclxuICAgICAgICAgICAgICBsZXQgYmxvYlByZWZpeExlbmd0aDogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aChuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgY3Vyci5ibG9iRmllbGRQcmVmaXggPSBuZXdWYWx1ZS5zdWJzdHIoMCwgYmxvYlByZWZpeExlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0cmVhdCBlbXB0eSBibG9iXHJcbiAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+IGJsb2JQcmVmaXhMZW5ndGgpXHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBuZXdWYWx1ZS5zdWJzdHIoYmxvYlByZWZpeExlbmd0aCk7XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzaW1wbGUgdHlwZVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBRQ1IgNTAzNjkxIHRoZSB2YWx1ZSBvZiB0cnVlIG9yIGZhbHNlIGluIHRoZSBzZXJ2ZXIgYXJlIHRoZSBudW1lcmljIHZhbHVlcyBvZiAxIGFuZCAwXHJcbiAgICAgICAgICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVMb2dpY2FsKHRoaXMuX2NlbGxzQXR0cikpIHtcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihuZXdWYWx1ZSkgPyBuZXcgU3RyaW5nQnVpbGRlcigpLkFwcGVuZCgxKS5Ub1N0cmluZygpIDogbmV3IFN0cmluZ0J1aWxkZXIoKS5BcHBlbmQoJ1xcMCcpLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBjdXJyLmRhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IG5ld1ZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAvLyBudW1lcmljIHR5cGVzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgZGF0YSBidWYgYXMgbnVtIHR5cGUgc28gd2VcclxuICAgICAgICAgICAgICAvLyB0cmFuc2xhdGUgdGhlbSBiZWZvcmUgaW5zZXJ0aW5nIHRoZW0gdG8gdGhlIGJ1ZlxyXG4gICAgICAgICAgICAgIGxldCBkYXRhQnVmVmFsOiBzdHJpbmcgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgICAgICAgICBkYXRhQnVmVmFsID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKGRhdGFCdWZWYWwpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhRGF0YUJ1ZjogVWludDhBcnJheSA9IHRoaXMuX2VuY29kaW5nLkdldEJ5dGVzKHRoaXMuX2RhdGFCdWYuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmFEYXRhQnVmVmFsOiBVaW50OEFycmF5ID0gdGhpcy5fZW5jb2RpbmcuR2V0Qnl0ZXMoZGF0YUJ1ZlZhbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGRhdGEgYnVmXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYmFEYXRhQnVmVmFsLmxlbmd0aCAmJiA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgIGJhRGF0YUJ1Zls8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaV0gPSBiYURhdGFCdWZWYWxbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGtlZXAgdGhlIHdob2xlIHNpemUgb2YgdGhlIGFscGhhXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBiYURhdGFCdWZWYWwubGVuZ3RoOyA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgIGJhRGF0YUJ1Zls8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaV0gPSAoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSkgPyAzMiA6IDApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcih0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmFEYXRhQnVmLCAwLCBiYURhdGFCdWYubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSB0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmFEYXRhQnVmLCA8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpLCA8bnVtYmVyPmxvY2FsQ2VsbFNpemUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhIGJ1ZlxyXG4gICAgICAgICAgICAgICAgLy8gUUNSIDk4Nzk0MyB0cmltIHRoZSB2YWx1ZSBpZiBpdCBpcyBsb25nZXIgdGhlIHRoZSBjZWxsIGxlbmd0aFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGFCdWZWYWwubGVuZ3RoICYmIDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5zZXRfSXRlbSg8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaSwgZGF0YUJ1ZlZhbC5jaGFyQXQoaSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGluIGFscGhhIGFuZCBudW0gdHlwZSB3ZSBkbyBub3Qga2VlcCB0aGUgd2hvbGUgc2l6ZSBvZiB0aGUgYWxwaGEvTlVNX1RZUEVcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGRhdGFCdWZWYWwubGVuZ3RoOyA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuc2V0X0l0ZW0oPG51bWJlcj4oPG51bWJlcj4oaWR4IC0gMSkgKiBsb2NhbENlbGxTaXplKSArIGksICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gJyAnIDogJ1xcMCcpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFFDUiA5ODc5NDMgdHJpbSB0aGUgdmFsdWUgaWYgaXQgaXMgbG9uZ2VyIHRoZSB0aGUgY2VsbCBsZW5ndGhcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pXHJcbiAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRoaXMuX2RhdGFCdWYuVG9TdHJpbmcoKS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj4oaWR4IC0gMSkgKiBsb2NhbENlbGxTaXplKSwgPG51bWJlcj5sb2NhbENlbGxTaXplKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLnNldF9JdGVtKGlkeCAtIDEsICdcXDAnKTtcclxuICAgICAgICAgICAgY3Vyci5pc051bGwgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgbnVsbFxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnIuZGF0YSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHByZWZpeCBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJsb2IgaXMgdmVjdG9yIG9yIG5vdFxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgICAgIGN1cnIuYmxvYkZpZWxkUHJlZml4ID0gQmxvYlR5cGUuZ2V0RW1wdHlCbG9iUHJlZml4KCdcXHUwMDAxJyk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBjdXJyLmJsb2JGaWVsZFByZWZpeCA9IEJsb2JUeXBlLmdldEVtcHR5QmxvYlByZWZpeCgnXFwwJyk7XHJcbiAgICAgICAgICAgIGN1cnIuaXNOdWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fbnVsbEJ1Zi5zZXRfSXRlbShpZHggLSAxLCAnXFx1MDAwMScpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVsZXZhbnQgb25seSBmb3Igbm9uZSBibG9ic1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5zZXRfSXRlbSg8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaSwgJ1xcMCcpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLnNldF9JdGVtKGlkeCAtIDEsICdcXHUwMDAxJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBuZXcgcmVjb3JkXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaW5zZXJ0VmFsOiBzdHJpbmc7XHJcbiAgICAgICAgICAvLyBjaG9vc2VzIHRoZSB2YWx1ZSBpbnNlcnRlZCB0byB0aGUgc2tpcHBlZCBjZWxsc1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgdGhlIGlzIHZlY3RvciBmbGFnXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgICAgICAgaW5zZXJ0VmFsID0gQmxvYlR5cGUuZ2V0RW1wdHlCbG9iUHJlZml4KCdcXHUwMDAxJyk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBpbnNlcnRWYWwgPSBCbG9iVHlwZS5nZXRFbXB0eUJsb2JQcmVmaXgoJ1xcMCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpXHJcbiAgICAgICAgICAgICAgaW5zZXJ0VmFsID0gaW5zZXJ0VmFsICsgdGhpcy5fY2VsbHNEZWZhdWx0VmFsOyAvLyBjb25jYXQgcmVnb2xhciBibG9iIGNudHJvbCBkYXRhXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpXHJcbiAgICAgICAgICAgIGluc2VydFZhbCA9IG51bGw7XHJcbiAgICAgICAgICAvLyBzaW1wbGUgbnVsbCB2YWx1ZVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpbnNlcnRWYWwgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7IC8vIGRlZmF1bHQgc2ltcGxlIHZhbHVlXHJcblxyXG4gICAgICAgICAgLy8gUUNSIDUwMzY5MSB0aGUgdmFsdWUgb2YgdHJ1ZSBvciBmYWxzZSBpbiB0aGUgc2VydmVyIGFyZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgMSBhbmQgMFxyXG4gICAgICAgICAgaWYgKGluc2VydFZhbCAhPT0gbnVsbCAmJiBTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlTG9naWNhbCh0aGlzLl9jZWxsc0F0dHIpKVxyXG4gICAgICAgICAgICBpbnNlcnRWYWwgPSAoRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4oaW5zZXJ0VmFsKSA/IG5ldyBTdHJpbmdCdWlsZGVyKCkuQXBwZW5kKCdcXHUwMDAxJykuVG9TdHJpbmcoKSA6IG5ldyBTdHJpbmdCdWlsZGVyKCkuQXBwZW5kKCdcXDAnKS5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAvLyBjcmVhdGUgc2tpcHBlZCByZWNvcmRzXHJcbiAgICAgICAgICAvLyB3aGVuIGEgdmVjdG9yIGNlbGwgaXMgc2V0ICwgaWYgdGhlIGNlbGwgaXMgYmV5b25kIHRoZSBleGlzdGluZyB2ZWN0b3IuXHJcbiAgICAgICAgICAvLyB3ZSB3aWxsIGZpbGwgdGhlIGNlbGxzIGJldHdlZW4gdmVjdG9yIHNpemUgYW5kIHNldCBjZWxsIHdpdGggZGVmYXVsdCB2YWx1ZS5cclxuICAgICAgICAgIC8vIGZvciBleGFtcGxlIDogaWYgdmVjdG9yIHNpemUgaXMgMCwgYW5kIHdlIGRvIHZlY3NldCAodmVjWzVdKS4gY2VsbCA1IG5lZWRzIHRvIGJlIHNldFxyXG4gICAgICAgICAgLy8gd2l0aCB0aGUgdmFsdWUuIGNlbGxzIDEgdG8gNCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHNldCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLlxyXG4gICAgICAgICAgbGV0IGRhdGFCdWZWYWw6IHN0cmluZyA9IGluc2VydFZhbDtcclxuXHJcbiAgICAgICAgICB3aGlsZSAodGhpcy5fY2VsbHMubGVuZ3RoIDwgaWR4KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChpbnNlcnRWYWwuc3Vic3RyKFZlY3RvclR5cGUuRU1QVFlfQkxPQl9QUkVGSVhfTEVOKSwgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0LCBpbnNlcnRWYWwuc3Vic3RyKDAsIFZlY3RvclR5cGUuRU1QVFlfQkxPQl9QUkVGSVhfTEVOKSkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKHRoaXMuZ2V0TnVsbFN0cmluZyhWZWN0b3JUeXBlLkJMT0JfVFlQRV9TVFJVQ1RfU0laRSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGluc2VydFZhbCwgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0KSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBidWZcclxuICAgICAgICAgICAgICBpZiAoaW5zZXJ0VmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBudW1lcmljIHR5cGVzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgZGF0YSBidWYgYXMgbnVtIHR5cGUgc28gd2VcclxuICAgICAgICAgICAgICAgIC8vIHRyYW5zbGF0ZSB0aGVtIGJlZm9yZSBpbnNlcnRpbmcgdGhlbSB0byB0aGUgYnVmXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUJ1ZmZlclZhbEZvck51bVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgdmFsdWUgZm9yIG51bSB0eXBlIG9ubHkgb25jZSwgYW5kIHVzZSBpdFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGFsbCB0aGUgY2VsbHMgdG8gYmUgaW5pdGlhbGl6ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gdGhlIHRyYW5zbGF0aW9uIG9ubHkgb25jZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLlxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUJ1ZmZlclZhbEZvck51bVR5cGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhQnVmVmFsID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKGluc2VydFZhbCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkYXRhQnVmVmFsIGVpdGhlciBjb250YWlucyBvcmlnaW5hbCBpbnNlcnRWYWwsIG9yIGEgc3RyaW5nIG9mXHJcbiAgICAgICAgICAgICAgICAvLyBieXRlU3RyZWFtIGZvciBudW0gdHlwZXMuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLkFwcGVuZChkYXRhQnVmVmFsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBhbHdheSBrZWVwIHRoZSB3aG9sZSBhbHBoYVxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbExlbjogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTykpXHJcbiAgICAgICAgICAgICAgICAgIHZhbExlbiA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKGRhdGFCdWZWYWwpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB2YWxMZW4gPSBkYXRhQnVmVmFsLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB2YWxMZW47IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgPyAnICcgOiAnXFwwJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKHRoaXMuZ2V0TnVsbFN0cmluZyhsb2NhbENlbGxTaXplKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbnVsbCBidWZcclxuICAgICAgICAgICAgdGhpcy5fbnVsbEJ1Zi5JbnNlcnQodGhpcy5fY2VsbHMubGVuZ3RoIC0gMSxcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPyAnXFx1MDAwMScgOiAnXFwwJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHZlY3RvciBoYXMgYmVlbiBmaWxsZWQgdGlsbCB0aGUgcmVxdWVzdGVkIGlkeC5cclxuICAgICAgICAgIC8vIG5vdyBpdHMgdGltZSB0byBzZXQgdGhlIHJlcXVlc3RlZCBjZWxsLlxyXG4gICAgICAgICAgcmVzID0gdGhpcy5zZXRWZWNDZWxsKGlkeCwgbmV3VmFsdWUsIGlzTnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgcmVzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoYW5nZSB0aGUgdmVjdG9yIHRvIGZpdCB0aGUgZGVmaW5pdGlvbnMgb2YgYSBkaWZmZXJlbnQgdmVjdG9yIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZFwiPnRoZSBuZXcgZmllbGQ8L3BhcmFtPlxyXG4gIGFkanVzdFRvRml0KGZpZWxkOiBGaWVsZERlZik6IHZvaWQge1xyXG4gICAgaWYgKGZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICBsZXQgc3JjQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0Q2VsbHNBdHRyKCk7XHJcbiAgICAgIGxldCBkc3RBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gZmllbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVGhlU2FtZVR5cGUoc3JjQXR0ciwgZHN0QXR0cikpIHtcclxuICAgICAgICB0aGlzLmluaXQoKTtcclxuXHJcbiAgICAgICAgLy8gdHJpbSBkYXRhIGlmIG5lZWRlZCAoIG9ubHkgZm9yIGFscGhhIG9yIG1lbW8pXHJcbiAgICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZShzcmNBdHRyKSAmJiBTdG9yYWdlQXR0cmlidXRlQ2hlY2suSXNUeXBlQWxwaGFPclVuaWNvZGUoZHN0QXR0cikpIHtcclxuICAgICAgICAgICAgbGV0IGRzdFNpemVJbkNoYXJzOiBudW1iZXIgPSBmaWVsZC5nZXRWZWNDZWxsc1NpemUoKTtcclxuICAgICAgICAgICAgbGV0IHNyY1NpemVJbkNoYXJzOiBudW1iZXIgPSAoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IE1hdGguZmxvb3IodGhpcy5fY2VsbFNpemUgLyAyKSA6IHRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgIGxldCBpc0J5dGVNb2RlOiBib29sZWFuID0gVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlQWxwaGEoZHN0QXR0cik7XHJcblxyXG4gICAgICAgICAgaWYgKHNyY1NpemVJbkNoYXJzICE9PSBkc3RTaXplSW5DaGFycykge1xyXG4gICAgICAgICAgICBsZXQgYWRqRGF0YTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBnb2VzIG92ZXIgYWxsIGNlbGxzIGluIHRoZSB2ZWN0b3JcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRzdFNpemVJbkNoYXJzOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgICBsZXQgY3VycjogQ2VsbEVsZW1lbnQgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpKTtcclxuICAgICAgICAgICAgICAvLyB0cmltIGlzIG5lZWRlZFxyXG4gICAgICAgICAgICAgIGlmICghY3Vyci5pc051bGwpIHsgLy8gdW5pY29kZSBjZWxsIHNpemUgYXJlIHNhdmVkIGludGVybmFsbHkgYXMgYnl0ZSBsZW5ndGggd2hpbGUgdGhlIGZpZWxkIHJldHVybnMgY2hhclxyXG4gICAgICAgICAgICAgICAgLy8gbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICBpZiAoc3JjU2l6ZUluQ2hhcnMgPiBkc3RTaXplSW5DaGFycykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXNCeXRlTW9kZSlcclxuICAgICAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIoY3Vyci5kYXRhLCBkc3RTaXplSW5DaGFycyk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBjdXJyLmRhdGEuc3Vic3RyKDAsIGRzdFNpemVJbkNoYXJzKTtcclxuICAgICAgICAgICAgICAgICAgYWRqRGF0YS5BcHBlbmQoY3Vyci5kYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgaXMgbmVlZGVkXHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRtcERhdGE6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgICAgICAgICAgICB0bXBEYXRhLkFwcGVuZChjdXJyLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZGF0YUxlbjogbnVtYmVyID0gaXNCeXRlTW9kZSA/IFV0aWxTdHJCeXRlTW9kZS5sZW5CKGN1cnIuZGF0YSkgOiBjdXJyLmRhdGEubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgLy8gcGFkIHdpdGggYmxhbmtzXHJcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IGRhdGFMZW47IGogPCBkc3RTaXplSW5DaGFyczsgaiA9IGogKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgIHRtcERhdGEuQXBwZW5kKCcgJyk7XHJcbiAgICAgICAgICAgICAgICAgIGFkakRhdGEuQXBwZW5kKHRtcERhdGEuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGRhdGEgaW4gdGhlIHZlY3RvciBjZWxsXHJcbiAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRtcERhdGEuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG1wRGF0YTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgZHN0U2l6ZUluQ2hhcnM7IGogPSBqICsgMSlcclxuICAgICAgICAgICAgICAgICAgdG1wRGF0YS5BcHBlbmQoJ1xcMCcpO1xyXG4gICAgICAgICAgICAgICAgYWRqRGF0YS5BcHBlbmQodG1wRGF0YS5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGRhdGEgaW4gdGhlIHZlY3RvciBjZWxsXHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSB0bXBEYXRhLlRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Ly8gZW5kIGxvb3BcclxuICAgICAgICAgICAgdGhpcy5fZGF0YUJ1ZiA9IGFkakRhdGE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBRQ1IgNzQ3ODAxIGluIHRoZSBmaWxlZCB0aGUgc2l6ZSBvZiBudW1lcmljL2RhdGUvdGltZSBpcyB0aGllciBoZXggc2l6ZVxyXG4gICAgICAgIC8vIHdoZXJlYXMgaGVyZSBpdCBpcyB0aGVpciBOVU1fVFlQRSBzaXplXHJcbiAgICAgICAgbGV0IG5ld1NpemU6IG51bWJlciA9IGZpZWxkLmdldFZlY0NlbGxzU2l6ZSgpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIGhlYWRlcnMgZGF0YSBzdWNoIGFzIGNlbGwgdHlwZSBhbmQgY2VsbHMgc2l6ZVxyXG4gICAgICAgIHRoaXMuX2NlbGxzQXR0ciA9IGZpZWxkLmdldENlbGxzVHlwZSgpO1xyXG4gICAgICAgIHRoaXMuX2NlbGxTaXplID0gPG51bWJlcj4oKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IChuZXdTaXplICogMikgOiBuZXdTaXplKTtcclxuICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBmaWVsZC5nZXRDZWxsRGVmdWFsdFZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0ID0gZmllbGQuaXNOdWxsRGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuX2FsbG93TnVsbCA9IGZpZWxkLk51bGxBbGxvd2VkO1xyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsZmxhdERhdGEgPSB0aGlzLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBWZWN0b3JUeXBlLmFkanVzdFRvRml0IHZlY3RvciBiYXNpYyB0eXBlcyBkb2VzIG5vdCBhZ3JlZVwiKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gIFZlY3RvclR5cGUuYWRqdXN0VG9GaXQgXCIgKyBmaWVsZC5nZXROYW1lKCkgKyBcIiBpcyBub3Qgb2YgdHlwZSB2ZWN0b3JcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRoZSB2ZWMgc2l6ZSBpbiB0aGUgaGVhZGVycyBidWZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIG5ldyBzaXplPC9wYXJhbT5cclxuICBwcml2YXRlIGJ1aWxkSGVhZGVyc1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogc3RyaW5nID0gVmVjdG9yVHlwZS5CTE9CX1RBQkxFX1NUUiArIFZlY3RvclR5cGUuVkVDVE9SX1NUUiArIFwiLFwiICsgVmVjdG9yVHlwZS5WRVJTSU9OICsgXCIsXCIgKyAxICsgXCIsXCIgKyA8c3RyaW5nPnRoaXMuX2NlbGxzQXR0ciArIFwiLFwiO1xyXG4gICAgcmVzID0gcmVzICsgdGhpcy5fY2VsbFNpemUgKyBcIixcIjtcclxuXHJcbiAgICAvLyBhcHBlbmQgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgIGxldCBkZWY6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5fY2VsbHNEZWZhdWx0VmFsICE9PSBudWxsKVxyXG4gICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgZGVmID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKHRoaXMuX2NlbGxzRGVmYXVsdFZhbCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBkZWYgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7XHJcblxyXG4gICAgLy8gaW4gc3RyaW5nIHdlIGRvIG5vdCBrZWVwIHRoZSBmdWxsIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJyd29zZXIgY2xpZW50XHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSlcclxuICAgICAgZGVmID0gZGVmICsgdGhpcy5nZXRFbXB0eVN0cmluZyh0aGlzLl9jZWxsU2l6ZSAtIDxudW1iZXI+VXRpbFN0ckJ5dGVNb2RlLmxlbkIoZGVmKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGRlZiA9IGRlZiArIHRoaXMuZ2V0RW1wdHlTdHJpbmcodGhpcy5fY2VsbFNpemUgLSA8bnVtYmVyPmRlZi5sZW5ndGgpO1xyXG5cclxuICAgIC8vIGNvbnRpbnVlIGJ1aWxkaW5nIHRoZSBoZWFkZXJzXHJcbiAgICByZXMgPSByZXMgKyBkZWYgKyBcIixcIiArICh0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPyBcIjFcIiA6IFwiMFwiKSArIFwiLFwiO1xyXG4gICAgcmVzID0gcmVzICsgKHRoaXMuX2FsbG93TnVsbCA/IFwiMVwiIDogXCIwXCIpICsgXCIsXCIgKyB0aGlzLl9jZWxsU2l6ZSArIFwiLFwiICsgdGhpcy5fY2VsbHMubGVuZ3RoICsgXCIsXCI7XHJcbiAgICByZXMgPSByZXMgKyAoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBcIjFcIiA6IFwiMFwiKSArIFwiLFwiO1xyXG5cclxuICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgIHJlcyA9IHJlcyArIFwiMCxcIjtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJucyBhIHN0cmluZyB3aXRoIHNpemUgbnVsbCBjaGFyZWN0ZXJzXHJcbiAgcHJpdmF0ZSBnZXROdWxsU3RyaW5nKHNpemU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzaXplOyBpID0gaSArIDEpXHJcbiAgICAgIHJlcy5BcHBlbmQoJ1xcMCcpO1xyXG4gICAgcmV0dXJuIHJlcy5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJucyBhIHN0cmluZyB3aXRoIHNpemUgYmxhbmsgY2hhcmVjdGVyc1xyXG4gIHByaXZhdGUgZ2V0RW1wdHlTdHJpbmcoc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXM6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNpemU7IGkgPSBpICsgMSlcclxuICAgICAgcmVzLkFwcGVuZCgnICcpO1xyXG4gICAgcmV0dXJuIHJlcy5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdvZXMgb3ZlciB0aGUgY2VsbHMgb2YgdGhlIHZlY3RvcnMgYW5kIGJ1aWxkcyB0aGUgZGF0YSBidWYgb2YgYmxvYnMgc2luY2UgaXQgaXMgdGhlIG9ubHkgdGhpbmcgbm90XHJcbiAgLy8vICAgdXBkYXRlZCBkeW5hbWljYWxseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRCbG9ic0J1ZigpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fY2VsbHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGRhdGE6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGxldCBibG9iU2l6ZTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGN1cnI6IENlbGxFbGVtZW50ID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICBpZiAoY3Vyci5kYXRhICE9PSBudWxsKSB7XHJcbiAgICAgICAgZGF0YSA9IGN1cnIuZGF0YTtcclxuICAgICAgICBibG9iU2l6ZSA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXMuQXBwZW5kKGJsb2JTaXplKTtcclxuICAgICAgcmVzLkFwcGVuZChcIixcIiArIGN1cnIuYmxvYkZpZWxkUHJlZml4ICsgXCIsXCIgKyBkYXRhICsgXCI7XCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChyZXMgKyBcIixcIik7XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgLyogc3RhdGljIHV0aWxpdHkgbWV0aG9kcyAqL1xyXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZXMgdGhlIGNlbGwgYXR0cmlidXRlIG9mIHRoZSB2ZWN0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlwiPmEgdmVjdG9yIGluIGEgZmxhdHRlbmVkIGZvcm1hdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhdHQgdGhlIHRoZSB2ZWN0b3IncyBjZWxscyBhdHRyaWJ1dGU8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldENlbGxzQXR0cihibG9iOiBzdHJpbmcpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIGlmIChWZWN0b3JUeXBlLnZhbGlkYXRlQmxvYkNvbnRlbnRzKGJsb2IpKSB7XHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKGJsb2IpKSwgXCIsXCIpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgTUdCVE1HVkVDXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSB2ZXJzaW9uXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBDb2x1bW5zQ291bnRfXHJcblxyXG4gICAgICAvLyB0aGUgbmV4dCB0b2tlbiBpcyB0aGUgY2VsbHMgYXR0cmlidXRlXHJcbiAgICAgIHJldHVybiA8U3RvcmFnZUF0dHJpYnV0ZT50b2tlbnNbM10uY2hhckF0KDApO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBzdGF0aWMgZ2V0Q2VsbHNBdHRyIHRoZSBibG9iIGlzIGluIHRoZSB3cm9uZyBmb3JtYXRcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2VzIHRoZSBzaXplIG9mIGVhY2ggY2VsbCBpbiB0aGUgdmVjdG9yIGFsbCBjZWxsIGhhcyB0aGUgc2FtZSBzaXplIGV4Y2VwdCB3aGVuIHRoZSB2ZWN0b3IgY2VsbHMgYXJlXHJcbiAgLy8vICAgb2YgdHlwZSBibG9iIG9yIHZlY3RvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9iXCI+YSB2ZWN0b3IgaW4gYSBmbGF0dGVuZWQgZm9ybWF0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBjZWxscyBzaXplIG9yIC0xIGlmIHRoZXJlIGlzIGVuY29kaW5nIHByb2JsZW08L3JldHVybnM+XHJcbiAgc3RhdGljIGdldENlbGxTaXplKGJsb2I6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgY2VsbHNUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gVmVjdG9yVHlwZS5nZXRDZWxsc0F0dHIoYmxvYik7XHJcbiAgICBpZiAoY2VsbHNUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgY2VsbHNUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKGJsb2IpKSwgXCIsXCIpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgTUdCVE1HVkVDXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSB2ZXJzaW9uXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBDb2x1bW5zQ291bnRfXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBjZWxscyB0eXBlXHJcblxyXG4gICAgICAvLyB0aGUgbmV4dCBlbGVtZW50IGlzIHRoZSBjZWxscyBzaXplXHJcbiAgICAgIHJldHVybiBOTnVtYmVyLlBhcnNlKHRva2Vuc1s0XSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+XHJcbiAgICAgIHJldHVybiAyMTQ3NDgzNjQ3O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlcyB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2JcIj5hIHZlY3RvciBpbiBhIGZsYXR0ZW5lZCBmb3JtYXQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHNpemUgb2YgdGhlIHZlY3RvcjwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0VmVjU2l6ZShibG9iOiBzdHJpbmcpOiBudW1iZXIge1xyXG5cclxuICAgIGlmIChWZWN0b3JUeXBlLnZhbGlkYXRlQmxvYkNvbnRlbnRzKGJsb2IpKSB7XHJcbiAgICAgIGxldCBwb3M6IG51bWJlciA9IEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoYmxvYik7XHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihwb3MpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBNR0JUTUdWRUNcclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1swXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1sxXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIENvbHVtbnNDb3VudF9cclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1syXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIGNlbGxzIHR5cGVcclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1szXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIGNlbGxzIHNpemVcclxuICAgICAgbGV0IGNlbGxzU2l6ZTogc3RyaW5nID0gdG9rZW5zWzRdO1xyXG4gICAgICBwb3MgPSBwb3MgKyAoY2VsbHNTaXplLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgY2VsbCBkZWZhdWx0IHZhbHVlIGFuZCByZS1pbml0IHRoZSB0b2tlbml6ZXJcclxuICAgICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgbWF5IGNvbnRhaW4gdGhlIGRlbGltZXRlciBjaGFyZWN0ZXIgYXMgZGF0YVxyXG4gICAgICBwb3MgPSBwb3MgKyAoTk51bWJlci5QYXJzZShjZWxsc1NpemUpICsgMSk7XHJcbiAgICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUoYmxvYi5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG5cclxuICAgICAgLy8gc2tpcCBpcyBjZWxsIG51bGwgZGVmYXVsdFxyXG5cclxuICAgICAgLy8gc2tpcCBpcyBudWxsIGFsbG93ZWRcclxuXHJcbiAgICAgIC8vIHNraXAgY29sdW1ucyB0b3RhbCBsZW5ndGhcclxuXHJcbiAgICAgIC8vIHRoZSBuZXh0IGVsZW1lbnQgaXMgdGhlIHZlY3RvciBzaXplXHJcbiAgICAgIHJldHVybiBOTnVtYmVyLlBhcnNlKHRva2Vuc1szXSk7XHJcbiAgICB9XHJcbiAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBzdGF0aWMgZ2V0VmVjU2l6ZSB0aGUgYmxvYiBpcyBpbiB0aGUgd3JvbmcgZm9ybWF0XCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGZsYXREYXRhIGNvbnRlbnQgd2FzIHRyYW5zbGF0ZWQgdG8gdW5pY29kZSBvciBub3QuIGZsYXREYXRhIGNvbnRhaW5zIHRoZSB2ZWN0b3IncyBjZWxscyBpbiBmbGF0XHJcbiAgLy8vICAgKG5vbi1hcnJheSkgZm9ybWF0LiBUaGlzIGlzIGhvdyB0aGUgc2VydmVyIHNlbmRzIHVzIHRoZSBkYXRhLiBIb3dldmVyIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBpdCB0byB1c1xyXG4gIC8vLyAgIGluIGEgVU5JQ09ERSBmb3JtYXQuIFRodXMgd2UgdHJhbnNsYXRlIGl0IHRvIHVuaWNvZGUgZHVyaW5nIHRoZSBmaXJzdCB0aW1lIHdlIFwiZGUtc2VyaWFsaXplXCIgdGhlXHJcbiAgLy8vICAgZmxhdC1kYXRhIGludG8gYSB2ZWN0b3IuIER1cmluZyB0aGUgZGUtc2VyaWFsaXphdGlvbiBvcGVyYXRpb24gZHVyaW5nIHRoZSBmaXJzdCB0aW1lIHdlIFwiZGUtc2VyaWFsaXplXCJcclxuICAvLy8gICB0aGUgZmxhdC1kYXRhIGludG8gYSB2ZWN0b3IuIER1cmluZyB0aGUgZGUtc2VyaWFsaXphdGlvbiBvcGVyYXRpb24gd2UgbW9kaWZ5IHRoZSBCTE9CLVRBQkxlIGV5ZSBjYXRjaGVyXHJcbiAgLy8vICAgZnJvbSB1cHBlciBjYXNlIHRvIGxvd2VyIGNhc2UsIHRoaXMgd2F5IHdlIGtub3cgaWYgYSB0cmFuc2xhdGlvbiB3YXMgZG9uZSBvciBpcyBuZWVkZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5hbWVcIj5mbGF0RGF0YSBUaGUgdmVjdG9yJ3MgZmxhdCBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFRSVUUgaWYgdGhlIGZsYXQgZGF0YSBpcyBhbHJlYWR5IGluIHVuaWNvZGUgZm9ybWF0PC9yZXR1cm5zPlxyXG4gIGlzVW5pY29kZShmbGF0RGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoZmxhdERhdGEpO1xyXG4gICAgbGV0IGNhdGNoZXI6IHN0cmluZyA9IGZsYXREYXRhLnN1YnN0cihzdGFydCwgVmVjdG9yVHlwZS5CTE9CX1RBQkxFX1NUUl9MRU4pO1xyXG4gICAgcmV0dXJuIChjYXRjaGVyID09PSBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdGhpcyBpbm5lciBjbGFzcyByZXByZXNlbnRzIGEgY2VsbCBpbiB0aGUgbWFnaWMgdmVjdG9yIGVhY2ggZGF0YSB0aGF0IHRoZSBtYWdpYyB2ZWN0b3Iga2VlcHMgcGVyIGNlbGxcclxuLy8vICAgd2lsbCBiZSBrZXB0IGluIHRoZSBDZWxsRWxlbWVudFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgQ2VsbEVsZW1lbnQge1xyXG4gIGJsb2JGaWVsZFByZWZpeDogc3RyaW5nID0gbnVsbDtcclxuICBkYXRhOiBzdHJpbmcgPSBudWxsO1xyXG4gIGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBhbGwgdGhpcyB2YXJpYWJsZXMgYXJlIHVzZWQgb25seSBpZiB0aGUgdmVjdG9yIGNlbGwgaXMgb2YgdHlwZSB2ZWN0b3Igb3IgYmxvYlxyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4sIGN0cmxEYXRhOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKHZhbDogc3RyaW5nLCBpc19udWxsOiBib29sZWFuLCBjdHJsRGF0YT86IHN0cmluZykge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCh2YWwsIGlzX251bGwpO1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHZhbCwgaXNfbnVsbCwgY3RybERhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc3RydWN0cyBhIG5ldyBjZWxsIGVsZW1lbnQgZm9yIHZlY3RvcnMgd2hvcyBjZWxscyBhcmUgbm90IG9mIHR5cGUgYmxvYiBvciB2ZWN0b3JcclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIHRoaXMuaXNOdWxsID0gaXNfbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIGNvbnN0cnVjdHMgYSBuZXcgY2VsbCBlbGVtZW50IGZvciB2ZWN0b3JzIHdob3MgY2VsbHMgYXJlIG9mIHR5cGUgYmxvYiBvciB2ZWN0b3JcclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4sIGN0cmxEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIHRoaXMuaXNOdWxsID0gaXNfbnVsbDtcclxuICAgIHRoaXMuYmxvYkZpZWxkUHJlZml4ID0gY3RybERhdGE7XHJcbiAgfVxyXG59XHJcbiJdfQ==