dcl-npc-toolkit
Version:
A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations.
726 lines • 109 kB
JavaScript
import { Animator, AvatarShape, engine, GltfContainer, MeshCollider, MeshRenderer, pointerEventsSystem, Transform, TriggerArea, triggerAreaEventsSystem } from '@dcl/sdk/ecs';
import { Quaternion, Vector3 } from '@dcl/sdk/math';
import { bubbles, closeBubble, createDialogBubble, openBubble } from './bubble';
import { IsFollowingPath, TrackUserFlag } from './components';
import { addDialog, closeDialog, findDialogByName, npcDialogComponent, openDialog } from './dialog';
import { faceUserSystem, handleBubbletyping, handleDialogTyping, handlePathTimes, inputListenerSystem } from './systems';
import { NPCPathType, NPCState, NPCType } from './types';
import { darkTheme, lightTheme } from './ui';
import { debugTriggers, delayedFunction, clearDelayedFunction } from './utils/utils';
import { paths } from './utils/path';
export const walkingTimers = new Map();
export const npcDataComponent = new Map();
export let NULL_NPC = 0;
export let activeNPC = NULL_NPC;
export let blankDialog = 0;
engine.addSystem(handlePathTimes);
engine.addSystem(handleDialogTyping);
engine.addSystem(handleBubbletyping);
engine.addSystem(faceUserSystem);
engine.addSystem(inputListenerSystem);
const isCooldown = new Map();
const onActivateCbs = new Map();
const onWalkAwayCbs = new Map();
const animTimers = new Map();
const pointReachedCallbacks = new Map();
const onFinishCallbacks = new Map();
export function showDebug(debug) {
if (debug) {
debugTriggers();
}
}
export function getData(npc) {
return npcDataComponent.get(npc);
}
export function create(transform, data) {
let npc = engine.addEntity();
let t = {
position: transform.position ? transform.position : Vector3.create(0, 0, 0),
rotation: transform.rotation ? transform.rotation : Quaternion.Zero(),
scale: transform.scale ? transform.scale : Vector3.One()
};
Transform.create(npc, t);
npcDataComponent.set(npc, {
introduced: false,
inCooldown: false,
coolDownDuration: data && data.coolDownDuration ? data.coolDownDuration : 5,
faceUser: data && data.faceUser ? data.faceUser : undefined,
walkingSpeed: 2,
walkingAnim: data && data.walkingAnim ? data.walkingAnim : undefined,
pathData: data.pathData ? data.pathData : undefined,
currentPathData: [],
manualStop: false,
pathIndex: 0,
state: NPCState.STANDING,
idleAnim: data && data.idleAnim ? data.idleAnim : 'Idle',
bubbleHeight: data && data.textBubble && data.bubbleHeight ? data.bubbleHeight : undefined,
bubbleSound: data.dialogSound ? data.dialogSound : undefined,
hasBubble: data && data.textBubble ? true : false,
turnSpeed: data && data.turningSpeed ? data.turningSpeed : 2,
theme: data.darkUI ? darkTheme : lightTheme,
bubbleXOffset: data.bubbleXOffset ? data.bubbleXOffset : 0,
bubbleYOffset: data.bubbleYOffset ? data.bubbleYOffset : 0,
volume: data && data.volume ? data.volume : 0.5
});
if (data && data.noUI) {
}
else if (data && data.portrait) {
addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined, typeof data.portrait === `string` ? { path: data.portrait } : data.portrait);
}
else {
addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined);
}
if (data && data.textBubble) {
createDialogBubble(npc, npcDataComponent.get(npc).bubbleHeight);
}
onActivateCbs.set(npc, (other) => {
data.onActivate(other);
});
if (data && data.hasOwnProperty('onWalkAway')) {
onWalkAwayCbs.set(npc, (other) => {
if (!data || !data.continueOnWalkAway) {
if (npcDialogComponent.has(npc)) {
npcDialogComponent.get(npc).visible = false;
}
}
else {
if (npcDialogComponent.has(npc)) {
npcDialogComponent.get(npc).visible = false;
}
}
data.onWalkAway(other);
});
}
addNPCBones(npc, data);
addClickReactions(npc, data);
addTriggerArea(npc, data);
if (data && data.pathData && data.pathData.speed) {
let npcData = npcDataComponent.get(npc);
npcData.walkingSpeed = data.pathData.speed;
}
if (data && data.coolDownDuration) {
let npcData = npcDataComponent.get(npc);
npcData.coolDownDuration = data.coolDownDuration;
}
if (data && data.pathData) {
let npcData = npcDataComponent.get(npc);
npcData.pathData.loop = true;
followPath(npc, npcData.pathData);
}
return npc;
}
export function createFromEntity(entity, data) {
const npc = entity;
const resolvedType = (data && data.type !== undefined ? data.type : NPCType.CUSTOM);
if (!Transform.has(npc)) {
console.log('createFromEntity: Provided entity is missing Transform component');
}
if (resolvedType === NPCType.CUSTOM && !GltfContainer.has(npc)) {
console.log('createFromEntity: Expected a GltfContainer on CUSTOM NPC entity');
}
npcDataComponent.set(npc, {
introduced: false,
inCooldown: false,
coolDownDuration: data && data.coolDownDuration ? data.coolDownDuration : 5,
faceUser: data && data.faceUser ? data.faceUser : undefined,
walkingSpeed: 2,
walkingAnim: data && data.walkingAnim ? data.walkingAnim : undefined,
pathData: data.pathData ? data.pathData : undefined,
currentPathData: [],
manualStop: false,
pathIndex: 0,
state: NPCState.STANDING,
idleAnim: data && data.idleAnim ? data.idleAnim : 'Idle',
bubbleHeight: data && data.textBubble && data.bubbleHeight ? data.bubbleHeight : undefined,
bubbleSound: data.dialogSound ? data.dialogSound : undefined,
hasBubble: data && data.textBubble ? true : false,
turnSpeed: data && data.turningSpeed ? data.turningSpeed : 2,
theme: data.darkUI ? darkTheme : lightTheme,
bubbleXOffset: data.bubbleXOffset ? data.bubbleXOffset : 0,
bubbleYOffset: data.bubbleYOffset ? data.bubbleYOffset : 0
});
if (data && data.noUI) {
}
else if (data && data.portrait) {
addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined, typeof data.portrait === `string` ? { path: data.portrait } : data.portrait);
}
else {
addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined);
}
if (data && data.textBubble) {
createDialogBubble(npc, npcDataComponent.get(npc).bubbleHeight);
}
onActivateCbs.set(npc, (other) => {
data.onActivate(other);
});
if (data && data.hasOwnProperty('onWalkAway')) {
onWalkAwayCbs.set(npc, (other) => {
if (!data || !data.continueOnWalkAway) {
if (npcDialogComponent.has(npc)) {
npcDialogComponent.get(npc).visible = false;
}
}
else {
if (npcDialogComponent.has(npc)) {
npcDialogComponent.get(npc).visible = false;
}
}
data.onWalkAway(other);
});
}
const dataWithType = { ...data, type: resolvedType };
if (resolvedType === NPCType.AVATAR) {
if (GltfContainer.has(npc)) {
GltfContainer.deleteFrom(npc);
}
if (!AvatarShape.has(npc)) {
AvatarShape.create(npc, {
id: 'npc',
name: dataWithType && dataWithType.name ? dataWithType.name : 'NPC',
bodyShape: dataWithType && dataWithType.bodyShape ? dataWithType.bodyShape : 'urn:decentraland:off-chain:base-avatars:BaseMale',
emotes: [],
wearables: (dataWithType.wearables && dataWithType.wearables.length > 0)
? dataWithType.wearables
: [
'urn:decentraland:off-chain:base-avatars:f_eyes_00',
'urn:decentraland:off-chain:base-avatars:f_eyebrows_00',
'urn:decentraland:off-chain:base-avatars:f_mouth_00',
'urn:decentraland:off-chain:base-avatars:comfy_sport_sandals',
'urn:decentraland:off-chain:base-avatars:soccer_pants',
'urn:decentraland:off-chain:base-avatars:elegant_sweater'
],
eyeColor: dataWithType && dataWithType.eyeColor ? dataWithType.eyeColor : undefined,
skinColor: dataWithType && dataWithType.skinColor ? dataWithType.skinColor : undefined,
hairColor: dataWithType && dataWithType.hairColor ? dataWithType.hairColor : undefined
});
}
else if (dataWithType.wearables && dataWithType.wearables.length > 0) {
const avatar = AvatarShape.getMutable(npc);
avatar.wearables = dataWithType.wearables;
if (dataWithType && dataWithType.name) {
avatar.name = dataWithType.name;
}
if (dataWithType.bodyShape)
avatar.bodyShape = dataWithType.bodyShape;
if (dataWithType.eyeColor)
avatar.eyeColor = dataWithType.eyeColor;
if (dataWithType.skinColor)
avatar.skinColor = dataWithType.skinColor;
if (dataWithType.hairColor)
avatar.hairColor = dataWithType.hairColor;
}
}
else if (resolvedType === NPCType.CUSTOM) {
seedAnimatorForExisting(npc, dataWithType);
}
addClickReactions(npc, dataWithType);
addTriggerArea(npc, dataWithType);
if (data && data.pathData && data.pathData.speed) {
let npcData = npcDataComponent.get(npc);
npcData.walkingSpeed = data.pathData.speed;
}
if (data && data.coolDownDuration) {
let npcData = npcDataComponent.get(npc);
npcData.coolDownDuration = data.coolDownDuration;
}
if (data && data.pathData) {
let npcData = npcDataComponent.get(npc);
npcData.pathData.loop = true;
followPath(npc, npcData.pathData);
}
return npc;
}
function addNPCBones(npc, data) {
const modelIsString = data && data.model && typeof data.model === `string`;
const modelAvatarData = modelIsString
? undefined
: data.model && data.model.bodyShape
? data.model
: undefined;
const modelGLTFData = modelIsString
? undefined
: data.model && data.model.src
? data.model
: undefined;
switch (data.type) {
case NPCType.AVATAR:
AvatarShape.create(npc, !data || !data.model || !modelAvatarData
? {
id: 'npc',
name: data && data.name ? data.name : 'NPC',
bodyShape: data && data.bodyShape ? data.bodyShape : 'urn:decentraland:off-chain:base-avatars:BaseMale',
emotes: [],
wearables: (data && data.wearables && data.wearables.length > 0)
? data.wearables
: [
'urn:decentraland:off-chain:base-avatars:f_eyes_00',
'urn:decentraland:off-chain:base-avatars:f_eyebrows_00',
'urn:decentraland:off-chain:base-avatars:f_mouth_00',
'urn:decentraland:off-chain:base-avatars:comfy_sport_sandals',
'urn:decentraland:off-chain:base-avatars:soccer_pants',
'urn:decentraland:off-chain:base-avatars:elegant_sweater'
],
eyeColor: data && data.eyeColor ? data.eyeColor : undefined,
skinColor: data && data.skinColor ? data.skinColor : undefined,
hairColor: data && data.hairColor ? data.hairColor : undefined
}
: modelAvatarData);
if (data && data.name) {
const avatar = AvatarShape.getMutable(npc);
avatar.name = data.name;
if (data.bodyShape)
avatar.bodyShape = data.bodyShape;
if (data.eyeColor)
avatar.eyeColor = data.eyeColor;
if (data.skinColor)
avatar.skinColor = data.skinColor;
if (data.hairColor)
avatar.hairColor = data.hairColor;
}
break;
case NPCType.CUSTOM:
GltfContainer.create(npc, modelIsString && typeof data.model === `string` ? { src: data && data.model ? data.model : '' } : modelGLTFData);
Animator.create(npc, {
states: [
{
clip: data && data.idleAnim ? data.idleAnim : 'Idle',
loop: true
}
]
});
let npcData = npcDataComponent.get(npc);
npcData.idleAnim = data && data.idleAnim ? data.idleAnim : 'Idle';
npcData.lastPlayedAnim = npcDataComponent.get(npc).idleAnim;
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).idleAnim);
if (data && data.walkingAnim) {
npcDataComponent.get(npc).walkingAnim = data.walkingAnim;
let animations = Animator.getMutable(npc);
animations.states.push({ clip: data.walkingAnim, loop: true });
}
break;
case NPCType.BLANK:
MeshRenderer.setBox(npc);
MeshCollider.setBox(npc);
break;
}
}
function seedAnimatorForExisting(npc, data) {
if (data.type !== NPCType.CUSTOM)
return;
const idleClip = data && data.idleAnim ? data.idleAnim : 'Idle';
if (!Animator.has(npc)) {
Animator.create(npc, {
states: [
{
clip: idleClip,
loop: true
}
]
});
}
else {
const animations = Animator.getMutable(npc);
if (animations.states.filter((animation) => animation.clip === idleClip).length === 0) {
animations.states.push({ clip: idleClip, loop: true });
}
}
let npcData = npcDataComponent.get(npc);
npcData.idleAnim = idleClip;
npcData.lastPlayedAnim = idleClip;
if (typeof idleClip === 'string' && idleClip.length > 0) {
Animator.playSingleAnimation(npc, idleClip);
}
if (data && data.walkingAnim) {
const animations = Animator.getMutable(npc);
if (typeof data.walkingAnim === 'string' && data.walkingAnim.length > 0 && animations.states.filter((animation) => animation.clip === data.walkingAnim).length === 0) {
animations.states.push({ clip: data.walkingAnim, loop: true });
}
if (typeof data.walkingAnim === 'string') {
npcData.walkingAnim = data.walkingAnim;
}
}
}
function addClickReactions(npc, data) {
let activateButton = data && data.onlyClickTrigger ? 0 : 1;
pointerEventsSystem.onPointerDown(npc, function () {
if (isCooldown.has(npc) || npcDialogComponent.get(npc).visible)
return;
activate(npc, engine.PlayerEntity);
}, {
button: activateButton,
hoverText: data && data.hoverText ? String(data.hoverText) : 'Talk',
showFeedback: data && data.onlyExternalTrigger ? false : true
});
if (data && data.onlyExternalTrigger) {
pointerEventsSystem.removeOnPointerDown(npc);
}
}
function addTriggerArea(npc, data) {
let triggerData = {};
if (!data || (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
onActivateCbs.set(npc, (other) => {
if (isCooldown.has(npc)) {
console.log(npc, ' in cooldown');
return;
}
else if ((npcDialogComponent.has(npc) && npcDialogComponent.get(npc).visible) ||
(data && data.onlyExternalTrigger) ||
(data && data.onlyClickTrigger)) {
return;
}
data.onActivate(other);
});
triggerData.onCameraEnter = onActivateCbs.get(npc);
}
if (!data || (data && !data.continueOnWalkAway)) {
triggerData.onCameraExit = (other) => {
handleWalkAway(npc, other);
};
}
if (!data || (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
triggerData.onCameraEnter = (other) => {
if (isCooldown.has(npc)) {
console.log(npc, ' in cooldown');
return;
}
activate(npc, other);
};
}
if (triggerData.onCameraEnter || triggerData.onCameraExit) {
let sphereScale = {
x: data.reactDistance != undefined ? data.reactDistance : 6,
y: data.reactDistance != undefined ? data.reactDistance : 6,
z: data.reactDistance != undefined ? data.reactDistance : 6
};
let triggerSphere = engine.addEntity();
Transform.create(triggerSphere, {
position: Vector3.Zero(),
rotation: Quaternion.Zero(),
scale: sphereScale,
parent: npc
});
TriggerArea.setSphere(triggerSphere);
triggerAreaEventsSystem.onTriggerEnter(triggerSphere, function (result) {
if (triggerData.onCameraEnter) {
const entity = (result?.trigger?.entity ?? engine.PlayerEntity);
if (entity !== engine.PlayerEntity)
return;
triggerData.onCameraEnter(entity);
}
});
triggerAreaEventsSystem.onTriggerExit(triggerSphere, function (result) {
if (triggerData.onCameraExit) {
const entity = (result?.trigger?.entity ?? engine.PlayerEntity);
if (entity !== engine.PlayerEntity)
return;
triggerData.onCameraExit(entity);
}
});
}
}
export function followPath(npc, data) {
let npcData = npcDataComponent.get(npc);
let path = [];
if (npcData.faceUser) {
if (TrackUserFlag.has(npc)) {
TrackUserFlag.deleteFrom(npc);
}
}
if (npcData.manualStop) {
let duration = npcData.pathData.totalDuration;
let currentTimer = walkingTimers.get(npc);
if (currentTimer) {
duration -= currentTimer;
}
let path = [];
npcData.pathData.path.forEach((p) => {
path.push(p);
});
path.splice(0, npcData.pathIndex);
let pos = Transform.get(npc).position;
path.unshift(Vector3.create(pos.x, pos.y, pos.z));
walkNPC(npc, npcData, npcData.pathData.pathType, duration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
}
else {
if (data) {
npcData.pathData = data;
if (data.startingPoint) {
data.path?.splice(0, data.startingPoint - 1);
}
let pos = Transform.get(npc).position;
path.push(Vector3.create(pos.x, pos.y, pos.z));
data.path?.forEach((p) => {
path.push(p);
});
onFinishCallbacks.set(npc, () => {
if (data && data.onFinishCallback && !data.loop) {
data.onFinishCallback();
}
stopPath(npc);
});
pointReachedCallbacks.set(npc, () => {
let data = npcDataComponent.get(npc);
data.pathIndex += 1;
data.onReachedPointCallback ? data.onReachedPointCallback : undefined;
});
walkNPC(npc, npcData, data.pathType, data.totalDuration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
}
else {
if (npcData.manualStop) {
console.log('we have manual stop, need to pick back up where we left off');
}
else {
console.log('we are trying to follow a path witout starting one prior');
}
}
}
}
function walkNPC(npc, npcData, type, duration, path, pointReachedCallback, finishedCallback) {
if (IsFollowingPath.has(npc)) {
IsFollowingPath.deleteFrom(npc);
walkingTimers.delete(npc);
}
IsFollowingPath.create(npc);
if (type) {
if (type == NPCPathType.RIGID_PATH) {
paths.startStraightPath(npc, path, duration, true, () => {
finishedCallback();
}, () => {
pointReachedCallback();
});
}
else {
paths.startSmoothPath(npc, path, duration, 30, true, () => {
finishedCallback();
}, () => {
pointReachedCallback();
});
}
}
else {
paths.startSmoothPath(npc, path, duration, 20, true, () => {
finishedCallback();
}, () => {
pointReachedCallback();
});
}
if (npcData.walkingAnim) {
clearAnimationTimer(npc);
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
}
npcData.state = NPCState.FOLLOWPATH;
npcData.manualStop = false;
}
export function stopWalking(npc, duration, finished) {
let npcData = npcDataComponent.get(npc);
npcData.state = NPCState.STANDING;
npcData.manualStop = true;
stopPath(npc);
if (duration) {
delayedFunction(() => {
if (npcData.path) {
Animator.stopAllAnimations(npc, true);
if (npcDataComponent.get(npc).walkingAnim) {
clearAnimationTimer(npc);
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
}
let duration = npcData.pathData.totalDuration;
let currentTimer = walkingTimers.get(npc);
console.log('current time is', currentTimer);
if (currentTimer) {
duration -= currentTimer;
}
let path = [];
npcData.pathData.path.forEach((p) => {
path.push(p);
});
path.splice(0, npcData.pathIndex);
let pos = Transform.get(npc).position;
path.unshift(Vector3.create(pos.x, pos.y, pos.z));
walkNPC(npc, npcData, npcData.pathData.pathType, duration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
}
}, duration * 1000);
}
}
export function stopPath(npc) {
paths.stopPath(npc);
IsFollowingPath.deleteFrom(npc);
let npcData = npcDataComponent.get(npc);
if (npcData.walkingAnim) {
clearAnimationTimer(npc);
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).idleAnim);
npcData.lastPlayedAnim = npcData.idleAnim;
}
if (!npcData.manualStop) {
if (npcData.pathData.loop) {
npcData.pathIndex = 0;
walkingTimers.delete(npc);
followPath(npc, npcData.pathData);
}
}
}
export function clearNPC() {
activeNPC = NULL_NPC;
}
export function setActiveNPC(npc) {
activeNPC = npc;
}
export function isActiveNpcSet() {
return activeNPC && npcDialogComponent.has(activeNPC);
}
export function activate(npc, other) {
if (activeNPC != 0) {
endInteraction(activeNPC);
}
activeNPC = npc;
onActivateCbs.get(npc)(other);
let npcData = npcDataComponent.get(npc);
if (npcData.faceUser) {
if (TrackUserFlag.has(npc)) {
TrackUserFlag.deleteFrom(npc);
}
TrackUserFlag.create(npc, {
lockXZRotation: true,
active: true,
rotSpeed: npcData.turnSpeed
});
}
isCooldown.set(npc, true);
npcData.inCooldown = true;
delayedFunction(() => {
isCooldown.delete(npc);
npcDataComponent.get(npc).inCooldown = false;
}, 1000 * npcData.coolDownDuration);
}
function endInteraction(npc) {
let npcData = npcDataComponent.get(npc);
npcData.state = NPCState.STANDING;
if (npcDialogComponent.has(npc)) {
closeDialog(npc);
}
if (npcData.faceUser) {
if (TrackUserFlag.has(npc)) {
TrackUserFlag.deleteFrom(npc);
}
}
if (npcData.hasBubble && bubbles.get(npc).isBubbleOpen) {
closeBubble(npc);
}
}
export function handleWalkAway(npc, other) {
let npcData = npcDataComponent.get(npc);
if (npcData.state == NPCState.FOLLOWPATH) {
return;
}
endInteraction(npc);
if (onWalkAwayCbs.get(npc)) {
onWalkAwayCbs.get(npc)(other);
}
}
export function playAnimation(npc, anim, noLoop, duration) {
const npcData = npcDataComponent.get(npc);
if (!npcData)
return;
if (AvatarShape.has(npc)) {
if (npcData.state == NPCState.FOLLOWPATH) {
paths.stopPath(npc);
}
clearAnimationTimer(npc);
const triggerOnce = () => {
const avatar = AvatarShape.getMutable(npc);
avatar.expressionTriggerId = anim;
avatar.expressionTriggerTimestamp = avatar.expressionTriggerTimestamp
? avatar.expressionTriggerTimestamp + 1
: 0;
};
triggerOnce();
if (!noLoop && duration && duration > 0) {
const scheduleNext = () => {
animTimers.set(npc, delayedFunction(() => {
triggerOnce();
scheduleNext();
}, 1000 * duration));
};
scheduleNext();
}
npcData.lastPlayedAnim = anim;
return;
}
const animations = Animator.getMutable(npc);
if (!animations)
return;
if (animations.states && animations.states.filter((animation) => animation.clip === anim).length == 0) {
animations.states.push({ clip: anim, loop: noLoop ? false : true });
}
if (npcData.state == NPCState.FOLLOWPATH) {
paths.stopPath(npc);
}
clearAnimationTimer(npc);
Animator.stopAllAnimations(npc, true);
Animator.playSingleAnimation(npc, anim, true);
if (duration) {
clearAnimationTimer(npc);
animTimers.set(npc, delayedFunction(() => {
clearAnimationTimer(npc);
Animator.stopAllAnimations(npc, true);
if (npcData.idleAnim) {
Animator.playSingleAnimation(npc, npcData.idleAnim);
npcData.lastPlayedAnim = npcData.idleAnim;
}
}, 1000 * duration));
}
npcData.lastPlayedAnim = anim;
}
export function changeIdleAnim(npc, animation, play) {
let npcData = npcDataComponent.get(npc);
npcData.idleAnim = animation;
let animations = Animator.getMutable(npc);
if (animations.states.filter((anim) => anim.clip === animation).length == 0) {
animations.states.push({ clip: animation, loop: true });
}
if (play) {
playAnimation(npc, animation, true);
npcDataComponent.get(npc).lastPlayedAnim = animation;
}
}
export function talkBubble(npc, script, startIndex) {
openBubble(npc, script, startIndex);
}
export function createDialogWindow(defaultPortrait, sound) {
let dialog = engine.addEntity();
addDialog(dialog, sound, defaultPortrait);
return dialog;
}
export function openDialogWindow(npc, dialog, startIndex) {
activeNPC = npc;
if (npcDialogComponent.has(npc)) {
let index;
if (!startIndex) {
index = 0;
}
else if (typeof startIndex === 'number') {
index = startIndex;
}
else {
index = findDialogByName(dialog, startIndex);
}
openDialog(npc, dialog, index);
}
}
export function closeDialogWindow(window) {
let dialog = npcDialogComponent.get(window);
if (window) {
closeDialog(dialog);
}
}
function clearAnimationTimer(npc) {
if (animTimers.has(npc)) {
clearDelayedFunction(animTimers.get(npc));
animTimers.delete(npc);
return true;
}
return false;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25wYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxNQUFNLEVBRU4sYUFBYSxFQUViLFlBQVksRUFDWixZQUFZLEVBR1osbUJBQW1CLEVBQ25CLFNBQVMsRUFHVCxXQUFXLEVBQ1gsdUJBQXVCLEVBQ3hCLE1BQU0sY0FBYyxDQUFBO0FBQ3JCLE9BQU8sRUFBVSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDbkcsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEgsT0FBTyxFQUE4QyxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBZSxNQUFNLFNBQVMsQ0FBQTtBQUNqSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBaUIsTUFBTSxlQUFlLENBQUE7QUFDbkcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUtwQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDM0QsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQXFCLElBQUksR0FBRyxFQUFFLENB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RUFBRSxRQUFRLENBQUMsUUFBUTtRQUN4QixRQUFRLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFDeEQsWUFBWSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDMUYsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDNUQsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDakQsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVU7UUFDM0MsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHO0tBQ2hELENBQUMsQ0FBQTtJQUVGLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO1NBQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFD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OUMsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEdBQVc7SUFDdEMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3pDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdEIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQW5pbWF0b3IsXG4gIEF2YXRhclNoYXBlLFxuICBlbmdpbmUsXG4gIEVudGl0eSxcbiAgR2x0ZkNvbnRhaW5lcixcbiAgSW5wdXRBY3Rpb24sXG4gIE1lc2hDb2xsaWRlcixcbiAgTWVzaFJlbmRlcmVyLFxuICBQQkF2YXRhclNoYXBlLFxuICBQQkdsdGZDb250YWluZXIsXG4gIHBvaW50ZXJFdmVudHNTeXN0ZW0sXG4gIFRyYW5zZm9ybSxcbiAgVHJhbnNmb3JtVHlwZSxcbiAgUEJBbmltYXRpb25TdGF0ZSxcbiAgVHJpZ2dlckFyZWEsIFxuICB0cmlnZ2VyQXJlYUV2ZW50c1N5c3RlbVxufSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBDb2xvcjMsIFF1YXRlcm5pb24sIFZlY3RvcjMgfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgYnViYmxlcywgY2xvc2VCdWJibGUsIGNyZWF0ZURpYWxvZ0J1YmJsZSwgb3BlbkJ1YmJsZSB9IGZyb20gJy4vYnViYmxlJ1xuaW1wb3J0IHsgSXNGb2xsb3dpbmdQYXRoLCBUcmFja1VzZXJGbGFnIH0gZnJvbSAnLi9jb21wb25lbnRzJ1xuaW1wb3J0IHsgYWRkRGlhbG9nLCBjbG9zZURpYWxvZywgZmluZERpYWxvZ0J5TmFtZSwgbnBjRGlhbG9nQ29tcG9uZW50LCBvcGVuRGlhbG9nIH0gZnJvbSAnLi9kaWFsb2cnXG5pbXBvcnQgeyBmYWNlVXNlclN5c3RlbSwgaGFuZGxlQnViYmxldHlwaW5nLCBoYW5kbGVEaWFsb2dUeXBpbmcsIGhhbmRsZVBhdGhUaW1lcywgaW5wdXRMaXN0ZW5lclN5c3RlbSB9IGZyb20gJy4vc3lzdGVtcydcbmltcG9ydCB7IERpYWxvZywgRm9sbG93UGF0aERhdGEsIEltYWdlRGF0YSwgTlBDRGF0YSwgTlBDUGF0aFR5cGUsIE5QQ1N0YXRlLCBOUENUeXBlLCBUcmlnZ2VyRGF0YSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBkYXJrVGhlbWUsIGxpZ2h0VGhlbWUgfSBmcm9tICcuL3VpJ1xuaW1wb3J0IHsgZGVidWdUcmlnZ2VycywgZGVsYXllZEZ1bmN0aW9uLCBjbGVhckRlbGF5ZWRGdW5jdGlvbiwgRGVsYXllZEhhbmRsZSB9IGZyb20gJy4vdXRpbHMvdXRpbHMnXG5pbXBvcnQgeyBwYXRocyB9IGZyb20gJy4vdXRpbHMvcGF0aCdcblxuXG50eXBlIE5QQ0RhdGFGcm9tRW50aXR5ID0gT21pdDxOUENEYXRhLCAndHlwZSc+ICYgeyB0eXBlPzogTlBDVHlwZSB9XG5cbmV4cG9ydCBjb25zdCB3YWxraW5nVGltZXJzOiBNYXA8RW50aXR5LCBudW1iZXI+ID0gbmV3IE1hcCgpXG5leHBvcnQgY29uc3QgbnBjRGF0YUNvbXBvbmVudDogTWFwPEVudGl0eSwgYW55PiA9IG5ldyBNYXAoKVxuZXhwb3J0IGxldCBOVUxMX05QQzogRW50aXR5ID0gMCBhcyBFbnRpdHlcbmV4cG9ydCBsZXQgYWN0aXZlTlBDOiBFbnRpdHkgPSBOVUxMX05QQ1xuZXhwb3J0IGxldCBibGFua0RpYWxvZzogbnVtYmVyID0gMFxuXG5lbmdpbmUuYWRkU3lzdGVtKGhhbmRsZVBhdGhUaW1lcylcbmVuZ2luZS5hZGRTeXN0ZW0oaGFuZGxlRGlhbG9nVHlwaW5nKVxuZW5naW5lLmFkZFN5c3RlbShoYW5kbGVCdWJibGV0eXBpbmcpXG5lbmdpbmUuYWRkU3lzdGVtKGZhY2VVc2VyU3lzdGVtKVxuZW5naW5lLmFkZFN5c3RlbShpbnB1dExpc3RlbmVyU3lzdGVtKVxuXG4vL1RPRE8gTUFLRSBpc0Nvb2xkb3duIGFuZCBubyBsb25nZXIgaGF2ZSB0byB0cmFjayB3aXRoIG1hcCB0byByZW1vdmUgbWVtb3J5IGxlYWsgaXNzdWVzXG5jb25zdCBpc0Nvb2xkb3duOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBvbkFjdGl2YXRlQ2JzOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBvbldhbGtBd2F5Q2JzOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBhbmltVGltZXJzOiBNYXA8RW50aXR5LCBEZWxheWVkSGFuZGxlPiA9IG5ldyBNYXAoKVxuY29uc3QgcG9pbnRSZWFjaGVkQ2FsbGJhY2tzOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBvbkZpbmlzaENhbGxiYWNrczogTWFwPEVudGl0eSwgYW55PiA9IG5ldyBNYXAoKVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0RlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gIGlmKGRlYnVnKSB7XG4gICAgZGVidWdUcmlnZ2VycygpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGEobnBjOiBFbnRpdHkpIHtcbiAgcmV0dXJuIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSh0cmFuc2Zvcm06IGFueSwgZGF0YTogTlBDRGF0YSkge1xuICBsZXQgbnBjID0gZW5naW5lLmFkZEVudGl0eSgpXG5cbiAgbGV0IHQ6IFRyYW5zZm9ybVR5cGUgPSB7XG4gICAgcG9zaXRpb246IHRyYW5zZm9ybS5wb3NpdGlvbiA/IHRyYW5zZm9ybS5wb3NpdGlvbiA6IFZlY3RvcjMuY3JlYXRlKDAsIDAsIDApLFxuICAgIHJvdGF0aW9uOiB0cmFuc2Zvcm0ucm90YXRpb24gPyB0cmFuc2Zvcm0ucm90YXRpb24gOiBRdWF0ZXJuaW9uLlplcm8oKSxcbiAgICBzY2FsZTogdHJhbnNmb3JtLnNjYWxlID8gdHJhbnNmb3JtLnNjYWxlIDogVmVjdG9yMy5PbmUoKVxuICB9XG4gIFRyYW5zZm9ybS5jcmVhdGUobnBjLCB0KVxuXG4gIG5wY0RhdGFDb21wb25lbnQuc2V0KG5wYywge1xuICAgIGludHJvZHVjZWQ6IGZhbHNlLFxuICAgIGluQ29vbGRvd246IGZhbHNlLFxuICAgIGNvb2xEb3duRHVyYXRpb246IGRhdGEgJiYgZGF0YS5jb29sRG93bkR1cmF0aW9uID8gZGF0YS5jb29sRG93bkR1cmF0aW9uIDogNSxcbiAgICBmYWNlVXNlcjogZGF0YSAmJiBkYXRhLmZhY2VVc2VyID8gZGF0YS5mYWNlVXNlciA6IHVuZGVmaW5lZCxcbiAgICB3YWxraW5nU3BlZWQ6IDIsXG4gICAgd2Fsa2luZ0FuaW06IGRhdGEgJiYgZGF0YS53YWxraW5nQW5pbSA/IGRhdGEud2Fsa2luZ0FuaW0gOiB1bmRlZmluZWQsXG4gICAgcGF0aERhdGE6IGRhdGEucGF0aERhdGEgPyBkYXRhLnBhdGhEYXRhIDogdW5kZWZpbmVkLFxuICAgIGN1cnJlbnRQYXRoRGF0YTogW10sXG4gICAgbWFudWFsU3RvcDogZmFsc2UsXG4gICAgcGF0aEluZGV4OiAwLFxuICAgIHN0YXRlOiBOUENTdGF0ZS5TVEFORElORyxcbiAgICBpZGxlQW5pbTogZGF0YSAmJiBkYXRhLmlkbGVBbmltID8gZGF0YS5pZGxlQW5pbSA6ICdJZGxlJyxcbiAgICBidWJibGVIZWlnaHQ6IGRhdGEgJiYgZGF0YS50ZXh0QnViYmxlICYmIGRhdGEuYnViYmxlSGVpZ2h0ID8gZGF0YS5idWJibGVIZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgYnViYmxlU291bmQ6IGRhdGEuZGlhbG9nU291bmQgPyBkYXRhLmRpYWxvZ1NvdW5kIDogdW5kZWZpbmVkLFxuICAgIGhhc0J1YmJsZTogZGF0YSAmJiBkYXRhLnRleHRCdWJibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgdHVyblNwZWVkOiBkYXRhICYmIGRhdGEudHVybmluZ1NwZWVkID8gZGF0YS50dXJuaW5nU3BlZWQgOiAyLFxuICAgIHRoZW1lOiBkYXRhLmRhcmtVSSA/IGRhcmtUaGVtZSA6IGxpZ2h0VGhlbWUsXG4gICAgYnViYmxlWE9mZnNldDogZGF0YS5idWJibGVYT2Zmc2V0ID8gZGF0YS5idWJibGVYT2Zmc2V0IDogMCxcbiAgICBidWJibGVZT2Zmc2V0OiBkYXRhLmJ1YmJsZVlPZmZzZXQgPyBkYXRhLmJ1YmJsZVlPZmZzZXQgOiAwLFxuICAgIHZvbHVtZTogZGF0YSAmJiBkYXRhLnZvbHVtZSA/IGRhdGEudm9sdW1lIDogMC41XG4gIH0pXG5cbiAgaWYgKGRhdGEgJiYgZGF0YS5ub1VJKSB7XG4gIH0gZWxzZSBpZiAoZGF0YSAmJiBkYXRhLnBvcnRyYWl0KSB7XG4gICAgYWRkRGlhbG9nKFxuICAgICAgbnBjLFxuICAgICAgZGF0YSAmJiBkYXRhLmRpYWxvZ1NvdW5kID8gZGF0YS5kaWFsb2dTb3VuZCA6IHVuZGVmaW5lZCxcbiAgICAgIHR5cGVvZiBkYXRhLnBvcnRyYWl0ID09PSBgc3RyaW5nYCA/IHsgcGF0aDogZGF0YS5wb3J0cmFpdCB9IDogZGF0YS5wb3J0cmFpdFxuICAgIClcbiAgfSBlbHNlIHtcbiAgICBhZGREaWFsb2cobnBjLCBkYXRhICYmIGRhdGEuZGlhbG9nU291bmQgPyBkYXRhLmRpYWxvZ1NvdW5kIDogdW5kZWZpbmVkKVxuICB9XG5cbiAgaWYgKGRhdGEgJiYgZGF0YS50ZXh0QnViYmxlKSB7XG4gICAgY3JlYXRlRGlhbG9nQnViYmxlKG5wYywgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5idWJibGVIZWlnaHQpXG4gIH1cblxuICBvbkFjdGl2YXRlQ2JzLnNldChucGMsIChvdGhlcjogRW50aXR5KSA9PiB7XG4gICAgZGF0YS5vbkFjdGl2YXRlKG90aGVyKVxuICB9KVxuXG4gIGlmIChkYXRhICYmIGRhdGEuaGFzT3duUHJvcGVydHkoJ29uV2Fsa0F3YXknKSkge1xuICAgIG9uV2Fsa0F3YXlDYnMuc2V0KG5wYywgKG90aGVyOiBFbnRpdHkpID0+IHtcbiAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5jb250aW51ZU9uV2Fsa0F3YXkpIHtcbiAgICAgICAgaWYgKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSkge1xuICAgICAgICAgIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSkge1xuICAgICAgICAgIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGF0YS5vbldhbGtBd2F5IShvdGhlcilcbiAgICB9KVxuICB9XG5cbiAgYWRkTlBDQm9uZXMobnBjLCBkYXRhKVxuICBhZGRDbGlja1JlYWN0aW9ucyhucGMsIGRhdGEpXG4gIGFkZFRyaWdnZXJBcmVhKG5wYywgZGF0YSlcblxuICBpZiAoZGF0YSAmJiBkYXRhLnBhdGhEYXRhICYmIGRhdGEucGF0aERhdGEuc3BlZWQpIHtcbiAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICBucGNEYXRhLndhbGtpbmdTcGVlZCA9IGRhdGEucGF0aERhdGEuc3BlZWRcbiAgfVxuXG4gIGlmIChkYXRhICYmIGRhdGEuY29vbERvd25EdXJhdGlvbikge1xuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIG5wY0RhdGEuY29vbERvd25EdXJhdGlvbiA9IGRhdGEuY29vbERvd25EdXJhdGlvblxuICB9XG5cbiAgaWYgKGRhdGEgJiYgZGF0YS5wYXRoRGF0YSkge1xuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIG5wY0RhdGEucGF0aERhdGEubG9vcCA9IHRydWVcbiAgICBmb2xsb3dQYXRoKG5wYywgbnBjRGF0YS5wYXRoRGF0YSlcbiAgfVxuXG4gIHJldHVybiBucGNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21FbnRpdHkoZW50aXR5OiBFbnRpdHksIGRhdGE6IE5QQ0RhdGFGcm9tRW50aXR5KSB7XG4gIGNvbnN0IG5wYyA9IGVudGl0eVxuXG4gIGNvbnN0IHJlc29sdmVkVHlwZSA9IChkYXRhICYmIGRhdGEudHlwZSAhPT0gdW5kZWZpbmVkID8gZGF0YS50eXBlIDogTlBDVHlwZS5DVVNUT00pXG5cbiAgaWYgKCFUcmFuc2Zvcm0uaGFzKG5wYykpIHtcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlRnJvbUVudGl0eTogUHJvdmlkZWQgZW50aXR5IGlzIG1pc3NpbmcgVHJhbnNmb3JtIGNvbXBvbmVudCcpXG4gIH1cblxuICBpZiAocmVzb2x2ZWRUeXBlID09PSBOUENUeXBlLkNVU1RPTSAmJiAhR2x0ZkNvbnRhaW5lci5oYXMobnBjKSkge1xuICAgIGNvbnNvbGUubG9nKCdjcmVhdGVGcm9tRW50aXR5OiBFeHBlY3RlZCBhIEdsdGZDb250YWluZXIgb24gQ1VTVE9NIE5QQyBlbnRpdHknKVxuICB9XG5cbiAgbnBjRGF0YUNvbXBvbmVudC5zZXQobnBjLCB7XG4gICAgaW50cm9kdWNlZDogZmFsc2UsXG4gICAgaW5Db29sZG93bjogZmFsc2UsXG4gICAgY29vbERvd25EdXJhdGlvbjogZGF0YSAmJiBkYXRhLmNvb2xEb3duRHVyYXRpb24gPyBkYXRhLmNvb2xEb3duRHVyYXRpb24gOiA1LFxuICAgIGZhY2VVc2VyOiBkYXRhICYmIGRhdGEuZmFjZVVzZXIgPyBkYXRhLmZhY2VVc2VyIDogdW5kZWZpbmVkLFxuICAgIHdhbGtpbmdTcGVlZDogMixcbiAgICB3YWxraW5nQW5pbTogZGF0YSAmJiBkYXRhLndhbGtpbmdBbmltID8gZGF0YS53YWxraW5nQW5pbSA6IHVuZGVmaW5lZCxcbiAgICBwYXRoRGF0YTogZGF0YS5wYXRoRGF0YSA/IGRhdGEucGF0aERhdGEgOiB1bmRlZmluZWQsXG4gICAgY3VycmVudFBhdGhEYXRhOiBbXSxcbiAgICBtYW51YWxTdG9wOiBmYWxzZSxcbiAgICBwYXRoSW5kZXg6IDAsXG4gICAgc3RhdGU6IE5QQ1N0YXRlLlNUQU5ESU5HLFxuICAgIGlkbGVBbmltOiBkYXRhICYmIGRhdGEuaWRsZUFuaW0gPyBkYXRhLmlkbGVBbmltIDogJ0lkbGUnLFxuICAgIGJ1YmJsZUhlaWdodDogZGF0YSAmJiBkYXRhLnRleHRCdWJibGUgJiYgZGF0YS5idWJibGVIZWlnaHQgPyBkYXRhLmJ1YmJsZUhlaWdodCA6IHVuZGVmaW5lZCxcbiAgICBidWJibGVTb3VuZDogZGF0YS5kaWFsb2dTb3VuZCA/IGRhdGEuZGlhbG9nU291bmQgOiB1bmRlZmluZWQsXG4gICAgaGFzQnViYmxlOiBkYXRhICYmIGRhdGEudGV4dEJ1YmJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICB0dXJuU3BlZWQ6IGRhdGEgJiYgZGF0YS50dXJuaW5nU3BlZWQgPyBkYXRhLnR1cm5pbmdTcGVlZCA6IDIsXG4gICAgdGhlbWU6IGRhdGEuZGFya1VJID8gZGFya1RoZW1lIDogbGlnaHRUaGVtZSxcbiAgICBidWJibGVYT2Zmc2V0OiBkYXRhLmJ1YmJsZVhPZmZzZXQgPyBkYXRhLmJ1YmJsZVhPZmZzZXQgOiAwLFxuICAgIGJ1YmJsZVlPZmZzZXQ6IGRhdGEuYnViYmxlWU9mZnNldCA/IGRhdGEuYnViYmxlWU9mZnNldCA6IDBcbiAgfSlcblxuICBpZiAoZGF0YSAmJiBkYXRhLm5vVUkpIHtcbiAgfSBlbHNlIGlmIChkYXRhICYmIGRhdGEucG9ydHJhaXQpIHtcbiAgICBhZGREaWFsb2coXG4gICAgICBucGMsXG4gICAgICBkYXRhICYmIGRhdGEuZGlhbG9nU291bmQgPyBkYXRhLmRpYWxvZ1NvdW5kIDogdW5kZWZpbmVkLFxuICAgICAgdHlwZW9mIGRhdGEucG9ydHJhaXQgPT09IGBzdHJpbmdgID8geyBwYXRoOiBkYXRhLnBvcnRyYWl0IH0gOiBkYXRhLnBvcnRyYWl0XG4gICAgKVxuICB9IGVsc2Uge1xuICAgIGFkZERpYWxvZyhucGMsIGRhdGEgJiYgZGF0YS5kaWFsb2dTb3VuZCA/IGRhdGEuZGlhbG9nU291bmQgOiB1bmRlZmluZWQpXG4gIH1cblxuICBpZiAoZGF0YSAmJiBkYXRhLnRleHRCdWJibGUpIHtcbiAgICBjcmVhdGVEaWFsb2dCdWJibGUobnBjLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLmJ1YmJsZUhlaWdodClcbiAgfVxuXG4gIG9uQWN0aXZhdGVDYnMuc2V0KG5wYywgKG90aGVyOiBFbnRpdHkpID0+IHtcbiAgICBkYXRhLm9uQWN0aXZhdGUob3RoZXIpXG4gIH0pXG5cbiAgaWYgKGRhdGEgJiYgZGF0YS5oYXNPd25Qcm9wZXJ0eSgnb25XYWxrQXdheScpKSB7XG4gICAgb25XYWxrQXdheUNicy5zZXQobnBjLCAob3RoZXI6IEVudGl0eSkgPT4ge1xuICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmNvbnRpbnVlT25XYWxrQXdheSkge1xuICAgICAgICBpZiAobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpKSB7XG4gICAgICAgICAgbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpLnZpc2libGUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpKSB7XG4gICAgICAgICAgbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpLnZpc2libGUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkYXRhLm9uV2Fsa0F3YXkhKG90aGVyKVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBkYXRhV2l0aFR5cGUgPSB7IC4uLmRhdGEsIHR5cGU6IHJlc29sdmVkVHlwZSB9IGFzIE5QQ0RhdGFcbiAgLy8gQXR0YWNoIHZpc3VhbCBjb21wb25lbnRzIGJhc2VkIG9uIHR5cGVcbiAgaWYgKHJlc29sdmVkVHlwZSA9PT0gTlBDVHlwZS5BVkFUQVIpIHtcbiAgICBpZiAoR2x0ZkNvbnRhaW5lci5oYXMobnBjKSkge1xuICAgICAgR2x0ZkNvbnRhaW5lci5kZWxldGVGcm9tKG5wYylcbiAgICB9XG4gICAgaWYgKCFBdmF0YXJTaGFwZS5oYXMobnBjKSkge1xuICAgICAgQXZhdGFyU2hhcGUuY3JlYXRlKFxuICAgICAgICBucGMsXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ25wYycsXG4gICAgICAgICAgbmFtZTogZGF0YVdpdGhUeXBlICYmIGRhdGFXaXRoVHlwZS5uYW1lID8gZGF0YVdpdGhUeXBlLm5hbWUgOiAnTlBDJyxcbiAgICAgICAgICBib2R5U2hhcGU6IGRhdGFXaXRoVHlwZSAmJiBkYXRhV2l0aFR5cGUuYm9keVNoYXBlID8gZGF0YVdpdGhUeXBlLmJvZHlTaGFwZSA6ICd1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6QmFzZU1hbGUnLFxuICAgICAgICAgIGVtb3RlczogW10sXG4gICAgICAgICAgd2VhcmFibGVzOiAoZGF0YVdpdGhUeXBlLndlYXJhYmxlcyAmJiBkYXRhV2l0aFR5cGUud2VhcmFibGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICA/IGRhdGFXaXRoVHlwZS53ZWFyYWJsZXNcbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAndXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOmZfZXllc18wMCcsXG4gICAgICAgICAgICAgICd1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6Zl9leWVicm93c18wMCcsXG4gICAgICAgICAgICAgICd1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6Zl9tb3V0aF8wMCcsXG4gICAgICAgICAgICAgICd1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6Y29tZnlfc3BvcnRfc2FuZGFscycsXG4gICAgICAgICAgICAgICd1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6c29jY2VyX3BhbnRzJyxcbiAgICAgICAgICAgICAgJ3VybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczplbGVnYW50X3N3ZWF0ZXInXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIGV5ZUNvbG9yOiBkYXRhV2l0aFR5cGUgJiYgZGF0YVdpdGhUeXBlLmV5ZUNvbG9yID8gZGF0YVdpdGhUeXBlLmV5ZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNraW5Db2xvcjogZGF0YVdpdGhUeXBlICYmIGRhdGFXaXRoVHlwZS5za2luQ29sb3IgPyBkYXRhV2l0aFR5cGUuc2tpbkNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGhhaXJDb2xvcjogZGF0YVdpdGhUeXBlICYmIGRhdGFXaXRoVHlwZS5oYWlyQ29sb3IgPyBkYXRhV2l0aFR5cGUuaGFpckNvbG9yIDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGRhdGFXaXRoVHlwZS53ZWFyYWJsZXMgJiYgZGF0YVdpdGhUeXBlLndlYXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBhdmF0YXIgPSBBdmF0YXJTaGFwZS5nZXRNdXRhYmxlKG5wYylcbiAgICAgIGF2YXRhci53ZWFyYWJsZXMgPSBkYXRhV2l0aFR5cGUud2VhcmFibGVzXG4gICAgICBpZiAoZGF0YVdpdGhUeXBlICYmIGRhdGFXaXRoVHlwZS5uYW1lKSB7XG4gICAgICAgIGF2YXRhci5uYW1lID0gZGF0YVdpdGhUeXBlLm5hbWVcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhV2l0aFR5cGUuYm9keVNoYXBlKSBhdmF0YXIuYm9keVNoYXBlID0gZGF0YVdpdGhUeXBlLmJvZHlTaGFwZVxuICAgICAgaWYgKGRhdGFXaXRoVHlwZS5leWVDb2xvcikgYXZhdGFyLmV5ZUNvbG9yID0gZGF0YVdpdGhUeXBlLmV5ZUNvbG9yXG4gICAgICBpZiAoZGF0YVdpdGhUeXBlLnNraW5Db2xvcikgYXZhdGFyLnNraW5Db2xvciA9IGRhdGFXaXRoVHlwZS5za2luQ29sb3JcbiAgICAgIGlmIChkYXRhV2l0aFR5cGUuaGFpckNvbG9yKSBhdmF0YXIuaGFpckNvbG9yID0gZGF0YVdpdGhUeXBlLmhhaXJDb2xvclxuICAgIH1cbiAgfSBlbHNlIGlmIChyZXNvbHZlZFR5cGUgPT09IE5QQ1R5cGUuQ1VTVE9NKSB7XG4gICAgc2VlZEFuaW1hdG9yRm9yRXhpc3RpbmcobnBjLCBkYXRhV2l0aFR5cGUpXG4gIH1cbiAgYWRkQ2xpY2tSZWFjdGlvbnMobnBjLCBkYXRhV2l0aFR5cGUpXG4gIGFkZFRyaWdnZXJBcmVhKG5wYywgZGF0YVdpdGhUeXBlKVxuXG4gIGlmIChkYXRhICYmIGRhdGEucGF0aERhdGEgJiYgZGF0YS5wYXRoRGF0YS5zcGVlZCkge1xuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIG5wY0RhdGEud2Fsa2luZ1NwZWVkID0gZGF0YS5wYXRoRGF0YS5zcGVlZFxuICB9XG5cbiAgaWYgKGRhdGEgJiYgZGF0YS5jb29sRG93bkR1cmF0aW9uKSB7XG4gICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgbnBjRGF0YS5jb29sRG93bkR1cmF0aW9uID0gZGF0YS5jb29sRG93bkR1cmF0aW9uXG4gIH1cblxuICBpZiAoZGF0YSAmJiBkYXRhLnBhdGhEYXRhKSB7XG4gICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgbnBjRGF0YS5wYXRoRGF0YS5sb29wID0gdHJ1ZVxuICAgIGZvbGxvd1BhdGgobnBjLCBucGNEYXRhLnBhdGhEYXRhKVxuICB9XG5cbiAgcmV0dXJuIG5wY1xufVxuXG5mdW5jdGlvbiBhZGROUENCb25lcyhucGM6IEVudGl0eSwgZGF0YTogTlBDRGF0YSkge1xuICBjb25zdCBtb2RlbElzU3RyaW5nID0gZGF0YSAmJiBkYXRhLm1vZGVsICYmIHR5cGVvZiBkYXRhLm1vZGVsID09PSBgc3RyaW5nYFxuICBjb25zdCBtb2RlbEF2YXRhckRhdGE6IFBCQXZhdGFyU2hhcGUgfCB1bmRlZmluZWQgPSBtb2RlbElzU3RyaW5nXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IGRhdGEubW9kZWwgJiYgKGRhdGEubW9kZWwgYXMgYW55KS5ib2R5U2hhcGVcbiAgICAgID8gKGRhdGEubW9kZWwgYXMgUEJBdmF0YXJTaGFwZSlcbiAgICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IG1vZGVsR0xURkRhdGE6IFBCR2x0ZkNvbnRhaW5lciB8IHVuZGVmaW5lZCA9IG1vZGVsSXNTdHJpbmdcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogZGF0YS5tb2RlbCAmJiAoZGF0YS5tb2RlbCBhcyBhbnkpLnNyY1xuICAgICAgPyAoZGF0YS5tb2RlbCBhcyBQQkdsdGZDb250YWluZXIpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgY2FzZSBOUENUeXBlLkFWQVRBUjpcbiAgICAgIEF2YXRhclNoYXBlLmNyZWF0ZShcbiAgICAgICAgbnBjLFxuICAgICAgICAhZGF0YSB8fCAhZGF0YS5tb2RlbCB8fCAhbW9kZWxBdmF0YXJEYXRhXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBpZDogJ25wYycsXG4gICAgICAgICAgICBuYW1lOiBkYXRhICYmIGRhdGEubmFtZSA/IGRhdGEubmFtZSA6ICdOUEMnLFxuICAgICAgICAgICAgYm9keVNoYXBlOiBkYXRhICYmIGRhdGEuYm9keVNoYXBlID8gZGF0YS5ib2R5U2hhcGUgOiAndXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOkJhc2VNYWxlJyxcbiAgICAgICAgICAgIGVtb3RlczogW10sXG4gICAgICAgICAgICB3ZWFyYWJsZXM6IChkYXRhICYmIGRhdGEud2VhcmFibGVzICYmIGRhdGEud2VhcmFibGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgID8gZGF0YS53ZWFyYWJsZXNcbiAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgJ3VybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczpmX2V5ZXNfMDAnLFxuICAgICAgICAgICAgICAgICd1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6Zl9leWVicm93c18wMCcsXG4gICAgICAgICAgICAgICAgJ3VybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczpmX21vdXRoXzAwJyxcbiAgICAgICAgICAgICAgICAndXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOmNvbWZ5X3Nwb3J0X3NhbmRhbHMnLFxuICAgICAgICAgICAgICAgICd1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6c29jY2VyX3BhbnRzJyxcbiAgICAgICAgICAgICAgICAndXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOmVsZWdhbnRfc3dlYXRlcidcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGV5ZUNvbG9yOiBkYXRhICYmIGRhdGEuZXllQ29sb3IgPyBkYXRhLmV5ZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2tpbkNvbG9yOiBkYXRhICYmIGRhdGEuc2tpbkNvbG9yID8gZGF0YS5za2luQ29sb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBoYWlyQ29sb3I6IGRhdGEgJiYgZGF0YS5oYWlyQ29sb3IgPyBkYXRhLmhhaXJDb2xvciA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICA6IG1vZGVsQXZhdGFyRGF0YVxuICAgICAgKVxuICAgICAgLy8gSWYgYXZhdGFyIGRhdGEgY2FtZSBmcm9tIG1vZGVsLCBzdGlsbCBob25vciBwcm92aWRlZCBuYW1lIG92ZXJyaWRlXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLm5hbWUpIHtcbiAgICAgICAgY29uc3QgYXZhdGFyID0gQXZhdGFyU2hhcGUuZ2V0TXV0YWJsZShucGMpXG4gICAgICAgIGF2YXRhci5uYW1lID0gZGF0YS5uYW1lXG4gICAgICAgIGlmIChkYXRhLmJvZHlTaGFwZSkgYXZhdGFyLmJvZHlTaGFwZSA9IGRhdGEuYm9keVNoYXBlXG4gICAgICAgIGlmIChkYXRhLmV5ZUNvbG9yKSBhdmF0YXIuZXllQ29sb3IgPSBkYXRhLmV5ZUNvbG9yXG4gICAgICAgIGlmIChkYXRhLnNraW5Db2xvcikgYXZhdGFyLnNraW5Db2xvciA9IGRhdGEuc2tpbkNvbG9yXG4gICAgICAgIGlmIChkYXRhLmhhaXJDb2xvcikgYXZhdGFyLmhhaXJDb2xvciA9IGRhdGEuaGFpckNvbG9yXG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBOUENUeXBlLkNVU1RPTTpcbiAgICAgIEdsdGZDb250YWluZXIuY3JlYXRlKFxuICAgICAgICBucGMsXG4gICAgICAgIG1vZGVsSXNTdHJpbmcgJiYgdHlwZW9mIGRhdGEubW9kZWwgPT09IGBzdHJpbmdgID8geyBzcmM6IGRhdGEgJiYgZGF0YS5tb2RlbCA/IGRhdGEubW9kZWwgOiAnJyB9IDogbW9kZWxHTFRGRGF0YVxuICAgICAgKVxuICAgICAgQW5pbWF0b3IuY3JlYXRlKG5wYywge1xuICAgICAgICBzdGF0ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGlwOiBkYXRhICYmIGRhdGEuaWRsZUFuaW0gPyBkYXRhLmlkbGVBbmltIDogJ0lkbGUnLFxuICAgICAgICAgICAgbG9vcDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSlcblxuICAgICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgICBucGNEYXRhLmlkbGVBbmltID0gZGF0YSAmJiBkYXRhLmlkbGVBbmltID8gZGF0YS5pZGxlQW5pbSA6ICdJZGxlJ1xuICAgICAgbnBjRGF0YS5sYXN0UGxheWVkQW5pbSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykuaWRsZUFuaW1cblxuICAgICAgQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihucGMsIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykuaWRsZUFuaW0pXG5cbiAgICAgIGlmIChkYXRhICYmIGRhdGEud2Fsa2luZ0FuaW0pIHtcbiAgICAgICAgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbSA9IGRhdGEud2Fsa2luZ0FuaW1cbiAgICAgICAgbGV0IGFuaW1hdGlvbnMgPSBBbmltYXRvci5nZXRNdXRhYmxlKG5wYylcbiAgICAgICAgYW5pbWF0aW9ucy5zdGF0ZXMucHVzaCh7IGNsaXA6IGRhdGEud2Fsa2luZ0FuaW0sIGxvb3A6IHRydWUgfSlcbiAgICAgIH1cblxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgTlBDVHlwZS5CTEFOSzpcbiAgICAgIE1lc2hSZW5kZXJlci5zZXRCb3gobnBjKVxuICAgICAgTWVzaENvbGxpZGVyLnNldEJveChucGMpXG4gICAgICBicmVha1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlZWRBbmltYXRvckZvckV4aXN0aW5nKG5wYzogRW50aXR5LCBkYXRhOiBOUENEYXRhKSB7XG4gIGlmIChkYXRhLnR5cGUgIT09IE5QQ1R5cGUuQ1VTVE9NKSByZXR1cm5cblxuICBjb25zdCBpZGxlQ2xpcCA9IGRhdGEgJiYgZGF0YS5pZGxlQW5pbSA/IGRhdGEuaWRsZUFuaW0gOiAnSWRsZSdcblxuICBpZiAoIUFuaW1hdG9yLmhhcyhucGMpKSB7XG4gICAgQW5pbWF0b3IuY3JlYXRlKG5wYywge1xuICAgICAgc3RhdGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGlwOiBpZGxlQ2xpcCxcbiAgICAgICAgICBsb29wOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBBbmltYXRvci5nZXRNdXRhYmxlKG5wYylcbiAgICBpZiAoYW5pbWF0aW9ucy5zdGF0ZXMuZmlsdGVyKChhbmltYXRpb246IFBCQW5pbWF0aW9uU3RhdGUpID0+IGFuaW1hdGlvbi5jbGlwID09PSBpZGxlQ2xpcCkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhbmltYXRpb25zLnN0YXRlcy5wdXNoKHsgY2xpcDogaWRsZUNsaXAsIGxvb3A6IHRydWUgfSlcbiAgICB9XG4gIH1cblxuICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgbnBjRGF0YS5pZGxlQW5pbSA9IGlkbGVDbGlwXG4gIG5wY0RhdGEubGFzdFBsYXllZEFuaW0gPSBpZGxlQ2xpcFxuICBpZiAodHlwZW9mIGlkbGVDbGlwID09PSAnc3RyaW5nJyAmJiBpZGxlQ2xpcC5sZW5ndGggPiAwKSB7XG4gICAgQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihucGMsIGlkbGVDbGlwKVxuICB9XG5cbiAgaWYgKGRhdGEgJiYgZGF0YS53YWxraW5nQW5pbSkge1xuICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBBbmltYXRvci5nZXRNdXRhYmxlKG5wYylcbiAgICBpZiAodHlwZW9mIGRhdGEud2Fsa2luZ0FuaW0gPT09ICdzdHJpbmcnICYmIGRhdGEud2Fsa2luZ0FuaW0ubGVuZ3RoID4gMCAmJiBhbmltYXRpb25zLnN0YXRlcy5maWx0ZXIoKGFuaW1hdGlvbjogUEJBbmltYXRpb25TdGF0ZSkgPT4gYW5pbWF0aW9uLmNsaXAgPT09IGRhdGEud2Fsa2luZ0FuaW0hKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGFuaW1hdGlvbnMuc3RhdGVzLnB1c2goeyBjbGlwOiBkYXRhLndhbGtpbmdBbmltISwgbG9vcDogdHJ1ZSB9KVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEud2Fsa2luZ0FuaW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBucGNEYXRhLndhbGtpbmdBbmltID0gZGF0YS53YWxraW5nQW5pbVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRDbGlja1JlYWN0aW9ucyhucGM6IEVudGl0eSwgZGF0YTogTlBDRGF0YSkge1xuICBsZXQgYWN0aXZhdGVCdXR0b24gPSBkYXRhICYmIGRhdGEub25seUNsaWNrVHJpZ2dlciA/IElucHV0QWN0aW9uLklBX1BPSU5URVIgOiBJbnB1dEFjdGlvbi5JQV9QUklNQVJZXG5cbiAgLypcbiAgcG9pbnRlckV2ZW50c1N5c3RlbS5vblBvaW50ZXJEb3duKFxuICAgICAge1xuICAgICAgICAgIGVudGl0eTogbnBjLFxuICAgICAgICAgIG9wdHM6IHtcbiAgICAgICAgICAgICAgYnV0dG9uOiBhY3RpdmF0ZUJ1dHRvbixcbiAgICAgICAgICAgICAgaG92ZXJUZXh0OiBkYXRhICYmIGRhdGEuaG92ZXJUZXh0ID8gZGF0YS5ob3ZlclRleHQgOiAnVGFsaycsXG4gICAgICAgICAgICAgIHNob3dGZWVkYmFjazogZGF0YSAmJiBkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIgPyBmYWxzZSA6IHRydWVcbiAgICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICAgIGlmIChpc0Nvb2xkb3duLmhhcyhucGMpIHx8IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKS52aXNpYmxlKSByZXR1cm5cbiAgICAgICAgICBhY3RpdmF0ZShucGMsIGVuZ2luZS5QbGF5ZXJFbnRpdHkpXG4gICAgICB9LFxuICApXG4gICovXG5cbiAgcG9pbnRlckV2ZW50c1N5c3RlbS5vblBvaW50ZXJEb3duKFxuICAgIG5wYyxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXNDb29sZG93bi5oYXMobnBjKSB8fCBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYykudmlzaWJsZSkgcmV0dXJuXG4gICAgICBhY3RpdmF0ZShucGMsIGVuZ2luZS5QbGF5ZXJFbnRpdHkpXG4gICAgfSxcbiAgICB7XG4gICAgICBidXR0b246IGFjdGl2YXRlQnV0dG9uLFxuICAgICAgaG92ZXJUZXh0OiBkYXRhICYmIGRhdGEuaG92ZXJUZXh0ID8gU3RyaW5nKGRhdGEuaG92ZXJUZXh0KSA6ICdUYWxrJyxcbiAgICAgIHNob3dGZWVkYmFjazogZGF0YSAmJiBkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIgPyBmYWxzZSA6IHRydWVcbiAgICB9XG4gIClcblxuICBpZiAoZGF0YSAmJiBkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIpIHtcbiAgICBwb2ludGVyRXZlbnRzU3lzdGVtLnJlbW92ZU9uUG9pbnRlckRvd24obnBjKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRyaWdnZXJBcmVhKG5wYzogRW50aXR5LCBkYXRhOiBOUENEYXRhKSB7XG4gIGxldCB0cmlnZ2VyRGF0YTogVHJpZ2dlckRhdGEgPSB7fVxuXG4gIGlmICghZGF0YSB8fCAoZGF0YSAmJiAhZGF0YS5vbmx5RXh0ZXJuYWxUcmlnZ2VyICYmICFkYXRhLm9ubHlDbGlja1RyaWdnZXIgJiYgIWRhdGEub25seUVUcmlnZ2VyKSkge1xuICAgIG9uQWN0aXZhdGVDYnMuc2V0KG5wYywgKG90aGVyOiBFbnRpdHkpID0+IHtcbiAgICAgIGlmIChpc0Nvb2xkb3duLmhhcyhucGMpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG5wYywgJyBpbiBjb29sZG93bicpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSAmJiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYykudmlzaWJsZSkgfHxcbiAgICAgICAgKGRhdGEgJiYgZGF0YS5vbmx5RXh0ZXJuYWxUcmlnZ2VyKSB8fFxuICAgICAgICAoZGF0YSAmJiBkYXRhLm9ubHlDbGlja1RyaWdnZXIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBkYXRhLm9uQWN0aXZhdGUob3RoZXIpXG4gICAgfSlcbiAgICB0cmlnZ2VyRGF0YS5vbkNhbWVyYUVudGVyID0gb25BY3RpdmF0ZUNicy5nZXQobnBjKVxuICB9XG5cbiAgLy8gd2hlbiBleGl0aW5nIHRyaWdnZXJcbiAgaWYgKCFkYXRhIHx8IChkYXRhICYmICFkYXRhLmNvbnRpbnVlT25XYWxrQXdheSkpIHtcbiAgICB0cmlnZ2VyRGF0YS5vbkNhbWVyYUV4aXQgPSAob3RoZXIpID0+IHtcbiAgICAgIGhhbmRsZVdhbGtBd2F5KG5wYywgb3RoZXIpXG4gICAgfVxuICB9XG5cbiAgLy8gd2hlbiBlbnRlcmluZyB0cmlnZ2VyXG4gIGlmICghZGF0YSB8fCAoZGF0YSAmJiAhZGF0YS5vbmx5RXh0ZXJuYWxUcmlnZ2VyICYmICFkYXRhLm9ubHlDbGlja1RyaWdnZXIgJiYgIWRhdGEub25seUVUcmlnZ2VyKSkge1xuICAgIHRyaWdnZXJEYXRhLm9uQ2FtZXJhRW50ZXIgPSAob3RoZXIpID0+IHtcbiAgICAgIGlmIChpc0Nvb2xkb3duLmhhcyhucGMpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG5wYywgJyBpbiBjb29sZG93bicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gZWxzZSBpZiAoXG4gICAgICAvLyAgICAgKHRoaXMuZGlhbG9nICYmIHRoaXMuZGlhbG9nLmlzRGlhbG9nT3BlbikgfHxcbiAgICAgIC8vICAgICAoZGF0YSAmJiBkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIpIHx8XG4gICAgICAvLyAgICAgKGRhdGEgJiYgZGF0YS5vbmx5Q2xpY2tUcmlnZ2VyKVxuICAgICAgLy8gKSB7XG4gICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAvLyB9XG4gICAgICBhY3RpdmF0ZShucGMsIG90aGVyKVxuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCB0cmlnZ2VyXG5cbiAgaWYgKHRyaWdnZXJEYXRhLm9uQ2FtZXJhRW50ZXIgfHwgdHJpZ2dlckRhdGEub25DYW1lcmFFeGl0KSB7XG5cblxuICAgIGxldCBzcGhlcmVTY2FsZSA9IHtcbiAgICAgIHg6IGRhdGEucmVhY3REaXN0YW5jZSAhPSB1bmRlZmluZWQgPyBkYXRhLnJlYWN0RGlzdGFuY2UgOiA2LFxuICAgICAgeTogZGF0YS5yZWFjdERpc3RhbmNlICE9IHVuZGVmaW5lZCA/IGRhdGEucmVhY3REaXN0YW5jZSA6IDYsXG4gICAgICB6OiBkYXRhLnJlYWN0RGlzdGFuY2UgIT0gdW5kZWZpbmVkID8gZGF0YS5yZWFjdERpc3RhbmNlIDogNlxuICAgIH1cblxuICAgbGV0IHRyaWdnZXJTcGhlcmUgPSBlbmdpbmUuYWRkRW50aXR5KClcblxuICAgVHJhbnNmb3JtLmNyZWF0ZSh0cmlnZ2VyU3BoZXJlLCB7XG4gICAgcG9zaXRpb246IFZlY3RvcjMuWmVybygpLFxuICAgIHJvdGF0aW9uOiBRdWF0ZXJuaW9uLlplcm8oKSxcbiAgICBzY2FsZTogc3BoZXJlU2NhbGUsXG4gICAgcGFyZW50OiBucGNcbiAgIH0pXG5cbiAgIFRyaWdnZXJBcmVhLnNldFNwaGVyZSh0cmlnZ2VyU3BoZXJlKVxuXG4gICAgdHJpZ2dlckFyZWFFdmVudHNTeXN0ZW0ub25UcmlnZ2VyRW50ZXIodHJpZ2dlclNwaGVyZSwgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICBpZiAodHJpZ2dlckRhdGEub25DYW1lcmFFbnRlcikge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSAocmVzdWx0Py50cmlnZ2VyPy5lbnRpdHkgPz8gZW5naW5lLlBsYXllckVudGl0eSkgYXMgRW50aXR5XG4gICAgICAgIGlmIChlbnRpdHkgIT09IGVuZ2luZS5QbGF5ZXJFbnRpdHkpIHJldHVybjtcbiAgICAgICAgdHJpZ2dlckRhdGEub25DYW1lcmFFbnRlcihlbnRpdHkpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRyaWdnZXJBcmVhRXZlbnRzU3lzdGVtLm9uVHJpZ2dlckV4aXQodHJpZ2dlclNwaGVyZSwgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICBpZiAodHJpZ2dlckRhdGEub25DYW1lcmFFeGl0KSB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IChyZXN1bHQ/LnRyaWdnZXI/LmVudGl0eSA/PyBlbmdpbmUuUGxheWVyRW50aXR5KSBhcyBFbnRpdHlcbiAgICAgICAgaWYgKGVudGl0eSAhPT0gZW5naW5lLlBsYXllckVudGl0eSkgcmV0dXJuO1xuICAgICAgICB0cmlnZ2VyRGF0YS5vbkNhbWVyYUV4aXQoZW50aXR5KVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvbGxvd1BhdGgobnBjOiBFbnRpdHksIGRhdGE/OiBGb2xsb3dQYXRoRGF0YSkge1xuICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgbGV0IHBhdGg6IGFueVtdID0gW11cblxuICBpZiAobnBjRGF0YS5mYWNlVXNlcikge1xuICAgIGlmIChUcmFja1VzZXJGbGFnLmhhcyhucGMpKSB7XG4gICAgICBUcmFja1VzZXJGbGFnLmRlbGV0ZUZyb20obnBjKVxuICAgIH1cbiAgfVxuXG4gIGlmIChucGNEYXRhLm1hbnVhbFN0b3ApIHtcbiAgICBsZXQgZHVyYXRpb24gPSBucGNEYXRhLnBhdGhEYXRhLnRvdGFsRHVyYXRpb25cbiAgICBsZXQgY3VycmVudFRpbWVyOiBudW1iZXIgPSB3YWxraW5nVGltZXJzLmdldChucGMpIVxuICAgIC8vY29uc29sZS5sb2coJ2N1cnJlbnQgdGltZSBpcycsIGN1cnJlbnRUaW1lcilcbiAgICBpZiAoY3VycmVudFRpbWVyKSB7XG4gICAgICBkdXJhdGlvbiAtPSBjdXJyZW50VGltZXJcbiAgICB9XG5cbiAgICBsZXQgcGF0aDogYW55W10gPSBbXVxuICAgIG5wY0RhdGEucGF0aERhdGEucGF0aC5mb3JFYWNoKChwOiBhbnkpID0+IHtcbiAgICAgIHBhdGgucHVzaChwKVxuICAgIH0pXG4gICAgcGF0aC5zcGxpY2UoMCwgbnBjRGF0YS5wYXRoSW5kZXgpXG5cbiAgICBsZXQgcG9zID0gVHJhbnNmb3JtLmdldChucGMpLnBvc2l0aW9uXG4gICAgcGF0aC51bnNoaWZ0KFZlY3RvcjMuY3JlYXRlKHBvcy54LCBwb3MueSwgcG9zLnopKVxuICAgIHdhbGtOUEMoXG4gICAgICBucGMsXG4gICAgICBucGNEYXRhLFxuICAgICAgbnBjRGF0YS5wYXRoRGF0YS5wYXRoVHlwZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgcGF0aCxcbiAgICAgIHBvaW50UmVhY2hlZENhbGxiYWNrcy5nZXQobnBjKSxcbiAgICAgIG9uRmluaXNoQ2FsbGJhY2tzLmdldChucGMpXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICBucGNEYXRhLnBhdGhEYXRhID0gZGF0YVxuXG4gICAgICBpZiAoZGF0YS5zdGFydGluZ1BvaW50KSB7XG4gICAgICAgIGRhdGEucGF0aD8uc3BsaWNlKDAsIGRhdGEuc3RhcnRpbmdQb2ludCAtIDEpXG4gICAgICB9XG5cbiAgICAgIGxldCBwb3MgPSBUcmFuc2Zvcm0uZ2V0KG5wYykucG9zaXRpb25cbiAgICAgIHBhdGgucHVzaChWZWN0b3IzLmNyZWF0ZShwb3MueCwgcG9zLnksIHBvcy56KSlcbiAgICAgIGRhdGEucGF0aD8uZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBwYXRoLnB1c2gocClcbiAgICAgIH0pXG5cbiAgICAgIG9uRmluaXNoQ2FsbGJhY2tzLnNldChucGMsICgpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb24gZmluaXNoZWQgY2FsbGJhY2snKVxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLm9uRmluaXNoQ2FsbGJhY2sgJiYgIWRhdGEubG9vcCkge1xuICAgICAgICAgIGRhdGEub25GaW5pc2hDYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgICAgc3RvcFBhdGgobnBjKVxuICAgICAgfSlcblxuICAgICAgcG9pbnRSZWFjaGVkQ2FsbGJhY2tzLnNldChucGMsICgpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb24gcG9pbnQgcmVhY2hlZCBjYWxsYmFjaycpXG4gICAgICAgIGxldCBkYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgICAgICBkYXRhLnBhdGhJbmRleCArPSAxXG4gICAgICAgIGRhdGEub25SZWFjaGVkUG9pbnRDYWxsYmFjayA/IGRhdGEub25SZWFjaGVkUG9pbnRDYWxsYmFjayA6IHVuZGVmaW5lZFxuICAgICAgfSlcbiAgICAgIHdhbGtOUEMoXG4gICAgICAgIG5wYyxcbiAgICAgICAgbnBjRGF0YSxcbiAgICAgICAgZGF0YS5wYXRoVHlwZSEsXG4gICAgICAgIGRhdGEudG90YWxEdXJhdGlvbixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcG9pbnRSZWFjaGVkQ2FsbGJhY2tzLmdldChucGMpLFxuICAgICAgICBvbkZpbmlzaENhbGxiYWNrcy5nZXQobnBjKVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobnBjRGF0YS5tYW51YWxTdG9wKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd3ZSBoYXZlIG1hbnVhbCBzdG9wLCBuZWVkIHRvIHBpY2sgYmFjayB1cCB3aGVyZSB3ZSBsZWZ0IG9mZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnd2UgYXJlIHRyeWluZyB0byBmb2xsb3cgYSBwYXRoIHdpdG91dCBzdGFydGluZyBvbmUgcHJpb3InKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YWxrTlBDKFxuICBucGM6IEVudGl0eSxcbiAgbnBjRGF0YTogYW55LFxuICB0eXBlOiBOUENQYXRoVHlwZSxcbiAgZHVyYXRpb246IG51bWJlcixcbiAgcGF0aDogVmVjdG9yM1tdLFxuICBwb2ludFJlYWNoZWRDYWxsYmFjaz86IGFueSxcbiAgZmluaXNoZWRDYWxsYmFjaz86IGFueVxuKSB7XG4gIGlmIChJc0ZvbGxvd2luZ1BhdGguaGFzKG5wYykpIHtcbiAgICBJc0ZvbGxvd2luZ1BhdGguZGVsZXRlRnJvbShucGMpXG4gICAgd2Fsa2luZ1RpbWVycy5kZWxldGUobnBjKVxuICB9XG4gIElzRm9sbG93aW5nUGF0aC5jcmVhdGUobnBjKVxuXG4gIGlmICh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gTlBDUGF0aFR5cGUuUklHSURfUEFUSCkge1xuICAgICAgcGF0aHMuc3RhcnRTdHJhaWdodFBhdGgoXG4gICAgICAgIG5wYyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHRydWUsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBmaW5pc2hlZENhbGxiYWNrKClcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHBvaW50UmVhY2hlZENhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRocy5zdGFydFNtb290aFBhdGgoXG4gICAgICAgIG5wYyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIDMwLFxuICAgICAgICB0cnVlLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgZmluaXNoZWRDYWxsYmFjaygpXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBwb2ludFJlYWNoZWRDYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGF0aHMuc3RhcnRTbW9vdGhQYXRoKFxuICAgICAgbnBjLFxuICAgICAgcGF0aCxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgMjAsXG4gICAgICB0cnVlLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBmaW5pc2hlZENhbGxiYWNrKClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHBvaW50UmVhY2hlZENhbGxiYWNrKClcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBpZiAobnBjRGF0YS53YWxraW5nQW5pbSkge1xuICAgIGNsZWFyQW5pbWF0aW9uVGltZXIobnBjKVxuICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obnBjLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltLCB0cnVlKVxuICAgIG5wY0RhdGEubGFzdFBsYXllZEFuaW0gPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltXG4gIH1cbiAgbnBjRGF0YS5zdGF0ZSA9IE5QQ1N0YXRlLkZPTExPV1BBVEhcbiAgbnBjRGF0YS5tYW51YWxTdG9wID0gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BXYWxraW5nKG5wYzogRW50aXR5LCBkdXJhdGlvbj86IG51bWJlciwgZmluaXNoZWQ/OiBib29sZWFuKSB7XG4gIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICBucGNEYXRhLnN0YXRlID0gTlBDU3RhdGUuU1RBTkRJTkdcbiAgbnBjRGF0YS5tYW51YWxTdG9wID0gdHJ1ZVxuXG4gIHN0b3BQYXRoKG5wYylcblxuICBpZiAoZHVyYXRpb24pIHtcbiAgICBkZWxheWVkRnVuY3Rpb24oKCkgPT4ge1xuICAgICAgaWYgKG5wY0RhdGEucGF0aCkge1xuICAgICAgICBBbmltYXRvci5zdG9wQWxsQW5pbWF0aW9ucyhucGMsIHRydWUpXG4gICAgICAgIGlmIChucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltKSB7XG4gICAgICAgICAgY2xlYXJBbmltYXRpb25UaW1lcihucGMpXG4gICAgICAgICAgQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihucGMsIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykud2Fsa2luZ0FuaW0sIHRydWUpXG4gICAgICAgICAgbnBjRGF0YS5sYXN0UGxheWVkQW5pbSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykud2Fsa2luZ0FuaW1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZHVyYXRpb24gPSBucGNEYXRhLnBhdGhEYXRhLnRvdGFsRHVyYXRpb25cbiAgICAgICAgbGV0IGN1cnJlbnRUaW1lcjogbnVtYmVyID0gd2Fsa2luZ1RpbWVycy5nZXQobnBjKSFcbiAgICAgICAgY29uc29sZS5sb2coJ2N1cnJlbnQgdGltZSBpcycsIGN1cnJlbnRUaW1lcilcbiAgICAgICAgaWYgKGN1cnJlbnRUaW1lcikge1xuICAgICAgICAgIGR1cmF0aW9uIC09IGN1cnJlbnRUaW1lclxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhdGg6IGFueVtdID0gW11cbiAgICAgICAgbnBjRGF0YS5wYXRoRGF0YS5wYXRoLmZvckVhY2goKHA6IGFueSkgPT4ge1xuICAgICAgICAgIHBhdGgucHVzaChwKVxuICAgICAgICB9KVxuICAgICAgICBwYXRoLnNwbGljZSgwLCBucGNEYXRhLnBhdGhJbmRleClcblxuICAgICAgICBsZXQgcG9zID0gVHJhbnNmb3JtLmdldChucGMpLnBvc2l0aW9uXG4gICAgICAgIHBhdGgudW5zaGlmdChWZWN0b3IzLmNyZWF0ZShwb3MueCwgcG9zLnksIHBvcy56KSlcblxuICAgICAgICAvL25wY0RhdGEubWFudWFsU3RvcCA9IGZhbHNlXG4gICAgICAgIHdhbGtOUEMoXG4gICAgICAgICAgbnBjLFxuICAgICAgICAgIG5wY0RhdGEsXG4gICAgICAgICAgbnBjRGF0YS5wYXRoRGF0YS5wYXRoVHlwZSxcbiAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHBvaW50UmVhY2hlZENhbGxiYWNrcy5nZXQobnBjKSxcbiAgICAgICAgICBvbkZpbmlzaENhbGxiYWNrcy5nZXQobnBjKVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICB9LCBkdXJhdGlvbiAqIDEwMDApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BQYXRoKG5wYzogRW50aXR5KSB7XG4gIHBhdGhzLnN0b3BQYXRoKG5wYylcbiAgSXNGb2xsb3dpbmdQYXRoLmRlbGV0ZUZyb20obnBjKVxuXG4gIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICBpZiAobnBjRGF0YS53YWxraW5nQW5pbSkge1xuICAgIGNsZWFyQW5pbWF0aW9uVGltZXIobnBjKVxuICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obnBjLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLmlkbGVBbmltKVxuICAgIG5wY0RhdGEubGFzdFBsYXllZEFuaW0gPSBucGNEYXRhLmlkbGVBbmltXG4gIH1cblxuICBpZiAoIW5wY0RhdGEubWFudWFsU3RvcCkge1xuICAgIGlmIChucGNEYXRhLnBhdGhEYXRhLmxvb3ApIHtcbiAgICAgIG5wY0RhdGEucGF0aEluZGV4ID0gMFxuICAgICAgd2Fsa2luZ1RpbWVycy5kZWxldGUobnBjKVxuICAgICAgLy9jb25zb2xlLmxvZygnd2UgYXJlIGxvb3BpbmcgcGF0aCcsIG5wY0RhdGEpXG4gICAgICBmb2xsb3dQYXRoKG5wYywgbnBjRGF0YS5wYXRoRGF0YSlcbiAgICAgIC8vY29uc29sZS5sb2cobnBjRGF0YSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyTlBDKCkge1xuICBhY3RpdmVOUEMgPSBOVUxMX05QQ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aXZlTlBDKG5wYzogRW50aXR5KSB7XG4gIGFjdGl2ZU5QQyA9IG5wY1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBY3RpdmVOcGNTZXQoKSB7XG4gIHJldHVybiBhY3RpdmVOUEMgJiYgbnBjRGlhbG9nQ29tcG9uZW50LmhhcyhhY3RpdmVOUEMpXG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIE5QQydzIGFjdGl2YXRpb24gZnVuY3Rpb24gKHNldCBvbiBOUEMgZGVmaW5pdGlvbikuIElmIE5QQyBoYXMgYGZhY2VVc2VyYCA9IHRydWUsIGl0IHdpbGwgcm90YXRlIHRvIGZhY2UgdGhlIHBsYXllci4gSXQgc3RhcnRzIGEgY29vbGRvd24gY291bnRlciB0byBhdm9pZCByZWFjdGl2YXRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3RpdmF0ZShucGM6IEVudGl0eSwgb3RoZXI6IEVudGl0eSkge1xuICBpZiAoYWN0aXZlTlBDICE9IDApIHtcbiAgICAvL2NvbnNvbGUubG9nKCd3ZSBoYXZlIGEgY3VycmVudCBucGMsIG5lZWR0byByZW1vdmUnKVxuICAgIGVuZEludGVyYWN0aW9uKGFjdGl2ZU5QQylcbiAgICAvLyBjbG9zZURpYWxvZyhhY3RpdmVOUEMpXG4gIH1cblxuICBhY3RpdmVOUEMgPSBucGNcbiAgb25BY3RpdmF0ZUNicy5nZXQobnBjKShvdGhlcilcblxuICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgaWYgKG5wY0RhdGEuZmFjZVVzZXIpIHtcbiAgICBpZiAoVHJhY2tVc2VyRmxhZy5oYXMobnBjKSkge1xuICAgICAgVHJhY2tVc2VyRmxhZy5kZWxldGVGcm9tKG5wYylcbiAgICB9XG5cbiAgICBUcmFja1VzZXJGbGFnLmNyZWF0ZShucGMsIHtcbiAgICAgIGxvY2tYWlJvdGF0aW9uOiB0cnVlLFxuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgcm90U3BlZWQ6IG5wY0RhdGEudHVyblNwZWVkXG4gICAgfSlcbiAgfVxuICBpc0Nvb2xkb3duLnNldChucGMsIHRydWUpXG4gIG5wY0RhdGEuaW5Db29sZG93biA9IHRydWVcblxuICBkZWxheWVkRnVuY3Rpb24oKCkgPT4gXG4gICAge1xuICAgICAgaXNDb29sZG93bi5kZWxldGUobnBjKVxuICAgICAgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5pbkNvb2xkb3duID0gZmFsc2VcbiAgICAgIC8vY29uc29sZS5sb2coXCJjb29sZG93biBkZWxldGVkXCIpXG4gICAgfSwgMTAwMCAqIG5wY0RhdGEuY29vbERvd25EdXJhdGlvblxuICApXG5cbiAgLy9jb25zb2xlLmxvZygnYWN0aXZhdGVkIG5wYywnLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLCBcImNvb2xkb3duIGR1cmF0aW9uOiBcIiwgbnBjRGF0YS5jb29sRG93bkR1cmF0aW9uKVxufVxuXG5mdW5jdGlvbiBlbmRJbnRlcmFjdGlvbihucGM6IEVudGl0eSkge1xuICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgbnBjRGF0YS5zdGF0ZSA9IE5QQ1N0YXRlLlNUQU5ESU5HXG5cbiAgaWYgKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSkge1xuICAgIC8vfSAmJiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYykudmlzaWJsZSkge1xuICAgIGNsb3NlRGlhbG9nKG5wYylcbiAgfVxuXG4gIGlmIChucGNEYXRhLmZhY2VVc2VyKSB7XG4gICAgaWYgKFRyYWNrVXNlckZsYWcuaGFzKG5wYykpIHtcbiAgICAgIFRyYWNrVXNlckZsYWcuZGVsZXRlRnJvbShucGMpXG4gICAgfVxuICB9XG5cbiAgLy9jb25zb2xlLmxvZygnZW5kaW5nIGludGVyYWN0aW9uJywgbnBjRGF0YSwgYnViYmxlcy5nZXQobnBjKSlcbiAgaWYgKG5wY0RhdGEuaGFzQnViYmxlICYmIGJ1YmJsZXMuZ2V0KG5wYykuaXNCdWJibGVPcGVuKSB7XG4gICAgY2xvc2VCdWJibGUobnBjKVxuICB9XG59XG5cbi8qKlxuICogRW5kcyBpbnRlcmFjdGlvbiBhbmQgY2FsbHMgdGhlIG9uV2Fsa0F3YXkgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVdhbGtBd2F5KG5wYzogRW50aXR5LCBvdGhlcjogRW50aXR5KSB7XG4gIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICBpZiAobnBjRGF0YS5zdGF0ZSA9PSBOUENTdGF0ZS5GT0xMT1dQQVRIKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBlbmRJbnRlcmFjdGlvbihucGMpXG5cbiAgaWYgKG9uV2Fsa0F3YXlDYnMuZ2V0KG5wYykpIHtcbiAgICBvbldhbGtBd2F5Q2JzLmdldChucGMpKG90aGVyKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF5QW5pbWF0aW9uKG5wYzogRW50aXR5LCBhbmltOiBzdHJpbmcsIG5vTG9vcD86IGJvb2xlYW4sIGR1cmF0aW9uPzogbnVtYmVyKSB7XG4gIGNvbnN0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gIGlmICghbnBjRGF0YSkgcmV0dXJuXG5cbiAgLy8gQXZhdGFyU2hhcGUgcGF0aDogdHJpZ2dlciBlbW90ZSBieSBleHByZXNzaW9uVHJpZ2dlcklkL2V4cHJlc3Npb25UcmlnZ2VyVGltZXN0YW1wXG4gIGlmIChBdmF0YXJTaGFwZS5oYXMobnBjKSkge1xuICAgIGlmIChucGNEYXRhLnN0YXRlID09IE5QQ1N0YXRlLkZPTExPV1BBVEgpIHtcbiAgICAgIHBhdGhzLnN0b3BQYXRoKG5wYylcbiAgICB9XG4gICAgY2xlYXJBbmltYXRpb25UaW1lcihucGMpXG5cbiAgICBjb25zdCB0cmlnZ2VyT25jZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IEF2YXRhclNoYXBlLmdldE11dGFibGUobnBjKVxuICAgICAgOyhhdmF0YXIgYXMgYW55KS5leHByZXNzaW9uVHJpZ2dlcklkID0gYW5pbVxuICAgICAgOyhhdmF0YXIgYXMgYW55KS5leHByZXNzaW9uVHJpZ2dlclRpbWVzdGFtcCA9IChhdmF0YXIgYXMgYW55KS5leHByZXNzaW9uVHJpZ2dlclRpbWVzdGFtcFxuICAgICAgICA/IChhdmF0YXIgYXMgYW55KS5leHByZXNzaW9uVHJpZ2dlclRpbWVzdGFtcCArIDFcbiAgICAgICAgOiAwXG4gICAgfVxuXG4gICAgdHJpZ2dlck9uY2UoKVxuXG4gICAgaWYgKCFub0xvb3AgJiYgZHVyYXRpb24gJiYgZHVyYXRpb24gPiAwKSB7XG4gICAgICBjb25zdCBzY2hlZHVsZU5leHQgPSAoKSA9PiB7XG4gICAgICAgIGFuaW1UaW1lcnMuc2V0KFxuICAgICAgICAgIG5wYyxcbiAgICAgICAgICBkZWxheWVkRnVuY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgdHJpZ2dlck9uY2UoKVxuICAgICAgICAgICAgc2NoZWR1bGVOZXh0KClcbiAgICAgICAgICB9LCAxMDAwICogZHVyYXRpb24pXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHNjaGVkdWxlTmV4dCgpXG4gICAgfVxuXG4gICAgbnBjRGF0YS5sYXN0UGxheWVkQW5pbSA9IGFuaW1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEdMVEYvQW5pbWF0b3IgcGF0aFxuICBjb25zdCBhbmltYXRpb25zID0gQW5pbWF0b3IuZ2V0TXV0YWJsZShucGMpXG4gIGlmICghYW5pbWF0aW9ucykgcmV0dXJuXG5cbiAgaWYgKGFuaW1hdGlvbnMuc3RhdGVzICYmIGFuaW1hdGlvbnMuc3RhdGVzLmZpbHRlcigoYW5pbWF0aW9uOiBQQkFuaW1hdGlvblN0YXRlKSA9PiBhbmltYXRpb24uY2xpcCA9PT0gYW5pbSkubGVuZ3RoID09IDApIHtcbiAgICBhbmltYXRpb25zLnN0YXRlcy5wdXNoKHsgY2xpcDogYW5pbSwgbG9vcDogbm9Mb29wID8gZmFsc2UgOiB0cnVlIH0pXG4gIH1cblxuICBpZiAobnBjRGF0YS5zdGF0ZSA9PSBOUENTdGF0ZS5GT0xMT1dQQVRIKSB7XG4gICAgcGF0aHMuc3RvcFBhdGgobnBjKVxuICB9XG5cbiAgY2xlYXJBbmltYXRpb25UaW1lcihucGMpXG5cbiAgQW5pbWF0b3Iuc3RvcEFsbEFuaW1hdGlvbnMobnBjLCB0cnVlKVxuICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKG5wYywgYW5pbSwgdHJ1ZSlcbiAgaWYgKGR1cmF0aW9uKSB7XG4gICAgY2xlYXJBbmltYXRpb25UaW1lcihucGMpXG4gICAgYW5pbVRpbWVycy5zZXQoXG4gICAgICBucGMsXG4gICAgICBkZWxheWVkRnVuY3Rpb24oKCkgPT4ge1xuICAgICAgICBjbGVhckFuaW1hdGlvblRpbWVyKG5wYylcbiAgICAgICAgQW5pbWF0b3Iuc3RvcEFsbEFuaW1hdGlvbnMobnBjLCB0cnVlKVxuICAgICAgICBpZiAobnBjRGF0YS5pZGxlQW5pbSkge1xuICAgICAgICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obnBjLCBucGNEYXRhLmlkbGVBbmltKVxuICAgICAgICAgIG5wY0RhdGEubGFzdFBsYXllZEFuaW0gPSBucGNEYXRhLmlkbGVBbmltXG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAgKiBkdXJhdGlvbilcbiAgICApXG4gIH1cblxuICBucGNEYXRhLmxhc3RQbGF5ZWRBbmltID0gYW5pbVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlSWRsZUFuaW0obnBjOiBFbnRpdHksIGFuaW1hdGlvbjogc3RyaW5nLCBwbGF5PzogYm9vbGVhbikge1xuICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgbnBjRGF0YS5pZGxlQW5pbSA9IGFuaW1hdGlvblxuXG4gIGxldCBhbmltYXRpb25zID0gQW5pbWF0b3IuZ2V0TXV0YWJsZShucGMpXG4gIGlmIChhbmltYXRpb25zLnN0YXRlcy5maWx0ZXIoKGFuaW0pID0+IGFuaW0uY2xpcCA9PT0gYW5pbWF0aW9uKS5sZW5ndGggPT0gMCkge1xuICAgIGFuaW1hdGlvbnMuc3RhdGVzLnB1c2goeyBjbGlwOiBhbmltYXRpb24sIGxvb3A6IHRydWUgfSlcbiAgfVxuXG4gIGlmIChwbGF5KSB7XG4gICAgcGxheUFuaW1hdGlvbihucGMsIGFuaW1hdGlvbiwgdHJ1ZSlcbiAgICBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLmxhc3RQbGF5ZWRBbmltID0gYW5pbWF0aW9uXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhbGtCdWJibGUobnBjOiBFbnRpdHksIHNjcmlwdDogRGlhbG9nW10sIHN0YXJ0SW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgb3BlbkJ1YmJsZShucGMsIHNjcmlwdCwgc3RhcnRJbmRleClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpYWxvZ1dpbmRvdyhkZWZhdWx0UG9ydHJhaXQ/OiBJbWFnZURhdGEsIHNvdW5kPzogc3RyaW5nKSB7XG4gIGxldCBkaWFsb2cgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgYWRkRGlhbG9nKGRpYWxvZywgc291bmQsIGRlZmF1bHRQb3J0cmFpdClcbiAgcmV0dXJuIGRpYWxvZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3BlbkRpYWxvZ1dpbmRvdyhucGM6IEVudGl0eSwgZGlhbG9nOiBEaWFsb2dbXSwgc3RhcnRJbmRleD86IG51bWJlciB8IHN0cmluZykge1xuICBhY3RpdmVOUEMgPSBucGNcblxuICBpZiAobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpKSB7XG4gICAgbGV0IGluZGV4OiBhbnlcbiAgICBpZiAoIXN0YXJ0SW5kZXgpIHtcbiAgICAgIGluZGV4ID0gMFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0YXJ0SW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICBpbmRleCA9IHN0YXJ0SW5kZXhcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSBmaW5kRGlhbG9nQnlOYW1lKGRpYWxvZywgc3RhcnRJbmRleClcbiAgICB9XG4gICAgb3BlbkRpYWxvZyhucGMsIGRpYWxvZywgaW5kZXgpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlRGlhbG9nV2luZG93KHdpbmRvdzogRW50aXR5KSB7XG4gIGxldCBkaWFsb2cgPSBucGNEaWFsb2dDb21wb25lbnQuZ2V0KHdpbmRvdylcbiAgaWYgKHdpbmRvdykge1xuICAgIGNsb3NlRGlhbG9nKGRpYWxvZylcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhckFuaW1hdGlvblRpbWVyKG5wYzogRW50aXR5KTogYm9vbGVhbiB7XG4gIGlmIChhbmltVGltZXJzLmhhcyhucGMpKSB7XG4gICAgY2xlYXJEZWxheWVkRnVuY3Rpb24oYW5pbVRpbWVycy5nZXQobnBjKSlcbiAgICBhbmltVGltZXJzLmRlbGV0ZShucGMpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cbiJdfQ==