@magic-xpa/gui 4.801.0-dev481.245 → 4.801.0-dev481.253

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
  3. package/esm2020/src/Commands.mjs +186 -0
  4. package/{esm2015/src/Events.js → esm2020/src/Events.mjs} +0 -0
  5. package/{esm2015/src/EventsProcessor.js → esm2020/src/EventsProcessor.mjs} +0 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
  8. package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +0 -0
  9. package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
  10. package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +1 -0
  11. package/esm2020/src/Manager.mjs +192 -0
  12. package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
  13. package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +1 -0
  14. package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
  15. package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
  16. package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
  17. package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
  18. package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
  19. package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
  20. package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
  21. package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
  22. package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
  23. package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
  24. package/{esm2015/src/gui/low/GuiInteractive.js → esm2020/src/gui/low/GuiInteractive.mjs} +0 -0
  25. package/{esm2015/src/gui/low/Style.js → esm2020/src/gui/low/Style.mjs} +0 -0
  26. package/{esm2015/src/management/RuntimeContextBase.js → esm2020/src/management/RuntimeContextBase.mjs} +0 -0
  27. package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
  28. package/{esm2015/src/management/data/DcValues.js → esm2020/src/management/data/DcValues.mjs} +0 -0
  29. package/{esm2015/src/management/data/DcValuesBuilderBase.js → esm2020/src/management/data/DcValuesBuilderBase.mjs} +0 -0
  30. package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
  31. package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
  32. package/{esm2015/src/management/data/GuiDataViewBase.js → esm2020/src/management/data/GuiDataViewBase.mjs} +0 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
  35. package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
  36. package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
  37. package/{esm2015/src/management/data/ObjectReferenceBase.js → esm2020/src/management/data/ObjectReferenceBase.mjs} +0 -0
  38. package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
  39. package/{esm2015/src/management/data/RecordUtils.js → esm2020/src/management/data/RecordUtils.mjs} +0 -0
  40. package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
  41. package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
  42. package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
  43. package/{esm2015/src/management/events/IGuiEventsManager.js → esm2020/src/management/events/IGuiEventsManager.mjs} +1 -0
  44. package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
  45. package/{esm2015/src/management/exp/GuiExpressionEvaluator.js → esm2020/src/management/exp/GuiExpressionEvaluator.mjs} +0 -0
  46. package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
  47. package/{esm2015/src/management/gui/DisplayConvertor.js → esm2020/src/management/gui/DisplayConvertor.mjs} +0 -0
  48. package/{esm2015/src/management/gui/FieldValidator.js → esm2020/src/management/gui/FieldValidator.mjs} +0 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
  51. package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
  52. package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
  55. package/{esm2015/src/management/gui/PIC.js → esm2020/src/management/gui/PIC.mjs} +0 -0
  56. package/{esm2015/src/management/gui/PropDefaults.js → esm2020/src/management/gui/PropDefaults.mjs} +0 -0
  57. package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +0 -0
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1382 -0
  60. package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
  61. package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
  62. package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
  63. package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
  65. package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
  66. package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
  67. package/{esm2015/src/management/tasks/MgTimer.js → esm2020/src/management/tasks/MgTimer.mjs} +0 -0
  68. package/{esm2015/src/management/tasks/TaskDefinitionId.js → esm2020/src/management/tasks/TaskDefinitionId.mjs} +0 -0
  69. package/{esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js → esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs} +0 -0
  70. package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
  71. package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
  72. package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
  73. package/{esm2015/src/util/ProcessLauncher.js → esm2020/src/util/ProcessLauncher.mjs} +0 -0
  74. package/{esm2015/src/util/UsernamePasswordCredentials.js → esm2020/src/util/UsernamePasswordCredentials.mjs} +0 -0
  75. package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +36 -1
  76. package/fesm2015/magic-xpa-gui.mjs.map +1 -0
  77. package/fesm2020/magic-xpa-gui.mjs +17805 -0
  78. package/fesm2020/magic-xpa-gui.mjs.map +1 -0
  79. package/package.json +22 -9
  80. package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
  81. package/src/management/tasks/GuiTaskBase.d.ts +1 -1
  82. package/bundles/magic-xpa-gui.umd.js +0 -19355
  83. package/bundles/magic-xpa-gui.umd.js.map +0 -1
  84. package/bundles/magic-xpa-gui.umd.min.js +0 -16
  85. package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
  86. package/esm2015/src/Commands.js +0 -189
  87. package/esm2015/src/FocusManager.js +0 -41
  88. package/esm2015/src/Manager.js +0 -197
  89. package/esm2015/src/management/data/GuiFieldBase.js +0 -85
  90. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
  91. package/esm2015/src/management/gui/MgControlBase.js +0 -1978
  92. package/esm2015/src/management/gui/MgFormBase.js +0 -763
  93. package/esm2015/src/management/gui/PropTable.js +0 -224
  94. package/esm2015/src/management/gui/Property.js +0 -1413
  95. package/esm2015/src/management/tasks/GuiTaskBase.js +0 -506
  96. package/fesm2015/magic-xpa-gui.js.map +0 -1
