@esotericsoftware/spine-core 4.2.117 → 4.3.1

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 +132 -0
  16. package/dist/BonePose.js +456 -0
  17. package/dist/Constraint.d.ts +41 -0
  18. package/dist/Constraint.js +38 -0
  19. package/dist/ConstraintData.d.ts +16 -5
  20. package/dist/ConstraintData.js +15 -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 +23 -28
  28. package/dist/IkConstraint.js +122 -124
  29. package/dist/IkConstraintData.d.ts +14 -19
  30. package/dist/IkConstraintData.js +22 -23
  31. package/dist/IkConstraintPose.d.ts +49 -0
  32. package/dist/IkConstraintPose.js +55 -0
  33. package/dist/PathConstraint.d.ts +18 -23
  34. package/dist/PathConstraint.js +162 -139
  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 +114 -94
  43. package/dist/PhysicsConstraintData.d.ts +28 -13
  44. package/dist/PhysicsConstraintData.js +35 -13
  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 +655 -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 +895 -640
  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 +14 -3
  98. package/dist/Utils.js +80 -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 +7747 -6116
  121. package/dist/esm/spine-core.mjs.map +4 -4
  122. package/dist/iife/spine-core.js +7747 -6116
  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
@@ -26,12 +26,13 @@
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 { Color, MathUtils, Utils } from "../Utils.js";
29
+ import { Color, MathUtils } from "../Utils.js";
30
30
  import { Attachment } from "./Attachment.js";
31
31
  /** An attachment that displays a textured quadrilateral.
32
32
  *
33
33
  * See [Region attachments](http://esotericsoftware.com/spine-regions) in the Spine User Guide. */
