@esotericsoftware/spine-pixi-v8 4.2.63 → 4.2.65
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/Spine.d.ts +5 -10
- package/dist/Spine.js +24 -25
- package/dist/SpinePipe.d.ts +3 -0
- package/dist/SpinePipe.js +16 -8
- package/dist/iife/spine-pixi-v8.js +35 -28
- package/dist/iife/spine-pixi-v8.js.map +2 -2
- package/dist/iife/spine-pixi-v8.min.js +3 -3
- package/package.json +2 -2
package/dist/Spine.d.ts
CHANGED
|
@@ -120,11 +120,11 @@ export declare class Spine extends ViewContainer {
|
|
|
120
120
|
* @example spineGO.debug = new SpineDebugRenderer();
|
|
121
121
|
*/
|
|
122
122
|
set debug(value: ISpineDebugRenderer | undefined);
|
|
123
|
-
private autoUpdateWarned;
|
|
124
123
|
private _autoUpdate;
|
|
125
124
|
get autoUpdate(): boolean;
|
|
126
125
|
/** When `true`, the Spine AnimationState and the Skeleton will be automatically updated using the {@link Ticker.shared} instance. */
|
|
127
126
|
set autoUpdate(value: boolean);
|
|
127
|
+
private hasNeverUpdated;
|
|
128
128
|
constructor(options: SpineOptions | SkeletonData);
|
|
129
129
|
/** If {@link Spine.autoUpdate} is `false`, this method allows to update the AnimationState and the Skeleton with the given delta. */
|
|
130
130
|
update(dt: number): void;
|
|
@@ -145,23 +145,18 @@ export declare class Spine extends ViewContainer {
|
|
|
145
145
|
*/
|
|
146
146
|
getBonePosition(bone: string | Bone, outPos?: PointData): PointData | undefined;
|
|
147
147
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
148
|
+
* Advance the state and skeleton by the given time, then update slot objects too.
|
|
149
|
+
* The container transform is not updated.
|
|
150
150
|
*
|
|
151
151
|
* @param time the time at which to set the state
|
|
152
|
-
* @internal
|
|
153
152
|
*/
|
|
154
|
-
|
|
153
|
+
private _updateAndApplyState;
|
|
155
154
|
/**
|
|
156
|
-
* Applies the state to this spine instance.
|
|
157
|
-
* - updates the state to the skeleton
|
|
158
|
-
* - updates its world transform (spine world transform)
|
|
159
155
|
* - validates the attachments - to flag if the attachments have changed this state
|
|
160
156
|
* - transforms the attachments - to update the vertices of the attachments based on the new positions
|
|
161
|
-
* - update the slot attachments - to update the position, rotation, scale, and visibility of the attached containers
|
|
162
157
|
* @internal
|
|
163
158
|
*/
|
|
164
|
-
|
|
159
|
+
_validateAndTransformAttachments(): void;
|
|
165
160
|
private validateAttachments;
|
|
166
161
|
private updateAndSetPixiMask;
|
|
167
162
|
private currentClippingSlot;
|
package/dist/Spine.js
CHANGED
|
@@ -88,7 +88,6 @@ export class Spine extends ViewContainer {
|
|
|
88
88
|
}
|
|
89
89
|
this._debug = value;
|
|
90
90
|
}
|
|
91
|
-
autoUpdateWarned = false;
|
|
92
91
|
_autoUpdate = true;
|
|
93
92
|
get autoUpdate() {
|
|
94
93
|
return this._autoUpdate;
|
|
@@ -97,13 +96,13 @@ export class Spine extends ViewContainer {
|
|
|
97
96
|
set autoUpdate(value) {
|
|
98
97
|
if (value) {
|
|
99
98
|
Ticker.shared.add(this.internalUpdate, this);
|
|
100
|
-
this.autoUpdateWarned = false;
|
|
101
99
|
}
|
|
102
100
|
else {
|
|
103
101
|
Ticker.shared.remove(this.internalUpdate, this);
|
|
104
102
|
}
|
|
105
103
|
this._autoUpdate = value;
|
|
106
104
|
}
|
|
105
|
+
hasNeverUpdated = true;
|
|
107
106
|
constructor(options) {
|
|
108
107
|
if (options instanceof SkeletonData) {
|
|
109
108
|
options = {
|
|
@@ -123,20 +122,15 @@ export class Spine extends ViewContainer {
|
|
|
123
122
|
for (let i = 0; i < slots.length; i++) {
|
|
124
123
|
this.attachmentCacheData[i] = Object.create(null);
|
|
125
124
|
}
|
|
126
|
-
this._updateState(0);
|
|
127
125
|
}
|
|
128
126
|
/** If {@link Spine.autoUpdate} is `false`, this method allows to update the AnimationState and the Skeleton with the given delta. */
|
|
129
127
|
update(dt) {
|
|
130
|
-
if (this.autoUpdate && !this.autoUpdateWarned) {
|
|
131
|
-
console.warn('You are calling update on a Spine instance that has autoUpdate set to true. This is probably not what you want.');
|
|
132
|
-
this.autoUpdateWarned = true;
|
|
133
|
-
}
|
|
134
128
|
this.internalUpdate(0, dt);
|
|
135
129
|
}
|
|
136
130
|
internalUpdate(_deltaFrame, deltaSeconds) {
|
|
137
131
|
// Because reasons, pixi uses deltaFrames at 60fps.
|
|
138
132
|
// We ignore the default deltaFrames and use the deltaSeconds from pixi ticker.
|
|
139
|
-
this.
|
|
133
|
+
this._updateAndApplyState(deltaSeconds ?? Ticker.shared.deltaMS / 1000);
|
|
140
134
|
}
|
|
141
135
|
get bounds() {
|
|
142
136
|
if (this._boundsDirty) {
|
|
@@ -191,40 +185,36 @@ export class Spine extends ViewContainer {
|
|
|
191
185
|
return outPos;
|
|
192
186
|
}
|
|
193
187
|
/**
|
|
194
|
-
*
|
|
195
|
-
*
|
|
188
|
+
* Advance the state and skeleton by the given time, then update slot objects too.
|
|
189
|
+
* The container transform is not updated.
|
|
196
190
|
*
|
|
197
191
|
* @param time the time at which to set the state
|
|
198
|
-
* @internal
|
|
199
192
|
*/
|
|
200
|
-
|
|
193
|
+
_updateAndApplyState(time) {
|
|
194
|
+
this.hasNeverUpdated = false;
|
|
201
195
|
this.state.update(time);
|
|
202
196
|
this.skeleton.update(time);
|
|
197
|
+
const { skeleton } = this;
|
|
198
|
+
this.state.apply(skeleton);
|
|
199
|
+
this.beforeUpdateWorldTransforms(this);
|
|
200
|
+
skeleton.updateWorldTransform(Physics.update);
|
|
201
|
+
this.afterUpdateWorldTransforms(this);
|
|
202
|
+
this.updateSlotObjects();
|
|
203
203
|
this._stateChanged = true;
|
|
204
204
|
this._boundsDirty = true;
|
|
205
205
|
this.onViewUpdate();
|
|
206
206
|
}
|
|
207
207
|
/**
|
|
208
|
-
* Applies the state to this spine instance.
|
|
209
|
-
* - updates the state to the skeleton
|
|
210
|
-
* - updates its world transform (spine world transform)
|
|
211
208
|
* - validates the attachments - to flag if the attachments have changed this state
|
|
212
209
|
* - transforms the attachments - to update the vertices of the attachments based on the new positions
|
|
213
|
-
* - update the slot attachments - to update the position, rotation, scale, and visibility of the attached containers
|
|
214
210
|
* @internal
|
|
215
211
|
*/
|
|
216
|
-
|
|
212
|
+
_validateAndTransformAttachments() {
|
|
217
213
|
if (!this._stateChanged)
|
|
218
214
|
return;
|
|
219
215
|
this._stateChanged = false;
|
|
220
|
-
const { skeleton } = this;
|
|
221
|
-
this.state.apply(skeleton);
|
|
222
|
-
this.beforeUpdateWorldTransforms(this);
|
|
223
|
-
skeleton.updateWorldTransform(Physics.update);
|
|
224
|
-
this.afterUpdateWorldTransforms(this);
|
|
225
216
|
this.validateAttachments();
|
|
226
217
|
this.transformAttachments();
|
|
227
|
-
this.updateSlotObjects();
|
|
228
218
|
}
|
|
229
219
|
validateAttachments() {
|
|
230
220
|
const currentDrawOrder = this.skeleton.drawOrder;
|
|
@@ -316,6 +306,11 @@ export class Spine extends ViewContainer {
|
|
|
316
306
|
else {
|
|
317
307
|
attachment.computeWorldVertices(slot, 0, attachment.worldVerticesLength, cacheData.vertices, 0, 2);
|
|
318
308
|
}
|
|
309
|
+
// sequences uvs are known only after computeWorldVertices is invoked
|
|
310
|
+
if (cacheData.uvs.length < attachment.uvs.length) {
|
|
311
|
+
cacheData.uvs = new Float32Array(attachment.uvs.length);
|
|
312
|
+
}
|
|
313
|
+
// need to copy because attachments uvs are shared among skeletons using the same atlas
|
|
319
314
|
fastCopy(attachment.uvs.buffer, cacheData.uvs.buffer);
|
|
320
315
|
const skeleton = slot.bone.skeleton;
|
|
321
316
|
const skeletonColor = skeleton.color;
|
|
@@ -531,7 +526,11 @@ export class Spine extends ViewContainer {
|
|
|
531
526
|
const skeletonBounds = this.skeletonBounds;
|
|
532
527
|
skeletonBounds.update(this.skeleton, true);
|
|
533
528
|
if (skeletonBounds.minX === Infinity) {
|
|
534
|
-
this.
|
|
529
|
+
if (this.hasNeverUpdated) {
|
|
530
|
+
this._updateAndApplyState(0);
|
|
531
|
+
this._boundsDirty = false;
|
|
532
|
+
}
|
|
533
|
+
this._validateAndTransformAttachments();
|
|
535
534
|
const drawOrder = this.skeleton.drawOrder;
|
|
536
535
|
const bounds = this._bounds;
|
|
537
536
|
bounds.clear();
|
|
@@ -626,4 +625,4 @@ export class Spine extends ViewContainer {
|
|
|
626
625
|
});
|
|
627
626
|
}
|
|
628
627
|
}
|
|
629
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3BpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sRUFDTixNQUFNLEVBRU4sS0FBSyxFQUNMLFNBQVMsRUFFVCxVQUFVLEVBRVYsUUFBUSxFQUNSLFFBQVEsRUFFUixPQUFPLEVBQ1AsTUFBTSxFQUNOLGFBQWEsR0FDYixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEVBQ04sY0FBYyxFQUNkLGtCQUFrQixFQUNsQixxQkFBcUIsRUFHckIsa0JBQWtCLEVBQ2xCLEtBQUssRUFDTCxjQUFjLEVBQ2QsT0FBTyxFQUNQLElBQUksRUFDSixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixZQUFZLEVBSVosT0FBTyxHQUNQLE1BQU0sOEJBQThCLENBQUM7QUF3QnJDLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRWhDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBRXRCLE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQWtEdEMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFXLEdBQUcsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLEtBQU0sU0FBUSxhQUFhO0lBQ3ZDLGtCQUFrQjtJQUNYLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDZixPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ00sWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUN6QyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXhCLDJCQUEyQixHQUE0QixHQUFHLEVBQUUsR0FBVSxDQUFDLENBQUM7SUFDeEUsMEJBQTBCLEdBQTRC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QWMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN0QyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV0QyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFNUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFbEMsT0FBTyxJQUFJLEtBQUssQ0FBQztZQUNoQixZQUFZO1lBQ1osUUFBUTtZQUNSLFVBQVU7U0FDVixDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBKdWx5IDI4LCAyMDIzLiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjMsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3JcbiAqIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSEVcbiAqIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQge1xuXHRBc3NldHMsXG5cdEJvdW5kcyxcblx0Q2FjaGUsXG5cdENvbnRhaW5lcixcblx0Q29udGFpbmVyT3B0aW9ucyxcblx0REVHX1RPX1JBRCxcblx0RGVzdHJveU9wdGlvbnMsXG5cdGZhc3RDb3B5LFxuXHRHcmFwaGljcyxcblx0UG9pbnREYXRhLFxuXHRUZXh0dXJlLFxuXHRUaWNrZXIsXG5cdFZpZXdDb250YWluZXIsXG59IGZyb20gJ3BpeGkuanMnO1xuaW1wb3J0IHsgSVNwaW5lRGVidWdSZW5kZXJlciB9IGZyb20gJy4vU3BpbmVEZWJ1Z1JlbmRlcmVyJztcbmltcG9ydCB7XG5cdEFuaW1hdGlvblN0YXRlLFxuXHRBbmltYXRpb25TdGF0ZURhdGEsXG5cdEF0bGFzQXR0YWNobWVudExvYWRlcixcblx0QXR0YWNobWVudCxcblx0Qm9uZSxcblx0Q2xpcHBpbmdBdHRhY2htZW50LFxuXHRDb2xvcixcblx0TWVzaEF0dGFjaG1lbnQsXG5cdFBoeXNpY3MsXG5cdFBvb2wsXG5cdFJlZ2lvbkF0dGFjaG1lbnQsXG5cdFNrZWxldG9uLFxuXHRTa2VsZXRvbkJpbmFyeSxcblx0U2tlbGV0b25Cb3VuZHMsXG5cdFNrZWxldG9uQ2xpcHBpbmcsXG5cdFNrZWxldG9uRGF0YSxcblx0U2tlbGV0b25Kc29uLFxuXHRTbG90LFxuXHR0eXBlIFRleHR1cmVBdGxhcyxcblx0VHJhY2tFbnRyeSxcblx0VmVjdG9yMixcbn0gZnJvbSAnQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZSc7XG5cbi8qKlxuICogT3B0aW9ucyB0byBjcmVhdGUgYSB7QGxpbmsgU3BpbmV9IHVzaW5nIHtAbGluayBTcGluZS5mcm9tfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGluZUZyb21PcHRpb25zIHtcblx0LyoqIHRoZSBhc3NldCBuYW1lIGZvciB0aGUgc2tlbGV0b24gYC5za2VsYCBvciBgLmpzb25gIGZpbGUgcHJldmlvdXNseSBsb2FkZWQgaW50byB0aGUgQXNzZXRzICovXG5cdHNrZWxldG9uOiBzdHJpbmc7XG5cblx0LyoqIHRoZSBhc3NldCBuYW1lIGZvciB0aGUgYXRsYXMgZmlsZSBwcmV2aW91c2x5IGxvYWRlZCBpbnRvIHRoZSBBc3NldHMgKi9cblx0YXRsYXM6IHN0cmluZztcblxuXHQvKiogIFRoZSB2YWx1ZSBwYXNzZWQgdG8gdGhlIHNrZWxldG9uIHJlYWRlci4gSWYgb21pdHRlZCwgMSBpcyBwYXNzZWQuIFNlZSB7QGxpbmsgU2tlbGV0b25CaW5hcnkuc2NhbGV9IGZvciBkZXRhaWxzLiAqL1xuXHRzY2FsZT86IG51bWJlcjtcblxuXHQvKiogIFNldCB0aGUge0BsaW5rIFNwaW5lLmF1dG9VcGRhdGV9IHZhbHVlLiBJZiBvbWl0dGVkLCBpdCBpcyBzZXQgdG8gYHRydWVgLiAqL1xuXHRhdXRvVXBkYXRlPzogYm9vbGVhbjtcblxuXHQvKipcblx0ICogSWYgYHRydWVgLCB1c2UgdGhlIGRhcmsgdGludCByZW5kZXJlciB0byByZW5kZXIgdGhlIHNrZWxldG9uXG5cdCAqIElmIGBmYWxzZWAsIHVzZSB0aGUgZGVmYXVsdCBwaXhpIHJlbmRlcmVyIHRvIHJlbmRlciB0aGUgc2tlbGV0b25cblx0ICogSWYgYHVuZGVmaW5lZGAsIHVzZSB0aGUgZGFyayB0aW50IHJlbmRlcmVyIGlmIGF0IGxlYXN0IG9uZSBzbG90IGhhcyB0aW50IGJsYWNrXG5cdCAqL1xuXHRkYXJrVGludD86IGJvb2xlYW47XG59O1xuXG5jb25zdCB2ZWN0b3JBdXggPSBuZXcgVmVjdG9yMigpO1xuXG5Ta2VsZXRvbi55RG93biA9IHRydWU7XG5cbmNvbnN0IGNsaXBwZXIgPSBuZXcgU2tlbGV0b25DbGlwcGluZygpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNwaW5lT3B0aW9ucyBleHRlbmRzIENvbnRhaW5lck9wdGlvbnMge1xuXHQvKiogdGhlIHtAbGluayBTa2VsZXRvbkRhdGF9IHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIHNrZWxldG9uICovXG5cdHNrZWxldG9uRGF0YTogU2tlbGV0b25EYXRhO1xuXG5cdC8qKiAgU2VlIHtAbGluayBTcGluZUZyb21PcHRpb25zLmF1dG9VcGRhdGV9LiAqL1xuXHRhdXRvVXBkYXRlPzogYm9vbGVhbjtcblxuXHQvKiogIFNlZSB7QGxpbmsgU3BpbmVGcm9tT3B0aW9ucy5kYXJrVGludH0uICovXG5cdGRhcmtUaW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbmltYXRpb25TdGF0ZUxpc3RlbmVyIHtAbGluayBodHRwczovL2VuLmVzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWFwaS1yZWZlcmVuY2UjQW5pbWF0aW9uU3RhdGVMaXN0ZW5lciBldmVudHN9IGV4cG9zZWQgZm9yIFBpeGkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BpbmVFdmVudHMge1xuXHRjb21wbGV0ZTogW3RyYWNrRW50cnk6IFRyYWNrRW50cnldO1xuXHRkaXNwb3NlOiBbdHJhY2tFbnRyeTogVHJhY2tFbnRyeV07XG5cdGVuZDogW3RyYWNrRW50cnk6IFRyYWNrRW50cnldO1xuXHRldmVudDogW3RyYWNrRW50cnk6IFRyYWNrRW50cnksIGV2ZW50OiBFdmVudF07XG5cdGludGVycnVwdDogW3RyYWNrRW50cnk6IFRyYWNrRW50cnldO1xuXHRzdGFydDogW3RyYWNrRW50cnk6IFRyYWNrRW50cnldO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnRDYWNoZURhdGEge1xuXHRpZDogc3RyaW5nO1xuXHRjbGlwcGVkOiBib29sZWFuO1xuXHR2ZXJ0aWNlczogRmxvYXQzMkFycmF5O1xuXHR1dnM6IEZsb2F0MzJBcnJheTtcblx0aW5kaWNlczogbnVtYmVyW107XG5cdGNvbG9yOiBDb2xvcjtcblx0ZGFya0NvbG9yOiBDb2xvcjtcblx0ZGFya1RpbnQ6IGJvb2xlYW47XG5cdHNraXBSZW5kZXI6IGJvb2xlYW47XG5cdHRleHR1cmU6IFRleHR1cmU7XG5cdGNsaXBwZWREYXRhPzoge1xuXHRcdHZlcnRpY2VzOiBGbG9hdDMyQXJyYXk7XG5cdFx0dXZzOiBGbG9hdDMyQXJyYXk7XG5cdFx0aW5kaWNlczogVWludDE2QXJyYXk7XG5cdFx0dmVydGV4Q291bnQ6IG51bWJlcjtcblx0XHRpbmRpY2VzQ291bnQ6IG51bWJlcjtcblx0fTtcbn1cblxuaW50ZXJmYWNlIFNsb3RzVG9DbGlwcGluZyB7XG5cdHNsb3Q6IFNsb3QsXG5cdG1hc2s/OiBHcmFwaGljcyxcblx0bWFza0NvbXB1dGVkPzogYm9vbGVhbixcblx0dmVydGljZXM6IEFycmF5PG51bWJlcj4sXG59O1xuXG5jb25zdCBtYXNrUG9vbCA9IG5ldyBQb29sPEdyYXBoaWNzPigoKSA9PiBuZXcgR3JhcGhpY3MpO1xuXG4vKipcbiAqIFRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZSBhIHtAbGluayBTcGluZX0gZ2FtZSBvYmplY3QgaW4gUGl4aS5cbiAqIFRoZSBzdGF0aWMgbWV0aG9kIHtAbGluayBTcGluZS5mcm9tfSBzaG91bGQgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIFNwaW5lIGdhbWUgb2JqZWN0LlxuICovXG5leHBvcnQgY2xhc3MgU3BpbmUgZXh0ZW5kcyBWaWV3Q29udGFpbmVyIHtcblx0Ly8gUGl4aSBwcm9wZXJ0aWVzXG5cdHB1YmxpYyBiYXRjaGVkID0gdHJ1ZTtcblx0cHVibGljIGJ1aWxkSWQgPSAwO1xuXHRwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgcmVuZGVyUGlwZUlkID0gJ3NwaW5lJztcblx0cHVibGljIF9kaWRTcGluZVVwZGF0ZSA9IGZhbHNlO1xuXG5cdHB1YmxpYyBiZWZvcmVVcGRhdGVXb3JsZFRyYW5zZm9ybXM6IChvYmplY3Q6IFNwaW5lKSA9PiB2b2lkID0gKCkgPT4geyAvKiogKi8gfTtcblx0cHVibGljIGFmdGVyVXBkYXRlV29ybGRUcmFuc2Zvcm1zOiAob2JqZWN0OiBTcGluZSkgPT4gdm9pZCA9ICgpID0+IHsgLyoqICovIH07XG5cblx0Ly8gU3BpbmUgcHJvcGVydGllc1xuXHQvKiogVGhlIHNrZWxldG9uIGZvciB0aGlzIFNwaW5lIGdhbWUgb2JqZWN0LiAqL1xuXHRwdWJsaWMgc2tlbGV0b246IFNrZWxldG9uO1xuXHQvKiogVGhlIGFuaW1hdGlvbiBzdGF0ZSBmb3IgdGhpcyBTcGluZSBnYW1lIG9iamVjdC4gKi9cblx0cHVibGljIHN0YXRlOiBBbmltYXRpb25TdGF0ZTtcblx0cHVibGljIHNrZWxldG9uQm91bmRzPzogU2tlbGV0b25Cb3VuZHM7XG5cblx0cHJpdmF0ZSBkYXJrVGludCA9IGZhbHNlO1xuXHRwcml2YXRlIF9kZWJ1Zz86IElTcGluZURlYnVnUmVuZGVyZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cblx0cmVhZG9ubHkgX3Nsb3RzT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB7IHNsb3Q6IFNsb3QsIGNvbnRhaW5lcjogQ29udGFpbmVyIH0gfCBudWxsPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdHByaXZhdGUgY2xpcHBpbmdTbG90VG9QaXhpTWFza3M6IFJlY29yZDxzdHJpbmcsIFNsb3RzVG9DbGlwcGluZz4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5cdHByaXZhdGUgZ2V0U2xvdEZyb21SZWYgKHNsb3RSZWY6IG51bWJlciB8IHN0cmluZyB8IFNsb3QpOiBTbG90IHtcblx0XHRsZXQgc2xvdDogU2xvdCB8IG51bGw7XG5cblx0XHRpZiAodHlwZW9mIHNsb3RSZWYgPT09ICdudW1iZXInKSBzbG90ID0gdGhpcy5za2VsZXRvbi5zbG90c1tzbG90UmVmXTtcblx0XHRlbHNlIGlmICh0eXBlb2Ygc2xvdFJlZiA9PT0gJ3N0cmluZycpIHNsb3QgPSB0aGlzLnNrZWxldG9uLmZpbmRTbG90KHNsb3RSZWYpO1xuXHRcdGVsc2Ugc2xvdCA9IHNsb3RSZWY7XG5cblx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgTm8gc2xvdCBmb3VuZCB3aXRoIHRoZSBnaXZlbiBzbG90IHJlZmVyZW5jZTogJHtzbG90UmVmfWApO1xuXG5cdFx0cmV0dXJuIHNsb3Q7XG5cdH1cblxuXHRwdWJsaWMgc3BpbmVBdHRhY2htZW50c0RpcnR5ID0gdHJ1ZTtcblx0cHVibGljIHNwaW5lVGV4dHVyZXNEaXJ0eSA9IHRydWU7XG5cblx0cHJpdmF0ZSBfbGFzdEF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gPSBbXTtcblxuXHRwcml2YXRlIF9zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuXHRwcml2YXRlIGF0dGFjaG1lbnRDYWNoZURhdGE6IFJlY29yZDxzdHJpbmcsIEF0dGFjaG1lbnRDYWNoZURhdGE+W10gPSBbXTtcblxuXHRwdWJsaWMgZ2V0IGRlYnVnICgpOiBJU3BpbmVEZWJ1Z1JlbmRlcmVyIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5fZGVidWc7XG5cdH1cblxuXHQvKiogUGFzcyBhIHtAbGluayBTcGluZURlYnVnUmVuZGVyZXJ9IG9yIGNyZWF0ZSB5b3VyIG93biB7QGxpbmsgSVNwaW5lRGVidWdSZW5kZXJlcn0gdG8gcmVuZGVyIGJvbmVzLCBtZXNoZXMsIC4uLlxuXHQgKiBAZXhhbXBsZSBzcGluZUdPLmRlYnVnID0gbmV3IFNwaW5lRGVidWdSZW5kZXJlcigpO1xuXHQgKi9cblx0cHVibGljIHNldCBkZWJ1ZyAodmFsdWU6IElTcGluZURlYnVnUmVuZGVyZXIgfCB1bmRlZmluZWQpIHtcblx0XHRpZiAodGhpcy5fZGVidWcpIHtcblx0XHRcdHRoaXMuX2RlYnVnLnVucmVnaXN0ZXJTcGluZSh0aGlzKTtcblx0XHR9XG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHR2YWx1ZS5yZWdpc3RlclNwaW5lKHRoaXMpO1xuXHRcdH1cblx0XHR0aGlzLl9kZWJ1ZyA9IHZhbHVlO1xuXHR9XG5cblx0cHJpdmF0ZSBhdXRvVXBkYXRlV2FybmVkID0gZmFsc2U7XG5cdHByaXZhdGUgX2F1dG9VcGRhdGUgPSB0cnVlO1xuXG5cdHB1YmxpYyBnZXQgYXV0b1VwZGF0ZSAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2F1dG9VcGRhdGU7XG5cdH1cblx0LyoqIFdoZW4gYHRydWVgLCB0aGUgU3BpbmUgQW5pbWF0aW9uU3RhdGUgYW5kIHRoZSBTa2VsZXRvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB1c2luZyB0aGUge0BsaW5rIFRpY2tlci5zaGFyZWR9IGluc3RhbmNlLiAqL1xuXHRwdWJsaWMgc2V0IGF1dG9VcGRhdGUgKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRUaWNrZXIuc2hhcmVkLmFkZCh0aGlzLmludGVybmFsVXBkYXRlLCB0aGlzKTtcblx0XHRcdHRoaXMuYXV0b1VwZGF0ZVdhcm5lZCA9IGZhbHNlO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdFRpY2tlci5zaGFyZWQucmVtb3ZlKHRoaXMuaW50ZXJuYWxVcGRhdGUsIHRoaXMpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2F1dG9VcGRhdGUgPSB2YWx1ZTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yIChvcHRpb25zOiBTcGluZU9wdGlvbnMgfCBTa2VsZXRvbkRhdGEpIHtcblx0XHRpZiAob3B0aW9ucyBpbnN0YW5jZW9mIFNrZWxldG9uRGF0YSkge1xuXHRcdFx0b3B0aW9ucyA9IHtcblx0XHRcdFx0c2tlbGV0b25EYXRhOiBvcHRpb25zLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0Y29uc3Qgc2tlbGV0b25EYXRhID0gb3B0aW9ucyBpbnN0YW5jZW9mIFNrZWxldG9uRGF0YSA/IG9wdGlvbnMgOiBvcHRpb25zLnNrZWxldG9uRGF0YTtcblxuXHRcdHRoaXMuc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oc2tlbGV0b25EYXRhKTtcblx0XHR0aGlzLnN0YXRlID0gbmV3IEFuaW1hdGlvblN0YXRlKG5ldyBBbmltYXRpb25TdGF0ZURhdGEoc2tlbGV0b25EYXRhKSk7XG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gb3B0aW9ucz8uYXV0b1VwZGF0ZSA/PyB0cnVlO1xuXG5cdFx0Ly8gZGFyayB0aW50IGNhbiBiZSBlbmFibGVkIGJ5IG9wdGlvbnMsIG90aGVyd2lzZSBpcyBlbmFibGUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaGFzIHRpbnQgYmxhY2tcblx0XHR0aGlzLmRhcmtUaW50ID0gb3B0aW9ucz8uZGFya1RpbnQgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyB0aGlzLnNrZWxldG9uLnNsb3RzLnNvbWUoc2xvdCA9PiAhIXNsb3QuZGF0YS5kYXJrQ29sb3IpXG5cdFx0XHQ6IG9wdGlvbnM/LmRhcmtUaW50O1xuXG5cdFx0Y29uc3Qgc2xvdHMgPSB0aGlzLnNrZWxldG9uLnNsb3RzO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzbG90cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dGhpcy5hdHRhY2htZW50Q2FjaGVEYXRhW2ldID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0XHR9XG5cblx0XHR0aGlzLl91cGRhdGVTdGF0ZSgwKTtcblx0fVxuXG5cdC8qKiBJZiB7QGxpbmsgU3BpbmUuYXV0b1VwZGF0ZX0gaXMgYGZhbHNlYCwgdGhpcyBtZXRob2QgYWxsb3dzIHRvIHVwZGF0ZSB0aGUgQW5pbWF0aW9uU3RhdGUgYW5kIHRoZSBTa2VsZXRvbiB3aXRoIHRoZSBnaXZlbiBkZWx0YS4gKi9cblx0cHVibGljIHVwZGF0ZSAoZHQ6IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmF1dG9VcGRhdGUgJiYgIXRoaXMuYXV0b1VwZGF0ZVdhcm5lZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdZb3UgYXJlIGNhbGxpbmcgdXBkYXRlIG9uIGEgU3BpbmUgaW5zdGFuY2UgdGhhdCBoYXMgYXV0b1VwZGF0ZSBzZXQgdG8gdHJ1ZS4gVGhpcyBpcyBwcm9iYWJseSBub3Qgd2hhdCB5b3Ugd2FudC4nKTtcblx0XHRcdHRoaXMuYXV0b1VwZGF0ZVdhcm5lZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbnRlcm5hbFVwZGF0ZSgwLCBkdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgaW50ZXJuYWxVcGRhdGUgKF9kZWx0YUZyYW1lOiBhbnksIGRlbHRhU2Vjb25kcz86IG51bWJlcik6IHZvaWQge1xuXHRcdC8vIEJlY2F1c2UgcmVhc29ucywgcGl4aSB1c2VzIGRlbHRhRnJhbWVzIGF0IDYwZnBzLlxuXHRcdC8vIFdlIGlnbm9yZSB0aGUgZGVmYXVsdCBkZWx0YUZyYW1lcyBhbmQgdXNlIHRoZSBkZWx0YVNlY29uZHMgZnJvbSBwaXhpIHRpY2tlci5cblx0XHR0aGlzLl91cGRhdGVTdGF0ZShkZWx0YVNlY29uZHMgPz8gVGlja2VyLnNoYXJlZC5kZWx0YU1TIC8gMTAwMCk7XG5cdH1cblxuXHRnZXQgYm91bmRzICgpIHtcblx0XHRpZiAodGhpcy5fYm91bmRzRGlydHkpIHtcblx0XHRcdHRoaXMudXBkYXRlQm91bmRzKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2JvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBib25lIGdpdmVuIGluIGlucHV0IHRocm91Z2ggYSB7QGxpbmsgSVBvaW50RGF0YX0uXG5cdCAqIEBwYXJhbSBib25lOiB0aGUgYm9uZSBuYW1lIG9yIHRoZSBib25lIGluc3RhbmNlIHRvIHNldCB0aGUgcG9zaXRpb25cblx0ICogQHBhcmFtIG91dFBvczogdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgYm9uZS5cblx0ICogQHRocm93cyB7RXJyb3J9OiBpZiB0aGUgZ2l2ZW4gYm9uZSBpcyBub3QgZm91bmQgaW4gdGhlIHNrZWxldG9uLCBhbiBlcnJvciBpcyB0aHJvd25cblx0ICovXG5cdHB1YmxpYyBzZXRCb25lUG9zaXRpb24gKGJvbmU6IHN0cmluZyB8IEJvbmUsIHBvc2l0aW9uOiBQb2ludERhdGEpOiB2b2lkIHtcblx0XHRjb25zdCBib25lQXV4ID0gYm9uZTtcblxuXHRcdGlmICh0eXBlb2YgYm9uZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGJvbmUgPSB0aGlzLnNrZWxldG9uLmZpbmRCb25lKGJvbmUpIGFzIEJvbmU7XG5cdFx0fVxuXG5cdFx0aWYgKCFib25lKSB0aHJvdyBFcnJvcihgQ2FudCBzZXQgYm9uZSBwb3NpdGlvbiwgYm9uZSAke1N0cmluZyhib25lQXV4KX0gbm90IGZvdW5kYCk7XG5cdFx0dmVjdG9yQXV4LnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcblxuXHRcdGlmIChib25lLnBhcmVudCkge1xuXHRcdFx0Y29uc3QgYXV4ID0gYm9uZS5wYXJlbnQud29ybGRUb0xvY2FsKHZlY3RvckF1eCk7XG5cblx0XHRcdGJvbmUueCA9IGF1eC54O1xuXHRcdFx0Ym9uZS55ID0gLWF1eC55O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGJvbmUueCA9IHZlY3RvckF1eC54O1xuXHRcdFx0Ym9uZS55ID0gdmVjdG9yQXV4Lnk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGJvbmUgZ2l2ZW4gaW4gaW5wdXQgaW50byBhbiB7QGxpbmsgSVBvaW50RGF0YX0uXG5cdCAqIEBwYXJhbSBib25lOiB0aGUgYm9uZSBuYW1lIG9yIHRoZSBib25lIGluc3RhbmNlIHRvIGdldCB0aGUgcG9zaXRpb24gZnJvbVxuXHQgKiBAcGFyYW0gb3V0UG9zOiBhbiBvcHRpb25hbCB7QGxpbmsgSVBvaW50RGF0YX0gdG8gdXNlIHRvIHJldHVybiB0aGUgYm9uZSBwb3NpdGlvbiwgcmF0aGVybiB0aGFuIGluc3RhbnRpYXRpbmcgYSBuZXcgb2JqZWN0LlxuXHQgKiBAcmV0dXJucyB7SVBvaW50RGF0YSB8IHVuZGVmaW5lZH06IHRoZSBwb3NpdGlvbiBvZiB0aGUgYm9uZSwgb3IgdW5kZWZpbmVkIGlmIG5vIG1hdGNoaW5nIGJvbmUgaXMgZm91bmQgaW4gdGhlIHNrZWxldG9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Qm9uZVBvc2l0aW9uIChib25lOiBzdHJpbmcgfCBCb25lLCBvdXRQb3M/OiBQb2ludERhdGEpOiBQb2ludERhdGEgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGJvbmVBdXggPSBib25lO1xuXG5cdFx0aWYgKHR5cGVvZiBib25lID09PSAnc3RyaW5nJykge1xuXHRcdFx0Ym9uZSA9IHRoaXMuc2tlbGV0b24uZmluZEJvbmUoYm9uZSkgYXMgQm9uZTtcblx0XHR9XG5cblx0XHRpZiAoIWJvbmUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYENhbnQgc2V0IGJvbmUgcG9zaXRpb24hIEJvbmUgJHtTdHJpbmcoYm9uZUF1eCl9IG5vdCBmb3VuZGApO1xuXG5cdFx0XHRyZXR1cm4gb3V0UG9zO1xuXHRcdH1cblxuXHRcdGlmICghb3V0UG9zKSB7XG5cdFx0XHRvdXRQb3MgPSB7IHg6IDAsIHk6IDAgfTtcblx0XHR9XG5cblx0XHRvdXRQb3MueCA9IGJvbmUud29ybGRYO1xuXHRcdG91dFBvcy55ID0gYm9uZS53b3JsZFk7XG5cblx0XHRyZXR1cm4gb3V0UG9zO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgdXBkYXRlIHRoZSBzdGF0ZSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHRpbWUsIHRoaXMgd2lsbCBub3QgYXBwbHkgdGhlIHN0YXRlIHRvIHRoZSBza2VsZXRvblxuXHQgKiBhcyB0aGlzIGlzIGRpZmZlcmVkIHVudGlsIHRoZSBgYXBwbHlTdGF0ZWAgbWV0aG9kIGlzIGNhbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIHRpbWUgdGhlIHRpbWUgYXQgd2hpY2ggdG8gc2V0IHRoZSBzdGF0ZVxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdF91cGRhdGVTdGF0ZSAodGltZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5zdGF0ZS51cGRhdGUodGltZSk7XG5cdFx0dGhpcy5za2VsZXRvbi51cGRhdGUodGltZSk7XG5cblx0XHR0aGlzLl9zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuXG5cdFx0dGhpcy5fYm91bmRzRGlydHkgPSB0cnVlO1xuXG5cdFx0dGhpcy5vblZpZXdVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBsaWVzIHRoZSBzdGF0ZSB0byB0aGlzIHNwaW5lIGluc3RhbmNlLlxuXHQgKiAtIHVwZGF0ZXMgdGhlIHN0YXRlIHRvIHRoZSBza2VsZXRvblxuXHQgKiAtIHVwZGF0ZXMgaXRzIHdvcmxkIHRyYW5zZm9ybSAoc3BpbmUgd29ybGQgdHJhbnNmb3JtKVxuXHQgKiAtIHZhbGlkYXRlcyB0aGUgYXR0YWNobWVudHMgLSB0byBmbGFnIGlmIHRoZSBhdHRhY2htZW50cyBoYXZlIGNoYW5nZWQgdGhpcyBzdGF0ZVxuXHQgKiAtIHRyYW5zZm9ybXMgdGhlIGF0dGFjaG1lbnRzIC0gdG8gdXBkYXRlIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgYXR0YWNobWVudHMgYmFzZWQgb24gdGhlIG5ldyBwb3NpdGlvbnNcblx0ICogLSB1cGRhdGUgdGhlIHNsb3QgYXR0YWNobWVudHMgLSB0byB1cGRhdGUgdGhlIHBvc2l0aW9uLCByb3RhdGlvbiwgc2NhbGUsIGFuZCB2aXNpYmlsaXR5IG9mIHRoZSBhdHRhY2hlZCBjb250YWluZXJzXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0X2FwcGx5U3RhdGUgKCkge1xuXHRcdGlmICghdGhpcy5fc3RhdGVDaGFuZ2VkKSByZXR1cm47XG5cdFx0dGhpcy5fc3RhdGVDaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRjb25zdCB7IHNrZWxldG9uIH0gPSB0aGlzO1xuXG5cdFx0dGhpcy5zdGF0ZS5hcHBseShza2VsZXRvbik7XG5cblx0XHR0aGlzLmJlZm9yZVVwZGF0ZVdvcmxkVHJhbnNmb3Jtcyh0aGlzKTtcblx0XHRza2VsZXRvbi51cGRhdGVXb3JsZFRyYW5zZm9ybShQaHlzaWNzLnVwZGF0ZSk7XG5cdFx0dGhpcy5hZnRlclVwZGF0ZVdvcmxkVHJhbnNmb3Jtcyh0aGlzKTtcblxuXHRcdHRoaXMudmFsaWRhdGVBdHRhY2htZW50cygpO1xuXG5cdFx0dGhpcy50cmFuc2Zvcm1BdHRhY2htZW50cygpO1xuXG5cdFx0dGhpcy51cGRhdGVTbG90T2JqZWN0cygpO1xuXHR9XG5cblx0cHJpdmF0ZSB2YWxpZGF0ZUF0dGFjaG1lbnRzICgpIHtcblx0XHRjb25zdCBjdXJyZW50RHJhd09yZGVyID0gdGhpcy5za2VsZXRvbi5kcmF3T3JkZXI7XG5cblx0XHRjb25zdCBsYXN0QXR0YWNobWVudHMgPSB0aGlzLl9sYXN0QXR0YWNobWVudHM7XG5cblx0XHRsZXQgaW5kZXggPSAwO1xuXG5cdFx0bGV0IHNwaW5lQXR0YWNobWVudHNEaXJ0eSA9IGZhbHNlO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50RHJhd09yZGVyLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gY3VycmVudERyYXdPcmRlcltpXTtcblx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblxuXHRcdFx0aWYgKGF0dGFjaG1lbnQpIHtcblx0XHRcdFx0aWYgKGF0dGFjaG1lbnQgIT09IGxhc3RBdHRhY2htZW50c1tpbmRleF0pIHtcblx0XHRcdFx0XHRzcGluZUF0dGFjaG1lbnRzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHRcdGxhc3RBdHRhY2htZW50c1tpbmRleF0gPSBhdHRhY2htZW50O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5kZXggIT09IGxhc3RBdHRhY2htZW50cy5sZW5ndGgpIHtcblx0XHRcdHNwaW5lQXR0YWNobWVudHNEaXJ0eSA9IHRydWU7XG5cdFx0XHRsYXN0QXR0YWNobWVudHMubGVuZ3RoID0gaW5kZXg7XG5cdFx0fVxuXG5cdFx0dGhpcy5zcGluZUF0dGFjaG1lbnRzRGlydHkgPSBzcGluZUF0dGFjaG1lbnRzRGlydHk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZUFuZFNldFBpeGlNYXNrIChzbG90OiBTbG90LCBsYXN0OiBib29sZWFuKSB7XG5cdFx0Ly8gYXNzaWduL2NyZWF0ZSB0aGUgY3VycmVudENsaXBwaW5nU2xvdFxuXHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmF0dGFjaG1lbnQ7XG5cdFx0aWYgKGF0dGFjaG1lbnQgJiYgYXR0YWNobWVudCBpbnN0YW5jZW9mIENsaXBwaW5nQXR0YWNobWVudCkge1xuXHRcdFx0Y29uc3QgY2xpcCA9ICh0aGlzLmNsaXBwaW5nU2xvdFRvUGl4aU1hc2tzW3Nsb3QuZGF0YS5uYW1lXSB8fD0geyBzbG90LCB2ZXJ0aWNlczogbmV3IEFycmF5PG51bWJlcj4oKSB9KTtcblx0XHRcdGNsaXAubWFza0NvbXB1dGVkID0gZmFsc2U7XG5cdFx0XHR0aGlzLmN1cnJlbnRDbGlwcGluZ1Nsb3QgPSB0aGlzLmNsaXBwaW5nU2xvdFRvUGl4aU1hc2tzW3Nsb3QuZGF0YS5uYW1lXTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBhc3NpZ24gdGhlIGN1cnJlbnRDbGlwcGluZ1Nsb3QgbWFzayB0byB0aGUgc2xvdCBvYmplY3Rcblx0XHRsZXQgY3VycmVudENsaXBwaW5nU2xvdCA9IHRoaXMuY3VycmVudENsaXBwaW5nU2xvdDtcblx0XHRsZXQgc2xvdE9iamVjdCA9IHRoaXMuX3Nsb3RzT2JqZWN0W3Nsb3QuZGF0YS5uYW1lXTtcblx0XHRpZiAoY3VycmVudENsaXBwaW5nU2xvdCAmJiBzbG90T2JqZWN0KSB7XG5cdFx0XHRsZXQgc2xvdENsaXBwaW5nID0gY3VycmVudENsaXBwaW5nU2xvdC5zbG90O1xuXHRcdFx0bGV0IGNsaXBwaW5nQXR0YWNobWVudCA9IHNsb3RDbGlwcGluZy5hdHRhY2htZW50IGFzIENsaXBwaW5nQXR0YWNobWVudDtcblxuXHRcdFx0Ly8gY3JlYXRlIHRoZSBwaXhpIG1hc2ssIG9ubHkgdGhlIGZpcnN0IHRpbWUgYW5kIGlmIHRoZSBjbGlwcGVkIHNsb3QgaXMgdGhlIGZpcnN0IG9uZSBjbGlwcGVkIGJ5IHRoaXMgY3VycmVudENsaXBwaW5nU2xvdFxuXHRcdFx0bGV0IG1hc2sgPSBjdXJyZW50Q2xpcHBpbmdTbG90Lm1hc2sgYXMgR3JhcGhpY3M7XG5cdFx0XHRpZiAoIW1hc2spIHtcblx0XHRcdFx0bWFzayA9IG1hc2tQb29sLm9idGFpbigpO1xuXHRcdFx0XHRjdXJyZW50Q2xpcHBpbmdTbG90Lm1hc2sgPSBtYXNrO1xuXHRcdFx0XHR0aGlzLmFkZENoaWxkKG1hc2spO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb21wdXRlIHRoZSBwaXhpIG1hc2sgcG9seWdvbiwgaWYgdGhlIGNsaXBwZWQgc2xvdCBpcyB0aGUgZmlyc3Qgb25lIGNsaXBwZWQgYnkgdGhpcyBjdXJyZW50Q2xpcHBpbmdTbG90XG5cdFx0XHRpZiAoIWN1cnJlbnRDbGlwcGluZ1Nsb3QubWFza0NvbXB1dGVkKSB7XG5cdFx0XHRcdGN1cnJlbnRDbGlwcGluZ1Nsb3QubWFza0NvbXB1dGVkID0gdHJ1ZTtcblx0XHRcdFx0Y29uc3Qgd29ybGRWZXJ0aWNlc0xlbmd0aCA9IGNsaXBwaW5nQXR0YWNobWVudC53b3JsZFZlcnRpY2VzTGVuZ3RoO1xuXHRcdFx0XHRjb25zdCB2ZXJ0aWNlcyA9IGN1cnJlbnRDbGlwcGluZ1Nsb3QudmVydGljZXM7XG5cdFx0XHRcdGNsaXBwaW5nQXR0YWNobWVudC5jb21wdXRlV29ybGRWZXJ0aWNlcyhzbG90Q2xpcHBpbmcsIDAsIHdvcmxkVmVydGljZXNMZW5ndGgsIHZlcnRpY2VzLCAwLCAyKTtcblx0XHRcdFx0bWFzay5jbGVhcigpLnBvbHkodmVydGljZXMpLnN0cm9rZSh7IHdpZHRoOiAwIH0pLmZpbGwoeyBhbHBoYTogLjI1IH0pO1xuXHRcdFx0fVxuXHRcdFx0c2xvdE9iamVjdC5jb250YWluZXIubWFzayA9IG1hc2s7XG5cdFx0fSBlbHNlIGlmIChzbG90T2JqZWN0Py5jb250YWluZXIubWFzaykge1xuXHRcdFx0Ly8gcmVtb3ZlIHRoZSBtYXNrLCBpZiBzbG90IG9iamVjdCBoYXMgYSBtYXNrLCBidXQgY3VycmVudENsaXBwaW5nU2xvdCBpcyB1bmRlZmluZWRcblx0XHRcdHNsb3RPYmplY3QuY29udGFpbmVyLm1hc2sgPSBudWxsO1xuXHRcdH1cblxuXHRcdC8vIGlmIGN1cnJlbnQgc2xvdCBpcyB0aGUgZW5kaW5nIG9uZSBvZiB0aGUgY3VycmVudENsaXBwaW5nU2xvdCBtYXNrLCBzZXQgY3VycmVudENsaXBwaW5nU2xvdCB0byB1bmRlZmluZWRcblx0XHRpZiAoY3VycmVudENsaXBwaW5nU2xvdCAmJiAoY3VycmVudENsaXBwaW5nU2xvdC5zbG90LmF0dGFjaG1lbnQgYXMgQ2xpcHBpbmdBdHRhY2htZW50KS5lbmRTbG90ID09IHNsb3QuZGF0YSkge1xuXHRcdFx0dGhpcy5jdXJyZW50Q2xpcHBpbmdTbG90ID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIGNsZWFuIHVwIHVudXNlZCBtYXNrc1xuXHRcdGlmIChsYXN0KSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmNsaXBwaW5nU2xvdFRvUGl4aU1hc2tzKSB7XG5cdFx0XHRcdGNvbnN0IGNsaXBwaW5nU2xvdFRvUGl4aU1hc2sgPSB0aGlzLmNsaXBwaW5nU2xvdFRvUGl4aU1hc2tzW2tleV07XG5cdFx0XHRcdGlmICgoIShjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrLnNsb3QuYXR0YWNobWVudCBpbnN0YW5jZW9mIENsaXBwaW5nQXR0YWNobWVudCkgfHwgIWNsaXBwaW5nU2xvdFRvUGl4aU1hc2subWFza0NvbXB1dGVkKSAmJiBjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrLm1hc2spIHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZUNoaWxkKGNsaXBwaW5nU2xvdFRvUGl4aU1hc2subWFzayk7XG5cdFx0XHRcdFx0bWFza1Bvb2wuZnJlZShjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrLm1hc2spO1xuXHRcdFx0XHRcdGNsaXBwaW5nU2xvdFRvUGl4aU1hc2subWFzayA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY3VycmVudENsaXBwaW5nU2xvdDogU2xvdHNUb0NsaXBwaW5nIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIHRyYW5zZm9ybUF0dGFjaG1lbnRzICgpIHtcblx0XHRjb25zdCBjdXJyZW50RHJhd09yZGVyID0gdGhpcy5za2VsZXRvbi5kcmF3T3JkZXI7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnREcmF3T3JkZXIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNsb3QgPSBjdXJyZW50RHJhd09yZGVyW2ldO1xuXG5cdFx0XHR0aGlzLnVwZGF0ZUFuZFNldFBpeGlNYXNrKHNsb3QsIGkgPT09IGN1cnJlbnREcmF3T3JkZXIubGVuZ3RoIC0gMSk7XG5cblx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblxuXHRcdFx0aWYgKGF0dGFjaG1lbnQpIHtcblx0XHRcdFx0aWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCB8fCBhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGNhY2hlRGF0YSA9IHRoaXMuX2dldENhY2hlZERhdGEoc2xvdCwgYXR0YWNobWVudCk7XG5cblx0XHRcdFx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcblx0XHRcdFx0XHRcdGF0dGFjaG1lbnQuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgY2FjaGVEYXRhLnZlcnRpY2VzLCAwLCAyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRhdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKFxuXHRcdFx0XHRcdFx0XHRzbG90LFxuXHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRhdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGNhY2hlRGF0YS52ZXJ0aWNlcyxcblx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0Mixcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZmFzdENvcHkoKGF0dGFjaG1lbnQudXZzIGFzIEZsb2F0MzJBcnJheSkuYnVmZmVyLCBjYWNoZURhdGEudXZzLmJ1ZmZlcik7XG5cblx0XHRcdFx0XHRjb25zdCBza2VsZXRvbiA9IHNsb3QuYm9uZS5za2VsZXRvbjtcblx0XHRcdFx0XHRjb25zdCBza2VsZXRvbkNvbG9yID0gc2tlbGV0b24uY29sb3I7XG5cdFx0XHRcdFx0Y29uc3Qgc2xvdENvbG9yID0gc2xvdC5jb2xvcjtcblxuXHRcdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnRDb2xvciA9IGF0dGFjaG1lbnQuY29sb3I7XG5cblx0XHRcdFx0XHRjYWNoZURhdGEuY29sb3Iuc2V0KFxuXHRcdFx0XHRcdFx0c2tlbGV0b25Db2xvci5yICogc2xvdENvbG9yLnIgKiBhdHRhY2htZW50Q29sb3Iucixcblx0XHRcdFx0XHRcdHNrZWxldG9uQ29sb3IuZyAqIHNsb3RDb2xvci5nICogYXR0YWNobWVudENvbG9yLmcsXG5cdFx0XHRcdFx0XHRza2VsZXRvbkNvbG9yLmIgKiBzbG90Q29sb3IuYiAqIGF0dGFjaG1lbnRDb2xvci5iLFxuXHRcdFx0XHRcdFx0c2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiBhdHRhY2htZW50Q29sb3IuYSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKHNsb3QuZGFya0NvbG9yKSB7XG5cdFx0XHRcdFx0XHRjYWNoZURhdGEuZGFya0NvbG9yLnNldEZyb21Db2xvcihzbG90LmRhcmtDb2xvcik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y2FjaGVEYXRhLnNraXBSZW5kZXIgPSBjYWNoZURhdGEuY2xpcHBlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IGF0dGFjaG1lbnQucmVnaW9uPy50ZXh0dXJlLnRleHR1cmUgfHwgVGV4dHVyZS5FTVBUWTtcblxuXHRcdFx0XHRcdGlmIChjYWNoZURhdGEudGV4dHVyZSAhPT0gdGV4dHVyZSkge1xuXHRcdFx0XHRcdFx0Y2FjaGVEYXRhLnRleHR1cmUgPSB0ZXh0dXJlO1xuXHRcdFx0XHRcdFx0dGhpcy5zcGluZVRleHR1cmVzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChjbGlwcGVyLmlzQ2xpcHBpbmcoKSkge1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVDbGlwcGluZ0RhdGEoY2FjaGVEYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIENsaXBwaW5nQXR0YWNobWVudCkge1xuXHRcdFx0XHRcdGNsaXBwZXIuY2xpcFN0YXJ0KHNsb3QsIGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjbGlwcGVyLmNsaXBFbmRXaXRoU2xvdChzbG90KTtcblx0XHR9XG5cdFx0Y2xpcHBlci5jbGlwRW5kKCk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZUNsaXBwaW5nRGF0YSAoY2FjaGVEYXRhOiBBdHRhY2htZW50Q2FjaGVEYXRhKSB7XG5cdFx0Y2FjaGVEYXRhLmNsaXBwZWQgPSB0cnVlO1xuXG5cdFx0Y2xpcHBlci5jbGlwVHJpYW5nbGVzVW5wYWNrZWQoXG5cdFx0XHRjYWNoZURhdGEudmVydGljZXMsXG5cdFx0XHRjYWNoZURhdGEuaW5kaWNlcyxcblx0XHRcdGNhY2hlRGF0YS5pbmRpY2VzLmxlbmd0aCxcblx0XHRcdGNhY2hlRGF0YS51dnMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHsgY2xpcHBlZFZlcnRpY2VzLCBjbGlwcGVkVVZzLCBjbGlwcGVkVHJpYW5nbGVzIH0gPSBjbGlwcGVyO1xuXG5cdFx0Y29uc3QgdmVydGljZXNDb3VudCA9IGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGggLyAyO1xuXHRcdGNvbnN0IGluZGljZXNDb3VudCA9IGNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoO1xuXG5cdFx0aWYgKCFjYWNoZURhdGEuY2xpcHBlZERhdGEpIHtcblx0XHRcdGNhY2hlRGF0YS5jbGlwcGVkRGF0YSA9IHtcblx0XHRcdFx0dmVydGljZXM6IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNDb3VudCAqIDIpLFxuXHRcdFx0XHR1dnM6IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNDb3VudCAqIDIpLFxuXHRcdFx0XHR2ZXJ0ZXhDb3VudDogdmVydGljZXNDb3VudCxcblx0XHRcdFx0aW5kaWNlczogbmV3IFVpbnQxNkFycmF5KGluZGljZXNDb3VudCksXG5cdFx0XHRcdGluZGljZXNDb3VudCxcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuc3BpbmVBdHRhY2htZW50c0RpcnR5ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBjbGlwcGVkRGF0YSA9IGNhY2hlRGF0YS5jbGlwcGVkRGF0YTtcblxuXHRcdGNvbnN0IHNpemVDaGFuZ2UgPSBjbGlwcGVkRGF0YS52ZXJ0ZXhDb3VudCAhPT0gdmVydGljZXNDb3VudCB8fCBpbmRpY2VzQ291bnQgIT09IGNsaXBwZWREYXRhLmluZGljZXNDb3VudDtcblxuXHRcdGNhY2hlRGF0YS5za2lwUmVuZGVyID0gdmVydGljZXNDb3VudCA9PT0gMDtcblxuXHRcdGlmIChzaXplQ2hhbmdlKSB7XG5cdFx0XHR0aGlzLnNwaW5lQXR0YWNobWVudHNEaXJ0eSA9IHRydWU7XG5cblx0XHRcdGlmIChjbGlwcGVkRGF0YS52ZXJ0ZXhDb3VudCA8IHZlcnRpY2VzQ291bnQpIHtcblx0XHRcdFx0Ly8gYnVmZmVyIHJldXNlIVxuXHRcdFx0XHRjbGlwcGVkRGF0YS52ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNDb3VudCAqIDIpO1xuXHRcdFx0XHRjbGlwcGVkRGF0YS51dnMgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQ291bnQgKiAyKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNsaXBwZWREYXRhLmluZGljZXMubGVuZ3RoIDwgaW5kaWNlc0NvdW50KSB7XG5cdFx0XHRcdGNsaXBwZWREYXRhLmluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoaW5kaWNlc0NvdW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCB7IHZlcnRpY2VzLCB1dnMsIGluZGljZXMgfSA9IGNsaXBwZWREYXRhO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlc0NvdW50OyBpKyspIHtcblx0XHRcdHZlcnRpY2VzW2kgKiAyXSA9IGNsaXBwZWRWZXJ0aWNlc1tpICogMl07XG5cdFx0XHR2ZXJ0aWNlc1soaSAqIDIpICsgMV0gPSBjbGlwcGVkVmVydGljZXNbKGkgKiAyKSArIDFdO1xuXG5cdFx0XHR1dnNbaSAqIDJdID0gY2xpcHBlZFVWc1soaSAqIDIpXTtcblx0XHRcdHV2c1soaSAqIDIpICsgMV0gPSBjbGlwcGVkVVZzWyhpICogMikgKyAxXTtcblx0XHR9XG5cblx0XHRjbGlwcGVkRGF0YS52ZXJ0ZXhDb3VudCA9IHZlcnRpY2VzQ291bnQ7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgaSsrKSB7XG5cdFx0XHRpZiAoaW5kaWNlc1tpXSAhPT0gY2xpcHBlZFRyaWFuZ2xlc1tpXSkge1xuXHRcdFx0XHR0aGlzLnNwaW5lQXR0YWNobWVudHNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdGluZGljZXNbaV0gPSBjbGlwcGVkVHJpYW5nbGVzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNsaXBwZWREYXRhLmluZGljZXNDb3VudCA9IGluZGljZXNDb3VudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBlbnN1cmUgdGhhdCBhdHRhY2hlZCBjb250YWluZXJzIG1hcCBjb3JyZWN0bHkgdG8gdGhlaXIgc2xvdHNcblx0ICogYWxvbmcgd2l0aCB0aGVpciBwb3NpdGlvbiwgcm90YXRpb24sIHNjYWxlLCBhbmQgdmlzaWJpbGl0eS5cblx0ICovXG5cdHByaXZhdGUgdXBkYXRlU2xvdE9iamVjdHMgKCkge1xuXHRcdGZvciAoY29uc3QgaSBpbiB0aGlzLl9zbG90c09iamVjdCkge1xuXHRcdFx0Y29uc3Qgc2xvdEF0dGFjaG1lbnQgPSB0aGlzLl9zbG90c09iamVjdFtpXTtcblxuXHRcdFx0aWYgKCFzbG90QXR0YWNobWVudCkgY29udGludWU7XG5cblx0XHRcdHRoaXMudXBkYXRlU2xvdE9iamVjdChzbG90QXR0YWNobWVudCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVTbG90T2JqZWN0IChzbG90QXR0YWNobWVudDogeyBzbG90OiBTbG90LCBjb250YWluZXI6IENvbnRhaW5lciB9KSB7XG5cdFx0Y29uc3QgeyBzbG90LCBjb250YWluZXIgfSA9IHNsb3RBdHRhY2htZW50O1xuXG5cdFx0Y29udGFpbmVyLnZpc2libGUgPSB0aGlzLnNrZWxldG9uLmRyYXdPcmRlci5pbmNsdWRlcyhzbG90KTtcblxuXHRcdGlmIChjb250YWluZXIudmlzaWJsZSkge1xuXHRcdFx0Y29uc3QgYm9uZSA9IHNsb3QuYm9uZTtcblxuXHRcdFx0Y29udGFpbmVyLnBvc2l0aW9uLnNldChib25lLndvcmxkWCwgYm9uZS53b3JsZFkpO1xuXG5cdFx0XHRjb250YWluZXIuc2NhbGUueCA9IGJvbmUuZ2V0V29ybGRTY2FsZVgoKTtcblx0XHRcdGNvbnRhaW5lci5zY2FsZS55ID0gYm9uZS5nZXRXb3JsZFNjYWxlWSgpO1xuXG5cdFx0XHRjb250YWluZXIucm90YXRpb24gPSBib25lLmdldFdvcmxkUm90YXRpb25YKCkgKiBERUdfVE9fUkFEO1xuXG5cdFx0XHRjb250YWluZXIuYWxwaGEgPSB0aGlzLnNrZWxldG9uLmNvbG9yLmEgKiBzbG90LmNvbG9yLmE7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEBpbnRlcm5hbCAqL1xuXHRfZ2V0Q2FjaGVkRGF0YSAoc2xvdDogU2xvdCwgYXR0YWNobWVudDogUmVnaW9uQXR0YWNobWVudCB8IE1lc2hBdHRhY2htZW50KTogQXR0YWNobWVudENhY2hlRGF0YSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0YWNobWVudENhY2hlRGF0YVtzbG90LmRhdGEuaW5kZXhdW2F0dGFjaG1lbnQubmFtZV0gfHwgdGhpcy5pbml0Q2FjaGVkRGF0YShzbG90LCBhdHRhY2htZW50KTtcblx0fVxuXG5cdHByaXZhdGUgaW5pdENhY2hlZERhdGEgKHNsb3Q6IFNsb3QsIGF0dGFjaG1lbnQ6IFJlZ2lvbkF0dGFjaG1lbnQgfCBNZXNoQXR0YWNobWVudCk6IEF0dGFjaG1lbnRDYWNoZURhdGEge1xuXHRcdGxldCB2ZXJ0aWNlczogRmxvYXQzMkFycmF5O1xuXG5cdFx0aWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50KSB7XG5cdFx0XHR2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoOCk7XG5cblx0XHRcdHRoaXMuYXR0YWNobWVudENhY2hlRGF0YVtzbG90LmRhdGEuaW5kZXhdW2F0dGFjaG1lbnQubmFtZV0gPSB7XG5cdFx0XHRcdGlkOiBgJHtzbG90LmRhdGEuaW5kZXh9LSR7YXR0YWNobWVudC5uYW1lfWAsXG5cdFx0XHRcdHZlcnRpY2VzLFxuXHRcdFx0XHRjbGlwcGVkOiBmYWxzZSxcblx0XHRcdFx0aW5kaWNlczogWzAsIDEsIDIsIDAsIDIsIDNdLFxuXHRcdFx0XHR1dnM6IG5ldyBGbG9hdDMyQXJyYXkoYXR0YWNobWVudC51dnMubGVuZ3RoKSxcblx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigxLCAxLCAxLCAxKSxcblx0XHRcdFx0ZGFya0NvbG9yOiBuZXcgQ29sb3IoMCwgMCwgMCwgMCksXG5cdFx0XHRcdGRhcmtUaW50OiB0aGlzLmRhcmtUaW50LFxuXHRcdFx0XHRza2lwUmVuZGVyOiBmYWxzZSxcblx0XHRcdFx0dGV4dHVyZTogYXR0YWNobWVudC5yZWdpb24/LnRleHR1cmUudGV4dHVyZSxcblx0XHRcdH07XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCk7XG5cblx0XHRcdHRoaXMuYXR0YWNobWVudENhY2hlRGF0YVtzbG90LmRhdGEuaW5kZXhdW2F0dGFjaG1lbnQubmFtZV0gPSB7XG5cdFx0XHRcdGlkOiBgJHtzbG90LmRhdGEuaW5kZXh9LSR7YXR0YWNobWVudC5uYW1lfWAsXG5cdFx0XHRcdHZlcnRpY2VzLFxuXHRcdFx0XHRjbGlwcGVkOiBmYWxzZSxcblx0XHRcdFx0aW5kaWNlczogYXR0YWNobWVudC50cmlhbmdsZXMsXG5cdFx0XHRcdHV2czogbmV3IEZsb2F0MzJBcnJheShhdHRhY2htZW50LnV2cy5sZW5ndGgpLFxuXHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKDEsIDEsIDEsIDEpLFxuXHRcdFx0XHRkYXJrQ29sb3I6IG5ldyBDb2xvcigwLCAwLCAwLCAwKSxcblx0XHRcdFx0ZGFya1RpbnQ6IHRoaXMuZGFya1RpbnQsXG5cdFx0XHRcdHNraXBSZW5kZXI6IGZhbHNlLFxuXHRcdFx0XHR0ZXh0dXJlOiBhdHRhY2htZW50LnJlZ2lvbj8udGV4dHVyZS50ZXh0dXJlLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hdHRhY2htZW50Q2FjaGVEYXRhW3Nsb3QuZGF0YS5pbmRleF1bYXR0YWNobWVudC5uYW1lXTtcblx0fVxuXG5cdHByb3RlY3RlZCBvblZpZXdVcGRhdGUgKCkge1xuXHRcdC8vIGluY3JlbWVudCBmcm9tIHRoZSAxMnRoIGJpdCFcblx0XHR0aGlzLl9kaWRDaGFuZ2VJZCArPSAxIDw8IDEyO1xuXG5cdFx0dGhpcy5fYm91bmRzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKHRoaXMuZGlkVmlld1VwZGF0ZSkgcmV0dXJuO1xuXHRcdHRoaXMuZGlkVmlld1VwZGF0ZSA9IHRydWU7XG5cblx0XHRjb25zdCByZW5kZXJHcm91cCA9IHRoaXMucmVuZGVyR3JvdXAgfHwgdGhpcy5wYXJlbnRSZW5kZXJHcm91cDtcblxuXHRcdGlmIChyZW5kZXJHcm91cCkge1xuXHRcdFx0cmVuZGVyR3JvdXAub25DaGlsZFZpZXdVcGRhdGUodGhpcyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5kZWJ1Zz8ucmVuZGVyRGVidWcodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQXR0YWNoZXMgYSBQaXhpSlMgY29udGFpbmVyIHRvIGEgc3BlY2lmaWVkIHNsb3QuIFRoaXMgd2lsbCBtYXAgdGhlIHdvcmxkIHRyYW5zZm9ybSBvZiB0aGUgc2xvdHMgYm9uZVxuXHQgKiB0byB0aGUgYXR0YWNoZWQgY29udGFpbmVyLiBBIGNvbnRhaW5lciBjYW4gb25seSBiZSBhdHRhY2hlZCB0byBvbmUgc2xvdCBhdCBhIHRpbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250YWluZXIgLSBUaGUgY29udGFpbmVyIHRvIGF0dGFjaCB0byB0aGUgc2xvdFxuXHQgKiBAcGFyYW0gc2xvdFJlZiAtIFRoZSBzbG90IGlkIG9yICBzbG90IHRvIGF0dGFjaCB0b1xuXHQgKi9cblx0cHVibGljIGFkZFNsb3RPYmplY3QgKHNsb3Q6IG51bWJlciB8IHN0cmluZyB8IFNsb3QsIGNvbnRhaW5lcjogQ29udGFpbmVyKSB7XG5cdFx0c2xvdCA9IHRoaXMuZ2V0U2xvdEZyb21SZWYoc2xvdCk7XG5cblx0XHQvLyBuZWVkIHRvIGNoZWNrIGluIG9uIHRoZSBjb250YWluZXIgdG9vLi4uXG5cdFx0Zm9yIChjb25zdCBpIGluIHRoaXMuX3Nsb3RzT2JqZWN0KSB7XG5cdFx0XHRpZiAodGhpcy5fc2xvdHNPYmplY3RbaV0/LmNvbnRhaW5lciA9PT0gY29udGFpbmVyKSB7XG5cdFx0XHRcdHRoaXMucmVtb3ZlU2xvdE9iamVjdCh0aGlzLl9zbG90c09iamVjdFtpXS5zbG90KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnJlbW92ZVNsb3RPYmplY3Qoc2xvdCk7XG5cblx0XHRjb250YWluZXIuaW5jbHVkZUluQnVpbGQgPSBmYWxzZTtcblxuXHRcdC8vIFRPRE8gb25seSBhZGQgb25jZT8/XG5cdFx0dGhpcy5hZGRDaGlsZChjb250YWluZXIpO1xuXG5cdFx0Y29uc3Qgc2xvdE9iamVjdCA9IHsgY29udGFpbmVyLCBzbG90IH07XG5cdFx0dGhpcy5fc2xvdHNPYmplY3Rbc2xvdC5kYXRhLm5hbWVdID0gc2xvdE9iamVjdDtcblxuXHRcdHRoaXMudXBkYXRlU2xvdE9iamVjdChzbG90T2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgUGl4aUpTIGNvbnRhaW5lciBmcm9tIHRoZSBzbG90IGl0IGlzIGF0dGFjaGVkIHRvLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciB0byBkZXRhY2ggZnJvbSB0aGUgc2xvdFxuXHQgKiBAcGFyYW0gc2xvdE9yQ29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciwgc2xvdCBpZCBvciBzbG90IHRvIGRldGFjaCBmcm9tXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlU2xvdE9iamVjdCAoc2xvdE9yQ29udGFpbmVyOiBudW1iZXIgfCBzdHJpbmcgfCBTbG90IHwgQ29udGFpbmVyKSB7XG5cdFx0bGV0IGNvbnRhaW5lclRvUmVtb3ZlOiBDb250YWluZXIgfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAoc2xvdE9yQ29udGFpbmVyIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gdGhpcy5fc2xvdHNPYmplY3QpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3Nsb3RzT2JqZWN0W2ldPy5jb250YWluZXIgPT09IHNsb3RPckNvbnRhaW5lcikge1xuXHRcdFx0XHRcdHRoaXMuX3Nsb3RzT2JqZWN0W2ldID0gbnVsbDtcblxuXHRcdFx0XHRcdGNvbnRhaW5lclRvUmVtb3ZlID0gc2xvdE9yQ29udGFpbmVyO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IHRoaXMuZ2V0U2xvdEZyb21SZWYoc2xvdE9yQ29udGFpbmVyKTtcblxuXHRcdFx0Y29udGFpbmVyVG9SZW1vdmUgPSB0aGlzLl9zbG90c09iamVjdFtzbG90LmRhdGEubmFtZV0/LmNvbnRhaW5lcjtcblx0XHRcdHRoaXMuX3Nsb3RzT2JqZWN0W3Nsb3QuZGF0YS5uYW1lXSA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRhaW5lclRvUmVtb3ZlKSB7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKGNvbnRhaW5lclRvUmVtb3ZlKTtcblxuXHRcdFx0Y29udGFpbmVyVG9SZW1vdmUuaW5jbHVkZUluQnVpbGQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY29udGFpbmVyIGF0dGFjaGVkIHRvIGEgc2xvdCwgb3IgdW5kZWZpbmVkIGlmIG5vIGNvbnRhaW5lciBpcyBhdHRhY2hlZC5cblx0ICpcblx0ICogQHBhcmFtIHNsb3RSZWYgLSBUaGUgc2xvdCBpZCBvciBzbG90IHRvIGdldCB0aGUgYXR0YWNobWVudCBmcm9tXG5cdCAqIEByZXR1cm5zIC0gVGhlIGNvbnRhaW5lciBhdHRhY2hlZCB0byB0aGUgc2xvdFxuXHQgKi9cblx0cHVibGljIGdldFNsb3RPYmplY3QgKHNsb3Q6IG51bWJlciB8IHN0cmluZyB8IFNsb3QpIHtcblx0XHRzbG90ID0gdGhpcy5nZXRTbG90RnJvbVJlZihzbG90KTtcblxuXHRcdHJldHVybiB0aGlzLl9zbG90c09iamVjdFtzbG90LmRhdGEubmFtZV0/LmNvbnRhaW5lcjtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlQm91bmRzICgpIHtcblx0XHR0aGlzLl9ib3VuZHNEaXJ0eSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5za2VsZXRvbkJvdW5kcyB8fD0gbmV3IFNrZWxldG9uQm91bmRzKCk7XG5cblx0XHRjb25zdCBza2VsZXRvbkJvdW5kcyA9IHRoaXMuc2tlbGV0b25Cb3VuZHM7XG5cblx0XHRza2VsZXRvbkJvdW5kcy51cGRhdGUodGhpcy5za2VsZXRvbiwgdHJ1ZSk7XG5cblx0XHRpZiAoc2tlbGV0b25Cb3VuZHMubWluWCA9PT0gSW5maW5pdHkpIHtcblx0XHRcdHRoaXMuX2FwcGx5U3RhdGUoKTtcblxuXHRcdFx0Y29uc3QgZHJhd09yZGVyID0gdGhpcy5za2VsZXRvbi5kcmF3T3JkZXI7XG5cdFx0XHRjb25zdCBib3VuZHMgPSB0aGlzLl9ib3VuZHM7XG5cblx0XHRcdGJvdW5kcy5jbGVhcigpO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRyYXdPcmRlci5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblxuXHRcdFx0XHRpZiAoYXR0YWNobWVudCAmJiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQgfHwgYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSkge1xuXHRcdFx0XHRcdGNvbnN0IGNhY2hlRGF0YSA9IHRoaXMuX2dldENhY2hlZERhdGEoc2xvdCwgYXR0YWNobWVudCk7XG5cblx0XHRcdFx0XHRib3VuZHMuYWRkVmVydGV4RGF0YShjYWNoZURhdGEudmVydGljZXMsIDAsIGNhY2hlRGF0YS52ZXJ0aWNlcy5sZW5ndGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5fYm91bmRzLm1pblggPSBza2VsZXRvbkJvdW5kcy5taW5YO1xuXHRcdFx0dGhpcy5fYm91bmRzLm1pblkgPSBza2VsZXRvbkJvdW5kcy5taW5ZO1xuXHRcdFx0dGhpcy5fYm91bmRzLm1heFggPSBza2VsZXRvbkJvdW5kcy5tYXhYO1xuXHRcdFx0dGhpcy5fYm91bmRzLm1heFkgPSBza2VsZXRvbkJvdW5kcy5tYXhZO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBAaW50ZXJuYWwgKi9cblx0YWRkQm91bmRzIChib3VuZHM6IEJvdW5kcykge1xuXHRcdGJvdW5kcy5hZGRCb3VuZHModGhpcy5ib3VuZHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoaXMgc3ByaXRlIHJlbmRlcmFibGUgYW5kIG9wdGlvbmFsbHkgaXRzIHRleHR1cmUuXG5cdCAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBwYXJhbWV0ZXIuIEEgYm9vbGVhbiB3aWxsIGFjdCBhcyBpZiBhbGwgb3B0aW9uc1xuXHQgKiAgaGF2ZSBiZWVuIHNldCB0byB0aGF0IHZhbHVlXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudGV4dHVyZT1mYWxzZV0gLSBTaG91bGQgaXQgZGVzdHJveSB0aGUgY3VycmVudCB0ZXh0dXJlIG9mIHRoZSByZW5kZXJhYmxlIGFzIHdlbGxcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50ZXh0dXJlU291cmNlPWZhbHNlXSAtIFNob3VsZCBpdCBkZXN0cm95IHRoZSB0ZXh0dXJlU291cmNlIG9mIHRoZSByZW5kZXJhYmxlIGFzIHdlbGxcblx0ICovXG5cdHB1YmxpYyBvdmVycmlkZSBkZXN0cm95IChvcHRpb25zOiBEZXN0cm95T3B0aW9ucyA9IGZhbHNlKSB7XG5cdFx0c3VwZXIuZGVzdHJveShvcHRpb25zKTtcblxuXHRcdFRpY2tlci5zaGFyZWQucmVtb3ZlKHRoaXMuaW50ZXJuYWxVcGRhdGUsIHRoaXMpO1xuXHRcdHRoaXMuc3RhdGUuY2xlYXJMaXN0ZW5lcnMoKTtcblx0XHR0aGlzLmRlYnVnID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuc2tlbGV0b24gPSBudWxsIGFzIGFueTtcblx0XHR0aGlzLnN0YXRlID0gbnVsbCBhcyBhbnk7XG5cdFx0KHRoaXMuX3Nsb3RzT2JqZWN0IGFzIGFueSkgPSBudWxsO1xuXHRcdHRoaXMuX2xhc3RBdHRhY2htZW50cy5sZW5ndGggPSAwO1xuXHRcdHRoaXMuYXR0YWNobWVudENhY2hlRGF0YSA9IG51bGwgYXMgYW55O1xuXHR9XG5cblx0LyoqIENvbnZlcnRzIGEgcG9pbnQgZnJvbSB0aGUgc2tlbGV0b24gY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdGhlIFBpeGkgd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW0uICovXG5cdHB1YmxpYyBza2VsZXRvblRvUGl4aVdvcmxkQ29vcmRpbmF0ZXMgKHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcblx0XHR0aGlzLndvcmxkVHJhbnNmb3JtLmFwcGx5KHBvaW50LCBwb2ludCk7XG5cdH1cblxuXHQvKiogQ29udmVydHMgYSBwb2ludCBmcm9tIHRoZSBQaXhpIHdvcmxkIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBza2VsZXRvbiBjb29yZGluYXRlIHN5c3RlbS4gKi9cblx0cHVibGljIHBpeGlXb3JsZENvb3JkaW5hdGVzVG9Ta2VsZXRvbiAocG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuXHRcdHRoaXMud29ybGRUcmFuc2Zvcm0uYXBwbHlJbnZlcnNlKHBvaW50LCBwb2ludCk7XG5cdH1cblxuXHQvKiogQ29udmVydHMgYSBwb2ludCBmcm9tIHRoZSBQaXhpIHdvcmxkIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBib25lJ3MgbG9jYWwgY29vcmRpbmF0ZSBzeXN0ZW0uICovXG5cdHB1YmxpYyBwaXhpV29ybGRDb29yZGluYXRlc1RvQm9uZSAocG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSwgYm9uZTogQm9uZSkge1xuXHRcdHRoaXMucGl4aVdvcmxkQ29vcmRpbmF0ZXNUb1NrZWxldG9uKHBvaW50KTtcblx0XHRpZiAoYm9uZS5wYXJlbnQpIHtcblx0XHRcdGJvbmUucGFyZW50LndvcmxkVG9Mb2NhbChwb2ludCBhcyBWZWN0b3IyKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRib25lLndvcmxkVG9Mb2NhbChwb2ludCBhcyBWZWN0b3IyKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXNlIHRoaXMgbWV0aG9kIHRvIGluc3RhbnRpYXRlIGEgU3BpbmUgZ2FtZSBvYmplY3QuXG5cdCAqIEJlZm9yZSBpbnN0YW50aWF0aW5nIGEgU3BpbmUgZ2FtZSBvYmplY3QsIHRoZSBza2VsZXRvbiAoYC5za2VsYCBvciBgLmpzb25gKSBhbmQgdGhlIGF0bGFzIHRleHQgZmlsZXMgbXVzdCBiZSBsb2FkZWQgaW50byB0aGUgQXNzZXRzLiBGb3IgZXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIFBJWEkuQXNzZXRzLmFkZChcInNhY2tEYXRhXCIsIFwiLi9hc3NldHMvc2Fjay1wcm8uc2tlbFwiKTtcblx0ICogUElYSS5Bc3NldHMuYWRkKFwic2Fja0F0bGFzXCIsIFwiLi9hc3NldHMvc2Fjay1wbWEuYXRsYXNcIik7XG5cdCAqIGF3YWl0IFBJWEkuQXNzZXRzLmxvYWQoW1wic2Fja0RhdGFcIiwgXCJzYWNrQXRsYXNcIl0pO1xuXHQgKiBgYGBcblx0ICogT25jZSBhIFNwaW5lIGdhbWUgb2JqZWN0IGlzIGNyZWF0ZWQsIGl0cyBza2VsZXRvbiBkYXRhIGlzIGNhY2hlZCBpbnRvIHtAbGluayBDYWNoZX0gdXNpbmcgdGhlIGtleTpcblx0ICogYCR7c2tlbGV0b25Bc3NldE5hbWV9LSR7YXRsYXNBc3NldE5hbWV9LSR7b3B0aW9ucz8uc2NhbGUgPz8gMX1gXG5cdCAqXG5cdCAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIFNwaW5lIGdhbWUgb2JqZWN0LiBTZWUge0BsaW5rIFNwaW5lRnJvbU9wdGlvbnN9XG5cdCAqIEByZXR1cm5zIHtTcGluZX0gVGhlIFNwaW5lIGdhbWUgb2JqZWN0IGluc3RhbnRpYXRlZFxuXHQgKi9cblx0c3RhdGljIGZyb20gKHsgc2tlbGV0b24sIGF0bGFzLCBzY2FsZSA9IDEsIGRhcmtUaW50LCBhdXRvVXBkYXRlID0gdHJ1ZSB9OiBTcGluZUZyb21PcHRpb25zKSB7XG5cdFx0Y29uc3QgY2FjaGVLZXkgPSBgJHtza2VsZXRvbn0tJHthdGxhc30tJHtzY2FsZX1gO1xuXG5cdFx0aWYgKENhY2hlLmhhcyhjYWNoZUtleSkpIHtcblx0XHRcdHJldHVybiBuZXcgU3BpbmUoQ2FjaGUuZ2V0PFNrZWxldG9uRGF0YT4oY2FjaGVLZXkpKTtcblx0XHR9XG5cblx0XHRjb25zdCBza2VsZXRvbkFzc2V0ID0gQXNzZXRzLmdldDxhbnkgfCBVaW50OEFycmF5Pihza2VsZXRvbik7XG5cblx0XHRjb25zdCBhdGxhc0Fzc2V0ID0gQXNzZXRzLmdldDxUZXh0dXJlQXRsYXM+KGF0bGFzKTtcblx0XHRjb25zdCBhdHRhY2htZW50TG9hZGVyID0gbmV3IEF0bGFzQXR0YWNobWVudExvYWRlcihhdGxhc0Fzc2V0KTtcblx0XHRjb25zdCBwYXJzZXIgPSBza2VsZXRvbkFzc2V0IGluc3RhbmNlb2YgVWludDhBcnJheVxuXHRcdFx0PyBuZXcgU2tlbGV0b25CaW5hcnkoYXR0YWNobWVudExvYWRlcilcblx0XHRcdDogbmV3IFNrZWxldG9uSnNvbihhdHRhY2htZW50TG9hZGVyKTtcblxuXHRcdHBhcnNlci5zY2FsZSA9IHNjYWxlO1xuXHRcdGNvbnN0IHNrZWxldG9uRGF0YSA9IHBhcnNlci5yZWFkU2tlbGV0b25EYXRhKHNrZWxldG9uQXNzZXQpO1xuXG5cdFx0Q2FjaGUuc2V0KGNhY2hlS2V5LCBza2VsZXRvbkRhdGEpO1xuXG5cdFx0cmV0dXJuIG5ldyBTcGluZSh7XG5cdFx0XHRza2VsZXRvbkRhdGEsXG5cdFx0XHRkYXJrVGludCxcblx0XHRcdGF1dG9VcGRhdGUsXG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|
|
628
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3BpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sRUFDTixNQUFNLEVBRU4sS0FBSyxFQUNMLFNBQVMsRUFFVCxVQUFVLEVBRVYsUUFBUSxFQUNSLFFBQVEsRUFFUixPQUFPLEVBQ1AsTUFBTSxFQUNOLGFBQWEsR0FDYixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEVBQ04sY0FBYyxFQUNkLGtCQUFrQixFQUNsQixxQkFBcUIsRUFHckIsa0JBQWtCLEVBQ2xCLEtBQUssRUFDTCxjQUFjLEVBQ2QsT0FBTyxFQUNQLElBQUksRUFDSixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixZQUFZLEVBSVosT0FBTyxHQUNQLE1BQU0sOEJBQThCLENBQUM7QUF3QnJDLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRWhDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBRXRCLE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQWtEdEMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFXLEdBQUcsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLEtBQU0sU0FBUSxhQUFhO0lBQ3ZDLGtCQUFrQjtJQUNYLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDZixPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ00sWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUN6QyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXhCLDJCQUEyQixHQUE0QixHQUFHLEVBQUUsR0FBVSxDQUFDLENBQUM7SUFDeEUsMEJBQTBCLEdBQTRC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LENBQUMsQ0FBQztRQUNuRCxNQUFNLGdCQUFnQixHQUFHLElBQUkscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxZQUFZLFVBQVU7WUFDakQsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLGdCQUFnQixDQUFDO1lBQ3RDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXRDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU1RCxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVsQyxPQUFPLElBQUksS0FBSyxDQUFDO1lBQ2hCLFlBQVk7WUFDWixRQUFRO1lBQ1IsVUFBVTtTQUNWLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEp1bHkgMjgsIDIwMjMuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMywgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvclxuICogb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRIRVxuICogU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7XG5cdEFzc2V0cyxcblx0Qm91bmRzLFxuXHRDYWNoZSxcblx0Q29udGFpbmVyLFxuXHRDb250YWluZXJPcHRpb25zLFxuXHRERUdfVE9fUkFELFxuXHREZXN0cm95T3B0aW9ucyxcblx0ZmFzdENvcHksXG5cdEdyYXBoaWNzLFxuXHRQb2ludERhdGEsXG5cdFRleHR1cmUsXG5cdFRpY2tlcixcblx0Vmlld0NvbnRhaW5lcixcbn0gZnJvbSAncGl4aS5qcyc7XG5pbXBvcnQgeyBJU3BpbmVEZWJ1Z1JlbmRlcmVyIH0gZnJvbSAnLi9TcGluZURlYnVnUmVuZGVyZXInO1xuaW1wb3J0IHtcblx0QW5pbWF0aW9uU3RhdGUsXG5cdEFuaW1hdGlvblN0YXRlRGF0YSxcblx0QXRsYXNBdHRhY2htZW50TG9hZGVyLFxuXHRBdHRhY2htZW50LFxuXHRCb25lLFxuXHRDbGlwcGluZ0F0dGFjaG1lbnQsXG5cdENvbG9yLFxuXHRNZXNoQXR0YWNobWVudCxcblx0UGh5c2ljcyxcblx0UG9vbCxcblx0UmVnaW9uQXR0YWNobWVudCxcblx0U2tlbGV0b24sXG5cdFNrZWxldG9uQmluYXJ5LFxuXHRTa2VsZXRvbkJvdW5kcyxcblx0U2tlbGV0b25DbGlwcGluZyxcblx0U2tlbGV0b25EYXRhLFxuXHRTa2VsZXRvbkpzb24sXG5cdFNsb3QsXG5cdHR5cGUgVGV4dHVyZUF0bGFzLFxuXHRUcmFja0VudHJ5LFxuXHRWZWN0b3IyLFxufSBmcm9tICdAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlJztcblxuLyoqXG4gKiBPcHRpb25zIHRvIGNyZWF0ZSBhIHtAbGluayBTcGluZX0gdXNpbmcge0BsaW5rIFNwaW5lLmZyb219LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwaW5lRnJvbU9wdGlvbnMge1xuXHQvKiogdGhlIGFzc2V0IG5hbWUgZm9yIHRoZSBza2VsZXRvbiBgLnNrZWxgIG9yIGAuanNvbmAgZmlsZSBwcmV2aW91c2x5IGxvYWRlZCBpbnRvIHRoZSBBc3NldHMgKi9cblx0c2tlbGV0b246IHN0cmluZztcblxuXHQvKiogdGhlIGFzc2V0IG5hbWUgZm9yIHRoZSBhdGxhcyBmaWxlIHByZXZpb3VzbHkgbG9hZGVkIGludG8gdGhlIEFzc2V0cyAqL1xuXHRhdGxhczogc3RyaW5nO1xuXG5cdC8qKiAgVGhlIHZhbHVlIHBhc3NlZCB0byB0aGUgc2tlbGV0b24gcmVhZGVyLiBJZiBvbWl0dGVkLCAxIGlzIHBhc3NlZC4gU2VlIHtAbGluayBTa2VsZXRvbkJpbmFyeS5zY2FsZX0gZm9yIGRldGFpbHMuICovXG5cdHNjYWxlPzogbnVtYmVyO1xuXG5cdC8qKiAgU2V0IHRoZSB7QGxpbmsgU3BpbmUuYXV0b1VwZGF0ZX0gdmFsdWUuIElmIG9taXR0ZWQsIGl0IGlzIHNldCB0byBgdHJ1ZWAuICovXG5cdGF1dG9VcGRhdGU/OiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBJZiBgdHJ1ZWAsIHVzZSB0aGUgZGFyayB0aW50IHJlbmRlcmVyIHRvIHJlbmRlciB0aGUgc2tlbGV0b25cblx0ICogSWYgYGZhbHNlYCwgdXNlIHRoZSBkZWZhdWx0IHBpeGkgcmVuZGVyZXIgdG8gcmVuZGVyIHRoZSBza2VsZXRvblxuXHQgKiBJZiBgdW5kZWZpbmVkYCwgdXNlIHRoZSBkYXJrIHRpbnQgcmVuZGVyZXIgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaGFzIHRpbnQgYmxhY2tcblx0ICovXG5cdGRhcmtUaW50PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IHZlY3RvckF1eCA9IG5ldyBWZWN0b3IyKCk7XG5cblNrZWxldG9uLnlEb3duID0gdHJ1ZTtcblxuY29uc3QgY2xpcHBlciA9IG5ldyBTa2VsZXRvbkNsaXBwaW5nKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BpbmVPcHRpb25zIGV4dGVuZHMgQ29udGFpbmVyT3B0aW9ucyB7XG5cdC8qKiB0aGUge0BsaW5rIFNrZWxldG9uRGF0YX0gdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgc2tlbGV0b24gKi9cblx0c2tlbGV0b25EYXRhOiBTa2VsZXRvbkRhdGE7XG5cblx0LyoqICBTZWUge0BsaW5rIFNwaW5lRnJvbU9wdGlvbnMuYXV0b1VwZGF0ZX0uICovXG5cdGF1dG9VcGRhdGU/OiBib29sZWFuO1xuXG5cdC8qKiAgU2VlIHtAbGluayBTcGluZUZyb21PcHRpb25zLmRhcmtUaW50fS4gKi9cblx0ZGFya1RpbnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIge0BsaW5rIGh0dHBzOi8vZW4uZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtYXBpLXJlZmVyZW5jZSNBbmltYXRpb25TdGF0ZUxpc3RlbmVyIGV2ZW50c30gZXhwb3NlZCBmb3IgUGl4aS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGluZUV2ZW50cyB7XG5cdGNvbXBsZXRlOiBbdHJhY2tFbnRyeTogVHJhY2tFbnRyeV07XG5cdGRpc3Bvc2U6IFt0cmFja0VudHJ5OiBUcmFja0VudHJ5XTtcblx0ZW5kOiBbdHJhY2tFbnRyeTogVHJhY2tFbnRyeV07XG5cdGV2ZW50OiBbdHJhY2tFbnRyeTogVHJhY2tFbnRyeSwgZXZlbnQ6IEV2ZW50XTtcblx0aW50ZXJydXB0OiBbdHJhY2tFbnRyeTogVHJhY2tFbnRyeV07XG5cdHN0YXJ0OiBbdHJhY2tFbnRyeTogVHJhY2tFbnRyeV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudENhY2hlRGF0YSB7XG5cdGlkOiBzdHJpbmc7XG5cdGNsaXBwZWQ6IGJvb2xlYW47XG5cdHZlcnRpY2VzOiBGbG9hdDMyQXJyYXk7XG5cdHV2czogRmxvYXQzMkFycmF5O1xuXHRpbmRpY2VzOiBudW1iZXJbXTtcblx0Y29sb3I6IENvbG9yO1xuXHRkYXJrQ29sb3I6IENvbG9yO1xuXHRkYXJrVGludDogYm9vbGVhbjtcblx0c2tpcFJlbmRlcjogYm9vbGVhbjtcblx0dGV4dHVyZTogVGV4dHVyZTtcblx0Y2xpcHBlZERhdGE/OiB7XG5cdFx0dmVydGljZXM6IEZsb2F0MzJBcnJheTtcblx0XHR1dnM6IEZsb2F0MzJBcnJheTtcblx0XHRpbmRpY2VzOiBVaW50MTZBcnJheTtcblx0XHR2ZXJ0ZXhDb3VudDogbnVtYmVyO1xuXHRcdGluZGljZXNDb3VudDogbnVtYmVyO1xuXHR9O1xufVxuXG5pbnRlcmZhY2UgU2xvdHNUb0NsaXBwaW5nIHtcblx0c2xvdDogU2xvdCxcblx0bWFzaz86IEdyYXBoaWNzLFxuXHRtYXNrQ29tcHV0ZWQ/OiBib29sZWFuLFxuXHR2ZXJ0aWNlczogQXJyYXk8bnVtYmVyPixcbn07XG5cbmNvbnN0IG1hc2tQb29sID0gbmV3IFBvb2w8R3JhcGhpY3M+KCgpID0+IG5ldyBHcmFwaGljcyk7XG5cbi8qKlxuICogVGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlIGEge0BsaW5rIFNwaW5lfSBnYW1lIG9iamVjdCBpbiBQaXhpLlxuICogVGhlIHN0YXRpYyBtZXRob2Qge0BsaW5rIFNwaW5lLmZyb219IHNob3VsZCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgU3BpbmUgZ2FtZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGluZSBleHRlbmRzIFZpZXdDb250YWluZXIge1xuXHQvLyBQaXhpIHByb3BlcnRpZXNcblx0cHVibGljIGJhdGNoZWQgPSB0cnVlO1xuXHRwdWJsaWMgYnVpbGRJZCA9IDA7XG5cdHB1YmxpYyBvdmVycmlkZSByZWFkb25seSByZW5kZXJQaXBlSWQgPSAnc3BpbmUnO1xuXHRwdWJsaWMgX2RpZFNwaW5lVXBkYXRlID0gZmFsc2U7XG5cblx0cHVibGljIGJlZm9yZVVwZGF0ZVdvcmxkVHJhbnNmb3JtczogKG9iamVjdDogU3BpbmUpID0+IHZvaWQgPSAoKSA9PiB7IC8qKiAqLyB9O1xuXHRwdWJsaWMgYWZ0ZXJVcGRhdGVXb3JsZFRyYW5zZm9ybXM6IChvYmplY3Q6IFNwaW5lKSA9PiB2b2lkID0gKCkgPT4geyAvKiogKi8gfTtcblxuXHQvLyBTcGluZSBwcm9wZXJ0aWVzXG5cdC8qKiBUaGUgc2tlbGV0b24gZm9yIHRoaXMgU3BpbmUgZ2FtZSBvYmplY3QuICovXG5cdHB1YmxpYyBza2VsZXRvbjogU2tlbGV0b247XG5cdC8qKiBUaGUgYW5pbWF0aW9uIHN0YXRlIGZvciB0aGlzIFNwaW5lIGdhbWUgb2JqZWN0LiAqL1xuXHRwdWJsaWMgc3RhdGU6IEFuaW1hdGlvblN0YXRlO1xuXHRwdWJsaWMgc2tlbGV0b25Cb3VuZHM/OiBTa2VsZXRvbkJvdW5kcztcblxuXHRwcml2YXRlIGRhcmtUaW50ID0gZmFsc2U7XG5cdHByaXZhdGUgX2RlYnVnPzogSVNwaW5lRGVidWdSZW5kZXJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHRyZWFkb25seSBfc2xvdHNPYmplY3Q6IFJlY29yZDxzdHJpbmcsIHsgc2xvdDogU2xvdCwgY29udGFpbmVyOiBDb250YWluZXIgfSB8IG51bGw+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0cHJpdmF0ZSBjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrczogUmVjb3JkPHN0cmluZywgU2xvdHNUb0NsaXBwaW5nPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0cHJpdmF0ZSBnZXRTbG90RnJvbVJlZiAoc2xvdFJlZjogbnVtYmVyIHwgc3RyaW5nIHwgU2xvdCk6IFNsb3Qge1xuXHRcdGxldCBzbG90OiBTbG90IHwgbnVsbDtcblxuXHRcdGlmICh0eXBlb2Ygc2xvdFJlZiA9PT0gJ251bWJlcicpIHNsb3QgPSB0aGlzLnNrZWxldG9uLnNsb3RzW3Nsb3RSZWZdO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiBzbG90UmVmID09PSAnc3RyaW5nJykgc2xvdCA9IHRoaXMuc2tlbGV0b24uZmluZFNsb3Qoc2xvdFJlZik7XG5cdFx0ZWxzZSBzbG90ID0gc2xvdFJlZjtcblxuXHRcdGlmICghc2xvdCkgdGhyb3cgbmV3IEVycm9yKGBObyBzbG90IGZvdW5kIHdpdGggdGhlIGdpdmVuIHNsb3QgcmVmZXJlbmNlOiAke3Nsb3RSZWZ9YCk7XG5cblx0XHRyZXR1cm4gc2xvdDtcblx0fVxuXG5cdHB1YmxpYyBzcGluZUF0dGFjaG1lbnRzRGlydHkgPSB0cnVlO1xuXHRwdWJsaWMgc3BpbmVUZXh0dXJlc0RpcnR5ID0gdHJ1ZTtcblxuXHRwcml2YXRlIF9sYXN0QXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuXG5cdHByaXZhdGUgX3N0YXRlQ2hhbmdlZCA9IHRydWU7XG5cdHByaXZhdGUgYXR0YWNobWVudENhY2hlRGF0YTogUmVjb3JkPHN0cmluZywgQXR0YWNobWVudENhY2hlRGF0YT5bXSA9IFtdO1xuXG5cdHB1YmxpYyBnZXQgZGVidWcgKCk6IElTcGluZURlYnVnUmVuZGVyZXIgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9kZWJ1Zztcblx0fVxuXG5cdC8qKiBQYXNzIGEge0BsaW5rIFNwaW5lRGVidWdSZW5kZXJlcn0gb3IgY3JlYXRlIHlvdXIgb3duIHtAbGluayBJU3BpbmVEZWJ1Z1JlbmRlcmVyfSB0byByZW5kZXIgYm9uZXMsIG1lc2hlcywgLi4uXG5cdCAqIEBleGFtcGxlIHNwaW5lR08uZGVidWcgPSBuZXcgU3BpbmVEZWJ1Z1JlbmRlcmVyKCk7XG5cdCAqL1xuXHRwdWJsaWMgc2V0IGRlYnVnICh2YWx1ZTogSVNwaW5lRGVidWdSZW5kZXJlciB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0aGlzLl9kZWJ1Zykge1xuXHRcdFx0dGhpcy5fZGVidWcudW5yZWdpc3RlclNwaW5lKHRoaXMpO1xuXHRcdH1cblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdHZhbHVlLnJlZ2lzdGVyU3BpbmUodGhpcyk7XG5cdFx0fVxuXHRcdHRoaXMuX2RlYnVnID0gdmFsdWU7XG5cdH1cblxuXHRwcml2YXRlIF9hdXRvVXBkYXRlID0gdHJ1ZTtcblxuXHRwdWJsaWMgZ2V0IGF1dG9VcGRhdGUgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9hdXRvVXBkYXRlO1xuXHR9XG5cdC8qKiBXaGVuIGB0cnVlYCwgdGhlIFNwaW5lIEFuaW1hdGlvblN0YXRlIGFuZCB0aGUgU2tlbGV0b24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdXNpbmcgdGhlIHtAbGluayBUaWNrZXIuc2hhcmVkfSBpbnN0YW5jZS4gKi9cblx0cHVibGljIHNldCBhdXRvVXBkYXRlICh2YWx1ZTogYm9vbGVhbikge1xuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0VGlja2VyLnNoYXJlZC5hZGQodGhpcy5pbnRlcm5hbFVwZGF0ZSwgdGhpcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFRpY2tlci5zaGFyZWQucmVtb3ZlKHRoaXMuaW50ZXJuYWxVcGRhdGUsIHRoaXMpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2F1dG9VcGRhdGUgPSB2YWx1ZTtcblx0fVxuXG5cdHByaXZhdGUgaGFzTmV2ZXJVcGRhdGVkID0gdHJ1ZTtcblx0Y29uc3RydWN0b3IgKG9wdGlvbnM6IFNwaW5lT3B0aW9ucyB8IFNrZWxldG9uRGF0YSkge1xuXHRcdGlmIChvcHRpb25zIGluc3RhbmNlb2YgU2tlbGV0b25EYXRhKSB7XG5cdFx0XHRvcHRpb25zID0ge1xuXHRcdFx0XHRza2VsZXRvbkRhdGE6IG9wdGlvbnMsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHN1cGVyKCk7XG5cblx0XHRjb25zdCBza2VsZXRvbkRhdGEgPSBvcHRpb25zIGluc3RhbmNlb2YgU2tlbGV0b25EYXRhID8gb3B0aW9ucyA6IG9wdGlvbnMuc2tlbGV0b25EYXRhO1xuXG5cdFx0dGhpcy5za2VsZXRvbiA9IG5ldyBTa2VsZXRvbihza2VsZXRvbkRhdGEpO1xuXHRcdHRoaXMuc3RhdGUgPSBuZXcgQW5pbWF0aW9uU3RhdGUobmV3IEFuaW1hdGlvblN0YXRlRGF0YShza2VsZXRvbkRhdGEpKTtcblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBvcHRpb25zPy5hdXRvVXBkYXRlID8/IHRydWU7XG5cblx0XHQvLyBkYXJrIHRpbnQgY2FuIGJlIGVuYWJsZWQgYnkgb3B0aW9ucywgb3RoZXJ3aXNlIGlzIGVuYWJsZSBpZiBhdCBsZWFzdCBvbmUgc2xvdCBoYXMgdGludCBibGFja1xuXHRcdHRoaXMuZGFya1RpbnQgPSBvcHRpb25zPy5kYXJrVGludCA9PT0gdW5kZWZpbmVkXG5cdFx0XHQ/IHRoaXMuc2tlbGV0b24uc2xvdHMuc29tZShzbG90ID0+ICEhc2xvdC5kYXRhLmRhcmtDb2xvcilcblx0XHRcdDogb3B0aW9ucz8uZGFya1RpbnQ7XG5cblx0XHRjb25zdCBzbG90cyA9IHRoaXMuc2tlbGV0b24uc2xvdHM7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR0aGlzLmF0dGFjaG1lbnRDYWNoZURhdGFbaV0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBJZiB7QGxpbmsgU3BpbmUuYXV0b1VwZGF0ZX0gaXMgYGZhbHNlYCwgdGhpcyBtZXRob2QgYWxsb3dzIHRvIHVwZGF0ZSB0aGUgQW5pbWF0aW9uU3RhdGUgYW5kIHRoZSBTa2VsZXRvbiB3aXRoIHRoZSBnaXZlbiBkZWx0YS4gKi9cblx0cHVibGljIHVwZGF0ZSAoZHQ6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMuaW50ZXJuYWxVcGRhdGUoMCwgZHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGludGVybmFsVXBkYXRlIChfZGVsdGFGcmFtZTogYW55LCBkZWx0YVNlY29uZHM/OiBudW1iZXIpOiB2b2lkIHtcblx0XHQvLyBCZWNhdXNlIHJlYXNvbnMsIHBpeGkgdXNlcyBkZWx0YUZyYW1lcyBhdCA2MGZwcy5cblx0XHQvLyBXZSBpZ25vcmUgdGhlIGRlZmF1bHQgZGVsdGFGcmFtZXMgYW5kIHVzZSB0aGUgZGVsdGFTZWNvbmRzIGZyb20gcGl4aSB0aWNrZXIuXG5cdFx0dGhpcy5fdXBkYXRlQW5kQXBwbHlTdGF0ZShkZWx0YVNlY29uZHMgPz8gVGlja2VyLnNoYXJlZC5kZWx0YU1TIC8gMTAwMCk7XG5cdH1cblxuXHRnZXQgYm91bmRzICgpIHtcblx0XHRpZiAodGhpcy5fYm91bmRzRGlydHkpIHtcblx0XHRcdHRoaXMudXBkYXRlQm91bmRzKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2JvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBib25lIGdpdmVuIGluIGlucHV0IHRocm91Z2ggYSB7QGxpbmsgSVBvaW50RGF0YX0uXG5cdCAqIEBwYXJhbSBib25lOiB0aGUgYm9uZSBuYW1lIG9yIHRoZSBib25lIGluc3RhbmNlIHRvIHNldCB0aGUgcG9zaXRpb25cblx0ICogQHBhcmFtIG91dFBvczogdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgYm9uZS5cblx0ICogQHRocm93cyB7RXJyb3J9OiBpZiB0aGUgZ2l2ZW4gYm9uZSBpcyBub3QgZm91bmQgaW4gdGhlIHNrZWxldG9uLCBhbiBlcnJvciBpcyB0aHJvd25cblx0ICovXG5cdHB1YmxpYyBzZXRCb25lUG9zaXRpb24gKGJvbmU6IHN0cmluZyB8IEJvbmUsIHBvc2l0aW9uOiBQb2ludERhdGEpOiB2b2lkIHtcblx0XHRjb25zdCBib25lQXV4ID0gYm9uZTtcblxuXHRcdGlmICh0eXBlb2YgYm9uZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGJvbmUgPSB0aGlzLnNrZWxldG9uLmZpbmRCb25lKGJvbmUpIGFzIEJvbmU7XG5cdFx0fVxuXG5cdFx0aWYgKCFib25lKSB0aHJvdyBFcnJvcihgQ2FudCBzZXQgYm9uZSBwb3NpdGlvbiwgYm9uZSAke1N0cmluZyhib25lQXV4KX0gbm90IGZvdW5kYCk7XG5cdFx0dmVjdG9yQXV4LnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcblxuXHRcdGlmIChib25lLnBhcmVudCkge1xuXHRcdFx0Y29uc3QgYXV4ID0gYm9uZS5wYXJlbnQud29ybGRUb0xvY2FsKHZlY3RvckF1eCk7XG5cblx0XHRcdGJvbmUueCA9IGF1eC54O1xuXHRcdFx0Ym9uZS55ID0gLWF1eC55O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGJvbmUueCA9IHZlY3RvckF1eC54O1xuXHRcdFx0Ym9uZS55ID0gdmVjdG9yQXV4Lnk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGJvbmUgZ2l2ZW4gaW4gaW5wdXQgaW50byBhbiB7QGxpbmsgSVBvaW50RGF0YX0uXG5cdCAqIEBwYXJhbSBib25lOiB0aGUgYm9uZSBuYW1lIG9yIHRoZSBib25lIGluc3RhbmNlIHRvIGdldCB0aGUgcG9zaXRpb24gZnJvbVxuXHQgKiBAcGFyYW0gb3V0UG9zOiBhbiBvcHRpb25hbCB7QGxpbmsgSVBvaW50RGF0YX0gdG8gdXNlIHRvIHJldHVybiB0aGUgYm9uZSBwb3NpdGlvbiwgcmF0aGVybiB0aGFuIGluc3RhbnRpYXRpbmcgYSBuZXcgb2JqZWN0LlxuXHQgKiBAcmV0dXJucyB7SVBvaW50RGF0YSB8IHVuZGVmaW5lZH06IHRoZSBwb3NpdGlvbiBvZiB0aGUgYm9uZSwgb3IgdW5kZWZpbmVkIGlmIG5vIG1hdGNoaW5nIGJvbmUgaXMgZm91bmQgaW4gdGhlIHNrZWxldG9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Qm9uZVBvc2l0aW9uIChib25lOiBzdHJpbmcgfCBCb25lLCBvdXRQb3M/OiBQb2ludERhdGEpOiBQb2ludERhdGEgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGJvbmVBdXggPSBib25lO1xuXG5cdFx0aWYgKHR5cGVvZiBib25lID09PSAnc3RyaW5nJykge1xuXHRcdFx0Ym9uZSA9IHRoaXMuc2tlbGV0b24uZmluZEJvbmUoYm9uZSkgYXMgQm9uZTtcblx0XHR9XG5cblx0XHRpZiAoIWJvbmUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYENhbnQgc2V0IGJvbmUgcG9zaXRpb24hIEJvbmUgJHtTdHJpbmcoYm9uZUF1eCl9IG5vdCBmb3VuZGApO1xuXG5cdFx0XHRyZXR1cm4gb3V0UG9zO1xuXHRcdH1cblxuXHRcdGlmICghb3V0UG9zKSB7XG5cdFx0XHRvdXRQb3MgPSB7IHg6IDAsIHk6IDAgfTtcblx0XHR9XG5cblx0XHRvdXRQb3MueCA9IGJvbmUud29ybGRYO1xuXHRcdG91dFBvcy55ID0gYm9uZS53b3JsZFk7XG5cblx0XHRyZXR1cm4gb3V0UG9zO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkdmFuY2UgdGhlIHN0YXRlIGFuZCBza2VsZXRvbiBieSB0aGUgZ2l2ZW4gdGltZSwgdGhlbiB1cGRhdGUgc2xvdCBvYmplY3RzIHRvby5cblx0ICogVGhlIGNvbnRhaW5lciB0cmFuc2Zvcm0gaXMgbm90IHVwZGF0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB0aW1lIHRoZSB0aW1lIGF0IHdoaWNoIHRvIHNldCB0aGUgc3RhdGVcblx0ICovXG5cdHByaXZhdGUgX3VwZGF0ZUFuZEFwcGx5U3RhdGUgKHRpbWU6IG51bWJlcikge1xuXHRcdHRoaXMuaGFzTmV2ZXJVcGRhdGVkID0gZmFsc2U7XG5cblx0XHR0aGlzLnN0YXRlLnVwZGF0ZSh0aW1lKTtcblx0XHR0aGlzLnNrZWxldG9uLnVwZGF0ZSh0aW1lKTtcblxuXHRcdGNvbnN0IHsgc2tlbGV0b24gfSA9IHRoaXM7XG5cblx0XHR0aGlzLnN0YXRlLmFwcGx5KHNrZWxldG9uKTtcblxuXHRcdHRoaXMuYmVmb3JlVXBkYXRlV29ybGRUcmFuc2Zvcm1zKHRoaXMpO1xuXHRcdHNrZWxldG9uLnVwZGF0ZVdvcmxkVHJhbnNmb3JtKFBoeXNpY3MudXBkYXRlKTtcblx0XHR0aGlzLmFmdGVyVXBkYXRlV29ybGRUcmFuc2Zvcm1zKHRoaXMpO1xuXG5cdFx0dGhpcy51cGRhdGVTbG90T2JqZWN0cygpO1xuXG5cdFx0dGhpcy5fc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcblxuXHRcdHRoaXMuX2JvdW5kc0RpcnR5ID0gdHJ1ZTtcblxuXHRcdHRoaXMub25WaWV3VXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogLSB2YWxpZGF0ZXMgdGhlIGF0dGFjaG1lbnRzIC0gdG8gZmxhZyBpZiB0aGUgYXR0YWNobWVudHMgaGF2ZSBjaGFuZ2VkIHRoaXMgc3RhdGVcblx0ICogLSB0cmFuc2Zvcm1zIHRoZSBhdHRhY2htZW50cyAtIHRvIHVwZGF0ZSB0aGUgdmVydGljZXMgb2YgdGhlIGF0dGFjaG1lbnRzIGJhc2VkIG9uIHRoZSBuZXcgcG9zaXRpb25zXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0X3ZhbGlkYXRlQW5kVHJhbnNmb3JtQXR0YWNobWVudHMgKCkge1xuXHRcdGlmICghdGhpcy5fc3RhdGVDaGFuZ2VkKSByZXR1cm47XG5cdFx0dGhpcy5fc3RhdGVDaGFuZ2VkID0gZmFsc2U7XG5cblx0XHR0aGlzLnZhbGlkYXRlQXR0YWNobWVudHMoKTtcblxuXHRcdHRoaXMudHJhbnNmb3JtQXR0YWNobWVudHMoKTtcblx0fVxuXG5cdHByaXZhdGUgdmFsaWRhdGVBdHRhY2htZW50cyAoKSB7XG5cdFx0Y29uc3QgY3VycmVudERyYXdPcmRlciA9IHRoaXMuc2tlbGV0b24uZHJhd09yZGVyO1xuXG5cdFx0Y29uc3QgbGFzdEF0dGFjaG1lbnRzID0gdGhpcy5fbGFzdEF0dGFjaG1lbnRzO1xuXG5cdFx0bGV0IGluZGV4ID0gMDtcblxuXHRcdGxldCBzcGluZUF0dGFjaG1lbnRzRGlydHkgPSBmYWxzZTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudERyYXdPcmRlci5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IGN1cnJlbnREcmF3T3JkZXJbaV07XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdGlmIChhdHRhY2htZW50KSB7XG5cdFx0XHRcdGlmIChhdHRhY2htZW50ICE9PSBsYXN0QXR0YWNobWVudHNbaW5kZXhdKSB7XG5cdFx0XHRcdFx0c3BpbmVBdHRhY2htZW50c0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0XHRsYXN0QXR0YWNobWVudHNbaW5kZXhdID0gYXR0YWNobWVudDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGluZGV4ICE9PSBsYXN0QXR0YWNobWVudHMubGVuZ3RoKSB7XG5cdFx0XHRzcGluZUF0dGFjaG1lbnRzRGlydHkgPSB0cnVlO1xuXHRcdFx0bGFzdEF0dGFjaG1lbnRzLmxlbmd0aCA9IGluZGV4O1xuXHRcdH1cblxuXHRcdHRoaXMuc3BpbmVBdHRhY2htZW50c0RpcnR5ID0gc3BpbmVBdHRhY2htZW50c0RpcnR5O1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVBbmRTZXRQaXhpTWFzayAoc2xvdDogU2xvdCwgbGFzdDogYm9vbGVhbikge1xuXHRcdC8vIGFzc2lnbi9jcmVhdGUgdGhlIGN1cnJlbnRDbGlwcGluZ1Nsb3Rcblx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5hdHRhY2htZW50O1xuXHRcdGlmIChhdHRhY2htZW50ICYmIGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpIHtcblx0XHRcdGNvbnN0IGNsaXAgPSAodGhpcy5jbGlwcGluZ1Nsb3RUb1BpeGlNYXNrc1tzbG90LmRhdGEubmFtZV0gfHw9IHsgc2xvdCwgdmVydGljZXM6IG5ldyBBcnJheTxudW1iZXI+KCkgfSk7XG5cdFx0XHRjbGlwLm1hc2tDb21wdXRlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5jdXJyZW50Q2xpcHBpbmdTbG90ID0gdGhpcy5jbGlwcGluZ1Nsb3RUb1BpeGlNYXNrc1tzbG90LmRhdGEubmFtZV07XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gYXNzaWduIHRoZSBjdXJyZW50Q2xpcHBpbmdTbG90IG1hc2sgdG8gdGhlIHNsb3Qgb2JqZWN0XG5cdFx0bGV0IGN1cnJlbnRDbGlwcGluZ1Nsb3QgPSB0aGlzLmN1cnJlbnRDbGlwcGluZ1Nsb3Q7XG5cdFx0bGV0IHNsb3RPYmplY3QgPSB0aGlzLl9zbG90c09iamVjdFtzbG90LmRhdGEubmFtZV07XG5cdFx0aWYgKGN1cnJlbnRDbGlwcGluZ1Nsb3QgJiYgc2xvdE9iamVjdCkge1xuXHRcdFx0bGV0IHNsb3RDbGlwcGluZyA9IGN1cnJlbnRDbGlwcGluZ1Nsb3Quc2xvdDtcblx0XHRcdGxldCBjbGlwcGluZ0F0dGFjaG1lbnQgPSBzbG90Q2xpcHBpbmcuYXR0YWNobWVudCBhcyBDbGlwcGluZ0F0dGFjaG1lbnQ7XG5cblx0XHRcdC8vIGNyZWF0ZSB0aGUgcGl4aSBtYXNrLCBvbmx5IHRoZSBmaXJzdCB0aW1lIGFuZCBpZiB0aGUgY2xpcHBlZCBzbG90IGlzIHRoZSBmaXJzdCBvbmUgY2xpcHBlZCBieSB0aGlzIGN1cnJlbnRDbGlwcGluZ1Nsb3Rcblx0XHRcdGxldCBtYXNrID0gY3VycmVudENsaXBwaW5nU2xvdC5tYXNrIGFzIEdyYXBoaWNzO1xuXHRcdFx0aWYgKCFtYXNrKSB7XG5cdFx0XHRcdG1hc2sgPSBtYXNrUG9vbC5vYnRhaW4oKTtcblx0XHRcdFx0Y3VycmVudENsaXBwaW5nU2xvdC5tYXNrID0gbWFzaztcblx0XHRcdFx0dGhpcy5hZGRDaGlsZChtYXNrKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gY29tcHV0ZSB0aGUgcGl4aSBtYXNrIHBvbHlnb24sIGlmIHRoZSBjbGlwcGVkIHNsb3QgaXMgdGhlIGZpcnN0IG9uZSBjbGlwcGVkIGJ5IHRoaXMgY3VycmVudENsaXBwaW5nU2xvdFxuXHRcdFx0aWYgKCFjdXJyZW50Q2xpcHBpbmdTbG90Lm1hc2tDb21wdXRlZCkge1xuXHRcdFx0XHRjdXJyZW50Q2xpcHBpbmdTbG90Lm1hc2tDb21wdXRlZCA9IHRydWU7XG5cdFx0XHRcdGNvbnN0IHdvcmxkVmVydGljZXNMZW5ndGggPSBjbGlwcGluZ0F0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aDtcblx0XHRcdFx0Y29uc3QgdmVydGljZXMgPSBjdXJyZW50Q2xpcHBpbmdTbG90LnZlcnRpY2VzO1xuXHRcdFx0XHRjbGlwcGluZ0F0dGFjaG1lbnQuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdENsaXBwaW5nLCAwLCB3b3JsZFZlcnRpY2VzTGVuZ3RoLCB2ZXJ0aWNlcywgMCwgMik7XG5cdFx0XHRcdG1hc2suY2xlYXIoKS5wb2x5KHZlcnRpY2VzKS5zdHJva2UoeyB3aWR0aDogMCB9KS5maWxsKHsgYWxwaGE6IC4yNSB9KTtcblx0XHRcdH1cblx0XHRcdHNsb3RPYmplY3QuY29udGFpbmVyLm1hc2sgPSBtYXNrO1xuXHRcdH0gZWxzZSBpZiAoc2xvdE9iamVjdD8uY29udGFpbmVyLm1hc2spIHtcblx0XHRcdC8vIHJlbW92ZSB0aGUgbWFzaywgaWYgc2xvdCBvYmplY3QgaGFzIGEgbWFzaywgYnV0IGN1cnJlbnRDbGlwcGluZ1Nsb3QgaXMgdW5kZWZpbmVkXG5cdFx0XHRzbG90T2JqZWN0LmNvbnRhaW5lci5tYXNrID0gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBpZiBjdXJyZW50IHNsb3QgaXMgdGhlIGVuZGluZyBvbmUgb2YgdGhlIGN1cnJlbnRDbGlwcGluZ1Nsb3QgbWFzaywgc2V0IGN1cnJlbnRDbGlwcGluZ1Nsb3QgdG8gdW5kZWZpbmVkXG5cdFx0aWYgKGN1cnJlbnRDbGlwcGluZ1Nsb3QgJiYgKGN1cnJlbnRDbGlwcGluZ1Nsb3Quc2xvdC5hdHRhY2htZW50IGFzIENsaXBwaW5nQXR0YWNobWVudCkuZW5kU2xvdCA9PSBzbG90LmRhdGEpIHtcblx0XHRcdHRoaXMuY3VycmVudENsaXBwaW5nU2xvdCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBjbGVhbiB1cCB1bnVzZWQgbWFza3Ncblx0XHRpZiAobGFzdCkge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGhpcy5jbGlwcGluZ1Nsb3RUb1BpeGlNYXNrcykge1xuXHRcdFx0XHRjb25zdCBjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrID0gdGhpcy5jbGlwcGluZ1Nsb3RUb1BpeGlNYXNrc1trZXldO1xuXHRcdFx0XHRpZiAoKCEoY2xpcHBpbmdTbG90VG9QaXhpTWFzay5zbG90LmF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpIHx8ICFjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrLm1hc2tDb21wdXRlZCkgJiYgY2xpcHBpbmdTbG90VG9QaXhpTWFzay5tYXNrKSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmVDaGlsZChjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrLm1hc2spO1xuXHRcdFx0XHRcdG1hc2tQb29sLmZyZWUoY2xpcHBpbmdTbG90VG9QaXhpTWFzay5tYXNrKTtcblx0XHRcdFx0XHRjbGlwcGluZ1Nsb3RUb1BpeGlNYXNrLm1hc2sgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGN1cnJlbnRDbGlwcGluZ1Nsb3Q6IFNsb3RzVG9DbGlwcGluZyB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSB0cmFuc2Zvcm1BdHRhY2htZW50cyAoKSB7XG5cdFx0Y29uc3QgY3VycmVudERyYXdPcmRlciA9IHRoaXMuc2tlbGV0b24uZHJhd09yZGVyO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50RHJhd09yZGVyLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gY3VycmVudERyYXdPcmRlcltpXTtcblxuXHRcdFx0dGhpcy51cGRhdGVBbmRTZXRQaXhpTWFzayhzbG90LCBpID09PSBjdXJyZW50RHJhd09yZGVyLmxlbmd0aCAtIDEpO1xuXG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdGlmIChhdHRhY2htZW50KSB7XG5cdFx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQgfHwgYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcblx0XHRcdFx0XHRjb25zdCBjYWNoZURhdGEgPSB0aGlzLl9nZXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpO1xuXG5cdFx0XHRcdFx0aWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50KSB7XG5cdFx0XHRcdFx0XHRhdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIGNhY2hlRGF0YS52ZXJ0aWNlcywgMCwgMik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0YXR0YWNobWVudC5jb21wdXRlV29ybGRWZXJ0aWNlcyhcblx0XHRcdFx0XHRcdFx0c2xvdCxcblx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0YXR0YWNobWVudC53b3JsZFZlcnRpY2VzTGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRjYWNoZURhdGEudmVydGljZXMsXG5cdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdDIsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHNlcXVlbmNlcyB1dnMgYXJlIGtub3duIG9ubHkgYWZ0ZXIgY29tcHV0ZVdvcmxkVmVydGljZXMgaXMgaW52b2tlZFxuXHRcdFx0XHRcdGlmIChjYWNoZURhdGEudXZzLmxlbmd0aCA8IGF0dGFjaG1lbnQudXZzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y2FjaGVEYXRhLnV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoYXR0YWNobWVudC51dnMubGVuZ3RoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBuZWVkIHRvIGNvcHkgYmVjYXVzZSBhdHRhY2htZW50cyB1dnMgYXJlIHNoYXJlZCBhbW9uZyBza2VsZXRvbnMgdXNpbmcgdGhlIHNhbWUgYXRsYXNcblx0XHRcdFx0XHRmYXN0Q29weSgoYXR0YWNobWVudC51dnMgYXMgRmxvYXQzMkFycmF5KS5idWZmZXIsIGNhY2hlRGF0YS51dnMuYnVmZmVyKTtcblxuXHRcdFx0XHRcdGNvbnN0IHNrZWxldG9uID0gc2xvdC5ib25lLnNrZWxldG9uO1xuXHRcdFx0XHRcdGNvbnN0IHNrZWxldG9uQ29sb3IgPSBza2VsZXRvbi5jb2xvcjtcblx0XHRcdFx0XHRjb25zdCBzbG90Q29sb3IgPSBzbG90LmNvbG9yO1xuXG5cdFx0XHRcdFx0Y29uc3QgYXR0YWNobWVudENvbG9yID0gYXR0YWNobWVudC5jb2xvcjtcblxuXHRcdFx0XHRcdGNhY2hlRGF0YS5jb2xvci5zZXQoXG5cdFx0XHRcdFx0XHRza2VsZXRvbkNvbG9yLnIgKiBzbG90Q29sb3IuciAqIGF0dGFjaG1lbnRDb2xvci5yLFxuXHRcdFx0XHRcdFx0c2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiBhdHRhY2htZW50Q29sb3IuZyxcblx0XHRcdFx0XHRcdHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogYXR0YWNobWVudENvbG9yLmIsXG5cdFx0XHRcdFx0XHRza2VsZXRvbkNvbG9yLmEgKiBzbG90Q29sb3IuYSAqIGF0dGFjaG1lbnRDb2xvci5hLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoc2xvdC5kYXJrQ29sb3IpIHtcblx0XHRcdFx0XHRcdGNhY2hlRGF0YS5kYXJrQ29sb3Iuc2V0RnJvbUNvbG9yKHNsb3QuZGFya0NvbG9yKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjYWNoZURhdGEuc2tpcFJlbmRlciA9IGNhY2hlRGF0YS5jbGlwcGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gYXR0YWNobWVudC5yZWdpb24/LnRleHR1cmUudGV4dHVyZSB8fCBUZXh0dXJlLkVNUFRZO1xuXG5cdFx0XHRcdFx0aWYgKGNhY2hlRGF0YS50ZXh0dXJlICE9PSB0ZXh0dXJlKSB7XG5cdFx0XHRcdFx0XHRjYWNoZURhdGEudGV4dHVyZSA9IHRleHR1cmU7XG5cdFx0XHRcdFx0XHR0aGlzLnNwaW5lVGV4dHVyZXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGNsaXBwZXIuaXNDbGlwcGluZygpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZUNsaXBwaW5nRGF0YShjYWNoZURhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgQ2xpcHBpbmdBdHRhY2htZW50KSB7XG5cdFx0XHRcdFx0Y2xpcHBlci5jbGlwU3RhcnQoc2xvdCwgYXR0YWNobWVudCk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNsaXBwZXIuY2xpcEVuZFdpdGhTbG90KHNsb3QpO1xuXHRcdH1cblx0XHRjbGlwcGVyLmNsaXBFbmQoKTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlQ2xpcHBpbmdEYXRhIChjYWNoZURhdGE6IEF0dGFjaG1lbnRDYWNoZURhdGEpIHtcblx0XHRjYWNoZURhdGEuY2xpcHBlZCA9IHRydWU7XG5cblx0XHRjbGlwcGVyLmNsaXBUcmlhbmdsZXNVbnBhY2tlZChcblx0XHRcdGNhY2hlRGF0YS52ZXJ0aWNlcyxcblx0XHRcdGNhY2hlRGF0YS5pbmRpY2VzLFxuXHRcdFx0Y2FjaGVEYXRhLmluZGljZXMubGVuZ3RoLFxuXHRcdFx0Y2FjaGVEYXRhLnV2cyxcblx0XHQpO1xuXG5cdFx0Y29uc3QgeyBjbGlwcGVkVmVydGljZXMsIGNsaXBwZWRVVnMsIGNsaXBwZWRUcmlhbmdsZXMgfSA9IGNsaXBwZXI7XG5cblx0XHRjb25zdCB2ZXJ0aWNlc0NvdW50ID0gY2xpcHBlZFZlcnRpY2VzLmxlbmd0aCAvIDI7XG5cdFx0Y29uc3QgaW5kaWNlc0NvdW50ID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cblx0XHRpZiAoIWNhY2hlRGF0YS5jbGlwcGVkRGF0YSkge1xuXHRcdFx0Y2FjaGVEYXRhLmNsaXBwZWREYXRhID0ge1xuXHRcdFx0XHR2ZXJ0aWNlczogbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0NvdW50ICogMiksXG5cdFx0XHRcdHV2czogbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0NvdW50ICogMiksXG5cdFx0XHRcdHZlcnRleENvdW50OiB2ZXJ0aWNlc0NvdW50LFxuXHRcdFx0XHRpbmRpY2VzOiBuZXcgVWludDE2QXJyYXkoaW5kaWNlc0NvdW50KSxcblx0XHRcdFx0aW5kaWNlc0NvdW50LFxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5zcGluZUF0dGFjaG1lbnRzRGlydHkgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNsaXBwZWREYXRhID0gY2FjaGVEYXRhLmNsaXBwZWREYXRhO1xuXG5cdFx0Y29uc3Qgc2l6ZUNoYW5nZSA9IGNsaXBwZWREYXRhLnZlcnRleENvdW50ICE9PSB2ZXJ0aWNlc0NvdW50IHx8IGluZGljZXNDb3VudCAhPT0gY2xpcHBlZERhdGEuaW5kaWNlc0NvdW50O1xuXG5cdFx0Y2FjaGVEYXRhLnNraXBSZW5kZXIgPSB2ZXJ0aWNlc0NvdW50ID09PSAwO1xuXG5cdFx0aWYgKHNpemVDaGFuZ2UpIHtcblx0XHRcdHRoaXMuc3BpbmVBdHRhY2htZW50c0RpcnR5ID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGNsaXBwZWREYXRhLnZlcnRleENvdW50IDwgdmVydGljZXNDb3VudCkge1xuXHRcdFx0XHQvLyBidWZmZXIgcmV1c2UhXG5cdFx0XHRcdGNsaXBwZWREYXRhLnZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0NvdW50ICogMik7XG5cdFx0XHRcdGNsaXBwZWREYXRhLnV2cyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNDb3VudCAqIDIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2xpcHBlZERhdGEuaW5kaWNlcy5sZW5ndGggPCBpbmRpY2VzQ291bnQpIHtcblx0XHRcdFx0Y2xpcHBlZERhdGEuaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShpbmRpY2VzQ291bnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHsgdmVydGljZXMsIHV2cywgaW5kaWNlcyB9ID0gY2xpcHBlZERhdGE7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzQ291bnQ7IGkrKykge1xuXHRcdFx0dmVydGljZXNbaSAqIDJdID0gY2xpcHBlZFZlcnRpY2VzW2kgKiAyXTtcblx0XHRcdHZlcnRpY2VzWyhpICogMikgKyAxXSA9IGNsaXBwZWRWZXJ0aWNlc1soaSAqIDIpICsgMV07XG5cblx0XHRcdHV2c1tpICogMl0gPSBjbGlwcGVkVVZzWyhpICogMildO1xuXHRcdFx0dXZzWyhpICogMikgKyAxXSA9IGNsaXBwZWRVVnNbKGkgKiAyKSArIDFdO1xuXHRcdH1cblxuXHRcdGNsaXBwZWREYXRhLnZlcnRleENvdW50ID0gdmVydGljZXNDb3VudDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyBpKyspIHtcblx0XHRcdGlmIChpbmRpY2VzW2ldICE9PSBjbGlwcGVkVHJpYW5nbGVzW2ldKSB7XG5cdFx0XHRcdHRoaXMuc3BpbmVBdHRhY2htZW50c0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0aW5kaWNlc1tpXSA9IGNsaXBwZWRUcmlhbmdsZXNbaV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y2xpcHBlZERhdGEuaW5kaWNlc0NvdW50ID0gaW5kaWNlc0NvdW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIGVuc3VyZSB0aGF0IGF0dGFjaGVkIGNvbnRhaW5lcnMgbWFwIGNvcnJlY3RseSB0byB0aGVpciBzbG90c1xuXHQgKiBhbG9uZyB3aXRoIHRoZWlyIHBvc2l0aW9uLCByb3RhdGlvbiwgc2NhbGUsIGFuZCB2aXNpYmlsaXR5LlxuXHQgKi9cblx0cHJpdmF0ZSB1cGRhdGVTbG90T2JqZWN0cyAoKSB7XG5cdFx0Zm9yIChjb25zdCBpIGluIHRoaXMuX3Nsb3RzT2JqZWN0KSB7XG5cdFx0XHRjb25zdCBzbG90QXR0YWNobWVudCA9IHRoaXMuX3Nsb3RzT2JqZWN0W2ldO1xuXG5cdFx0XHRpZiAoIXNsb3RBdHRhY2htZW50KSBjb250aW51ZTtcblxuXHRcdFx0dGhpcy51cGRhdGVTbG90T2JqZWN0KHNsb3RBdHRhY2htZW50KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZVNsb3RPYmplY3QgKHNsb3RBdHRhY2htZW50OiB7IHNsb3Q6IFNsb3QsIGNvbnRhaW5lcjogQ29udGFpbmVyIH0pIHtcblx0XHRjb25zdCB7IHNsb3QsIGNvbnRhaW5lciB9ID0gc2xvdEF0dGFjaG1lbnQ7XG5cblx0XHRjb250YWluZXIudmlzaWJsZSA9IHRoaXMuc2tlbGV0b24uZHJhd09yZGVyLmluY2x1ZGVzKHNsb3QpO1xuXG5cdFx0aWYgKGNvbnRhaW5lci52aXNpYmxlKSB7XG5cdFx0XHRjb25zdCBib25lID0gc2xvdC5ib25lO1xuXG5cdFx0XHRjb250YWluZXIucG9zaXRpb24uc2V0KGJvbmUud29ybGRYLCBib25lLndvcmxkWSk7XG5cblx0XHRcdGNvbnRhaW5lci5zY2FsZS54ID0gYm9uZS5nZXRXb3JsZFNjYWxlWCgpO1xuXHRcdFx0Y29udGFpbmVyLnNjYWxlLnkgPSBib25lLmdldFdvcmxkU2NhbGVZKCk7XG5cblx0XHRcdGNvbnRhaW5lci5yb3RhdGlvbiA9IGJvbmUuZ2V0V29ybGRSb3RhdGlvblgoKSAqIERFR19UT19SQUQ7XG5cblx0XHRcdGNvbnRhaW5lci5hbHBoYSA9IHRoaXMuc2tlbGV0b24uY29sb3IuYSAqIHNsb3QuY29sb3IuYTtcblx0XHR9XG5cdH1cblxuXHQvKiogQGludGVybmFsICovXG5cdF9nZXRDYWNoZWREYXRhIChzbG90OiBTbG90LCBhdHRhY2htZW50OiBSZWdpb25BdHRhY2htZW50IHwgTWVzaEF0dGFjaG1lbnQpOiBBdHRhY2htZW50Q2FjaGVEYXRhIHtcblx0XHRyZXR1cm4gdGhpcy5hdHRhY2htZW50Q2FjaGVEYXRhW3Nsb3QuZGF0YS5pbmRleF1bYXR0YWNobWVudC5uYW1lXSB8fCB0aGlzLmluaXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbml0Q2FjaGVkRGF0YSAoc2xvdDogU2xvdCwgYXR0YWNobWVudDogUmVnaW9uQXR0YWNobWVudCB8IE1lc2hBdHRhY2htZW50KTogQXR0YWNobWVudENhY2hlRGF0YSB7XG5cdFx0bGV0IHZlcnRpY2VzOiBGbG9hdDMyQXJyYXk7XG5cblx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcblx0XHRcdHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSg4KTtcblxuXHRcdFx0dGhpcy5hdHRhY2htZW50Q2FjaGVEYXRhW3Nsb3QuZGF0YS5pbmRleF1bYXR0YWNobWVudC5uYW1lXSA9IHtcblx0XHRcdFx0aWQ6IGAke3Nsb3QuZGF0YS5pbmRleH0tJHthdHRhY2htZW50Lm5hbWV9YCxcblx0XHRcdFx0dmVydGljZXMsXG5cdFx0XHRcdGNsaXBwZWQ6IGZhbHNlLFxuXHRcdFx0XHRpbmRpY2VzOiBbMCwgMSwgMiwgMCwgMiwgM10sXG5cdFx0XHRcdHV2czogbmV3IEZsb2F0MzJBcnJheShhdHRhY2htZW50LnV2cy5sZW5ndGgpLFxuXHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKDEsIDEsIDEsIDEpLFxuXHRcdFx0XHRkYXJrQ29sb3I6IG5ldyBDb2xvcigwLCAwLCAwLCAwKSxcblx0XHRcdFx0ZGFya1RpbnQ6IHRoaXMuZGFya1RpbnQsXG5cdFx0XHRcdHNraXBSZW5kZXI6IGZhbHNlLFxuXHRcdFx0XHR0ZXh0dXJlOiBhdHRhY2htZW50LnJlZ2lvbj8udGV4dHVyZS50ZXh0dXJlLFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoYXR0YWNobWVudC53b3JsZFZlcnRpY2VzTGVuZ3RoKTtcblxuXHRcdFx0dGhpcy5hdHRhY2htZW50Q2FjaGVEYXRhW3Nsb3QuZGF0YS5pbmRleF1bYXR0YWNobWVudC5uYW1lXSA9IHtcblx0XHRcdFx0aWQ6IGAke3Nsb3QuZGF0YS5pbmRleH0tJHthdHRhY2htZW50Lm5hbWV9YCxcblx0XHRcdFx0dmVydGljZXMsXG5cdFx0XHRcdGNsaXBwZWQ6IGZhbHNlLFxuXHRcdFx0XHRpbmRpY2VzOiBhdHRhY2htZW50LnRyaWFuZ2xlcyxcblx0XHRcdFx0dXZzOiBuZXcgRmxvYXQzMkFycmF5KGF0dGFjaG1lbnQudXZzLmxlbmd0aCksXG5cdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoMSwgMSwgMSwgMSksXG5cdFx0XHRcdGRhcmtDb2xvcjogbmV3IENvbG9yKDAsIDAsIDAsIDApLFxuXHRcdFx0XHRkYXJrVGludDogdGhpcy5kYXJrVGludCxcblx0XHRcdFx0c2tpcFJlbmRlcjogZmFsc2UsXG5cdFx0XHRcdHRleHR1cmU6IGF0dGFjaG1lbnQucmVnaW9uPy50ZXh0dXJlLnRleHR1cmUsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmF0dGFjaG1lbnRDYWNoZURhdGFbc2xvdC5kYXRhLmluZGV4XVthdHRhY2htZW50Lm5hbWVdO1xuXHR9XG5cblx0cHJvdGVjdGVkIG9uVmlld1VwZGF0ZSAoKSB7XG5cdFx0Ly8gaW5jcmVtZW50IGZyb20gdGhlIDEydGggYml0IVxuXHRcdHRoaXMuX2RpZENoYW5nZUlkICs9IDEgPDwgMTI7XG5cblx0XHR0aGlzLl9ib3VuZHNEaXJ0eSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5kaWRWaWV3VXBkYXRlKSByZXR1cm47XG5cdFx0dGhpcy5kaWRWaWV3VXBkYXRlID0gdHJ1ZTtcblxuXHRcdGNvbnN0IHJlbmRlckdyb3VwID0gdGhpcy5yZW5kZXJHcm91cCB8fCB0aGlzLnBhcmVudFJlbmRlckdyb3VwO1xuXG5cdFx0aWYgKHJlbmRlckdyb3VwKSB7XG5cdFx0XHRyZW5kZXJHcm91cC5vbkNoaWxkVmlld1VwZGF0ZSh0aGlzKTtcblx0XHR9XG5cblx0XHR0aGlzLmRlYnVnPy5yZW5kZXJEZWJ1Zyh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBdHRhY2hlcyBhIFBpeGlKUyBjb250YWluZXIgdG8gYSBzcGVjaWZpZWQgc2xvdC4gVGhpcyB3aWxsIG1hcCB0aGUgd29ybGQgdHJhbnNmb3JtIG9mIHRoZSBzbG90cyBib25lXG5cdCAqIHRvIHRoZSBhdHRhY2hlZCBjb250YWluZXIuIEEgY29udGFpbmVyIGNhbiBvbmx5IGJlIGF0dGFjaGVkIHRvIG9uZSBzbG90IGF0IGEgdGltZS5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRhaW5lciAtIFRoZSBjb250YWluZXIgdG8gYXR0YWNoIHRvIHRoZSBzbG90XG5cdCAqIEBwYXJhbSBzbG90UmVmIC0gVGhlIHNsb3QgaWQgb3IgIHNsb3QgdG8gYXR0YWNoIHRvXG5cdCAqL1xuXHRwdWJsaWMgYWRkU2xvdE9iamVjdCAoc2xvdDogbnVtYmVyIHwgc3RyaW5nIHwgU2xvdCwgY29udGFpbmVyOiBDb250YWluZXIpIHtcblx0XHRzbG90ID0gdGhpcy5nZXRTbG90RnJvbVJlZihzbG90KTtcblxuXHRcdC8vIG5lZWQgdG8gY2hlY2sgaW4gb24gdGhlIGNvbnRhaW5lciB0b28uLi5cblx0XHRmb3IgKGNvbnN0IGkgaW4gdGhpcy5fc2xvdHNPYmplY3QpIHtcblx0XHRcdGlmICh0aGlzLl9zbG90c09iamVjdFtpXT8uY29udGFpbmVyID09PSBjb250YWluZXIpIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVTbG90T2JqZWN0KHRoaXMuX3Nsb3RzT2JqZWN0W2ldLnNsb3QpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMucmVtb3ZlU2xvdE9iamVjdChzbG90KTtcblxuXHRcdGNvbnRhaW5lci5pbmNsdWRlSW5CdWlsZCA9IGZhbHNlO1xuXG5cdFx0Ly8gVE9ETyBvbmx5IGFkZCBvbmNlPz9cblx0XHR0aGlzLmFkZENoaWxkKGNvbnRhaW5lcik7XG5cblx0XHRjb25zdCBzbG90T2JqZWN0ID0geyBjb250YWluZXIsIHNsb3QgfTtcblx0XHR0aGlzLl9zbG90c09iamVjdFtzbG90LmRhdGEubmFtZV0gPSBzbG90T2JqZWN0O1xuXG5cdFx0dGhpcy51cGRhdGVTbG90T2JqZWN0KHNsb3RPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBQaXhpSlMgY29udGFpbmVyIGZyb20gdGhlIHNsb3QgaXQgaXMgYXR0YWNoZWQgdG8uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250YWluZXIgLSBUaGUgY29udGFpbmVyIHRvIGRldGFjaCBmcm9tIHRoZSBzbG90XG5cdCAqIEBwYXJhbSBzbG90T3JDb250YWluZXIgLSBUaGUgY29udGFpbmVyLCBzbG90IGlkIG9yIHNsb3QgdG8gZGV0YWNoIGZyb21cblx0ICovXG5cdHB1YmxpYyByZW1vdmVTbG90T2JqZWN0IChzbG90T3JDb250YWluZXI6IG51bWJlciB8IHN0cmluZyB8IFNsb3QgfCBDb250YWluZXIpIHtcblx0XHRsZXQgY29udGFpbmVyVG9SZW1vdmU6IENvbnRhaW5lciB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChzbG90T3JDb250YWluZXIgaW5zdGFuY2VvZiBDb250YWluZXIpIHtcblx0XHRcdGZvciAoY29uc3QgaSBpbiB0aGlzLl9zbG90c09iamVjdCkge1xuXHRcdFx0XHRpZiAodGhpcy5fc2xvdHNPYmplY3RbaV0/LmNvbnRhaW5lciA9PT0gc2xvdE9yQ29udGFpbmVyKSB7XG5cdFx0XHRcdFx0dGhpcy5fc2xvdHNPYmplY3RbaV0gPSBudWxsO1xuXG5cdFx0XHRcdFx0Y29udGFpbmVyVG9SZW1vdmUgPSBzbG90T3JDb250YWluZXI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBzbG90ID0gdGhpcy5nZXRTbG90RnJvbVJlZihzbG90T3JDb250YWluZXIpO1xuXG5cdFx0XHRjb250YWluZXJUb1JlbW92ZSA9IHRoaXMuX3Nsb3RzT2JqZWN0W3Nsb3QuZGF0YS5uYW1lXT8uY29udGFpbmVyO1xuXHRcdFx0dGhpcy5fc2xvdHNPYmplY3Rbc2xvdC5kYXRhLm5hbWVdID0gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoY29udGFpbmVyVG9SZW1vdmUpIHtcblx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQoY29udGFpbmVyVG9SZW1vdmUpO1xuXG5cdFx0XHRjb250YWluZXJUb1JlbW92ZS5pbmNsdWRlSW5CdWlsZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjb250YWluZXIgYXR0YWNoZWQgdG8gYSBzbG90LCBvciB1bmRlZmluZWQgaWYgbm8gY29udGFpbmVyIGlzIGF0dGFjaGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2xvdFJlZiAtIFRoZSBzbG90IGlkIG9yIHNsb3QgdG8gZ2V0IHRoZSBhdHRhY2htZW50IGZyb21cblx0ICogQHJldHVybnMgLSBUaGUgY29udGFpbmVyIGF0dGFjaGVkIHRvIHRoZSBzbG90XG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2xvdE9iamVjdCAoc2xvdDogbnVtYmVyIHwgc3RyaW5nIHwgU2xvdCkge1xuXHRcdHNsb3QgPSB0aGlzLmdldFNsb3RGcm9tUmVmKHNsb3QpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Nsb3RzT2JqZWN0W3Nsb3QuZGF0YS5uYW1lXT8uY29udGFpbmVyO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVCb3VuZHMgKCkge1xuXHRcdHRoaXMuX2JvdW5kc0RpcnR5ID0gZmFsc2U7XG5cblx0XHR0aGlzLnNrZWxldG9uQm91bmRzIHx8PSBuZXcgU2tlbGV0b25Cb3VuZHMoKTtcblxuXHRcdGNvbnN0IHNrZWxldG9uQm91bmRzID0gdGhpcy5za2VsZXRvbkJvdW5kcztcblxuXHRcdHNrZWxldG9uQm91bmRzLnVwZGF0ZSh0aGlzLnNrZWxldG9uLCB0cnVlKTtcblxuXHRcdGlmIChza2VsZXRvbkJvdW5kcy5taW5YID09PSBJbmZpbml0eSkge1xuXHRcdFx0aWYgKHRoaXMuaGFzTmV2ZXJVcGRhdGVkKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUFuZEFwcGx5U3RhdGUoMCk7XG5cdFx0XHRcdHRoaXMuX2JvdW5kc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl92YWxpZGF0ZUFuZFRyYW5zZm9ybUF0dGFjaG1lbnRzKCk7XG5cblx0XHRcdGNvbnN0IGRyYXdPcmRlciA9IHRoaXMuc2tlbGV0b24uZHJhd09yZGVyO1xuXHRcdFx0Y29uc3QgYm91bmRzID0gdGhpcy5fYm91bmRzO1xuXG5cdFx0XHRib3VuZHMuY2xlYXIoKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkcmF3T3JkZXIubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3Qgc2xvdCA9IGRyYXdPcmRlcltpXTtcblxuXHRcdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdFx0aWYgKGF0dGFjaG1lbnQgJiYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50IHx8IGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCkpIHtcblx0XHRcdFx0XHRjb25zdCBjYWNoZURhdGEgPSB0aGlzLl9nZXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpO1xuXG5cdFx0XHRcdFx0Ym91bmRzLmFkZFZlcnRleERhdGEoY2FjaGVEYXRhLnZlcnRpY2VzLCAwLCBjYWNoZURhdGEudmVydGljZXMubGVuZ3RoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuX2JvdW5kcy5taW5YID0gc2tlbGV0b25Cb3VuZHMubWluWDtcblx0XHRcdHRoaXMuX2JvdW5kcy5taW5ZID0gc2tlbGV0b25Cb3VuZHMubWluWTtcblx0XHRcdHRoaXMuX2JvdW5kcy5tYXhYID0gc2tlbGV0b25Cb3VuZHMubWF4WDtcblx0XHRcdHRoaXMuX2JvdW5kcy5tYXhZID0gc2tlbGV0b25Cb3VuZHMubWF4WTtcblx0XHR9XG5cdH1cblxuXHQvKiogQGludGVybmFsICovXG5cdGFkZEJvdW5kcyAoYm91bmRzOiBCb3VuZHMpIHtcblx0XHRib3VuZHMuYWRkQm91bmRzKHRoaXMuYm91bmRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGlzIHNwcml0ZSByZW5kZXJhYmxlIGFuZCBvcHRpb25hbGx5IGl0cyB0ZXh0dXJlLlxuXHQgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgcGFyYW1ldGVyLiBBIGJvb2xlYW4gd2lsbCBhY3QgYXMgaWYgYWxsIG9wdGlvbnNcblx0ICogIGhhdmUgYmVlbiBzZXQgdG8gdGhhdCB2YWx1ZVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRleHR1cmU9ZmFsc2VdIC0gU2hvdWxkIGl0IGRlc3Ryb3kgdGhlIGN1cnJlbnQgdGV4dHVyZSBvZiB0aGUgcmVuZGVyYWJsZSBhcyB3ZWxsXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudGV4dHVyZVNvdXJjZT1mYWxzZV0gLSBTaG91bGQgaXQgZGVzdHJveSB0aGUgdGV4dHVyZVNvdXJjZSBvZiB0aGUgcmVuZGVyYWJsZSBhcyB3ZWxsXG5cdCAqL1xuXHRwdWJsaWMgb3ZlcnJpZGUgZGVzdHJveSAob3B0aW9uczogRGVzdHJveU9wdGlvbnMgPSBmYWxzZSkge1xuXHRcdHN1cGVyLmRlc3Ryb3kob3B0aW9ucyk7XG5cblx0XHRUaWNrZXIuc2hhcmVkLnJlbW92ZSh0aGlzLmludGVybmFsVXBkYXRlLCB0aGlzKTtcblx0XHR0aGlzLnN0YXRlLmNsZWFyTGlzdGVuZXJzKCk7XG5cdFx0dGhpcy5kZWJ1ZyA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLnNrZWxldG9uID0gbnVsbCBhcyBhbnk7XG5cdFx0dGhpcy5zdGF0ZSA9IG51bGwgYXMgYW55O1xuXHRcdCh0aGlzLl9zbG90c09iamVjdCBhcyBhbnkpID0gbnVsbDtcblx0XHR0aGlzLl9sYXN0QXR0YWNobWVudHMubGVuZ3RoID0gMDtcblx0XHR0aGlzLmF0dGFjaG1lbnRDYWNoZURhdGEgPSBudWxsIGFzIGFueTtcblx0fVxuXG5cdC8qKiBDb252ZXJ0cyBhIHBvaW50IGZyb20gdGhlIHNrZWxldG9uIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBQaXhpIHdvcmxkIGNvb3JkaW5hdGUgc3lzdGVtLiAqL1xuXHRwdWJsaWMgc2tlbGV0b25Ub1BpeGlXb3JsZENvb3JkaW5hdGVzIChwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG5cdFx0dGhpcy53b3JsZFRyYW5zZm9ybS5hcHBseShwb2ludCwgcG9pbnQpO1xuXHR9XG5cblx0LyoqIENvbnZlcnRzIGEgcG9pbnQgZnJvbSB0aGUgUGl4aSB3b3JsZCBjb29yZGluYXRlIHN5c3RlbSB0byB0aGUgc2tlbGV0b24gY29vcmRpbmF0ZSBzeXN0ZW0uICovXG5cdHB1YmxpYyBwaXhpV29ybGRDb29yZGluYXRlc1RvU2tlbGV0b24gKHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcblx0XHR0aGlzLndvcmxkVHJhbnNmb3JtLmFwcGx5SW52ZXJzZShwb2ludCwgcG9pbnQpO1xuXHR9XG5cblx0LyoqIENvbnZlcnRzIGEgcG9pbnQgZnJvbSB0aGUgUGl4aSB3b3JsZCBjb29yZGluYXRlIHN5c3RlbSB0byB0aGUgYm9uZSdzIGxvY2FsIGNvb3JkaW5hdGUgc3lzdGVtLiAqL1xuXHRwdWJsaWMgcGl4aVdvcmxkQ29vcmRpbmF0ZXNUb0JvbmUgKHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sIGJvbmU6IEJvbmUpIHtcblx0XHR0aGlzLnBpeGlXb3JsZENvb3JkaW5hdGVzVG9Ta2VsZXRvbihwb2ludCk7XG5cdFx0aWYgKGJvbmUucGFyZW50KSB7XG5cdFx0XHRib25lLnBhcmVudC53b3JsZFRvTG9jYWwocG9pbnQgYXMgVmVjdG9yMik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ym9uZS53b3JsZFRvTG9jYWwocG9pbnQgYXMgVmVjdG9yMik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVzZSB0aGlzIG1ldGhvZCB0byBpbnN0YW50aWF0ZSBhIFNwaW5lIGdhbWUgb2JqZWN0LlxuXHQgKiBCZWZvcmUgaW5zdGFudGlhdGluZyBhIFNwaW5lIGdhbWUgb2JqZWN0LCB0aGUgc2tlbGV0b24gKGAuc2tlbGAgb3IgYC5qc29uYCkgYW5kIHRoZSBhdGxhcyB0ZXh0IGZpbGVzIG11c3QgYmUgbG9hZGVkIGludG8gdGhlIEFzc2V0cy4gRm9yIGV4YW1wbGU6XG5cdCAqIGBgYFxuXHQgKiBQSVhJLkFzc2V0cy5hZGQoXCJzYWNrRGF0YVwiLCBcIi4vYXNzZXRzL3NhY2stcHJvLnNrZWxcIik7XG5cdCAqIFBJWEkuQXNzZXRzLmFkZChcInNhY2tBdGxhc1wiLCBcIi4vYXNzZXRzL3NhY2stcG1hLmF0bGFzXCIpO1xuXHQgKiBhd2FpdCBQSVhJLkFzc2V0cy5sb2FkKFtcInNhY2tEYXRhXCIsIFwic2Fja0F0bGFzXCJdKTtcblx0ICogYGBgXG5cdCAqIE9uY2UgYSBTcGluZSBnYW1lIG9iamVjdCBpcyBjcmVhdGVkLCBpdHMgc2tlbGV0b24gZGF0YSBpcyBjYWNoZWQgaW50byB7QGxpbmsgQ2FjaGV9IHVzaW5nIHRoZSBrZXk6XG5cdCAqIGAke3NrZWxldG9uQXNzZXROYW1lfS0ke2F0bGFzQXNzZXROYW1lfS0ke29wdGlvbnM/LnNjYWxlID8/IDF9YFxuXHQgKlxuXHQgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBTcGluZSBnYW1lIG9iamVjdC4gU2VlIHtAbGluayBTcGluZUZyb21PcHRpb25zfVxuXHQgKiBAcmV0dXJucyB7U3BpbmV9IFRoZSBTcGluZSBnYW1lIG9iamVjdCBpbnN0YW50aWF0ZWRcblx0ICovXG5cdHN0YXRpYyBmcm9tICh7IHNrZWxldG9uLCBhdGxhcywgc2NhbGUgPSAxLCBkYXJrVGludCwgYXV0b1VwZGF0ZSA9IHRydWUgfTogU3BpbmVGcm9tT3B0aW9ucykge1xuXHRcdGNvbnN0IGNhY2hlS2V5ID0gYCR7c2tlbGV0b259LSR7YXRsYXN9LSR7c2NhbGV9YDtcblxuXHRcdGlmIChDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFNwaW5lKENhY2hlLmdldDxTa2VsZXRvbkRhdGE+KGNhY2hlS2V5KSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2tlbGV0b25Bc3NldCA9IEFzc2V0cy5nZXQ8YW55IHwgVWludDhBcnJheT4oc2tlbGV0b24pO1xuXG5cdFx0Y29uc3QgYXRsYXNBc3NldCA9IEFzc2V0cy5nZXQ8VGV4dHVyZUF0bGFzPihhdGxhcyk7XG5cdFx0Y29uc3QgYXR0YWNobWVudExvYWRlciA9IG5ldyBBdGxhc0F0dGFjaG1lbnRMb2FkZXIoYXRsYXNBc3NldCk7XG5cdFx0Y29uc3QgcGFyc2VyID0gc2tlbGV0b25Bc3NldCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcblx0XHRcdD8gbmV3IFNrZWxldG9uQmluYXJ5KGF0dGFjaG1lbnRMb2FkZXIpXG5cdFx0XHQ6IG5ldyBTa2VsZXRvbkpzb24oYXR0YWNobWVudExvYWRlcik7XG5cblx0XHRwYXJzZXIuc2NhbGUgPSBzY2FsZTtcblx0XHRjb25zdCBza2VsZXRvbkRhdGEgPSBwYXJzZXIucmVhZFNrZWxldG9uRGF0YShza2VsZXRvbkFzc2V0KTtcblxuXHRcdENhY2hlLnNldChjYWNoZUtleSwgc2tlbGV0b25EYXRhKTtcblxuXHRcdHJldHVybiBuZXcgU3BpbmUoe1xuXHRcdFx0c2tlbGV0b25EYXRhLFxuXHRcdFx0ZGFya1RpbnQsXG5cdFx0XHRhdXRvVXBkYXRlLFxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|
package/dist/SpinePipe.d.ts
CHANGED
|
@@ -36,10 +36,13 @@ export declare class SpinePipe implements RenderPipe<Spine> {
|
|
|
36
36
|
};
|
|
37
37
|
renderer: Renderer;
|
|
38
38
|
private gpuSpineData;
|
|
39
|
+
private readonly _destroyRenderableBound;
|
|
39
40
|
constructor(renderer: Renderer);
|
|
40
41
|
validateRenderable(spine: Spine): boolean;
|
|
41
42
|
addRenderable(spine: Spine, instructionSet: InstructionSet): void;
|
|
42
43
|
updateRenderable(spine: Spine): void;
|
|
43
44
|
destroyRenderable(spine: Spine): void;
|
|
44
45
|
destroy(): void;
|
|
46
|
+
private _getSpineData;
|
|
47
|
+
private _initMeshData;
|
|
45
48
|
}
|
package/dist/SpinePipe.js
CHANGED
|
@@ -48,12 +48,13 @@ export class SpinePipe {
|
|
|
48
48
|
};
|
|
49
49
|
renderer;
|
|
50
50
|
gpuSpineData = {};
|
|
51
|
+
_destroyRenderableBound = this.destroyRenderable.bind(this);
|
|
51
52
|
constructor(renderer) {
|
|
52
53
|
this.renderer = renderer;
|
|
53
54
|
}
|
|
54
55
|
validateRenderable(spine) {
|
|
55
|
-
spine.
|
|
56
|
-
// if
|
|
56
|
+
spine._validateAndTransformAttachments();
|
|
57
|
+
// if spine attachments have changed or destroyed, we need to rebuild the batch!
|
|
57
58
|
if (spine.spineAttachmentsDirty) {
|
|
58
59
|
return true;
|
|
59
60
|
}
|
|
@@ -80,11 +81,11 @@ export class SpinePipe {
|
|
|
80
81
|
return false;
|
|
81
82
|
}
|
|
82
83
|
addRenderable(spine, instructionSet) {
|
|
83
|
-
const gpuSpine = this.
|
|
84
|
+
const gpuSpine = this._getSpineData(spine);
|
|
84
85
|
const batcher = this.renderer.renderPipes.batch;
|
|
85
86
|
const drawOrder = spine.skeleton.drawOrder;
|
|
86
87
|
const roundPixels = (this.renderer._roundPixels | spine._roundPixels);
|
|
87
|
-
spine.
|
|
88
|
+
spine._validateAndTransformAttachments();
|
|
88
89
|
for (let i = 0, n = drawOrder.length; i < n; i++) {
|
|
89
90
|
const slot = drawOrder[i];
|
|
90
91
|
const attachment = slot.getAttachment();
|
|
@@ -107,9 +108,8 @@ export class SpinePipe {
|
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
updateRenderable(spine) {
|
|
110
|
-
// we assume that spine will always change its verts size..
|
|
111
111
|
const gpuSpine = this.gpuSpineData[spine.uid];
|
|
112
|
-
spine.
|
|
112
|
+
spine._validateAndTransformAttachments();
|
|
113
113
|
const drawOrder = spine.skeleton.drawOrder;
|
|
114
114
|
for (let i = 0, n = drawOrder.length; i < n; i++) {
|
|
115
115
|
const slot = drawOrder[i];
|
|
@@ -124,13 +124,21 @@ export class SpinePipe {
|
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
destroyRenderable(spine) {
|
|
127
|
-
// TODO remove the renderable from the batcher
|
|
128
127
|
this.gpuSpineData[spine.uid] = null;
|
|
128
|
+
spine.off('destroyed', this._destroyRenderableBound);
|
|
129
129
|
}
|
|
130
130
|
destroy() {
|
|
131
131
|
this.gpuSpineData = null;
|
|
132
132
|
this.renderer = null;
|
|
133
133
|
}
|
|
134
|
+
_getSpineData(spine) {
|
|
135
|
+
return this.gpuSpineData[spine.uid] || this._initMeshData(spine);
|
|
136
|
+
}
|
|
137
|
+
_initMeshData(spine) {
|
|
138
|
+
this.gpuSpineData[spine.uid] = { slotBatches: {} };
|
|
139
|
+
spine.on('destroyed', this._destroyRenderableBound);
|
|
140
|
+
return this.gpuSpineData[spine.uid];
|
|
141
|
+
}
|
|
134
142
|
}
|
|
135
143
|
extensions.add(SpinePipe);
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVQaXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lUGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUNOLHFCQUFxQixFQUNyQixVQUFVLEVBQUUsYUFBYSxHQUl6QixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFvQixNQUFNLDhCQUE4QixDQUFDO0FBRWxHLE1BQU0saUJBQWlCLEdBQUc7SUFDekIsQ0FBQyxFQUFFLFFBQVE7SUFDWCxDQUFDLEVBQUUsS0FBSztJQUNSLENBQUMsRUFBRSxVQUFVO0lBQ2IsQ0FBQyxFQUFFLFFBQVE7Q0FDWCxDQUFDO0FBRUYsbUNBQW1DO0FBQ25DLE1BQU0sT0FBTyxTQUFTO0lBQ3JCLGNBQWM7SUFDZCxNQUFNLENBQUMsU0FBUyxHQUFHO1FBQ2xCLElBQUksRUFBRTtZQUNMLGFBQWEsQ0FBQyxVQUFVO1lBQ3hCLGFBQWEsQ0FBQyxXQUFXO1lBQ3pCLGFBQWEsQ0FBQyxXQUFXO1NBQ3pCO1FBQ0QsSUFBSSxFQUFFLE9BQU87S0FDSixDQUFDO0lBRVgsUUFBUSxDQUFXO0lBRVgsWUFBWSxHQUF3QixFQUFFLENBQUM7SUFFL0MsWUFBYSxRQUFrQjtRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0JBQWtCLENBQUUsS0FBWTtRQUMvQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEIsa0VBQWtFO1FBQ2xFLElBQUksS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBQ0Qsa0hBQWtIO2FBQzdHLElBQUksS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7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QixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRTNGLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVELGlCQUFpQixDQUFFLEtBQVk7UUFDOUIsOENBQThDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQVcsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTztRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBVyxDQUFDO0lBQzdCLENBQUM7O0FBR0YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEp1bHkgMjgsIDIwMjMuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMywgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvclxuICogb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRIRVxuICogU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7XG5cdGNvbGxlY3RBbGxSZW5kZXJhYmxlcyxcblx0ZXh0ZW5zaW9ucywgRXh0ZW5zaW9uVHlwZSxcblx0SW5zdHJ1Y3Rpb25TZXQsXG5cdHR5cGUgUmVuZGVyZXIsXG5cdHR5cGUgUmVuZGVyUGlwZSxcbn0gZnJvbSAncGl4aS5qcyc7XG5pbXBvcnQgeyBCYXRjaGFibGVTcGluZVNsb3QgfSBmcm9tICcuL0JhdGNoYWJsZVNwaW5lU2xvdCc7XG5pbXBvcnQgeyBTcGluZSB9IGZyb20gJy4vU3BpbmUnO1xuaW1wb3J0IHsgTWVzaEF0dGFjaG1lbnQsIFJlZ2lvbkF0dGFjaG1lbnQsIFNrZWxldG9uQ2xpcHBpbmcgfSBmcm9tICdAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlJztcblxuY29uc3Qgc3BpbmVCbGVuZE1vZGVNYXAgPSB7XG5cdDA6ICdub3JtYWwnLFxuXHQxOiAnYWRkJyxcblx0MjogJ211bHRpcGx5Jyxcblx0MzogJ3NjcmVlbidcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG5leHBvcnQgY2xhc3MgU3BpbmVQaXBlIGltcGxlbWVudHMgUmVuZGVyUGlwZTxTcGluZT4ge1xuXHQvKiogQGlnbm9yZSAqL1xuXHRzdGF0aWMgZXh0ZW5zaW9uID0ge1xuXHRcdHR5cGU6IFtcblx0XHRcdEV4dGVuc2lvblR5cGUuV2ViR0xQaXBlcyxcblx0XHRcdEV4dGVuc2lvblR5cGUuV2ViR1BVUGlwZXMsXG5cdFx0XHRFeHRlbnNpb25UeXBlLkNhbnZhc1BpcGVzLFxuXHRcdF0sXG5cdFx0bmFtZTogJ3NwaW5lJyxcblx0fSBhcyBjb25zdDtcblxuXHRyZW5kZXJlcjogUmVuZGVyZXI7XG5cblx0cHJpdmF0ZSBncHVTcGluZURhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAocmVuZGVyZXI6IFJlbmRlcmVyKSB7XG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXHR9XG5cblx0dmFsaWRhdGVSZW5kZXJhYmxlIChzcGluZTogU3BpbmUpOiBib29sZWFuIHtcblx0XHRzcGluZS5fYXBwbHlTdGF0ZSgpO1xuXG5cdFx0Ly8gaWYgcGluZSBhdHRhY2htZW50cyBoYXZlIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVidWlsZCB0aGUgYmF0Y2ghXG5cdFx0aWYgKHNwaW5lLnNwaW5lQXR0YWNobWVudHNEaXJ0eSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdC8vIGlmIHRoZSB0ZXh0dXJlcyBoYXZlIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVidWlsZCB0aGUgYmF0Y2gsIGJ1dCBvbmx5IGlmIHRoZSB0ZXh0dXJlIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBiYXRjaFxuXHRcdGVsc2UgaWYgKHNwaW5lLnNwaW5lVGV4dHVyZXNEaXJ0eSkge1xuXHRcdFx0Ly8gbG9vcCB0aHJvdWdoIGFuZCBzZWUgaWYgdGhlIHRleHR1cmVzIGhhdmUgY2hhbmdlZC4uXG5cdFx0XHRjb25zdCBkcmF3T3JkZXIgPSBzcGluZS5za2VsZXRvbi5kcmF3T3JkZXI7XG5cdFx0XHRjb25zdCBncHVTcGluZSA9IHRoaXMuZ3B1U3BpbmVEYXRhW3NwaW5lLnVpZF07XG5cblx0XHRcdGZvciAobGV0IGkgPSAwLCBuID0gZHJhd09yZGVyLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0XHRjb25zdCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdFx0aWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50IHx8IGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGNhY2hlRGF0YSA9IHNwaW5lLl9nZXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRcdGNvbnN0IGJhdGNoYWJsZVNwaW5lU2xvdCA9IGdwdVNwaW5lLnNsb3RCYXRjaGVzW2NhY2hlRGF0YS5pZF07XG5cblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gY2FjaGVEYXRhLnRleHR1cmU7XG5cblx0XHRcdFx0XHRpZiAodGV4dHVyZSAhPT0gYmF0Y2hhYmxlU3BpbmVTbG90LnRleHR1cmUpIHtcblx0XHRcdFx0XHRcdGlmICghYmF0Y2hhYmxlU3BpbmVTbG90Ll9iYXRjaGVyLmNoZWNrQW5kVXBkYXRlVGV4dHVyZShiYXRjaGFibGVTcGluZVNsb3QsIHRleHR1cmUpKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGFkZFJlbmRlcmFibGUgKHNwaW5lOiBTcGluZSwgaW5zdHJ1Y3Rpb25TZXQ6IEluc3RydWN0aW9uU2V0KSB7XG5cdFx0Y29uc3QgZ3B1U3BpbmUgPSB0aGlzLmdwdVNwaW5lRGF0YVtzcGluZS51aWRdIHx8PSB7IHNsb3RCYXRjaGVzOiB7IH0gfTtcblxuXHRcdGNvbnN0IGJhdGNoZXIgPSB0aGlzLnJlbmRlcmVyLnJlbmRlclBpcGVzLmJhdGNoO1xuXG5cdFx0Y29uc3QgZHJhd09yZGVyID0gc3BpbmUuc2tlbGV0b24uZHJhd09yZGVyO1xuXG5cdFx0Y29uc3Qgcm91bmRQaXhlbHMgPSAodGhpcy5yZW5kZXJlci5fcm91bmRQaXhlbHMgfCBzcGluZS5fcm91bmRQaXhlbHMpIGFzIDAgfCAxO1xuXG5cdFx0c3BpbmUuX2FwcGx5U3RhdGUoKTtcblxuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gZHJhd09yZGVyLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IGRyYXdPcmRlcltpXTtcblx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblx0XHRcdGNvbnN0IGJsZW5kTW9kZSA9IHNwaW5lQmxlbmRNb2RlTWFwW3Nsb3QuZGF0YS5ibGVuZE1vZGVdO1xuXG5cdFx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQgfHwgYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSB7XG5cdFx0XHRcdGNvbnN0IGNhY2hlRGF0YSA9IHNwaW5lLl9nZXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRjb25zdCBiYXRjaGFibGVTcGluZVNsb3QgPSBncHVTcGluZS5zbG90QmF0Y2hlc1tjYWNoZURhdGEuaWRdIHx8PSBuZXcgQmF0Y2hhYmxlU3BpbmVTbG90KCk7XG5cblx0XHRcdFx0YmF0Y2hhYmxlU3BpbmVTbG90LnNldERhdGEoXG5cdFx0XHRcdFx0c3BpbmUsXG5cdFx0XHRcdFx0Y2FjaGVEYXRhLFxuXHRcdFx0XHRcdGJsZW5kTW9kZSxcblx0XHRcdFx0XHRyb3VuZFBpeGVsc1xuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICghY2FjaGVEYXRhLnNraXBSZW5kZXIpIHtcblx0XHRcdFx0XHRiYXRjaGVyLmFkZFRvQmF0Y2goYmF0Y2hhYmxlU3BpbmVTbG90LCBpbnN0cnVjdGlvblNldCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29udGFpbmVyQXR0YWNobWVudCA9IHNwaW5lLl9zbG90c09iamVjdFtzbG90LmRhdGEubmFtZV07XG5cblx0XHRcdGlmIChjb250YWluZXJBdHRhY2htZW50KSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lckF0dGFjaG1lbnQuY29udGFpbmVyO1xuXG5cdFx0XHRcdGNvbnRhaW5lci5pbmNsdWRlSW5CdWlsZCA9IHRydWU7XG5cdFx0XHRcdGNvbGxlY3RBbGxSZW5kZXJhYmxlcyhjb250YWluZXIsIGluc3RydWN0aW9uU2V0LCB0aGlzLnJlbmRlcmVyKTtcblx0XHRcdFx0Y29udGFpbmVyLmluY2x1ZGVJbkJ1aWxkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dXBkYXRlUmVuZGVyYWJsZSAoc3BpbmU6IFNwaW5lKSB7XG5cdFx0Ly8gd2UgYXNzdW1lIHRoYXQgc3BpbmUgd2lsbCBhbHdheXMgY2hhbmdlIGl0cyB2ZXJ0cyBzaXplLi5cblx0XHRjb25zdCBncHVTcGluZSA9IHRoaXMuZ3B1U3BpbmVEYXRhW3NwaW5lLnVpZF07XG5cblx0XHRzcGluZS5fYXBwbHlTdGF0ZSgpO1xuXG5cdFx0Y29uc3QgZHJhd09yZGVyID0gc3BpbmUuc2tlbGV0b24uZHJhd09yZGVyO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBkcmF3T3JkZXIubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xuXG5cdFx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQgfHwgYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSB7XG5cdFx0XHRcdGNvbnN0IGNhY2hlRGF0YSA9IHNwaW5lLl9nZXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpO1xuXG5cdFx0XHRcdGlmICghY2FjaGVEYXRhLnNraXBSZW5kZXIpIHtcblx0XHRcdFx0XHRjb25zdCBiYXRjaGFibGVTcGluZVNsb3QgPSBncHVTcGluZS5zbG90QmF0Y2hlc1tzcGluZS5fZ2V0Q2FjaGVkRGF0YShzbG90LCBhdHRhY2htZW50KS5pZF07XG5cblx0XHRcdFx0XHRiYXRjaGFibGVTcGluZVNsb3QuX2JhdGNoZXI/LnVwZGF0ZUVsZW1lbnQoYmF0Y2hhYmxlU3BpbmVTbG90KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGRlc3Ryb3lSZW5kZXJhYmxlIChzcGluZTogU3BpbmUpIHtcblx0XHQvLyBUT0RPIHJlbW92ZSB0aGUgcmVuZGVyYWJsZSBmcm9tIHRoZSBiYXRjaGVyXG5cdFx0dGhpcy5ncHVTcGluZURhdGFbc3BpbmUudWlkXSA9IG51bGwgYXMgYW55O1xuXHR9XG5cblx0ZGVzdHJveSAoKSB7XG5cdFx0dGhpcy5ncHVTcGluZURhdGEgPSBudWxsIGFzIGFueTtcblx0XHR0aGlzLnJlbmRlcmVyID0gbnVsbCBhcyBhbnk7XG5cdH1cbn1cblxuZXh0ZW5zaW9ucy5hZGQoU3BpbmVQaXBlKTtcbiJdfQ==
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVQaXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lUGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUNOLHFCQUFxQixFQUNyQixVQUFVLEVBQUUsYUFBYSxHQU16QixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFaEYsTUFBTSxpQkFBaUIsR0FBZ0M7SUFDdEQsQ0FBQyxFQUFFLFFBQVE7SUFDWCxDQUFDLEVBQUUsS0FBSztJQUNSLENBQUMsRUFBRSxVQUFVO0lBQ2IsQ0FBQyxFQUFFLFFBQVE7Q0FDWCxDQUFDO0FBSUYsbUNBQW1DO0FBQ25DLE1BQU0sT0FBTyxTQUFTO0lBQ3JCLGNBQWM7SUFDZCxNQUFNLENBQUMsU0FBUyxHQUFHO1FBQ2xCLElBQUksRUFBRTtZQUNMLGFBQWEsQ0FBQyxVQUFVO1lBQ3hCLGFBQWEsQ0FBQyxXQUFXO1lBQ3pCLGFBQWEsQ0FBQyxXQUFXO1NBQ3pCO1FBQ0QsSUFBSSxFQUFFLE9BQU87S0FDSixDQUFDO0lBRVgsUUFBUSxDQUFXO0lBRVgsWUFBWSxHQUF3QyxFQUFFLENBQUM7SUFDOUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQW9DLENBQUM7SUFFaEgsWUFBYSxRQUFrQjtRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0JBQWtCLENBQUUsS0FBWTtRQUMvQixLQUFLLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUV6QyxnRkFBZ0Y7UUFDaEYsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElB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KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgSnVseSAyOCwgMjAyMy4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDIzLCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yXG4gKiBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhFXG4gKiBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHtcblx0Y29sbGVjdEFsbFJlbmRlcmFibGVzLFxuXHRleHRlbnNpb25zLCBFeHRlbnNpb25UeXBlLFxuXHRJbnN0cnVjdGlvblNldCxcblx0dHlwZSBCTEVORF9NT0RFUyxcblx0dHlwZSBDb250YWluZXIsXG5cdHR5cGUgUmVuZGVyZXIsXG5cdHR5cGUgUmVuZGVyUGlwZSxcbn0gZnJvbSAncGl4aS5qcyc7XG5pbXBvcnQgeyBCYXRjaGFibGVTcGluZVNsb3QgfSBmcm9tICcuL0JhdGNoYWJsZVNwaW5lU2xvdCc7XG5pbXBvcnQgeyBTcGluZSB9IGZyb20gJy4vU3BpbmUnO1xuaW1wb3J0IHsgTWVzaEF0dGFjaG1lbnQsIFJlZ2lvbkF0dGFjaG1lbnQgfSBmcm9tICdAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlJztcblxuY29uc3Qgc3BpbmVCbGVuZE1vZGVNYXA6IFJlY29yZDxudW1iZXIsIEJMRU5EX01PREVTPiA9IHtcblx0MDogJ25vcm1hbCcsXG5cdDE6ICdhZGQnLFxuXHQyOiAnbXVsdGlwbHknLFxuXHQzOiAnc2NyZWVuJ1xufTtcblxudHlwZSBHcHVTcGluZURhdGFFbGVtZW50ID0geyBzbG90QmF0Y2hlczogUmVjb3JkPHN0cmluZywgQmF0Y2hhYmxlU3BpbmVTbG90PiB9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuZXhwb3J0IGNsYXNzIFNwaW5lUGlwZSBpbXBsZW1lbnRzIFJlbmRlclBpcGU8U3BpbmU+IHtcblx0LyoqIEBpZ25vcmUgKi9cblx0c3RhdGljIGV4dGVuc2lvbiA9IHtcblx0XHR0eXBlOiBbXG5cdFx0XHRFeHRlbnNpb25UeXBlLldlYkdMUGlwZXMsXG5cdFx0XHRFeHRlbnNpb25UeXBlLldlYkdQVVBpcGVzLFxuXHRcdFx0RXh0ZW5zaW9uVHlwZS5DYW52YXNQaXBlcyxcblx0XHRdLFxuXHRcdG5hbWU6ICdzcGluZScsXG5cdH0gYXMgY29uc3Q7XG5cblx0cmVuZGVyZXI6IFJlbmRlcmVyO1xuXG5cdHByaXZhdGUgZ3B1U3BpbmVEYXRhOiBSZWNvcmQ8c3RyaW5nLCBHcHVTcGluZURhdGFFbGVtZW50PiA9IHt9O1xuXHRwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVuZGVyYWJsZUJvdW5kID0gdGhpcy5kZXN0cm95UmVuZGVyYWJsZS5iaW5kKHRoaXMpIGFzIChyZW5kZXJhYmxlOiBDb250YWluZXIpID0+IHZvaWQ7XG5cblx0Y29uc3RydWN0b3IgKHJlbmRlcmVyOiBSZW5kZXJlcikge1xuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblx0fVxuXG5cdHZhbGlkYXRlUmVuZGVyYWJsZSAoc3BpbmU6IFNwaW5lKTogYm9vbGVhbiB7XG5cdFx0c3BpbmUuX3ZhbGlkYXRlQW5kVHJhbnNmb3JtQXR0YWNobWVudHMoKTtcblxuXHRcdC8vIGlmIHNwaW5lIGF0dGFjaG1lbnRzIGhhdmUgY2hhbmdlZCBvciBkZXN0cm95ZWQsIHdlIG5lZWQgdG8gcmVidWlsZCB0aGUgYmF0Y2ghXG5cdFx0aWYgKHNwaW5lLnNwaW5lQXR0YWNobWVudHNEaXJ0eSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIHRleHR1cmVzIGhhdmUgY2hhbmdlZCwgd2UgbmVlZCB0byByZWJ1aWxkIHRoZSBiYXRjaCwgYnV0IG9ubHkgaWYgdGhlIHRleHR1cmUgaXMgbm90IGFscmVhZHkgaW4gdGhlIGJhdGNoXG5cdFx0ZWxzZSBpZiAoc3BpbmUuc3BpbmVUZXh0dXJlc0RpcnR5KSB7XG5cdFx0XHQvLyBsb29wIHRocm91Z2ggYW5kIHNlZSBpZiB0aGUgdGV4dHVyZXMgaGF2ZSBjaGFuZ2VkLi5cblx0XHRcdGNvbnN0IGRyYXdPcmRlciA9IHNwaW5lLnNrZWxldG9uLmRyYXdPcmRlcjtcblx0XHRcdGNvbnN0IGdwdVNwaW5lID0gdGhpcy5ncHVTcGluZURhdGFbc3BpbmUudWlkXTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBkcmF3T3JkZXIubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHNsb3QgPSBkcmF3T3JkZXJbaV07XG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblxuXHRcdFx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQgfHwgYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSB7XG5cdFx0XHRcdFx0Y29uc3QgY2FjaGVEYXRhID0gc3BpbmUuX2dldENhY2hlZERhdGEoc2xvdCwgYXR0YWNobWVudCk7XG5cdFx0XHRcdFx0Y29uc3QgYmF0Y2hhYmxlU3BpbmVTbG90ID0gZ3B1U3BpbmUuc2xvdEJhdGNoZXNbY2FjaGVEYXRhLmlkXTtcblxuXHRcdFx0XHRcdGNvbnN0IHRleHR1cmUgPSBjYWNoZURhdGEudGV4dHVyZTtcblxuXHRcdFx0XHRcdGlmICh0ZXh0dXJlICE9PSBiYXRjaGFibGVTcGluZVNsb3QudGV4dHVyZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFiYXRjaGFibGVTcGluZVNsb3QuX2JhdGNoZXIuY2hlY2tBbmRVcGRhdGVUZXh0dXJlKGJhdGNoYWJsZVNwaW5lU2xvdCwgdGV4dHVyZSkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0YWRkUmVuZGVyYWJsZSAoc3BpbmU6IFNwaW5lLCBpbnN0cnVjdGlvblNldDogSW5zdHJ1Y3Rpb25TZXQpIHtcblx0XHRjb25zdCBncHVTcGluZSA9IHRoaXMuX2dldFNwaW5lRGF0YShzcGluZSk7XG5cblx0XHRjb25zdCBiYXRjaGVyID0gdGhpcy5yZW5kZXJlci5yZW5kZXJQaXBlcy5iYXRjaDtcblxuXHRcdGNvbnN0IGRyYXdPcmRlciA9IHNwaW5lLnNrZWxldG9uLmRyYXdPcmRlcjtcblxuXHRcdGNvbnN0IHJvdW5kUGl4ZWxzID0gKHRoaXMucmVuZGVyZXIuX3JvdW5kUGl4ZWxzIHwgc3BpbmUuX3JvdW5kUGl4ZWxzKSBhcyAwIHwgMTtcblxuXHRcdHNwaW5lLl92YWxpZGF0ZUFuZFRyYW5zZm9ybUF0dGFjaG1lbnRzKCk7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IHNsb3QgPSBkcmF3T3JkZXJbaV07XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cdFx0XHRjb25zdCBibGVuZE1vZGUgPSBzcGluZUJsZW5kTW9kZU1hcFtzbG90LmRhdGEuYmxlbmRNb2RlXTtcblxuXHRcdFx0aWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50IHx8IGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCkge1xuXHRcdFx0XHRjb25zdCBjYWNoZURhdGEgPSBzcGluZS5fZ2V0Q2FjaGVkRGF0YShzbG90LCBhdHRhY2htZW50KTtcblx0XHRcdFx0Y29uc3QgYmF0Y2hhYmxlU3BpbmVTbG90ID0gZ3B1U3BpbmUuc2xvdEJhdGNoZXNbY2FjaGVEYXRhLmlkXSB8fD0gbmV3IEJhdGNoYWJsZVNwaW5lU2xvdCgpO1xuXG5cdFx0XHRcdGJhdGNoYWJsZVNwaW5lU2xvdC5zZXREYXRhKFxuXHRcdFx0XHRcdHNwaW5lLFxuXHRcdFx0XHRcdGNhY2hlRGF0YSxcblx0XHRcdFx0XHRibGVuZE1vZGUsXG5cdFx0XHRcdFx0cm91bmRQaXhlbHNcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoIWNhY2hlRGF0YS5za2lwUmVuZGVyKSB7XG5cdFx0XHRcdFx0YmF0Y2hlci5hZGRUb0JhdGNoKGJhdGNoYWJsZVNwaW5lU2xvdCwgaW5zdHJ1Y3Rpb25TZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNvbnRhaW5lckF0dGFjaG1lbnQgPSBzcGluZS5fc2xvdHNPYmplY3Rbc2xvdC5kYXRhLm5hbWVdO1xuXG5cdFx0XHRpZiAoY29udGFpbmVyQXR0YWNobWVudCkge1xuXHRcdFx0XHRjb25zdCBjb250YWluZXIgPSBjb250YWluZXJBdHRhY2htZW50LmNvbnRhaW5lcjtcblxuXHRcdFx0XHRjb250YWluZXIuaW5jbHVkZUluQnVpbGQgPSB0cnVlO1xuXHRcdFx0XHRjb2xsZWN0QWxsUmVuZGVyYWJsZXMoY29udGFpbmVyLCBpbnN0cnVjdGlvblNldCwgdGhpcy5yZW5kZXJlcik7XG5cdFx0XHRcdGNvbnRhaW5lci5pbmNsdWRlSW5CdWlsZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZVJlbmRlcmFibGUgKHNwaW5lOiBTcGluZSkge1xuXHRcdGNvbnN0IGdwdVNwaW5lID0gdGhpcy5ncHVTcGluZURhdGFbc3BpbmUudWlkXTtcblxuXHRcdHNwaW5lLl92YWxpZGF0ZUFuZFRyYW5zZm9ybUF0dGFjaG1lbnRzKCk7XG5cblx0XHRjb25zdCBkcmF3T3JkZXIgPSBzcGluZS5za2VsZXRvbi5kcmF3T3JkZXI7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IHNsb3QgPSBkcmF3T3JkZXJbaV07XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCB8fCBhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0Y29uc3QgY2FjaGVEYXRhID0gc3BpbmUuX2dldENhY2hlZERhdGEoc2xvdCwgYXR0YWNobWVudCk7XG5cblx0XHRcdFx0aWYgKCFjYWNoZURhdGEuc2tpcFJlbmRlcikge1xuXHRcdFx0XHRcdGNvbnN0IGJhdGNoYWJsZVNwaW5lU2xvdCA9IGdwdVNwaW5lLnNsb3RCYXRjaGVzW3NwaW5lLl9nZXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpLmlkXTtcblxuXHRcdFx0XHRcdGJhdGNoYWJsZVNwaW5lU2xvdC5fYmF0Y2hlcj8udXBkYXRlRWxlbWVudChiYXRjaGFibGVTcGluZVNsb3QpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZGVzdHJveVJlbmRlcmFibGUgKHNwaW5lOiBTcGluZSkge1xuXHRcdHRoaXMuZ3B1U3BpbmVEYXRhW3NwaW5lLnVpZF0gPSBudWxsIGFzIGFueTtcblx0XHRzcGluZS5vZmYoJ2Rlc3Ryb3llZCcsIHRoaXMuX2Rlc3Ryb3lSZW5kZXJhYmxlQm91bmQpO1xuXHR9XG5cblx0ZGVzdHJveSAoKSB7XG5cdFx0dGhpcy5ncHVTcGluZURhdGEgPSBudWxsIGFzIGFueTtcblx0XHR0aGlzLnJlbmRlcmVyID0gbnVsbCBhcyBhbnk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRTcGluZURhdGEgKHNwaW5lOiBTcGluZSk6IEdwdVNwaW5lRGF0YUVsZW1lbnQge1xuXHRcdHJldHVybiB0aGlzLmdwdVNwaW5lRGF0YVtzcGluZS51aWRdIHx8IHRoaXMuX2luaXRNZXNoRGF0YShzcGluZSk7XG5cdH1cblxuXHRwcml2YXRlIF9pbml0TWVzaERhdGEgKHNwaW5lOiBTcGluZSk6IEdwdVNwaW5lRGF0YUVsZW1lbnQge1xuXHRcdHRoaXMuZ3B1U3BpbmVEYXRhW3NwaW5lLnVpZF0gPSB7IHNsb3RCYXRjaGVzOiB7fSB9O1xuXHRcdHNwaW5lLm9uKCdkZXN0cm95ZWQnLCB0aGlzLl9kZXN0cm95UmVuZGVyYWJsZUJvdW5kKTtcblx0XHRyZXR1cm4gdGhpcy5ncHVTcGluZURhdGFbc3BpbmUudWlkXTtcblx0fVxufVxuXG5leHRlbnNpb25zLmFkZChTcGluZVBpcGUpO1xuIl19
|