@@ -0,0 +1,221 @@
1
+ import { ApplicationException, Hashtable, List, NNumber, NString } from "@magic-xpa/mscorelib";
2
+ import { Property } from "./Property";
3
+ import { XMLConstants, XmlParser } from "@magic-xpa/utils";
4
+ import { Events } from "../../Events";
5
+ import { PropInterface } from "./PropInterface";
6
+ import { GuiFormPropertyAdapter } from "./GuiFormPropertyAdapter";
7
+ import { GuiControlPropertyAdapter } from "./GuiControlPropertyAdapter";
8
+ export class PropTable {
9
+ constructor(parent_) {
10
+ this._hashTab = null;
11
+ this._props = null;
12
+ this._parent = null;
13
+ if (arguments.length === 0) {
14
+ this.constructor_0();
15
+ return;
16
+ }
17
+ this.constructor_1(parent_);
18
+ }
19
+ constructor_0() {
20
+ this._props = new List();
21
+ this._hashTab = new Hashtable(20);
22
+ }
23
+ constructor_1(parent_) {
24
+ this.constructor_0();
25
+ this._parent = parent_;
26
+ }
27
+ fillData(parentObj, parType, parser) {
28
+ while (this.initInnerObjects(parser.getNextTag(), parentObj, parType, parser)) {
29
+ }
30
+ }
31
+ fillDataByExists(task, parser) {
32
+ while (this.fillExistInnerObjects(parser.getNextTag(), task, parser)) {
33
+ }
34
+ }
35
+ initInnerObjects(foundTagName, parentObj, parType, parser) {
36
+ if (foundTagName !== null && foundTagName === XMLConstants.MG_TAG_PROP) {
37
+ let property = new Property();
38
+ property.fillData(parentObj, parType, parser);
39
+ this.addProp(property);
40
+ }
41
+ else
42
+ return false;
43
+ return true;
44
+ }
45
+ addProp(prop) {
46
+ this._hashTab.set_Item(prop.getID(), prop);
47
+ this._props.push(prop);
48
+ }
49
+ delPropById(id) {
50
+ if (this._props === null)
51
+ return;
52
+ let existingProp = this._hashTab.get_Item(id);
53
+ if (existingProp !== null) {
54
+ this._props.Remove(existingProp);
55
+ this._hashTab.Remove(id);
56
+ }
57
+ }
58
+ fillExistInnerObjects(nameOfFound, task, parser) {
59
+ let tokensVector = new List();
60
+ let endContext = -1;
61
+ if (nameOfFound == null)
62
+ return false;
63
+ if (nameOfFound === XMLConstants.MG_TAG_CONTROL)
64
+ endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
65
+ else if (nameOfFound === XMLConstants.MG_TAG_PROP)
66
+ endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
67
+ else if (nameOfFound === ('/' + XMLConstants.MG_TAG_CONTROL) ||
68
+ GuiFormPropertyAdapter.IsEndFormTag(nameOfFound)) {
69
+ parser.setCurrIndex2EndOfTag();
70
+ return false;
71
+ }
72
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
73
+ let tag = parser.getXMLsubstring(endContext);
74
+ parser.add2CurrIndex(tag.indexOf(nameOfFound) + nameOfFound.length);
75
+ tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
76
+ if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
77
+ this._parent = task.getCtrl(NNumber.Parse(this.fillName(tokensVector)));
78
+ parser.setCurrIndex(++endContext);
79
+ return true;
80
+ }
81
+ else if (nameOfFound === XMLConstants.MG_TAG_PROP) {
82
+ if (this._parent != null) {
83
+ let strPropId = this.fillName(tokensVector);
84
+ let propId = NNumber.Parse(strPropId);
85
+ let prop = null;
86
+ if (this._parent != null)
87
+ prop = this._parent.getProp(propId);
88
+ if (prop == null)
89
+ Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() no property with id={0}", strPropId));
90
+ else
91
+ this.addProp(prop);
92
+ parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
93
+ return true;
94
+ }
95
+ else
96
+ Events.WriteExceptionToLog("in PropTable.fillExistInnerObjects() missing control");
97
+ }
98
+ else {
99
+ Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() illegal tag name: {0}", nameOfFound));
100
+ parser.setCurrIndex(++endContext);
101
+ return true;
102
+ }
103
+ }
104
+ if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
105
+ parser.setCurrIndex(++endContext);
106
+ return true;
107
+ }
108
+ else if (GuiFormPropertyAdapter.IsFormTag(nameOfFound)) {
109
+ this._parent = task.getForm();
110
+ this._parent.fillName(nameOfFound);
111
+ return true;
112
+ }
113
+ else if (nameOfFound === ('/' + XMLConstants.MG_TAG_FLD))
114
+ return false;
115
+ parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
116
+ return true;
117
+ }
118
+ fillName(tokensVector) {
119
+ let attribute = null;
120
+ let valueStr;
121
+ for (let j = 0; j < tokensVector.length; j = j + 2) {
122
+ attribute = tokensVector.get_Item(j);
123
+ valueStr = tokensVector.get_Item(j + 1);
124
+ if (attribute === XMLConstants.MG_ATTR_DITIDX || attribute === XMLConstants.MG_ATTR_ID)
125
+ return valueStr;
126
+ }
127
+ Events.WriteExceptionToLog(NString.Format("Unrecognized attribute: '{0}'", attribute));
128
+ return null;
129
+ }
130
+ getSize() {
131
+ return this._props.length;
132
+ }
133
+ getProp(idx) {
134
+ if (idx < 0 || idx >= this._props.length)
135
+ return null;
136
+ return this._props.get_Item(idx);
137
+ }
138
+ getPropById(id) {
139
+ return this._hashTab.get_Item(id);
140
+ }
141
+ propExists(id) {
142
+ return this.getPropById(id) !== null;
143
+ }
144
+ setProp(propId, val, parent, parentType) {
145
+ let prop = this.getPropById(propId);
146
+ if (prop === null) {
147
+ prop = new Property(propId, parent, parentType);
148
+ this.addProp(prop);
149
+ }
150
+ prop.setValue(val);
151
+ prop.setOrgValue();
152
+ }
153
+ async RefreshDisplay(forceRefresh, onlyRepeatableProps) {
154
+ let allPropsRefreshed = true;
155
+ let prop;
156
+ let i = 0;
157
+ let form = null;
158
+ let visibleProps = new List();
159
+ if (this._parent != null && this._parent instanceof GuiControlPropertyAdapter)
160
+ form = this._parent.getForm();
161
+ if (form != null)
162
+ form.checkAndCreateRow(form.DisplayLine);
163
+ for (i = 0; i < this.getSize(); i++) {
164
+ prop = this.getProp(i);
165
+ try {
166
+ if (onlyRepeatableProps && !Property.isRepeatableInTable())
167
+ continue;
168
+ if (prop.getID() === PropInterface.PROP_TYPE_VISIBLE)
169
+ visibleProps.push(prop);
170
+ else
171
+ await prop.RefreshDisplay(forceRefresh);
172
+ }
173
+ catch (ex) {
174
+ if (ex instanceof ApplicationException) {
175
+ Events.WriteExceptionToLog(ex);
176
+ allPropsRefreshed = false;
177
+ }
178
+ else
179
+ throw ex;
180
+ }
181
+ }
182
+ for (let i = 0; i < visibleProps.length; i++) {
183
+ let visibleProp = visibleProps[i];
184
+ await visibleProp.RefreshDisplay(forceRefresh);
185
+ }
186
+ return allPropsRefreshed;
187
+ }
188
+ updatePrevValueArray(newSize) {
189
+ for (let i = 0; i < this._props.length; i = i + 1) {
190
+ let property = this._props.get_Item(i);
191
+ property.updatePrevValueArray(newSize);
192
+ }
193
+ }
194
+ resetPrevValueArray() {
195
+ for (let i = 0; i < this._props.length; i = i + 1) {
196
+ let property = this._props.get_Item(i);
197
+ property.ResetPrevValueArray();
198
+ }
199
+ }
200
+ resetPrevValAt(index) {
201
+ for (let i = 0; i < this._props.length; i = i + 1) {
202
+ let property = this._props.get_Item(i);
203
+ property.resetPrevValAt(index);
204
+ }
205
+ }
206
+ clearLabelPrevValueArray() {
207
+ let labelProperty = this.getPropById(45);
208
+ if (labelProperty !== null)
209
+ labelProperty.clearPrevValueArray();
210
+ }
211
+ getCtrlRef() {
212
+ return ((this._parent instanceof GuiControlPropertyAdapter) ? this._parent : null);
213
+ }
214
+ InsertPrevValueArray(count) {
215
+ for (let i = 0; i < this._props.length; i++) {
216
+ let prop = this._props[i];
217
+ prop.InsertPrevValueArray(count);
218
+ }
219
+ }
220
+ }
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9Qcm9wVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsT0FBTyxFQUFDLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUt0RSxNQUFNLE9BQU8sU0FBUztJQVlwQixZQUFZLE9BQTZCO1FBVmpDLGFBQVEsR0FBZ0MsSUFBSSxDQUFDO1FBQzdDLFdBQU0sR0FBbUIsSUFBSSxDQUFDO1FBQzlCLFlBQU8sR0FBd0IsSUFBSSxDQUFDO1FBVTFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBWSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxTQUFTLENBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxhQUFhLENBQUMsT0FBNEI7UUFDaEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFNRCxRQUFRLENBQUMsU0FBOEIsRUFBRSxPQUFlLEVBQUUsTUFBaUI7UUFDekUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUU7U0FDOUU7SUFDSCxDQUFDO0lBTUQsZ0JBQWdCLENBQUMsSUFBaUIsRUFBRSxNQUFpQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1NBQ3JFO0lBQ0gsQ0FBQztJQVFPLGdCQUFnQixDQUFDLFlBQW9CLEVBQUUsU0FBOEIsRUFBRSxPQUFlLEVBQUUsTUFBaUI7UUFDL0csSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsV0FBVyxFQUFFO1lBQ3RFLElBQUksUUFBUSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7WUFDeEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEI7O1lBRUMsT0FBTyxLQUFLLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNRCxPQUFPLENBQUMsSUFBYztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUdELFdBQVcsQ0FBQyxFQUFVO1FBQ3BCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJO1lBQ3RCLE9BQU87UUFFVCxJQUFJLFlBQVksR0FBdUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBRTFCO0lBQ0gsQ0FBQztJQU1PLHFCQUFxQixDQUFDLFdBQW1CLEVBQUUsSUFBaUIsRUFBRSxNQUFpQjtRQUVyRixJQUFJLFlBQVksR0FBaUIsSUFBSSxJQUFJLEVBQVUsQ0FBQztRQUNwRCxJQUFJLFVBQVUsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUU1QixJQUFJLFdBQVcsSUFBSSxJQUFJO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxXQUFXLEtBQUssWUFBWSxDQUFDLGNBQWM7WUFDN0MsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQzthQUNyRixJQUFJLFdBQVcsS0FBSyxZQUFZLENBQUMsV0FBVztZQUMvQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2FBQ3BGLElBQUksV0FBVyxLQUFLLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFDMUQsc0JBQXNCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2xELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUVoRSxJQUFJLEdBQUcsR0FBVyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEUsWUFBWSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEcsSUFBSSxXQUFXLEtBQUssWUFBWSxDQUFDLGNBQWMsRUFBRTtnQkFFL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFDSSxJQUFJLFdBQVcsS0FBSyxZQUFZLENBQUMsV0FBVyxFQUFFO2dCQUNqRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO29CQUN4QixJQUFJLFNBQVMsR0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNwRCxJQUFJLE1BQU0sR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM5QyxJQUFJLElBQUksR0FBYSxJQUFJLENBQUM7b0JBRTFCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJO3dCQUN0QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRXRDLElBQUksSUFBSSxJQUFJLElBQUk7d0JBQ2QsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsOERBQThELEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQzs7d0JBRXRILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQy9ELE9BQU8sSUFBSSxDQUFDO2lCQUNiOztvQkFFQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsc0RBQXNELENBQUMsQ0FBQzthQUN0RjtpQkFDSTtnQkFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyw0REFBNEQsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN0SCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUVELElBQUksV0FBVyxLQUFLLFlBQVksQ0FBQyxjQUFjLEVBQUU7WUFDL0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFDSSxJQUFJLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN0RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNBLElBQUksQ0FBQyxPQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWxFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFDSSxJQUFJLFdBQVcsS0FBSyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ3RELE9BQU8sS0FBSyxDQUFDO1FBRWYsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQztJQUdkLENBQUM7SUFNTyxRQUFRLENBQUMsWUFBMEI7UUFDekMsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDO1FBQzdCLElBQUksUUFBZ0IsQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMxRCxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFeEMsSUFBSSxTQUFTLEtBQUssWUFBWSxDQUFDLGNBQWMsSUFBSSxTQUFTLEtBQUssWUFBWSxDQUFDLFVBQVU7Z0JBQ3BGLE9BQU8sUUFBUSxDQUFDO1NBQ25CO1FBQ0QsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsK0JBQStCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBT0QsT0FBTyxDQUFDLEdBQVc7UUFDakIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFNRCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFpQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBU0QsT0FBTyxDQUFDLE1BQWMsRUFBRSxHQUFXLEVBQUUsTUFBMkIsRUFBRSxVQUFrQjtRQUVsRixJQUFJLElBQUksR0FBYSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQU9ELEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBcUIsRUFBRSxtQkFBNEI7UUFFdEUsSUFBSSxpQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDdEMsSUFBSSxJQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDLEdBQVcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksSUFBSSxHQUEyQixJQUFJLENBQUM7UUFDeEMsSUFBSSxZQUFZLEdBQW1CLElBQUksSUFBSSxFQUFFLENBQUM7UUFHOUMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLHlCQUF5QjtZQUMzRSxJQUFJLEdBQStCLElBQUksQ0FBQyxPQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFN0QsSUFBSSxJQUFJLElBQUksSUFBSTtZQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFHM0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSTtnQkFHRixJQUFJLG1CQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFO29CQUN4RCxTQUFTO2dCQUtYLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLGFBQWEsQ0FBQyxpQkFBaUI7b0JBQ2xELFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O29CQUV4QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDM0M7WUFDRCxPQUFPLEVBQUUsRUFBRTtnQkFDVCxJQUFJLEVBQUUsWUFBWSxvQkFBb0IsRUFBRTtvQkFDdEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMvQixpQkFBaUIsR0FBRyxLQUFLLENBQUM7aUJBQzNCOztvQkFFQyxNQUFPLEVBQUUsQ0FBQzthQUViO1NBQ0Y7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDNUM7WUFDRSxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBTUQsb0JBQW9CLENBQUMsT0FBZTtRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekQsSUFBSSxRQUFRLEdBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUtELG1CQUFtQjtRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekQsSUFBSSxRQUFRLEdBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBS0QsY0FBYyxDQUFDLEtBQWE7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pELElBQUksUUFBUSxHQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBS0Qsd0JBQXdCO1FBQ3RCLElBQUksYUFBYSxHQUFhLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxhQUFhLEtBQUssSUFBSTtZQUN4QixhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBTUQsVUFBVTtRQUNSLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLFlBQVkseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQTRCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFTSxvQkFBb0IsQ0FBRSxLQUFhO1FBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuRCxJQUFJLElBQUksR0FBYSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIEhhc2h0YWJsZSwgTGlzdCwgTk51bWJlciwgTlN0cmluZ30gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gXCIuL1Byb3BlcnR5XCI7XHJcbmltcG9ydCB7UHJvcFBhcmVudEludGVyZmFjZX0gZnJvbSBcIi4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7WE1MQ29uc3RhbnRzLCBYbWxQYXJzZXJ9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gXCIuLi90YXNrcy9HdWlUYXNrQmFzZVwiO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSBcIi4uLy4uL0V2ZW50c1wiO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gXCIuL1Byb3BJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtHdWlGb3JtUHJvcGVydHlBZGFwdGVyfSBmcm9tIFwiLi9HdWlGb3JtUHJvcGVydHlBZGFwdGVyXCI7XHJcbmltcG9ydCB7R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcn0gZnJvbSBcIi4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlclwiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBwcm9wZXJ0aWVzIHRhYmxlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBQcm9wVGFibGUge1xyXG5cclxuICBwcml2YXRlIF9oYXNoVGFiOiBIYXNodGFibGU8bnVtYmVyLCBQcm9wZXJ0eT4gPSBudWxsOyAvLyBmb3IgZmFzdCBhY2Nlc3MgdG8gcHJvcGVydGllc1xyXG4gIHByaXZhdGUgX3Byb3BzOiBMaXN0PFByb3BlcnR5PiA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudF86IFByb3BQYXJlbnRJbnRlcmZhY2UpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudF8/OiBQcm9wUGFyZW50SW50ZXJmYWNlKSB7XHJcblxyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMShwYXJlbnRfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb3BzID0gbmV3IExpc3Q8UHJvcGVydHk+KCk7XHJcbiAgICB0aGlzLl9oYXNoVGFiID0gbmV3IEhhc2h0YWJsZTxudW1iZXIsIFByb3BlcnR5PigyMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEocGFyZW50XzogUHJvcFBhcmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRfO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudE9ialwiPnJlZmVyZW5jZSB0byBwYXJlbnQgb2JqZWN0KEd1aVRhc2tCYXNlKTwvcGFyYW0+XHJcbiAgZmlsbERhdGEocGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudE9iaiwgcGFyVHlwZSwgcGFyc2VyKSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZvciByZWNvbXB1dGU6IFBhcnNlIHRoZSBleGlzdGluZyBwcm9wZXJ0aWVzIGFuZCBjcmVhdGUgcmVmZXJlbmNlcyB0byB0aGVtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBHdWlUYXNrQmFzZTwvcGFyYW0+XHJcbiAgZmlsbERhdGFCeUV4aXN0cyh0YXNrOiBHdWlUYXNrQmFzZSwgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHdoaWxlICh0aGlzLmZpbGxFeGlzdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCB0YXNrLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCB0aGUgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+bmFtZSBvZiB0YWcsIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50T2JqXCI+cmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2JqZWN0LCBuZWVkIGJlIGFkZGVkIHRvIGV2ZXJ5IFByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IE1hbmFnZXIuWG1sUGFyc2VyLmdldEN1cnJJbmRleCgpLCB0aGUgZm91bmQgb2JqZWN0IHRhZyBhbmQgQUxMIGl0cyBzdWJ0YWdzIGZpbmlzaDwvcmV0dXJucz5cclxuICBwcml2YXRlIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSAhPT0gbnVsbCAmJiBmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gbmV3IFByb3BlcnR5KCk7XHJcbiAgICAgIHByb3BlcnR5LmZpbGxEYXRhKHBhcmVudE9iaiwgcGFyVHlwZSwgcGFyc2VyKTtcclxuICAgICAgdGhpcy5hZGRQcm9wKHByb3BlcnR5KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkaW5nIHByb3BlcnR5IGJ5IGtleVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wXCI+PC9wYXJhbT5cclxuICBhZGRQcm9wKHByb3A6IFByb3BlcnR5KTogdm9pZCB7XHJcbiAgICB0aGlzLl9oYXNoVGFiLnNldF9JdGVtKHByb3AuZ2V0SUQoKSwgcHJvcCk7XHJcbiAgICB0aGlzLl9wcm9wcy5wdXNoKHByb3ApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPjwvcGFyYW0+XHJcbiAgZGVsUHJvcEJ5SWQoaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3Byb3BzID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGV4aXN0aW5nUHJvcDogUHJvcGVydHkgPSA8UHJvcGVydHk+dGhpcy5faGFzaFRhYi5nZXRfSXRlbShpZCk7XHJcbiAgICBpZiAoZXhpc3RpbmdQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3Byb3BzLlJlbW92ZShleGlzdGluZ1Byb3ApO1xyXG4gICAgICB0aGlzLl9oYXNoVGFiLlJlbW92ZShpZCk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZvciBSZWNvbXB1dGU6IEZpbGwgUHJvcFRhYmxlIHdpdGggcmVmZXJlbmNlIHRvIGV4aXN0aW5nIFByb3BUYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+cmVmZXJlbmNlIHRvIHBhcmVudCBHdWlUYXNrQmFzZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBmaWxsRXhpc3RJbm5lck9iamVjdHMobmFtZU9mRm91bmQ6IHN0cmluZywgdGFzazogR3VpVGFza0Jhc2UsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIGlmIChuYW1lT2ZGb3VuZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpXHJcbiAgICAgIGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGVsc2UgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApXHJcbiAgICAgIGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09ICgnLycgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHx8XHJcbiAgICAgIEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIuSXNFbmRGb3JtVGFnKG5hbWVPZkZvdW5kKSkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihuYW1lT2ZGb3VuZCkgKyBuYW1lT2ZGb3VuZC5sZW5ndGgpO1xyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB7XHJcbiAgICAgICAgLy8gZGl0aWR4IG9mIEV4aXN0cyBDb250cm9sXHJcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gdGFzay5nZXRDdHJsKE5OdW1iZXIuUGFyc2UodGhpcy5maWxsTmFtZSh0b2tlbnNWZWN0b3IpKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpOyAvLyB0byBkZWxldGUgXCI+XCJcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgc3RyUHJvcElkOiBzdHJpbmcgPSB0aGlzLmZpbGxOYW1lKHRva2Vuc1ZlY3Rvcik7XHJcbiAgICAgICAgICBsZXQgcHJvcElkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHN0clByb3BJZCk7XHJcbiAgICAgICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT0gbnVsbClcclxuICAgICAgICAgICAgcHJvcCA9IHRoaXMuX3BhcmVudC5nZXRQcm9wKHByb3BJZCk7XHJcblxyXG4gICAgICAgICAgaWYgKHByb3AgPT0gbnVsbClcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBQcm9wVGFibGUuZmlsbEV4aXN0SW5uZXJPYmplY3RzKCkgbm8gcHJvcGVydHkgd2l0aCBpZD17MH1cIiwgc3RyUHJvcElkKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuYWRkUHJvcChwcm9wKTtcclxuICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gUHJvcFRhYmxlLmZpbGxFeGlzdElubmVyT2JqZWN0cygpIG1pc3NpbmcgY29udHJvbFwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BUYWJsZS5maWxsRXhpc3RJbm5lck9iamVjdHMoKSBpbGxlZ2FsIHRhZyBuYW1lOiB7MH1cIiwgbmFtZU9mRm91bmQpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoR3VpRm9ybVByb3BlcnR5QWRhcHRlci5Jc0Zvcm1UYWcobmFtZU9mRm91bmQpKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudCA9IHRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAoPEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnQpLmZpbGxOYW1lKG5hbWVPZkZvdW5kKTtcclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09ICgnLycgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTsgLy8gZXhpdCBvZiBib3VuZHNcclxuICAgIHJldHVybiB0cnVlO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmluZCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBDb250cm9sLCBvciBvZiBhbiBleGlzdGluZyBQcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBOYW1lIG9mIGNvbnRyb2w8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmaWxsTmFtZSh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IHZhbHVlU3RyOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuXHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0RJVElEWCB8fCBhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lEKVxyXG4gICAgICAgIHJldHVybiB2YWx1ZVN0cjtcclxuICAgIH1cclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgc2l6ZSBvZiB0aGUgdmVjdG9yIHByb3BzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHNpemUgb2YgdGhlIHByb3BzIG1lbWJlcjwvcmV0dXJucz5cclxuICBnZXRTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvcHMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIFByb3BlcnR5IGJ5IGl0cyBpbmRleCBpbiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGluZGV4IG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiByZWZlcmVuY2UgdG8gdGhlIHJlcXVpcmVkIFByb3BlcnR5PC9yZXR1cm5zPlxyXG4gIGdldFByb3AoaWR4OiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5fcHJvcHMubGVuZ3RoKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wcy5nZXRfSXRlbShpZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIFByb3BlcnR5IGJ5IGl0cyBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPm9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgZ2V0UHJvcEJ5SWQoaWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIHJldHVybiA8UHJvcGVydHk+dGhpcy5faGFzaFRhYi5nZXRfSXRlbShpZCk7XHJcbiAgfVxyXG5cclxuICBwcm9wRXhpc3RzKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BCeUlkKGlkKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSBwcm9wZXJ0eSB2YWx1ZS4gaW4gY2FzZSB0aGUgdGFibGUgZG9lc24ndCBjb250YWluIHN1Y2ggcHJvcGVydHksIGNyZWF0ZXMgYSBuZXcgUHJvcGVydHkgb2JqZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHRhYmxlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50XCI+YSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3Q8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50VHlwZVwiPnRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgb2JqZWN0PC9wYXJhbT5cclxuICBzZXRQcm9wKHByb3BJZDogbnVtYmVyLCB2YWw6IHN0cmluZywgcGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJlbnRUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICBwcm9wID0gbmV3IFByb3BlcnR5KHByb3BJZCwgcGFyZW50LCBwYXJlbnRUeXBlKTtcclxuICAgICAgdGhpcy5hZGRQcm9wKHByb3ApO1xyXG4gICAgfVxyXG4gICAgcHJvcC5zZXRWYWx1ZSh2YWwpO1xyXG4gICAgcHJvcC5zZXRPcmdWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggZGlzcGxheSBvZiB0aGUgcHJvcGVydGllcyBpbiB0aGUgVGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VSZWZyZXNoXCI+aWYgdHJ1ZSwgcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25seVJlcGVhdGFibGVQcm9wc1wiPmlmIHRydWUsIHJlZnJlc2hlcyBvbmx5IHJlcGVhdGFibGUgdHJlZSBwcm9wZXJ0aWVzPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2g6IGJvb2xlYW4sIG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBsZXQgYWxsUHJvcHNSZWZyZXNoZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZm9ybTogR3VpRm9ybVByb3BlcnR5QWRhcHRlciA9IG51bGw7XHJcbiAgICBsZXQgdmlzaWJsZVByb3BzOiBMaXN0PFByb3BlcnR5PiA9IG5ldyBMaXN0KCk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnQgIT0gbnVsbCAmJiB0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKVxyXG4gICAgICBmb3JtID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudCkuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgIGZvcm0uY2hlY2tBbmRDcmVhdGVSb3coZm9ybS5EaXNwbGF5TGluZSk7XHJcblxyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLmdldFByb3AoaSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcmVwZWF0YWJsZSBpbiB0cmVlIG9yIHRhYmxlLCBhbmQgb25seVJlcGVhdGFibGVQcm9wcyB0dXJuZWQgb25cclxuICAgICAgICAvLyBkbyBub3QgcmVmcmVzaCB0aGlzIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKG9ubHlSZXBlYXRhYmxlUHJvcHMgJiYgIVByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUoKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyBSZWZyZXNoIFZpc2libGUgcHJvcCBvbmx5IGFmdGVyIHJlZnJlc2hpbmcgdGhlIG5hdmlnYXRpb24gcHJvcHMgbGlrZSBYLCBZLlxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGNvbnRyb2wgaXMgc2hvd24gb24gaXRzIGRlZmF1bHQgbG9jYXRpb24gZmlyc3QgYW5kXHJcbiAgICAgICAgLy8gdGhlbiBtb3ZlZCBzb21ld2hlcmUgZWxzZS4gQW5kIHRoaXMgaXMgY2xlYXJseSB2aXNpYmxlLlxyXG4gICAgICAgIGlmIChwcm9wLmdldElEKCkgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpXHJcbiAgICAgICAgICB2aXNpYmxlUHJvcHMucHVzaChwcm9wKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCBwcm9wLlJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaCk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIGFsbFByb3BzUmVmcmVzaGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93ICBleDtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVQcm9wcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgbGV0IHZpc2libGVQcm9wID0gdmlzaWJsZVByb3BzW2ldO1xyXG4gICAgICBhd2FpdCB2aXNpYmxlUHJvcC5SZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2gpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbGxQcm9wc1JlZnJlc2hlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgYWxsIHByb3BlcnRpZXMgYXJyYXkgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYWxsIHByb3BlcnRpZXMgYXJyYXkgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsdWVBcnJheSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LlJlc2V0UHJldlZhbHVlQXJyYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVzZXQgcHJldiB2YWx1ZSBhdCBpbmRleC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0UHJldlZhbEF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LnJlc2V0UHJldlZhbEF0KGluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2xlYXIgcHJldlZhbHVlIGFycmF5IG9mIExhYmVsIHByb3BlcnR5IGlmIGV4aXN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJMYWJlbFByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgbGV0IGxhYmVsUHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wQnlJZCg0NSk7XHJcbiAgICBpZiAobGFiZWxQcm9wZXJ0eSAhPT0gbnVsbClcclxuICAgICAgbGFiZWxQcm9wZXJ0eS5jbGVhclByZXZWYWx1ZUFycmF5KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxSZWYoKTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKSA/IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudCA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEluc2VydFByZXZWYWx1ZUFycmF5KCBjb3VudDogbnVtYmVyKSB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHNbaV07XHJcbiAgICAgIHByb3AuSW5zZXJ0UHJldlZhbHVlQXJyYXkoY291bnQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=