34
34
  export class RegionAttachment extends Attachment {
35
+ sequence;
35
36
  /** The local x translation. */
36
37
  x = 0;
37
38
  /** The local y translation. */
@@ -40,34 +41,103 @@ export class RegionAttachment extends Attachment {
40
41
  scaleX = 1;
41
42
  /** The local scaleY. */
42
43
  scaleY = 1;
43
- /** The local rotation. */
44
+ /** The local rotation in degrees, counter clockwise. */
44
45
  rotation = 0;
45
46
  /** The width of the region attachment in Spine. */
46
47
  width = 0;
47
48
  /** The height of the region attachment in Spine. */
48
49
  height = 0;
49
- /** The color to tint the region attachment. */
50
- color = new Color(1, 1, 1, 1);
51
50
  /** The name of the texture region for this attachment. */
52
51
  path;
53
- region = null;
54
- sequence = null;
55
- /** For each of the 4 vertices, a pair of <code>x,y</code> values that is the local position of the vertex.
56
- *
57
- * See {@link #updateOffset()}. */
58
- offset = Utils.newFloatArray(8);
59
- uvs = Utils.newFloatArray(8);
52
+ /** The color to tint the region attachment. */
53
+ color = new Color(1, 1, 1, 1);
60
54
  tempColor = new Color(1, 1, 1, 1);
61
- constructor(name, path) {
55
+ constructor(name, sequence) {
62
56
  super(name);
63
- this.path = path;
57
+ this.sequence = sequence;
58
+ }
59
+ copy() {
60
+ const copy = new RegionAttachment(this.name, this.sequence.copy());
61
+ copy.path = this.path;
62
+ copy.x = this.x;
63
+ copy.y = this.y;
64
+ copy.scaleX = this.scaleX;
65
+ copy.scaleY = this.scaleY;
66
+ copy.rotation = this.rotation;
67
+ copy.width = this.width;
68
+ copy.height = this.height;
69
+ copy.color.setFromColor(this.color);
70
+ return copy;
71
+ }
72
+ /** Transforms the attachment's four vertices to world coordinates.
73
+ *
74
+ * See <a href="http://esotericsoftware.com/spine-runtime-skeletons#World-transforms">World transforms</a> in the Spine
75
+ * Runtimes Guide.
76
+ * @param worldVertices The output world vertices. Must have a length >= `offset` + 8.
77
+ * @param offset The `worldVertices` index to begin writing values.
78
+ * @param stride The number of `worldVertices` entries between the value pairs written. */
79
+ computeWorldVertices(slot, vertexOffsets, worldVertices, offset, stride) {
80
+ const bone = slot.bone.appliedPose;
81
+ const x = bone.worldX, y = bone.worldY;
82
+ const a = bone.a, b = bone.b, c = bone.c, d = bone.d;
83
+ let offsetX = vertexOffsets[0];
84
+ let offsetY = vertexOffsets[1];
85
+ worldVertices[offset] = offsetX * a + offsetY * b + x; // br
86
+ worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
87
+ offset += stride;
88
+ offsetX = vertexOffsets[2];
89
+ offsetY = vertexOffsets[3];
90
+ worldVertices[offset] = offsetX * a + offsetY * b + x; // bl
91
+ worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
92
+ offset += stride;
93
+ offsetX = vertexOffsets[4];
94
+ offsetY = vertexOffsets[5];
95
+ worldVertices[offset] = offsetX * a + offsetY * b + x; // ul
96
+ worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
97
+ offset += stride;
98
+ offsetX = vertexOffsets[6];
99
+ offsetY = vertexOffsets[7];
100
+ worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
101
+ worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
102
+ }
103
+ getOffsets(pose) {
104
+ // biome-ignore lint/style/noNonNullAssertion: offsets are always defined after updateSequence
105
+ return this.sequence.offsets[this.sequence.resolveIndex(pose)];
106
+ }
107
+ updateSequence() {
108
+ this.sequence.update(this);
64
109
  }
65
- /** Calculates the {@link #offset} using the region settings. Must be called after changing region settings. */
66
- updateRegion() {
67
- if (!this.region)
110
+ /** Computes {@link Sequence.getUVs | UVs} and {@link Sequence.getOffsets | offsets} for a region attachment.
111
+ * @param uvs Output array for the computed UVs, length of 8.
112
+ * @param offset Output array for the computed vertex offsets, length of 8. */
113
+ static computeUVs(region, x, y, scaleX, scaleY, rotation, width, height, offset, uvs) {
114
+ if (!region)
68
115
  throw new Error("Region not set.");
69
- let region = this.region;
70
- let uvs = this.uvs;
116
+ const regionScaleX = width / region.originalWidth * scaleX;
117
+ const regionScaleY = height / region.originalHeight * scaleY;
118
+ const localX = -width / 2 * scaleX + region.offsetX * regionScaleX;
119
+ const localY = -height / 2 * scaleY + region.offsetY * regionScaleY;
120
+ const localX2 = localX + region.width * regionScaleX;
121
+ const localY2 = localY + region.height * regionScaleY;
122
+ const radians = rotation * MathUtils.degRad;
123
+ const cos = Math.cos(radians);
124
+ const sin = Math.sin(radians);
125
+ const localXCos = localX * cos + x;
126
+ const localXSin = localX * sin;
127
+ const localYCos = localY * cos + y;
128
+ const localYSin = localY * sin;
129
+ const localX2Cos = localX2 * cos + x;
130
+ const localX2Sin = localX2 * sin;
131
+ const localY2Cos = localY2 * cos + y;
132
+ const localY2Sin = localY2 * sin;
133
+ offset[0] = localXCos - localYSin;
134
+ offset[1] = localYCos + localXSin;
135
+ offset[2] = localXCos - localY2Sin;
136
+ offset[3] = localY2Cos + localXSin;
137
+ offset[4] = localX2Cos - localY2Sin;
138
+ offset[5] = localY2Cos + localX2Sin;
139
+ offset[6] = localX2Cos - localYSin;
140
+ offset[7] = localYCos + localX2Sin;
71
141
  if (region == null) {
72
142
  uvs[0] = 0;
73
143
  uvs[1] = 0;
@@ -77,108 +147,26 @@ export class RegionAttachment extends Attachment {
77
147
  uvs[5] = 1;
78
148
  uvs[6] = 1;
79
149
  uvs[7] = 0;
80
- return;
81
- }
82
- let regionScaleX = this.width / this.region.originalWidth * this.scaleX;
83
- let regionScaleY = this.height / this.region.originalHeight * this.scaleY;
84
- let localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX;
85
- let localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY;
86
- let localX2 = localX + this.region.width * regionScaleX;
87
- let localY2 = localY + this.region.height * regionScaleY;
88
- let radians = this.rotation * MathUtils.degRad;
89
- let cos = Math.cos(radians);
90
- let sin = Math.sin(radians);
91
- let x = this.x, y = this.y;
92
- let localXCos = localX * cos + x;
93
- let localXSin = localX * sin;
94
- let localYCos = localY * cos + y;
95
- let localYSin = localY * sin;
96
- let localX2Cos = localX2 * cos + x;
97
- let localX2Sin = localX2 * sin;
98
- let localY2Cos = localY2 * cos + y;
99
- let localY2Sin = localY2 * sin;
100
- let offset = this.offset;
101
- offset[0] = localXCos - localYSin;
102
- offset[1] = localYCos + localXSin;
103
- offset[2] = localXCos - localY2Sin;
104
- offset[3] = localY2Cos + localXSin;
105
- offset[4] = localX2Cos - localY2Sin;
106
- offset[5] = localY2Cos + localX2Sin;
107
- offset[6] = localX2Cos - localYSin;
108
- offset[7] = localYCos + localX2Sin;
109
- if (region.degrees == 90) {
110
- uvs[0] = region.u2;
111
- uvs[1] = region.v2;
112
- uvs[2] = region.u;
113
- uvs[3] = region.v2;
114
- uvs[4] = region.u;
115
- uvs[5] = region.v;
116
- uvs[6] = region.u2;
117
- uvs[7] = region.v;
118
150
  }
119
151
  else {
120
- uvs[0] = region.u;
121
152
  uvs[1] = region.v2;
122
153
  uvs[2] = region.u;
123
- uvs[3] = region.v;
124
- uvs[4] = region.u2;
125
154
  uvs[5] = region.v;
126
155
  uvs[6] = region.u2;
127
- uvs[7] = region.v2;
156
+ if (region.degrees === 90) {
157
+ uvs[0] = region.u2;
158
+ uvs[3] = region.v2;
159
+ uvs[4] = region.u;
160
+ uvs[7] = region.v;
161
+ }
162
+ else {
163
+ uvs[0] = region.u;
164
+ uvs[3] = region.v;
165
+ uvs[4] = region.u2;
166
+ uvs[7] = region.v2;
167
+ }
128
168
  }
129
169
  }
130
- /** Transforms the attachment's four vertices to world coordinates. If the attachment has a {@link #sequence}, the region may
131
- * be changed.
132
- * <p>
133
- * See <a href="http://esotericsoftware.com/spine-runtime-skeletons#World-transforms">World transforms</a> in the Spine
134
- * Runtimes Guide.
135
- * @param worldVertices The output world vertices. Must have a length >= <code>offset</code> + 8.
136
- * @param offset The <code>worldVertices</code> index to begin writing values.
137
- * @param stride The number of <code>worldVertices</code> entries between the value pairs written. */
138
- computeWorldVertices(slot, worldVertices, offset, stride) {
139
- if (this.sequence != null)
140
- this.sequence.apply(slot, this);
141
- let bone = slot.bone;
142
- let vertexOffset = this.offset;
143
- let x = bone.worldX, y = bone.worldY;
144
- let a = bone.a, b = bone.b, c = bone.c, d = bone.d;
145
- let offsetX = 0, offsetY = 0;
146
- offsetX = vertexOffset[0];
147
- offsetY = vertexOffset[1];
148
- worldVertices[offset] = offsetX * a + offsetY * b + x; // br
149
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
150
- offset += stride;
151
- offsetX = vertexOffset[2];
152
- offsetY = vertexOffset[3];
153
- worldVertices[offset] = offsetX * a + offsetY * b + x; // bl
154
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
155
- offset += stride;
156
- offsetX = vertexOffset[4];
157
- offsetY = vertexOffset[5];
158
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ul
159
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
160
- offset += stride;
161
- offsetX = vertexOffset[6];
162
- offsetY = vertexOffset[7];
163
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
164
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
165
- }
166
- copy() {
167
- let copy = new RegionAttachment(this.name, this.path);
168
- copy.region = this.region;
169
- copy.x = this.x;
170
- copy.y = this.y;
171
- copy.scaleX = this.scaleX;
172
- copy.scaleY = this.scaleY;
173
- copy.rotation = this.rotation;
174
- copy.width = this.width;
175
- copy.height = this.height;
176
- Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8);
177
- Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8);
178
- copy.color.setFromColor(this.color);
179
- copy.sequence = this.sequence != null ? this.sequence.copy() : null;
180
- return copy;
181
- }
182
170
  static X1 = 0;
183
171
  static Y1 = 1;
184
172
  static C1R = 2;
@@ -212,4 +200,4 @@ export class RegionAttachment extends Attachment {
212
200
  static U4 = 30;
213
201
  static V4 = 31;
214
202
  }
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdHRhY2htZW50cy9SZWdpb25BdHRhY2htZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUkvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBbUIsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUs3Qzs7a0dBRWtHO0FBQ2xHLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxVQUFVO0lBQy9DLCtCQUErQjtJQUMvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRU4sK0JBQStCO0lBQy9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFTix3QkFBd0I7SUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLHdCQUF3QjtJQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsMEJBQTBCO0lBQzFCLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFYixtREFBbUQ7SUFDbkQsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVWLG9EQUFvRDtJQUNwRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsK0NBQStDO0lBQy9DLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU5QiwwREFBMEQ7SUFDMUQsSUFBSSxDQUFTO0lBRWIsTUFBTSxHQUF5QixJQUFJLENBQUM7SUFDcEMsUUFBUSxHQUFvQixJQUFJLENBQUM7SUFFakM7O3NDQUVrQztJQUNsQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQyxHQUFHLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3QixTQUFTLEdBQUcsSUFB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VUFBVSxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksVUFBVSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDL0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztRQUVuQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLENB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LEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBCb25lIH0gZnJvbSBcIi4uL0JvbmUuanNcIjtcbmltcG9ydCB7IFRleHR1cmVSZWdpb24gfSBmcm9tIFwiLi4vVGV4dHVyZS5qc1wiO1xuaW1wb3J0IHsgQ29sb3IsIE1hdGhVdGlscywgTnVtYmVyQXJyYXlMaWtlLCBVdGlscyB9IGZyb20gXCIuLi9VdGlscy5qc1wiO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gXCIuL0F0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IEhhc1RleHR1cmVSZWdpb24gfSBmcm9tIFwiLi9IYXNUZXh0dXJlUmVnaW9uLmpzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIi4uL1Nsb3QuanNcIjtcblxuLyoqIEFuIGF0dGFjaG1lbnQgdGhhdCBkaXNwbGF5cyBhIHRleHR1cmVkIHF1YWRyaWxhdGVyYWwuXG4gKlxuICogU2VlIFtSZWdpb24gYXR0YWNobWVudHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1yZWdpb25zKSBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpb25BdHRhY2htZW50IGV4dGVuZHMgQXR0YWNobWVudCBpbXBsZW1lbnRzIEhhc1RleHR1cmVSZWdpb24ge1xuXHQvKiogVGhlIGxvY2FsIHggdHJhbnNsYXRpb24uICovXG5cdHggPSAwO1xuXG5cdC8qKiBUaGUgbG9jYWwgeSB0cmFuc2xhdGlvbi4gKi9cblx0eSA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCBzY2FsZVguICovXG5cdHNjYWxlWCA9IDE7XG5cblx0LyoqIFRoZSBsb2NhbCBzY2FsZVkuICovXG5cdHNjYWxlWSA9IDE7XG5cblx0LyoqIFRoZSBsb2NhbCByb3RhdGlvbi4gKi9cblx0cm90YXRpb24gPSAwO1xuXG5cdC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiBhdHRhY2htZW50IGluIFNwaW5lLiAqL1xuXHR3aWR0aCA9IDA7XG5cblx0LyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiBhdHRhY2htZW50IGluIFNwaW5lLiAqL1xuXHRoZWlnaHQgPSAwO1xuXG5cdC8qKiBUaGUgY29sb3IgdG8gdGludCB0aGUgcmVnaW9uIGF0dGFjaG1lbnQuICovXG5cdGNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuXG5cdC8qKiBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSByZWdpb24gZm9yIHRoaXMgYXR0YWNobWVudC4gKi9cblx0cGF0aDogc3RyaW5nO1xuXG5cdHJlZ2lvbjogVGV4dHVyZVJlZ2lvbiB8IG51bGwgPSBudWxsO1xuXHRzZXF1ZW5jZTogU2VxdWVuY2UgfCBudWxsID0gbnVsbDtcblxuXHQvKiogRm9yIGVhY2ggb2YgdGhlIDQgdmVydGljZXMsIGEgcGFpciBvZiA8Y29kZT54LHk8L2NvZGU+IHZhbHVlcyB0aGF0IGlzIHRoZSBsb2NhbCBwb3NpdGlvbiBvZiB0aGUgdmVydGV4LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rICN1cGRhdGVPZmZzZXQoKX0uICovXG5cdG9mZnNldCA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoOCk7XG5cblx0dXZzID0gVXRpbHMubmV3RmxvYXRBcnJheSg4KTtcblxuXHR0ZW1wQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSk7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XG5cdFx0c3VwZXIobmFtZSk7XG5cdFx0dGhpcy5wYXRoID0gcGF0aDtcblx0fVxuXG5cdC8qKiBDYWxjdWxhdGVzIHRoZSB7QGxpbmsgI29mZnNldH0gdXNpbmcgdGhlIHJlZ2lvbiBzZXR0aW5ncy4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hhbmdpbmcgcmVnaW9uIHNldHRpbmdzLiAqL1xuXHR1cGRhdGVSZWdpb24gKCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5yZWdpb24pIHRocm93IG5ldyBFcnJvcihcIlJlZ2lvbiBub3Qgc2V0LlwiKTtcblx0XHRsZXQgcmVnaW9uID0gdGhpcy5yZWdpb247XG5cdFx0bGV0IHV2cyA9IHRoaXMudXZzO1xuXG5cdFx0aWYgKHJlZ2lvbiA9PSBudWxsKSB7XG5cdFx0XHR1dnNbMF0gPSAwO1xuXHRcdFx0dXZzWzFdID0gMDtcblx0XHRcdHV2c1syXSA9IDA7XG5cdFx0XHR1dnNbM10gPSAxO1xuXHRcdFx0dXZzWzRdID0gMTtcblx0XHRcdHV2c1s1XSA9IDE7XG5cdFx0XHR1dnNbNl0gPSAxO1xuXHRcdFx0dXZzWzddID0gMDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgcmVnaW9uU2NhbGVYID0gdGhpcy53aWR0aCAvIHRoaXMucmVnaW9uLm9yaWdpbmFsV2lkdGggKiB0aGlzLnNjYWxlWDtcblx0XHRsZXQgcmVnaW9uU2NhbGVZID0gdGhpcy5oZWlnaHQgLyB0aGlzLnJlZ2lvbi5vcmlnaW5hbEhlaWdodCAqIHRoaXMuc2NhbGVZO1xuXHRcdGxldCBsb2NhbFggPSAtdGhpcy53aWR0aCAvIDIgKiB0aGlzLnNjYWxlWCArIHRoaXMucmVnaW9uLm9mZnNldFggKiByZWdpb25TY2FsZVg7XG5cdFx0bGV0IGxvY2FsWSA9IC10aGlzLmhlaWdodCAvIDIgKiB0aGlzLnNjYWxlWSArIHRoaXMucmVnaW9uLm9mZnNldFkgKiByZWdpb25TY2FsZVk7XG5cdFx0bGV0IGxvY2FsWDIgPSBsb2NhbFggKyB0aGlzLnJlZ2lvbi53aWR0aCAqIHJlZ2lvblNjYWxlWDtcblx0XHRsZXQgbG9jYWxZMiA9IGxvY2FsWSArIHRoaXMucmVnaW9uLmhlaWdodCAqIHJlZ2lvblNjYWxlWTtcblx0XHRsZXQgcmFkaWFucyA9IHRoaXMucm90YXRpb24gKiBNYXRoVXRpbHMuZGVnUmFkO1xuXHRcdGxldCBjb3MgPSBNYXRoLmNvcyhyYWRpYW5zKTtcblx0XHRsZXQgc2luID0gTWF0aC5zaW4ocmFkaWFucyk7XG5cdFx0bGV0IHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG5cdFx0bGV0IGxvY2FsWENvcyA9IGxvY2FsWCAqIGNvcyArIHg7XG5cdFx0bGV0IGxvY2FsWFNpbiA9IGxvY2FsWCAqIHNpbjtcblx0XHRsZXQgbG9jYWxZQ29zID0gbG9jYWxZICogY29zICsgeTtcblx0XHRsZXQgbG9jYWxZU2luID0gbG9jYWxZICogc2luO1xuXHRcdGxldCBsb2NhbFgyQ29zID0gbG9jYWxYMiAqIGNvcyArIHg7XG5cdFx0bGV0IGxvY2FsWDJTaW4gPSBsb2NhbFgyICogc2luO1xuXHRcdGxldCBsb2NhbFkyQ29zID0gbG9jYWxZMiAqIGNvcyArIHk7XG5cdFx0bGV0IGxvY2FsWTJTaW4gPSBsb2NhbFkyICogc2luO1xuXHRcdGxldCBvZmZzZXQgPSB0aGlzLm9mZnNldDtcblx0XHRvZmZzZXRbMF0gPSBsb2NhbFhDb3MgLSBsb2NhbFlTaW47XG5cdFx0b2Zmc2V0WzFdID0gbG9jYWxZQ29zICsgbG9jYWxYU2luO1xuXHRcdG9mZnNldFsyXSA9IGxvY2FsWENvcyAtIGxvY2FsWTJTaW47XG5cdFx0b2Zmc2V0WzNdID0gbG9jYWxZMkNvcyArIGxvY2FsWFNpbjtcblx0XHRvZmZzZXRbNF0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZMlNpbjtcblx0XHRvZmZzZXRbNV0gPSBsb2NhbFkyQ29zICsgbG9jYWxYMlNpbjtcblx0XHRvZmZzZXRbNl0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZU2luO1xuXHRcdG9mZnNldFs3XSA9IGxvY2FsWUNvcyArIGxvY2FsWDJTaW47XG5cblx0XHRpZiAocmVnaW9uLmRlZ3JlZXMgPT0gOTApIHtcblx0XHRcdHV2c1swXSA9IHJlZ2lvbi51Mjtcblx0XHRcdHV2c1sxXSA9IHJlZ2lvbi52Mjtcblx0XHRcdHV2c1syXSA9IHJlZ2lvbi51O1xuXHRcdFx0dXZzWzNdID0gcmVnaW9uLnYyO1xuXHRcdFx0dXZzWzRdID0gcmVnaW9uLnU7XG5cdFx0XHR1dnNbNV0gPSByZWdpb24udjtcblx0XHRcdHV2c1s2XSA9IHJlZ2lvbi51Mjtcblx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1dnNbMF0gPSByZWdpb24udTtcblx0XHRcdHV2c1sxXSA9IHJlZ2lvbi52Mjtcblx0XHRcdHV2c1syXSA9IHJlZ2lvbi51O1xuXHRcdFx0dXZzWzNdID0gcmVnaW9uLnY7XG5cdFx0XHR1dnNbNF0gPSByZWdpb24udTI7XG5cdFx0XHR1dnNbNV0gPSByZWdpb24udjtcblx0XHRcdHV2c1s2XSA9IHJlZ2lvbi51Mjtcblx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52Mjtcblx0XHR9XG5cdH1cblxuXHQvKiogVHJhbnNmb3JtcyB0aGUgYXR0YWNobWVudCdzIGZvdXIgdmVydGljZXMgdG8gd29ybGQgY29vcmRpbmF0ZXMuIElmIHRoZSBhdHRhY2htZW50IGhhcyBhIHtAbGluayAjc2VxdWVuY2V9LCB0aGUgcmVnaW9uIG1heVxuXHQgKiBiZSBjaGFuZ2VkLlxuXHQgKiA8cD5cblx0ICogU2VlIDxhIGhyZWY9XCJodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtcnVudGltZS1za2VsZXRvbnMjV29ybGQtdHJhbnNmb3Jtc1wiPldvcmxkIHRyYW5zZm9ybXM8L2E+IGluIHRoZSBTcGluZVxuXHQgKiBSdW50aW1lcyBHdWlkZS5cblx0ICogQHBhcmFtIHdvcmxkVmVydGljZXMgVGhlIG91dHB1dCB3b3JsZCB2ZXJ0aWNlcy4gTXVzdCBoYXZlIGEgbGVuZ3RoID49IDxjb2RlPm9mZnNldDwvY29kZT4gKyA4LlxuXHQgKiBAcGFyYW0gb2Zmc2V0IFRoZSA8Y29kZT53b3JsZFZlcnRpY2VzPC9jb2RlPiBpbmRleCB0byBiZWdpbiB3cml0aW5nIHZhbHVlcy5cblx0ICogQHBhcmFtIHN0cmlkZSBUaGUgbnVtYmVyIG9mIDxjb2RlPndvcmxkVmVydGljZXM8L2NvZGU+IGVudHJpZXMgYmV0d2VlbiB0aGUgdmFsdWUgcGFpcnMgd3JpdHRlbi4gKi9cblx0Y29tcHV0ZVdvcmxkVmVydGljZXMgKHNsb3Q6IFNsb3QsIHdvcmxkVmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgb2Zmc2V0OiBudW1iZXIsIHN0cmlkZTogbnVtYmVyKSB7XG5cdFx0aWYgKHRoaXMuc2VxdWVuY2UgIT0gbnVsbClcblx0XHRcdHRoaXMuc2VxdWVuY2UuYXBwbHkoc2xvdCwgdGhpcyk7XG5cblx0XHRsZXQgYm9uZSA9IHNsb3QuYm9uZTtcblx0XHRsZXQgdmVydGV4T2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG5cdFx0bGV0IHggPSBib25lLndvcmxkWCwgeSA9IGJvbmUud29ybGRZO1xuXHRcdGxldCBhID0gYm9uZS5hLCBiID0gYm9uZS5iLCBjID0gYm9uZS5jLCBkID0gYm9uZS5kO1xuXHRcdGxldCBvZmZzZXRYID0gMCwgb2Zmc2V0WSA9IDA7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzBdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbMV07XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIGJyXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzJdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbM107XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIGJsXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzRdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbNV07XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIHVsXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzZdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbN107XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIHVyXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHR9XG5cblx0Y29weSAoKTogQXR0YWNobWVudCB7XG5cdFx0bGV0IGNvcHkgPSBuZXcgUmVnaW9uQXR0YWNobWVudCh0aGlzLm5hbWUsIHRoaXMucGF0aCk7XG5cdFx0Y29weS5yZWdpb24gPSB0aGlzLnJlZ2lvbjtcblx0XHRjb3B5LnggPSB0aGlzLng7XG5cdFx0Y29weS55ID0gdGhpcy55O1xuXHRcdGNvcHkuc2NhbGVYID0gdGhpcy5zY2FsZVg7XG5cdFx0Y29weS5zY2FsZVkgPSB0aGlzLnNjYWxlWTtcblx0XHRjb3B5LnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcblx0XHRjb3B5LndpZHRoID0gdGhpcy53aWR0aDtcblx0XHRjb3B5LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLnV2cywgMCwgY29weS51dnMsIDAsIDgpO1xuXHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLm9mZnNldCwgMCwgY29weS5vZmZzZXQsIDAsIDgpO1xuXHRcdGNvcHkuY29sb3Iuc2V0RnJvbUNvbG9yKHRoaXMuY29sb3IpO1xuXHRcdGNvcHkuc2VxdWVuY2UgPSB0aGlzLnNlcXVlbmNlICE9IG51bGwgPyB0aGlzLnNlcXVlbmNlLmNvcHkoKSA6IG51bGw7XG5cdFx0cmV0dXJuIGNvcHk7XG5cdH1cblxuXHRzdGF0aWMgWDEgPSAwO1xuXHRzdGF0aWMgWTEgPSAxO1xuXHRzdGF0aWMgQzFSID0gMjtcblx0c3RhdGljIEMxRyA9IDM7XG5cdHN0YXRpYyBDMUIgPSA0O1xuXHRzdGF0aWMgQzFBID0gNTtcblx0c3RhdGljIFUxID0gNjtcblx0c3RhdGljIFYxID0gNztcblxuXHRzdGF0aWMgWDIgPSA4O1xuXHRzdGF0aWMgWTIgPSA5O1xuXHRzdGF0aWMgQzJSID0gMTA7XG5cdHN0YXRpYyBDMkcgPSAxMTtcblx0c3RhdGljIEMyQiA9IDEyO1xuXHRzdGF0aWMgQzJBID0gMTM7XG5cdHN0YXRpYyBVMiA9IDE0O1xuXHRzdGF0aWMgVjIgPSAxNTtcblxuXHRzdGF0aWMgWDMgPSAxNjtcblx0c3RhdGljIFkzID0gMTc7XG5cdHN0YXRpYyBDM1IgPSAxODtcblx0c3RhdGljIEMzRyA9IDE5O1xuXHRzdGF0aWMgQzNCID0gMjA7XG5cdHN0YXRpYyBDM0EgPSAyMTtcblx0c3RhdGljIFUzID0gMjI7XG5cdHN0YXRpYyBWMyA9IDIzO1xuXG5cdHN0YXRpYyBYNCA9IDI0O1xuXHRzdGF0aWMgWTQgPSAyNTtcblx0c3RhdGljIEM0UiA9IDI2O1xuXHRzdGF0aWMgQzRHID0gMjc7XG5cdHN0YXRpYyBDNEIgPSAyODtcblx0c3RhdGljIEM0QSA9IDI5O1xuXHRzdGF0aWMgVTQgPSAzMDtcblx0c3RhdGljIFY0ID0gMzE7XG59XG4iXX0=
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdHRhY2htZW50cy9SZWdpb25BdHRhY2htZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUsvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBd0IsTUFBTSxhQUFhLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSTdDOztrR0FFa0c7QUFDbEcsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFVBQVU7SUFDdEMsUUFBUSxDQUFXO0lBRTVCLCtCQUErQjtJQUMvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRU4sK0JBQStCO0lBQy9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFTix3QkFBd0I7SUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLHdCQUF3QjtJQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsd0RBQXdEO0lBQ3hELFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFYixtREFBbUQ7SUFDbkQsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVWLG9EQUFvRDtJQUNwRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsMERBQTBEO0lBQzFELElBQUksQ0FBVTtJQUVkLCtDQUErQztJQUMvQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFOUIsU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxDLFlBQWEsSUFBWSxFQUFFLFFBQWtCO1FBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7OzhGQU0wRjtJQUMxRixvQkFBb0IsQ0FBRSxJQUFVLEVBQUUsYUFBOEIsRUFBRSxhQUE4QixFQUFFLE1BQWMsRUFBRSxNQUFjO1FBRS9ILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVyRCxJQUFJLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSztRQUM1RCxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsTUFBTSxJQUFJLE1BQU0sQ0FBQztRQUVqQixPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLO1FBQzVELGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRCxNQUFNLElBQUksTUFBTSxDQUFDO1FBRWpCLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDNUQsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELE1BQU0sSUFBSSxNQUFNLENBQUM7UUFFakIsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSztRQUM1RCxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELFVBQVUsQ0FBRSxJQUFjO1FBQ3pCLDhGQUE4RjtRQUM5RixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGNBQWM7UUFDYixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O2tGQUU4RTtJQUM5RSxNQUFNLENBQUMsVUFBVSxDQUFFLE1BQTRCLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLFFBQWdCLEVBQUUsS0FBYSxFQUNySSxNQUFjLEVBQUUsTUFBZ0IsRUFBRSxHQUFvQjtRQUV0RCxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoRCxNQUFNLFlBQVksR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7UUFDbkUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQztRQUNwRSxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7UUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQy9CLE1BQU0sU0FBUyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNqQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBRW5DLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1osQ0FBQzthQUFNLENBQUM7WUFDUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUM7aUJBQU0sQ0FBQztnQkFDUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNwQixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNkLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNmLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDZixNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNkLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRWQsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDZCxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNkLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IFNsb3RQb3NlIH0gZnJvbSBcIi4uL1Nsb3RQb3NlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3QgfSBmcm9tIFwiLi4vU2xvdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmUuanNcIjtcbmltcG9ydCB7IENvbG9yLCBNYXRoVXRpbHMsIHR5cGUgTnVtYmVyQXJyYXlMaWtlIH0gZnJvbSBcIi4uL1V0aWxzLmpzXCI7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSBcIi4vQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBIYXNTZXF1ZW5jZSB9IGZyb20gXCIuL0hhc1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcXVlbmNlIH0gZnJvbSBcIi4vU2VxdWVuY2UuanNcIjtcblxuLyoqIEFuIGF0dGFjaG1lbnQgdGhhdCBkaXNwbGF5cyBhIHRleHR1cmVkIHF1YWRyaWxhdGVyYWwuXG4gKlxuICogU2VlIFtSZWdpb24gYXR0YWNobWVudHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1yZWdpb25zKSBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpb25BdHRhY2htZW50IGV4dGVuZHMgQXR0YWNobWVudCBpbXBsZW1lbnRzIEhhc1NlcXVlbmNlIHtcblx0cmVhZG9ubHkgc2VxdWVuY2U6IFNlcXVlbmNlO1xuXG5cdC8qKiBUaGUgbG9jYWwgeCB0cmFuc2xhdGlvbi4gKi9cblx0eCA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCB5IHRyYW5zbGF0aW9uLiAqL1xuXHR5ID0gMDtcblxuXHQvKiogVGhlIGxvY2FsIHNjYWxlWC4gKi9cblx0c2NhbGVYID0gMTtcblxuXHQvKiogVGhlIGxvY2FsIHNjYWxlWS4gKi9cblx0c2NhbGVZID0gMTtcblxuXHQvKiogVGhlIGxvY2FsIHJvdGF0aW9uIGluIGRlZ3JlZXMsIGNvdW50ZXIgY2xvY2t3aXNlLiAqL1xuXHRyb3RhdGlvbiA9IDA7XG5cblx0LyoqIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIGF0dGFjaG1lbnQgaW4gU3BpbmUuICovXG5cdHdpZHRoID0gMDtcblxuXHQvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIGF0dGFjaG1lbnQgaW4gU3BpbmUuICovXG5cdGhlaWdodCA9IDA7XG5cblx0LyoqIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHJlZ2lvbiBmb3IgdGhpcyBhdHRhY2htZW50LiAqL1xuXHRwYXRoPzogc3RyaW5nO1xuXG5cdC8qKiBUaGUgY29sb3IgdG8gdGludCB0aGUgcmVnaW9uIGF0dGFjaG1lbnQuICovXG5cdGNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuXG5cdHRlbXBDb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nLCBzZXF1ZW5jZTogU2VxdWVuY2UpIHtcblx0XHRzdXBlcihuYW1lKTtcblx0XHR0aGlzLnNlcXVlbmNlID0gc2VxdWVuY2U7XG5cdH1cblxuXHRjb3B5ICgpOiBBdHRhY2htZW50IHtcblx0XHRjb25zdCBjb3B5ID0gbmV3IFJlZ2lvbkF0dGFjaG1lbnQodGhpcy5uYW1lLCB0aGlzLnNlcXVlbmNlLmNvcHkoKSk7XG5cdFx0Y29weS5wYXRoID0gdGhpcy5wYXRoO1xuXHRcdGNvcHkueCA9IHRoaXMueDtcblx0XHRjb3B5LnkgPSB0aGlzLnk7XG5cdFx0Y29weS5zY2FsZVggPSB0aGlzLnNjYWxlWDtcblx0XHRjb3B5LnNjYWxlWSA9IHRoaXMuc2NhbGVZO1xuXHRcdGNvcHkucm90YXRpb24gPSB0aGlzLnJvdGF0aW9uO1xuXHRcdGNvcHkud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGNvcHkuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cdFx0Y29weS5jb2xvci5zZXRGcm9tQ29sb3IodGhpcy5jb2xvcik7XG5cdFx0cmV0dXJuIGNvcHk7XG5cdH1cblxuXHQvKiogVHJhbnNmb3JtcyB0aGUgYXR0YWNobWVudCdzIGZvdXIgdmVydGljZXMgdG8gd29ybGQgY29vcmRpbmF0ZXMuXG5cdCAqXG5cdCAqIFNlZSA8YSBocmVmPVwiaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtc2tlbGV0b25zI1dvcmxkLXRyYW5zZm9ybXNcIj5Xb3JsZCB0cmFuc2Zvcm1zPC9hPiBpbiB0aGUgU3BpbmVcblx0ICogUnVudGltZXMgR3VpZGUuXG5cdCAqIEBwYXJhbSB3b3JsZFZlcnRpY2VzIFRoZSBvdXRwdXQgd29ybGQgdmVydGljZXMuIE11c3QgaGF2ZSBhIGxlbmd0aCA+PSBgb2Zmc2V0YCArIDguXG5cdCAqIEBwYXJhbSBvZmZzZXQgVGhlIGB3b3JsZFZlcnRpY2VzYCBpbmRleCB0byBiZWdpbiB3cml0aW5nIHZhbHVlcy5cblx0ICogQHBhcmFtIHN0cmlkZSBUaGUgbnVtYmVyIG9mIGB3b3JsZFZlcnRpY2VzYCBlbnRyaWVzIGJldHdlZW4gdGhlIHZhbHVlIHBhaXJzIHdyaXR0ZW4uICovXG5cdGNvbXB1dGVXb3JsZFZlcnRpY2VzIChzbG90OiBTbG90LCB2ZXJ0ZXhPZmZzZXRzOiBOdW1iZXJBcnJheUxpa2UsIHdvcmxkVmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgb2Zmc2V0OiBudW1iZXIsIHN0cmlkZTogbnVtYmVyKSB7XG5cblx0XHRjb25zdCBib25lID0gc2xvdC5ib25lLmFwcGxpZWRQb3NlO1xuXHRcdGNvbnN0IHggPSBib25lLndvcmxkWCwgeSA9IGJvbmUud29ybGRZO1xuXHRcdGNvbnN0IGEgPSBib25lLmEsIGIgPSBib25lLmIsIGMgPSBib25lLmMsIGQgPSBib25lLmQ7XG5cblx0XHRsZXQgb2Zmc2V0WCA9IHZlcnRleE9mZnNldHNbMF07XG5cdFx0bGV0IG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRzWzFdO1xuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0XSA9IG9mZnNldFggKiBhICsgb2Zmc2V0WSAqIGIgKyB4OyAvLyBiclxuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0ICsgMV0gPSBvZmZzZXRYICogYyArIG9mZnNldFkgKiBkICsgeTtcblx0XHRvZmZzZXQgKz0gc3RyaWRlO1xuXG5cdFx0b2Zmc2V0WCA9IHZlcnRleE9mZnNldHNbMl07XG5cdFx0b2Zmc2V0WSA9IHZlcnRleE9mZnNldHNbM107XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIGJsXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0c1s0XTtcblx0XHRvZmZzZXRZID0gdmVydGV4T2Zmc2V0c1s1XTtcblx0XHR3b3JsZFZlcnRpY2VzW29mZnNldF0gPSBvZmZzZXRYICogYSArIG9mZnNldFkgKiBiICsgeDsgLy8gdWxcblx0XHR3b3JsZFZlcnRpY2VzW29mZnNldCArIDFdID0gb2Zmc2V0WCAqIGMgKyBvZmZzZXRZICogZCArIHk7XG5cdFx0b2Zmc2V0ICs9IHN0cmlkZTtcblxuXHRcdG9mZnNldFggPSB2ZXJ0ZXhPZmZzZXRzWzZdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRzWzddO1xuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0XSA9IG9mZnNldFggKiBhICsgb2Zmc2V0WSAqIGIgKyB4OyAvLyB1clxuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0ICsgMV0gPSBvZmZzZXRYICogYyArIG9mZnNldFkgKiBkICsgeTtcblx0fVxuXG5cdGdldE9mZnNldHMgKHBvc2U6IFNsb3RQb3NlKTogbnVtYmVyW10ge1xuXHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogb2Zmc2V0cyBhcmUgYWx3YXlzIGRlZmluZWQgYWZ0ZXIgdXBkYXRlU2VxdWVuY2Vcblx0XHRyZXR1cm4gdGhpcy5zZXF1ZW5jZS5vZmZzZXRzIVt0aGlzLnNlcXVlbmNlLnJlc29sdmVJbmRleChwb3NlKV07XG5cdH1cblxuXHR1cGRhdGVTZXF1ZW5jZSAoKSB7XG5cdFx0dGhpcy5zZXF1ZW5jZS51cGRhdGUodGhpcyk7XG5cdH1cblxuXHQvKiogQ29tcHV0ZXMge0BsaW5rIFNlcXVlbmNlLmdldFVWcyB8IFVWc30gYW5kIHtAbGluayBTZXF1ZW5jZS5nZXRPZmZzZXRzIHwgb2Zmc2V0c30gZm9yIGEgcmVnaW9uIGF0dGFjaG1lbnQuXG5cdCAqIEBwYXJhbSB1dnMgT3V0cHV0IGFycmF5IGZvciB0aGUgY29tcHV0ZWQgVVZzLCBsZW5ndGggb2YgOC5cblx0ICogQHBhcmFtIG9mZnNldCBPdXRwdXQgYXJyYXkgZm9yIHRoZSBjb21wdXRlZCB2ZXJ0ZXggb2Zmc2V0cywgbGVuZ3RoIG9mIDguICovXG5cdHN0YXRpYyBjb21wdXRlVVZzIChyZWdpb246IFRleHR1cmVSZWdpb24gfCBudWxsLCB4OiBudW1iZXIsIHk6IG51bWJlciwgc2NhbGVYOiBudW1iZXIsIHNjYWxlWTogbnVtYmVyLCByb3RhdGlvbjogbnVtYmVyLCB3aWR0aDogbnVtYmVyLFxuXHRcdGhlaWdodDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcltdLCB1dnM6IE51bWJlckFycmF5TGlrZSk6IHZvaWQge1xuXG5cdFx0aWYgKCFyZWdpb24pIHRocm93IG5ldyBFcnJvcihcIlJlZ2lvbiBub3Qgc2V0LlwiKTtcblx0XHRjb25zdCByZWdpb25TY2FsZVggPSB3aWR0aCAvIHJlZ2lvbi5vcmlnaW5hbFdpZHRoICogc2NhbGVYO1xuXHRcdGNvbnN0IHJlZ2lvblNjYWxlWSA9IGhlaWdodCAvIHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAqIHNjYWxlWTtcblx0XHRjb25zdCBsb2NhbFggPSAtd2lkdGggLyAyICogc2NhbGVYICsgcmVnaW9uLm9mZnNldFggKiByZWdpb25TY2FsZVg7XG5cdFx0Y29uc3QgbG9jYWxZID0gLWhlaWdodCAvIDIgKiBzY2FsZVkgKyByZWdpb24ub2Zmc2V0WSAqIHJlZ2lvblNjYWxlWTtcblx0XHRjb25zdCBsb2NhbFgyID0gbG9jYWxYICsgcmVnaW9uLndpZHRoICogcmVnaW9uU2NhbGVYO1xuXHRcdGNvbnN0IGxvY2FsWTIgPSBsb2NhbFkgKyByZWdpb24uaGVpZ2h0ICogcmVnaW9uU2NhbGVZO1xuXHRcdGNvbnN0IHJhZGlhbnMgPSByb3RhdGlvbiAqIE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0Y29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFucyk7XG5cdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4ocmFkaWFucyk7XG5cdFx0Y29uc3QgbG9jYWxYQ29zID0gbG9jYWxYICogY29zICsgeDtcblx0XHRjb25zdCBsb2NhbFhTaW4gPSBsb2NhbFggKiBzaW47XG5cdFx0Y29uc3QgbG9jYWxZQ29zID0gbG9jYWxZICogY29zICsgeTtcblx0XHRjb25zdCBsb2NhbFlTaW4gPSBsb2NhbFkgKiBzaW47XG5cdFx0Y29uc3QgbG9jYWxYMkNvcyA9IGxvY2FsWDIgKiBjb3MgKyB4O1xuXHRcdGNvbnN0IGxvY2FsWDJTaW4gPSBsb2NhbFgyICogc2luO1xuXHRcdGNvbnN0IGxvY2FsWTJDb3MgPSBsb2NhbFkyICogY29zICsgeTtcblx0XHRjb25zdCBsb2NhbFkyU2luID0gbG9jYWxZMiAqIHNpbjtcblx0XHRvZmZzZXRbMF0gPSBsb2NhbFhDb3MgLSBsb2NhbFlTaW47XG5cdFx0b2Zmc2V0WzFdID0gbG9jYWxZQ29zICsgbG9jYWxYU2luO1xuXHRcdG9mZnNldFsyXSA9IGxvY2FsWENvcyAtIGxvY2FsWTJTaW47XG5cdFx0b2Zmc2V0WzNdID0gbG9jYWxZMkNvcyArIGxvY2FsWFNpbjtcblx0XHRvZmZzZXRbNF0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZMlNpbjtcblx0XHRvZmZzZXRbNV0gPSBsb2NhbFkyQ29zICsgbG9jYWxYMlNpbjtcblx0XHRvZmZzZXRbNl0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZU2luO1xuXHRcdG9mZnNldFs3XSA9IGxvY2FsWUNvcyArIGxvY2FsWDJTaW47XG5cblx0XHRpZiAocmVnaW9uID09IG51bGwpIHtcblx0XHRcdHV2c1swXSA9IDA7XG5cdFx0XHR1dnNbMV0gPSAwO1xuXHRcdFx0dXZzWzJdID0gMDtcblx0XHRcdHV2c1szXSA9IDE7XG5cdFx0XHR1dnNbNF0gPSAxO1xuXHRcdFx0dXZzWzVdID0gMTtcblx0XHRcdHV2c1s2XSA9IDE7XG5cdFx0XHR1dnNbN10gPSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1dnNbMV0gPSByZWdpb24udjI7XG5cdFx0XHR1dnNbMl0gPSByZWdpb24udTtcblx0XHRcdHV2c1s1XSA9IHJlZ2lvbi52O1xuXHRcdFx0dXZzWzZdID0gcmVnaW9uLnUyO1xuXHRcdFx0aWYgKHJlZ2lvbi5kZWdyZWVzID09PSA5MCkge1xuXHRcdFx0XHR1dnNbMF0gPSByZWdpb24udTI7XG5cdFx0XHRcdHV2c1szXSA9IHJlZ2lvbi52Mjtcblx0XHRcdFx0dXZzWzRdID0gcmVnaW9uLnU7XG5cdFx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXZzWzBdID0gcmVnaW9uLnU7XG5cdFx0XHRcdHV2c1szXSA9IHJlZ2lvbi52O1xuXHRcdFx0XHR1dnNbNF0gPSByZWdpb24udTI7XG5cdFx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52Mjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRzdGF0aWMgWDEgPSAwO1xuXHRzdGF0aWMgWTEgPSAxO1xuXHRzdGF0aWMgQzFSID0gMjtcblx0c3RhdGljIEMxRyA9IDM7XG5cdHN0YXRpYyBDMUIgPSA0O1xuXHRzdGF0aWMgQzFBID0gNTtcblx0c3RhdGljIFUxID0gNjtcblx0c3RhdGljIFYxID0gNztcblxuXHRzdGF0aWMgWDIgPSA4O1xuXHRzdGF0aWMgWTIgPSA5O1xuXHRzdGF0aWMgQzJSID0gMTA7XG5cdHN0YXRpYyBDMkcgPSAxMTtcblx0c3RhdGljIEMyQiA9IDEyO1xuXHRzdGF0aWMgQzJBID0gMTM7XG5cdHN0YXRpYyBVMiA9IDE0O1xuXHRzdGF0aWMgVjIgPSAxNTtcblxuXHRzdGF0aWMgWDMgPSAxNjtcblx0c3RhdGljIFkzID0gMTc7XG5cdHN0YXRpYyBDM1IgPSAxODtcblx0c3RhdGljIEMzRyA9IDE5O1xuXHRzdGF0aWMgQzNCID0gMjA7XG5cdHN0YXRpYyBDM0EgPSAyMTtcblx0c3RhdGljIFUzID0gMjI7XG5cdHN0YXRpYyBWMyA9IDIzO1xuXG5cdHN0YXRpYyBYNCA9IDI0O1xuXHRzdGF0aWMgWTQgPSAyNTtcblx0c3RhdGljIEM0UiA9IDI2O1xuXHRzdGF0aWMgQzRHID0gMjc7XG5cdHN0YXRpYyBDNEIgPSAyODtcblx0c3RhdGljIEM0QSA9IDI5O1xuXHRzdGF0aWMgVTQgPSAzMDtcblx0c3RhdGljIFY0ID0gMzE7XG59XG4iXX0=
@@ -26,23 +26,48 @@
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 { TextureRegion } from "../Texture.js";
30
- import { Slot } from "../Slot.js";
31
- import { HasTextureRegion } from "./HasTextureRegion.js";
29
+ import type { SlotPose } from "../SlotPose.js";
30
+ import type { TextureRegion } from "../Texture.js";
31
+ import { type NumberArrayLike } from "../Utils.js";
32
+ import type { HasSequence } from "./HasSequence.js";
33
+ /** Holds texture regions, UVs, and vertex offsets for rendering a region or mesh attachment. {@link regions Regions} must be
34
+ * populated and {@link update} called before use. */
32
35
  export declare class Sequence {
33
36
  private static _nextID;
34
37
  id: number;
35
- regions: TextureRegion[];
38
+ /** The list of texture regions this sequence will display. */
39
+ regions: Array<TextureRegion | null>;
40
+ readonly pathSuffix: boolean;
41
+ uvs?: NumberArrayLike[];
42
+ /** Returns vertex offsets from the center of a {@link RegionAttachment}. Invalid to call for a {@link MeshAttachment}. */
43
+ offsets?: number[][];
44
+ /** The starting number for the numeric {@link getPath | path} suffix. */
36
45
  start: number;
46
+ /** The minimum number of digits in the numeric {@link getPath | path} suffix, for zero padding. 0 for no zero
47
+ * padding. */
37
48
  digits: number;
38
49
  /** The index of the region to show for the setup pose. */
39
50
  setupIndex: number;
40
- constructor(count: number);
51
+ /** @param count The number of texture regions this sequence will display.
52
+ * @param pathSuffix If true, the {@link getPath | path} has a numeric suffix. If false, all regions will use the
53
+ * same path, so `count` should be 1. */
54
+ constructor(count: number, pathSuffix: boolean);
41
55
  copy(): Sequence;
42
- apply(slot: Slot, attachment: HasTextureRegion): void;
56
+ /** Computes UVs and offsets for the specified attachment. Must be called if the regions or attachment properties are
57
+ * changed. */
58
+ update(attachment: HasSequence): void;
59
+ /** Returns the {@link regions} index for the {@link SlotPose.getSequenceIndex}. */
60
+ resolveIndex(pose: SlotPose): number;
61
+ /** Returns the UVs for the specified index. {@link regions Regions} must be populated and {@link update} called
62
+ * before calling this method. */
63
+ getUVs(index: number): Float32Array;
64
+ /** Returns true if the {@link getPath | path} has a numeric suffix. */
65
+ hasPathSuffix(): boolean;
66
+ /** Returns the specified base path with an optional numeric suffix for the specified index. */
43
67
  getPath(basePath: string, index: number): string;
44
68
  private static nextID;
45
69
  }
70
+ /** Controls how {@link Sequence.regions} are displayed over time. */
46
71
  export declare enum SequenceMode {
47
72
  hold = 0,
48
73
  once = 1,
@@ -27,40 +27,105 @@
27
27
  * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
  *****************************************************************************/
29
29
  import { Utils } from "../Utils.js";
30
+ import { MeshAttachment } from "./MeshAttachment.js";
31
+ import { RegionAttachment } from "./RegionAttachment.js";
32
+ /** Holds texture regions, UVs, and vertex offsets for rendering a region or mesh attachment. {@link regions Regions} must be
33
+ * populated and {@link update} called before use. */
30
34
  export class Sequence {
31
35
  static _nextID = 0;
32
36
  id = Sequence.nextID();
37
+ /** The list of texture regions this sequence will display. */
33
38
  regions;
39
+ pathSuffix;
40
+ uvs;
41
+ /** Returns vertex offsets from the center of a {@link RegionAttachment}. Invalid to call for a {@link MeshAttachment}. */
42
+ offsets;
43
+ /** The starting number for the numeric {@link getPath | path} suffix. */
34
44
  start = 0;
45
+ /** The minimum number of digits in the numeric {@link getPath | path} suffix, for zero padding. 0 for no zero
46
+ * padding. */
35
47
  digits = 0;
36
48
  /** The index of the region to show for the setup pose. */
37
49
  setupIndex = 0;
38
- constructor(count) {
50
+ /** @param count The number of texture regions this sequence will display.
51
+ * @param pathSuffix If true, the {@link getPath | path} has a numeric suffix. If false, all regions will use the
52
+ * same path, so `count` should be 1. */
53
+ constructor(count, pathSuffix) {
39
54
  this.regions = new Array(count);
55
+ this.pathSuffix = pathSuffix;
40
56
  }
41
57
  copy() {
42
- let copy = new Sequence(this.regions.length);
43
- Utils.arrayCopy(this.regions, 0, copy.regions, 0, this.regions.length);
58
+ const regionCount = this.regions.length;
59
+ const copy = new Sequence(regionCount, this.pathSuffix);
60
+ Utils.arrayCopy(this.regions, 0, copy.regions, 0, regionCount);
44
61
  copy.start = this.start;
45
62
  copy.digits = this.digits;
46
63
  copy.setupIndex = this.setupIndex;
64
+ if (this.uvs != null) {
65
+ const length = this.uvs[0].length;
66
+ copy.uvs = [];
67
+ for (let i = 0; i < regionCount; i++) {
68
+ copy.uvs[i] = Utils.newFloatArray(length);
69
+ Utils.arrayCopy(this.uvs[i], 0, copy.uvs[i], 0, length);
70
+ }
71
+ }
72
+ if (this.offsets != null) {
73
+ copy.offsets = [];
74
+ for (let i = 0; i < regionCount; i++) {
75
+ copy.offsets[i] = [];
76
+ Utils.arrayCopy(this.offsets[i], 0, copy.offsets[i], 0, 8);
77
+ }
78
+ }
47
79
  return copy;
48
80
  }
49
- apply(slot, attachment) {
50
- let index = slot.sequenceIndex;
51
- if (index == -1)
81
+ /** Computes UVs and offsets for the specified attachment. Must be called if the regions or attachment properties are
82
+ * changed. */
83
+ update(attachment) {
84
+ const regionCount = this.regions.length;
85
+ if (attachment instanceof RegionAttachment) {
86
+ this.uvs = [];
87
+ this.offsets = [];
88
+ for (let i = 0; i < regionCount; i++) {
89
+ this.uvs[i] = Utils.newFloatArray(8);
90
+ this.offsets[i] = [];
91
+ RegionAttachment.computeUVs(this.regions[i], attachment.x, attachment.y, attachment.scaleX, attachment.scaleY, attachment.rotation, attachment.width, attachment.height, this.offsets[i], this.uvs[i]);
92
+ }
93
+ }
94
+ else if (attachment instanceof MeshAttachment) {
95
+ const regionUVs = attachment.regionUVs;
96
+ this.uvs = [];
97
+ this.offsets = undefined;
98
+ for (let i = 0; i < regionCount; i++) {
99
+ this.uvs[i] = Utils.newFloatArray(regionUVs.length);
100
+ MeshAttachment.computeUVs(this.regions[i], regionUVs, this.uvs[i]);
101
+ }
102
+ }
103
+ }
104
+ /** Returns the {@link regions} index for the {@link SlotPose.getSequenceIndex}. */
105
+ resolveIndex(pose) {
106
+ let index = pose.sequenceIndex;
107
+ if (index === -1)
52
108
  index = this.setupIndex;
53
109
  if (index >= this.regions.length)
54
110
  index = this.regions.length - 1;
55
- let region = this.regions[index];
56
- if (attachment.region != region) {
57
- attachment.region = region;
58
- attachment.updateRegion();
59
- }
111
+ return index;
112
+ }
113
+ /** Returns the UVs for the specified index. {@link regions Regions} must be populated and {@link update} called
114
+ * before calling this method. */
115
+ getUVs(index) {
116
+ // biome-ignore lint/style/noNonNullAssertion: uvs are always defined after updateSequence
117
+ return this.uvs[index];
118
+ }
119
+ /** Returns true if the {@link getPath | path} has a numeric suffix. */
120
+ hasPathSuffix() {
121
+ return this.pathSuffix;
60
122
  }
123
+ /** Returns the specified base path with an optional numeric suffix for the specified index. */
61
124
  getPath(basePath, index) {
125
+ if (!this.pathSuffix)
126
+ return basePath;
62
127
  let result = basePath;
63
- let frame = (this.start + index).toString();
128
+ const frame = (this.start + index).toString();
64
129
  for (let i = this.digits - frame.length; i > 0; i--)
65
130
  result += "0";
66
131
  result += frame;
@@ -70,6 +135,7 @@ export class Sequence {
70
135
  return Sequence._nextID++;
71
136
  }
72
137
  }
138
+ /** Controls how {@link Sequence.regions} are displayed over time. */
73
139
  export var SequenceMode;
74
140
  (function (SequenceMode) {
75
141
  SequenceMode[SequenceMode["hold"] = 0] = "hold";
@@ -89,4 +155,4 @@ export const SequenceModeValues = [
89
155
  SequenceMode.loopReverse,
90
156
  SequenceMode.pingpongReverse
91
157
  ];
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VxdWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXR0YWNobWVudHMvU2VxdWVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBSy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHcEMsTUFBTSxPQUFPLFFBQVE7SUFDWixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUUzQixFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sQ0FBa0I7SUFDekIsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNWLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDWCwwREFBMEQ7SUFDMUQsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUVmLFlBQWEsS0FBYTtRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFnQixLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSTtRQUNILElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVELEtBQUssQ0FBRSxJQUFVLEVBQUUsVUFBNEI7UUFDOUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUMvQixJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7WUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzNCLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0YsQ0FBQztJQUVELE9BQU8sQ0FBRSxRQUFnQixFQUFFLEtBQWE7UUFDdkMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNsRCxNQUFNLElBQUksR0FBRyxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQztRQUNoQixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTyxNQUFNLENBQUMsTUFBTTtRQUNwQixPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDOztBQUdGLE1BQU0sQ0FBTixJQUFZLFlBUVg7QUFSRCxXQUFZLFlBQVk7SUFDdkIsK0NBQVEsQ0FBQTtJQUNSLCtDQUFRLENBQUE7SUFDUiwrQ0FBUSxDQUFBO0lBQ1IsdURBQVksQ0FBQTtJQUNaLDZEQUFlLENBQUE7SUFDZiw2REFBZSxDQUFBO0lBQ2YscUVBQW1CLENBQUE7QUFDcEIsQ0FBQyxFQVJXLFlBQVksS0FBWixZQUFZLFFBUXZCO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDakMsWUFBWSxDQUFDLElBQUk7SUFDakIsWUFBWSxDQUFDLElBQUk7SUFDakIsWUFBWSxDQUFDLElBQUk7SUFDakIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLFdBQVc7SUFDeEIsWUFBWSxDQUFDLFdBQVc7SUFDeEIsWUFBWSxDQUFDLGVBQWU7Q0FDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVGV4dHVyZVJlZ2lvbiB9IGZyb20gXCIuLi9UZXh0dXJlLmpzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIi4uL1Nsb3QuanNcIjtcbmltcG9ydCB7IEhhc1RleHR1cmVSZWdpb24gfSBmcm9tIFwiLi9IYXNUZXh0dXJlUmVnaW9uLmpzXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCIuLi9VdGlscy5qc1wiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZSB7XG5cdHByaXZhdGUgc3RhdGljIF9uZXh0SUQgPSAwO1xuXG5cdGlkID0gU2VxdWVuY2UubmV4dElEKCk7XG5cdHJlZ2lvbnM6IFRleHR1cmVSZWdpb25bXTtcblx0c3RhcnQgPSAwO1xuXHRkaWdpdHMgPSAwO1xuXHQvKiogVGhlIGluZGV4IG9mIHRoZSByZWdpb24gdG8gc2hvdyBmb3IgdGhlIHNldHVwIHBvc2UuICovXG5cdHNldHVwSW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChjb3VudDogbnVtYmVyKSB7XG5cdFx0dGhpcy5yZWdpb25zID0gbmV3IEFycmF5PFRleHR1cmVSZWdpb24+KGNvdW50KTtcblx0fVxuXG5cdGNvcHkgKCk6IFNlcXVlbmNlIHtcblx0XHRsZXQgY29weSA9IG5ldyBTZXF1ZW5jZSh0aGlzLnJlZ2lvbnMubGVuZ3RoKTtcblx0XHRVdGlscy5hcnJheUNvcHkodGhpcy5yZWdpb25zLCAwLCBjb3B5LnJlZ2lvbnMsIDAsIHRoaXMucmVnaW9ucy5sZW5ndGgpO1xuXHRcdGNvcHkuc3RhcnQgPSB0aGlzLnN0YXJ0O1xuXHRcdGNvcHkuZGlnaXRzID0gdGhpcy5kaWdpdHM7XG5cdFx0Y29weS5zZXR1cEluZGV4ID0gdGhpcy5zZXR1cEluZGV4O1xuXHRcdHJldHVybiBjb3B5O1xuXHR9XG5cblx0YXBwbHkgKHNsb3Q6IFNsb3QsIGF0dGFjaG1lbnQ6IEhhc1RleHR1cmVSZWdpb24pIHtcblx0XHRsZXQgaW5kZXggPSBzbG90LnNlcXVlbmNlSW5kZXg7XG5cdFx0aWYgKGluZGV4ID09IC0xKSBpbmRleCA9IHRoaXMuc2V0dXBJbmRleDtcblx0XHRpZiAoaW5kZXggPj0gdGhpcy5yZWdpb25zLmxlbmd0aCkgaW5kZXggPSB0aGlzLnJlZ2lvbnMubGVuZ3RoIC0gMTtcblx0XHRsZXQgcmVnaW9uID0gdGhpcy5yZWdpb25zW2luZGV4XTtcblx0XHRpZiAoYXR0YWNobWVudC5yZWdpb24gIT0gcmVnaW9uKSB7XG5cdFx0XHRhdHRhY2htZW50LnJlZ2lvbiA9IHJlZ2lvbjtcblx0XHRcdGF0dGFjaG1lbnQudXBkYXRlUmVnaW9uKCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0UGF0aCAoYmFzZVBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG5cdFx0bGV0IHJlc3VsdCA9IGJhc2VQYXRoO1xuXHRcdGxldCBmcmFtZSA9ICh0aGlzLnN0YXJ0ICsgaW5kZXgpLnRvU3RyaW5nKCk7XG5cdFx0Zm9yIChsZXQgaSA9IHRoaXMuZGlnaXRzIC0gZnJhbWUubGVuZ3RoOyBpID4gMDsgaS0tKVxuXHRcdFx0cmVzdWx0ICs9IFwiMFwiO1xuXHRcdHJlc3VsdCArPSBmcmFtZTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgbmV4dElEICgpOiBudW1iZXIge1xuXHRcdHJldHVybiBTZXF1ZW5jZS5fbmV4dElEKys7XG5cdH1cbn1cblxuZXhwb3J0IGVudW0gU2VxdWVuY2VNb2RlIHtcblx0aG9sZCA9IDAsXG5cdG9uY2UgPSAxLFxuXHRsb29wID0gMixcblx0cGluZ3BvbmcgPSAzLFxuXHRvbmNlUmV2ZXJzZSA9IDQsXG5cdGxvb3BSZXZlcnNlID0gNSxcblx0cGluZ3BvbmdSZXZlcnNlID0gNlxufVxuXG5leHBvcnQgY29uc3QgU2VxdWVuY2VNb2RlVmFsdWVzID0gW1xuXHRTZXF1ZW5jZU1vZGUuaG9sZCxcblx0U2VxdWVuY2VNb2RlLm9uY2UsXG5cdFNlcXVlbmNlTW9kZS5sb29wLFxuXHRTZXF1ZW5jZU1vZGUucGluZ3BvbmcsXG5cdFNlcXVlbmNlTW9kZS5vbmNlUmV2ZXJzZSxcblx0U2VxdWVuY2VNb2RlLmxvb3BSZXZlcnNlLFxuXHRTZXF1ZW5jZU1vZGUucGluZ3BvbmdSZXZlcnNlXG5dO1xuIl19
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VxdWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXR0YWNobWVudHMvU2VxdWVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBSS9FLE9BQU8sRUFBd0IsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RDtxREFDcUQ7QUFDckQsTUFBTSxPQUFPLFFBQVE7SUFDWixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUUzQixFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRXZCLDhEQUE4RDtJQUM5RCxPQUFPLENBQThCO0lBRTVCLFVBQVUsQ0FBVTtJQUM3QixHQUFHLENBQXFCO0lBRXhCLDBIQUEwSDtJQUMxSCxPQUFPLENBQWM7SUFFckIseUVBQXlFO0lBQ3pFLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFVjtrQkFDYztJQUNkLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFWCwwREFBMEQ7SUFDMUQsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUVmOzs0Q0FFd0M7SUFDeEMsWUFBYSxLQUFhLEVBQUUsVUFBbUI7UUFDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBZ0IsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUk7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELEtBQUssQ0FBQyxTQUFT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QUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUN0QyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDdEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVPLE1BQU0sQ0FBQyxNQUFNO1FBQ3BCLE9BQU8sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7O0FBR0YscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBTixJQUFZLFlBUVg7QUFSRCxXQUFZLFlBQVk7SUFDdkIsK0NBQVEsQ0FBQTtJQUNSLCtDQUFRLENBQUE7SUFDUiwrQ0FBUSxDQUFBO0lBQ1IsdURBQVksQ0FBQTtJQUNaLDZEQUFlLENBQUE7SUFDZiw2REFBZSxDQUFBO0lBQ2YscUVBQW1CLENBQUE7QUFDcEIsQ0FBQyxFQVJXLFlBQVksS0FBWixZQUFZLFFBUXZCO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDakMsWUFBWSxDQUFDLElBQUk7SUFDakIsWUFBWSxDQUFDLElBQUk7SUFDakIsWUFBWSxDQUFDLElBQUk7SUFDakIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLFdBQVc7SUFDeEIsWUFBWSxDQUFDLFdBQVc7SUFDeEIsWUFBWSxDQUFDLGVBQWU7Q0FDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBTbG90UG9zZSB9IGZyb20gXCIuLi9TbG90UG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmUuanNcIjtcbmltcG9ydCB7IHR5cGUgTnVtYmVyQXJyYXlMaWtlLCBVdGlscyB9IGZyb20gXCIuLi9VdGlscy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBIYXNTZXF1ZW5jZSB9IGZyb20gXCIuL0hhc1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgeyBNZXNoQXR0YWNobWVudCB9IGZyb20gXCIuL01lc2hBdHRhY2htZW50LmpzXCI7XG5pbXBvcnQgeyBSZWdpb25BdHRhY2htZW50IH0gZnJvbSBcIi4vUmVnaW9uQXR0YWNobWVudC5qc1wiO1xuXG4vKiogSG9sZHMgdGV4dHVyZSByZWdpb25zLCBVVnMsIGFuZCB2ZXJ0ZXggb2Zmc2V0cyBmb3IgcmVuZGVyaW5nIGEgcmVnaW9uIG9yIG1lc2ggYXR0YWNobWVudC4ge0BsaW5rIHJlZ2lvbnMgUmVnaW9uc30gbXVzdCBiZVxuICogcG9wdWxhdGVkIGFuZCB7QGxpbmsgdXBkYXRlfSBjYWxsZWQgYmVmb3JlIHVzZS4gKi9cbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZSB7XG5cdHByaXZhdGUgc3RhdGljIF9uZXh0SUQgPSAwO1xuXG5cdGlkID0gU2VxdWVuY2UubmV4dElEKCk7XG5cblx0LyoqIFRoZSBsaXN0IG9mIHRleHR1cmUgcmVnaW9ucyB0aGlzIHNlcXVlbmNlIHdpbGwgZGlzcGxheS4gKi9cblx0cmVnaW9uczogQXJyYXk8VGV4dHVyZVJlZ2lvbiB8IG51bGw+O1xuXG5cdHJlYWRvbmx5IHBhdGhTdWZmaXg6IGJvb2xlYW47XG5cdHV2cz86IE51bWJlckFycmF5TGlrZVtdO1xuXG5cdC8qKiBSZXR1cm5zIHZlcnRleCBvZmZzZXRzIGZyb20gdGhlIGNlbnRlciBvZiBhIHtAbGluayBSZWdpb25BdHRhY2htZW50fS4gSW52YWxpZCB0byBjYWxsIGZvciBhIHtAbGluayBNZXNoQXR0YWNobWVudH0uICovXG5cdG9mZnNldHM/OiBudW1iZXJbXVtdO1xuXG5cdC8qKiBUaGUgc3RhcnRpbmcgbnVtYmVyIGZvciB0aGUgbnVtZXJpYyB7QGxpbmsgZ2V0UGF0aCB8IHBhdGh9IHN1ZmZpeC4gKi9cblx0c3RhcnQgPSAwO1xuXG5cdC8qKiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBudW1lcmljIHtAbGluayBnZXRQYXRoIHwgcGF0aH0gc3VmZml4LCBmb3IgemVybyBwYWRkaW5nLiAwIGZvciBubyB6ZXJvXG5cdCAqIHBhZGRpbmcuICovXG5cdGRpZ2l0cyA9IDA7XG5cblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIHRvIHNob3cgZm9yIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHRzZXR1cEluZGV4ID0gMDtcblxuXHQvKiogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgdGV4dHVyZSByZWdpb25zIHRoaXMgc2VxdWVuY2Ugd2lsbCBkaXNwbGF5LlxuXHQgKiBAcGFyYW0gcGF0aFN1ZmZpeCBJZiB0cnVlLCB0aGUge0BsaW5rIGdldFBhdGggfCBwYXRofSBoYXMgYSBudW1lcmljIHN1ZmZpeC4gSWYgZmFsc2UsIGFsbCByZWdpb25zIHdpbGwgdXNlIHRoZVxuXHQgKiBzYW1lIHBhdGgsIHNvIGBjb3VudGAgc2hvdWxkIGJlIDEuICovXG5cdGNvbnN0cnVjdG9yIChjb3VudDogbnVtYmVyLCBwYXRoU3VmZml4OiBib29sZWFuKSB7XG5cdFx0dGhpcy5yZWdpb25zID0gbmV3IEFycmF5PFRleHR1cmVSZWdpb24+KGNvdW50KTtcblx0XHR0aGlzLnBhdGhTdWZmaXggPSBwYXRoU3VmZml4O1xuXHR9XG5cblx0Y29weSAoKTogU2VxdWVuY2Uge1xuXHRcdGNvbnN0IHJlZ2lvbkNvdW50ID0gdGhpcy5yZWdpb25zLmxlbmd0aDtcblx0XHRjb25zdCBjb3B5ID0gbmV3IFNlcXVlbmNlKHJlZ2lvbkNvdW50LCB0aGlzLnBhdGhTdWZmaXgpO1xuXHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLnJlZ2lvbnMsIDAsIGNvcHkucmVnaW9ucywgMCwgcmVnaW9uQ291bnQpO1xuXHRcdGNvcHkuc3RhcnQgPSB0aGlzLnN0YXJ0O1xuXHRcdGNvcHkuZGlnaXRzID0gdGhpcy5kaWdpdHM7XG5cdFx0Y29weS5zZXR1cEluZGV4ID0gdGhpcy5zZXR1cEluZGV4O1xuXG5cdFx0aWYgKHRoaXMudXZzICE9IG51bGwpIHtcblx0XHRcdGNvbnN0IGxlbmd0aCA9IHRoaXMudXZzWzBdLmxlbmd0aDtcblx0XHRcdGNvcHkudXZzID0gW107XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lvbkNvdW50OyBpKyspIHtcblx0XHRcdFx0Y29weS51dnNbaV0gPSBVdGlscy5uZXdGbG9hdEFycmF5KGxlbmd0aCk7XG5cdFx0XHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLnV2c1tpXSwgMCwgY29weS51dnNbaV0sIDAsIGxlbmd0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0aGlzLm9mZnNldHMgIT0gbnVsbCkge1xuXHRcdFx0Y29weS5vZmZzZXRzID0gW107XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lvbkNvdW50OyBpKyspIHtcblx0XHRcdFx0Y29weS5vZmZzZXRzW2ldID0gW107XG5cdFx0XHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLm9mZnNldHNbaV0sIDAsIGNvcHkub2Zmc2V0c1tpXSwgMCwgOCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvcHk7XG5cdH1cblxuXHQvKiogQ29tcHV0ZXMgVVZzIGFuZCBvZmZzZXRzIGZvciB0aGUgc3BlY2lmaWVkIGF0dGFjaG1lbnQuIE11c3QgYmUgY2FsbGVkIGlmIHRoZSByZWdpb25zIG9yIGF0dGFjaG1lbnQgcHJvcGVydGllcyBhcmVcblx0ICAqIGNoYW5nZWQuICovXG5cdHB1YmxpYyB1cGRhdGUgKGF0dGFjaG1lbnQ6IEhhc1NlcXVlbmNlKSB7XG5cdFx0Y29uc3QgcmVnaW9uQ291bnQgPSB0aGlzLnJlZ2lvbnMubGVuZ3RoO1xuXHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xuXHRcdFx0dGhpcy51dnMgPSBbXTtcblx0XHRcdHRoaXMub2Zmc2V0cyA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgaSsrKSB7XG5cdFx0XHRcdHRoaXMudXZzW2ldID0gVXRpbHMubmV3RmxvYXRBcnJheSg4KTtcblx0XHRcdFx0dGhpcy5vZmZzZXRzW2ldID0gW107XG5cdFx0XHRcdFJlZ2lvbkF0dGFjaG1lbnQuY29tcHV0ZVVWcyh0aGlzLnJlZ2lvbnNbaV0sIGF0dGFjaG1lbnQueCwgYXR0YWNobWVudC55LCBhdHRhY2htZW50LnNjYWxlWCwgYXR0YWNobWVudC5zY2FsZVksIGF0dGFjaG1lbnQucm90YXRpb24sXG5cdFx0XHRcdFx0YXR0YWNobWVudC53aWR0aCwgYXR0YWNobWVudC5oZWlnaHQsIHRoaXMub2Zmc2V0c1tpXSwgdGhpcy51dnNbaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSB7XG5cdFx0XHRjb25zdCByZWdpb25VVnMgPSBhdHRhY2htZW50LnJlZ2lvblVWcztcblx0XHRcdHRoaXMudXZzID0gW107XG5cdFx0XHR0aGlzLm9mZnNldHMgPSB1bmRlZmluZWQ7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lvbkNvdW50OyBpKyspIHtcblx0XHRcdFx0dGhpcy51dnNbaV0gPSBVdGlscy5uZXdGbG9hdEFycmF5KHJlZ2lvblVWcy5sZW5ndGgpO1xuXHRcdFx0XHRNZXNoQXR0YWNobWVudC5jb21wdXRlVVZzKHRoaXMucmVnaW9uc1tpXSwgcmVnaW9uVVZzLCB0aGlzLnV2c1tpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIHtAbGluayByZWdpb25zfSBpbmRleCBmb3IgdGhlIHtAbGluayBTbG90UG9zZS5nZXRTZXF1ZW5jZUluZGV4fS4gKi9cblx0cmVzb2x2ZUluZGV4IChwb3NlOiBTbG90UG9zZSk6IG51bWJlciB7XG5cdFx0bGV0IGluZGV4ID0gcG9zZS5zZXF1ZW5jZUluZGV4O1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIGluZGV4ID0gdGhpcy5zZXR1cEluZGV4O1xuXHRcdGlmIChpbmRleCA+PSB0aGlzLnJlZ2lvbnMubGVuZ3RoKSBpbmRleCA9IHRoaXMucmVnaW9ucy5sZW5ndGggLSAxO1xuXHRcdHJldHVybiBpbmRleDtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBVVnMgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXguIHtAbGluayByZWdpb25zIFJlZ2lvbnN9IG11c3QgYmUgcG9wdWxhdGVkIGFuZCB7QGxpbmsgdXBkYXRlfSBjYWxsZWRcblx0ICAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLiAqL1xuXHRnZXRVVnMgKGluZGV4OiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuXHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogdXZzIGFyZSBhbHdheXMgZGVmaW5lZCBhZnRlciB1cGRhdGVTZXF1ZW5jZVxuXHRcdHJldHVybiB0aGlzLnV2cyFbaW5kZXhdIGFzIEZsb2F0MzJBcnJheTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAbGluayBnZXRQYXRoIHwgcGF0aH0gaGFzIGEgbnVtZXJpYyBzdWZmaXguICovXG5cdGhhc1BhdGhTdWZmaXggKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnBhdGhTdWZmaXg7XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGJhc2UgcGF0aCB3aXRoIGFuIG9wdGlvbmFsIG51bWVyaWMgc3VmZml4IGZvciB0aGUgc3BlY2lmaWVkIGluZGV4LiAqL1xuXHRnZXRQYXRoIChiYXNlUGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRpZiAoIXRoaXMucGF0aFN1ZmZpeCkgcmV0dXJuIGJhc2VQYXRoO1xuXHRcdGxldCByZXN1bHQgPSBiYXNlUGF0aDtcblx0XHRjb25zdCBmcmFtZSA9ICh0aGlzLnN0YXJ0ICsgaW5kZXgpLnRvU3RyaW5nKCk7XG5cdFx0Zm9yIChsZXQgaSA9IHRoaXMuZGlnaXRzIC0gZnJhbWUubGVuZ3RoOyBpID4gMDsgaS0tKVxuXHRcdFx0cmVzdWx0ICs9IFwiMFwiO1xuXHRcdHJlc3VsdCArPSBmcmFtZTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgbmV4dElEICgpOiBudW1iZXIge1xuXHRcdHJldHVybiBTZXF1ZW5jZS5fbmV4dElEKys7XG5cdH1cbn1cblxuLyoqIENvbnRyb2xzIGhvdyB7QGxpbmsgU2VxdWVuY2UucmVnaW9uc30gYXJlIGRpc3BsYXllZCBvdmVyIHRpbWUuICovXG5leHBvcnQgZW51bSBTZXF1ZW5jZU1vZGUge1xuXHRob2xkID0gMCxcblx0b25jZSA9IDEsXG5cdGxvb3AgPSAyLFxuXHRwaW5ncG9uZyA9IDMsXG5cdG9uY2VSZXZlcnNlID0gNCxcblx0bG9vcFJldmVyc2UgPSA1LFxuXHRwaW5ncG9uZ1JldmVyc2UgPSA2XG59XG5cbmV4cG9ydCBjb25zdCBTZXF1ZW5jZU1vZGVWYWx1ZXMgPSBbXG5cdFNlcXVlbmNlTW9kZS5ob2xkLFxuXHRTZXF1ZW5jZU1vZGUub25jZSxcblx0U2VxdWVuY2VNb2RlLmxvb3AsXG5cdFNlcXVlbmNlTW9kZS5waW5ncG9uZyxcblx0U2VxdWVuY2VNb2RlLm9uY2VSZXZlcnNlLFxuXHRTZXF1ZW5jZU1vZGUubG9vcFJldmVyc2UsXG5cdFNlcXVlbmNlTW9kZS5waW5ncG9uZ1JldmVyc2Vcbl07XG4iXX0=