@magic-xpa/gui 4.800.0-dev480.18 → 4.800.0-dev480.183
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.
- package/bundles/magic-xpa-gui.umd.js +1038 -7529
- package/bundles/magic-xpa-gui.umd.js.map +1 -1
- package/bundles/magic-xpa-gui.umd.min.js +1 -1
- package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
- package/esm2015/index.js +1 -1
- package/esm2015/magic-xpa-gui.js +1 -4
- package/esm2015/src/Commands.js +7 -114
- package/esm2015/src/Events.js +1 -517
- package/esm2015/src/EventsProcessor.js +1 -51
- package/esm2015/src/FocusManager.js +1 -13
- package/esm2015/src/GuiConstants.js +2 -11
- package/esm2015/src/GuiEnums.js +126 -130
- package/esm2015/src/GuiEnvironment.js +1 -1
- package/esm2015/src/IFlowMonitorQueue.js +1 -1
- package/esm2015/src/Manager.js +10 -148
- package/esm2015/src/UIBridge.js +1 -6
- package/esm2015/src/env/IEnvironment.js +1 -1
- package/esm2015/src/gui/ControlBase.js +1 -1
- package/esm2015/src/gui/GuiMgControl.js +1 -94
- package/esm2015/src/gui/GuiMgForm.js +1 -1
- package/esm2015/src/gui/KeyboardItem.js +5 -46
- package/esm2015/src/gui/LastFocusedVal.js +1 -5
- package/esm2015/src/gui/MgValue.js +1 -1
- package/esm2015/src/gui/PropParentInterface.js +1 -1
- package/esm2015/src/gui/low/DialogHandler.js +1 -10
- package/esm2015/src/gui/low/GuiCommand.js +1 -12
- package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
- package/esm2015/src/gui/low/GuiInteractive.js +2 -465
- package/esm2015/src/gui/low/Style.js +1 -9
- package/esm2015/src/management/RuntimeContextBase.js +11 -14
- package/esm2015/src/management/data/BlobType.js +0 -0
- package/esm2015/src/management/data/DcValues.js +8 -67
- package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
- package/esm2015/src/management/data/FieldDef.js +1 -95
- package/esm2015/src/management/data/FieldsTable.js +2 -28
- package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
- package/esm2015/src/management/data/GuiFieldBase.js +4 -39
- package/esm2015/src/management/data/IRecord.js +1 -1
- package/esm2015/src/management/data/IReferencedObject.js +1 -8
- package/esm2015/src/management/data/NUM_TYPE.js +14 -485
- package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
- package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
- package/esm2015/src/management/data/RecordUtils.js +6 -112
- package/esm2015/src/management/data/VectorType.js +17 -252
- package/esm2015/src/management/data/VectorTypeBase.js +1 -35
- package/esm2015/src/management/events/IActionManager.js +1 -1
- package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
- package/esm2015/src/management/exp/ExpressionInterface.js +4 -3
- package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
- package/esm2015/src/management/gui/ControlTable.js +18 -72
- package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
- package/esm2015/src/management/gui/FieldValidator.js +58 -339
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
- package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
- package/esm2015/src/management/gui/HebrewDate.js +3 -140
- package/esm2015/src/management/gui/Helps.js +2 -48
- package/esm2015/src/management/gui/MgControlBase.js +143 -876
- package/esm2015/src/management/gui/MgFormBase.js +68 -407
- package/esm2015/src/management/gui/PIC.js +56 -285
- package/esm2015/src/management/gui/PropDefaults.js +13 -48
- package/esm2015/src/management/gui/PropInterface.js +2 -4
- package/esm2015/src/management/gui/PropTable.js +72 -183
- package/esm2015/src/management/gui/Property.js +35 -372
- package/esm2015/src/management/gui/ValidationDetails.js +10 -52
- package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
- package/esm2015/src/management/gui/WrongFormatException.js +1 -15
- package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
- package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
- package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
- package/esm2015/src/management/tasks/ITask.js +1 -1
- package/esm2015/src/management/tasks/MgTimer.js +1 -16
- package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
- package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
- package/esm2015/src/util/MemoryUtil.js +1 -41
- package/esm2015/src/util/ObjectReference.js +1 -8
- package/esm2015/src/util/ProcessLauncher.js +3 -21
- package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
- package/fesm2015/magic-xpa-gui.js +844 -7052
- package/fesm2015/magic-xpa-gui.js.map +1 -1
- package/magic-xpa-gui.d.ts +0 -3
- package/package.json +2 -2
- package/src/Commands.d.ts +1 -0
- package/src/Events.d.ts +0 -2
- package/src/GuiEnums.d.ts +125 -128
- package/src/env/IEnvironment.d.ts +3 -0
- package/src/gui/PropParentInterface.d.ts +1 -1
- package/src/gui/low/Style.d.ts +0 -3
- package/src/management/RuntimeContextBase.d.ts +2 -0
- package/src/management/data/GuiDataViewBase.d.ts +4 -4
- package/src/management/data/IRecord.d.ts +1 -1
- package/src/management/exp/ExpressionInterface.d.ts +3 -0
- package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
- package/src/management/gui/ControlTable.d.ts +1 -1
- package/src/management/gui/DisplayConvertor.d.ts +1 -1
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
- package/src/management/gui/MgControlBase.d.ts +7 -7
- package/src/management/gui/MgFormBase.d.ts +6 -6
- package/src/management/gui/PIC.d.ts +1 -0
- package/src/management/gui/PropInterface.d.ts +2 -4
- package/src/management/gui/PropTable.d.ts +4 -5
- package/src/management/gui/Property.d.ts +1 -1
- package/src/management/tasks/GuiTaskBase.d.ts +8 -14
- package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
|
@@ -23,9 +23,6 @@ export class CustomValidator {
|
|
|
23
23
|
isValid() { return this._valid; }
|
|
24
24
|
getErrMessage() { return this._errorMessage; }
|
|
25
25
|
}
|
|
26
|
-
/// <summary>
|
|
27
|
-
/// this class represents a Property object of control, form or task.
|
|
28
|
-
/// </summary>
|
|
29
26
|
export class Property {
|
|
30
27
|
constructor(cId, cParentObj, parType, val) {
|
|
31
28
|
this._id = Int32.MinValue;
|
|
@@ -33,21 +30,15 @@ export class Property {
|
|
|
33
30
|
this._val = null;
|
|
34
31
|
this._pic = null;
|
|
35
32
|
this._expId = 0;
|
|
36
|
-
this._parentObj = null;
|
|
37
|
-
this._parentType = null;
|
|
38
|
-
this._prevValues = null;
|
|
39
|
-
this._orgValue = null;
|
|
40
|
-
this._taskDefinitionId = null;
|
|
41
|
-
// studioValue for offline state
|
|
42
|
-
// ToDo: comment says that it is for "Offline state". So, do we need it inWebClient?
|
|
33
|
+
this._parentObj = null;
|
|
34
|
+
this._parentType = null;
|
|
35
|
+
this._prevValues = null;
|
|
36
|
+
this._orgValue = null;
|
|
37
|
+
this._taskDefinitionId = null;
|
|
43
38
|
this.StudioValue = null;
|
|
44
|
-
this._expAlreadyComputedOnce = false;
|
|
45
|
-
// for web client :
|
|
46
|
-
// save the custom properties that define by the user
|
|
39
|
+
this._expAlreadyComputedOnce = false;
|
|
47
40
|
this.customProperties = new Map();
|
|
48
41
|
this.customPropertiesValues = new Map();
|
|
49
|
-
// for web client :
|
|
50
|
-
// save the custom validators that define by the user
|
|
51
42
|
this.customValidatorProperties = new Map();
|
|
52
43
|
this.customValidatorValues = new Map();
|
|
53
44
|
if (arguments.length === 0)
|
|
@@ -57,7 +48,6 @@ export class Property {
|
|
|
57
48
|
else
|
|
58
49
|
this.constructor_2(cId, cParentObj, parType, val);
|
|
59
50
|
}
|
|
60
|
-
// task definition associated with the property.
|
|
61
51
|
get TaskDefinitionId() {
|
|
62
52
|
return this._taskDefinitionId;
|
|
63
53
|
}
|
|
@@ -76,18 +66,9 @@ export class Property {
|
|
|
76
66
|
this.setValue(val);
|
|
77
67
|
this.setOrgValue();
|
|
78
68
|
}
|
|
79
|
-
/// <summary>
|
|
80
|
-
/// set the id of this property
|
|
81
|
-
/// </summary>
|
|
82
69
|
setId(cId) {
|
|
83
70
|
this._id = cId;
|
|
84
71
|
}
|
|
85
|
-
/// <summary>
|
|
86
|
-
/// Need part input String to relevant for the class data
|
|
87
|
-
/// </summary>
|
|
88
|
-
/// <param name = "parentRef">reference to parent </param>
|
|
89
|
-
/// <param name="parType"></param>
|
|
90
|
-
/// <param name="task"></param>
|
|
91
72
|
fillData(parentRef, parType, parser) {
|
|
92
73
|
let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
|
|
93
74
|
if (this._parentObj === null && parentRef !== null) {
|
|
@@ -95,7 +76,6 @@ export class Property {
|
|
|
95
76
|
this._parentType = parType;
|
|
96
77
|
}
|
|
97
78
|
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
98
|
-
// last position of its tag
|
|
99
79
|
let tag = parser.getXMLsubstring(endContext);
|
|
100
80
|
parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_PROP) + XMLConstants.MG_TAG_PROP.length);
|
|
101
81
|
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
@@ -104,9 +84,7 @@ export class Property {
|
|
|
104
84
|
}
|
|
105
85
|
this.initElements(tokensVector);
|
|
106
86
|
parser.setCurrIndex(endContext + XMLConstants.TAG_CLOSE.length);
|
|
107
|
-
// deal with internal tags
|
|
108
87
|
this.InitInnerObjects(parser);
|
|
109
|
-
// for the properties of this types need set parameters to the parent - CONTROL (in this case)
|
|
110
88
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
111
89
|
this.setControlAttributes();
|
|
112
90
|
else if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
@@ -124,10 +102,6 @@ export class Property {
|
|
|
124
102
|
xmlParser.setCurrIndex(endContext + (XMLConstants.MG_TAG_PROP + XMLConstants.TAG_CLOSE).length);
|
|
125
103
|
}
|
|
126
104
|
}
|
|
127
|
-
/// <summary>
|
|
128
|
-
/// Make initialization of private elements by found tokens
|
|
129
|
-
/// </summary>
|
|
130
|
-
/// <param name = "tokensVector">found tokens, which consist attribute/value of every found element </param>
|
|
131
105
|
initElements(tokensVector) {
|
|
132
106
|
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
133
107
|
let attribute = (tokensVector.get_Item(j));
|
|
@@ -135,7 +109,7 @@ export class Property {
|
|
|
135
109
|
switch (attribute) {
|
|
136
110
|
case XMLConstants.MG_ATTR_ID:
|
|
137
111
|
this.setId(XmlParser.getInt(valueStr));
|
|
138
|
-
this.setDataType();
|
|
112
|
+
this.setDataType();
|
|
139
113
|
break;
|
|
140
114
|
case XMLConstants.MG_ATTR_STUDIO_VALUE:
|
|
141
115
|
this.StudioValue = XmlParser.unescape(valueStr);
|
|
@@ -158,8 +132,6 @@ export class Property {
|
|
|
158
132
|
this.setDataType();
|
|
159
133
|
break;
|
|
160
134
|
case XMLConstants.MG_ATTR_NAME:
|
|
161
|
-
// Name is only serialized for debug version .
|
|
162
|
-
// To avoid exceptions, add a blank case for it
|
|
163
135
|
break;
|
|
164
136
|
case XMLConstants.MG_ATTR_CTL_IDX:
|
|
165
137
|
this._taskDefinitionId.CtlIndex = XmlParser.getInt(valueStr);
|
|
@@ -171,20 +143,15 @@ export class Property {
|
|
|
171
143
|
Events.WriteExceptionToLog(NString.Format("There is no such tag in Property class. Insert case to Property.initElements for {0}", attribute));
|
|
172
144
|
break;
|
|
173
145
|
}
|
|
174
|
-
// if the property is already compute in the server , then set _expAlreadyComputedOnce
|
|
175
146
|
if (this.IsComputedOnceOnServer())
|
|
176
147
|
this._expAlreadyComputedOnce = true;
|
|
177
148
|
}
|
|
178
149
|
}
|
|
179
|
-
/// <summary>
|
|
180
|
-
/// init the custom properties
|
|
181
|
-
/// </summary>
|
|
182
150
|
InitCustomProperties(customProprtiesStr) {
|
|
183
151
|
this.customProperties = new Map(JSON.parse(customProprtiesStr));
|
|
184
152
|
if (this._parentObj.IsFirstRefreshOfProps())
|
|
185
153
|
this.SetFirstValueForCustomProperties();
|
|
186
154
|
}
|
|
187
|
-
// Init CustomValidator
|
|
188
155
|
InitCustomValidator(parser) {
|
|
189
156
|
let text = parser.ReadToEndOfCurrentElement();
|
|
190
157
|
text = text.substr(text.indexOf(XMLConstants.MG_TAG_CUSTOM_VALIDATOR) + XMLConstants.MG_TAG_CUSTOM_VALIDATOR.length);
|
|
@@ -211,9 +178,6 @@ export class Property {
|
|
|
211
178
|
}
|
|
212
179
|
this.customValidatorProperties.set(key, c);
|
|
213
180
|
}
|
|
214
|
-
/// <summary>
|
|
215
|
-
/// init the custom validation properties
|
|
216
|
-
/// </summary>
|
|
217
181
|
InitCustomValidationProperties(customProprtiesStr) {
|
|
218
182
|
let parser = new XmlParser(customProprtiesStr);
|
|
219
183
|
let currTagName = parser.getNextTag();
|
|
@@ -240,7 +204,6 @@ export class Property {
|
|
|
240
204
|
let c = this.customValidatorProperties.get(customProperty);
|
|
241
205
|
this.customValidatorValues.set(customProperty, new CustomValidator(true, ""));
|
|
242
206
|
}
|
|
243
|
-
// create from the value string and save it in val & orgValue
|
|
244
207
|
this._val = this.GetArrayValuesForCustomValidationProperties();
|
|
245
208
|
this._orgValue = this._val;
|
|
246
209
|
}
|
|
@@ -257,13 +220,9 @@ export class Property {
|
|
|
257
220
|
SetFirstValueForCustomProperties() {
|
|
258
221
|
for (let customProperty of this.customProperties.keys())
|
|
259
222
|
this.customPropertiesValues.set(customProperty, "");
|
|
260
|
-
// create from the value string and save it in val & orgValue
|
|
261
223
|
this._val = this.GetArrayValuesForCustomProperties();
|
|
262
224
|
this._orgValue = this._val;
|
|
263
225
|
}
|
|
264
|
-
/// <summary>
|
|
265
|
-
/// reset _expAlreadyComputedOnce flag
|
|
266
|
-
/// </summary>
|
|
267
226
|
ResetComputedOnceFlag() {
|
|
268
227
|
this._expAlreadyComputedOnce = false;
|
|
269
228
|
}
|
|
@@ -271,7 +230,6 @@ export class Property {
|
|
|
271
230
|
let taskDefinitionIdTableSaxHandler = new TaskDefinitionIdTableSaxHandler(this.SetTaskDefinitionId);
|
|
272
231
|
taskDefinitionIdTableSaxHandler.parse(xmlBuffer);
|
|
273
232
|
}
|
|
274
|
-
// callback for TaskDefinitionIdTableSaxHandler
|
|
275
233
|
SetTaskDefinitionId(taskDefinitionId) {
|
|
276
234
|
this._taskDefinitionId = taskDefinitionId;
|
|
277
235
|
}
|
|
@@ -352,9 +310,9 @@ export class Property {
|
|
|
352
310
|
case PropInterface.PROP_TYPE_IS_ROUTER_OUTLET:
|
|
353
311
|
case PropInterface.PROP_TYPE_DEFAULT_OUTLET:
|
|
354
312
|
case PropInterface.PROP_TYPE_SERVER_READ_AHEAD:
|
|
313
|
+
case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
|
|
355
314
|
this._dataType = StorageAttribute.BOOLEAN;
|
|
356
315
|
break;
|
|
357
|
-
case PropInterface.PROP_TYPE_DEFAULT_BUTTON:
|
|
358
316
|
case PropInterface.PROP_TYPE_IMAGE_FILENAME:
|
|
359
317
|
case PropInterface.PROP_TYPE_EVAL_END_CONDITION:
|
|
360
318
|
case PropInterface.PROP_TYPE_FRAME_NAME:
|
|
@@ -412,7 +370,6 @@ export class Property {
|
|
|
412
370
|
case PropInterface.PROP_TYPE_FONT:
|
|
413
371
|
case PropInterface.PROP_TYPE_LAYER:
|
|
414
372
|
case PropInterface.PROP_TYPE_WIDTH:
|
|
415
|
-
case PropInterface.PROP_TYPE_HEIGHT:
|
|
416
373
|
case PropInterface.PROP_TYPE_TITLE_HEIGHT:
|
|
417
374
|
case PropInterface.PROP_TYPE_COLOR:
|
|
418
375
|
case PropInterface.PROP_TYPE_LEFT:
|
|
@@ -444,9 +401,9 @@ export class Property {
|
|
|
444
401
|
case PropInterface.PROP_TYPE_SCROLL_BAR_THUMB:
|
|
445
402
|
case PropInterface.PROP_TYPE_BINDING_LEVEL:
|
|
446
403
|
case PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL:
|
|
404
|
+
case PropInterface.PROP_TYPE_SELECT_PROGRAM:
|
|
447
405
|
if (this._id === PropInterface.PROP_TYPE_TOOLTIP && this._expId > 0)
|
|
448
406
|
this._dataType = StorageAttribute.UNICODE;
|
|
449
|
-
// pic will be set according to exp length
|
|
450
407
|
else {
|
|
451
408
|
this._dataType = StorageAttribute.NUMERIC;
|
|
452
409
|
if (Property._numericPropertyPic == null)
|
|
@@ -474,16 +431,12 @@ export class Property {
|
|
|
474
431
|
case PropInterface.PROP_TYPE_ALLOW_SUGGESTIONS:
|
|
475
432
|
case PropInterface.PROP_TYPE_MOBILE_IMAGE_LIST_FILE_NAME:
|
|
476
433
|
case PropInterface.PROP_TYPE_SWIPE_REFRESH:
|
|
477
|
-
// No handling is needed here as the properties are valid for mobile as for now.
|
|
478
434
|
break;
|
|
479
435
|
default:
|
|
480
436
|
Events.WriteExceptionToLog(NString.Format("in Property.setDataType() no case for: {0}", this._id));
|
|
481
437
|
break;
|
|
482
438
|
}
|
|
483
439
|
}
|
|
484
|
-
/// <summary>
|
|
485
|
-
/// set attributes of a the parent control
|
|
486
|
-
/// </summary>
|
|
487
440
|
setControlAttributes() {
|
|
488
441
|
if (this._parentObj == null || this._parentType !== GuiConstants.PARENT_TYPE_CONTROL) {
|
|
489
442
|
Events.WriteExceptionToLog("in Property.setControlAttributes() there is no parent or the parent is not a control");
|
|
@@ -522,29 +475,15 @@ export class Property {
|
|
|
522
475
|
break;
|
|
523
476
|
}
|
|
524
477
|
}
|
|
525
|
-
/// <summary>
|
|
526
|
-
/// returns a reference to the parent object of this property
|
|
527
|
-
/// </summary>
|
|
528
478
|
getParentObj() {
|
|
529
479
|
return this._parentObj;
|
|
530
480
|
}
|
|
531
|
-
/// <summary>
|
|
532
|
-
/// returns the type of the parent object
|
|
533
|
-
/// </summary>
|
|
534
481
|
getParentType() {
|
|
535
482
|
return this._parentType;
|
|
536
483
|
}
|
|
537
|
-
/// <summary>
|
|
538
|
-
/// returns the id of the property
|
|
539
|
-
/// </summary>
|
|
540
484
|
getID() {
|
|
541
485
|
return this._id;
|
|
542
486
|
}
|
|
543
|
-
/// <summary>
|
|
544
|
-
/// set the value of the property and take care of the presentation the value must be in a magic internal
|
|
545
|
-
/// format
|
|
546
|
-
/// </summary>
|
|
547
|
-
/// <param name = "mgVal">the new value</param>
|
|
548
487
|
setValue(mgVal) {
|
|
549
488
|
let compIdx = this._parentObj.getCompIdx();
|
|
550
489
|
if (this._id === PropInterface.PROP_TYPE_DATA || this._id === PropInterface.PROP_TYPE_NODE_ID || this._id === PropInterface.PROP_TYPE_NODE_PARENTID)
|
|
@@ -568,30 +507,15 @@ export class Property {
|
|
|
568
507
|
throw new ApplicationException("in Property.setValue() illegal data type: " + this._dataType);
|
|
569
508
|
}
|
|
570
509
|
}
|
|
571
|
-
/// <summary>
|
|
572
|
-
/// set an int value directly, as is done when initializing the property
|
|
573
|
-
/// </summary>
|
|
574
|
-
/// <param name="val"></param>
|
|
575
510
|
SetValue(val) {
|
|
576
511
|
this._val = String(val);
|
|
577
512
|
}
|
|
578
|
-
/// <summary>
|
|
579
|
-
/// set the value of the property and take care of the presentation the value must be in a magic internal format
|
|
580
|
-
/// </summary>
|
|
581
513
|
setOrgValue() {
|
|
582
514
|
this._orgValue = this._val;
|
|
583
515
|
}
|
|
584
|
-
/// <summary>
|
|
585
|
-
///
|
|
586
|
-
/// </summary>
|
|
587
516
|
SetStudioValueAsOrgValue() {
|
|
588
517
|
this._orgValue = this.StudioValue;
|
|
589
518
|
}
|
|
590
|
-
/// <summary>
|
|
591
|
-
/// Returns the form related to this property. If the property's parent is the form then return it,
|
|
592
|
-
/// otherwise, if the property's parent is a control then return the form to which this control belongs.
|
|
593
|
-
/// </summary>
|
|
594
|
-
/// <returns> MgForm</returns>
|
|
595
519
|
getForm() {
|
|
596
520
|
let form = null;
|
|
597
521
|
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
@@ -600,9 +524,6 @@ export class Property {
|
|
|
600
524
|
form = this._parentObj.getForm();
|
|
601
525
|
return form;
|
|
602
526
|
}
|
|
603
|
-
/// <summary>
|
|
604
|
-
/// </summary>
|
|
605
|
-
/// <returns> the task by the parent object</returns>
|
|
606
527
|
GetTaskByParentObject() {
|
|
607
528
|
let task = null;
|
|
608
529
|
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
@@ -613,19 +534,11 @@ export class Property {
|
|
|
613
534
|
task = this._parentObj;
|
|
614
535
|
return task;
|
|
615
536
|
}
|
|
616
|
-
/// <summary>
|
|
617
|
-
/// refresh the display for control properties and form properties only
|
|
618
|
-
/// </summary>
|
|
619
|
-
/// <param name = "forceRefresh">if true then refresh is forced regardless of the previous value</param>
|
|
620
537
|
RefreshDisplay(forceRefresh) {
|
|
621
538
|
return __awaiter(this, void 0, void 0, function* () {
|
|
622
539
|
yield this.RefreshDisplayWithCurrentLine(forceRefresh, Int32.MinValue);
|
|
623
540
|
});
|
|
624
541
|
}
|
|
625
|
-
/// <summary>
|
|
626
|
-
/// return TRUE if the property need to be skip from the refresh properties. for a control
|
|
627
|
-
/// </summary>
|
|
628
|
-
/// <returns></returns>
|
|
629
542
|
ShouldSkipRefreshControl() {
|
|
630
543
|
let skip = false;
|
|
631
544
|
let mgControl = this._parentObj;
|
|
@@ -652,8 +565,6 @@ export class Property {
|
|
|
652
565
|
case PropInterface.PROP_TYPE_IS_CACHED:
|
|
653
566
|
case PropInterface.PROP_TYPE_LAYER:
|
|
654
567
|
case PropInterface.PROP_TYPE_AUTO_FIT:
|
|
655
|
-
// case PropInterface.PROP_TYPE_MULTILINE_VERTICAL_SCROLL:
|
|
656
|
-
// case PropInterface.PROP_TYPE_MULTILINE_WORDWRAP_SCROLL:
|
|
657
568
|
case PropInterface.PROP_TYPE_RAISE_AT:
|
|
658
569
|
case PropInterface.PROP_TYPE_FRAMESET_STYLE:
|
|
659
570
|
case PropInterface.PROP_TYPE_FRAME_TYPE:
|
|
@@ -687,15 +598,10 @@ export class Property {
|
|
|
687
598
|
}
|
|
688
599
|
return skip;
|
|
689
600
|
}
|
|
690
|
-
/// <summary>
|
|
691
|
-
/// return TRUE if the property need to be skip from the refresh properties. for a form
|
|
692
|
-
/// </summary>
|
|
693
|
-
/// <returns></returns>
|
|
694
601
|
ShouldSkipRefreshForm() {
|
|
695
602
|
Debug.Assert(this._parentType === GuiConstants.PARENT_TYPE_FORM);
|
|
696
603
|
let skip = false;
|
|
697
604
|
let mgFormBase = this._parentObj;
|
|
698
|
-
// Compute properties: all those properties will be refresh only one time
|
|
699
605
|
switch (this._id) {
|
|
700
606
|
case PropInterface.PROP_TYPE_WINDOW_TYPE:
|
|
701
607
|
if (!this._parentObj.IsFirstRefreshOfProps())
|
|
@@ -710,19 +616,9 @@ export class Property {
|
|
|
710
616
|
default:
|
|
711
617
|
break;
|
|
712
618
|
}
|
|
713
|
-
// refresh only the relevant subform properties (color, font, etc.)
|
|
714
619
|
if (!skip && mgFormBase.isSubForm()) {
|
|
715
620
|
skip = true;
|
|
716
621
|
switch (this._id) {
|
|
717
|
-
//case AutoFit.AsCalledForm:
|
|
718
|
-
// need to set the bounds as the called form only for the width and height
|
|
719
|
-
// skip = false;
|
|
720
|
-
// if (this._id === PropInterface.PROP_TYPE_LEFT || this._id === PropInterface.PROP_TYPE_TOP)
|
|
721
|
-
// skip = true;
|
|
722
|
-
// break;
|
|
723
|
-
//}
|
|
724
|
-
// break;
|
|
725
|
-
case PropInterface.PROP_TYPE_DEFAULT_BUTTON:
|
|
726
622
|
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
727
623
|
case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
|
|
728
624
|
skip = false;
|
|
@@ -731,10 +627,6 @@ export class Property {
|
|
|
731
627
|
}
|
|
732
628
|
return skip;
|
|
733
629
|
}
|
|
734
|
-
/// <summary>
|
|
735
|
-
/// return TRUE if the property need to be skip from the refresh properties. for a task
|
|
736
|
-
/// </summary>
|
|
737
|
-
/// <returns></returns>
|
|
738
630
|
ShouldSkipRefreshTask() {
|
|
739
631
|
let skip = false;
|
|
740
632
|
switch (this._id) {
|
|
@@ -777,11 +669,6 @@ export class Property {
|
|
|
777
669
|
}
|
|
778
670
|
return skip;
|
|
779
671
|
}
|
|
780
|
-
/// <summary>
|
|
781
|
-
/// check if the property should be ignored by RefreshDisplay() skip properties which has nothing to do with
|
|
782
|
-
/// the display
|
|
783
|
-
/// </summary>
|
|
784
|
-
/// <returns> true if the property should be ignored</returns>
|
|
785
672
|
ShouldSkipRefresh() {
|
|
786
673
|
let skip = false;
|
|
787
674
|
switch (this._parentType) {
|
|
@@ -816,21 +703,11 @@ export class Property {
|
|
|
816
703
|
}
|
|
817
704
|
return skip;
|
|
818
705
|
}
|
|
819
|
-
/// <summary>
|
|
820
|
-
/// refresh the display for control properties and form properties only
|
|
821
|
-
/// </summary>
|
|
822
|
-
/// <param name = "forceRefresh">if true then refresh is forced regardless of the previous value</param>
|
|
823
|
-
/// <param name = "currLine">line number in table when refreshing a column if the current line is refreshed set to
|
|
824
|
-
/// (Integer.MIN_VALUE)
|
|
825
|
-
/// </param>
|
|
826
706
|
RefreshDisplayWithCurrentLine(forceRefresh, currLine) {
|
|
827
707
|
return __awaiter(this, void 0, void 0, function* () {
|
|
828
708
|
yield this.RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, true);
|
|
829
709
|
});
|
|
830
710
|
}
|
|
831
|
-
// This method checks if we must refresh the property even if it has expression
|
|
832
|
-
// For now it returns true for properties with text for multilingual support
|
|
833
|
-
// todo Need to add here check if user wants multilingual support at all
|
|
834
711
|
SkipWhenNoExpression() {
|
|
835
712
|
let skipWhenNoExpression = true;
|
|
836
713
|
let ctrl = ((this._parentObj instanceof GuiControlPropertyAdapter) ? this._parentObj : null);
|
|
@@ -856,23 +733,6 @@ export class Property {
|
|
|
856
733
|
skipWhenNoExpression = false;
|
|
857
734
|
return skipWhenNoExpression;
|
|
858
735
|
}
|
|
859
|
-
/// <summary>
|
|
860
|
-
/// Reevaluate the property value (if it has an expression) and
|
|
861
|
-
/// refresh the display for control properties and form properties only
|
|
862
|
-
///
|
|
863
|
-
/// This method was (as its name implies) relevant only for GUI properties, i.e. properties that affect on the display.
|
|
864
|
-
/// Non-GUI properties (such as PROP_TYPE_TAB_IN) were skipped and not reevaluated.
|
|
865
|
-
/// The distinction between GUI properties and non-GUI properties is done by the method �ShouldSkipRefresh�E
|
|
866
|
-
/// Now we have non-GUI properties that are reevaluated in this function:
|
|
867
|
-
/// PROP_TYPE_MODIFY_IN_QUERY, PROP_TYPE_CONTEXT_MENU, PROP_TYPE_TAB_IN, PROP_TYPE_PARK_ON_CLICK.
|
|
868
|
-
/// For these properties we do not execute explicitly their expressions (it was done in 1.9 by CheckProp function),
|
|
869
|
-
/// we only use their values by GetComputedBooleanProperty function. It is done for do not execute the property expression
|
|
870
|
-
/// in GUI thread. In GUI thread we only use the property value. So it is needed to reevaluate the property value.
|
|
871
|
-
/// </summary>
|
|
872
|
-
/// <param name = "forceRefresh">if true then refresh is forced regardless of the previous value</param>
|
|
873
|
-
/// <param name = "currLine">line number in table when refreshing a column if the current line is refreshed set to
|
|
874
|
-
/// (Integer.MIN_VALUE)
|
|
875
|
-
/// </param>
|
|
876
736
|
RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, checkSkipRefresh) {
|
|
877
737
|
return __awaiter(this, void 0, void 0, function* () {
|
|
878
738
|
let ctrl = null;
|
|
@@ -890,11 +750,9 @@ export class Property {
|
|
|
890
750
|
if (this._prevValues.length === 0)
|
|
891
751
|
this.setPrevArraySize();
|
|
892
752
|
yield this.ComputeValue();
|
|
893
|
-
// before update the property need to prepare data
|
|
894
753
|
switch (this._parentType) {
|
|
895
754
|
case GuiConstants.PARENT_TYPE_CONTROL:
|
|
896
755
|
ctrl = this._parentObj;
|
|
897
|
-
// recompute the PIC for format properties
|
|
898
756
|
if (this._id === PropInterface.PROP_TYPE_FORMAT && this._expId > 0)
|
|
899
757
|
ctrl.computePIC(this._val);
|
|
900
758
|
if (ctrl.IsRepeatable && !ctrl.getForm().isRefreshRepeatableAllowed())
|
|
@@ -903,15 +761,12 @@ export class Property {
|
|
|
903
761
|
line = this.getLine();
|
|
904
762
|
else
|
|
905
763
|
line = currLine;
|
|
906
|
-
// check if the value of the property was changed to prevent sending redundant
|
|
907
|
-
// javascript commands to the browser
|
|
908
764
|
prevValue = this._prevValues.get_Item(line);
|
|
909
765
|
if (!forceRefresh && (this._val === prevValue)
|
|
910
766
|
&& this._id !== PropInterface.PROP_TYPE_MODIFIABLE
|
|
911
767
|
&& this._id !== PropInterface.PROP_TYPE_VISIBLE
|
|
912
768
|
&& this._id !== PropInterface.PROP_TYPE_ENABLED)
|
|
913
769
|
return;
|
|
914
|
-
// to prevent recursion while updating column visibility
|
|
915
770
|
if (ctrl.Type === MgControlType.CTRL_TYPE_COLUMN
|
|
916
771
|
&& this._id === PropInterface.PROP_TYPE_VISIBLE
|
|
917
772
|
&& this._val === prevValue)
|
|
@@ -921,14 +776,12 @@ export class Property {
|
|
|
921
776
|
this._prevValues.set_Item(line, this._val);
|
|
922
777
|
break;
|
|
923
778
|
case GuiConstants.PARENT_TYPE_FORM:
|
|
924
|
-
// check if the value of the property was changed to prevent sending redundant
|
|
925
|
-
// javascript commands to the browser
|
|
926
779
|
prevValue = this._prevValues.get_Item(0);
|
|
927
780
|
if (!forceRefresh && (this._val === prevValue))
|
|
928
781
|
return;
|
|
929
782
|
this._prevValues.set_Item(0, this._val);
|
|
930
783
|
break;
|
|
931
|
-
case GuiConstants.PARENT_TYPE_TASK:
|
|
784
|
+
case GuiConstants.PARENT_TYPE_TASK:
|
|
932
785
|
Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): task property {0} wasn't handled", this._id));
|
|
933
786
|
return;
|
|
934
787
|
default:
|
|
@@ -937,7 +790,7 @@ export class Property {
|
|
|
937
790
|
}
|
|
938
791
|
switch (this._id) {
|
|
939
792
|
case PropInterface.PROP_TYPE_IMAGE_FILENAME:
|
|
940
|
-
|
|
793
|
+
this.onImageFileName();
|
|
941
794
|
break;
|
|
942
795
|
case PropInterface.PROP_TYPE_ENABLED:
|
|
943
796
|
this.onEnable(valChanged);
|
|
@@ -969,6 +822,9 @@ export class Property {
|
|
|
969
822
|
case PropInterface.PROP_TYPE_DISPLAY_LIST:
|
|
970
823
|
yield this.onDisplayList(line);
|
|
971
824
|
break;
|
|
825
|
+
case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
|
|
826
|
+
this.onAutoCompleteMode();
|
|
827
|
+
break;
|
|
972
828
|
case PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST:
|
|
973
829
|
yield this.onVisibleLayerList(line);
|
|
974
830
|
break;
|
|
@@ -978,17 +834,13 @@ export class Property {
|
|
|
978
834
|
case PropInterface.PROP_TYPE_LABEL:
|
|
979
835
|
yield this.onLabel(line);
|
|
980
836
|
break;
|
|
981
|
-
case PropInterface.PROP_TYPE_DEFAULT_BUTTON:
|
|
982
|
-
this.onDefaultButton();
|
|
983
|
-
break;
|
|
984
837
|
case PropInterface.PROP_TYPE_PASSWORD:
|
|
985
838
|
this.onPassword();
|
|
986
839
|
break;
|
|
987
840
|
case PropInterface.PROP_TYPE_MODIFY_IN_QUERY:
|
|
988
841
|
case PropInterface.PROP_TYPE_TAB_IN:
|
|
989
842
|
case PropInterface.PROP_TYPE_PARK_ON_CLICK:
|
|
990
|
-
case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
|
|
991
|
-
// So no handling needed in RefreshDisplay
|
|
843
|
+
case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
|
|
992
844
|
break;
|
|
993
845
|
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
994
846
|
this.onCustomProperties();
|
|
@@ -1005,14 +857,11 @@ export class Property {
|
|
|
1005
857
|
}
|
|
1006
858
|
});
|
|
1007
859
|
}
|
|
1008
|
-
/// <summary>
|
|
1009
|
-
/// the following properties need to calculate once only
|
|
1010
|
-
/// </summary>
|
|
1011
|
-
/// <returns></returns>
|
|
1012
860
|
ShouldBeComputedOnce() {
|
|
1013
861
|
if (this._parentType === GuiConstants.PARENT_TYPE_TASK) {
|
|
1014
862
|
switch (this._id) {
|
|
1015
863
|
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
864
|
+
case PropInterface.PROP_TYPE_PRELOAD_VIEW:
|
|
1016
865
|
case PropInterface.PROP_TYPE_TABBING_CYCLE:
|
|
1017
866
|
case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
|
|
1018
867
|
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
|
|
@@ -1032,10 +881,6 @@ export class Property {
|
|
|
1032
881
|
}
|
|
1033
882
|
return false;
|
|
1034
883
|
}
|
|
1035
|
-
/// <summary>
|
|
1036
|
-
/// if the value is computed in the server
|
|
1037
|
-
/// </summary>
|
|
1038
|
-
/// <returns></returns>
|
|
1039
884
|
IsComputedOnceOnServer() {
|
|
1040
885
|
if (this.ShouldBeComputedOnce()) {
|
|
1041
886
|
let task = this.GetTaskByParentObject();
|
|
@@ -1044,9 +889,6 @@ export class Property {
|
|
|
1044
889
|
}
|
|
1045
890
|
return false;
|
|
1046
891
|
}
|
|
1047
|
-
/// <summary>
|
|
1048
|
-
/// computes the value of the property and does not affect the display
|
|
1049
|
-
/// </summary>
|
|
1050
892
|
ComputeValue() {
|
|
1051
893
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1052
894
|
let result = null;
|
|
@@ -1063,11 +905,9 @@ export class Property {
|
|
|
1063
905
|
this.setValue(result);
|
|
1064
906
|
}
|
|
1065
907
|
else if (this._expId > 0) {
|
|
1066
|
-
// for offline : compute once the properties that was compute on the server
|
|
1067
908
|
if (this.ShouldBeComputedOnce() && this._expAlreadyComputedOnce)
|
|
1068
909
|
return;
|
|
1069
910
|
this._expAlreadyComputedOnce = true;
|
|
1070
|
-
// for following control properties always evaluate expressions
|
|
1071
911
|
let alwaysEvaluate = false;
|
|
1072
912
|
if (this._parentType === GuiConstants.PARENT_TYPE_TASK)
|
|
1073
913
|
alwaysEvaluate = true;
|
|
@@ -1097,11 +937,6 @@ export class Property {
|
|
|
1097
937
|
}
|
|
1098
938
|
});
|
|
1099
939
|
}
|
|
1100
|
-
/// <summary>
|
|
1101
|
-
/// updates results of expression for some properties
|
|
1102
|
-
/// </summary>
|
|
1103
|
-
/// <param name = "result"> </param>
|
|
1104
|
-
/// <returns> </returns>
|
|
1105
940
|
updateResult(result) {
|
|
1106
941
|
switch (this._id) {
|
|
1107
942
|
case PropInterface.PROP_TYPE_FORMAT:
|
|
@@ -1116,11 +951,6 @@ export class Property {
|
|
|
1116
951
|
}
|
|
1117
952
|
return result;
|
|
1118
953
|
}
|
|
1119
|
-
/// <summary>
|
|
1120
|
-
/// do the same as we doing for c++ Uchar RT::tsk_mode_exp (long exp, Uchar mode)
|
|
1121
|
-
/// </summary>
|
|
1122
|
-
/// <param name="result"></param>
|
|
1123
|
-
/// <returns></returns>
|
|
1124
954
|
static updateTaskModeResult(result) {
|
|
1125
955
|
let code = ' ';
|
|
1126
956
|
if (!NString.IsNullOrEmpty(result)) {
|
|
@@ -1139,19 +969,12 @@ export class Property {
|
|
|
1139
969
|
}
|
|
1140
970
|
return code;
|
|
1141
971
|
}
|
|
1142
|
-
/// <summary>
|
|
1143
|
-
/// get the value of the property
|
|
1144
|
-
/// </summary>
|
|
1145
972
|
getValue() {
|
|
1146
973
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1147
974
|
yield this.ComputeValue();
|
|
1148
975
|
return this._val;
|
|
1149
976
|
});
|
|
1150
977
|
}
|
|
1151
|
-
/// <summary>
|
|
1152
|
-
/// returns the integer value of this property
|
|
1153
|
-
/// </summary>
|
|
1154
|
-
/// <returns> int value of this property</returns>
|
|
1155
978
|
getValueInt() {
|
|
1156
979
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1157
980
|
let result = 0;
|
|
@@ -1161,16 +984,9 @@ export class Property {
|
|
|
1161
984
|
return result;
|
|
1162
985
|
});
|
|
1163
986
|
}
|
|
1164
|
-
/// <summary>
|
|
1165
|
-
/// returns the integer value of this property without execute its expression
|
|
1166
|
-
/// </summary>
|
|
1167
|
-
/// <returns> int value of this property</returns>
|
|
1168
987
|
GetComputedValueInteger() {
|
|
1169
988
|
return NNumber.Parse(this._val);
|
|
1170
989
|
}
|
|
1171
|
-
/// <summary>
|
|
1172
|
-
/// returns a boolean value of the property valid only for logical type properties
|
|
1173
|
-
/// </summary>
|
|
1174
990
|
getValueBoolean() {
|
|
1175
991
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1176
992
|
if (this._dataType === StorageAttribute.BOOLEAN) {
|
|
@@ -1182,16 +998,9 @@ export class Property {
|
|
|
1182
998
|
}
|
|
1183
999
|
});
|
|
1184
1000
|
}
|
|
1185
|
-
/// <summary>
|
|
1186
|
-
/// Get the computed value.
|
|
1187
|
-
/// </summary>
|
|
1188
|
-
/// <returns></returns>
|
|
1189
1001
|
GetComputedValue() {
|
|
1190
1002
|
return this._val;
|
|
1191
1003
|
}
|
|
1192
|
-
/// <summary>
|
|
1193
|
-
/// get the computed boolean value of the property without execute its expression
|
|
1194
|
-
/// </summary>
|
|
1195
1004
|
GetComputedValueBoolean() {
|
|
1196
1005
|
if (this._dataType === StorageAttribute.BOOLEAN) {
|
|
1197
1006
|
return DisplayConvertor.toBoolean(this._val);
|
|
@@ -1200,53 +1009,34 @@ export class Property {
|
|
|
1200
1009
|
Events.WriteExceptionToLog(NString.Format("Property.getValueBoolean() was called for non boolean type property: {0}", this._id));
|
|
1201
1010
|
}
|
|
1202
1011
|
}
|
|
1203
|
-
/// returns the previous value of the property in the specified line of the table
|
|
1204
|
-
/// </summary>
|
|
1205
|
-
/// <param name = "line">the requested line number</param>
|
|
1206
1012
|
getPrevValue(line) {
|
|
1207
1013
|
if (line < this._prevValues.length)
|
|
1208
1014
|
return this._prevValues.get_Item(line);
|
|
1209
1015
|
return null;
|
|
1210
1016
|
}
|
|
1211
|
-
/// <summary>
|
|
1212
|
-
/// returns true if this property has an expression
|
|
1213
|
-
/// </summary>
|
|
1214
1017
|
isExpression() {
|
|
1215
1018
|
return this._expId > 0;
|
|
1216
1019
|
}
|
|
1217
|
-
/// <summary>
|
|
1218
|
-
///
|
|
1219
|
-
/// </summary>
|
|
1220
|
-
/// <returns></returns>
|
|
1221
1020
|
GetExpressionId() {
|
|
1222
1021
|
return this._expId;
|
|
1223
1022
|
}
|
|
1224
|
-
/// <summary>
|
|
1225
|
-
/// </summary>
|
|
1226
1023
|
onImageFileName() {
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
mgControlBase.setImageList(yield this.getValue());
|
|
1232
|
-
}
|
|
1233
|
-
else if (mgControlBase.isImageControl() || mgControlBase.isRadio() || mgControlBase.isCheckBox() || mgControlBase.IsImageButton()) {
|
|
1234
|
-
yield mgControlBase.setImageWithFileName(yield this.getValue());
|
|
1235
|
-
}
|
|
1024
|
+
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1025
|
+
let mgControlBase = this._parentObj;
|
|
1026
|
+
if (mgControlBase.isTabControl()) {
|
|
1027
|
+
mgControlBase.setImageList(this.GetComputedValue());
|
|
1236
1028
|
}
|
|
1237
|
-
else
|
|
1238
|
-
|
|
1239
|
-
|
|
1029
|
+
else if (mgControlBase.isImageControl() || mgControlBase.isRadio() || mgControlBase.isCheckBox() || mgControlBase.IsImageButton()) {
|
|
1030
|
+
mgControlBase.setImageWithFileName(this.GetComputedValue());
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
else
|
|
1034
|
+
throw new ApplicationException("in onImageFileName.onEnable()");
|
|
1240
1035
|
}
|
|
1241
|
-
/// <summary>
|
|
1242
|
-
/// </summary>
|
|
1243
1036
|
onEnable(valChanged) {
|
|
1244
1037
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1245
1038
|
let ctrl = this._parentObj;
|
|
1246
1039
|
let currentEditingControl = ctrl.getForm().getTask().CurrentEditingControl;
|
|
1247
|
-
// ACT_TBL_NXTFLD is added in queue, whenever current control is hidden or disabled to set the focus to next control for both RC & OL
|
|
1248
|
-
// which is correct behavior. But once current ctrl is already disabled/hidden , we should not put the same action
|
|
1249
|
-
// in queue again when same ctrl is disabled/hidden multiple times.
|
|
1250
1040
|
if (this._val !== null && this._val === "0" && valChanged && currentEditingControl !== null &&
|
|
1251
1041
|
(ctrl === currentEditingControl || currentEditingControl.isDescendentOfControl(ctrl) || ctrl === currentEditingControl.getLinkedParent(false))) {
|
|
1252
1042
|
let parkedControl = ctrl.getForm().getTask().getLastParkedCtrl();
|
|
@@ -1260,8 +1050,6 @@ export class Property {
|
|
|
1260
1050
|
else
|
|
1261
1051
|
throw new ApplicationException("in Property.onEnable()");
|
|
1262
1052
|
}
|
|
1263
|
-
/// <summary>
|
|
1264
|
-
/// </summary>
|
|
1265
1053
|
onVisible(valChanged) {
|
|
1266
1054
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1267
1055
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
@@ -1279,17 +1067,12 @@ export class Property {
|
|
|
1279
1067
|
}
|
|
1280
1068
|
});
|
|
1281
1069
|
}
|
|
1282
|
-
/// <summary>
|
|
1283
|
-
/// </summary>
|
|
1284
1070
|
OnControlName() {
|
|
1285
1071
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1286
1072
|
}
|
|
1287
1073
|
else
|
|
1288
1074
|
throw new ApplicationException("in Property.OnControlName()");
|
|
1289
1075
|
}
|
|
1290
|
-
/// <summary>
|
|
1291
|
-
/// set hint for edit control property
|
|
1292
|
-
/// </summary>
|
|
1293
1076
|
onHint() {
|
|
1294
1077
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1295
1078
|
let control = this.getObjectByParentObj();
|
|
@@ -1301,43 +1084,30 @@ export class Property {
|
|
|
1301
1084
|
else
|
|
1302
1085
|
throw new ApplicationException("inProperty.onHint()");
|
|
1303
1086
|
}
|
|
1304
|
-
/// <summary>
|
|
1305
|
-
/// </summary>
|
|
1306
1087
|
onFormName() {
|
|
1307
1088
|
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
1308
1089
|
this.addCommandTypeText(0);
|
|
1309
1090
|
else
|
|
1310
1091
|
throw new ApplicationException("in Property.onFormName()");
|
|
1311
1092
|
}
|
|
1312
|
-
/// <summary>
|
|
1313
|
-
/// </summary>
|
|
1314
1093
|
addCommandTypeText(line) {
|
|
1315
1094
|
let mlsTransValue = Events.Translate(this.GetComputedValue());
|
|
1316
|
-
// Fixed bug#:733480 SystemBox = false and title is empty-> .NET hide the title.
|
|
1317
|
-
// we will set it to ' '
|
|
1318
1095
|
if (this._parentType === GuiConstants.PARENT_TYPE_FORM ||
|
|
1319
1096
|
(this._parentType === GuiConstants.PARENT_TYPE_CONTROL && this._parentObj.isColumnControl())) {
|
|
1320
|
-
// #737488: When variable attached to form's text property, spaces are appended
|
|
1321
|
-
// after actual value, equal to picture of variable. Before setting text remove these extra
|
|
1322
|
-
// spaces at the end.
|
|
1323
1097
|
mlsTransValue = StrUtil.rtrim(mlsTransValue);
|
|
1324
1098
|
if (this._parentType === GuiConstants.PARENT_TYPE_FORM && mlsTransValue === NString.Empty) {
|
|
1325
1099
|
mlsTransValue = " ";
|
|
1326
1100
|
}
|
|
1327
1101
|
}
|
|
1328
1102
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL && (this._parentObj.isTextControl()
|
|
1329
|
-
|| (this._parentObj.isButton())))
|
|
1103
|
+
|| (this._parentObj.isButton())))
|
|
1330
1104
|
Commands.addValueWithLine(CommandType.SET_VALUE, this._parentObj, line, mlsTransValue);
|
|
1331
1105
|
else
|
|
1332
1106
|
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this._parentObj, line, HtmlProperties.Text, mlsTransValue);
|
|
1333
1107
|
}
|
|
1334
|
-
/// <summary>
|
|
1335
|
-
/// </summary>
|
|
1336
1108
|
onText(line) {
|
|
1337
1109
|
this.addCommandTypeText(line);
|
|
1338
1110
|
}
|
|
1339
|
-
/// <summary>
|
|
1340
|
-
/// </summary>
|
|
1341
1111
|
onModifiable(valChanged) {
|
|
1342
1112
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1343
1113
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
@@ -1347,7 +1117,6 @@ export class Property {
|
|
|
1347
1117
|
let readOnlyValue = !this.GetComputedValueBoolean();
|
|
1348
1118
|
if ((readOnlyValue || task.getMode() !== Constants.TASK_MODE_QUERY) && ctrl.GetCurrReadOnly() !== readOnlyValue) {
|
|
1349
1119
|
ctrl.SetCurrReadOnly(readOnlyValue);
|
|
1350
|
-
// JPN: IME support (enable IME in query mode)
|
|
1351
1120
|
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
1352
1121
|
if (yield ctrl.getForm().getTask().checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY, false)) {
|
|
1353
1122
|
return;
|
|
@@ -1361,18 +1130,14 @@ export class Property {
|
|
|
1361
1130
|
throw new ApplicationException("in Property.onModifiable()");
|
|
1362
1131
|
});
|
|
1363
1132
|
}
|
|
1364
|
-
/// <summary>
|
|
1365
|
-
/// </summary>
|
|
1366
1133
|
onTooltip() {
|
|
1367
1134
|
let toolTip;
|
|
1368
1135
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1369
1136
|
let ctrl = this._parentObj;
|
|
1370
|
-
// Tooltip expression returns string
|
|
1371
1137
|
if (this._expId === 0)
|
|
1372
1138
|
toolTip = ctrl.getForm().getTask().getHelpItem(NNumber.Parse(this._val)).tooltipHelpText;
|
|
1373
1139
|
else
|
|
1374
1140
|
toolTip = this._val;
|
|
1375
|
-
// #929889: Remove extra white spaces at the end of tooltip text.
|
|
1376
1141
|
toolTip = StrUtil.rtrim(toolTip);
|
|
1377
1142
|
if (ctrl.isButton() && ctrl.ConnectedControl)
|
|
1378
1143
|
Commands.addOperationWithLine(CommandType.SET_PROPERTY, ctrl.ConnectedControl, this.getLine(), HtmlProperties.ZoomButtonTooltip, toolTip);
|
|
@@ -1382,13 +1147,11 @@ export class Property {
|
|
|
1382
1147
|
else
|
|
1383
1148
|
throw new ApplicationException("in Property.onTooltip()");
|
|
1384
1149
|
}
|
|
1385
|
-
/// <summary>
|
|
1386
|
-
/// </summary>
|
|
1387
1150
|
onDisplayList(currLine) {
|
|
1388
1151
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1389
1152
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1390
1153
|
let ctrl = this._parentObj;
|
|
1391
|
-
if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio()) {
|
|
1154
|
+
if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio() || ctrl.HasAutocomplete()) {
|
|
1392
1155
|
let line = (currLine === Int32.MinValue) ? ctrl.getDisplayLine(false) : currLine;
|
|
1393
1156
|
yield ctrl.refreshAndSetItemsList(line, true);
|
|
1394
1157
|
}
|
|
@@ -1397,9 +1160,6 @@ export class Property {
|
|
|
1397
1160
|
throw new ApplicationException("in Property.onDisplayList()");
|
|
1398
1161
|
});
|
|
1399
1162
|
}
|
|
1400
|
-
/// <summary>
|
|
1401
|
-
/// </summary>
|
|
1402
|
-
/// <param name = "currLine"></param>
|
|
1403
1163
|
onVisibleLayerList(currLine) {
|
|
1404
1164
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1405
1165
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
@@ -1409,16 +1169,12 @@ export class Property {
|
|
|
1409
1169
|
line = ctrl.getDisplayLine(false);
|
|
1410
1170
|
else
|
|
1411
1171
|
line = currLine;
|
|
1412
|
-
// Always layering should be performed on Displaylist. But,
|
|
1413
|
-
// DisplayList and itemList should not be refreshed.
|
|
1414
1172
|
yield ctrl.refreshTabForLayerList(line);
|
|
1415
1173
|
}
|
|
1416
1174
|
else
|
|
1417
1175
|
throw new ApplicationException("in Property.onVisibleLayerList()");
|
|
1418
1176
|
});
|
|
1419
1177
|
}
|
|
1420
|
-
/// <summary>
|
|
1421
|
-
/// </summary>
|
|
1422
1178
|
onFormat() {
|
|
1423
1179
|
let ctrl = null;
|
|
1424
1180
|
let ctrlPic;
|
|
@@ -1428,13 +1184,6 @@ export class Property {
|
|
|
1428
1184
|
ctrl.resetPrevVal();
|
|
1429
1185
|
switch (ctrl.Type) {
|
|
1430
1186
|
case MgControlType.CTRL_TYPE_BUTTON:
|
|
1431
|
-
// if the button doesn't have field we need to set the format as the text of the control,
|
|
1432
|
-
// otherwise, the field value will set the text on the control
|
|
1433
|
-
// in addition we need to set the text for image button
|
|
1434
|
-
// Also, do not override the text with the format if the control has an expression.
|
|
1435
|
-
// QCR# 938933. When the control is refreshed for the first time, we should show the text as it
|
|
1436
|
-
// is in the Format property - irrespective of whether field or expression is attached to it or not.
|
|
1437
|
-
// The fix is confined to ControlTypes.CTRL_TYPE_BUTTON because only in case of Button we display the value of the Format property.
|
|
1438
1187
|
if (ctrl.getField() == null && !ctrl.expressionSetAsData() || ctrl.IsImageButton() || (this._parentObj.IsFirstRefreshOfProps() && !GuiEnvironment.Environment.GetSpecialIgnoreButtonFormat()))
|
|
1439
1188
|
this.addCommandTypeText(this.getLine());
|
|
1440
1189
|
break;
|
|
@@ -1449,31 +1198,26 @@ export class Property {
|
|
|
1449
1198
|
else
|
|
1450
1199
|
throw new ApplicationException("in Property.onFormat()");
|
|
1451
1200
|
}
|
|
1452
|
-
/// <summary>
|
|
1453
|
-
/// </summary>
|
|
1454
1201
|
onLabel(currLine) {
|
|
1455
1202
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1456
1203
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1457
|
-
// SELECT control. Note we do not support dynamic change of radio buttons range!
|
|
1458
|
-
// data control ranges are updated when we set values to them in Control.refreshDispVal()
|
|
1459
1204
|
let ctrl = this._parentObj;
|
|
1460
1205
|
let line;
|
|
1461
1206
|
if (currLine === Int32.MinValue)
|
|
1462
1207
|
line = ctrl.getDisplayLine(false);
|
|
1463
1208
|
else
|
|
1464
1209
|
line = currLine;
|
|
1465
|
-
// on combo box compfor check box the label is the item list property
|
|
1466
1210
|
if (ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX)
|
|
1467
1211
|
this.addCommandTypeText(line);
|
|
1468
1212
|
else if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio()) {
|
|
1469
1213
|
ctrl.setRange(yield this.getValue());
|
|
1470
1214
|
ctrl.clearRange(line);
|
|
1471
1215
|
yield ctrl.refreshAndSetItemsList(line, true);
|
|
1472
|
-
// If ItemList has an expression And it may be modified again, refresh the display value of control.
|
|
1473
|
-
// Because it may be possible that display value will change.
|
|
1474
1216
|
if (this._expId > 0)
|
|
1475
1217
|
yield ctrl.ComputeAndRefreshDisplayValue(false);
|
|
1476
1218
|
}
|
|
1219
|
+
else if (ctrl.HasAutocomplete())
|
|
1220
|
+
yield ctrl.refreshAndSetItemsList(line, true);
|
|
1477
1221
|
else
|
|
1478
1222
|
throw new ApplicationException("Property.onLabel(), not support control");
|
|
1479
1223
|
}
|
|
@@ -1481,22 +1225,6 @@ export class Property {
|
|
|
1481
1225
|
throw new ApplicationException("in Property.onLabel()");
|
|
1482
1226
|
});
|
|
1483
1227
|
}
|
|
1484
|
-
/// <summary>
|
|
1485
|
-
/// set the default button on the form
|
|
1486
|
-
/// </summary>
|
|
1487
|
-
onDefaultButton() {
|
|
1488
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM || this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1489
|
-
let form = this._parentObj.getForm();
|
|
1490
|
-
let defaultButton = form.getCtrlByName(this.GetComputedValue(), MgControlType.CTRL_TYPE_BUTTON);
|
|
1491
|
-
let line = (defaultButton === null) ? 0 : defaultButton.getDisplayLine(false);
|
|
1492
|
-
}
|
|
1493
|
-
else
|
|
1494
|
-
throw new ApplicationException("in Property.onDefaultButton()");
|
|
1495
|
-
}
|
|
1496
|
-
/// <summary>
|
|
1497
|
-
/// all the properties that support in subform, must call this method
|
|
1498
|
-
/// </summary>
|
|
1499
|
-
/// <returns></returns>
|
|
1500
1228
|
getObjectByParentObj() {
|
|
1501
1229
|
let result = this._parentObj;
|
|
1502
1230
|
if (this._parentType === GuiConstants.PARENT_TYPE_FORM) {
|
|
@@ -1506,18 +1234,9 @@ export class Property {
|
|
|
1506
1234
|
}
|
|
1507
1235
|
return result;
|
|
1508
1236
|
}
|
|
1509
|
-
/// <summary>
|
|
1510
|
-
///
|
|
1511
|
-
/// </summary>
|
|
1512
|
-
/// <param name="propId"></param>
|
|
1513
|
-
/// <returns></returns>
|
|
1514
1237
|
static isRepeatableInTable(propId) {
|
|
1515
1238
|
return false;
|
|
1516
1239
|
}
|
|
1517
|
-
/// <summary>
|
|
1518
|
-
/// get current line
|
|
1519
|
-
/// </summary>
|
|
1520
|
-
/// <returns></returns>
|
|
1521
1240
|
getLine() {
|
|
1522
1241
|
let line = 0;
|
|
1523
1242
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
@@ -1527,38 +1246,21 @@ export class Property {
|
|
|
1527
1246
|
}
|
|
1528
1247
|
return line;
|
|
1529
1248
|
}
|
|
1530
|
-
/// <summary>
|
|
1531
|
-
/// return original value of property that was computed before execution of expression
|
|
1532
|
-
/// </summary>
|
|
1533
|
-
/// <returns></returns>
|
|
1534
1249
|
getOrgValue() {
|
|
1535
1250
|
return this._orgValue;
|
|
1536
1251
|
}
|
|
1537
|
-
/// <summary>
|
|
1538
|
-
/// update size of prevvalues array
|
|
1539
|
-
/// </summary>
|
|
1540
|
-
/// <param name = "newSize"></param>
|
|
1541
1252
|
updatePrevValueArray(newSize) {
|
|
1542
1253
|
if (!this.ShouldSkipRefresh())
|
|
1543
1254
|
this._prevValues.SetSize(newSize);
|
|
1544
1255
|
}
|
|
1545
|
-
/// <summary>
|
|
1546
|
-
/// clear _prevValues array
|
|
1547
|
-
/// </summary>
|
|
1548
|
-
/// <param name = "newSize"></param>
|
|
1549
1256
|
clearPrevValueArray() {
|
|
1550
1257
|
this._prevValues.Clear();
|
|
1551
1258
|
}
|
|
1552
|
-
/// <summary>
|
|
1553
|
-
/// </summary>
|
|
1554
1259
|
ResetPrevValueArray() {
|
|
1555
1260
|
let count = this._prevValues.length;
|
|
1556
1261
|
this._prevValues.Clear();
|
|
1557
1262
|
this._prevValues.SetSize(count);
|
|
1558
1263
|
}
|
|
1559
|
-
/// <summary>
|
|
1560
|
-
/// compute and set arrays size
|
|
1561
|
-
/// </summary>
|
|
1562
1264
|
setPrevArraySize() {
|
|
1563
1265
|
if (this._parentType === GuiConstants.PARENT_TYPE_FORM || this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1564
1266
|
let size = 1;
|
|
@@ -1572,42 +1274,31 @@ export class Property {
|
|
|
1572
1274
|
this._prevValues.SetSize(size);
|
|
1573
1275
|
}
|
|
1574
1276
|
}
|
|
1575
|
-
/// <summary>
|
|
1576
|
-
/// Password property
|
|
1577
|
-
/// </summary>
|
|
1578
1277
|
onPassword() {
|
|
1579
1278
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
1580
1279
|
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.Password, this.GetComputedValueBoolean());
|
|
1581
1280
|
else
|
|
1582
1281
|
throw new ApplicationException("in Property.onPassword()");
|
|
1583
1282
|
}
|
|
1584
|
-
/// <summary>
|
|
1585
|
-
/// Set user property TitlePadding property
|
|
1586
|
-
/// </summary>
|
|
1587
1283
|
computeCustomPropertiesValues() {
|
|
1588
1284
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1589
1285
|
for (let [customPropertyKey, customPropertyValue] of this.customProperties) {
|
|
1590
1286
|
let len = 255;
|
|
1591
1287
|
let wasEvaluated = new RefParam(false);
|
|
1592
1288
|
let expression = customPropertyValue;
|
|
1593
|
-
// init the value
|
|
1594
1289
|
let retExpressionValue = yield this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1595
1290
|
this.customPropertiesValues.set(customPropertyKey, retExpressionValue);
|
|
1596
1291
|
}
|
|
1597
1292
|
});
|
|
1598
1293
|
}
|
|
1599
|
-
/// <summary>
|
|
1600
|
-
/// compute custom validators
|
|
1601
|
-
/// </summary>
|
|
1602
1294
|
computeCustomValidators() {
|
|
1603
1295
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1604
1296
|
let mgControl = this._parentObj;
|
|
1605
|
-
if (mgControl.ModifiedByUser || this.GetTaskByParentObject().IsInRecompute()) {
|
|
1297
|
+
if (mgControl.ModifiedByUser || mgControl.ValidateControl || this.GetTaskByParentObject().IsInRecompute()) {
|
|
1606
1298
|
for (let [customPropertyKey, customValidatorProperty] of this.customValidatorProperties) {
|
|
1607
1299
|
let len = 255;
|
|
1608
1300
|
let wasEvaluated = new RefParam(false);
|
|
1609
1301
|
let expression = customValidatorProperty._exp;
|
|
1610
|
-
// init the value
|
|
1611
1302
|
let isInValid = yield this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1612
1303
|
let errString = "";
|
|
1613
1304
|
let InValid = (isInValid === "1") ? true : false;
|
|
@@ -1623,33 +1314,24 @@ export class Property {
|
|
|
1623
1314
|
}
|
|
1624
1315
|
});
|
|
1625
1316
|
}
|
|
1626
|
-
/// <summary>
|
|
1627
|
-
/// Set user property TitlePadding property
|
|
1628
|
-
/// </summary>
|
|
1629
1317
|
onCustomProperties() {
|
|
1630
1318
|
for (let [customPropertyKey, customPropertyValue] of this.customPropertiesValues) {
|
|
1631
|
-
// use this._parentObj and not this.getObjectByParentObj()
|
|
1632
1319
|
Commands.addOperationWithLine(CommandType.PROP_SET_USER_PROPERTY, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
|
|
1633
1320
|
}
|
|
1634
1321
|
}
|
|
1635
|
-
/// <summary>
|
|
1636
|
-
/// Set custom validators property
|
|
1637
|
-
/// </summary>
|
|
1638
1322
|
onCustomValidators() {
|
|
1639
1323
|
for (let [customPropertyKey, customPropertyValue] of this.customValidatorValues) {
|
|
1640
|
-
// use this._parentObj and not this.getObjectByParentObj()
|
|
1641
1324
|
Commands.addOperationWithLine(CommandType.PROP_SET_CUSTOM_VALIDATOR, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
|
|
1642
1325
|
}
|
|
1643
1326
|
}
|
|
1644
|
-
/// <summary>
|
|
1645
|
-
/// Set Binding Level
|
|
1646
|
-
/// </summary>
|
|
1647
1327
|
onBindingLevel() {
|
|
1648
1328
|
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
1649
1329
|
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.BindingLevel, this.GetComputedValueInteger());
|
|
1650
1330
|
else
|
|
1651
1331
|
throw new ApplicationException("in Property.BindingLevel()");
|
|
1652
1332
|
}
|
|
1333
|
+
onAutoCompleteMode() {
|
|
1334
|
+
}
|
|
1653
1335
|
GetRetrunValueForCustomPropertyExpression(expression) {
|
|
1654
1336
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1655
1337
|
let len = 255;
|
|
@@ -1686,26 +1368,14 @@ export class Property {
|
|
|
1686
1368
|
return returnValue;
|
|
1687
1369
|
});
|
|
1688
1370
|
}
|
|
1689
|
-
/// <summary>
|
|
1690
|
-
///
|
|
1691
|
-
/// </summary>
|
|
1692
|
-
/// <param name="idx"></param>
|
|
1693
1371
|
RemovePrevValIndexAt(idx) {
|
|
1694
1372
|
if (this._prevValues.length > idx) {
|
|
1695
1373
|
this._prevValues.RemoveAt(idx);
|
|
1696
1374
|
}
|
|
1697
1375
|
}
|
|
1698
|
-
/// <summary>
|
|
1699
|
-
///
|
|
1700
|
-
/// </summary>
|
|
1701
|
-
/// <param name="idx"></param>
|
|
1702
1376
|
InsertPrevValAt(idx) {
|
|
1703
1377
|
this._prevValues.Insert(idx, null);
|
|
1704
1378
|
}
|
|
1705
|
-
/// <summary>
|
|
1706
|
-
///
|
|
1707
|
-
/// </summary>
|
|
1708
|
-
/// <param name="idx"></param>
|
|
1709
1379
|
resetPrevValAt(idx) {
|
|
1710
1380
|
if (idx >= 0 && idx < this._prevValues.length)
|
|
1711
1381
|
this._prevValues.set_Item(idx, null);
|
|
@@ -1715,13 +1385,6 @@ export class Property {
|
|
|
1715
1385
|
PropDefaults.GetPropertyName(this._id), (this._val === null) ? "is null" : this._val, this._expId, this.StudioValue
|
|
1716
1386
|
]);
|
|
1717
1387
|
}
|
|
1718
|
-
/// <summary>
|
|
1719
|
-
/// getDefaultProp() returns a property that has a system default value.
|
|
1720
|
-
/// </summary>
|
|
1721
|
-
/// <param name = "propId">The property id</param>
|
|
1722
|
-
/// <param name = "parentType">PARENT_TYPE_CONTROL, PARENT_TYPE_FORM, PARENT_TYPE_TASK</param>
|
|
1723
|
-
/// <param name = "propParent"></param>
|
|
1724
|
-
/// <returns> Property that has a system default value</returns>
|
|
1725
1388
|
static getDefaultProp(propId, parentType, propParent) {
|
|
1726
1389
|
let prop = null;
|
|
1727
1390
|
let mgVal = PropDefaults.getDefaultValue(propId, parentType, propParent);
|
|
@@ -1735,5 +1398,5 @@ export class Property {
|
|
|
1735
1398
|
}
|
|
1736
1399
|
}
|
|
1737
1400
|
Property._numericPropertyPic = null;
|
|
1738
|
-
Property.UtilImeJpn = (UtilStrByteMode.isLocaleDefLangJPN() ? new UtilImeJpn() : null);
|
|
1739
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL1Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBRVQsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXRELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHdEQsTUFBTSxPQUFPLG1CQUFt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WUFHN0MsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUM7WUFDekMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUM7WUFDekMsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUM7WUFDekMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMscUNBQXFDLENBQUM7WUFDekQsS0FBSyxhQUFhLENBQUMsK0JBQStCLENBQUM7WUFDbkQsS0FBSyxhQUFhLENBQUMsd0JBQXdCLENBQUM7WUFDNUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDckMsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDckMsS0FBSyxhQUFhLENBQUMsd0JBQXdCLENBQUM7WUFDNUMsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUM7WUFDdEMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsbUNBQW1DLENBQUM7WUFDdkQsS0FBSyxhQUFhLENBQUMsNEJBQTRCLENBQUM7WUFDaEQsS0FBSyxhQUFhLENBQUMsMEJBQTBCLENBQUM7WUFDOUMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUM7WUFDekMsS0FBSyxhQUFhLENBQUMsNkJBQTZCLENBQUM7WUFDakQsS0FBSyxhQUFhLENBQUMsNEJBQTRCLENBQUM7WUFDaEQsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMseUJBQXlCLENBQUM7WUFDN0MsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsOEJBQThCLENBQUM7WUFDbEQsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsd0JBQXdCLENBQUM7WUFDNUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsNkJBQTZCLENBQUM7WUFDakQsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsaUNBQWlDLENBQUM7WUFDckQsS0FBSyxhQUFhLENBQUMseUJBQXlCLENBQUM7WUFDN0MsS0FBSyxhQUFhLENBQUMsMENBQTBDLENBQUM7WUFDOUQsS0FBSyxhQUFhLENBQUMsc0NBQXNDLENBQUM7WUFDMUQsS0FBSyxhQUFhLENBQUMsNENBQTRDLENBQUM7WUFDaEUsS0FBSyxhQUFhLENBQUMsK0JBQStCLENBQUM7WUFDbkQsS0FBSyxhQUFhLENBQUMsZ0NBQWdDLENBQUM7WUFDcEQsS0FBSyxhQUFhLENBQUMsa0NBQWtDLENBQUM7WUFDdEQsS0FBSyxhQUFhLENBQUMsbUNBQW1DLENBQUM7WUFDdkQsS0FBSyxhQUFhLENBQUMsNEJBQTRCLENBQUM7WUFDaEQsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsOEJBQThCLENBQUM7WUFDbEQsS0FBSyxhQUFhLENBQUMsMEJBQTBCLENBQUM7WUFDOUMsS0FBSyxhQUFhLENBQUMsd0JBQXdCLENBQUM7WUFDNUMsS0FBSyxhQUFhLENBQUMsMkJBQTJCO2dCQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztnQkFDMUMsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQztZQUNsQyxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQywwQ0FBMEMsQ0FBQztZQUM5RCxLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxLQUFLLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQztZQUNoRCxLQUFLLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQztZQUNqRCxLQUFLLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QyxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNwRCxLQUFLLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQztZQUN6RCxLQUFLLGFBQWEsQ0FBQyxzQ0FBc0MsQ0FBQztZQUMxRCxLQUFLLGFBQWEsQ0FBQyx3Q0FBd0MsQ0FBQztZQUM1RCxLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQztZQUMvQyxLQUFLLGFBQWEsQ0FBQywyQkFBMkI7Z0JBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO2dCQUN4QyxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO1lBQ25DLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDO1lBQ3BDLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUNuQyxLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNwRCxLQUFLLGFBQWEsQ0FBQyxjQUFjLENBQUM7WUFDbEMsS0FBSyxhQUFhLENBQUMsY0FBYztnQkFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7Z0JBQzFDLE1BQU07WUFFUixLQUFLLGFBQWEsQ0FBQyxhQUFhLENBQUM7WUFDakMsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDckMsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDckMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMseUJBQXlCLENBQUM7WUFDN0MsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO1lBQ25DLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLEtBQUssYUFBYSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQztZQUNsQyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDbkMsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO1lBQ25DLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDO1lBQ3BDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUNuQyxLQUFLLGFBQWEsQ0FBQyxjQUFjLENBQUM7WUFDbEMsS0FBSyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBQ2pDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLDhCQUE4QixDQUFDO1lBQ2xELEtBQUssYUFBYSxDQUFDLG1DQUFtQyxDQUFDO1lBQ3ZELEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLDJCQUEyQixDQUFDO1lBQy9DLEtBQUssYUFBYSxDQUFDLDZCQUE2QixDQUFDO1lBQ2pELEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHlCQUF5QixDQUFDO1lBQzdDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLGtDQUFrQyxDQUFDO1lBQ3RELEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHVDQUF1QyxDQUFDO1lBQzNELEtBQUssYUFBYSxDQUFDLDBCQUEwQixDQUFDO1lBQzlDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLGdDQUFnQztnQkFDakQsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2dCQUM1QywwQ0FBMEM7cUJBQ3JDO29CQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO29CQUMxQyxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJO3dCQUN0QyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDbEYsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUM7aUJBQzFDO2dCQUNELE1BQU07WUFDUixLQUFLLGFBQWEsQ0FBQyx1QkFBdUI7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUN2QyxNQUFNO1lBQ1IsS0FBSyxhQUFhLENBQUMsY0FBYztnQkFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBb0MsSUFBSSxDQUFDLFVBQVcsQ0FBQyxRQUFRLENBQUM7Z0JBQzVFLE1BQU07WUFDUixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwQyxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQztZQUM3QyxLQUFLLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQztZQUM1QyxLQUFLLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNwRCxLQUFLLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQztZQUU3QyxLQUFLLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QyxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQztZQUMvQyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQztZQUNqRCxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQztZQUMvQyxLQUFLLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQztZQUN6RCxLQUFLLGFBQWEsQ0FBQyx1QkFBdUI7Z0JBQ3hDLGdGQUFnRjtnQkFDaEYsTUFBTTtZQUNSO2dCQUNFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLDRDQUE0QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNuRyxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUNiLDRDQUE0QztJQUM1QyxjQUFjO0lBQ04sb0JBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7WUFDcEYsTUFBTSxDQUFDLG1CQUFtQixDQUFDLHNGQUFzRixDQUFDLENBQUM7WUFDbkgsT0FBTztTQUNSO1FBRUQsSUFBSSxhQUFhLEdBQW1DLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDcEUsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2hCLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLGNBQWM7Z0JBQy9CLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDL0IsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLG1CQUFtQjtnQkFDcEMsYUFBYSxDQUFDLFFBQVEsR0FBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLGdCQUFnQjtnQkFDakMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEQsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLGVBQWU7Z0JBQ2hDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsY0FBYztnQkFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ2pCLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSTtvQkFDeEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU07WUFFUixLQUFLLGFBQWEsQ0FBQyxzQkFBc0I7Z0JBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJO29CQUNuQixhQUFhLENBQUMsV0FBVyxHQUFzQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDaEYsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLGVBQWU7Z0JBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJO29CQUNuQixhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUN2RCxNQUFNO1lBR1I7Z0JBQ0UsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELGFBQWE7SUFDYiwrREFBK0Q7SUFDL0QsY0FBYztJQUNkLFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MsY0FBYztJQUNkLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELGFBQWE7SUFDYixvQ0FBb0M7SUFDcEMsY0FBYztJQUNkLEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELGFBQWE7SUFDYiwyR0FBMkc7SUFDM0csWUFBWTtJQUNaLGNBQWM7SUFDZCwrQ0FBK0M7SUFDL0MsUUFBUSxDQUFDLEtBQWE7UUFDcEIsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVuRCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUI7WUFDakosT0FBTztRQUVULElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJO1lBQzFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVyQixRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDdEIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUMzQixJQUFJLEtBQUssSUFBSSxJQUFJO29CQUNmLEtBQUssR0FBRywwQ0FBMEMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsRyxNQUFNO1lBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDNUIsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7WUFDbEMsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7WUFDOUIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDbEIsTUFBTTtZQUVSO2dCQUNFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyw0Q0FBNEMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDakc7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUNiLHdFQUF3RTtJQUN4RSxjQUFjO0lBQ2QsOEJBQThCO0lBQzlCLFFBQVEsQ0FBQyxHQUFXO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxhQUFhO0lBQ2Isa0hBQWtIO0lBQ2xILGNBQWM7SUFDZCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxhQUFhO0lBQ2IsR0FBRztJQUNILGNBQWM7SUFDZCx3QkFBd0I7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3BDLENBQUM7SUFHRCxhQUFhO0lBQ2IscUdBQXFHO0lBQ3JHLDBHQUEwRztJQUMxRyxjQUFjO0lBQ2QsOEJBQThCO0lBQ3RCLE9BQU87UUFDYixJQUFJLElBQUksR0FBMkIsSUFBSSxDQUFDO1FBRXhDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsZ0JBQWdCO1lBQ3BELElBQUksR0FBZ0MsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNqRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLG1CQUFtQjtZQUM1RCxJQUFJLEdBQW9DLElBQUksQ0FBQyxVQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFckUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYTtJQUNiLGNBQWM7SUFDZCxxREFBcUQ7SUFDckQscUJBQXFCO1FBQ25CLElBQUksSUFBSSxHQUFnQixJQUFJLENBQUM7UUFFN0IsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxnQkFBZ0I7WUFDcEQsSUFBSSxHQUFpQyxJQUFJLENBQUMsVUFBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQzdELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CO1lBQzVELElBQUksR0FBb0MsSUFBSSxDQUFDLFVBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUMxRSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLGdCQUFnQjtZQUN6RCxJQUFJLEdBQWdCLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYTtJQUNiLHlFQUF5RTtJQUN6RSxjQUFjO0lBQ2Qsd0dBQXdHO0lBQ2xHLGNBQWMsQ0FBQyxZQUFxQjs7WUFDeEMsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RSxDQUFDO0tBQUE7SUFFRCxhQUFhO0lBQ2IsNEZBQTRGO0lBQzVGLGNBQWM7SUFDZCx1QkFBdUI7SUFDZix3QkFBd0I7UUFDOUIsSUFBSSxJQUFJLEdBQVksS0FBSyxDQUFDO1FBQzFCLElBQUksU0FBUyxHQUE4RCxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRTNGLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNoQixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0I7Z0JBQ2pDLElBQUksU0FBUyxDQUFDLGNBQWMsRUFBRTtvQkFDNUIsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDZCxNQUFNO1lBQ1IsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDckMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsY0FBYyxDQUFDO1lBQ2xDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBRXhDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLEtBQUssYUFBYSxDQUFDLDJCQUEyQixDQUFDO1lBQy9DLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUNuQyxLQUFLLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN0QywwREFBMEQ7WUFDMUQsMERBQTBEO1lBQzFELEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUNuQyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUUxQyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQyxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNwRCxLQUFLLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQztZQUM3QyxLQUFLLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNwRCxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDbkMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsNEJBQTRCLENBQUM7WUFDaEQsS0FBSyxhQUFhLENBQUMsNkJBQTZCLENBQUM7WUFDakQsS0FBSyxhQUFhLENBQUMsMkJBQTJCO2dCQUM1QyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNaLE1BQU07WUFFUixLQUFLLGFBQWEsQ0FBQyxzQkFBc0I7Z0JBQ3ZDLElBQUksQ0FBa0MsSUFBSSxDQUFDLFVBQVcsQ0FBQyxPQUFPLEVBQUU7b0JBQzlELElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ2QsTUFBTTtZQUdSO2dCQUNFLE1BQU07U0FDVDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWE7SUFDYix5RkFBeUY7SUFDekYsY0FBYztJQUNkLHVCQUF1QjtJQUNmLHFCQUFxQjtRQUMzQixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFakUsSUFBSSxJQUFJLEdBQVksS0FBSyxDQUFDO1FBQzFCLElBQUksVUFBVSxHQUF3RCxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRXRGLHlFQUF5RTtRQUN6RSxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDaEIsS0FBSyxhQUFhLENBQUMscUJBQXFCO2dCQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDMUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDZCxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsd0JBQXdCLENBQUM7WUFDNUMsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUM7WUFDdEMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsdUNBQXVDO2dCQUN4RCxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNaLE1BQU07WUFFUjtnQkFDRSxNQUFNO1NBQ1Q7UUFFRCxtRUFBbUU7UUFDbkUsSUFBSSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNaLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDaEIsNEJBQTRCO2dCQUM1QiwwRUFBMEU7Z0JBQzFFLGlCQUFpQjtnQkFDakIsOEZBQThGO2dCQUM5RixrQkFBa0I7Z0JBQ2xCLFVBQVU7Z0JBQ1YsR0FBRztnQkFDSCxTQUFTO2dCQUVULEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO2dCQUM1QyxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQztnQkFDL0MsS0FBSyxhQUFhLENBQUMsMkJBQTJCO29CQUM1QyxJQUFJLEdBQUcsS0FBSyxDQUFDO29CQUNiLE1BQU07YUFDVDtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYTtJQUNiLHlGQUF5RjtJQUN6RixjQUFjO0lBQ2QsdUJBQXVCO0lBQ2YscUJBQXFCO1FBQzNCLElBQUksSUFBSSxHQUFZLEtBQUssQ0FBQztRQUUxQixRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDaEIsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUM7WUFDekMsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUM7WUFDekMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMscUNBQXFDLENBQUM7WUFDekQsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsd0JBQXdCLENBQUM7WUFDNUMsS0FBSyxhQUFhLENBQUMsd0JBQXdCLENBQUM7WUFDNUMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7WUFDM0MsS0FBSyxhQUFhLENBQUMsNEJBQTRCLENBQUM7WUFDaEQsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDMUMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMsMEJBQTBCLENBQUM7WUFDOUMsS0FBSyxhQUFhLENBQUMsMENBQTBDLENBQUM7WUFDOUQsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsaUNBQWlDLENBQUM7WUFDckQsS0FBSyxhQUFhLENBQUMsMENBQTBDLENBQUM7WUFDOUQsS0FBSyxhQUFhLENBQUMsc0NBQXNDLENBQUM7WUFDMUQsS0FBSyxhQUFhLENBQUMsb0NBQW9DLENBQUM7WUFDeEQsS0FBSyxhQUFhLENBQUMsNENBQTRDLENBQUM7WUFDaEUsS0FBSyxhQUFhLENBQUMsK0JBQStCLENBQUM7WUFDbkQsS0FBSyxhQUFhLENBQUMscUNBQXFDLENBQUM7WUFDekQsS0FBSyxhQUFhLENBQUMsZ0NBQWdDLENBQUM7WUFDcEQsS0FBSyxhQUFhLENBQUMsc0NBQXNDLENBQUM7WUFDMUQsS0FBSyxhQUFhLENBQUMsa0NBQWtDLENBQUM7WUFDdEQsS0FBSyxhQUFhLENBQUMsd0NBQXdDLENBQUM7WUFDNUQsS0FBSyxhQUFhLENBQUMsbUNBQW1DO2dCQUNwRCxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNaLE1BQU07WUFFUjtnQkFDRSxNQUFNO1NBQ1Q7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxhQUFhO0lBQ2IsOEdBQThHO0lBQzlHLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsOERBQThEO0lBQ3RELGlCQUFpQjtRQUN2QixJQUFJLElBQUksR0FBWSxLQUFLLENBQUM7UUFDMUIsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3hCLEtBQUssWUFBWSxDQUFDLG1CQUFtQjtnQkFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUN2QyxNQUFNO1lBQ1IsS0FBSyxZQUFZLENBQUMsZ0JBQWdCO2dCQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3BDLE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxnQkFBZ0I7Z0JBQ2hDLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDcEMsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtRQUVELFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNoQixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwQyxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQztZQUM3QyxLQUFLLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQztZQUM1QyxLQUFLLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNwRCxLQUFLLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQztZQUM3QyxLQUFLLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QyxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQztZQUMvQyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQztZQUNqRCxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQztZQUMvQyxLQUFLLGFBQWEsQ0FBQyxxQ0FBcUM7Z0JBQ3RELElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ1osTUFBTTtTQUNUO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYTtJQUNiLHlFQUF5RTtJQUN6RSxjQUFjO0lBQ2Qsd0dBQXdHO0lBQ3hHLGtIQUFrSDtJQUNsSCx5QkFBeUI7SUFDekIsWUFBWTtJQUNFLDZCQUE2QixDQUFDLFlBQXFCLEVBQUUsUUFBZ0I7O1lBQ2pGLE1BQU0sSUFBSSxDQUFDLDZDQUE2QyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekYsQ0FBQztLQUFBO0lBRUQsK0VBQStFO0lBQy9FLDRFQUE0RTtJQUU1RSx3RUFBd0U7SUFDeEUsb0JBQW9CO1FBQ2xCLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRWhDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxZQUFZLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUE0QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4SCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7WUFDbEYsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDakYsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDaEYsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDOUUsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDakYsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDbkYsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQztZQUM5RixDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzdGLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDN0YsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUNuRCxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQztZQUMzQyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQzlDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsY0FBYyxDQUFDO1lBQzNDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUM7WUFDL0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQztZQUN4RCxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLDJCQUEyQixDQUFDO1lBQ3hELENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDOUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUM5QyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQ3BELG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUMvQixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhO0lBQ2IsK0RBQStEO0lBQy9ELHVFQUF1RTtJQUN2RSxHQUFHO0lBQ0gsdUhBQXVIO0lBQ3ZILG1GQUFtRjtJQUNuRiw0R0FBNEc7SUFDNUcseUVBQXlFO0lBQ3pFLGlHQUFpRztJQUNqRyxtSEFBbUg7SUFDbkgsMEhBQTBIO0lBQzFILGtIQUFrSDtJQUNsSCxjQUFjO0lBQ2Qsd0dBQXdHO0lBQ3hHLGtIQUFrSDtJQUNsSCx5QkFBeUI7SUFDekIsWUFBWTtJQUNOLDZDQUE2QyxDQUFDLFlBQXFCLEVBQUUsUUFBZ0IsRUFBRSxnQkFBeUI7O1lBQ3BILElBQUksSUFBSSxHQUE4QixJQUFJLENBQUM7WUFDM0MsSUFBSSxJQUFJLEdBQVcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksU0FBaUIsQ0FBQztZQUN0QixJQUFJLFVBQVUsR0FBWSxJQUFJLENBQUM7WUFFL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDM0MsTUFBTSxDQUFDLG1CQUFtQixDQUFDLHdEQUF3RCxDQUFDLENBQUM7Z0JBQ3JGLE9BQU87YUFDUjtZQUVELElBQUksZ0JBQWdCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUM5QyxPQUFPO1lBRVQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ2xELE9BQU87WUFFVCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRTFCLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTFCLGtEQUFrRDtZQUNsRCxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3hCLEtBQUssWUFBWSxDQUFDLG1CQUFtQjtvQkFDbkMsSUFBSSxHQUFtQyxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUN2RCwwQ0FBMEM7b0JBQzFDLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixFQUFFO3dCQUNuRSxPQUFPO29CQUVULElBQUksUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRO3dCQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDOzt3QkFFdEIsSUFBSSxHQUFHLFFBQVEsQ0FBQztvQkFFbEIsOEVBQThFO29CQUM5RSxxQ0FBcUM7b0JBQ3JDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFHNUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDOzJCQUN6QyxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0I7MkJBQy9DLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLGlCQUFpQjsyQkFDNUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsaUJBQWlCO3dCQUMvQyxPQUFPO29CQUVULHdEQUF3RDtvQkFDeEQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0I7MkJBQzNDLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLGlCQUFpQjsyQkFDNUMsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTO3dCQUMxQixPQUFPO29CQUVULElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTO3dCQUN6QixVQUFVLEdBQUcsS0FBSyxDQUFDO29CQUVyQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxNQUFNO2dCQUVSLEtBQUssWUFBWSxDQUFDLGdCQUFnQjtvQkFDaEMsOEVBQThFO29CQUM5RSxxQ0FBcUM7b0JBQ3JDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO3dCQUM1QyxPQUFPO29CQUNULElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3hDLE1BQU07Z0JBRVIsS0FBSyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCO29CQUNwRCxNQUFNLENBQUMsbUJBQW1CLENBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsNkRBQTZELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzNGLE9BQU87Z0JBRVQ7b0JBQ0UsTUFBTSxDQUFDLG1CQUFtQixDQUN4QixPQUFPLENBQUMsTUFBTSxDQUFDLDRFQUE0RSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMxRyxPQUFPO2FBQ1Y7WUFFRCxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBRWhCLEtBQUssYUFBYSxDQUFDLHdCQUF3QjtvQkFDekMsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQzdCLE1BQU07Z0JBRVIsS0FBSyxhQUFhLENBQUMsaUJBQWlCO29CQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUMxQixNQUFNO2dCQUVSLEtBQUssYUFBYSxDQUFDLGlCQUFpQjtvQkFDbEMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNqQyxNQUFNO2dCQUdSLEtBQUssYUFBYSxDQUFDLGNBQWM7b0JBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDckIsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyxtQkFBbUI7b0JBQ3BDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbEIsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyxzQkFBc0I7b0JBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2YsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyxjQUFjO29CQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsQixNQUFNO2dCQUVSLEtBQUssYUFBYSxDQUFDLGNBQWM7b0JBQy9CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDZCxNQUFNO2dCQUVSLEtBQUssYUFBYSxDQUFDLG9CQUFvQjtvQkFDckMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNwQyxNQUFNO2dCQUVSLEtBQUssYUFBYSxDQUFDLGlCQUFpQjtvQkFDbEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNqQixNQUFNO2dCQUVSLEtBQUssYUFBYSxDQUFDLHNCQUFzQjtvQkFDdkMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixNQUFNO2dCQUVSLEtBQUssYUFBYSxDQUFDLDZCQUE2QjtvQkFDOUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3BDLE1BQU07Z0JBRVIsS0FBSyxhQUFhLENBQUMsZ0JBQWdCO29CQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2hCLE1BQU07Z0JBRVIsS0FBSyxhQUFhLENBQUMsZUFBZTtvQkFDaEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QixNQUFNO2dCQUdSLEtBQUssYUFBYSxDQUFDLHdCQUF3QjtvQkFDekMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN2QixNQUFNO2dCQUVSLEtBQUssYUFBYSxDQUFDLGtCQUFrQjtvQkFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNsQixNQUFNO2dCQUdSLEtBQUssYUFBYSxDQUFDLHlCQUF5QixDQUFDO2dCQUM3QyxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDcEMsS0FBSyxhQUFhLENBQUMsdUJBQXVCLENBQUM7Z0JBQzNDLEtBQUssYUFBYSxDQUFDLHlCQUF5QixFQUFFLDBFQUEwRTtvQkFDdEgsMENBQTBDO29CQUMxQyxNQUFNO2dCQUdSLEtBQUssYUFBYSxDQUFDLDJCQUEyQjtvQkFDNUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLE1BQU07Z0JBQ1IsS0FBSyxhQUFhLENBQUMsMkJBQTJCO29CQUM1QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDMUIsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyx1QkFBdUI7b0JBQ3hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEIsTUFBTTtnQkFFUjtvQkFDRSxNQUFNLENBQUMsbUJBQW1CLENBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsd0RBQXdELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3RGLE1BQU07YUFDVDtRQUNILENBQUM7S0FBQTtJQUVELGFBQWE7SUFDYix3REFBd0Q7SUFDeEQsY0FBYztJQUNkLHVCQUF1QjtJQUNmLG9CQUFvQjtRQUMxQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLGdCQUFnQixFQUFFO1lBQ3RELFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDaEIsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO2dCQUMzQyxLQUFLLGFBQWEsQ0FBQywwQ0FBMEMsQ0FBQztnQkFDOUQsS0FBSyxhQUFhLENBQUMsc0NBQXNDLENBQUM7Z0JBQzFELEtBQUssYUFBYSxDQUFDLCtCQUErQixDQUFDO2dCQUNuRCxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUM7Z0JBQ3pDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO2dCQUMxQyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMscUNBQXFDLENBQUM7Z0JBQ3pELEtBQUssYUFBYSxDQUFDLHNCQUFzQjtvQkFDdkMsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNGO2FBQ0ksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtZQUM5RCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDLG1CQUFtQjtnQkFDbEcsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWE7SUFDYiwwQ0FBMEM7SUFDMUMsY0FBYztJQUNkLHVCQUF1QjtJQUNmLHNCQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBQy9CLElBQUksSUFBSSxHQUFnQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJO2dCQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsYUFBYTtJQUNiLHdFQUF3RTtJQUN4RSxjQUFjO0lBQ0EsWUFBWTs7WUFDeEIsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDO1lBQzFCLElBQUksR0FBRyxHQUFXLEdBQUcsQ0FBQztZQUN0QixJQUFJLFlBQVksR0FBc0IsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFMUQsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsRUFBRTtnQkFDMUQsTUFBTSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3ZCO1lBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQywyQkFBMkIsRUFBRTtnQkFDMUQsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxHQUFHLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3ZCO2lCQUNJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3hCLDJFQUEyRTtnQkFDM0UsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxJQUFJLENBQUMsdUJBQXVCO29CQUM3RCxPQUFPO2dCQUVULElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7Z0JBRXBDLCtEQUErRDtnQkFDL0QsSUFBSSxjQUFjLEdBQVksS0FBSyxDQUFDO2dCQUdwQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLGdCQUFnQjtvQkFDcEQsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFFeEIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDL0MsR0FBRyxHQUFHLEtBQUssQ0FBQztvQkFDWixNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQ3BHLGdCQUFnQixDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztpQkFDekQ7cUJBQ0k7b0JBQ0gsSUFBSTt3QkFDRixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7cUJBQ2hKO29CQUNELE9BQU8sQ0FBQyxFQUFFO3dCQUNSLElBQUksVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzlELElBQUksSUFBSSxDQUFDLFVBQVUsWUFBWSx5QkFBeUI7NEJBQ3RELFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUErQixJQUFJLENBQUMsVUFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN0RixNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7cUJBQ2pEO2lCQUVGO2dCQUVELElBQUksWUFBWSxDQUFDLEtBQUssRUFBRTtvQkFDdEIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3ZCO3FCQUNJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7b0JBQ25GLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ25GLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3ZCO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7SUFFRCxhQUFhO0lBQ2IsdURBQXVEO0lBQ3ZELGNBQWM7SUFDZCxvQ0FBb0M7SUFDcEMsd0JBQXdCO0lBQ2hCLFlBQVksQ0FBQyxNQUFjO1FBQ2pDLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNoQixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0I7Z0JBQ2pDLElBQUksTUFBTSxJQUFJLElBQUk7b0JBQ2hCLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN6QixNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsbUJBQW1CO2dCQUNwQyxNQUFNLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQyxNQUFNO1lBRVI7Z0JBQ0UsT0FBTyxNQUFNLENBQUM7U0FDakI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsYUFBYTtJQUNiLGlGQUFpRjtJQUNqRixjQUFjO0lBQ2QsaUNBQWlDO0lBQ2pDLHVCQUF1QjtJQUNmLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFjO1FBQ2hELElBQUksSUFBSSxHQUFXLEdBQUcsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9CLFFBQVEsSUFBSSxFQUFFO2dCQUNaLEtBQUssR0FBRztvQkFDTixJQUFJLEdBQUcsR0FBRyxDQUFDO29CQUNYLE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ1gsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDWCxNQUFNO2FBQ1Q7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUdELGFBQWE7SUFDYixtQ0FBbUM7SUFDbkMsY0FBYztJQUNSLFFBQVE7O1lBQ1osTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVELGFBQWE7SUFDYixnREFBZ0Q7SUFDaEQsY0FBYztJQUNkLGtEQUFrRDtJQUM1QyxXQUFXOztZQUNmLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztZQUV2QixNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUUxQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSTtnQkFDcEIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXBDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FBQTtJQUVELGFBQWE7SUFDYiw2RUFBNkU7SUFDN0UsY0FBYztJQUNkLGtEQUFrRDtJQUNsRCx1QkFBdUI7UUFDckIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsYUFBYTtJQUNiLG9GQUFvRjtJQUNwRixjQUFjO0lBQ1IsZUFBZTs7WUFDbkIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtnQkFDL0MsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QztpQkFDSTtnQkFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQywwRUFBMEUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNsSTtRQUNILENBQUM7S0FBQTtJQUVELGFBQWE7SUFDYiwyQkFBMkI7SUFDM0IsY0FBYztJQUNkLHVCQUF1QjtJQUN2QixnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELGFBQWE7SUFDYixpRkFBaUY7SUFDakYsY0FBYztJQUNkLHVCQUF1QjtRQUNyQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxFQUFFO1lBQy9DLE9BQU8sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QzthQUNJO1lBQ0gsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsMEVBQTBFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbEk7SUFDSCxDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLGNBQWM7SUFDZCwwREFBMEQ7SUFDMUQsWUFBWSxDQUFDLElBQVk7UUFDdkIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYTtJQUNiLHFEQUFxRDtJQUNyRCxjQUFjO0lBQ2QsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWE7SUFDYixHQUFHO0lBQ0gsY0FBYztJQUNkLHVCQUF1QjtJQUN2QixlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxhQUFhO0lBQ2IsY0FBYztJQUNBLGVBQWU7O1lBQzNCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3pELElBQUksYUFBYSxHQUE4RCxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUMvRixJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUUsRUFBRTtvQkFDaEMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUNuRDtxQkFDSSxJQUFJLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsRUFBRTtvQkFDakksTUFBTSxhQUFhLENBQUMsb0JBQW9CLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztpQkFDakU7YUFDRjs7Z0JBRUMsTUFBTSxJQUFJLG9CQUFvQixDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDcEUsQ0FBQztLQUFBO0lBSUQsYUFBYTtJQUNiLGNBQWM7SUFDTixRQUFRLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtZQUN6RCxJQUFJLElBQUksR0FBOEQsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN0RixJQUFJLHFCQUFxQixHQUE4QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7WUFFdEcscUlBQXFJO1lBQ3JJLGtIQUFrSDtZQUNsSCxtRUFBbUU7WUFDbkUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxVQUFVLElBQUkscUJBQXFCLEtBQUssSUFBSTtnQkFDekYsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLElBQUkscUJBQXFCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNoSixJQUFJLGFBQWEsR0FBOEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVGLElBQUksYUFBYSxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsSUFBSSxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDOUgsTUFBTSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2lCQUN2RDthQUNGO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEOztZQUVDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxhQUFhO0lBQ2IsY0FBYztJQUNBLFNBQVMsQ0FBQyxVQUFtQjs7WUFDekMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekQsSUFBSSxJQUFJLEdBQThELElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3RGLElBQUkscUJBQXFCLEdBQThCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDdEcsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxVQUFVLElBQUkscUJBQXFCLEtBQUssSUFBSTtvQkFDekYsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLElBQUkscUJBQXFCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNoSixJQUFJLGFBQWEsR0FBOEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQzVGLElBQUksYUFBYSxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsSUFBSSxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDOUgsTUFBTSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO3FCQUN2RDtpQkFDRjtnQkFDRCxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBRzVJO1FBQ0gsQ0FBQztLQUFBO0lBRUQsYUFBYTtJQUNiLGNBQWM7SUFDTixhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7U0FFMUQ7O1lBRUMsTUFBTSxJQUFJLG9CQUFvQixDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGFBQWE7SUFDYixzQ0FBc0M7SUFDdEMsY0FBYztJQUNOLE1BQU07UUFDWixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLG1CQUFtQixFQUFFO1lBQ3pELElBQUksT0FBTyxHQUF5RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNoRyxJQUFJLGdCQUFnQixHQUFXLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUV6RSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ3pGLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7YUFDcEo7U0FDRjs7WUFFQyxNQUFNLElBQUksb0JBQW9CLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBR0QsYUFBYTtJQUNiLGNBQWM7SUFDTixVQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsZ0JBQWdCO1lBQ3BELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFM0IsTUFBTSxJQUFJLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELGFBQWE7SUFDYixjQUFjO0lBQ04sa0JBQWtCLENBQUMsSUFBWTtRQUNyQyxJQUFJLGFBQWEsR0FBVyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFFdEUsZ0ZBQWdGO1FBQ2hGLHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLGdCQUFnQjtZQUNwRCxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLG1CQUFtQixJQUFxQyxJQUFJLENBQUMsVUFBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUU7WUFDaEksK0VBQStFO1lBQy9FLDJGQUEyRjtZQUMzRixxQkFBcUI7WUFDckIsYUFBYSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxhQUFhLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRTtnQkFDekYsYUFBYSxHQUFHLEdBQUcsQ0FBQzthQUNyQjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsSUFBSSxDQUFrQyxJQUFJLENBQUMsVUFBVyxDQUFDLGFBQWEsRUFBRTtlQUN4SCxDQUFrQyxJQUFJLENBQUMsVUFBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSx1REFBdUQ7WUFDN0gsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7O1lBRXZGLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFHdkgsQ0FBQztJQUVELGFBQWE7SUFDYixjQUFjO0lBQ04sTUFBTSxDQUFDLElBQVk7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxhQUFhO0lBQ2IsY0FBYztJQUNBLFlBQVksQ0FBQyxVQUFtQjs7WUFDNUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekQsSUFBSSxJQUFJLEdBQThELElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBRXRGLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO29CQUN4QixJQUFJLElBQUksR0FBZ0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBRXJELElBQUksYUFBYSxHQUFZLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7b0JBRTdELElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssYUFBYSxFQUFFO3dCQUMvRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUVwQyw4Q0FBOEM7d0JBQzlDLElBQUksZUFBZSxDQUFDLG1CQUFtQixFQUFFLEVBQUU7NEJBQ3pDLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsRUFBRSxLQUFLLENBQUMsRUFBRTtnQ0FDbEcsT0FBTzs2QkFDUjt5QkFDRjt3QkFFRCxRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFFOUk7aUJBQ0Y7YUFDRjs7Z0JBRUMsTUFBTSxJQUFJLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDakUsQ0FBQztLQUFBO0lBRUQsYUFBYTtJQUNiLGNBQWM7SUFDTixTQUFTO1FBQ2YsSUFBSSxPQUFlLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtZQUN6RCxJQUFJLElBQUksR0FBOEQsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUV0RixvQ0FBb0M7WUFDcEMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ25CLE9BQU8sR0FBaUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxDQUFDLGVBQWUsQ0FBQzs7Z0JBRXhHLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRXRCLGlFQUFpRTtZQUNqRSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSyxJQUFJLENBQUMsZ0JBQWdCO2dCQUMxQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQzs7Z0JBRTFJLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNsSDs7WUFFQyxNQUFNLElBQUksb0JBQW9CLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsYUFBYTtJQUNiLGNBQWM7SUFDQSxhQUFhLENBQUMsUUFBZ0I7O1lBQzFDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3pELElBQUksSUFBSSxHQUE4RCxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUV0RixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNuRSxJQUFJLElBQUksR0FBVyxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDekYsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMvQzthQUNGOztnQkFFQyxNQUFNLElBQUksb0JBQW9CLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNsRSxDQUFDO0tBQUE7SUFFRCxhQUFhO0lBQ2IsY0FBYztJQUNkLHFDQUFxQztJQUN2QixrQkFBa0IsQ0FBQyxRQUFnQjs7WUFDL0MsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekQsSUFBSSxJQUFJLEdBQThELElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3RGLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztnQkFFckIsSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDLFFBQVE7b0JBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFFbEMsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFFbEIsMkRBQTJEO2dCQUMzRCxvREFBb0Q7Z0JBQ3BELE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pDOztnQkFFQyxNQUFNLElBQUksb0JBQW9CLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUN2RSxDQUFDO0tBQUE7SUFFRCxhQUFhO0lBQ2IsY0FBYztJQUNOLFFBQVE7UUFDZCxJQUFJLElBQUksR0FBOEIsSUFBSSxDQUFDO1FBQzNDLElBQUksT0FBWSxDQUFDO1FBRWpCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7WUFDekQsSUFBSSxHQUFtQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3ZELE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXBCLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxhQUFhLENBQUMsZ0JBQWdCO29CQUNqQyx5RkFBeUY7b0JBQ3pGLDhEQUE4RDtvQkFDOUQsdURBQXVEO29CQUN2RCxtRkFBbUY7b0JBQ25GLCtGQUErRjtvQkFDL0Ysb0dBQW9HO29CQUNwRyxtSUFBbUk7b0JBQ25JLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsNEJBQTRCLEVBQUUsQ0FBQzt3QkFDM0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUMxQyxNQUFNO2dCQUdSLEtBQUssYUFBYSxDQUFDLGNBQWM7b0JBRS9CLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxFQUFFO3dCQUM5QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7eUJBQ25EO3FCQUNGO29CQUNELE1BQU07YUFDVDtTQUNGOztZQUVDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxhQUFhO0lBQ2IsY0FBYztJQUNBLE9BQU8sQ0FBQyxRQUFnQjs7WUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekQsZ0ZBQWdGO2dCQUNoRix5RkFBeUY7Z0JBQ3pGLElBQUksSUFBSSxHQUE4RCxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUN0RixJQUFJLElBQVksQ0FBQztnQkFFakIsSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDLFFBQVE7b0JBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFFbEMsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFFbEIscUVBQXFFO2dCQUNyRSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQjtvQkFDaEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMzQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN4RSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFFOUMsb0dBQW9HO29CQUNwRyw2REFBNkQ7b0JBQzdELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUNqQixNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkQ7O29CQUVDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2FBQzdFOztnQkFFQyxNQUFNLElBQUksb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM1RCxDQUFDO0tBQUE7SUFHRCxhQUFhO0lBQ2Isd0NBQXdDO0lBQ3hDLGNBQWM7SUFDTixlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7WUFDL0csSUFBSSxJQUFJLEdBQTJCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0QsSUFBSSxhQUFhLEdBQThCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDM0gsSUFBSSxJQUFJLEdBQVcsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUd2Rjs7WUFFQyxNQUFNLElBQUksb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsYUFBYTtJQUNiLHVFQUF1RTtJQUN2RSxjQUFjO0lBQ2QsdUJBQXVCO0lBQ2Ysb0JBQW9CO1FBQzFCLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN0RCxJQUFJLElBQUksR0FBd0QsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNoRixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDbEM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsYUFBYTtJQUNiLEdBQUc7SUFDSCxjQUFjO0lBQ2QsaUNBQWlDO0lBQ2pDLHVCQUF1QjtJQUN2QixNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBYztRQUN2QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLGNBQWM7SUFDZCx1QkFBdUI7SUFDZixPQUFPO1FBQ2IsSUFBSSxJQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CLEVBQUU7WUFDekQsSUFBSSxJQUFJLEdBQThELElBQUksQ0FBQyxVQUFVLENBQUM7WUFDdEYsSUFBSSx5QkFBeUIsR0FBWSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTdFLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDdkQ7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxhQUFhO0lBQ2Isd0ZBQXdGO0lBQ3hGLGNBQWM7SUFDZCx1QkFBdUI7SUFDdkIsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBR0QsYUFBYTtJQUNiLHFDQUFxQztJQUNyQyxjQUFjO0lBQ2Qsb0NBQW9DO0lBQ3BDLG9CQUFvQixDQUFDLE9BQWU7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsYUFBYTtJQUNiLDJCQUEyQjtJQUMzQixjQUFjO0lBQ2Qsb0NBQW9DO0lBQ3BDLG1CQUFtQjtRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxhQUFhO0lBQ2IsY0FBYztJQUNkLG1CQUFtQjtRQUNqQixJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxhQUFhO0lBQ2IsaUNBQWlDO0lBQ2pDLGNBQWM7SUFDTixnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtZQUMvRyxJQUFJLElBQUksR0FBVyxDQUFDLENBQUM7WUFFckIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekQsSUFBSSxhQUFhLEdBQThELElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQy9GLElBQUksYUFBYSxDQUFDLFlBQVk7b0JBQzVCLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztxQkFDakQsSUFBSSxhQUFhLENBQUMsY0FBYyxFQUFFLElBQUksUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQy9FLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUN2RDtZQUVELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVELGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsY0FBYztJQUNOLFVBQVU7UUFDaEIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxtQkFBbUI7WUFDdkQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQzs7WUFFOUosTUFBTSxJQUFJLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MsY0FBYztJQUNBLDZCQUE2Qjs7WUFDekMsS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzFFLElBQUksR0FBRyxHQUFXLEdBQUcsQ0FBQztnQkFDdEIsSUFBSSxZQUFZLEdBQXNCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQztnQkFDckMsaUJBQWlCO2dCQUNqQixJQUFJLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLHlDQUF5QyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxRixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLENBQUM7YUFDeEU7UUFDSCxDQUFDO0tBQUE7SUFFRCxhQUFhO0lBQ2IsNkJBQTZCO0lBQzdCLGNBQWM7SUFDQSx1QkFBdUI7O1lBQ25DLElBQUksU0FBUyxHQUFrQixJQUFJLENBQUMsVUFBVSxDQUFDO1lBQy9DLElBQUksU0FBUyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBQztnQkFDM0UsS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUMsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ3ZGLElBQUksR0FBRyxHQUFXLEdBQUcsQ0FBQztvQkFDdEIsSUFBSSxZQUFZLEdBQXNCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxRCxJQUFJLFVBQVUsR0FBeUIsdUJBQXdCLENBQUMsSUFBSSxDQUFDO29CQUNyRSxpQkFBaUI7b0JBQ2pCLElBQUksU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLHlDQUF5QyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNqRixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7b0JBQ25CLElBQUksT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDakQsSUFBSSxPQUFPLEVBQUU7d0JBQ1gsVUFBVSxHQUF5Qix1QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDN0UsSUFBSSxVQUFVLEdBQUcsQ0FBQzs0QkFDaEIsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLHlDQUF5QyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzs0QkFFN0UsU0FBUyxHQUF5Qix1QkFBd0IsQ0FBQyxhQUFhLENBQUM7cUJBQzVFO29CQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxlQUFlLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztpQkFDN0Y7YUFDRjtRQUNILENBQUM7S0FBQTtJQUVELGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MsY0FBYztJQUNOLGtCQUFrQjtRQUV4QixLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUNoRiwwREFBMEQ7WUFDMUQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQzVJO0lBQ0gsQ0FBQztJQUdELGFBQWE7SUFDYixrQ0FBa0M7SUFDbEMsY0FBYztJQUNOLGtCQUFrQjtRQUN4QixLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUUvRSwwREFBMEQ7WUFDMUQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFDbEcsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFFRCxhQUFhO0lBQ2IscUJBQXFCO0lBQ3JCLGNBQWM7SUFDTixjQUFjO1FBRXBCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsbUJBQW1CO1lBQ3RELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxjQUFjLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7O1lBRWxLLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFYSx5Q0FBeUMsQ0FBQyxVQUFrQjs7WUFDeEUsSUFBSSxHQUFHLEdBQVcsR0FBRyxDQUFDO1lBQ3RCLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzRSxJQUFJLFlBQVksR0FBc0IsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFbkosbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2RSxJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRW5ELFFBQVEsbUJBQW1CLEVBQUU7Z0JBQzNCLEtBQUssZ0JBQWdCLENBQUMsT0FBTztvQkFDM0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ3RGLElBQUksV0FBVyxJQUFJLElBQUk7d0JBQ3JCLFdBQVcsR0FBRywwQ0FBMEMsQ0FBQztvQkFDM0QsV0FBVyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDeEcsTUFBTTtnQkFFUixLQUFLLGdCQUFnQixDQUFDLElBQUk7b0JBQ3hCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQzlELFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUN0RyxNQUFNO2dCQUVSLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtvQkFDeEIsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDOUQsV0FBVyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3RHLE1BQU07Z0JBR1IsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2dCQUM5QixLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQztnQkFDM0IsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7Z0JBQ2xDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2dCQUM5QixLQUFLLGdCQUFnQixDQUFDLElBQUk7b0JBQ3hCLE1BQU07Z0JBRVI7b0JBQ0UsTUFBTSxJQUFJLG9CQUFvQixDQUFDLDZFQUE2RSxHQUFHLG1CQUFtQixDQUFDLENBQUM7YUFDdkk7WUFFRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFHRCxhQUFhO0lBQ2IsR0FBRztJQUNILGNBQWM7SUFDZCw4QkFBOEI7SUFDOUIsb0JBQW9CLENBQUMsR0FBVztRQUM5QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxhQUFhO0lBQ2IsR0FBRztJQUNILGNBQWM7SUFDZCw4QkFBOEI7SUFDOUIsZUFBZSxDQUFDLEdBQVc7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxhQUFhO0lBQ2IsR0FBRztJQUNILGNBQWM7SUFDZCw4QkFBOEI7SUFDOUIsY0FBYyxDQUFDLEdBQVc7UUFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFHRCxRQUFRO1FBQ04sT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHVDQUF1QyxFQUFFO1lBQzdELFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDcEgsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdELGFBQWE7SUFDYiwwRUFBMEU7SUFDMUUsY0FBYztJQUNkLGtEQUFrRDtJQUNsRCw4RkFBOEY7SUFDOUYsdUNBQXVDO0lBQ3ZDLGdFQUFnRTtJQUNoRSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQWMsRUFBRSxVQUFrQixFQUFFLFVBQStCO1FBQ3ZGLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQztRQUMxQixJQUFJLEtBQUssR0FBVyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFakYsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUNoQixJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFN0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDOztBQXY2RGMsNEJBQW1CLEdBQVEsSUFBSSxDQUFDO0FBaUJ4QyxtQkFBVSxHQUFlLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBJbnQzMixcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBDdHJsQnV0dG9uVHlwZUd1aSxcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxJbWVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlciB9IGZyb20gJy4uL3Rhc2tzL1Rhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXInO1xyXG5pbXBvcnQgeyBQcm9wUGFyZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQSUMgfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7IFRhc2tEZWZpbml0aW9uSWQgfSBmcm9tICcuLi90YXNrcy9UYXNrRGVmaW5pdGlvbklkJztcclxuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHsgR3VpQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHsgUHJvcEludGVyZmFjZSB9IGZyb20gJy4vUHJvcEludGVyZmFjZSc7XHJcbmltcG9ydCB7IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgfSBmcm9tICcuL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29udmVydG9yIH0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHsgR3VpRm9ybVByb3BlcnR5QWRhcHRlciB9IGZyb20gJy4vR3VpRm9ybVByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi4vLi4vQ29tbWFuZHMnO1xyXG5pbXBvcnQgeyBDb21tYW5kVHlwZSwgSHRtbFByb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7IEd1aVRhc2tCYXNlIH0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQgeyBQcm9wRGVmYXVsdHMgfSBmcm9tICcuL1Byb3BEZWZhdWx0cyc7XHJcbmltcG9ydCB7IFRvb2xUaXBIZWxwIH0gZnJvbSAnLi9IZWxwcyc7XHJcbmltcG9ydCB7IEd1aUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBNZ0NvbnRyb2xCYXNlIH0gZnJvbSAnLi9NZ0NvbnRyb2xCYXNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21WYWxpZGF0b3JQcm9wIHtcclxuICBfZXhwOiBudW1iZXI7XHJcbiAgX2Vycm9yTWVzc2FnZUV4cDogbnVtYmVyO1xyXG4gIF9lcnJvck1lc3NhZ2U6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21WYWxpZGF0b3Ige1xyXG4gIF92YWxpZDogYm9vbGVhbjtcclxuICBfZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbGlkOiBib29sZWFuLCBlcnJNZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3ZhbGlkID0gdmFsaWQ7XHJcbiAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnJNZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVmFsaWQoKTogYm9vbGVhbiB7cmV0dXJuIHRoaXMuX3ZhbGlkO31cclxuICBwdWJsaWMgZ2V0RXJyTWVzc2FnZSgpOiBzdHJpbmcge3JldHVybiB0aGlzLl9lcnJvck1lc3NhZ2U7fVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFByb3BlcnR5IG9iamVjdCBvZiBjb250cm9sLCBmb3JtIG9yIHRhc2suXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eSB7XHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX2RhdGFUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIHByaXZhdGUgX3ZhbDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9waWM6IFBJQyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXhwSWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfcGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlID0gbnVsbDsgLy8gYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3QgKENvbnRyb2wsIEZvcm0sIEd1aVRhc2tCYXNlKVxyXG4gIHByaXZhdGUgX3BhcmVudFR5cGU6IHN0cmluZyA9IG51bGw7IC8vIENvbnRyb2x8Rm9ybXxHdWlUYXNrQmFzZVxyXG4gIHByaXZhdGUgX3ByZXZWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IG51bGw7IC8vIHJldmVyZW5jZSB0byBwcm9wZXJ0eSB2YWx1ZXMgaW4gYSB0YWJsZVxyXG4gIHByaXZhdGUgX29yZ1ZhbHVlOiBzdHJpbmcgPSBudWxsOyAvLyByZXZlcmVuY2UgdG8gcHJvcGVydHkgdmFsdWVzIGluIGEgdGFibGVcclxuICBwcml2YXRlIHN0YXRpYyBfbnVtZXJpY1Byb3BlcnR5UGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Rhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQgPSBudWxsOyAvLyB0YXNrIGRlZmluaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eS5cclxuICAvLyBzdHVkaW9WYWx1ZSBmb3Igb2ZmbGluZSBzdGF0ZVxyXG4gIC8vIFRvRG86IGNvbW1lbnQgc2F5cyB0aGF0IGl0IGlzIGZvciBcIk9mZmxpbmUgc3RhdGVcIi4gU28sIGRvIHdlIG5lZWQgaXQgaW5XZWJDbGllbnQ/XHJcbiAgU3R1ZGlvVmFsdWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXhwQWxyZWFkeUNvbXB1dGVkT25jZTogYm9vbGVhbiA9IGZhbHNlOyAvLyB0aGUgZXhwcmVzc2lvbiBpcyBhbHJlYWR5IGNvbXB1dGVkIG9uY2VcclxuXHJcbiAgLy8gZm9yIHdlYiBjbGllbnQgOlxyXG4gIC8vIHNhdmUgdGhlIGN1c3RvbSBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIGJ5IHRoZSB1c2VyXHJcbiAgcHJpdmF0ZSBjdXN0b21Qcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgY3VzdG9tUHJvcGVydGllc1ZhbHVlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgLy8gZm9yIHdlYiBjbGllbnQgOlxyXG4gIC8vIHNhdmUgdGhlIGN1c3RvbSB2YWxpZGF0b3JzIHRoYXQgZGVmaW5lIGJ5IHRoZSB1c2VyXHJcbiAgcHJpdmF0ZSBjdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBDdXN0b21WYWxpZGF0b3JQcm9wPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGN1c3RvbVZhbGlkYXRvclZhbHVlczogTWFwPHN0cmluZywgQ3VzdG9tVmFsaWRhdG9yPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgc3RhdGljIFV0aWxJbWVKcG46IFV0aWxJbWVKcG4gPSAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpID8gbmV3IFV0aWxJbWVKcG4oKSA6IG51bGwpOyAvLyBKUE46IElNRSBzdXBwb3J0XHJcblxyXG4gIC8vIHRhc2sgZGVmaW5pdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5LlxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHZhbDogc3RyaW5nKTtcclxuICBjb25zdHJ1Y3RvcihjSWQ/OiBudW1iZXIsIGNQYXJlbnRPYmo/OiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlPzogc3RyaW5nLCB2YWw/OiBzdHJpbmcpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY0lkLCBjUGFyZW50T2JqLCBwYXJUeXBlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8yKGNJZCwgY1BhcmVudE9iaiwgcGFyVHlwZSwgdmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMgPSBuZXcgTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgdGhpcy5zZXRJZChjSWQpO1xyXG4gICAgdGhpcy5fcGFyZW50T2JqID0gY1BhcmVudE9iajtcclxuICAgIHRoaXMuX3BhcmVudFR5cGUgPSBwYXJUeXBlO1xyXG4gICAgdGhpcy5zZXREYXRhVHlwZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY0lkLCBjUGFyZW50T2JqLCBwYXJUeXBlKTtcclxuICAgIHRoaXMuc2V0VmFsdWUodmFsKTtcclxuICAgIHRoaXMuc2V0T3JnVmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGlkIG9mIHRoaXMgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0SWQoY0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2lkID0gY0lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE5lZWQgcGFydCBpbnB1dCBTdHJpbmcgdG8gcmVsZXZhbnQgZm9yIHRoZSBjbGFzcyBkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFJlZlwiPnJlZmVyZW5jZSB0byBwYXJlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBmaWxsRGF0YShwYXJlbnRSZWY6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhclR5cGU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoXCI+XCIsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iaiA9PT0gbnVsbCAmJiBwYXJlbnRSZWYgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGFyZW50T2JqID0gcGFyZW50UmVmO1xyXG4gICAgICB0aGlzLl9wYXJlbnRUeXBlID0gcGFyVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApICsgWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKSB7XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJJbiBQcm9wLkZpbGxEYXRhKCk6IHswfVwiLCB0b2tlbnNWZWN0b3IudG9TdHJpbmcoKSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IpO1xyXG5cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRS5sZW5ndGgpO1xyXG5cclxuICAgICAgLy8gZGVhbCB3aXRoIGludGVybmFsIHRhZ3NcclxuICAgICAgdGhpcy5Jbml0SW5uZXJPYmplY3RzKHBhcnNlcik7XHJcblxyXG4gICAgICAvLyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyB0eXBlcyBuZWVkIHNldCBwYXJhbWV0ZXJzIHRvIHRoZSBwYXJlbnQgLSBDT05UUk9MIChpbiB0aGlzIGNhc2UpXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgICB0aGlzLnNldENvbnRyb2xBdHRyaWJ1dGVzKCk7XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKVxyXG4gICAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZSgxKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJJbiBQcm9wZXJ0eS5GaWxsRGF0YSgpOiBPdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5pdElubmVyT2JqZWN0cyh4bWxQYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IG5leHRUYWc6IHN0cmluZyA9IHhtbFBhcnNlci5nZXROZXh0VGFnKCk7XHJcblxyXG4gICAgaWYgKG5leHRUYWcgPT09IFhNTENvbnN0YW50cy5NR19UQUdfVEFTS0RFRklOSVRJT05JRF9FTlRSWSkge1xyXG4gICAgICBsZXQgeG1sQnVmZmVyOiBzdHJpbmcgPSB4bWxQYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgICB0aGlzLkluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcik7XHJcblxyXG4gICAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0geG1sUGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHhtbFBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgIHhtbFBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIChYTUxDb25zdGFudHMuTUdfVEFHX1BST1AgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1ha2UgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBlbGVtZW50cyBieSBmb3VuZCB0b2tlbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+Zm91bmQgdG9rZW5zLCB3aGljaCBjb25zaXN0IGF0dHJpYnV0ZS92YWx1ZSBvZiBldmVyeSBmb3VuZCBlbGVtZW50IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0RWxlbWVudHModG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgICAgdGhpcy5zZXRJZChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB0aGlzLnNldERhdGFUeXBlKCk7IC8vIFRoZSAnbmFtZScgbWVtYmVyIG11c3QgYmUgZm91bmQgaW4gdGhpcyBwb2ludFxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9TVFVESU9fVkFMVUU6XHJcbiAgICAgICAgICB0aGlzLlN0dWRpb1ZhbHVlID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUU6XHJcbiAgICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVByb3BlcnRpZXMoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9FWFA6XHJcbiAgICAgICAgICB0aGlzLl9leHBJZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMCAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUClcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRhVHlwZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAgLy8gTmFtZSBpcyBvbmx5IHNlcmlhbGl6ZWQgZm9yIGRlYnVnIHZlcnNpb24gLlxyXG4gICAgICAgICAgLy8gVG8gYXZvaWQgZXhjZXB0aW9ucywgYWRkIGEgYmxhbmsgY2FzZSBmb3IgaXRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ1RMX0lEWDpcclxuICAgICAgICAgIHRoaXMuX3Rhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXggPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUFJPR1JBTV9JU046XHJcbiAgICAgICAgICB0aGlzLl90YXNrRGVmaW5pdGlvbklkLlByb2dyYW1Jc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIFByb3BlcnR5IGNsYXNzLiBJbnNlcnQgY2FzZSB0byBQcm9wZXJ0eS5pbml0RWxlbWVudHMgZm9yIHswfVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgY29tcHV0ZSBpbiB0aGUgc2VydmVyICwgdGhlbiBzZXQgX2V4cEFscmVhZHlDb21wdXRlZE9uY2VcclxuICAgICAgaWYgKHRoaXMuSXNDb21wdXRlZE9uY2VPblNlcnZlcigpKVxyXG4gICAgICAgIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSBjdXN0b20gcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tUHJvcGVydGllcyhjdXN0b21Qcm9wcnRpZXNTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oSlNPTi5wYXJzZShjdXN0b21Qcm9wcnRpZXNTdHIpKTtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgIHRoaXMuU2V0Rmlyc3RWYWx1ZUZvckN1c3RvbVByb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEluaXQgQ3VzdG9tVmFsaWRhdG9yXHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tVmFsaWRhdG9yIChwYXJzZXIgOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gcGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgIHRleHQgPSB0ZXh0LnN1YnN0cih0ZXh0LmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19DVVNUT01fVkFMSURBVE9SKSArIFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUi5sZW5ndGgpO1xyXG4gICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2Vucyh0ZXh0LCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgIGxldCBjID0gbmV3IEN1c3RvbVZhbGlkYXRvclByb3AoKTtcclxuICAgIGxldCBrZXk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b2tlbnMubGVuZ3RoOyBqICs9IDIpXHJcbiAgICB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShqKTtcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSB0b2tlbnMuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VYUDpcclxuICAgICAgICAgIGMuX2V4cCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAga2V5ID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRVJST1JfRVhQOlxyXG4gICAgICAgICAgYy5fZXJyb3JNZXNzYWdlRXhwID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VSUk9SOlxyXG4gICAgICAgICAgYy5fZXJyb3JNZXNzYWdlID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzLnNldCAoa2V5LCBjKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgY3VzdG9tIHZhbGlkYXRpb24gcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoY3VzdG9tUHJvcHJ0aWVzU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgcGFyc2VyID0gbmV3IFhtbFBhcnNlcihjdXN0b21Qcm9wcnRpZXNTdHIpO1xyXG4gICAgbGV0IGN1cnJUYWdOYW1lID0gcGFyc2VyLmdldE5leHRUYWcoKTtcclxuICAgIHdoaWxlIChjdXJyVGFnTmFtZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBzd2l0Y2ggKGN1cnJUYWdOYW1lKVxyXG4gICAgICB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0NVU1RPTV9WQUxJREFUT1JTOlxyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbVZhbGlkYXRvclByb3A+KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUjpcclxuICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVZhbGlkYXRvciAocGFyc2VyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjdXJyVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iai5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgdGhpcy5TZXRGaXJzdFZhbHVlRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIFNldEZpcnN0VmFsdWVGb3JDdXN0b21WYWxpZGF0aW9uUHJvcGVydGllcygpOiB2b2lkIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGN1c3RvbVByb3BlcnR5IG9mIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcy5rZXlzKCkpIHtcclxuICAgICAgbGV0IGMgOiBDdXN0b21WYWxpZGF0b3JQcm9wID0gdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzLmdldChjdXN0b21Qcm9wZXJ0eSk7XHJcbiAgICAgIHRoaXMuY3VzdG9tVmFsaWRhdG9yVmFsdWVzLnNldCg8c3RyaW5nPmN1c3RvbVByb3BlcnR5LCBuZXcgQ3VzdG9tVmFsaWRhdG9yKHRydWUsIFwiXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjcmVhdGUgZnJvbSB0aGUgdmFsdWUgc3RyaW5nIGFuZCBzYXZlIGl0IGluIHZhbCAmIG9yZ1ZhbHVlXHJcbiAgICB0aGlzLl92YWwgPSB0aGlzLkdldEFycmF5VmFsdWVzRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKVxyXG4gICAgdGhpcy5fb3JnVmFsdWUgPSB0aGlzLl92YWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEdldEFycmF5VmFsdWVzRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTogc3RyaW5ne1xyXG4gICAgbGV0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jdXN0b21WYWxpZGF0b3JWYWx1ZXMudmFsdWVzKCkpO1xyXG4gICAgbGV0IHZhbHVlc1N0ciA9IEpTT04uc3RyaW5naWZ5KHZhbHVlcyk7XHJcbiAgICByZXR1cm4gdmFsdWVzU3RyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRBcnJheVZhbHVlc0ZvckN1c3RvbVByb3BlcnRpZXMoKTogc3RyaW5ne1xyXG4gICAgbGV0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jdXN0b21Qcm9wZXJ0aWVzVmFsdWVzLnZhbHVlcygpKTtcclxuICAgIGxldCB2YWx1ZXNTdHIgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xyXG4gICAgcmV0dXJuIHZhbHVlc1N0cjtcclxufVxyXG5cclxuICBwcml2YXRlIFNldEZpcnN0VmFsdWVGb3JDdXN0b21Qcm9wZXJ0aWVzKCk6IHZvaWQge1xyXG5cclxuICAgIGZvciAobGV0IGN1c3RvbVByb3BlcnR5IG9mIHRoaXMuY3VzdG9tUHJvcGVydGllcy5rZXlzKCkpXHJcbiAgICAgIHRoaXMuY3VzdG9tUHJvcGVydGllc1ZhbHVlcy5zZXQoPHN0cmluZz5jdXN0b21Qcm9wZXJ0eSwgXCJcIik7XHJcblxyXG4gICAgLy8gY3JlYXRlIGZyb20gdGhlIHZhbHVlIHN0cmluZyBhbmQgc2F2ZSBpdCBpbiB2YWwgJiBvcmdWYWx1ZVxyXG4gICAgdGhpcy5fdmFsID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVByb3BlcnRpZXMoKVxyXG4gICAgdGhpcy5fb3JnVmFsdWUgPSB0aGlzLl92YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlc2V0IF9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFJlc2V0Q29tcHV0ZWRPbmNlRmxhZygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5pdFRhc2tEZWZpbml0aW9uSWQoeG1sQnVmZmVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyOiBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyID0gbmV3IFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIodGhpcy5TZXRUYXNrRGVmaW5pdGlvbklkKTtcclxuICAgIHRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIucGFyc2UoeG1sQnVmZmVyKTtcclxuICB9XHJcblxyXG4gIC8vIGNhbGxiYWNrIGZvciBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyXHJcbiAgU2V0VGFza0RlZmluaXRpb25JZCh0YXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrRGVmaW5pdGlvbklkID0gdGFza0RlZmluaXRpb25JZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGF0YVR5cGUoKTogdm9pZCB7XHJcbiAgICBsZXQgY29tcElkeDogbnVtYmVyID0gdGhpcy5fcGFyZW50T2JqLmdldENvbXBJZHgoKTtcclxuXHJcbiAgICB0aGlzLl9waWMgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9pZCA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUbyBmaWxsIGRhdGFUeXBlIG1lbWJlciBpbiBQcm9wZXJ0eS5GaWxsRGF0YVR5cGUgbXVzdCBpZCE9ezB9XCIsIEludDMyLk1pblZhbHVlKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVElUTEVfQkFSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVCUkVXOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWTpcclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NZU1RFTV9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VORF9DT05ESVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfREVMRVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEVfSU5fUVVFUlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVVNUX0lOUFVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fQ0FOQ0VMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFUEVBVEFCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElHSExJR0hUSU5HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBU1NXT1JEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19DQUNIRUQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJFTE9BRF9WSUVXOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9WRVJUSUNBTF9TQ1JPTEw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FX0FMTE9XX0NSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NPTF9SRVNJWkU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkVPUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0xJTkVTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NPUlRfQ09MVU1OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTF9BTExPV19GSUxURVJJTkc6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9TVEFUVVNfQkFSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fUkVGUkVTSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVJLX09OX0NMSUNLOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NIT1dfRlVMTF9ST1c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBQ0tfU0VMRUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NIT1dfQlVUVE9OUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MSU5FU19BVF9ST09UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0VNUFRZX0RBVEFWSUVXOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09MVU1OX0RJVklERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORV9ESVZJREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RIUkVFX1NUQVRFUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUZSRVNIX1dIRU5fSElEREVOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVRBSU5fRk9DVVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJJTlRfREFUQTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DTE9TRV9UQVNLU19CWV9NRElfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBVklFV0NPTlRST0w6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX09QRU5fVEFTS19XSU5ET1c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfSU5ERVhfT1BUSU1JWkFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfTE9DQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19QT1NJVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfU1FMX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JFRk9SRV85MDBfVkVSU0lPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GSUxMX1dJRFRIOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJX0NPTFVNTl9ESVNQTEFZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX1JPVVRFUl9PVVRMRVQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9PVVRMRVQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VSVkVSX1JFQURfQUhFQUQ6XHJcbiAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU47XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfQlVUVE9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VWQUxfRU5EX0NPTkRJVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBU0FDVElPTl9CRUdJTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfVFJBTlNBQ1RJT05fTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XQUxMUEFQRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVRUUklCVVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSSUdHRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19JRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX0NZQ0xFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBUkFNRVRFUlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfTElTVF9JTkRFWEVTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVfTEFZRVJTX0xJU1Q6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT0JKRUNUX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVBTF9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBVklFV0NPTlRST0xfRklFTERTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19SQU5HRV9PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfTE9DQVRFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19QT1NJVElPTl9VU0FHRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1BST1BFUlRJRVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlM6XHJcbiAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xVTU5fVElUTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9MSVNUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQURESVRJT05BTF9JTkZPUk1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9URVhUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJTlQ6XHJcbiAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1VPTTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IT1JfRkFDOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZFUl9GQUM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dBTExQQVBFUl9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTkRFWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MSU5LX0ZJRUxEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFVMTERPV05fTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX0ZJVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FWFBBTkRfV0lORE9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVfTElORVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ0hPSUNFX0NPTFVNTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1RZTEVfM0Q6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9OVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQVlFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSURUSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IRUlHSFQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVElUTEVfSEVJR0hUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTE9SOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xFRlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9QOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVA6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVMUF9TQ1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfSU5fVEFCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OX1JPV1M6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSE9SSVpPTlRBTF9BTElHTk1FTlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FX1dPUkRXUkFQX1NDUk9MTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ST1dfSEVJR0hUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19XSURUSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBTlNMQVRPUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRVNFVF9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XRURfRElSRUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JPV19ISUdITElHSFRfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVkVSVElDQUxfQUxJR05NRU5UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1RBVElDX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQlVUVE9OX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xPQURfSU1BR0VfRlJPTTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQk9UVE9NX1BPU0lUSU9OX0lOVEVSVkFMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSR1RTS19OVU06XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEVSU0lTVEVOVF9GT1JNX1NUQVRFX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0NST0xMX0JBUl9USFVNQjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CSU5ESU5HX0xFVkVMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0w6XHJcbiAgICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQICYmIHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFO1xyXG4gICAgICAgIC8vIHBpYyB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gZXhwIGxlbmd0aFxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM7XHJcbiAgICAgICAgICBpZiAoUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYyA9PSBudWxsKVxyXG4gICAgICAgICAgICBQcm9wZXJ0eS5fbnVtZXJpY1Byb3BlcnR5UGljID0gbmV3IFBJQyhcIk42XCIsIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgY29tcElkeCk7XHJcbiAgICAgICAgICB0aGlzLl9waWMgPSBQcm9wZXJ0eS5fbnVtZXJpY1Byb3BlcnR5UGljO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVRVUk5fQUNUSU9OOlxyXG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEE6XHJcbiAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLkRhdGFUeXBlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BPUF9VUDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUklFTlRBVElPTl9MT0NLOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOVEVSX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FWElUX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQVZJR0FUSU9OX0RSQVdFUl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FDVElPTl9CQVJfTUVOVTpcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9QSUNLRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9FRElUX0RJQUxPRzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0FMSUdOTUVOVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0tFWUJPQVJEX1JFVFVSTl9LRVk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU1VHR0VTVElPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9CSUxFX0lNQUdFX0xJU1RfRklMRV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NXSVBFX1JFRlJFU0g6XHJcbiAgICAgICAgLy8gTm8gaGFuZGxpbmcgaXMgbmVlZGVkIGhlcmUgYXMgdGhlIHByb3BlcnRpZXMgYXJlIHZhbGlkIGZvciBtb2JpbGUgYXMgZm9yIG5vdy5cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BlcnR5LnNldERhdGFUeXBlKCkgbm8gY2FzZSBmb3I6IHswfVwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhdHRyaWJ1dGVzIG9mIGEgdGhlIHBhcmVudCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldENvbnRyb2xBdHRyaWJ1dGVzKCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iaiA9PSBudWxsIHx8IHRoaXMuX3BhcmVudFR5cGUgIT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gUHJvcGVydHkuc2V0Q29udHJvbEF0dHJpYnV0ZXMoKSB0aGVyZSBpcyBubyBwYXJlbnQgb3IgdGhlIHBhcmVudCBpcyBub3QgYSBjb250cm9sXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBhcmVudENvbnRyb2wgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUU6XHJcbiAgICAgICAgcGFyZW50Q29udHJvbC5OYW1lID0gdGhpcy5fdmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgICAgcGFyZW50Q29udHJvbC5EYXRhVHlwZSA9IDxTdG9yYWdlQXR0cmlidXRlPnRoaXMuX3ZhbFswXTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuc2V0UGljU3RyKHRoaXMuX3ZhbCwgdGhpcy5fZXhwSWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQU5HRTpcclxuICAgICAgICBwYXJlbnRDb250cm9sLnNldFJhbmdlKHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEE6XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIHBhcmVudENvbnRyb2wuc2V0VmFsRXhwKHRoaXMuX2V4cElkKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl92YWwgIT0gbnVsbClcclxuICAgICAgICAgIHBhcmVudENvbnRyb2wuc2V0RmllbGQodGhpcy5fdmFsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQlVUVE9OX1NUWUxFOlxyXG4gICAgICAgIGlmICh0aGlzLl92YWwgIT0gbnVsbClcclxuICAgICAgICAgIHBhcmVudENvbnRyb2wuQnV0dG9uU3R5bGUgPSA8Q3RybEJ1dHRvblR5cGVHdWk+dGhpcy5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQVlFUjpcclxuICAgICAgICBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLkxheWVyID0gdGhpcy5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGlzIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQYXJlbnRPYmooKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRPYmo7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcGFyZW50IG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UGFyZW50VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFR5cGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaWQgb2YgdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFuZCB0YWtlIGNhcmUgb2YgdGhlIHByZXNlbnRhdGlvbiB0aGUgdmFsdWUgbXVzdCBiZSBpbiBhIG1hZ2ljIGludGVybmFsXHJcbiAgLy8vICAgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIG5ldyB2YWx1ZTwvcGFyYW0+XHJcbiAgc2V0VmFsdWUobWdWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBIHx8IHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OT0RFX0lEIHx8IHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OT0RFX1BBUkVOVElEKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUpXHJcbiAgICAgIHRoaXMuc2V0RGF0YVR5cGUoKTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2RhdGFUeXBlKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIGlmIChtZ1ZhbCA9PSBudWxsKVxyXG4gICAgICAgICAgbWdWYWwgPSBcIkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcclxuICAgICAgICB0aGlzLl92YWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AobWdWYWwsIFwiXCIsIHRoaXMuX3BpYywgZmFsc2UsIGNvbXBJZHgsIGZhbHNlKS50cmltKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICB0aGlzLl92YWwgPSBtZ1ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkuc2V0VmFsdWUoKSBpbGxlZ2FsIGRhdGEgdHlwZTogXCIgKyB0aGlzLl9kYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBhbiBpbnQgdmFsdWUgZGlyZWN0bHksIGFzIGlzIGRvbmUgd2hlbiBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIFNldFZhbHVlKHZhbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl92YWwgPSBTdHJpbmcodmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgdGFrZSBjYXJlIG9mIHRoZSBwcmVzZW50YXRpb24gdGhlIHZhbHVlIG11c3QgYmUgaW4gYSBtYWdpYyBpbnRlcm5hbCBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE9yZ1ZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JnVmFsdWUgPSB0aGlzLl92YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTZXRTdHVkaW9WYWx1ZUFzT3JnVmFsdWUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vcmdWYWx1ZSA9IHRoaXMuU3R1ZGlvVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybnMgdGhlIGZvcm0gcmVsYXRlZCB0byB0aGlzIHByb3BlcnR5LiBJZiB0aGUgcHJvcGVydHkncyBwYXJlbnQgaXMgdGhlIGZvcm0gdGhlbiByZXR1cm4gaXQsXHJcbiAgLy8vICAgb3RoZXJ3aXNlLCBpZiB0aGUgcHJvcGVydHkncyBwYXJlbnQgaXMgYSBjb250cm9sIHRoZW4gcmV0dXJuIHRoZSBmb3JtIHRvIHdoaWNoIHRoaXMgY29udHJvbCBiZWxvbmdzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBNZ0Zvcm08L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGb3JtKCk6IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIge1xyXG4gICAgbGV0IGZvcm06IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSlcclxuICAgICAgZm9ybSA9IDxHdWlGb3JtUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgIGZvcm0gPSAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmdldEZvcm0oKTtcclxuXHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHRhc2sgYnkgdGhlIHBhcmVudCBvYmplY3Q8L3JldHVybnM+XHJcbiAgR2V0VGFza0J5UGFyZW50T2JqZWN0KCk6IEd1aVRhc2tCYXNlIHtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKVxyXG4gICAgICB0YXNrID0gKDxHdWlGb3JtUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5nZXRUYXNrKCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgdGFzayA9ICg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLKVxyXG4gICAgICB0YXNrID0gPEd1aVRhc2tCYXNlPnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICByZXR1cm4gdGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBkaXNwbGF5IGZvciBjb250cm9sIHByb3BlcnRpZXMgYW5kIGZvcm0gcHJvcGVydGllcyBvbmx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlUmVmcmVzaFwiPmlmIHRydWUgdGhlbiByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkoZm9yY2VSZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5V2l0aEN1cnJlbnRMaW5lKGZvcmNlUmVmcmVzaCwgSW50MzIuTWluVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIGJlIHNraXAgZnJvbSB0aGUgcmVmcmVzaCBwcm9wZXJ0aWVzLiBmb3IgYSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2hDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtZ0NvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVCUkVXOlxyXG4gICAgICAgIGlmIChtZ0NvbnRyb2wuaXNUYWJsZUNvbnRyb2woKSlcclxuICAgICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05PREVfSUQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTk9ERV9QQVJFTlRJRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJR0hMSUdIVElORzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVVNUX0lOUFVUOlxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IRUxQX1NDUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfUFJPR1JBTTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV0VEX0RJUkVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVRVUk5fQUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FUVFJJQlVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVBFQVRBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJJR0dFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBWUVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fRklUOlxyXG4gICAgICAvLyBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9WRVJUSUNBTF9TQ1JPTEw6XHJcbiAgICAgIC8vIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FX1dPUkRXUkFQX1NDUk9MTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRVNFVF9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19XSURUSDpcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0g6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSQU1FVEVSUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVRBSU5fRk9DVVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFQUxfT0JKRUNUX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQURESVRJT05BTF9JTkZPUk1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBVklFV0NPTlRST0w6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MX0ZJRUxEUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkdUU0tfTlVNOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lOREVYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElOS19GSUVMRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CRUZPUkVfOTAwX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRVJWRVJfUkVBRF9BSEVBRDpcclxuICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQlVUVE9OX1NUWUxFOlxyXG4gICAgICAgIGlmICghKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5pc1JhZGlvKCkpXHJcbiAgICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNraXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIFRSVUUgaWYgdGhlIHByb3BlcnR5IG5lZWQgdG8gYmUgc2tpcCBmcm9tIHRoZSByZWZyZXNoIHByb3BlcnRpZXMuIGZvciBhIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRTa2lwUmVmcmVzaEZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pO1xyXG5cclxuICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWdGb3JtQmFzZTogR3VpRm9ybVByb3BlcnR5QWRhcHRlciA9IDxHdWlGb3JtUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgIC8vIENvbXB1dGUgcHJvcGVydGllczogYWxsIHRob3NlIHByb3BlcnRpZXMgd2lsbCBiZSByZWZyZXNoIG9ubHkgb25lIHRpbWVcclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfVFlQRTpcclxuICAgICAgICBpZiAoIXRoaXMuX3BhcmVudE9iai5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MSU5FU19JTl9UQUJMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IRUxQX1NDUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BFUlNJU1RFTlRfRk9STV9TVEFURV9WRVJTSU9OOlxyXG4gICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICAvLyByZWZyZXNoIG9ubHkgdGhlIHJlbGV2YW50IHN1YmZvcm0gcHJvcGVydGllcyAoY29sb3IsIGZvbnQsIGV0Yy4pXHJcbiAgICBpZiAoIXNraXAgJiYgbWdGb3JtQmFzZS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICAgIC8vY2FzZSBBdXRvRml0LkFzQ2FsbGVkRm9ybTpcclxuICAgICAgICAvLyBuZWVkIHRvIHNldCB0aGUgYm91bmRzIGFzIHRoZSBjYWxsZWQgZm9ybSBvbmx5IGZvciB0aGUgd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIC8vICBza2lwID0gZmFsc2U7XHJcbiAgICAgICAgLy8gIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEVGVCB8fCB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9QKVxyXG4gICAgICAgIC8vICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIC8vICBicmVhaztcclxuICAgICAgICAvL31cclxuICAgICAgICAvLyBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0JVVFRPTjpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlM6XHJcbiAgICAgICAgICBza2lwID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBza2lwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIGJlIHNraXAgZnJvbSB0aGUgcmVmcmVzaCBwcm9wZXJ0aWVzLiBmb3IgYSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2hUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUVVFUlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0lOREVYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfQ1lDTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9DQU5DRUw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FVkFMX0VORF9DT05ESVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQVNBQ1RJT05fQkVHSU46XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1RSQU5TQUNUSU9OX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJJTlRfREFUQTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DTE9TRV9UQVNLU19CWV9NRElfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfT1BFTl9UQVNLX1dJTkRPVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19DSFVOS19TSVpFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19JTkRFWF9PUFRJTUlaQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19SQU5HRV9PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfTE9DQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19MT0NBVEVfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1BPU0lUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19QT1NJVElPTl9VU0FHRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfU1FMX1JBTkdFOlxyXG4gICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2tpcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGlnbm9yZWQgYnkgUmVmcmVzaERpc3BsYXkoKSBza2lwIHByb3BlcnRpZXMgd2hpY2ggaGFzIG5vdGhpbmcgdG8gZG8gd2l0aFxyXG4gIC8vLyAgIHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBpZ25vcmVkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2goKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc3dpdGNoICh0aGlzLl9wYXJlbnRUeXBlKSB7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0w6XHJcbiAgICAgICAgc2tpcCA9IHRoaXMuU2hvdWxkU2tpcFJlZnJlc2hDb250cm9sKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk06XHJcbiAgICAgICAgc2tpcCA9IHRoaXMuU2hvdWxkU2tpcFJlZnJlc2hGb3JtKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0s6XHJcbiAgICAgICAgc2tpcCA9IHRoaXMuU2hvdWxkU2tpcFJlZnJlc2hUYXNrKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BPUF9VUDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUklFTlRBVElPTl9MT0NLOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOVEVSX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FWElUX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQVZJR0FUSU9OX0RSQVdFUl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FDVElPTl9CQVJfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUEVOX1BJQ0tFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUEVOX0VESVRfRElBTE9HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfQUxJR05NRU5UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0tFWUJPQVJEX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfS0VZQk9BUkRfUkVUVVJOX0tFWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TVUdHRVNUSU9OUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0JJTEVfSU1BR0VfTElTVF9GSUxFX05BTUU6XHJcbiAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2tpcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBkaXNwbGF5IGZvciBjb250cm9sIHByb3BlcnRpZXMgYW5kIGZvcm0gcHJvcGVydGllcyBvbmx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlUmVmcmVzaFwiPmlmIHRydWUgdGhlbiByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyTGluZVwiPmxpbmUgbnVtYmVyIGluIHRhYmxlIHdoZW4gcmVmcmVzaGluZyBhIGNvbHVtbiBpZiB0aGUgY3VycmVudCBsaW5lIGlzIHJlZnJlc2hlZCBzZXQgdG9cclxuICAvLy8gICAoSW50ZWdlci5NSU5fVkFMVUUpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBSZWZyZXNoRGlzcGxheVdpdGhDdXJyZW50TGluZShmb3JjZVJlZnJlc2g6IGJvb2xlYW4sIGN1cnJMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlXaXRoQ3VyckxpbmVBbmRDaGVja1NraXBSZWZyZXNoKGZvcmNlUmVmcmVzaCwgY3VyckxpbmUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhpcyBtZXRob2QgY2hlY2tzIGlmIHdlIG11c3QgcmVmcmVzaCB0aGUgcHJvcGVydHkgZXZlbiBpZiBpdCBoYXMgZXhwcmVzc2lvblxyXG4gIC8vIEZvciBub3cgaXQgcmV0dXJucyB0cnVlIGZvciBwcm9wZXJ0aWVzIHdpdGggdGV4dCBmb3IgbXVsdGlsaW5ndWFsIHN1cHBvcnRcclxuXHJcbiAgLy8gdG9kbyBOZWVkIHRvIGFkZCBoZXJlIGNoZWNrIGlmIHVzZXIgd2FudHMgbXVsdGlsaW5ndWFsIHN1cHBvcnQgYXQgYWxsXHJcbiAgU2tpcFdoZW5Ob0V4cHJlc3Npb24oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2tpcFdoZW5Ob0V4cHJlc3Npb24gPSB0cnVlO1xyXG5cclxuICAgIGxldCBjdHJsID0gKCh0aGlzLl9wYXJlbnRPYmogaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKSA/IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudE9iaiA6IG51bGwpO1xyXG4gICAgaWYgKChjdHJsICE9IG51bGwgJiYgY3RybC5pc0J1dHRvbigpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0NvbWJvQm94KCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNMaXN0Qm94KCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNSYWRpbygpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzQ2hlY2tCb3goKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc1RhYkNvbnRyb2woKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLklzSW1hZ2VCdXR0b24oKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0NvbHVtbkNvbnRyb2woKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09MVU1OX1RJVExFKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfTElTVCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9URVhUKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVApIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElOVCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUykgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQpfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CSU5ESU5HX0xFVkVMKSlcclxuICAgICAgc2tpcFdoZW5Ob0V4cHJlc3Npb24gPSBmYWxzZTtcclxuICAgIHJldHVybiBza2lwV2hlbk5vRXhwcmVzc2lvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVldmFsdWF0ZSB0aGUgcHJvcGVydHkgdmFsdWUgKGlmIGl0IGhhcyBhbiBleHByZXNzaW9uKSBhbmRcclxuICAvLy8gcmVmcmVzaCB0aGUgZGlzcGxheSBmb3IgY29udHJvbCBwcm9wZXJ0aWVzIGFuZCBmb3JtIHByb3BlcnRpZXMgb25seVxyXG4gIC8vL1xyXG4gIC8vLyBUaGlzIG1ldGhvZCB3YXMgKGFzIGl0cyBuYW1lIGltcGxpZXMpIHJlbGV2YW50IG9ubHkgZm9yIEdVSSBwcm9wZXJ0aWVzLCBpLmUuIHByb3BlcnRpZXMgdGhhdCBhZmZlY3Qgb24gdGhlIGRpc3BsYXkuXHJcbiAgLy8vIE5vbi1HVUkgcHJvcGVydGllcyAoc3VjaCBhcyBQUk9QX1RZUEVfVEFCX0lOKSB3ZXJlIHNraXBwZWQgYW5kIG5vdCByZWV2YWx1YXRlZC5cclxuICAvLy8gVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gR1VJIHByb3BlcnRpZXMgYW5kIG5vbi1HVUkgcHJvcGVydGllcyBpcyBkb25lIGJ5IHRoZSBtZXRob2Qg77+9U2hvdWxkU2tpcFJlZnJlc2jvv71FXHJcbiAgLy8vIE5vdyB3ZSBoYXZlIG5vbi1HVUkgcHJvcGVydGllcyB0aGF0IGFyZSByZWV2YWx1YXRlZCBpbiB0aGlzIGZ1bmN0aW9uOlxyXG4gIC8vLyBQUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZLCBQUk9QX1RZUEVfQ09OVEVYVF9NRU5VLCBQUk9QX1RZUEVfVEFCX0lOLCBQUk9QX1RZUEVfUEFSS19PTl9DTElDSy5cclxuICAvLy8gRm9yIHRoZXNlIHByb3BlcnRpZXMgd2UgZG8gbm90IGV4ZWN1dGUgZXhwbGljaXRseSB0aGVpciBleHByZXNzaW9ucyAoaXQgd2FzIGRvbmUgaW4gMS45IGJ5IENoZWNrUHJvcCBmdW5jdGlvbiksXHJcbiAgLy8vIHdlIG9ubHkgdXNlIHRoZWlyIHZhbHVlcyBieSBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eSBmdW5jdGlvbi4gSXQgaXMgZG9uZSBmb3IgZG8gbm90IGV4ZWN1dGUgdGhlIHByb3BlcnR5IGV4cHJlc3Npb25cclxuICAvLy8gaW4gR1VJIHRocmVhZC4gSW4gR1VJIHRocmVhZCB3ZSBvbmx5IHVzZSB0aGUgcHJvcGVydHkgdmFsdWUuIFNvIGl0IGlzIG5lZWRlZCB0byByZWV2YWx1YXRlIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VSZWZyZXNoXCI+aWYgdHJ1ZSB0aGVuIHJlZnJlc2ggaXMgZm9yY2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXZpb3VzIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJMaW5lXCI+bGluZSBudW1iZXIgaW4gdGFibGUgd2hlbiByZWZyZXNoaW5nIGEgY29sdW1uIGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgcmVmcmVzaGVkIHNldCB0b1xyXG4gIC8vLyAgIChJbnRlZ2VyLk1JTl9WQUxVRSlcclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheVdpdGhDdXJyTGluZUFuZENoZWNrU2tpcFJlZnJlc2goZm9yY2VSZWZyZXNoOiBib29sZWFuLCBjdXJyTGluZTogbnVtYmVyLCBjaGVja1NraXBSZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IG51bGw7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gMDtcclxuICAgIGxldCBwcmV2VmFsdWU6IHN0cmluZztcclxuICAgIGxldCB2YWxDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsID09PSBudWxsICYmIHRoaXMuX2V4cElkID09PSAwKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKSBudWxsIHZhbHVlIGFuZCBleHByZXNzaW9uXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoZWNrU2tpcFJlZnJlc2ggJiYgdGhpcy5TaG91bGRTa2lwUmVmcmVzaCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuX2V4cElkID09PSAwICYmIHRoaXMuU2tpcFdoZW5Ob0V4cHJlc3Npb24oKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aCA9PT0gMClcclxuICAgICAgdGhpcy5zZXRQcmV2QXJyYXlTaXplKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5Db21wdXRlVmFsdWUoKTtcclxuXHJcbiAgICAvLyBiZWZvcmUgdXBkYXRlIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIHByZXBhcmUgZGF0YVxyXG4gICAgc3dpdGNoICh0aGlzLl9wYXJlbnRUeXBlKSB7XHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0w6XHJcbiAgICAgICAgY3RybCA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICAgIC8vIHJlY29tcHV0ZSB0aGUgUElDIGZvciBmb3JtYXQgcHJvcGVydGllc1xyXG4gICAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUICYmIHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIGN0cmwuY29tcHV0ZVBJQyh0aGlzLl92YWwpO1xyXG5cclxuICAgICAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUgJiYgIWN0cmwuZ2V0Rm9ybSgpLmlzUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKCkpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChjdXJyTGluZSA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgICBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGluZSA9IGN1cnJMaW5lO1xyXG5cclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkIHRvIHByZXZlbnQgc2VuZGluZyByZWR1bmRhbnRcclxuICAgICAgICAvLyBqYXZhc2NyaXB0IGNvbW1hbmRzIHRvIHRoZSBicm93c2VyXHJcbiAgICAgICAgcHJldlZhbHVlID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbShsaW5lKTtcclxuXHJcblxyXG4gICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICh0aGlzLl92YWwgPT09IHByZXZWYWx1ZSlcclxuICAgICAgICAgICYmIHRoaXMuX2lkICE9PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRklBQkxFXHJcbiAgICAgICAgICAmJiB0aGlzLl9pZCAhPT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRVxyXG4gICAgICAgICAgJiYgdGhpcy5faWQgIT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIHRvIHByZXZlbnQgcmVjdXJzaW9uIHdoaWxlIHVwZGF0aW5nIGNvbHVtbiB2aXNpYmlsaXR5XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OXHJcbiAgICAgICAgICAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRVxyXG4gICAgICAgICAgJiYgdGhpcy5fdmFsID09PSBwcmV2VmFsdWUpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl92YWwgPT09IHByZXZWYWx1ZSlcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShsaW5lLCB0aGlzLl92YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STTpcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkIHRvIHByZXZlbnQgc2VuZGluZyByZWR1bmRhbnRcclxuICAgICAgICAvLyBqYXZhc2NyaXB0IGNvbW1hbmRzIHRvIHRoZSBicm93c2VyXHJcbiAgICAgICAgcHJldlZhbHVlID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbSgwKTtcclxuICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiAodGhpcy5fdmFsID09PSBwcmV2VmFsdWUpKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0oMCwgdGhpcy5fdmFsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0s6IC8vIFRBU0sgUFJPUEVSVElFU1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFxyXG4gICAgICAgICAgTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpOiB0YXNrIHByb3BlcnR5IHswfSB3YXNuJ3QgaGFuZGxlZFwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXHJcbiAgICAgICAgICBOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCk6IHBhcmVudFR5cGUgdW5rbm93biwgcHJvcGVydHkgezB9IHdhc24ndCBoYW5kbGVkXCIsIHRoaXMuX2lkKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUU6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbkltYWdlRmlsZU5hbWUoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRDpcclxuICAgICAgICB0aGlzLm9uRW5hYmxlKHZhbENoYW5nZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25WaXNpYmxlKHZhbENoYW5nZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRTpcclxuICAgICAgICB0aGlzLk9uQ29udHJvbE5hbWUoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STV9OQU1FOlxyXG4gICAgICAgIHRoaXMub25Gb3JtTmFtZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xVTU5fVElUTEU6XHJcbiAgICAgICAgdGhpcy5vblRleHQoMCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RFWFQ6XHJcbiAgICAgICAgdGhpcy5vblRleHQobGluZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJTlQ6XHJcbiAgICAgICAgdGhpcy5vbkhpbnQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZJQUJMRTpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uTW9kaWZpYWJsZSh2YWxDaGFuZ2VkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUDpcclxuICAgICAgICB0aGlzLm9uVG9vbHRpcCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1Q6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbkRpc3BsYXlMaXN0KGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFX0xBWUVSU19MSVNUOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25WaXNpYmxlTGF5ZXJMaXN0KGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQ6XHJcbiAgICAgICAgdGhpcy5vbkZvcm1hdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTDpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uTGFiZWwobGluZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0JVVFRPTjpcclxuICAgICAgICB0aGlzLm9uRGVmYXVsdEJ1dHRvbigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRDpcclxuICAgICAgICB0aGlzLm9uUGFzc3dvcmQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfSU46XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSS19PTl9DTElDSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MT0FEX0lNQUdFX0ZST006IC8vIHRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgaWRlbnRpZnlpbmcgbG9hZGluZyBvZiBpbWFnZSAoU2VydmVyL0NsaWVudCkuXHJcbiAgICAgICAgLy8gU28gbm8gaGFuZGxpbmcgbmVlZGVkIGluIFJlZnJlc2hEaXNwbGF5XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgICB0aGlzLm9uQ3VzdG9tUHJvcGVydGllcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTOlxyXG4gICAgICAgIHRoaXMub25DdXN0b21WYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JJTkRJTkdfTEVWRUw6XHJcbiAgICAgICAgdGhpcy5vbkJpbmRpbmdMZXZlbCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcclxuICAgICAgICAgIE5TdHJpbmcuRm9ybWF0KFwiUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKTogUHJvcGVydHkgezB9IHdhc24ndCBoYW5kbGVkXCIsIHRoaXMuX2lkKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBuZWVkIHRvIGNhbGN1bGF0ZSBvbmNlIG9ubHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRCZUNvbXB1dGVkT25jZSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSykge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREU6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX0NZQ0xFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX09QRU5fVEFTS19XSU5ET1c6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJJTlRfREFUQTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JBTkdFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVDpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWDpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01BSU5fRElTUExBWTpcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRCB8fCB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaWYgdGhlIHZhbHVlIGlzIGNvbXB1dGVkIGluIHRoZSBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBJc0NvbXB1dGVkT25jZU9uU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuU2hvdWxkQmVDb21wdXRlZE9uY2UoKSkge1xyXG4gICAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpO1xyXG4gICAgICBpZiAodGFzayAhPSBudWxsKVxyXG4gICAgICAgIHJldHVybiAhdGFzay5TaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseSh0aGlzLl9pZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgZG9lcyBub3QgYWZmZWN0IHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIENvbXB1dGVWYWx1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgbGVuOiBudW1iZXIgPSAyNTU7XHJcbiAgICBsZXQgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUykge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGVDdXN0b21Qcm9wZXJ0aWVzVmFsdWVzKCk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWUocmVzdWx0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ3VzdG9tVmFsaWRhdG9ycygpO1xyXG4gICAgICByZXN1bHQgPSB0aGlzLkdldEFycmF5VmFsdWVzRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5fZXhwSWQgPiAwKSB7XHJcbiAgICAgIC8vIGZvciBvZmZsaW5lIDogY29tcHV0ZSBvbmNlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2FzIGNvbXB1dGUgb24gdGhlIHNlcnZlclxyXG4gICAgICBpZiAodGhpcy5TaG91bGRCZUNvbXB1dGVkT25jZSgpICYmIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5fZXhwQWxyZWFkeUNvbXB1dGVkT25jZSA9IHRydWU7XHJcblxyXG4gICAgICAvLyBmb3IgZm9sbG93aW5nIGNvbnRyb2wgcHJvcGVydGllcyBhbHdheXMgZXZhbHVhdGUgZXhwcmVzc2lvbnNcclxuICAgICAgbGV0IGFsd2F5c0V2YWx1YXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLKVxyXG4gICAgICAgIGFsd2F5c0V2YWx1YXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUKSB7XHJcbiAgICAgICAgbGVuID0gNjU1MzU7XHJcbiAgICAgICAgcmVzdWx0ID0gU3RyVXRpbC5ydHJpbShhd2FpdCB0aGlzLl9wYXJlbnRPYmouRXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX2V4cElkLCB0aGlzLl9kYXRhVHlwZSwgbGVuLCB0cnVlLFxyXG4gICAgICAgICAgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQLCBhbHdheXNFdmFsdWF0ZSwgd2FzRXZhbHVhdGVkKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3BhcmVudE9iai5FdmFsdWF0ZUV4cHJlc3Npb24odGhpcy5fZXhwSWQsIHRoaXMuX2RhdGFUeXBlLCBsZW4sIHRydWUsIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgYWx3YXlzRXZhbHVhdGUsIHdhc0V2YWx1YXRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBsZXQgd2FybmluZ01zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiRXhjZXB0aW9uOiBcIiArIGUuTWVzc2FnZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGFyZW50T2JqIGluc3RhbmNlb2YgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcilcclxuICAgICAgICAgICAgd2FybmluZ01zZy5BcHBlbmQoXCIgQ29udHJvbDogXCIgKyAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5fcGFyZW50T2JqKS5OYW1lKTtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZVdhcm5pbmdUb0xvZyh3YXJuaW5nTXNnLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh3YXNFdmFsdWF0ZWQudmFsdWUpIHtcclxuICAgICAgICByZXN1bHQgPSB0aGlzLnVwZGF0ZVJlc3VsdChyZXN1bHQpO1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLl92YWwgPT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUeXBlICE9PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICAgIHJlc3VsdCA9IFByb3BEZWZhdWx0cy5nZXREZWZhdWx0VmFsdWUodGhpcy5faWQsIHRoaXMuX3BhcmVudFR5cGUsIHRoaXMuX3BhcmVudE9iaik7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlcyByZXN1bHRzIG9mIGV4cHJlc3Npb24gZm9yIHNvbWUgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXN1bHRcIj4gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IDwvcmV0dXJucz5cclxuICBwcml2YXRlIHVwZGF0ZVJlc3VsdChyZXN1bHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbClcclxuICAgICAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgICByZXN1bHQgPSBQcm9wZXJ0eS51cGRhdGVUYXNrTW9kZVJlc3VsdChyZXN1bHQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRvIHRoZSBzYW1lIGFzIHdlIGRvaW5nIGZvciBjKysgVWNoYXIgUlQ6OnRza19tb2RlX2V4cCAobG9uZyBleHAsIFVjaGFyIG1vZGUpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlVGFza01vZGVSZXN1bHQocmVzdWx0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvZGU6IHN0cmluZyA9ICcgJztcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHJlc3VsdCkpIHtcclxuICAgICAgY29kZSA9IHJlc3VsdFswXS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcclxuICAgICAgICBjYXNlICdRJzpcclxuICAgICAgICAgIGNvZGUgPSAnRSc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdGJzpcclxuICAgICAgICAgIGNvZGUgPSAnTyc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdPJzpcclxuICAgICAgICAgIGNvZGUgPSAnTic7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2RlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZ2V0VmFsdWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGF3YWl0IHRoaXMuQ29tcHV0ZVZhbHVlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbnQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eTwvcmV0dXJucz5cclxuICBhc3luYyBnZXRWYWx1ZUludCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBhd2FpdCB0aGlzLkNvbXB1dGVWYWx1ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLl92YWwgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IE5OdW1iZXIuUGFyc2UodGhpcy5fdmFsKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2l0aG91dCBleGVjdXRlIGl0cyBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGludCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5PC9yZXR1cm5zPlxyXG4gIEdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTk51bWJlci5QYXJzZSh0aGlzLl92YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSBib29sZWFuIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB2YWxpZCBvbmx5IGZvciBsb2dpY2FsIHR5cGUgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZ2V0VmFsdWVCb29sZWFuKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRWYWx1ZSgpO1xyXG4gICAgICByZXR1cm4gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odGhpcy5fdmFsKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LmdldFZhbHVlQm9vbGVhbigpIHdhcyBjYWxsZWQgZm9yIG5vbiBib29sZWFuIHR5cGUgcHJvcGVydHk6IHswfVwiLCB0aGlzLl9pZCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbXB1dGVkIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDb21wdXRlZFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGNvbXB1dGVkIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGhvdXQgZXhlY3V0ZSBpdHMgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTikge1xyXG4gICAgICByZXR1cm4gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odGhpcy5fdmFsKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LmdldFZhbHVlQm9vbGVhbigpIHdhcyBjYWxsZWQgZm9yIG5vbiBib29sZWFuIHR5cGUgcHJvcGVydHk6IHswfVwiLCB0aGlzLl9pZCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgbGluZSBvZiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSByZXF1ZXN0ZWQgbGluZSBudW1iZXI8L3BhcmFtPlxyXG4gIGdldFByZXZWYWx1ZShsaW5lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGxpbmUgPCB0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aClcclxuICAgICAgcmV0dXJuIHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSBoYXMgYW4gZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4cElkID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0RXhwcmVzc2lvbklkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXhwSWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvbkltYWdlRmlsZU5hbWUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IG1nQ29udHJvbEJhc2U6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgaWYgKG1nQ29udHJvbEJhc2UuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICBtZ0NvbnRyb2xCYXNlLnNldEltYWdlTGlzdChhd2FpdCB0aGlzLmdldFZhbHVlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG1nQ29udHJvbEJhc2UuaXNJbWFnZUNvbnRyb2woKSB8fCBtZ0NvbnRyb2xCYXNlLmlzUmFkaW8oKSB8fCBtZ0NvbnRyb2xCYXNlLmlzQ2hlY2tCb3goKSB8fCBtZ0NvbnRyb2xCYXNlLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICAgIGF3YWl0IG1nQ29udHJvbEJhc2Uuc2V0SW1hZ2VXaXRoRmlsZU5hbWUoYXdhaXQgdGhpcy5nZXRWYWx1ZSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBvbkltYWdlRmlsZU5hbWUub25FbmFibGUoKVwiKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkVuYWJsZSh2YWxDaGFuZ2VkOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGN1cnJlbnRFZGl0aW5nQ29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2w7XHJcblxyXG4gICAgICAvLyBBQ1RfVEJMX05YVEZMRCBpcyBhZGRlZCBpbiBxdWV1ZSwgd2hlbmV2ZXIgY3VycmVudCBjb250cm9sIGlzIGhpZGRlbiBvciBkaXNhYmxlZCB0byBzZXQgdGhlIGZvY3VzIHRvIG5leHQgY29udHJvbCBmb3IgYm90aCBSQyAmIE9MXHJcbiAgICAgIC8vIHdoaWNoIGlzIGNvcnJlY3QgYmVoYXZpb3IuIEJ1dCBvbmNlIGN1cnJlbnQgY3RybCBpcyBhbHJlYWR5IGRpc2FibGVkL2hpZGRlbiAsIHdlIHNob3VsZCBub3QgcHV0IHRoZSBzYW1lIGFjdGlvblxyXG4gICAgICAvLyBpbiBxdWV1ZSBhZ2FpbiB3aGVuIHNhbWUgY3RybCBpcyBkaXNhYmxlZC9oaWRkZW4gbXVsdGlwbGUgdGltZXMuXHJcbiAgICAgIGlmICh0aGlzLl92YWwgIT09IG51bGwgJiYgdGhpcy5fdmFsID09PSBcIjBcIiAmJiB2YWxDaGFuZ2VkICYmIGN1cnJlbnRFZGl0aW5nQ29udHJvbCAhPT0gbnVsbCAmJlxyXG4gICAgICAgIChjdHJsID09PSBjdXJyZW50RWRpdGluZ0NvbnRyb2wgfHwgY3VycmVudEVkaXRpbmdDb250cm9sLmlzRGVzY2VuZGVudE9mQ29udHJvbChjdHJsKSB8fCBjdHJsID09PSBjdXJyZW50RWRpdGluZ0NvbnRyb2wuZ2V0TGlua2VkUGFyZW50KGZhbHNlKSkpIHtcclxuICAgICAgICBsZXQgcGFya2VkQ29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgIGlmIChwYXJrZWRDb250cm9sICE9PSBudWxsICYmIHBhcmtlZENvbnRyb2wuSW5Db250cm9sICYmIChjdHJsID09PSBwYXJrZWRDb250cm9sIHx8IHBhcmtlZENvbnRyb2wuaXNEZXNjZW5kZW50T2ZDb250cm9sKGN0cmwpKSkge1xyXG4gICAgICAgICAgRXZlbnRzLk9uTm9uUGFya2FibGVMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgICAgICAgIGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjdHJsLlNldEVuYWJsZWQodGhpcy5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25FbmFibGUoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb25WaXNpYmxlKHZhbENoYW5nZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBsZXQgY3VycmVudEVkaXRpbmdDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbDtcclxuICAgICAgaWYgKHRoaXMuX3ZhbCAhPT0gbnVsbCAmJiB0aGlzLl92YWwgPT09IFwiMFwiICYmIHZhbENoYW5nZWQgJiYgY3VycmVudEVkaXRpbmdDb250cm9sICE9PSBudWxsICYmXHJcbiAgICAgICAgKGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbCB8fCBjdXJyZW50RWRpdGluZ0NvbnRyb2wuaXNEZXNjZW5kZW50T2ZDb250cm9sKGN0cmwpIHx8IGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbC5nZXRMaW5rZWRQYXJlbnQoZmFsc2UpKSkge1xyXG4gICAgICAgIGxldCBwYXJrZWRDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKHBhcmtlZENvbnRyb2wgIT09IG51bGwgJiYgcGFya2VkQ29udHJvbC5JbkNvbnRyb2wgJiYgKGN0cmwgPT09IHBhcmtlZENvbnRyb2wgfHwgcGFya2VkQ29udHJvbC5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY3RybCkpKSB7XHJcbiAgICAgICAgICBFdmVudHMuT25Ob25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IGN0cmwudXBkYXRlUHJvcGVydHlMb2dpY05lc3RpbmcoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSwgdGhpcy5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpLCB0cnVlKTtcclxuXHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBPbkNvbnRyb2xOYW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5PbkNvbnRyb2xOYW1lKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBoaW50IGZvciBlZGl0IGNvbnRyb2wgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25IaW50KCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpO1xyXG4gICAgICBsZXQgdHJhbnNsYXRlZFN0cmluZzogc3RyaW5nID0gRXZlbnRzLlRyYW5zbGF0ZSh0aGlzLkdldENvbXB1dGVkVmFsdWUoKSk7XHJcblxyXG4gICAgICBpZiAoIWNvbnRyb2wuSXNEYXRlVGltZVBpY3R1cmUoKSAmJiAoIWNvbnRyb2wuSXNUYWJsZUNoaWxkIHx8IGNvbnRyb2wuSXNUYWJsZUhlYWRlckNoaWxkKSkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuUGxhY2VIb2xkZXIsIHRyYW5zbGF0ZWRTdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluUHJvcGVydHkub25IaW50KClcIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkZvcm1OYW1lKCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKVxyXG4gICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dCgwKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25Gb3JtTmFtZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGRDb21tYW5kVHlwZVRleHQobGluZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgbWxzVHJhbnNWYWx1ZTogc3RyaW5nID0gRXZlbnRzLlRyYW5zbGF0ZSh0aGlzLkdldENvbXB1dGVkVmFsdWUoKSk7XHJcblxyXG4gICAgLy8gRml4ZWQgYnVnIzo3MzM0ODAgU3lzdGVtQm94ID0gZmFsc2UgYW5kIHRpdGxlIGlzIGVtcHR5LT4gLk5FVCBoaWRlIHRoZSB0aXRsZS5cclxuICAgIC8vIHdlIHdpbGwgc2V0IGl0IHRvICcgJ1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNIHx8XHJcbiAgICAgICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCAmJiAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmlzQ29sdW1uQ29udHJvbCgpKSkge1xyXG4gICAgICAvLyAjNzM3NDg4OiBXaGVuIHZhcmlhYmxlIGF0dGFjaGVkIHRvIGZvcm0ncyB0ZXh0IHByb3BlcnR5LCBzcGFjZXMgYXJlIGFwcGVuZGVkXHJcbiAgICAgIC8vIGFmdGVyIGFjdHVhbCB2YWx1ZSwgZXF1YWwgdG8gcGljdHVyZSBvZiB2YXJpYWJsZS4gQmVmb3JlIHNldHRpbmcgdGV4dCByZW1vdmUgdGhlc2UgZXh0cmFcclxuICAgICAgLy8gc3BhY2VzIGF0IHRoZSBlbmQuXHJcbiAgICAgIG1sc1RyYW5zVmFsdWUgPSBTdHJVdGlsLnJ0cmltKG1sc1RyYW5zVmFsdWUpO1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0gJiYgbWxzVHJhbnNWYWx1ZSA9PT0gTlN0cmluZy5FbXB0eSkge1xyXG4gICAgICAgIG1sc1RyYW5zVmFsdWUgPSBcIiBcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MICYmICgoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmlzVGV4dENvbnRyb2woKVxyXG4gICAgICAgIHx8ICgoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmlzQnV0dG9uKCkpKSkgLy8gbmVlZCB0byBjaGVjayBmb3IgaHlwZXJ0ZXh0IG9yIG90aGVyIHR5cGVzIG9mIGJ1dHRvblxyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcy5fcGFyZW50T2JqLCBsaW5lLCBtbHNUcmFuc1ZhbHVlKTtcclxuICAgIGVsc2VcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLl9wYXJlbnRPYmosIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLlRleHQsIG1sc1RyYW5zVmFsdWUpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uVGV4dChsaW5lOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYWRkQ29tbWFuZFR5cGVUZXh0KGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvbk1vZGlmaWFibGUodmFsQ2hhbmdlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgICBpZiAoY3RybC5pc1RleHRDb250cm9sKCkpIHtcclxuICAgICAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpO1xyXG5cclxuICAgICAgICBsZXQgcmVhZE9ubHlWYWx1ZTogYm9vbGVhbiA9ICF0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcblxyXG4gICAgICAgIGlmICgocmVhZE9ubHlWYWx1ZSB8fCB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkgJiYgY3RybC5HZXRDdXJyUmVhZE9ubHkoKSAhPT0gcmVhZE9ubHlWYWx1ZSkge1xyXG4gICAgICAgICAgY3RybC5TZXRDdXJyUmVhZE9ubHkocmVhZE9ubHlWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gSlBOOiBJTUUgc3VwcG9ydCAoZW5hYmxlIElNRSBpbiBxdWVyeSBtb2RlKVxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgaWYgKGF3YWl0IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlJlYWRPbmx5LCByZWFkT25seVZhbHVlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uTW9kaWZpYWJsZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblRvb2x0aXAoKTogdm9pZCB7XHJcbiAgICBsZXQgdG9vbFRpcDogc3RyaW5nO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgICAgLy8gVG9vbHRpcCBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nXHJcbiAgICAgIGlmICh0aGlzLl9leHBJZCA9PT0gMClcclxuICAgICAgICB0b29sVGlwID0gKDxUb29sVGlwSGVscD5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0SGVscEl0ZW0oTk51bWJlci5QYXJzZSh0aGlzLl92YWwpKSkudG9vbHRpcEhlbHBUZXh0O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdG9vbFRpcCA9IHRoaXMuX3ZhbDtcclxuXHJcbiAgICAgIC8vICM5Mjk4ODk6IFJlbW92ZSBleHRyYSB3aGl0ZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0b29sdGlwIHRleHQuXHJcbiAgICAgIHRvb2xUaXAgPSBTdHJVdGlsLnJ0cmltKHRvb2xUaXApO1xyXG4gICAgICBpZihjdHJsLmlzQnV0dG9uKCkgJiYgIGN0cmwuQ29ubmVjdGVkQ29udHJvbClcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIGN0cmwuQ29ubmVjdGVkQ29udHJvbCwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlpvb21CdXR0b25Ub29sdGlwLCB0b29sVGlwKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgY3RybCwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlRvb2x0aXAsIHRvb2xUaXApO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vblRvb2x0aXAoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb25EaXNwbGF5TGlzdChjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAgIGlmIChjdHJsLmlzU2VsZWN0aW9uQ3RybCgpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkpIHtcclxuICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gKGN1cnJMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSkgPyBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSA6IGN1cnJMaW5lO1xyXG4gICAgICAgIGF3YWl0IGN0cmwucmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkRpc3BsYXlMaXN0KClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJMaW5lXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG9uVmlzaWJsZUxheWVyTGlzdChjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICBpZiAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIGxpbmUgPSBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxpbmUgPSBjdXJyTGluZTtcclxuXHJcbiAgICAgIC8vIEFsd2F5cyBsYXllcmluZyBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIERpc3BsYXlsaXN0LiBCdXQsXHJcbiAgICAgIC8vIERpc3BsYXlMaXN0IGFuZCBpdGVtTGlzdCBzaG91bGQgbm90IGJlIHJlZnJlc2hlZC5cclxuICAgICAgYXdhaXQgY3RybC5yZWZyZXNoVGFiRm9yTGF5ZXJMaXN0KGxpbmUpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vblZpc2libGVMYXllckxpc3QoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25Gb3JtYXQoKSB7XHJcbiAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IG51bGw7XHJcbiAgICBsZXQgY3RybFBpYzogUElDO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBjdHJsID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGN0cmxQaWMgPSBjdHJsLmdldFBJQygpO1xyXG4gICAgICBjdHJsLnJlc2V0UHJldlZhbCgpO1xyXG5cclxuICAgICAgc3dpdGNoIChjdHJsLlR5cGUpIHtcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICAgIC8vIGlmIHRoZSBidXR0b24gZG9lc24ndCBoYXZlIGZpZWxkIHdlIG5lZWQgdG8gc2V0IHRoZSBmb3JtYXQgYXMgdGhlIHRleHQgb2YgdGhlIGNvbnRyb2wsXHJcbiAgICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBmaWVsZCB2YWx1ZSB3aWxsIHNldCB0aGUgdGV4dCBvbiB0aGUgY29udHJvbFxyXG4gICAgICAgICAgLy8gaW4gYWRkaXRpb24gd2UgbmVlZCB0byBzZXQgdGhlIHRleHQgZm9yIGltYWdlIGJ1dHRvblxyXG4gICAgICAgICAgLy8gQWxzbywgZG8gbm90IG92ZXJyaWRlIHRoZSB0ZXh0IHdpdGggdGhlIGZvcm1hdCBpZiB0aGUgY29udHJvbCBoYXMgYW4gZXhwcmVzc2lvbi5cclxuICAgICAgICAgIC8vIFFDUiMgOTM4OTMzLiBXaGVuIHRoZSBjb250cm9sIGlzIHJlZnJlc2hlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHdlIHNob3VsZCBzaG93IHRoZSB0ZXh0IGFzIGl0XHJcbiAgICAgICAgICAvLyBpcyBpbiB0aGUgRm9ybWF0IHByb3BlcnR5IC0gaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgZmllbGQgb3IgZXhwcmVzc2lvbiBpcyBhdHRhY2hlZCB0byBpdCBvciBub3QuXHJcbiAgICAgICAgICAvLyBUaGUgZml4IGlzIGNvbmZpbmVkIHRvIENvbnRyb2xUeXBlcy5DVFJMX1RZUEVfQlVUVE9OIGJlY2F1c2Ugb25seSBpbiBjYXNlIG9mIEJ1dHRvbiB3ZSBkaXNwbGF5IHRoZSB2YWx1ZSBvZiB0aGUgRm9ybWF0IHByb3BlcnR5LlxyXG4gICAgICAgICAgaWYgKGN0cmwuZ2V0RmllbGQoKSA9PSBudWxsICYmICFjdHJsLmV4cHJlc3Npb25TZXRBc0RhdGEoKSB8fCBjdHJsLklzSW1hZ2VCdXR0b24oKSB8fCAodGhpcy5fcGFyZW50T2JqLklzRmlyc3RSZWZyZXNoT2ZQcm9wcygpICYmICFHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0KCkpKVxyXG4gICAgICAgICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dCh0aGlzLmdldExpbmUoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVDpcclxuXHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKSB7XHJcbiAgICAgICAgICAgIGlmIChjdHJsUGljLmdldEF0dHIoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uRm9ybWF0KClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9uTGFiZWwoY3VyckxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIC8vIFNFTEVDVCBjb250cm9sLiBOb3RlIHdlIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgY2hhbmdlIG9mIHJhZGlvIGJ1dHRvbnMgcmFuZ2UhXHJcbiAgICAgIC8vIGRhdGEgY29udHJvbCByYW5nZXMgYXJlIHVwZGF0ZWQgd2hlbiB3ZSBzZXQgdmFsdWVzIHRvIHRoZW0gaW4gQ29udHJvbC5yZWZyZXNoRGlzcFZhbCgpXHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBsaW5lOiBudW1iZXI7XHJcblxyXG4gICAgICBpZiAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIGxpbmUgPSBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxpbmUgPSBjdXJyTGluZTtcclxuXHJcbiAgICAgIC8vIG9uIGNvbWJvIGJveCBjb21wZm9yIGNoZWNrIGJveCB0aGUgbGFiZWwgaXMgdGhlIGl0ZW0gbGlzdCBwcm9wZXJ0eVxyXG4gICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWClcclxuICAgICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dChsaW5lKTtcclxuICAgICAgZWxzZSBpZiAoY3RybC5pc1NlbGVjdGlvbkN0cmwoKSB8fCBjdHJsLmlzVGFiQ29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpKSB7XHJcbiAgICAgICAgY3RybC5zZXRSYW5nZShhd2FpdCB0aGlzLmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGN0cmwuY2xlYXJSYW5nZShsaW5lKTtcclxuICAgICAgICBhd2FpdCBjdHJsLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIElmIEl0ZW1MaXN0IGhhcyBhbiBleHByZXNzaW9uIEFuZCBpdCBtYXkgYmUgbW9kaWZpZWQgYWdhaW4sIHJlZnJlc2ggdGhlIGRpc3BsYXkgdmFsdWUgb2YgY29udHJvbC5cclxuICAgICAgICAvLyBCZWNhdXNlIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IGRpc3BsYXkgdmFsdWUgd2lsbCBjaGFuZ2UuXHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIGF3YWl0IGN0cmwuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJQcm9wZXJ0eS5vbkxhYmVsKCksIG5vdCBzdXBwb3J0IGNvbnRyb2xcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uTGFiZWwoKVwiKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBkZWZhdWx0IGJ1dHRvbiBvbiB0aGUgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkRlZmF1bHRCdXR0b24oKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0gfHwgdGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGZvcm06IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgPSB0aGlzLl9wYXJlbnRPYmouZ2V0Rm9ybSgpO1xyXG4gICAgICBsZXQgZGVmYXVsdEJ1dHRvbjogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IGZvcm0uZ2V0Q3RybEJ5TmFtZSh0aGlzLkdldENvbXB1dGVkVmFsdWUoKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKTtcclxuICAgICAgbGV0IGxpbmU6IG51bWJlciA9IChkZWZhdWx0QnV0dG9uID09PSBudWxsKSA/IDAgOiBkZWZhdWx0QnV0dG9uLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuXHJcblxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkRlZmF1bHRCdXR0b24oKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCBzdXBwb3J0IGluIHN1YmZvcm0sIG11c3QgY2FsbCB0aGlzIG1ldGhvZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE9iamVjdEJ5UGFyZW50T2JqKCk6IGFueSB7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnkgPSB0aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKSB7XHJcbiAgICAgIGxldCBmb3JtOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyID0gPEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGlmIChmb3JtLmlzU3ViRm9ybSgpKVxyXG4gICAgICAgIHJlc3VsdCA9IGZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc1JlcGVhdGFibGVJblRhYmxlKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGN1cnJlbnQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldExpbmUoKTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBkaXNwbGF5TGluZUZvclRyZWVPclRhYmxlOiBib29sZWFuID0gY3RybC5pc1Byb3BlcnR5UmVwZWF0YWJsZSh0aGlzLl9pZCk7XHJcblxyXG4gICAgICBsaW5lID0gY3RybC5nZXREaXNwbGF5TGluZShkaXNwbGF5TGluZUZvclRyZWVPclRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gb3JpZ2luYWwgdmFsdWUgb2YgcHJvcGVydHkgdGhhdCB3YXMgY29tcHV0ZWQgYmVmb3JlIGV4ZWN1dGlvbiBvZiBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE9yZ1ZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JnVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSBzaXplIG9mIHByZXZ2YWx1ZXMgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuU2hvdWxkU2tpcFJlZnJlc2goKSlcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjbGVhciBfcHJldlZhbHVlcyBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICBjbGVhclByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5DbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUmVzZXRQcmV2VmFsdWVBcnJheSgpOiB2b2lkIHtcclxuICAgIGxldCBjb3VudDogbnVtYmVyID0gdGhpcy5fcHJldlZhbHVlcy5sZW5ndGg7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkNsZWFyKCk7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUoY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGUgYW5kIHNldCBhcnJheXMgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRQcmV2QXJyYXlTaXplKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNIHx8IHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSAxO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgICAgbGV0IG1nQ29udHJvbEJhc2U6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgICBpZiAobWdDb250cm9sQmFzZS5Jc1JlcGVhdGFibGUpXHJcbiAgICAgICAgICBzaXplID0gbWdDb250cm9sQmFzZS5nZXRGb3JtKCkuZ2V0VGFibGVJdGVtc0NvdW50KCk7XHJcbiAgICAgICAgZWxzZSBpZiAobWdDb250cm9sQmFzZS5pc1RhYmxlQ29udHJvbCgpICYmIFByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUodGhpcy5faWQpKVxyXG4gICAgICAgICAgc2l6ZSA9IG1nQ29udHJvbEJhc2UuZ2V0Rm9ybSgpLmdldFRhYmxlSXRlbXNDb3VudCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUoc2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGFzc3dvcmQgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25QYXNzd29yZCgpIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKCksIHRoaXMuZ2V0TGluZSgpLCBIdG1sUHJvcGVydGllcy5QYXNzd29yZCwgdGhpcy5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25QYXNzd29yZCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgdXNlciBwcm9wZXJ0eSBUaXRsZVBhZGRpbmcgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgY29tcHV0ZUN1c3RvbVByb3BlcnRpZXNWYWx1ZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBmb3IgKGxldCBbY3VzdG9tUHJvcGVydHlLZXksIGN1c3RvbVByb3BlcnR5VmFsdWVdIG9mIHRoaXMuY3VzdG9tUHJvcGVydGllcykge1xyXG4gICAgICBsZXQgbGVuOiBudW1iZXIgPSAyNTU7XHJcbiAgICAgIGxldCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGZhbHNlKTtcclxuICAgICAgbGV0IGV4cHJlc3Npb24gPSBjdXN0b21Qcm9wZXJ0eVZhbHVlO1xyXG4gICAgICAvLyBpbml0IHRoZSB2YWx1ZVxyXG4gICAgICBsZXQgcmV0RXhwcmVzc2lvblZhbHVlID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzVmFsdWVzLnNldChjdXN0b21Qcm9wZXJ0eUtleSwgcmV0RXhwcmVzc2lvblZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29tcHV0ZSBjdXN0b20gdmFsaWRhdG9yc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlQ3VzdG9tVmFsaWRhdG9ycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZ0NvbnRyb2wgPSA8TWdDb250cm9sQmFzZT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICBpZiAobWdDb250cm9sLk1vZGlmaWVkQnlVc2VyIHx8IHRoaXMuR2V0VGFza0J5UGFyZW50T2JqZWN0KCkuSXNJblJlY29tcHV0ZSgpKXtcclxuICAgICAgZm9yIChsZXQgW2N1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21WYWxpZGF0b3JQcm9wZXJ0eV0gb2YgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgbGV0IGxlbjogbnVtYmVyID0gMjU1O1xyXG4gICAgICAgIGxldCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGZhbHNlKTtcclxuICAgICAgICBsZXQgZXhwcmVzc2lvbiA9ICg8Q3VzdG9tVmFsaWRhdG9yUHJvcD5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0eSkuX2V4cDtcclxuICAgICAgICAvLyBpbml0IHRoZSB2YWx1ZVxyXG4gICAgICAgIGxldCBpc0luVmFsaWQgPSBhd2FpdCB0aGlzLkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gICAgICAgIGxldCBlcnJTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBJblZhbGlkID0gKGlzSW5WYWxpZCA9PT0gXCIxXCIpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIGlmIChJblZhbGlkKSB7XHJcbiAgICAgICAgICBleHByZXNzaW9uID0gKDxDdXN0b21WYWxpZGF0b3JQcm9wPmN1c3RvbVZhbGlkYXRvclByb3BlcnR5KS5fZXJyb3JNZXNzYWdlRXhwO1xyXG4gICAgICAgICAgaWYgKGV4cHJlc3Npb24gPiAwKVxyXG4gICAgICAgICAgICBlcnJTdHJpbmcgPSBhd2FpdCB0aGlzLkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBlcnJTdHJpbmcgPSAoPEN1c3RvbVZhbGlkYXRvclByb3A+Y3VzdG9tVmFsaWRhdG9yUHJvcGVydHkpLl9lcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcy5zZXQoY3VzdG9tUHJvcGVydHlLZXksIG5ldyBDdXN0b21WYWxpZGF0b3IoIUluVmFsaWQsIGVyclN0cmluZykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCB1c2VyIHByb3BlcnR5IFRpdGxlUGFkZGluZyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkN1c3RvbVByb3BlcnRpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgZm9yIChsZXQgW2N1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21Qcm9wZXJ0eVZhbHVlXSBvZiB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMpIHtcclxuICAgICAgLy8gdXNlIHRoaXMuX3BhcmVudE9iaiBhbmQgbm90IHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5QUk9QX1NFVF9VU0VSX1BST1BFUlRZLCB0aGlzLl9wYXJlbnRPYmosIHRoaXMuZ2V0TGluZSgpLCBjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgY3VzdG9tIHZhbGlkYXRvcnMgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25DdXN0b21WYWxpZGF0b3JzKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgW2N1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21Qcm9wZXJ0eVZhbHVlXSBvZiB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcykge1xyXG5cclxuICAgICAgLy8gdXNlIHRoaXMuX3BhcmVudE9iaiBhbmQgbm90IHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5QUk9QX1NFVF9DVVNUT01fVkFMSURBVE9SLCB0aGlzLl9wYXJlbnRPYmosIHRoaXMuZ2V0TGluZSgpLFxyXG4gICAgICAgIGN1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21Qcm9wZXJ0eVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0IEJpbmRpbmcgTGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25CaW5kaW5nTGV2ZWwoKVxyXG4gIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuQmluZGluZ0xldmVsLCB0aGlzLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCkpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkuQmluZGluZ0xldmVsKClcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb246IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICBsZXQgbGVuOiBudW1iZXIgPSAyNTU7XHJcbiAgICBsZXQgZXhwU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuX3BhcmVudE9iai5HZXRFeHByZXNzaW9uU3RvcmFnZShleHByZXNzaW9uKTtcclxuICAgIGxldCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGZhbHNlKTtcclxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGF3YWl0IHRoaXMuX3BhcmVudE9iai5FdmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZXhwU3RvcmFnZUF0dHJpYnV0ZSwgbGVuLCB0cnVlLCBTdG9yYWdlQXR0cmlidXRlLlNLSVAsIGZhbHNlLCB3YXNFdmFsdWF0ZWQpO1xyXG5cclxuICAgIGV4cFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl9wYXJlbnRPYmouR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwcmVzc2lvbik7XHJcbiAgICBsZXQgY29tcElkeDogbnVtYmVyID0gdGhpcy5fcGFyZW50T2JqLmdldENvbXBJZHgoKTtcclxuXHJcbiAgICBzd2l0Y2ggKGV4cFN0b3JhZ2VBdHRyaWJ1dGUpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgbGV0IHRlbXBQaWMgPSBuZXcgUElDKFwiTjYuMlwiLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSBcIkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcclxuICAgICAgICByZXR1cm5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChyZXR1cm5WYWx1ZSwgXCJcIiwgdGVtcFBpYywgZmFsc2UsIGNvbXBJZHgsIGZhbHNlKS50cmltKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICB0ZW1wUGljID0gbmV3IFBJQyhcIiMjLyMjLyMjIyNcIiwgZXhwU3RvcmFnZUF0dHJpYnV0ZSwgY29tcElkeCk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIHRydWUsIGZhbHNlLCBjb21wSWR4LCB0cnVlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHRlbXBQaWMgPSBuZXcgUElDKFwiIyM6IyMvIyMjI1wiLCBleHBTdG9yYWdlQXR0cmlidXRlLCBjb21wSWR4KTtcclxuICAgICAgICByZXR1cm5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChyZXR1cm5WYWx1ZSwgXCJcIiwgdGVtcFBpYywgdHJ1ZSwgZmFsc2UsIGNvbXBJZHgsIHRydWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkuR2V0UmV0cnVuVmFsdWVGb3JDdXN0b21Qcm9wZXJ0eUV4cHJlc3Npb24oKSBpbGxlZ2FsIGRhdGEgdHlwZTogXCIgKyBleHBTdG9yYWdlQXR0cmlidXRlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICBSZW1vdmVQcmV2VmFsSW5kZXhBdChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3ByZXZWYWx1ZXMubGVuZ3RoID4gaWR4KSB7XHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuUmVtb3ZlQXQoaWR4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgSW5zZXJ0UHJldlZhbEF0KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkluc2VydChpZHgsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICByZXNldFByZXZWYWxBdChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuX3ByZXZWYWx1ZXMubGVuZ3RoKVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGlkeCwgbnVsbCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcInswfSA9IHsxfSAoZXhwPXsyfSwgc3R1ZGlvIHZhbHVlPXszfSlcIiwgW1xyXG4gICAgICBQcm9wRGVmYXVsdHMuR2V0UHJvcGVydHlOYW1lKHRoaXMuX2lkKSwgKHRoaXMuX3ZhbCA9PT0gbnVsbCkgPyBcImlzIG51bGxcIiA6IHRoaXMuX3ZhbCwgdGhpcy5fZXhwSWQsIHRoaXMuU3R1ZGlvVmFsdWVcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXREZWZhdWx0UHJvcCgpIHJldHVybnMgYSBwcm9wZXJ0eSB0aGF0IGhhcyBhIHN5c3RlbSBkZWZhdWx0IHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5UaGUgcHJvcGVydHkgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50VHlwZVwiPlBBUkVOVF9UWVBFX0NPTlRST0wsIFBBUkVOVF9UWVBFX0ZPUk0sIFBBUkVOVF9UWVBFX1RBU0s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcFBhcmVudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBQcm9wZXJ0eSB0aGF0IGhhcyBhIHN5c3RlbSBkZWZhdWx0IHZhbHVlPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXREZWZhdWx0UHJvcChwcm9wSWQ6IG51bWJlciwgcGFyZW50VHlwZTogc3RyaW5nLCBwcm9wUGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nID0gUHJvcERlZmF1bHRzLmdldERlZmF1bHRWYWx1ZShwcm9wSWQsIHBhcmVudFR5cGUsIHByb3BQYXJlbnQpO1xyXG5cclxuICAgIGlmIChtZ1ZhbCAhPT0gbnVsbClcclxuICAgICAgcHJvcCA9IG5ldyBQcm9wZXJ0eShwcm9wSWQsIHByb3BQYXJlbnQsIHBhcmVudFR5cGUsIG1nVmFsKTtcclxuXHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIEluc2VydFByZXZWYWx1ZUFycmF5KGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuU2hvdWxkU2tpcFJlZnJlc2goKSlcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1401
|
+
Property.UtilImeJpn = (UtilStrByteMode.isLocaleDefLangJPN() ? new UtilImeJpn() : null);
|
|
1402
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL1Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBRVQsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXRELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHdEQsTUFBTSxPQUFPLG1C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QixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLG1DQUFtQyxDQUFDO1lBQ3ZELEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLDBCQUEwQixDQUFDO1lBQzlDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLEtBQUssYUFBYSxDQUFDLDZCQUE2QixDQUFDO1lBQ2pELEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHlCQUF5QixDQUFDO1lBQzdDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLDhCQUE4QixDQUFDO1lBQ2xELEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lB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LEdBQVcsRUFBRSxLQUFhO1FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQzs7QUE1NURjLDRCQUFtQixHQUFRLElBQUksQ0FBQztBQWlCeEMsbUJBQVUsR0FBZSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgRGVidWcsXHJcbiAgSW50MzIsXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgQ3RybEJ1dHRvblR5cGVHdWksXHJcbiAgTG9nZ2VyX0xvZ0xldmVscyxcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsSW1lSnBuLFxyXG4gIFV0aWxTdHJCeXRlTW9kZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIgfSBmcm9tICcuLi90YXNrcy9UYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyJztcclxuaW1wb3J0IHsgUHJvcFBhcmVudEludGVyZmFjZSB9IGZyb20gJy4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUElDIH0gZnJvbSAnLi9QSUMnO1xyXG5pbXBvcnQgeyBUYXNrRGVmaW5pdGlvbklkIH0gZnJvbSAnLi4vdGFza3MvVGFza0RlZmluaXRpb25JZCc7XHJcbmltcG9ydCB7IEV2ZW50cyB9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7IEd1aUNvbnN0YW50cyB9IGZyb20gJy4uLy4uL0d1aUNvbnN0YW50cyc7XHJcbmltcG9ydCB7IFByb3BJbnRlcmZhY2UgfSBmcm9tICcuL1Byb3BJbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIH0gZnJvbSAnLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyJztcclxuaW1wb3J0IHsgRGlzcGxheUNvbnZlcnRvciB9IGZyb20gJy4vRGlzcGxheUNvbnZlcnRvcic7XHJcbmltcG9ydCB7IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgfSBmcm9tICcuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHsgQ29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQgeyBHdWlUYXNrQmFzZSB9IGZyb20gJy4uL3Rhc2tzL0d1aVRhc2tCYXNlJztcclxuaW1wb3J0IHsgUHJvcERlZmF1bHRzIH0gZnJvbSAnLi9Qcm9wRGVmYXVsdHMnO1xyXG5pbXBvcnQgeyBUb29sVGlwSGVscCB9IGZyb20gJy4vSGVscHMnO1xyXG5pbXBvcnQgeyBHdWlFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL0d1aUVudmlyb25tZW50JztcclxuaW1wb3J0IHsgTWdDb250cm9sQmFzZSB9IGZyb20gJy4vTWdDb250cm9sQmFzZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdG9yUHJvcCB7XHJcbiAgX2V4cDogbnVtYmVyO1xyXG4gIF9lcnJvck1lc3NhZ2VFeHA6IG51bWJlcjtcclxuICBfZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdG9yIHtcclxuICBfdmFsaWQ6IGJvb2xlYW47XHJcbiAgX2Vycm9yTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWxpZDogYm9vbGVhbiwgZXJyTWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92YWxpZCA9IHZhbGlkO1xyXG4gICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gZXJyTWVzc2FnZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1ZhbGlkKCk6IGJvb2xlYW4ge3JldHVybiB0aGlzLl92YWxpZDt9XHJcbiAgcHVibGljIGdldEVyck1lc3NhZ2UoKTogc3RyaW5nIHtyZXR1cm4gdGhpcy5fZXJyb3JNZXNzYWdlO31cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYSBQcm9wZXJ0eSBvYmplY3Qgb2YgY29udHJvbCwgZm9ybSBvciB0YXNrLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgUHJvcGVydHkge1xyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICBwcml2YXRlIF9kYXRhVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICBwcml2YXRlIF92YWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX2V4cElkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX3BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSA9IG51bGw7IC8vIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2JqZWN0IChDb250cm9sLCBGb3JtLCBHdWlUYXNrQmFzZSlcclxuICBwcml2YXRlIF9wYXJlbnRUeXBlOiBzdHJpbmcgPSBudWxsOyAvLyBDb250cm9sfEZvcm18R3VpVGFza0Jhc2VcclxuICBwcml2YXRlIF9wcmV2VmFsdWVzOiBMaXN0PHN0cmluZz4gPSBudWxsOyAvLyByZXZlcmVuY2UgdG8gcHJvcGVydHkgdmFsdWVzIGluIGEgdGFibGVcclxuICBwcml2YXRlIF9vcmdWYWx1ZTogc3RyaW5nID0gbnVsbDsgLy8gcmV2ZXJlbmNlIHRvIHByb3BlcnR5IHZhbHVlcyBpbiBhIHRhYmxlXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX251bWVyaWNQcm9wZXJ0eVBpYzogUElDID0gbnVsbDtcclxuICBwcml2YXRlIF90YXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkID0gbnVsbDsgLy8gdGFzayBkZWZpbml0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkuXHJcbiAgLy8gc3R1ZGlvVmFsdWUgZm9yIG9mZmxpbmUgc3RhdGVcclxuICAvLyBUb0RvOiBjb21tZW50IHNheXMgdGhhdCBpdCBpcyBmb3IgXCJPZmZsaW5lIHN0YXRlXCIuIFNvLCBkbyB3ZSBuZWVkIGl0IGluV2ViQ2xpZW50P1xyXG4gIFN0dWRpb1ZhbHVlOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2V4cEFscmVhZHlDb21wdXRlZE9uY2U6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdGhlIGV4cHJlc3Npb24gaXMgYWxyZWFkeSBjb21wdXRlZCBvbmNlXHJcblxyXG4gIC8vIGZvciB3ZWIgY2xpZW50IDpcclxuICAvLyBzYXZlIHRoZSBjdXN0b20gcHJvcGVydGllcyB0aGF0IGRlZmluZSBieSB0aGUgdXNlclxyXG4gIHByaXZhdGUgY3VzdG9tUHJvcGVydGllczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGN1c3RvbVByb3BlcnRpZXNWYWx1ZXM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIC8vIGZvciB3ZWIgY2xpZW50IDpcclxuICAvLyBzYXZlIHRoZSBjdXN0b20gdmFsaWRhdG9ycyB0aGF0IGRlZmluZSBieSB0aGUgdXNlclxyXG4gIHByaXZhdGUgY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllczogTWFwPHN0cmluZywgQ3VzdG9tVmFsaWRhdG9yUHJvcD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBjdXN0b21WYWxpZGF0b3JWYWx1ZXM6IE1hcDxzdHJpbmcsIEN1c3RvbVZhbGlkYXRvcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHN0YXRpYyBVdGlsSW1lSnBuOiBVdGlsSW1lSnBuID0gKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSA/IG5ldyBVdGlsSW1lSnBuKCkgOiBudWxsKTsgLy8gSlBOOiBJTUUgc3VwcG9ydFxyXG5cclxuICAvLyB0YXNrIGRlZmluaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eS5cclxuICBnZXQgVGFza0RlZmluaXRpb25JZCgpOiBUYXNrRGVmaW5pdGlvbklkIHtcclxuICAgIHJldHVybiB0aGlzLl90YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nKTtcclxuICBjb25zdHJ1Y3RvcihjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCB2YWw6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IoY0lkPzogbnVtYmVyLCBjUGFyZW50T2JqPzogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZT86IHN0cmluZywgdmFsPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcblxyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMylcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNJZCwgY1BhcmVudE9iaiwgcGFyVHlwZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMihjSWQsIGNQYXJlbnRPYmosIHBhclR5cGUsIHZhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzID0gbmV3IExpc3QoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuc2V0SWQoY0lkKTtcclxuICAgIHRoaXMuX3BhcmVudE9iaiA9IGNQYXJlbnRPYmo7XHJcbiAgICB0aGlzLl9wYXJlbnRUeXBlID0gcGFyVHlwZTtcclxuICAgIHRoaXMuc2V0RGF0YVR5cGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMihjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCB2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNJZCwgY1BhcmVudE9iaiwgcGFyVHlwZSk7XHJcbiAgICB0aGlzLnNldFZhbHVlKHZhbCk7XHJcbiAgICB0aGlzLnNldE9yZ1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBpZCBvZiB0aGlzIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldElkKGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IGNJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBOZWVkIHBhcnQgaW5wdXQgU3RyaW5nIHRvIHJlbGV2YW50IGZvciB0aGUgY2xhc3MgZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRSZWZcIj5yZWZlcmVuY2UgdG8gcGFyZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgZmlsbERhdGEocGFyZW50UmVmOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKSB7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFwiPlwiLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmogPT09IG51bGwgJiYgcGFyZW50UmVmICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudE9iaiA9IHBhcmVudFJlZjtcclxuICAgICAgdGhpcy5fcGFyZW50VHlwZSA9IHBhclR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKSArIFhNTENvbnN0YW50cy5NR19UQUdfUFJPUC5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSkge1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSW4gUHJvcC5GaWxsRGF0YSgpOiB7MH1cIiwgdG9rZW5zVmVjdG9yLnRvU3RyaW5nKCkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pbml0RWxlbWVudHModG9rZW5zVmVjdG9yKTtcclxuXHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UubGVuZ3RoKTtcclxuXHJcbiAgICAgIC8vIGRlYWwgd2l0aCBpbnRlcm5hbCB0YWdzXHJcbiAgICAgIHRoaXMuSW5pdElubmVyT2JqZWN0cyhwYXJzZXIpO1xyXG5cclxuICAgICAgLy8gZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgdHlwZXMgbmVlZCBzZXQgcGFyYW1ldGVycyB0byB0aGUgcGFyZW50IC0gQ09OVFJPTCAoaW4gdGhpcyBjYXNlKVxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgICAgdGhpcy5zZXRDb250cm9sQXR0cmlidXRlcygpO1xyXG4gICAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSlcclxuICAgICAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUoMSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiSW4gUHJvcGVydHkuRmlsbERhdGEoKTogT3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEluaXRJbm5lck9iamVjdHMoeG1sUGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCBuZXh0VGFnOiBzdHJpbmcgPSB4bWxQYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG5cclxuICAgIGlmIChuZXh0VGFnID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0tERUZJTklUSU9OSURfRU5UUlkpIHtcclxuICAgICAgbGV0IHhtbEJ1ZmZlcjogc3RyaW5nID0geG1sUGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgICAgdGhpcy5Jbml0VGFza0RlZmluaXRpb25JZCh4bWxCdWZmZXIpO1xyXG5cclxuICAgICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHhtbFBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX1BST1AgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFLCB4bWxQYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICB4bWxQYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyAoWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSkubGVuZ3RoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWtlIGluaXRpYWxpemF0aW9uIG9mIHByaXZhdGUgZWxlbWVudHMgYnkgZm91bmQgdG9rZW5zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRva2Vuc1ZlY3RvclwiPmZvdW5kIHRva2Vucywgd2hpY2ggY29uc2lzdCBhdHRyaWJ1dGUvdmFsdWUgb2YgZXZlcnkgZm91bmQgZWxlbWVudCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuc2V0SWQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgdGhpcy5zZXREYXRhVHlwZSgpOyAvLyBUaGUgJ25hbWUnIG1lbWJlciBtdXN0IGJlIGZvdW5kIGluIHRoaXMgcG9pbnRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfU1RVRElPX1ZBTFVFOlxyXG4gICAgICAgICAgdGhpcy5TdHVkaW9WYWx1ZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUykge1xyXG4gICAgICAgICAgICB0aGlzLkluaXRDdXN0b21Qcm9wZXJ0aWVzKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykge1xyXG4gICAgICAgICAgICB0aGlzLkluaXRDdXN0b21WYWxpZGF0aW9uUHJvcGVydGllcyhYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl92YWwgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLl9vcmdWYWx1ZSA9IHRoaXMuX3ZhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRVhQOlxyXG4gICAgICAgICAgdGhpcy5fZXhwSWQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9leHBJZCA+IDAgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVApXHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YVR5cGUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIC8vIE5hbWUgaXMgb25seSBzZXJpYWxpemVkIGZvciBkZWJ1ZyB2ZXJzaW9uIC5cclxuICAgICAgICAgIC8vIFRvIGF2b2lkIGV4Y2VwdGlvbnMsIGFkZCBhIGJsYW5rIGNhc2UgZm9yIGl0XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NUTF9JRFg6XHJcbiAgICAgICAgICB0aGlzLl90YXNrRGVmaW5pdGlvbklkLkN0bEluZGV4ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BST0dSQU1fSVNOOlxyXG4gICAgICAgICAgdGhpcy5fdGFza0RlZmluaXRpb25JZC5Qcm9ncmFtSXNuID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBQcm9wZXJ0eSBjbGFzcy4gSW5zZXJ0IGNhc2UgdG8gUHJvcGVydHkuaW5pdEVsZW1lbnRzIGZvciB7MH1cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGNvbXB1dGUgaW4gdGhlIHNlcnZlciAsIHRoZW4gc2V0IF9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlXHJcbiAgICAgIGlmICh0aGlzLklzQ29tcHV0ZWRPbmNlT25TZXJ2ZXIoKSlcclxuICAgICAgICB0aGlzLl9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgY3VzdG9tIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdEN1c3RvbVByb3BlcnRpZXMoY3VzdG9tUHJvcHJ0aWVzU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VzdG9tUHJvcGVydGllcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KEpTT04ucGFyc2UoY3VzdG9tUHJvcHJ0aWVzU3RyKSk7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50T2JqLklzRmlyc3RSZWZyZXNoT2ZQcm9wcygpKVxyXG4gICAgICB0aGlzLlNldEZpcnN0VmFsdWVGb3JDdXN0b21Qcm9wZXJ0aWVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBJbml0IEN1c3RvbVZhbGlkYXRvclxyXG4gIHByaXZhdGUgSW5pdEN1c3RvbVZhbGlkYXRvciAocGFyc2VyIDogWG1sUGFyc2VyKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IHRleHQ6IHN0cmluZyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICB0ZXh0ID0gdGV4dC5zdWJzdHIodGV4dC5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUikgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NVU1RPTV9WQUxJREFUT1IubGVuZ3RoKTtcclxuICAgIGxldCB0b2tlbnM6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnModGV4dCwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICBsZXQgYyA9IG5ldyBDdXN0b21WYWxpZGF0b3JQcm9wKCk7XHJcbiAgICBsZXQga2V5O1xyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW5zLmxlbmd0aDsgaiArPSAyKVxyXG4gICAge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSB0b2tlbnMuZ2V0X0l0ZW0oaik7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGogKyAxKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9FWFA6XHJcbiAgICAgICAgICBjLl9leHAgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIGtleSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VSUk9SX0VYUDpcclxuICAgICAgICAgIGMuX2Vycm9yTWVzc2FnZUV4cCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9FUlJPUjpcclxuICAgICAgICAgIGMuX2Vycm9yTWVzc2FnZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcy5zZXQgKGtleSwgYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXQgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdEN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKGN1c3RvbVByb3BydGllc1N0cjogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IHBhcnNlciA9IG5ldyBYbWxQYXJzZXIoY3VzdG9tUHJvcHJ0aWVzU3RyKTtcclxuICAgIGxldCBjdXJyVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICB3aGlsZSAoY3VyclRhZ05hbWUgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgc3dpdGNoIChjdXJyVGFnTmFtZSlcclxuICAgICAge1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcyA9IG5ldyBNYXA8c3RyaW5nLCBDdXN0b21WYWxpZGF0b3JQcm9wPigpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0NVU1RPTV9WQUxJREFUT1I6XHJcbiAgICAgICAgICB0aGlzLkluaXRDdXN0b21WYWxpZGF0b3IgKHBhcnNlcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY3VyclRhZ05hbWUgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgIHRoaXMuU2V0Rmlyc3RWYWx1ZUZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBTZXRGaXJzdFZhbHVlRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgICBmb3IgKGxldCBjdXN0b21Qcm9wZXJ0eSBvZiB0aGlzLmN1c3RvbVZhbGlkYXRvclByb3BlcnRpZXMua2V5cygpKSB7XHJcbiAgICAgIGxldCBjIDogQ3VzdG9tVmFsaWRhdG9yUHJvcCA9IHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcy5nZXQoY3VzdG9tUHJvcGVydHkpO1xyXG4gICAgICB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcy5zZXQoPHN0cmluZz5jdXN0b21Qcm9wZXJ0eSwgbmV3IEN1c3RvbVZhbGlkYXRvcih0cnVlLCBcIlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGZyb20gdGhlIHZhbHVlIHN0cmluZyBhbmQgc2F2ZSBpdCBpbiB2YWwgJiBvcmdWYWx1ZVxyXG4gICAgdGhpcy5fdmFsID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tVmFsaWRhdG9yVmFsdWVzLnZhbHVlcygpKTtcclxuICAgIGxldCB2YWx1ZXNTdHIgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xyXG4gICAgcmV0dXJuIHZhbHVlc1N0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tUHJvcGVydGllc1ZhbHVlcy52YWx1ZXMoKSk7XHJcbiAgICBsZXQgdmFsdWVzU3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZXNTdHI7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBTZXRGaXJzdFZhbHVlRm9yQ3VzdG9tUHJvcGVydGllcygpOiB2b2lkIHtcclxuXHJcbiAgICBmb3IgKGxldCBjdXN0b21Qcm9wZXJ0eSBvZiB0aGlzLmN1c3RvbVByb3BlcnRpZXMua2V5cygpKVxyXG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMuc2V0KDxzdHJpbmc+Y3VzdG9tUHJvcGVydHksIFwiXCIpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBmcm9tIHRoZSB2YWx1ZSBzdHJpbmcgYW5kIHNhdmUgaXQgaW4gdmFsICYgb3JnVmFsdWVcclxuICAgIHRoaXMuX3ZhbCA9IHRoaXMuR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXNldCBfZXhwQWxyZWFkeUNvbXB1dGVkT25jZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZXNldENvbXB1dGVkT25jZUZsYWcoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgdGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlcjogVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlciA9IG5ldyBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyKHRoaXMuU2V0VGFza0RlZmluaXRpb25JZCk7XHJcbiAgICB0YXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyLnBhcnNlKHhtbEJ1ZmZlcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxsYmFjayBmb3IgVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlclxyXG4gIFNldFRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFza0RlZmluaXRpb25JZCA9IHRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGFUeXBlKCk6IHZvaWQge1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgdGhpcy5fcGljID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5faWQgPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVG8gZmlsbCBkYXRhVHlwZSBtZW1iZXIgaW4gUHJvcGVydHkuRmlsbERhdGFUeXBlIG11c3QgaWQhPXswfVwiLCBJbnQzMi5NaW5WYWx1ZSkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQk9SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlk6XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TWVNURU1fTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRklBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX0NBTkNFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVBFQVRBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJR0hMSUdIVElORzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSRUxPQURfVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkVfVkVSVElDQUxfU0NST0xMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9BTExPV19DUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DT0xfUkVTSVpFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JFT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0hPV19MSU5FUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xfQUxMT1dfRklMVEVSSU5HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfU1RBVFVTX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0g6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSS19PTl9DTElDSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0ZVTExfUk9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQUNLX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0JVVFRPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfQVRfUk9PVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9ESVZJREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVfRElWSURFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9USFJFRV9TVEFURVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUQUlOX0ZPQ1VTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ0xPU0VfVEFTS1NfQllfTURJX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19PUEVOX1RBU0tfV0lORE9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19FVkVOVFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0lOREVYX09QVElNSVpBVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUE9TSVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1NRTF9SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CRUZPUkVfOTAwX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRklMTF9XSURUSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSV9DT0xVTU5fRElTUExBWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fQ09NUExFVEVfTU9ERV9XQzpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUkFTQUNUSU9OX0JFR0lOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19UUkFOU0FDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dBTExQQVBFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJJR0dFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfQ1lDTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSQU1FVEVSUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9MSVNUX0lOREVYRVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MQVlFUlNfTElTVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUFMX09CSkVDVF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEFWSUVXQ09OVFJPTF9GSUVMRFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1JBTkdFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19MT0NBVEVfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1BPU0lUSU9OX1VTQUdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9USVRMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1Q6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1fTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BRERJVElPTkFMX0lORk9STUFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RFWFQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElOVDpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVU9NOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hPUl9GQUM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVkVSX0ZBQzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0FMTFBBUEVSX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lOREVYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTktfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9GSUVMRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QVUxMRE9XTl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fRklUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VYUEFORF9XSU5ET1c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MSU5FUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DSE9JQ0VfQ09MVU1OUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVFlMRV8zRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT05UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBWUVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJRFRIOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0hFSUdIVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xPUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MRUZUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPUDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFTFBfU0NSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVTX0lOX1RBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTl9ST1dTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hPUklaT05UQUxfQUxJR05NRU5UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9XT1JEV1JBUF9TQ1JPTEw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUk9XX0hFSUdIVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfV0lEVEg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTUFJTl9ESVNQTEFZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQU5TTEFUT1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVTRVRfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV0VEX0RJUkVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ST1dfSElHSExJR0hUX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZFUlRJQ0FMX0FMSUdOTUVOVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NUQVRJQ19UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MT0FEX0lNQUdFX0ZST006XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JPVFRPTV9QT1NJVElPTl9JTlRFUlZBTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT05fTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkdUU0tfTlVNOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BFUlNJU1RFTlRfRk9STV9TVEFURV9WRVJTSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVJfVEhVTUI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQklORElOR19MRVZFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVF9QUk9HUkFNOlxyXG4gICAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUCAmJiB0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTtcclxuICAgICAgICAvLyBwaWMgd2lsbCBiZSBzZXQgYWNjb3JkaW5nIHRvIGV4cCBsZW5ndGhcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDO1xyXG4gICAgICAgICAgaWYgKFByb3BlcnR5Ll9udW1lcmljUHJvcGVydHlQaWMgPT0gbnVsbClcclxuICAgICAgICAgICAgUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYyA9IG5ldyBQSUMoXCJONlwiLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIGNvbXBJZHgpO1xyXG4gICAgICAgICAgdGhpcy5fcGljID0gUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUVVJOX0FDVElPTjpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5EYXRhVHlwZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QT1BfVVA6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1JJRU5UQVRJT05fTE9DSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTlRFUl9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVhJVF9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFWSUdBVElPTl9EUkFXRVJfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BQ1RJT05fQkFSX01FTlU6XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fUElDS0VSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fRURJVF9ESUFMT0c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9BTElHTk1FTlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfS0VZQk9BUkRfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9SRVRVUk5fS0VZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NVR0dFU1RJT05TOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PQklMRV9JTUFHRV9MSVNUX0ZJTEVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TV0lQRV9SRUZSRVNIOlxyXG4gICAgICAgIC8vIE5vIGhhbmRsaW5nIGlzIG5lZWRlZCBoZXJlIGFzIHRoZSBwcm9wZXJ0aWVzIGFyZSB2YWxpZCBmb3IgbW9iaWxlIGFzIGZvciBub3cuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBQcm9wZXJ0eS5zZXREYXRhVHlwZSgpIG5vIGNhc2UgZm9yOiB7MH1cIiwgdGhpcy5faWQpKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYXR0cmlidXRlcyBvZiBhIHRoZSBwYXJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRDb250cm9sQXR0cmlidXRlcygpIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmogPT0gbnVsbCB8fCB0aGlzLl9wYXJlbnRUeXBlICE9PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIFByb3BlcnR5LnNldENvbnRyb2xBdHRyaWJ1dGVzKCkgdGhlcmUgaXMgbm8gcGFyZW50IG9yIHRoZSBwYXJlbnQgaXMgbm90IGEgY29udHJvbFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXJlbnRDb250cm9sID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuTmFtZSA9IHRoaXMuX3ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVRUUklCVVRFOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuRGF0YVR5cGUgPSA8U3RvcmFnZUF0dHJpYnV0ZT50aGlzLl92YWxbMF07XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgICBwYXJlbnRDb250cm9sLnNldFBpY1N0cih0aGlzLl92YWwsIHRoaXMuX2V4cElkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFOR0U6XHJcbiAgICAgICAgcGFyZW50Q29udHJvbC5zZXRSYW5nZSh0aGlzLl92YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICAgIGlmICh0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLnNldFZhbEV4cCh0aGlzLl9leHBJZCk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLnNldEZpZWxkKHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgICBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLkJ1dHRvblN0eWxlID0gPEN0cmxCdXR0b25UeXBlR3VpPnRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFZRVI6XHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbCAhPSBudWxsKVxyXG4gICAgICAgICAgcGFyZW50Q29udHJvbC5MYXllciA9IHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhpcyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UGFyZW50T2JqKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50T2JqO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHBhcmVudCBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBhcmVudFR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SUQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgdGFrZSBjYXJlIG9mIHRoZSBwcmVzZW50YXRpb24gdGhlIHZhbHVlIG11c3QgYmUgaW4gYSBtYWdpYyBpbnRlcm5hbFxyXG4gIC8vLyAgIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHNldFZhbHVlKG1nVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjb21wSWR4OiBudW1iZXIgPSB0aGlzLl9wYXJlbnRPYmouZ2V0Q29tcElkeCgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQSB8fCB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTk9ERV9JRCB8fCB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTk9ERV9QQVJFTlRJRClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FKVxyXG4gICAgICB0aGlzLnNldERhdGFUeXBlKCk7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9kYXRhVHlwZSkge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICBpZiAobWdWYWwgPT0gbnVsbClcclxuICAgICAgICAgIG1nVmFsID0gXCJGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XHJcbiAgICAgICAgdGhpcy5fdmFsID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKG1nVmFsLCBcIlwiLCB0aGlzLl9waWMsIGZhbHNlLCBjb21wSWR4LCBmYWxzZSkudHJpbSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgdGhpcy5fdmFsID0gbWdWYWw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LnNldFZhbHVlKCkgaWxsZWdhbCBkYXRhIHR5cGU6IFwiICsgdGhpcy5fZGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgYW4gaW50IHZhbHVlIGRpcmVjdGx5LCBhcyBpcyBkb25lIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICBTZXRWYWx1ZSh2YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFsID0gU3RyaW5nKHZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRha2UgY2FyZSBvZiB0aGUgcHJlc2VudGF0aW9uIHRoZSB2YWx1ZSBtdXN0IGJlIGluIGEgbWFnaWMgaW50ZXJuYWwgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRPcmdWYWx1ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0U3R1ZGlvVmFsdWVBc09yZ1ZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JnVmFsdWUgPSB0aGlzLlN0dWRpb1ZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm5zIHRoZSBmb3JtIHJlbGF0ZWQgdG8gdGhpcyBwcm9wZXJ0eS4gSWYgdGhlIHByb3BlcnR5J3MgcGFyZW50IGlzIHRoZSBmb3JtIHRoZW4gcmV0dXJuIGl0LFxyXG4gIC8vLyAgIG90aGVyd2lzZSwgaWYgdGhlIHByb3BlcnR5J3MgcGFyZW50IGlzIGEgY29udHJvbCB0aGVuIHJldHVybiB0aGUgZm9ybSB0byB3aGljaCB0aGlzIGNvbnRyb2wgYmVsb25ncy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gTWdGb3JtPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0Rm9ybSgpOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyIHtcclxuICAgIGxldCBmb3JtOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pXHJcbiAgICAgIGZvcm0gPSA8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKVxyXG4gICAgICBmb3JtID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5nZXRGb3JtKCk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSB0YXNrIGJ5IHRoZSBwYXJlbnQgb2JqZWN0PC9yZXR1cm5zPlxyXG4gIEdldFRhc2tCeVBhcmVudE9iamVjdCgpOiBHdWlUYXNrQmFzZSB7XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSlcclxuICAgICAgdGFzayA9ICg8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuZ2V0VGFzaygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgIHRhc2sgPSAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSylcclxuICAgICAgdGFzayA9IDxHdWlUYXNrQmFzZT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheSBmb3IgY29udHJvbCBwcm9wZXJ0aWVzIGFuZCBmb3JtIHByb3BlcnRpZXMgb25seVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZVJlZnJlc2hcIj5pZiB0cnVlIHRoZW4gcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheVdpdGhDdXJyZW50TGluZShmb3JjZVJlZnJlc2gsIEludDMyLk1pblZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gVFJVRSBpZiB0aGUgcHJvcGVydHkgbmVlZCB0byBiZSBza2lwIGZyb20gdGhlIHJlZnJlc2ggcHJvcGVydGllcy4gZm9yIGEgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNraXBSZWZyZXNoQ29udHJvbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWdDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVzpcclxuICAgICAgICBpZiAobWdDb250cm9sLmlzVGFibGVDb250cm9sKCkpXHJcbiAgICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OT0RFX0lEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05PREVfUEFSRU5USUQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ISUdITElHSFRJTkc6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVDpcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVMUF9TQ1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUX1BST0dSQU06XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dFRF9ESVJFQ1RJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUVVJOX0FDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVQRUFUQUJMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSSUdHRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQVlFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX0ZJVDpcclxuICAgICAgLy8gY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkVfVkVSVElDQUxfU0NST0xMOlxyXG4gICAgICAvLyBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9XT1JEV1JBUF9TQ1JPTEw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVTRVRfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfV0lEVEg6XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19SRUZSRVNIOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBUkFNRVRFUlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT0JKRUNUX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUQUlOX0ZPQ1VTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NVQkZPUk1fVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUFMX09CSkVDVF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FERElUSU9OQUxfSU5GT1JNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEFWSUVXQ09OVFJPTF9GSUVMRFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJHVFNLX05VTTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTkRFWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0ZJRUxEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTktfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQkVGT1JFXzkwMF9WRVJTSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU46XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VSVkVSX1JFQURfQUhFQUQ6XHJcbiAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgICBpZiAoISg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNSYWRpbygpKVxyXG4gICAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBza2lwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIGJlIHNraXAgZnJvbSB0aGUgcmVmcmVzaCBwcm9wZXJ0aWVzLiBmb3IgYSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2hGb3JtKCk6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKTtcclxuXHJcbiAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1nRm9ybUJhc2U6IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAvLyBDb21wdXRlIHByb3BlcnRpZXM6IGFsbCB0aG9zZSBwcm9wZXJ0aWVzIHdpbGwgYmUgcmVmcmVzaCBvbmx5IG9uZSB0aW1lXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0lORE9XX1RZUEU6XHJcbiAgICAgICAgaWYgKCF0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfSU5fVEFCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVMUF9TQ1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QRVJTSVNURU5UX0ZPUk1fU1RBVEVfVkVSU0lPTjpcclxuICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVmcmVzaCBvbmx5IHRoZSByZWxldmFudCBzdWJmb3JtIHByb3BlcnRpZXMgKGNvbG9yLCBmb250LCBldGMuKVxyXG4gICAgaWYgKCFza2lwICYmIG1nRm9ybUJhc2UuaXNTdWJGb3JtKCkpIHtcclxuICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuXHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTOlxyXG4gICAgICAgICAgc2tpcCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2tpcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gVFJVRSBpZiB0aGUgcHJvcGVydHkgbmVlZCB0byBiZSBza2lwIGZyb20gdGhlIHJlZnJlc2ggcHJvcGVydGllcy4gZm9yIGEgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNraXBSZWZyZXNoVGFzaygpOiBib29sZWFuIHtcclxuICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX0NZQ0xFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fQ0FOQ0VMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VORF9DT05ESVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUkFTQUNUSU9OX0JFR0lOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19UUkFOU0FDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ0xPU0VfVEFTS1NfQllfTURJX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX09QRU5fVEFTS19XSU5ET1c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQ0hVTktfU0laRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfSU5ERVhfT1BUSU1JWkFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUkFOR0VfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfTE9DQVRFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19QT1NJVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUE9TSVRJT05fVVNBR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1NRTF9SQU5HRTpcclxuICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNraXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBpZ25vcmVkIGJ5IFJlZnJlc2hEaXNwbGF5KCkgc2tpcCBwcm9wZXJ0aWVzIHdoaWNoIGhhcyBub3RoaW5nIHRvIGRvIHdpdGhcclxuICAvLy8gICB0aGUgZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaWdub3JlZDwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNraXBSZWZyZXNoKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHN3aXRjaCAodGhpcy5fcGFyZW50VHlwZSkge1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MOlxyXG4gICAgICAgIHNraXAgPSB0aGlzLlNob3VsZFNraXBSZWZyZXNoQ29udHJvbCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNOlxyXG4gICAgICAgIHNraXAgPSB0aGlzLlNob3VsZFNraXBSZWZyZXNoRm9ybSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLOlxyXG4gICAgICAgIHNraXAgPSB0aGlzLlNob3VsZFNraXBSZWZyZXNoVGFzaygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QT1BfVVA6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1JJRU5UQVRJT05fTE9DSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTlRFUl9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVhJVF9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFWSUdBVElPTl9EUkFXRVJfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BQ1RJT05fQkFSX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9QSUNLRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9FRElUX0RJQUxPRzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0FMSUdOTUVOVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0tFWUJPQVJEX1JFVFVSTl9LRVk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU1VHR0VTVElPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9CSUxFX0lNQUdFX0xJU1RfRklMRV9OQU1FOlxyXG4gICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNraXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheSBmb3IgY29udHJvbCBwcm9wZXJ0aWVzIGFuZCBmb3JtIHByb3BlcnRpZXMgb25seVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZVJlZnJlc2hcIj5pZiB0cnVlIHRoZW4gcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyckxpbmVcIj5saW5lIG51bWJlciBpbiB0YWJsZSB3aGVuIHJlZnJlc2hpbmcgYSBjb2x1bW4gaWYgdGhlIGN1cnJlbnQgbGluZSBpcyByZWZyZXNoZWQgc2V0IHRvXHJcbiAgLy8vICAgKEludGVnZXIuTUlOX1ZBTFVFKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgUmVmcmVzaERpc3BsYXlXaXRoQ3VycmVudExpbmUoZm9yY2VSZWZyZXNoOiBib29sZWFuLCBjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5V2l0aEN1cnJMaW5lQW5kQ2hlY2tTa2lwUmVmcmVzaChmb3JjZVJlZnJlc2gsIGN1cnJMaW5lLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB3ZSBtdXN0IHJlZnJlc2ggdGhlIHByb3BlcnR5IGV2ZW4gaWYgaXQgaGFzIGV4cHJlc3Npb25cclxuICAvLyBGb3Igbm93IGl0IHJldHVybnMgdHJ1ZSBmb3IgcHJvcGVydGllcyB3aXRoIHRleHQgZm9yIG11bHRpbGluZ3VhbCBzdXBwb3J0XHJcblxyXG4gIC8vIHRvZG8gTmVlZCB0byBhZGQgaGVyZSBjaGVjayBpZiB1c2VyIHdhbnRzIG11bHRpbGluZ3VhbCBzdXBwb3J0IGF0IGFsbFxyXG4gIFNraXBXaGVuTm9FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXBXaGVuTm9FeHByZXNzaW9uID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgY3RybCA9ICgodGhpcy5fcGFyZW50T2JqIGluc3RhbmNlb2YgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcikgPyA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj50aGlzLl9wYXJlbnRPYmogOiBudWxsKTtcclxuICAgIGlmICgoY3RybCAhPSBudWxsICYmIGN0cmwuaXNCdXR0b24oKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNDb21ib0JveCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzTGlzdEJveCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzUmFkaW8oKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0NoZWNrQm94KCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNUYWJDb250cm9sKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNJbWFnZUNvbnRyb2woKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5Jc0ltYWdlQnV0dG9uKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNDb2x1bW5Db250cm9sKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9USVRMRSkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1QpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEVYVCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJTlQpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFTU1dPUkQpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1BST1BFUlRJRVMpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEKXx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQklORElOR19MRVZFTCkpXHJcbiAgICAgIHNraXBXaGVuTm9FeHByZXNzaW9uID0gZmFsc2U7XHJcbiAgICByZXR1cm4gc2tpcFdoZW5Ob0V4cHJlc3Npb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlZXZhbHVhdGUgdGhlIHByb3BlcnR5IHZhbHVlIChpZiBpdCBoYXMgYW4gZXhwcmVzc2lvbikgYW5kXHJcbiAgLy8vIHJlZnJlc2ggdGhlIGRpc3BsYXkgZm9yIGNvbnRyb2wgcHJvcGVydGllcyBhbmQgZm9ybSBwcm9wZXJ0aWVzIG9ubHlcclxuICAvLy9cclxuICAvLy8gVGhpcyBtZXRob2Qgd2FzIChhcyBpdHMgbmFtZSBpbXBsaWVzKSByZWxldmFudCBvbmx5IGZvciBHVUkgcHJvcGVydGllcywgaS5lLiBwcm9wZXJ0aWVzIHRoYXQgYWZmZWN0IG9uIHRoZSBkaXNwbGF5LlxyXG4gIC8vLyBOb24tR1VJIHByb3BlcnRpZXMgKHN1Y2ggYXMgUFJPUF9UWVBFX1RBQl9JTikgd2VyZSBza2lwcGVkIGFuZCBub3QgcmVldmFsdWF0ZWQuXHJcbiAgLy8vIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIEdVSSBwcm9wZXJ0aWVzIGFuZCBub24tR1VJIHByb3BlcnRpZXMgaXMgZG9uZSBieSB0aGUgbWV0aG9kIO+/vVNob3VsZFNraXBSZWZyZXNo77+9RVxyXG4gIC8vLyBOb3cgd2UgaGF2ZSBub24tR1VJIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVldmFsdWF0ZWQgaW4gdGhpcyBmdW5jdGlvbjpcclxuICAvLy8gUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWSwgUFJPUF9UWVBFX0NPTlRFWFRfTUVOVSwgUFJPUF9UWVBFX1RBQl9JTiwgUFJPUF9UWVBFX1BBUktfT05fQ0xJQ0suXHJcbiAgLy8vIEZvciB0aGVzZSBwcm9wZXJ0aWVzIHdlIGRvIG5vdCBleGVjdXRlIGV4cGxpY2l0bHkgdGhlaXIgZXhwcmVzc2lvbnMgKGl0IHdhcyBkb25lIGluIDEuOSBieSBDaGVja1Byb3AgZnVuY3Rpb24pLFxyXG4gIC8vLyB3ZSBvbmx5IHVzZSB0aGVpciB2YWx1ZXMgYnkgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkgZnVuY3Rpb24uIEl0IGlzIGRvbmUgZm9yIGRvIG5vdCBleGVjdXRlIHRoZSBwcm9wZXJ0eSBleHByZXNzaW9uXHJcbiAgLy8vIGluIEdVSSB0aHJlYWQuIEluIEdVSSB0aHJlYWQgd2Ugb25seSB1c2UgdGhlIHByb3BlcnR5IHZhbHVlLiBTbyBpdCBpcyBuZWVkZWQgdG8gcmVldmFsdWF0ZSB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlUmVmcmVzaFwiPmlmIHRydWUgdGhlbiByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyTGluZVwiPmxpbmUgbnVtYmVyIGluIHRhYmxlIHdoZW4gcmVmcmVzaGluZyBhIGNvbHVtbiBpZiB0aGUgY3VycmVudCBsaW5lIGlzIHJlZnJlc2hlZCBzZXQgdG9cclxuICAvLy8gICAoSW50ZWdlci5NSU5fVkFMVUUpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXlXaXRoQ3VyckxpbmVBbmRDaGVja1NraXBSZWZyZXNoKGZvcmNlUmVmcmVzaDogYm9vbGVhbiwgY3VyckxpbmU6IG51bWJlciwgY2hlY2tTa2lwUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBudWxsO1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcHJldlZhbHVlOiBzdHJpbmc7XHJcbiAgICBsZXQgdmFsQ2hhbmdlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbCA9PT0gbnVsbCAmJiB0aGlzLl9leHBJZCA9PT0gMCkge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIFByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCkgbnVsbCB2YWx1ZSBhbmQgZXhwcmVzc2lvblwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGVja1NraXBSZWZyZXNoICYmIHRoaXMuU2hvdWxkU2tpcFJlZnJlc2goKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLl9leHBJZCA9PT0gMCAmJiB0aGlzLlNraXBXaGVuTm9FeHByZXNzaW9uKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJldlZhbHVlcy5sZW5ndGggPT09IDApXHJcbiAgICAgIHRoaXMuc2V0UHJldkFycmF5U2l6ZSgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuQ29tcHV0ZVZhbHVlKCk7XHJcblxyXG4gICAgLy8gYmVmb3JlIHVwZGF0ZSB0aGUgcHJvcGVydHkgbmVlZCB0byBwcmVwYXJlIGRhdGFcclxuICAgIHN3aXRjaCAodGhpcy5fcGFyZW50VHlwZSkge1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MOlxyXG4gICAgICAgIGN0cmwgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgICAvLyByZWNvbXB1dGUgdGhlIFBJQyBmb3IgZm9ybWF0IHByb3BlcnRpZXNcclxuICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVCAmJiB0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICBjdHJsLmNvbXB1dGVQSUModGhpcy5fdmFsKTtcclxuXHJcbiAgICAgICAgaWYgKGN0cmwuSXNSZXBlYXRhYmxlICYmICFjdHJsLmdldEZvcm0oKS5pc1JlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCgpKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgICAgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGxpbmUgPSBjdXJyTGluZTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZCB0byBwcmV2ZW50IHNlbmRpbmcgcmVkdW5kYW50XHJcbiAgICAgICAgLy8gamF2YXNjcmlwdCBjb21tYW5kcyB0byB0aGUgYnJvd3NlclxyXG4gICAgICAgIHByZXZWYWx1ZSA9IHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0obGluZSk7XHJcblxyXG5cclxuICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiAodGhpcy5fdmFsID09PSBwcmV2VmFsdWUpXHJcbiAgICAgICAgICAmJiB0aGlzLl9pZCAhPT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZJQUJMRVxyXG4gICAgICAgICAgJiYgdGhpcy5faWQgIT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVcclxuICAgICAgICAgICYmIHRoaXMuX2lkICE9PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyB0byBwcmV2ZW50IHJlY3Vyc2lvbiB3aGlsZSB1cGRhdGluZyBjb2x1bW4gdmlzaWJpbGl0eVxyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTlxyXG4gICAgICAgICAgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVcclxuICAgICAgICAgICYmIHRoaXMuX3ZhbCA9PT0gcHJldlZhbHVlKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdmFsID09PSBwcmV2VmFsdWUpXHJcbiAgICAgICAgICB2YWxDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0obGluZSwgdGhpcy5fdmFsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk06XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZCB0byBwcmV2ZW50IHNlbmRpbmcgcmVkdW5kYW50XHJcbiAgICAgICAgLy8gamF2YXNjcmlwdCBjb21tYW5kcyB0byB0aGUgYnJvd3NlclxyXG4gICAgICAgIHByZXZWYWx1ZSA9IHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0oMCk7XHJcbiAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgKHRoaXMuX3ZhbCA9PT0gcHJldlZhbHVlKSlcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKDAsIHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLOiAvLyBUQVNLIFBST1BFUlRJRVNcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcclxuICAgICAgICAgIE5TdHJpbmcuRm9ybWF0KFwiUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKTogdGFzayBwcm9wZXJ0eSB7MH0gd2Fzbid0IGhhbmRsZWRcIiwgdGhpcy5faWQpKTtcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFxyXG4gICAgICAgICAgTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpOiBwYXJlbnRUeXBlIHVua25vd24sIHByb3BlcnR5IHswfSB3YXNuJ3QgaGFuZGxlZFwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FOlxyXG4gICAgICAgIHRoaXMub25JbWFnZUZpbGVOYW1lKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQ6XHJcbiAgICAgICAgdGhpcy5vbkVuYWJsZSh2YWxDaGFuZ2VkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRTpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uVmlzaWJsZSh2YWxDaGFuZ2VkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUU6XHJcbiAgICAgICAgdGhpcy5PbkNvbnRyb2xOYW1lKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1fTkFNRTpcclxuICAgICAgICB0aGlzLm9uRm9ybU5hbWUoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09MVU1OX1RJVExFOlxyXG4gICAgICAgIHRoaXMub25UZXh0KDApO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9URVhUOlxyXG4gICAgICAgIHRoaXMub25UZXh0KGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ISU5UOlxyXG4gICAgICAgIHRoaXMub25IaW50KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEU6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbk1vZGlmaWFibGUodmFsQ2hhbmdlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVA6XHJcbiAgICAgICAgdGhpcy5vblRvb2x0aXAoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9MSVNUOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25EaXNwbGF5TGlzdChsaW5lKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19DT01QTEVURV9NT0RFX1dDOlxyXG4gICAgICAgIHRoaXMub25BdXRvQ29tcGxldGVNb2RlKCk7XHJcbiAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MQVlFUlNfTElTVDpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uVmlzaWJsZUxheWVyTGlzdChsaW5lKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICAgIHRoaXMub25Gb3JtYXQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUw6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbkxhYmVsKGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBU1NXT1JEOlxyXG4gICAgICAgIHRoaXMub25QYXNzd29yZCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9JTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVJLX09OX0NMSUNLOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xPQURfSU1BR0VfRlJPTTogLy8gdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBpZGVudGlmeWluZyBsb2FkaW5nIG9mIGltYWdlIChTZXJ2ZXIvQ2xpZW50KS5cclxuICAgICAgICAvLyBTbyBubyBoYW5kbGluZyBuZWVkZWQgaW4gUmVmcmVzaERpc3BsYXlcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTOlxyXG4gICAgICAgIHRoaXMub25DdXN0b21Qcm9wZXJ0aWVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlM6XHJcbiAgICAgICAgdGhpcy5vbkN1c3RvbVZhbGlkYXRvcnMoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQklORElOR19MRVZFTDpcclxuICAgICAgICB0aGlzLm9uQmluZGluZ0xldmVsKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXHJcbiAgICAgICAgICBOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCk6IFByb3BlcnR5IHswfSB3YXNuJ3QgaGFuZGxlZFwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbmVlZCB0byBjYWxjdWxhdGUgb25jZSBvbmx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkQmVDb21wdXRlZE9uY2UoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0spIHtcclxuICAgICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19NT0RFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJFTE9BRF9WSUVXOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19DWUNMRTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19PUEVOX1RBU0tfV0lORE9XOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUzpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURV9JTl9RVUVSWTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQ6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVg6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVk6XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19DQUNIRUQgfHwgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGlmIHRoZSB2YWx1ZSBpcyBjb21wdXRlZCBpbiB0aGUgc2VydmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgSXNDb21wdXRlZE9uY2VPblNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlNob3VsZEJlQ29tcHV0ZWRPbmNlKCkpIHtcclxuICAgICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5HZXRUYXNrQnlQYXJlbnRPYmplY3QoKTtcclxuICAgICAgaWYgKHRhc2sgIT0gbnVsbClcclxuICAgICAgICByZXR1cm4gIXRhc2suU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkodGhpcy5faWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGVzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUgZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBDb21wdXRlVmFsdWUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gMjU1O1xyXG4gICAgbGV0IHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1BST1BFUlRJRVMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ3VzdG9tUHJvcGVydGllc1ZhbHVlcygpO1xyXG4gICAgICByZXN1bHQgPSB0aGlzLkdldEFycmF5VmFsdWVzRm9yQ3VzdG9tUHJvcGVydGllcygpO1xyXG4gICAgICB0aGlzLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZUN1c3RvbVZhbGlkYXRvcnMoKTtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWUocmVzdWx0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuX2V4cElkID4gMCkge1xyXG4gICAgICAvLyBmb3Igb2ZmbGluZSA6IGNvbXB1dGUgb25jZSB0aGUgcHJvcGVydGllcyB0aGF0IHdhcyBjb21wdXRlIG9uIHRoZSBzZXJ2ZXJcclxuICAgICAgaWYgKHRoaXMuU2hvdWxkQmVDb21wdXRlZE9uY2UoKSAmJiB0aGlzLl9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gZm9yIGZvbGxvd2luZyBjb250cm9sIHByb3BlcnRpZXMgYWx3YXlzIGV2YWx1YXRlIGV4cHJlc3Npb25zXHJcbiAgICAgIGxldCBhbHdheXNFdmFsdWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSylcclxuICAgICAgICBhbHdheXNFdmFsdWF0ZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVCkge1xyXG4gICAgICAgIGxlbiA9IDY1NTM1O1xyXG4gICAgICAgIHJlc3VsdCA9IFN0clV0aWwucnRyaW0oYXdhaXQgdGhpcy5fcGFyZW50T2JqLkV2YWx1YXRlRXhwcmVzc2lvbih0aGlzLl9leHBJZCwgdGhpcy5fZGF0YVR5cGUsIGxlbiwgdHJ1ZSxcclxuICAgICAgICAgIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgYWx3YXlzRXZhbHVhdGUsIHdhc0V2YWx1YXRlZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9wYXJlbnRPYmouRXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX2V4cElkLCB0aGlzLl9kYXRhVHlwZSwgbGVuLCB0cnVlLCBTdG9yYWdlQXR0cmlidXRlLlNLSVAsIGFsd2F5c0V2YWx1YXRlLCB3YXNFdmFsdWF0ZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgbGV0IHdhcm5pbmdNc2cgPSBuZXcgU3RyaW5nQnVpbGRlcihcIkV4Y2VwdGlvbjogXCIgKyBlLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3BhcmVudE9iaiBpbnN0YW5jZW9mIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIpXHJcbiAgICAgICAgICAgIHdhcm5pbmdNc2cuQXBwZW5kKFwiIENvbnRyb2w6IFwiICsgKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudE9iaikuTmFtZSk7XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVXYXJuaW5nVG9Mb2cod2FybmluZ01zZy5Ub1N0cmluZygpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAod2FzRXZhbHVhdGVkLnZhbHVlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51cGRhdGVSZXN1bHQocmVzdWx0KTtcclxuICAgICAgICB0aGlzLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5fdmFsID09IG51bGwgJiYgdGhpcy5fcGFyZW50VHlwZSAhPT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgICByZXN1bHQgPSBQcm9wRGVmYXVsdHMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuX2lkLCB0aGlzLl9wYXJlbnRUeXBlLCB0aGlzLl9wYXJlbnRPYmopO1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZXMgcmVzdWx0cyBvZiBleHByZXNzaW9uIGZvciBzb21lIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdWx0XCI+IDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSB1cGRhdGVSZXN1bHQocmVzdWx0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpXHJcbiAgICAgICAgICByZXN1bHQgPSBOU3RyaW5nLkVtcHR5O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREU6XHJcbiAgICAgICAgcmVzdWx0ID0gUHJvcGVydHkudXBkYXRlVGFza01vZGVSZXN1bHQocmVzdWx0KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkbyB0aGUgc2FtZSBhcyB3ZSBkb2luZyBmb3IgYysrIFVjaGFyIFJUOjp0c2tfbW9kZV9leHAgKGxvbmcgZXhwLCBVY2hhciBtb2RlKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZVRhc2tNb2RlUmVzdWx0KHJlc3VsdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShyZXN1bHQpKSB7XHJcbiAgICAgIGNvZGUgPSByZXN1bHRbMF0udG9VcHBlckNhc2UoKTtcclxuICAgICAgc3dpdGNoIChjb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnUSc6XHJcbiAgICAgICAgICBjb2RlID0gJ0UnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnRic6XHJcbiAgICAgICAgICBjb2RlID0gJ08nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnTyc6XHJcbiAgICAgICAgICBjb2RlID0gJ04nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29kZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGdldFZhbHVlKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBhd2FpdCB0aGlzLkNvbXB1dGVWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gaW50IHZhbHVlIG9mIHRoaXMgcHJvcGVydHk8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0VmFsdWVJbnQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5Db21wdXRlVmFsdWUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSBOTnVtYmVyLlBhcnNlKHRoaXMuX3ZhbCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHdpdGhvdXQgZXhlY3V0ZSBpdHMgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbnQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eTwvcmV0dXJucz5cclxuICBHZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodGhpcy5fdmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdmFsaWQgb25seSBmb3IgbG9naWNhbCB0eXBlIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGdldFZhbHVlQm9vbGVhbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VmFsdWUoKTtcclxuICAgICAgcmV0dXJuIERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHRoaXMuX3ZhbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5nZXRWYWx1ZUJvb2xlYW4oKSB3YXMgY2FsbGVkIGZvciBub24gYm9vbGVhbiB0eXBlIHByb3BlcnR5OiB7MH1cIiwgdGhpcy5faWQpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb21wdXRlZCB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29tcHV0ZWRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBjb21wdXRlZCBib29sZWFuIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRob3V0IGV4ZWN1dGUgaXRzIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pIHtcclxuICAgICAgcmV0dXJuIERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHRoaXMuX3ZhbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5nZXRWYWx1ZUJvb2xlYW4oKSB3YXMgY2FsbGVkIGZvciBub24gYm9vbGVhbiB0eXBlIHByb3BlcnR5OiB7MH1cIiwgdGhpcy5faWQpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIGxpbmUgb2YgdGhlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgcmVxdWVzdGVkIGxpbmUgbnVtYmVyPC9wYXJhbT5cclxuICBnZXRQcmV2VmFsdWUobGluZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmIChsaW5lIDwgdGhpcy5fcHJldlZhbHVlcy5sZW5ndGgpXHJcbiAgICAgIHJldHVybiB0aGlzLl9wcmV2VmFsdWVzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgaGFzIGFuIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzRXhwcmVzc2lvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9leHBJZCA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEV4cHJlc3Npb25JZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4cElkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25JbWFnZUZpbGVOYW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBtZ0NvbnRyb2xCYXNlOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGlmIChtZ0NvbnRyb2xCYXNlLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgbWdDb250cm9sQmFzZS5zZXRJbWFnZUxpc3QodGhpcy5HZXRDb21wdXRlZFZhbHVlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG1nQ29udHJvbEJhc2UuaXNJbWFnZUNvbnRyb2woKSB8fCBtZ0NvbnRyb2xCYXNlLmlzUmFkaW8oKSB8fCBtZ0NvbnRyb2xCYXNlLmlzQ2hlY2tCb3goKSB8fCBtZ0NvbnRyb2xCYXNlLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICAgIG1nQ29udHJvbEJhc2Uuc2V0SW1hZ2VXaXRoRmlsZU5hbWUodGhpcy5HZXRDb21wdXRlZFZhbHVlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIG9uSW1hZ2VGaWxlTmFtZS5vbkVuYWJsZSgpXCIpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uRW5hYmxlKHZhbENoYW5nZWQ6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBsZXQgY3VycmVudEVkaXRpbmdDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbDtcclxuXHJcbiAgICAgIC8vIEFDVF9UQkxfTlhURkxEIGlzIGFkZGVkIGluIHF1ZXVlLCB3aGVuZXZlciBjdXJyZW50IGNvbnRyb2wgaXMgaGlkZGVuIG9yIGRpc2FibGVkIHRvIHNldCB0aGUgZm9jdXMgdG8gbmV4dCBjb250cm9sIGZvciBib3RoIFJDICYgT0xcclxuICAgICAgLy8gd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvci4gQnV0IG9uY2UgY3VycmVudCBjdHJsIGlzIGFscmVhZHkgZGlzYWJsZWQvaGlkZGVuICwgd2Ugc2hvdWxkIG5vdCBwdXQgdGhlIHNhbWUgYWN0aW9uXHJcbiAgICAgIC8vIGluIHF1ZXVlIGFnYWluIHdoZW4gc2FtZSBjdHJsIGlzIGRpc2FibGVkL2hpZGRlbiBtdWx0aXBsZSB0aW1lcy5cclxuICAgICAgaWYgKHRoaXMuX3ZhbCAhPT0gbnVsbCAmJiB0aGlzLl92YWwgPT09IFwiMFwiICYmIHZhbENoYW5nZWQgJiYgY3VycmVudEVkaXRpbmdDb250cm9sICE9PSBudWxsICYmXHJcbiAgICAgICAgKGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbCB8fCBjdXJyZW50RWRpdGluZ0NvbnRyb2wuaXNEZXNjZW5kZW50T2ZDb250cm9sKGN0cmwpIHx8IGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbC5nZXRMaW5rZWRQYXJlbnQoZmFsc2UpKSkge1xyXG4gICAgICAgIGxldCBwYXJrZWRDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKHBhcmtlZENvbnRyb2wgIT09IG51bGwgJiYgcGFya2VkQ29udHJvbC5JbkNvbnRyb2wgJiYgKGN0cmwgPT09IHBhcmtlZENvbnRyb2wgfHwgcGFya2VkQ29udHJvbC5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY3RybCkpKSB7XHJcbiAgICAgICAgICBFdmVudHMuT25Ob25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGN0cmwuU2V0RW5hYmxlZCh0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkVuYWJsZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvblZpc2libGUodmFsQ2hhbmdlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBjdXJyZW50RWRpdGluZ0NvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sO1xyXG4gICAgICBpZiAodGhpcy5fdmFsICE9PSBudWxsICYmIHRoaXMuX3ZhbCA9PT0gXCIwXCIgJiYgdmFsQ2hhbmdlZCAmJiBjdXJyZW50RWRpdGluZ0NvbnRyb2wgIT09IG51bGwgJiZcclxuICAgICAgICAoY3RybCA9PT0gY3VycmVudEVkaXRpbmdDb250cm9sIHx8IGN1cnJlbnRFZGl0aW5nQ29udHJvbC5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY3RybCkgfHwgY3RybCA9PT0gY3VycmVudEVkaXRpbmdDb250cm9sLmdldExpbmtlZFBhcmVudChmYWxzZSkpKSB7XHJcbiAgICAgICAgbGV0IHBhcmtlZENvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICBpZiAocGFya2VkQ29udHJvbCAhPT0gbnVsbCAmJiBwYXJrZWRDb250cm9sLkluQ29udHJvbCAmJiAoY3RybCA9PT0gcGFya2VkQ29udHJvbCB8fCBwYXJrZWRDb250cm9sLmlzRGVzY2VuZGVudE9mQ29udHJvbChjdHJsKSkpIHtcclxuICAgICAgICAgIEV2ZW50cy5Pbk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICAgICAgICBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgY3RybC51cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFLCB0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCksIHRydWUpO1xyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIE9uQ29udHJvbE5hbWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lk9uQ29udHJvbE5hbWUoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IGhpbnQgZm9yIGVkaXQgY29udHJvbCBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkhpbnQoKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGNvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj50aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKCk7XHJcbiAgICAgIGxldCB0cmFuc2xhdGVkU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuVHJhbnNsYXRlKHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZSgpKTtcclxuXHJcbiAgICAgIGlmICghY29udHJvbC5Jc0RhdGVUaW1lUGljdHVyZSgpICYmICghY29udHJvbC5Jc1RhYmxlQ2hpbGQgfHwgY29udHJvbC5Jc1RhYmxlSGVhZGVyQ2hpbGQpKSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKCksIHRoaXMuZ2V0TGluZSgpLCBIdG1sUHJvcGVydGllcy5QbGFjZUhvbGRlciwgdHJhbnNsYXRlZFN0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW5Qcm9wZXJ0eS5vbkhpbnQoKVwiKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uRm9ybU5hbWUoKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pXHJcbiAgICAgIHRoaXMuYWRkQ29tbWFuZFR5cGVUZXh0KDApO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkZvcm1OYW1lKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZENvbW1hbmRUeXBlVGV4dChsaW5lOiBudW1iZXIpIHtcclxuICAgIGxldCBtbHNUcmFuc1ZhbHVlOiBzdHJpbmcgPSBFdmVudHMuVHJhbnNsYXRlKHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZSgpKTtcclxuXHJcbiAgICAvLyBGaXhlZCBidWcjOjczMzQ4MCBTeXN0ZW1Cb3ggPSBmYWxzZSBhbmQgdGl0bGUgaXMgZW1wdHktPiAuTkVUIGhpZGUgdGhlIHRpdGxlLlxyXG4gICAgLy8gd2Ugd2lsbCBzZXQgaXQgdG8gJyAnXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0gfHxcclxuICAgICAgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MICYmICg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNDb2x1bW5Db250cm9sKCkpKSB7XHJcbiAgICAgIC8vICM3Mzc0ODg6IFdoZW4gdmFyaWFibGUgYXR0YWNoZWQgdG8gZm9ybSdzIHRleHQgcHJvcGVydHksIHNwYWNlcyBhcmUgYXBwZW5kZWRcclxuICAgICAgLy8gYWZ0ZXIgYWN0dWFsIHZhbHVlLCBlcXVhbCB0byBwaWN0dXJlIG9mIHZhcmlhYmxlLiBCZWZvcmUgc2V0dGluZyB0ZXh0IHJlbW92ZSB0aGVzZSBleHRyYVxyXG4gICAgICAvLyBzcGFjZXMgYXQgdGhlIGVuZC5cclxuICAgICAgbWxzVHJhbnNWYWx1ZSA9IFN0clV0aWwucnRyaW0obWxzVHJhbnNWYWx1ZSk7XHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSAmJiBtbHNUcmFuc1ZhbHVlID09PSBOU3RyaW5nLkVtcHR5KSB7XHJcbiAgICAgICAgbWxzVHJhbnNWYWx1ZSA9IFwiIFwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wgJiYgKCg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNUZXh0Q29udHJvbCgpXHJcbiAgICAgICAgfHwgKCg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNCdXR0b24oKSkpKSAvLyBuZWVkIHRvIGNoZWNrIGZvciBoeXBlcnRleHQgb3Igb3RoZXIgdHlwZXMgb2YgYnV0dG9uXHJcbiAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLl9wYXJlbnRPYmosIGxpbmUsIG1sc1RyYW5zVmFsdWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuX3BhcmVudE9iaiwgbGluZSwgSHRtbFByb3BlcnRpZXMuVGV4dCwgbWxzVHJhbnNWYWx1ZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25UZXh0KGxpbmU6IG51bWJlcikge1xyXG4gICAgdGhpcy5hZGRDb21tYW5kVHlwZVRleHQobGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9uTW9kaWZpYWJsZSh2YWxDaGFuZ2VkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAgIGlmIChjdHJsLmlzVGV4dENvbnRyb2woKSkge1xyXG4gICAgICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuR2V0VGFza0J5UGFyZW50T2JqZWN0KCk7XHJcblxyXG4gICAgICAgIGxldCByZWFkT25seVZhbHVlOiBib29sZWFuID0gIXRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuXHJcbiAgICAgICAgaWYgKChyZWFkT25seVZhbHVlIHx8IHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKSAmJiBjdHJsLkdldEN1cnJSZWFkT25seSgpICE9PSByZWFkT25seVZhbHVlKSB7XHJcbiAgICAgICAgICBjdHJsLlNldEN1cnJSZWFkT25seShyZWFkT25seVZhbHVlKTtcclxuXHJcbiAgICAgICAgICAvLyBKUE46IElNRSBzdXBwb3J0IChlbmFibGUgSU1FIGluIHF1ZXJ5IG1vZGUpXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAgICAgICBpZiAoYXdhaXQgY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEVfSU5fUVVFUlksIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuUmVhZE9ubHksIHJlYWRPbmx5VmFsdWUpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25Nb2RpZmlhYmxlKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uVG9vbHRpcCgpOiB2b2lkIHtcclxuICAgIGxldCB0b29sVGlwOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgICAvLyBUb29sdGlwIGV4cHJlc3Npb24gcmV0dXJucyBzdHJpbmdcclxuICAgICAgaWYgKHRoaXMuX2V4cElkID09PSAwKVxyXG4gICAgICAgIHRvb2xUaXAgPSAoPFRvb2xUaXBIZWxwPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRIZWxwSXRlbShOTnVtYmVyLlBhcnNlKHRoaXMuX3ZhbCkpKS50b29sdGlwSGVscFRleHQ7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0b29sVGlwID0gdGhpcy5fdmFsO1xyXG5cclxuICAgICAgLy8gIzkyOTg4OTogUmVtb3ZlIGV4dHJhIHdoaXRlIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRvb2x0aXAgdGV4dC5cclxuICAgICAgdG9vbFRpcCA9IFN0clV0aWwucnRyaW0odG9vbFRpcCk7XHJcbiAgICAgIGlmKGN0cmwuaXNCdXR0b24oKSAmJiAgY3RybC5Db25uZWN0ZWRDb250cm9sKVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgY3RybC5Db25uZWN0ZWRDb250cm9sLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuWm9vbUJ1dHRvblRvb2x0aXAsIHRvb2xUaXApO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCBjdHJsLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuVG9vbHRpcCwgdG9vbFRpcCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uVG9vbHRpcCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvbkRpc3BsYXlMaXN0KGN1cnJMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgICAgaWYgKGN0cmwuaXNTZWxlY3Rpb25DdHJsKCkgfHwgY3RybC5pc1RhYkNvbnRyb2woKSB8fCBjdHJsLmlzUmFkaW8oKSB8fCAoPE1nQ29udHJvbEJhc2U+Y3RybCkuSGFzQXV0b2NvbXBsZXRlKCkpIHtcclxuICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gKGN1cnJMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSkgPyBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSA6IGN1cnJMaW5lO1xyXG4gICAgICAgIGF3YWl0IGN0cmwucmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkRpc3BsYXlMaXN0KClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJMaW5lXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG9uVmlzaWJsZUxheWVyTGlzdChjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICBpZiAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIGxpbmUgPSBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxpbmUgPSBjdXJyTGluZTtcclxuXHJcbiAgICAgIC8vIEFsd2F5cyBsYXllcmluZyBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIERpc3BsYXlsaXN0LiBCdXQsXHJcbiAgICAgIC8vIERpc3BsYXlMaXN0IGFuZCBpdGVtTGlzdCBzaG91bGQgbm90IGJlIHJlZnJlc2hlZC5cclxuICAgICAgYXdhaXQgY3RybC5yZWZyZXNoVGFiRm9yTGF5ZXJMaXN0KGxpbmUpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vblZpc2libGVMYXllckxpc3QoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25Gb3JtYXQoKSB7XHJcbiAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IG51bGw7XHJcbiAgICBsZXQgY3RybFBpYzogUElDO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBjdHJsID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGN0cmxQaWMgPSBjdHJsLmdldFBJQygpO1xyXG4gICAgICBjdHJsLnJlc2V0UHJldlZhbCgpO1xyXG5cclxuICAgICAgc3dpdGNoIChjdHJsLlR5cGUpIHtcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICAgIC8vIGlmIHRoZSBidXR0b24gZG9lc24ndCBoYXZlIGZpZWxkIHdlIG5lZWQgdG8gc2V0IHRoZSBmb3JtYXQgYXMgdGhlIHRleHQgb2YgdGhlIGNvbnRyb2wsXHJcbiAgICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBmaWVsZCB2YWx1ZSB3aWxsIHNldCB0aGUgdGV4dCBvbiB0aGUgY29udHJvbFxyXG4gICAgICAgICAgLy8gaW4gYWRkaXRpb24gd2UgbmVlZCB0byBzZXQgdGhlIHRleHQgZm9yIGltYWdlIGJ1dHRvblxyXG4gICAgICAgICAgLy8gQWxzbywgZG8gbm90IG92ZXJyaWRlIHRoZSB0ZXh0IHdpdGggdGhlIGZvcm1hdCBpZiB0aGUgY29udHJvbCBoYXMgYW4gZXhwcmVzc2lvbi5cclxuICAgICAgICAgIC8vIFFDUiMgOTM4OTMzLiBXaGVuIHRoZSBjb250cm9sIGlzIHJlZnJlc2hlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHdlIHNob3VsZCBzaG93IHRoZSB0ZXh0IGFzIGl0XHJcbiAgICAgICAgICAvLyBpcyBpbiB0aGUgRm9ybWF0IHByb3BlcnR5IC0gaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgZmllbGQgb3IgZXhwcmVzc2lvbiBpcyBhdHRhY2hlZCB0byBpdCBvciBub3QuXHJcbiAgICAgICAgICAvLyBUaGUgZml4IGlzIGNvbmZpbmVkIHRvIENvbnRyb2xUeXBlcy5DVFJMX1RZUEVfQlVUVE9OIGJlY2F1c2Ugb25seSBpbiBjYXNlIG9mIEJ1dHRvbiB3ZSBkaXNwbGF5IHRoZSB2YWx1ZSBvZiB0aGUgRm9ybWF0IHByb3BlcnR5LlxyXG4gICAgICAgICAgaWYgKGN0cmwuZ2V0RmllbGQoKSA9PSBudWxsICYmICFjdHJsLmV4cHJlc3Npb25TZXRBc0RhdGEoKSB8fCBjdHJsLklzSW1hZ2VCdXR0b24oKSB8fCAodGhpcy5fcGFyZW50T2JqLklzRmlyc3RSZWZyZXNoT2ZQcm9wcygpICYmICFHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0KCkpKVxyXG4gICAgICAgICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dCh0aGlzLmdldExpbmUoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVDpcclxuXHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKSB7XHJcbiAgICAgICAgICAgIGlmIChjdHJsUGljLmdldEF0dHIoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uRm9ybWF0KClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9uTGFiZWwoY3VyckxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIC8vIFNFTEVDVCBjb250cm9sLiBOb3RlIHdlIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgY2hhbmdlIG9mIHJhZGlvIGJ1dHRvbnMgcmFuZ2UhXHJcbiAgICAgIC8vIGRhdGEgY29udHJvbCByYW5nZXMgYXJlIHVwZGF0ZWQgd2hlbiB3ZSBzZXQgdmFsdWVzIHRvIHRoZW0gaW4gQ29udHJvbC5yZWZyZXNoRGlzcFZhbCgpXHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBsaW5lOiBudW1iZXI7XHJcblxyXG4gICAgICBpZiAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIGxpbmUgPSBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxpbmUgPSBjdXJyTGluZTtcclxuXHJcbiAgICAgIC8vIG9uIGNvbWJvIGJveCBjb21wZm9yIGNoZWNrIGJveCB0aGUgbGFiZWwgaXMgdGhlIGl0ZW0gbGlzdCBwcm9wZXJ0eVxyXG4gICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWClcclxuICAgICAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dChsaW5lKTtcclxuICAgICAgZWxzZSBpZiAoY3RybC5pc1NlbGVjdGlvbkN0cmwoKSB8fCBjdHJsLmlzVGFiQ29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpKSB7XHJcbiAgICAgICAgY3RybC5zZXRSYW5nZShhd2FpdCB0aGlzLmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGN0cmwuY2xlYXJSYW5nZShsaW5lKTtcclxuICAgICAgICBhd2FpdCBjdHJsLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIElmIEl0ZW1MaXN0IGhhcyBhbiBleHByZXNzaW9uIEFuZCBpdCBtYXkgYmUgbW9kaWZpZWQgYWdhaW4sIHJlZnJlc2ggdGhlIGRpc3BsYXkgdmFsdWUgb2YgY29udHJvbC5cclxuICAgICAgICAvLyBCZWNhdXNlIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IGRpc3BsYXkgdmFsdWUgd2lsbCBjaGFuZ2UuXHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIGF3YWl0IGN0cmwuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKCg8TWdDb250cm9sQmFzZT5jdHJsKS5IYXNBdXRvY29tcGxldGUoKSlcclxuICAgICAgICBhd2FpdCBjdHJsLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJQcm9wZXJ0eS5vbkxhYmVsKCksIG5vdCBzdXBwb3J0IGNvbnRyb2xcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uTGFiZWwoKVwiKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHN1cHBvcnQgaW4gc3ViZm9ybSwgbXVzdCBjYWxsIHRoaXMgbWV0aG9kXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0T2JqZWN0QnlQYXJlbnRPYmooKTogYW55IHtcclxuICAgIGxldCByZXN1bHQ6IGFueSA9IHRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pIHtcclxuICAgICAgbGV0IGZvcm06IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgaWYgKGZvcm0uaXNTdWJGb3JtKCkpXHJcbiAgICAgICAgcmVzdWx0ID0gZm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzUmVwZWF0YWJsZUluVGFibGUocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgY3VycmVudCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TGluZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGRpc3BsYXlMaW5lRm9yVHJlZU9yVGFibGU6IGJvb2xlYW4gPSBjdHJsLmlzUHJvcGVydHlSZXBlYXRhYmxlKHRoaXMuX2lkKTtcclxuXHJcbiAgICAgIGxpbmUgPSBjdHJsLmdldERpc3BsYXlMaW5lKGRpc3BsYXlMaW5lRm9yVHJlZU9yVGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBvcmlnaW5hbCB2YWx1ZSBvZiBwcm9wZXJ0eSB0aGF0IHdhcyBjb21wdXRlZCBiZWZvcmUgZXhlY3V0aW9uIG9mIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0T3JnVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmdWYWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHNpemUgb2YgcHJldnZhbHVlcyBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5TaG91bGRTa2lwUmVmcmVzaCgpKVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNsZWFyIF9wcmV2VmFsdWVzIGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIGNsZWFyUHJldlZhbHVlQXJyYXkoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZXNldFByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgbGV0IGNvdW50OiBudW1iZXIgPSB0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aDtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuQ2xlYXIoKTtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZShjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZSBhbmQgc2V0IGFycmF5cyBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFByZXZBcnJheVNpemUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0gfHwgdGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IHNpemU6IG51bWJlciA9IDE7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgICBsZXQgbWdDb250cm9sQmFzZTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICAgIGlmIChtZ0NvbnRyb2xCYXNlLklzUmVwZWF0YWJsZSlcclxuICAgICAgICAgIHNpemUgPSBtZ0NvbnRyb2xCYXNlLmdldEZvcm0oKS5nZXRUYWJsZUl0ZW1zQ291bnQoKTtcclxuICAgICAgICBlbHNlIGlmIChtZ0NvbnRyb2xCYXNlLmlzVGFibGVDb250cm9sKCkgJiYgUHJvcGVydHkuaXNSZXBlYXRhYmxlSW5UYWJsZSh0aGlzLl9pZCkpXHJcbiAgICAgICAgICBzaXplID0gbWdDb250cm9sQmFzZS5nZXRGb3JtKCkuZ2V0VGFibGVJdGVtc0NvdW50KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZShzaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQYXNzd29yZCBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblBhc3N3b3JkKCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlBhc3N3b3JkLCB0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vblBhc3N3b3JkKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCB1c2VyIHByb3BlcnR5IFRpdGxlUGFkZGluZyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlQ3VzdG9tUHJvcGVydGllc1ZhbHVlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzKSB7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IDI1NTtcclxuICAgICAgbGV0IHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZmFsc2UpO1xyXG4gICAgICBsZXQgZXhwcmVzc2lvbiA9IGN1c3RvbVByb3BlcnR5VmFsdWU7XHJcbiAgICAgIC8vIGluaXQgdGhlIHZhbHVlXHJcbiAgICAgIGxldCByZXRFeHByZXNzaW9uVmFsdWUgPSBhd2FpdCB0aGlzLkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMuc2V0KGN1c3RvbVByb3BlcnR5S2V5LCByZXRFeHByZXNzaW9uVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb21wdXRlIGN1c3RvbSB2YWxpZGF0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGNvbXB1dGVDdXN0b21WYWxpZGF0b3JzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1nQ29udHJvbCA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuX3BhcmVudE9iajtcclxuICAgIGlmIChtZ0NvbnRyb2wuTW9kaWZpZWRCeVVzZXIgfHwgbWdDb250cm9sLlZhbGlkYXRlQ29udHJvbCB8fCB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpLklzSW5SZWNvbXB1dGUoKSl7XHJcbiAgICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tVmFsaWRhdG9yUHJvcGVydHldIG9mIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcykge1xyXG4gICAgICAgIGxldCBsZW46IG51bWJlciA9IDI1NTtcclxuICAgICAgICBsZXQgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gPSAoPEN1c3RvbVZhbGlkYXRvclByb3A+Y3VzdG9tVmFsaWRhdG9yUHJvcGVydHkpLl9leHA7XHJcbiAgICAgICAgLy8gaW5pdCB0aGUgdmFsdWVcclxuICAgICAgICBsZXQgaXNJblZhbGlkID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgICBsZXQgZXJyU3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgSW5WYWxpZCA9IChpc0luVmFsaWQgPT09IFwiMVwiKSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICBpZiAoSW5WYWxpZCkge1xyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9ICg8Q3VzdG9tVmFsaWRhdG9yUHJvcD5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0eSkuX2Vycm9yTWVzc2FnZUV4cDtcclxuICAgICAgICAgIGlmIChleHByZXNzaW9uID4gMClcclxuICAgICAgICAgICAgZXJyU3RyaW5nID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZXJyU3RyaW5nID0gKDxDdXN0b21WYWxpZGF0b3JQcm9wPmN1c3RvbVZhbGlkYXRvclByb3BlcnR5KS5fZXJyb3JNZXNzYWdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXN0b21WYWxpZGF0b3JWYWx1ZXMuc2V0KGN1c3RvbVByb3BlcnR5S2V5LCBuZXcgQ3VzdG9tVmFsaWRhdG9yKCFJblZhbGlkLCBlcnJTdHJpbmcpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgdXNlciBwcm9wZXJ0eSBUaXRsZVBhZGRpbmcgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25DdXN0b21Qcm9wZXJ0aWVzKCk6IHZvaWQge1xyXG5cclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzVmFsdWVzKSB7XHJcbiAgICAgIC8vIHVzZSB0aGlzLl9wYXJlbnRPYmogYW5kIG5vdCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuUFJPUF9TRVRfVVNFUl9QUk9QRVJUWSwgdGhpcy5fcGFyZW50T2JqLCB0aGlzLmdldExpbmUoKSwgY3VzdG9tUHJvcGVydHlLZXksIGN1c3RvbVByb3BlcnR5VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0IGN1c3RvbSB2YWxpZGF0b3JzIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uQ3VzdG9tVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21WYWxpZGF0b3JWYWx1ZXMpIHtcclxuXHJcbiAgICAgIC8vIHVzZSB0aGlzLl9wYXJlbnRPYmogYW5kIG5vdCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuUFJPUF9TRVRfQ1VTVE9NX1ZBTElEQVRPUiwgdGhpcy5fcGFyZW50T2JqLCB0aGlzLmdldExpbmUoKSxcclxuICAgICAgICBjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCBCaW5kaW5nIExldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uQmluZGluZ0xldmVsKClcclxuICB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLkJpbmRpbmdMZXZlbCwgdGhpcy5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpKTtcclxuICAgIGVsc2VcclxuICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LkJpbmRpbmdMZXZlbCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkF1dG9Db21wbGV0ZU1vZGUoKVxyXG4gIHtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBHZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gMjU1O1xyXG4gICAgbGV0IGV4cFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl9wYXJlbnRPYmouR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwcmVzc2lvbik7XHJcbiAgICBsZXQgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBhd2FpdCB0aGlzLl9wYXJlbnRPYmouRXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbiwgdHJ1ZSwgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQLCBmYWxzZSwgd2FzRXZhbHVhdGVkKTtcclxuXHJcbiAgICBleHBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5fcGFyZW50T2JqLkdldEV4cHJlc3Npb25TdG9yYWdlKGV4cHJlc3Npb24pO1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgc3dpdGNoIChleHBTdG9yYWdlQXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIGxldCB0ZW1wUGljID0gbmV3IFBJQyhcIk42LjJcIiwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCB0aGlzLl9wYXJlbnRPYmouZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgIHJldHVyblZhbHVlID0gXCJGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIGZhbHNlLCBjb21wSWR4LCBmYWxzZSkudHJpbSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgdGVtcFBpYyA9IG5ldyBQSUMoXCIjIy8jIy8jIyMjXCIsIGV4cFN0b3JhZ2VBdHRyaWJ1dGUsIGNvbXBJZHgpO1xyXG4gICAgICAgIHJldHVyblZhbHVlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKHJldHVyblZhbHVlLCBcIlwiLCB0ZW1wUGljLCB0cnVlLCBmYWxzZSwgY29tcElkeCwgdHJ1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICB0ZW1wUGljID0gbmV3IFBJQyhcIiMjOiMjLyMjIyNcIiwgZXhwU3RvcmFnZUF0dHJpYnV0ZSwgY29tcElkeCk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIHRydWUsIGZhbHNlLCBjb21wSWR4LCB0cnVlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5PTkU6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKCkgaWxsZWdhbCBkYXRhIHR5cGU6IFwiICsgZXhwU3RvcmFnZUF0dHJpYnV0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgUmVtb3ZlUHJldlZhbEluZGV4QXQoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aCA+IGlkeCkge1xyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLlJlbW92ZUF0KGlkeCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZHhcIj48L3BhcmFtPlxyXG4gIEluc2VydFByZXZWYWxBdChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnQoaWR4LCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgcmVzZXRQcmV2VmFsQXQoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCB0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aClcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShpZHgsIG51bGwpO1xyXG4gIH1cclxuXHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCJ7MH0gPSB7MX0gKGV4cD17Mn0sIHN0dWRpbyB2YWx1ZT17M30pXCIsIFtcclxuICAgICAgUHJvcERlZmF1bHRzLkdldFByb3BlcnR5TmFtZSh0aGlzLl9pZCksICh0aGlzLl92YWwgPT09IG51bGwpID8gXCJpcyBudWxsXCIgOiB0aGlzLl92YWwsIHRoaXMuX2V4cElkLCB0aGlzLlN0dWRpb1ZhbHVlXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0RGVmYXVsdFByb3AoKSByZXR1cm5zIGEgcHJvcGVydHkgdGhhdCBoYXMgYSBzeXN0ZW0gZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+VGhlIHByb3BlcnR5IGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFR5cGVcIj5QQVJFTlRfVFlQRV9DT05UUk9MLCBQQVJFTlRfVFlQRV9GT1JNLCBQQVJFTlRfVFlQRV9UQVNLPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BQYXJlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gUHJvcGVydHkgdGhhdCBoYXMgYSBzeXN0ZW0gZGVmYXVsdCB2YWx1ZTwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0RGVmYXVsdFByb3AocHJvcElkOiBudW1iZXIsIHBhcmVudFR5cGU6IHN0cmluZywgcHJvcFBhcmVudDogUHJvcFBhcmVudEludGVyZmFjZSk6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZyA9IFByb3BEZWZhdWx0cy5nZXREZWZhdWx0VmFsdWUocHJvcElkLCBwYXJlbnRUeXBlLCBwcm9wUGFyZW50KTtcclxuXHJcbiAgICBpZiAobWdWYWwgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSBuZXcgUHJvcGVydHkocHJvcElkLCBwcm9wUGFyZW50LCBwYXJlbnRUeXBlLCBtZ1ZhbCk7XHJcblxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICBJbnNlcnRQcmV2VmFsdWVBcnJheShpZHg6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLlNob3VsZFNraXBSZWZyZXNoKCkpXHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuSW5zZXJ0UmFuZ2UoaWR4LCBuZXcgQXJyYXkoY291bnQpKTtcclxuICB9XHJcbn1cclxuIl19
|