@esotericsoftware/spine-core 4.2.116 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/Animation.d.ts +426 -274
  2. package/dist/Animation.js +1174 -1210
  3. package/dist/AnimationState.d.ts +246 -201
  4. package/dist/AnimationState.js +508 -471
  5. package/dist/AnimationStateData.d.ts +12 -10
  6. package/dist/AnimationStateData.js +19 -20
  7. package/dist/AssetManagerBase.d.ts +27 -21
  8. package/dist/AssetManagerBase.js +67 -43
  9. package/dist/AtlasAttachmentLoader.d.ts +18 -12
  10. package/dist/AtlasAttachmentLoader.js +28 -39
  11. package/dist/Bone.d.ts +15 -109
  12. package/dist/Bone.js +22 -362
  13. package/dist/BoneData.d.ts +13 -28
  14. package/dist/BoneData.js +20 -29
  15. package/dist/BonePose.d.ts +130 -0
  16. package/dist/BonePose.js +426 -0
  17. package/dist/Constraint.d.ts +41 -0
  18. package/dist/Constraint.js +38 -0
  19. package/dist/ConstraintData.d.ts +7 -5
  20. package/dist/ConstraintData.js +5 -9
  21. package/dist/DrawOrder.d.ts +48 -0
  22. package/dist/DrawOrder.js +64 -0
  23. package/dist/Event.d.ts +11 -6
  24. package/dist/Event.js +10 -5
  25. package/dist/EventData.d.ts +10 -6
  26. package/dist/EventData.js +18 -7
  27. package/dist/IkConstraint.d.ts +22 -28
  28. package/dist/IkConstraint.js +115 -117
  29. package/dist/IkConstraintData.d.ts +23 -18
  30. package/dist/IkConstraintData.js +32 -22
  31. package/dist/IkConstraintPose.d.ts +49 -0
  32. package/dist/IkConstraintPose.js +55 -0
  33. package/dist/PathConstraint.d.ts +18 -22
  34. package/dist/PathConstraint.js +160 -136
  35. package/dist/PathConstraintData.d.ts +11 -14
  36. package/dist/PathConstraintData.js +14 -16
  37. package/dist/PathConstraintPose.d.ts +43 -0
  38. package/dist/PathConstraintPose.js +49 -0
  39. package/dist/Physics.d.ts +39 -0
  40. package/dist/Physics.js +41 -0
  41. package/dist/PhysicsConstraint.d.ts +26 -30
  42. package/dist/PhysicsConstraint.js +102 -94
  43. package/dist/PhysicsConstraintData.d.ts +22 -12
  44. package/dist/PhysicsConstraintData.js +23 -12
  45. package/dist/PhysicsConstraintPose.d.ts +47 -0
  46. package/dist/PhysicsConstraintPose.js +55 -0
  47. package/dist/Pose.d.ts +33 -0
  48. package/dist/Pose.js +30 -0
  49. package/dist/Posed.d.ts +58 -0
  50. package/dist/Posed.js +78 -0
  51. package/dist/PosedActive.d.ts +41 -0
  52. package/dist/{attachments/HasTextureRegion.js → PosedActive.js} +17 -2
  53. package/dist/PosedData.d.ts +40 -0
  54. package/dist/PosedData.js +45 -0
  55. package/dist/Skeleton.d.ts +110 -99
  56. package/dist/Skeleton.js +271 -449
  57. package/dist/SkeletonBinary.d.ts +1 -1
  58. package/dist/SkeletonBinary.js +644 -466
  59. package/dist/SkeletonBounds.d.ts +4 -4
  60. package/dist/SkeletonBounds.js +45 -46
  61. package/dist/SkeletonClipping.d.ts +26 -22
  62. package/dist/SkeletonClipping.js +654 -340
  63. package/dist/SkeletonData.d.ts +18 -35
  64. package/dist/SkeletonData.js +57 -97
  65. package/dist/SkeletonJson.d.ts +8 -6
  66. package/dist/SkeletonJson.js +892 -641
  67. package/dist/SkeletonRendererCore.d.ts +58 -0
  68. package/dist/SkeletonRendererCore.js +310 -0
  69. package/dist/Skin.d.ts +20 -16
  70. package/dist/Skin.js +58 -53
  71. package/dist/Slider.d.ts +46 -0
  72. package/dist/Slider.js +115 -0
  73. package/dist/SliderData.d.ts +58 -0
  74. package/dist/SliderData.js +59 -0
  75. package/dist/SliderPose.d.ts +37 -0
  76. package/dist/SliderPose.js +40 -0
  77. package/dist/Slot.d.ts +16 -38
  78. package/dist/Slot.js +37 -60
  79. package/dist/SlotData.d.ts +5 -12
  80. package/dist/SlotData.js +7 -15
  81. package/dist/SlotPose.d.ts +59 -0
  82. package/dist/SlotPose.js +81 -0
  83. package/dist/Texture.d.ts +1 -0
  84. package/dist/Texture.js +2 -1
  85. package/dist/TextureAtlas.d.ts +3 -3
  86. package/dist/TextureAtlas.js +49 -49
  87. package/dist/TransformConstraint.d.ts +16 -28
  88. package/dist/TransformConstraint.js +72 -209
  89. package/dist/TransformConstraintData.d.ts +108 -20
  90. package/dist/TransformConstraintData.js +274 -24
  91. package/dist/TransformConstraintPose.d.ts +45 -0
  92. package/dist/TransformConstraintPose.js +52 -0
  93. package/dist/Triangulator.d.ts +1 -1
  94. package/dist/Triangulator.js +91 -107
  95. package/dist/{Updatable.d.ts → Update.d.ts} +5 -12
  96. package/dist/Update.js +30 -0
  97. package/dist/Utils.d.ts +12 -3
  98. package/dist/Utils.js +78 -37
  99. package/dist/attachments/Attachment.d.ts +27 -19
  100. package/dist/attachments/Attachment.js +59 -35
  101. package/dist/attachments/AttachmentLoader.d.ts +14 -14
  102. package/dist/attachments/AttachmentLoader.js +1 -1
  103. package/dist/attachments/BoundingBoxAttachment.d.ts +1 -1
  104. package/dist/attachments/BoundingBoxAttachment.js +2 -2
  105. package/dist/attachments/ClippingAttachment.d.ts +10 -3
  106. package/dist/attachments/ClippingAttachment.js +12 -3
  107. package/dist/attachments/{HasTextureRegion.d.ts → HasSequence.d.ts} +11 -14
  108. package/dist/attachments/HasSequence.js +30 -0
  109. package/dist/attachments/MeshAttachment.d.ts +28 -35
  110. package/dist/attachments/MeshAttachment.js +85 -97
  111. package/dist/attachments/PathAttachment.d.ts +3 -3
  112. package/dist/attachments/PathAttachment.js +6 -6
  113. package/dist/attachments/PointAttachment.d.ts +11 -6
  114. package/dist/attachments/PointAttachment.js +8 -3
  115. package/dist/attachments/RegionAttachment.d.ts +25 -27
  116. package/dist/attachments/RegionAttachment.js +101 -113
  117. package/dist/attachments/Sequence.d.ts +31 -6
  118. package/dist/attachments/Sequence.js +79 -13
  119. package/dist/esm/spine-core.min.mjs +2 -2
  120. package/dist/esm/spine-core.mjs +7651 -6090
  121. package/dist/esm/spine-core.mjs.map +4 -4
  122. package/dist/iife/spine-core.js +7651 -6090
  123. package/dist/iife/spine-core.js.map +4 -4
  124. package/dist/iife/spine-core.min.js +2 -2
  125. package/dist/index.d.ts +32 -11
  126. package/dist/index.js +33 -12
  127. package/dist/polyfills.js +4 -5
  128. package/package.json +1 -1
  129. package/dist/Updatable.js +0 -30
package/dist/Animation.js CHANGED
@@ -26,164 +26,186 @@
26
26
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
27
  * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
  *****************************************************************************/
29
- import { VertexAttachment } from "./attachments/Attachment.js";
30
- import { StringSet, Utils, MathUtils } from "./Utils.js";
31
29
  import { SequenceMode, SequenceModeValues } from "./attachments/Sequence.js";
32
- /** A simple container for a list of timelines and a name. */
30
+ import { Color, StringSet, Utils } from "./Utils.js";
31
+ /** Stores a list of timelines to animate a skeleton's pose over time.
32
+ *
33
+ * See <a href='https://esotericsoftware.com/spine-applying-animations#Timeline-API'>Applying Animations</a> in the Spine Runtimes
34
+ * Guide. */
33
35
  export class Animation {
34
- /** The animation's name, which is unique across all animations in the skeleton. */
36
+ /** The animation's name, unique across all animations in the skeleton.
37
+ *
38
+ * See {@link SkeletonData.findAnimation}. */
35
39
  name;
40
+ /** The duration of the animation in seconds, which is usually the highest time of all frames in the timelines. The duration is
41
+ * used to know when the animation has completed and, for animations that repeat, when it should loop back to the start. */
36
42
  timelines = [];
37
- timelineIds = new StringSet();
38
- /** The duration of the animation in seconds, which is the highest time of all keys in the timeline. */
43
+ timelineIds;
44
+ /** {@link Skeleton.getBones} indices that this animation's timelines modify.
45
+ *
46
+ * See {@link BoneTimeline.bones}. */
47
+ bones;
48
+ // Nonessential.
49
+ /** The color of the animation as it was in Spine, or a default color if nonessential data was not exported. */
50
+ color = new Color(1, 1, 1, 1);
51
+ /** The duration of the animation in seconds, which is usually the highest time of all frames in the timeline. The duration is
52
+ * used to know when it has completed and when it should loop back to the start. */
39
53
  duration;
40
54
  constructor(name, timelines, duration) {
41
55
  if (!name)
42
56
  throw new Error("name cannot be null.");
43
57
  this.name = name;
44
- this.setTimelines(timelines);
45
58
  this.duration = duration;
59
+ this.timelineIds = new StringSet();
60
+ this.bones = [];
61
+ this.setTimelines(timelines);
46
62
  }
47
63
  setTimelines(timelines) {
48
64
  if (!timelines)
49
65
  throw new Error("timelines cannot be null.");
50
66
  this.timelines = timelines;
67
+ const n = timelines.length;
51
68
  this.timelineIds.clear();
52
- for (var i = 0; i < timelines.length; i++)
53
- this.timelineIds.addAll(timelines[i].getPropertyIds());
69
+ this.bones.length = 0;
70
+ const boneSet = new Set();
71
+ const items = timelines;
72
+ for (let i = 0; i < n; i++) {
73
+ const timeline = items[i];
74
+ this.timelineIds.addAll(timeline.propertyIds);
75
+ if (isBoneTimeline(timeline) && boneSet.add(timeline.boneIndex))
76
+ this.bones.push(timeline.boneIndex);
77
+ }
54
78
  }
79
+ /** Returns true if this animation contains a timeline with any of the specified property IDs.
80
+ *
81
+ * See {@link Timeline.propertyIds}. */
55
82
  hasTimeline(ids) {
56
83
  for (let i = 0; i < ids.length; i++)
57
84
  if (this.timelineIds.contains(ids[i]))
58
85
  return true;
59
86
  return false;
60
87
  }
61
- /** Applies all the animation's timelines to the specified skeleton.
88
+ /** Applies the animation's timelines to the specified skeleton.
62
89
  *
63
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.
64
- * @param loop If true, the animation repeats after {@link #getDuration()}.
65
- * @param events May be null to ignore fired events. */
66
- apply(skeleton, lastTime, time, loop, events, alpha, blend, direction) {
90
+ * See {@link Timeline.apply} and
91
+ * <a href='https://esotericsoftware.com/spine-applying-animations#Timeline-API'>Applying Animations</a> in the Spine Runtimes
92
+ * Guide.
93
+ * @param skeleton The skeleton the animation is applied to. This provides access to the bones, slots, and other skeleton
94
+ * components the timelines may change.
95
+ * @param lastTime The last time in seconds this animation was applied. Some timelines trigger only at discrete times, in which
96
+ * case all keys are triggered between `lastTime` (exclusive) and `time` (inclusive). Pass -1
97
+ * the first time an animation is applied to ensure frame 0 is triggered.
98
+ * @param time The time in seconds the skeleton is being posed for. Timelines find the frame before and after this time and
99
+ * interpolate between the frame values.
100
+ * @param loop True if `time` beyond the {@link duration} repeats the animation, else the last frame is used.
101
+ * @param events If any events are fired, they are added to this list. Pass null to ignore fired events or if no timelines fire
102
+ * events.
103
+ * @param alpha 0 applies setup or current values (depending on `fromSetup`), 1 uses timeline values, and
104
+ * intermediate values interpolate between them. Adjusting `alpha` over time can mix an animation in or
105
+ * out.
106
+ * @param fromSetup If true, `alpha` transitions between setup and timeline values, setup values are used before the
107
+ * first frame (current values are not used). If false, `alpha` transitions between current and timeline
108
+ * values, no change is made before the first frame.
109
+ * @param add If true, for timelines that support it, their values are added to the setup or current values (depending on
110
+ * `fromSetup`).
111
+ * @param out True when the animation is mixing out, else it is mixing in. Used by timelines that perform instant transitions.
112
+ * @param appliedPose True to modify {@link Posed.appliedPose}, else {@link Posed.pose} is modified. */
113
+ apply(skeleton, lastTime, time, loop, events, alpha, fromSetup, add, out, appliedPose) {
67
114
  if (!skeleton)
68
115
  throw new Error("skeleton cannot be null.");
69
- if (loop && this.duration != 0) {
116
+ if (loop && this.duration !== 0) {
70
117
  time %= this.duration;
71
118
  if (lastTime > 0)
72
119
  lastTime %= this.duration;
73
120
  }
74
- let timelines = this.timelines;
121
+ const timelines = this.timelines;
75
122
  for (let i = 0, n = timelines.length; i < n; i++)
76
- timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);
123
+ timelines[i].apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose);
77
124
  }
78
125
  }
79
- /** Controls how a timeline value is mixed with the setup pose value or current pose value when a timeline's `alpha`
80
- * < 1.
126
+ export var Property;
127
+ (function (Property) {
128
+ Property[Property["rotate"] = 0] = "rotate";
129
+ Property[Property["x"] = 1] = "x";
130
+ Property[Property["y"] = 2] = "y";
131
+ Property[Property["scaleX"] = 3] = "scaleX";
132
+ Property[Property["scaleY"] = 4] = "scaleY";
133
+ Property[Property["shearX"] = 5] = "shearX";
134
+ Property[Property["shearY"] = 6] = "shearY";
135
+ Property[Property["inherit"] = 7] = "inherit";
136
+ Property[Property["rgb"] = 8] = "rgb";
137
+ Property[Property["alpha"] = 9] = "alpha";
138
+ Property[Property["rgb2"] = 10] = "rgb2";
139
+ Property[Property["attachment"] = 11] = "attachment";
140
+ Property[Property["deform"] = 12] = "deform";
141
+ Property[Property["event"] = 13] = "event";
142
+ Property[Property["drawOrder"] = 14] = "drawOrder";
143
+ Property[Property["ikConstraint"] = 15] = "ikConstraint";
144
+ Property[Property["transformConstraint"] = 16] = "transformConstraint";
145
+ Property[Property["pathConstraintPosition"] = 17] = "pathConstraintPosition";
146
+ Property[Property["pathConstraintSpacing"] = 18] = "pathConstraintSpacing";
147
+ Property[Property["pathConstraintMix"] = 19] = "pathConstraintMix";
148
+ Property[Property["physicsConstraintInertia"] = 20] = "physicsConstraintInertia";
149
+ Property[Property["physicsConstraintStrength"] = 21] = "physicsConstraintStrength";
150
+ Property[Property["physicsConstraintDamping"] = 22] = "physicsConstraintDamping";
151
+ Property[Property["physicsConstraintMass"] = 23] = "physicsConstraintMass";
152
+ Property[Property["physicsConstraintWind"] = 24] = "physicsConstraintWind";
153
+ Property[Property["physicsConstraintGravity"] = 25] = "physicsConstraintGravity";
154
+ Property[Property["physicsConstraintMix"] = 26] = "physicsConstraintMix";
155
+ Property[Property["physicsConstraintReset"] = 27] = "physicsConstraintReset";
156
+ Property[Property["sequence"] = 28] = "sequence";
157
+ Property[Property["sliderTime"] = 29] = "sliderTime";
158
+ Property[Property["sliderMix"] = 30] = "sliderMix";
159
+ })(Property || (Property = {}));
160
+ /** The base class for all timelines.
81
161
  *
82
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
83
- export var MixBlend;
84
- (function (MixBlend) {
85
- /** Transitions from the setup value to the timeline value (the current value is not used). Before the first key, the setup
86
- * value is set. */
87
- MixBlend[MixBlend["setup"] = 0] = "setup";
88
- /** Transitions from the current value to the timeline value. Before the first key, transitions from the current value to
89
- * the setup value. Timelines which perform instant transitions, such as {@link DrawOrderTimeline} or
90
- * {@link AttachmentTimeline}, use the setup value before the first key.
91
- *
92
- * `first` is intended for the first animations applied, not for animations layered on top of those. */
93
- MixBlend[MixBlend["first"] = 1] = "first";
94
- /** Transitions from the current value to the timeline value. No change is made before the first key (the current value is
95
- * kept until the first key).
96
- *
97
- * `replace` is intended for animations layered on top of others, not for the first animations applied. */
98
- MixBlend[MixBlend["replace"] = 2] = "replace";
99
- /** Transitions from the current value to the current value plus the timeline value. No change is made before the first key
100
- * (the current value is kept until the first key).
101
- *
102
- * `add` is intended for animations layered on top of others, not for the first animations applied. Properties
103
- * keyed by additive animations must be set manually or by another animation before applying the additive animations, else
104
- * the property values will increase continually. */
105
- MixBlend[MixBlend["add"] = 3] = "add";
106
- })(MixBlend || (MixBlend = {}));
107
- /** Indicates whether a timeline's `alpha` is mixing out over time toward 0 (the setup or current pose value) or
108
- * mixing in toward 1 (the timeline's value).
109
- *
110
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
111
- export var MixDirection;
112
- (function (MixDirection) {
113
- MixDirection[MixDirection["mixIn"] = 0] = "mixIn";
114
- MixDirection[MixDirection["mixOut"] = 1] = "mixOut";
115
- })(MixDirection || (MixDirection = {}));
116
- const Property = {
117
- rotate: 0,
118
- x: 1,
119
- y: 2,
120
- scaleX: 3,
121
- scaleY: 4,
122
- shearX: 5,
123
- shearY: 6,
124
- inherit: 7,
125
- rgb: 8,
126
- alpha: 9,
127
- rgb2: 10,
128
- attachment: 11,
129
- deform: 12,
130
- event: 13,
131
- drawOrder: 14,
132
- ikConstraint: 15,
133
- transformConstraint: 16,
134
- pathConstraintPosition: 17,
135
- pathConstraintSpacing: 18,
136
- pathConstraintMix: 19,
137
- physicsConstraintInertia: 20,
138
- physicsConstraintStrength: 21,
139
- physicsConstraintDamping: 22,
140
- physicsConstraintMass: 23,
141
- physicsConstraintWind: 24,
142
- physicsConstraintGravity: 25,
143
- physicsConstraintMix: 26,
144
- physicsConstraintReset: 27,
145
- sequence: 28,
146
- };
147
- /** The interface for all timelines. */
162
+ * See <a href='https://esotericsoftware.com/spine-applying-animations#Timeline-API'>Applying Animations</a> in the Spine
163
+ * Runtimes Guide. */
148
164
  export class Timeline {
149
165
  propertyIds;
150
166
  frames;
151
- constructor(frameCount, propertyIds) {
167
+ /** True if this timeline supports additive blending. */
168
+ additive = false;
169
+ /** True if this timeline sets values instantaneously and does not support interpolation between frames. */
170
+ instant = false;
171
+ constructor(frameCount, ...propertyIds) {
152
172
  this.propertyIds = propertyIds;
153
173
  this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries());
154
174
  }
155
175
  getPropertyIds() {
156
176
  return this.propertyIds;
157
177
  }
178
+ /** The number of values stored per frame. */
158
179
  getFrameEntries() {
159
180
  return 1;
160
181
  }
182
+ /** The number of frames in this timeline. */
161
183
  getFrameCount() {
162
184
  return this.frames.length / this.getFrameEntries();
163
185
  }
186
+ /** The duration of the timeline in seconds, which is usually the highest time of all frames in the timeline. */
164
187
  getDuration() {
165
188
  return this.frames[this.frames.length - this.getFrameEntries()];
166
189
  }
167
- static search1(frames, time) {
168
- let n = frames.length;
169
- for (let i = 1; i < n; i++)
170
- if (frames[i] > time)
171
- return i - 1;
172
- return n - 1;
173
- }
174
- static search(frames, time, step) {
175
- let n = frames.length;
190
+ /** Linear search using the specified stride (default 1).
191
+ * @param time Must be >= the first value in `frames`.
192
+ * @return The index of the first value <= `time`. */
193
+ static search(frames, time, step = 1) {
194
+ const n = frames.length;
176
195
  for (let i = step; i < n; i += step)
177
196
  if (frames[i] > time)
178
197
  return i - step;
179
198
  return n - step;
180
199
  }
181
200
  }
182
- /** The base class for timelines that use interpolation between key frame values. */
201
+ export function isSlotTimeline(obj) {
202
+ return typeof obj === 'object' && obj !== null && typeof obj.slotIndex === 'number';
203
+ }
204
+ /** The base class for timelines that interpolate between frame values using stepped, linear, or a Bezier curve. */
183
205
  export class CurveTimeline extends Timeline {
184
206
  curves; // type, x, y, ...
185
- constructor(frameCount, bezierCount, propertyIds) {
186
- super(frameCount, propertyIds);
207
+ constructor(frameCount, bezierCount, ...propertyIds) {
208
+ super(frameCount, ...propertyIds);
187
209
  this.curves = Utils.newFloatArray(frameCount + bezierCount * 18 /*BEZIER_SIZE*/);
188
210
  this.curves[frameCount - 1] = 1 /*STEPPED*/;
189
211
  }
@@ -195,21 +217,21 @@ export class CurveTimeline extends Timeline {
195
217
  setStepped(frame) {
196
218
  this.curves[frame] = 1 /*STEPPED*/;
197
219
  }
198
- /** Shrinks the storage for Bezier curves, for use when <code>bezierCount</code> (specified in the constructor) was larger
220
+ /** Shrinks the storage for Bezier curves, for use when `bezierCount` (specified in the constructor) was larger
199
221
  * than the actual number of Bezier curves. */
200
222
  shrink(bezierCount) {
201
- let size = this.getFrameCount() + bezierCount * 18 /*BEZIER_SIZE*/;
223
+ const size = this.getFrameCount() + bezierCount * 18 /*BEZIER_SIZE*/;
202
224
  if (this.curves.length > size) {
203
- let newCurves = Utils.newFloatArray(size);
225
+ const newCurves = Utils.newFloatArray(size);
204
226
  Utils.arrayCopy(this.curves, 0, newCurves, 0, size);
205
227
  this.curves = newCurves;
206
228
  }
207
229
  }
208
230
  /** Stores the segments for the specified Bezier curve. For timelines that modify multiple values, there may be more than
209
231
  * one curve per frame.
210
- * @param bezier The ordinal of this Bezier curve for this timeline, between 0 and <code>bezierCount - 1</code> (specified
232
+ * @param bezier The ordinal of this Bezier curve for this timeline, between 0 and `bezierCount - 1` (specified
211
233
  * in the constructor), inclusive.
212
- * @param frame Between 0 and <code>frameCount - 1</code>, inclusive.
234
+ * @param frame Between 0 and `frameCount - 1`, inclusive.
213
235
  * @param value The index of the value for this frame that this curve is used for.
214
236
  * @param time1 The time for the first key.
215
237
  * @param value1 The value for the first key.
@@ -220,12 +242,12 @@ export class CurveTimeline extends Timeline {
220
242
  * @param time2 The time for the second key.
221
243
  * @param value2 The value for the second key. */
222
244
  setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
223
- let curves = this.curves;
245
+ const curves = this.curves;
224
246
  let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
225
- if (value == 0)
247
+ if (value === 0)
226
248
  curves[frame] = 2 /*BEZIER*/ + i;
227
- let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03;
228
- let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;
249
+ const tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03;
250
+ const dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;
229
251
  let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
230
252
  let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667;
231
253
  let x = time1 + dx, y = value1 + dy;
@@ -241,36 +263,37 @@ export class CurveTimeline extends Timeline {
241
263
  }
242
264
  }
243
265
  /** Returns the Bezier interpolated value for the specified time.
244
- * @param frameIndex The index into {@link #getFrames()} for the values of the frame before <code>time</code>.
245
- * @param valueOffset The offset from <code>frameIndex</code> to the value this curve is used for.
246
- * @param i The index of the Bezier segments. See {@link #getCurveType(int)}. */
266
+ * @param frameIndex The index into {@link frames} for the values of the frame before `time`.
267
+ * @param valueOffset The offset from `frameIndex` to the value this curve is used for.
268
+ * @param i The index of the Bezier segments. See {@link getCurveType}. */
247
269
  getBezierValue(time, frameIndex, valueOffset, i) {
248
- let curves = this.curves;
270
+ const curves = this.curves;
249
271
  if (curves[i] > time) {
250
- let x = this.frames[frameIndex], y = this.frames[frameIndex + valueOffset];
272
+ const x = this.frames[frameIndex], y = this.frames[frameIndex + valueOffset];
251
273
  return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
252
274
  }
253
- let n = i + 18 /*BEZIER_SIZE*/;
275
+ const n = i + 18 /*BEZIER_SIZE*/;
254
276
  for (i += 2; i < n; i += 2) {
255
277
  if (curves[i] >= time) {
256
- let x = curves[i - 2], y = curves[i - 1];
278
+ const x = curves[i - 2], y = curves[i - 1];
257
279
  return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
258
280
  }
259
281
  }
260
282
  frameIndex += this.getFrameEntries();
261
- let x = curves[n - 2], y = curves[n - 1];
283
+ const x = curves[n - 2], y = curves[n - 1];
262
284
  return y + (time - x) / (this.frames[frameIndex] - x) * (this.frames[frameIndex + valueOffset] - y);
263
285
  }
264
286
  }
287
+ /** The base class for a {@link CurveTimeline} that sets one property with a curve. */
265
288
  export class CurveTimeline1 extends CurveTimeline {
266
289
  constructor(frameCount, bezierCount, propertyId) {
267
- super(frameCount, bezierCount, [propertyId]);
290
+ super(frameCount, bezierCount, propertyId);
268
291
  }
269
292
  getFrameEntries() {
270
293
  return 2 /*ENTRIES*/;
271
294
  }
272
295
  /** Sets the time and value for the specified frame.
273
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
296
+ * @param frame Between 0 and `frameCount`, inclusive.
274
297
  * @param time The frame time in seconds. */
275
298
  setFrame(frame, time, value) {
276
299
  frame <<= 1;
@@ -279,7 +302,7 @@ export class CurveTimeline1 extends CurveTimeline {
279
302
  }
280
303
  /** Returns the interpolated value for the specified time. */
281
304
  getCurveValue(time) {
282
- let frames = this.frames;
305
+ const frames = this.frames;
283
306
  let i = frames.length - 2;
284
307
  for (let ii = 2; ii <= i; ii += 2) {
285
308
  if (frames[ii] > time) {
@@ -287,119 +310,98 @@ export class CurveTimeline1 extends CurveTimeline {
287
310
  break;
288
311
  }
289
312
  }
290
- let curveType = this.curves[i >> 1];
313
+ const curveType = this.curves[i >> 1];
291
314
  switch (curveType) {
292
- case 0 /*LINEAR*/:
293
- let before = frames[i], value = frames[i + 1 /*VALUE*/];
315
+ case 0 /*LINEAR*/: {
316
+ const before = frames[i], value = frames[i + 1 /*VALUE*/];
294
317
  return value + (time - before) / (frames[i + 2 /*ENTRIES*/] - before) * (frames[i + 2 /*ENTRIES*/ + 1 /*VALUE*/] - value);
318
+ }
295
319
  case 1 /*STEPPED*/:
296
320
  return frames[i + 1 /*VALUE*/];
297
321
  }
298
322
  return this.getBezierValue(time, i, 1 /*VALUE*/, curveType - 2 /*BEZIER*/);
299
323
  }
300
- getRelativeValue(time, alpha, blend, current, setup) {
301
- if (time < this.frames[0]) {
302
- switch (blend) {
303
- case MixBlend.setup:
304
- return setup;
305
- case MixBlend.first:
306
- return current + (setup - current) * alpha;
307
- }
308
- return current;
309
- }
310
- let value = this.getCurveValue(time);
311
- switch (blend) {
312
- case MixBlend.setup:
313
- return setup + value * alpha;
314
- case MixBlend.first:
315
- case MixBlend.replace:
316
- value += setup - current;
317
- }
318
- return current + value * alpha;
319
- }
320
- getAbsoluteValue(time, alpha, blend, current, setup) {
321
- if (time < this.frames[0]) {
322
- switch (blend) {
323
- case MixBlend.setup:
324
- return setup;
325
- case MixBlend.first:
326
- return current + (setup - current) * alpha;
327
- }
328
- return current;
329
- }
330
- let value = this.getCurveValue(time);
331
- if (blend == MixBlend.setup)
332
- return setup + (value - setup) * alpha;
333
- return current + (value - current) * alpha;
334
- }
335
- getAbsoluteValue2(time, alpha, blend, current, setup, value) {
336
- if (time < this.frames[0]) {
337
- switch (blend) {
338
- case MixBlend.setup:
339
- return setup;
340
- case MixBlend.first:
341
- return current + (setup - current) * alpha;
342
- }
343
- return current;
344
- }
345
- if (blend == MixBlend.setup)
346
- return setup + (value - setup) * alpha;
347
- return current + (value - current) * alpha;
348
- }
349
- getScaleValue(time, alpha, blend, direction, current, setup) {
350
- const frames = this.frames;
351
- if (time < frames[0]) {
352
- switch (blend) {
353
- case MixBlend.setup:
354
- return setup;
355
- case MixBlend.first:
356
- return current + (setup - current) * alpha;
357
- }
358
- return current;
359
- }
360
- let value = this.getCurveValue(time) * setup;
361
- if (alpha == 1) {
362
- if (blend == MixBlend.add)
363
- return current + value - setup;
324
+ /** Returns the interpolated value for properties relative to the setup value. The timeline value is added to the setup
325
+ * value, rather than replacing it.
326
+ *
327
+ * See {@link Timeline.apply}.
328
+ * @param current The current value for the property.
329
+ * @param setup The setup value for the property. */
330
+ getRelativeValue(time, alpha, fromSetup, add, current, setup) {
331
+ if (time < this.frames[0])
332
+ return fromSetup ? setup : current;
333
+ const value = this.getCurveValue(time);
334
+ return fromSetup ? setup + value * alpha : current + (add ? value : value + setup - current) * alpha;
335
+ }
336
+ getAbsoluteValue(time, alpha, fromSetup, add, current, setup, value) {
337
+ if (value === undefined)
338
+ return this.getAbsoluteValue1(time, alpha, fromSetup, add, current, setup);
339
+ else
340
+ return this.getAbsoluteValue2(time, alpha, fromSetup, add, current, setup, value);
341
+ }
342
+ getAbsoluteValue1(time, alpha, fromSetup, add, current, setup) {
343
+ if (time < this.frames[0])
344
+ return fromSetup ? setup : current;
345
+ const value = this.getCurveValue(time);
346
+ return fromSetup ? setup + (add ? value : value - setup) * alpha : current + (add ? value : value - current) * alpha;
347
+ }
348
+ getAbsoluteValue2(time, alpha, fromSetup, add, current, setup, value) {
349
+ if (time < this.frames[0])
350
+ return fromSetup ? setup : current;
351
+ return fromSetup ? setup + (add ? value : value - setup) * alpha : current + (add ? value : value - current) * alpha;
352
+ }
353
+ /** Returns the interpolated value for scale properties. The timeline and setup values are multiplied and sign adjusted.
354
+ *
355
+ * See {@link Timeline.apply}.
356
+ * @param current The current value for the property.
357
+ * @param setup The setup value for the property. */
358
+ getScaleValue(time, alpha, fromSetup, add, out, current, setup) {
359
+ if (time < this.frames[0])
360
+ return fromSetup ? setup : current;
361
+ const value = this.getCurveValue(time) * setup;
362
+ if (alpha === 1 && !add)
364
363
  return value;
365
- }
366
- // Mixing out uses sign of setup or current pose, else use sign of key.
367
- if (direction == MixDirection.mixOut) {
368
- switch (blend) {
369
- case MixBlend.setup:
370
- return setup + (Math.abs(value) * MathUtils.signum(setup) - setup) * alpha;
371
- case MixBlend.first:
372
- case MixBlend.replace:
373
- return current + (Math.abs(value) * MathUtils.signum(current) - current) * alpha;
374
- }
375
- }
376
- else {
377
- let s = 0;
378
- switch (blend) {
379
- case MixBlend.setup:
380
- s = Math.abs(setup) * MathUtils.signum(value);
381
- return s + (value - s) * alpha;
382
- case MixBlend.first:
383
- case MixBlend.replace:
384
- s = Math.abs(current) * MathUtils.signum(value);
385
- return s + (value - s) * alpha;
386
- }
387
- }
388
- return current + (value - setup) * alpha;
364
+ let base = fromSetup ? setup : current;
365
+ if (add)
366
+ return base + (value - setup) * alpha;
367
+ if (out)
368
+ return base + (Math.abs(value) * Math.sign(base) - base) * alpha;
369
+ base = Math.abs(base) * Math.sign(value);
370
+ return base + (value - base) * alpha;
389
371
  }
390
372
  }
391
- /** The base class for a {@link CurveTimeline} which sets two properties. */
392
- export class CurveTimeline2 extends CurveTimeline {
393
- /** @param bezierCount The maximum number of Bezier curves. See {@link #shrink(int)}.
373
+ export function isBoneTimeline(obj) {
374
+ return typeof obj === 'object' && obj !== null && typeof obj.boneIndex === 'number';
375
+ }
376
+ /** The base class for timelines that change 1 bone property with a curve. */
377
+ export class BoneTimeline1 extends CurveTimeline1 {
378
+ boneIndex;
379
+ constructor(frameCount, bezierCount, boneIndex, property) {
380
+ super(frameCount, bezierCount, `${property}|${boneIndex}`);
381
+ this.boneIndex = boneIndex;
382
+ this.additive = true;
383
+ }
384
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
385
+ const bone = skeleton.bones[this.boneIndex];
386
+ if (bone.active)
387
+ this.apply1(appliedPose ? bone.appliedPose : bone.pose, bone.data.setupPose, time, alpha, fromSetup, add, out);
388
+ }
389
+ }
390
+ /** The base class for timelines that change two bone properties with a curve. */
391
+ export class BoneTimeline2 extends CurveTimeline {
392
+ boneIndex;
393
+ /** @param bezierCount The maximum number of Bezier curves. See {@link shrink}.
394
394
  * @param propertyIds Unique identifiers for the properties the timeline modifies. */
395
- constructor(frameCount, bezierCount, propertyId1, propertyId2) {
396
- super(frameCount, bezierCount, [propertyId1, propertyId2]);
395
+ constructor(frameCount, bezierCount, boneIndex, property1, property2) {
396
+ super(frameCount, bezierCount, `${property1}|${boneIndex}`, `${property2}|${boneIndex}`);
397
+ this.boneIndex = boneIndex;
398
+ this.additive = true;
397
399
  }
398
400
  getFrameEntries() {
399
401
  return 3 /*ENTRIES*/;
400
402
  }
401
403
  /** Sets the time and values for the specified frame.
402
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
404
+ * @param frame Between 0 and `frameCount`, inclusive.
403
405
  * @param time The frame time in seconds. */
404
406
  setFrame(frame, time, value1, value2) {
405
407
  frame *= 3 /*ENTRIES*/;
@@ -407,56 +409,48 @@ export class CurveTimeline2 extends CurveTimeline {
407
409
  this.frames[frame + 1 /*VALUE1*/] = value1;
408
410
  this.frames[frame + 2 /*VALUE2*/] = value2;
409
411
  }
412
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
413
+ const bone = skeleton.bones[this.boneIndex];
414
+ if (bone.active)
415
+ this.apply1(appliedPose ? bone.appliedPose : bone.pose, bone.data.setupPose, time, alpha, fromSetup, add, out);
416
+ }
410
417
  }
411
- /** Changes a bone's local {@link Bone#rotation}. */
412
- export class RotateTimeline extends CurveTimeline1 {
413
- boneIndex = 0;
418
+ /** Changes {@link BonePose.rotation}. */
419
+ export class RotateTimeline extends BoneTimeline1 {
414
420
  constructor(frameCount, bezierCount, boneIndex) {
415
- super(frameCount, bezierCount, Property.rotate + "|" + boneIndex);
416
- this.boneIndex = boneIndex;
421
+ super(frameCount, bezierCount, boneIndex, Property.rotate);
417
422
  }
418
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
419
- let bone = skeleton.bones[this.boneIndex];
420
- if (bone.active)
421
- bone.rotation = this.getRelativeValue(time, alpha, blend, bone.rotation, bone.data.rotation);
423
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
424
+ pose.rotation = this.getRelativeValue(time, alpha, fromSetup, add, pose.rotation, setup.rotation);
422
425
  }
423
426
  }
424
- /** Changes a bone's local {@link Bone#x} and {@link Bone#y}. */
425
- export class TranslateTimeline extends CurveTimeline2 {
426
- boneIndex = 0;
427
+ /** Changes {@link BonePose.x} and {@link BonePose.y}. */
428
+ export class TranslateTimeline extends BoneTimeline2 {
427
429
  constructor(frameCount, bezierCount, boneIndex) {
428
- super(frameCount, bezierCount, Property.x + "|" + boneIndex, Property.y + "|" + boneIndex);
429
- this.boneIndex = boneIndex;
430
+ super(frameCount, bezierCount, boneIndex, Property.x, Property.y);
430
431
  }
431
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
432
- let bone = skeleton.bones[this.boneIndex];
433
- if (!bone.active)
434
- return;
435
- let frames = this.frames;
432
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
433
+ const frames = this.frames;
436
434
  if (time < frames[0]) {
437
- switch (blend) {
438
- case MixBlend.setup:
439
- bone.x = bone.data.x;
440
- bone.y = bone.data.y;
441
- return;
442
- case MixBlend.first:
443
- bone.x += (bone.data.x - bone.x) * alpha;
444
- bone.y += (bone.data.y - bone.y) * alpha;
435
+ if (fromSetup) {
436
+ pose.x = setup.x;
437
+ pose.y = setup.y;
445
438
  }
446
439
  return;
447
440
  }
448
441
  let x = 0, y = 0;
449
- let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
450
- let curveType = this.curves[i / 3 /*ENTRIES*/];
442
+ const i = Timeline.search(frames, time, 3 /*ENTRIES*/);
443
+ const curveType = this.curves[i / 3 /*ENTRIES*/];
451
444
  switch (curveType) {
452
- case 0 /*LINEAR*/:
453
- let before = frames[i];
445
+ case 0 /*LINEAR*/: {
446
+ const before = frames[i];
454
447
  x = frames[i + 1 /*VALUE1*/];
455
448
  y = frames[i + 2 /*VALUE2*/];
456
- let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
449
+ const t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
457
450
  x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
458
451
  y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
459
452
  break;
453
+ }
460
454
  case 1 /*STEPPED*/:
461
455
  x = frames[i + 1 /*VALUE1*/];
462
456
  y = frames[i + 2 /*VALUE2*/];
@@ -465,84 +459,65 @@ export class TranslateTimeline extends CurveTimeline2 {
465
459
  x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
466
460
  y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
467
461
  }
468
- switch (blend) {
469
- case MixBlend.setup:
470
- bone.x = bone.data.x + x * alpha;
471
- bone.y = bone.data.y + y * alpha;
472
- break;
473
- case MixBlend.first:
474
- case MixBlend.replace:
475
- bone.x += (bone.data.x + x - bone.x) * alpha;
476
- bone.y += (bone.data.y + y - bone.y) * alpha;
477
- break;
478
- case MixBlend.add:
479
- bone.x += x * alpha;
480
- bone.y += y * alpha;
462
+ if (fromSetup) {
463
+ pose.x = setup.x + x * alpha;
464
+ pose.y = setup.y + y * alpha;
465
+ }
466
+ else if (add) {
467
+ pose.x += x * alpha;
468
+ pose.y += y * alpha;
469
+ }
470
+ else {
471
+ pose.x += (setup.x + x - pose.x) * alpha;
472
+ pose.y += (setup.y + y - pose.y) * alpha;
481
473
  }
482
474
  }
483
475
  }
484
- /** Changes a bone's local {@link Bone#x}. */
485
- export class TranslateXTimeline extends CurveTimeline1 {
486
- boneIndex = 0;
476
+ /** Changes {@link BonePose.x}. */
477
+ export class TranslateXTimeline extends BoneTimeline1 {
487
478
  constructor(frameCount, bezierCount, boneIndex) {
488
- super(frameCount, bezierCount, Property.x + "|" + boneIndex);
489
- this.boneIndex = boneIndex;
479
+ super(frameCount, bezierCount, boneIndex, Property.x);
490
480
  }
491
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
492
- let bone = skeleton.bones[this.boneIndex];
493
- if (bone.active)
494
- bone.x = this.getRelativeValue(time, alpha, blend, bone.x, bone.data.x);
481
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
482
+ pose.x = this.getRelativeValue(time, alpha, fromSetup, add, pose.x, setup.x);
495
483
  }
496
484
  }
497
- /** Changes a bone's local {@link Bone#x}. */
498
- export class TranslateYTimeline extends CurveTimeline1 {
499
- boneIndex = 0;
485
+ /** Changes {@link BonePose.y}. */
486
+ export class TranslateYTimeline extends BoneTimeline1 {
500
487
  constructor(frameCount, bezierCount, boneIndex) {
501
- super(frameCount, bezierCount, Property.y + "|" + boneIndex);
502
- this.boneIndex = boneIndex;
488
+ super(frameCount, bezierCount, boneIndex, Property.y);
503
489
  }
504
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
505
- let bone = skeleton.bones[this.boneIndex];
506
- if (bone.active)
507
- bone.y = this.getRelativeValue(time, alpha, blend, bone.y, bone.data.y);
490
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
491
+ pose.y = this.getRelativeValue(time, alpha, fromSetup, add, pose.y, setup.y);
508
492
  }
509
493
  }
510
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
511
- export class ScaleTimeline extends CurveTimeline2 {
512
- boneIndex = 0;
494
+ /** Changes {@link BonePose.scaleX} and {@link BonePose.scaleY}. */
495
+ export class ScaleTimeline extends BoneTimeline2 {
513
496
  constructor(frameCount, bezierCount, boneIndex) {
514
- super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex, Property.scaleY + "|" + boneIndex);
515
- this.boneIndex = boneIndex;
497
+ super(frameCount, bezierCount, boneIndex, Property.scaleX, Property.scaleY);
516
498
  }
517
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
518
- let bone = skeleton.bones[this.boneIndex];
519
- if (!bone.active)
520
- return;
521
- let frames = this.frames;
499
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
500
+ const frames = this.frames;
522
501
  if (time < frames[0]) {
523
- switch (blend) {
524
- case MixBlend.setup:
525
- bone.scaleX = bone.data.scaleX;
526
- bone.scaleY = bone.data.scaleY;
527
- return;
528
- case MixBlend.first:
529
- bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
530
- bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
502
+ if (fromSetup) {
503
+ pose.scaleX = setup.scaleX;
504
+ pose.scaleY = setup.scaleY;
531
505
  }
532
506
  return;
533
507
  }
534
508
  let x, y;
535
- let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
536
- let curveType = this.curves[i / 3 /*ENTRIES*/];
509
+ const i = Timeline.search(frames, time, 3 /*ENTRIES*/);
510
+ const curveType = this.curves[i / 3 /*ENTRIES*/];
537
511
  switch (curveType) {
538
- case 0 /*LINEAR*/:
539
- let before = frames[i];
512
+ case 0 /*LINEAR*/: {
513
+ const before = frames[i];
540
514
  x = frames[i + 1 /*VALUE1*/];
541
515
  y = frames[i + 2 /*VALUE2*/];
542
- let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
516
+ const t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
543
517
  x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
544
518
  y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
545
519
  break;
520
+ }
546
521
  case 1 /*STEPPED*/:
547
522
  x = frames[i + 1 /*VALUE1*/];
548
523
  y = frames[i + 2 /*VALUE2*/];
@@ -551,125 +526,84 @@ export class ScaleTimeline extends CurveTimeline2 {
551
526
  x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
552
527
  y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
553
528
  }
554
- x *= bone.data.scaleX;
555
- y *= bone.data.scaleY;
556
- if (alpha == 1) {
557
- if (blend == MixBlend.add) {
558
- bone.scaleX += x - bone.data.scaleX;
559
- bone.scaleY += y - bone.data.scaleY;
560
- }
561
- else {
562
- bone.scaleX = x;
563
- bone.scaleY = y;
564
- }
529
+ x *= setup.scaleX;
530
+ y *= setup.scaleY;
531
+ if (alpha === 1 && !add) {
532
+ pose.scaleX = x;
533
+ pose.scaleY = y;
565
534
  }
566
535
  else {
567
536
  let bx = 0, by = 0;
568
- if (direction == MixDirection.mixOut) {
569
- switch (blend) {
570
- case MixBlend.setup:
571
- bx = bone.data.scaleX;
572
- by = bone.data.scaleY;
573
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
574
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
575
- break;
576
- case MixBlend.first:
577
- case MixBlend.replace:
578
- bx = bone.scaleX;
579
- by = bone.scaleY;
580
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
581
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
582
- break;
583
- case MixBlend.add:
584
- bone.scaleX += (x - bone.data.scaleX) * alpha;
585
- bone.scaleY += (y - bone.data.scaleY) * alpha;
586
- }
537
+ if (fromSetup) {
538
+ bx = setup.scaleX;
539
+ by = setup.scaleY;
587
540
  }
588
541
  else {
589
- switch (blend) {
590
- case MixBlend.setup:
591
- bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
592
- by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
593
- bone.scaleX = bx + (x - bx) * alpha;
594
- bone.scaleY = by + (y - by) * alpha;
595
- break;
596
- case MixBlend.first:
597
- case MixBlend.replace:
598
- bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
599
- by = Math.abs(bone.scaleY) * MathUtils.signum(y);
600
- bone.scaleX = bx + (x - bx) * alpha;
601
- bone.scaleY = by + (y - by) * alpha;
602
- break;
603
- case MixBlend.add:
604
- bone.scaleX += (x - bone.data.scaleX) * alpha;
605
- bone.scaleY += (y - bone.data.scaleY) * alpha;
606
- }
542
+ bx = pose.scaleX;
543
+ by = pose.scaleY;
544
+ }
545
+ if (add) {
546
+ pose.scaleX = bx + (x - setup.scaleX) * alpha;
547
+ pose.scaleY = by + (y - setup.scaleY) * alpha;
548
+ }
549
+ else if (out) {
550
+ pose.scaleX = bx + (Math.abs(x) * Math.sign(bx) - bx) * alpha;
551
+ pose.scaleY = by + (Math.abs(y) * Math.sign(by) - by) * alpha;
552
+ }
553
+ else {
554
+ bx = Math.abs(bx) * Math.sign(x);
555
+ by = Math.abs(by) * Math.sign(y);
556
+ pose.scaleX = bx + (x - bx) * alpha;
557
+ pose.scaleY = by + (y - by) * alpha;
607
558
  }
608
559
  }
609
560
  }
610
561
  }
611
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
612
- export class ScaleXTimeline extends CurveTimeline1 {
613
- boneIndex = 0;
562
+ /** Changes a {@link BonePose.scaleX}. */
563
+ export class ScaleXTimeline extends BoneTimeline1 {
614
564
  constructor(frameCount, bezierCount, boneIndex) {
615
- super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex);
616
- this.boneIndex = boneIndex;
565
+ super(frameCount, bezierCount, boneIndex, Property.scaleX);
617
566
  }
618
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
619
- let bone = skeleton.bones[this.boneIndex];
620
- if (bone.active)
621
- bone.scaleX = this.getScaleValue(time, alpha, blend, direction, bone.scaleX, bone.data.scaleX);
567
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
568
+ pose.scaleX = this.getScaleValue(time, alpha, fromSetup, add, out, pose.scaleX, setup.scaleX);
622
569
  }
623
570
  }
624
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
625
- export class ScaleYTimeline extends CurveTimeline1 {
626
- boneIndex = 0;
571
+ /** Changes a {@link BonePose.scaleY}. */
572
+ export class ScaleYTimeline extends BoneTimeline1 {
627
573
  constructor(frameCount, bezierCount, boneIndex) {
628
- super(frameCount, bezierCount, Property.scaleY + "|" + boneIndex);
629
- this.boneIndex = boneIndex;
574
+ super(frameCount, bezierCount, boneIndex, Property.scaleY);
630
575
  }
631
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
632
- let bone = skeleton.bones[this.boneIndex];
633
- if (bone.active)
634
- bone.scaleY = this.getScaleValue(time, alpha, blend, direction, bone.scaleY, bone.data.scaleY);
576
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
577
+ pose.scaleY = this.getScaleValue(time, alpha, fromSetup, add, out, pose.scaleY, setup.scaleY);
635
578
  }
636
579
  }
637
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
638
- export class ShearTimeline extends CurveTimeline2 {
639
- boneIndex = 0;
580
+ /** Changes {@link Bone.shearX} and {@link Bone.shearY}. */
581
+ export class ShearTimeline extends BoneTimeline2 {
640
582
  constructor(frameCount, bezierCount, boneIndex) {
641
- super(frameCount, bezierCount, Property.shearX + "|" + boneIndex, Property.shearY + "|" + boneIndex);
642
- this.boneIndex = boneIndex;
583
+ super(frameCount, bezierCount, boneIndex, Property.shearX, Property.shearY);
643
584
  }
644
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
645
- let bone = skeleton.bones[this.boneIndex];
646
- if (!bone.active)
647
- return;
648
- let frames = this.frames;
585
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
586
+ const frames = this.frames;
649
587
  if (time < frames[0]) {
650
- switch (blend) {
651
- case MixBlend.setup:
652
- bone.shearX = bone.data.shearX;
653
- bone.shearY = bone.data.shearY;
654
- return;
655
- case MixBlend.first:
656
- bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
657
- bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
588
+ if (fromSetup) {
589
+ pose.shearX = setup.shearX;
590
+ pose.shearY = setup.shearY;
658
591
  }
659
592
  return;
660
593
  }
661
594
  let x = 0, y = 0;
662
- let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
663
- let curveType = this.curves[i / 3 /*ENTRIES*/];
595
+ const i = Timeline.search(frames, time, 3 /*ENTRIES*/);
596
+ const curveType = this.curves[i / 3 /*ENTRIES*/];
664
597
  switch (curveType) {
665
- case 0 /*LINEAR*/:
666
- let before = frames[i];
598
+ case 0 /*LINEAR*/: {
599
+ const before = frames[i];
667
600
  x = frames[i + 1 /*VALUE1*/];
668
601
  y = frames[i + 2 /*VALUE2*/];
669
- let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
602
+ const t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
670
603
  x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
671
604
  y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
672
605
  break;
606
+ }
673
607
  case 1 /*STEPPED*/:
674
608
  x = frames[i + 1 /*VALUE1*/];
675
609
  y = frames[i + 2 /*VALUE2*/];
@@ -678,93 +612,97 @@ export class ShearTimeline extends CurveTimeline2 {
678
612
  x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
679
613
  y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
680
614
  }
681
- switch (blend) {
682
- case MixBlend.setup:
683
- bone.shearX = bone.data.shearX + x * alpha;
684
- bone.shearY = bone.data.shearY + y * alpha;
685
- break;
686
- case MixBlend.first:
687
- case MixBlend.replace:
688
- bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
689
- bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
690
- break;
691
- case MixBlend.add:
692
- bone.shearX += x * alpha;
693
- bone.shearY += y * alpha;
615
+ if (fromSetup) {
616
+ pose.shearX = setup.shearX + x * alpha;
617
+ pose.shearY = setup.shearY + y * alpha;
618
+ }
619
+ else if (add) {
620
+ pose.shearX += x * alpha;
621
+ pose.shearY += y * alpha;
622
+ }
623
+ else {
624
+ pose.shearX += (setup.shearX + x - pose.shearX) * alpha;
625
+ pose.shearY += (setup.shearY + y - pose.shearY) * alpha;
694
626
  }
695
627
  }
696
628
  }
697
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
698
- export class ShearXTimeline extends CurveTimeline1 {
699
- boneIndex = 0;
629
+ /** Changes {@link Bone.shearX} and {@link Bone.shearY}. */
630
+ export class ShearXTimeline extends BoneTimeline1 {
700
631
  constructor(frameCount, bezierCount, boneIndex) {
701
- super(frameCount, bezierCount, Property.shearX + "|" + boneIndex);
702
- this.boneIndex = boneIndex;
632
+ super(frameCount, bezierCount, boneIndex, Property.shearX);
703
633
  }
704
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
705
- let bone = skeleton.bones[this.boneIndex];
706
- if (bone.active)
707
- bone.shearX = this.getRelativeValue(time, alpha, blend, bone.shearX, bone.data.shearX);
634
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
635
+ pose.shearX = this.getRelativeValue(time, alpha, fromSetup, add, pose.shearX, setup.shearX);
708
636
  }
709
637
  }
710
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
711
- export class ShearYTimeline extends CurveTimeline1 {
712
- boneIndex = 0;
638
+ /** Changes {@link Bone.shearX} and {@link Bone.shearY}. */
639
+ export class ShearYTimeline extends BoneTimeline1 {
713
640
  constructor(frameCount, bezierCount, boneIndex) {
714
- super(frameCount, bezierCount, Property.shearY + "|" + boneIndex);
715
- this.boneIndex = boneIndex;
641
+ super(frameCount, bezierCount, boneIndex, Property.shearY);
716
642
  }
717
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
718
- let bone = skeleton.bones[this.boneIndex];
719
- if (bone.active)
720
- bone.shearY = this.getRelativeValue(time, alpha, blend, bone.shearY, bone.data.shearY);
643
+ apply1(pose, setup, time, alpha, fromSetup, add, out) {
644
+ pose.shearY = this.getRelativeValue(time, alpha, fromSetup, add, pose.shearY, setup.shearY);
721
645
  }
722
646
  }
647
+ /** Changes {@link BonePose.inherit}. */
723
648
  export class InheritTimeline extends Timeline {
724
- boneIndex = 0;
649
+ boneIndex;
725
650
  constructor(frameCount, boneIndex) {
726
- super(frameCount, [Property.inherit + "|" + boneIndex]);
651
+ super(frameCount, `${Property.inherit}|${boneIndex}`);
727
652
  this.boneIndex = boneIndex;
653
+ this.instant = true;
728
654
  }
729
655
  getFrameEntries() {
730
656
  return 2 /*ENTRIES*/;
731
657
  }
732
- /** Sets the transform mode for the specified frame.
733
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
658
+ /** Sets the inherit transform mode for the specified frame.
659
+ * @param frame Between 0 and `frameCount`, inclusive.
734
660
  * @param time The frame time in seconds. */
735
661
  setFrame(frame, time, inherit) {
736
662
  frame *= 2 /*ENTRIES*/;
737
663
  this.frames[frame] = time;
738
664
  this.frames[frame + 1 /*INHERIT*/] = inherit;
739
665
  }
740
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
741
- let bone = skeleton.bones[this.boneIndex];
666
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
667
+ const bone = skeleton.bones[this.boneIndex];
742
668
  if (!bone.active)
743
669
  return;
744
- if (direction == MixDirection.mixOut) {
745
- if (blend == MixBlend.setup)
746
- bone.inherit = bone.data.inherit;
747
- return;
670
+ const pose = appliedPose ? bone.appliedPose : bone.pose;
671
+ if (out) {
672
+ if (fromSetup)
673
+ pose.inherit = bone.data.setupPose.inherit;
748
674
  }
749
- let frames = this.frames;
750
- if (time < frames[0]) {
751
- if (blend == MixBlend.setup || blend == MixBlend.first)
752
- bone.inherit = bone.data.inherit;
753
- return;
675
+ else {
676
+ const frames = this.frames;
677
+ if (time < frames[0]) {
678
+ if (fromSetup)
679
+ pose.inherit = bone.data.setupPose.inherit;
680
+ }
681
+ else
682
+ pose.inherit = this.frames[Timeline.search(frames, time, 2 /*ENTRIES*/) + 1 /*INHERIT*/];
754
683
  }
755
- bone.inherit = this.frames[Timeline.search(frames, time, 2 /*ENTRIES*/) + 1 /*INHERIT*/];
756
684
  }
757
685
  }
758
- /** Changes a slot's {@link Slot#color}. */
759
- export class RGBATimeline extends CurveTimeline {
760
- slotIndex = 0;
761
- constructor(frameCount, bezierCount, slotIndex) {
762
- super(frameCount, bezierCount, [
763
- Property.rgb + "|" + slotIndex,
764
- Property.alpha + "|" + slotIndex
765
- ]);
686
+ /** The base class for timelines that change any number of slot properties with a curve. */
687
+ export class SlotCurveTimeline extends CurveTimeline {
688
+ slotIndex;
689
+ constructor(frameCount, bezierCount, slotIndex, ...propertyIds) {
690
+ super(frameCount, bezierCount, ...propertyIds);
766
691
  this.slotIndex = slotIndex;
767
692
  }
693
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
694
+ const slot = skeleton.slots[this.slotIndex];
695
+ if (slot.bone.active)
696
+ this.apply1(slot, appliedPose ? slot.appliedPose : slot.pose, time, alpha, fromSetup, add);
697
+ }
698
+ }
699
+ /** Changes {@link SlotPose.color}. */
700
+ export class RGBATimeline extends SlotCurveTimeline {
701
+ constructor(frameCount, bezierCount, slotIndex) {
702
+ super(frameCount, bezierCount, slotIndex, //
703
+ `${Property.rgb}|${slotIndex}`, //
704
+ `${Property.alpha}|${slotIndex}`);
705
+ }
768
706
  getFrameEntries() {
769
707
  return 5 /*ENTRIES*/;
770
708
  }
@@ -777,39 +715,31 @@ export class RGBATimeline extends CurveTimeline {
777
715
  this.frames[frame + 3 /*B*/] = b;
778
716
  this.frames[frame + 4 /*A*/] = a;
779
717
  }
780
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
781
- let slot = skeleton.slots[this.slotIndex];
782
- if (!slot.bone.active)
783
- return;
784
- let frames = this.frames;
785
- let color = slot.color;
718
+ apply1(slot, pose, time, alpha, fromSetup, add) {
719
+ const color = pose.color;
720
+ const frames = this.frames;
786
721
  if (time < frames[0]) {
787
- let setup = slot.data.color;
788
- switch (blend) {
789
- case MixBlend.setup:
790
- color.setFromColor(setup);
791
- return;
792
- case MixBlend.first:
793
- color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha);
794
- }
722
+ if (fromSetup)
723
+ color.setFromColor(slot.data.setupPose.color);
795
724
  return;
796
725
  }
797
726
  let r = 0, g = 0, b = 0, a = 0;
798
- let i = Timeline.search(frames, time, 5 /*ENTRIES*/);
799
- let curveType = this.curves[i / 5 /*ENTRIES*/];
727
+ const i = Timeline.search(frames, time, 5 /*ENTRIES*/);
728
+ const curveType = this.curves[i / 5 /*ENTRIES*/];
800
729
  switch (curveType) {
801
- case 0 /*LINEAR*/:
802
- let before = frames[i];
730
+ case 0 /*LINEAR*/: {
731
+ const before = frames[i];
803
732
  r = frames[i + 1 /*R*/];
804
733
  g = frames[i + 2 /*G*/];
805
734
  b = frames[i + 3 /*B*/];
806
735
  a = frames[i + 4 /*A*/];
807
- let t = (time - before) / (frames[i + 5 /*ENTRIES*/] - before);
736
+ const t = (time - before) / (frames[i + 5 /*ENTRIES*/] - before);
808
737
  r += (frames[i + 5 /*ENTRIES*/ + 1 /*R*/] - r) * t;
809
738
  g += (frames[i + 5 /*ENTRIES*/ + 2 /*G*/] - g) * t;
810
739
  b += (frames[i + 5 /*ENTRIES*/ + 3 /*B*/] - b) * t;
811
740
  a += (frames[i + 5 /*ENTRIES*/ + 4 /*A*/] - a) * t;
812
741
  break;
742
+ }
813
743
  case 1 /*STEPPED*/:
814
744
  r = frames[i + 1 /*R*/];
815
745
  g = frames[i + 2 /*G*/];
@@ -822,23 +752,22 @@ export class RGBATimeline extends CurveTimeline {
822
752
  b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
823
753
  a = this.getBezierValue(time, i, 4 /*A*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
824
754
  }
825
- if (alpha == 1)
755
+ if (alpha === 1)
826
756
  color.set(r, g, b, a);
827
757
  else {
828
- if (blend == MixBlend.setup)
829
- color.setFromColor(slot.data.color);
830
- color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
758
+ if (fromSetup) {
759
+ const setup = slot.data.setupPose.color;
760
+ color.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha, setup.a + (a - setup.a) * alpha);
761
+ }
762
+ else
763
+ color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
831
764
  }
832
765
  }
833
766
  }
834
- /** Changes a slot's {@link Slot#color}. */
835
- export class RGBTimeline extends CurveTimeline {
836
- slotIndex = 0;
767
+ /** Changes RGB for a slot's {@link SlotPose.color}. */
768
+ export class RGBTimeline extends SlotCurveTimeline {
837
769
  constructor(frameCount, bezierCount, slotIndex) {
838
- super(frameCount, bezierCount, [
839
- Property.rgb + "|" + slotIndex
840
- ]);
841
- this.slotIndex = slotIndex;
770
+ super(frameCount, bezierCount, slotIndex, `${Property.rgb}|${slotIndex}`);
842
771
  }
843
772
  getFrameEntries() {
844
773
  return 4 /*ENTRIES*/;
@@ -851,41 +780,33 @@ export class RGBTimeline extends CurveTimeline {
851
780
  this.frames[frame + 2 /*G*/] = g;
852
781
  this.frames[frame + 3 /*B*/] = b;
853
782
  }
854
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
855
- let slot = skeleton.slots[this.slotIndex];
856
- if (!slot.bone.active)
857
- return;
858
- let frames = this.frames;
859
- let color = slot.color;
783
+ apply1(slot, pose, time, alpha, fromSetup, add) {
784
+ const color = pose.color;
785
+ let r = 0, g = 0, b = 0;
786
+ const frames = this.frames;
860
787
  if (time < frames[0]) {
861
- let setup = slot.data.color;
862
- switch (blend) {
863
- case MixBlend.setup:
864
- color.r = setup.r;
865
- color.g = setup.g;
866
- color.b = setup.b;
867
- return;
868
- case MixBlend.first:
869
- color.r += (setup.r - color.r) * alpha;
870
- color.g += (setup.g - color.g) * alpha;
871
- color.b += (setup.b - color.b) * alpha;
788
+ if (fromSetup) {
789
+ const setup = slot.data.setupPose.color;
790
+ color.r = setup.r;
791
+ color.g = setup.g;
792
+ color.b = setup.b;
872
793
  }
873
794
  return;
874
795
  }
875
- let r = 0, g = 0, b = 0;
876
- let i = Timeline.search(frames, time, 4 /*ENTRIES*/);
877
- let curveType = this.curves[i >> 2];
796
+ const i = Timeline.search(frames, time, 4 /*ENTRIES*/);
797
+ const curveType = this.curves[i >> 2];
878
798
  switch (curveType) {
879
- case 0 /*LINEAR*/:
880
- let before = frames[i];
799
+ case 0 /*LINEAR*/: {
800
+ const before = frames[i];
881
801
  r = frames[i + 1 /*R*/];
882
802
  g = frames[i + 2 /*G*/];
883
803
  b = frames[i + 3 /*B*/];
884
- let t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
804
+ const t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
885
805
  r += (frames[i + 4 /*ENTRIES*/ + 1 /*R*/] - r) * t;
886
806
  g += (frames[i + 4 /*ENTRIES*/ + 2 /*G*/] - g) * t;
887
807
  b += (frames[i + 4 /*ENTRIES*/ + 3 /*B*/] - b) * t;
888
808
  break;
809
+ }
889
810
  case 1 /*STEPPED*/:
890
811
  r = frames[i + 1 /*R*/];
891
812
  g = frames[i + 2 /*G*/];
@@ -896,67 +817,62 @@ export class RGBTimeline extends CurveTimeline {
896
817
  g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
897
818
  b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
898
819
  }
899
- if (alpha == 1) {
900
- color.r = r;
901
- color.g = g;
902
- color.b = b;
903
- }
904
- else {
905
- if (blend == MixBlend.setup) {
906
- let setup = slot.data.color;
907
- color.r = setup.r;
908
- color.g = setup.g;
909
- color.b = setup.b;
820
+ if (alpha !== 1) {
821
+ if (fromSetup) {
822
+ const setup = slot.data.setupPose.color;
823
+ r = setup.r + (r - setup.r) * alpha;
824
+ g = setup.g + (g - setup.g) * alpha;
825
+ b = setup.b + (b - setup.b) * alpha;
826
+ }
827
+ else {
828
+ r = color.r + (r - color.r) * alpha;
829
+ g = color.g + (g - color.g) * alpha;
830
+ b = color.b + (b - color.b) * alpha;
910
831
  }
911
- color.r += (r - color.r) * alpha;
912
- color.g += (g - color.g) * alpha;
913
- color.b += (b - color.b) * alpha;
914
832
  }
833
+ color.r = r < 0 ? 0 : (r > 1 ? 1 : r);
834
+ color.g = g < 0 ? 0 : (g > 1 ? 1 : g);
835
+ color.b = b < 0 ? 0 : (b > 1 ? 1 : b);
915
836
  }
916
837
  }
917
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
838
+ /** Changes alpha for a slot's {@link SlotPose.color}. */
918
839
  export class AlphaTimeline extends CurveTimeline1 {
919
840
  slotIndex = 0;
920
841
  constructor(frameCount, bezierCount, slotIndex) {
921
- super(frameCount, bezierCount, Property.alpha + "|" + slotIndex);
842
+ super(frameCount, bezierCount, `${Property.alpha}|${slotIndex}`);
922
843
  this.slotIndex = slotIndex;
923
844
  }
924
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
925
- let slot = skeleton.slots[this.slotIndex];
845
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
846
+ const slot = skeleton.slots[this.slotIndex];
926
847
  if (!slot.bone.active)
927
848
  return;
928
- let color = slot.color;
929
- if (time < this.frames[0]) {
930
- let setup = slot.data.color;
931
- switch (blend) {
932
- case MixBlend.setup:
933
- color.a = setup.a;
934
- return;
935
- case MixBlend.first:
936
- color.a += (setup.a - color.a) * alpha;
937
- }
849
+ const color = (appliedPose ? slot.appliedPose : slot.pose).color;
850
+ let a = 0;
851
+ const frames = this.frames;
852
+ if (time < frames[0]) {
853
+ if (fromSetup)
854
+ color.a = slot.data.setupPose.color.a;
938
855
  return;
939
856
  }
940
- let a = this.getCurveValue(time);
941
- if (alpha == 1)
942
- color.a = a;
943
- else {
944
- if (blend == MixBlend.setup)
945
- color.a = slot.data.color.a;
946
- color.a += (a - color.a) * alpha;
857
+ a = this.getCurveValue(time);
858
+ if (alpha !== 1) {
859
+ if (fromSetup) {
860
+ const setup = slot.data.setupPose.color;
861
+ a = setup.a + (a - setup.a) * alpha;
862
+ }
863
+ else
864
+ a = color.a + (a - color.a) * alpha;
947
865
  }
866
+ color.a = a < 0 ? 0 : (a > 1 ? 1 : a);
948
867
  }
949
868
  }
950
- /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */
951
- export class RGBA2Timeline extends CurveTimeline {
952
- slotIndex = 0;
869
+ /** Changes {@link SlotPose.color} and {@link SlotPose.darkColor} for two color tinting. */
870
+ export class RGBA2Timeline extends SlotCurveTimeline {
953
871
  constructor(frameCount, bezierCount, slotIndex) {
954
- super(frameCount, bezierCount, [
955
- Property.rgb + "|" + slotIndex,
956
- Property.alpha + "|" + slotIndex,
957
- Property.rgb2 + "|" + slotIndex
958
- ]);
959
- this.slotIndex = slotIndex;
872
+ super(frameCount, bezierCount, slotIndex, //
873
+ `${Property.rgb}|${slotIndex}`, //
874
+ `${Property.alpha}|${slotIndex}`, //
875
+ `${Property.rgb2}|${slotIndex}`);
960
876
  }
961
877
  getFrameEntries() {
962
878
  return 8 /*ENTRIES*/;
@@ -973,35 +889,29 @@ export class RGBA2Timeline extends CurveTimeline {
973
889
  this.frames[frame + 6 /*G2*/] = g2;
974
890
  this.frames[frame + 7 /*B2*/] = b2;
975
891
  }
976
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
977
- let slot = skeleton.slots[this.slotIndex];
978
- if (!slot.bone.active)
979
- return;
980
- let frames = this.frames;
981
- let light = slot.color, dark = slot.darkColor;
892
+ apply1(slot, pose, time, alpha, fromSetup, add) {
893
+ // biome-ignore lint/style/noNonNullAssertion: reference runtime
894
+ const light = pose.color, dark = pose.darkColor;
895
+ let r2 = 0, g2 = 0, b2 = 0;
896
+ const frames = this.frames;
982
897
  if (time < frames[0]) {
983
- let setupLight = slot.data.color, setupDark = slot.data.darkColor;
984
- switch (blend) {
985
- case MixBlend.setup:
986
- light.setFromColor(setupLight);
987
- dark.r = setupDark.r;
988
- dark.g = setupDark.g;
989
- dark.b = setupDark.b;
990
- return;
991
- case MixBlend.first:
992
- light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha);
993
- dark.r += (setupDark.r - dark.r) * alpha;
994
- dark.g += (setupDark.g - dark.g) * alpha;
995
- dark.b += (setupDark.b - dark.b) * alpha;
898
+ if (fromSetup) {
899
+ const setup = slot.data.setupPose;
900
+ light.setFromColor(setup.color);
901
+ // biome-ignore lint/style/noNonNullAssertion: reference runtime
902
+ const setupDark = setup.darkColor;
903
+ dark.r = setupDark.r;
904
+ dark.g = setupDark.g;
905
+ dark.b = setupDark.b;
996
906
  }
997
907
  return;
998
908
  }
999
- let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
1000
- let i = Timeline.search(frames, time, 8 /*ENTRIES*/);
1001
- let curveType = this.curves[i >> 3];
909
+ let r = 0, g = 0, b = 0, a = 0;
910
+ const i = Timeline.search(frames, time, 8 /*ENTRIES*/);
911
+ const curveType = this.curves[i >> 3];
1002
912
  switch (curveType) {
1003
- case 0 /*LINEAR*/:
1004
- let before = frames[i];
913
+ case 0 /*LINEAR*/: {
914
+ const before = frames[i];
1005
915
  r = frames[i + 1 /*R*/];
1006
916
  g = frames[i + 2 /*G*/];
1007
917
  b = frames[i + 3 /*B*/];
@@ -1009,7 +919,7 @@ export class RGBA2Timeline extends CurveTimeline {
1009
919
  r2 = frames[i + 5 /*R2*/];
1010
920
  g2 = frames[i + 6 /*G2*/];
1011
921
  b2 = frames[i + 7 /*B2*/];
1012
- let t = (time - before) / (frames[i + 8 /*ENTRIES*/] - before);
922
+ const t = (time - before) / (frames[i + 8 /*ENTRIES*/] - before);
1013
923
  r += (frames[i + 8 /*ENTRIES*/ + 1 /*R*/] - r) * t;
1014
924
  g += (frames[i + 8 /*ENTRIES*/ + 2 /*G*/] - g) * t;
1015
925
  b += (frames[i + 8 /*ENTRIES*/ + 3 /*B*/] - b) * t;
@@ -1018,6 +928,7 @@ export class RGBA2Timeline extends CurveTimeline {
1018
928
  g2 += (frames[i + 8 /*ENTRIES*/ + 6 /*G2*/] - g2) * t;
1019
929
  b2 += (frames[i + 8 /*ENTRIES*/ + 7 /*B2*/] - b2) * t;
1020
930
  break;
931
+ }
1021
932
  case 1 /*STEPPED*/:
1022
933
  r = frames[i + 1 /*R*/];
1023
934
  g = frames[i + 2 /*G*/];
@@ -1036,36 +947,35 @@ export class RGBA2Timeline extends CurveTimeline {
1036
947
  g2 = this.getBezierValue(time, i, 6 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1037
948
  b2 = this.getBezierValue(time, i, 7 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 6 - 2 /*BEZIER*/);
1038
949
  }
1039
- if (alpha == 1) {
950
+ if (alpha === 1)
1040
951
  light.set(r, g, b, a);
1041
- dark.r = r2;
1042
- dark.g = g2;
1043
- dark.b = b2;
952
+ else if (fromSetup) {
953
+ const setupPose = slot.data.setupPose;
954
+ let setup = setupPose.color;
955
+ light.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha, setup.a + (a - setup.a) * alpha);
956
+ // biome-ignore lint/style/noNonNullAssertion: reference runtime
957
+ setup = setupPose.darkColor;
958
+ r2 = setup.r + (r2 - setup.r) * alpha;
959
+ g2 = setup.g + (g2 - setup.g) * alpha;
960
+ b2 = setup.b + (b2 - setup.b) * alpha;
1044
961
  }
1045
962
  else {
1046
- if (blend == MixBlend.setup) {
1047
- light.setFromColor(slot.data.color);
1048
- let setupDark = slot.data.darkColor;
1049
- dark.r = setupDark.r;
1050
- dark.g = setupDark.g;
1051
- dark.b = setupDark.b;
1052
- }
1053
963
  light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);
1054
- dark.r += (r2 - dark.r) * alpha;
1055
- dark.g += (g2 - dark.g) * alpha;
1056
- dark.b += (b2 - dark.b) * alpha;
964
+ r2 = dark.r + (r2 - dark.r) * alpha;
965
+ g2 = dark.g + (g2 - dark.g) * alpha;
966
+ b2 = dark.b + (b2 - dark.b) * alpha;
1057
967
  }
968
+ dark.r = r2 < 0 ? 0 : (r2 > 1 ? 1 : r2);
969
+ dark.g = g2 < 0 ? 0 : (g2 > 1 ? 1 : g2);
970
+ dark.b = b2 < 0 ? 0 : (b2 > 1 ? 1 : b2);
1058
971
  }
1059
972
  }
1060
- /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */
1061
- export class RGB2Timeline extends CurveTimeline {
1062
- slotIndex = 0;
973
+ /** Changes {@link SlotPose.color} and {@link SlotPose.darkColor} for two color tinting. */
974
+ export class RGB2Timeline extends SlotCurveTimeline {
1063
975
  constructor(frameCount, bezierCount, slotIndex) {
1064
- super(frameCount, bezierCount, [
1065
- Property.rgb + "|" + slotIndex,
1066
- Property.rgb2 + "|" + slotIndex
1067
- ]);
1068
- this.slotIndex = slotIndex;
976
+ super(frameCount, bezierCount, slotIndex, //
977
+ `${Property.rgb}|${slotIndex}`, //
978
+ `${Property.rgb2}|${slotIndex}`);
1069
979
  }
1070
980
  getFrameEntries() {
1071
981
  return 7 /*ENTRIES*/;
@@ -1081,46 +991,37 @@ export class RGB2Timeline extends CurveTimeline {
1081
991
  this.frames[frame + 5 /*G2*/] = g2;
1082
992
  this.frames[frame + 6 /*B2*/] = b2;
1083
993
  }
1084
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1085
- let slot = skeleton.slots[this.slotIndex];
1086
- if (!slot.bone.active)
1087
- return;
1088
- let frames = this.frames;
1089
- let light = slot.color, dark = slot.darkColor;
994
+ apply1(slot, pose, time, alpha, fromSetup, add) {
995
+ // biome-ignore lint/style/noNonNullAssertion: reference runtime
996
+ const light = pose.color, dark = pose.darkColor;
997
+ let r = 0, g = 0, b = 0, r2 = 0, g2 = 0, b2 = 0;
998
+ const frames = this.frames;
1090
999
  if (time < frames[0]) {
1091
- let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1092
- switch (blend) {
1093
- case MixBlend.setup:
1094
- light.r = setupLight.r;
1095
- light.g = setupLight.g;
1096
- light.b = setupLight.b;
1097
- dark.r = setupDark.r;
1098
- dark.g = setupDark.g;
1099
- dark.b = setupDark.b;
1100
- return;
1101
- case MixBlend.first:
1102
- light.r += (setupLight.r - light.r) * alpha;
1103
- light.g += (setupLight.g - light.g) * alpha;
1104
- light.b += (setupLight.b - light.b) * alpha;
1105
- dark.r += (setupDark.r - dark.r) * alpha;
1106
- dark.g += (setupDark.g - dark.g) * alpha;
1107
- dark.b += (setupDark.b - dark.b) * alpha;
1000
+ if (fromSetup) {
1001
+ const setup = slot.data.setupPose;
1002
+ // biome-ignore lint/style/noNonNullAssertion: reference runtime
1003
+ const setupLight = setup.color, setupDark = setup.darkColor;
1004
+ light.r = setupLight.r;
1005
+ light.g = setupLight.g;
1006
+ light.b = setupLight.b;
1007
+ dark.r = setupDark.r;
1008
+ dark.g = setupDark.g;
1009
+ dark.b = setupDark.b;
1108
1010
  }
1109
1011
  return;
1110
1012
  }
1111
- let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
1112
- let i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1113
- let curveType = this.curves[i / 7 /*ENTRIES*/];
1013
+ const i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1014
+ const curveType = this.curves[i / 7 /*ENTRIES*/];
1114
1015
  switch (curveType) {
1115
- case 0 /*LINEAR*/:
1116
- let before = frames[i];
1016
+ case 0 /*LINEAR*/: {
1017
+ const before = frames[i];
1117
1018
  r = frames[i + 1 /*R*/];
1118
1019
  g = frames[i + 2 /*G*/];
1119
1020
  b = frames[i + 3 /*B*/];
1120
1021
  r2 = frames[i + 4 /*R2*/];
1121
1022
  g2 = frames[i + 5 /*G2*/];
1122
1023
  b2 = frames[i + 6 /*B2*/];
1123
- let t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1024
+ const t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1124
1025
  r += (frames[i + 7 /*ENTRIES*/ + 1 /*R*/] - r) * t;
1125
1026
  g += (frames[i + 7 /*ENTRIES*/ + 2 /*G*/] - g) * t;
1126
1027
  b += (frames[i + 7 /*ENTRIES*/ + 3 /*B*/] - b) * t;
@@ -1128,6 +1029,7 @@ export class RGB2Timeline extends CurveTimeline {
1128
1029
  g2 += (frames[i + 7 /*ENTRIES*/ + 5 /*G2*/] - g2) * t;
1129
1030
  b2 += (frames[i + 7 /*ENTRIES*/ + 6 /*B2*/] - b2) * t;
1130
1031
  break;
1032
+ }
1131
1033
  case 1 /*STEPPED*/:
1132
1034
  r = frames[i + 1 /*R*/];
1133
1035
  g = frames[i + 2 /*G*/];
@@ -1144,44 +1046,46 @@ export class RGB2Timeline extends CurveTimeline {
1144
1046
  g2 = this.getBezierValue(time, i, 5 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1145
1047
  b2 = this.getBezierValue(time, i, 6 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1146
1048
  }
1147
- if (alpha == 1) {
1148
- light.r = r;
1149
- light.g = g;
1150
- light.b = b;
1151
- dark.r = r2;
1152
- dark.g = g2;
1153
- dark.b = b2;
1154
- }
1155
- else {
1156
- if (blend == MixBlend.setup) {
1157
- let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1158
- light.r = setupLight.r;
1159
- light.g = setupLight.g;
1160
- light.b = setupLight.b;
1161
- dark.r = setupDark.r;
1162
- dark.g = setupDark.g;
1163
- dark.b = setupDark.b;
1049
+ if (alpha !== 1) {
1050
+ if (fromSetup) {
1051
+ const setupPose = slot.data.setupPose;
1052
+ let setup = setupPose.color;
1053
+ r = setup.r + (r - setup.r) * alpha;
1054
+ g = setup.g + (g - setup.g) * alpha;
1055
+ b = setup.b + (b - setup.b) * alpha;
1056
+ // biome-ignore lint/style/noNonNullAssertion: reference runtime
1057
+ setup = setupPose.darkColor;
1058
+ r2 = setup.r + (r2 - setup.r) * alpha;
1059
+ g2 = setup.g + (g2 - setup.g) * alpha;
1060
+ b2 = setup.b + (b2 - setup.b) * alpha;
1061
+ }
1062
+ else {
1063
+ r = light.r + (r - light.r) * alpha;
1064
+ g = light.g + (g - light.g) * alpha;
1065
+ b = light.b + (b - light.b) * alpha;
1066
+ r2 = dark.r + (r2 - dark.r) * alpha;
1067
+ g2 = dark.g + (g2 - dark.g) * alpha;
1068
+ b2 = dark.b + (b2 - dark.b) * alpha;
1164
1069
  }
1165
- light.r += (r - light.r) * alpha;
1166
- light.g += (g - light.g) * alpha;
1167
- light.b += (b - light.b) * alpha;
1168
- dark.r += (r2 - dark.r) * alpha;
1169
- dark.g += (g2 - dark.g) * alpha;
1170
- dark.b += (b2 - dark.b) * alpha;
1171
1070
  }
1071
+ light.r = r < 0 ? 0 : (r > 1 ? 1 : r);
1072
+ light.g = g < 0 ? 0 : (g > 1 ? 1 : g);
1073
+ light.b = b < 0 ? 0 : (b > 1 ? 1 : b);
1074
+ dark.r = r2 < 0 ? 0 : (r2 > 1 ? 1 : r2);
1075
+ dark.g = g2 < 0 ? 0 : (g2 > 1 ? 1 : g2);
1076
+ dark.b = b2 < 0 ? 0 : (b2 > 1 ? 1 : b2);
1172
1077
  }
1173
1078
  }
1174
- /** Changes a slot's {@link Slot#attachment}. */
1079
+ /** Changes {@link SlotPose.ttachment}. */
1175
1080
  export class AttachmentTimeline extends Timeline {
1176
1081
  slotIndex = 0;
1177
1082
  /** The attachment name for each key frame. May contain null values to clear the attachment. */
1178
1083
  attachmentNames;
1179
1084
  constructor(frameCount, slotIndex) {
1180
- super(frameCount, [
1181
- Property.attachment + "|" + slotIndex
1182
- ]);
1085
+ super(frameCount, `${Property.attachment}|${slotIndex}`);
1183
1086
  this.slotIndex = slotIndex;
1184
1087
  this.attachmentNames = new Array(frameCount);
1088
+ this.instant = true;
1185
1089
  }
1186
1090
  getFrameCount() {
1187
1091
  return this.frames.length;
@@ -1191,45 +1095,44 @@ export class AttachmentTimeline extends Timeline {
1191
1095
  this.frames[frame] = time;
1192
1096
  this.attachmentNames[frame] = attachmentName;
1193
1097
  }
1194
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1195
- let slot = skeleton.slots[this.slotIndex];
1098
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
1099
+ const slot = skeleton.slots[this.slotIndex];
1196
1100
  if (!slot.bone.active)
1197
1101
  return;
1198
- if (direction == MixDirection.mixOut) {
1199
- if (blend == MixBlend.setup)
1200
- this.setAttachment(skeleton, slot, slot.data.attachmentName);
1201
- return;
1202
- }
1203
- if (time < this.frames[0]) {
1204
- if (blend == MixBlend.setup || blend == MixBlend.first)
1205
- this.setAttachment(skeleton, slot, slot.data.attachmentName);
1206
- return;
1102
+ const pose = appliedPose ? slot.appliedPose : slot.pose;
1103
+ if (out || time < this.frames[0]) {
1104
+ if (fromSetup)
1105
+ this.setAttachment(skeleton, pose, slot.data.attachmentName);
1207
1106
  }
1208
- this.setAttachment(skeleton, slot, this.attachmentNames[Timeline.search1(this.frames, time)]);
1107
+ else
1108
+ this.setAttachment(skeleton, pose, this.attachmentNames[Timeline.search(this.frames, time)]);
1209
1109
  }
1210
- setAttachment(skeleton, slot, attachmentName) {
1211
- slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
1110
+ setAttachment(skeleton, pose, attachmentName) {
1111
+ pose.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
1212
1112
  }
1213
1113
  }
1214
- /** Changes a slot's {@link Slot#deform} to deform a {@link VertexAttachment}. */
1114
+ /** Changes {@link SlotPose.deform} to deform a {@link VertexAttachment}. */
1215
1115
  export class DeformTimeline extends CurveTimeline {
1216
- slotIndex = 0;
1217
- /** The attachment that will be deformed. */
1116
+ slotIndex;
1117
+ /** The attachment that will be deformed.
1118
+ *
1119
+ * See {@link VertexAttachment.getTimelineAttachment}. */
1218
1120
  attachment;
1219
1121
  /** The vertices for each key frame. */
1220
1122
  vertices;
1221
1123
  constructor(frameCount, bezierCount, slotIndex, attachment) {
1222
- super(frameCount, bezierCount, [
1223
- Property.deform + "|" + slotIndex + "|" + attachment.id
1224
- ]);
1124
+ super(frameCount, bezierCount, `${Property.deform}|${slotIndex}|${attachment.id}`);
1225
1125
  this.slotIndex = slotIndex;
1226
1126
  this.attachment = attachment;
1227
1127
  this.vertices = new Array(frameCount);
1128
+ this.additive = true;
1228
1129
  }
1229
1130
  getFrameCount() {
1230
1131
  return this.frames.length;
1231
1132
  }
1232
- /** Sets the time in seconds and the vertices for the specified key frame.
1133
+ /** Sets the time and vertices for the specified frame.
1134
+ * @param frame Between 0 and `frameCount`, inclusive.
1135
+ * @param time The frame time in seconds.
1233
1136
  * @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */
1234
1137
  setFrame(frame, time, vertices) {
1235
1138
  this.frames[frame] = time;
@@ -1238,12 +1141,12 @@ export class DeformTimeline extends CurveTimeline {
1238
1141
  /** @param value1 Ignored (0 is used for a deform timeline).
1239
1142
  * @param value2 Ignored (1 is used for a deform timeline). */
1240
1143
  setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
1241
- let curves = this.curves;
1144
+ const curves = this.curves;
1242
1145
  let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
1243
- if (value == 0)
1146
+ if (value === 0)
1244
1147
  curves[frame] = 2 /*BEZIER*/ + i;
1245
- let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06;
1246
- let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = (cy1 - cy2 + 0.33333333) * 0.018;
1148
+ const tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06;
1149
+ const dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = (cy1 - cy2 + 0.33333333) * 0.018;
1247
1150
  let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
1248
1151
  let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = cy1 * 0.3 + tmpy + dddy * 0.16666667;
1249
1152
  let x = time1 + dx, y = dy;
@@ -1259,222 +1162,308 @@ export class DeformTimeline extends CurveTimeline {
1259
1162
  }
1260
1163
  }
1261
1164
  getCurvePercent(time, frame) {
1262
- let curves = this.curves;
1165
+ const curves = this.curves;
1263
1166
  let i = curves[frame];
1264
1167
  switch (i) {
1265
- case 0 /*LINEAR*/:
1266
- let x = this.frames[frame];
1168
+ case 0 /*LINEAR*/: {
1169
+ const x = this.frames[frame];
1267
1170
  return (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
1171
+ }
1268
1172
  case 1 /*STEPPED*/:
1269
1173
  return 0;
1270
1174
  }
1271
1175
  i -= 2 /*BEZIER*/;
1272
1176
  if (curves[i] > time) {
1273
- let x = this.frames[frame];
1177
+ const x = this.frames[frame];
1274
1178
  return curves[i + 1] * (time - x) / (curves[i] - x);
1275
1179
  }
1276
- let n = i + 18 /*BEZIER_SIZE*/;
1180
+ const n = i + 18 /*BEZIER_SIZE*/;
1277
1181
  for (i += 2; i < n; i += 2) {
1278
1182
  if (curves[i] >= time) {
1279
- let x = curves[i - 2], y = curves[i - 1];
1183
+ const x = curves[i - 2], y = curves[i - 1];
1280
1184
  return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
1281
1185
  }
1282
1186
  }
1283
- let x = curves[n - 2], y = curves[n - 1];
1187
+ const x = curves[n - 2], y = curves[n - 1];
1284
1188
  return y + (1 - y) * (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
1285
1189
  }
1286
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1287
- let slot = skeleton.slots[this.slotIndex];
1288
- if (!slot.bone.active)
1289
- return;
1290
- let slotAttachment = slot.getAttachment();
1291
- if (!slotAttachment)
1292
- return;
1293
- if (!(slotAttachment instanceof VertexAttachment) || slotAttachment.timelineAttachment != this.attachment)
1190
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
1191
+ const slots = skeleton.slots;
1192
+ if (!this.attachment.isTimelineActive(slots, this.slotIndex, appliedPose))
1294
1193
  return;
1295
- let deform = slot.deform;
1296
- if (deform.length == 0)
1297
- blend = MixBlend.setup;
1298
- let vertices = this.vertices;
1299
- let vertexCount = vertices[0].length;
1300
- let frames = this.frames;
1194
+ const timelineSlots = this.attachment.timelineSlots;
1195
+ const frames = this.frames;
1301
1196
  if (time < frames[0]) {
1302
- switch (blend) {
1303
- case MixBlend.setup:
1304
- deform.length = 0;
1305
- return;
1306
- case MixBlend.first:
1307
- if (alpha == 1) {
1308
- deform.length = 0;
1309
- return;
1310
- }
1311
- deform.length = vertexCount;
1312
- let vertexAttachment = slotAttachment;
1313
- if (!vertexAttachment.bones) {
1314
- // Unweighted vertex positions.
1315
- let setupVertices = vertexAttachment.vertices;
1316
- for (var i = 0; i < vertexCount; i++)
1317
- deform[i] += (setupVertices[i] - deform[i]) * alpha;
1318
- }
1319
- else {
1320
- // Weighted deform offsets.
1321
- alpha = 1 - alpha;
1322
- for (var i = 0; i < vertexCount; i++)
1323
- deform[i] *= alpha;
1324
- }
1325
- }
1197
+ this.applyBeforeFirst(slots[this.slotIndex], appliedPose, fromSetup);
1198
+ for (const slotIndex of timelineSlots)
1199
+ this.applyBeforeFirst(slots[slotIndex], appliedPose, fromSetup);
1326
1200
  return;
1327
1201
  }
1328
- deform.length = vertexCount;
1202
+ let v1, v2;
1203
+ let percent;
1329
1204
  if (time >= frames[frames.length - 1]) {
1330
- let lastVertices = vertices[frames.length - 1];
1331
- if (alpha == 1) {
1332
- if (blend == MixBlend.add) {
1333
- let vertexAttachment = slotAttachment;
1334
- if (!vertexAttachment.bones) {
1335
- // Unweighted vertex positions, with alpha.
1336
- let setupVertices = vertexAttachment.vertices;
1205
+ percent = 0;
1206
+ v1 = this.vertices[frames.length - 1];
1207
+ v2 = null;
1208
+ }
1209
+ else {
1210
+ const frame = Timeline.search(frames, time);
1211
+ percent = this.getCurvePercent(time, frame);
1212
+ v1 = this.vertices[frame];
1213
+ v2 = this.vertices[frame + 1];
1214
+ }
1215
+ const vertexCount = this.vertices[0].length;
1216
+ this.applyToSlot(slots[this.slotIndex], appliedPose, v1, v2, percent, vertexCount, alpha, fromSetup, add);
1217
+ for (const slotIndex of timelineSlots)
1218
+ this.applyToSlot(slots[slotIndex], appliedPose, v1, v2, percent, vertexCount, alpha, fromSetup, add);
1219
+ }
1220
+ applyToSlot(slot, appliedPose, v1, v2, percent, vertexCount, alpha, fromSetup, add) {
1221
+ if (!slot.bone.active)
1222
+ return;
1223
+ const pose = appliedPose ? slot.appliedPose : slot.pose;
1224
+ if (pose.attachment === null || pose.attachment.timelineAttachment !== this.attachment)
1225
+ return;
1226
+ const vertexAttachment = pose.attachment;
1227
+ const deform = pose.deform;
1228
+ if (deform.length === 0)
1229
+ fromSetup = true;
1230
+ deform.length = vertexCount;
1231
+ if (v2 === null) { // Time is after last frame.
1232
+ if (alpha === 1) {
1233
+ if (add && !fromSetup) {
1234
+ if (!vertexAttachment.bones) { // Unweighted vertex positions, no alpha.
1235
+ const setupVertices = vertexAttachment.vertices;
1337
1236
  for (let i = 0; i < vertexCount; i++)
1338
- deform[i] += lastVertices[i] - setupVertices[i];
1237
+ deform[i] += v1[i] - setupVertices[i];
1339
1238
  }
1340
- else {
1341
- // Weighted deform offsets, with alpha.
1239
+ else { // Weighted deform offsets, no alpha.
1342
1240
  for (let i = 0; i < vertexCount; i++)
1343
- deform[i] += lastVertices[i];
1241
+ deform[i] += v1[i];
1344
1242
  }
1345
1243
  }
1346
- else
1347
- Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount);
1244
+ else // Vertex positions or deform offsets, no alpha.
1245
+ Utils.arrayCopy(v1, 0, deform, 0, vertexCount);
1348
1246
  }
1349
- else {
1350
- switch (blend) {
1351
- case MixBlend.setup: {
1352
- let vertexAttachment = slotAttachment;
1353
- if (!vertexAttachment.bones) {
1354
- // Unweighted vertex positions, with alpha.
1355
- let setupVertices = vertexAttachment.vertices;
1356
- for (let i = 0; i < vertexCount; i++) {
1357
- let setup = setupVertices[i];
1358
- deform[i] = setup + (lastVertices[i] - setup) * alpha;
1359
- }
1360
- }
1361
- else {
1362
- // Weighted deform offsets, with alpha.
1363
- for (let i = 0; i < vertexCount; i++)
1364
- deform[i] = lastVertices[i] * alpha;
1365
- }
1366
- break;
1247
+ else if (fromSetup) {
1248
+ if (!vertexAttachment.bones) { // Unweighted vertex positions, with alpha.
1249
+ const setupVertices = vertexAttachment.vertices;
1250
+ for (let i = 0; i < vertexCount; i++) {
1251
+ const setup = setupVertices[i];
1252
+ deform[i] = setup + (v1[i] - setup) * alpha;
1367
1253
  }
1368
- case MixBlend.first:
1369
- case MixBlend.replace:
1370
- for (let i = 0; i < vertexCount; i++)
1371
- deform[i] += (lastVertices[i] - deform[i]) * alpha;
1372
- break;
1373
- case MixBlend.add:
1374
- let vertexAttachment = slotAttachment;
1375
- if (!vertexAttachment.bones) {
1376
- // Unweighted vertex positions, with alpha.
1377
- let setupVertices = vertexAttachment.vertices;
1378
- for (let i = 0; i < vertexCount; i++)
1379
- deform[i] += (lastVertices[i] - setupVertices[i]) * alpha;
1254
+ }
1255
+ else { // Weighted deform offsets, with alpha.
1256
+ for (let i = 0; i < vertexCount; i++)
1257
+ deform[i] = v1[i] * alpha;
1258
+ }
1259
+ }
1260
+ else if (add) {
1261
+ if (!vertexAttachment.bones) { // Unweighted vertex positions, no alpha.
1262
+ const setupVertices = vertexAttachment.vertices;
1263
+ for (let i = 0; i < vertexCount; i++)
1264
+ deform[i] += (v1[i] - setupVertices[i]) * alpha;
1265
+ }
1266
+ else { // Weighted deform offsets, alpha.
1267
+ for (let i = 0; i < vertexCount; i++)
1268
+ deform[i] += v1[i] * alpha;
1269
+ }
1270
+ }
1271
+ else { // Vertex positions or deform offsets, with alpha.
1272
+ for (let i = 0; i < vertexCount; i++)
1273
+ deform[i] += (v1[i] - deform[i]) * alpha;
1274
+ }
1275
+ }
1276
+ else { // Between frames.
1277
+ if (alpha === 1) {
1278
+ if (add && !fromSetup) {
1279
+ if (!vertexAttachment.bones) { // Unweighted vertex positions, no alpha.
1280
+ const setupVertices = vertexAttachment.vertices;
1281
+ for (let i = 0; i < vertexCount; i++) {
1282
+ const prev = v1[i];
1283
+ deform[i] += prev + (v2[i] - prev) * percent - setupVertices[i];
1380
1284
  }
1381
- else {
1382
- // Weighted deform offsets, with alpha.
1383
- for (let i = 0; i < vertexCount; i++)
1384
- deform[i] += lastVertices[i] * alpha;
1285
+ }
1286
+ else { // Weighted deform offsets, no alpha.
1287
+ for (let i = 0; i < vertexCount; i++) {
1288
+ const prev = v1[i];
1289
+ deform[i] += prev + (v2[i] - prev) * percent;
1385
1290
  }
1291
+ }
1292
+ }
1293
+ else if (percent === 0)
1294
+ Utils.arrayCopy(v1, 0, deform, 0, vertexCount);
1295
+ else { // Vertex positions or deform offsets, no alpha.
1296
+ for (let i = 0; i < vertexCount; i++) {
1297
+ const prev = v1[i];
1298
+ deform[i] = prev + (v2[i] - prev) * percent;
1299
+ }
1386
1300
  }
1387
1301
  }
1388
- return;
1389
- }
1390
- // Interpolate between the previous frame and the current frame.
1391
- let frame = Timeline.search1(frames, time);
1392
- let percent = this.getCurvePercent(time, frame);
1393
- let prevVertices = vertices[frame];
1394
- let nextVertices = vertices[frame + 1];
1395
- if (alpha == 1) {
1396
- if (blend == MixBlend.add) {
1397
- let vertexAttachment = slotAttachment;
1398
- if (!vertexAttachment.bones) {
1399
- // Unweighted vertex positions, with alpha.
1400
- let setupVertices = vertexAttachment.vertices;
1302
+ else if (fromSetup) {
1303
+ if (!vertexAttachment.bones) { // Unweighted vertex positions, with alpha.
1304
+ const setupVertices = vertexAttachment.vertices;
1305
+ for (let i = 0; i < vertexCount; i++) {
1306
+ const prev = v1[i], setup = setupVertices[i];
1307
+ deform[i] = setup + (prev + (v2[i] - prev) * percent - setup) * alpha;
1308
+ }
1309
+ }
1310
+ else { // Weighted deform offsets, with alpha.
1311
+ for (let i = 0; i < vertexCount; i++) {
1312
+ const prev = v1[i];
1313
+ deform[i] = (prev + (v2[i] - prev) * percent) * alpha;
1314
+ }
1315
+ }
1316
+ }
1317
+ else if (add) {
1318
+ if (!vertexAttachment.bones) { // Unweighted vertex positions, with alpha.
1319
+ const setupVertices = vertexAttachment.vertices;
1401
1320
  for (let i = 0; i < vertexCount; i++) {
1402
- let prev = prevVertices[i];
1403
- deform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];
1321
+ const prev = v1[i];
1322
+ deform[i] += (prev + (v2[i] - prev) * percent - setupVertices[i]) * alpha;
1404
1323
  }
1405
1324
  }
1406
- else {
1407
- // Weighted deform offsets, with alpha.
1325
+ else { // Weighted deform offsets, with alpha.
1408
1326
  for (let i = 0; i < vertexCount; i++) {
1409
- let prev = prevVertices[i];
1410
- deform[i] += prev + (nextVertices[i] - prev) * percent;
1327
+ const prev = v1[i];
1328
+ deform[i] += (prev + (v2[i] - prev) * percent) * alpha;
1411
1329
  }
1412
1330
  }
1413
1331
  }
1414
1332
  else {
1415
1333
  for (let i = 0; i < vertexCount; i++) {
1416
- let prev = prevVertices[i];
1417
- deform[i] = prev + (nextVertices[i] - prev) * percent;
1334
+ const prev = v1[i];
1335
+ deform[i] += (prev + (v2[i] - prev) * percent - deform[i]) * alpha;
1418
1336
  }
1419
1337
  }
1420
1338
  }
1421
- else {
1422
- switch (blend) {
1423
- case MixBlend.setup: {
1424
- let vertexAttachment = slotAttachment;
1425
- if (!vertexAttachment.bones) {
1426
- // Unweighted vertex positions, with alpha.
1427
- let setupVertices = vertexAttachment.vertices;
1428
- for (let i = 0; i < vertexCount; i++) {
1429
- let prev = prevVertices[i], setup = setupVertices[i];
1430
- deform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;
1431
- }
1432
- }
1433
- else {
1434
- // Weighted deform offsets, with alpha.
1435
- for (let i = 0; i < vertexCount; i++) {
1436
- let prev = prevVertices[i];
1437
- deform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;
1438
- }
1439
- }
1339
+ }
1340
+ applyBeforeFirst(slot, appliedPose, fromSetup) {
1341
+ if (!slot.bone.active)
1342
+ return;
1343
+ const pose = appliedPose ? slot.appliedPose : slot.pose;
1344
+ if (pose.attachment == null || pose.attachment.timelineAttachment !== this.attachment)
1345
+ return;
1346
+ if (pose.deform.length === 0)
1347
+ fromSetup = true;
1348
+ if (fromSetup)
1349
+ pose.deform.length = 0;
1350
+ }
1351
+ }
1352
+ /** Changes {@link Slot.getSequenceIndex} for an attachment's {@link Sequence}. */
1353
+ export class SequenceTimeline extends Timeline {
1354
+ static ENTRIES = 3;
1355
+ static MODE = 1;
1356
+ static DELAY = 2;
1357
+ slotIndex;
1358
+ attachment;
1359
+ constructor(frameCount, slotIndex, attachment) {
1360
+ super(frameCount, `${Property.sequence}|${slotIndex}|${attachment.sequence.id}`);
1361
+ this.slotIndex = slotIndex;
1362
+ this.attachment = attachment;
1363
+ this.instant = true;
1364
+ }
1365
+ getFrameEntries() {
1366
+ return SequenceTimeline.ENTRIES;
1367
+ }
1368
+ getSlotIndex() {
1369
+ return this.slotIndex;
1370
+ }
1371
+ /** The attachment for which the {@link SlotPose.sequenceIndex} will be set.
1372
+ *
1373
+ * See {@link VertexAttachment.timelineAttachment}. */
1374
+ getAttachment() {
1375
+ return this.attachment;
1376
+ }
1377
+ /** Sets the time, mode, index, and frame time for the specified frame.
1378
+ * @param frame Between 0 and `frameCount`, inclusive.
1379
+ * @param time Seconds between frames. */
1380
+ setFrame(frame, time, mode, index, delay) {
1381
+ const frames = this.frames;
1382
+ frame *= SequenceTimeline.ENTRIES;
1383
+ frames[frame] = time;
1384
+ frames[frame + SequenceTimeline.MODE] = mode | (index << 4);
1385
+ frames[frame + SequenceTimeline.DELAY] = delay;
1386
+ }
1387
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
1388
+ const slots = skeleton.slots;
1389
+ if (!this.attachment.isTimelineActive(slots, this.slotIndex, appliedPose))
1390
+ return;
1391
+ const timelineSlots = this.attachment.timelineSlots;
1392
+ const frames = this.frames;
1393
+ if (out || time < frames[0]) {
1394
+ if (fromSetup) {
1395
+ this.setupPose(slots[this.slotIndex], appliedPose);
1396
+ for (const slotIndex of timelineSlots)
1397
+ this.setupPose(slots[slotIndex], appliedPose);
1398
+ }
1399
+ return;
1400
+ }
1401
+ const i = Timeline.search(frames, time, SequenceTimeline.ENTRIES);
1402
+ const before = frames[i];
1403
+ const modeAndIndex = frames[i + SequenceTimeline.MODE];
1404
+ const delay = frames[i + SequenceTimeline.DELAY];
1405
+ this.applyToSlot(slots[this.slotIndex], appliedPose, time, before, modeAndIndex, delay);
1406
+ for (const slotIndex of timelineSlots)
1407
+ this.applyToSlot(slots[slotIndex], appliedPose, time, before, modeAndIndex, delay);
1408
+ }
1409
+ setupPose(slot, appliedPose) {
1410
+ if (!slot.bone.active)
1411
+ return;
1412
+ const pose = appliedPose ? slot.appliedPose : slot.pose;
1413
+ if (pose.attachment === null || pose.attachment.timelineAttachment !== this.attachment)
1414
+ return;
1415
+ pose.sequenceIndex = -1;
1416
+ }
1417
+ applyToSlot(slot, appliedPose, time, before, modeAndIndex, delay) {
1418
+ if (!slot.bone.active)
1419
+ return;
1420
+ const pose = appliedPose ? slot.appliedPose : slot.pose;
1421
+ if (pose.attachment === null || pose.attachment.timelineAttachment !== this.attachment)
1422
+ return;
1423
+ let index = modeAndIndex >> 4, count = pose.attachment.sequence.regions.length;
1424
+ const mode = SequenceModeValues[modeAndIndex & 0xf];
1425
+ if (mode !== SequenceMode.hold) {
1426
+ index += (((time - before) / delay + 0.00001) | 0);
1427
+ switch (mode) {
1428
+ case SequenceMode.once:
1429
+ index = Math.min(count - 1, index);
1430
+ break;
1431
+ case SequenceMode.loop:
1432
+ index %= count;
1433
+ break;
1434
+ case SequenceMode.pingpong: {
1435
+ const n = (count << 1) - 2;
1436
+ index = n === 0 ? 0 : index % n;
1437
+ if (index >= count)
1438
+ index = n - index;
1440
1439
  break;
1441
1440
  }
1442
- case MixBlend.first:
1443
- case MixBlend.replace:
1444
- for (let i = 0; i < vertexCount; i++) {
1445
- let prev = prevVertices[i];
1446
- deform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;
1447
- }
1441
+ case SequenceMode.onceReverse:
1442
+ index = Math.max(count - 1 - index, 0);
1448
1443
  break;
1449
- case MixBlend.add:
1450
- let vertexAttachment = slotAttachment;
1451
- if (!vertexAttachment.bones) {
1452
- // Unweighted vertex positions, with alpha.
1453
- let setupVertices = vertexAttachment.vertices;
1454
- for (let i = 0; i < vertexCount; i++) {
1455
- let prev = prevVertices[i];
1456
- deform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;
1457
- }
1458
- }
1459
- else {
1460
- // Weighted deform offsets, with alpha.
1461
- for (let i = 0; i < vertexCount; i++) {
1462
- let prev = prevVertices[i];
1463
- deform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;
1464
- }
1465
- }
1444
+ case SequenceMode.loopReverse:
1445
+ index = count - 1 - (index % count);
1446
+ break;
1447
+ case SequenceMode.pingpongReverse: {
1448
+ const n = (count << 1) - 2;
1449
+ index = n === 0 ? 0 : (index + count - 1) % n;
1450
+ if (index >= count)
1451
+ index = n - index;
1452
+ }
1466
1453
  }
1467
1454
  }
1455
+ pose.sequenceIndex = index;
1468
1456
  }
1469
1457
  }
1470
1458
  /** Fires an {@link Event} when specific animation times are reached. */
1471
1459
  export class EventTimeline extends Timeline {
1472
- static propertyIds = ["" + Property.event];
1460
+ static propertyIds = [`${Property.event}`];
1473
1461
  /** The event for each key frame. */
1474
1462
  events;
1475
1463
  constructor(frameCount) {
1476
- super(frameCount, EventTimeline.propertyIds);
1464
+ super(frameCount, ...EventTimeline.propertyIds);
1477
1465
  this.events = new Array(frameCount);
1466
+ this.instant = true;
1478
1467
  }
1479
1468
  getFrameCount() {
1480
1469
  return this.frames.length;
@@ -1485,13 +1474,13 @@ export class EventTimeline extends Timeline {
1485
1474
  this.events[frame] = event;
1486
1475
  }
1487
1476
  /** Fires events for frames > `lastTime` and <= `time`. */
1488
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1477
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1489
1478
  if (!firedEvents)
1490
1479
  return;
1491
- let frames = this.frames;
1492
- let frameCount = this.frames.length;
1480
+ const frames = this.frames;
1481
+ const frameCount = this.frames.length;
1493
1482
  if (lastTime > time) { // Apply after lastTime for looped animations.
1494
- this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);
1483
+ this.apply(null, lastTime, Number.MAX_VALUE, firedEvents, 0, false, false, false, false);
1495
1484
  lastTime = -1;
1496
1485
  }
1497
1486
  else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.
@@ -1502,10 +1491,10 @@ export class EventTimeline extends Timeline {
1502
1491
  if (lastTime < frames[0])
1503
1492
  i = 0;
1504
1493
  else {
1505
- i = Timeline.search1(frames, lastTime) + 1;
1506
- let frameTime = frames[i];
1494
+ i = Timeline.search(frames, lastTime) + 1;
1495
+ const frameTime = frames[i];
1507
1496
  while (i > 0) { // Fire multiple events with the same frame.
1508
- if (frames[i - 1] != frameTime)
1497
+ if (frames[i - 1] !== frameTime)
1509
1498
  break;
1510
1499
  i--;
1511
1500
  }
@@ -1514,63 +1503,140 @@ export class EventTimeline extends Timeline {
1514
1503
  firedEvents.push(this.events[i]);
1515
1504
  }
1516
1505
  }
1517
- /** Changes a skeleton's {@link Skeleton#drawOrder}. */
1506
+ /** Changes the {@link Skeleton.getDrawOrder}. */
1518
1507
  export class DrawOrderTimeline extends Timeline {
1519
- static propertyIds = ["" + Property.drawOrder];
1520
- /** The draw order for each key frame. See {@link #setFrame(int, float, int[])}. */
1508
+ static propertyID = `${Property.drawOrder}`;
1509
+ static propertyIds = [DrawOrderTimeline.propertyID];
1510
+ /** The draw order for each key frame. See {@link setFrame}. */
1521
1511
  drawOrders;
1522
1512
  constructor(frameCount) {
1523
- super(frameCount, DrawOrderTimeline.propertyIds);
1513
+ super(frameCount, ...DrawOrderTimeline.propertyIds);
1524
1514
  this.drawOrders = new Array(frameCount);
1515
+ this.instant = true;
1525
1516
  }
1526
1517
  getFrameCount() {
1527
1518
  return this.frames.length;
1528
1519
  }
1529
1520
  /** Sets the time in seconds and the draw order for the specified key frame.
1530
- * @param drawOrder For each slot in {@link Skeleton#slots}, the index of the new draw order. May be null to use setup pose
1521
+ * @param drawOrder Ordered {@link Skeleton.slots} indices, or null to use setup pose
1531
1522
  * draw order. */
1532
1523
  setFrame(frame, time, drawOrder) {
1533
1524
  this.frames[frame] = time;
1534
1525
  this.drawOrders[frame] = drawOrder;
1535
1526
  }
1536
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1537
- if (direction == MixDirection.mixOut) {
1538
- if (blend == MixBlend.setup)
1539
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1527
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1528
+ const pose = (appliedPose ? skeleton.drawOrder.appliedPose : skeleton.drawOrder.pose);
1529
+ const setup = skeleton.slots;
1530
+ if (out || time < this.frames[0]) {
1531
+ if (fromSetup)
1532
+ Utils.arrayCopy(setup, 0, pose, 0, skeleton.slots.length);
1540
1533
  return;
1541
1534
  }
1542
- if (time < this.frames[0]) {
1543
- if (blend == MixBlend.setup || blend == MixBlend.first)
1544
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1545
- return;
1535
+ const order = this.drawOrders[Timeline.search(this.frames, time)];
1536
+ if (!order)
1537
+ Utils.arrayCopy(setup, 0, pose, 0, skeleton.slots.length);
1538
+ else {
1539
+ for (let i = 0, n = order.length; i < n; i++)
1540
+ pose[i] = setup[order[i]];
1541
+ }
1542
+ }
1543
+ }
1544
+ /** Changes a subset of the {@link Skeleton.getDrawOrder | draw order}. */
1545
+ export class DrawOrderFolderTimeline extends Timeline {
1546
+ slots;
1547
+ inFolder;
1548
+ drawOrders;
1549
+ /** @param slots {@link Skeleton.slots} indices controlled by this timeline, in setup order.
1550
+ * @param slotCount The maximum number of slots in the skeleton. */
1551
+ constructor(frameCount, slots, slotCount) {
1552
+ super(frameCount, ...DrawOrderFolderTimeline.propertyIds(slots));
1553
+ this.slots = slots;
1554
+ this.drawOrders = new Array(frameCount);
1555
+ this.inFolder = new Array(slotCount);
1556
+ for (const i of slots)
1557
+ this.inFolder[i] = true;
1558
+ this.instant = true;
1559
+ }
1560
+ static propertyIds(slots) {
1561
+ const n = slots.length;
1562
+ const ids = new Array(n);
1563
+ for (let i = 0; i < n; i++)
1564
+ ids[i] = `d${slots[i]}`;
1565
+ return ids;
1566
+ }
1567
+ getFrameCount() {
1568
+ return this.frames.length;
1569
+ }
1570
+ /** The {@link Skeleton.getSlots} indices that this timeline affects, in setup order. */
1571
+ getSlots() {
1572
+ return this.slots;
1573
+ }
1574
+ /** The draw order for each frame. See {@link setFrame}. */
1575
+ getDrawOrders() {
1576
+ return this.drawOrders;
1577
+ }
1578
+ /** Sets the time and draw order for the specified frame.
1579
+ * @param frame Between 0 and `frameCount`, inclusive.
1580
+ * @param time The frame time in seconds.
1581
+ * @param drawOrder Ordered {@link getSlots} indices, or null to use setup pose order. */
1582
+ setFrame(frame, time, drawOrder) {
1583
+ this.frames[frame] = time;
1584
+ this.drawOrders[frame] = drawOrder;
1585
+ }
1586
+ apply(skeleton, lastTime, time, events, alpha, fromSetup, add, out, appliedPose) {
1587
+ const pose = (appliedPose ? skeleton.drawOrder.appliedPose : skeleton.drawOrder.pose);
1588
+ const setup = skeleton.slots;
1589
+ if (out || time < this.frames[0]) {
1590
+ if (fromSetup)
1591
+ this.setup(pose, setup);
1546
1592
  }
1547
- let idx = Timeline.search1(this.frames, time);
1548
- let drawOrderToSetupIndex = this.drawOrders[idx];
1549
- if (!drawOrderToSetupIndex)
1550
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1551
1593
  else {
1552
- let drawOrder = skeleton.drawOrder;
1553
- let slots = skeleton.slots;
1554
- for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++)
1555
- drawOrder[i] = slots[drawOrderToSetupIndex[i]];
1594
+ const order = this.drawOrders[Timeline.search(this.frames, time)];
1595
+ if (!order)
1596
+ this.setup(pose, setup);
1597
+ else {
1598
+ const inFolder = this.inFolder;
1599
+ const slots = this.slots;
1600
+ for (let i = 0, found = 0, done = slots.length;; i++) {
1601
+ if (inFolder[pose[i].data.index]) {
1602
+ pose[i] = setup[slots[order[found]]];
1603
+ if (++found === done)
1604
+ break;
1605
+ }
1606
+ }
1607
+ }
1608
+ }
1609
+ }
1610
+ setup(pose, setup) {
1611
+ const { inFolder, slots } = this;
1612
+ for (let i = 0, found = 0, done = slots.length;; i++) {
1613
+ if (inFolder[pose[i].data.index]) {
1614
+ pose[i] = setup[slots[found]];
1615
+ if (++found === done)
1616
+ break;
1617
+ }
1556
1618
  }
1557
1619
  }
1558
1620
  }
1559
- /** Changes an IK constraint's {@link IkConstraint#mix}, {@link IkConstraint#softness},
1560
- * {@link IkConstraint#bendDirection}, {@link IkConstraint#stretch}, and {@link IkConstraint#compress}. */
1621
+ export function isConstraintTimeline(obj) {
1622
+ return typeof obj === 'object' && obj !== null && typeof obj.constraintIndex === 'number';
1623
+ }
1624
+ /** Changes {@link IkConstraintPose.mix)}, {@link IkConstraintPose.softness},
1625
+ * {@link IkConstraintPose.bendDirection}, {@link IkConstraintPose.stretch}, and
1626
+ * {@link IkConstraintPose.compress}. */
1561
1627
  export class IkConstraintTimeline extends CurveTimeline {
1562
- /** The index of the IK constraint in {@link Skeleton#getIkConstraints()} that will be changed when this timeline is applied */
1563
1628
  constraintIndex = 0;
1564
- constructor(frameCount, bezierCount, ikConstraintIndex) {
1565
- super(frameCount, bezierCount, [
1566
- Property.ikConstraint + "|" + ikConstraintIndex
1567
- ]);
1568
- this.constraintIndex = ikConstraintIndex;
1629
+ constructor(frameCount, bezierCount, constraintIndex) {
1630
+ super(frameCount, bezierCount, `${Property.ikConstraint}|${constraintIndex}`);
1631
+ this.constraintIndex = constraintIndex;
1569
1632
  }
1570
1633
  getFrameEntries() {
1571
1634
  return 6 /*ENTRIES*/;
1572
1635
  }
1573
- /** Sets the time in seconds, mix, softness, bend direction, compress, and stretch for the specified key frame. */
1636
+ /** Sets the time, mix, softness, bend direction, compress, and stretch for the specified frame.
1637
+ * @param frame Between 0 and `frameCount`, inclusive.
1638
+ * @param time The frame time in seconds.
1639
+ * @param bendDirection 1 or -1. */
1574
1640
  setFrame(frame, time, mix, softness, bendDirection, compress, stretch) {
1575
1641
  frame *= 6 /*ENTRIES*/;
1576
1642
  this.frames[frame] = time;
@@ -1580,41 +1646,36 @@ export class IkConstraintTimeline extends CurveTimeline {
1580
1646
  this.frames[frame + 4 /*COMPRESS*/] = compress ? 1 : 0;
1581
1647
  this.frames[frame + 5 /*STRETCH*/] = stretch ? 1 : 0;
1582
1648
  }
1583
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1584
- let constraint = skeleton.ikConstraints[this.constraintIndex];
1649
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1650
+ const constraint = skeleton.constraints[this.constraintIndex];
1585
1651
  if (!constraint.active)
1586
1652
  return;
1587
- let frames = this.frames;
1653
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
1654
+ const frames = this.frames;
1588
1655
  if (time < frames[0]) {
1589
- switch (blend) {
1590
- case MixBlend.setup:
1591
- constraint.mix = constraint.data.mix;
1592
- constraint.softness = constraint.data.softness;
1593
- constraint.bendDirection = constraint.data.bendDirection;
1594
- constraint.compress = constraint.data.compress;
1595
- constraint.stretch = constraint.data.stretch;
1596
- return;
1597
- case MixBlend.first:
1598
- constraint.mix += (constraint.data.mix - constraint.mix) * alpha;
1599
- constraint.softness += (constraint.data.softness - constraint.softness) * alpha;
1600
- constraint.bendDirection = constraint.data.bendDirection;
1601
- constraint.compress = constraint.data.compress;
1602
- constraint.stretch = constraint.data.stretch;
1656
+ if (fromSetup) {
1657
+ const setup = constraint.data.setupPose;
1658
+ pose.mix = setup.mix;
1659
+ pose.softness = setup.softness;
1660
+ pose.bendDirection = setup.bendDirection;
1661
+ pose.compress = setup.compress;
1662
+ pose.stretch = setup.stretch;
1603
1663
  }
1604
1664
  return;
1605
1665
  }
1606
1666
  let mix = 0, softness = 0;
1607
- let i = Timeline.search(frames, time, 6 /*ENTRIES*/);
1608
- let curveType = this.curves[i / 6 /*ENTRIES*/];
1667
+ const i = Timeline.search(frames, time, 6 /*ENTRIES*/);
1668
+ const curveType = this.curves[i / 6 /*ENTRIES*/];
1609
1669
  switch (curveType) {
1610
- case 0 /*LINEAR*/:
1611
- let before = frames[i];
1670
+ case 0 /*LINEAR*/: {
1671
+ const before = frames[i];
1612
1672
  mix = frames[i + 1 /*MIX*/];
1613
1673
  softness = frames[i + 2 /*SOFTNESS*/];
1614
- let t = (time - before) / (frames[i + 6 /*ENTRIES*/] - before);
1674
+ const t = (time - before) / (frames[i + 6 /*ENTRIES*/] - before);
1615
1675
  mix += (frames[i + 6 /*ENTRIES*/ + 1 /*MIX*/] - mix) * t;
1616
1676
  softness += (frames[i + 6 /*ENTRIES*/ + 2 /*SOFTNESS*/] - softness) * t;
1617
1677
  break;
1678
+ }
1618
1679
  case 1 /*STEPPED*/:
1619
1680
  mix = frames[i + 1 /*MIX*/];
1620
1681
  softness = frames[i + 2 /*SOFTNESS*/];
@@ -1623,48 +1684,42 @@ export class IkConstraintTimeline extends CurveTimeline {
1623
1684
  mix = this.getBezierValue(time, i, 1 /*MIX*/, curveType - 2 /*BEZIER*/);
1624
1685
  softness = this.getBezierValue(time, i, 2 /*SOFTNESS*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1625
1686
  }
1626
- if (blend == MixBlend.setup) {
1627
- constraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha;
1628
- constraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha;
1629
- if (direction == MixDirection.mixOut) {
1630
- constraint.bendDirection = constraint.data.bendDirection;
1631
- constraint.compress = constraint.data.compress;
1632
- constraint.stretch = constraint.data.stretch;
1633
- }
1634
- else {
1635
- constraint.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
1636
- constraint.compress = frames[i + 4 /*COMPRESS*/] != 0;
1637
- constraint.stretch = frames[i + 5 /*STRETCH*/] != 0;
1687
+ const base = fromSetup ? constraint.data.setupPose : pose;
1688
+ pose.mix = base.mix + (mix - base.mix) * alpha;
1689
+ pose.softness = base.softness + (softness - base.softness) * alpha;
1690
+ if (out) {
1691
+ if (fromSetup) {
1692
+ pose.bendDirection = base.bendDirection;
1693
+ pose.compress = base.compress;
1694
+ pose.stretch = base.stretch;
1638
1695
  }
1639
1696
  }
1640
1697
  else {
1641
- constraint.mix += (mix - constraint.mix) * alpha;
1642
- constraint.softness += (softness - constraint.softness) * alpha;
1643
- if (direction == MixDirection.mixIn) {
1644
- constraint.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
1645
- constraint.compress = frames[i + 4 /*COMPRESS*/] != 0;
1646
- constraint.stretch = frames[i + 5 /*STRETCH*/] != 0;
1647
- }
1698
+ pose.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
1699
+ pose.compress = frames[i + 4 /*COMPRESS*/] !== 0;
1700
+ pose.stretch = frames[i + 5 /*STRETCH*/] !== 0;
1648
1701
  }
1649
1702
  }
1650
1703
  }
1651
- /** Changes a transform constraint's {@link TransformConstraint#rotateMix}, {@link TransformConstraint#translateMix},
1652
- * {@link TransformConstraint#scaleMix}, and {@link TransformConstraint#shearMix}. */
1704
+ /** Changes {@link TransformConstraintPose.mixRotate}, {@link TransformConstraintPose.mixX},
1705
+ * {@link TransformConstraintPose.mixY}, {@link TransformConstraintPose.mixScaleX},
1706
+ * {@link TransformConstraintPose.mixScaleY}, and {@link TransformConstraintPose.mixShearY}. */
1653
1707
  export class TransformConstraintTimeline extends CurveTimeline {
1654
- /** The index of the transform constraint slot in {@link Skeleton#transformConstraints} that will be changed. */
1708
+ /** The index of the transform constraint slot in {@link Skeleton.transformConstraints} that will be changed. */
1655
1709
  constraintIndex = 0;
1656
- constructor(frameCount, bezierCount, transformConstraintIndex) {
1657
- super(frameCount, bezierCount, [
1658
- Property.transformConstraint + "|" + transformConstraintIndex
1659
- ]);
1660
- this.constraintIndex = transformConstraintIndex;
1710
+ constructor(frameCount, bezierCount, constraintIndex) {
1711
+ super(frameCount, bezierCount, `${Property.transformConstraint}|${constraintIndex}`);
1712
+ this.constraintIndex = constraintIndex;
1713
+ this.additive = true;
1661
1714
  }
1662
1715
  getFrameEntries() {
1663
1716
  return 7 /*ENTRIES*/;
1664
1717
  }
1665
- /** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for the specified key frame. */
1718
+ /** Sets the time, rotate mix, translate mix, scale mix, and shear mix for the specified frame.
1719
+ * @param frame Between 0 and `frameCount`, inclusive.
1720
+ * @param time The frame time in seconds. */
1666
1721
  setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY) {
1667
- let frames = this.frames;
1722
+ const frames = this.frames;
1668
1723
  frame *= 7 /*ENTRIES*/;
1669
1724
  frames[frame] = time;
1670
1725
  frames[frame + 1 /*ROTATE*/] = mixRotate;
@@ -1674,45 +1729,37 @@ export class TransformConstraintTimeline extends CurveTimeline {
1674
1729
  frames[frame + 5 /*SCALEY*/] = mixScaleY;
1675
1730
  frames[frame + 6 /*SHEARY*/] = mixShearY;
1676
1731
  }
1677
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1678
- let constraint = skeleton.transformConstraints[this.constraintIndex];
1732
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1733
+ const constraint = skeleton.constraints[this.constraintIndex];
1679
1734
  if (!constraint.active)
1680
1735
  return;
1681
- let frames = this.frames;
1736
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
1737
+ const frames = this.frames;
1682
1738
  if (time < frames[0]) {
1683
- let data = constraint.data;
1684
- switch (blend) {
1685
- case MixBlend.setup:
1686
- constraint.mixRotate = data.mixRotate;
1687
- constraint.mixX = data.mixX;
1688
- constraint.mixY = data.mixY;
1689
- constraint.mixScaleX = data.mixScaleX;
1690
- constraint.mixScaleY = data.mixScaleY;
1691
- constraint.mixShearY = data.mixShearY;
1692
- return;
1693
- case MixBlend.first:
1694
- constraint.mixRotate += (data.mixRotate - constraint.mixRotate) * alpha;
1695
- constraint.mixX += (data.mixX - constraint.mixX) * alpha;
1696
- constraint.mixY += (data.mixY - constraint.mixY) * alpha;
1697
- constraint.mixScaleX += (data.mixScaleX - constraint.mixScaleX) * alpha;
1698
- constraint.mixScaleY += (data.mixScaleY - constraint.mixScaleY) * alpha;
1699
- constraint.mixShearY += (data.mixShearY - constraint.mixShearY) * alpha;
1739
+ if (fromSetup) {
1740
+ const setup = constraint.data.setupPose;
1741
+ pose.mixRotate = setup.mixRotate;
1742
+ pose.mixX = setup.mixX;
1743
+ pose.mixY = setup.mixY;
1744
+ pose.mixScaleX = setup.mixScaleX;
1745
+ pose.mixScaleY = setup.mixScaleY;
1746
+ pose.mixShearY = setup.mixShearY;
1700
1747
  }
1701
1748
  return;
1702
1749
  }
1703
1750
  let rotate, x, y, scaleX, scaleY, shearY;
1704
- let i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1705
- let curveType = this.curves[i / 7 /*ENTRIES*/];
1751
+ const i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1752
+ const curveType = this.curves[i / 7 /*ENTRIES*/];
1706
1753
  switch (curveType) {
1707
- case 0 /*LINEAR*/:
1708
- let before = frames[i];
1754
+ case 0 /*LINEAR*/: {
1755
+ const before = frames[i];
1709
1756
  rotate = frames[i + 1 /*ROTATE*/];
1710
1757
  x = frames[i + 2 /*X*/];
1711
1758
  y = frames[i + 3 /*Y*/];
1712
1759
  scaleX = frames[i + 4 /*SCALEX*/];
1713
1760
  scaleY = frames[i + 5 /*SCALEY*/];
1714
1761
  shearY = frames[i + 6 /*SHEARY*/];
1715
- let t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1762
+ const t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1716
1763
  rotate += (frames[i + 7 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
1717
1764
  x += (frames[i + 7 /*ENTRIES*/ + 2 /*X*/] - x) * t;
1718
1765
  y += (frames[i + 7 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
@@ -1720,6 +1767,7 @@ export class TransformConstraintTimeline extends CurveTimeline {
1720
1767
  scaleY += (frames[i + 7 /*ENTRIES*/ + 5 /*SCALEY*/] - scaleY) * t;
1721
1768
  shearY += (frames[i + 7 /*ENTRIES*/ + 6 /*SHEARY*/] - shearY) * t;
1722
1769
  break;
1770
+ }
1723
1771
  case 1 /*STEPPED*/:
1724
1772
  rotate = frames[i + 1 /*ROTATE*/];
1725
1773
  x = frames[i + 2 /*X*/];
@@ -1736,111 +1784,112 @@ export class TransformConstraintTimeline extends CurveTimeline {
1736
1784
  scaleY = this.getBezierValue(time, i, 5 /*SCALEY*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1737
1785
  shearY = this.getBezierValue(time, i, 6 /*SHEARY*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1738
1786
  }
1739
- if (blend == MixBlend.setup) {
1740
- let data = constraint.data;
1741
- constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
1742
- constraint.mixX = data.mixX + (x - data.mixX) * alpha;
1743
- constraint.mixY = data.mixY + (y - data.mixY) * alpha;
1744
- constraint.mixScaleX = data.mixScaleX + (scaleX - data.mixScaleX) * alpha;
1745
- constraint.mixScaleY = data.mixScaleY + (scaleY - data.mixScaleY) * alpha;
1746
- constraint.mixShearY = data.mixShearY + (shearY - data.mixShearY) * alpha;
1787
+ const base = fromSetup ? constraint.data.setupPose : pose;
1788
+ if (add) {
1789
+ pose.mixRotate = base.mixRotate + rotate * alpha;
1790
+ pose.mixX = base.mixX + x * alpha;
1791
+ pose.mixY = base.mixY + y * alpha;
1792
+ pose.mixScaleX = base.mixScaleX + scaleX * alpha;
1793
+ pose.mixScaleY = base.mixScaleY + scaleY * alpha;
1794
+ pose.mixShearY = base.mixShearY + shearY * alpha;
1747
1795
  }
1748
1796
  else {
1749
- constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
1750
- constraint.mixX += (x - constraint.mixX) * alpha;
1751
- constraint.mixY += (y - constraint.mixY) * alpha;
1752
- constraint.mixScaleX += (scaleX - constraint.mixScaleX) * alpha;
1753
- constraint.mixScaleY += (scaleY - constraint.mixScaleY) * alpha;
1754
- constraint.mixShearY += (shearY - constraint.mixShearY) * alpha;
1797
+ pose.mixRotate = base.mixRotate + (rotate - base.mixRotate) * alpha;
1798
+ pose.mixX = base.mixX + (x - base.mixX) * alpha;
1799
+ pose.mixY = base.mixY + (y - base.mixY) * alpha;
1800
+ pose.mixScaleX = base.mixScaleX + (scaleX - base.mixScaleX) * alpha;
1801
+ pose.mixScaleY = base.mixScaleY + (scaleY - base.mixScaleY) * alpha;
1802
+ pose.mixShearY = base.mixShearY + (shearY - base.mixShearY) * alpha;
1755
1803
  }
1756
1804
  }
1757
1805
  }
1758
- /** Changes a path constraint's {@link PathConstraint#position}. */
1759
- export class PathConstraintPositionTimeline extends CurveTimeline1 {
1760
- /** The index of the path constraint in {@link Skeleton#getPathConstraints()} that will be changed when this timeline is
1761
- * applied. */
1762
- constraintIndex = 0;
1763
- constructor(frameCount, bezierCount, pathConstraintIndex) {
1764
- super(frameCount, bezierCount, Property.pathConstraintPosition + "|" + pathConstraintIndex);
1765
- this.constraintIndex = pathConstraintIndex;
1806
+ /** The base class for timelines that change 1 constraint property with a curve. */
1807
+ export class ConstraintTimeline1 extends CurveTimeline1 {
1808
+ constraintIndex;
1809
+ constructor(frameCount, bezierCount, constraintIndex, property) {
1810
+ super(frameCount, bezierCount, `${property}|${constraintIndex}`);
1811
+ this.constraintIndex = constraintIndex;
1812
+ }
1813
+ }
1814
+ /** Changes {@link PathConstraintPose.position}. */
1815
+ export class PathConstraintPositionTimeline extends ConstraintTimeline1 {
1816
+ constructor(frameCount, bezierCount, constraintIndex) {
1817
+ super(frameCount, bezierCount, constraintIndex, Property.pathConstraintPosition);
1818
+ this.additive = true;
1766
1819
  }
1767
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1768
- let constraint = skeleton.pathConstraints[this.constraintIndex];
1769
- if (constraint.active)
1770
- constraint.position = this.getAbsoluteValue(time, alpha, blend, constraint.position, constraint.data.position);
1820
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1821
+ const constraint = skeleton.constraints[this.constraintIndex];
1822
+ if (constraint.active) {
1823
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
1824
+ pose.position = this.getAbsoluteValue(time, alpha, fromSetup, add, pose.position, constraint.data.setupPose.position);
1825
+ }
1771
1826
  }
1772
1827
  }
1773
- /** Changes a path constraint's {@link PathConstraint#spacing}. */
1774
- export class PathConstraintSpacingTimeline extends CurveTimeline1 {
1775
- /** The index of the path constraint in {@link Skeleton#getPathConstraints()} that will be changed when this timeline is
1776
- * applied. */
1777
- constraintIndex = 0;
1778
- constructor(frameCount, bezierCount, pathConstraintIndex) {
1779
- super(frameCount, bezierCount, Property.pathConstraintSpacing + "|" + pathConstraintIndex);
1780
- this.constraintIndex = pathConstraintIndex;
1828
+ /** Changes {@link PathConstraintPose.spacing}. */
1829
+ export class PathConstraintSpacingTimeline extends ConstraintTimeline1 {
1830
+ constructor(frameCount, bezierCount, constraintIndex) {
1831
+ super(frameCount, bezierCount, constraintIndex, Property.pathConstraintSpacing);
1781
1832
  }
1782
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1783
- let constraint = skeleton.pathConstraints[this.constraintIndex];
1784
- if (constraint.active)
1785
- constraint.spacing = this.getAbsoluteValue(time, alpha, blend, constraint.spacing, constraint.data.spacing);
1833
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1834
+ const constraint = skeleton.constraints[this.constraintIndex];
1835
+ if (constraint.active) {
1836
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
1837
+ pose.spacing = this.getAbsoluteValue(time, alpha, fromSetup, false, pose.spacing, constraint.data.setupPose.spacing);
1838
+ }
1786
1839
  }
1787
1840
  }
1788
- /** Changes a transform constraint's {@link PathConstraint#getMixRotate()}, {@link PathConstraint#getMixX()}, and
1789
- * {@link PathConstraint#getMixY()}. */
1841
+ /** Changes {@link PathConstraint.mixRotate}, {@link PathConstraint.mixX}, and
1842
+ * {@link PathConstraint.mixY}. */
1790
1843
  export class PathConstraintMixTimeline extends CurveTimeline {
1791
- /** The index of the path constraint in {@link Skeleton#getPathConstraints()} that will be changed when this timeline is
1792
- * applied. */
1793
- constraintIndex = 0;
1794
- constructor(frameCount, bezierCount, pathConstraintIndex) {
1795
- super(frameCount, bezierCount, [
1796
- Property.pathConstraintMix + "|" + pathConstraintIndex
1797
- ]);
1798
- this.constraintIndex = pathConstraintIndex;
1844
+ constraintIndex;
1845
+ constructor(frameCount, bezierCount, constraintIndex) {
1846
+ super(frameCount, bezierCount, `${Property.pathConstraintMix}|${constraintIndex}`);
1847
+ this.constraintIndex = constraintIndex;
1799
1848
  }
1800
1849
  getFrameEntries() {
1801
1850
  return 4 /*ENTRIES*/;
1802
1851
  }
1852
+ /** Sets the time and color for the specified frame.
1853
+ * @param frame Between 0 and `frameCount`, inclusive.
1854
+ * @param time The frame time in seconds. */
1803
1855
  setFrame(frame, time, mixRotate, mixX, mixY) {
1804
- let frames = this.frames;
1856
+ const frames = this.frames;
1805
1857
  frame <<= 2;
1806
1858
  frames[frame] = time;
1807
1859
  frames[frame + 1 /*ROTATE*/] = mixRotate;
1808
1860
  frames[frame + 2 /*X*/] = mixX;
1809
1861
  frames[frame + 3 /*Y*/] = mixY;
1810
1862
  }
1811
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1812
- let constraint = skeleton.pathConstraints[this.constraintIndex];
1863
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1864
+ const constraint = skeleton.constraints[this.constraintIndex];
1813
1865
  if (!constraint.active)
1814
1866
  return;
1815
- let frames = this.frames;
1867
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
1868
+ const frames = this.frames;
1816
1869
  if (time < frames[0]) {
1817
- switch (blend) {
1818
- case MixBlend.setup:
1819
- constraint.mixRotate = constraint.data.mixRotate;
1820
- constraint.mixX = constraint.data.mixX;
1821
- constraint.mixY = constraint.data.mixY;
1822
- return;
1823
- case MixBlend.first:
1824
- constraint.mixRotate += (constraint.data.mixRotate - constraint.mixRotate) * alpha;
1825
- constraint.mixX += (constraint.data.mixX - constraint.mixX) * alpha;
1826
- constraint.mixY += (constraint.data.mixY - constraint.mixY) * alpha;
1870
+ if (fromSetup) {
1871
+ const setup = constraint.data.setupPose;
1872
+ pose.mixRotate = setup.mixRotate;
1873
+ pose.mixX = setup.mixX;
1874
+ pose.mixY = setup.mixY;
1827
1875
  }
1828
1876
  return;
1829
1877
  }
1830
1878
  let rotate, x, y;
1831
- let i = Timeline.search(frames, time, 4 /*ENTRIES*/);
1832
- let curveType = this.curves[i >> 2];
1879
+ const i = Timeline.search(frames, time, 4 /*ENTRIES*/);
1880
+ const curveType = this.curves[i >> 2];
1833
1881
  switch (curveType) {
1834
- case 0 /*LINEAR*/:
1835
- let before = frames[i];
1882
+ case 0 /*LINEAR*/: {
1883
+ const before = frames[i];
1836
1884
  rotate = frames[i + 1 /*ROTATE*/];
1837
1885
  x = frames[i + 2 /*X*/];
1838
1886
  y = frames[i + 3 /*Y*/];
1839
- let t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
1887
+ const t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
1840
1888
  rotate += (frames[i + 4 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
1841
1889
  x += (frames[i + 4 /*ENTRIES*/ + 2 /*X*/] - x) * t;
1842
1890
  y += (frames[i + 4 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
1843
1891
  break;
1892
+ }
1844
1893
  case 1 /*STEPPED*/:
1845
1894
  rotate = frames[i + 1 /*ROTATE*/];
1846
1895
  x = frames[i + 2 /*X*/];
@@ -1851,166 +1900,149 @@ export class PathConstraintMixTimeline extends CurveTimeline {
1851
1900
  x = this.getBezierValue(time, i, 2 /*X*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1852
1901
  y = this.getBezierValue(time, i, 3 /*Y*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1853
1902
  }
1854
- if (blend == MixBlend.setup) {
1855
- let data = constraint.data;
1856
- constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
1857
- constraint.mixX = data.mixX + (x - data.mixX) * alpha;
1858
- constraint.mixY = data.mixY + (y - data.mixY) * alpha;
1903
+ const base = fromSetup ? constraint.data.setupPose : pose;
1904
+ if (add) {
1905
+ pose.mixRotate = base.mixRotate + rotate * alpha;
1906
+ pose.mixX = base.mixX + x * alpha;
1907
+ pose.mixY = base.mixY + y * alpha;
1859
1908
  }
1860
1909
  else {
1861
- constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
1862
- constraint.mixX += (x - constraint.mixX) * alpha;
1863
- constraint.mixY += (y - constraint.mixY) * alpha;
1910
+ pose.mixRotate = base.mixRotate + (rotate - base.mixRotate) * alpha;
1911
+ pose.mixX = base.mixX + (x - base.mixX) * alpha;
1912
+ pose.mixY = base.mixY + (y - base.mixY) * alpha;
1864
1913
  }
1865
1914
  }
1866
1915
  }
1867
1916
  /** The base class for most {@link PhysicsConstraint} timelines. */
1868
- export class PhysicsConstraintTimeline extends CurveTimeline1 {
1869
- /** The index of the physics constraint in {@link Skeleton#getPhysicsConstraints()} that will be changed when this timeline
1870
- * is applied, or -1 if all physics constraints in the skeleton will be changed. */
1871
- constraintIndex = 0;
1872
- /** @param physicsConstraintIndex -1 for all physics constraints in the skeleton. */
1873
- constructor(frameCount, bezierCount, physicsConstraintIndex, property) {
1874
- super(frameCount, bezierCount, property + "|" + physicsConstraintIndex);
1875
- this.constraintIndex = physicsConstraintIndex;
1876
- }
1877
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1878
- let constraint;
1879
- if (this.constraintIndex == -1) {
1917
+ export class PhysicsConstraintTimeline extends ConstraintTimeline1 {
1918
+ /** @param constraintIndex -1 for all physics constraints in the skeleton. */
1919
+ constructor(frameCount, bezierCount, constraintIndex, property) {
1920
+ super(frameCount, bezierCount, constraintIndex, property);
1921
+ }
1922
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
1923
+ if (add && !this.additive)
1924
+ add = false;
1925
+ if (this.constraintIndex === -1) {
1880
1926
  const value = time >= this.frames[0] ? this.getCurveValue(time) : 0;
1881
- for (const constraint of skeleton.physicsConstraints) {
1882
- if (constraint.active && this.global(constraint.data))
1883
- this.set(constraint, this.getAbsoluteValue2(time, alpha, blend, this.get(constraint), this.setup(constraint), value));
1927
+ const constraints = skeleton.physics;
1928
+ for (const constraint of constraints) {
1929
+ if (constraint.active && this.global(constraint.data)) {
1930
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
1931
+ this.set(pose, this.getAbsoluteValue(time, alpha, fromSetup, add, this.get(pose), this.get(constraint.data.setupPose), value));
1932
+ }
1884
1933
  }
1885
1934
  }
1886
1935
  else {
1887
- constraint = skeleton.physicsConstraints[this.constraintIndex];
1888
- if (constraint.active)
1889
- this.set(constraint, this.getAbsoluteValue(time, alpha, blend, this.get(constraint), this.setup(constraint)));
1936
+ const constraint = skeleton.constraints[this.constraintIndex];
1937
+ if (constraint.active) {
1938
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
1939
+ this.set(pose, this.getAbsoluteValue(time, alpha, fromSetup, add, this.get(pose), this.get(constraint.data.setupPose)));
1940
+ }
1890
1941
  }
1891
1942
  }
1892
1943
  }
1893
- /** Changes a physics constraint's {@link PhysicsConstraint#getInertia()}. */
1944
+ /** Changes {@link PhysicsConstraintPose.inertia}. */
1894
1945
  export class PhysicsConstraintInertiaTimeline extends PhysicsConstraintTimeline {
1895
- constructor(frameCount, bezierCount, physicsConstraintIndex) {
1896
- super(frameCount, bezierCount, physicsConstraintIndex, Property.physicsConstraintInertia);
1897
- }
1898
- setup(constraint) {
1899
- return constraint.data.inertia;
1946
+ constructor(frameCount, bezierCount, constraintIndex) {
1947
+ super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintInertia);
1900
1948
  }
1901
- get(constraint) {
1902
- return constraint.inertia;
1949
+ get(pose) {
1950
+ return pose.inertia;
1903
1951
  }
1904
- set(constraint, value) {
1905
- constraint.inertia = value;
1952
+ set(pose, value) {
1953
+ pose.inertia = value;
1906
1954
  }
1907
1955
  global(constraint) {
1908
1956
  return constraint.inertiaGlobal;
1909
1957
  }
1910
1958
  }
1911
- /** Changes a physics constraint's {@link PhysicsConstraint#getStrength()}. */
1959
+ /** Changes {@link PhysicsConstraintPose.strength}. */
1912
1960
  export class PhysicsConstraintStrengthTimeline extends PhysicsConstraintTimeline {
1913
- constructor(frameCount, bezierCount, physicsConstraintIndex) {
1914
- super(frameCount, bezierCount, physicsConstraintIndex, Property.physicsConstraintStrength);
1961
+ constructor(frameCount, bezierCount, constraintIndex) {
1962
+ super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintStrength);
1915
1963
  }
1916
- setup(constraint) {
1917
- return constraint.data.strength;
1964
+ get(pose) {
1965
+ return pose.strength;
1918
1966
  }
1919
- get(constraint) {
1920
- return constraint.strength;
1921
- }
1922
- set(constraint, value) {
1923
- constraint.strength = value;
1967
+ set(pose, value) {
1968
+ pose.strength = value;
1924
1969
  }
1925
1970
  global(constraint) {
1926
1971
  return constraint.strengthGlobal;
1927
1972
  }
1928
1973
  }
1929
- /** Changes a physics constraint's {@link PhysicsConstraint#getDamping()}. */
1974
+ /** Changes {@link PhysicsConstraintPose.damping}. */
1930
1975
  export class PhysicsConstraintDampingTimeline extends PhysicsConstraintTimeline {
1931
- constructor(frameCount, bezierCount, physicsConstraintIndex) {
1932
- super(frameCount, bezierCount, physicsConstraintIndex, Property.physicsConstraintDamping);
1933
- }
1934
- setup(constraint) {
1935
- return constraint.data.damping;
1976
+ constructor(frameCount, bezierCount, constraintIndex) {
1977
+ super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintDamping);
1936
1978
  }
1937
- get(constraint) {
1938
- return constraint.damping;
1979
+ get(pose) {
1980
+ return pose.damping;
1939
1981
  }
1940
- set(constraint, value) {
1941
- constraint.damping = value;
1982
+ set(pose, value) {
1983
+ pose.damping = value;
1942
1984
  }
1943
1985
  global(constraint) {
1944
1986
  return constraint.dampingGlobal;
1945
1987
  }
1946
1988
  }
1947
- /** Changes a physics constraint's {@link PhysicsConstraint#getMassInverse()}. The timeline values are not inverted. */
1989
+ /** Changes {@link PhysicsConstraintPose.massInverse}. The timeline values are not inverted. */
1948
1990
  export class PhysicsConstraintMassTimeline extends PhysicsConstraintTimeline {
1949
- constructor(frameCount, bezierCount, physicsConstraintIndex) {
1950
- super(frameCount, bezierCount, physicsConstraintIndex, Property.physicsConstraintMass);
1991
+ constructor(frameCount, bezierCount, constraintIndex) {
1992
+ super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintMass);
1951
1993
  }
1952
- setup(constraint) {
1953
- return 1 / constraint.data.massInverse;
1994
+ get(pose) {
1995
+ return 1 / pose.massInverse;
1954
1996
  }
1955
- get(constraint) {
1956
- return 1 / constraint.massInverse;
1957
- }
1958
- set(constraint, value) {
1959
- constraint.massInverse = 1 / value;
1997
+ set(pose, value) {
1998
+ pose.massInverse = 1 / value;
1960
1999
  }
1961
2000
  global(constraint) {
1962
2001
  return constraint.massGlobal;
1963
2002
  }
1964
2003
  }
1965
- /** Changes a physics constraint's {@link PhysicsConstraint#getWind()}. */
2004
+ /** Changes {@link PhysicsConstraintPose.wind}. */
1966
2005
  export class PhysicsConstraintWindTimeline extends PhysicsConstraintTimeline {
1967
- constructor(frameCount, bezierCount, physicsConstraintIndex) {
1968
- super(frameCount, bezierCount, physicsConstraintIndex, Property.physicsConstraintWind);
1969
- }
1970
- setup(constraint) {
1971
- return constraint.data.wind;
2006
+ constructor(frameCount, bezierCount, constraintIndex) {
2007
+ super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintWind);
2008
+ this.additive = true;
1972
2009
  }
1973
- get(constraint) {
1974
- return constraint.wind;
2010
+ get(pose) {
2011
+ return pose.wind;
1975
2012
  }
1976
- set(constraint, value) {
1977
- constraint.wind = value;
2013
+ set(pose, value) {
2014
+ pose.wind = value;
1978
2015
  }
1979
2016
  global(constraint) {
1980
2017
  return constraint.windGlobal;
1981
2018
  }
1982
2019
  }
1983
- /** Changes a physics constraint's {@link PhysicsConstraint#getGravity()}. */
2020
+ /** Changes {@link PhysicsConstraintPose.gravity}. */
1984
2021
  export class PhysicsConstraintGravityTimeline extends PhysicsConstraintTimeline {
1985
- constructor(frameCount, bezierCount, physicsConstraintIndex) {
1986
- super(frameCount, bezierCount, physicsConstraintIndex, Property.physicsConstraintGravity);
2022
+ constructor(frameCount, bezierCount, constraintIndex) {
2023
+ super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintGravity);
2024
+ this.additive = true;
1987
2025
  }
1988
- setup(constraint) {
1989
- return constraint.data.gravity;
2026
+ get(pose) {
2027
+ return pose.gravity;
1990
2028
  }
1991
- get(constraint) {
1992
- return constraint.gravity;
1993
- }
1994
- set(constraint, value) {
1995
- constraint.gravity = value;
2029
+ set(pose, value) {
2030
+ pose.gravity = value;
1996
2031
  }
1997
2032
  global(constraint) {
1998
2033
  return constraint.gravityGlobal;
1999
2034
  }
2000
2035
  }
2001
- /** Changes a physics constraint's {@link PhysicsConstraint#getMix()}. */
2036
+ /** Changes {@link PhysicsConstraintPose.mix}. */
2002
2037
  export class PhysicsConstraintMixTimeline extends PhysicsConstraintTimeline {
2003
- constructor(frameCount, bezierCount, physicsConstraintIndex) {
2004
- super(frameCount, bezierCount, physicsConstraintIndex, Property.physicsConstraintMix);
2005
- }
2006
- setup(constraint) {
2007
- return constraint.data.mix;
2038
+ constructor(frameCount, bezierCount, constraintIndex) {
2039
+ super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintMix);
2008
2040
  }
2009
- get(constraint) {
2010
- return constraint.mix;
2041
+ get(pose) {
2042
+ return pose.mix;
2011
2043
  }
2012
- set(constraint, value) {
2013
- constraint.mix = value;
2044
+ set(pose, value) {
2045
+ pose.mix = value;
2014
2046
  }
2015
2047
  global(constraint) {
2016
2048
  return constraint.mixGlobal;
@@ -2019,145 +2051,77 @@ export class PhysicsConstraintMixTimeline extends PhysicsConstraintTimeline {
2019
2051
  /** Resets a physics constraint when specific animation times are reached. */
2020
2052
  export class PhysicsConstraintResetTimeline extends Timeline {
2021
2053
  static propertyIds = [Property.physicsConstraintReset.toString()];
2022
- /** The index of the physics constraint in {@link Skeleton#getPhysicsConstraints()} that will be reset when this timeline is
2054
+ /** The index of the physics constraint in {@link Skeleton.contraints} that will be reset when this timeline is
2023
2055
  * applied, or -1 if all physics constraints in the skeleton will be reset. */
2024
2056
  constraintIndex;
2025
- /** @param physicsConstraintIndex -1 for all physics constraints in the skeleton. */
2026
- constructor(frameCount, physicsConstraintIndex) {
2027
- super(frameCount, PhysicsConstraintResetTimeline.propertyIds);
2028
- this.constraintIndex = physicsConstraintIndex;
2057
+ /** @param constraintIndex -1 for all physics constraints in the skeleton. */
2058
+ constructor(frameCount, constraintIndex) {
2059
+ super(frameCount, ...PhysicsConstraintResetTimeline.propertyIds);
2060
+ this.constraintIndex = constraintIndex;
2061
+ this.instant = true;
2029
2062
  }
2030
2063
  getFrameCount() {
2031
2064
  return this.frames.length;
2032
2065
  }
2033
2066
  /** Sets the time for the specified frame.
2034
- * @param frame Between 0 and <code>frameCount</code>, inclusive. */
2067
+ * @param frame Between 0 and `frameCount`, inclusive. */
2035
2068
  setFrame(frame, time) {
2036
2069
  this.frames[frame] = time;
2037
2070
  }
2038
- /** Resets the physics constraint when frames > <code>lastTime</code> and <= <code>time</code>. */
2039
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
2071
+ /** Resets the physics constraint when frames > `lastTime` and <= `time`. */
2072
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
2040
2073
  let constraint;
2041
- if (this.constraintIndex != -1) {
2042
- constraint = skeleton.physicsConstraints[this.constraintIndex];
2074
+ if (this.constraintIndex !== -1) {
2075
+ constraint = skeleton.constraints[this.constraintIndex];
2043
2076
  if (!constraint.active)
2044
2077
  return;
2045
2078
  }
2046
2079
  const frames = this.frames;
2047
2080
  if (lastTime > time) { // Apply after lastTime for looped animations.
2048
- this.apply(skeleton, lastTime, Number.MAX_VALUE, [], alpha, blend, direction);
2081
+ this.apply(skeleton, lastTime, Number.MAX_VALUE, [], alpha, false, false, false, false);
2049
2082
  lastTime = -1;
2050
2083
  }
2051
2084
  else if (lastTime >= frames[frames.length - 1]) // Last time is after last frame.
2052
2085
  return;
2053
2086
  if (time < frames[0])
2054
2087
  return;
2055
- if (lastTime < frames[0] || time >= frames[Timeline.search1(frames, lastTime) + 1]) {
2088
+ if (lastTime < frames[0] || time >= frames[Timeline.search(frames, lastTime) + 1]) {
2056
2089
  if (constraint != null)
2057
- constraint.reset();
2090
+ constraint.reset(skeleton);
2058
2091
  else {
2059
- for (const constraint of skeleton.physicsConstraints) {
2092
+ for (const constraint of skeleton.physics) {
2060
2093
  if (constraint.active)
2061
- constraint.reset();
2094
+ constraint.reset(skeleton);
2062
2095
  }
2063
2096
  }
2064
2097
  }
2065
2098
  }
2066
2099
  }
2067
- /** Changes a slot's {@link Slot#getSequenceIndex()} for an attachment's {@link Sequence}. */
2068
- export class SequenceTimeline extends Timeline {
2069
- static ENTRIES = 3;
2070
- static MODE = 1;
2071
- static DELAY = 2;
2072
- slotIndex;
2073
- attachment;
2074
- constructor(frameCount, slotIndex, attachment) {
2075
- super(frameCount, [
2076
- Property.sequence + "|" + slotIndex + "|" + attachment.sequence.id
2077
- ]);
2078
- this.slotIndex = slotIndex;
2079
- this.attachment = attachment;
2080
- }
2081
- getFrameEntries() {
2082
- return SequenceTimeline.ENTRIES;
2083
- }
2084
- getSlotIndex() {
2085
- return this.slotIndex;
2100
+ /** Changes {@link SliderPose.time}. */
2101
+ export class SliderTimeline extends ConstraintTimeline1 {
2102
+ constructor(frameCount, bezierCount, constraintIndex) {
2103
+ super(frameCount, bezierCount, constraintIndex, Property.sliderTime);
2086
2104
  }
2087
- getAttachment() {
2088
- return this.attachment;
2105
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
2106
+ const constraint = skeleton.constraints[this.constraintIndex];
2107
+ if (constraint.active) {
2108
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
2109
+ pose.time = this.getAbsoluteValue(time, alpha, fromSetup, add, pose.time, constraint.data.setupPose.time);
2110
+ }
2089
2111
  }
2090
- /** Sets the time, mode, index, and frame time for the specified frame.
2091
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
2092
- * @param time Seconds between frames. */
2093
- setFrame(frame, time, mode, index, delay) {
2094
- let frames = this.frames;
2095
- frame *= SequenceTimeline.ENTRIES;
2096
- frames[frame] = time;
2097
- frames[frame + SequenceTimeline.MODE] = mode | (index << 4);
2098
- frames[frame + SequenceTimeline.DELAY] = delay;
2112
+ }
2113
+ /** Changes {@link SliderPose.mix}. */
2114
+ export class SliderMixTimeline extends ConstraintTimeline1 {
2115
+ constructor(frameCount, bezierCount, constraintIndex) {
2116
+ super(frameCount, bezierCount, constraintIndex, Property.sliderMix);
2117
+ this.additive = true;
2099
2118
  }
2100
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
2101
- let slot = skeleton.slots[this.slotIndex];
2102
- if (!slot.bone.active)
2103
- return;
2104
- let slotAttachment = slot.attachment;
2105
- let attachment = this.attachment;
2106
- if (slotAttachment != attachment) {
2107
- if (!(slotAttachment instanceof VertexAttachment)
2108
- || slotAttachment.timelineAttachment != attachment)
2109
- return;
2110
- }
2111
- if (direction == MixDirection.mixOut) {
2112
- if (blend == MixBlend.setup)
2113
- slot.sequenceIndex = -1;
2114
- return;
2115
- }
2116
- let frames = this.frames;
2117
- if (time < frames[0]) {
2118
- if (blend == MixBlend.setup || blend == MixBlend.first)
2119
- slot.sequenceIndex = -1;
2120
- return;
2121
- }
2122
- let i = Timeline.search(frames, time, SequenceTimeline.ENTRIES);
2123
- let before = frames[i];
2124
- let modeAndIndex = frames[i + SequenceTimeline.MODE];
2125
- let delay = frames[i + SequenceTimeline.DELAY];
2126
- if (!this.attachment.sequence)
2127
- return;
2128
- let index = modeAndIndex >> 4, count = this.attachment.sequence.regions.length;
2129
- let mode = SequenceModeValues[modeAndIndex & 0xf];
2130
- if (mode != SequenceMode.hold) {
2131
- index += (((time - before) / delay + 0.00001) | 0);
2132
- switch (mode) {
2133
- case SequenceMode.once:
2134
- index = Math.min(count - 1, index);
2135
- break;
2136
- case SequenceMode.loop:
2137
- index %= count;
2138
- break;
2139
- case SequenceMode.pingpong: {
2140
- let n = (count << 1) - 2;
2141
- index = n == 0 ? 0 : index % n;
2142
- if (index >= count)
2143
- index = n - index;
2144
- break;
2145
- }
2146
- case SequenceMode.onceReverse:
2147
- index = Math.max(count - 1 - index, 0);
2148
- break;
2149
- case SequenceMode.loopReverse:
2150
- index = count - 1 - (index % count);
2151
- break;
2152
- case SequenceMode.pingpongReverse: {
2153
- let n = (count << 1) - 2;
2154
- index = n == 0 ? 0 : (index + count - 1) % n;
2155
- if (index >= count)
2156
- index = n - index;
2157
- }
2158
- }
2119
+ apply(skeleton, lastTime, time, firedEvents, alpha, fromSetup, add, out, appliedPose) {
2120
+ const constraint = skeleton.constraints[this.constraintIndex];
2121
+ if (constraint.active) {
2122
+ const pose = appliedPose ? constraint.appliedPose : constraint.pose;
2123
+ pose.mix = this.getAbsoluteValue(time, alpha, fromSetup, add, pose.mix, constraint.data.setupPose.mix);
2159
2124
  }
2160
- slot.sequenceIndex = index;
2161
2125
  }
2162
2126
  }
2163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0FuaW1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFjLE1BQU0sNkJBQTZCLENBQUM7QUFNM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUcxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFLN0UsNkRBQTZEO0FBQzdELE1BQU0sT0FBTyxTQUFTO0lBQ3JCLG1GQUFtRjtJQUNuRixJQUFJLENBQVM7SUFDYixTQUFTLEdBQW9CLEVBQUUsQ0FBQztJQUNoQyxXQUFXLEdBQWMsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUV6Qyx1R0FBdUc7SUFDdkcsUUFBUSxDQUFTO0lBRWpCLFlBQWEsSUFBWSxFQUFFLFNBQTBCLEVBQUUsUUFBZ0I7UUFDdEUsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBWSxDQUFFLFNBQTBCO1FBQ3ZDLElBQUksQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMs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LE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQztZQUMzRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUEsZUFBZSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9ELENBQUM7UUFDRixDQUFDO1FBQ0QsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FB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LENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEUsTUFBTTtZQUNQLEtBQUssQ0FBQyxDQUFBLFdBQVc7Z0JBQ2hCLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDakMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU07WUFDUDtnQkFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQSxVQUFVLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDNUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUEsS0FBSyxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUEsZUFBZSxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDdEYsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUEsS0FBSyxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUEsZUFBZSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQzFGLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBLFVBQVUsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFBLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQSxVQUFVLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDcEcsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUEsVUFBVSxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUEsZUFBZSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUVELElBQUksS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQzNCLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzFFLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RELFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RELFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzFFLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzFFLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzNFLENBQUM7YUFBTSxDQUFDO1lBQ1AsVUFBVSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2hFLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNqRCxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FB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Q0YsQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBWZXJ0ZXhBdHRhY2htZW50LCBBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgSWtDb25zdHJhaW50IH0gZnJvbSBcIi4vSWtDb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBQYXRoQ29uc3RyYWludCB9IGZyb20gXCIuL1BhdGhDb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIi4vU2xvdC5qc1wiO1xuaW1wb3J0IHsgVHJhbnNmb3JtQ29uc3RyYWludCB9IGZyb20gXCIuL1RyYW5zZm9ybUNvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IFN0cmluZ1NldCwgVXRpbHMsIE1hdGhVdGlscywgTnVtYmVyQXJyYXlMaWtlIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSBcIi4vRXZlbnQuanNcIjtcbmltcG9ydCB7IEhhc1RleHR1cmVSZWdpb24gfSBmcm9tIFwiLi9hdHRhY2htZW50cy9IYXNUZXh0dXJlUmVnaW9uLmpzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU1vZGUsIFNlcXVlbmNlTW9kZVZhbHVlcyB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgeyBQaHlzaWNzQ29uc3RyYWludCB9IGZyb20gXCIuL1BoeXNpY3NDb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBQaHlzaWNzQ29uc3RyYWludERhdGEgfSBmcm9tIFwiLi9QaHlzaWNzQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IEluaGVyaXQgfSBmcm9tIFwiLi9Cb25lRGF0YS5qc1wiO1xuXG4vKiogQSBzaW1wbGUgY29udGFpbmVyIGZvciBhIGxpc3Qgb2YgdGltZWxpbmVzIGFuZCBhIG5hbWUuICovXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uIHtcblx0LyoqIFRoZSBhbmltYXRpb24ncyBuYW1lLCB3aGljaCBpcyB1bmlxdWUgYWNyb3NzIGFsbCBhbmltYXRpb25zIGluIHRoZSBza2VsZXRvbi4gKi9cblx0bmFtZTogc3RyaW5nO1xuXHR0aW1lbGluZXM6IEFycmF5PFRpbWVsaW5lPiA9IFtdO1xuXHR0aW1lbGluZUlkczogU3RyaW5nU2V0ID0gbmV3IFN0cmluZ1NldCgpO1xuXG5cdC8qKiBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBzZWNvbmRzLCB3aGljaCBpcyB0aGUgaGlnaGVzdCB0aW1lIG9mIGFsbCBrZXlzIGluIHRoZSB0aW1lbGluZS4gKi9cblx0ZHVyYXRpb246IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nLCB0aW1lbGluZXM6IEFycmF5PFRpbWVsaW5lPiwgZHVyYXRpb246IG51bWJlcikge1xuXHRcdGlmICghbmFtZSkgdGhyb3cgbmV3IEVycm9yKFwibmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLnNldFRpbWVsaW5lcyh0aW1lbGluZXMpO1xuXHRcdHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcblx0fVxuXG5cdHNldFRpbWVsaW5lcyAodGltZWxpbmVzOiBBcnJheTxUaW1lbGluZT4pIHtcblx0XHRpZiAoIXRpbWVsaW5lcykgdGhyb3cgbmV3IEVycm9yKFwidGltZWxpbmVzIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLnRpbWVsaW5lcyA9IHRpbWVsaW5lcztcblx0XHR0aGlzLnRpbWVsaW5lSWRzLmNsZWFyKCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lbGluZXMubGVuZ3RoOyBpKyspXG5cdFx0XHR0aGlzLnRpbWVsaW5lSWRzLmFkZEFsbCh0aW1lbGluZXNbaV0uZ2V0UHJvcGVydHlJZHMoKSk7XG5cdH1cblxuXHRoYXNUaW1lbGluZSAoaWRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKVxuXHRcdFx0aWYgKHRoaXMudGltZWxpbmVJZHMuY29udGFpbnMoaWRzW2ldKSkgcmV0dXJuIHRydWU7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqIEFwcGxpZXMgYWxsIHRoZSBhbmltYXRpb24ncyB0aW1lbGluZXMgdG8gdGhlIHNwZWNpZmllZCBza2VsZXRvbi5cblx0ICpcblx0ICogU2VlIFRpbWVsaW5lIHtAbGluayBUaW1lbGluZSNhcHBseShTa2VsZXRvbiwgZmxvYXQsIGZsb2F0LCBBcnJheSwgZmxvYXQsIE1peEJsZW5kLCBNaXhEaXJlY3Rpb24pfS5cblx0ICogQHBhcmFtIGxvb3AgSWYgdHJ1ZSwgdGhlIGFuaW1hdGlvbiByZXBlYXRzIGFmdGVyIHtAbGluayAjZ2V0RHVyYXRpb24oKX0uXG5cdCAqIEBwYXJhbSBldmVudHMgTWF5IGJlIG51bGwgdG8gaWdub3JlIGZpcmVkIGV2ZW50cy4gKi9cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBsb29wOiBib29sZWFuLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGlmICghc2tlbGV0b24pIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblxuXHRcdGlmIChsb29wICYmIHRoaXMuZHVyYXRpb24gIT0gMCkge1xuXHRcdFx0dGltZSAlPSB0aGlzLmR1cmF0aW9uO1xuXHRcdFx0aWYgKGxhc3RUaW1lID4gMCkgbGFzdFRpbWUgJT0gdGhpcy5kdXJhdGlvbjtcblx0XHR9XG5cblx0XHRsZXQgdGltZWxpbmVzID0gdGhpcy50aW1lbGluZXM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aW1lbGluZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0dGltZWxpbmVzW2ldLmFwcGx5KHNrZWxldG9uLCBsYXN0VGltZSwgdGltZSwgZXZlbnRzLCBhbHBoYSwgYmxlbmQsIGRpcmVjdGlvbik7XG5cdH1cbn1cblxuLyoqIENvbnRyb2xzIGhvdyBhIHRpbWVsaW5lIHZhbHVlIGlzIG1peGVkIHdpdGggdGhlIHNldHVwIHBvc2UgdmFsdWUgb3IgY3VycmVudCBwb3NlIHZhbHVlIHdoZW4gYSB0aW1lbGluZSdzIGBhbHBoYWBcbiAqIDwgMS5cbiAqXG4gKiBTZWUgVGltZWxpbmUge0BsaW5rIFRpbWVsaW5lI2FwcGx5KFNrZWxldG9uLCBmbG9hdCwgZmxvYXQsIEFycmF5LCBmbG9hdCwgTWl4QmxlbmQsIE1peERpcmVjdGlvbil9LiAqL1xuZXhwb3J0IGVudW0gTWl4QmxlbmQge1xuXHQvKiogVHJhbnNpdGlvbnMgZnJvbSB0aGUgc2V0dXAgdmFsdWUgdG8gdGhlIHRpbWVsaW5lIHZhbHVlICh0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgdXNlZCkuIEJlZm9yZSB0aGUgZmlyc3Qga2V5LCB0aGUgc2V0dXBcblx0ICogdmFsdWUgaXMgc2V0LiAqL1xuXHRzZXR1cCxcblx0LyoqIFRyYW5zaXRpb25zIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIHRpbWVsaW5lIHZhbHVlLiBCZWZvcmUgdGhlIGZpcnN0IGtleSwgdHJhbnNpdGlvbnMgZnJvbSB0aGUgY3VycmVudCB2YWx1ZSB0b1xuXHQgKiB0aGUgc2V0dXAgdmFsdWUuIFRpbWVsaW5lcyB3aGljaCBwZXJmb3JtIGluc3RhbnQgdHJhbnNpdGlvbnMsIHN1Y2ggYXMge0BsaW5rIERyYXdPcmRlclRpbWVsaW5lfSBvclxuXHQgKiB7QGxpbmsgQXR0YWNobWVudFRpbWVsaW5lfSwgdXNlIHRoZSBzZXR1cCB2YWx1ZSBiZWZvcmUgdGhlIGZpcnN0IGtleS5cblx0ICpcblx0ICogYGZpcnN0YCBpcyBpbnRlbmRlZCBmb3IgdGhlIGZpcnN0IGFuaW1hdGlvbnMgYXBwbGllZCwgbm90IGZvciBhbmltYXRpb25zIGxheWVyZWQgb24gdG9wIG9mIHRob3NlLiAqL1xuXHRmaXJzdCxcblx0LyoqIFRyYW5zaXRpb25zIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIHRpbWVsaW5lIHZhbHVlLiBObyBjaGFuZ2UgaXMgbWFkZSBiZWZvcmUgdGhlIGZpcnN0IGtleSAodGhlIGN1cnJlbnQgdmFsdWUgaXNcblx0ICoga2VwdCB1bnRpbCB0aGUgZmlyc3Qga2V5KS5cblx0ICpcblx0ICogYHJlcGxhY2VgIGlzIGludGVuZGVkIGZvciBhbmltYXRpb25zIGxheWVyZWQgb24gdG9wIG9mIG90aGVycywgbm90IGZvciB0aGUgZmlyc3QgYW5pbWF0aW9ucyBhcHBsaWVkLiAqL1xuXHRyZXBsYWNlLFxuXHQvKiogVHJhbnNpdGlvbnMgZnJvbSB0aGUgY3VycmVudCB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBwbHVzIHRoZSB0aW1lbGluZSB2YWx1ZS4gTm8gY2hhbmdlIGlzIG1hZGUgYmVmb3JlIHRoZSBmaXJzdCBrZXlcblx0ICogKHRoZSBjdXJyZW50IHZhbHVlIGlzIGtlcHQgdW50aWwgdGhlIGZpcnN0IGtleSkuXG5cdCAqXG5cdCAqIGBhZGRgIGlzIGludGVuZGVkIGZvciBhbmltYXRpb25zIGxheWVyZWQgb24gdG9wIG9mIG90aGVycywgbm90IGZvciB0aGUgZmlyc3QgYW5pbWF0aW9ucyBhcHBsaWVkLiBQcm9wZXJ0aWVzXG5cdCAqIGtleWVkIGJ5IGFkZGl0aXZlIGFuaW1hdGlvbnMgbXVzdCBiZSBzZXQgbWFudWFsbHkgb3IgYnkgYW5vdGhlciBhbmltYXRpb24gYmVmb3JlIGFwcGx5aW5nIHRoZSBhZGRpdGl2ZSBhbmltYXRpb25zLCBlbHNlXG5cdCAqIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgd2lsbCBpbmNyZWFzZSBjb250aW51YWxseS4gKi9cblx0YWRkXG59XG5cbi8qKiBJbmRpY2F0ZXMgd2hldGhlciBhIHRpbWVsaW5lJ3MgYGFscGhhYCBpcyBtaXhpbmcgb3V0IG92ZXIgdGltZSB0b3dhcmQgMCAodGhlIHNldHVwIG9yIGN1cnJlbnQgcG9zZSB2YWx1ZSkgb3JcbiAqIG1peGluZyBpbiB0b3dhcmQgMSAodGhlIHRpbWVsaW5lJ3MgdmFsdWUpLlxuICpcbiAqIFNlZSBUaW1lbGluZSB7QGxpbmsgVGltZWxpbmUjYXBwbHkoU2tlbGV0b24sIGZsb2F0LCBmbG9hdCwgQXJyYXksIGZsb2F0LCBNaXhCbGVuZCwgTWl4RGlyZWN0aW9uKX0uICovXG5leHBvcnQgZW51bSBNaXhEaXJlY3Rpb24ge1xuXHRtaXhJbiwgbWl4T3V0XG59XG5cbmNvbnN0IFByb3BlcnR5ID0ge1xuXHRyb3RhdGU6IDAsXG5cdHg6IDEsXG5cdHk6IDIsXG5cdHNjYWxlWDogMyxcblx0c2NhbGVZOiA0LFxuXHRzaGVhclg6IDUsXG5cdHNoZWFyWTogNixcblx0aW5oZXJpdDogNyxcblxuXHRyZ2I6IDgsXG5cdGFscGhhOiA5LFxuXHRyZ2IyOiAxMCxcblxuXHRhdHRhY2htZW50OiAxMSxcblx0ZGVmb3JtOiAxMixcblxuXHRldmVudDogMTMsXG5cdGRyYXdPcmRlcjogMTQsXG5cblx0aWtDb25zdHJhaW50OiAxNSxcblx0dHJhbnNmb3JtQ29uc3RyYWludDogMTYsXG5cblx0cGF0aENvbnN0cmFpbnRQb3NpdGlvbjogMTcsXG5cdHBhdGhDb25zdHJhaW50U3BhY2luZzogMTgsXG5cdHBhdGhDb25zdHJhaW50TWl4OiAxOSxcblxuXHRwaHlzaWNzQ29uc3RyYWludEluZXJ0aWE6IDIwLFxuXHRwaHlzaWNzQ29uc3RyYWludFN0cmVuZ3RoOiAyMSxcblx0cGh5c2ljc0NvbnN0cmFpbnREYW1waW5nOiAyMixcblx0cGh5c2ljc0NvbnN0cmFpbnRNYXNzOiAyMyxcblx0cGh5c2ljc0NvbnN0cmFpbnRXaW5kOiAyNCxcblx0cGh5c2ljc0NvbnN0cmFpbnRHcmF2aXR5OiAyNSxcblx0cGh5c2ljc0NvbnN0cmFpbnRNaXg6IDI2LFxuXHRwaHlzaWNzQ29uc3RyYWludFJlc2V0OiAyNyxcblxuXHRzZXF1ZW5jZTogMjgsXG59XG5cbi8qKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgdGltZWxpbmVzLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRpbWVsaW5lIHtcblx0cHJvcGVydHlJZHM6IHN0cmluZ1tdO1xuXHRmcmFtZXM6IE51bWJlckFycmF5TGlrZTtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBwcm9wZXJ0eUlkczogc3RyaW5nW10pIHtcblx0XHR0aGlzLnByb3BlcnR5SWRzID0gcHJvcGVydHlJZHM7XG5cdFx0dGhpcy5mcmFtZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KGZyYW1lQ291bnQgKiB0aGlzLmdldEZyYW1lRW50cmllcygpKTtcblx0fVxuXG5cdGdldFByb3BlcnR5SWRzICgpIHtcblx0XHRyZXR1cm4gdGhpcy5wcm9wZXJ0eUlkcztcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGdldEZyYW1lQ291bnQgKCkge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGggLyB0aGlzLmdldEZyYW1lRW50cmllcygpO1xuXHR9XG5cblx0Z2V0RHVyYXRpb24gKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzW3RoaXMuZnJhbWVzLmxlbmd0aCAtIHRoaXMuZ2V0RnJhbWVFbnRyaWVzKCldO1xuXHR9XG5cblx0YWJzdHJhY3QgYXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pOiB2b2lkO1xuXG5cdHN0YXRpYyBzZWFyY2gxIChmcmFtZXM6IE51bWJlckFycmF5TGlrZSwgdGltZTogbnVtYmVyKSB7XG5cdFx0bGV0IG4gPSBmcmFtZXMubGVuZ3RoO1xuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgbjsgaSsrKVxuXHRcdFx0aWYgKGZyYW1lc1tpXSA+IHRpbWUpIHJldHVybiBpIC0gMTtcblx0XHRyZXR1cm4gbiAtIDE7XG5cdH1cblxuXHRzdGF0aWMgc2VhcmNoIChmcmFtZXM6IE51bWJlckFycmF5TGlrZSwgdGltZTogbnVtYmVyLCBzdGVwOiBudW1iZXIpIHtcblx0XHRsZXQgbiA9IGZyYW1lcy5sZW5ndGg7XG5cdFx0Zm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBuOyBpICs9IHN0ZXApXG5cdFx0XHRpZiAoZnJhbWVzW2ldID4gdGltZSkgcmV0dXJuIGkgLSBzdGVwO1xuXHRcdHJldHVybiBuIC0gc3RlcDtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvbmVUaW1lbGluZSB7XG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIGJvbmUgaW4ge0BsaW5rIFNrZWxldG9uI2JvbmVzfSB0aGF0IHdpbGwgYmUgY2hhbmdlZC4gKi9cblx0Ym9uZUluZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xvdFRpbWVsaW5lIHtcblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgc2xvdCBpbiB7QGxpbmsgU2tlbGV0b24jc2xvdHN9IHRoYXQgd2lsbCBiZSBjaGFuZ2VkLiAqL1xuXHRzbG90SW5kZXg6IG51bWJlcjtcbn1cblxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciB0aW1lbGluZXMgdGhhdCB1c2UgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGtleSBmcmFtZSB2YWx1ZXMuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3VydmVUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIHtcblx0cHJvdGVjdGVkIGN1cnZlczogTnVtYmVyQXJyYXlMaWtlOyAvLyB0eXBlLCB4LCB5LCAuLi5cblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwcm9wZXJ0eUlkczogc3RyaW5nW10pIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBwcm9wZXJ0eUlkcyk7XG5cdFx0dGhpcy5jdXJ2ZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KGZyYW1lQ291bnQgKyBiZXppZXJDb3VudCAqIDE4LypCRVpJRVJfU0laRSovKTtcblx0XHR0aGlzLmN1cnZlc1tmcmFtZUNvdW50IC0gMV0gPSAxLypTVEVQUEVEKi87XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZSB0byBsaW5lYXIgaW50ZXJwb2xhdGlvbi4gKi9cblx0c2V0TGluZWFyIChmcmFtZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5jdXJ2ZXNbZnJhbWVdID0gMC8qTElORUFSKi87XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZSB0byBzdGVwcGVkIGludGVycG9sYXRpb24uICovXG5cdHNldFN0ZXBwZWQgKGZyYW1lOiBudW1iZXIpIHtcblx0XHR0aGlzLmN1cnZlc1tmcmFtZV0gPSAxLypTVEVQUEVEKi87XG5cdH1cblxuXHQvKiogU2hyaW5rcyB0aGUgc3RvcmFnZSBmb3IgQmV6aWVyIGN1cnZlcywgZm9yIHVzZSB3aGVuIDxjb2RlPmJlemllckNvdW50PC9jb2RlPiAoc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvcikgd2FzIGxhcmdlclxuXHQgKiB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIEJlemllciBjdXJ2ZXMuICovXG5cdHNocmluayAoYmV6aWVyQ291bnQ6IG51bWJlcikge1xuXHRcdGxldCBzaXplID0gdGhpcy5nZXRGcmFtZUNvdW50KCkgKyBiZXppZXJDb3VudCAqIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGlmICh0aGlzLmN1cnZlcy5sZW5ndGggPiBzaXplKSB7XG5cdFx0XHRsZXQgbmV3Q3VydmVzID0gVXRpbHMubmV3RmxvYXRBcnJheShzaXplKTtcblx0XHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLmN1cnZlcywgMCwgbmV3Q3VydmVzLCAwLCBzaXplKTtcblx0XHRcdHRoaXMuY3VydmVzID0gbmV3Q3VydmVzO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBTdG9yZXMgdGhlIHNlZ21lbnRzIGZvciB0aGUgc3BlY2lmaWVkIEJlemllciBjdXJ2ZS4gRm9yIHRpbWVsaW5lcyB0aGF0IG1vZGlmeSBtdWx0aXBsZSB2YWx1ZXMsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW5cblx0ICogb25lIGN1cnZlIHBlciBmcmFtZS5cblx0ICogQHBhcmFtIGJlemllciBUaGUgb3JkaW5hbCBvZiB0aGlzIEJlemllciBjdXJ2ZSBmb3IgdGhpcyB0aW1lbGluZSwgYmV0d2VlbiAwIGFuZCA8Y29kZT5iZXppZXJDb3VudCAtIDE8L2NvZGU+IChzcGVjaWZpZWRcblx0ICogICAgICAgICAgIGluIHRoZSBjb25zdHJ1Y3RvciksIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgPGNvZGU+ZnJhbWVDb3VudCAtIDE8L2NvZGU+LCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIGZvciB0aGlzIGZyYW1lIHRoYXQgdGhpcyBjdXJ2ZSBpcyB1c2VkIGZvci5cblx0ICogQHBhcmFtIHRpbWUxIFRoZSB0aW1lIGZvciB0aGUgZmlyc3Qga2V5LlxuXHQgKiBAcGFyYW0gdmFsdWUxIFRoZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGtleS5cblx0ICogQHBhcmFtIGN4MSBUaGUgdGltZSBmb3IgdGhlIGZpcnN0IEJlemllciBoYW5kbGUuXG5cdCAqIEBwYXJhbSBjeTEgVGhlIHZhbHVlIGZvciB0aGUgZmlyc3QgQmV6aWVyIGhhbmRsZS5cblx0ICogQHBhcmFtIGN4MiBUaGUgdGltZSBvZiB0aGUgc2Vjb25kIEJlemllciBoYW5kbGUuXG5cdCAqIEBwYXJhbSBjeTIgVGhlIHZhbHVlIGZvciB0aGUgc2Vjb25kIEJlemllciBoYW5kbGUuXG5cdCAqIEBwYXJhbSB0aW1lMiBUaGUgdGltZSBmb3IgdGhlIHNlY29uZCBrZXkuXG5cdCAqIEBwYXJhbSB2YWx1ZTIgVGhlIHZhbHVlIGZvciB0aGUgc2Vjb25kIGtleS4gKi9cblx0c2V0QmV6aWVyIChiZXppZXI6IG51bWJlciwgZnJhbWU6IG51bWJlciwgdmFsdWU6IG51bWJlciwgdGltZTE6IG51bWJlciwgdmFsdWUxOiBudW1iZXIsIGN4MTogbnVtYmVyLCBjeTE6IG51bWJlciwgY3gyOiBudW1iZXIsXG5cdFx0Y3kyOiBudW1iZXIsIHRpbWUyOiBudW1iZXIsIHZhbHVlMjogbnVtYmVyKSB7XG5cdFx0bGV0IGN1cnZlcyA9IHRoaXMuY3VydmVzO1xuXHRcdGxldCBpID0gdGhpcy5nZXRGcmFtZUNvdW50KCkgKyBiZXppZXIgKiAxOC8qQkVaSUVSX1NJWkUqLztcblx0XHRpZiAodmFsdWUgPT0gMCkgY3VydmVzW2ZyYW1lXSA9IDIvKkJFWklFUiovICsgaTtcblx0XHRsZXQgdG1weCA9ICh0aW1lMSAtIGN4MSAqIDIgKyBjeDIpICogMC4wMywgdG1weSA9ICh2YWx1ZTEgLSBjeTEgKiAyICsgY3kyKSAqIDAuMDM7XG5cdFx0bGV0IGRkZHggPSAoKGN4MSAtIGN4MikgKiAzIC0gdGltZTEgKyB0aW1lMikgKiAwLjAwNiwgZGRkeSA9ICgoY3kxIC0gY3kyKSAqIDMgLSB2YWx1ZTEgKyB2YWx1ZTIpICogMC4wMDY7XG5cdFx0bGV0IGRkeCA9IHRtcHggKiAyICsgZGRkeCwgZGR5ID0gdG1weSAqIDIgKyBkZGR5O1xuXHRcdGxldCBkeCA9IChjeDEgLSB0aW1lMSkgKiAwLjMgKyB0bXB4ICsgZGRkeCAqIDAuMTY2NjY2NjcsIGR5ID0gKGN5MSAtIHZhbHVlMSkgKiAwLjMgKyB0bXB5ICsgZGRkeSAqIDAuMTY2NjY2Njc7XG5cdFx0bGV0IHggPSB0aW1lMSArIGR4LCB5ID0gdmFsdWUxICsgZHk7XG5cdFx0Zm9yIChsZXQgbiA9IGkgKyAxOC8qQkVaSUVSX1NJWkUqLzsgaSA8IG47IGkgKz0gMikge1xuXHRcdFx0Y3VydmVzW2ldID0geDtcblx0XHRcdGN1cnZlc1tpICsgMV0gPSB5O1xuXHRcdFx0ZHggKz0gZGR4O1xuXHRcdFx0ZHkgKz0gZGR5O1xuXHRcdFx0ZGR4ICs9IGRkZHg7XG5cdFx0XHRkZHkgKz0gZGRkeTtcblx0XHRcdHggKz0gZHg7XG5cdFx0XHR5ICs9IGR5O1xuXHRcdH1cblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBCZXppZXIgaW50ZXJwb2xhdGVkIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHRpbWUuXG5cdCAqIEBwYXJhbSBmcmFtZUluZGV4IFRoZSBpbmRleCBpbnRvIHtAbGluayAjZ2V0RnJhbWVzKCl9IGZvciB0aGUgdmFsdWVzIG9mIHRoZSBmcmFtZSBiZWZvcmUgPGNvZGU+dGltZTwvY29kZT4uXG5cdCAqIEBwYXJhbSB2YWx1ZU9mZnNldCBUaGUgb2Zmc2V0IGZyb20gPGNvZGU+ZnJhbWVJbmRleDwvY29kZT4gdG8gdGhlIHZhbHVlIHRoaXMgY3VydmUgaXMgdXNlZCBmb3IuXG5cdCAqIEBwYXJhbSBpIFRoZSBpbmRleCBvZiB0aGUgQmV6aWVyIHNlZ21lbnRzLiBTZWUge0BsaW5rICNnZXRDdXJ2ZVR5cGUoaW50KX0uICovXG5cdGdldEJlemllclZhbHVlICh0aW1lOiBudW1iZXIsIGZyYW1lSW5kZXg6IG51bWJlciwgdmFsdWVPZmZzZXQ6IG51bWJlciwgaTogbnVtYmVyKSB7XG5cdFx0bGV0IGN1cnZlcyA9IHRoaXMuY3VydmVzO1xuXHRcdGlmIChjdXJ2ZXNbaV0gPiB0aW1lKSB7XG5cdFx0XHRsZXQgeCA9IHRoaXMuZnJhbWVzW2ZyYW1lSW5kZXhdLCB5ID0gdGhpcy5mcmFtZXNbZnJhbWVJbmRleCArIHZhbHVlT2Zmc2V0XTtcblx0XHRcdHJldHVybiB5ICsgKHRpbWUgLSB4KSAvIChjdXJ2ZXNbaV0gLSB4KSAqIChjdXJ2ZXNbaSArIDFdIC0geSk7XG5cdFx0fVxuXHRcdGxldCBuID0gaSArIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGZvciAoaSArPSAyOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRpZiAoY3VydmVzW2ldID49IHRpbWUpIHtcblx0XHRcdFx0bGV0IHggPSBjdXJ2ZXNbaSAtIDJdLCB5ID0gY3VydmVzW2kgLSAxXTtcblx0XHRcdFx0cmV0dXJuIHkgKyAodGltZSAtIHgpIC8gKGN1cnZlc1tpXSAtIHgpICogKGN1cnZlc1tpICsgMV0gLSB5KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZnJhbWVJbmRleCArPSB0aGlzLmdldEZyYW1lRW50cmllcygpO1xuXHRcdGxldCB4ID0gY3VydmVzW24gLSAyXSwgeSA9IGN1cnZlc1tuIC0gMV07XG5cdFx0cmV0dXJuIHkgKyAodGltZSAtIHgpIC8gKHRoaXMuZnJhbWVzW2ZyYW1lSW5kZXhdIC0geCkgKiAodGhpcy5mcmFtZXNbZnJhbWVJbmRleCArIHZhbHVlT2Zmc2V0XSAtIHkpO1xuXHR9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDdXJ2ZVRpbWVsaW5lMSBleHRlbmRzIEN1cnZlVGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwcm9wZXJ0eUlkOiBzdHJpbmcpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgW3Byb3BlcnR5SWRdKTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDIvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGFuZCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgPGNvZGU+ZnJhbWVDb3VudDwvY29kZT4sIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIHRpbWUgVGhlIGZyYW1lIHRpbWUgaW4gc2Vjb25kcy4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuXHRcdGZyYW1lIDw8PSAxO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypWQUxVRSovXSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCB0aW1lLiAqL1xuXHRnZXRDdXJ2ZVZhbHVlICh0aW1lOiBudW1iZXIpIHtcblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0bGV0IGkgPSBmcmFtZXMubGVuZ3RoIC0gMjtcblx0XHRmb3IgKGxldCBpaSA9IDI7IGlpIDw9IGk7IGlpICs9IDIpIHtcblx0XHRcdGlmIChmcmFtZXNbaWldID4gdGltZSkge1xuXHRcdFx0XHRpID0gaWkgLSAyO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSA+PiAxXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzpcblx0XHRcdFx0bGV0IGJlZm9yZSA9IGZyYW1lc1tpXSwgdmFsdWUgPSBmcmFtZXNbaSArIDEvKlZBTFVFKi9dO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgKyAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyAyLypFTlRSSUVTKi9dIC0gYmVmb3JlKSAqIChmcmFtZXNbaSArIDIvKkVOVFJJRVMqLyArIDEvKlZBTFVFKi9dIC0gdmFsdWUpO1xuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHJldHVybiBmcmFtZXNbaSArIDEvKlZBTFVFKi9dO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypWQUxVRSovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdH1cblxuXHRnZXRSZWxhdGl2ZVZhbHVlICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgY3VycmVudDogbnVtYmVyLCBzZXR1cDogbnVtYmVyKSB7XG5cdFx0aWYgKHRpbWUgPCB0aGlzLmZyYW1lc1swXSkge1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdHJldHVybiBzZXR1cDtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0XHRyZXR1cm4gY3VycmVudCArIChzZXR1cCAtIGN1cnJlbnQpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudDtcblx0XHR9XG5cdFx0bGV0IHZhbHVlID0gdGhpcy5nZXRDdXJ2ZVZhbHVlKHRpbWUpO1xuXHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdGNhc2UgTWl4QmxlbmQuc2V0dXA6XG5cdFx0XHRcdHJldHVybiBzZXR1cCArIHZhbHVlICogYWxwaGE7XG5cdFx0XHRjYXNlIE1peEJsZW5kLmZpcnN0OlxuXHRcdFx0Y2FzZSBNaXhCbGVuZC5yZXBsYWNlOlxuXHRcdFx0XHR2YWx1ZSArPSBzZXR1cCAtIGN1cnJlbnQ7XG5cdFx0fVxuXHRcdHJldHVybiBjdXJyZW50ICsgdmFsdWUgKiBhbHBoYTtcblx0fVxuXG5cdGdldEFic29sdXRlVmFsdWUgKHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBjdXJyZW50OiBudW1iZXIsIHNldHVwOiBudW1iZXIpIHtcblx0XHRpZiAodGltZSA8IHRoaXMuZnJhbWVzWzBdKSB7XG5cdFx0XHRzd2l0Y2ggKGJsZW5kKSB7XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuc2V0dXA6XG5cdFx0XHRcdFx0cmV0dXJuIHNldHVwO1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLmZpcnN0OlxuXHRcdFx0XHRcdHJldHVybiBjdXJyZW50ICsgKHNldHVwIC0gY3VycmVudCkgKiBhbHBoYTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50O1xuXHRcdH1cblx0XHRsZXQgdmFsdWUgPSB0aGlzLmdldEN1cnZlVmFsdWUodGltZSk7XG5cdFx0aWYgKGJsZW5kID09IE1peEJsZW5kLnNldHVwKSByZXR1cm4gc2V0dXAgKyAodmFsdWUgLSBzZXR1cCkgKiBhbHBoYTtcblx0XHRyZXR1cm4gY3VycmVudCArICh2YWx1ZSAtIGN1cnJlbnQpICogYWxwaGE7XG5cdH1cblxuXHRnZXRBYnNvbHV0ZVZhbHVlMiAodGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuXHRcdGlmICh0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHtcblx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXA7XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRcdFx0cmV0dXJuIGN1cnJlbnQgKyAoc2V0dXAgLSBjdXJyZW50KSAqIGFscGhhO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGN1cnJlbnQ7XG5cdFx0fVxuXHRcdGlmIChibGVuZCA9PSBNaXhCbGVuZC5zZXR1cCkgcmV0dXJuIHNldHVwICsgKHZhbHVlIC0gc2V0dXApICogYWxwaGE7XG5cdFx0cmV0dXJuIGN1cnJlbnQgKyAodmFsdWUgLSBjdXJyZW50KSAqIGFscGhhO1xuXHR9XG5cblx0Z2V0U2NhbGVWYWx1ZSAodGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uLCBjdXJyZW50OiBudW1iZXIsIHNldHVwOiBudW1iZXIpIHtcblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdHJldHVybiBzZXR1cDtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0XHRyZXR1cm4gY3VycmVudCArIChzZXR1cCAtIGN1cnJlbnQpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudDtcblx0XHR9XG5cdFx0bGV0IHZhbHVlID0gdGhpcy5nZXRDdXJ2ZVZhbHVlKHRpbWUpICogc2V0dXA7XG5cdFx0aWYgKGFscGhhID09IDEpIHtcblx0XHRcdGlmIChibGVuZCA9PSBNaXhCbGVuZC5hZGQpIHJldHVybiBjdXJyZW50ICsgdmFsdWUgLSBzZXR1cDtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdFx0Ly8gTWl4aW5nIG91dCB1c2VzIHNpZ24gb2Ygc2V0dXAgb3IgY3VycmVudCBwb3NlLCBlbHNlIHVzZSBzaWduIG9mIGtleS5cblx0XHRpZiAoZGlyZWN0aW9uID09IE1peERpcmVjdGlvbi5taXhPdXQpIHtcblx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXAgKyAoTWF0aC5hYnModmFsdWUpICogTWF0aFV0aWxzLnNpZ251bShzZXR1cCkgLSBzZXR1cCkgKiBhbHBoYTtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5yZXBsYWNlOlxuXHRcdFx0XHRcdHJldHVybiBjdXJyZW50ICsgKE1hdGguYWJzKHZhbHVlKSAqIE1hdGhVdGlscy5zaWdudW0oY3VycmVudCkgLSBjdXJyZW50KSAqIGFscGhhO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgcyA9IDA7XG5cdFx0XHRzd2l0Y2ggKGJsZW5kKSB7XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuc2V0dXA6XG5cdFx0XHRcdFx0cyA9IE1hdGguYWJzKHNldHVwKSAqIE1hdGhVdGlscy5zaWdudW0odmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiBzICsgKHZhbHVlIC0gcykgKiBhbHBoYTtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5yZXBsYWNlOlxuXHRcdFx0XHRcdHMgPSBNYXRoLmFicyhjdXJyZW50KSAqIE1hdGhVdGlscy5zaWdudW0odmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiBzICsgKHZhbHVlIC0gcykgKiBhbHBoYTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGN1cnJlbnQgKyAodmFsdWUgLSBzZXR1cCkgKiBhbHBoYTtcblx0fVxufVxuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIGEge0BsaW5rIEN1cnZlVGltZWxpbmV9IHdoaWNoIHNldHMgdHdvIHByb3BlcnRpZXMuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3VydmVUaW1lbGluZTIgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lIHtcblx0LyoqIEBwYXJhbSBiZXppZXJDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgQmV6aWVyIGN1cnZlcy4gU2VlIHtAbGluayAjc2hyaW5rKGludCl9LlxuXHQgKiBAcGFyYW0gcHJvcGVydHlJZHMgVW5pcXVlIGlkZW50aWZpZXJzIGZvciB0aGUgcHJvcGVydGllcyB0aGUgdGltZWxpbmUgbW9kaWZpZXMuICovXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHByb3BlcnR5SWQxOiBzdHJpbmcsIHByb3BlcnR5SWQyOiBzdHJpbmcpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgW3Byb3BlcnR5SWQxLCBwcm9wZXJ0eUlkMl0pO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gMy8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgYW5kIHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgPGNvZGU+ZnJhbWVDb3VudDwvY29kZT4sIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIHRpbWUgVGhlIGZyYW1lIHRpbWUgaW4gc2Vjb25kcy4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgdmFsdWUxOiBudW1iZXIsIHZhbHVlMjogbnVtYmVyKSB7XG5cdFx0ZnJhbWUgKj0gMy8qRU5UUklFUyovO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypWQUxVRTEqL10gPSB2YWx1ZTE7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAyLypWQUxVRTIqL10gPSB2YWx1ZTI7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBib25lJ3MgbG9jYWwge0BsaW5rIEJvbmUjcm90YXRpb259LiAqL1xuZXhwb3J0IGNsYXNzIFJvdGF0ZVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZTEgaW1wbGVtZW50cyBCb25lVGltZWxpbmUge1xuXHRib25lSW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFByb3BlcnR5LnJvdGF0ZSArIFwifFwiICsgYm9uZUluZGV4KTtcblx0XHR0aGlzLmJvbmVJbmRleCA9IGJvbmVJbmRleDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4gfCBudWxsLCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGJvbmUgPSBza2VsZXRvbi5ib25lc1t0aGlzLmJvbmVJbmRleF07XG5cdFx0aWYgKGJvbmUuYWN0aXZlKSBib25lLnJvdGF0aW9uID0gdGhpcy5nZXRSZWxhdGl2ZVZhbHVlKHRpbWUsIGFscGhhLCBibGVuZCwgYm9uZS5yb3RhdGlvbiwgYm9uZS5kYXRhLnJvdGF0aW9uKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIGJvbmUncyBsb2NhbCB7QGxpbmsgQm9uZSN4fSBhbmQge0BsaW5rIEJvbmUjeX0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlVGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lMiBpbXBsZW1lbnRzIEJvbmVUaW1lbGluZSB7XG5cdGJvbmVJbmRleCA9IDA7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCxcblx0XHRcdFByb3BlcnR5LnggKyBcInxcIiArIGJvbmVJbmRleCxcblx0XHRcdFByb3BlcnR5LnkgKyBcInxcIiArIGJvbmVJbmRleCxcblx0XHQpO1xuXHRcdHRoaXMuYm9uZUluZGV4ID0gYm9uZUluZGV4O1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGxldCBib25lID0gc2tlbGV0b24uYm9uZXNbdGhpcy5ib25lSW5kZXhdO1xuXHRcdGlmICghYm9uZS5hY3RpdmUpIHJldHVybjtcblxuXHRcdGxldCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdGJvbmUueCA9IGJvbmUuZGF0YS54O1xuXHRcdFx0XHRcdGJvbmUueSA9IGJvbmUuZGF0YS55O1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0XHRib25lLnggKz0gKGJvbmUuZGF0YS54IC0gYm9uZS54KSAqIGFscGhhO1xuXHRcdFx0XHRcdGJvbmUueSArPSAoYm9uZS5kYXRhLnkgLSBib25lLnkpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHggPSAwLCB5ID0gMDtcblx0XHRsZXQgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDMvKkVOVFJJRVMqLyk7XG5cdFx0bGV0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyAzLypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOlxuXHRcdFx0XHRsZXQgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0bGV0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0eCArPSAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi8gKyAxLypWQUxVRTEqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovICsgMi8qVkFMVUUyKi9dIC0geSkgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypWQUxVRTEqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypWQUxVRTIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0Ym9uZS54ID0gYm9uZS5kYXRhLnggKyB4ICogYWxwaGE7XG5cdFx0XHRcdGJvbmUueSA9IGJvbmUuZGF0YS55ICsgeSAqIGFscGhhO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRjYXNlIE1peEJsZW5kLnJlcGxhY2U6XG5cdFx0XHRcdGJvbmUueCArPSAoYm9uZS5kYXRhLnggKyB4IC0gYm9uZS54KSAqIGFscGhhO1xuXHRcdFx0XHRib25lLnkgKz0gKGJvbmUuZGF0YS55ICsgeSAtIGJvbmUueSkgKiBhbHBoYTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIE1peEJsZW5kLmFkZDpcblx0XHRcdFx0Ym9uZS54ICs9IHggKiBhbHBoYTtcblx0XHRcdFx0Ym9uZS55ICs9IHkgKiBhbHBoYTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBib25lJ3MgbG9jYWwge0BsaW5rIEJvbmUjeH0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlWFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZTEgaW1wbGVtZW50cyBCb25lVGltZWxpbmUge1xuXHRib25lSW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFByb3BlcnR5LnggKyBcInxcIiArIGJvbmVJbmRleCk7XG5cdFx0dGhpcy5ib25lSW5kZXggPSBib25lSW5kZXg7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGJvbmUgPSBza2VsZXRvbi5ib25lc1t0aGlzLmJvbmVJbmRleF07XG5cdFx0aWYgKGJvbmUuYWN0aXZlKSBib25lLnggPSB0aGlzLmdldFJlbGF0aXZlVmFsdWUodGltZSwgYWxwaGEsIGJsZW5kLCBib25lLngsIGJvbmUuZGF0YS54KTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIGJvbmUncyBsb2NhbCB7QGxpbmsgQm9uZSN4fS4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVZVGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lMSBpbXBsZW1lbnRzIEJvbmVUaW1lbGluZSB7XG5cdGJvbmVJbmRleCA9IDA7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgUHJvcGVydHkueSArIFwifFwiICsgYm9uZUluZGV4KTtcblx0XHR0aGlzLmJvbmVJbmRleCA9IGJvbmVJbmRleDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRsZXQgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RoaXMuYm9uZUluZGV4XTtcblx0XHRpZiAoYm9uZS5hY3RpdmUpIGJvbmUueSA9IHRoaXMuZ2V0UmVsYXRpdmVWYWx1ZSh0aW1lLCBhbHBoYSwgYmxlbmQsIGJvbmUueSwgYm9uZS5kYXRhLnkpO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgYm9uZSdzIGxvY2FsIHtAbGluayBCb25lI3NjYWxlWCl9IGFuZCB7QGxpbmsgQm9uZSNzY2FsZVl9LiAqL1xuZXhwb3J0IGNsYXNzIFNjYWxlVGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lMiBpbXBsZW1lbnRzIEJvbmVUaW1lbGluZSB7XG5cdGJvbmVJbmRleCA9IDA7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCxcblx0XHRcdFByb3BlcnR5LnNjYWxlWCArIFwifFwiICsgYm9uZUluZGV4LFxuXHRcdFx0UHJvcGVydHkuc2NhbGVZICsgXCJ8XCIgKyBib25lSW5kZXhcblx0XHQpO1xuXHRcdHRoaXMuYm9uZUluZGV4ID0gYm9uZUluZGV4O1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGxldCBib25lID0gc2tlbGV0b24uYm9uZXNbdGhpcy5ib25lSW5kZXhdO1xuXHRcdGlmICghYm9uZS5hY3RpdmUpIHJldHVybjtcblxuXHRcdGxldCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdGJvbmUuc2NhbGVYID0gYm9uZS5kYXRhLnNjYWxlWDtcblx0XHRcdFx0XHRib25lLnNjYWxlWSA9IGJvbmUuZGF0YS5zY2FsZVk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLmZpcnN0OlxuXHRcdFx0XHRcdGJvbmUuc2NhbGVYICs9IChib25lLmRhdGEuc2NhbGVYIC0gYm9uZS5zY2FsZVgpICogYWxwaGE7XG5cdFx0XHRcdFx0Ym9uZS5zY2FsZVkgKz0gKGJvbmUuZGF0YS5zY2FsZVkgLSBib25lLnNjYWxlWSkgKiBhbHBoYTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgeCwgeTtcblx0XHRsZXQgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDMvKkVOVFJJRVMqLyk7XG5cdFx0bGV0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyAzLypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOlxuXHRcdFx0XHRsZXQgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0bGV0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0eCArPSAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi8gKyAxLypWQUxVRTEqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovICsgMi8qVkFMVUUyKi9dIC0geSkgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypWQUxVRTEqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypWQUxVRTIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXHRcdHggKj0gYm9uZS5kYXRhLnNjYWxlWDtcblx0XHR5ICo9IGJvbmUuZGF0YS5zY2FsZVk7XG5cblx0XHRpZiAoYWxwaGEgPT0gMSkge1xuXHRcdFx0aWYgKGJsZW5kID09IE1peEJsZW5kLmFkZCkge1xuXHRcdFx0XHRib25lLnNjYWxlWCArPSB4IC0gYm9uZS5kYXRhLnNjYWxlWDtcblx0XHRcdFx0Ym9uZS5zY2FsZVkgKz0geSAtIGJvbmUuZGF0YS5zY2FsZVk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRib25lLnNjYWxlWCA9IHg7XG5cdFx0XHRcdGJvbmUuc2NhbGVZID0geTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bGV0IGJ4ID0gMCwgYnkgPSAwO1xuXHRcdFx0aWYgKGRpcmVjdGlvbiA9PSBNaXhEaXJlY3Rpb24ubWl4T3V0KSB7XG5cdFx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdFx0YnggPSBib25lLmRhdGEuc2NhbGVYO1xuXHRcdFx0XHRcdFx0YnkgPSBib25lLmRhdGEuc2NhbGVZO1xuXHRcdFx0XHRcdFx0Ym9uZS5zY2FsZVggPSBieCArIChNYXRoLmFicyh4KSAqIE1hdGhVdGlscy5zaWdudW0oYngpIC0gYngpICogYWxwaGE7XG5cdFx0XHRcdFx0XHRib25lLnNjYWxlWSA9IGJ5ICsgKE1hdGguYWJzKHkpICogTWF0aFV0aWxzLnNpZ251bShieSkgLSBieSkgKiBhbHBoYTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5yZXBsYWNlOlxuXHRcdFx0XHRcdFx0YnggPSBib25lLnNjYWxlWDtcblx0XHRcdFx0XHRcdGJ5ID0gYm9uZS5zY2FsZVk7XG5cdFx0XHRcdFx0XHRib25lLnNjYWxlWCA9IGJ4ICsgKE1hdGguYWJzKHgpICogTWF0aFV0aWxzLnNpZ251bShieCkgLSBieCkgKiBhbHBoYTtcblx0XHRcdFx0XHRcdGJvbmUuc2NhbGVZID0gYnkgKyAoTWF0aC5hYnMoeSkgKiBNYXRoVXRpbHMuc2lnbnVtKGJ5KSAtIGJ5KSAqIGFscGhhO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5hZGQ6XG5cdFx0XHRcdFx0XHRib25lLnNjYWxlWCArPSAoeCAtIGJvbmUuZGF0YS5zY2FsZVgpICogYWxwaGE7XG5cdFx0XHRcdFx0XHRib25lLnNjYWxlWSArPSAoeSAtIGJvbmUuZGF0YS5zY2FsZVkpICogYWxwaGE7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdFx0YnggPSBNYXRoLmFicyhib25lLmRhdGEuc2NhbGVYKSAqIE1hdGhVdGlscy5zaWdudW0oeCk7XG5cdFx0XHRcdFx0XHRieSA9IE1hdGguYWJzKGJvbmUuZGF0YS5zY2FsZVkpICogTWF0aFV0aWxzLnNpZ251bSh5KTtcblx0XHRcdFx0XHRcdGJvbmUuc2NhbGVYID0gYnggKyAoeCAtIGJ4KSAqIGFscGhhO1xuXHRcdFx0XHRcdFx0Ym9uZS5zY2FsZVkgPSBieSArICh5IC0gYnkpICogYWxwaGE7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIE1peEJsZW5kLmZpcnN0OlxuXHRcdFx0XHRcdGNhc2UgTWl4QmxlbmQucmVwbGFjZTpcblx0XHRcdFx0XHRcdGJ4ID0gTWF0aC5hYnMoYm9uZS5zY2FsZVgpICogTWF0aFV0aWxzLnNpZ251bSh4KTtcblx0XHRcdFx0XHRcdGJ5ID0gTWF0aC5hYnMoYm9uZS5zY2FsZVkpICogTWF0aFV0aWxzLnNpZ251bSh5KTtcblx0XHRcdFx0XHRcdGJvbmUuc2NhbGVYID0gYnggKyAoeCAtIGJ4KSAqIGFscGhhO1xuXHRcdFx0XHRcdFx0Ym9uZS5zY2FsZVkgPSBieSArICh5IC0gYnkpICogYWxwaGE7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIE1peEJsZW5kLmFkZDpcblx0XHRcdFx0XHRcdGJvbmUuc2NhbGVYICs9ICh4IC0gYm9uZS5kYXRhLnNjYWxlWCkgKiBhbHBoYTtcblx0XHRcdFx0XHRcdGJvbmUuc2NhbGVZICs9ICh5IC0gYm9uZS5kYXRhLnNjYWxlWSkgKiBhbHBoYTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIGJvbmUncyBsb2NhbCB7QGxpbmsgQm9uZSNzY2FsZVgpfSBhbmQge0BsaW5rIEJvbmUjc2NhbGVZfS4gKi9cbmV4cG9ydCBjbGFzcyBTY2FsZVhUaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUxIGltcGxlbWVudHMgQm9uZVRpbWVsaW5lIHtcblx0Ym9uZUluZGV4ID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBQcm9wZXJ0eS5zY2FsZVggKyBcInxcIiArIGJvbmVJbmRleCk7XG5cdFx0dGhpcy5ib25lSW5kZXggPSBib25lSW5kZXg7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGJvbmUgPSBza2VsZXRvbi5ib25lc1t0aGlzLmJvbmVJbmRleF07XG5cdFx0aWYgKGJvbmUuYWN0aXZlKSBib25lLnNjYWxlWCA9IHRoaXMuZ2V0U2NhbGVWYWx1ZSh0aW1lLCBhbHBoYSwgYmxlbmQsIGRpcmVjdGlvbiwgYm9uZS5zY2FsZVgsIGJvbmUuZGF0YS5zY2FsZVgpO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgYm9uZSdzIGxvY2FsIHtAbGluayBCb25lI3NjYWxlWCl9IGFuZCB7QGxpbmsgQm9uZSNzY2FsZVl9LiAqL1xuZXhwb3J0IGNsYXNzIFNjYWxlWVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZTEgaW1wbGVtZW50cyBCb25lVGltZWxpbmUge1xuXHRib25lSW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFByb3BlcnR5LnNjYWxlWSArIFwifFwiICsgYm9uZUluZGV4KTtcblx0XHR0aGlzLmJvbmVJbmRleCA9IGJvbmVJbmRleDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRsZXQgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RoaXMuYm9uZUluZGV4XTtcblx0XHRpZiAoYm9uZS5hY3RpdmUpIGJvbmUuc2NhbGVZID0gdGhpcy5nZXRTY2FsZVZhbHVlKHRpbWUsIGFscGhhLCBibGVuZCwgZGlyZWN0aW9uLCBib25lLnNjYWxlWSwgYm9uZS5kYXRhLnNjYWxlWSk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBib25lJ3MgbG9jYWwge0BsaW5rIEJvbmUjc2hlYXJYfSBhbmQge0BsaW5rIEJvbmUjc2hlYXJZfS4gKi9cbmV4cG9ydCBjbGFzcyBTaGVhclRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZTIgaW1wbGVtZW50cyBCb25lVGltZWxpbmUge1xuXHRib25lSW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsXG5cdFx0XHRQcm9wZXJ0eS5zaGVhclggKyBcInxcIiArIGJvbmVJbmRleCxcblx0XHRcdFByb3BlcnR5LnNoZWFyWSArIFwifFwiICsgYm9uZUluZGV4XG5cdFx0KTtcblx0XHR0aGlzLmJvbmVJbmRleCA9IGJvbmVJbmRleDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRsZXQgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RoaXMuYm9uZUluZGV4XTtcblx0XHRpZiAoIWJvbmUuYWN0aXZlKSByZXR1cm47XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0XHRib25lLnNoZWFyWCA9IGJvbmUuZGF0YS5zaGVhclg7XG5cdFx0XHRcdFx0Ym9uZS5zaGVhclkgPSBib25lLmRhdGEuc2hlYXJZO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0XHRib25lLnNoZWFyWCArPSAoYm9uZS5kYXRhLnNoZWFyWCAtIGJvbmUuc2hlYXJYKSAqIGFscGhhO1xuXHRcdFx0XHRcdGJvbmUuc2hlYXJZICs9IChib25lLmRhdGEuc2hlYXJZIC0gYm9uZS5zaGVhclkpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHggPSAwLCB5ID0gMDtcblx0XHRsZXQgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDMvKkVOVFJJRVMqLyk7XG5cdFx0bGV0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyAzLypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOlxuXHRcdFx0XHRsZXQgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0bGV0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0eCArPSAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi8gKyAxLypWQUxVRTEqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovICsgMi8qVkFMVUUyKi9dIC0geSkgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypWQUxVRTEqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypWQUxVRTIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0Ym9uZS5zaGVhclggPSBib25lLmRhdGEuc2hlYXJYICsgeCAqIGFscGhhO1xuXHRcdFx0XHRib25lLnNoZWFyWSA9IGJvbmUuZGF0YS5zaGVhclkgKyB5ICogYWxwaGE7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdGNhc2UgTWl4QmxlbmQucmVwbGFjZTpcblx0XHRcdFx0Ym9uZS5zaGVhclggKz0gKGJvbmUuZGF0YS5zaGVhclggKyB4IC0gYm9uZS5zaGVhclgpICogYWxwaGE7XG5cdFx0XHRcdGJvbmUuc2hlYXJZICs9IChib25lLmRhdGEuc2hlYXJZICsgeSAtIGJvbmUuc2hlYXJZKSAqIGFscGhhO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgTWl4QmxlbmQuYWRkOlxuXHRcdFx0XHRib25lLnNoZWFyWCArPSB4ICogYWxwaGE7XG5cdFx0XHRcdGJvbmUuc2hlYXJZICs9IHkgKiBhbHBoYTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBib25lJ3MgbG9jYWwge0BsaW5rIEJvbmUjc2hlYXJYfSBhbmQge0BsaW5rIEJvbmUjc2hlYXJZfS4gKi9cbmV4cG9ydCBjbGFzcyBTaGVhclhUaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUxIGltcGxlbWVudHMgQm9uZVRpbWVsaW5lIHtcblx0Ym9uZUluZGV4ID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBQcm9wZXJ0eS5zaGVhclggKyBcInxcIiArIGJvbmVJbmRleCk7XG5cdFx0dGhpcy5ib25lSW5kZXggPSBib25lSW5kZXg7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGJvbmUgPSBza2VsZXRvbi5ib25lc1t0aGlzLmJvbmVJbmRleF07XG5cdFx0aWYgKGJvbmUuYWN0aXZlKSBib25lLnNoZWFyWCA9IHRoaXMuZ2V0UmVsYXRpdmVWYWx1ZSh0aW1lLCBhbHBoYSwgYmxlbmQsIGJvbmUuc2hlYXJYLCBib25lLmRhdGEuc2hlYXJYKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIGJvbmUncyBsb2NhbCB7QGxpbmsgQm9uZSNzaGVhclh9IGFuZCB7QGxpbmsgQm9uZSNzaGVhcll9LiAqL1xuZXhwb3J0IGNsYXNzIFNoZWFyWVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZTEgaW1wbGVtZW50cyBCb25lVGltZWxpbmUge1xuXHRib25lSW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFByb3BlcnR5LnNoZWFyWSArIFwifFwiICsgYm9uZUluZGV4KTtcblx0XHR0aGlzLmJvbmVJbmRleCA9IGJvbmVJbmRleDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRsZXQgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RoaXMuYm9uZUluZGV4XTtcblx0XHRpZiAoYm9uZS5hY3RpdmUpIGJvbmUuc2hlYXJZID0gdGhpcy5nZXRSZWxhdGl2ZVZhbHVlKHRpbWUsIGFscGhhLCBibGVuZCwgYm9uZS5zaGVhclksIGJvbmUuZGF0YS5zaGVhclkpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBJbmhlcml0VGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSBpbXBsZW1lbnRzIEJvbmVUaW1lbGluZSB7XG5cdGJvbmVJbmRleCA9IDA7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBbUHJvcGVydHkuaW5oZXJpdCArIFwifFwiICsgYm9uZUluZGV4XSk7XG5cdFx0dGhpcy5ib25lSW5kZXggPSBib25lSW5kZXg7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gMi8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRyYW5zZm9ybSBtb2RlIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCA8Y29kZT5mcmFtZUNvdW50PC9jb2RlPiwgaW5jbHVzaXZlLlxuXHQgKiBAcGFyYW0gdGltZSBUaGUgZnJhbWUgdGltZSBpbiBzZWNvbmRzLiAqL1xuXHRwdWJsaWMgc2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgaW5oZXJpdDogSW5oZXJpdCkge1xuXHRcdGZyYW1lICo9IDIvKkVOVFJJRVMqLztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qSU5IRVJJVCovXSA9IGluaGVyaXQ7XG5cdH1cblxuXHRwdWJsaWMgYXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGxldCBib25lID0gc2tlbGV0b24uYm9uZXNbdGhpcy5ib25lSW5kZXhdO1xuXHRcdGlmICghYm9uZS5hY3RpdmUpIHJldHVybjtcblxuXHRcdGlmIChkaXJlY3Rpb24gPT0gTWl4RGlyZWN0aW9uLm1peE91dCkge1xuXHRcdFx0aWYgKGJsZW5kID09IE1peEJsZW5kLnNldHVwKSBib25lLmluaGVyaXQgPSBib25lLmRhdGEuaW5oZXJpdDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGlmIChibGVuZCA9PSBNaXhCbGVuZC5zZXR1cCB8fCBibGVuZCA9PSBNaXhCbGVuZC5maXJzdCkgYm9uZS5pbmhlcml0ID0gYm9uZS5kYXRhLmluaGVyaXQ7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGJvbmUuaW5oZXJpdCA9IHRoaXMuZnJhbWVzW1RpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDIvKkVOVFJJRVMqLykgKyAxLypJTkhFUklUKi9dO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgc2xvdCdzIHtAbGluayBTbG90I2NvbG9yfS4gKi9cbmV4cG9ydCBjbGFzcyBSR0JBVGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lIGltcGxlbWVudHMgU2xvdFRpbWVsaW5lIHtcblx0c2xvdEluZGV4ID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBbXG5cdFx0XHRQcm9wZXJ0eS5yZ2IgKyBcInxcIiArIHNsb3RJbmRleCxcblx0XHRcdFByb3BlcnR5LmFscGhhICsgXCJ8XCIgKyBzbG90SW5kZXhcblx0XHRdKTtcblx0XHR0aGlzLnNsb3RJbmRleCA9IHNsb3RJbmRleDtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDUvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMsIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcikge1xuXHRcdGZyYW1lICo9IDUvKkVOVFJJRVMqLztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qUiovXSA9IHI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAyLypHKi9dID0gZztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDMvKkIqL10gPSBiO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNC8qQSovXSA9IGE7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IHNsb3QgPSBza2VsZXRvbi5zbG90c1t0aGlzLnNsb3RJbmRleF07XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0bGV0IGNvbG9yID0gc2xvdC5jb2xvcjtcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0bGV0IHNldHVwID0gc2xvdC5kYXRhLmNvbG9yO1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdGNvbG9yLnNldEZyb21Db2xvcihzZXR1cCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLmZpcnN0OlxuXHRcdFx0XHRcdGNvbG9yLmFkZCgoc2V0dXAuciAtIGNvbG9yLnIpICogYWxwaGEsIChzZXR1cC5nIC0gY29sb3IuZykgKiBhbHBoYSwgKHNldHVwLmIgLSBjb2xvci5iKSAqIGFscGhhLFxuXHRcdFx0XHRcdFx0KHNldHVwLmEgLSBjb2xvci5hKSAqIGFscGhhKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7XG5cdFx0bGV0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA1LypFTlRSSUVTKi8pO1xuXHRcdGxldCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpIC8gNS8qRU5UUklFUyovXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzpcblx0XHRcdFx0bGV0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0ciA9IGZyYW1lc1tpICsgMS8qUiovXTtcblx0XHRcdFx0ZyA9IGZyYW1lc1tpICsgMi8qRyovXTtcblx0XHRcdFx0YiA9IGZyYW1lc1tpICsgMy8qQiovXTtcblx0XHRcdFx0YSA9IGZyYW1lc1tpICsgNC8qQSovXTtcblx0XHRcdFx0bGV0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyA1LypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0ciArPSAoZnJhbWVzW2kgKyA1LypFTlRSSUVTKi8gKyAxLypSKi9dIC0gcikgKiB0O1xuXHRcdFx0XHRnICs9IChmcmFtZXNbaSArIDUvKkVOVFJJRVMqLyArIDIvKkcqL10gLSBnKSAqIHQ7XG5cdFx0XHRcdGIgKz0gKGZyYW1lc1tpICsgNS8qRU5UUklFUyovICsgMy8qQiovXSAtIGIpICogdDtcblx0XHRcdFx0YSArPSAoZnJhbWVzW2kgKyA1LypFTlRSSUVTKi8gKyA0LypBKi9dIC0gYSkgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHRyID0gZnJhbWVzW2kgKyAxLypSKi9dO1xuXHRcdFx0XHRnID0gZnJhbWVzW2kgKyAyLypHKi9dO1xuXHRcdFx0XHRiID0gZnJhbWVzW2kgKyAzLypCKi9dO1xuXHRcdFx0XHRhID0gZnJhbWVzW2kgKyA0LypBKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKlIqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRnID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypHKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRiID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypCKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0YSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNC8qQSovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDMgLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXHRcdGlmIChhbHBoYSA9PSAxKVxuXHRcdFx0Y29sb3Iuc2V0KHIsIGcsIGIsIGEpO1xuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKGJsZW5kID09IE1peEJsZW5kLnNldHVwKSBjb2xvci5zZXRGcm9tQ29sb3Ioc2xvdC5kYXRhLmNvbG9yKTtcblx0XHRcdGNvbG9yLmFkZCgociAtIGNvbG9yLnIpICogYWxwaGEsIChnIC0gY29sb3IuZykgKiBhbHBoYSwgKGIgLSBjb2xvci5iKSAqIGFscGhhLCAoYSAtIGNvbG9yLmEpICogYWxwaGEpO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHNsb3QncyB7QGxpbmsgU2xvdCNjb2xvcn0uICovXG5leHBvcnQgY2xhc3MgUkdCVGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lIGltcGxlbWVudHMgU2xvdFRpbWVsaW5lIHtcblx0c2xvdEluZGV4ID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBbXG5cdFx0XHRQcm9wZXJ0eS5yZ2IgKyBcInxcIiArIHNsb3RJbmRleFxuXHRcdF0pO1xuXHRcdHRoaXMuc2xvdEluZGV4ID0gc2xvdEluZGV4O1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gNC8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcywgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcikge1xuXHRcdGZyYW1lIDw8PSAyO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypSKi9dID0gcjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKkcqL10gPSBnO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQiovXSA9IGI7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IHNsb3QgPSBza2VsZXRvbi5zbG90c1t0aGlzLnNsb3RJbmRleF07XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0bGV0IGNvbG9yID0gc2xvdC5jb2xvcjtcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0bGV0IHNldHVwID0gc2xvdC5kYXRhLmNvbG9yO1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdGNvbG9yLnIgPSBzZXR1cC5yO1xuXHRcdFx0XHRcdGNvbG9yLmcgPSBzZXR1cC5nO1xuXHRcdFx0XHRcdGNvbG9yLmIgPSBzZXR1cC5iO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0XHRjb2xvci5yICs9IChzZXR1cC5yIC0gY29sb3IucikgKiBhbHBoYTtcblx0XHRcdFx0XHRjb2xvci5nICs9IChzZXR1cC5nIC0gY29sb3IuZykgKiBhbHBoYTtcblx0XHRcdFx0XHRjb2xvci5iICs9IChzZXR1cC5iIC0gY29sb3IuYikgKiBhbHBoYTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgciA9IDAsIGcgPSAwLCBiID0gMDtcblx0XHRsZXQgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDQvKkVOVFJJRVMqLyk7XG5cdFx0bGV0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgPj4gMl07XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86XG5cdFx0XHRcdGxldCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdGxldCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHIgKz0gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovICsgMS8qUiovXSAtIHIpICogdDtcblx0XHRcdFx0ZyArPSAoZnJhbWVzW2kgKyA0LypFTlRSSUVTKi8gKyAyLypHKi9dIC0gZykgKiB0O1xuXHRcdFx0XHRiICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDMvKkIqL10gLSBiKSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ciA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUiovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKkcqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDMvKkIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAyIC0gMi8qQkVaSUVSKi8pO1xuXHRcdH1cblx0XHRpZiAoYWxwaGEgPT0gMSkge1xuXHRcdFx0Y29sb3IuciA9IHI7XG5cdFx0XHRjb2xvci5nID0gZztcblx0XHRcdGNvbG9yLmIgPSBiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXApIHtcblx0XHRcdFx0bGV0IHNldHVwID0gc2xvdC5kYXRhLmNvbG9yO1xuXHRcdFx0XHRjb2xvci5yID0gc2V0dXAucjtcblx0XHRcdFx0Y29sb3IuZyA9IHNldHVwLmc7XG5cdFx0XHRcdGNvbG9yLmIgPSBzZXR1cC5iO1xuXHRcdFx0fVxuXHRcdFx0Y29sb3IuciArPSAociAtIGNvbG9yLnIpICogYWxwaGE7XG5cdFx0XHRjb2xvci5nICs9IChnIC0gY29sb3IuZykgKiBhbHBoYTtcblx0XHRcdGNvbG9yLmIgKz0gKGIgLSBjb2xvci5iKSAqIGFscGhhO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIGJvbmUncyBsb2NhbCB7QGxpbmsgQm9uZSNzaGVhclh9IGFuZCB7QGxpbmsgQm9uZSNzaGVhcll9LiAqL1xuZXhwb3J0IGNsYXNzIEFscGhhVGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lMSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHNsb3RJbmRleCA9IDA7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgc2xvdEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgUHJvcGVydHkuYWxwaGEgKyBcInxcIiArIHNsb3RJbmRleCk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IHNsb3QgPSBza2VsZXRvbi5zbG90c1t0aGlzLnNsb3RJbmRleF07XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cblx0XHRsZXQgY29sb3IgPSBzbG90LmNvbG9yO1xuXHRcdGlmICh0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHtcblx0XHRcdGxldCBzZXR1cCA9IHNsb3QuZGF0YS5jb2xvcjtcblx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0XHRjb2xvci5hID0gc2V0dXAuYTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRcdFx0Y29sb3IuYSArPSAoc2V0dXAuYSAtIGNvbG9yLmEpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGEgPSB0aGlzLmdldEN1cnZlVmFsdWUodGltZSk7XG5cdFx0aWYgKGFscGhhID09IDEpXG5cdFx0XHRjb2xvci5hID0gYTtcblx0XHRlbHNlIHtcblx0XHRcdGlmIChibGVuZCA9PSBNaXhCbGVuZC5zZXR1cCkgY29sb3IuYSA9IHNsb3QuZGF0YS5jb2xvci5hO1xuXHRcdFx0Y29sb3IuYSArPSAoYSAtIGNvbG9yLmEpICogYWxwaGE7XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgc2xvdCdzIHtAbGluayBTbG90I2NvbG9yfSBhbmQge0BsaW5rIFNsb3QjZGFya0NvbG9yfSBmb3IgdHdvIGNvbG9yIHRpbnRpbmcuICovXG5leHBvcnQgY2xhc3MgUkdCQTJUaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUgaW1wbGVtZW50cyBTbG90VGltZWxpbmUge1xuXHRzbG90SW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFtcblx0XHRcdFByb3BlcnR5LnJnYiArIFwifFwiICsgc2xvdEluZGV4LFxuXHRcdFx0UHJvcGVydHkuYWxwaGEgKyBcInxcIiArIHNsb3RJbmRleCxcblx0XHRcdFByb3BlcnR5LnJnYjIgKyBcInxcIiArIHNsb3RJbmRleFxuXHRcdF0pO1xuXHRcdHRoaXMuc2xvdEluZGV4ID0gc2xvdEluZGV4O1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gOC8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcywgbGlnaHQsIGFuZCBkYXJrIGNvbG9ycyBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciwgcjI6IG51bWJlciwgZzI6IG51bWJlciwgYjI6IG51bWJlcikge1xuXHRcdGZyYW1lIDw8PSAzO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypSKi9dID0gcjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKkcqL10gPSBnO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQiovXSA9IGI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA0LypBKi9dID0gYTtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDUvKlIyKi9dID0gcjI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA2LypHMiovXSA9IGcyO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNy8qQjIqL10gPSBiMjtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRsZXQgc2xvdCA9IHNrZWxldG9uLnNsb3RzW3RoaXMuc2xvdEluZGV4XTtcblx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIHJldHVybjtcblxuXHRcdGxldCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRsZXQgbGlnaHQgPSBzbG90LmNvbG9yLCBkYXJrID0gc2xvdC5kYXJrQ29sb3IhO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRsZXQgc2V0dXBMaWdodCA9IHNsb3QuZGF0YS5jb2xvciwgc2V0dXBEYXJrID0gc2xvdC5kYXRhLmRhcmtDb2xvciE7XG5cdFx0XHRzd2l0Y2ggKGJsZW5kKSB7XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuc2V0dXA6XG5cdFx0XHRcdFx0bGlnaHQuc2V0RnJvbUNvbG9yKHNldHVwTGlnaHQpO1xuXHRcdFx0XHRcdGRhcmsuciA9IHNldHVwRGFyay5yO1xuXHRcdFx0XHRcdGRhcmsuZyA9IHNldHVwRGFyay5nO1xuXHRcdFx0XHRcdGRhcmsuYiA9IHNldHVwRGFyay5iO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0XHRsaWdodC5hZGQoKHNldHVwTGlnaHQuciAtIGxpZ2h0LnIpICogYWxwaGEsIChzZXR1cExpZ2h0LmcgLSBsaWdodC5nKSAqIGFscGhhLCAoc2V0dXBMaWdodC5iIC0gbGlnaHQuYikgKiBhbHBoYSxcblx0XHRcdFx0XHRcdChzZXR1cExpZ2h0LmEgLSBsaWdodC5hKSAqIGFscGhhKTtcblx0XHRcdFx0XHRkYXJrLnIgKz0gKHNldHVwRGFyay5yIC0gZGFyay5yKSAqIGFscGhhO1xuXHRcdFx0XHRcdGRhcmsuZyArPSAoc2V0dXBEYXJrLmcgLSBkYXJrLmcpICogYWxwaGE7XG5cdFx0XHRcdFx0ZGFyay5iICs9IChzZXR1cERhcmsuYiAtIGRhcmsuYikgKiBhbHBoYTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDAsIHIyID0gMCwgZzIgPSAwLCBiMiA9IDA7XG5cdFx0bGV0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA4LypFTlRSSUVTKi8pO1xuXHRcdGxldCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpID4+IDNdO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOlxuXHRcdFx0XHRsZXQgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHRyID0gZnJhbWVzW2kgKyAxLypSKi9dO1xuXHRcdFx0XHRnID0gZnJhbWVzW2kgKyAyLypHKi9dO1xuXHRcdFx0XHRiID0gZnJhbWVzW2kgKyAzLypCKi9dO1xuXHRcdFx0XHRhID0gZnJhbWVzW2kgKyA0LypBKi9dO1xuXHRcdFx0XHRyMiA9IGZyYW1lc1tpICsgNS8qUjIqL107XG5cdFx0XHRcdGcyID0gZnJhbWVzW2kgKyA2LypHMiovXTtcblx0XHRcdFx0YjIgPSBmcmFtZXNbaSArIDcvKkIyKi9dO1xuXHRcdFx0XHRsZXQgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDgvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHRyICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDEvKlIqL10gLSByKSAqIHQ7XG5cdFx0XHRcdGcgKz0gKGZyYW1lc1tpICsgOC8qRU5UUklFUyovICsgMi8qRyovXSAtIGcpICogdDtcblx0XHRcdFx0YiArPSAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi8gKyAzLypCKi9dIC0gYikgKiB0O1xuXHRcdFx0XHRhICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDQvKkEqL10gLSBhKSAqIHQ7XG5cdFx0XHRcdHIyICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDUvKlIyKi9dIC0gcjIpICogdDtcblx0XHRcdFx0ZzIgKz0gKGZyYW1lc1tpICsgOC8qRU5UUklFUyovICsgNi8qRzIqL10gLSBnMikgKiB0O1xuXHRcdFx0XHRiMiArPSAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi8gKyA3LypCMiovXSAtIGIyKSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdGEgPSBmcmFtZXNbaSArIDQvKkEqL107XG5cdFx0XHRcdHIyID0gZnJhbWVzW2kgKyA1LypSMiovXTtcblx0XHRcdFx0ZzIgPSBmcmFtZXNbaSArIDYvKkcyKi9dO1xuXHRcdFx0XHRiMiA9IGZyYW1lc1tpICsgNy8qQjIqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ciA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUiovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKkcqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDMvKkIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAyIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRhID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA0LypBKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0cjIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDUvKlIyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNCAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0ZzIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDYvKkcyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0YjIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDcvKkIyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNiAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRpZiAoYWxwaGEgPT0gMSkge1xuXHRcdFx0bGlnaHQuc2V0KHIsIGcsIGIsIGEpO1xuXHRcdFx0ZGFyay5yID0gcjI7XG5cdFx0XHRkYXJrLmcgPSBnMjtcblx0XHRcdGRhcmsuYiA9IGIyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXApIHtcblx0XHRcdFx0bGlnaHQuc2V0RnJvbUNvbG9yKHNsb3QuZGF0YS5jb2xvcik7XG5cdFx0XHRcdGxldCBzZXR1cERhcmsgPSBzbG90LmRhdGEuZGFya0NvbG9yITtcblx0XHRcdFx0ZGFyay5yID0gc2V0dXBEYXJrLnI7XG5cdFx0XHRcdGRhcmsuZyA9IHNldHVwRGFyay5nO1xuXHRcdFx0XHRkYXJrLmIgPSBzZXR1cERhcmsuYjtcblx0XHRcdH1cblx0XHRcdGxpZ2h0LmFkZCgociAtIGxpZ2h0LnIpICogYWxwaGEsIChnIC0gbGlnaHQuZykgKiBhbHBoYSwgKGIgLSBsaWdodC5iKSAqIGFscGhhLCAoYSAtIGxpZ2h0LmEpICogYWxwaGEpO1xuXHRcdFx0ZGFyay5yICs9IChyMiAtIGRhcmsucikgKiBhbHBoYTtcblx0XHRcdGRhcmsuZyArPSAoZzIgLSBkYXJrLmcpICogYWxwaGE7XG5cdFx0XHRkYXJrLmIgKz0gKGIyIC0gZGFyay5iKSAqIGFscGhhO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHNsb3QncyB7QGxpbmsgU2xvdCNjb2xvcn0gYW5kIHtAbGluayBTbG90I2RhcmtDb2xvcn0gZm9yIHR3byBjb2xvciB0aW50aW5nLiAqL1xuZXhwb3J0IGNsYXNzIFJHQjJUaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUgaW1wbGVtZW50cyBTbG90VGltZWxpbmUge1xuXHRzbG90SW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFtcblx0XHRcdFByb3BlcnR5LnJnYiArIFwifFwiICsgc2xvdEluZGV4LFxuXHRcdFx0UHJvcGVydHkucmdiMiArIFwifFwiICsgc2xvdEluZGV4XG5cdFx0XSk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdH1cblxuXHRnZXRGcmFtZUVudHJpZXMgKCkge1xuXHRcdHJldHVybiA3LypFTlRSSUVTKi87XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBpbiBzZWNvbmRzLCBsaWdodCwgYW5kIGRhcmsgY29sb3JzIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgcjI6IG51bWJlciwgZzI6IG51bWJlciwgYjI6IG51bWJlcikge1xuXHRcdGZyYW1lICo9IDcvKkVOVFJJRVMqLztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qUiovXSA9IHI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAyLypHKi9dID0gZztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDMvKkIqL10gPSBiO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNC8qUjIqL10gPSByMjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDUvKkcyKi9dID0gZzI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA2LypCMiovXSA9IGIyO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGxldCBzbG90ID0gc2tlbGV0b24uc2xvdHNbdGhpcy5zbG90SW5kZXhdO1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0bGV0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGxldCBsaWdodCA9IHNsb3QuY29sb3IsIGRhcmsgPSBzbG90LmRhcmtDb2xvciE7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGxldCBzZXR1cExpZ2h0ID0gc2xvdC5kYXRhLmNvbG9yLCBzZXR1cERhcmsgPSBzbG90LmRhdGEuZGFya0NvbG9yITtcblx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0XHRsaWdodC5yID0gc2V0dXBMaWdodC5yO1xuXHRcdFx0XHRcdGxpZ2h0LmcgPSBzZXR1cExpZ2h0Lmc7XG5cdFx0XHRcdFx0bGlnaHQuYiA9IHNldHVwTGlnaHQuYjtcblx0XHRcdFx0XHRkYXJrLnIgPSBzZXR1cERhcmsucjtcblx0XHRcdFx0XHRkYXJrLmcgPSBzZXR1cERhcmsuZztcblx0XHRcdFx0XHRkYXJrLmIgPSBzZXR1cERhcmsuYjtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRcdFx0bGlnaHQuciArPSAoc2V0dXBMaWdodC5yIC0gbGlnaHQucikgKiBhbHBoYTtcblx0XHRcdFx0XHRsaWdodC5nICs9IChzZXR1cExpZ2h0LmcgLSBsaWdodC5nKSAqIGFscGhhO1xuXHRcdFx0XHRcdGxpZ2h0LmIgKz0gKHNldHVwTGlnaHQuYiAtIGxpZ2h0LmIpICogYWxwaGE7XG5cdFx0XHRcdFx0ZGFyay5yICs9IChzZXR1cERhcmsuciAtIGRhcmsucikgKiBhbHBoYTtcblx0XHRcdFx0XHRkYXJrLmcgKz0gKHNldHVwRGFyay5nIC0gZGFyay5nKSAqIGFscGhhO1xuXHRcdFx0XHRcdGRhcmsuYiArPSAoc2V0dXBEYXJrLmIgLSBkYXJrLmIpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwLCByMiA9IDAsIGcyID0gMCwgYjIgPSAwO1xuXHRcdGxldCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgNy8qRU5UUklFUyovKTtcblx0XHRsZXQgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSAvIDcvKkVOVFJJRVMqL107XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86XG5cdFx0XHRcdGxldCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdHIyID0gZnJhbWVzW2kgKyA0LypSMiovXTtcblx0XHRcdFx0ZzIgPSBmcmFtZXNbaSArIDUvKkcyKi9dO1xuXHRcdFx0XHRiMiA9IGZyYW1lc1tpICsgNi8qQjIqL107XG5cdFx0XHRcdGxldCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHIgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgMS8qUiovXSAtIHIpICogdDtcblx0XHRcdFx0ZyArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyAyLypHKi9dIC0gZykgKiB0O1xuXHRcdFx0XHRiICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDMvKkIqL10gLSBiKSAqIHQ7XG5cdFx0XHRcdHIyICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDQvKlIyKi9dIC0gcjIpICogdDtcblx0XHRcdFx0ZzIgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgNS8qRzIqL10gLSBnMikgKiB0O1xuXHRcdFx0XHRiMiArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyA2LypCMiovXSAtIGIyKSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdHIyID0gZnJhbWVzW2kgKyA0LypSMiovXTtcblx0XHRcdFx0ZzIgPSBmcmFtZXNbaSArIDUvKkcyKi9dO1xuXHRcdFx0XHRiMiA9IGZyYW1lc1tpICsgNi8qQjIqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ciA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUiovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKkcqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDMvKkIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAyIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRyMiA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNC8qUjIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAzIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRnMiA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNS8qRzIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiA0IC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRiMiA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNi8qQjIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiA1IC0gMi8qQkVaSUVSKi8pO1xuXHRcdH1cblxuXHRcdGlmIChhbHBoYSA9PSAxKSB7XG5cdFx0XHRsaWdodC5yID0gcjtcblx0XHRcdGxpZ2h0LmcgPSBnO1xuXHRcdFx0bGlnaHQuYiA9IGI7XG5cdFx0XHRkYXJrLnIgPSByMjtcblx0XHRcdGRhcmsuZyA9IGcyO1xuXHRcdFx0ZGFyay5iID0gYjI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChibGVuZCA9PSBNaXhCbGVuZC5zZXR1cCkge1xuXHRcdFx0XHRsZXQgc2V0dXBMaWdodCA9IHNsb3QuZGF0YS5jb2xvciwgc2V0dXBEYXJrID0gc2xvdC5kYXRhLmRhcmtDb2xvciE7XG5cdFx0XHRcdGxpZ2h0LnIgPSBzZXR1cExpZ2h0LnI7XG5cdFx0XHRcdGxpZ2h0LmcgPSBzZXR1cExpZ2h0Lmc7XG5cdFx0XHRcdGxpZ2h0LmIgPSBzZXR1cExpZ2h0LmI7XG5cdFx0XHRcdGRhcmsuciA9IHNldHVwRGFyay5yO1xuXHRcdFx0XHRkYXJrLmcgPSBzZXR1cERhcmsuZztcblx0XHRcdFx0ZGFyay5iID0gc2V0dXBEYXJrLmI7XG5cdFx0XHR9XG5cdFx0XHRsaWdodC5yICs9IChyIC0gbGlnaHQucikgKiBhbHBoYTtcblx0XHRcdGxpZ2h0LmcgKz0gKGcgLSBsaWdodC5nKSAqIGFscGhhO1xuXHRcdFx0bGlnaHQuYiArPSAoYiAtIGxpZ2h0LmIpICogYWxwaGE7XG5cdFx0XHRkYXJrLnIgKz0gKHIyIC0gZGFyay5yKSAqIGFscGhhO1xuXHRcdFx0ZGFyay5nICs9IChnMiAtIGRhcmsuZykgKiBhbHBoYTtcblx0XHRcdGRhcmsuYiArPSAoYjIgLSBkYXJrLmIpICogYWxwaGE7XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgc2xvdCdzIHtAbGluayBTbG90I2F0dGFjaG1lbnR9LiAqL1xuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIGltcGxlbWVudHMgU2xvdFRpbWVsaW5lIHtcblx0c2xvdEluZGV4ID0gMDtcblxuXHQvKiogVGhlIGF0dGFjaG1lbnQgbmFtZSBmb3IgZWFjaCBrZXkgZnJhbWUuIE1heSBjb250YWluIG51bGwgdmFsdWVzIHRvIGNsZWFyIHRoZSBhdHRhY2htZW50LiAqL1xuXHRhdHRhY2htZW50TmFtZXM6IEFycmF5PHN0cmluZyB8IG51bGw+O1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgW1xuXHRcdFx0UHJvcGVydHkuYXR0YWNobWVudCArIFwifFwiICsgc2xvdEluZGV4XG5cdFx0XSk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdFx0dGhpcy5hdHRhY2htZW50TmFtZXMgPSBuZXcgQXJyYXk8c3RyaW5nPihmcmFtZUNvdW50KTtcblx0fVxuXG5cdGdldEZyYW1lQ291bnQgKCkge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBpbiBzZWNvbmRzIGFuZCB0aGUgYXR0YWNobWVudCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgYXR0YWNobWVudE5hbWU6IHN0cmluZyB8IG51bGwpIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuYXR0YWNobWVudE5hbWVzW2ZyYW1lXSA9IGF0dGFjaG1lbnROYW1lO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGxldCBzbG90ID0gc2tlbGV0b24uc2xvdHNbdGhpcy5zbG90SW5kZXhdO1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0aWYgKGRpcmVjdGlvbiA9PSBNaXhEaXJlY3Rpb24ubWl4T3V0KSB7XG5cdFx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXApIHRoaXMuc2V0QXR0YWNobWVudChza2VsZXRvbiwgc2xvdCwgc2xvdC5kYXRhLmF0dGFjaG1lbnROYW1lKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodGltZSA8IHRoaXMuZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXAgfHwgYmxlbmQgPT0gTWl4QmxlbmQuZmlyc3QpIHRoaXMuc2V0QXR0YWNobWVudChza2VsZXRvbiwgc2xvdCwgc2xvdC5kYXRhLmF0dGFjaG1lbnROYW1lKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnNldEF0dGFjaG1lbnQoc2tlbGV0b24sIHNsb3QsIHRoaXMuYXR0YWNobWVudE5hbWVzW1RpbWVsaW5lLnNlYXJjaDEodGhpcy5mcmFtZXMsIHRpbWUpXSk7XG5cdH1cblxuXHRzZXRBdHRhY2htZW50IChza2VsZXRvbjogU2tlbGV0b24sIHNsb3Q6IFNsb3QsIGF0dGFjaG1lbnROYW1lOiBzdHJpbmcgfCBudWxsKSB7XG5cdFx0c2xvdC5zZXRBdHRhY2htZW50KCFhdHRhY2htZW50TmFtZSA/IG51bGwgOiBza2VsZXRvbi5nZXRBdHRhY2htZW50KHRoaXMuc2xvdEluZGV4LCBhdHRhY2htZW50TmFtZSkpO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgc2xvdCdzIHtAbGluayBTbG90I2RlZm9ybX0gdG8gZGVmb3JtIGEge0BsaW5rIFZlcnRleEF0dGFjaG1lbnR9LiAqL1xuZXhwb3J0IGNsYXNzIERlZm9ybVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHNsb3RJbmRleCA9IDA7XG5cblx0LyoqIFRoZSBhdHRhY2htZW50IHRoYXQgd2lsbCBiZSBkZWZvcm1lZC4gKi9cblx0YXR0YWNobWVudDogVmVydGV4QXR0YWNobWVudDtcblxuXHQvKiogVGhlIHZlcnRpY2VzIGZvciBlYWNoIGtleSBmcmFtZS4gKi9cblx0dmVydGljZXM6IEFycmF5PE51bWJlckFycmF5TGlrZT47XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgc2xvdEluZGV4OiBudW1iZXIsIGF0dGFjaG1lbnQ6IFZlcnRleEF0dGFjaG1lbnQpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgW1xuXHRcdFx0UHJvcGVydHkuZGVmb3JtICsgXCJ8XCIgKyBzbG90SW5kZXggKyBcInxcIiArIGF0dGFjaG1lbnQuaWRcblx0XHRdKTtcblx0XHR0aGlzLnNsb3RJbmRleCA9IHNsb3RJbmRleDtcblx0XHR0aGlzLmF0dGFjaG1lbnQgPSBhdHRhY2htZW50O1xuXHRcdHRoaXMudmVydGljZXMgPSBuZXcgQXJyYXk8TnVtYmVyQXJyYXlMaWtlPihmcmFtZUNvdW50KTtcblx0fVxuXG5cdGdldEZyYW1lQ291bnQgKCkge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBpbiBzZWNvbmRzIGFuZCB0aGUgdmVydGljZXMgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lLlxuXHQgKiBAcGFyYW0gdmVydGljZXMgVmVydGV4IHBvc2l0aW9ucyBmb3IgYW4gdW53ZWlnaHRlZCBWZXJ0ZXhBdHRhY2htZW50LCBvciBkZWZvcm0gb2Zmc2V0cyBpZiBpdCBoYXMgd2VpZ2h0cy4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgdmVydGljZXM6IE51bWJlckFycmF5TGlrZSkge1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy52ZXJ0aWNlc1tmcmFtZV0gPSB2ZXJ0aWNlcztcblx0fVxuXG5cdC8qKiBAcGFyYW0gdmFsdWUxIElnbm9yZWQgKDAgaXMgdXNlZCBmb3IgYSBkZWZvcm0gdGltZWxpbmUpLlxuXHQgKiBAcGFyYW0gdmFsdWUyIElnbm9yZWQgKDEgaXMgdXNlZCBmb3IgYSBkZWZvcm0gdGltZWxpbmUpLiAqL1xuXHRzZXRCZXppZXIgKGJlemllcjogbnVtYmVyLCBmcmFtZTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyLCB0aW1lMTogbnVtYmVyLCB2YWx1ZTE6IG51bWJlciwgY3gxOiBudW1iZXIsIGN5MTogbnVtYmVyLCBjeDI6IG51bWJlcixcblx0XHRjeTI6IG51bWJlciwgdGltZTI6IG51bWJlciwgdmFsdWUyOiBudW1iZXIpIHtcblx0XHRsZXQgY3VydmVzID0gdGhpcy5jdXJ2ZXM7XG5cdFx0bGV0IGkgPSB0aGlzLmdldEZyYW1lQ291bnQoKSArIGJlemllciAqIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGlmICh2YWx1ZSA9PSAwKSBjdXJ2ZXNbZnJhbWVdID0gMi8qQkVaSUVSKi8gKyBpO1xuXHRcdGxldCB0bXB4ID0gKHRpbWUxIC0gY3gxICogMiArIGN4MikgKiAwLjAzLCB0bXB5ID0gY3kyICogMC4wMyAtIGN5MSAqIDAuMDY7XG5cdFx0bGV0IGRkZHggPSAoKGN4MSAtIGN4MikgKiAzIC0gdGltZTEgKyB0aW1lMikgKiAwLjAwNiwgZGRkeSA9IChjeTEgLSBjeTIgKyAwLjMzMzMzMzMzKSAqIDAuMDE4O1xuXHRcdGxldCBkZHggPSB0bXB4ICogMiArIGRkZHgsIGRkeSA9IHRtcHkgKiAyICsgZGRkeTtcblx0XHRsZXQgZHggPSAoY3gxIC0gdGltZTEpICogMC4zICsgdG1weCArIGRkZHggKiAwLjE2NjY2NjY3LCBkeSA9IGN5MSAqIDAuMyArIHRtcHkgKyBkZGR5ICogMC4xNjY2NjY2Nztcblx0XHRsZXQgeCA9IHRpbWUxICsgZHgsIHkgPSBkeTtcblx0XHRmb3IgKGxldCBuID0gaSArIDE4LypCRVpJRVJfU0laRSovOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRjdXJ2ZXNbaV0gPSB4O1xuXHRcdFx0Y3VydmVzW2kgKyAxXSA9IHk7XG5cdFx0XHRkeCArPSBkZHg7XG5cdFx0XHRkeSArPSBkZHk7XG5cdFx0XHRkZHggKz0gZGRkeDtcblx0XHRcdGRkeSArPSBkZGR5O1xuXHRcdFx0eCArPSBkeDtcblx0XHRcdHkgKz0gZHk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q3VydmVQZXJjZW50ICh0aW1lOiBudW1iZXIsIGZyYW1lOiBudW1iZXIpIHtcblx0XHRsZXQgY3VydmVzID0gdGhpcy5jdXJ2ZXM7XG5cdFx0bGV0IGkgPSBjdXJ2ZXNbZnJhbWVdO1xuXHRcdHN3aXRjaCAoaSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzpcblx0XHRcdFx0bGV0IHggPSB0aGlzLmZyYW1lc1tmcmFtZV07XG5cdFx0XHRcdHJldHVybiAodGltZSAtIHgpIC8gKHRoaXMuZnJhbWVzW2ZyYW1lICsgdGhpcy5nZXRGcmFtZUVudHJpZXMoKV0gLSB4KTtcblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aSAtPSAyLypCRVpJRVIqLztcblx0XHRpZiAoY3VydmVzW2ldID4gdGltZSkge1xuXHRcdFx0bGV0IHggPSB0aGlzLmZyYW1lc1tmcmFtZV07XG5cdFx0XHRyZXR1cm4gY3VydmVzW2kgKyAxXSAqICh0aW1lIC0geCkgLyAoY3VydmVzW2ldIC0geCk7XG5cdFx0fVxuXHRcdGxldCBuID0gaSArIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGZvciAoaSArPSAyOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRpZiAoY3VydmVzW2ldID49IHRpbWUpIHtcblx0XHRcdFx0bGV0IHggPSBjdXJ2ZXNbaSAtIDJdLCB5ID0gY3VydmVzW2kgLSAxXTtcblx0XHRcdFx0cmV0dXJuIHkgKyAodGltZSAtIHgpIC8gKGN1cnZlc1tpXSAtIHgpICogKGN1cnZlc1tpICsgMV0gLSB5KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGV0IHggPSBjdXJ2ZXNbbiAtIDJdLCB5ID0gY3VydmVzW24gLSAxXTtcblx0XHRyZXR1cm4geSArICgxIC0geSkgKiAodGltZSAtIHgpIC8gKHRoaXMuZnJhbWVzW2ZyYW1lICsgdGhpcy5nZXRGcmFtZUVudHJpZXMoKV0gLSB4KTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGxldCBzbG90OiBTbG90ID0gc2tlbGV0b24uc2xvdHNbdGhpcy5zbG90SW5kZXhdO1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGxldCBzbG90QXR0YWNobWVudDogQXR0YWNobWVudCB8IG51bGwgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblx0XHRpZiAoIXNsb3RBdHRhY2htZW50KSByZXR1cm47XG5cdFx0aWYgKCEoc2xvdEF0dGFjaG1lbnQgaW5zdGFuY2VvZiBWZXJ0ZXhBdHRhY2htZW50KSB8fCAoPFZlcnRleEF0dGFjaG1lbnQ+c2xvdEF0dGFjaG1lbnQpLnRpbWVsaW5lQXR0YWNobWVudCAhPSB0aGlzLmF0dGFjaG1lbnQpIHJldHVybjtcblxuXHRcdGxldCBkZWZvcm06IEFycmF5PG51bWJlcj4gPSBzbG90LmRlZm9ybTtcblx0XHRpZiAoZGVmb3JtLmxlbmd0aCA9PSAwKSBibGVuZCA9IE1peEJsZW5kLnNldHVwO1xuXG5cdFx0bGV0IHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcblx0XHRsZXQgdmVydGV4Q291bnQgPSB2ZXJ0aWNlc1swXS5sZW5ndGg7XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0XHRkZWZvcm0ubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRcdFx0aWYgKGFscGhhID09IDEpIHtcblx0XHRcdFx0XHRcdGRlZm9ybS5sZW5ndGggPSAwO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZWZvcm0ubGVuZ3RoID0gdmVydGV4Q291bnQ7XG5cdFx0XHRcdFx0bGV0IHZlcnRleEF0dGFjaG1lbnQgPSA8VmVydGV4QXR0YWNobWVudD5zbG90QXR0YWNobWVudDtcblx0XHRcdFx0XHRpZiAoIXZlcnRleEF0dGFjaG1lbnQuYm9uZXMpIHtcblx0XHRcdFx0XHRcdC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucy5cblx0XHRcdFx0XHRcdGxldCBzZXR1cFZlcnRpY2VzID0gdmVydGV4QXR0YWNobWVudC52ZXJ0aWNlcztcblx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKylcblx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IChzZXR1cFZlcnRpY2VzW2ldIC0gZGVmb3JtW2ldKSAqIGFscGhhO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBXZWlnaHRlZCBkZWZvcm0gb2Zmc2V0cy5cblx0XHRcdFx0XHRcdGFscGhhID0gMSAtIGFscGhhO1xuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRkZWZvcm1baV0gKj0gYWxwaGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRlZm9ybS5sZW5ndGggPSB2ZXJ0ZXhDb3VudDtcblx0XHRpZiAodGltZSA+PSBmcmFtZXNbZnJhbWVzLmxlbmd0aCAtIDFdKSB7XG5cdFx0XHRsZXQgbGFzdFZlcnRpY2VzID0gdmVydGljZXNbZnJhbWVzLmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKGFscGhhID09IDEpIHtcblx0XHRcdFx0aWYgKGJsZW5kID09IE1peEJsZW5kLmFkZCkge1xuXHRcdFx0XHRcdGxldCB2ZXJ0ZXhBdHRhY2htZW50ID0gc2xvdEF0dGFjaG1lbnQgYXMgVmVydGV4QXR0YWNobWVudDtcblx0XHRcdFx0XHRpZiAoIXZlcnRleEF0dGFjaG1lbnQuYm9uZXMpIHtcblx0XHRcdFx0XHRcdC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRcdGxldCBzZXR1cFZlcnRpY2VzID0gdmVydGV4QXR0YWNobWVudC52ZXJ0aWNlcztcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKylcblx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IGxhc3RWZXJ0aWNlc1tpXSAtIHNldHVwVmVydGljZXNbaV07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFdlaWdodGVkIGRlZm9ybSBvZmZzZXRzLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gbGFzdFZlcnRpY2VzW2ldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0VXRpbHMuYXJyYXlDb3B5KGxhc3RWZXJ0aWNlcywgMCwgZGVmb3JtLCAwLCB2ZXJ0ZXhDb3VudCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzd2l0Y2ggKGJsZW5kKSB7XG5cdFx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDoge1xuXHRcdFx0XHRcdFx0bGV0IHZlcnRleEF0dGFjaG1lbnQgPSBzbG90QXR0YWNobWVudCBhcyBWZXJ0ZXhBdHRhY2htZW50O1xuXHRcdFx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRcdFx0bGV0IHNldHVwVmVydGljZXMgPSB2ZXJ0ZXhBdHRhY2htZW50LnZlcnRpY2VzO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgc2V0dXAgPSBzZXR1cFZlcnRpY2VzW2ldO1xuXHRcdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSA9IHNldHVwICsgKGxhc3RWZXJ0aWNlc1tpXSAtIHNldHVwKSAqIGFscGhhO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBXZWlnaHRlZCBkZWZvcm0gb2Zmc2V0cywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSA9IGxhc3RWZXJ0aWNlc1tpXSAqIGFscGhhO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5yZXBsYWNlOlxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gKGxhc3RWZXJ0aWNlc1tpXSAtIGRlZm9ybVtpXSkgKiBhbHBoYTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgTWl4QmxlbmQuYWRkOlxuXHRcdFx0XHRcdFx0bGV0IHZlcnRleEF0dGFjaG1lbnQgPSBzbG90QXR0YWNobWVudCBhcyBWZXJ0ZXhBdHRhY2htZW50O1xuXHRcdFx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRcdFx0bGV0IHNldHVwVmVydGljZXMgPSB2ZXJ0ZXhBdHRhY2htZW50LnZlcnRpY2VzO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspXG5cdFx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IChsYXN0VmVydGljZXNbaV0gLSBzZXR1cFZlcnRpY2VzW2ldKSAqIGFscGhhO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2VpZ2h0ZWQgZGVmb3JtIG9mZnNldHMsIHdpdGggYWxwaGEuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKylcblx0XHRcdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gbGFzdFZlcnRpY2VzW2ldICogYWxwaGE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSBwcmV2aW91cyBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgZnJhbWUuXG5cdFx0bGV0IGZyYW1lID0gVGltZWxpbmUuc2VhcmNoMShmcmFtZXMsIHRpbWUpO1xuXHRcdGxldCBwZXJjZW50ID0gdGhpcy5nZXRDdXJ2ZVBlcmNlbnQodGltZSwgZnJhbWUpO1xuXHRcdGxldCBwcmV2VmVydGljZXMgPSB2ZXJ0aWNlc1tmcmFtZV07XG5cdFx0bGV0IG5leHRWZXJ0aWNlcyA9IHZlcnRpY2VzW2ZyYW1lICsgMV07XG5cblx0XHRpZiAoYWxwaGEgPT0gMSkge1xuXHRcdFx0aWYgKGJsZW5kID09IE1peEJsZW5kLmFkZCkge1xuXHRcdFx0XHRsZXQgdmVydGV4QXR0YWNobWVudCA9IHNsb3RBdHRhY2htZW50IGFzIFZlcnRleEF0dGFjaG1lbnQ7XG5cdFx0XHRcdGlmICghdmVydGV4QXR0YWNobWVudC5ib25lcykge1xuXHRcdFx0XHRcdC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRsZXQgc2V0dXBWZXJ0aWNlcyA9IHZlcnRleEF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRsZXQgcHJldiA9IHByZXZWZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSBwcmV2ICsgKG5leHRWZXJ0aWNlc1tpXSAtIHByZXYpICogcGVyY2VudCAtIHNldHVwVmVydGljZXNbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlaWdodGVkIGRlZm9ybSBvZmZzZXRzLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0bGV0IHByZXYgPSBwcmV2VmVydGljZXNbaV07XG5cdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gcHJldiArIChuZXh0VmVydGljZXNbaV0gLSBwcmV2KSAqIHBlcmNlbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRsZXQgcHJldiA9IHByZXZWZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRkZWZvcm1baV0gPSBwcmV2ICsgKG5leHRWZXJ0aWNlc1tpXSAtIHByZXYpICogcGVyY2VudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzd2l0Y2ggKGJsZW5kKSB7XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuc2V0dXA6IHtcblx0XHRcdFx0XHRsZXQgdmVydGV4QXR0YWNobWVudCA9IHNsb3RBdHRhY2htZW50IGFzIFZlcnRleEF0dGFjaG1lbnQ7XG5cdFx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7XG5cdFx0XHRcdFx0XHQvLyBVbndlaWdodGVkIHZlcnRleCBwb3NpdGlvbnMsIHdpdGggYWxwaGEuXG5cdFx0XHRcdFx0XHRsZXQgc2V0dXBWZXJ0aWNlcyA9IHZlcnRleEF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdFx0bGV0IHByZXYgPSBwcmV2VmVydGljZXNbaV0sIHNldHVwID0gc2V0dXBWZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldID0gc2V0dXAgKyAocHJldiArIChuZXh0VmVydGljZXNbaV0gLSBwcmV2KSAqIHBlcmNlbnQgLSBzZXR1cCkgKiBhbHBoYTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gV2VpZ2h0ZWQgZGVmb3JtIG9mZnNldHMsIHdpdGggYWxwaGEuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdFx0bGV0IHByZXYgPSBwcmV2VmVydGljZXNbaV07XG5cdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSA9IChwcmV2ICsgKG5leHRWZXJ0aWNlc1tpXSAtIHByZXYpICogcGVyY2VudCkgKiBhbHBoYTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5maXJzdDpcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5yZXBsYWNlOlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0bGV0IHByZXYgPSBwcmV2VmVydGljZXNbaV07XG5cdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gKHByZXYgKyAobmV4dFZlcnRpY2VzW2ldIC0gcHJldikgKiBwZXJjZW50IC0gZGVmb3JtW2ldKSAqIGFscGhhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5hZGQ6XG5cdFx0XHRcdFx0bGV0IHZlcnRleEF0dGFjaG1lbnQgPSBzbG90QXR0YWNobWVudCBhcyBWZXJ0ZXhBdHRhY2htZW50O1xuXHRcdFx0XHRcdGlmICghdmVydGV4QXR0YWNobWVudC5ib25lcykge1xuXHRcdFx0XHRcdFx0Ly8gVW53ZWlnaHRlZCB2ZXJ0ZXggcG9zaXRpb25zLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRcdFx0bGV0IHNldHVwVmVydGljZXMgPSB2ZXJ0ZXhBdHRhY2htZW50LnZlcnRpY2VzO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGxldCBwcmV2ID0gcHJldlZlcnRpY2VzW2ldO1xuXHRcdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gKHByZXYgKyAobmV4dFZlcnRpY2VzW2ldIC0gcHJldikgKiBwZXJjZW50IC0gc2V0dXBWZXJ0aWNlc1tpXSkgKiBhbHBoYTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gV2VpZ2h0ZWQgZGVmb3JtIG9mZnNldHMsIHdpdGggYWxwaGEuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdFx0bGV0IHByZXYgPSBwcmV2VmVydGljZXNbaV07XG5cdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSAocHJldiArIChuZXh0VmVydGljZXNbaV0gLSBwcmV2KSAqIHBlcmNlbnQpICogYWxwaGE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKiogRmlyZXMgYW4ge0BsaW5rIEV2ZW50fSB3aGVuIHNwZWNpZmljIGFuaW1hdGlvbiB0aW1lcyBhcmUgcmVhY2hlZC4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudFRpbWVsaW5lIGV4dGVuZHMgVGltZWxpbmUge1xuXHRzdGF0aWMgcHJvcGVydHlJZHMgPSBbXCJcIiArIFByb3BlcnR5LmV2ZW50XTtcblxuXHQvKiogVGhlIGV2ZW50IGZvciBlYWNoIGtleSBmcmFtZS4gKi9cblx0ZXZlbnRzOiBBcnJheTxFdmVudD47XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIEV2ZW50VGltZWxpbmUucHJvcGVydHlJZHMpO1xuXG5cdFx0dGhpcy5ldmVudHMgPSBuZXcgQXJyYXk8RXZlbnQ+KGZyYW1lQ291bnQpO1xuXHR9XG5cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMgYW5kIHRoZSBldmVudCBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCBldmVudDogRXZlbnQpIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSBldmVudC50aW1lO1xuXHRcdHRoaXMuZXZlbnRzW2ZyYW1lXSA9IGV2ZW50O1xuXHR9XG5cblx0LyoqIEZpcmVzIGV2ZW50cyBmb3IgZnJhbWVzID4gYGxhc3RUaW1lYCBhbmQgPD0gYHRpbWVgLiAqL1xuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRpZiAoIWZpcmVkRXZlbnRzKSByZXR1cm47XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0bGV0IGZyYW1lQ291bnQgPSB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cblx0XHRpZiAobGFzdFRpbWUgPiB0aW1lKSB7IC8vIEFwcGx5IGFmdGVyIGxhc3RUaW1lIGZvciBsb29wZWQgYW5pbWF0aW9ucy5cblx0XHRcdHRoaXMuYXBwbHkoc2tlbGV0b24sIGxhc3RUaW1lLCBOdW1iZXIuTUFYX1ZBTFVFLCBmaXJlZEV2ZW50cywgYWxwaGEsIGJsZW5kLCBkaXJlY3Rpb24pO1xuXHRcdFx0bGFzdFRpbWUgPSAtMTtcblx0XHR9IGVsc2UgaWYgKGxhc3RUaW1lID49IGZyYW1lc1tmcmFtZUNvdW50IC0gMV0pIC8vIExhc3QgdGltZSBpcyBhZnRlciBsYXN0IGZyYW1lLlxuXHRcdFx0cmV0dXJuO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSByZXR1cm47XG5cblx0XHRsZXQgaSA9IDA7XG5cdFx0aWYgKGxhc3RUaW1lIDwgZnJhbWVzWzBdKVxuXHRcdFx0aSA9IDA7XG5cdFx0ZWxzZSB7XG5cdFx0XHRpID0gVGltZWxpbmUuc2VhcmNoMShmcmFtZXMsIGxhc3RUaW1lKSArIDE7XG5cdFx0XHRsZXQgZnJhbWVUaW1lID0gZnJhbWVzW2ldO1xuXHRcdFx0d2hpbGUgKGkgPiAwKSB7IC8vIEZpcmUgbXVsdGlwbGUgZXZlbnRzIHdpdGggdGhlIHNhbWUgZnJhbWUuXG5cdFx0XHRcdGlmIChmcmFtZXNbaSAtIDFdICE9IGZyYW1lVGltZSkgYnJlYWs7XG5cdFx0XHRcdGktLTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yICg7IGkgPCBmcmFtZUNvdW50ICYmIHRpbWUgPj0gZnJhbWVzW2ldOyBpKyspXG5cdFx0XHRmaXJlZEV2ZW50cy5wdXNoKHRoaXMuZXZlbnRzW2ldKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHNrZWxldG9uJ3Mge0BsaW5rIFNrZWxldG9uI2RyYXdPcmRlcn0uICovXG5leHBvcnQgY2xhc3MgRHJhd09yZGVyVGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSB7XG5cdHN0YXRpYyBwcm9wZXJ0eUlkcyA9IFtcIlwiICsgUHJvcGVydHkuZHJhd09yZGVyXTtcblxuXHQvKiogVGhlIGRyYXcgb3JkZXIgZm9yIGVhY2gga2V5IGZyYW1lLiBTZWUge0BsaW5rICNzZXRGcmFtZShpbnQsIGZsb2F0LCBpbnRbXSl9LiAqL1xuXHRkcmF3T3JkZXJzOiBBcnJheTxBcnJheTxudW1iZXI+IHwgbnVsbD47XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIERyYXdPcmRlclRpbWVsaW5lLnByb3BlcnR5SWRzKTtcblx0XHR0aGlzLmRyYXdPcmRlcnMgPSBuZXcgQXJyYXk8QXJyYXk8bnVtYmVyPiB8IG51bGw+KGZyYW1lQ291bnQpO1xuXHR9XG5cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMgYW5kIHRoZSBkcmF3IG9yZGVyIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS5cblx0ICogQHBhcmFtIGRyYXdPcmRlciBGb3IgZWFjaCBzbG90IGluIHtAbGluayBTa2VsZXRvbiNzbG90c30sIHRoZSBpbmRleCBvZiB0aGUgbmV3IGRyYXcgb3JkZXIuIE1heSBiZSBudWxsIHRvIHVzZSBzZXR1cCBwb3NlXG5cdCAqICAgICAgICAgICBkcmF3IG9yZGVyLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBkcmF3T3JkZXI6IEFycmF5PG51bWJlcj4gfCBudWxsKSB7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWVdID0gdGltZTtcblx0XHR0aGlzLmRyYXdPcmRlcnNbZnJhbWVdID0gZHJhd09yZGVyO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0aWYgKGRpcmVjdGlvbiA9PSBNaXhEaXJlY3Rpb24ubWl4T3V0KSB7XG5cdFx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXApIFV0aWxzLmFycmF5Q29weShza2VsZXRvbi5zbG90cywgMCwgc2tlbGV0b24uZHJhd09yZGVyLCAwLCBza2VsZXRvbi5zbG90cy5sZW5ndGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHtcblx0XHRcdGlmIChibGVuZCA9PSBNaXhCbGVuZC5zZXR1cCB8fCBibGVuZCA9PSBNaXhCbGVuZC5maXJzdCkgVXRpbHMuYXJyYXlDb3B5KHNrZWxldG9uLnNsb3RzLCAwLCBza2VsZXRvbi5kcmF3T3JkZXIsIDAsIHNrZWxldG9uLnNsb3RzLmxlbmd0aCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGlkeCA9IFRpbWVsaW5lLnNlYXJjaDEodGhpcy5mcmFtZXMsIHRpbWUpO1xuXHRcdGxldCBkcmF3T3JkZXJUb1NldHVwSW5kZXggPSB0aGlzLmRyYXdPcmRlcnNbaWR4XTtcblx0XHRpZiAoIWRyYXdPcmRlclRvU2V0dXBJbmRleClcblx0XHRcdFV0aWxzLmFycmF5Q29weShza2VsZXRvbi5zbG90cywgMCwgc2tlbGV0b24uZHJhd09yZGVyLCAwLCBza2VsZXRvbi5zbG90cy5sZW5ndGgpO1xuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IGRyYXdPcmRlcjogQXJyYXk8U2xvdD4gPSBza2VsZXRvbi5kcmF3T3JkZXI7XG5cdFx0XHRsZXQgc2xvdHM6IEFycmF5PFNsb3Q+ID0gc2tlbGV0b24uc2xvdHM7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlclRvU2V0dXBJbmRleC5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRcdGRyYXdPcmRlcltpXSA9IHNsb3RzW2RyYXdPcmRlclRvU2V0dXBJbmRleFtpXV07XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGFuIElLIGNvbnN0cmFpbnQncyB7QGxpbmsgSWtDb25zdHJhaW50I21peH0sIHtAbGluayBJa0NvbnN0cmFpbnQjc29mdG5lc3N9LFxuICoge0BsaW5rIElrQ29uc3RyYWludCNiZW5kRGlyZWN0aW9ufSwge0BsaW5rIElrQ29uc3RyYWludCNzdHJldGNofSwgYW5kIHtAbGluayBJa0NvbnN0cmFpbnQjY29tcHJlc3N9LiAqL1xuZXhwb3J0IGNsYXNzIElrQ29uc3RyYWludFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSB7XG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIElLIGNvbnN0cmFpbnQgaW4ge0BsaW5rIFNrZWxldG9uI2dldElrQ29uc3RyYWludHMoKX0gdGhhdCB3aWxsIGJlIGNoYW5nZWQgd2hlbiB0aGlzIHRpbWVsaW5lIGlzIGFwcGxpZWQgKi9cblx0Y29uc3RyYWludEluZGV4OiBudW1iZXIgPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGlrQ29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgW1xuXHRcdFx0UHJvcGVydHkuaWtDb25zdHJhaW50ICsgXCJ8XCIgKyBpa0NvbnN0cmFpbnRJbmRleFxuXHRcdF0pO1xuXHRcdHRoaXMuY29uc3RyYWludEluZGV4ID0gaWtDb25zdHJhaW50SW5kZXg7XG5cdH1cblxuXHRnZXRGcmFtZUVudHJpZXMgKCkge1xuXHRcdHJldHVybiA2LypFTlRSSUVTKi87XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBpbiBzZWNvbmRzLCBtaXgsIHNvZnRuZXNzLCBiZW5kIGRpcmVjdGlvbiwgY29tcHJlc3MsIGFuZCBzdHJldGNoIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgbWl4OiBudW1iZXIsIHNvZnRuZXNzOiBudW1iZXIsIGJlbmREaXJlY3Rpb246IG51bWJlciwgY29tcHJlc3M6IGJvb2xlYW4sIHN0cmV0Y2g6IGJvb2xlYW4pIHtcblx0XHRmcmFtZSAqPSA2LypFTlRSSUVTKi87XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWVdID0gdGltZTtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDEvKk1JWCovXSA9IG1peDtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKlNPRlRORVNTKi9dID0gc29mdG5lc3M7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAzLypCRU5EX0RJUkVDVElPTiovXSA9IGJlbmREaXJlY3Rpb247XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA0LypDT01QUkVTUyovXSA9IGNvbXByZXNzID8gMSA6IDA7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA1LypTVFJFVENIKi9dID0gc3RyZXRjaCA/IDEgOiAwO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGNvbnN0cmFpbnQ6IElrQ29uc3RyYWludCA9IHNrZWxldG9uLmlrQ29uc3RyYWludHNbdGhpcy5jb25zdHJhaW50SW5kZXhdO1xuXHRcdGlmICghY29uc3RyYWludC5hY3RpdmUpIHJldHVybjtcblxuXHRcdGxldCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdGNvbnN0cmFpbnQubWl4ID0gY29uc3RyYWludC5kYXRhLm1peDtcblx0XHRcdFx0XHRjb25zdHJhaW50LnNvZnRuZXNzID0gY29uc3RyYWludC5kYXRhLnNvZnRuZXNzO1xuXHRcdFx0XHRcdGNvbnN0cmFpbnQuYmVuZERpcmVjdGlvbiA9IGNvbnN0cmFpbnQuZGF0YS5iZW5kRGlyZWN0aW9uO1xuXHRcdFx0XHRcdGNvbnN0cmFpbnQuY29tcHJlc3MgPSBjb25zdHJhaW50LmRhdGEuY29tcHJlc3M7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5zdHJldGNoID0gY29uc3RyYWludC5kYXRhLnN0cmV0Y2g7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLmZpcnN0OlxuXHRcdFx0XHRcdGNvbnN0cmFpbnQubWl4ICs9IChjb25zdHJhaW50LmRhdGEubWl4IC0gY29uc3RyYWludC5taXgpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5zb2Z0bmVzcyArPSAoY29uc3RyYWludC5kYXRhLnNvZnRuZXNzIC0gY29uc3RyYWludC5zb2Z0bmVzcykgKiBhbHBoYTtcblx0XHRcdFx0XHRjb25zdHJhaW50LmJlbmREaXJlY3Rpb24gPSBjb25zdHJhaW50LmRhdGEuYmVuZERpcmVjdGlvbjtcblx0XHRcdFx0XHRjb25zdHJhaW50LmNvbXByZXNzID0gY29uc3RyYWludC5kYXRhLmNvbXByZXNzO1xuXHRcdFx0XHRcdGNvbnN0cmFpbnQuc3RyZXRjaCA9IGNvbnN0cmFpbnQuZGF0YS5zdHJldGNoO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCBtaXggPSAwLCBzb2Z0bmVzcyA9IDA7XG5cdFx0bGV0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA2LypFTlRSSUVTKi8pXG5cdFx0bGV0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyA2LypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOlxuXHRcdFx0XHRsZXQgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHRtaXggPSBmcmFtZXNbaSArIDEvKk1JWCovXTtcblx0XHRcdFx0c29mdG5lc3MgPSBmcmFtZXNbaSArIDIvKlNPRlRORVNTKi9dO1xuXHRcdFx0XHRsZXQgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDYvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHRtaXggKz0gKGZyYW1lc1tpICsgNi8qRU5UUklFUyovICsgMS8qTUlYKi9dIC0gbWl4KSAqIHQ7XG5cdFx0XHRcdHNvZnRuZXNzICs9IChmcmFtZXNbaSArIDYvKkVOVFJJRVMqLyArIDIvKlNPRlRORVNTKi9dIC0gc29mdG5lc3MpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0bWl4ID0gZnJhbWVzW2kgKyAxLypNSVgqL107XG5cdFx0XHRcdHNvZnRuZXNzID0gZnJhbWVzW2kgKyAyLypTT0ZUTkVTUyovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtaXggPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKk1JWCovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHNvZnRuZXNzID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypTT0ZUTkVTUyovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXApIHtcblx0XHRcdGNvbnN0cmFpbnQubWl4ID0gY29uc3RyYWludC5kYXRhLm1peCArIChtaXggLSBjb25zdHJhaW50LmRhdGEubWl4KSAqIGFscGhhO1xuXHRcdFx0Y29uc3RyYWludC5zb2Z0bmVzcyA9IGNvbnN0cmFpbnQuZGF0YS5zb2Z0bmVzcyArIChzb2Z0bmVzcyAtIGNvbnN0cmFpbnQuZGF0YS5zb2Z0bmVzcykgKiBhbHBoYTtcblxuXHRcdFx0aWYgKGRpcmVjdGlvbiA9PSBNaXhEaXJlY3Rpb24ubWl4T3V0KSB7XG5cdFx0XHRcdGNvbnN0cmFpbnQuYmVuZERpcmVjdGlvbiA9IGNvbnN0cmFpbnQuZGF0YS5iZW5kRGlyZWN0aW9uO1xuXHRcdFx0XHRjb25zdHJhaW50LmNvbXByZXNzID0gY29uc3RyYWludC5kYXRhLmNvbXByZXNzO1xuXHRcdFx0XHRjb25zdHJhaW50LnN0cmV0Y2ggPSBjb25zdHJhaW50LmRhdGEuc3RyZXRjaDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0cmFpbnQuYmVuZERpcmVjdGlvbiA9IGZyYW1lc1tpICsgMy8qQkVORF9ESVJFQ1RJT04qL107XG5cdFx0XHRcdGNvbnN0cmFpbnQuY29tcHJlc3MgPSBmcmFtZXNbaSArIDQvKkNPTVBSRVNTKi9dICE9IDA7XG5cdFx0XHRcdGNvbnN0cmFpbnQuc3RyZXRjaCA9IGZyYW1lc1tpICsgNS8qU1RSRVRDSCovXSAhPSAwO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdHJhaW50Lm1peCArPSAobWl4IC0gY29uc3RyYWludC5taXgpICogYWxwaGE7XG5cdFx0XHRjb25zdHJhaW50LnNvZnRuZXNzICs9IChzb2Z0bmVzcyAtIGNvbnN0cmFpbnQuc29mdG5lc3MpICogYWxwaGE7XG5cdFx0XHRpZiAoZGlyZWN0aW9uID09IE1peERpcmVjdGlvbi5taXhJbikge1xuXHRcdFx0XHRjb25zdHJhaW50LmJlbmREaXJlY3Rpb24gPSBmcmFtZXNbaSArIDMvKkJFTkRfRElSRUNUSU9OKi9dO1xuXHRcdFx0XHRjb25zdHJhaW50LmNvbXByZXNzID0gZnJhbWVzW2kgKyA0LypDT01QUkVTUyovXSAhPSAwO1xuXHRcdFx0XHRjb25zdHJhaW50LnN0cmV0Y2ggPSBmcmFtZXNbaSArIDUvKlNUUkVUQ0gqL10gIT0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSB0cmFuc2Zvcm0gY29uc3RyYWludCdzIHtAbGluayBUcmFuc2Zvcm1Db25zdHJhaW50I3JvdGF0ZU1peH0sIHtAbGluayBUcmFuc2Zvcm1Db25zdHJhaW50I3RyYW5zbGF0ZU1peH0sXG4gKiB7QGxpbmsgVHJhbnNmb3JtQ29uc3RyYWludCNzY2FsZU1peH0sIGFuZCB7QGxpbmsgVHJhbnNmb3JtQ29uc3RyYWludCNzaGVhck1peH0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtQ29uc3RyYWludFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSB7XG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIHRyYW5zZm9ybSBjb25zdHJhaW50IHNsb3QgaW4ge0BsaW5rIFNrZWxldG9uI3RyYW5zZm9ybUNvbnN0cmFpbnRzfSB0aGF0IHdpbGwgYmUgY2hhbmdlZC4gKi9cblx0Y29uc3RyYWludEluZGV4OiBudW1iZXIgPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHRyYW5zZm9ybUNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFtcblx0XHRcdFByb3BlcnR5LnRyYW5zZm9ybUNvbnN0cmFpbnQgKyBcInxcIiArIHRyYW5zZm9ybUNvbnN0cmFpbnRJbmRleFxuXHRcdF0pO1xuXHRcdHRoaXMuY29uc3RyYWludEluZGV4ID0gdHJhbnNmb3JtQ29uc3RyYWludEluZGV4O1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gNy8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFRoZSB0aW1lIGluIHNlY29uZHMsIHJvdGF0ZSBtaXgsIHRyYW5zbGF0ZSBtaXgsIHNjYWxlIG1peCwgYW5kIHNoZWFyIG1peCBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1peFJvdGF0ZTogbnVtYmVyLCBtaXhYOiBudW1iZXIsIG1peFk6IG51bWJlciwgbWl4U2NhbGVYOiBudW1iZXIsIG1peFNjYWxlWTogbnVtYmVyLFxuXHRcdG1peFNoZWFyWTogbnVtYmVyKSB7XG5cdFx0bGV0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGZyYW1lICo9IDcvKkVOVFJJRVMqLztcblx0XHRmcmFtZXNbZnJhbWVdID0gdGltZTtcblx0XHRmcmFtZXNbZnJhbWUgKyAxLypST1RBVEUqL10gPSBtaXhSb3RhdGU7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgMi8qWCovXSA9IG1peFg7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgMy8qWSovXSA9IG1peFk7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgNC8qU0NBTEVYKi9dID0gbWl4U2NhbGVYO1xuXHRcdGZyYW1lc1tmcmFtZSArIDUvKlNDQUxFWSovXSA9IG1peFNjYWxlWTtcblx0XHRmcmFtZXNbZnJhbWUgKyA2LypTSEVBUlkqL10gPSBtaXhTaGVhclk7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRsZXQgY29uc3RyYWludDogVHJhbnNmb3JtQ29uc3RyYWludCA9IHNrZWxldG9uLnRyYW5zZm9ybUNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XTtcblx0XHRpZiAoIWNvbnN0cmFpbnQuYWN0aXZlKSByZXR1cm47XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGxldCBkYXRhID0gY29uc3RyYWludC5kYXRhO1xuXHRcdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLnNldHVwOlxuXHRcdFx0XHRcdGNvbnN0cmFpbnQubWl4Um90YXRlID0gZGF0YS5taXhSb3RhdGU7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhYID0gZGF0YS5taXhYO1xuXHRcdFx0XHRcdGNvbnN0cmFpbnQubWl4WSA9IGRhdGEubWl4WTtcblx0XHRcdFx0XHRjb25zdHJhaW50Lm1peFNjYWxlWCA9IGRhdGEubWl4U2NhbGVYO1xuXHRcdFx0XHRcdGNvbnN0cmFpbnQubWl4U2NhbGVZID0gZGF0YS5taXhTY2FsZVk7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhTaGVhclkgPSBkYXRhLm1peFNoZWFyWTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdGNhc2UgTWl4QmxlbmQuZmlyc3Q6XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhSb3RhdGUgKz0gKGRhdGEubWl4Um90YXRlIC0gY29uc3RyYWludC5taXhSb3RhdGUpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhYICs9IChkYXRhLm1peFggLSBjb25zdHJhaW50Lm1peFgpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhZICs9IChkYXRhLm1peFkgLSBjb25zdHJhaW50Lm1peFkpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhTY2FsZVggKz0gKGRhdGEubWl4U2NhbGVYIC0gY29uc3RyYWludC5taXhTY2FsZVgpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhTY2FsZVkgKz0gKGRhdGEubWl4U2NhbGVZIC0gY29uc3RyYWludC5taXhTY2FsZVkpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhTaGVhclkgKz0gKGRhdGEubWl4U2hlYXJZIC0gY29uc3RyYWludC5taXhTaGVhclkpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHJvdGF0ZSwgeCwgeSwgc2NhbGVYLCBzY2FsZVksIHNoZWFyWTtcblx0XHRsZXQgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDcvKkVOVFJJRVMqLyk7XG5cdFx0bGV0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyA3LypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOlxuXHRcdFx0XHRsZXQgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHRyb3RhdGUgPSBmcmFtZXNbaSArIDEvKlJPVEFURSovXTtcblx0XHRcdFx0eCA9IGZyYW1lc1tpICsgMi8qWCovXTtcblx0XHRcdFx0eSA9IGZyYW1lc1tpICsgMy8qWSovXTtcblx0XHRcdFx0c2NhbGVYID0gZnJhbWVzW2kgKyA0LypTQ0FMRVgqL107XG5cdFx0XHRcdHNjYWxlWSA9IGZyYW1lc1tpICsgNS8qU0NBTEVZKi9dO1xuXHRcdFx0XHRzaGVhclkgPSBmcmFtZXNbaSArIDYvKlNIRUFSWSovXTtcblx0XHRcdFx0bGV0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0cm90YXRlICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDEvKlJPVEFURSovXSAtIHJvdGF0ZSkgKiB0O1xuXHRcdFx0XHR4ICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDIvKlgqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgMy8qWSovXSAtIHkpICogdDtcblx0XHRcdFx0c2NhbGVYICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDQvKlNDQUxFWCovXSAtIHNjYWxlWCkgKiB0O1xuXHRcdFx0XHRzY2FsZVkgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgNS8qU0NBTEVZKi9dIC0gc2NhbGVZKSAqIHQ7XG5cdFx0XHRcdHNoZWFyWSArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyA2LypTSEVBUlkqL10gLSBzaGVhclkpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0cm90YXRlID0gZnJhbWVzW2kgKyAxLypST1RBVEUqL107XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDIvKlgqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDMvKlkqL107XG5cdFx0XHRcdHNjYWxlWCA9IGZyYW1lc1tpICsgNC8qU0NBTEVYKi9dO1xuXHRcdFx0XHRzY2FsZVkgPSBmcmFtZXNbaSArIDUvKlNDQUxFWSovXTtcblx0XHRcdFx0c2hlYXJZID0gZnJhbWVzW2kgKyA2LypTSEVBUlkqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cm90YXRlID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypST1RBVEUqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypYKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypZKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0c2NhbGVYID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA0LypTQ0FMRVgqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAzIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRzY2FsZVkgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDUvKlNDQUxFWSovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDQgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHNoZWFyWSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNi8qU0hFQVJZKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNSAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXApIHtcblx0XHRcdGxldCBkYXRhID0gY29uc3RyYWludC5kYXRhO1xuXHRcdFx0Y29uc3RyYWludC5taXhSb3RhdGUgPSBkYXRhLm1peFJvdGF0ZSArIChyb3RhdGUgLSBkYXRhLm1peFJvdGF0ZSkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4WCA9IGRhdGEubWl4WCArICh4IC0gZGF0YS5taXhYKSAqIGFscGhhO1xuXHRcdFx0Y29uc3RyYWludC5taXhZID0gZGF0YS5taXhZICsgKHkgLSBkYXRhLm1peFkpICogYWxwaGE7XG5cdFx0XHRjb25zdHJhaW50Lm1peFNjYWxlWCA9IGRhdGEubWl4U2NhbGVYICsgKHNjYWxlWCAtIGRhdGEubWl4U2NhbGVYKSAqIGFscGhhO1xuXHRcdFx0Y29uc3RyYWludC5taXhTY2FsZVkgPSBkYXRhLm1peFNjYWxlWSArIChzY2FsZVkgLSBkYXRhLm1peFNjYWxlWSkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4U2hlYXJZID0gZGF0YS5taXhTaGVhclkgKyAoc2hlYXJZIC0gZGF0YS5taXhTaGVhclkpICogYWxwaGE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0cmFpbnQubWl4Um90YXRlICs9IChyb3RhdGUgLSBjb25zdHJhaW50Lm1peFJvdGF0ZSkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4WCArPSAoeCAtIGNvbnN0cmFpbnQubWl4WCkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4WSArPSAoeSAtIGNvbnN0cmFpbnQubWl4WSkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4U2NhbGVYICs9IChzY2FsZVggLSBjb25zdHJhaW50Lm1peFNjYWxlWCkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4U2NhbGVZICs9IChzY2FsZVkgLSBjb25zdHJhaW50Lm1peFNjYWxlWSkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4U2hlYXJZICs9IChzaGVhclkgLSBjb25zdHJhaW50Lm1peFNoZWFyWSkgKiBhbHBoYTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBwYXRoIGNvbnN0cmFpbnQncyB7QGxpbmsgUGF0aENvbnN0cmFpbnQjcG9zaXRpb259LiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhDb25zdHJhaW50UG9zaXRpb25UaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUxIHtcblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgcGF0aCBjb25zdHJhaW50IGluIHtAbGluayBTa2VsZXRvbiNnZXRQYXRoQ29uc3RyYWludHMoKX0gdGhhdCB3aWxsIGJlIGNoYW5nZWQgd2hlbiB0aGlzIHRpbWVsaW5lIGlzXG5cdCAqIGFwcGxpZWQuICovXG5cdGNvbnN0cmFpbnRJbmRleDogbnVtYmVyID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwYXRoQ29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgUHJvcGVydHkucGF0aENvbnN0cmFpbnRQb3NpdGlvbiArIFwifFwiICsgcGF0aENvbnN0cmFpbnRJbmRleCk7XG5cdFx0dGhpcy5jb25zdHJhaW50SW5kZXggPSBwYXRoQ29uc3RyYWludEluZGV4O1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGNvbnN0cmFpbnQ6IFBhdGhDb25zdHJhaW50ID0gc2tlbGV0b24ucGF0aENvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XTtcblx0XHRpZiAoY29uc3RyYWludC5hY3RpdmUpXG5cdFx0XHRjb25zdHJhaW50LnBvc2l0aW9uID0gdGhpcy5nZXRBYnNvbHV0ZVZhbHVlKHRpbWUsIGFscGhhLCBibGVuZCwgY29uc3RyYWludC5wb3NpdGlvbiwgY29uc3RyYWludC5kYXRhLnBvc2l0aW9uKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHBhdGggY29uc3RyYWludCdzIHtAbGluayBQYXRoQ29uc3RyYWludCNzcGFjaW5nfS4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQ29uc3RyYWludFNwYWNpbmdUaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUxIHtcblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgcGF0aCBjb25zdHJhaW50IGluIHtAbGluayBTa2VsZXRvbiNnZXRQYXRoQ29uc3RyYWludHMoKX0gdGhhdCB3aWxsIGJlIGNoYW5nZWQgd2hlbiB0aGlzIHRpbWVsaW5lIGlzXG5cdCAqIGFwcGxpZWQuICovXG5cdGNvbnN0cmFpbnRJbmRleCA9IDA7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgcGF0aENvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIFByb3BlcnR5LnBhdGhDb25zdHJhaW50U3BhY2luZyArIFwifFwiICsgcGF0aENvbnN0cmFpbnRJbmRleCk7XG5cdFx0dGhpcy5jb25zdHJhaW50SW5kZXggPSBwYXRoQ29uc3RyYWludEluZGV4O1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGNvbnN0cmFpbnQ6IFBhdGhDb25zdHJhaW50ID0gc2tlbGV0b24ucGF0aENvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XTtcblx0XHRpZiAoY29uc3RyYWludC5hY3RpdmUpXG5cdFx0XHRjb25zdHJhaW50LnNwYWNpbmcgPSB0aGlzLmdldEFic29sdXRlVmFsdWUodGltZSwgYWxwaGEsIGJsZW5kLCBjb25zdHJhaW50LnNwYWNpbmcsIGNvbnN0cmFpbnQuZGF0YS5zcGFjaW5nKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHRyYW5zZm9ybSBjb25zdHJhaW50J3Mge0BsaW5rIFBhdGhDb25zdHJhaW50I2dldE1peFJvdGF0ZSgpfSwge0BsaW5rIFBhdGhDb25zdHJhaW50I2dldE1peFgoKX0sIGFuZFxuICoge0BsaW5rIFBhdGhDb25zdHJhaW50I2dldE1peFkoKX0uICovXG5leHBvcnQgY2xhc3MgUGF0aENvbnN0cmFpbnRNaXhUaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUge1xuXHQvKiogVGhlIGluZGV4IG9mIHRoZSBwYXRoIGNvbnN0cmFpbnQgaW4ge0BsaW5rIFNrZWxldG9uI2dldFBhdGhDb25zdHJhaW50cygpfSB0aGF0IHdpbGwgYmUgY2hhbmdlZCB3aGVuIHRoaXMgdGltZWxpbmUgaXNcblx0ICogYXBwbGllZC4gKi9cblx0Y29uc3RyYWludEluZGV4ID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwYXRoQ29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgW1xuXHRcdFx0UHJvcGVydHkucGF0aENvbnN0cmFpbnRNaXggKyBcInxcIiArIHBhdGhDb25zdHJhaW50SW5kZXhcblx0XHRdKTtcblx0XHR0aGlzLmNvbnN0cmFpbnRJbmRleCA9IHBhdGhDb25zdHJhaW50SW5kZXg7XG5cdH1cblxuXHRnZXRGcmFtZUVudHJpZXMgKCkge1xuXHRcdHJldHVybiA0LypFTlRSSUVTKi87XG5cdH1cblxuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBtaXhSb3RhdGU6IG51bWJlciwgbWl4WDogbnVtYmVyLCBtaXhZOiBudW1iZXIpIHtcblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0ZnJhbWUgPDw9IDI7XG5cdFx0ZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgMS8qUk9UQVRFKi9dID0gbWl4Um90YXRlO1xuXHRcdGZyYW1lc1tmcmFtZSArIDIvKlgqL10gPSBtaXhYO1xuXHRcdGZyYW1lc1tmcmFtZSArIDMvKlkqL10gPSBtaXhZO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBibGVuZDogTWl4QmxlbmQsIGRpcmVjdGlvbjogTWl4RGlyZWN0aW9uKSB7XG5cdFx0bGV0IGNvbnN0cmFpbnQ6IFBhdGhDb25zdHJhaW50ID0gc2tlbGV0b24ucGF0aENvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XTtcblx0XHRpZiAoIWNvbnN0cmFpbnQuYWN0aXZlKSByZXR1cm47XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdFx0Y2FzZSBNaXhCbGVuZC5zZXR1cDpcblx0XHRcdFx0XHRjb25zdHJhaW50Lm1peFJvdGF0ZSA9IGNvbnN0cmFpbnQuZGF0YS5taXhSb3RhdGU7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhYID0gY29uc3RyYWludC5kYXRhLm1peFg7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhZID0gY29uc3RyYWludC5kYXRhLm1peFk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjYXNlIE1peEJsZW5kLmZpcnN0OlxuXHRcdFx0XHRcdGNvbnN0cmFpbnQubWl4Um90YXRlICs9IChjb25zdHJhaW50LmRhdGEubWl4Um90YXRlIC0gY29uc3RyYWludC5taXhSb3RhdGUpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29uc3RyYWludC5taXhYICs9IChjb25zdHJhaW50LmRhdGEubWl4WCAtIGNvbnN0cmFpbnQubWl4WCkgKiBhbHBoYTtcblx0XHRcdFx0XHRjb25zdHJhaW50Lm1peFkgKz0gKGNvbnN0cmFpbnQuZGF0YS5taXhZIC0gY29uc3RyYWludC5taXhZKSAqIGFscGhhO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCByb3RhdGUsIHgsIHk7XG5cdFx0bGV0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA0LypFTlRSSUVTKi8pO1xuXHRcdGxldCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpID4+IDJdO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOlxuXHRcdFx0XHRsZXQgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHRyb3RhdGUgPSBmcmFtZXNbaSArIDEvKlJPVEFURSovXTtcblx0XHRcdFx0eCA9IGZyYW1lc1tpICsgMi8qWCovXTtcblx0XHRcdFx0eSA9IGZyYW1lc1tpICsgMy8qWSovXTtcblx0XHRcdFx0bGV0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyA0LypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0cm90YXRlICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDEvKlJPVEFURSovXSAtIHJvdGF0ZSkgKiB0O1xuXHRcdFx0XHR4ICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDIvKlgqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovICsgMy8qWSovXSAtIHkpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0cm90YXRlID0gZnJhbWVzW2kgKyAxLypST1RBVEUqL107XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDIvKlgqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDMvKlkqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cm90YXRlID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypST1RBVEUqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypYKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypZKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRpZiAoYmxlbmQgPT0gTWl4QmxlbmQuc2V0dXApIHtcblx0XHRcdGxldCBkYXRhID0gY29uc3RyYWludC5kYXRhO1xuXHRcdFx0Y29uc3RyYWludC5taXhSb3RhdGUgPSBkYXRhLm1peFJvdGF0ZSArIChyb3RhdGUgLSBkYXRhLm1peFJvdGF0ZSkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4WCA9IGRhdGEubWl4WCArICh4IC0gZGF0YS5taXhYKSAqIGFscGhhO1xuXHRcdFx0Y29uc3RyYWludC5taXhZID0gZGF0YS5taXhZICsgKHkgLSBkYXRhLm1peFkpICogYWxwaGE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0cmFpbnQubWl4Um90YXRlICs9IChyb3RhdGUgLSBjb25zdHJhaW50Lm1peFJvdGF0ZSkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4WCArPSAoeCAtIGNvbnN0cmFpbnQubWl4WCkgKiBhbHBoYTtcblx0XHRcdGNvbnN0cmFpbnQubWl4WSArPSAoeSAtIGNvbnN0cmFpbnQubWl4WSkgKiBhbHBoYTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciBtb3N0IHtAbGluayBQaHlzaWNzQ29uc3RyYWludH0gdGltZWxpbmVzLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lMSB7XG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIHBoeXNpY3MgY29uc3RyYWludCBpbiB7QGxpbmsgU2tlbGV0b24jZ2V0UGh5c2ljc0NvbnN0cmFpbnRzKCl9IHRoYXQgd2lsbCBiZSBjaGFuZ2VkIHdoZW4gdGhpcyB0aW1lbGluZVxuXHQgKiBpcyBhcHBsaWVkLCBvciAtMSBpZiBhbGwgcGh5c2ljcyBjb25zdHJhaW50cyBpbiB0aGUgc2tlbGV0b24gd2lsbCBiZSBjaGFuZ2VkLiAqL1xuXHRjb25zdHJhaW50SW5kZXggPSAwO1xuXG5cdC8qKiBAcGFyYW0gcGh5c2ljc0NvbnN0cmFpbnRJbmRleCAtMSBmb3IgYWxsIHBoeXNpY3MgY29uc3RyYWludHMgaW4gdGhlIHNrZWxldG9uLiAqL1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwaHlzaWNzQ29uc3RyYWludEluZGV4OiBudW1iZXIsIHByb3BlcnR5OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgcHJvcGVydHkgKyBcInxcIiArIHBoeXNpY3NDb25zdHJhaW50SW5kZXgpO1xuXHRcdHRoaXMuY29uc3RyYWludEluZGV4ID0gcGh5c2ljc0NvbnN0cmFpbnRJbmRleDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXHRcdGxldCBjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludDtcblx0XHRpZiAodGhpcy5jb25zdHJhaW50SW5kZXggPT0gLTEpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGltZSA+PSB0aGlzLmZyYW1lc1swXSA/IHRoaXMuZ2V0Q3VydmVWYWx1ZSh0aW1lKSA6IDA7XG5cblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludCBvZiBza2VsZXRvbi5waHlzaWNzQ29uc3RyYWludHMpIHtcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnQuYWN0aXZlICYmIHRoaXMuZ2xvYmFsKGNvbnN0cmFpbnQuZGF0YSkpXG5cdFx0XHRcdFx0dGhpcy5zZXQoY29uc3RyYWludCwgdGhpcy5nZXRBYnNvbHV0ZVZhbHVlMih0aW1lLCBhbHBoYSwgYmxlbmQsIHRoaXMuZ2V0KGNvbnN0cmFpbnQpLCB0aGlzLnNldHVwKGNvbnN0cmFpbnQpLCB2YWx1ZSkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdHJhaW50ID0gc2tlbGV0b24ucGh5c2ljc0NvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XTtcblx0XHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkgdGhpcy5zZXQoY29uc3RyYWludCwgdGhpcy5nZXRBYnNvbHV0ZVZhbHVlKHRpbWUsIGFscGhhLCBibGVuZCwgdGhpcy5nZXQoY29uc3RyYWludCksIHRoaXMuc2V0dXAoY29uc3RyYWludCkpKTtcblx0XHR9XG5cdH1cblxuXHRhYnN0cmFjdCBzZXR1cCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXI7XG5cblx0YWJzdHJhY3QgZ2V0IChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCk6IG51bWJlcjtcblxuXHRhYnN0cmFjdCBzZXQgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50LCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHRhYnN0cmFjdCBnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW47XG59XG5cbi8qKiBDaGFuZ2VzIGEgcGh5c2ljcyBjb25zdHJhaW50J3Mge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50I2dldEluZXJ0aWEoKX0uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRJbmVydGlhVGltZWxpbmUgZXh0ZW5kcyBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgcGh5c2ljc0NvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIHBoeXNpY3NDb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50SW5lcnRpYSk7XG5cdH1cblxuXHRzZXR1cCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBjb25zdHJhaW50LmRhdGEuaW5lcnRpYTtcblx0fVxuXG5cdGdldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBjb25zdHJhaW50LmluZXJ0aWE7XG5cdH1cblxuXHRzZXQgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0Y29uc3RyYWludC5pbmVydGlhID0gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50LmluZXJ0aWFHbG9iYWw7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBwaHlzaWNzIGNvbnN0cmFpbnQncyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnQjZ2V0U3RyZW5ndGgoKX0uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRTdHJlbmd0aFRpbWVsaW5lIGV4dGVuZHMgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHBoeXNpY3NDb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBwaHlzaWNzQ29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludFN0cmVuZ3RoKTtcblx0fVxuXG5cdHNldHVwIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZGF0YS5zdHJlbmd0aDtcblx0fVxuXG5cdGdldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBjb25zdHJhaW50LnN0cmVuZ3RoO1xuXHR9XG5cblx0c2V0IChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0cmFpbnQuc3RyZW5ndGggPSB2YWx1ZTtcblx0fVxuXG5cdGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuc3RyZW5ndGhHbG9iYWw7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBwaHlzaWNzIGNvbnN0cmFpbnQncyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnQjZ2V0RGFtcGluZygpfS4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludERhbXBpbmdUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwaHlzaWNzQ29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgcGh5c2ljc0NvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnREYW1waW5nKTtcblx0fVxuXG5cdHNldHVwIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZGF0YS5kYW1waW5nO1xuXHR9XG5cblx0Z2V0IChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZGFtcGluZztcblx0fVxuXG5cdHNldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdHJhaW50LmRhbXBpbmcgPSB2YWx1ZTtcblx0fVxuXG5cdGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZGFtcGluZ0dsb2JhbDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHBoeXNpY3MgY29uc3RyYWludCdzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludCNnZXRNYXNzSW52ZXJzZSgpfS4gVGhlIHRpbWVsaW5lIHZhbHVlcyBhcmUgbm90IGludmVydGVkLiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50TWFzc1RpbWVsaW5lIGV4dGVuZHMgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHBoeXNpY3NDb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBwaHlzaWNzQ29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludE1hc3MpO1xuXHR9XG5cblx0c2V0dXAgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50KTogbnVtYmVyIHtcblx0XHRyZXR1cm4gMSAvIGNvbnN0cmFpbnQuZGF0YS5tYXNzSW52ZXJzZTtcblx0fVxuXG5cdGdldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiAxIC8gY29uc3RyYWludC5tYXNzSW52ZXJzZTtcblx0fVxuXG5cdHNldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdHJhaW50Lm1hc3NJbnZlcnNlID0gMSAvIHZhbHVlO1xuXHR9XG5cblx0Z2xvYmFsIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludERhdGEpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29uc3RyYWludC5tYXNzR2xvYmFsO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgcGh5c2ljcyBjb25zdHJhaW50J3Mge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50I2dldFdpbmQoKX0uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRXaW5kVGltZWxpbmUgZXh0ZW5kcyBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgcGh5c2ljc0NvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIHBoeXNpY3NDb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50V2luZCk7XG5cdH1cblxuXHRzZXR1cCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBjb25zdHJhaW50LmRhdGEud2luZDtcblx0fVxuXG5cdGdldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBjb25zdHJhaW50LndpbmQ7XG5cdH1cblxuXHRzZXQgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0Y29uc3RyYWludC53aW5kID0gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50LndpbmRHbG9iYWw7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBwaHlzaWNzIGNvbnN0cmFpbnQncyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnQjZ2V0R3Jhdml0eSgpfS4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludEdyYXZpdHlUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwaHlzaWNzQ29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgcGh5c2ljc0NvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnRHcmF2aXR5KTtcblx0fVxuXG5cdHNldHVwIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZGF0YS5ncmF2aXR5O1xuXHR9XG5cblx0Z2V0IChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZ3Jhdml0eTtcblx0fVxuXG5cdHNldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdHJhaW50LmdyYXZpdHkgPSB2YWx1ZTtcblx0fVxuXG5cdGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZ3Jhdml0eUdsb2JhbDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHBoeXNpY3MgY29uc3RyYWludCdzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludCNnZXRNaXgoKX0uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRNaXhUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBwaHlzaWNzQ29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgcGh5c2ljc0NvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnRNaXgpO1xuXHR9XG5cblx0c2V0dXAgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50KTogbnVtYmVyIHtcblx0XHRyZXR1cm4gY29uc3RyYWludC5kYXRhLm1peDtcblx0fVxuXG5cdGdldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBjb25zdHJhaW50Lm1peDtcblx0fVxuXG5cdHNldCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdHJhaW50Lm1peCA9IHZhbHVlO1xuXHR9XG5cblx0Z2xvYmFsIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludERhdGEpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29uc3RyYWludC5taXhHbG9iYWw7XG5cdH1cbn1cblxuLyoqIFJlc2V0cyBhIHBoeXNpY3MgY29uc3RyYWludCB3aGVuIHNwZWNpZmljIGFuaW1hdGlvbiB0aW1lcyBhcmUgcmVhY2hlZC4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludFJlc2V0VGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSB7XG5cdHByaXZhdGUgc3RhdGljIHByb3BlcnR5SWRzOiBzdHJpbmdbXSA9IFtQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludFJlc2V0LnRvU3RyaW5nKCldO1xuXG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIHBoeXNpY3MgY29uc3RyYWludCBpbiB7QGxpbmsgU2tlbGV0b24jZ2V0UGh5c2ljc0NvbnN0cmFpbnRzKCl9IHRoYXQgd2lsbCBiZSByZXNldCB3aGVuIHRoaXMgdGltZWxpbmUgaXNcblx0KiBhcHBsaWVkLCBvciAtMSBpZiBhbGwgcGh5c2ljcyBjb25zdHJhaW50cyBpbiB0aGUgc2tlbGV0b24gd2lsbCBiZSByZXNldC4gKi9cblx0Y29uc3RyYWludEluZGV4OiBudW1iZXI7XG5cblx0LyoqIEBwYXJhbSBwaHlzaWNzQ29uc3RyYWludEluZGV4IC0xIGZvciBhbGwgcGh5c2ljcyBjb25zdHJhaW50cyBpbiB0aGUgc2tlbGV0b24uICovXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIHBoeXNpY3NDb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIFBoeXNpY3NDb25zdHJhaW50UmVzZXRUaW1lbGluZS5wcm9wZXJ0eUlkcyk7XG5cdFx0dGhpcy5jb25zdHJhaW50SW5kZXggPSBwaHlzaWNzQ29uc3RyYWludEluZGV4O1xuXHR9XG5cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCA8Y29kZT5mcmFtZUNvdW50PC9jb2RlPiwgaW5jbHVzaXZlLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWVdID0gdGltZTtcblx0fVxuXG5cdC8qKiBSZXNldHMgdGhlIHBoeXNpY3MgY29uc3RyYWludCB3aGVuIGZyYW1lcyA+IDxjb2RlPmxhc3RUaW1lPC9jb2RlPiBhbmQgPD0gPGNvZGU+dGltZTwvY29kZT4uICovXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgYmxlbmQ6IE1peEJsZW5kLCBkaXJlY3Rpb246IE1peERpcmVjdGlvbikge1xuXG5cdFx0bGV0IGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50IHwgdW5kZWZpbmVkO1xuXHRcdGlmICh0aGlzLmNvbnN0cmFpbnRJbmRleCAhPSAtMSkge1xuXHRcdFx0Y29uc3RyYWludCA9IHNrZWxldG9uLnBoeXNpY3NDb25zdHJhaW50c1t0aGlzLmNvbnN0cmFpbnRJbmRleF07XG5cdFx0XHRpZiAoIWNvbnN0cmFpbnQuYWN0aXZlKSByZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cblx0XHRpZiAobGFzdFRpbWUgPiB0aW1lKSB7IC8vIEFwcGx5IGFmdGVyIGxhc3RUaW1lIGZvciBsb29wZWQgYW5pbWF0aW9ucy5cblx0XHRcdHRoaXMuYXBwbHkoc2tlbGV0b24sIGxhc3RUaW1lLCBOdW1iZXIuTUFYX1ZBTFVFLCBbXSwgYWxwaGEsIGJsZW5kLCBkaXJlY3Rpb24pO1xuXHRcdFx0bGFzdFRpbWUgPSAtMTtcblx0XHR9IGVsc2UgaWYgKGxhc3RUaW1lID49IGZyYW1lc1tmcmFtZXMubGVuZ3RoIC0gMV0pIC8vIExhc3QgdGltZSBpcyBhZnRlciBsYXN0IGZyYW1lLlxuXHRcdFx0cmV0dXJuO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSByZXR1cm47XG5cblx0XHRpZiAobGFzdFRpbWUgPCBmcmFtZXNbMF0gfHwgdGltZSA+PSBmcmFtZXNbVGltZWxpbmUuc2VhcmNoMShmcmFtZXMsIGxhc3RUaW1lKSArIDFdKSB7XG5cdFx0XHRpZiAoY29uc3RyYWludCAhPSBudWxsKVxuXHRcdFx0XHRjb25zdHJhaW50LnJlc2V0KCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Zm9yIChjb25zdCBjb25zdHJhaW50IG9mIHNrZWxldG9uLnBoeXNpY3NDb25zdHJhaW50cykge1xuXHRcdFx0XHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkgY29uc3RyYWludC5yZXNldCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEgc2xvdCdzIHtAbGluayBTbG90I2dldFNlcXVlbmNlSW5kZXgoKX0gZm9yIGFuIGF0dGFjaG1lbnQncyB7QGxpbmsgU2VxdWVuY2V9LiAqL1xuZXhwb3J0IGNsYXNzIFNlcXVlbmNlVGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHN0YXRpYyBFTlRSSUVTID0gMztcblx0c3RhdGljIE1PREUgPSAxO1xuXHRzdGF0aWMgREVMQVkgPSAyO1xuXG5cdHNsb3RJbmRleDogbnVtYmVyO1xuXHRhdHRhY2htZW50OiBIYXNUZXh0dXJlUmVnaW9uO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyLCBhdHRhY2htZW50OiBIYXNUZXh0dXJlUmVnaW9uKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgW1xuXHRcdFx0UHJvcGVydHkuc2VxdWVuY2UgKyBcInxcIiArIHNsb3RJbmRleCArIFwifFwiICsgYXR0YWNobWVudC5zZXF1ZW5jZSEuaWRcblx0XHRdKTtcblx0XHR0aGlzLnNsb3RJbmRleCA9IHNsb3RJbmRleDtcblx0XHR0aGlzLmF0dGFjaG1lbnQgPSBhdHRhY2htZW50O1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gU2VxdWVuY2VUaW1lbGluZS5FTlRSSUVTO1xuXHR9XG5cblx0Z2V0U2xvdEluZGV4ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zbG90SW5kZXg7XG5cdH1cblxuXHRnZXRBdHRhY2htZW50ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hdHRhY2htZW50IGFzIHVua25vd24gYXMgQXR0YWNobWVudDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lLCBtb2RlLCBpbmRleCwgYW5kIGZyYW1lIHRpbWUgZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUuXG5cdCAqIEBwYXJhbSBmcmFtZSBCZXR3ZWVuIDAgYW5kIDxjb2RlPmZyYW1lQ291bnQ8L2NvZGU+LCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFNlY29uZHMgYmV0d2VlbiBmcmFtZXMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1vZGU6IFNlcXVlbmNlTW9kZSwgaW5kZXg6IG51bWJlciwgZGVsYXk6IG51bWJlcikge1xuXHRcdGxldCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRmcmFtZSAqPSBTZXF1ZW5jZVRpbWVsaW5lLkVOVFJJRVM7XG5cdFx0ZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgU2VxdWVuY2VUaW1lbGluZS5NT0RFXSA9IG1vZGUgfCAoaW5kZXggPDwgNCk7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgU2VxdWVuY2VUaW1lbGluZS5ERUxBWV0gPSBkZWxheTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGJsZW5kOiBNaXhCbGVuZCwgZGlyZWN0aW9uOiBNaXhEaXJlY3Rpb24pIHtcblx0XHRsZXQgc2xvdCA9IHNrZWxldG9uLnNsb3RzW3RoaXMuc2xvdEluZGV4XTtcblx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIHJldHVybjtcblx0XHRsZXQgc2xvdEF0dGFjaG1lbnQgPSBzbG90LmF0dGFjaG1lbnQ7XG5cdFx0bGV0IGF0dGFjaG1lbnQgPSB0aGlzLmF0dGFjaG1lbnQgYXMgdW5rbm93biBhcyBBdHRhY2htZW50O1xuXHRcdGlmIChzbG90QXR0YWNobWVudCAhPSBhdHRhY2htZW50KSB7XG5cdFx0XHRpZiAoIShzbG90QXR0YWNobWVudCBpbnN0YW5jZW9mIFZlcnRleEF0dGFjaG1lbnQpXG5cdFx0XHRcdHx8IChzbG90QXR0YWNobWVudCBhcyBWZXJ0ZXhBdHRhY2htZW50KS50aW1lbGluZUF0dGFjaG1lbnQgIT0gYXR0YWNobWVudCkgcmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChkaXJlY3Rpb24gPT0gTWl4RGlyZWN0aW9uLm1peE91dCkge1xuXHRcdFx0aWYgKGJsZW5kID09IE1peEJsZW5kLnNldHVwKSBzbG90LnNlcXVlbmNlSW5kZXggPSAtMTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGlmIChibGVuZCA9PSBNaXhCbGVuZC5zZXR1cCB8fCBibGVuZCA9PSBNaXhCbGVuZC5maXJzdCkgc2xvdC5zZXF1ZW5jZUluZGV4ID0gLTE7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCBTZXF1ZW5jZVRpbWVsaW5lLkVOVFJJRVMpO1xuXHRcdGxldCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0bGV0IG1vZGVBbmRJbmRleCA9IGZyYW1lc1tpICsgU2VxdWVuY2VUaW1lbGluZS5NT0RFXTtcblx0XHRsZXQgZGVsYXkgPSBmcmFtZXNbaSArIFNlcXVlbmNlVGltZWxpbmUuREVMQVldO1xuXG5cdFx0aWYgKCF0aGlzLmF0dGFjaG1lbnQuc2VxdWVuY2UpIHJldHVybjtcblx0XHRsZXQgaW5kZXggPSBtb2RlQW5kSW5kZXggPj4gNCwgY291bnQgPSB0aGlzLmF0dGFjaG1lbnQuc2VxdWVuY2UhLnJlZ2lvbnMubGVuZ3RoO1xuXHRcdGxldCBtb2RlID0gU2VxdWVuY2VNb2RlVmFsdWVzW21vZGVBbmRJbmRleCAmIDB4Zl07XG5cdFx0aWYgKG1vZGUgIT0gU2VxdWVuY2VNb2RlLmhvbGQpIHtcblx0XHRcdGluZGV4ICs9ICgoKHRpbWUgLSBiZWZvcmUpIC8gZGVsYXkgKyAwLjAwMDAxKSB8IDApO1xuXHRcdFx0c3dpdGNoIChtb2RlKSB7XG5cdFx0XHRcdGNhc2UgU2VxdWVuY2VNb2RlLm9uY2U6XG5cdFx0XHRcdFx0aW5kZXggPSBNYXRoLm1pbihjb3VudCAtIDEsIGluZGV4KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUubG9vcDpcblx0XHRcdFx0XHRpbmRleCAlPSBjb3VudDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUucGluZ3Bvbmc6IHtcblx0XHRcdFx0XHRsZXQgbiA9IChjb3VudCA8PCAxKSAtIDI7XG5cdFx0XHRcdFx0aW5kZXggPSBuID09IDAgPyAwIDogaW5kZXggJSBuO1xuXHRcdFx0XHRcdGlmIChpbmRleCA+PSBjb3VudCkgaW5kZXggPSBuIC0gaW5kZXg7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUub25jZVJldmVyc2U6XG5cdFx0XHRcdFx0aW5kZXggPSBNYXRoLm1heChjb3VudCAtIDEgLSBpbmRleCwgMCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgU2VxdWVuY2VNb2RlLmxvb3BSZXZlcnNlOlxuXHRcdFx0XHRcdGluZGV4ID0gY291bnQgLSAxIC0gKGluZGV4ICUgY291bnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFNlcXVlbmNlTW9kZS5waW5ncG9uZ1JldmVyc2U6IHtcblx0XHRcdFx0XHRsZXQgbiA9IChjb3VudCA8PCAxKSAtIDI7XG5cdFx0XHRcdFx0aW5kZXggPSBuID09IDAgPyAwIDogKGluZGV4ICsgY291bnQgLSAxKSAlIG47XG5cdFx0XHRcdFx0aWYgKGluZGV4ID49IGNvdW50KSBpbmRleCA9IG4gLSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRzbG90LnNlcXVlbmNlSW5kZXggPSBpbmRleDtcblx0fVxufVxuIl19
2127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0FuaW1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFJL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBcUI3RSxPQUFPLEVBQUUsS0FBSyxFQUF3QixTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNFOzs7WUFHWTtBQUNaLE1BQU0sT0FBTyxTQUFTO0lBQ3JCOztpREFFNkM7SUFDcEMsSUFBSSxDQUFTO0lBRXRCOytIQUMySDtJQUMzSCxTQUFTLEdBQW9CLEVBQUUsQ0FBQztJQUV2QixXQUFXLENBQVk7SUFFaEM7O3lDQUVxQztJQUM1QixLQUFLLENBQWdCO0lBRTlCLGdCQUFnQjtJQUNoQiwrR0FBK0c7SUFDdEcsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXZDO3VGQUNtRjtJQUNuRixRQUFRLENBQVM7SUFFakIsWUFBYSxJQUFZLEVBQUUsU0FBMEIsRUFBRSxRQUFnQjtRQUN0RSxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFjLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsWUFBWSxDQUFFLFNBQTBCO1FBQ3ZDLElBQUksQ0FBQyxTQUFTO1lBQUUs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QUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3BGLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDM0csSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQzlHLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsRUFBRSxJQUFJLEdBQUcsQ0FBQztZQUNWLEVBQUUsSUFBSSxHQUFHLENBQUM7WUFDVixHQUFHLElBQUksSUFBSSxDQUFD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Q0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNyQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNyQyxDQUFDO1FBQ0YsQ0FBQztRQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRDtBQUVELHlE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LEVBQUUsQ0FBQyxDQUFBLEtBQUssRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFBLGVBQWUsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ3RGLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEtBQUssRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFBLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUMxRixDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQSxLQUFLLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDMUYsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUEsTUFBTSxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUEsZUFBZSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQzVGLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBLE1BQU0sRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFBLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUM1RixFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQSxNQUFNLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBRUQsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUNkLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN0QyxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQzVCLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQzFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLGdFQUFnRTtZQUNoRSxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVUsQ0FBQztZQUM3QixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDdEMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNQLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUss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SUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsZ0VBQWdFO2dCQUNoRSxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVUsQ0FBQztnQkFDN0IsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDdEMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDdEMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN2QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNyQyxDQUFDO1FBQ0YsQ0FBQztRQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFD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QUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUM1RSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2hHLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNqRCxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxVQUFVLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxVQUFVLENBQUM7UUFDbkcsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLEVBQUUsSUFBSSxHQUFHLENBQUM7WUFDVixFQUFFLElBQUksR0FBRyxDQUFDO1lBQ1YsR0FBRyxJQUFJLElBQUksQ0FBQztZQUNaLEdBQUcsSUFBSSxJQUFJLENBQUM7WUFDWixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUM7SUFDRixDQUFDO0lBRUQsZUFBZSxDQUFFLElBQVksRUFBRSxLQUFhO1FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDWCxLQUFLLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELEtBQUssQ0FBQyxDQUFBLFdBQVc7Z0JBQ2hCLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELENBQUMsSUFBSSxDQUFDLENBQUEsVUFBVSxDQUFDO1FBQ2pCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsT0FBTyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBLGVBQWUsQ0FBQztRQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRCxDQUFDO1FBQ0YsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsS0FBSyxDQUFFLFFBQWtCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsTUFBc0IsRUFBRSxLQUFhLEVBQUUsU0FBa0IsRUFDbkgsR0FBWSxFQUFFLEdBQVksRUFBRSxXQUFvQjtRQUNoRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztZQUFFLE9BQU87UUFDbEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDckUsS0FBSyxNQUFNLFNBQVMsSUFBSSxhQUFhO2dCQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNqRSxPQUFPO1FBQ1IsQ0FBQztRQUVELElBQUksRUFBbUIsRUFBRSxFQUEwQixDQUFDO1FBQ3BELElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNaLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ1AsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxLQUFLLE1BQU0sU0FBUyxJQUFJLGFBQWE7WUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFTyxXQUFXLENBQUUsSUFBVSxFQUFFLFdBQW9CLEVBQUUsRUFBbUIsRUFBRSxFQUEwQixFQUFFLE9BQWUsRUFBRSxXQUFtQixFQUMzSSxLQUFhLEVBQUUsU0FBa0IsRUFBRSxHQUFZO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzlCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN4RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEtBQUssSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRS9GLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQThCLENBQUM7UUFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDMUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7UUFFNUIsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyw0QkFBNEI7WUFDOUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLHlDQUF5Qzt3QkFDdkUsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO3dCQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRTs0QkFDbkMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3hDLENBQUM7eUJBQU0sQ0FBQyxDQUFDLHFDQUFxQzt3QkFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUU7NEJBQ25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JCLENBQUM7Z0JBQ0YsQ0FBQztxQkFBTSxnREFBZ0Q7b0JBQ3RELEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2pELENBQUM7aUJBQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsMkNBQTJDO29CQUN6RSxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7b0JBQ2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDN0MsQ0FBQztnQkFDRixDQUFDO3FCQUFNLENBQUMsQ0FBQyx1Q0FBdUM7b0JBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFO3dCQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsQ0FBQztZQUNGLENBQUM7aUJBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMseUNBQXlDO29CQUN2RSxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7b0JBQ2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFO3dCQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNsRCxDQUFDO3FCQUFNLENBQUMsQ0FBQyxrQ0FBa0M7b0JBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFO3dCQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDN0IsQ0FBQztZQUNGLENBQUM7aUJBQU0sQ0FBQyxDQUFDLGtEQUFrRDtnQkFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUU7b0JBQ25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDM0MsQ0FBQztRQUNGLENBQUM7YUFBTSxDQUFDLENBQUMsa0JBQWtCO1lBQzFCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNqQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyx5Q0FBeUM7d0JBQ3ZFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQzt3QkFDaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzRCQUN0QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDakUsQ0FBQztvQkFDRixDQUFDO3lCQUFNLENBQUMsQ0FBQyxxQ0FBcUM7d0JBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs0QkFDdEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQzt3QkFDOUMsQ0FBQztvQkFDRixDQUFDO2dCQUNGLENBQUM7cUJBQU0sSUFBSSxPQUFPLEtBQUssQ0FBQztvQkFDdkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUE7cUJBQzFDLENBQUMsQ0FBQyxnREFBZ0Q7b0JBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQztvQkFDN0MsQ0FBQztnQkFDRixDQUFDO1lBQ0YsQ0FBQztpQkFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQywyQ0FBMkM7b0JBQ3pFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztvQkFDaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUN0QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN2RSxDQUFDO2dCQUNGLENBQUM7cUJBQU0sQ0FBQyxDQUFDLHVDQUF1QztvQkFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUN0QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQ3ZELENBQUM7Z0JBQ0YsQ0FBQztZQUNGLENBQUM7aUJBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsMkNBQTJDO29CQUN6RSxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7b0JBQ2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDM0UsQ0FBQztnQkFDRixDQUFDO3FCQUFNLENBQUMsQ0FBQyx1Q0FBdUM7b0JBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN4RCxDQUFDO2dCQUNGLENBQUM7WUFDRixDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUN0QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNwRSxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRU8sZ0JBQWdCLENBQUUsSUFBVSxFQUFFLFdBQW9CLEVBQUUsU0FBa0I7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDOUIsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFDOUYsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMvQyxJQUFJLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNEO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxRQUFRO0lBQzdDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRVIsU0FBUyxDQUFTO0lBQ2xCLFVBQVUsQ0FBYTtJQUVoQyxZQUFhLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxVQUFzQjtRQUN6RSxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxTQUFTLElBQUssVUFBcUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsZUFBZTtRQUNkLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxZQUFZO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7MERBRXNEO0lBQ3RELGFBQWE7UUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs2Q0FFeUM7SUFDekMsUUFBUSxDQUFFLEtBQWEsRUFBRSxJQUFZLEVBQUUsSUFBa0IsRUFBRSxLQUFhLEVBQUUsS0FBYTtRQUN0RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNyQixNQUFNLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoRCxDQUFDO0lBRUQsS0FBSyxDQUFFLFFBQWtCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsTUFBb0IsRUFBRSxLQUFhLEVBQUUsU0FBa0IsRUFDakgsR0FBWSxFQUFFLEdBQVksRUFBRSxXQUFvQjtRQUNoRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztZQUFFLE9BQU87UUFDbEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ25ELEtBQUssTUFBTSxTQUFTLElBQUksYUFBYTtvQkFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDL0MsQ0FBQztZQUNELE9BQU87UUFDUixDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RixLQUFLLE1BQU0sU0FBUyxJQUFJLGFBQWE7WUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTyxTQUFTLENBQUUsSUFBVSxFQUFFLFdBQW9CO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzlCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN4RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEtBQUssSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBQy9GLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVPLFdBQVcsQ0FBRSxJQUFVLEVBQUUsV0FBb0IsRUFBRSxJQUFZLEVBQUUsTUFBYyxFQUFFLFlBQW9CLEVBQUUsS0FBYTtRQUN2SCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUM5QixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixLQUFLLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUUvRixJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBSSxJQUFJLENBQUMsVUFBcUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUMzRyxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDcEQsSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25ELFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxZQUFZLENBQUMsSUFBSTtvQkFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUFDLE1BQU07Z0JBQ2xFLEtBQUssWUFBWSxDQUFDLElBQUk7b0JBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQztvQkFBQyxNQUFNO2dCQUM5QyxLQUFLLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNCLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ2hDLElBQUksS0FBSyxJQUFJLEtBQUs7d0JBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQ3RDLE1BQU07Z0JBQ1AsQ0FBQztnQkFDRCxLQUFLLFlBQVksQ0FBQyxXQUFXO29CQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUFDLE1BQU07Z0JBQzdFLEtBQUssWUFBWSxDQUFDLFdBQVc7b0JBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7b0JBQUMsTUFBTTtnQkFDMUUsS0FBSyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztvQkFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMzQixLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM5QyxJQUFJLEtBQUssSUFBSSxLQUFLO3dCQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDOztBQUdGLHdFQUF3RTtBQUN4RSxNQUFNLE9BQU8sYUFBYyxTQUFRLFFBQVE7SUFDMUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFM0Msb0NBQW9DO0lBQ3BDLE1BQU0sQ0FBZTtJQUVyQixZQUFhLFVBQWtCO1FBQzlCLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBUSxVQUFVLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsYUFBYTtRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxRQUFRLENBQUUsS0FBYSxFQUFFLEtBQVk7UUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsS0FBSyxDQUFFLFFBQXlCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsV0FBeUIsRUFBRSxLQUFhLEVBQ3pHLFNBQWtCLEVBQUUsR0FBWSxFQUFFLEdBQVksRUFBRSxXQUFvQjtRQUVwRSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztZQUNwRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pGLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7YUFBTSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLGlDQUFpQztZQUMvRSxPQUFPO1FBQ1IsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU87UUFFN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ0YsQ0FBQztZQUNMLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsNENBQTRDO2dCQUMzRCxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssU0FBUztvQkFBRSxNQUFNO2dCQUN2QyxDQUFDLEVBQUUsQ0FBQztZQUNMLENBQUM7UUFDRixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsVUFBVSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzlDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7O0FBR0YsaURBQWlEO0FBQ2pELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxRQUFRO0lBQzlDLE1BQU0sQ0FBVSxVQUFVLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckQsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXBELCtEQUErRDtJQUM5QyxVQUFVLENBQThCO0lBRXpELFlBQWEsVUFBa0I7UUFDOUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQXVCLFVBQVUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxhQUFhO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRUQ7OytCQUUyQjtJQUMzQixRQUFRLENBQUUsS0FBYSxFQUFFLElBQVksRUFBRSxTQUErQjtRQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFFLFFBQWtCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsV0FBeUIsRUFBRSxLQUFhLEVBQ2xHLFNBQWtCLEVBQUUsR0FBWSxFQUFFLEdBQVksRUFBRSxXQUFvQjtRQUNwRSxNQUFNLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3QixJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xDLElBQUksU0FBUztnQkFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pFLE9BQU87UUFDUixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSztZQUNULEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEQsQ0FBQztZQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMzQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDRixDQUFDOztBQUdGLDBFQUEwRTtBQUMxRSxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsUUFBUTtJQUNuQyxLQUFLLENBQVc7SUFDaEIsUUFBUSxDQUFZO0lBQ3BCLFVBQVUsQ0FBOEI7SUFFekQ7dUVBQ21FO0lBQ25FLFlBQWEsVUFBa0IsRUFBRSxLQUFlLEVBQUUsU0FBaUI7UUFDbEUsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUs7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUUsS0FBZTtRQUMxQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELGFBQWE7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFRCx3RkFBd0Y7SUFDeEYsUUFBUTtRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuQixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELGFBQWE7UUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7NkZBR3lGO0lBQ3pGLFFBQVEsQ0FBRSxLQUFhLEVBQUUsSUFBWSxFQUFFLFNBQStCO1FBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxLQUFLLENBQUUsUUFBa0IsRUFBRSxRQUFnQixFQUFFLElBQVksRUFBRSxNQUFvQixFQUFFLEtBQWEsRUFBRSxTQUFrQixFQUNqSCxHQUFZLEVBQUUsR0FBWSxFQUFFLFdBQW9CO1FBQ2hELE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxTQUFTO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxDQUFDO1lBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsS0FBSztnQkFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDcEIsQ0FBQztnQkFDTCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3ZELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDckMsSUFBSSxFQUFFLEtBQUssS0FBSyxJQUFJOzRCQUFFLE1BQU07b0JBQzdCLENBQUM7Z0JBQ0YsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVPLEtBQUssQ0FBRSxJQUFZLEVBQUUsS0FBYTtRQUN6QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLEVBQUUsS0FBSyxLQUFLLElBQUk7b0JBQUUsTUFBTTtZQUM3QixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7Q0FDRDtBQVFELE1BQU0sVUFBVSxvQkFBb0IsQ0FBRSxHQUEyQztJQUNoRixPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLGVBQWUsS0FBSyxRQUFRLENBQUM7QUFDM0YsQ0FBQztBQUVEOzt3Q0FFd0M7QUFDeEMsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGFBQWE7SUFDN0MsZUFBZSxHQUFXLENBQUMsQ0FBQztJQUVyQyxZQUFhLFVBQWtCLEVBQUUsV0FBbUIsRUFBRSxlQUF1QjtRQUM1RSxLQUFLLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZUFBZTtRQUNkLE9BQU8sQ0FBQyxDQUFBLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozt1Q0FHbUM7SUFDbkMsUUFBUSxDQUFFLEtBQWEsRUFBRSxJQUFZLEVBQUUsR0FBVyxFQUFFLFFBQWdCLEVBQUUsYUFBcUIsRUFBRSxRQUFpQixFQUFFLE9BQWdCO1FBQy9ILEtBQUssSUFBSSxDQUFDLENBQUEsV0FBVyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQSxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUEsa0JBQWtCLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELEtBQUssQ0FBRSxRQUFrQixFQUFFLFFBQWdCLEVBQUUsSUFBWSxFQUFFLFdBQXlCLEVBQUUsS0FBYSxFQUFFLFNBQWtCLEVBQ3RILEdBQVksRUFBRSxHQUFZLEVBQUUsV0FBb0I7UUFFaEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFpQixDQUFDO1FBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDL0IsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBRXBFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDOUIsQ0FBQztZQUNELE9BQU87UUFDUixDQUFDO1FBRUQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQSxXQUFXLENBQUMsQ0FBQTtRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxDQUFDLENBQUM7UUFDaEQsUUFBUSxTQUFTLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxPQUFPLENBQUMsQ0FBQztnQkFDM0IsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFlBQVksQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkQsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RFLE1BQU07WUFDUCxDQUFDO1lBQ0QsS0FBSyxDQUFDLENBQUEsV0FBVztnQkFDaEIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQixRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsWUFBWSxDQUFDLENBQUM7Z0JBQ3JDLE1BQU07WUFDUDtnQkFDQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQSxPQUFPLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDdEUsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUEsWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUEsZUFBZSxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzFELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ25FLElBQUksR0FBRyxFQUFFLENBQUM7WUFDVCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDN0IsQ0FBQztRQUNGLENBQUM7YUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDRixDQUFDO0NBQ0Q7QUFFRDs7K0ZBRStGO0FBQy9GLE1BQU0sT0FBTywyQkFBNEIsU0FBUSxhQUFhO0lBQzdELGdIQUFnSDtJQUNoSCxlQUFlLEdBQVcsQ0FBQyxDQUFDO0lBRTVCLFlBQWEsVUFBa0IsRUFBRSxXQUFtQixFQUFFLGVBQXVCO1FBQzVFLEtBQUssQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVELGVBQWU7UUFDZCxPQUFPLENBQUMsQ0FBQSxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztnREFFNEM7SUFDNUMsUUFBUSxDQUFFLEtBQWEsRUFBRSxJQUFZLEVBQUUsU0FBaUIsRUFBRSxJQUFZLEVBQUUsSUFBWSxFQUFFLFNBQWlCLEVBQUUsU0FBaUIsRUFDekgsU0FBaUI7UUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixLQUFLLElBQUksQ0FBQyxDQUFBLFdBQVcsQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUN4QyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDOUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUN4QyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDeEMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUUsUUFBa0IsRUFBRSxRQUFnQixFQUFFLElBQVksRUFBRSxXQUF5QixFQUFFLEtBQWEsRUFBRSxTQUFrQixFQUN0SCxHQUFZLEVBQUUsR0FBWSxFQUFFLFdBQW9CO1FBRWhELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBd0IsQ0FBQztRQUNyRixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQy9CLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUVwRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDbEMsQ0FBQztZQUNELE9BQU87UUFDUixDQUFDO1FBRUQsSUFBSSxNQUFjLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLE1BQWMsQ0FBQztRQUN6RixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLENBQUMsQ0FBQztRQUNoRCxRQUFRLFNBQVMsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxLQUFLLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEUsTUFBTTtZQUNQLENBQUM7WUFDRCxLQUFLLENBQUMsQ0FBQSxXQUFXO2dCQUNoQixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxLQUFLLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNO1lBQ1A7Z0JBQ0MsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUEsVUFBVSxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQzVFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEtBQUssRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFBLGVBQWUsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ3RGLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEtBQUssRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFBLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUMxRixNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQSxVQUFVLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDcEcsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUEsVUFBVSxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUEsZUFBZSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ3BHLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBLFVBQVUsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFBLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDaEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDaEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsTUFB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Q0FDRDtBQUVELHNDQUFzQztBQUN0QyxNQUFNLE9BQU8saUJBQWtCLFNBQVEsbUJBQW1CO0lBQ3pELFlBQWEsVUFBa0IsRUFBRSxXQUFtQixFQUFFLGVBQXVCO1FBQzVFLEtBQUssQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBRSxRQUFrQixFQUFFLFFBQWdCLEVBQUUsSUFBWSxFQUFFLFdBQXlCLEVBQUUsS0FBYSxFQUFFLFNBQWtCLEVBQ3RILEdBQVksRUFBRSxHQUFZLEVBQUUsV0FBb0I7UUFFaEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFXLENBQUM7UUFDeEUsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB0eXBlIHsgQXR0YWNobWVudCwgVmVydGV4QXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgSGFzU2VxdWVuY2UgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9IYXNTZXF1ZW5jZS5qc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VNb2RlLCBTZXF1ZW5jZU1vZGVWYWx1ZXMgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9TZXF1ZW5jZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25lIH0gZnJvbSBcIi4vQm9uZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmhlcml0IH0gZnJvbSBcIi4vQm9uZURhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgQm9uZVBvc2UgfSBmcm9tIFwiLi9Cb25lUG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudCB9IGZyb20gXCIuL0V2ZW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IElrQ29uc3RyYWludCB9IGZyb20gXCIuL0lrQ29uc3RyYWludC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJa0NvbnN0cmFpbnRQb3NlIH0gZnJvbSBcIi4vSWtDb25zdHJhaW50UG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoQ29uc3RyYWludCB9IGZyb20gXCIuL1BhdGhDb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhDb25zdHJhaW50UG9zZSB9IGZyb20gXCIuL1BhdGhDb25zdHJhaW50UG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQaHlzaWNzQ29uc3RyYWludCB9IGZyb20gXCIuL1BoeXNpY3NDb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBoeXNpY3NDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL1BoeXNpY3NDb25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQaHlzaWNzQ29uc3RyYWludFBvc2UgfSBmcm9tIFwiLi9QaHlzaWNzQ29uc3RyYWludFBvc2UuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zZWQgfSBmcm9tIFwiLi9Qb3NlZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNrZWxldG9uRGF0YSB9IGZyb20gXCIuL1NrZWxldG9uRGF0YS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTbGlkZXIgfSBmcm9tIFwiLi9TbGlkZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgU2xpZGVyUG9zZSB9IGZyb20gXCIuL1NsaWRlclBvc2UuanNcIjtcbmltcG9ydCB0eXBlIHsgU2xvdCB9IGZyb20gXCIuL1Nsb3QuanNcIjtcbmltcG9ydCB0eXBlIHsgU2xvdFBvc2UgfSBmcm9tIFwiLi9TbG90UG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1Db25zdHJhaW50IH0gZnJvbSBcIi4vVHJhbnNmb3JtQ29uc3RyYWludC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1Db25zdHJhaW50UG9zZSB9IGZyb20gXCIuL1RyYW5zZm9ybUNvbnN0cmFpbnRQb3NlLmpzXCI7XG5pbXBvcnQgeyBDb2xvciwgdHlwZSBOdW1iZXJBcnJheUxpa2UsIFN0cmluZ1NldCwgVXRpbHMgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG4vKiogU3RvcmVzIGEgbGlzdCBvZiB0aW1lbGluZXMgdG8gYW5pbWF0ZSBhIHNrZWxldG9uJ3MgcG9zZSBvdmVyIHRpbWUuXG4gKlxuICogU2VlIDxhIGhyZWY9J2h0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtYXBwbHlpbmctYW5pbWF0aW9ucyNUaW1lbGluZS1BUEknPkFwcGx5aW5nIEFuaW1hdGlvbnM8L2E+IGluIHRoZSBTcGluZSBSdW50aW1lc1xuICogR3VpZGUuICovXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uIHtcblx0LyoqIFRoZSBhbmltYXRpb24ncyBuYW1lLCB1bmlxdWUgYWNyb3NzIGFsbCBhbmltYXRpb25zIGluIHRoZSBza2VsZXRvbi5cblx0ICpcblx0ICogU2VlIHtAbGluayBTa2VsZXRvbkRhdGEuZmluZEFuaW1hdGlvbn0uICovXG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuXHQvKiogVGhlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gc2Vjb25kcywgd2hpY2ggaXMgdXN1YWxseSB0aGUgaGlnaGVzdCB0aW1lIG9mIGFsbCBmcmFtZXMgaW4gdGhlIHRpbWVsaW5lcy4gVGhlIGR1cmF0aW9uIGlzXG5cdCAqIHVzZWQgdG8ga25vdyB3aGVuIHRoZSBhbmltYXRpb24gaGFzIGNvbXBsZXRlZCBhbmQsIGZvciBhbmltYXRpb25zIHRoYXQgcmVwZWF0LCB3aGVuIGl0IHNob3VsZCBsb29wIGJhY2sgdG8gdGhlIHN0YXJ0LiAqL1xuXHR0aW1lbGluZXM6IEFycmF5PFRpbWVsaW5lPiA9IFtdO1xuXG5cdHJlYWRvbmx5IHRpbWVsaW5lSWRzOiBTdHJpbmdTZXQ7XG5cblx0LyoqIHtAbGluayBTa2VsZXRvbi5nZXRCb25lc30gaW5kaWNlcyB0aGF0IHRoaXMgYW5pbWF0aW9uJ3MgdGltZWxpbmVzIG1vZGlmeS5cblx0ICpcblx0ICogU2VlIHtAbGluayBCb25lVGltZWxpbmUuYm9uZXN9LiAqL1xuXHRyZWFkb25seSBib25lczogQXJyYXk8bnVtYmVyPjtcblxuXHQvLyBOb25lc3NlbnRpYWwuXG5cdC8qKiBUaGUgY29sb3Igb2YgdGhlIGFuaW1hdGlvbiBhcyBpdCB3YXMgaW4gU3BpbmUsIG9yIGEgZGVmYXVsdCBjb2xvciBpZiBub25lc3NlbnRpYWwgZGF0YSB3YXMgbm90IGV4cG9ydGVkLiAqL1xuXHRyZWFkb25seSBjb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcblxuXHQvKiogVGhlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gc2Vjb25kcywgd2hpY2ggaXMgdXN1YWxseSB0aGUgaGlnaGVzdCB0aW1lIG9mIGFsbCBmcmFtZXMgaW4gdGhlIHRpbWVsaW5lLiBUaGUgZHVyYXRpb24gaXNcblx0ICogdXNlZCB0byBrbm93IHdoZW4gaXQgaGFzIGNvbXBsZXRlZCBhbmQgd2hlbiBpdCBzaG91bGQgbG9vcCBiYWNrIHRvIHRoZSBzdGFydC4gKi9cblx0ZHVyYXRpb246IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nLCB0aW1lbGluZXM6IEFycmF5PFRpbWVsaW5lPiwgZHVyYXRpb246IG51bWJlcikge1xuXHRcdGlmICghbmFtZSkgdGhyb3cgbmV3IEVycm9yKFwibmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG5cdFx0dGhpcy50aW1lbGluZUlkcyA9IG5ldyBTdHJpbmdTZXQoKTtcblx0XHR0aGlzLmJvbmVzID0gW10gYXMgbnVtYmVyW107XG5cdFx0dGhpcy5zZXRUaW1lbGluZXModGltZWxpbmVzKTtcblx0fVxuXG5cdHNldFRpbWVsaW5lcyAodGltZWxpbmVzOiBBcnJheTxUaW1lbGluZT4pIHtcblx0XHRpZiAoIXRpbWVsaW5lcykgdGhyb3cgbmV3IEVycm9yKFwidGltZWxpbmVzIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLnRpbWVsaW5lcyA9IHRpbWVsaW5lcztcblxuXHRcdGNvbnN0IG4gPSB0aW1lbGluZXMubGVuZ3RoO1xuXHRcdHRoaXMudGltZWxpbmVJZHMuY2xlYXIoKTtcblx0XHR0aGlzLmJvbmVzLmxlbmd0aCA9IDA7XG5cdFx0Y29uc3QgYm9uZVNldCA9IG5ldyBTZXQoKTtcblx0XHRjb25zdCBpdGVtcyA9IHRpbWVsaW5lcztcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgdGltZWxpbmUgPSBpdGVtc1tpXTtcblx0XHRcdHRoaXMudGltZWxpbmVJZHMuYWRkQWxsKHRpbWVsaW5lLnByb3BlcnR5SWRzKTtcblx0XHRcdGlmIChpc0JvbmVUaW1lbGluZSh0aW1lbGluZSkgJiYgYm9uZVNldC5hZGQodGltZWxpbmUuYm9uZUluZGV4KSlcblx0XHRcdFx0dGhpcy5ib25lcy5wdXNoKHRpbWVsaW5lLmJvbmVJbmRleCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGFuaW1hdGlvbiBjb250YWlucyBhIHRpbWVsaW5lIHdpdGggYW55IG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgSURzLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFRpbWVsaW5lLnByb3BlcnR5SWRzfS4gKi9cblx0aGFzVGltZWxpbmUgKGlkczogc3RyaW5nW10pOiBib29sZWFuIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKylcblx0XHRcdGlmICh0aGlzLnRpbWVsaW5lSWRzLmNvbnRhaW5zKGlkc1tpXSkpIHJldHVybiB0cnVlO1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKiBBcHBsaWVzIHRoZSBhbmltYXRpb24ncyB0aW1lbGluZXMgdG8gdGhlIHNwZWNpZmllZCBza2VsZXRvbi5cblx0ICpcblx0ICogU2VlIHtAbGluayBUaW1lbGluZS5hcHBseX0gYW5kXG5cdCAqIDxhIGhyZWY9J2h0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtYXBwbHlpbmctYW5pbWF0aW9ucyNUaW1lbGluZS1BUEknPkFwcGx5aW5nIEFuaW1hdGlvbnM8L2E+IGluIHRoZSBTcGluZSBSdW50aW1lc1xuXHQgKiBHdWlkZS5cblx0ICogQHBhcmFtIHNrZWxldG9uIFRoZSBza2VsZXRvbiB0aGUgYW5pbWF0aW9uIGlzIGFwcGxpZWQgdG8uIFRoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBib25lcywgc2xvdHMsIGFuZCBvdGhlciBza2VsZXRvblxuXHQgKiAgICAgICAgICAgY29tcG9uZW50cyB0aGUgdGltZWxpbmVzIG1heSBjaGFuZ2UuXG5cdCAqIEBwYXJhbSBsYXN0VGltZSBUaGUgbGFzdCB0aW1lIGluIHNlY29uZHMgdGhpcyBhbmltYXRpb24gd2FzIGFwcGxpZWQuIFNvbWUgdGltZWxpbmVzIHRyaWdnZXIgb25seSBhdCBkaXNjcmV0ZSB0aW1lcywgaW4gd2hpY2hcblx0ICogICAgICAgICAgIGNhc2UgYWxsIGtleXMgYXJlIHRyaWdnZXJlZCBiZXR3ZWVuIGBsYXN0VGltZWAgKGV4Y2x1c2l2ZSkgYW5kIGB0aW1lYCAoaW5jbHVzaXZlKS4gUGFzcyAtMVxuXHQgKiAgICAgICAgICAgdGhlIGZpcnN0IHRpbWUgYW4gYW5pbWF0aW9uIGlzIGFwcGxpZWQgdG8gZW5zdXJlIGZyYW1lIDAgaXMgdHJpZ2dlcmVkLlxuXHQgKiBAcGFyYW0gdGltZSBUaGUgdGltZSBpbiBzZWNvbmRzIHRoZSBza2VsZXRvbiBpcyBiZWluZyBwb3NlZCBmb3IuIFRpbWVsaW5lcyBmaW5kIHRoZSBmcmFtZSBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgdGltZSBhbmRcblx0ICogICAgICAgICAgIGludGVycG9sYXRlIGJldHdlZW4gdGhlIGZyYW1lIHZhbHVlcy5cblx0ICogQHBhcmFtIGxvb3AgVHJ1ZSBpZiBgdGltZWAgYmV5b25kIHRoZSB7QGxpbmsgZHVyYXRpb259IHJlcGVhdHMgdGhlIGFuaW1hdGlvbiwgZWxzZSB0aGUgbGFzdCBmcmFtZSBpcyB1c2VkLlxuXHQgKiBAcGFyYW0gZXZlbnRzIElmIGFueSBldmVudHMgYXJlIGZpcmVkLCB0aGV5IGFyZSBhZGRlZCB0byB0aGlzIGxpc3QuIFBhc3MgbnVsbCB0byBpZ25vcmUgZmlyZWQgZXZlbnRzIG9yIGlmIG5vIHRpbWVsaW5lcyBmaXJlXG5cdCAqICAgICAgICAgICBldmVudHMuXG5cdCAqIEBwYXJhbSBhbHBoYSAwIGFwcGxpZXMgc2V0dXAgb3IgY3VycmVudCB2YWx1ZXMgKGRlcGVuZGluZyBvbiBgZnJvbVNldHVwYCksIDEgdXNlcyB0aW1lbGluZSB2YWx1ZXMsIGFuZFxuXHQgKiAgICAgICAgICAgaW50ZXJtZWRpYXRlIHZhbHVlcyBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZW0uIEFkanVzdGluZyBgYWxwaGFgIG92ZXIgdGltZSBjYW4gbWl4IGFuIGFuaW1hdGlvbiBpbiBvclxuXHQgKiAgICAgICAgICAgb3V0LlxuXHQgKiBAcGFyYW0gZnJvbVNldHVwIElmIHRydWUsIGBhbHBoYWAgdHJhbnNpdGlvbnMgYmV0d2VlbiBzZXR1cCBhbmQgdGltZWxpbmUgdmFsdWVzLCBzZXR1cCB2YWx1ZXMgYXJlIHVzZWQgYmVmb3JlIHRoZVxuXHQgKiAgICAgICAgICAgZmlyc3QgZnJhbWUgKGN1cnJlbnQgdmFsdWVzIGFyZSBub3QgdXNlZCkuIElmIGZhbHNlLCBgYWxwaGFgIHRyYW5zaXRpb25zIGJldHdlZW4gY3VycmVudCBhbmQgdGltZWxpbmVcblx0ICogICAgICAgICAgIHZhbHVlcywgbm8gY2hhbmdlIGlzIG1hZGUgYmVmb3JlIHRoZSBmaXJzdCBmcmFtZS5cblx0ICogQHBhcmFtIGFkZCBJZiB0cnVlLCBmb3IgdGltZWxpbmVzIHRoYXQgc3VwcG9ydCBpdCwgdGhlaXIgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgc2V0dXAgb3IgY3VycmVudCB2YWx1ZXMgKGRlcGVuZGluZyBvblxuXHQgKiAgICAgICAgICAgYGZyb21TZXR1cGApLlxuXHQgKiBAcGFyYW0gb3V0IFRydWUgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIG1peGluZyBvdXQsIGVsc2UgaXQgaXMgbWl4aW5nIGluLiBVc2VkIGJ5IHRpbWVsaW5lcyB0aGF0IHBlcmZvcm0gaW5zdGFudCB0cmFuc2l0aW9ucy5cblx0ICogQHBhcmFtIGFwcGxpZWRQb3NlIFRydWUgdG8gbW9kaWZ5IHtAbGluayBQb3NlZC5hcHBsaWVkUG9zZX0sIGVsc2Uge0BsaW5rIFBvc2VkLnBvc2V9IGlzIG1vZGlmaWVkLiAqL1xuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGxvb3A6IGJvb2xlYW4sIGV2ZW50czogQXJyYXk8RXZlbnQ+IHwgbnVsbCwgYWxwaGE6IG51bWJlcixcblx0XHRmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXHRcdGlmICghc2tlbGV0b24pIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblxuXHRcdGlmIChsb29wICYmIHRoaXMuZHVyYXRpb24gIT09IDApIHtcblx0XHRcdHRpbWUgJT0gdGhpcy5kdXJhdGlvbjtcblx0XHRcdGlmIChsYXN0VGltZSA+IDApIGxhc3RUaW1lICU9IHRoaXMuZHVyYXRpb247XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGltZWxpbmVzID0gdGhpcy50aW1lbGluZXM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aW1lbGluZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0dGltZWxpbmVzW2ldLmFwcGx5KHNrZWxldG9uLCBsYXN0VGltZSwgdGltZSwgZXZlbnRzLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIG91dCwgYXBwbGllZFBvc2UpO1xuXHR9XG59XG5cblxuZXhwb3J0IGVudW0gUHJvcGVydHkge1xuXHRyb3RhdGUsXG5cdHgsXG5cdHksXG5cdHNjYWxlWCxcblx0c2NhbGVZLFxuXHRzaGVhclgsXG5cdHNoZWFyWSxcblx0aW5oZXJpdCxcblx0cmdiLFxuXHRhbHBoYSxcblx0cmdiMixcblx0YXR0YWNobWVudCxcblx0ZGVmb3JtLFxuXHRldmVudCxcblx0ZHJhd09yZGVyLFxuXHRpa0NvbnN0cmFpbnQsXG5cdHRyYW5zZm9ybUNvbnN0cmFpbnQsXG5cdHBhdGhDb25zdHJhaW50UG9zaXRpb24sXG5cdHBhdGhDb25zdHJhaW50U3BhY2luZyxcblx0cGF0aENvbnN0cmFpbnRNaXgsXG5cdHBoeXNpY3NDb25zdHJhaW50SW5lcnRpYSxcblx0cGh5c2ljc0NvbnN0cmFpbnRTdHJlbmd0aCxcblx0cGh5c2ljc0NvbnN0cmFpbnREYW1waW5nLFxuXHRwaHlzaWNzQ29uc3RyYWludE1hc3MsXG5cdHBoeXNpY3NDb25zdHJhaW50V2luZCxcblx0cGh5c2ljc0NvbnN0cmFpbnRHcmF2aXR5LFxuXHRwaHlzaWNzQ29uc3RyYWludE1peCxcblx0cGh5c2ljc0NvbnN0cmFpbnRSZXNldCxcblx0c2VxdWVuY2UsXG5cdHNsaWRlclRpbWUsXG5cdHNsaWRlck1peCxcbn1cblxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgdGltZWxpbmVzLlxuICpcbiAqIFNlZSA8YSBocmVmPSdodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWFwcGx5aW5nLWFuaW1hdGlvbnMjVGltZWxpbmUtQVBJJz5BcHBseWluZyBBbmltYXRpb25zPC9hPiBpbiB0aGUgU3BpbmVcbiAqIFJ1bnRpbWVzIEd1aWRlLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRpbWVsaW5lIHtcblx0cmVhZG9ubHkgcHJvcGVydHlJZHM6IHN0cmluZ1tdO1xuXHRyZWFkb25seSBmcmFtZXM6IE51bWJlckFycmF5TGlrZTtcblxuXHQvKiogVHJ1ZSBpZiB0aGlzIHRpbWVsaW5lIHN1cHBvcnRzIGFkZGl0aXZlIGJsZW5kaW5nLiAqL1xuXHRhZGRpdGl2ZSA9IGZhbHNlO1xuXG5cdC8qKiBUcnVlIGlmIHRoaXMgdGltZWxpbmUgc2V0cyB2YWx1ZXMgaW5zdGFudGFuZW91c2x5IGFuZCBkb2VzIG5vdCBzdXBwb3J0IGludGVycG9sYXRpb24gYmV0d2VlbiBmcmFtZXMuICovXG5cdGluc3RhbnQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCAuLi5wcm9wZXJ0eUlkczogc3RyaW5nW10pIHtcblx0XHR0aGlzLnByb3BlcnR5SWRzID0gcHJvcGVydHlJZHM7XG5cdFx0dGhpcy5mcmFtZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KGZyYW1lQ291bnQgKiB0aGlzLmdldEZyYW1lRW50cmllcygpKTtcblx0fVxuXG5cdGdldFByb3BlcnR5SWRzICgpIHtcblx0XHRyZXR1cm4gdGhpcy5wcm9wZXJ0eUlkcztcblx0fVxuXG5cdC8qKiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgcGVyIGZyYW1lLiAqL1xuXHRnZXRGcmFtZUVudHJpZXMgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHQvKiogVGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhpcyB0aW1lbGluZS4gKi9cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aCAvIHRoaXMuZ2V0RnJhbWVFbnRyaWVzKCk7XG5cdH1cblxuXHQvKiogVGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lbGluZSBpbiBzZWNvbmRzLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBoaWdoZXN0IHRpbWUgb2YgYWxsIGZyYW1lcyBpbiB0aGUgdGltZWxpbmUuICovXG5cdGdldER1cmF0aW9uICgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lc1t0aGlzLmZyYW1lcy5sZW5ndGggLSB0aGlzLmdldEZyYW1lRW50cmllcygpXTtcblx0fVxuXG5cdC8qKiBBcHBsaWVzIHRoaXMgdGltZWxpbmUgdG8gdGhlIHNrZWxldG9uLlxuXHQgKlxuXHQgKiBTZWUgPGEgaHJlZj0naHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1hcHBseWluZy1hbmltYXRpb25zI1RpbWVsaW5lLUFQSSc+QXBwbHlpbmcgQW5pbWF0aW9uczwvYT4gaW4gdGhlIFNwaW5lXG5cdCAqIFJ1bnRpbWVzIEd1aWRlLlxuXHQgKiBAcGFyYW0gc2tlbGV0b24gVGhlIHNrZWxldG9uIHRoZSB0aW1lbGluZSBpcyBhcHBsaWVkIHRvLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYm9uZXMsIHNsb3RzLCBhbmQgb3RoZXIgc2tlbGV0b25cblx0ICogICAgICAgICAgIGNvbXBvbmVudHMgdGhlIHRpbWVsaW5lcyBtYXkgY2hhbmdlLlxuXHQgKiBAcGFyYW0gbGFzdFRpbWUgVGhlIGxhc3QgdGltZSBpbiBzZWNvbmRzIHRoaXMgdGltZWxpbmUgd2FzIGFwcGxpZWQuIFNvbWUgdGltZWxpbmVzIHRyaWdnZXIgb25seSBhdCBkaXNjcmV0ZSB0aW1lcywgaW5cblx0ICogICAgICAgICAgIHdoaWNoIGNhc2UgYWxsIGtleXMgYXJlIHRyaWdnZXJlZCBiZXR3ZWVuIGBsYXN0VGltZWAgKGV4Y2x1c2l2ZSkgYW5kIGB0aW1lYCAoaW5jbHVzaXZlKS5cblx0ICogICAgICAgICAgIFBhc3MgLTEgdGhlIGZpcnN0IHRpbWUgYSB0aW1lbGluZSBpcyBhcHBsaWVkIHRvIGVuc3VyZSBmcmFtZSAwIGlzIHRyaWdnZXJlZC5cblx0ICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gc2Vjb25kcyB0aGUgc2tlbGV0b24gaXMgYmVpbmcgcG9zZWQgZm9yLiBUaW1lbGluZXMgZmluZCB0aGUgZnJhbWUgYmVmb3JlIGFuZCBhZnRlciB0aGlzIHRpbWUgYW5kXG5cdCAqICAgICAgICAgICBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSBmcmFtZSB2YWx1ZXMuXG5cdCAqIEBwYXJhbSBldmVudHMgSWYgYW55IGV2ZW50cyBhcmUgZmlyZWQsIHRoZXkgYXJlIGFkZGVkIHRvIHRoaXMgbGlzdC4gUGFzcyBudWxsIHRvIGlnbm9yZSBmaXJlZCBldmVudHMgb3IgaWYgbm8gdGltZWxpbmVzXG5cdCAqICAgICAgICAgICBmaXJlIGV2ZW50cy5cblx0ICogQHBhcmFtIGFscGhhIDAgYXBwbGllcyBzZXR1cCBvciBjdXJyZW50IHZhbHVlcyAoZGVwZW5kaW5nIG9uIGBmcm9tU2V0dXBgKSwgMSB1c2VzIHRpbWVsaW5lIHZhbHVlcywgYW5kXG5cdCAqICAgICAgICAgICBpbnRlcm1lZGlhdGUgdmFsdWVzIGludGVycG9sYXRlIGJldHdlZW4gdGhlbS4gQWRqdXN0aW5nIGBhbHBoYWAgb3ZlciB0aW1lIGNhbiBtaXggYSB0aW1lbGluZSBpbiBvclxuXHQgKiAgICAgICAgICAgb3V0LlxuXHQgKiBAcGFyYW0gZnJvbVNldHVwIElmIHRydWUsIGBhbHBoYWAgdHJhbnNpdGlvbnMgYmV0d2VlbiBzZXR1cCBhbmQgdGltZWxpbmUgdmFsdWVzLCBzZXR1cCB2YWx1ZXMgYXJlIHVzZWQgYmVmb3JlXG5cdCAqICAgICAgICAgICB0aGUgZmlyc3QgZnJhbWUgKGN1cnJlbnQgdmFsdWVzIGFyZSBub3QgdXNlZCkuIElmIGZhbHNlLCBgYWxwaGFgIHRyYW5zaXRpb25zIGJldHdlZW4gY3VycmVudCBhbmRcblx0ICogICAgICAgICAgIHRpbWVsaW5lIHZhbHVlcywgbm8gY2hhbmdlIGlzIG1hZGUgYmVmb3JlIHRoZSBmaXJzdCBmcmFtZS5cblx0ICogQHBhcmFtIGFkZCBJZiB0cnVlLCBmb3IgdGltZWxpbmVzIHRoYXQgc3VwcG9ydCBpdCwgdGhlaXIgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgc2V0dXAgb3IgY3VycmVudCB2YWx1ZXMgKGRlcGVuZGluZyBvblxuXHQgKiAgICAgICAgICAgYGZyb21TZXR1cGApLlxuXHQgKiBAcGFyYW0gb3V0IFRydWUgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIG1peGluZyBvdXQsIGVsc2UgaXQgaXMgbWl4aW5nIGluLiBVc2VkIGJ5IHRpbWVsaW5lcyB0aGF0IHBlcmZvcm0gaW5zdGFudFxuXHQgKiAgICAgICAgICAgdHJhbnNpdGlvbnMuXG5cdCAqIEBwYXJhbSBhcHBsaWVkUG9zZSBUcnVlIHRvIG1vZGlmeSB7QGxpbmsgUG9zZWQuYXBwbGllZFBvc2V9LCBlbHNlIHtAbGluayBQb3NlZC5wb3NlfSBpcyBtb2RpZmllZC4gKi9cblx0YWJzdHJhY3QgYXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pOiB2b2lkO1xuXG5cdC8qKiBMaW5lYXIgc2VhcmNoIHVzaW5nIHRoZSBzcGVjaWZpZWQgc3RyaWRlIChkZWZhdWx0IDEpLlxuXHQgKiBAcGFyYW0gdGltZSBNdXN0IGJlID49IHRoZSBmaXJzdCB2YWx1ZSBpbiBgZnJhbWVzYC5cblx0ICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHZhbHVlIDw9IGB0aW1lYC4gKi9cblx0c3RhdGljIHNlYXJjaCAoZnJhbWVzOiBOdW1iZXJBcnJheUxpa2UsIHRpbWU6IG51bWJlciwgc3RlcCA9IDEpIHtcblx0XHRjb25zdCBuID0gZnJhbWVzLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gc3RlcDsgaSA8IG47IGkgKz0gc3RlcClcblx0XHRcdGlmIChmcmFtZXNbaV0gPiB0aW1lKSByZXR1cm4gaSAtIHN0ZXA7XG5cdFx0cmV0dXJuIG4gLSBzdGVwO1xuXHR9XG59XG5cbi8qKiBBbiBpbnRlcmZhY2UgZm9yIHRpbWVsaW5lcyB0aGF0IGNoYW5nZSBhIHNsb3QncyBwcm9wZXJ0aWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbG90VGltZWxpbmUge1xuXHQvKiogVGhlIGluZGV4IG9mIHRoZSBzbG90IGluIHtAbGluayBTa2VsZXRvbi5zbG90c30gdGhhdCB3aWxsIGJlIGNoYW5nZWQgd2hlbiB0aGlzIHRpbWVsaW5lIGlzIGFwcGxpZWQuICovXG5cdHNsb3RJbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTbG90VGltZWxpbmUgKG9iajogVGltZWxpbmUgJiBQYXJ0aWFsPFNsb3RUaW1lbGluZT4pOiBvYmogaXMgVGltZWxpbmUgJiBTbG90VGltZWxpbmUge1xuXHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmouc2xvdEluZGV4ID09PSAnbnVtYmVyJztcbn1cblxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciB0aW1lbGluZXMgdGhhdCBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGZyYW1lIHZhbHVlcyB1c2luZyBzdGVwcGVkLCBsaW5lYXIsIG9yIGEgQmV6aWVyIGN1cnZlLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEN1cnZlVGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSB7XG5cdHByb3RlY3RlZCBjdXJ2ZXM6IE51bWJlckFycmF5TGlrZTsgLy8gdHlwZSwgeCwgeSwgLi4uXG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgLi4ucHJvcGVydHlJZHM6IHN0cmluZ1tdKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgLi4ucHJvcGVydHlJZHMpO1xuXHRcdHRoaXMuY3VydmVzID0gVXRpbHMubmV3RmxvYXRBcnJheShmcmFtZUNvdW50ICsgYmV6aWVyQ291bnQgKiAxOC8qQkVaSUVSX1NJWkUqLyk7XG5cdFx0dGhpcy5jdXJ2ZXNbZnJhbWVDb3VudCAtIDFdID0gMS8qU1RFUFBFRCovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUgdG8gbGluZWFyIGludGVycG9sYXRpb24uICovXG5cdHNldExpbmVhciAoZnJhbWU6IG51bWJlcikge1xuXHRcdHRoaXMuY3VydmVzW2ZyYW1lXSA9IDAvKkxJTkVBUiovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUgdG8gc3RlcHBlZCBpbnRlcnBvbGF0aW9uLiAqL1xuXHRzZXRTdGVwcGVkIChmcmFtZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5jdXJ2ZXNbZnJhbWVdID0gMS8qU1RFUFBFRCovO1xuXHR9XG5cblx0LyoqIFNocmlua3MgdGhlIHN0b3JhZ2UgZm9yIEJlemllciBjdXJ2ZXMsIGZvciB1c2Ugd2hlbiBgYmV6aWVyQ291bnRgIChzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yKSB3YXMgbGFyZ2VyXG5cdCAqIHRoYW4gdGhlIGFjdHVhbCBudW1iZXIgb2YgQmV6aWVyIGN1cnZlcy4gKi9cblx0c2hyaW5rIChiZXppZXJDb3VudDogbnVtYmVyKSB7XG5cdFx0Y29uc3Qgc2l6ZSA9IHRoaXMuZ2V0RnJhbWVDb3VudCgpICsgYmV6aWVyQ291bnQgKiAxOC8qQkVaSUVSX1NJWkUqLztcblx0XHRpZiAodGhpcy5jdXJ2ZXMubGVuZ3RoID4gc2l6ZSkge1xuXHRcdFx0Y29uc3QgbmV3Q3VydmVzID0gVXRpbHMubmV3RmxvYXRBcnJheShzaXplKTtcblx0XHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLmN1cnZlcywgMCwgbmV3Q3VydmVzLCAwLCBzaXplKTtcblx0XHRcdHRoaXMuY3VydmVzID0gbmV3Q3VydmVzO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBTdG9yZXMgdGhlIHNlZ21lbnRzIGZvciB0aGUgc3BlY2lmaWVkIEJlemllciBjdXJ2ZS4gRm9yIHRpbWVsaW5lcyB0aGF0IG1vZGlmeSBtdWx0aXBsZSB2YWx1ZXMsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW5cblx0ICogb25lIGN1cnZlIHBlciBmcmFtZS5cblx0ICogQHBhcmFtIGJlemllciBUaGUgb3JkaW5hbCBvZiB0aGlzIEJlemllciBjdXJ2ZSBmb3IgdGhpcyB0aW1lbGluZSwgYmV0d2VlbiAwIGFuZCBgYmV6aWVyQ291bnQgLSAxYCAoc3BlY2lmaWVkXG5cdCAqICAgICAgICAgICBpbiB0aGUgY29uc3RydWN0b3IpLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSBmcmFtZSBCZXR3ZWVuIDAgYW5kIGBmcmFtZUNvdW50IC0gMWAsIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSBpbmRleCBvZiB0aGUgdmFsdWUgZm9yIHRoaXMgZnJhbWUgdGhhdCB0aGlzIGN1cnZlIGlzIHVzZWQgZm9yLlxuXHQgKiBAcGFyYW0gdGltZTEgVGhlIHRpbWUgZm9yIHRoZSBmaXJzdCBrZXkuXG5cdCAqIEBwYXJhbSB2YWx1ZTEgVGhlIHZhbHVlIGZvciB0aGUgZmlyc3Qga2V5LlxuXHQgKiBAcGFyYW0gY3gxIFRoZSB0aW1lIGZvciB0aGUgZmlyc3QgQmV6aWVyIGhhbmRsZS5cblx0ICogQHBhcmFtIGN5MSBUaGUgdmFsdWUgZm9yIHRoZSBmaXJzdCBCZXppZXIgaGFuZGxlLlxuXHQgKiBAcGFyYW0gY3gyIFRoZSB0aW1lIG9mIHRoZSBzZWNvbmQgQmV6aWVyIGhhbmRsZS5cblx0ICogQHBhcmFtIGN5MiBUaGUgdmFsdWUgZm9yIHRoZSBzZWNvbmQgQmV6aWVyIGhhbmRsZS5cblx0ICogQHBhcmFtIHRpbWUyIFRoZSB0aW1lIGZvciB0aGUgc2Vjb25kIGtleS5cblx0ICogQHBhcmFtIHZhbHVlMiBUaGUgdmFsdWUgZm9yIHRoZSBzZWNvbmQga2V5LiAqL1xuXHRzZXRCZXppZXIgKGJlemllcjogbnVtYmVyLCBmcmFtZTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyLCB0aW1lMTogbnVtYmVyLCB2YWx1ZTE6IG51bWJlciwgY3gxOiBudW1iZXIsIGN5MTogbnVtYmVyLCBjeDI6IG51bWJlcixcblx0XHRjeTI6IG51bWJlciwgdGltZTI6IG51bWJlciwgdmFsdWUyOiBudW1iZXIpIHtcblx0XHRjb25zdCBjdXJ2ZXMgPSB0aGlzLmN1cnZlcztcblx0XHRsZXQgaSA9IHRoaXMuZ2V0RnJhbWVDb3VudCgpICsgYmV6aWVyICogMTgvKkJFWklFUl9TSVpFKi87XG5cdFx0aWYgKHZhbHVlID09PSAwKSBjdXJ2ZXNbZnJhbWVdID0gMi8qQkVaSUVSKi8gKyBpO1xuXHRcdGNvbnN0IHRtcHggPSAodGltZTEgLSBjeDEgKiAyICsgY3gyKSAqIDAuMDMsIHRtcHkgPSAodmFsdWUxIC0gY3kxICogMiArIGN5MikgKiAwLjAzO1xuXHRcdGNvbnN0IGRkZHggPSAoKGN4MSAtIGN4MikgKiAzIC0gdGltZTEgKyB0aW1lMikgKiAwLjAwNiwgZGRkeSA9ICgoY3kxIC0gY3kyKSAqIDMgLSB2YWx1ZTEgKyB2YWx1ZTIpICogMC4wMDY7XG5cdFx0bGV0IGRkeCA9IHRtcHggKiAyICsgZGRkeCwgZGR5ID0gdG1weSAqIDIgKyBkZGR5O1xuXHRcdGxldCBkeCA9IChjeDEgLSB0aW1lMSkgKiAwLjMgKyB0bXB4ICsgZGRkeCAqIDAuMTY2NjY2NjcsIGR5ID0gKGN5MSAtIHZhbHVlMSkgKiAwLjMgKyB0bXB5ICsgZGRkeSAqIDAuMTY2NjY2Njc7XG5cdFx0bGV0IHggPSB0aW1lMSArIGR4LCB5ID0gdmFsdWUxICsgZHk7XG5cdFx0Zm9yIChsZXQgbiA9IGkgKyAxOC8qQkVaSUVSX1NJWkUqLzsgaSA8IG47IGkgKz0gMikge1xuXHRcdFx0Y3VydmVzW2ldID0geDtcblx0XHRcdGN1cnZlc1tpICsgMV0gPSB5O1xuXHRcdFx0ZHggKz0gZGR4O1xuXHRcdFx0ZHkgKz0gZGR5O1xuXHRcdFx0ZGR4ICs9IGRkZHg7XG5cdFx0XHRkZHkgKz0gZGRkeTtcblx0XHRcdHggKz0gZHg7XG5cdFx0XHR5ICs9IGR5O1xuXHRcdH1cblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBCZXppZXIgaW50ZXJwb2xhdGVkIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHRpbWUuXG5cdCAqIEBwYXJhbSBmcmFtZUluZGV4IFRoZSBpbmRleCBpbnRvIHtAbGluayBmcmFtZXN9IGZvciB0aGUgdmFsdWVzIG9mIHRoZSBmcmFtZSBiZWZvcmUgYHRpbWVgLlxuXHQgKiBAcGFyYW0gdmFsdWVPZmZzZXQgVGhlIG9mZnNldCBmcm9tIGBmcmFtZUluZGV4YCB0byB0aGUgdmFsdWUgdGhpcyBjdXJ2ZSBpcyB1c2VkIGZvci5cblx0ICogQHBhcmFtIGkgVGhlIGluZGV4IG9mIHRoZSBCZXppZXIgc2VnbWVudHMuIFNlZSB7QGxpbmsgZ2V0Q3VydmVUeXBlfS4gKi9cblx0Z2V0QmV6aWVyVmFsdWUgKHRpbWU6IG51bWJlciwgZnJhbWVJbmRleDogbnVtYmVyLCB2YWx1ZU9mZnNldDogbnVtYmVyLCBpOiBudW1iZXIpIHtcblx0XHRjb25zdCBjdXJ2ZXMgPSB0aGlzLmN1cnZlcztcblx0XHRpZiAoY3VydmVzW2ldID4gdGltZSkge1xuXHRcdFx0Y29uc3QgeCA9IHRoaXMuZnJhbWVzW2ZyYW1lSW5kZXhdLCB5ID0gdGhpcy5mcmFtZXNbZnJhbWVJbmRleCArIHZhbHVlT2Zmc2V0XTtcblx0XHRcdHJldHVybiB5ICsgKHRpbWUgLSB4KSAvIChjdXJ2ZXNbaV0gLSB4KSAqIChjdXJ2ZXNbaSArIDFdIC0geSk7XG5cdFx0fVxuXHRcdGNvbnN0IG4gPSBpICsgMTgvKkJFWklFUl9TSVpFKi87XG5cdFx0Zm9yIChpICs9IDI7IGkgPCBuOyBpICs9IDIpIHtcblx0XHRcdGlmIChjdXJ2ZXNbaV0gPj0gdGltZSkge1xuXHRcdFx0XHRjb25zdCB4ID0gY3VydmVzW2kgLSAyXSwgeSA9IGN1cnZlc1tpIC0gMV07XG5cdFx0XHRcdHJldHVybiB5ICsgKHRpbWUgLSB4KSAvIChjdXJ2ZXNbaV0gLSB4KSAqIChjdXJ2ZXNbaSArIDFdIC0geSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZyYW1lSW5kZXggKz0gdGhpcy5nZXRGcmFtZUVudHJpZXMoKTtcblx0XHRjb25zdCB4ID0gY3VydmVzW24gLSAyXSwgeSA9IGN1cnZlc1tuIC0gMV07XG5cdFx0cmV0dXJuIHkgKyAodGltZSAtIHgpIC8gKHRoaXMuZnJhbWVzW2ZyYW1lSW5kZXhdIC0geCkgKiAodGhpcy5mcmFtZXNbZnJhbWVJbmRleCArIHZhbHVlT2Zmc2V0XSAtIHkpO1xuXHR9XG59XG5cbi8qKiBUaGUgYmFzZSBjbGFzcyBmb3IgYSB7QGxpbmsgQ3VydmVUaW1lbGluZX0gdGhhdCBzZXRzIG9uZSBwcm9wZXJ0eSB3aXRoIGEgY3VydmUuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3VydmVUaW1lbGluZTEgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgcHJvcGVydHlJZDogc3RyaW5nKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIHByb3BlcnR5SWQpO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gMi8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgYW5kIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCBgZnJhbWVDb3VudGAsIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIHRpbWUgVGhlIGZyYW1lIHRpbWUgaW4gc2Vjb25kcy4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuXHRcdGZyYW1lIDw8PSAxO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypWQUxVRSovXSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCB0aW1lLiAqL1xuXHRnZXRDdXJ2ZVZhbHVlICh0aW1lOiBudW1iZXIpIHtcblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRsZXQgaSA9IGZyYW1lcy5sZW5ndGggLSAyO1xuXHRcdGZvciAobGV0IGlpID0gMjsgaWkgPD0gaTsgaWkgKz0gMikge1xuXHRcdFx0aWYgKGZyYW1lc1tpaV0gPiB0aW1lKSB7XG5cdFx0XHRcdGkgPSBpaSAtIDI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgPj4gMV07XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgYmVmb3JlID0gZnJhbWVzW2ldLCB2YWx1ZSA9IGZyYW1lc1tpICsgMS8qVkFMVUUqL107XG5cdFx0XHRcdHJldHVybiB2YWx1ZSArICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDIvKkVOVFJJRVMqL10gLSBiZWZvcmUpICogKGZyYW1lc1tpICsgMi8qRU5UUklFUyovICsgMS8qVkFMVUUqL10gLSB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0cmV0dXJuIGZyYW1lc1tpICsgMS8qVkFMVUUqL107XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKlZBTFVFKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgZm9yIHByb3BlcnRpZXMgcmVsYXRpdmUgdG8gdGhlIHNldHVwIHZhbHVlLiBUaGUgdGltZWxpbmUgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHNldHVwXG5cdCAqIHZhbHVlLCByYXRoZXIgdGhhbiByZXBsYWNpbmcgaXQuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVGltZWxpbmUuYXBwbHl9LlxuXHQgKiBAcGFyYW0gY3VycmVudCBUaGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gc2V0dXAgVGhlIHNldHVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHkuICovXG5cdGdldFJlbGF0aXZlVmFsdWUgKHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlcikge1xuXHRcdGlmICh0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHJldHVybiBmcm9tU2V0dXAgPyBzZXR1cCA6IGN1cnJlbnQ7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldEN1cnZlVmFsdWUodGltZSk7XG5cdFx0cmV0dXJuIGZyb21TZXR1cCA/IHNldHVwICsgdmFsdWUgKiBhbHBoYSA6IGN1cnJlbnQgKyAoYWRkID8gdmFsdWUgOiB2YWx1ZSArIHNldHVwIC0gY3VycmVudCkgKiBhbHBoYTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgZm9yIHByb3BlcnRpZXMgc2V0IGFzIGFic29sdXRlIHZhbHVlcy4gVGhlIHRpbWVsaW5lIHZhbHVlIHJlcGxhY2VzIHRoZSBzZXR1cCB2YWx1ZSxcblx0ICogcmF0aGVyIHRoYW4gYmVpbmcgcmVsYXRpdmUgdG8gaXQuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVGltZWxpbmUuYXBwbHl9LlxuXHQgKiBAcGFyYW0gY3VycmVudCBUaGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gc2V0dXAgVGhlIHNldHVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHkuICovXG5cdGdldEFic29sdXRlVmFsdWUgKHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlcik6IG51bWJlcjtcblxuXHQvKiogUmV0dXJucyB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIGZvciBwcm9wZXJ0aWVzIHNldCBhcyBhYnNvbHV0ZSB2YWx1ZXMsIHVzaW5nIHRoZSBzcGVjaWZpZWQgdGltZWxpbmUgdmFsdWUgcmF0aGVyIHRoYW5cblx0ICogY2FsbGluZyB7QGxpbmsgZ2V0Q3VydmVWYWx1ZX0uXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVGltZWxpbmUuYXBwbHl9LlxuXHQgKiBAcGFyYW0gY3VycmVudCBUaGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gc2V0dXAgVGhlIHNldHVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHkuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdGltZWxpbmUgdmFsdWUgdG8gYXBwbHkuICovXG5cdGdldEFic29sdXRlVmFsdWUgKHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IG51bWJlcjtcblxuXHRnZXRBYnNvbHV0ZVZhbHVlICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLCBjdXJyZW50OiBudW1iZXIsIHNldHVwOiBudW1iZXIsIHZhbHVlPzogbnVtYmVyKSB7XG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRBYnNvbHV0ZVZhbHVlMSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIGN1cnJlbnQsIHNldHVwKTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRBYnNvbHV0ZVZhbHVlMih0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIGN1cnJlbnQsIHNldHVwLCB2YWx1ZSk7XG5cdH1cblxuXHRwcml2YXRlIGdldEFic29sdXRlVmFsdWUxICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLCBjdXJyZW50OiBudW1iZXIsIHNldHVwOiBudW1iZXIpIHtcblx0XHRpZiAodGltZSA8IHRoaXMuZnJhbWVzWzBdKSByZXR1cm4gZnJvbVNldHVwID8gc2V0dXAgOiBjdXJyZW50O1xuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJ2ZVZhbHVlKHRpbWUpO1xuXHRcdHJldHVybiBmcm9tU2V0dXAgPyBzZXR1cCArIChhZGQgPyB2YWx1ZSA6IHZhbHVlIC0gc2V0dXApICogYWxwaGEgOiBjdXJyZW50ICsgKGFkZCA/IHZhbHVlIDogdmFsdWUgLSBjdXJyZW50KSAqIGFscGhhO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRBYnNvbHV0ZVZhbHVlMiAodGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbiwgY3VycmVudDogbnVtYmVyLCBzZXR1cDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG5cdFx0aWYgKHRpbWUgPCB0aGlzLmZyYW1lc1swXSkgcmV0dXJuIGZyb21TZXR1cCA/IHNldHVwIDogY3VycmVudDtcblx0XHRyZXR1cm4gZnJvbVNldHVwID8gc2V0dXAgKyAoYWRkID8gdmFsdWUgOiB2YWx1ZSAtIHNldHVwKSAqIGFscGhhIDogY3VycmVudCArIChhZGQgPyB2YWx1ZSA6IHZhbHVlIC0gY3VycmVudCkgKiBhbHBoYTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgZm9yIHNjYWxlIHByb3BlcnRpZXMuIFRoZSB0aW1lbGluZSBhbmQgc2V0dXAgdmFsdWVzIGFyZSBtdWx0aXBsaWVkIGFuZCBzaWduIGFkanVzdGVkLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFRpbWVsaW5lLmFwcGx5fS5cblx0ICogQHBhcmFtIGN1cnJlbnQgVGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHNldHVwIFRoZSBzZXR1cCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LiAqL1xuXHRnZXRTY2FsZVZhbHVlICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlcikge1xuXHRcdGlmICh0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHJldHVybiBmcm9tU2V0dXAgPyBzZXR1cCA6IGN1cnJlbnQ7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldEN1cnZlVmFsdWUodGltZSkgKiBzZXR1cDtcblx0XHRpZiAoYWxwaGEgPT09IDEgJiYgIWFkZCkgcmV0dXJuIHZhbHVlO1xuXHRcdGxldCBiYXNlID0gZnJvbVNldHVwID8gc2V0dXAgOiBjdXJyZW50O1xuXHRcdGlmIChhZGQpIHJldHVybiBiYXNlICsgKHZhbHVlIC0gc2V0dXApICogYWxwaGE7XG5cdFx0aWYgKG91dCkgcmV0dXJuIGJhc2UgKyAoTWF0aC5hYnModmFsdWUpICogTWF0aC5zaWduKGJhc2UpIC0gYmFzZSkgKiBhbHBoYTtcblx0XHRiYXNlID0gTWF0aC5hYnMoYmFzZSkgKiBNYXRoLnNpZ24odmFsdWUpO1xuXHRcdHJldHVybiBiYXNlICsgKHZhbHVlIC0gYmFzZSkgKiBhbHBoYTtcblx0fVxufVxuXG4vKiogQW4gaW50ZXJmYWNlIGZvciB0aW1lbGluZXMgdGhhdCBjaGFuZ2UgYSBib25lJ3MgcHJvcGVydGllcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9uZVRpbWVsaW5lIHtcblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgYm9uZSBpbiB7QGxpbmsgU2tlbGV0b24uYm9uZXN9IHRoYXQgaXMgY2hhbmdlZCBieSB0aGlzIHRpbWVsaW5lLiAqL1xuXHRib25lSW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9uZVRpbWVsaW5lIChvYmo6IFRpbWVsaW5lICYgUGFydGlhbDxCb25lVGltZWxpbmU+KTogb2JqIGlzIFRpbWVsaW5lICYgQm9uZVRpbWVsaW5lIHtcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqLmJvbmVJbmRleCA9PT0gJ251bWJlcic7XG59XG5cbi8qKiBUaGUgYmFzZSBjbGFzcyBmb3IgdGltZWxpbmVzIHRoYXQgY2hhbmdlIDEgYm9uZSBwcm9wZXJ0eSB3aXRoIGEgY3VydmUuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQm9uZVRpbWVsaW5lMSBleHRlbmRzIEN1cnZlVGltZWxpbmUxIGltcGxlbWVudHMgQm9uZVRpbWVsaW5lIHtcblx0cmVhZG9ubHkgYm9uZUluZGV4OiBudW1iZXI7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIsIHByb3BlcnR5OiBQcm9wZXJ0eSkge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBgJHtwcm9wZXJ0eX18JHtib25lSW5kZXh9YCk7XG5cdFx0dGhpcy5ib25lSW5kZXggPSBib25lSW5kZXg7XG5cdFx0dGhpcy5hZGRpdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgYXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblx0XHRjb25zdCBib25lID0gc2tlbGV0b24uYm9uZXNbdGhpcy5ib25lSW5kZXhdO1xuXHRcdGlmIChib25lLmFjdGl2ZSlcblx0XHRcdHRoaXMuYXBwbHkxKGFwcGxpZWRQb3NlID8gYm9uZS5hcHBsaWVkUG9zZSA6IGJvbmUucG9zZSwgYm9uZS5kYXRhLnNldHVwUG9zZSwgdGltZSwgYWxwaGEsIGZyb21TZXR1cCwgYWRkLCBvdXQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGFwcGx5MSAocG9zZTogQm9uZVBvc2UsIHNldHVwOiBCb25lUG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIHRpbWVsaW5lcyB0aGF0IGNoYW5nZSB0d28gYm9uZSBwcm9wZXJ0aWVzIHdpdGggYSBjdXJ2ZS4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCb25lVGltZWxpbmUyIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIEJvbmVUaW1lbGluZSB7XG5cdHJlYWRvbmx5IGJvbmVJbmRleDtcblxuXHQvKiogQHBhcmFtIGJlemllckNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiBCZXppZXIgY3VydmVzLiBTZWUge0BsaW5rIHNocmlua30uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eUlkcyBVbmlxdWUgaWRlbnRpZmllcnMgZm9yIHRoZSBwcm9wZXJ0aWVzIHRoZSB0aW1lbGluZSBtb2RpZmllcy4gKi9cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIsIHByb3BlcnR5MTogUHJvcGVydHksIHByb3BlcnR5MjogUHJvcGVydHkpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYCR7cHJvcGVydHkxfXwke2JvbmVJbmRleH1gLCBgJHtwcm9wZXJ0eTJ9fCR7Ym9uZUluZGV4fWApO1xuXHRcdHRoaXMuYm9uZUluZGV4ID0gYm9uZUluZGV4O1xuXHRcdHRoaXMuYWRkaXRpdmUgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gMy8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgYW5kIHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHZhbHVlMTogbnVtYmVyLCB2YWx1ZTI6IG51bWJlcikge1xuXHRcdGZyYW1lICo9IDMvKkVOVFJJRVMqLztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qVkFMVUUxKi9dID0gdmFsdWUxO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMi8qVkFMVUUyKi9dID0gdmFsdWUyO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBib25lID0gc2tlbGV0b24uYm9uZXNbdGhpcy5ib25lSW5kZXhdO1xuXHRcdGlmIChib25lLmFjdGl2ZSlcblx0XHRcdHRoaXMuYXBwbHkxKGFwcGxpZWRQb3NlID8gYm9uZS5hcHBsaWVkUG9zZSA6IGJvbmUucG9zZSwgYm9uZS5kYXRhLnNldHVwUG9zZSwgdGltZSwgYWxwaGEsIGZyb21TZXR1cCwgYWRkLCBvdXQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGFwcGx5MSAocG9zZTogQm9uZVBvc2UsIHNldHVwOiBCb25lUG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4sKTogdm9pZDtcbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmVQb3NlLnJvdGF0aW9ufS4gKi9cbmV4cG9ydCBjbGFzcyBSb3RhdGVUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LnJvdGF0ZSk7XG5cdH1cblxuXHRhcHBseTEgKHBvc2U6IEJvbmVQb3NlLCBzZXR1cDogQm9uZVBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sXG5cdFx0b3V0OiBib29sZWFuKSB7XG5cdFx0cG9zZS5yb3RhdGlvbiA9IHRoaXMuZ2V0UmVsYXRpdmVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIHBvc2Uucm90YXRpb24sIHNldHVwLnJvdGF0aW9uKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgQm9uZVBvc2UueH0gYW5kIHtAbGluayBCb25lUG9zZS55fS4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTIge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LngsIFByb3BlcnR5LnkpO1xuXHR9XG5cblx0YXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdHBvc2UueCA9IHNldHVwLng7XG5cdFx0XHRcdHBvc2UueSA9IHNldHVwLnk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHggPSAwLCB5ID0gMDtcblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgMy8qRU5UUklFUyovKTtcblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpIC8gMy8qRU5UUklFUyovXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzoge1xuXHRcdFx0XHRjb25zdCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDEvKlZBTFVFMSovXTtcblx0XHRcdFx0eSA9IGZyYW1lc1tpICsgMi8qVkFMVUUyKi9dO1xuXHRcdFx0XHRjb25zdCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHggKz0gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovICsgMS8qVkFMVUUxKi9dIC0geCkgKiB0O1xuXHRcdFx0XHR5ICs9IChmcmFtZXNbaSArIDMvKkVOVFJJRVMqLyArIDIvKlZBTFVFMiovXSAtIHkpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0eCA9IGZyYW1lc1tpICsgMS8qVkFMVUUxKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAyLypWQUxVRTIqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0eCA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qVkFMVUUxKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0eSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMi8qVkFMVUUyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdH1cblxuXHRcdGlmIChmcm9tU2V0dXApIHtcblx0XHRcdHBvc2UueCA9IHNldHVwLnggKyB4ICogYWxwaGE7XG5cdFx0XHRwb3NlLnkgPSBzZXR1cC55ICsgeSAqIGFscGhhO1xuXHRcdH0gZWxzZSBpZiAoYWRkKSB7XG5cdFx0XHRwb3NlLnggKz0geCAqIGFscGhhO1xuXHRcdFx0cG9zZS55ICs9IHkgKiBhbHBoYTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zZS54ICs9IChzZXR1cC54ICsgeCAtIHBvc2UueCkgKiBhbHBoYTtcblx0XHRcdHBvc2UueSArPSAoc2V0dXAueSArIHkgLSBwb3NlLnkpICogYWxwaGE7XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBCb25lUG9zZS54fS4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVYVGltZWxpbmUgZXh0ZW5kcyBCb25lVGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYm9uZUluZGV4LCBQcm9wZXJ0eS54KTtcblx0fVxuXG5cdHByb3RlY3RlZCBhcHBseTEgKHBvc2U6IEJvbmVQb3NlLCBzZXR1cDogQm9uZVBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sXG5cdFx0b3V0OiBib29sZWFuKSB7XG5cdFx0cG9zZS54ID0gdGhpcy5nZXRSZWxhdGl2ZVZhbHVlKHRpbWUsIGFscGhhLCBmcm9tU2V0dXAsIGFkZCwgcG9zZS54LCBzZXR1cC54KTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgQm9uZVBvc2UueX0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlWVRpbWVsaW5lIGV4dGVuZHMgQm9uZVRpbWVsaW5lMSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGJvbmVJbmRleCwgUHJvcGVydHkueSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdHBvc2UueSA9IHRoaXMuZ2V0UmVsYXRpdmVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIHBvc2UueSwgc2V0dXAueSk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmVQb3NlLnNjYWxlWH0gYW5kIHtAbGluayBCb25lUG9zZS5zY2FsZVl9LiAqL1xuZXhwb3J0IGNsYXNzIFNjYWxlVGltZWxpbmUgZXh0ZW5kcyBCb25lVGltZWxpbmUyIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYm9uZUluZGV4LCBQcm9wZXJ0eS5zY2FsZVgsIFByb3BlcnR5LnNjYWxlWSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdHBvc2Uuc2NhbGVYID0gc2V0dXAuc2NhbGVYO1xuXHRcdFx0XHRwb3NlLnNjYWxlWSA9IHNldHVwLnNjYWxlWTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgeDogbnVtYmVyLCB5OiBudW1iZXI7XG5cdFx0Y29uc3QgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDMvKkVOVFJJRVMqLyk7XG5cdFx0Y29uc3QgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSAvIDMvKkVOVFJJRVMqL107XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0Y29uc3QgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDMvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHR4ICs9IChmcmFtZXNbaSArIDMvKkVOVFJJRVMqLyArIDEvKlZBTFVFMSovXSAtIHgpICogdDtcblx0XHRcdFx0eSArPSAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi8gKyAyLypWQUxVRTIqL10gLSB5KSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDEvKlZBTFVFMSovXTtcblx0XHRcdFx0eSA9IGZyYW1lc1tpICsgMi8qVkFMVUUyKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHggPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKlZBTFVFMSovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHkgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKlZBTFVFMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cdFx0eCAqPSBzZXR1cC5zY2FsZVg7XG5cdFx0eSAqPSBzZXR1cC5zY2FsZVk7XG5cblx0XHRpZiAoYWxwaGEgPT09IDEgJiYgIWFkZCkge1xuXHRcdFx0cG9zZS5zY2FsZVggPSB4O1xuXHRcdFx0cG9zZS5zY2FsZVkgPSB5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgYnggPSAwLCBieSA9IDA7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdGJ4ID0gc2V0dXAuc2NhbGVYO1xuXHRcdFx0XHRieSA9IHNldHVwLnNjYWxlWTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ4ID0gcG9zZS5zY2FsZVg7XG5cdFx0XHRcdGJ5ID0gcG9zZS5zY2FsZVk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYWRkKSB7XG5cdFx0XHRcdHBvc2Uuc2NhbGVYID0gYnggKyAoeCAtIHNldHVwLnNjYWxlWCkgKiBhbHBoYTtcblx0XHRcdFx0cG9zZS5zY2FsZVkgPSBieSArICh5IC0gc2V0dXAuc2NhbGVZKSAqIGFscGhhO1xuXHRcdFx0fSBlbHNlIGlmIChvdXQpIHtcblx0XHRcdFx0cG9zZS5zY2FsZVggPSBieCArIChNYXRoLmFicyh4KSAqIE1hdGguc2lnbihieCkgLSBieCkgKiBhbHBoYTtcblx0XHRcdFx0cG9zZS5zY2FsZVkgPSBieSArIChNYXRoLmFicyh5KSAqIE1hdGguc2lnbihieSkgLSBieSkgKiBhbHBoYTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ4ID0gTWF0aC5hYnMoYngpICogTWF0aC5zaWduKHgpO1xuXHRcdFx0XHRieSA9IE1hdGguYWJzKGJ5KSAqIE1hdGguc2lnbih5KTtcblx0XHRcdFx0cG9zZS5zY2FsZVggPSBieCArICh4IC0gYngpICogYWxwaGE7XG5cdFx0XHRcdHBvc2Uuc2NhbGVZID0gYnkgKyAoeSAtIGJ5KSAqIGFscGhhO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhIHtAbGluayBCb25lUG9zZS5zY2FsZVh9LiAqL1xuZXhwb3J0IGNsYXNzIFNjYWxlWFRpbWVsaW5lIGV4dGVuZHMgQm9uZVRpbWVsaW5lMSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGJvbmVJbmRleCwgUHJvcGVydHkuc2NhbGVYKTtcblx0fVxuXG5cdHByb3RlY3RlZCBhcHBseTEgKHBvc2U6IEJvbmVQb3NlLCBzZXR1cDogQm9uZVBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sXG5cdFx0b3V0OiBib29sZWFuKSB7XG5cdFx0cG9zZS5zY2FsZVggPSB0aGlzLmdldFNjYWxlVmFsdWUodGltZSwgYWxwaGEsIGZyb21TZXR1cCwgYWRkLCBvdXQsIHBvc2Uuc2NhbGVYLCBzZXR1cC5zY2FsZVgpO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEge0BsaW5rIEJvbmVQb3NlLnNjYWxlWX0uICovXG5leHBvcnQgY2xhc3MgU2NhbGVZVGltZWxpbmUgZXh0ZW5kcyBCb25lVGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYm9uZUluZGV4LCBQcm9wZXJ0eS5zY2FsZVkpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFwcGx5MSAocG9zZTogQm9uZVBvc2UsIHNldHVwOiBCb25lUG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4pIHtcblx0XHRwb3NlLnNjYWxlWSA9IHRoaXMuZ2V0U2NhbGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIG91dCwgcG9zZS5zY2FsZVksIHNldHVwLnNjYWxlWSk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmUuc2hlYXJYfSBhbmQge0BsaW5rIEJvbmUuc2hlYXJZfS4gKi9cbmV4cG9ydCBjbGFzcyBTaGVhclRpbWVsaW5lIGV4dGVuZHMgQm9uZVRpbWVsaW5lMiB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGJvbmVJbmRleCwgUHJvcGVydHkuc2hlYXJYLCBQcm9wZXJ0eS5zaGVhclkpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFwcGx5MSAocG9zZTogQm9uZVBvc2UsIHNldHVwOiBCb25lUG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCkge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdHBvc2Uuc2hlYXJYID0gc2V0dXAuc2hlYXJYO1xuXHRcdFx0XHRwb3NlLnNoZWFyWSA9IHNldHVwLnNoZWFyWTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgeCA9IDAsIHkgPSAwO1xuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCAzLypFTlRSSUVTKi8pO1xuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyAzLypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0eCA9IGZyYW1lc1tpICsgMS8qVkFMVUUxKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAyLypWQUxVRTIqL107XG5cdFx0XHRcdGNvbnN0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0eCArPSAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi8gKyAxLypWQUxVRTEqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovICsgMi8qVkFMVUUyKi9dIC0geSkgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypWQUxVRTEqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypWQUxVRTIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0aWYgKGZyb21TZXR1cCkge1xuXHRcdFx0cG9zZS5zaGVhclggPSBzZXR1cC5zaGVhclggKyB4ICogYWxwaGE7XG5cdFx0XHRwb3NlLnNoZWFyWSA9IHNldHVwLnNoZWFyWSArIHkgKiBhbHBoYTtcblx0XHR9IGVsc2UgaWYgKGFkZCkge1xuXHRcdFx0cG9zZS5zaGVhclggKz0geCAqIGFscGhhO1xuXHRcdFx0cG9zZS5zaGVhclkgKz0geSAqIGFscGhhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwb3NlLnNoZWFyWCArPSAoc2V0dXAuc2hlYXJYICsgeCAtIHBvc2Uuc2hlYXJYKSAqIGFscGhhO1xuXHRcdFx0cG9zZS5zaGVhclkgKz0gKHNldHVwLnNoZWFyWSArIHkgLSBwb3NlLnNoZWFyWSkgKiBhbHBoYTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmUuc2hlYXJYfSBhbmQge0BsaW5rIEJvbmUuc2hlYXJZfS4gKi9cbmV4cG9ydCBjbGFzcyBTaGVhclhUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LnNoZWFyWCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdHBvc2Uuc2hlYXJYID0gdGhpcy5nZXRSZWxhdGl2ZVZhbHVlKHRpbWUsIGFscGhhLCBmcm9tU2V0dXAsIGFkZCwgcG9zZS5zaGVhclgsIHNldHVwLnNoZWFyWCk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmUuc2hlYXJYfSBhbmQge0BsaW5rIEJvbmUuc2hlYXJZfS4gKi9cbmV4cG9ydCBjbGFzcyBTaGVhcllUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LnNoZWFyWSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdHBvc2Uuc2hlYXJZID0gdGhpcy5nZXRSZWxhdGl2ZVZhbHVlKHRpbWUsIGFscGhhLCBmcm9tU2V0dXAsIGFkZCwgcG9zZS5zaGVhclksIHNldHVwLnNoZWFyWSk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmVQb3NlLmluaGVyaXR9LiAqL1xuZXhwb3J0IGNsYXNzIEluaGVyaXRUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIGltcGxlbWVudHMgQm9uZVRpbWVsaW5lIHtcblx0cmVhZG9ubHkgYm9uZUluZGV4OiBudW1iZXI7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBgJHtQcm9wZXJ0eS5pbmhlcml0fXwke2JvbmVJbmRleH1gKTtcblx0XHR0aGlzLmJvbmVJbmRleCA9IGJvbmVJbmRleDtcblx0XHR0aGlzLmluc3RhbnQgPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDIvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSBpbmhlcml0IHRyYW5zZm9ybSBtb2RlIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCBgZnJhbWVDb3VudGAsIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIHRpbWUgVGhlIGZyYW1lIHRpbWUgaW4gc2Vjb25kcy4gKi9cblx0cHVibGljIHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGluaGVyaXQ6IEluaGVyaXQpIHtcblx0XHRmcmFtZSAqPSAyLypFTlRSSUVTKi87XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWVdID0gdGltZTtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDEvKklOSEVSSVQqL10gPSBpbmhlcml0O1xuXHR9XG5cblx0cHVibGljIGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbixcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbi5ib25lc1t0aGlzLmJvbmVJbmRleF07XG5cdFx0aWYgKCFib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IGJvbmUuYXBwbGllZFBvc2UgOiBib25lLnBvc2U7XG5cblx0XHRpZiAob3V0KSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSBwb3NlLmluaGVyaXQgPSBib25lLmRhdGEuc2V0dXBQb3NlLmluaGVyaXQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdFx0aWYgKGZyb21TZXR1cCkgcG9zZS5pbmhlcml0ID0gYm9uZS5kYXRhLnNldHVwUG9zZS5pbmhlcml0O1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdHBvc2UuaW5oZXJpdCA9IHRoaXMuZnJhbWVzW1RpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDIvKkVOVFJJRVMqLykgKyAxLypJTkhFUklUKi9dO1xuXHRcdH1cblx0fVxufVxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciB0aW1lbGluZXMgdGhhdCBjaGFuZ2UgYW55IG51bWJlciBvZiBzbG90IHByb3BlcnRpZXMgd2l0aCBhIGN1cnZlLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNsb3RDdXJ2ZVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHJlYWRvbmx5IHNsb3RJbmRleDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyLCAuLi5wcm9wZXJ0eUlkczogc3RyaW5nW10pIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgLi4ucHJvcGVydHlJZHMpO1xuXHRcdHRoaXMuc2xvdEluZGV4ID0gc2xvdEluZGV4O1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uLnNsb3RzW3RoaXMuc2xvdEluZGV4XTtcblx0XHRpZiAoc2xvdC5ib25lLmFjdGl2ZSkgdGhpcy5hcHBseTEoc2xvdCwgYXBwbGllZFBvc2UgPyBzbG90LmFwcGxpZWRQb3NlIDogc2xvdC5wb3NlLCB0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGFwcGx5MSAoc2xvdDogU2xvdCwgcG9zZTogU2xvdFBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgU2xvdFBvc2UuY29sb3J9LiAqL1xuZXhwb3J0IGNsYXNzIFJHQkFUaW1lbGluZSBleHRlbmRzIFNsb3RDdXJ2ZVRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgc2xvdEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgc2xvdEluZGV4LCAvL1xuXHRcdFx0YCR7UHJvcGVydHkucmdifXwke3Nsb3RJbmRleH1gLCAvL1xuXHRcdFx0YCR7UHJvcGVydHkuYWxwaGF9fCR7c2xvdEluZGV4fWApO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gNS8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcywgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyKSB7XG5cdFx0ZnJhbWUgKj0gNS8qRU5UUklFUyovO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypSKi9dID0gcjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKkcqL10gPSBnO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQiovXSA9IGI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA0LypBKi9dID0gYTtcblx0fVxuXG5cdHByb3RlY3RlZCBhcHBseTEgKHNsb3Q6IFNsb3QsIHBvc2U6IFNsb3RQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuKSB7XG5cdFx0Y29uc3QgY29sb3IgPSBwb3NlLmNvbG9yO1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSBjb2xvci5zZXRGcm9tQ29sb3Ioc2xvdC5kYXRhLnNldHVwUG9zZS5jb2xvcik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwO1xuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA1LypFTlRSSUVTKi8pO1xuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyA1LypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0ciA9IGZyYW1lc1tpICsgMS8qUiovXTtcblx0XHRcdFx0ZyA9IGZyYW1lc1tpICsgMi8qRyovXTtcblx0XHRcdFx0YiA9IGZyYW1lc1tpICsgMy8qQiovXTtcblx0XHRcdFx0YSA9IGZyYW1lc1tpICsgNC8qQSovXTtcblx0XHRcdFx0Y29uc3QgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDUvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHRyICs9IChmcmFtZXNbaSArIDUvKkVOVFJJRVMqLyArIDEvKlIqL10gLSByKSAqIHQ7XG5cdFx0XHRcdGcgKz0gKGZyYW1lc1tpICsgNS8qRU5UUklFUyovICsgMi8qRyovXSAtIGcpICogdDtcblx0XHRcdFx0YiArPSAoZnJhbWVzW2kgKyA1LypFTlRSSUVTKi8gKyAzLypCKi9dIC0gYikgKiB0O1xuXHRcdFx0XHRhICs9IChmcmFtZXNbaSArIDUvKkVOVFJJRVMqLyArIDQvKkEqL10gLSBhKSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdGEgPSBmcmFtZXNbaSArIDQvKkEqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ciA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUiovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKkcqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDMvKkIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAyIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRhID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA0LypBKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMyAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cdFx0aWYgKGFscGhhID09PSAxKVxuXHRcdFx0Y29sb3Iuc2V0KHIsIGcsIGIsIGEpO1xuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKGZyb21TZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IHNsb3QuZGF0YS5zZXR1cFBvc2UuY29sb3I7XG5cdFx0XHRcdGNvbG9yLnNldChzZXR1cC5yICsgKHIgLSBzZXR1cC5yKSAqIGFscGhhLCBzZXR1cC5nICsgKGcgLSBzZXR1cC5nKSAqIGFscGhhLCBzZXR1cC5iICsgKGIgLSBzZXR1cC5iKSAqIGFscGhhLFxuXHRcdFx0XHRcdHNldHVwLmEgKyAoYSAtIHNldHVwLmEpICogYWxwaGEpO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdGNvbG9yLmFkZCgociAtIGNvbG9yLnIpICogYWxwaGEsIChnIC0gY29sb3IuZykgKiBhbHBoYSwgKGIgLSBjb2xvci5iKSAqIGFscGhhLCAoYSAtIGNvbG9yLmEpICogYWxwaGEpO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyBSR0IgZm9yIGEgc2xvdCdzIHtAbGluayBTbG90UG9zZS5jb2xvcn0uICovXG5leHBvcnQgY2xhc3MgUkdCVGltZWxpbmUgZXh0ZW5kcyBTbG90Q3VydmVUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIHNsb3RJbmRleCwgYCR7UHJvcGVydHkucmdifXwke3Nsb3RJbmRleH1gKTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDQvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMsIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcblx0XHRmcmFtZSA8PD0gMjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qUiovXSA9IHI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAyLypHKi9dID0gZztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDMvKkIqL10gPSBiO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFwcGx5MSAoc2xvdDogU2xvdCwgcG9zZTogU2xvdFBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4pIHtcblx0XHRjb25zdCBjb2xvciA9IHBvc2UuY29sb3I7XG5cdFx0bGV0IHIgPSAwLCBnID0gMCwgYiA9IDA7XG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGlmIChmcm9tU2V0dXApIHtcblx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBzbG90LmRhdGEuc2V0dXBQb3NlLmNvbG9yO1xuXHRcdFx0XHRjb2xvci5yID0gc2V0dXAucjtcblx0XHRcdFx0Y29sb3IuZyA9IHNldHVwLmc7XG5cdFx0XHRcdGNvbG9yLmIgPSBzZXR1cC5iO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA0LypFTlRSSUVTKi8pO1xuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgPj4gMl07XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHRyID0gZnJhbWVzW2kgKyAxLypSKi9dO1xuXHRcdFx0XHRnID0gZnJhbWVzW2kgKyAyLypHKi9dO1xuXHRcdFx0XHRiID0gZnJhbWVzW2kgKyAzLypCKi9dO1xuXHRcdFx0XHRjb25zdCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHIgKz0gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovICsgMS8qUiovXSAtIHIpICogdDtcblx0XHRcdFx0ZyArPSAoZnJhbWVzW2kgKyA0LypFTlRSSUVTKi8gKyAyLypHKi9dIC0gZykgKiB0O1xuXHRcdFx0XHRiICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDMvKkIqL10gLSBiKSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ciA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUiovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKkcqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDMvKkIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAyIC0gMi8qQkVaSUVSKi8pO1xuXHRcdH1cblx0XHRpZiAoYWxwaGEgIT09IDEpIHtcblx0XHRcdGlmIChmcm9tU2V0dXApIHtcblx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBzbG90LmRhdGEuc2V0dXBQb3NlLmNvbG9yO1xuXHRcdFx0XHRyID0gc2V0dXAuciArIChyIC0gc2V0dXAucikgKiBhbHBoYTtcblx0XHRcdFx0ZyA9IHNldHVwLmcgKyAoZyAtIHNldHVwLmcpICogYWxwaGE7XG5cdFx0XHRcdGIgPSBzZXR1cC5iICsgKGIgLSBzZXR1cC5iKSAqIGFscGhhO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ciA9IGNvbG9yLnIgKyAociAtIGNvbG9yLnIpICogYWxwaGE7XG5cdFx0XHRcdGcgPSBjb2xvci5nICsgKGcgLSBjb2xvci5nKSAqIGFscGhhO1xuXHRcdFx0XHRiID0gY29sb3IuYiArIChiIC0gY29sb3IuYikgKiBhbHBoYTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29sb3IuciA9IHIgPCAwID8gMCA6IChyID4gMSA/IDEgOiByKTtcblx0XHRjb2xvci5nID0gZyA8IDAgPyAwIDogKGcgPiAxID8gMSA6IGcpO1xuXHRcdGNvbG9yLmIgPSBiIDwgMCA/IDAgOiAoYiA+IDEgPyAxIDogYik7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYWxwaGEgZm9yIGEgc2xvdCdzIHtAbGluayBTbG90UG9zZS5jb2xvcn0uICovXG5leHBvcnQgY2xhc3MgQWxwaGFUaW1lbGluZSBleHRlbmRzIEN1cnZlVGltZWxpbmUxIGltcGxlbWVudHMgU2xvdFRpbWVsaW5lIHtcblx0c2xvdEluZGV4ID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBgJHtQcm9wZXJ0eS5hbHBoYX18JHtzbG90SW5kZXh9YCk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sXG5cdFx0YWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cblx0XHRjb25zdCBzbG90ID0gc2tlbGV0b24uc2xvdHNbdGhpcy5zbG90SW5kZXhdO1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY29sb3IgPSAoYXBwbGllZFBvc2UgPyBzbG90LmFwcGxpZWRQb3NlIDogc2xvdC5wb3NlKS5jb2xvcjtcblx0XHRsZXQgYSA9IDA7XG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGlmIChmcm9tU2V0dXApIGNvbG9yLmEgPSBzbG90LmRhdGEuc2V0dXBQb3NlLmNvbG9yLmE7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YSA9IHRoaXMuZ2V0Q3VydmVWYWx1ZSh0aW1lKTtcblx0XHRpZiAoYWxwaGEgIT09IDEpIHtcblx0XHRcdGlmIChmcm9tU2V0dXApIHtcblx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBzbG90LmRhdGEuc2V0dXBQb3NlLmNvbG9yO1xuXHRcdFx0XHRhID0gc2V0dXAuYSArIChhIC0gc2V0dXAuYSkgKiBhbHBoYTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0XHRhID0gY29sb3IuYSArIChhIC0gY29sb3IuYSkgKiBhbHBoYTtcblx0XHR9XG5cdFx0Y29sb3IuYSA9IGEgPCAwID8gMCA6IChhID4gMSA/IDEgOiBhKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgU2xvdFBvc2UuY29sb3J9IGFuZCB7QGxpbmsgU2xvdFBvc2UuZGFya0NvbG9yfSBmb3IgdHdvIGNvbG9yIHRpbnRpbmcuICovXG5leHBvcnQgY2xhc3MgUkdCQTJUaW1lbGluZSBleHRlbmRzIFNsb3RDdXJ2ZVRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgc2xvdEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgc2xvdEluZGV4LCAvL1xuXHRcdFx0YCR7UHJvcGVydHkucmdifXwke3Nsb3RJbmRleH1gLCAvL1xuXHRcdFx0YCR7UHJvcGVydHkuYWxwaGF9fCR7c2xvdEluZGV4fWAsIC8vXG5cdFx0XHRgJHtQcm9wZXJ0eS5yZ2IyfXwke3Nsb3RJbmRleH1gKTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDgvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMsIGxpZ2h0LCBhbmQgZGFyayBjb2xvcnMgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIsIHIyOiBudW1iZXIsIGcyOiBudW1iZXIsIGIyOiBudW1iZXIpIHtcblx0XHRmcmFtZSA8PD0gMztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qUiovXSA9IHI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAyLypHKi9dID0gZztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDMvKkIqL10gPSBiO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNC8qQSovXSA9IGE7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA1LypSMiovXSA9IHIyO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNi8qRzIqL10gPSBnMjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDcvKkIyKi9dID0gYjI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChzbG90OiBTbG90LCBwb3NlOiBTbG90UG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbikge1xuXHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRjb25zdCBsaWdodCA9IHBvc2UuY29sb3IsIGRhcmsgPSBwb3NlLmRhcmtDb2xvciE7XG5cdFx0bGV0IHIyID0gMCwgZzIgPSAwLCBiMiA9IDBcblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0aWYgKGZyb21TZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IHNsb3QuZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRcdGxpZ2h0LnNldEZyb21Db2xvcihzZXR1cC5jb2xvcik7XG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdFx0Y29uc3Qgc2V0dXBEYXJrID0gc2V0dXAuZGFya0NvbG9yITtcblx0XHRcdFx0ZGFyay5yID0gc2V0dXBEYXJrLnI7XG5cdFx0XHRcdGRhcmsuZyA9IHNldHVwRGFyay5nO1xuXHRcdFx0XHRkYXJrLmIgPSBzZXR1cERhcmsuYjtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7XG5cdFx0Y29uc3QgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDgvKkVOVFJJRVMqLyk7XG5cdFx0Y29uc3QgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSA+PiAzXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzoge1xuXHRcdFx0XHRjb25zdCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdGEgPSBmcmFtZXNbaSArIDQvKkEqL107XG5cdFx0XHRcdHIyID0gZnJhbWVzW2kgKyA1LypSMiovXTtcblx0XHRcdFx0ZzIgPSBmcmFtZXNbaSArIDYvKkcyKi9dO1xuXHRcdFx0XHRiMiA9IGZyYW1lc1tpICsgNy8qQjIqL107XG5cdFx0XHRcdGNvbnN0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0ciArPSAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi8gKyAxLypSKi9dIC0gcikgKiB0O1xuXHRcdFx0XHRnICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDIvKkcqL10gLSBnKSAqIHQ7XG5cdFx0XHRcdGIgKz0gKGZyYW1lc1tpICsgOC8qRU5UUklFUyovICsgMy8qQiovXSAtIGIpICogdDtcblx0XHRcdFx0YSArPSAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi8gKyA0LypBKi9dIC0gYSkgKiB0O1xuXHRcdFx0XHRyMiArPSAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi8gKyA1LypSMiovXSAtIHIyKSAqIHQ7XG5cdFx0XHRcdGcyICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDYvKkcyKi9dIC0gZzIpICogdDtcblx0XHRcdFx0YjIgKz0gKGZyYW1lc1tpICsgOC8qRU5UUklFUyovICsgNy8qQjIqL10gLSBiMikgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHRyID0gZnJhbWVzW2kgKyAxLypSKi9dO1xuXHRcdFx0XHRnID0gZnJhbWVzW2kgKyAyLypHKi9dO1xuXHRcdFx0XHRiID0gZnJhbWVzW2kgKyAzLypCKi9dO1xuXHRcdFx0XHRhID0gZnJhbWVzW2kgKyA0LypBKi9dO1xuXHRcdFx0XHRyMiA9IGZyYW1lc1tpICsgNS8qUjIqL107XG5cdFx0XHRcdGcyID0gZnJhbWVzW2kgKyA2LypHMiovXTtcblx0XHRcdFx0YjIgPSBmcmFtZXNbaSArIDcvKkIyKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKlIqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRnID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypHKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRiID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypCKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0YSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNC8qQSovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDMgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHIyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA1LypSMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDQgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA2LypHMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA3LypCMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDYgLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFscGhhID09PSAxKVxuXHRcdFx0bGlnaHQuc2V0KHIsIGcsIGIsIGEpO1xuXHRcdGVsc2UgaWYgKGZyb21TZXR1cCkge1xuXHRcdFx0Y29uc3Qgc2V0dXBQb3NlID0gc2xvdC5kYXRhLnNldHVwUG9zZTtcblx0XHRcdGxldCBzZXR1cCA9IHNldHVwUG9zZS5jb2xvcjtcblx0XHRcdGxpZ2h0LnNldChzZXR1cC5yICsgKHIgLSBzZXR1cC5yKSAqIGFscGhhLCBzZXR1cC5nICsgKGcgLSBzZXR1cC5nKSAqIGFscGhhLCBzZXR1cC5iICsgKGIgLSBzZXR1cC5iKSAqIGFscGhhLFxuXHRcdFx0XHRzZXR1cC5hICsgKGEgLSBzZXR1cC5hKSAqIGFscGhhKTtcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdHNldHVwID0gc2V0dXBQb3NlLmRhcmtDb2xvciE7XG5cdFx0XHRyMiA9IHNldHVwLnIgKyAocjIgLSBzZXR1cC5yKSAqIGFscGhhO1xuXHRcdFx0ZzIgPSBzZXR1cC5nICsgKGcyIC0gc2V0dXAuZykgKiBhbHBoYTtcblx0XHRcdGIyID0gc2V0dXAuYiArIChiMiAtIHNldHVwLmIpICogYWxwaGE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpZ2h0LmFkZCgociAtIGxpZ2h0LnIpICogYWxwaGEsIChnIC0gbGlnaHQuZykgKiBhbHBoYSwgKGIgLSBsaWdodC5iKSAqIGFscGhhLCAoYSAtIGxpZ2h0LmEpICogYWxwaGEpO1xuXHRcdFx0cjIgPSBkYXJrLnIgKyAocjIgLSBkYXJrLnIpICogYWxwaGE7XG5cdFx0XHRnMiA9IGRhcmsuZyArIChnMiAtIGRhcmsuZykgKiBhbHBoYTtcblx0XHRcdGIyID0gZGFyay5iICsgKGIyIC0gZGFyay5iKSAqIGFscGhhO1xuXHRcdH1cblx0XHRkYXJrLnIgPSByMiA8IDAgPyAwIDogKHIyID4gMSA/IDEgOiByMik7XG5cdFx0ZGFyay5nID0gZzIgPCAwID8gMCA6IChnMiA+IDEgPyAxIDogZzIpO1xuXHRcdGRhcmsuYiA9IGIyIDwgMCA/IDAgOiAoYjIgPiAxID8gMSA6IGIyKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgU2xvdFBvc2UuY29sb3J9IGFuZCB7QGxpbmsgU2xvdFBvc2UuZGFya0NvbG9yfSBmb3IgdHdvIGNvbG9yIHRpbnRpbmcuICovXG5leHBvcnQgY2xhc3MgUkdCMlRpbWVsaW5lIGV4dGVuZHMgU2xvdEN1cnZlVGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBzbG90SW5kZXgsIC8vXG5cdFx0XHRgJHtQcm9wZXJ0eS5yZ2J9fCR7c2xvdEluZGV4fWAsIC8vXG5cdFx0XHRgJHtQcm9wZXJ0eS5yZ2IyfXwke3Nsb3RJbmRleH1gKTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDcvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMsIGxpZ2h0LCBhbmQgZGFyayBjb2xvcnMgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCByMjogbnVtYmVyLCBnMjogbnVtYmVyLCBiMjogbnVtYmVyKSB7XG5cdFx0ZnJhbWUgKj0gNy8qRU5UUklFUyovO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypSKi9dID0gcjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKkcqL10gPSBnO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQiovXSA9IGI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA0LypSMiovXSA9IHIyO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNS8qRzIqL10gPSBnMjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDYvKkIyKi9dID0gYjI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChzbG90OiBTbG90LCBwb3NlOiBTbG90UG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbikge1xuXHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRjb25zdCBsaWdodCA9IHBvc2UuY29sb3IsIGRhcmsgPSBwb3NlLmRhcmtDb2xvciE7XG5cdFx0bGV0IHIgPSAwLCBnID0gMCwgYiA9IDAsIHIyID0gMCwgZzIgPSAwLCBiMiA9IDBcblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0aWYgKGZyb21TZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IHNsb3QuZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdFx0Y29uc3Qgc2V0dXBMaWdodCA9IHNldHVwLmNvbG9yLCBzZXR1cERhcmsgPSBzZXR1cC5kYXJrQ29sb3IhO1xuXHRcdFx0XHRsaWdodC5yID0gc2V0dXBMaWdodC5yO1xuXHRcdFx0XHRsaWdodC5nID0gc2V0dXBMaWdodC5nO1xuXHRcdFx0XHRsaWdodC5iID0gc2V0dXBMaWdodC5iO1xuXHRcdFx0XHRkYXJrLnIgPSBzZXR1cERhcmsucjtcblx0XHRcdFx0ZGFyay5nID0gc2V0dXBEYXJrLmc7XG5cdFx0XHRcdGRhcmsuYiA9IHNldHVwRGFyay5iO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA3LypFTlRSSUVTKi8pO1xuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyA3LypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0ciA9IGZyYW1lc1tpICsgMS8qUiovXTtcblx0XHRcdFx0ZyA9IGZyYW1lc1tpICsgMi8qRyovXTtcblx0XHRcdFx0YiA9IGZyYW1lc1tpICsgMy8qQiovXTtcblx0XHRcdFx0cjIgPSBmcmFtZXNbaSArIDQvKlIyKi9dO1xuXHRcdFx0XHRnMiA9IGZyYW1lc1tpICsgNS8qRzIqL107XG5cdFx0XHRcdGIyID0gZnJhbWVzW2kgKyA2LypCMiovXTtcblx0XHRcdFx0Y29uc3QgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDcvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHRyICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDEvKlIqL10gLSByKSAqIHQ7XG5cdFx0XHRcdGcgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgMi8qRyovXSAtIGcpICogdDtcblx0XHRcdFx0YiArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyAzLypCKi9dIC0gYikgKiB0O1xuXHRcdFx0XHRyMiArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyA0LypSMiovXSAtIHIyKSAqIHQ7XG5cdFx0XHRcdGcyICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDUvKkcyKi9dIC0gZzIpICogdDtcblx0XHRcdFx0YjIgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgNi8qQjIqL10gLSBiMikgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHRyID0gZnJhbWVzW2kgKyAxLypSKi9dO1xuXHRcdFx0XHRnID0gZnJhbWVzW2kgKyAyLypHKi9dO1xuXHRcdFx0XHRiID0gZnJhbWVzW2kgKyAzLypCKi9dO1xuXHRcdFx0XHRyMiA9IGZyYW1lc1tpICsgNC8qUjIqL107XG5cdFx0XHRcdGcyID0gZnJhbWVzW2kgKyA1LypHMiovXTtcblx0XHRcdFx0YjIgPSBmcmFtZXNbaSArIDYvKkIyKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKlIqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRnID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypHKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRiID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypCKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0cjIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDQvKlIyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0ZzIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDUvKkcyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNCAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0YjIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDYvKkIyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNSAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRpZiAoYWxwaGEgIT09IDEpIHtcblx0XHRcdGlmIChmcm9tU2V0dXApIHtcblx0XHRcdFx0Y29uc3Qgc2V0dXBQb3NlID0gc2xvdC5kYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0bGV0IHNldHVwID0gc2V0dXBQb3NlLmNvbG9yO1xuXHRcdFx0XHRyID0gc2V0dXAuciArIChyIC0gc2V0dXAucikgKiBhbHBoYTtcblx0XHRcdFx0ZyA9IHNldHVwLmcgKyAoZyAtIHNldHVwLmcpICogYWxwaGE7XG5cdFx0XHRcdGIgPSBzZXR1cC5iICsgKGIgLSBzZXR1cC5iKSAqIGFscGhhO1xuXHRcdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHJlZmVyZW5jZSBydW50aW1lXG5cdFx0XHRcdHNldHVwID0gc2V0dXBQb3NlLmRhcmtDb2xvciE7XG5cdFx0XHRcdHIyID0gc2V0dXAuciArIChyMiAtIHNldHVwLnIpICogYWxwaGE7XG5cdFx0XHRcdGcyID0gc2V0dXAuZyArIChnMiAtIHNldHVwLmcpICogYWxwaGE7XG5cdFx0XHRcdGIyID0gc2V0dXAuYiArIChiMiAtIHNldHVwLmIpICogYWxwaGE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyID0gbGlnaHQuciArIChyIC0gbGlnaHQucikgKiBhbHBoYTtcblx0XHRcdFx0ZyA9IGxpZ2h0LmcgKyAoZyAtIGxpZ2h0LmcpICogYWxwaGE7XG5cdFx0XHRcdGIgPSBsaWdodC5iICsgKGIgLSBsaWdodC5iKSAqIGFscGhhO1xuXHRcdFx0XHRyMiA9IGRhcmsuciArIChyMiAtIGRhcmsucikgKiBhbHBoYTtcblx0XHRcdFx0ZzIgPSBkYXJrLmcgKyAoZzIgLSBkYXJrLmcpICogYWxwaGE7XG5cdFx0XHRcdGIyID0gZGFyay5iICsgKGIyIC0gZGFyay5iKSAqIGFscGhhO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsaWdodC5yID0gciA8IDAgPyAwIDogKHIgPiAxID8gMSA6IHIpO1xuXHRcdGxpZ2h0LmcgPSBnIDwgMCA/IDAgOiAoZyA+IDEgPyAxIDogZyk7XG5cdFx0bGlnaHQuYiA9IGIgPCAwID8gMCA6IChiID4gMSA/IDEgOiBiKTtcblx0XHRkYXJrLnIgPSByMiA8IDAgPyAwIDogKHIyID4gMSA/IDEgOiByMik7XG5cdFx0ZGFyay5nID0gZzIgPCAwID8gMCA6IChnMiA+IDEgPyAxIDogZzIpO1xuXHRcdGRhcmsuYiA9IGIyIDwgMCA/IDAgOiAoYjIgPiAxID8gMSA6IGIyKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgU2xvdFBvc2UudHRhY2htZW50fS4gKi9cbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50VGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHNsb3RJbmRleCA9IDA7XG5cblx0LyoqIFRoZSBhdHRhY2htZW50IG5hbWUgZm9yIGVhY2gga2V5IGZyYW1lLiBNYXkgY29udGFpbiBudWxsIHZhbHVlcyB0byBjbGVhciB0aGUgYXR0YWNobWVudC4gKi9cblx0YXR0YWNobWVudE5hbWVzOiBBcnJheTxzdHJpbmcgfCBudWxsPjtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGAke1Byb3BlcnR5LmF0dGFjaG1lbnR9fCR7c2xvdEluZGV4fWApO1xuXHRcdHRoaXMuc2xvdEluZGV4ID0gc2xvdEluZGV4O1xuXHRcdHRoaXMuYXR0YWNobWVudE5hbWVzID0gbmV3IEFycmF5PHN0cmluZz4oZnJhbWVDb3VudCk7XG5cdFx0dGhpcy5pbnN0YW50ID0gdHJ1ZTtcblx0fVxuXG5cdGdldEZyYW1lQ291bnQgKCkge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBpbiBzZWNvbmRzIGFuZCB0aGUgYXR0YWNobWVudCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgYXR0YWNobWVudE5hbWU6IHN0cmluZyB8IG51bGwpIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuYXR0YWNobWVudE5hbWVzW2ZyYW1lXSA9IGF0dGFjaG1lbnROYW1lO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uLnNsb3RzW3RoaXMuc2xvdEluZGV4XTtcblx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIHJldHVybjtcblx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBzbG90LmFwcGxpZWRQb3NlIDogc2xvdC5wb3NlO1xuXG5cdFx0aWYgKG91dCB8fCB0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHtcblx0XHRcdGlmIChmcm9tU2V0dXApIHRoaXMuc2V0QXR0YWNobWVudChza2VsZXRvbiwgcG9zZSwgc2xvdC5kYXRhLmF0dGFjaG1lbnROYW1lKTtcblx0XHR9IGVsc2Vcblx0XHRcdHRoaXMuc2V0QXR0YWNobWVudChza2VsZXRvbiwgcG9zZSwgdGhpcy5hdHRhY2htZW50TmFtZXNbVGltZWxpbmUuc2VhcmNoKHRoaXMuZnJhbWVzLCB0aW1lKV0pO1xuXHR9XG5cblx0c2V0QXR0YWNobWVudCAoc2tlbGV0b246IFNrZWxldG9uLCBwb3NlOiBTbG90UG9zZSwgYXR0YWNobWVudE5hbWU6IHN0cmluZyB8IG51bGwpIHtcblx0XHRwb3NlLnNldEF0dGFjaG1lbnQoIWF0dGFjaG1lbnROYW1lID8gbnVsbCA6IHNrZWxldG9uLmdldEF0dGFjaG1lbnQodGhpcy5zbG90SW5kZXgsIGF0dGFjaG1lbnROYW1lKSk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFNsb3RQb3NlLmRlZm9ybX0gdG8gZGVmb3JtIGEge0BsaW5rIFZlcnRleEF0dGFjaG1lbnR9LiAqL1xuZXhwb3J0IGNsYXNzIERlZm9ybVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHJlYWRvbmx5IHNsb3RJbmRleDogbnVtYmVyO1xuXG5cdC8qKiBUaGUgYXR0YWNobWVudCB0aGF0IHdpbGwgYmUgZGVmb3JtZWQuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVmVydGV4QXR0YWNobWVudC5nZXRUaW1lbGluZUF0dGFjaG1lbnR9LiAqL1xuXHRyZWFkb25seSBhdHRhY2htZW50OiBWZXJ0ZXhBdHRhY2htZW50O1xuXG5cdC8qKiBUaGUgdmVydGljZXMgZm9yIGVhY2gga2V5IGZyYW1lLiAqL1xuXHR2ZXJ0aWNlczogQXJyYXk8TnVtYmVyQXJyYXlMaWtlPjtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlciwgYXR0YWNobWVudDogVmVydGV4QXR0YWNobWVudCkge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBgJHtQcm9wZXJ0eS5kZWZvcm19fCR7c2xvdEluZGV4fXwke2F0dGFjaG1lbnQuaWR9YCk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdFx0dGhpcy5hdHRhY2htZW50ID0gYXR0YWNobWVudDtcblx0XHR0aGlzLnZlcnRpY2VzID0gbmV3IEFycmF5PE51bWJlckFycmF5TGlrZT4oZnJhbWVDb3VudCk7XG5cdFx0dGhpcy5hZGRpdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRnZXRGcmFtZUNvdW50ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5mcmFtZXMubGVuZ3RoO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgYW5kIHZlcnRpY2VzIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCBgZnJhbWVDb3VudGAsIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIHRpbWUgVGhlIGZyYW1lIHRpbWUgaW4gc2Vjb25kcy5cblx0ICogQHBhcmFtIHZlcnRpY2VzIFZlcnRleCBwb3NpdGlvbnMgZm9yIGFuIHVud2VpZ2h0ZWQgVmVydGV4QXR0YWNobWVudCwgb3IgZGVmb3JtIG9mZnNldHMgaWYgaXQgaGFzIHdlaWdodHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UpIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMudmVydGljZXNbZnJhbWVdID0gdmVydGljZXM7XG5cdH1cblxuXHQvKiogQHBhcmFtIHZhbHVlMSBJZ25vcmVkICgwIGlzIHVzZWQgZm9yIGEgZGVmb3JtIHRpbWVsaW5lKS5cblx0ICogQHBhcmFtIHZhbHVlMiBJZ25vcmVkICgxIGlzIHVzZWQgZm9yIGEgZGVmb3JtIHRpbWVsaW5lKS4gKi9cblx0c2V0QmV6aWVyIChiZXppZXI6IG51bWJlciwgZnJhbWU6IG51bWJlciwgdmFsdWU6IG51bWJlciwgdGltZTE6IG51bWJlciwgdmFsdWUxOiBudW1iZXIsIGN4MTogbnVtYmVyLCBjeTE6IG51bWJlciwgY3gyOiBudW1iZXIsXG5cdFx0Y3kyOiBudW1iZXIsIHRpbWUyOiBudW1iZXIsIHZhbHVlMjogbnVtYmVyKSB7XG5cdFx0Y29uc3QgY3VydmVzID0gdGhpcy5jdXJ2ZXM7XG5cdFx0bGV0IGkgPSB0aGlzLmdldEZyYW1lQ291bnQoKSArIGJlemllciAqIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGlmICh2YWx1ZSA9PT0gMCkgY3VydmVzW2ZyYW1lXSA9IDIvKkJFWklFUiovICsgaTtcblx0XHRjb25zdCB0bXB4ID0gKHRpbWUxIC0gY3gxICogMiArIGN4MikgKiAwLjAzLCB0bXB5ID0gY3kyICogMC4wMyAtIGN5MSAqIDAuMDY7XG5cdFx0Y29uc3QgZGRkeCA9ICgoY3gxIC0gY3gyKSAqIDMgLSB0aW1lMSArIHRpbWUyKSAqIDAuMDA2LCBkZGR5ID0gKGN5MSAtIGN5MiArIDAuMzMzMzMzMzMpICogMC4wMTg7XG5cdFx0bGV0IGRkeCA9IHRtcHggKiAyICsgZGRkeCwgZGR5ID0gdG1weSAqIDIgKyBkZGR5O1xuXHRcdGxldCBkeCA9IChjeDEgLSB0aW1lMSkgKiAwLjMgKyB0bXB4ICsgZGRkeCAqIDAuMTY2NjY2NjcsIGR5ID0gY3kxICogMC4zICsgdG1weSArIGRkZHkgKiAwLjE2NjY2NjY3O1xuXHRcdGxldCB4ID0gdGltZTEgKyBkeCwgeSA9IGR5O1xuXHRcdGZvciAobGV0IG4gPSBpICsgMTgvKkJFWklFUl9TSVpFKi87IGkgPCBuOyBpICs9IDIpIHtcblx0XHRcdGN1cnZlc1tpXSA9IHg7XG5cdFx0XHRjdXJ2ZXNbaSArIDFdID0geTtcblx0XHRcdGR4ICs9IGRkeDtcblx0XHRcdGR5ICs9IGRkeTtcblx0XHRcdGRkeCArPSBkZGR4O1xuXHRcdFx0ZGR5ICs9IGRkZHk7XG5cdFx0XHR4ICs9IGR4O1xuXHRcdFx0eSArPSBkeTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXJ2ZVBlcmNlbnQgKHRpbWU6IG51bWJlciwgZnJhbWU6IG51bWJlcikge1xuXHRcdGNvbnN0IGN1cnZlcyA9IHRoaXMuY3VydmVzO1xuXHRcdGxldCBpID0gY3VydmVzW2ZyYW1lXTtcblx0XHRzd2l0Y2ggKGkpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgeCA9IHRoaXMuZnJhbWVzW2ZyYW1lXTtcblx0XHRcdFx0cmV0dXJuICh0aW1lIC0geCkgLyAodGhpcy5mcmFtZXNbZnJhbWUgKyB0aGlzLmdldEZyYW1lRW50cmllcygpXSAtIHgpO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpIC09IDIvKkJFWklFUiovO1xuXHRcdGlmIChjdXJ2ZXNbaV0gPiB0aW1lKSB7XG5cdFx0XHRjb25zdCB4ID0gdGhpcy5mcmFtZXNbZnJhbWVdO1xuXHRcdFx0cmV0dXJuIGN1cnZlc1tpICsgMV0gKiAodGltZSAtIHgpIC8gKGN1cnZlc1tpXSAtIHgpO1xuXHRcdH1cblx0XHRjb25zdCBuID0gaSArIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGZvciAoaSArPSAyOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRpZiAoY3VydmVzW2ldID49IHRpbWUpIHtcblx0XHRcdFx0Y29uc3QgeCA9IGN1cnZlc1tpIC0gMl0sIHkgPSBjdXJ2ZXNbaSAtIDFdO1xuXHRcdFx0XHRyZXR1cm4geSArICh0aW1lIC0geCkgLyAoY3VydmVzW2ldIC0geCkgKiAoY3VydmVzW2kgKyAxXSAtIHkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCB4ID0gY3VydmVzW24gLSAyXSwgeSA9IGN1cnZlc1tuIC0gMV07XG5cdFx0cmV0dXJuIHkgKyAoMSAtIHkpICogKHRpbWUgLSB4KSAvICh0aGlzLmZyYW1lc1tmcmFtZSArIHRoaXMuZ2V0RnJhbWVFbnRyaWVzKCldIC0geCk7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogRXZlbnRbXSB8IG51bGwsIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbixcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzbG90cyA9IHNrZWxldG9uLnNsb3RzO1xuXHRcdGlmICghdGhpcy5hdHRhY2htZW50LmlzVGltZWxpbmVBY3RpdmUoc2xvdHMsIHRoaXMuc2xvdEluZGV4LCBhcHBsaWVkUG9zZSkpIHJldHVybjtcblx0XHRjb25zdCB0aW1lbGluZVNsb3RzID0gdGhpcy5hdHRhY2htZW50LnRpbWVsaW5lU2xvdHM7XG5cblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0dGhpcy5hcHBseUJlZm9yZUZpcnN0KHNsb3RzW3RoaXMuc2xvdEluZGV4XSwgYXBwbGllZFBvc2UsIGZyb21TZXR1cCk7XG5cdFx0XHRmb3IgKGNvbnN0IHNsb3RJbmRleCBvZiB0aW1lbGluZVNsb3RzKVxuXHRcdFx0XHR0aGlzLmFwcGx5QmVmb3JlRmlyc3Qoc2xvdHNbc2xvdEluZGV4XSwgYXBwbGllZFBvc2UsIGZyb21TZXR1cCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHYxOiBOdW1iZXJBcnJheUxpa2UsIHYyOiBOdW1iZXJBcnJheUxpa2UgfCBudWxsO1xuXHRcdGxldCBwZXJjZW50OiBudW1iZXI7XG5cdFx0aWYgKHRpbWUgPj0gZnJhbWVzW2ZyYW1lcy5sZW5ndGggLSAxXSkge1xuXHRcdFx0cGVyY2VudCA9IDA7XG5cdFx0XHR2MSA9IHRoaXMudmVydGljZXNbZnJhbWVzLmxlbmd0aCAtIDFdO1xuXHRcdFx0djIgPSBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBmcmFtZSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUpO1xuXHRcdFx0cGVyY2VudCA9IHRoaXMuZ2V0Q3VydmVQZXJjZW50KHRpbWUsIGZyYW1lKTtcblx0XHRcdHYxID0gdGhpcy52ZXJ0aWNlc1tmcmFtZV07XG5cdFx0XHR2MiA9IHRoaXMudmVydGljZXNbZnJhbWUgKyAxXTtcblx0XHR9XG5cblx0XHRjb25zdCB2ZXJ0ZXhDb3VudCA9IHRoaXMudmVydGljZXNbMF0ubGVuZ3RoO1xuXHRcdHRoaXMuYXBwbHlUb1Nsb3Qoc2xvdHNbdGhpcy5zbG90SW5kZXhdLCBhcHBsaWVkUG9zZSwgdjEsIHYyLCBwZXJjZW50LCB2ZXJ0ZXhDb3VudCwgYWxwaGEsIGZyb21TZXR1cCwgYWRkKTtcblx0XHRmb3IgKGNvbnN0IHNsb3RJbmRleCBvZiB0aW1lbGluZVNsb3RzKVxuXHRcdFx0dGhpcy5hcHBseVRvU2xvdChzbG90c1tzbG90SW5kZXhdLCBhcHBsaWVkUG9zZSwgdjEsIHYyLCBwZXJjZW50LCB2ZXJ0ZXhDb3VudCwgYWxwaGEsIGZyb21TZXR1cCwgYWRkKTtcblx0fVxuXG5cdHByaXZhdGUgYXBwbHlUb1Nsb3QgKHNsb3Q6IFNsb3QsIGFwcGxpZWRQb3NlOiBib29sZWFuLCB2MTogTnVtYmVyQXJyYXlMaWtlLCB2MjogTnVtYmVyQXJyYXlMaWtlIHwgbnVsbCwgcGVyY2VudDogbnVtYmVyLCB2ZXJ0ZXhDb3VudDogbnVtYmVyLFxuXHRcdGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgYWRkOiBib29sZWFuKSB7XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gc2xvdC5hcHBsaWVkUG9zZSA6IHNsb3QucG9zZTtcblx0XHRpZiAocG9zZS5hdHRhY2htZW50ID09PSBudWxsIHx8IHBvc2UuYXR0YWNobWVudC50aW1lbGluZUF0dGFjaG1lbnQgIT09IHRoaXMuYXR0YWNobWVudCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgdmVydGV4QXR0YWNobWVudCA9IHBvc2UuYXR0YWNobWVudCBhcyBWZXJ0ZXhBdHRhY2htZW50O1xuXHRcdGNvbnN0IGRlZm9ybSA9IHBvc2UuZGVmb3JtO1xuXHRcdGlmIChkZWZvcm0ubGVuZ3RoID09PSAwKSBmcm9tU2V0dXAgPSB0cnVlO1xuXHRcdGRlZm9ybS5sZW5ndGggPSB2ZXJ0ZXhDb3VudDtcblxuXHRcdGlmICh2MiA9PT0gbnVsbCkgeyAvLyBUaW1lIGlzIGFmdGVyIGxhc3QgZnJhbWUuXG5cdFx0XHRpZiAoYWxwaGEgPT09IDEpIHtcblx0XHRcdFx0aWYgKGFkZCAmJiAhZnJvbVNldHVwKSB7XG5cdFx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7IC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgbm8gYWxwaGEuXG5cdFx0XHRcdFx0XHRjb25zdCBzZXR1cFZlcnRpY2VzID0gdmVydGV4QXR0YWNobWVudC52ZXJ0aWNlcztcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKylcblx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IHYxW2ldIC0gc2V0dXBWZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBXZWlnaHRlZCBkZWZvcm0gb2Zmc2V0cywgbm8gYWxwaGEuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspXG5cdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSB2MVtpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSAvLyBWZXJ0ZXggcG9zaXRpb25zIG9yIGRlZm9ybSBvZmZzZXRzLCBubyBhbHBoYS5cblx0XHRcdFx0XHRVdGlscy5hcnJheUNvcHkodjEsIDAsIGRlZm9ybSwgMCwgdmVydGV4Q291bnQpO1xuXHRcdFx0fSBlbHNlIGlmIChmcm9tU2V0dXApIHtcblx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7IC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRjb25zdCBzZXR1cFZlcnRpY2VzID0gdmVydGV4QXR0YWNobWVudC52ZXJ0aWNlcztcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNldHVwID0gc2V0dXBWZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSA9IHNldHVwICsgKHYxW2ldIC0gc2V0dXApICogYWxwaGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgeyAvLyBXZWlnaHRlZCBkZWZvcm0gb2Zmc2V0cywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspXG5cdFx0XHRcdFx0XHRkZWZvcm1baV0gPSB2MVtpXSAqIGFscGhhO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGFkZCkge1xuXHRcdFx0XHRpZiAoIXZlcnRleEF0dGFjaG1lbnQuYm9uZXMpIHsgLy8gVW53ZWlnaHRlZCB2ZXJ0ZXggcG9zaXRpb25zLCBubyBhbHBoYS5cblx0XHRcdFx0XHRjb25zdCBzZXR1cFZlcnRpY2VzID0gdmVydGV4QXR0YWNobWVudC52ZXJ0aWNlcztcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspXG5cdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gKHYxW2ldIC0gc2V0dXBWZXJ0aWNlc1tpXSkgKiBhbHBoYTtcblx0XHRcdFx0fSBlbHNlIHsgLy8gV2VpZ2h0ZWQgZGVmb3JtIG9mZnNldHMsIGFscGhhLlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKylcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSB2MVtpXSAqIGFscGhhO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgeyAvLyBWZXJ0ZXggcG9zaXRpb25zIG9yIGRlZm9ybSBvZmZzZXRzLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspXG5cdFx0XHRcdFx0ZGVmb3JtW2ldICs9ICh2MVtpXSAtIGRlZm9ybVtpXSkgKiBhbHBoYTtcblx0XHRcdH1cblx0XHR9IGVsc2UgeyAvLyBCZXR3ZWVuIGZyYW1lcy5cblx0XHRcdGlmIChhbHBoYSA9PT0gMSkge1xuXHRcdFx0XHRpZiAoYWRkICYmICFmcm9tU2V0dXApIHtcblx0XHRcdFx0XHRpZiAoIXZlcnRleEF0dGFjaG1lbnQuYm9uZXMpIHsgLy8gVW53ZWlnaHRlZCB2ZXJ0ZXggcG9zaXRpb25zLCBubyBhbHBoYS5cblx0XHRcdFx0XHRcdGNvbnN0IHNldHVwVmVydGljZXMgPSB2ZXJ0ZXhBdHRhY2htZW50LnZlcnRpY2VzO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZXYgPSB2MVtpXTtcblx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IHByZXYgKyAodjJbaV0gLSBwcmV2KSAqIHBlcmNlbnQgLSBzZXR1cFZlcnRpY2VzW2ldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7IC8vIFdlaWdodGVkIGRlZm9ybSBvZmZzZXRzLCBubyBhbHBoYS5cblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBwcmV2ID0gdjFbaV07XG5cdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSBwcmV2ICsgKHYyW2ldIC0gcHJldikgKiBwZXJjZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwZXJjZW50ID09PSAwKVxuXHRcdFx0XHRcdFV0aWxzLmFycmF5Q29weSh2MSwgMCwgZGVmb3JtLCAwLCB2ZXJ0ZXhDb3VudClcblx0XHRcdFx0ZWxzZSB7IC8vIFZlcnRleCBwb3NpdGlvbnMgb3IgZGVmb3JtIG9mZnNldHMsIG5vIGFscGhhLlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IHYxW2ldO1xuXHRcdFx0XHRcdFx0ZGVmb3JtW2ldID0gcHJldiArICh2MltpXSAtIHByZXYpICogcGVyY2VudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdGlmICghdmVydGV4QXR0YWNobWVudC5ib25lcykgeyAvLyBVbndlaWdodGVkIHZlcnRleCBwb3NpdGlvbnMsIHdpdGggYWxwaGEuXG5cdFx0XHRcdFx0Y29uc3Qgc2V0dXBWZXJ0aWNlcyA9IHZlcnRleEF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2ID0gdjFbaV0sIHNldHVwID0gc2V0dXBWZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSA9IHNldHVwICsgKHByZXYgKyAodjJbaV0gLSBwcmV2KSAqIHBlcmNlbnQgLSBzZXR1cCkgKiBhbHBoYTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7IC8vIFdlaWdodGVkIGRlZm9ybSBvZmZzZXRzLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IHYxW2ldO1xuXHRcdFx0XHRcdFx0ZGVmb3JtW2ldID0gKHByZXYgKyAodjJbaV0gLSBwcmV2KSAqIHBlcmNlbnQpICogYWxwaGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGFkZCkge1xuXHRcdFx0XHRpZiAoIXZlcnRleEF0dGFjaG1lbnQuYm9uZXMpIHsgLy8gVW53ZWlnaHRlZCB2ZXJ0ZXggcG9zaXRpb25zLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRcdGNvbnN0IHNldHVwVmVydGljZXMgPSB2ZXJ0ZXhBdHRhY2htZW50LnZlcnRpY2VzO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IHYxW2ldO1xuXHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IChwcmV2ICsgKHYyW2ldIC0gcHJldikgKiBwZXJjZW50IC0gc2V0dXBWZXJ0aWNlc1tpXSkgKiBhbHBoYTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7IC8vIFdlaWdodGVkIGRlZm9ybSBvZmZzZXRzLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IHYxW2ldO1xuXHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IChwcmV2ICsgKHYyW2ldIC0gcHJldikgKiBwZXJjZW50KSAqIGFscGhhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJldiA9IHYxW2ldO1xuXHRcdFx0XHRcdGRlZm9ybVtpXSArPSAocHJldiArICh2MltpXSAtIHByZXYpICogcGVyY2VudCAtIGRlZm9ybVtpXSkgKiBhbHBoYTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXBwbHlCZWZvcmVGaXJzdCAoc2xvdDogU2xvdCwgYXBwbGllZFBvc2U6IGJvb2xlYW4sIGZyb21TZXR1cDogYm9vbGVhbikge1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IHNsb3QuYXBwbGllZFBvc2UgOiBzbG90LnBvc2U7XG5cdFx0aWYgKHBvc2UuYXR0YWNobWVudCA9PSBudWxsIHx8IHBvc2UuYXR0YWNobWVudC50aW1lbGluZUF0dGFjaG1lbnQgIT09IHRoaXMuYXR0YWNobWVudCkgcmV0dXJuO1xuXHRcdGlmIChwb3NlLmRlZm9ybS5sZW5ndGggPT09IDApIGZyb21TZXR1cCA9IHRydWU7XG5cdFx0aWYgKGZyb21TZXR1cCkgcG9zZS5kZWZvcm0ubGVuZ3RoID0gMDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgU2xvdC5nZXRTZXF1ZW5jZUluZGV4fSBmb3IgYW4gYXR0YWNobWVudCdzIHtAbGluayBTZXF1ZW5jZX0uICovXG5leHBvcnQgY2xhc3MgU2VxdWVuY2VUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIGltcGxlbWVudHMgU2xvdFRpbWVsaW5lIHtcblx0c3RhdGljIEVOVFJJRVMgPSAzO1xuXHRzdGF0aWMgTU9ERSA9IDE7XG5cdHN0YXRpYyBERUxBWSA9IDI7XG5cblx0cmVhZG9ubHkgc2xvdEluZGV4OiBudW1iZXI7XG5cdHJlYWRvbmx5IGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgc2xvdEluZGV4OiBudW1iZXIsIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBgJHtQcm9wZXJ0eS5zZXF1ZW5jZX18JHtzbG90SW5kZXh9fCR7KGF0dGFjaG1lbnQgYXMgdW5rbm93biBhcyBIYXNTZXF1ZW5jZSkuc2VxdWVuY2UuaWR9YCk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdFx0dGhpcy5hdHRhY2htZW50ID0gYXR0YWNobWVudDtcblx0XHR0aGlzLmluc3RhbnQgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gU2VxdWVuY2VUaW1lbGluZS5FTlRSSUVTO1xuXHR9XG5cblx0Z2V0U2xvdEluZGV4ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zbG90SW5kZXg7XG5cdH1cblxuXHQvKiogVGhlIGF0dGFjaG1lbnQgZm9yIHdoaWNoIHRoZSB7QGxpbmsgU2xvdFBvc2Uuc2VxdWVuY2VJbmRleH0gd2lsbCBiZSBzZXQuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVmVydGV4QXR0YWNobWVudC50aW1lbGluZUF0dGFjaG1lbnR9LiAqL1xuXHRnZXRBdHRhY2htZW50ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hdHRhY2htZW50O1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUsIG1vZGUsIGluZGV4LCBhbmQgZnJhbWUgdGltZSBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFNlY29uZHMgYmV0d2VlbiBmcmFtZXMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1vZGU6IFNlcXVlbmNlTW9kZSwgaW5kZXg6IG51bWJlciwgZGVsYXk6IG51bWJlcikge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGZyYW1lICo9IFNlcXVlbmNlVGltZWxpbmUuRU5UUklFUztcblx0XHRmcmFtZXNbZnJhbWVdID0gdGltZTtcblx0XHRmcmFtZXNbZnJhbWUgKyBTZXF1ZW5jZVRpbWVsaW5lLk1PREVdID0gbW9kZSB8IChpbmRleCA8PCA0KTtcblx0XHRmcmFtZXNbZnJhbWUgKyBTZXF1ZW5jZVRpbWVsaW5lLkRFTEFZXSA9IGRlbGF5O1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XG5cdFx0aWYgKCF0aGlzLmF0dGFjaG1lbnQuaXNUaW1lbGluZUFjdGl2ZShzbG90cywgdGhpcy5zbG90SW5kZXgsIGFwcGxpZWRQb3NlKSkgcmV0dXJuO1xuXHRcdGNvbnN0IHRpbWVsaW5lU2xvdHMgPSB0aGlzLmF0dGFjaG1lbnQudGltZWxpbmVTbG90cztcblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmIChvdXQgfHwgdGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0aWYgKGZyb21TZXR1cCkge1xuXHRcdFx0XHR0aGlzLnNldHVwUG9zZShzbG90c1t0aGlzLnNsb3RJbmRleF0sIGFwcGxpZWRQb3NlKTtcblx0XHRcdFx0Zm9yIChjb25zdCBzbG90SW5kZXggb2YgdGltZWxpbmVTbG90cylcblx0XHRcdFx0XHR0aGlzLnNldHVwUG9zZShzbG90c1tzbG90SW5kZXhdLCBhcHBsaWVkUG9zZSlcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgU2VxdWVuY2VUaW1lbGluZS5FTlRSSUVTKTtcblx0XHRjb25zdCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0Y29uc3QgbW9kZUFuZEluZGV4ID0gZnJhbWVzW2kgKyBTZXF1ZW5jZVRpbWVsaW5lLk1PREVdO1xuXHRcdGNvbnN0IGRlbGF5ID0gZnJhbWVzW2kgKyBTZXF1ZW5jZVRpbWVsaW5lLkRFTEFZXTtcblxuXHRcdHRoaXMuYXBwbHlUb1Nsb3Qoc2xvdHNbdGhpcy5zbG90SW5kZXhdLCBhcHBsaWVkUG9zZSwgdGltZSwgYmVmb3JlLCBtb2RlQW5kSW5kZXgsIGRlbGF5KTtcblx0XHRmb3IgKGNvbnN0IHNsb3RJbmRleCBvZiB0aW1lbGluZVNsb3RzKVxuXHRcdFx0dGhpcy5hcHBseVRvU2xvdChzbG90c1tzbG90SW5kZXhdLCBhcHBsaWVkUG9zZSwgdGltZSwgYmVmb3JlLCBtb2RlQW5kSW5kZXgsIGRlbGF5KTtcblx0fVxuXG5cdHByaXZhdGUgc2V0dXBQb3NlIChzbG90OiBTbG90LCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IHNsb3QuYXBwbGllZFBvc2UgOiBzbG90LnBvc2U7XG5cdFx0aWYgKHBvc2UuYXR0YWNobWVudCA9PT0gbnVsbCB8fCBwb3NlLmF0dGFjaG1lbnQudGltZWxpbmVBdHRhY2htZW50ICE9PSB0aGlzLmF0dGFjaG1lbnQpIHJldHVybjtcblx0XHRwb3NlLnNlcXVlbmNlSW5kZXggPSAtMTtcblx0fVxuXG5cdHByaXZhdGUgYXBwbHlUb1Nsb3QgKHNsb3Q6IFNsb3QsIGFwcGxpZWRQb3NlOiBib29sZWFuLCB0aW1lOiBudW1iZXIsIGJlZm9yZTogbnVtYmVyLCBtb2RlQW5kSW5kZXg6IG51bWJlciwgZGVsYXk6IG51bWJlcikge1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IHNsb3QuYXBwbGllZFBvc2UgOiBzbG90LnBvc2U7XG5cdFx0aWYgKHBvc2UuYXR0YWNobWVudCA9PT0gbnVsbCB8fCBwb3NlLmF0dGFjaG1lbnQudGltZWxpbmVBdHRhY2htZW50ICE9PSB0aGlzLmF0dGFjaG1lbnQpIHJldHVybjtcblxuXHRcdGxldCBpbmRleCA9IG1vZGVBbmRJbmRleCA+PiA0LCBjb3VudCA9IChwb3NlLmF0dGFjaG1lbnQgYXMgdW5rbm93biBhcyBIYXNTZXF1ZW5jZSkuc2VxdWVuY2UucmVnaW9ucy5sZW5ndGg7XG5cdFx0Y29uc3QgbW9kZSA9IFNlcXVlbmNlTW9kZVZhbHVlc1ttb2RlQW5kSW5kZXggJiAweGZdO1xuXHRcdGlmIChtb2RlICE9PSBTZXF1ZW5jZU1vZGUuaG9sZCkge1xuXHRcdFx0aW5kZXggKz0gKCgodGltZSAtIGJlZm9yZSkgLyBkZWxheSArIDAuMDAwMDEpIHwgMCk7XG5cdFx0XHRzd2l0Y2ggKG1vZGUpIHtcblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUub25jZTogaW5kZXggPSBNYXRoLm1pbihjb3VudCAtIDEsIGluZGV4KTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgU2VxdWVuY2VNb2RlLmxvb3A6IGluZGV4ICU9IGNvdW50OyBicmVhaztcblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUucGluZ3Bvbmc6IHtcblx0XHRcdFx0XHRjb25zdCBuID0gKGNvdW50IDw8IDEpIC0gMjtcblx0XHRcdFx0XHRpbmRleCA9IG4gPT09IDAgPyAwIDogaW5kZXggJSBuO1xuXHRcdFx0XHRcdGlmIChpbmRleCA+PSBjb3VudCkgaW5kZXggPSBuIC0gaW5kZXg7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUub25jZVJldmVyc2U6IGluZGV4ID0gTWF0aC5tYXgoY291bnQgLSAxIC0gaW5kZXgsIDApOyBicmVhaztcblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUubG9vcFJldmVyc2U6IGluZGV4ID0gY291bnQgLSAxIC0gKGluZGV4ICUgY291bnQpOyBicmVhaztcblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUucGluZ3BvbmdSZXZlcnNlOiB7XG5cdFx0XHRcdFx0Y29uc3QgbiA9IChjb3VudCA8PCAxKSAtIDI7XG5cdFx0XHRcdFx0aW5kZXggPSBuID09PSAwID8gMCA6IChpbmRleCArIGNvdW50IC0gMSkgJSBuO1xuXHRcdFx0XHRcdGlmIChpbmRleCA+PSBjb3VudCkgaW5kZXggPSBuIC0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cG9zZS5zZXF1ZW5jZUluZGV4ID0gaW5kZXg7XG5cdH1cbn1cblxuLyoqIEZpcmVzIGFuIHtAbGluayBFdmVudH0gd2hlbiBzcGVjaWZpYyBhbmltYXRpb24gdGltZXMgYXJlIHJlYWNoZWQuICovXG5leHBvcnQgY2xhc3MgRXZlbnRUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIHtcblx0c3RhdGljIHByb3BlcnR5SWRzID0gW2Ake1Byb3BlcnR5LmV2ZW50fWBdO1xuXG5cdC8qKiBUaGUgZXZlbnQgZm9yIGVhY2gga2V5IGZyYW1lLiAqL1xuXHRldmVudHM6IEFycmF5PEV2ZW50PjtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgLi4uRXZlbnRUaW1lbGluZS5wcm9wZXJ0eUlkcyk7XG5cdFx0dGhpcy5ldmVudHMgPSBuZXcgQXJyYXk8RXZlbnQ+KGZyYW1lQ291bnQpO1xuXHRcdHRoaXMuaW5zdGFudCA9IHRydWU7XG5cdH1cblxuXHRnZXRGcmFtZUNvdW50ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5mcmFtZXMubGVuZ3RoO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcyBhbmQgdGhlIGV2ZW50IGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIGV2ZW50OiBFdmVudCkge1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IGV2ZW50LnRpbWU7XG5cdFx0dGhpcy5ldmVudHNbZnJhbWVdID0gZXZlbnQ7XG5cdH1cblxuXHQvKiogRmlyZXMgZXZlbnRzIGZvciBmcmFtZXMgPiBgbGFzdFRpbWVgIGFuZCA8PSBgdGltZWAuICovXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24gfCBudWxsLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbVNldHVwOiBib29sZWFuLCBhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGlmICghZmlyZWRFdmVudHMpIHJldHVybjtcblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGNvbnN0IGZyYW1lQ291bnQgPSB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cblx0XHRpZiAobGFzdFRpbWUgPiB0aW1lKSB7IC8vIEFwcGx5IGFmdGVyIGxhc3RUaW1lIGZvciBsb29wZWQgYW5pbWF0aW9ucy5cblx0XHRcdHRoaXMuYXBwbHkobnVsbCwgbGFzdFRpbWUsIE51bWJlci5NQVhfVkFMVUUsIGZpcmVkRXZlbnRzLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRsYXN0VGltZSA9IC0xO1xuXHRcdH0gZWxzZSBpZiAobGFzdFRpbWUgPj0gZnJhbWVzW2ZyYW1lQ291bnQgLSAxXSkgLy8gTGFzdCB0aW1lIGlzIGFmdGVyIGxhc3QgZnJhbWUuXG5cdFx0XHRyZXR1cm47XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHJldHVybjtcblxuXHRcdGxldCBpID0gMDtcblx0XHRpZiAobGFzdFRpbWUgPCBmcmFtZXNbMF0pXG5cdFx0XHRpID0gMDtcblx0XHRlbHNlIHtcblx0XHRcdGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCBsYXN0VGltZSkgKyAxO1xuXHRcdFx0Y29uc3QgZnJhbWVUaW1lID0gZnJhbWVzW2ldO1xuXHRcdFx0d2hpbGUgKGkgPiAwKSB7IC8vIEZpcmUgbXVsdGlwbGUgZXZlbnRzIHdpdGggdGhlIHNhbWUgZnJhbWUuXG5cdFx0XHRcdGlmIChmcmFtZXNbaSAtIDFdICE9PSBmcmFtZVRpbWUpIGJyZWFrO1xuXHRcdFx0XHRpLS07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoOyBpIDwgZnJhbWVDb3VudCAmJiB0aW1lID49IGZyYW1lc1tpXTsgaSsrKVxuXHRcdFx0ZmlyZWRFdmVudHMucHVzaCh0aGlzLmV2ZW50c1tpXSk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgdGhlIHtAbGluayBTa2VsZXRvbi5nZXREcmF3T3JkZXJ9LiAqL1xuZXhwb3J0IGNsYXNzIERyYXdPcmRlclRpbWVsaW5lIGV4dGVuZHMgVGltZWxpbmUge1xuXHRzdGF0aWMgcmVhZG9ubHkgcHJvcGVydHlJRCA9IGAke1Byb3BlcnR5LmRyYXdPcmRlcn1gO1xuXHRzdGF0aWMgcHJvcGVydHlJZHMgPSBbRHJhd09yZGVyVGltZWxpbmUucHJvcGVydHlJRF07XG5cblx0LyoqIFRoZSBkcmF3IG9yZGVyIGZvciBlYWNoIGtleSBmcmFtZS4gU2VlIHtAbGluayBzZXRGcmFtZX0uICovXG5cdHByaXZhdGUgcmVhZG9ubHkgZHJhd09yZGVyczogQXJyYXk8QXJyYXk8bnVtYmVyPiB8IG51bGw+O1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCAuLi5EcmF3T3JkZXJUaW1lbGluZS5wcm9wZXJ0eUlkcyk7XG5cdFx0dGhpcy5kcmF3T3JkZXJzID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4gfCBudWxsPihmcmFtZUNvdW50KTtcblx0XHR0aGlzLmluc3RhbnQgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMgYW5kIHRoZSBkcmF3IG9yZGVyIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS5cblx0ICogQHBhcmFtIGRyYXdPcmRlciBPcmRlcmVkIHtAbGluayBTa2VsZXRvbi5zbG90c30gaW5kaWNlcywgb3IgbnVsbCB0byB1c2Ugc2V0dXAgcG9zZVxuXHQgKiAgICAgICAgICAgZHJhdyBvcmRlci4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZHJhd09yZGVyOiBBcnJheTxudW1iZXI+IHwgbnVsbCkge1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5kcmF3T3JkZXJzW2ZyYW1lXSA9IGRyYXdPcmRlcjtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlcixcblx0XHRmcm9tU2V0dXA6IGJvb2xlYW4sIGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXHRcdGNvbnN0IHBvc2UgPSAoYXBwbGllZFBvc2UgPyBza2VsZXRvbi5kcmF3T3JkZXIuYXBwbGllZFBvc2UgOiBza2VsZXRvbi5kcmF3T3JkZXIucG9zZSk7XG5cdFx0Y29uc3Qgc2V0dXAgPSBza2VsZXRvbi5zbG90cztcblx0XHRpZiAob3V0IHx8IHRpbWUgPCB0aGlzLmZyYW1lc1swXSkge1xuXHRcdFx0aWYgKGZyb21TZXR1cCkgVXRpbHMuYXJyYXlDb3B5KHNldHVwLCAwLCBwb3NlLCAwLCBza2VsZXRvbi5zbG90cy5sZW5ndGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9yZGVyID0gdGhpcy5kcmF3T3JkZXJzW1RpbWVsaW5lLnNlYXJjaCh0aGlzLmZyYW1lcywgdGltZSldO1xuXHRcdGlmICghb3JkZXIpXG5cdFx0XHRVdGlscy5hcnJheUNvcHkoc2V0dXAsIDAsIHBvc2UsIDAsIHNrZWxldG9uLnNsb3RzLmxlbmd0aCk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IG9yZGVyLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdFx0cG9zZVtpXSA9IHNldHVwW29yZGVyW2ldXTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBzdWJzZXQgb2YgdGhlIHtAbGluayBTa2VsZXRvbi5nZXREcmF3T3JkZXIgfCBkcmF3IG9yZGVyfS4gKi9cbmV4cG9ydCBjbGFzcyBEcmF3T3JkZXJGb2xkZXJUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIHtcblx0cHJpdmF0ZSByZWFkb25seSBzbG90czogbnVtYmVyW107XG5cdHByaXZhdGUgcmVhZG9ubHkgaW5Gb2xkZXI6IGJvb2xlYW5bXTtcblx0cHJpdmF0ZSByZWFkb25seSBkcmF3T3JkZXJzOiBBcnJheTxBcnJheTxudW1iZXI+IHwgbnVsbD47XG5cblx0LyoqIEBwYXJhbSBzbG90cyB7QGxpbmsgU2tlbGV0b24uc2xvdHN9IGluZGljZXMgY29udHJvbGxlZCBieSB0aGlzIHRpbWVsaW5lLCBpbiBzZXR1cCBvcmRlci5cblx0ICogQHBhcmFtIHNsb3RDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIHNrZWxldG9uLiAqL1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBzbG90czogbnVtYmVyW10sIHNsb3RDb3VudDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgLi4uRHJhd09yZGVyRm9sZGVyVGltZWxpbmUucHJvcGVydHlJZHMoc2xvdHMpKTtcblx0XHR0aGlzLnNsb3RzID0gc2xvdHM7XG5cdFx0dGhpcy5kcmF3T3JkZXJzID0gbmV3IEFycmF5KGZyYW1lQ291bnQpO1xuXHRcdHRoaXMuaW5Gb2xkZXIgPSBuZXcgQXJyYXkoc2xvdENvdW50KTtcblx0XHRmb3IgKGNvbnN0IGkgb2Ygc2xvdHMpXG5cdFx0XHR0aGlzLmluRm9sZGVyW2ldID0gdHJ1ZTtcblx0XHR0aGlzLmluc3RhbnQgPSB0cnVlO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgcHJvcGVydHlJZHMgKHNsb3RzOiBudW1iZXJbXSk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBuID0gc2xvdHMubGVuZ3RoO1xuXHRcdGNvbnN0IGlkcyA9IG5ldyBBcnJheShuKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKylcblx0XHRcdGlkc1tpXSA9IGBkJHtzbG90c1tpXX1gO1xuXHRcdHJldHVybiBpZHM7XG5cdH1cblxuXHRnZXRGcmFtZUNvdW50ICgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cdH1cblxuXHQvKiogVGhlIHtAbGluayBTa2VsZXRvbi5nZXRTbG90c30gaW5kaWNlcyB0aGF0IHRoaXMgdGltZWxpbmUgYWZmZWN0cywgaW4gc2V0dXAgb3JkZXIuICovXG5cdGdldFNsb3RzICgpOiBudW1iZXJbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc2xvdHM7XG5cdH1cblxuXHQvKiogVGhlIGRyYXcgb3JkZXIgZm9yIGVhY2ggZnJhbWUuIFNlZSB7QGxpbmsgc2V0RnJhbWV9LiAqL1xuXHRnZXREcmF3T3JkZXJzICgpOiBBcnJheTxBcnJheTxudW1iZXI+IHwgbnVsbD4ge1xuXHRcdHJldHVybiB0aGlzLmRyYXdPcmRlcnM7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBhbmQgZHJhdyBvcmRlciBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuXG5cdCAqIEBwYXJhbSBkcmF3T3JkZXIgT3JkZXJlZCB7QGxpbmsgZ2V0U2xvdHN9IGluZGljZXMsIG9yIG51bGwgdG8gdXNlIHNldHVwIHBvc2Ugb3JkZXIuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGRyYXdPcmRlcjogQXJyYXk8bnVtYmVyPiB8IG51bGwpOiB2b2lkIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZHJhd09yZGVyc1tmcmFtZV0gPSBkcmF3T3JkZXI7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sXG5cdFx0YWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcG9zZSA9IChhcHBsaWVkUG9zZSA/IHNrZWxldG9uLmRyYXdPcmRlci5hcHBsaWVkUG9zZSA6IHNrZWxldG9uLmRyYXdPcmRlci5wb3NlKTtcblx0XHRjb25zdCBzZXR1cCA9IHNrZWxldG9uLnNsb3RzO1xuXHRcdGlmIChvdXQgfHwgdGltZSA8IHRoaXMuZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSB0aGlzLnNldHVwKHBvc2UsIHNldHVwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb3JkZXIgPSB0aGlzLmRyYXdPcmRlcnNbVGltZWxpbmUuc2VhcmNoKHRoaXMuZnJhbWVzLCB0aW1lKV07XG5cdFx0XHRpZiAoIW9yZGVyKVxuXHRcdFx0XHR0aGlzLnNldHVwKHBvc2UsIHNldHVwKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBpbkZvbGRlciA9IHRoaXMuaW5Gb2xkZXI7XG5cdFx0XHRcdGNvbnN0IHNsb3RzID0gdGhpcy5zbG90cztcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIGZvdW5kID0gMCwgZG9uZSA9IHNsb3RzLmxlbmd0aDsgOyBpKyspIHtcblx0XHRcdFx0XHRpZiAoaW5Gb2xkZXJbcG9zZVtpXS5kYXRhLmluZGV4XSkge1xuXHRcdFx0XHRcdFx0cG9zZVtpXSA9IHNldHVwW3Nsb3RzW29yZGVyW2ZvdW5kXV1dO1xuXHRcdFx0XHRcdFx0aWYgKCsrZm91bmQgPT09IGRvbmUpIGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgc2V0dXAgKHBvc2U6IFNsb3RbXSwgc2V0dXA6IFNsb3RbXSk6IHZvaWQge1xuXHRcdGNvbnN0IHsgaW5Gb2xkZXIsIHNsb3RzIH0gPSB0aGlzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBmb3VuZCA9IDAsIGRvbmUgPSBzbG90cy5sZW5ndGg7IDsgaSsrKSB7XG5cdFx0XHRpZiAoaW5Gb2xkZXJbcG9zZVtpXS5kYXRhLmluZGV4XSkge1xuXHRcdFx0XHRwb3NlW2ldID0gc2V0dXBbc2xvdHNbZm91bmRdXTtcblx0XHRcdFx0aWYgKCsrZm91bmQgPT09IGRvbmUpIGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIGNvbnN0cmFpbnQgaW4ge0BsaW5rIFNrZWxldG9uLmNvbnN0cmFpbnRzfSB0aGF0IHdpbGwgYmUgY2hhbmdlZCB3aGVuIHRoaXMgdGltZWxpbmUgaXMgYXBwbGllZCwgb3IgLTEgaWZcblx0ICogYSBzcGVjaWZpYyBjb25zdHJhaW50IHdpbGwgbm90IGJlIGNoYW5nZWQuICovXG5cdHJlYWRvbmx5IGNvbnN0cmFpbnRJbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25zdHJhaW50VGltZWxpbmUgKG9iajogVGltZWxpbmUgJiBQYXJ0aWFsPENvbnN0cmFpbnRUaW1lbGluZT4pOiBvYmogaXMgVGltZWxpbmUgJiBDb25zdHJhaW50VGltZWxpbmUge1xuXHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmouY29uc3RyYWludEluZGV4ID09PSAnbnVtYmVyJztcbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIElrQ29uc3RyYWludFBvc2UubWl4KX0sIHtAbGluayBJa0NvbnN0cmFpbnRQb3NlLnNvZnRuZXNzfSxcbiAqIHtAbGluayBJa0NvbnN0cmFpbnRQb3NlLmJlbmREaXJlY3Rpb259LCB7QGxpbmsgSWtDb25zdHJhaW50UG9zZS5zdHJldGNofSwgYW5kXG4gKiB7QGxpbmsgSWtDb25zdHJhaW50UG9zZS5jb21wcmVzc30uICovXG5leHBvcnQgY2xhc3MgSWtDb25zdHJhaW50VGltZWxpbmUgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lIGltcGxlbWVudHMgQ29uc3RyYWludFRpbWVsaW5lIHtcblx0cmVhZG9ubHkgY29uc3RyYWludEluZGV4OiBudW1iZXIgPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGAke1Byb3BlcnR5LmlrQ29uc3RyYWludH18JHtjb25zdHJhaW50SW5kZXh9YCk7XG5cdFx0dGhpcy5jb25zdHJhaW50SW5kZXggPSBjb25zdHJhaW50SW5kZXg7XG5cdH1cblxuXHRnZXRGcmFtZUVudHJpZXMgKCkge1xuXHRcdHJldHVybiA2LypFTlRSSUVTKi87XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSwgbWl4LCBzb2Z0bmVzcywgYmVuZCBkaXJlY3Rpb24sIGNvbXByZXNzLCBhbmQgc3RyZXRjaCBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuXG5cdCAqIEBwYXJhbSBiZW5kRGlyZWN0aW9uIDEgb3IgLTEuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1peDogbnVtYmVyLCBzb2Z0bmVzczogbnVtYmVyLCBiZW5kRGlyZWN0aW9uOiBudW1iZXIsIGNvbXByZXNzOiBib29sZWFuLCBzdHJldGNoOiBib29sZWFuKSB7XG5cdFx0ZnJhbWUgKj0gNi8qRU5UUklFUyovO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypNSVgqL10gPSBtaXg7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAyLypTT0ZUTkVTUyovXSA9IHNvZnRuZXNzO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQkVORF9ESVJFQ1RJT04qL10gPSBiZW5kRGlyZWN0aW9uO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNC8qQ09NUFJFU1MqL10gPSBjb21wcmVzcyA/IDEgOiAwO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNS8qU1RSRVRDSCovXSA9IHN0cmV0Y2ggPyAxIDogMDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uLmNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XSBhcyBJa0NvbnN0cmFpbnQ7XG5cdFx0aWYgKCFjb25zdHJhaW50LmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IGNvbnN0cmFpbnQuYXBwbGllZFBvc2UgOiBjb25zdHJhaW50LnBvc2U7XG5cblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0aWYgKGZyb21TZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRcdHBvc2UubWl4ID0gc2V0dXAubWl4O1xuXHRcdFx0XHRwb3NlLnNvZnRuZXNzID0gc2V0dXAuc29mdG5lc3M7XG5cdFx0XHRcdHBvc2UuYmVuZERpcmVjdGlvbiA9IHNldHVwLmJlbmREaXJlY3Rpb247XG5cdFx0XHRcdHBvc2UuY29tcHJlc3MgPSBzZXR1cC5jb21wcmVzcztcblx0XHRcdFx0cG9zZS5zdHJldGNoID0gc2V0dXAuc3RyZXRjaDtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgbWl4ID0gMCwgc29mdG5lc3MgPSAwO1xuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA2LypFTlRSSUVTKi8pXG5cdFx0Y29uc3QgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSAvIDYvKkVOVFJJRVMqL107XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHRtaXggPSBmcmFtZXNbaSArIDEvKk1JWCovXTtcblx0XHRcdFx0c29mdG5lc3MgPSBmcmFtZXNbaSArIDIvKlNPRlRORVNTKi9dO1xuXHRcdFx0XHRjb25zdCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgNi8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdG1peCArPSAoZnJhbWVzW2kgKyA2LypFTlRSSUVTKi8gKyAxLypNSVgqL10gLSBtaXgpICogdDtcblx0XHRcdFx0c29mdG5lc3MgKz0gKGZyYW1lc1tpICsgNi8qRU5UUklFUyovICsgMi8qU09GVE5FU1MqL10gLSBzb2Z0bmVzcykgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHRtaXggPSBmcmFtZXNbaSArIDEvKk1JWCovXTtcblx0XHRcdFx0c29mdG5lc3MgPSBmcmFtZXNbaSArIDIvKlNPRlRORVNTKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG1peCA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qTUlYKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0c29mdG5lc3MgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKlNPRlRORVNTKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJhc2UgPSBmcm9tU2V0dXAgPyBjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlIDogcG9zZTtcblx0XHRwb3NlLm1peCA9IGJhc2UubWl4ICsgKG1peCAtIGJhc2UubWl4KSAqIGFscGhhO1xuXHRcdHBvc2Uuc29mdG5lc3MgPSBiYXNlLnNvZnRuZXNzICsgKHNvZnRuZXNzIC0gYmFzZS5zb2Z0bmVzcykgKiBhbHBoYTtcblx0XHRpZiAob3V0KSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdHBvc2UuYmVuZERpcmVjdGlvbiA9IGJhc2UuYmVuZERpcmVjdGlvbjtcblx0XHRcdFx0cG9zZS5jb21wcmVzcyA9IGJhc2UuY29tcHJlc3M7XG5cdFx0XHRcdHBvc2Uuc3RyZXRjaCA9IGJhc2Uuc3RyZXRjaDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zZS5iZW5kRGlyZWN0aW9uID0gZnJhbWVzW2kgKyAzLypCRU5EX0RJUkVDVElPTiovXTtcblx0XHRcdHBvc2UuY29tcHJlc3MgPSBmcmFtZXNbaSArIDQvKkNPTVBSRVNTKi9dICE9PSAwO1xuXHRcdFx0cG9zZS5zdHJldGNoID0gZnJhbWVzW2kgKyA1LypTVFJFVENIKi9dICE9PSAwO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgVHJhbnNmb3JtQ29uc3RyYWludFBvc2UubWl4Um90YXRlfSwge0BsaW5rIFRyYW5zZm9ybUNvbnN0cmFpbnRQb3NlLm1peFh9LFxuICoge0BsaW5rIFRyYW5zZm9ybUNvbnN0cmFpbnRQb3NlLm1peFl9LCB7QGxpbmsgVHJhbnNmb3JtQ29uc3RyYWludFBvc2UubWl4U2NhbGVYfSxcbiAqIHtAbGluayBUcmFuc2Zvcm1Db25zdHJhaW50UG9zZS5taXhTY2FsZVl9LCBhbmQge0BsaW5rIFRyYW5zZm9ybUNvbnN0cmFpbnRQb3NlLm1peFNoZWFyWX0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtQ29uc3RyYWludFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIHRyYW5zZm9ybSBjb25zdHJhaW50IHNsb3QgaW4ge0BsaW5rIFNrZWxldG9uLnRyYW5zZm9ybUNvbnN0cmFpbnRzfSB0aGF0IHdpbGwgYmUgY2hhbmdlZC4gKi9cblx0Y29uc3RyYWludEluZGV4OiBudW1iZXIgPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGAke1Byb3BlcnR5LnRyYW5zZm9ybUNvbnN0cmFpbnR9fCR7Y29uc3RyYWludEluZGV4fWApO1xuXHRcdHRoaXMuY29uc3RyYWludEluZGV4ID0gY29uc3RyYWludEluZGV4O1xuXHRcdHRoaXMuYWRkaXRpdmUgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gNy8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUsIHJvdGF0ZSBtaXgsIHRyYW5zbGF0ZSBtaXgsIHNjYWxlIG1peCwgYW5kIHNoZWFyIG1peCBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1peFJvdGF0ZTogbnVtYmVyLCBtaXhYOiBudW1iZXIsIG1peFk6IG51bWJlciwgbWl4U2NhbGVYOiBudW1iZXIsIG1peFNjYWxlWTogbnVtYmVyLFxuXHRcdG1peFNoZWFyWTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0ZnJhbWUgKj0gNy8qRU5UUklFUyovO1xuXHRcdGZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdGZyYW1lc1tmcmFtZSArIDEvKlJPVEFURSovXSA9IG1peFJvdGF0ZTtcblx0XHRmcmFtZXNbZnJhbWUgKyAyLypYKi9dID0gbWl4WDtcblx0XHRmcmFtZXNbZnJhbWUgKyAzLypZKi9dID0gbWl4WTtcblx0XHRmcmFtZXNbZnJhbWUgKyA0LypTQ0FMRVgqL10gPSBtaXhTY2FsZVg7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgNS8qU0NBTEVZKi9dID0gbWl4U2NhbGVZO1xuXHRcdGZyYW1lc1tmcmFtZSArIDYvKlNIRUFSWSovXSA9IG1peFNoZWFyWTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uLmNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XSBhcyBUcmFuc2Zvcm1Db25zdHJhaW50O1xuXHRcdGlmICghY29uc3RyYWludC5hY3RpdmUpIHJldHVybjtcblx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBjb25zdHJhaW50LmFwcGxpZWRQb3NlIDogY29uc3RyYWludC5wb3NlO1xuXG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGlmIChmcm9tU2V0dXApIHtcblx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0XHRwb3NlLm1peFJvdGF0ZSA9IHNldHVwLm1peFJvdGF0ZTtcblx0XHRcdFx0cG9zZS5taXhYID0gc2V0dXAubWl4WDtcblx0XHRcdFx0cG9zZS5taXhZID0gc2V0dXAubWl4WTtcblx0XHRcdFx0cG9zZS5taXhTY2FsZVggPSBzZXR1cC5taXhTY2FsZVg7XG5cdFx0XHRcdHBvc2UubWl4U2NhbGVZID0gc2V0dXAubWl4U2NhbGVZO1xuXHRcdFx0XHRwb3NlLm1peFNoZWFyWSA9IHNldHVwLm1peFNoZWFyWTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgcm90YXRlOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyLCBzY2FsZVg6IG51bWJlciwgc2NhbGVZOiBudW1iZXIsIHNoZWFyWTogbnVtYmVyO1xuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCA3LypFTlRSSUVTKi8pO1xuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyA3LypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0cm90YXRlID0gZnJhbWVzW2kgKyAxLypST1RBVEUqL107XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDIvKlgqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDMvKlkqL107XG5cdFx0XHRcdHNjYWxlWCA9IGZyYW1lc1tpICsgNC8qU0NBTEVYKi9dO1xuXHRcdFx0XHRzY2FsZVkgPSBmcmFtZXNbaSArIDUvKlNDQUxFWSovXTtcblx0XHRcdFx0c2hlYXJZID0gZnJhbWVzW2kgKyA2LypTSEVBUlkqL107XG5cdFx0XHRcdGNvbnN0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0cm90YXRlICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDEvKlJPVEFURSovXSAtIHJvdGF0ZSkgKiB0O1xuXHRcdFx0XHR4ICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDIvKlgqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgMy8qWSovXSAtIHkpICogdDtcblx0XHRcdFx0c2NhbGVYICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDQvKlNDQUxFWCovXSAtIHNjYWxlWCkgKiB0O1xuXHRcdFx0XHRzY2FsZVkgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgNS8qU0NBTEVZKi9dIC0gc2NhbGVZKSAqIHQ7XG5cdFx0XHRcdHNoZWFyWSArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyA2LypTSEVBUlkqL10gLSBzaGVhclkpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0cm90YXRlID0gZnJhbWVzW2kgKyAxLypST1RBVEUqL107XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDIvKlgqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDMvKlkqL107XG5cdFx0XHRcdHNjYWxlWCA9IGZyYW1lc1tpICsgNC8qU0NBTEVYKi9dO1xuXHRcdFx0XHRzY2FsZVkgPSBmcmFtZXNbaSArIDUvKlNDQUxFWSovXTtcblx0XHRcdFx0c2hlYXJZID0gZnJhbWVzW2kgKyA2LypTSEVBUlkqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cm90YXRlID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypST1RBVEUqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypYKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypZKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0c2NhbGVYID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA0LypTQ0FMRVgqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAzIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRzY2FsZVkgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDUvKlNDQUxFWSovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDQgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHNoZWFyWSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNi8qU0hFQVJZKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNSAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRjb25zdCBiYXNlID0gZnJvbVNldHVwID8gY29uc3RyYWludC5kYXRhLnNldHVwUG9zZSA6IHBvc2U7XG5cdFx0aWYgKGFkZCkge1xuXHRcdFx0cG9zZS5taXhSb3RhdGUgPSBiYXNlLm1peFJvdGF0ZSArIHJvdGF0ZSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhYID0gYmFzZS5taXhYICsgeCAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhZID0gYmFzZS5taXhZICsgeSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhTY2FsZVggPSBiYXNlLm1peFNjYWxlWCArIHNjYWxlWCAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhTY2FsZVkgPSBiYXNlLm1peFNjYWxlWSArIHNjYWxlWSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhTaGVhclkgPSBiYXNlLm1peFNoZWFyWSArIHNoZWFyWSAqIGFscGhhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwb3NlLm1peFJvdGF0ZSA9IGJhc2UubWl4Um90YXRlICsgKHJvdGF0ZSAtIGJhc2UubWl4Um90YXRlKSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhYID0gYmFzZS5taXhYICsgKHggLSBiYXNlLm1peFgpICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFkgPSBiYXNlLm1peFkgKyAoeSAtIGJhc2UubWl4WSkgKiBhbHBoYTtcblx0XHRcdHBvc2UubWl4U2NhbGVYID0gYmFzZS5taXhTY2FsZVggKyAoc2NhbGVYIC0gYmFzZS5taXhTY2FsZVgpICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFNjYWxlWSA9IGJhc2UubWl4U2NhbGVZICsgKHNjYWxlWSAtIGJhc2UubWl4U2NhbGVZKSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhTaGVhclkgPSBiYXNlLm1peFNoZWFyWSArIChzaGVhclkgLSBiYXNlLm1peFNoZWFyWSkgKiBhbHBoYTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciB0aW1lbGluZXMgdGhhdCBjaGFuZ2UgMSBjb25zdHJhaW50IHByb3BlcnR5IHdpdGggYSBjdXJ2ZS4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb25zdHJhaW50VGltZWxpbmUxIGV4dGVuZHMgQ3VydmVUaW1lbGluZTEgaW1wbGVtZW50cyBDb25zdHJhaW50VGltZWxpbmUge1xuXHRyZWFkb25seSBjb25zdHJhaW50SW5kZXg6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlciwgcHJvcGVydHk6IFByb3BlcnR5KSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGAke3Byb3BlcnR5fXwke2NvbnN0cmFpbnRJbmRleH1gKTtcblx0XHR0aGlzLmNvbnN0cmFpbnRJbmRleCA9IGNvbnN0cmFpbnRJbmRleDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGF0aENvbnN0cmFpbnRQb3NlLnBvc2l0aW9ufS4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQ29uc3RyYWludFBvc2l0aW9uVGltZWxpbmUgZXh0ZW5kcyBDb25zdHJhaW50VGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5wYXRoQ29uc3RyYWludFBvc2l0aW9uKTtcblx0XHR0aGlzLmFkZGl0aXZlID0gdHJ1ZTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uLmNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XSBhcyBQYXRoQ29uc3RyYWludDtcblx0XHRpZiAoY29uc3RyYWludC5hY3RpdmUpIHtcblx0XHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IGNvbnN0cmFpbnQuYXBwbGllZFBvc2UgOiBjb25zdHJhaW50LnBvc2U7XG5cdFx0XHRwb3NlLnBvc2l0aW9uID0gdGhpcy5nZXRBYnNvbHV0ZVZhbHVlKHRpbWUsIGFscGhhLCBmcm9tU2V0dXAsIGFkZCwgcG9zZS5wb3NpdGlvbiwgY29uc3RyYWludC5kYXRhLnNldHVwUG9zZS5wb3NpdGlvbik7XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBQYXRoQ29uc3RyYWludFBvc2Uuc3BhY2luZ30uICovXG5leHBvcnQgY2xhc3MgUGF0aENvbnN0cmFpbnRTcGFjaW5nVGltZWxpbmUgZXh0ZW5kcyBDb25zdHJhaW50VGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5wYXRoQ29uc3RyYWludFNwYWNpbmcpO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sXG5cdFx0YWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cblx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b24uY29uc3RyYWludHNbdGhpcy5jb25zdHJhaW50SW5kZXhdIGFzIFBhdGhDb25zdHJhaW50O1xuXHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkge1xuXHRcdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gY29uc3RyYWludC5hcHBsaWVkUG9zZSA6IGNvbnN0cmFpbnQucG9zZTtcblx0XHRcdHBvc2Uuc3BhY2luZyA9IHRoaXMuZ2V0QWJzb2x1dGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBmYWxzZSwgcG9zZS5zcGFjaW5nLFxuXHRcdFx0XHRjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlLnNwYWNpbmcpO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGF0aENvbnN0cmFpbnQubWl4Um90YXRlfSwge0BsaW5rIFBhdGhDb25zdHJhaW50Lm1peFh9LCBhbmRcbiAqIHtAbGluayBQYXRoQ29uc3RyYWludC5taXhZfS4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQ29uc3RyYWludE1peFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdHJlYWRvbmx5IGNvbnN0cmFpbnRJbmRleDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGAke1Byb3BlcnR5LnBhdGhDb25zdHJhaW50TWl4fXwke2NvbnN0cmFpbnRJbmRleH1gKTtcblx0XHR0aGlzLmNvbnN0cmFpbnRJbmRleCA9IGNvbnN0cmFpbnRJbmRleDtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDQvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGFuZCBjb2xvciBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1peFJvdGF0ZTogbnVtYmVyLCBtaXhYOiBudW1iZXIsIG1peFk6IG51bWJlcikge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGZyYW1lIDw8PSAyO1xuXHRcdGZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdGZyYW1lc1tmcmFtZSArIDEvKlJPVEFURSovXSA9IG1peFJvdGF0ZTtcblx0XHRmcmFtZXNbZnJhbWUgKyAyLypYKi9dID0gbWl4WDtcblx0XHRmcmFtZXNbZnJhbWUgKyAzLypZKi9dID0gbWl4WTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbVNldHVwOiBib29sZWFuLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uLmNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XSBhcyBQYXRoQ29uc3RyYWludDtcblx0XHRpZiAoIWNvbnN0cmFpbnQuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gY29uc3RyYWludC5hcHBsaWVkUG9zZSA6IGNvbnN0cmFpbnQucG9zZTtcblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdGNvbnN0IHNldHVwID0gY29uc3RyYWludC5kYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0cG9zZS5taXhSb3RhdGUgPSBzZXR1cC5taXhSb3RhdGU7XG5cdFx0XHRcdHBvc2UubWl4WCA9IHNldHVwLm1peFg7XG5cdFx0XHRcdHBvc2UubWl4WSA9IHNldHVwLm1peFk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHJvdGF0ZTogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcjtcblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgNC8qRU5UUklFUyovKTtcblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpID4+IDJdO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0cm90YXRlID0gZnJhbWVzW2kgKyAxLypST1RBVEUqL107XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDIvKlgqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDMvKlkqL107XG5cdFx0XHRcdGNvbnN0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyA0LypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0cm90YXRlICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDEvKlJPVEFURSovXSAtIHJvdGF0ZSkgKiB0O1xuXHRcdFx0XHR4ICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDIvKlgqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovICsgMy8qWSovXSAtIHkpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0cm90YXRlID0gZnJhbWVzW2kgKyAxLypST1RBVEUqL107XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDIvKlgqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDMvKlkqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cm90YXRlID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypST1RBVEUqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypYKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypZKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRjb25zdCBiYXNlID0gZnJvbVNldHVwID8gY29uc3RyYWludC5kYXRhLnNldHVwUG9zZSA6IHBvc2U7XG5cdFx0aWYgKGFkZCkge1xuXHRcdFx0cG9zZS5taXhSb3RhdGUgPSBiYXNlLm1peFJvdGF0ZSArIHJvdGF0ZSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhYID0gYmFzZS5taXhYICsgeCAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhZID0gYmFzZS5taXhZICsgeSAqIGFscGhhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwb3NlLm1peFJvdGF0ZSA9IGJhc2UubWl4Um90YXRlICsgKHJvdGF0ZSAtIGJhc2UubWl4Um90YXRlKSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhYID0gYmFzZS5taXhYICsgKHggLSBiYXNlLm1peFgpICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFkgPSBiYXNlLm1peFkgKyAoeSAtIGJhc2UubWl4WSkgKiBhbHBoYTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciBtb3N0IHtAbGluayBQaHlzaWNzQ29uc3RyYWludH0gdGltZWxpbmVzLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUgZXh0ZW5kcyBDb25zdHJhaW50VGltZWxpbmUxIHtcblx0LyoqIEBwYXJhbSBjb25zdHJhaW50SW5kZXggLTEgZm9yIGFsbCBwaHlzaWNzIGNvbnN0cmFpbnRzIGluIHRoZSBza2VsZXRvbi4gKi9cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIsIHByb3BlcnR5OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBwcm9wZXJ0eSk7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbixcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGlmIChhZGQgJiYgIXRoaXMuYWRkaXRpdmUpIGFkZCA9IGZhbHNlO1xuXHRcdGlmICh0aGlzLmNvbnN0cmFpbnRJbmRleCA9PT0gLTEpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGltZSA+PSB0aGlzLmZyYW1lc1swXSA/IHRoaXMuZ2V0Q3VydmVWYWx1ZSh0aW1lKSA6IDA7XG5cdFx0XHRjb25zdCBjb25zdHJhaW50cyA9IHNrZWxldG9uLnBoeXNpY3M7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnN0cmFpbnQgb2YgY29uc3RyYWludHMpIHtcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnQuYWN0aXZlICYmIHRoaXMuZ2xvYmFsKGNvbnN0cmFpbnQuZGF0YSkpIHtcblx0XHRcdFx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBjb25zdHJhaW50LmFwcGxpZWRQb3NlIDogY29uc3RyYWludC5wb3NlO1xuXHRcdFx0XHRcdHRoaXMuc2V0KHBvc2UsIHRoaXMuZ2V0QWJzb2x1dGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIHRoaXMuZ2V0KHBvc2UpLCB0aGlzLmdldChjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlKSwgdmFsdWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b24uY29uc3RyYWludHNbdGhpcy5jb25zdHJhaW50SW5kZXhdIGFzIFBoeXNpY3NDb25zdHJhaW50O1xuXHRcdFx0aWYgKGNvbnN0cmFpbnQuYWN0aXZlKSB7XG5cdFx0XHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IGNvbnN0cmFpbnQuYXBwbGllZFBvc2UgOiBjb25zdHJhaW50LnBvc2U7XG5cdFx0XHRcdHRoaXMuc2V0KHBvc2UsIHRoaXMuZ2V0QWJzb2x1dGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIHRoaXMuZ2V0KHBvc2UpLCB0aGlzLmdldChjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlKSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFic3RyYWN0IGdldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlKTogbnVtYmVyO1xuXG5cdGFic3RyYWN0IHNldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlLCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHRhYnN0cmFjdCBnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW47XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludFBvc2UuaW5lcnRpYX0uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRJbmVydGlhVGltZWxpbmUgZXh0ZW5kcyBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludEluZXJ0aWEpO1xuXHR9XG5cblx0Z2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UpOiBudW1iZXIge1xuXHRcdHJldHVybiBwb3NlLmluZXJ0aWE7XG5cdH1cblxuXHRzZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuXHRcdHBvc2UuaW5lcnRpYSA9IHZhbHVlO1xuXHR9XG5cblx0Z2xvYmFsIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludERhdGEpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29uc3RyYWludC5pbmVydGlhR2xvYmFsO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludFBvc2Uuc3RyZW5ndGh9LiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50U3RyZW5ndGhUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50U3RyZW5ndGgpO1xuXHR9XG5cdGdldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gcG9zZS5zdHJlbmd0aDtcblx0fVxuXG5cdHNldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0cG9zZS5zdHJlbmd0aCA9IHZhbHVlO1xuXHR9XG5cblx0Z2xvYmFsIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludERhdGEpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29uc3RyYWludC5zdHJlbmd0aEdsb2JhbDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlLmRhbXBpbmd9LiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50RGFtcGluZ1RpbWVsaW5lIGV4dGVuZHMgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGNvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnREYW1waW5nKTtcblx0fVxuXG5cdGdldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gcG9zZS5kYW1waW5nO1xuXHR9XG5cblx0c2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRwb3NlLmRhbXBpbmcgPSB2YWx1ZTtcblx0fVxuXG5cdGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZGFtcGluZ0dsb2JhbDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlLm1hc3NJbnZlcnNlfS4gVGhlIHRpbWVsaW5lIHZhbHVlcyBhcmUgbm90IGludmVydGVkLiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50TWFzc1RpbWVsaW5lIGV4dGVuZHMgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGNvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnRNYXNzKTtcblx0fVxuXG5cdGdldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gMSAvIHBvc2UubWFzc0ludmVyc2U7XG5cdH1cblxuXHRzZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuXHRcdHBvc2UubWFzc0ludmVyc2UgPSAxIC8gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50Lm1hc3NHbG9iYWw7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50UG9zZS53aW5kfS4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludFdpbmRUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50V2luZCk7XG5cdFx0dGhpcy5hZGRpdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRnZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHBvc2Uud2luZDtcblx0fVxuXG5cdHNldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0cG9zZS53aW5kID0gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50LndpbmRHbG9iYWw7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50UG9zZS5ncmF2aXR5fS4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludEdyYXZpdHlUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50R3Jhdml0eSk7XG5cdFx0dGhpcy5hZGRpdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRnZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHBvc2UuZ3Jhdml0eTtcblx0fVxuXG5cdHNldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0cG9zZS5ncmF2aXR5ID0gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50LmdyYXZpdHlHbG9iYWw7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50UG9zZS5taXh9LiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50TWl4VGltZWxpbmUgZXh0ZW5kcyBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludE1peCk7XG5cdH1cblxuXHRnZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHBvc2UubWl4O1xuXHR9XG5cblx0c2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRwb3NlLm1peCA9IHZhbHVlO1xuXHR9XG5cblx0Z2xvYmFsIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludERhdGEpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29uc3RyYWludC5taXhHbG9iYWw7XG5cdH1cbn1cblxuLyoqIFJlc2V0cyBhIHBoeXNpY3MgY29uc3RyYWludCB3aGVuIHNwZWNpZmljIGFuaW1hdGlvbiB0aW1lcyBhcmUgcmVhY2hlZC4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludFJlc2V0VGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSBpbXBsZW1lbnRzIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdHByaXZhdGUgc3RhdGljIHByb3BlcnR5SWRzOiBzdHJpbmdbXSA9IFtQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludFJlc2V0LnRvU3RyaW5nKCldO1xuXG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIHBoeXNpY3MgY29uc3RyYWludCBpbiB7QGxpbmsgU2tlbGV0b24uY29udHJhaW50c30gdGhhdCB3aWxsIGJlIHJlc2V0IHdoZW4gdGhpcyB0aW1lbGluZSBpc1xuXHQqIGFwcGxpZWQsIG9yIC0xIGlmIGFsbCBwaHlzaWNzIGNvbnN0cmFpbnRzIGluIHRoZSBza2VsZXRvbiB3aWxsIGJlIHJlc2V0LiAqL1xuXHRyZWFkb25seSBjb25zdHJhaW50SW5kZXg6IG51bWJlcjtcblxuXHQvKiogQHBhcmFtIGNvbnN0cmFpbnRJbmRleCAtMSBmb3IgYWxsIHBoeXNpY3MgY29uc3RyYWludHMgaW4gdGhlIHNrZWxldG9uLiAqL1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIC4uLlBoeXNpY3NDb25zdHJhaW50UmVzZXRUaW1lbGluZS5wcm9wZXJ0eUlkcyk7XG5cdFx0dGhpcy5jb25zdHJhaW50SW5kZXggPSBjb25zdHJhaW50SW5kZXg7XG5cdFx0dGhpcy5pbnN0YW50ID0gdHJ1ZTtcblx0fVxuXG5cdGdldEZyYW1lQ291bnQgKCkge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIpIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHR9XG5cblx0LyoqIFJlc2V0cyB0aGUgcGh5c2ljcyBjb25zdHJhaW50IHdoZW4gZnJhbWVzID4gYGxhc3RUaW1lYCBhbmQgPD0gYHRpbWVgLiAqL1xuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbixcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGxldCBjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCB8IHVuZGVmaW5lZDtcblx0XHRpZiAodGhpcy5jb25zdHJhaW50SW5kZXggIT09IC0xKSB7XG5cdFx0XHRjb25zdHJhaW50ID0gc2tlbGV0b24uY29uc3RyYWludHNbdGhpcy5jb25zdHJhaW50SW5kZXhdIGFzIFBoeXNpY3NDb25zdHJhaW50O1xuXHRcdFx0aWYgKCFjb25zdHJhaW50LmFjdGl2ZSkgcmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXG5cdFx0aWYgKGxhc3RUaW1lID4gdGltZSkgeyAvLyBBcHBseSBhZnRlciBsYXN0VGltZSBmb3IgbG9vcGVkIGFuaW1hdGlvbnMuXG5cdFx0XHR0aGlzLmFwcGx5KHNrZWxldG9uLCBsYXN0VGltZSwgTnVtYmVyLk1BWF9WQUxVRSwgW10sIGFscGhhLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRsYXN0VGltZSA9IC0xO1xuXHRcdH0gZWxzZSBpZiAobGFzdFRpbWUgPj0gZnJhbWVzW2ZyYW1lcy5sZW5ndGggLSAxXSkgLy8gTGFzdCB0aW1lIGlzIGFmdGVyIGxhc3QgZnJhbWUuXG5cdFx0XHRyZXR1cm47XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHJldHVybjtcblxuXHRcdGlmIChsYXN0VGltZSA8IGZyYW1lc1swXSB8fCB0aW1lID49IGZyYW1lc1tUaW1lbGluZS5zZWFyY2goZnJhbWVzLCBsYXN0VGltZSkgKyAxXSkge1xuXHRcdFx0aWYgKGNvbnN0cmFpbnQgIT0gbnVsbClcblx0XHRcdFx0Y29uc3RyYWludC5yZXNldChza2VsZXRvbik7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Zm9yIChjb25zdCBjb25zdHJhaW50IG9mIHNrZWxldG9uLnBoeXNpY3MpIHtcblx0XHRcdFx0XHRpZiAoY29uc3RyYWludC5hY3RpdmUpIGNvbnN0cmFpbnQucmVzZXQoc2tlbGV0b24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBTbGlkZXJQb3NlLnRpbWV9LiAqL1xuZXhwb3J0IGNsYXNzIFNsaWRlclRpbWVsaW5lIGV4dGVuZHMgQ29uc3RyYWludFRpbWVsaW5lMSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGNvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkuc2xpZGVyVGltZSk7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbixcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbi5jb25zdHJhaW50c1t0aGlzLmNvbnN0cmFpbnRJbmRleF0gYXMgU2xpZGVyO1xuXHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkge1xuXHRcdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gY29uc3RyYWludC5hcHBsaWVkUG9zZSA6IGNvbnN0cmFpbnQucG9zZTtcblx0XHRcdHBvc2UudGltZSA9IHRoaXMuZ2V0QWJzb2x1dGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIHBvc2UudGltZSwgY29uc3RyYWludC5kYXRhLnNldHVwUG9zZS50aW1lKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFNsaWRlclBvc2UubWl4fS4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkZXJNaXhUaW1lbGluZSBleHRlbmRzIENvbnN0cmFpbnRUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnNsaWRlck1peCk7XG5cdFx0dGhpcy5hZGRpdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbixcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbi5jb25zdHJhaW50c1t0aGlzLmNvbnN0cmFpbnRJbmRleF0gYXMgU2xpZGVyO1xuXHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkge1xuXHRcdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gY29uc3RyYWludC5hcHBsaWVkUG9zZSA6IGNvbnN0cmFpbnQucG9zZTtcblx0XHRcdHBvc2UubWl4ID0gdGhpcy5nZXRBYnNvbHV0ZVZhbHVlKHRpbWUsIGFscGhhLCBmcm9tU2V0dXAsIGFkZCwgcG9zZS5taXgsIGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2UubWl4KTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==