@esotericsoftware/spine-core 4.0.14 → 4.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Animation.d.ts +363 -363
- package/dist/Animation.js +1949 -1949
- package/dist/AnimationState.d.ts +396 -396
- package/dist/AnimationState.js +958 -958
- package/dist/AnimationStateData.d.ts +51 -51
- package/dist/AnimationStateData.js +69 -69
- package/dist/AssetManagerBase.d.ts +72 -72
- package/dist/AssetManagerBase.js +302 -302
- package/dist/AtlasAttachmentLoader.d.ts +51 -51
- package/dist/AtlasAttachmentLoader.js +73 -73
- package/dist/Bone.d.ts +138 -138
- package/dist/Bone.js +333 -333
- package/dist/BoneData.d.ts +72 -72
- package/dist/BoneData.js +73 -73
- package/dist/ConstraintData.d.ts +35 -35
- package/dist/ConstraintData.js +36 -36
- package/dist/Event.d.ts +44 -44
- package/dist/Event.js +41 -41
- package/dist/EventData.d.ts +41 -41
- package/dist/EventData.js +36 -36
- package/dist/IkConstraint.d.ts +64 -64
- package/dist/IkConstraint.js +284 -284
- package/dist/IkConstraintData.d.ts +54 -54
- package/dist/IkConstraintData.js +53 -53
- package/dist/PathConstraint.d.ts +71 -71
- package/dist/PathConstraint.js +468 -468
- package/dist/PathConstraintData.d.ts +80 -80
- package/dist/PathConstraintData.js +69 -69
- package/dist/Skeleton.d.ts +158 -158
- package/dist/Skeleton.js +570 -570
- package/dist/SkeletonBinary.d.ts +67 -67
- package/dist/SkeletonBinary.js +1093 -1093
- package/dist/SkeletonBounds.d.ts +77 -77
- package/dist/SkeletonBounds.js +218 -218
- package/dist/SkeletonClipping.d.ts +50 -50
- package/dist/SkeletonClipping.js +323 -323
- package/dist/SkeletonData.d.ts +114 -114
- package/dist/SkeletonData.js +166 -166
- package/dist/SkeletonJson.d.ts +51 -51
- package/dist/SkeletonJson.js +915 -915
- package/dist/Skin.d.ts +71 -71
- package/dist/Skin.js +200 -200
- package/dist/Slot.d.ts +72 -72
- package/dist/Slot.js +93 -93
- package/dist/SlotData.d.ts +57 -57
- package/dist/SlotData.js +54 -54
- package/dist/Texture.d.ts +69 -69
- package/dist/Texture.js +72 -72
- package/dist/TextureAtlas.d.ts +65 -65
- package/dist/TextureAtlas.js +245 -245
- package/dist/TransformConstraint.d.ts +60 -60
- package/dist/TransformConstraint.js +239 -239
- package/dist/TransformConstraintData.d.ts +60 -60
- package/dist/TransformConstraintData.js +59 -59
- package/dist/Triangulator.d.ts +43 -43
- package/dist/Triangulator.js +243 -243
- package/dist/Updatable.d.ts +37 -37
- package/dist/Updatable.js +29 -29
- package/dist/Utils.d.ts +168 -168
- package/dist/Utils.js +403 -403
- package/dist/VertexEffect.d.ts +35 -35
- package/dist/VertexEffect.js +29 -29
- package/dist/attachments/Attachment.d.ts +71 -71
- package/dist/attachments/Attachment.js +139 -139
- package/dist/attachments/AttachmentLoader.d.ts +53 -53
- package/dist/attachments/AttachmentLoader.js +29 -29
- package/dist/attachments/BoundingBoxAttachment.d.ts +40 -40
- package/dist/attachments/BoundingBoxAttachment.js +47 -47
- package/dist/attachments/ClippingAttachment.d.ts +42 -42
- package/dist/attachments/ClippingAttachment.js +47 -47
- package/dist/attachments/MeshAttachment.d.ts +74 -74
- package/dist/attachments/MeshAttachment.js +159 -159
- package/dist/attachments/PathAttachment.d.ts +47 -47
- package/dist/attachments/PathAttachment.js +56 -56
- package/dist/attachments/PointAttachment.d.ts +48 -48
- package/dist/attachments/PointAttachment.js +62 -62
- package/dist/attachments/RegionAttachment.d.ts +108 -108
- package/dist/attachments/RegionAttachment.js +196 -196
- package/dist/attachments/index.d.ts +8 -8
- package/dist/attachments/index.js +8 -8
- package/dist/iife/spine-core.js +0 -3
- package/dist/iife/spine-core.js.map +2 -2
- package/dist/iife/spine-core.min.js +1 -1
- package/dist/index.d.ts +42 -42
- package/dist/index.js +42 -42
- package/dist/polyfills.d.ts +29 -29
- package/dist/polyfills.js +38 -38
- package/dist/vertexeffects/JitterEffect.d.ts +39 -39
- package/dist/vertexeffects/JitterEffect.js +45 -45
- package/dist/vertexeffects/SwirlEffect.d.ts +44 -44
- package/dist/vertexeffects/SwirlEffect.js +60 -60
- package/package.json +32 -32
package/dist/IkConstraint.js
CHANGED
|
@@ -1,285 +1,285 @@
|
|
|
1
|
-
/******************************************************************************
|
|
2
|
-
* Spine Runtimes License Agreement
|
|
3
|
-
* Last updated January 1, 2020. Replaces all prior versions.
|
|
4
|
-
*
|
|
5
|
-
* Copyright (c) 2013-2020, Esoteric Software LLC
|
|
6
|
-
*
|
|
7
|
-
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
-
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
-
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
-
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
-
*
|
|
12
|
-
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
-
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
-
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
-
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
-
* include this license and copyright notice.
|
|
17
|
-
*
|
|
18
|
-
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
-
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
-
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
-
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
-
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
-
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
-
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
-
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
-
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
-
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
-
*****************************************************************************/
|
|
29
|
-
import { TransformMode } from "./BoneData";
|
|
30
|
-
import { MathUtils } from "./Utils";
|
|
31
|
-
/** Stores the current pose for an IK constraint. An IK constraint adjusts the rotation of 1 or 2 constrained bones so the tip of
|
|
32
|
-
* the last bone is as close to the target bone as possible.
|
|
33
|
-
*
|
|
34
|
-
* See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide. */
|
|
35
|
-
export class IkConstraint {
|
|
36
|
-
constructor(data, skeleton) {
|
|
37
|
-
/** Controls the bend direction of the IK bones, either 1 or -1. */
|
|
38
|
-
this.bendDirection = 0;
|
|
39
|
-
/** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */
|
|
40
|
-
this.compress = false;
|
|
41
|
-
/** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained
|
|
42
|
-
* and the parent bone has local nonuniform scale, stretch is not applied. */
|
|
43
|
-
this.stretch = false;
|
|
44
|
-
/** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */
|
|
45
|
-
this.mix = 1;
|
|
46
|
-
/** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */
|
|
47
|
-
this.softness = 0;
|
|
48
|
-
this.active = false;
|
|
49
|
-
if (!data)
|
|
50
|
-
throw new Error("data cannot be null.");
|
|
51
|
-
if (!skeleton)
|
|
52
|
-
throw new Error("skeleton cannot be null.");
|
|
53
|
-
this.data = data;
|
|
54
|
-
this.mix = data.mix;
|
|
55
|
-
this.softness = data.softness;
|
|
56
|
-
this.bendDirection = data.bendDirection;
|
|
57
|
-
this.compress = data.compress;
|
|
58
|
-
this.stretch = data.stretch;
|
|
59
|
-
this.bones = new Array();
|
|
60
|
-
for (let i = 0; i < data.bones.length; i++)
|
|
61
|
-
this.bones.push(skeleton.findBone(data.bones[i].name));
|
|
62
|
-
this.target = skeleton.findBone(data.target.name);
|
|
63
|
-
}
|
|
64
|
-
isActive() {
|
|
65
|
-
return this.active;
|
|
66
|
-
}
|
|
67
|
-
update() {
|
|
68
|
-
if (this.mix == 0)
|
|
69
|
-
return;
|
|
70
|
-
let target = this.target;
|
|
71
|
-
let bones = this.bones;
|
|
72
|
-
switch (bones.length) {
|
|
73
|
-
case 1:
|
|
74
|
-
this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);
|
|
75
|
-
break;
|
|
76
|
-
case 2:
|
|
77
|
-
this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.data.uniform, this.softness, this.mix);
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/** Applies 1 bone IK. The target is specified in the world coordinate system. */
|
|
82
|
-
apply1(bone, targetX, targetY, compress, stretch, uniform, alpha) {
|
|
83
|
-
let p = bone.parent;
|
|
84
|
-
let pa = p.a, pb = p.b, pc = p.c, pd = p.d;
|
|
85
|
-
let rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0;
|
|
86
|
-
switch (bone.data.transformMode) {
|
|
87
|
-
case TransformMode.OnlyTranslation:
|
|
88
|
-
tx = targetX - bone.worldX;
|
|
89
|
-
ty = targetY - bone.worldY;
|
|
90
|
-
break;
|
|
91
|
-
case TransformMode.NoRotationOrReflection:
|
|
92
|
-
let s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
|
|
93
|
-
let sa = pa / bone.skeleton.scaleX;
|
|
94
|
-
let sc = pc / bone.skeleton.scaleY;
|
|
95
|
-
pb = -sc * s * bone.skeleton.scaleX;
|
|
96
|
-
pd = sa * s * bone.skeleton.scaleY;
|
|
97
|
-
rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;
|
|
98
|
-
// Fall through
|
|
99
|
-
default:
|
|
100
|
-
let x = targetX - p.worldX, y = targetY - p.worldY;
|
|
101
|
-
let d = pa * pd - pb * pc;
|
|
102
|
-
tx = (x * pd - y * pb) / d - bone.ax;
|
|
103
|
-
ty = (y * pa - x * pc) / d - bone.ay;
|
|
104
|
-
}
|
|
105
|
-
rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;
|
|
106
|
-
if (bone.ascaleX < 0)
|
|
107
|
-
rotationIK += 180;
|
|
108
|
-
if (rotationIK > 180)
|
|
109
|
-
rotationIK -= 360;
|
|
110
|
-
else if (rotationIK < -180)
|
|
111
|
-
rotationIK += 360;
|
|
112
|
-
let sx = bone.ascaleX, sy = bone.ascaleY;
|
|
113
|
-
if (compress || stretch) {
|
|
114
|
-
switch (bone.data.transformMode) {
|
|
115
|
-
case TransformMode.NoScale:
|
|
116
|
-
case TransformMode.NoScaleOrReflection:
|
|
117
|
-
tx = targetX - bone.worldX;
|
|
118
|
-
ty = targetY - bone.worldY;
|
|
119
|
-
}
|
|
120
|
-
let b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty);
|
|
121
|
-
if ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) {
|
|
122
|
-
let s = (dd / b - 1) * alpha + 1;
|
|
123
|
-
sx *= s;
|
|
124
|
-
if (uniform)
|
|
125
|
-
sy *= s;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY);
|
|
129
|
-
}
|
|
130
|
-
/** Applies 2 bone IK. The target is specified in the world coordinate system.
|
|
131
|
-
* @param child A direct descendant of the parent bone. */
|
|
132
|
-
apply2(parent, child, targetX, targetY, bendDir, stretch, uniform, softness, alpha) {
|
|
133
|
-
let px = parent.ax, py = parent.ay, psx = parent.ascaleX, psy = parent.ascaleY, sx = psx, sy = psy, csx = child.ascaleX;
|
|
134
|
-
let os1 = 0, os2 = 0, s2 = 0;
|
|
135
|
-
if (psx < 0) {
|
|
136
|
-
psx = -psx;
|
|
137
|
-
os1 = 180;
|
|
138
|
-
s2 = -1;
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
os1 = 0;
|
|
142
|
-
s2 = 1;
|
|
143
|
-
}
|
|
144
|
-
if (psy < 0) {
|
|
145
|
-
psy = -psy;
|
|
146
|
-
s2 = -s2;
|
|
147
|
-
}
|
|
148
|
-
if (csx < 0) {
|
|
149
|
-
csx = -csx;
|
|
150
|
-
os2 = 180;
|
|
151
|
-
}
|
|
152
|
-
else
|
|
153
|
-
os2 = 0;
|
|
154
|
-
let cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = parent.a, b = parent.b, c = parent.c, d = parent.d;
|
|
155
|
-
let u = Math.abs(psx - psy) <= 0.0001;
|
|
156
|
-
if (!u || stretch) {
|
|
157
|
-
cy = 0;
|
|
158
|
-
cwx = a * cx + parent.worldX;
|
|
159
|
-
cwy = c * cx + parent.worldY;
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
cy = child.ay;
|
|
163
|
-
cwx = a * cx + b * cy + parent.worldX;
|
|
164
|
-
cwy = c * cx + d * cy + parent.worldY;
|
|
165
|
-
}
|
|
166
|
-
let pp = parent.parent;
|
|
167
|
-
a = pp.a;
|
|
168
|
-
b = pp.b;
|
|
169
|
-
c = pp.c;
|
|
170
|
-
d = pp.d;
|
|
171
|
-
let id = 1 / (a * d - b * c), x = cwx - pp.worldX, y = cwy - pp.worldY;
|
|
172
|
-
let dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py;
|
|
173
|
-
let l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2;
|
|
174
|
-
if (l1 < 0.0001) {
|
|
175
|
-
this.apply1(parent, targetX, targetY, false, stretch, false, alpha);
|
|
176
|
-
child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
x = targetX - pp.worldX;
|
|
180
|
-
y = targetY - pp.worldY;
|
|
181
|
-
let tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py;
|
|
182
|
-
let dd = tx * tx + ty * ty;
|
|
183
|
-
if (softness != 0) {
|
|
184
|
-
softness *= psx * (csx + 1) * 0.5;
|
|
185
|
-
let td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;
|
|
186
|
-
if (sd > 0) {
|
|
187
|
-
let p = Math.min(1, sd / (softness * 2)) - 1;
|
|
188
|
-
p = (sd - softness * (1 - p * p)) / td;
|
|
189
|
-
tx -= p * tx;
|
|
190
|
-
ty -= p * ty;
|
|
191
|
-
dd = tx * tx + ty * ty;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
outer: if (u) {
|
|
195
|
-
l2 *= psx;
|
|
196
|
-
let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);
|
|
197
|
-
if (cos < -1) {
|
|
198
|
-
cos = -1;
|
|
199
|
-
a2 = Math.PI * bendDir;
|
|
200
|
-
}
|
|
201
|
-
else if (cos > 1) {
|
|
202
|
-
cos = 1;
|
|
203
|
-
a2 = 0;
|
|
204
|
-
if (stretch) {
|
|
205
|
-
a = (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;
|
|
206
|
-
sx *= a;
|
|
207
|
-
if (uniform)
|
|
208
|
-
sy *= a;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
else
|
|
212
|
-
a2 = Math.acos(cos) * bendDir;
|
|
213
|
-
a = l1 + l2 * cos;
|
|
214
|
-
b = l2 * Math.sin(a2);
|
|
215
|
-
a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
a = psx * l2;
|
|
219
|
-
b = psy * l2;
|
|
220
|
-
let aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);
|
|
221
|
-
c = bb * l1 * l1 + aa * dd - aa * bb;
|
|
222
|
-
let c1 = -2 * bb * l1, c2 = bb - aa;
|
|
223
|
-
d = c1 * c1 - 4 * c2 * c;
|
|
224
|
-
if (d >= 0) {
|
|
225
|
-
let q = Math.sqrt(d);
|
|
226
|
-
if (c1 < 0)
|
|
227
|
-
q = -q;
|
|
228
|
-
q = -(c1 + q) * 0.5;
|
|
229
|
-
let r0 = q / c2, r1 = c / q;
|
|
230
|
-
let r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
|
|
231
|
-
if (r * r <= dd) {
|
|
232
|
-
y = Math.sqrt(dd - r * r) * bendDir;
|
|
233
|
-
a1 = ta - Math.atan2(y, r);
|
|
234
|
-
a2 = Math.atan2(y / psy, (r - l1) / psx);
|
|
235
|
-
break outer;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
let minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0;
|
|
239
|
-
let maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;
|
|
240
|
-
c = -a * l1 / (aa - bb);
|
|
241
|
-
if (c >= -1 && c <= 1) {
|
|
242
|
-
c = Math.acos(c);
|
|
243
|
-
x = a * Math.cos(c) + l1;
|
|
244
|
-
y = b * Math.sin(c);
|
|
245
|
-
d = x * x + y * y;
|
|
246
|
-
if (d < minDist) {
|
|
247
|
-
minAngle = c;
|
|
248
|
-
minDist = d;
|
|
249
|
-
minX = x;
|
|
250
|
-
minY = y;
|
|
251
|
-
}
|
|
252
|
-
if (d > maxDist) {
|
|
253
|
-
maxAngle = c;
|
|
254
|
-
maxDist = d;
|
|
255
|
-
maxX = x;
|
|
256
|
-
maxY = y;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
if (dd <= (minDist + maxDist) * 0.5) {
|
|
260
|
-
a1 = ta - Math.atan2(minY * bendDir, minX);
|
|
261
|
-
a2 = minAngle * bendDir;
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
264
|
-
a1 = ta - Math.atan2(maxY * bendDir, maxX);
|
|
265
|
-
a2 = maxAngle * bendDir;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
let os = Math.atan2(cy, cx) * s2;
|
|
269
|
-
let rotation = parent.arotation;
|
|
270
|
-
a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;
|
|
271
|
-
if (a1 > 180)
|
|
272
|
-
a1 -= 360;
|
|
273
|
-
else if (a1 < -180) //
|
|
274
|
-
a1 += 360;
|
|
275
|
-
parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, sy, 0, 0);
|
|
276
|
-
rotation = child.arotation;
|
|
277
|
-
a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;
|
|
278
|
-
if (a2 > 180)
|
|
279
|
-
a2 -= 360;
|
|
280
|
-
else if (a2 < -180) //
|
|
281
|
-
a2 += 360;
|
|
282
|
-
child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated January 1, 2020. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2020, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
+
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import { TransformMode } from "./BoneData";
|
|
30
|
+
import { MathUtils } from "./Utils";
|
|
31
|
+
/** Stores the current pose for an IK constraint. An IK constraint adjusts the rotation of 1 or 2 constrained bones so the tip of
|
|
32
|
+
* the last bone is as close to the target bone as possible.
|
|
33
|
+
*
|
|
34
|
+
* See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide. */
|
|
35
|
+
export class IkConstraint {
|
|
36
|
+
constructor(data, skeleton) {
|
|
37
|
+
/** Controls the bend direction of the IK bones, either 1 or -1. */
|
|
38
|
+
this.bendDirection = 0;
|
|
39
|
+
/** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */
|
|
40
|
+
this.compress = false;
|
|
41
|
+
/** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained
|
|
42
|
+
* and the parent bone has local nonuniform scale, stretch is not applied. */
|
|
43
|
+
this.stretch = false;
|
|
44
|
+
/** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */
|
|
45
|
+
this.mix = 1;
|
|
46
|
+
/** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */
|
|
47
|
+
this.softness = 0;
|
|
48
|
+
this.active = false;
|
|
49
|
+
if (!data)
|
|
50
|
+
throw new Error("data cannot be null.");
|
|
51
|
+
if (!skeleton)
|
|
52
|
+
throw new Error("skeleton cannot be null.");
|
|
53
|
+
this.data = data;
|
|
54
|
+
this.mix = data.mix;
|
|
55
|
+
this.softness = data.softness;
|
|
56
|
+
this.bendDirection = data.bendDirection;
|
|
57
|
+
this.compress = data.compress;
|
|
58
|
+
this.stretch = data.stretch;
|
|
59
|
+
this.bones = new Array();
|
|
60
|
+
for (let i = 0; i < data.bones.length; i++)
|
|
61
|
+
this.bones.push(skeleton.findBone(data.bones[i].name));
|
|
62
|
+
this.target = skeleton.findBone(data.target.name);
|
|
63
|
+
}
|
|
64
|
+
isActive() {
|
|
65
|
+
return this.active;
|
|
66
|
+
}
|
|
67
|
+
update() {
|
|
68
|
+
if (this.mix == 0)
|
|
69
|
+
return;
|
|
70
|
+
let target = this.target;
|
|
71
|
+
let bones = this.bones;
|
|
72
|
+
switch (bones.length) {
|
|
73
|
+
case 1:
|
|
74
|
+
this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);
|
|
75
|
+
break;
|
|
76
|
+
case 2:
|
|
77
|
+
this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.data.uniform, this.softness, this.mix);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Applies 1 bone IK. The target is specified in the world coordinate system. */
|
|
82
|
+
apply1(bone, targetX, targetY, compress, stretch, uniform, alpha) {
|
|
83
|
+
let p = bone.parent;
|
|
84
|
+
let pa = p.a, pb = p.b, pc = p.c, pd = p.d;
|
|
85
|
+
let rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0;
|
|
86
|
+
switch (bone.data.transformMode) {
|
|
87
|
+
case TransformMode.OnlyTranslation:
|
|
88
|
+
tx = targetX - bone.worldX;
|
|
89
|
+
ty = targetY - bone.worldY;
|
|
90
|
+
break;
|
|
91
|
+
case TransformMode.NoRotationOrReflection:
|
|
92
|
+
let s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
|
|
93
|
+
let sa = pa / bone.skeleton.scaleX;
|
|
94
|
+
let sc = pc / bone.skeleton.scaleY;
|
|
95
|
+
pb = -sc * s * bone.skeleton.scaleX;
|
|
96
|
+
pd = sa * s * bone.skeleton.scaleY;
|
|
97
|
+
rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;
|
|
98
|
+
// Fall through
|
|
99
|
+
default:
|
|
100
|
+
let x = targetX - p.worldX, y = targetY - p.worldY;
|
|
101
|
+
let d = pa * pd - pb * pc;
|
|
102
|
+
tx = (x * pd - y * pb) / d - bone.ax;
|
|
103
|
+
ty = (y * pa - x * pc) / d - bone.ay;
|
|
104
|
+
}
|
|
105
|
+
rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;
|
|
106
|
+
if (bone.ascaleX < 0)
|
|
107
|
+
rotationIK += 180;
|
|
108
|
+
if (rotationIK > 180)
|
|
109
|
+
rotationIK -= 360;
|
|
110
|
+
else if (rotationIK < -180)
|
|
111
|
+
rotationIK += 360;
|
|
112
|
+
let sx = bone.ascaleX, sy = bone.ascaleY;
|
|
113
|
+
if (compress || stretch) {
|
|
114
|
+
switch (bone.data.transformMode) {
|
|
115
|
+
case TransformMode.NoScale:
|
|
116
|
+
case TransformMode.NoScaleOrReflection:
|
|
117
|
+
tx = targetX - bone.worldX;
|
|
118
|
+
ty = targetY - bone.worldY;
|
|
119
|
+
}
|
|
120
|
+
let b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty);
|
|
121
|
+
if ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) {
|
|
122
|
+
let s = (dd / b - 1) * alpha + 1;
|
|
123
|
+
sx *= s;
|
|
124
|
+
if (uniform)
|
|
125
|
+
sy *= s;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY);
|
|
129
|
+
}
|
|
130
|
+
/** Applies 2 bone IK. The target is specified in the world coordinate system.
|
|
131
|
+
* @param child A direct descendant of the parent bone. */
|
|
132
|
+
apply2(parent, child, targetX, targetY, bendDir, stretch, uniform, softness, alpha) {
|
|
133
|
+
let px = parent.ax, py = parent.ay, psx = parent.ascaleX, psy = parent.ascaleY, sx = psx, sy = psy, csx = child.ascaleX;
|
|
134
|
+
let os1 = 0, os2 = 0, s2 = 0;
|
|
135
|
+
if (psx < 0) {
|
|
136
|
+
psx = -psx;
|
|
137
|
+
os1 = 180;
|
|
138
|
+
s2 = -1;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
os1 = 0;
|
|
142
|
+
s2 = 1;
|
|
143
|
+
}
|
|
144
|
+
if (psy < 0) {
|
|
145
|
+
psy = -psy;
|
|
146
|
+
s2 = -s2;
|
|
147
|
+
}
|
|
148
|
+
if (csx < 0) {
|
|
149
|
+
csx = -csx;
|
|
150
|
+
os2 = 180;
|
|
151
|
+
}
|
|
152
|
+
else
|
|
153
|
+
os2 = 0;
|
|
154
|
+
let cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = parent.a, b = parent.b, c = parent.c, d = parent.d;
|
|
155
|
+
let u = Math.abs(psx - psy) <= 0.0001;
|
|
156
|
+
if (!u || stretch) {
|
|
157
|
+
cy = 0;
|
|
158
|
+
cwx = a * cx + parent.worldX;
|
|
159
|
+
cwy = c * cx + parent.worldY;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
cy = child.ay;
|
|
163
|
+
cwx = a * cx + b * cy + parent.worldX;
|
|
164
|
+
cwy = c * cx + d * cy + parent.worldY;
|
|
165
|
+
}
|
|
166
|
+
let pp = parent.parent;
|
|
167
|
+
a = pp.a;
|
|
168
|
+
b = pp.b;
|
|
169
|
+
c = pp.c;
|
|
170
|
+
d = pp.d;
|
|
171
|
+
let id = 1 / (a * d - b * c), x = cwx - pp.worldX, y = cwy - pp.worldY;
|
|
172
|
+
let dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py;
|
|
173
|
+
let l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2;
|
|
174
|
+
if (l1 < 0.0001) {
|
|
175
|
+
this.apply1(parent, targetX, targetY, false, stretch, false, alpha);
|
|
176
|
+
child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
x = targetX - pp.worldX;
|
|
180
|
+
y = targetY - pp.worldY;
|
|
181
|
+
let tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py;
|
|
182
|
+
let dd = tx * tx + ty * ty;
|
|
183
|
+
if (softness != 0) {
|
|
184
|
+
softness *= psx * (csx + 1) * 0.5;
|
|
185
|
+
let td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;
|
|
186
|
+
if (sd > 0) {
|
|
187
|
+
let p = Math.min(1, sd / (softness * 2)) - 1;
|
|
188
|
+
p = (sd - softness * (1 - p * p)) / td;
|
|
189
|
+
tx -= p * tx;
|
|
190
|
+
ty -= p * ty;
|
|
191
|
+
dd = tx * tx + ty * ty;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
outer: if (u) {
|
|
195
|
+
l2 *= psx;
|
|
196
|
+
let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);
|
|
197
|
+
if (cos < -1) {
|
|
198
|
+
cos = -1;
|
|
199
|
+
a2 = Math.PI * bendDir;
|
|
200
|
+
}
|
|
201
|
+
else if (cos > 1) {
|
|
202
|
+
cos = 1;
|
|
203
|
+
a2 = 0;
|
|
204
|
+
if (stretch) {
|
|
205
|
+
a = (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;
|
|
206
|
+
sx *= a;
|
|
207
|
+
if (uniform)
|
|
208
|
+
sy *= a;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
a2 = Math.acos(cos) * bendDir;
|
|
213
|
+
a = l1 + l2 * cos;
|
|
214
|
+
b = l2 * Math.sin(a2);
|
|
215
|
+
a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
a = psx * l2;
|
|
219
|
+
b = psy * l2;
|
|
220
|
+
let aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);
|
|
221
|
+
c = bb * l1 * l1 + aa * dd - aa * bb;
|
|
222
|
+
let c1 = -2 * bb * l1, c2 = bb - aa;
|
|
223
|
+
d = c1 * c1 - 4 * c2 * c;
|
|
224
|
+
if (d >= 0) {
|
|
225
|
+
let q = Math.sqrt(d);
|
|
226
|
+
if (c1 < 0)
|
|
227
|
+
q = -q;
|
|
228
|
+
q = -(c1 + q) * 0.5;
|
|
229
|
+
let r0 = q / c2, r1 = c / q;
|
|
230
|
+
let r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
|
|
231
|
+
if (r * r <= dd) {
|
|
232
|
+
y = Math.sqrt(dd - r * r) * bendDir;
|
|
233
|
+
a1 = ta - Math.atan2(y, r);
|
|
234
|
+
a2 = Math.atan2(y / psy, (r - l1) / psx);
|
|
235
|
+
break outer;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
let minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0;
|
|
239
|
+
let maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;
|
|
240
|
+
c = -a * l1 / (aa - bb);
|
|
241
|
+
if (c >= -1 && c <= 1) {
|
|
242
|
+
c = Math.acos(c);
|
|
243
|
+
x = a * Math.cos(c) + l1;
|
|
244
|
+
y = b * Math.sin(c);
|
|
245
|
+
d = x * x + y * y;
|
|
246
|
+
if (d < minDist) {
|
|
247
|
+
minAngle = c;
|
|
248
|
+
minDist = d;
|
|
249
|
+
minX = x;
|
|
250
|
+
minY = y;
|
|
251
|
+
}
|
|
252
|
+
if (d > maxDist) {
|
|
253
|
+
maxAngle = c;
|
|
254
|
+
maxDist = d;
|
|
255
|
+
maxX = x;
|
|
256
|
+
maxY = y;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (dd <= (minDist + maxDist) * 0.5) {
|
|
260
|
+
a1 = ta - Math.atan2(minY * bendDir, minX);
|
|
261
|
+
a2 = minAngle * bendDir;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
a1 = ta - Math.atan2(maxY * bendDir, maxX);
|
|
265
|
+
a2 = maxAngle * bendDir;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
let os = Math.atan2(cy, cx) * s2;
|
|
269
|
+
let rotation = parent.arotation;
|
|
270
|
+
a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;
|
|
271
|
+
if (a1 > 180)
|
|
272
|
+
a1 -= 360;
|
|
273
|
+
else if (a1 < -180) //
|
|
274
|
+
a1 += 360;
|
|
275
|
+
parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, sy, 0, 0);
|
|
276
|
+
rotation = child.arotation;
|
|
277
|
+
a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;
|
|
278
|
+
if (a2 > 180)
|
|
279
|
+
a2 -= 360;
|
|
280
|
+
else if (a2 < -180) //
|
|
281
|
+
a2 += 360;
|
|
282
|
+
child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
285
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWtDb25zdHJhaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0lrQ29uc3RyYWludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFHL0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUkzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBDOzs7cUdBR3FHO0FBQ3JHLE1BQU0sT0FBTyxZQUFZO0lBMkJ4QixZQUFhLElBQXNCLEVBQUUsUUFBa0I7UUFqQnZELG1FQUFtRTtRQUNuRSxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQix5SEFBeUg7UUFDekgsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQjtxRkFDNkU7UUFDN0UsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixvR0FBb0c7UUFDcEcsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUVSLGlHQUFpRztRQUNqRyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdkLElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FB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QUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFO1lBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDUCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzdCLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDN0I7YUFBTTtZQUNOLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3RDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUN0QztRQUNELElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDVCxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNULENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDVCxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3ZFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ25FLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzVFLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRTtZQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEcsT0FBTztTQUNQO1FBQ0QsQ0FBQyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3hCLENBQUMsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNuRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO1lBQ2xCLFFBQVEsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7WUFDM0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNiLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNiLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7YUFDdkI7U0FDRDtRQUNELEtBQUssRUFDTCxJQUFJLENBQUMsRUFBRTtZQUNOLEVBQUUsSUFBSSxHQUFHLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2IsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNULEVBQUUsR0FB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
|