@magic-xpa/gui 4.1100.0-dev4110.20 → 4.1100.0-dev4110.203

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 +244 -244
  58. package/esm2022/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2022/src/management/gui/Property.mjs +1361 -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 +16072 -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 +243 -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,1361 @@
1
+ import { ApplicationException, Debug, Int32, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
2
+ import { Constants, Logger_LogLevels, MgControlType, StorageAttribute, StrUtil, UtilImeJpn, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
3
+ import { TaskDefinitionIdTableSaxHandler } from '../tasks/TaskDefinitionIdTableSaxHandler';
4
+ import { PIC } from './PIC';
5
+ import { Events } from '../../Events';
6
+ import { GuiConstants } from '../../GuiConstants';
7
+ import { PropInterface } from './PropInterface';
8
+ import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
9
+ import { DisplayConvertor } from './DisplayConvertor';
10
+ import { Commands } from '../../Commands';
11
+ import { CommandType, HtmlProperties } from '../../GuiEnums';
12
+ import { PropDefaults } from './PropDefaults';
13
+ export class CustomValidatorProp {
14
+ _exp;
15
+ _errorMessageExp;
16
+ _errorMessage;
17
+ }
18
+ ;
19
+ export class CustomValidator {
20
+ _valid;
21
+ _errorMessage;
22
+ constructor(valid, errMessage) {
23
+ this._valid = valid;
24
+ this._errorMessage = errMessage;
25
+ }
26
+ isValid() { return this._valid; }
27
+ getErrMessage() { return this._errorMessage; }
28
+ }
29
+ export class Property {
30
+ _id = Int32.MinValue;
31
+ _dataType = StorageAttribute.NONE;
32
+ _val = null;
33
+ _pic = null;
34
+ _expId = 0;
35
+ _parentObj = null;
36
+ _parentType = null;
37
+ _prevValues = null;
38
+ _orgValue = null;
39
+ static _numericPropertyPic = null;
40
+ _taskDefinitionId = null;
41
+ StudioValue = null;
42
+ _expAlreadyComputedOnce = false;
43
+ customProperties = new Map();
44
+ customPropertiesValues = new Map();
45
+ customValidatorProperties = new Map();
46
+ customValidatorValues = new Map();
47
+ static UtilImeJpn = (UtilStrByteMode.isLocaleDefLangJPN() ? new UtilImeJpn() : null);
48
+ get TaskDefinitionId() {
49
+ return this._taskDefinitionId;
50
+ }
51
+ constructor(cId, cParentObj, parType, val) {
52
+ if (arguments.length === 0)
53
+ this.constructor_0();
54
+ else if (arguments.length === 3)
55
+ this.constructor_1(cId, cParentObj, parType);
56
+ else
57
+ this.constructor_2(cId, cParentObj, parType, val);
58
+ }
59
+ constructor_0() {
60
+ this._prevValues = new List();
61
+ }
62
+ constructor_1(cId, cParentObj, parType) {
63
+ this.constructor_0();
64
+ this.setId(cId);
65
+ this._parentObj = cParentObj;
66
+ this._parentType = parType;
67
+ this.setDataType();
68
+ }
69
+ constructor_2(cId, cParentObj, parType, val) {
70
+ this.constructor_1(cId, cParentObj, parType);
71
+ this.setValue(val);
72
+ this.setOrgValue();
73
+ }
74
+ setId(cId) {
75
+ this._id = cId;
76
+ }
77
+ fillData(parentRef, parType, parser) {
78
+ let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
79
+ if (this._parentObj === null && parentRef !== null) {
80
+ this._parentObj = parentRef;
81
+ this._parentType = parType;
82
+ }
83
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
84
+ let tag = parser.getXMLsubstring(endContext);
85
+ parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_PROP) + XMLConstants.MG_TAG_PROP.length);
86
+ let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
87
+ if (Events.ShouldLog(Logger_LogLevels.Development)) {
88
+ Events.WriteDevToLog(NString.Format("In Prop.FillData(): {0}", tokensVector.toString()));
89
+ }
90
+ this.initElements(tokensVector);
91
+ parser.setCurrIndex(endContext + XMLConstants.TAG_CLOSE.length);
92
+ this.InitInnerObjects(parser);
93
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
94
+ this.setControlAttributes();
95
+ else if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
96
+ this._prevValues.SetSize(1);
97
+ }
98
+ else
99
+ Events.WriteExceptionToLog("In Property.FillData(): Out of string bounds");
100
+ }
101
+ InitInnerObjects(xmlParser) {
102
+ let nextTag = xmlParser.getNextTag();
103
+ if (nextTag === XMLConstants.MG_TAG_TASKDEFINITIONID_ENTRY) {
104
+ let xmlBuffer = xmlParser.ReadToEndOfCurrentElement();
105
+ this.InitTaskDefinitionId(xmlBuffer);
106
+ let endContext = xmlParser.getXMLdata().indexOf(XMLConstants.MG_TAG_PROP + XMLConstants.TAG_CLOSE, xmlParser.getCurrIndex());
107
+ xmlParser.setCurrIndex(endContext + (XMLConstants.MG_TAG_PROP + XMLConstants.TAG_CLOSE).length);
108
+ }
109
+ }
110
+ initElements(tokensVector) {
111
+ for (let j = 0; j < tokensVector.length; j += 2) {
112
+ let attribute = (tokensVector.get_Item(j));
113
+ let valueStr = (tokensVector.get_Item(j + 1));
114
+ switch (attribute) {
115
+ case XMLConstants.MG_ATTR_ID:
116
+ this.setId(XmlParser.getInt(valueStr));
117
+ this.setDataType();
118
+ break;
119
+ case XMLConstants.MG_ATTR_STUDIO_VALUE:
120
+ this.StudioValue = XmlParser.unescape(valueStr);
121
+ break;
122
+ case XMLConstants.MG_ATTR_VALUE:
123
+ if (this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) {
124
+ this.InitCustomProperties(XmlParser.unescape(valueStr));
125
+ }
126
+ if (this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) {
127
+ this.InitCustomValidationProperties(XmlParser.unescape(valueStr));
128
+ }
129
+ else {
130
+ this._val = XmlParser.unescape(valueStr);
131
+ this._orgValue = this._val;
132
+ }
133
+ break;
134
+ case XMLConstants.MG_ATTR_EXP:
135
+ this._expId = XmlParser.getInt(valueStr);
136
+ if (this._expId > 0 && this._id === PropInterface.PROP_TYPE_TOOLTIP)
137
+ this.setDataType();
138
+ break;
139
+ case XMLConstants.MG_ATTR_NAME:
140
+ break;
141
+ case XMLConstants.MG_ATTR_CTL_IDX:
142
+ this._taskDefinitionId.CtlIndex = XmlParser.getInt(valueStr);
143
+ break;
144
+ case XMLConstants.MG_ATTR_PROGRAM_ISN:
145
+ this._taskDefinitionId.ProgramIsn = XmlParser.getInt(valueStr);
146
+ break;
147
+ default:
148
+ Events.WriteExceptionToLog(NString.Format("There is no such tag in Property class. Insert case to Property.initElements for {0}", attribute));
149
+ break;
150
+ }
151
+ if (this.IsComputedOnceOnServer())
152
+ this._expAlreadyComputedOnce = true;
153
+ }
154
+ }
155
+ InitCustomProperties(customProprtiesStr) {
156
+ this.customProperties = new Map(JSON.parse(customProprtiesStr));
157
+ if (this._parentObj.IsFirstRefreshOfProps())
158
+ this.SetFirstValueForCustomProperties();
159
+ }
160
+ InitCustomValidator(parser) {
161
+ let text = parser.ReadToEndOfCurrentElement();
162
+ text = text.substr(text.indexOf(XMLConstants.MG_TAG_CUSTOM_VALIDATOR) + XMLConstants.MG_TAG_CUSTOM_VALIDATOR.length);
163
+ let tokens = XmlParser.getTokens(text, XMLConstants.XML_ATTR_DELIM);
164
+ let c = new CustomValidatorProp();
165
+ let key;
166
+ for (let j = 0; j < tokens.length; j += 2) {
167
+ let attribute = tokens.get_Item(j);
168
+ let valueStr = tokens.get_Item(j + 1);
169
+ switch (attribute) {
170
+ case XMLConstants.MG_ATTR_EXP:
171
+ c._exp = XmlParser.getInt(valueStr);
172
+ break;
173
+ case XMLConstants.MG_ATTR_NAME:
174
+ key = XmlParser.unescape(valueStr);
175
+ break;
176
+ case XMLConstants.MG_ATTR_ERROR_EXP:
177
+ c._errorMessageExp = XmlParser.getInt(valueStr);
178
+ break;
179
+ case XMLConstants.MG_ATTR_ERROR:
180
+ c._errorMessage = XmlParser.unescape(valueStr);
181
+ break;
182
+ }
183
+ }
184
+ this.customValidatorProperties.set(key, c);
185
+ }
186
+ InitCustomValidationProperties(customProprtiesStr) {
187
+ let parser = new XmlParser(customProprtiesStr);
188
+ let currTagName = parser.getNextTag();
189
+ while (currTagName != null) {
190
+ switch (currTagName) {
191
+ case XMLConstants.MG_TAG_CUSTOM_VALIDATORS:
192
+ parser.setCurrIndex2EndOfTag();
193
+ this.customValidatorProperties = new Map();
194
+ break;
195
+ case XMLConstants.MG_TAG_CUSTOM_VALIDATOR:
196
+ this.InitCustomValidator(parser);
197
+ break;
198
+ default:
199
+ parser.setCurrIndex2EndOfTag();
200
+ break;
201
+ }
202
+ currTagName = parser.getNextTag();
203
+ }
204
+ if (this._parentObj.IsFirstRefreshOfProps())
205
+ this.SetFirstValueForCustomValidationProperties();
206
+ }
207
+ SetFirstValueForCustomValidationProperties() {
208
+ for (let customProperty of this.customValidatorProperties.keys()) {
209
+ this.customValidatorValues.set(customProperty, new CustomValidator(true, ""));
210
+ }
211
+ this._val = this.GetArrayValuesForCustomValidationProperties();
212
+ this._orgValue = this._val;
213
+ }
214
+ GetArrayValuesForCustomValidationProperties() {
215
+ let values = Array.from(this.customValidatorValues.values());
216
+ let valuesStr = JSON.stringify(values);
217
+ return valuesStr;
218
+ }
219
+ GetArrayValuesForCustomProperties() {
220
+ let values = Array.from(this.customPropertiesValues.values());
221
+ let valuesStr = JSON.stringify(values);
222
+ return valuesStr;
223
+ }
224
+ SetFirstValueForCustomProperties() {
225
+ for (let customProperty of this.customProperties.keys())
226
+ this.customPropertiesValues.set(customProperty, "");
227
+ this._val = this.GetArrayValuesForCustomProperties();
228
+ this._orgValue = this._val;
229
+ }
230
+ InitTaskDefinitionId(xmlBuffer) {
231
+ let taskDefinitionIdTableSaxHandler = new TaskDefinitionIdTableSaxHandler(this.SetTaskDefinitionId);
232
+ taskDefinitionIdTableSaxHandler.parse(xmlBuffer);
233
+ }
234
+ SetTaskDefinitionId(taskDefinitionId) {
235
+ this._taskDefinitionId = taskDefinitionId;
236
+ }
237
+ setDataType() {
238
+ let compIdx = this._parentObj.getCompIdx();
239
+ this._pic = null;
240
+ if (this._id === Int32.MinValue) {
241
+ Events.WriteExceptionToLog(NString.Format("To fill dataType member in Property.FillDataType must id!={0}", Int32.MinValue));
242
+ return;
243
+ }
244
+ switch (this._id) {
245
+ case PropInterface.PROP_TYPE_TITLE_BAR:
246
+ case PropInterface.PROP_TYPE_DISPLAY_MENU:
247
+ case PropInterface.PROP_TYPE_BORDER:
248
+ case PropInterface.PROP_TYPE_HEBREW:
249
+ case PropInterface.PROP_TYPE_MODIFY_IN_QUERY:
250
+ case PropInterface.PROP_TYPE_SYSTEM_MENU:
251
+ case PropInterface.PROP_TYPE_END_CONDITION:
252
+ case PropInterface.PROP_TYPE_SELECTION:
253
+ case PropInterface.PROP_TYPE_ALLOW_MODIFY:
254
+ case PropInterface.PROP_TYPE_ALLOW_CREATE:
255
+ case PropInterface.PROP_TYPE_ALLOW_DELETE:
256
+ case PropInterface.PROP_TYPE_ALLOW_QUERY:
257
+ case PropInterface.PROP_TYPE_ALLOW_RANGE:
258
+ case PropInterface.PROP_TYPE_ALLOW_LOCATE:
259
+ case PropInterface.PROP_TYPE_ALLOW_SORT:
260
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
261
+ case PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY:
262
+ case PropInterface.PROP_TYPE_CONFIRM_UPDATE:
263
+ case PropInterface.PROP_TYPE_FORCE_SUFFIX:
264
+ case PropInterface.PROP_TYPE_FORCE_DELETE:
265
+ case PropInterface.PROP_TYPE_MUST_INPUT:
266
+ case PropInterface.PROP_TYPE_MODIFIABLE:
267
+ case PropInterface.PROP_TYPE_VISIBLE:
268
+ case PropInterface.PROP_TYPE_ENABLED:
269
+ case PropInterface.PROP_TYPE_CONFIRM_CANCEL:
270
+ case PropInterface.PROP_TYPE_REPEATABLE:
271
+ case PropInterface.PROP_TYPE_HIGHLIGHTING:
272
+ case PropInterface.PROP_TYPE_PASSWORD:
273
+ case PropInterface.PROP_TYPE_MULTILINE:
274
+ case PropInterface.PROP_TYPE_IS_CACHED:
275
+ case PropInterface.PROP_TYPE_PRELOAD_VIEW:
276
+ case PropInterface.PROP_TYPE_MULTILINE_VERTICAL_SCROLL:
277
+ case PropInterface.PROP_TYPE_MULTILINE_ALLOW_CR:
278
+ case PropInterface.PROP_TYPE_ALLOW_COL_RESIZE:
279
+ case PropInterface.PROP_TYPE_ALLOW_REORDER:
280
+ case PropInterface.PROP_TYPE_SHOW_LINES:
281
+ case PropInterface.PROP_TYPE_SORT_COLUMN:
282
+ case PropInterface.PROP_TYPE_COL_ALLOW_FILTERING:
283
+ case PropInterface.PROP_TYPE_DISPLAY_STATUS_BAR:
284
+ case PropInterface.PROP_TYPE_AUTO_REFRESH:
285
+ case PropInterface.PROP_TYPE_PARK_ON_CLICK:
286
+ case PropInterface.PROP_TYPE_SHOW_FULL_ROW:
287
+ case PropInterface.PROP_TYPE_TRACK_SELECTION:
288
+ case PropInterface.PROP_TYPE_SHOW_BUTTONS:
289
+ case PropInterface.PROP_TYPE_LINES_AT_ROOT:
290
+ case PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW:
291
+ case PropInterface.PROP_TYPE_SCROLL_BAR:
292
+ case PropInterface.PROP_TYPE_COLUMN_DIVIDER:
293
+ case PropInterface.PROP_TYPE_LINE_DIVIDER:
294
+ case PropInterface.PROP_TYPE_THREE_STATES:
295
+ case PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN:
296
+ case PropInterface.PROP_TYPE_ALLOW_OPTION:
297
+ case PropInterface.PROP_TYPE_RETAIN_FOCUS:
298
+ case PropInterface.PROP_TYPE_PRINT_DATA:
299
+ case PropInterface.PROP_TYPE_CLOSE_TASKS_BY_MDI_MENU:
300
+ case PropInterface.PROP_TYPE_DATAVIEWCONTROL:
301
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
302
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
303
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_INDEX_OPTIMIZATION:
304
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE:
305
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE:
306
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION:
307
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_SQL_RANGE:
308
+ case PropInterface.PROP_TYPE_BEFORE_900_VERSION:
309
+ case PropInterface.PROP_TYPE_FILL_WIDTH:
310
+ case PropInterface.PROP_TYPE_MULTI_COLUMN_DISPLAY:
311
+ case PropInterface.PROP_TYPE_IS_ROUTER_OUTLET:
312
+ case PropInterface.PROP_TYPE_DEFAULT_OUTLET:
313
+ case PropInterface.PROP_TYPE_SERVER_READ_AHEAD:
314
+ case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
315
+ this._dataType = StorageAttribute.BOOLEAN;
316
+ break;
317
+ case PropInterface.PROP_TYPE_IMAGE_FILENAME:
318
+ case PropInterface.PROP_TYPE_EVAL_END_CONDITION:
319
+ case PropInterface.PROP_TYPE_FRAME_NAME:
320
+ case PropInterface.PROP_TYPE_NAME:
321
+ case PropInterface.PROP_TYPE_TRASACTION_BEGIN:
322
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_TRANSACTION_MODE:
323
+ case PropInterface.PROP_TYPE_WALLPAPER:
324
+ case PropInterface.PROP_TYPE_ATTRIBUTE:
325
+ case PropInterface.PROP_TYPE_TRIGGER:
326
+ case PropInterface.PROP_TYPE_SELECT_MODE:
327
+ case PropInterface.PROP_TYPE_TASK_ID:
328
+ case PropInterface.PROP_TYPE_TABBING_CYCLE:
329
+ case PropInterface.PROP_TYPE_PARAMETERS:
330
+ case PropInterface.PROP_TYPE_IMAGE_LIST_INDEXES:
331
+ case PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST:
332
+ case PropInterface.PROP_TYPE_OBJECT_TYPE:
333
+ case PropInterface.PROP_TYPE_REAL_OBJECT_TYPE:
334
+ case PropInterface.PROP_TYPE_DATAVIEWCONTROL_FIELDS:
335
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE_ORDER:
336
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE_ORDER:
337
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION_USAGE:
338
+ case PropInterface.PROP_TYPE_TASK_MODE:
339
+ case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
340
+ case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
341
+ this._dataType = StorageAttribute.ALPHA;
342
+ break;
343
+ case PropInterface.PROP_TYPE_COLUMN_TITLE:
344
+ case PropInterface.PROP_TYPE_DISPLAY_LIST:
345
+ case PropInterface.PROP_TYPE_LABEL:
346
+ case PropInterface.PROP_TYPE_FORMAT:
347
+ case PropInterface.PROP_TYPE_RANGE:
348
+ case PropInterface.PROP_TYPE_FORM_NAME:
349
+ case PropInterface.PROP_TYPE_ADDITIONAL_INFORMATION:
350
+ case PropInterface.PROP_TYPE_TEXT:
351
+ case PropInterface.PROP_TYPE_HINT:
352
+ this._dataType = StorageAttribute.UNICODE;
353
+ break;
354
+ case PropInterface.PROP_TYPE_UOM:
355
+ case PropInterface.PROP_TYPE_HOR_FAC:
356
+ case PropInterface.PROP_TYPE_VER_FAC:
357
+ case PropInterface.PROP_TYPE_TAB_ORDER:
358
+ case PropInterface.PROP_TYPE_WALLPAPER_STYLE:
359
+ case PropInterface.PROP_TYPE_INDEX:
360
+ case PropInterface.PROP_TYPE_LINK_FIELD:
361
+ case PropInterface.PROP_TYPE_DISPLAY_FIELD:
362
+ case PropInterface.PROP_TYPE_PULLDOWN_MENU:
363
+ case PropInterface.PROP_TYPE_WINDOW_TYPE:
364
+ case PropInterface.PROP_TYPE_IMAGE_STYLE:
365
+ case PropInterface.PROP_TYPE_AUTO_FIT:
366
+ case PropInterface.PROP_TYPE_RAISE_AT:
367
+ case PropInterface.PROP_TYPE_EXPAND_WINDOW:
368
+ case PropInterface.PROP_TYPE_VISIBLE_LINES:
369
+ case PropInterface.PROP_TYPE_CHOICE_COLUMNS:
370
+ case PropInterface.PROP_TYPE_STYLE_3D:
371
+ case PropInterface.PROP_TYPE_FONT:
372
+ case PropInterface.PROP_TYPE_LAYER:
373
+ case PropInterface.PROP_TYPE_WIDTH:
374
+ case PropInterface.PROP_TYPE_TITLE_HEIGHT:
375
+ case PropInterface.PROP_TYPE_COLOR:
376
+ case PropInterface.PROP_TYPE_LEFT:
377
+ case PropInterface.PROP_TYPE_TOP:
378
+ case PropInterface.PROP_TYPE_TOOLTIP:
379
+ case PropInterface.PROP_TYPE_HELP_SCR:
380
+ case PropInterface.PROP_TYPE_LINES_IN_TABLE:
381
+ case PropInterface.PROP_TYPE_SELECTION_ROWS:
382
+ case PropInterface.PROP_TYPE_HORIZONTAL_ALIGNMENT:
383
+ case PropInterface.PROP_TYPE_MULTILINE_WORDWRAP_SCROLL:
384
+ case PropInterface.PROP_TYPE_ROW_HEIGHT:
385
+ case PropInterface.PROP_TYPE_WINDOW_WIDTH:
386
+ case PropInterface.PROP_TYPE_MAIN_DISPLAY:
387
+ case PropInterface.PROP_TYPE_TRANSLATOR:
388
+ case PropInterface.PROP_TYPE_FRAMESET_STYLE:
389
+ case PropInterface.PROP_TYPE_FRAME_TYPE:
390
+ case PropInterface.PROP_TYPE_ALLOWED_DIRECTION:
391
+ case PropInterface.PROP_TYPE_ROW_HIGHLIGHT_STYLE:
392
+ case PropInterface.PROP_TYPE_VERTICAL_ALIGNMENT:
393
+ case PropInterface.PROP_TYPE_TABBING_ORDER:
394
+ case PropInterface.PROP_TYPE_STATIC_TYPE:
395
+ case PropInterface.PROP_TYPE_BUTTON_STYLE:
396
+ case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
397
+ case PropInterface.PROP_TYPE_SUBFORM_TYPE:
398
+ case PropInterface.PROP_TYPE_BOTTOM_POSITION_INTERVAL:
399
+ case PropInterface.PROP_TYPE_SELECTION_MODE:
400
+ case PropInterface.PROP_TYPE_PRGTSK_NUM:
401
+ case PropInterface.PROP_TYPE_PERSISTENT_FORM_STATE_VERSION:
402
+ case PropInterface.PROP_TYPE_SCROLL_BAR_THUMB:
403
+ case PropInterface.PROP_TYPE_BINDING_LEVEL:
404
+ case PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL:
405
+ case PropInterface.PROP_TYPE_SELECT_PROGRAM:
406
+ if (this._id === PropInterface.PROP_TYPE_TOOLTIP && this._expId > 0)
407
+ this._dataType = StorageAttribute.UNICODE;
408
+ else {
409
+ this._dataType = StorageAttribute.NUMERIC;
410
+ if (Property._numericPropertyPic == null)
411
+ Property._numericPropertyPic = new PIC("N6", StorageAttribute.NUMERIC, compIdx);
412
+ this._pic = Property._numericPropertyPic;
413
+ }
414
+ break;
415
+ case PropInterface.PROP_TYPE_RETURN_ACTION:
416
+ this._dataType = StorageAttribute.NONE;
417
+ break;
418
+ case PropInterface.PROP_TYPE_DATA:
419
+ this._dataType = this._parentObj.DataType;
420
+ break;
421
+ case PropInterface.PROP_TYPE_POP_UP:
422
+ case PropInterface.PROP_TYPE_ORIENTATION_LOCK:
423
+ case PropInterface.PROP_TYPE_ENTER_ANIMATION:
424
+ case PropInterface.PROP_TYPE_EXIT_ANIMATION:
425
+ case PropInterface.PROP_TYPE_NAVIGATION_DRAWER_MENU:
426
+ case PropInterface.PROP_TYPE_ACTION_BAR_MENU:
427
+ case PropInterface.PROP_TYPE_OPEN_PICKER:
428
+ case PropInterface.PROP_TYPE_OPEN_EDIT_DIALOG:
429
+ case PropInterface.PROP_TYPE_DEFAULT_ALIGNMENT:
430
+ case PropInterface.PROP_TYPE_KEYBOARD_TYPE:
431
+ case PropInterface.PROP_TYPE_KEYBOARD_RETURN_KEY:
432
+ case PropInterface.PROP_TYPE_ALLOW_SUGGESTIONS:
433
+ case PropInterface.PROP_TYPE_MOBILE_IMAGE_LIST_FILE_NAME:
434
+ case PropInterface.PROP_TYPE_SWIPE_REFRESH:
435
+ break;
436
+ default:
437
+ Events.WriteExceptionToLog(NString.Format("in Property.setDataType() no case for: {0}", this._id));
438
+ break;
439
+ }
440
+ }
441
+ setControlAttributes() {
442
+ if (this._parentObj == null || this._parentType !== GuiConstants.PARENT_TYPE_CONTROL) {
443
+ Events.WriteExceptionToLog("in Property.setControlAttributes() there is no parent or the parent is not a control");
444
+ return;
445
+ }
446
+ let parentControl = this._parentObj;
447
+ switch (this._id) {
448
+ case PropInterface.PROP_TYPE_FRAME_NAME:
449
+ case PropInterface.PROP_TYPE_NAME:
450
+ parentControl.Name = this._val;
451
+ break;
452
+ case PropInterface.PROP_TYPE_ATTRIBUTE:
453
+ parentControl.DataType = this._val[0];
454
+ break;
455
+ case PropInterface.PROP_TYPE_FORMAT:
456
+ parentControl.setPicStr(this._val, this._expId);
457
+ break;
458
+ case PropInterface.PROP_TYPE_RANGE:
459
+ parentControl.setRange(this._val);
460
+ break;
461
+ case PropInterface.PROP_TYPE_DATA:
462
+ if (this._expId > 0)
463
+ parentControl.setValExp(this._expId);
464
+ else if (this._val != null)
465
+ parentControl.setField(this._val);
466
+ break;
467
+ case PropInterface.PROP_TYPE_BUTTON_STYLE:
468
+ if (this._val != null)
469
+ parentControl.ButtonStyle = this.GetComputedValueInteger();
470
+ break;
471
+ case PropInterface.PROP_TYPE_LAYER:
472
+ if (this._val != null)
473
+ parentControl.Layer = this.GetComputedValueInteger();
474
+ break;
475
+ default:
476
+ break;
477
+ }
478
+ }
479
+ getID() {
480
+ return this._id;
481
+ }
482
+ setValue(mgVal) {
483
+ let compIdx = this._parentObj.getCompIdx();
484
+ if (this._id === PropInterface.PROP_TYPE_DATA || this._id === PropInterface.PROP_TYPE_NODE_ID || this._id === PropInterface.PROP_TYPE_NODE_PARENTID)
485
+ return;
486
+ if (this._dataType === StorageAttribute.NONE)
487
+ this.setDataType();
488
+ switch (this._dataType) {
489
+ case StorageAttribute.NUMERIC:
490
+ if (mgVal == null)
491
+ mgVal = "FF00000000000000000000000000000000000000";
492
+ this._val = DisplayConvertor.Instance.mg2disp(mgVal, "", this._pic, false, compIdx, false).trim();
493
+ break;
494
+ case StorageAttribute.ALPHA:
495
+ case StorageAttribute.BLOB:
496
+ case StorageAttribute.BLOB_VECTOR:
497
+ case StorageAttribute.BOOLEAN:
498
+ case StorageAttribute.UNICODE:
499
+ this._val = mgVal;
500
+ break;
501
+ default:
502
+ throw new ApplicationException("in Property.setValue() illegal data type: " + this._dataType);
503
+ }
504
+ }
505
+ SetValue(val) {
506
+ this._val = String(val);
507
+ }
508
+ setOrgValue() {
509
+ this._orgValue = this._val;
510
+ }
511
+ GetTaskByParentObject() {
512
+ let task = null;
513
+ if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
514
+ task = this._parentObj.getTask();
515
+ else if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
516
+ task = this._parentObj.getForm().getTask();
517
+ else if (this._parentType === GuiConstants.PARENT_TYPE_TASK)
518
+ task = this._parentObj;
519
+ return task;
520
+ }
521
+ async RefreshDisplay(forceRefresh) {
522
+ await this.RefreshDisplayWithCurrentLine(forceRefresh, Int32.MinValue);
523
+ }
524
+ ShouldSkipRefreshControl() {
525
+ let skip = false;
526
+ let mgControl = this._parentObj;
527
+ switch (this._id) {
528
+ case PropInterface.PROP_TYPE_HEBREW:
529
+ if (mgControl.isTableControl())
530
+ skip = true;
531
+ break;
532
+ case PropInterface.PROP_TYPE_NODE_ID:
533
+ case PropInterface.PROP_TYPE_NODE_PARENTID:
534
+ case PropInterface.PROP_TYPE_DATA:
535
+ case PropInterface.PROP_TYPE_HIGHLIGHTING:
536
+ case PropInterface.PROP_TYPE_MUST_INPUT:
537
+ case PropInterface.PROP_TYPE_HELP_SCR:
538
+ case PropInterface.PROP_TYPE_SELECT_PROGRAM:
539
+ case PropInterface.PROP_TYPE_SELECT_MODE:
540
+ case PropInterface.PROP_TYPE_ALLOWED_DIRECTION:
541
+ case PropInterface.PROP_TYPE_RETURN_ACTION:
542
+ case PropInterface.PROP_TYPE_ATTRIBUTE:
543
+ case PropInterface.PROP_TYPE_REPEATABLE:
544
+ case PropInterface.PROP_TYPE_FRAME_NAME:
545
+ case PropInterface.PROP_TYPE_TRIGGER:
546
+ case PropInterface.PROP_TYPE_TAB_ORDER:
547
+ case PropInterface.PROP_TYPE_IS_CACHED:
548
+ case PropInterface.PROP_TYPE_LAYER:
549
+ case PropInterface.PROP_TYPE_AUTO_FIT:
550
+ case PropInterface.PROP_TYPE_RAISE_AT:
551
+ case PropInterface.PROP_TYPE_FRAMESET_STYLE:
552
+ case PropInterface.PROP_TYPE_FRAME_TYPE:
553
+ case PropInterface.PROP_TYPE_RANGE:
554
+ case PropInterface.PROP_TYPE_WINDOW_WIDTH:
555
+ case PropInterface.PROP_TYPE_TABBING_ORDER:
556
+ case PropInterface.PROP_TYPE_AUTO_REFRESH:
557
+ case PropInterface.PROP_TYPE_PARAMETERS:
558
+ case PropInterface.PROP_TYPE_OBJECT_TYPE:
559
+ case PropInterface.PROP_TYPE_RETAIN_FOCUS:
560
+ case PropInterface.PROP_TYPE_SUBFORM_TYPE:
561
+ case PropInterface.PROP_TYPE_REAL_OBJECT_TYPE:
562
+ case PropInterface.PROP_TYPE_ADDITIONAL_INFORMATION:
563
+ case PropInterface.PROP_TYPE_DATAVIEWCONTROL:
564
+ case PropInterface.PROP_TYPE_DATAVIEWCONTROL_FIELDS:
565
+ case PropInterface.PROP_TYPE_PRGTSK_NUM:
566
+ case PropInterface.PROP_TYPE_INDEX:
567
+ case PropInterface.PROP_TYPE_DISPLAY_FIELD:
568
+ case PropInterface.PROP_TYPE_LINK_FIELD:
569
+ case PropInterface.PROP_TYPE_BEFORE_900_VERSION:
570
+ case PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN:
571
+ case PropInterface.PROP_TYPE_SERVER_READ_AHEAD:
572
+ skip = true;
573
+ break;
574
+ case PropInterface.PROP_TYPE_BUTTON_STYLE:
575
+ if (!this._parentObj.isRadio())
576
+ skip = true;
577
+ break;
578
+ default:
579
+ break;
580
+ }
581
+ return skip;
582
+ }
583
+ ShouldSkipRefreshForm() {
584
+ Debug.Assert(this._parentType === GuiConstants.PARENT_TYPE_FORM);
585
+ let skip = false;
586
+ let mgFormBase = this._parentObj;
587
+ switch (this._id) {
588
+ case PropInterface.PROP_TYPE_WINDOW_TYPE:
589
+ if (!this._parentObj.IsFirstRefreshOfProps())
590
+ skip = true;
591
+ break;
592
+ case PropInterface.PROP_TYPE_LINES_IN_TABLE:
593
+ case PropInterface.PROP_TYPE_HELP_SCR:
594
+ case PropInterface.PROP_TYPE_TABBING_ORDER:
595
+ case PropInterface.PROP_TYPE_PERSISTENT_FORM_STATE_VERSION:
596
+ skip = true;
597
+ break;
598
+ default:
599
+ break;
600
+ }
601
+ if (!skip && mgFormBase.isSubForm()) {
602
+ skip = true;
603
+ switch (this._id) {
604
+ case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
605
+ case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
606
+ skip = false;
607
+ break;
608
+ }
609
+ }
610
+ return skip;
611
+ }
612
+ ShouldSkipRefreshTask() {
613
+ let skip = false;
614
+ switch (this._id) {
615
+ case PropInterface.PROP_TYPE_ALLOW_CREATE:
616
+ case PropInterface.PROP_TYPE_ALLOW_DELETE:
617
+ case PropInterface.PROP_TYPE_ALLOW_MODIFY:
618
+ case PropInterface.PROP_TYPE_ALLOW_QUERY:
619
+ case PropInterface.PROP_TYPE_ALLOW_RANGE:
620
+ case PropInterface.PROP_TYPE_ALLOW_LOCATE:
621
+ case PropInterface.PROP_TYPE_ALLOW_SORT:
622
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
623
+ case PropInterface.PROP_TYPE_TABBING_CYCLE:
624
+ case PropInterface.PROP_TYPE_CONFIRM_CANCEL:
625
+ case PropInterface.PROP_TYPE_CONFIRM_UPDATE:
626
+ case PropInterface.PROP_TYPE_END_CONDITION:
627
+ case PropInterface.PROP_TYPE_EVAL_END_CONDITION:
628
+ case PropInterface.PROP_TYPE_FORCE_SUFFIX:
629
+ case PropInterface.PROP_TYPE_FORCE_DELETE:
630
+ case PropInterface.PROP_TYPE_TASK_MODE:
631
+ case PropInterface.PROP_TYPE_SELECTION:
632
+ case PropInterface.PROP_TYPE_TRASACTION_BEGIN:
633
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_TRANSACTION_MODE:
634
+ case PropInterface.PROP_TYPE_PRINT_DATA:
635
+ case PropInterface.PROP_TYPE_CLOSE_TASKS_BY_MDI_MENU:
636
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
637
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
638
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_CHUNK_SIZE:
639
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_INDEX_OPTIMIZATION:
640
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE:
641
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE_ORDER:
642
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE:
643
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE_ORDER:
644
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION:
645
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION_USAGE:
646
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_SQL_RANGE:
647
+ skip = true;
648
+ break;
649
+ default:
650
+ break;
651
+ }
652
+ return skip;
653
+ }
654
+ ShouldSkipRefresh() {
655
+ let skip = false;
656
+ switch (this._parentType) {
657
+ case GuiConstants.PARENT_TYPE_CONTROL:
658
+ skip = this.ShouldSkipRefreshControl();
659
+ break;
660
+ case GuiConstants.PARENT_TYPE_FORM:
661
+ skip = this.ShouldSkipRefreshForm();
662
+ break;
663
+ case GuiConstants.PARENT_TYPE_TASK:
664
+ skip = this.ShouldSkipRefreshTask();
665
+ break;
666
+ default:
667
+ break;
668
+ }
669
+ switch (this._id) {
670
+ case PropInterface.PROP_TYPE_POP_UP:
671
+ case PropInterface.PROP_TYPE_ORIENTATION_LOCK:
672
+ case PropInterface.PROP_TYPE_ENTER_ANIMATION:
673
+ case PropInterface.PROP_TYPE_EXIT_ANIMATION:
674
+ case PropInterface.PROP_TYPE_NAVIGATION_DRAWER_MENU:
675
+ case PropInterface.PROP_TYPE_ACTION_BAR_MENU:
676
+ case PropInterface.PROP_TYPE_OPEN_PICKER:
677
+ case PropInterface.PROP_TYPE_OPEN_EDIT_DIALOG:
678
+ case PropInterface.PROP_TYPE_DEFAULT_ALIGNMENT:
679
+ case PropInterface.PROP_TYPE_KEYBOARD_TYPE:
680
+ case PropInterface.PROP_TYPE_KEYBOARD_RETURN_KEY:
681
+ case PropInterface.PROP_TYPE_ALLOW_SUGGESTIONS:
682
+ case PropInterface.PROP_TYPE_MOBILE_IMAGE_LIST_FILE_NAME:
683
+ skip = true;
684
+ break;
685
+ }
686
+ return skip;
687
+ }
688
+ async RefreshDisplayWithCurrentLine(forceRefresh, currLine) {
689
+ await this.RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, true);
690
+ }
691
+ SkipWhenNoExpression() {
692
+ let skipWhenNoExpression = true;
693
+ let ctrl = ((this._parentObj instanceof GuiControlPropertyAdapter) ? this._parentObj : null);
694
+ if ((ctrl != null && ctrl.isButton() && this._id === PropInterface.PROP_TYPE_FORMAT) ||
695
+ (ctrl != null && ctrl.isComboBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
696
+ (ctrl != null && ctrl.isListBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
697
+ (ctrl != null && ctrl.isRadio() && this._id === PropInterface.PROP_TYPE_LABEL) ||
698
+ (ctrl != null && ctrl.isCheckBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
699
+ (ctrl != null && ctrl.isTabControl() && this._id === PropInterface.PROP_TYPE_LABEL) ||
700
+ (ctrl != null && ctrl.isImageControl() && this._id === PropInterface.PROP_TYPE_IMAGE_FILENAME) ||
701
+ (ctrl != null && ctrl.IsImageButton() && this._id === PropInterface.PROP_TYPE_IMAGE_FILENAME) ||
702
+ (ctrl != null && ctrl.isColumnControl() && this._id === PropInterface.PROP_TYPE_COLUMN_TITLE) ||
703
+ (this._id === PropInterface.PROP_TYPE_DISPLAY_LIST) ||
704
+ (this._id === PropInterface.PROP_TYPE_TEXT) ||
705
+ (this._id === PropInterface.PROP_TYPE_TOOLTIP) ||
706
+ (this._id === PropInterface.PROP_TYPE_HINT) ||
707
+ (this._id === PropInterface.PROP_TYPE_PASSWORD) ||
708
+ (this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) ||
709
+ (this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) ||
710
+ (this._id === PropInterface.PROP_TYPE_VISIBLE) ||
711
+ (this._id === PropInterface.PROP_TYPE_ENABLED) ||
712
+ (this._id === PropInterface.PROP_TYPE_BINDING_LEVEL))
713
+ skipWhenNoExpression = false;
714
+ return skipWhenNoExpression;
715
+ }
716
+ async RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, checkSkipRefresh) {
717
+ let ctrl = null;
718
+ let line = 0;
719
+ let prevValue;
720
+ let valChanged = true;
721
+ if (this._val === null && this._expId === 0) {
722
+ Events.WriteExceptionToLog("in Property.RefreshDisplay() null value and expression");
723
+ return;
724
+ }
725
+ if (checkSkipRefresh && this.ShouldSkipRefresh())
726
+ return;
727
+ if (this._expId === 0 && this.SkipWhenNoExpression())
728
+ return;
729
+ if (this._prevValues.length === 0)
730
+ this.setPrevArraySize();
731
+ await this.ComputeValue();
732
+ switch (this._parentType) {
733
+ case GuiConstants.PARENT_TYPE_CONTROL:
734
+ ctrl = this._parentObj;
735
+ if (this._id === PropInterface.PROP_TYPE_FORMAT && this._expId > 0)
736
+ ctrl.computePIC(this._val);
737
+ if (ctrl.IsRepeatable && !ctrl.getForm().isRefreshRepeatableAllowed())
738
+ return;
739
+ if (currLine === Int32.MinValue)
740
+ line = this.getLine();
741
+ else
742
+ line = currLine;
743
+ prevValue = this._prevValues.get_Item(line);
744
+ if (!forceRefresh && (this._val === prevValue)
745
+ && this._id !== PropInterface.PROP_TYPE_MODIFIABLE
746
+ && this._id !== PropInterface.PROP_TYPE_VISIBLE
747
+ && this._id !== PropInterface.PROP_TYPE_ENABLED)
748
+ return;
749
+ if (ctrl.Type === MgControlType.CTRL_TYPE_COLUMN
750
+ && this._id === PropInterface.PROP_TYPE_VISIBLE
751
+ && this._val === prevValue)
752
+ return;
753
+ if (this._val === prevValue)
754
+ valChanged = false;
755
+ this._prevValues.set_Item(line, this._val);
756
+ break;
757
+ case GuiConstants.PARENT_TYPE_FORM:
758
+ prevValue = this._prevValues.get_Item(0);
759
+ if (!forceRefresh && (this._val === prevValue))
760
+ return;
761
+ this._prevValues.set_Item(0, this._val);
762
+ break;
763
+ case GuiConstants.PARENT_TYPE_TASK:
764
+ Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): task property {0} wasn't handled", this._id));
765
+ return;
766
+ default:
767
+ Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): parentType unknown, property {0} wasn't handled", this._id));
768
+ return;
769
+ }
770
+ switch (this._id) {
771
+ case PropInterface.PROP_TYPE_IMAGE_FILENAME:
772
+ this.onImageFileName();
773
+ break;
774
+ case PropInterface.PROP_TYPE_ENABLED:
775
+ this.onEnable(valChanged);
776
+ break;
777
+ case PropInterface.PROP_TYPE_VISIBLE:
778
+ await this.onVisible(valChanged);
779
+ break;
780
+ case PropInterface.PROP_TYPE_NAME:
781
+ this.OnControlName();
782
+ break;
783
+ case PropInterface.PROP_TYPE_FORM_NAME:
784
+ this.onFormName();
785
+ break;
786
+ case PropInterface.PROP_TYPE_COLUMN_TITLE:
787
+ this.onText(0);
788
+ break;
789
+ case PropInterface.PROP_TYPE_TEXT:
790
+ this.onText(line);
791
+ break;
792
+ case PropInterface.PROP_TYPE_HINT:
793
+ this.onHint();
794
+ break;
795
+ case PropInterface.PROP_TYPE_MODIFIABLE:
796
+ await this.onModifiable();
797
+ break;
798
+ case PropInterface.PROP_TYPE_TOOLTIP:
799
+ this.onTooltip();
800
+ break;
801
+ case PropInterface.PROP_TYPE_DISPLAY_LIST:
802
+ await this.onDisplayList(line);
803
+ break;
804
+ case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
805
+ this.onAutoCompleteMode();
806
+ break;
807
+ case PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST:
808
+ await this.onVisibleLayerList(line);
809
+ break;
810
+ case PropInterface.PROP_TYPE_FORMAT:
811
+ this.onFormat();
812
+ break;
813
+ case PropInterface.PROP_TYPE_LABEL:
814
+ await this.onLabel(line);
815
+ break;
816
+ case PropInterface.PROP_TYPE_PASSWORD:
817
+ this.onPassword();
818
+ break;
819
+ case PropInterface.PROP_TYPE_MODIFY_IN_QUERY:
820
+ case PropInterface.PROP_TYPE_TAB_IN:
821
+ case PropInterface.PROP_TYPE_PARK_ON_CLICK:
822
+ case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
823
+ break;
824
+ case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
825
+ this.onCustomProperties();
826
+ break;
827
+ case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
828
+ this.onCustomValidators();
829
+ break;
830
+ case PropInterface.PROP_TYPE_BINDING_LEVEL:
831
+ this.onBindingLevel();
832
+ break;
833
+ default:
834
+ Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): Property {0} wasn't handled", this._id));
835
+ break;
836
+ }
837
+ }
838
+ ShouldBeComputedOnce() {
839
+ if (this._parentType === GuiConstants.PARENT_TYPE_TASK) {
840
+ switch (this._id) {
841
+ case PropInterface.PROP_TYPE_TASK_MODE:
842
+ case PropInterface.PROP_TYPE_PRELOAD_VIEW:
843
+ case PropInterface.PROP_TYPE_TABBING_CYCLE:
844
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
845
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
846
+ case PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY:
847
+ case PropInterface.PROP_TYPE_PRINT_DATA:
848
+ case PropInterface.PROP_TYPE_ALLOW_RANGE:
849
+ case PropInterface.PROP_TYPE_ALLOW_LOCATE:
850
+ case PropInterface.PROP_TYPE_ALLOW_SORT:
851
+ case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
852
+ case PropInterface.PROP_TYPE_MAIN_DISPLAY:
853
+ return true;
854
+ }
855
+ }
856
+ else if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
857
+ if (this._id === PropInterface.PROP_TYPE_IS_CACHED || this._id === PropInterface.PROP_TYPE_MULTILINE)
858
+ return true;
859
+ }
860
+ return false;
861
+ }
862
+ IsComputedOnceOnServer() {
863
+ if (this.ShouldBeComputedOnce()) {
864
+ let task = this.GetTaskByParentObject();
865
+ if (task != null)
866
+ return !task.ShouldEvaluatePropertyLocally(this._id);
867
+ }
868
+ return false;
869
+ }
870
+ async ComputeValue() {
871
+ let result = null;
872
+ let len = 255;
873
+ let wasEvaluated = new RefParam(false);
874
+ if (this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) {
875
+ await this.computeCustomPropertiesValues();
876
+ result = this.GetArrayValuesForCustomProperties();
877
+ this.setValue(result);
878
+ }
879
+ if (this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) {
880
+ let evaluated = await this.computeCustomValidators();
881
+ if (evaluated) {
882
+ result = this.GetArrayValuesForCustomValidationProperties();
883
+ this.setValue(result);
884
+ }
885
+ }
886
+ else if (this._expId > 0) {
887
+ if (this.ShouldBeComputedOnce() && this._expAlreadyComputedOnce)
888
+ return;
889
+ this._expAlreadyComputedOnce = true;
890
+ let alwaysEvaluate = false;
891
+ if (this._parentType === GuiConstants.PARENT_TYPE_TASK)
892
+ alwaysEvaluate = true;
893
+ if (this._id === PropInterface.PROP_TYPE_FORMAT) {
894
+ len = 65535;
895
+ result = StrUtil.rtrim(await this._parentObj.EvaluateExpression(this._expId, this._dataType, len, true, StorageAttribute.SKIP, alwaysEvaluate, wasEvaluated));
896
+ }
897
+ else {
898
+ try {
899
+ result = await this._parentObj.EvaluateExpression(this._expId, this._dataType, len, true, StorageAttribute.SKIP, alwaysEvaluate, wasEvaluated);
900
+ }
901
+ catch (e) {
902
+ let warningMsg = new StringBuilder("Exception: " + e.Message);
903
+ if (this._parentObj instanceof GuiControlPropertyAdapter)
904
+ warningMsg.Append(" Control: " + this._parentObj.Name);
905
+ Events.WriteWarningToLog(warningMsg.ToString());
906
+ }
907
+ }
908
+ if (wasEvaluated.value) {
909
+ result = this.updateResult(result);
910
+ this.setValue(result);
911
+ }
912
+ else if (this._val == null && this._parentType !== GuiConstants.PARENT_TYPE_CONTROL) {
913
+ result = PropDefaults.getDefaultValue(this._id, this._parentType, this._parentObj);
914
+ this.setValue(result);
915
+ }
916
+ }
917
+ }
918
+ updateResult(result) {
919
+ switch (this._id) {
920
+ case PropInterface.PROP_TYPE_FORMAT:
921
+ if (result == null)
922
+ result = NString.Empty;
923
+ break;
924
+ case PropInterface.PROP_TYPE_TASK_MODE:
925
+ result = Property.updateTaskModeResult(result);
926
+ break;
927
+ default:
928
+ return result;
929
+ }
930
+ return result;
931
+ }
932
+ static updateTaskModeResult(result) {
933
+ let code = ' ';
934
+ if (!NString.IsNullOrEmpty(result)) {
935
+ code = result[0].toUpperCase();
936
+ switch (code) {
937
+ case 'Q':
938
+ code = 'E';
939
+ break;
940
+ case 'F':
941
+ code = 'O';
942
+ break;
943
+ case 'O':
944
+ code = 'N';
945
+ break;
946
+ }
947
+ }
948
+ return code;
949
+ }
950
+ async getValue() {
951
+ await this.ComputeValue();
952
+ return this._val;
953
+ }
954
+ async getValueInt() {
955
+ let result = 0;
956
+ await this.ComputeValue();
957
+ if (this._val !== null)
958
+ result = NNumber.Parse(this._val);
959
+ return result;
960
+ }
961
+ GetComputedValueInteger() {
962
+ return NNumber.Parse(this._val);
963
+ }
964
+ async getValueBoolean() {
965
+ if (this._dataType === StorageAttribute.BOOLEAN) {
966
+ await this.getValue();
967
+ return DisplayConvertor.toBoolean(this._val);
968
+ }
969
+ else {
970
+ Events.WriteExceptionToLog(NString.Format("Property.getValueBoolean() was called for non boolean type property: {0}", this._id));
971
+ }
972
+ }
973
+ GetComputedValue() {
974
+ return this._val;
975
+ }
976
+ GetComputedValueBoolean() {
977
+ if (this._dataType === StorageAttribute.BOOLEAN) {
978
+ return DisplayConvertor.toBoolean(this._val);
979
+ }
980
+ else {
981
+ Events.WriteExceptionToLog(NString.Format("Property.getValueBoolean() was called for non boolean type property: {0}", this._id));
982
+ }
983
+ }
984
+ getPrevValue(line) {
985
+ if (line < this._prevValues.length)
986
+ return this._prevValues.get_Item(line);
987
+ return null;
988
+ }
989
+ isExpression() {
990
+ return this._expId > 0;
991
+ }
992
+ GetExpressionId() {
993
+ return this._expId;
994
+ }
995
+ onImageFileName() {
996
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
997
+ let mgControlBase = this._parentObj;
998
+ if (mgControlBase.isTabControl()) {
999
+ mgControlBase.setImageList(this.GetComputedValue());
1000
+ }
1001
+ else if (mgControlBase.isImageControl() || mgControlBase.isRadio() || mgControlBase.isCheckBox() || mgControlBase.IsImageButton()) {
1002
+ mgControlBase.setImageWithFileName(this.GetComputedValue());
1003
+ }
1004
+ }
1005
+ else
1006
+ throw new ApplicationException("in onImageFileName.onEnable()");
1007
+ }
1008
+ onEnable(valChanged) {
1009
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1010
+ let ctrl = this._parentObj;
1011
+ let currentEditingControl = ctrl.getForm().getTask().CurrentEditingControl;
1012
+ if (this._val !== null && this._val === "0" && valChanged && currentEditingControl !== null &&
1013
+ (ctrl === currentEditingControl || currentEditingControl.isDescendentOfControl(ctrl) || ctrl === currentEditingControl.getLinkedParent(false))) {
1014
+ let parkedControl = ctrl.getForm().getTask().getLastParkedCtrl();
1015
+ if (parkedControl !== null && parkedControl.InControl && (ctrl === parkedControl || parkedControl.isDescendentOfControl(ctrl))) {
1016
+ Events.OnNonParkableLastParkedCtrl(ctrl);
1017
+ ctrl.getForm().getTask().CurrentEditingControl = null;
1018
+ }
1019
+ }
1020
+ ctrl.SetEnabled(this.GetComputedValueBoolean());
1021
+ }
1022
+ else
1023
+ throw new ApplicationException("in Property.onEnable()");
1024
+ }
1025
+ async onVisible(valChanged) {
1026
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1027
+ let ctrl = this._parentObj;
1028
+ let currentEditingControl = ctrl.getForm().getTask().CurrentEditingControl;
1029
+ if (this._val !== null && this._val === "0" && valChanged && currentEditingControl !== null &&
1030
+ (ctrl === currentEditingControl || currentEditingControl.isDescendentOfControl(ctrl) || ctrl === currentEditingControl.getLinkedParent(false))) {
1031
+ let parkedControl = ctrl.getForm().getTask().getLastParkedCtrl();
1032
+ if (parkedControl !== null && parkedControl.InControl && (ctrl === parkedControl || parkedControl.isDescendentOfControl(ctrl))) {
1033
+ Events.OnNonParkableLastParkedCtrl(ctrl);
1034
+ ctrl.getForm().getTask().CurrentEditingControl = null;
1035
+ }
1036
+ }
1037
+ await ctrl.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, this.GetComputedValueBoolean(), true);
1038
+ }
1039
+ }
1040
+ OnControlName() {
1041
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1042
+ }
1043
+ else
1044
+ throw new ApplicationException("in Property.OnControlName()");
1045
+ }
1046
+ onHint() {
1047
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1048
+ let control = this.getObjectByParentObj();
1049
+ let translatedString = Events.Translate(this.GetComputedValue());
1050
+ if (!control.IsDateTimePicture() && (!control.IsTableChild || control.IsTableHeaderChild)) {
1051
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.PlaceHolder, translatedString);
1052
+ }
1053
+ }
1054
+ else
1055
+ throw new ApplicationException("inProperty.onHint()");
1056
+ }
1057
+ onFormName() {
1058
+ if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
1059
+ this.addCommandTypeText(0);
1060
+ else
1061
+ throw new ApplicationException("in Property.onFormName()");
1062
+ }
1063
+ addCommandTypeText(line) {
1064
+ let mlsTransValue = Events.Translate(this.GetComputedValue());
1065
+ if (this._parentType === GuiConstants.PARENT_TYPE_FORM ||
1066
+ (this._parentType === GuiConstants.PARENT_TYPE_CONTROL && this._parentObj.isColumnControl())) {
1067
+ mlsTransValue = StrUtil.rtrim(mlsTransValue);
1068
+ if (this._parentType === GuiConstants.PARENT_TYPE_FORM && mlsTransValue === NString.Empty) {
1069
+ mlsTransValue = " ";
1070
+ }
1071
+ }
1072
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL && (this._parentObj.isTextControl()
1073
+ || (this._parentObj.isButton())))
1074
+ Commands.addValueWithLine(CommandType.SET_VALUE, this._parentObj, line, mlsTransValue);
1075
+ else
1076
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this._parentObj, line, HtmlProperties.Text, mlsTransValue);
1077
+ }
1078
+ onText(line) {
1079
+ this.addCommandTypeText(line);
1080
+ }
1081
+ async onModifiable() {
1082
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1083
+ let ctrl = this._parentObj;
1084
+ if (ctrl.isTextControl() || ctrl.isChoiceControl() || ctrl.isCheckBox()) {
1085
+ let task = this.GetTaskByParentObject();
1086
+ let readOnlyValue = !this.GetComputedValueBoolean();
1087
+ if ((readOnlyValue || task.getMode() !== Constants.TASK_MODE_QUERY) && ctrl.GetCurrReadOnly() !== readOnlyValue) {
1088
+ ctrl.SetCurrReadOnly(readOnlyValue);
1089
+ if (UtilStrByteMode.isLocaleDefLangDBCS()) {
1090
+ if (await ctrl.getForm().getTask().checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY, false)) {
1091
+ return;
1092
+ }
1093
+ }
1094
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.ReadOnly, readOnlyValue);
1095
+ }
1096
+ }
1097
+ }
1098
+ else
1099
+ throw new ApplicationException("in Property.onModifiable()");
1100
+ }
1101
+ onTooltip() {
1102
+ let toolTip;
1103
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1104
+ let ctrl = this._parentObj;
1105
+ if (this._expId === 0)
1106
+ toolTip = ctrl.getForm().getTask().getHelpItem(NNumber.Parse(this._val)).tooltipHelpText;
1107
+ else
1108
+ toolTip = this._val;
1109
+ toolTip = StrUtil.rtrim(toolTip);
1110
+ if (ctrl.isButton() && ctrl.ConnectedControl)
1111
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, ctrl.ConnectedControl, this.getLine(), HtmlProperties.ZoomButtonTooltip, toolTip);
1112
+ else
1113
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, ctrl, this.getLine(), HtmlProperties.Tooltip, toolTip);
1114
+ }
1115
+ else
1116
+ throw new ApplicationException("in Property.onTooltip()");
1117
+ }
1118
+ async onDisplayList(currLine) {
1119
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1120
+ let ctrl = this._parentObj;
1121
+ if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio() || ctrl.HasAutocomplete()) {
1122
+ let line = (currLine === Int32.MinValue) ? ctrl.getDisplayLine(false) : currLine;
1123
+ await ctrl.refreshAndSetItemsList(line, true);
1124
+ }
1125
+ }
1126
+ else
1127
+ throw new ApplicationException("in Property.onDisplayList()");
1128
+ }
1129
+ async onVisibleLayerList(currLine) {
1130
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1131
+ let ctrl = this._parentObj;
1132
+ let line = 0;
1133
+ if (currLine === Int32.MinValue)
1134
+ line = ctrl.getDisplayLine(false);
1135
+ else
1136
+ line = currLine;
1137
+ await ctrl.refreshTabForLayerList(line);
1138
+ }
1139
+ else
1140
+ throw new ApplicationException("in Property.onVisibleLayerList()");
1141
+ }
1142
+ onFormat() {
1143
+ let ctrl = null;
1144
+ let ctrlPic;
1145
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1146
+ ctrl = this._parentObj;
1147
+ ctrlPic = ctrl.getPIC();
1148
+ ctrl.resetPrevVal();
1149
+ switch (ctrl.Type) {
1150
+ case MgControlType.CTRL_TYPE_BUTTON:
1151
+ if (ctrl.getField() == null && !ctrl.expressionSetAsData() || ctrl.IsImageButton() || (this._parentObj.IsFirstRefreshOfProps()))
1152
+ this.addCommandTypeText(this.getLine());
1153
+ break;
1154
+ case MgControlType.CTRL_TYPE_TEXT:
1155
+ if (ctrl.Type === MgControlType.CTRL_TYPE_TEXT) {
1156
+ if (ctrlPic.getAttr() !== StorageAttribute.NUMERIC) {
1157
+ }
1158
+ }
1159
+ break;
1160
+ }
1161
+ }
1162
+ else
1163
+ throw new ApplicationException("in Property.onFormat()");
1164
+ }
1165
+ async onLabel(currLine) {
1166
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1167
+ let ctrl = this._parentObj;
1168
+ let line;
1169
+ if (currLine === Int32.MinValue)
1170
+ line = ctrl.getDisplayLine(false);
1171
+ else
1172
+ line = currLine;
1173
+ if (ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX)
1174
+ this.addCommandTypeText(line);
1175
+ else if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio()) {
1176
+ ctrl.setRange(await this.getValue());
1177
+ ctrl.clearRange(line);
1178
+ await ctrl.refreshAndSetItemsList(line, true);
1179
+ if (this._expId > 0)
1180
+ await ctrl.ComputeAndRefreshDisplayValue(false);
1181
+ }
1182
+ else if (ctrl.HasAutocomplete())
1183
+ await ctrl.refreshAndSetItemsList(line, true);
1184
+ else
1185
+ throw new ApplicationException("Property.onLabel(), not support control");
1186
+ }
1187
+ else
1188
+ throw new ApplicationException("in Property.onLabel()");
1189
+ }
1190
+ getObjectByParentObj() {
1191
+ let result = this._parentObj;
1192
+ if (this._parentType === GuiConstants.PARENT_TYPE_FORM) {
1193
+ let form = this._parentObj;
1194
+ if (form.isSubForm())
1195
+ result = form.getSubFormCtrl();
1196
+ }
1197
+ return result;
1198
+ }
1199
+ static isRepeatableInTable() {
1200
+ return false;
1201
+ }
1202
+ getLine() {
1203
+ let line = 0;
1204
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1205
+ let ctrl = this._parentObj;
1206
+ let displayLineForTreeOrTable = ctrl.isPropertyRepeatable(this._id);
1207
+ line = ctrl.getDisplayLine(displayLineForTreeOrTable);
1208
+ }
1209
+ return line;
1210
+ }
1211
+ getOrgValue() {
1212
+ return this._orgValue;
1213
+ }
1214
+ updatePrevValueArray(newSize) {
1215
+ if (!this.ShouldSkipRefresh())
1216
+ this._prevValues.SetSize(newSize);
1217
+ }
1218
+ clearPrevValueArray() {
1219
+ this._prevValues.Clear();
1220
+ }
1221
+ ResetPrevValueArray() {
1222
+ let count = this._prevValues.length;
1223
+ this._prevValues.Clear();
1224
+ this._prevValues.SetSize(count);
1225
+ }
1226
+ setPrevArraySize() {
1227
+ if (this._parentType === GuiConstants.PARENT_TYPE_FORM || this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1228
+ let size = 1;
1229
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
1230
+ let mgControlBase = this._parentObj;
1231
+ if (mgControlBase.IsRepeatable)
1232
+ size = mgControlBase.getForm().getTableItemsCount();
1233
+ else if (mgControlBase.isTableControl() && Property.isRepeatableInTable())
1234
+ size = mgControlBase.getForm().getTableItemsCount();
1235
+ }
1236
+ this._prevValues.SetSize(size);
1237
+ }
1238
+ }
1239
+ onPassword() {
1240
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
1241
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.Password, this.GetComputedValueBoolean());
1242
+ else
1243
+ throw new ApplicationException("in Property.onPassword()");
1244
+ }
1245
+ async computeCustomPropertiesValues() {
1246
+ for (let [customPropertyKey, customPropertyValue] of this.customProperties) {
1247
+ let expression = customPropertyValue;
1248
+ let retExpressionValue = await this.GetRetrunValueForCustomPropertyExpression(expression);
1249
+ this.customPropertiesValues.set(customPropertyKey, retExpressionValue);
1250
+ }
1251
+ }
1252
+ async computeCustomValidators() {
1253
+ let mgControl = this._parentObj;
1254
+ let evaluated = true;
1255
+ if (mgControl.ModifiedByUser || mgControl.ValidateControl || this.GetTaskByParentObject().IsInRecompute()) {
1256
+ for (let [customPropertyKey, customValidatorProperty] of this.customValidatorProperties) {
1257
+ let expression = customValidatorProperty._exp;
1258
+ let isInValid = await this.GetRetrunValueForCustomPropertyExpression(expression);
1259
+ let errString = "";
1260
+ let InValid = (isInValid === "1") ? true : false;
1261
+ if (InValid) {
1262
+ expression = customValidatorProperty._errorMessageExp;
1263
+ if (expression > 0)
1264
+ errString = await this.GetRetrunValueForCustomPropertyExpression(expression);
1265
+ else
1266
+ errString = customValidatorProperty._errorMessage;
1267
+ }
1268
+ evaluated = true;
1269
+ this.customValidatorValues.set(customPropertyKey, new CustomValidator(!InValid, errString));
1270
+ }
1271
+ }
1272
+ else {
1273
+ if (mgControl.isRepeatable()) {
1274
+ this.customValidatorValues.clear();
1275
+ evaluated = false;
1276
+ }
1277
+ }
1278
+ return evaluated;
1279
+ }
1280
+ onCustomProperties() {
1281
+ for (let [customPropertyKey, customPropertyValue] of this.customPropertiesValues) {
1282
+ Commands.addOperationWithLine(CommandType.PROP_SET_USER_PROPERTY, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
1283
+ }
1284
+ }
1285
+ onCustomValidators() {
1286
+ for (let [customPropertyKey, customPropertyValue] of this.customValidatorValues) {
1287
+ Commands.addOperationWithLine(CommandType.PROP_SET_CUSTOM_VALIDATOR, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
1288
+ }
1289
+ }
1290
+ onBindingLevel() {
1291
+ if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
1292
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.BindingLevel, this.GetComputedValueInteger());
1293
+ else
1294
+ throw new ApplicationException("in Property.BindingLevel()");
1295
+ }
1296
+ onAutoCompleteMode() {
1297
+ }
1298
+ async GetRetrunValueForCustomPropertyExpression(expression) {
1299
+ let len = 255;
1300
+ let expStorageAttribute = this._parentObj.GetExpressionStorage(expression);
1301
+ let wasEvaluated = new RefParam(false);
1302
+ let returnValue = await this._parentObj.EvaluateExpression(expression, expStorageAttribute, len, true, StorageAttribute.SKIP, false, wasEvaluated);
1303
+ expStorageAttribute = this._parentObj.GetExpressionStorage(expression);
1304
+ let compIdx = this._parentObj.getCompIdx();
1305
+ switch (expStorageAttribute) {
1306
+ case StorageAttribute.NUMERIC:
1307
+ let tempPic = new PIC("N6.2", StorageAttribute.NUMERIC, this._parentObj.getCompIdx());
1308
+ if (returnValue == null)
1309
+ returnValue = "FF00000000000000000000000000000000000000";
1310
+ returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, false, compIdx, false).trim();
1311
+ break;
1312
+ case StorageAttribute.DATE:
1313
+ tempPic = new PIC("##/##/####", expStorageAttribute, compIdx);
1314
+ returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, true, false, compIdx, true);
1315
+ break;
1316
+ case StorageAttribute.TIME:
1317
+ tempPic = new PIC("##:##/####", expStorageAttribute, compIdx);
1318
+ returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, true, false, compIdx, true);
1319
+ break;
1320
+ case StorageAttribute.ALPHA:
1321
+ case StorageAttribute.BOOLEAN:
1322
+ case StorageAttribute.BLOB:
1323
+ case StorageAttribute.BLOB_VECTOR:
1324
+ case StorageAttribute.UNICODE:
1325
+ case StorageAttribute.NONE:
1326
+ break;
1327
+ default:
1328
+ throw new ApplicationException("in Property.GetRetrunValueForCustomPropertyExpression() illegal data type: " + expStorageAttribute);
1329
+ }
1330
+ return returnValue;
1331
+ }
1332
+ RemovePrevValIndexAt(idx) {
1333
+ if (this._prevValues.length > idx) {
1334
+ this._prevValues.RemoveAt(idx);
1335
+ }
1336
+ }
1337
+ InsertPrevValAt(idx) {
1338
+ this._prevValues.Insert(idx, null);
1339
+ }
1340
+ resetPrevValAt(idx) {
1341
+ if (idx >= 0 && idx < this._prevValues.length)
1342
+ this._prevValues.set_Item(idx, null);
1343
+ }
1344
+ toString() {
1345
+ return NString.Format("{0} = {1} (exp={2}, studio value={3})", [
1346
+ PropDefaults.GetPropertyName(this._id), (this._val === null) ? "is null" : this._val, this._expId, this.StudioValue
1347
+ ]);
1348
+ }
1349
+ static getDefaultProp(propId, parentType, propParent) {
1350
+ let prop = null;
1351
+ let mgVal = PropDefaults.getDefaultValue(propId, parentType, propParent);
1352
+ if (mgVal !== null)
1353
+ prop = new Property(propId, propParent, parentType, mgVal);
1354
+ return prop;
1355
+ }
1356
+ InsertPrevValueArray(count) {
1357
+ if (!this.ShouldSkipRefresh())
1358
+ this._prevValues.InsertRange(new Array(count));
1359
+ }
1360
+ }
1361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL1Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLEtBQUssRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLFNBQVMsRUFFVCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsVUFBVSxFQUNWLGVBQWUsRUFDZixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFekYsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSTVDLE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsSUFBSSxDQUFTO0lBQ2IsZ0JBQWdCLENBQVM7SUFDekIs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QUFDLCtCQUErQixDQUFDO1lBQ25ELEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLG1DQUFtQyxDQUFDO1lBQ3ZELEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLDBCQUEwQixDQUFDO1lBQzlDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLEtBQUssYUFBYSxDQUFDLDZCQUE2QixDQUFDO1lBQ2pELEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHlCQUF5QixDQUFDO1lBQzdDLEtBQUssYUFBYSxDQUFDLHNCQUFz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SUFHRCxRQUFRO1FBQ04sT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHVDQUF1QyxFQUFFO1lBQzdELFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDcEgsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQVVELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBYyxFQUFFLFVBQWtCLEVBQUUsVUFBK0I7UUFDdkYsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDO1FBQzFCLElBQUksS0FBSyxHQUFXLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVqRixJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ2hCLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU3RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBJbnQzMixcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBDdHJsQnV0dG9uVHlwZUd1aSxcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxJbWVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyfSBmcm9tICcuLi90YXNrcy9UYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyJztcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tICcuLi8uLi9ndWkvUHJvcFBhcmVudEludGVyZmFjZSc7XHJcbmltcG9ydCB7UElDfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7VGFza0RlZmluaXRpb25JZH0gZnJvbSAnLi4vdGFza3MvVGFza0RlZmluaXRpb25JZCc7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQge0d1aUNvbnN0YW50c30gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHtQcm9wSW50ZXJmYWNlfSBmcm9tICcuL1Byb3BJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gJy4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7RGlzcGxheUNvbnZlcnRvcn0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHtHdWlGb3JtUHJvcGVydHlBZGFwdGVyfSBmcm9tICcuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQge0NvbW1hbmRzfSBmcm9tICcuLi8uLi9Db21tYW5kcyc7XHJcbmltcG9ydCB7Q29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gJy4uL3Rhc2tzL0d1aVRhc2tCYXNlJztcclxuaW1wb3J0IHtQcm9wRGVmYXVsdHN9IGZyb20gJy4vUHJvcERlZmF1bHRzJztcclxuaW1wb3J0IHtUb29sVGlwSGVscH0gZnJvbSAnLi9IZWxwcyc7XHJcbmltcG9ydCB7TWdDb250cm9sQmFzZX0gZnJvbSAnLi9NZ0NvbnRyb2xCYXNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21WYWxpZGF0b3JQcm9wIHtcclxuICBfZXhwOiBudW1iZXI7XHJcbiAgX2Vycm9yTWVzc2FnZUV4cDogbnVtYmVyO1xyXG4gIF9lcnJvck1lc3NhZ2U6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21WYWxpZGF0b3Ige1xyXG4gIF92YWxpZDogYm9vbGVhbjtcclxuICBfZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbGlkOiBib29sZWFuLCBlcnJNZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3ZhbGlkID0gdmFsaWQ7XHJcbiAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnJNZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVmFsaWQoKTogYm9vbGVhbiB7cmV0dXJuIHRoaXMuX3ZhbGlkO31cclxuICBwdWJsaWMgZ2V0RXJyTWVzc2FnZSgpOiBzdHJpbmcge3JldHVybiB0aGlzLl9lcnJvck1lc3NhZ2U7fVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFByb3BlcnR5IG9iamVjdCBvZiBjb250cm9sLCBmb3JtIG9yIHRhc2suXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eSB7XHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX2RhdGFUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIHByaXZhdGUgX3ZhbDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9waWM6IFBJQyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXhwSWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfcGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlID0gbnVsbDsgLy8gYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3QgKENvbnRyb2wsIEZvcm0sIEd1aVRhc2tCYXNlKVxyXG4gIHByaXZhdGUgX3BhcmVudFR5cGU6IHN0cmluZyA9IG51bGw7IC8vIENvbnRyb2x8Rm9ybXxHdWlUYXNrQmFzZVxyXG4gIHByaXZhdGUgX3ByZXZWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IG51bGw7IC8vIHJldmVyZW5jZSB0byBwcm9wZXJ0eSB2YWx1ZXMgaW4gYSB0YWJsZVxyXG4gIHByaXZhdGUgX29yZ1ZhbHVlOiBzdHJpbmcgPSBudWxsOyAvLyByZXZlcmVuY2UgdG8gcHJvcGVydHkgdmFsdWVzIGluIGEgdGFibGVcclxuICBwcml2YXRlIHN0YXRpYyBfbnVtZXJpY1Byb3BlcnR5UGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Rhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQgPSBudWxsOyAvLyB0YXNrIGRlZmluaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eS5cclxuICAvLyBzdHVkaW9WYWx1ZSBmb3Igb2ZmbGluZSBzdGF0ZVxyXG4gIC8vIFRvRG86IGNvbW1lbnQgc2F5cyB0aGF0IGl0IGlzIGZvciBcIk9mZmxpbmUgc3RhdGVcIi4gU28sIGRvIHdlIG5lZWQgaXQgaW5XZWJDbGllbnQ/XHJcbiAgU3R1ZGlvVmFsdWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXhwQWxyZWFkeUNvbXB1dGVkT25jZTogYm9vbGVhbiA9IGZhbHNlOyAvLyB0aGUgZXhwcmVzc2lvbiBpcyBhbHJlYWR5IGNvbXB1dGVkIG9uY2VcclxuXHJcbiAgLy8gZm9yIHdlYiBjbGllbnQgOlxyXG4gIC8vIHNhdmUgdGhlIGN1c3RvbSBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIGJ5IHRoZSB1c2VyXHJcbiAgcHJpdmF0ZSBjdXN0b21Qcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgY3VzdG9tUHJvcGVydGllc1ZhbHVlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgLy8gZm9yIHdlYiBjbGllbnQgOlxyXG4gIC8vIHNhdmUgdGhlIGN1c3RvbSB2YWxpZGF0b3JzIHRoYXQgZGVmaW5lIGJ5IHRoZSB1c2VyXHJcbiAgcHJpdmF0ZSBjdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBDdXN0b21WYWxpZGF0b3JQcm9wPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGN1c3RvbVZhbGlkYXRvclZhbHVlczogTWFwPHN0cmluZywgQ3VzdG9tVmFsaWRhdG9yPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgc3RhdGljIFV0aWxJbWVKcG46IFV0aWxJbWVKcG4gPSAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpID8gbmV3IFV0aWxJbWVKcG4oKSA6IG51bGwpOyAvLyBKUE46IElNRSBzdXBwb3J0XHJcblxyXG4gIC8vIHRhc2sgZGVmaW5pdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5LlxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHZhbDogc3RyaW5nKTtcclxuICBjb25zdHJ1Y3RvcihjSWQ/OiBudW1iZXIsIGNQYXJlbnRPYmo/OiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlPzogc3RyaW5nLCB2YWw/OiBzdHJpbmcpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY0lkLCBjUGFyZW50T2JqLCBwYXJUeXBlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8yKGNJZCwgY1BhcmVudE9iaiwgcGFyVHlwZSwgdmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMgPSBuZXcgTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgdGhpcy5zZXRJZChjSWQpO1xyXG4gICAgdGhpcy5fcGFyZW50T2JqID0gY1BhcmVudE9iajtcclxuICAgIHRoaXMuX3BhcmVudFR5cGUgPSBwYXJUeXBlO1xyXG4gICAgdGhpcy5zZXREYXRhVHlwZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY0lkLCBjUGFyZW50T2JqLCBwYXJUeXBlKTtcclxuICAgIHRoaXMuc2V0VmFsdWUodmFsKTtcclxuICAgIHRoaXMuc2V0T3JnVmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGlkIG9mIHRoaXMgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0SWQoY0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2lkID0gY0lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE5lZWQgcGFydCBpbnB1dCBTdHJpbmcgdG8gcmVsZXZhbnQgZm9yIHRoZSBjbGFzcyBkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFJlZlwiPnJlZmVyZW5jZSB0byBwYXJlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBmaWxsRGF0YShwYXJlbnRSZWY6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhclR5cGU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoXCI+XCIsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iaiA9PT0gbnVsbCAmJiBwYXJlbnRSZWYgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGFyZW50T2JqID0gcGFyZW50UmVmO1xyXG4gICAgICB0aGlzLl9wYXJlbnRUeXBlID0gcGFyVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApICsgWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKSB7XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJJbiBQcm9wLkZpbGxEYXRhKCk6IHswfVwiLCB0b2tlbnNWZWN0b3IudG9TdHJpbmcoKSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IpO1xyXG5cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRS5sZW5ndGgpO1xyXG5cclxuICAgICAgLy8gZGVhbCB3aXRoIGludGVybmFsIHRhZ3NcclxuICAgICAgdGhpcy5Jbml0SW5uZXJPYmplY3RzKHBhcnNlcik7XHJcblxyXG4gICAgICAvLyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyB0eXBlcyBuZWVkIHNldCBwYXJhbWV0ZXJzIHRvIHRoZSBwYXJlbnQgLSBDT05UUk9MIChpbiB0aGlzIGNhc2UpXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgICB0aGlzLnNldENvbnRyb2xBdHRyaWJ1dGVzKCk7XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKVxyXG4gICAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZSgxKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJJbiBQcm9wZXJ0eS5GaWxsRGF0YSgpOiBPdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5pdElubmVyT2JqZWN0cyh4bWxQYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IG5leHRUYWc6IHN0cmluZyA9IHhtbFBhcnNlci5nZXROZXh0VGFnKCk7XHJcblxyXG4gICAgaWYgKG5leHRUYWcgPT09IFhNTENvbnN0YW50cy5NR19UQUdfVEFTS0RFRklOSVRJT05JRF9FTlRSWSkge1xyXG4gICAgICBsZXQgeG1sQnVmZmVyOiBzdHJpbmcgPSB4bWxQYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgICB0aGlzLkluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcik7XHJcblxyXG4gICAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0geG1sUGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHhtbFBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgIHhtbFBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIChYTUxDb25zdGFudHMuTUdfVEFHX1BST1AgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1ha2UgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBlbGVtZW50cyBieSBmb3VuZCB0b2tlbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+Zm91bmQgdG9rZW5zLCB3aGljaCBjb25zaXN0IGF0dHJpYnV0ZS92YWx1ZSBvZiBldmVyeSBmb3VuZCBlbGVtZW50IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0RWxlbWVudHModG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgICAgdGhpcy5zZXRJZChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB0aGlzLnNldERhdGFUeXBlKCk7IC8vIFRoZSAnbmFtZScgbWVtYmVyIG11c3QgYmUgZm91bmQgaW4gdGhpcyBwb2ludFxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9TVFVESU9fVkFMVUU6XHJcbiAgICAgICAgICB0aGlzLlN0dWRpb1ZhbHVlID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUU6XHJcbiAgICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVByb3BlcnRpZXMoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9FWFA6XHJcbiAgICAgICAgICB0aGlzLl9leHBJZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMCAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUClcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRhVHlwZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAgLy8gTmFtZSBpcyBvbmx5IHNlcmlhbGl6ZWQgZm9yIGRlYnVnIHZlcnNpb24gLlxyXG4gICAgICAgICAgLy8gVG8gYXZvaWQgZXhjZXB0aW9ucywgYWRkIGEgYmxhbmsgY2FzZSBmb3IgaXRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ1RMX0lEWDpcclxuICAgICAgICAgIHRoaXMuX3Rhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXggPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUFJPR1JBTV9JU046XHJcbiAgICAgICAgICB0aGlzLl90YXNrRGVmaW5pdGlvbklkLlByb2dyYW1Jc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIFByb3BlcnR5IGNsYXNzLiBJbnNlcnQgY2FzZSB0byBQcm9wZXJ0eS5pbml0RWxlbWVudHMgZm9yIHswfVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgY29tcHV0ZSBpbiB0aGUgc2VydmVyICwgdGhlbiBzZXQgX2V4cEFscmVhZHlDb21wdXRlZE9uY2VcclxuICAgICAgaWYgKHRoaXMuSXNDb21wdXRlZE9uY2VPblNlcnZlcigpKVxyXG4gICAgICAgIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSBjdXN0b20gcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tUHJvcGVydGllcyhjdXN0b21Qcm9wcnRpZXNTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oSlNPTi5wYXJzZShjdXN0b21Qcm9wcnRpZXNTdHIpKTtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgIHRoaXMuU2V0Rmlyc3RWYWx1ZUZvckN1c3RvbVByb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEluaXQgQ3VzdG9tVmFsaWRhdG9yXHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tVmFsaWRhdG9yIChwYXJzZXIgOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gcGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgIHRleHQgPSB0ZXh0LnN1YnN0cih0ZXh0LmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19DVVNUT01fVkFMSURBVE9SKSArIFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUi5sZW5ndGgpO1xyXG4gICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2Vucyh0ZXh0LCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgIGxldCBjID0gbmV3IEN1c3RvbVZhbGlkYXRvclByb3AoKTtcclxuICAgIGxldCBrZXk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b2tlbnMubGVuZ3RoOyBqICs9IDIpXHJcbiAgICB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShqKTtcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSB0b2tlbnMuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VYUDpcclxuICAgICAgICAgIGMuX2V4cCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAga2V5ID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRVJST1JfRVhQOlxyXG4gICAgICAgICAgYy5fZXJyb3JNZXNzYWdlRXhwID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VSUk9SOlxyXG4gICAgICAgICAgYy5fZXJyb3JNZXNzYWdlID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzLnNldCAoa2V5LCBjKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgY3VzdG9tIHZhbGlkYXRpb24gcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoY3VzdG9tUHJvcHJ0aWVzU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgcGFyc2VyID0gbmV3IFhtbFBhcnNlcihjdXN0b21Qcm9wcnRpZXNTdHIpO1xyXG4gICAgbGV0IGN1cnJUYWdOYW1lID0gcGFyc2VyLmdldE5leHRUYWcoKTtcclxuICAgIHdoaWxlIChjdXJyVGFnTmFtZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBzd2l0Y2ggKGN1cnJUYWdOYW1lKVxyXG4gICAgICB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0NVU1RPTV9WQUxJREFUT1JTOlxyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbVZhbGlkYXRvclByb3A+KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUjpcclxuICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVZhbGlkYXRvciAocGFyc2VyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjdXJyVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iai5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgdGhpcy5TZXRGaXJzdFZhbHVlRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIFNldEZpcnN0VmFsdWVGb3JDdXN0b21WYWxpZGF0aW9uUHJvcGVydGllcygpOiB2b2lkIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGN1c3RvbVByb3BlcnR5IG9mIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcy5rZXlzKCkpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcy5zZXQoPHN0cmluZz5jdXN0b21Qcm9wZXJ0eSwgbmV3IEN1c3RvbVZhbGlkYXRvcih0cnVlLCBcIlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGZyb20gdGhlIHZhbHVlIHN0cmluZyBhbmQgc2F2ZSBpdCBpbiB2YWwgJiBvcmdWYWx1ZVxyXG4gICAgdGhpcy5fdmFsID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tVmFsaWRhdG9yVmFsdWVzLnZhbHVlcygpKTtcclxuICAgIGxldCB2YWx1ZXNTdHIgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xyXG4gICAgcmV0dXJuIHZhbHVlc1N0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tUHJvcGVydGllc1ZhbHVlcy52YWx1ZXMoKSk7XHJcbiAgICBsZXQgdmFsdWVzU3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZXNTdHI7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBTZXRGaXJzdFZhbHVlRm9yQ3VzdG9tUHJvcGVydGllcygpOiB2b2lkIHtcclxuXHJcbiAgICBmb3IgKGxldCBjdXN0b21Qcm9wZXJ0eSBvZiB0aGlzLmN1c3RvbVByb3BlcnRpZXMua2V5cygpKVxyXG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMuc2V0KDxzdHJpbmc+Y3VzdG9tUHJvcGVydHksIFwiXCIpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBmcm9tIHRoZSB2YWx1ZSBzdHJpbmcgYW5kIHNhdmUgaXQgaW4gdmFsICYgb3JnVmFsdWVcclxuICAgIHRoaXMuX3ZhbCA9IHRoaXMuR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIEluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgdGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlcjogVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlciA9IG5ldyBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyKHRoaXMuU2V0VGFza0RlZmluaXRpb25JZCk7XHJcbiAgICB0YXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyLnBhcnNlKHhtbEJ1ZmZlcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxsYmFjayBmb3IgVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlclxyXG4gIFNldFRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFza0RlZmluaXRpb25JZCA9IHRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGFUeXBlKCk6IHZvaWQge1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgdGhpcy5fcGljID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5faWQgPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVG8gZmlsbCBkYXRhVHlwZSBtZW1iZXIgaW4gUHJvcGVydHkuRmlsbERhdGFUeXBlIG11c3QgaWQhPXswfVwiLCBJbnQzMi5NaW5WYWx1ZSkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQk9SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlk6XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TWVNURU1fTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRklBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX0NBTkNFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVBFQVRBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJR0hMSUdIVElORzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSRUxPQURfVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkVfVkVSVElDQUxfU0NST0xMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9BTExPV19DUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DT0xfUkVTSVpFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JFT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0hPV19MSU5FUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xfQUxMT1dfRklMVEVSSU5HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfU1RBVFVTX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0g6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSS19PTl9DTElDSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0ZVTExfUk9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQUNLX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0JVVFRPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfQVRfUk9PVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9ESVZJREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVfRElWSURFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9USFJFRV9TVEFURVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUQUlOX0ZPQ1VTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ0xPU0VfVEFTS1NfQllfTURJX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19PUEVOX1RBU0tfV0lORE9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19FVkVOVFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0lOREVYX09QVElNSVpBVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUE9TSVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1NRTF9SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CRUZPUkVfOTAwX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRklMTF9XSURUSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSV9DT0xVTU5fRElTUExBWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fQ09NUExFVEVfTU9ERV9XQzpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUkFTQUNUSU9OX0JFR0lOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19UUkFOU0FDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dBTExQQVBFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJJR0dFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfQ1lDTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSQU1FVEVSUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9MSVNUX0lOREVYRVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MQVlFUlNfTElTVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUFMX09CSkVDVF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEFWSUVXQ09OVFJPTF9GSUVMRFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1JBTkdFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19MT0NBVEVfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1BPU0lUSU9OX1VTQUdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9USVRMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1Q6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1fTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BRERJVElPTkFMX0lORk9STUFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RFWFQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElOVDpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVU9NOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hPUl9GQUM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVkVSX0ZBQzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0FMTFBBUEVSX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lOREVYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTktfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9GSUVMRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QVUxMRE9XTl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fRklUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VYUEFORF9XSU5ET1c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MSU5FUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DSE9JQ0VfQ09MVU1OUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVFlMRV8zRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT05UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBWUVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJRFRIOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0hFSUdIVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xPUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MRUZUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPUDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFTFBfU0NSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVTX0lOX1RBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTl9ST1dTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hPUklaT05UQUxfQUxJR05NRU5UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9XT1JEV1JBUF9TQ1JPTEw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUk9XX0hFSUdIVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfV0lEVEg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTUFJTl9ESVNQTEFZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQU5TTEFUT1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVTRVRfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV0VEX0RJUkVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ST1dfSElHSExJR0hUX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZFUlRJQ0FMX0FMSUdOTUVOVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NUQVRJQ19UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MT0FEX0lNQUdFX0ZST006XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JPVFRPTV9QT1NJVElPTl9JTlRFUlZBTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT05fTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkdUU0tfTlVNOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BFUlNJU1RFTlRfRk9STV9TVEFURV9WRVJTSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVJfVEhVTUI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQklORElOR19MRVZFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVF9QUk9HUkFNOlxyXG4gICAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUCAmJiB0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTtcclxuICAgICAgICAvLyBwaWMgd2lsbCBiZSBzZXQgYWNjb3JkaW5nIHRvIGV4cCBsZW5ndGhcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDO1xyXG4gICAgICAgICAgaWYgKFByb3BlcnR5Ll9udW1lcmljUHJvcGVydHlQaWMgPT0gbnVsbClcclxuICAgICAgICAgICAgUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYyA9IG5ldyBQSUMoXCJONlwiLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIGNvbXBJZHgpO1xyXG4gICAgICAgICAgdGhpcy5fcGljID0gUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUVVJOX0FDVElPTjpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5EYXRhVHlwZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QT1BfVVA6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1JJRU5UQVRJT05fTE9DSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTlRFUl9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVhJVF9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFWSUdBVElPTl9EUkFXRVJfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BQ1RJT05fQkFSX01FTlU6XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fUElDS0VSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fRURJVF9ESUFMT0c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9BTElHTk1FTlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfS0VZQk9BUkRfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9SRVRVUk5fS0VZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NVR0dFU1RJT05TOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PQklMRV9JTUFHRV9MSVNUX0ZJTEVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TV0lQRV9SRUZSRVNIOlxyXG4gICAgICAgIC8vIE5vIGhhbmRsaW5nIGlzIG5lZWRlZCBoZXJlIGFzIHRoZSBwcm9wZXJ0aWVzIGFyZSB2YWxpZCBmb3IgbW9iaWxlIGFzIGZvciBub3cuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBQcm9wZXJ0eS5zZXREYXRhVHlwZSgpIG5vIGNhc2UgZm9yOiB7MH1cIiwgdGhpcy5faWQpKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYXR0cmlidXRlcyBvZiBhIHRoZSBwYXJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRDb250cm9sQXR0cmlidXRlcygpIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmogPT0gbnVsbCB8fCB0aGlzLl9wYXJlbnRUeXBlICE9PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIFByb3BlcnR5LnNldENvbnRyb2xBdHRyaWJ1dGVzKCkgdGhlcmUgaXMgbm8gcGFyZW50IG9yIHRoZSBwYXJlbnQgaXMgbm90IGEgY29udHJvbFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXJlbnRDb250cm9sID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuTmFtZSA9IHRoaXMuX3ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVRUUklCVVRFOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuRGF0YVR5cGUgPSA8U3RvcmFnZUF0dHJpYnV0ZT50aGlzLl92YWxbMF07XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgICBwYXJlbnRDb250cm9sLnNldFBpY1N0cih0aGlzLl92YWwsIHRoaXMuX2V4cElkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFOR0U6XHJcbiAgICAgICAgcGFyZW50Q29udHJvbC5zZXRSYW5nZSh0aGlzLl92YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICAgIGlmICh0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLnNldFZhbEV4cCh0aGlzLl9leHBJZCk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLnNldEZpZWxkKHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgICBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLkJ1dHRvblN0eWxlID0gPEN0cmxCdXR0b25UeXBlR3VpPnRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFZRVI6XHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbCAhPSBudWxsKVxyXG4gICAgICAgICAgcGFyZW50Q29udHJvbC5MYXllciA9IHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaWQgb2YgdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFuZCB0YWtlIGNhcmUgb2YgdGhlIHByZXNlbnRhdGlvbiB0aGUgdmFsdWUgbXVzdCBiZSBpbiBhIG1hZ2ljIGludGVybmFsXHJcbiAgLy8vICAgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIG5ldyB2YWx1ZTwvcGFyYW0+XHJcbiAgc2V0VmFsdWUobWdWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBIHx8IHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OT0RFX0lEIHx8IHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OT0RFX1BBUkVOVElEKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUpXHJcbiAgICAgIHRoaXMuc2V0RGF0YVR5cGUoKTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2RhdGFUeXBlKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIGlmIChtZ1ZhbCA9PSBudWxsKVxyXG4gICAgICAgICAgbWdWYWwgPSBcIkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcclxuICAgICAgICB0aGlzLl92YWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AobWdWYWwsIFwiXCIsIHRoaXMuX3BpYywgZmFsc2UsIGNvbXBJZHgsIGZhbHNlKS50cmltKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICB0aGlzLl92YWwgPSBtZ1ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkuc2V0VmFsdWUoKSBpbGxlZ2FsIGRhdGEgdHlwZTogXCIgKyB0aGlzLl9kYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBhbiBpbnQgdmFsdWUgZGlyZWN0bHksIGFzIGlzIGRvbmUgd2hlbiBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIFNldFZhbHVlKHZhbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl92YWwgPSBTdHJpbmcodmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgdGFrZSBjYXJlIG9mIHRoZSBwcmVzZW50YXRpb24gdGhlIHZhbHVlIG11c3QgYmUgaW4gYSBtYWdpYyBpbnRlcm5hbCBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE9yZ1ZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JnVmFsdWUgPSB0aGlzLl92YWw7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHRhc2sgYnkgdGhlIHBhcmVudCBvYmplY3Q8L3JldHVybnM+XHJcbiAgR2V0VGFza0J5UGFyZW50T2JqZWN0KCk6IEd1aVRhc2tCYXNlIHtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKVxyXG4gICAgICB0YXNrID0gKDxHdWlGb3JtUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5nZXRUYXNrKCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgdGFzayA9ICg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLKVxyXG4gICAgICB0YXNrID0gPEd1aVRhc2tCYXNlPnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICByZXR1cm4gdGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBkaXNwbGF5IGZvciBjb250cm9sIHByb3BlcnRpZXMgYW5kIGZvcm0gcHJvcGVydGllcyBvbmx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlUmVmcmVzaFwiPmlmIHRydWUgdGhlbiByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkoZm9yY2VSZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5V2l0aEN1cnJlbnRMaW5lKGZvcmNlUmVmcmVzaCwgSW50MzIuTWluVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIGJlIHNraXAgZnJvbSB0aGUgcmVmcmVzaCBwcm9wZXJ0aWVzLiBmb3IgYSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2hDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtZ0NvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVCUkVXOlxyXG4gICAgICAgIGlmIChtZ0NvbnRyb2wuaXNUYWJsZUNvbnRyb2woKSlcclxuICAgICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05PREVfSUQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTk9ERV9QQVJFTlRJRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJR0hMSUdIVElORzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVVNUX0lOUFVUOlxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IRUxQX1NDUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfUFJPR1JBTTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV0VEX0RJUkVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVRVUk5fQUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FUVFJJQlVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVBFQVRBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJJR0dFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBWUVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fRklUOlxyXG4gICAgICAvLyBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9WRVJUSUNBTF9TQ1JPTEw6XHJcbiAgICAgIC8vIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FX1dPUkRXUkFQX1NDUk9MTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRVNFVF9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19XSURUSDpcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0g6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSQU1FVEVSUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVRBSU5fRk9DVVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFQUxfT0JKRUNUX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQURESVRJT05BTF9JTkZPUk1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBVklFV0NPTlRST0w6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MX0ZJRUxEUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkdUU0tfTlVNOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lOREVYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElOS19GSUVMRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CRUZPUkVfOTAwX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRVJWRVJfUkVBRF9BSEVBRDpcclxuICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQlVUVE9OX1NUWUxFOlxyXG4gICAgICAgIGlmICghKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5pc1JhZGlvKCkpXHJcbiAgICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNraXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIFRSVUUgaWYgdGhlIHByb3BlcnR5IG5lZWQgdG8gYmUgc2tpcCBmcm9tIHRoZSByZWZyZXNoIHByb3BlcnRpZXMuIGZvciBhIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRTa2lwUmVmcmVzaEZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pO1xyXG5cclxuICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWdGb3JtQmFzZTogR3VpRm9ybVByb3BlcnR5QWRhcHRlciA9IDxHdWlGb3JtUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgIC8vIENvbXB1dGUgcHJvcGVydGllczogYWxsIHRob3NlIHByb3BlcnRpZXMgd2lsbCBiZSByZWZyZXNoIG9ubHkgb25lIHRpbWVcclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfVFlQRTpcclxuICAgICAgICBpZiAoIXRoaXMuX3BhcmVudE9iai5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MSU5FU19JTl9UQUJMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IRUxQX1NDUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BFUlNJU1RFTlRfRk9STV9TVEFURV9WRVJTSU9OOlxyXG4gICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICAvLyByZWZyZXNoIG9ubHkgdGhlIHJlbGV2YW50IHN1YmZvcm0gcHJvcGVydGllcyAoY29sb3IsIGZvbnQsIGV0Yy4pXHJcbiAgICBpZiAoIXNraXAgJiYgbWdGb3JtQmFzZS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG5cclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlM6XHJcbiAgICAgICAgICBza2lwID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBza2lwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIGJlIHNraXAgZnJvbSB0aGUgcmVmcmVzaCBwcm9wZXJ0aWVzLiBmb3IgYSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2hUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUVVFUlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0lOREVYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfQ1lDTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9DQU5DRUw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FVkFMX0VORF9DT05ESVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQVNBQ1RJT05fQkVHSU46XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1RSQU5TQUNUSU9OX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJJTlRfREFUQTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DTE9TRV9UQVNLU19CWV9NRElfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfT1BFTl9UQVNLX1dJTkRPVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19DSFVOS19TSVpFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19JTkRFWF9PUFRJTUlaQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19SQU5HRV9PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfTE9DQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19MT0NBVEVfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1BPU0lUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19QT1NJVElPTl9VU0FHRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfU1FMX1JBTkdFOlxyXG4gICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2tpcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGlnbm9yZWQgYnkgUmVmcmVzaERpc3BsYXkoKSBza2lwIHByb3BlcnRpZXMgd2hpY2ggaGFzIG5vdGhpbmcgdG8gZG8gd2l0aFxyXG4gIC8vLyAgIHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBpZ25vcmVkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2goKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc3dpdGNoICh0aGlzLl9wYXJlbnRUeXBlKSB7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0w6XHJcbiAgICAgICAgc2tpcCA9IHRoaXMuU2hvdWxkU2tpcFJlZnJlc2hDb250cm9sKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk06XHJcbiAgICAgICAgc2tpcCA9IHRoaXMuU2hvdWxkU2tpcFJlZnJlc2hGb3JtKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0s6XHJcbiAgICAgICAgc2tpcCA9IHRoaXMuU2hvdWxkU2tpcFJlZnJlc2hUYXNrKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BPUF9VUDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUklFTlRBVElPTl9MT0NLOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOVEVSX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FWElUX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQVZJR0FUSU9OX0RSQVdFUl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FDVElPTl9CQVJfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUEVOX1BJQ0tFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUEVOX0VESVRfRElBTE9HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfQUxJR05NRU5UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0tFWUJPQVJEX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfS0VZQk9BUkRfUkVUVVJOX0tFWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TVUdHRVNUSU9OUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0JJTEVfSU1BR0VfTElTVF9GSUxFX05BTUU6XHJcbiAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2tpcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBkaXNwbGF5IGZvciBjb250cm9sIHByb3BlcnRpZXMgYW5kIGZvcm0gcHJvcGVydGllcyBvbmx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlUmVmcmVzaFwiPmlmIHRydWUgdGhlbiByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyTGluZVwiPmxpbmUgbnVtYmVyIGluIHRhYmxlIHdoZW4gcmVmcmVzaGluZyBhIGNvbHVtbiBpZiB0aGUgY3VycmVudCBsaW5lIGlzIHJlZnJlc2hlZCBzZXQgdG9cclxuICAvLy8gICAoSW50ZWdlci5NSU5fVkFMVUUpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBSZWZyZXNoRGlzcGxheVdpdGhDdXJyZW50TGluZShmb3JjZVJlZnJlc2g6IGJvb2xlYW4sIGN1cnJMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlXaXRoQ3VyckxpbmVBbmRDaGVja1NraXBSZWZyZXNoKGZvcmNlUmVmcmVzaCwgY3VyckxpbmUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhpcyBtZXRob2QgY2hlY2tzIGlmIHdlIG11c3QgcmVmcmVzaCB0aGUgcHJvcGVydHkgZXZlbiBpZiBpdCBoYXMgZXhwcmVzc2lvblxyXG4gIC8vIEZvciBub3cgaXQgcmV0dXJucyB0cnVlIGZvciBwcm9wZXJ0aWVzIHdpdGggdGV4dCBmb3IgbXVsdGlsaW5ndWFsIHN1cHBvcnRcclxuXHJcbiAgLy8gdG9kbyBOZWVkIHRvIGFkZCBoZXJlIGNoZWNrIGlmIHVzZXIgd2FudHMgbXVsdGlsaW5ndWFsIHN1cHBvcnQgYXQgYWxsXHJcbiAgU2tpcFdoZW5Ob0V4cHJlc3Npb24oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2tpcFdoZW5Ob0V4cHJlc3Npb24gPSB0cnVlO1xyXG5cclxuICAgIGxldCBjdHJsID0gKCh0aGlzLl9wYXJlbnRPYmogaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKSA/IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudE9iaiA6IG51bGwpO1xyXG4gICAgaWYgKChjdHJsICE9IG51bGwgJiYgY3RybC5pc0J1dHRvbigpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0NvbWJvQm94KCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNMaXN0Qm94KCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNSYWRpbygpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzQ2hlY2tCb3goKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc1RhYkNvbnRyb2woKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLklzSW1hZ2VCdXR0b24oKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0NvbHVtbkNvbnRyb2woKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09MVU1OX1RJVExFKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfTElTVCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9URVhUKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVApIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElOVCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUykgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQpfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CSU5ESU5HX0xFVkVMKSlcclxuICAgICAgc2tpcFdoZW5Ob0V4cHJlc3Npb24gPSBmYWxzZTtcclxuICAgIHJldHVybiBza2lwV2hlbk5vRXhwcmVzc2lvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVldmFsdWF0ZSB0aGUgcHJvcGVydHkgdmFsdWUgKGlmIGl0IGhhcyBhbiBleHByZXNzaW9uKSBhbmRcclxuICAvLy8gcmVmcmVzaCB0aGUgZGlzcGxheSBmb3IgY29udHJvbCBwcm9wZXJ0aWVzIGFuZCBmb3JtIHByb3BlcnRpZXMgb25seVxyXG4gIC8vL1xyXG4gIC8vLyBUaGlzIG1ldGhvZCB3YXMgKGFzIGl0cyBuYW1lIGltcGxpZXMpIHJlbGV2YW50IG9ubHkgZm9yIEdVSSBwcm9wZXJ0aWVzLCBpLmUuIHByb3BlcnRpZXMgdGhhdCBhZmZlY3Qgb24gdGhlIGRpc3BsYXkuXHJcbiAgLy8vIE5vbi1HVUkgcHJvcGVydGllcyAoc3VjaCBhcyBQUk9QX1RZUEVfVEFCX0lOKSB3ZXJlIHNraXBwZWQgYW5kIG5vdCByZWV2YWx1YXRlZC5cclxuICAvLy8gVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gR1VJIHByb3BlcnRpZXMgYW5kIG5vbi1HVUkgcHJvcGVydGllcyBpcyBkb25lIGJ5IHRoZSBtZXRob2Qg77+9U2hvdWxkU2tpcFJlZnJlc2jvv71FXHJcbiAgLy8vIE5vdyB3ZSBoYXZlIG5vbi1HVUkgcHJvcGVydGllcyB0aGF0IGFyZSByZWV2YWx1YXRlZCBpbiB0aGlzIGZ1bmN0aW9uOlxyXG4gIC8vLyBQUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZLCBQUk9QX1RZUEVfQ09OVEVYVF9NRU5VLCBQUk9QX1RZUEVfVEFCX0lOLCBQUk9QX1RZUEVfUEFSS19PTl9DTElDSy5cclxuICAvLy8gRm9yIHRoZXNlIHByb3BlcnRpZXMgd2UgZG8gbm90IGV4ZWN1dGUgZXhwbGljaXRseSB0aGVpciBleHByZXNzaW9ucyAoaXQgd2FzIGRvbmUgaW4gMS45IGJ5IENoZWNrUHJvcCBmdW5jdGlvbiksXHJcbiAgLy8vIHdlIG9ubHkgdXNlIHRoZWlyIHZhbHVlcyBieSBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eSBmdW5jdGlvbi4gSXQgaXMgZG9uZSBmb3IgZG8gbm90IGV4ZWN1dGUgdGhlIHByb3BlcnR5IGV4cHJlc3Npb25cclxuICAvLy8gaW4gR1VJIHRocmVhZC4gSW4gR1VJIHRocmVhZCB3ZSBvbmx5IHVzZSB0aGUgcHJvcGVydHkgdmFsdWUuIFNvIGl0IGlzIG5lZWRlZCB0byByZWV2YWx1YXRlIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VSZWZyZXNoXCI+aWYgdHJ1ZSB0aGVuIHJlZnJlc2ggaXMgZm9yY2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXZpb3VzIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJMaW5lXCI+bGluZSBudW1iZXIgaW4gdGFibGUgd2hlbiByZWZyZXNoaW5nIGEgY29sdW1uIGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgcmVmcmVzaGVkIHNldCB0b1xyXG4gIC8vLyAgIChJbnRlZ2VyLk1JTl9WQUxVRSlcclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheVdpdGhDdXJyTGluZUFuZENoZWNrU2tpcFJlZnJlc2goZm9yY2VSZWZyZXNoOiBib29sZWFuLCBjdXJyTGluZTogbnVtYmVyLCBjaGVja1NraXBSZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IG51bGw7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gMDtcclxuICAgIGxldCBwcmV2VmFsdWU6IHN0cmluZztcclxuICAgIGxldCB2YWxDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsID09PSBudWxsICYmIHRoaXMuX2V4cElkID09PSAwKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKSBudWxsIHZhbHVlIGFuZCBleHByZXNzaW9uXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoZWNrU2tpcFJlZnJlc2ggJiYgdGhpcy5TaG91bGRTa2lwUmVmcmVzaCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuX2V4cElkID09PSAwICYmIHRoaXMuU2tpcFdoZW5Ob0V4cHJlc3Npb24oKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aCA9PT0gMClcclxuICAgICAgdGhpcy5zZXRQcmV2QXJyYXlTaXplKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5Db21wdXRlVmFsdWUoKTtcclxuXHJcbiAgICAvLyBiZWZvcmUgdXBkYXRlIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIHByZXBhcmUgZGF0YVxyXG4gICAgc3dpdGNoICh0aGlzLl9wYXJlbnRUeXBlKSB7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0w6XHJcbiAgICAgICAgY3RybCA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICAgIC8vIHJlY29tcHV0ZSB0aGUgUElDIGZvciBmb3JtYXQgcHJvcGVydGllc1xyXG4gICAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUICYmIHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIGN0cmwuY29tcHV0ZVBJQyh0aGlzLl92YWwpO1xyXG5cclxuICAgICAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUgJiYgIWN0cmwuZ2V0Rm9ybSgpLmlzUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKCkpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChjdXJyTGluZSA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgICBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGluZSA9IGN1cnJMaW5lO1xyXG5cclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkIHRvIHByZXZlbnQgc2VuZGluZyByZWR1bmRhbnRcclxuICAgICAgICAvLyBqYXZhc2NyaXB0IGNvbW1hbmRzIHRvIHRoZSBicm93c2VyXHJcbiAgICAgICAgcHJldlZhbHVlID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbShsaW5lKTtcclxuXHJcblxyXG4gICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICh0aGlzLl92YWwgPT09IHByZXZWYWx1ZSlcclxuICAgICAgICAgICYmIHRoaXMuX2lkICE9PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRklBQkxFXHJcbiAgICAgICAgICAmJiB0aGlzLl9pZCAhPT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRVxyXG4gICAgICAgICAgJiYgdGhpcy5faWQgIT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIHRvIHByZXZlbnQgcmVjdXJzaW9uIHdoaWxlIHVwZGF0aW5nIGNvbHVtbiB2aXNpYmlsaXR5XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OXHJcbiAgICAgICAgICAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRVxyXG4gICAgICAgICAgJiYgdGhpcy5fdmFsID09PSBwcmV2VmFsdWUpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl92YWwgPT09IHByZXZWYWx1ZSlcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShsaW5lLCB0aGlzLl92YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STTpcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkIHRvIHByZXZlbnQgc2VuZGluZyByZWR1bmRhbnRcclxuICAgICAgICAvLyBqYXZhc2NyaXB0IGNvbW1hbmRzIHRvIHRoZSBicm93c2VyXHJcbiAgICAgICAgcHJldlZhbHVlID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbSgwKTtcclxuICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiAodGhpcy5fdmFsID09PSBwcmV2VmFsdWUpKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0oMCwgdGhpcy5fdmFsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0s6IC8vIFRBU0sgUFJPUEVSVElFU1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFxyXG4gICAgICAgICAgTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpOiB0YXNrIHByb3BlcnR5IHswfSB3YXNuJ3QgaGFuZGxlZFwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXHJcbiAgICAgICAgICBOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCk6IHBhcmVudFR5cGUgdW5rbm93biwgcHJvcGVydHkgezB9IHdhc24ndCBoYW5kbGVkXCIsIHRoaXMuX2lkKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUU6XHJcbiAgICAgICAgdGhpcy5vbkltYWdlRmlsZU5hbWUoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRDpcclxuICAgICAgICB0aGlzLm9uRW5hYmxlKHZhbENoYW5nZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25WaXNpYmxlKHZhbENoYW5nZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRTpcclxuICAgICAgICB0aGlzLk9uQ29udHJvbE5hbWUoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STV9OQU1FOlxyXG4gICAgICAgIHRoaXMub25Gb3JtTmFtZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xVTU5fVElUTEU6XHJcbiAgICAgICAgdGhpcy5vblRleHQoMCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RFWFQ6XHJcbiAgICAgICAgdGhpcy5vblRleHQobGluZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJTlQ6XHJcbiAgICAgICAgdGhpcy5vbkhpbnQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZJQUJMRTpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uTW9kaWZpYWJsZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQOlxyXG4gICAgICAgIHRoaXMub25Ub29sdGlwKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfTElTVDpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uRGlzcGxheUxpc3QobGluZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fQ09NUExFVEVfTU9ERV9XQzpcclxuICAgICAgICB0aGlzLm9uQXV0b0NvbXBsZXRlTW9kZSgpO1xyXG4gICAgICAgIGJyZWFrXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVfTEFZRVJTX0xJU1Q6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vblZpc2libGVMYXllckxpc3QobGluZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgICB0aGlzLm9uRm9ybWF0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25MYWJlbChsaW5lKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRDpcclxuICAgICAgICB0aGlzLm9uUGFzc3dvcmQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfSU46XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSS19PTl9DTElDSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MT0FEX0lNQUdFX0ZST006IC8vIHRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgaWRlbnRpZnlpbmcgbG9hZGluZyBvZiBpbWFnZSAoU2VydmVyL0NsaWVudCkuXHJcbiAgICAgICAgLy8gU28gbm8gaGFuZGxpbmcgbmVlZGVkIGluIFJlZnJlc2hEaXNwbGF5XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgICB0aGlzLm9uQ3VzdG9tUHJvcGVydGllcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTOlxyXG4gICAgICAgIHRoaXMub25DdXN0b21WYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JJTkRJTkdfTEVWRUw6XHJcbiAgICAgICAgdGhpcy5vbkJpbmRpbmdMZXZlbCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFxyXG4gICAgICAgICAgTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpOiBQcm9wZXJ0eSB7MH0gd2Fzbid0IGhhbmRsZWRcIiwgdGhpcy5faWQpKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG5lZWQgdG8gY2FsY3VsYXRlIG9uY2Ugb25seVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZEJlQ29tcHV0ZWRPbmNlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLKSB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSRUxPQURfVklFVzpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfQ1lDTEU6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfT1BFTl9UQVNLX1dJTkRPVzpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19FVkVOVFM6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEVfSU5fUVVFUlk6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUklOVF9EQVRBOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkFOR0U6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEU6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JUOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0lOREVYOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTUFJTl9ESVNQTEFZOlxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVEIHx8IHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkUpXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpZiB0aGUgdmFsdWUgaXMgY29tcHV0ZWQgaW4gdGhlIHNlcnZlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIElzQ29tcHV0ZWRPbmNlT25TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5TaG91bGRCZUNvbXB1dGVkT25jZSgpKSB7XHJcbiAgICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuR2V0VGFza0J5UGFyZW50T2JqZWN0KCk7XHJcbiAgICAgIGlmICh0YXNrICE9IG51bGwpXHJcbiAgICAgICAgcmV0dXJuICF0YXNrLlNob3VsZEV2YWx1YXRlUHJvcGVydHlMb2NhbGx5KHRoaXMuX2lkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlcyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgQ29tcHV0ZVZhbHVlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBsZW46IG51bWJlciA9IDI1NTtcclxuICAgIGxldCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZUN1c3RvbVByb3BlcnRpZXNWYWx1ZXMoKTtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVByb3BlcnRpZXMoKTtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykge1xyXG4gICAgbGV0IGV2YWx1YXRlZCA9ICAgYXdhaXQgdGhpcy5jb21wdXRlQ3VzdG9tVmFsaWRhdG9ycygpO1xyXG4gICAgICBpZiAoZXZhbHVhdGVkKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLl9leHBJZCA+IDApIHtcclxuICAgICAgLy8gZm9yIG9mZmxpbmUgOiBjb21wdXRlIG9uY2UgdGhlIHByb3BlcnRpZXMgdGhhdCB3YXMgY29tcHV0ZSBvbiB0aGUgc2VydmVyXHJcbiAgICAgIGlmICh0aGlzLlNob3VsZEJlQ29tcHV0ZWRPbmNlKCkgJiYgdGhpcy5fZXhwQWxyZWFkeUNvbXB1dGVkT25jZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLl9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGZvciBmb2xsb3dpbmcgY29udHJvbCBwcm9wZXJ0aWVzIGFsd2F5cyBldmFsdWF0ZSBleHByZXNzaW9uc1xyXG4gICAgICBsZXQgYWx3YXlzRXZhbHVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0spXHJcbiAgICAgICAgYWx3YXlzRXZhbHVhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQpIHtcclxuICAgICAgICBsZW4gPSA2NTUzNTtcclxuICAgICAgICByZXN1bHQgPSBTdHJVdGlsLnJ0cmltKGF3YWl0IHRoaXMuX3BhcmVudE9iai5FdmFsdWF0ZUV4cHJlc3Npb24odGhpcy5fZXhwSWQsIHRoaXMuX2RhdGFUeXBlLCBsZW4sIHRydWUsXHJcbiAgICAgICAgICBTdG9yYWdlQXR0cmlidXRlLlNLSVAsIGFsd2F5c0V2YWx1YXRlLCB3YXNFdmFsdWF0ZWQpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcGFyZW50T2JqLkV2YWx1YXRlRXhwcmVzc2lvbih0aGlzLl9leHBJZCwgdGhpcy5fZGF0YVR5cGUsIGxlbiwgdHJ1ZSwgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQLCBhbHdheXNFdmFsdWF0ZSwgd2FzRXZhbHVhdGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGxldCB3YXJuaW5nTXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoXCJFeGNlcHRpb246IFwiICsgZS5NZXNzYWdlKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnRPYmogaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKVxyXG4gICAgICAgICAgICB3YXJuaW5nTXNnLkFwcGVuZChcIiBDb250cm9sOiBcIiArICg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj50aGlzLl9wYXJlbnRPYmopLk5hbWUpO1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nKHdhcm5pbmdNc2cuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHdhc0V2YWx1YXRlZC52YWx1ZSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRoaXMudXBkYXRlUmVzdWx0KHJlc3VsdCk7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3ZhbCA9PSBudWxsICYmIHRoaXMuX3BhcmVudFR5cGUgIT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gUHJvcERlZmF1bHRzLmdldERlZmF1bHRWYWx1ZSh0aGlzLl9pZCwgdGhpcy5fcGFyZW50VHlwZSwgdGhpcy5fcGFyZW50T2JqKTtcclxuICAgICAgICB0aGlzLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGVzIHJlc3VsdHMgb2YgZXhwcmVzc2lvbiBmb3Igc29tZSBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlc3VsdFwiPiA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgdXBkYXRlUmVzdWx0KHJlc3VsdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQ6XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKVxyXG4gICAgICAgICAgcmVzdWx0ID0gTlN0cmluZy5FbXB0eTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19NT0RFOlxyXG4gICAgICAgIHJlc3VsdCA9IFByb3BlcnR5LnVwZGF0ZVRhc2tNb2RlUmVzdWx0KHJlc3VsdCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZG8gdGhlIHNhbWUgYXMgd2UgZG9pbmcgZm9yIGMrKyBVY2hhciBSVDo6dHNrX21vZGVfZXhwIChsb25nIGV4cCwgVWNoYXIgbW9kZSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc3VsdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyB1cGRhdGVUYXNrTW9kZVJlc3VsdChyZXN1bHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29kZTogc3RyaW5nID0gJyAnO1xyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkocmVzdWx0KSkge1xyXG4gICAgICBjb2RlID0gcmVzdWx0WzBdLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgIHN3aXRjaCAoY29kZSkge1xyXG4gICAgICAgIGNhc2UgJ1EnOlxyXG4gICAgICAgICAgY29kZSA9ICdFJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0YnOlxyXG4gICAgICAgICAgY29kZSA9ICdPJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ08nOlxyXG4gICAgICAgICAgY29kZSA9ICdOJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvZGU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBnZXRWYWx1ZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgYXdhaXQgdGhpcy5Db21wdXRlVmFsdWUoKTtcclxuICAgIHJldHVybiB0aGlzLl92YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGludCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldFZhbHVlSW50KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuQ29tcHV0ZVZhbHVlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbCAhPT0gbnVsbClcclxuICAgICAgcmVzdWx0ID0gTk51bWJlci5QYXJzZSh0aGlzLl92YWwpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSB3aXRob3V0IGV4ZWN1dGUgaXRzIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gaW50IHZhbHVlIG9mIHRoaXMgcHJvcGVydHk8L3JldHVybnM+XHJcbiAgR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBOTnVtYmVyLlBhcnNlKHRoaXMuX3ZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5IHZhbGlkIG9ubHkgZm9yIGxvZ2ljYWwgdHlwZSBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBnZXRWYWx1ZUJvb2xlYW4oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTikge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldFZhbHVlKCk7XHJcbiAgICAgIHJldHVybiBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih0aGlzLl92YWwpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiUHJvcGVydHkuZ2V0VmFsdWVCb29sZWFuKCkgd2FzIGNhbGxlZCBmb3Igbm9uIGJvb2xlYW4gdHlwZSBwcm9wZXJ0eTogezB9XCIsIHRoaXMuX2lkKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29tcHV0ZWQgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbXB1dGVkVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl92YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgY29tcHV0ZWQgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2l0aG91dCBleGVjdXRlIGl0cyBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOKSB7XHJcbiAgICAgIHJldHVybiBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih0aGlzLl92YWwpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiUHJvcGVydHkuZ2V0VmFsdWVCb29sZWFuKCkgd2FzIGNhbGxlZCBmb3Igbm9uIGJvb2xlYW4gdHlwZSBwcm9wZXJ0eTogezB9XCIsIHRoaXMuX2lkKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gICByZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHNwZWNpZmllZCBsaW5lIG9mIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIHJlcXVlc3RlZCBsaW5lIG51bWJlcjwvcGFyYW0+XHJcbiAgZ2V0UHJldlZhbHVlKGxpbmU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAobGluZSA8IHRoaXMuX3ByZXZWYWx1ZXMubGVuZ3RoKVxyXG4gICAgICByZXR1cm4gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbShsaW5lKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHByb3BlcnR5IGhhcyBhbiBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0V4cHJlc3Npb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXhwSWQgPiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRFeHByZXNzaW9uSWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9leHBJZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uSW1hZ2VGaWxlTmFtZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgbWdDb250cm9sQmFzZTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBpZiAobWdDb250cm9sQmFzZS5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgIG1nQ29udHJvbEJhc2Uuc2V0SW1hZ2VMaXN0KHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChtZ0NvbnRyb2xCYXNlLmlzSW1hZ2VDb250cm9sKCkgfHwgbWdDb250cm9sQmFzZS5pc1JhZGlvKCkgfHwgbWdDb250cm9sQmFzZS5pc0NoZWNrQm94KCkgfHwgbWdDb250cm9sQmFzZS5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgICBtZ0NvbnRyb2xCYXNlLnNldEltYWdlV2l0aEZpbGVOYW1lKHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBvbkltYWdlRmlsZU5hbWUub25FbmFibGUoKVwiKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkVuYWJsZSh2YWxDaGFuZ2VkOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGN1cnJlbnRFZGl0aW5nQ29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2w7XHJcblxyXG4gICAgICAvLyBBQ1RfVEJMX05YVEZMRCBpcyBhZGRlZCBpbiBxdWV1ZSwgd2hlbmV2ZXIgY3VycmVudCBjb250cm9sIGlzIGhpZGRlbiBvciBkaXNhYmxlZCB0byBzZXQgdGhlIGZvY3VzIHRvIG5leHQgY29udHJvbCBmb3IgYm90aCBSQyAmIE9MXHJcbiAgICAgIC8vIHdoaWNoIGlzIGNvcnJlY3QgYmVoYXZpb3IuIEJ1dCBvbmNlIGN1cnJlbnQgY3RybCBpcyBhbHJlYWR5IGRpc2FibGVkL2hpZGRlbiAsIHdlIHNob3VsZCBub3QgcHV0IHRoZSBzYW1lIGFjdGlvblxyXG4gICAgICAvLyBpbiBxdWV1ZSBhZ2FpbiB3aGVuIHNhbWUgY3RybCBpcyBkaXNhYmxlZC9oaWRkZW4gbXVsdGlwbGUgdGltZXMuXHJcbiAgICAgIGlmICh0aGlzLl92YWwgIT09IG51bGwgJiYgdGhpcy5fdmFsID09PSBcIjBcIiAmJiB2YWxDaGFuZ2VkICYmIGN1cnJlbnRFZGl0aW5nQ29udHJvbCAhPT0gbnVsbCAmJlxyXG4gICAgICAgIChjdHJsID09PSBjdXJyZW50RWRpdGluZ0NvbnRyb2wgfHwgY3VycmVudEVkaXRpbmdDb250cm9sLmlzRGVzY2VuZGVudE9mQ29udHJvbChjdHJsKSB8fCBjdHJsID09PSBjdXJyZW50RWRpdGluZ0NvbnRyb2wuZ2V0TGlua2VkUGFyZW50KGZhbHNlKSkpIHtcclxuICAgICAgICBsZXQgcGFya2VkQ29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgIGlmIChwYXJrZWRDb250cm9sICE9PSBudWxsICYmIHBhcmtlZENvbnRyb2wuSW5Db250cm9sICYmIChjdHJsID09PSBwYXJrZWRDb250cm9sIHx8IHBhcmtlZENvbnRyb2wuaXNEZXNjZW5kZW50T2ZDb250cm9sKGN0cmwpKSkge1xyXG4gICAgICAgICAgRXZlbnRzLk9uTm9uUGFya2FibGVMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgICAgICAgIGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjdHJsLlNldEVuYWJsZWQodGhpcy5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25FbmFibGUoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb25WaXNpYmxlKHZhbENoYW5nZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBsZXQgY3VycmVudEVkaXRpbmdDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbDtcclxuICAgICAgaWYgKHRoaXMuX3ZhbCAhPT0gbnVsbCAmJiB0aGlzLl92YWwgPT09IFwiMFwiICYmIHZhbENoYW5nZWQgJiYgY3VycmVudEVkaXRpbmdDb250cm9sICE9PSBudWxsICYmXHJcbiAgICAgICAgKGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbCB8fCBjdXJyZW50RWRpdGluZ0NvbnRyb2wuaXNEZXNjZW5kZW50T2ZDb250cm9sKGN0cmwpIHx8IGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbC5nZXRMaW5rZWRQYXJlbnQoZmFsc2UpKSkge1xyXG4gICAgICAgIGxldCBwYXJrZWRDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKHBhcmtlZENvbnRyb2wgIT09IG51bGwgJiYgcGFya2VkQ29udHJvbC5JbkNvbnRyb2wgJiYgKGN0cmwgPT09IHBhcmtlZENvbnRyb2wgfHwgcGFya2VkQ29udHJvbC5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY3RybCkpKSB7XHJcbiAgICAgICAgICBFdmVudHMuT25Ob25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IGN0cmwudXBkYXRlUHJvcGVydHlMb2dpY05lc3RpbmcoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSwgdGhpcy5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpLCB0cnVlKTtcclxuXHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBPbkNvbnRyb2xOYW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5PbkNvbnRyb2xOYW1lKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBoaW50IGZvciBlZGl0IGNvbnRyb2wgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25IaW50KCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpO1xyXG4gICAgICBsZXQgdHJhbnNsYXRlZFN0cmluZzogc3RyaW5nID0gRXZlbnRzLlRyYW5zbGF0ZSh0aGlzLkdldENvbXB1dGVkVmFsdWUoKSk7XHJcblxyXG4gICAgICBpZiAoIWNvbnRyb2wuSXNEYXRlVGltZVBpY3R1cmUoKSAmJiAoIWNvbnRyb2wuSXNUYWJsZUNoaWxkIHx8IGNvbnRyb2wuSXNUYWJsZUhlYWRlckNoaWxkKSkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuUGxhY2VIb2xkZXIsIHRyYW5zbGF0ZWRTdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluUHJvcGVydHkub25IaW50KClcIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkZvcm1OYW1lKCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKVxyXG4gICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dCgwKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25Gb3JtTmFtZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGRDb21tYW5kVHlwZVRleHQobGluZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgbWxzVHJhbnNWYWx1ZTogc3RyaW5nID0gRXZlbnRzLlRyYW5zbGF0ZSh0aGlzLkdldENvbXB1dGVkVmFsdWUoKSk7XHJcblxyXG4gICAgLy8gRml4ZWQgYnVnIzo3MzM0ODAgU3lzdGVtQm94ID0gZmFsc2UgYW5kIHRpdGxlIGlzIGVtcHR5LT4gLk5FVCBoaWRlIHRoZSB0aXRsZS5cclxuICAgIC8vIHdlIHdpbGwgc2V0IGl0IHRvICcgJ1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNIHx8XHJcbiAgICAgICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCAmJiAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmlzQ29sdW1uQ29udHJvbCgpKSkge1xyXG4gICAgICAvLyAjNzM3NDg4OiBXaGVuIHZhcmlhYmxlIGF0dGFjaGVkIHRvIGZvcm0ncyB0ZXh0IHByb3BlcnR5LCBzcGFjZXMgYXJlIGFwcGVuZGVkXHJcbiAgICAgIC8vIGFmdGVyIGFjdHVhbCB2YWx1ZSwgZXF1YWwgdG8gcGljdHVyZSBvZiB2YXJpYWJsZS4gQmVmb3JlIHNldHRpbmcgdGV4dCByZW1vdmUgdGhlc2UgZXh0cmFcclxuICAgICAgLy8gc3BhY2VzIGF0IHRoZSBlbmQuXHJcbiAgICAgIG1sc1RyYW5zVmFsdWUgPSBTdHJVdGlsLnJ0cmltKG1sc1RyYW5zVmFsdWUpO1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0gJiYgbWxzVHJhbnNWYWx1ZSA9PT0gTlN0cmluZy5FbXB0eSkge1xyXG4gICAgICAgIG1sc1RyYW5zVmFsdWUgPSBcIiBcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MICYmICgoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmlzVGV4dENvbnRyb2woKVxyXG4gICAgICAgIHx8ICgoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmlzQnV0dG9uKCkpKSkgLy8gbmVlZCB0byBjaGVjayBmb3IgaHlwZXJ0ZXh0IG9yIG90aGVyIHR5cGVzIG9mIGJ1dHRvblxyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcy5fcGFyZW50T2JqLCBsaW5lLCBtbHNUcmFuc1ZhbHVlKTtcclxuICAgIGVsc2VcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLl9wYXJlbnRPYmosIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLlRleHQsIG1sc1RyYW5zVmFsdWUpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uVGV4dChsaW5lOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYWRkQ29tbWFuZFR5cGVUZXh0KGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvbk1vZGlmaWFibGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAgIGlmIChjdHJsLmlzVGV4dENvbnRyb2woKSB8fCBjdHJsLmlzQ2hvaWNlQ29udHJvbCgpIHx8IGN0cmwuaXNDaGVja0JveCgpKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5HZXRUYXNrQnlQYXJlbnRPYmplY3QoKTtcclxuXHJcbiAgICAgICAgbGV0IHJlYWRPbmx5VmFsdWU6IGJvb2xlYW4gPSAhdGhpcy5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpO1xyXG5cclxuICAgICAgICBpZiAoKHJlYWRPbmx5VmFsdWUgfHwgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpICYmIGN0cmwuR2V0Q3VyclJlYWRPbmx5KCkgIT09IHJlYWRPbmx5VmFsdWUpIHtcclxuICAgICAgICAgIGN0cmwuU2V0Q3VyclJlYWRPbmx5KHJlYWRPbmx5VmFsdWUpO1xyXG5cclxuICAgICAgICAgIC8vIEpQTjogSU1FIHN1cHBvcnQgKGVuYWJsZSBJTUUgaW4gcXVlcnkgbW9kZSlcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKSB7XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURV9JTl9RVUVSWSwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKCksIHRoaXMuZ2V0TGluZSgpLCBIdG1sUHJvcGVydGllcy5SZWFkT25seSwgcmVhZE9ubHlWYWx1ZSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbk1vZGlmaWFibGUoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25Ub29sdGlwKCk6IHZvaWQge1xyXG4gICAgbGV0IHRvb2xUaXA6IHN0cmluZztcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAgIC8vIFRvb2x0aXAgZXhwcmVzc2lvbiByZXR1cm5zIHN0cmluZ1xyXG4gICAgICBpZiAodGhpcy5fZXhwSWQgPT09IDApXHJcbiAgICAgICAgdG9vbFRpcCA9ICg8VG9vbFRpcEhlbHA+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldEhlbHBJdGVtKE5OdW1iZXIuUGFyc2UodGhpcy5fdmFsKSkpLnRvb2x0aXBIZWxwVGV4dDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRvb2xUaXAgPSB0aGlzLl92YWw7XHJcblxyXG4gICAgICAvLyAjOTI5ODg5OiBSZW1vdmUgZXh0cmEgd2hpdGUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdG9vbHRpcCB0ZXh0LlxyXG4gICAgICB0b29sVGlwID0gU3RyVXRpbC5ydHJpbSh0b29sVGlwKTtcclxuICAgICAgaWYoY3RybC5pc0J1dHRvbigpICYmICBjdHJsLkNvbm5lY3RlZENvbnRyb2wpXHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCBjdHJsLkNvbm5lY3RlZENvbnRyb2wsIHRoaXMuZ2V0TGluZSgpLCBIdG1sUHJvcGVydGllcy5ab29tQnV0dG9uVG9vbHRpcCwgdG9vbFRpcCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIGN0cmwsIHRoaXMuZ2V0TGluZSgpLCBIdG1sUHJvcGVydGllcy5Ub29sdGlwLCB0b29sVGlwKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25Ub29sdGlwKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9uRGlzcGxheUxpc3QoY3VyckxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgICBpZiAoY3RybC5pc1NlbGVjdGlvbkN0cmwoKSB8fCBjdHJsLmlzVGFiQ29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpIHx8ICg8TWdDb250cm9sQmFzZT5jdHJsKS5IYXNBdXRvY29tcGxldGUoKSkge1xyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKSA/IGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpIDogY3VyckxpbmU7XHJcbiAgICAgICAgYXdhaXQgY3RybC5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uRGlzcGxheUxpc3QoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyckxpbmVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgb25WaXNpYmxlTGF5ZXJMaXN0KGN1cnJMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBsZXQgbGluZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIGlmIChjdXJyTGluZSA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgbGluZSA9IGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbGluZSA9IGN1cnJMaW5lO1xyXG5cclxuICAgICAgLy8gQWx3YXlzIGxheWVyaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQgb24gRGlzcGxheWxpc3QuIEJ1dCxcclxuICAgICAgLy8gRGlzcGxheUxpc3QgYW5kIGl0ZW1MaXN0IHNob3VsZCBub3QgYmUgcmVmcmVzaGVkLlxyXG4gICAgICBhd2FpdCBjdHJsLnJlZnJlc2hUYWJGb3JMYXllckxpc3QobGluZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uVmlzaWJsZUxheWVyTGlzdCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkZvcm1hdCgpIHtcclxuICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gbnVsbDtcclxuICAgIGxldCBjdHJsUGljOiBQSUM7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGN0cmwgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgY3RybFBpYyA9IGN0cmwuZ2V0UElDKCk7XHJcbiAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcblxyXG4gICAgICBzd2l0Y2ggKGN0cmwuVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OOlxyXG4gICAgICAgICAgLy8gaWYgdGhlIGJ1dHRvbiBkb2Vzbid0IGhhdmUgZmllbGQgd2UgbmVlZCB0byBzZXQgdGhlIGZvcm1hdCBhcyB0aGUgdGV4dCBvZiB0aGUgY29udHJvbCxcclxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgdGhlIGZpZWxkIHZhbHVlIHdpbGwgc2V0IHRoZSB0ZXh0IG9uIHRoZSBjb250cm9sXHJcbiAgICAgICAgICAvLyBpbiBhZGRpdGlvbiB3ZSBuZWVkIHRvIHNldCB0aGUgdGV4dCBmb3IgaW1hZ2UgYnV0dG9uXHJcbiAgICAgICAgICAvLyBBbHNvLCBkbyBub3Qgb3ZlcnJpZGUgdGhlIHRleHQgd2l0aCB0aGUgZm9ybWF0IGlmIHRoZSBjb250cm9sIGhhcyBhbiBleHByZXNzaW9uLlxyXG4gICAgICAgICAgLy8gUUNSIyA5Mzg5MzMuIFdoZW4gdGhlIGNvbnRyb2wgaXMgcmVmcmVzaGVkIGZvciB0aGUgZmlyc3QgdGltZSwgd2Ugc2hvdWxkIHNob3cgdGhlIHRleHQgYXMgaXRcclxuICAgICAgICAgIC8vIGlzIGluIHRoZSBGb3JtYXQgcHJvcGVydHkgLSBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBmaWVsZCBvciBleHByZXNzaW9uIGlzIGF0dGFjaGVkIHRvIGl0IG9yIG5vdC5cclxuICAgICAgICAgIC8vIFRoZSBmaXggaXMgY29uZmluZWQgdG8gQ29udHJvbFR5cGVzLkNUUkxfVFlQRV9CVVRUT04gYmVjYXVzZSBvbmx5IGluIGNhc2Ugb2YgQnV0dG9uIHdlIGRpc3BsYXkgdGhlIHZhbHVlIG9mIHRoZSBGb3JtYXQgcHJvcGVydHkuXHJcbiAgICAgICAgICBpZiAoY3RybC5nZXRGaWVsZCgpID09IG51bGwgJiYgIWN0cmwuZXhwcmVzc2lvblNldEFzRGF0YSgpIHx8IGN0cmwuSXNJbWFnZUJ1dHRvbigpIHx8ICh0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpKVxyXG4gICAgICAgICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dCh0aGlzLmdldExpbmUoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVDpcclxuXHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKSB7XHJcbiAgICAgICAgICAgIGlmIChjdHJsUGljLmdldEF0dHIoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uRm9ybWF0KClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9uTGFiZWwoY3VyckxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIC8vIFNFTEVDVCBjb250cm9sLiBOb3RlIHdlIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgY2hhbmdlIG9mIHJhZGlvIGJ1dHRvbnMgcmFuZ2UhXHJcbiAgICAgIC8vIGRhdGEgY29udHJvbCByYW5nZXMgYXJlIHVwZGF0ZWQgd2hlbiB3ZSBzZXQgdmFsdWVzIHRvIHRoZW0gaW4gQ29udHJvbC5yZWZyZXNoRGlzcFZhbCgpXHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBsaW5lOiBudW1iZXI7XHJcblxyXG4gICAgICBpZiAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIGxpbmUgPSBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxpbmUgPSBjdXJyTGluZTtcclxuXHJcbiAgICAgIC8vIG9uIGNvbWJvIGJveCBjb21wZm9yIGNoZWNrIGJveCB0aGUgbGFiZWwgaXMgdGhlIGl0ZW0gbGlzdCBwcm9wZXJ0eVxyXG4gICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWClcclxuICAgICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dChsaW5lKTtcclxuICAgICAgZWxzZSBpZiAoY3RybC5pc1NlbGVjdGlvbkN0cmwoKSB8fCBjdHJsLmlzVGFiQ29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpKSB7XHJcbiAgICAgICAgY3RybC5zZXRSYW5nZShhd2FpdCB0aGlzLmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGN0cmwuY2xlYXJSYW5nZShsaW5lKTtcclxuICAgICAgICBhd2FpdCBjdHJsLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIElmIEl0ZW1MaXN0IGhhcyBhbiBleHByZXNzaW9uIEFuZCBpdCBtYXkgYmUgbW9kaWZpZWQgYWdhaW4sIHJlZnJlc2ggdGhlIGRpc3BsYXkgdmFsdWUgb2YgY29udHJvbC5cclxuICAgICAgICAvLyBCZWNhdXNlIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IGRpc3BsYXkgdmFsdWUgd2lsbCBjaGFuZ2UuXHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIGF3YWl0IGN0cmwuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKCg8TWdDb250cm9sQmFzZT5jdHJsKS5IYXNBdXRvY29tcGxldGUoKSlcclxuICAgICAgICBhd2FpdCBjdHJsLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJQcm9wZXJ0eS5vbkxhYmVsKCksIG5vdCBzdXBwb3J0IGNvbnRyb2xcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uTGFiZWwoKVwiKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHN1cHBvcnQgaW4gc3ViZm9ybSwgbXVzdCBjYWxsIHRoaXMgbWV0aG9kXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0T2JqZWN0QnlQYXJlbnRPYmooKTogYW55IHtcclxuICAgIGxldCByZXN1bHQ6IGFueSA9IHRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pIHtcclxuICAgICAgbGV0IGZvcm06IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgaWYgKGZvcm0uaXNTdWJGb3JtKCkpXHJcbiAgICAgICAgcmVzdWx0ID0gZm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzUmVwZWF0YWJsZUluVGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGN1cnJlbnQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldExpbmUoKTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBkaXNwbGF5TGluZUZvclRyZWVPclRhYmxlOiBib29sZWFuID0gY3RybC5pc1Byb3BlcnR5UmVwZWF0YWJsZSh0aGlzLl9pZCk7XHJcblxyXG4gICAgICBsaW5lID0gY3RybC5nZXREaXNwbGF5TGluZShkaXNwbGF5TGluZUZvclRyZWVPclRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gb3JpZ2luYWwgdmFsdWUgb2YgcHJvcGVydHkgdGhhdCB3YXMgY29tcHV0ZWQgYmVmb3JlIGV4ZWN1dGlvbiBvZiBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE9yZ1ZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JnVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSBzaXplIG9mIHByZXZ2YWx1ZXMgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuU2hvdWxkU2tpcFJlZnJlc2goKSlcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjbGVhciBfcHJldlZhbHVlcyBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICBjbGVhclByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5DbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUmVzZXRQcmV2VmFsdWVBcnJheSgpOiB2b2lkIHtcclxuICAgIGxldCBjb3VudDogbnVtYmVyID0gdGhpcy5fcHJldlZhbHVlcy5sZW5ndGg7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkNsZWFyKCk7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUoY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGUgYW5kIHNldCBhcnJheXMgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRQcmV2QXJyYXlTaXplKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNIHx8IHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSAxO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgICAgbGV0IG1nQ29udHJvbEJhc2U6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgICBpZiAobWdDb250cm9sQmFzZS5Jc1JlcGVhdGFibGUpXHJcbiAgICAgICAgICBzaXplID0gbWdDb250cm9sQmFzZS5nZXRGb3JtKCkuZ2V0VGFibGVJdGVtc0NvdW50KCk7XHJcbiAgICAgICAgZWxzZSBpZiAobWdDb250cm9sQmFzZS5pc1RhYmxlQ29udHJvbCgpICYmIFByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUoKSlcclxuICAgICAgICAgIHNpemUgPSBtZ0NvbnRyb2xCYXNlLmdldEZvcm0oKS5nZXRUYWJsZUl0ZW1zQ291bnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5TZXRTaXplKHNpemUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBhc3N3b3JkIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uUGFzc3dvcmQoKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuUGFzc3dvcmQsIHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uUGFzc3dvcmQoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0IHVzZXIgcHJvcGVydHkgVGl0bGVQYWRkaW5nIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGNvbXB1dGVDdXN0b21Qcm9wZXJ0aWVzVmFsdWVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZm9yIChsZXQgW2N1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21Qcm9wZXJ0eVZhbHVlXSBvZiB0aGlzLmN1c3RvbVByb3BlcnRpZXMpIHtcclxuICAgICAgbGV0IGV4cHJlc3Npb24gPSBjdXN0b21Qcm9wZXJ0eVZhbHVlO1xyXG4gICAgICAvLyBpbml0IHRoZSB2YWx1ZVxyXG4gICAgICBsZXQgcmV0RXhwcmVzc2lvblZhbHVlID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzVmFsdWVzLnNldChjdXN0b21Qcm9wZXJ0eUtleSwgcmV0RXhwcmVzc2lvblZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29tcHV0ZSBjdXN0b20gdmFsaWRhdG9yc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlQ3VzdG9tVmFsaWRhdG9ycygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBtZ0NvbnRyb2wgPSA8TWdDb250cm9sQmFzZT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICBsZXQgZXZhbHVhdGVkID0gdHJ1ZTtcclxuICAgIGlmIChtZ0NvbnRyb2wuTW9kaWZpZWRCeVVzZXIgfHwgbWdDb250cm9sLlZhbGlkYXRlQ29udHJvbCB8fCB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpLklzSW5SZWNvbXB1dGUoKSl7XHJcbiAgICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tVmFsaWRhdG9yUHJvcGVydHldIG9mIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcykge1xyXG4gICAgICAgIGxldCBleHByZXNzaW9uID0gKDxDdXN0b21WYWxpZGF0b3JQcm9wPmN1c3RvbVZhbGlkYXRvclByb3BlcnR5KS5fZXhwO1xyXG4gICAgICAgIC8vIGluaXQgdGhlIHZhbHVlXHJcbiAgICAgICAgbGV0IGlzSW5WYWxpZCA9IGF3YWl0IHRoaXMuR2V0UmV0cnVuVmFsdWVGb3JDdXN0b21Qcm9wZXJ0eUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XHJcbiAgICAgICAgbGV0IGVyclN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgbGV0IEluVmFsaWQgPSAoaXNJblZhbGlkID09PSBcIjFcIikgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgaWYgKEluVmFsaWQpIHtcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSAoPEN1c3RvbVZhbGlkYXRvclByb3A+Y3VzdG9tVmFsaWRhdG9yUHJvcGVydHkpLl9lcnJvck1lc3NhZ2VFeHA7XHJcbiAgICAgICAgICBpZiAoZXhwcmVzc2lvbiA+IDApXHJcbiAgICAgICAgICAgIGVyclN0cmluZyA9IGF3YWl0IHRoaXMuR2V0UmV0cnVuVmFsdWVGb3JDdXN0b21Qcm9wZXJ0eUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGVyclN0cmluZyA9ICg8Q3VzdG9tVmFsaWRhdG9yUHJvcD5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0eSkuX2Vycm9yTWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZXZhbHVhdGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcy5zZXQoY3VzdG9tUHJvcGVydHlLZXksIG5ldyBDdXN0b21WYWxpZGF0b3IoIUluVmFsaWQsIGVyclN0cmluZykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIGlmIChtZ0NvbnRyb2wuaXNSZXBlYXRhYmxlKCkpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcy5jbGVhcigpO1xyXG4gICAgICAgIGV2YWx1YXRlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXZhbHVhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgdXNlciBwcm9wZXJ0eSBUaXRsZVBhZGRpbmcgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25DdXN0b21Qcm9wZXJ0aWVzKCk6IHZvaWQge1xyXG5cclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzVmFsdWVzKSB7XHJcbiAgICAgIC8vIHVzZSB0aGlzLl9wYXJlbnRPYmogYW5kIG5vdCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuUFJPUF9TRVRfVVNFUl9QUk9QRVJUWSwgdGhpcy5fcGFyZW50T2JqLCB0aGlzLmdldExpbmUoKSwgY3VzdG9tUHJvcGVydHlLZXksIGN1c3RvbVByb3BlcnR5VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0IGN1c3RvbSB2YWxpZGF0b3JzIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uQ3VzdG9tVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21WYWxpZGF0b3JWYWx1ZXMpIHtcclxuXHJcbiAgICAgIC8vIHVzZSB0aGlzLl9wYXJlbnRPYmogYW5kIG5vdCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuUFJPUF9TRVRfQ1VTVE9NX1ZBTElEQVRPUiwgdGhpcy5fcGFyZW50T2JqLCB0aGlzLmdldExpbmUoKSxcclxuICAgICAgICBjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCBCaW5kaW5nIExldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uQmluZGluZ0xldmVsKClcclxuICB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLkJpbmRpbmdMZXZlbCwgdGhpcy5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpKTtcclxuICAgIGVsc2VcclxuICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LkJpbmRpbmdMZXZlbCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkF1dG9Db21wbGV0ZU1vZGUoKVxyXG4gIHtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBHZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gMjU1O1xyXG4gICAgbGV0IGV4cFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl9wYXJlbnRPYmouR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwcmVzc2lvbik7XHJcbiAgICBsZXQgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBhd2FpdCB0aGlzLl9wYXJlbnRPYmouRXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbiwgdHJ1ZSwgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQLCBmYWxzZSwgd2FzRXZhbHVhdGVkKTtcclxuXHJcbiAgICBleHBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5fcGFyZW50T2JqLkdldEV4cHJlc3Npb25TdG9yYWdlKGV4cHJlc3Npb24pO1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgc3dpdGNoIChleHBTdG9yYWdlQXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIGxldCB0ZW1wUGljID0gbmV3IFBJQyhcIk42LjJcIiwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCB0aGlzLl9wYXJlbnRPYmouZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgIHJldHVyblZhbHVlID0gXCJGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIGZhbHNlLCBjb21wSWR4LCBmYWxzZSkudHJpbSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgdGVtcFBpYyA9IG5ldyBQSUMoXCIjIy8jIy8jIyMjXCIsIGV4cFN0b3JhZ2VBdHRyaWJ1dGUsIGNvbXBJZHgpO1xyXG4gICAgICAgIHJldHVyblZhbHVlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKHJldHVyblZhbHVlLCBcIlwiLCB0ZW1wUGljLCB0cnVlLCBmYWxzZSwgY29tcElkeCwgdHJ1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICB0ZW1wUGljID0gbmV3IFBJQyhcIiMjOiMjLyMjIyNcIiwgZXhwU3RvcmFnZUF0dHJpYnV0ZSwgY29tcElkeCk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIHRydWUsIGZhbHNlLCBjb21wSWR4LCB0cnVlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5PTkU6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKCkgaWxsZWdhbCBkYXRhIHR5cGU6IFwiICsgZXhwU3RvcmFnZUF0dHJpYnV0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgUmVtb3ZlUHJldlZhbEluZGV4QXQoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aCA+IGlkeCkge1xyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLlJlbW92ZUF0KGlkeCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZHhcIj48L3BhcmFtPlxyXG4gIEluc2VydFByZXZWYWxBdChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnQoaWR4LCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgcmVzZXRQcmV2VmFsQXQoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCB0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aClcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShpZHgsIG51bGwpO1xyXG4gIH1cclxuXHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCJ7MH0gPSB7MX0gKGV4cD17Mn0sIHN0dWRpbyB2YWx1ZT17M30pXCIsIFtcclxuICAgICAgUHJvcERlZmF1bHRzLkdldFByb3BlcnR5TmFtZSh0aGlzLl9pZCksICh0aGlzLl92YWwgPT09IG51bGwpID8gXCJpcyBudWxsXCIgOiB0aGlzLl92YWwsIHRoaXMuX2V4cElkLCB0aGlzLlN0dWRpb1ZhbHVlXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0RGVmYXVsdFByb3AoKSByZXR1cm5zIGEgcHJvcGVydHkgdGhhdCBoYXMgYSBzeXN0ZW0gZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+VGhlIHByb3BlcnR5IGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFR5cGVcIj5QQVJFTlRfVFlQRV9DT05UUk9MLCBQQVJFTlRfVFlQRV9GT1JNLCBQQVJFTlRfVFlQRV9UQVNLPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BQYXJlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gUHJvcGVydHkgdGhhdCBoYXMgYSBzeXN0ZW0gZGVmYXVsdCB2YWx1ZTwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0RGVmYXVsdFByb3AocHJvcElkOiBudW1iZXIsIHBhcmVudFR5cGU6IHN0cmluZywgcHJvcFBhcmVudDogUHJvcFBhcmVudEludGVyZmFjZSk6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZyA9IFByb3BEZWZhdWx0cy5nZXREZWZhdWx0VmFsdWUocHJvcElkLCBwYXJlbnRUeXBlLCBwcm9wUGFyZW50KTtcclxuXHJcbiAgICBpZiAobWdWYWwgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSBuZXcgUHJvcGVydHkocHJvcElkLCBwcm9wUGFyZW50LCBwYXJlbnRUeXBlLCBtZ1ZhbCk7XHJcblxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICBJbnNlcnRQcmV2VmFsdWVBcnJheShjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuU2hvdWxkU2tpcFJlZnJlc2goKSlcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICB9XHJcbn1cclxuIl19