UNPKG

@firestone-hs/replay-parser

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.

144 lines 22.5 kB
import { BlockType, CardType, GameTag, MetaTags } from '@firestone-hs/reference-data'; import isEqual from 'lodash-es/isEqual'; import uniq from 'lodash-es/uniq'; import { AttachingEnchantmentAction } from '../../models/action/attaching-enchantment-action'; import { CardTargetAction } from '../../models/action/card-target-action'; import { PowerTargetAction } from '../../models/action/power-target-action'; import { ActionHistoryItem } from '../../models/history/action-history-item'; import { MetadataHistoryItem } from '../../models/history/metadata-history-item'; import { ActionButtonUsedAction, CardPlayedFromHandAction, SummonAction } from '../../models/models'; import { ActionHelper } from './action-helper'; export class PowerTargetParser { constructor(allCards) { this.allCards = allCards; } applies(item) { if (!(item instanceof MetadataHistoryItem)) { return false; } const meta = item.meta; if (!meta.info && !meta.meta) { return false; } if (meta.meta !== MetaTags[MetaTags.TARGET]) { return false; } return true; } parse(item, currentTurn, entitiesBeforeAction, history) { const meta = item.meta; const parentAction = history .filter(historyItem => historyItem.index === item.meta.parentIndex) .filter(historyItem => historyItem instanceof ActionHistoryItem) .map(historyItem => historyItem)[0]; if (parseInt(parentAction.node.attributes.type) !== BlockType.POWER && parseInt(parentAction.node.attributes.type) !== BlockType.TRIGGER) { return; } // TODO: hard-code Malchezaar? if (meta.info) { // // console.log('building power action', parentAction.node, parentAction, entitiesBeforeAction.get(35)?.tags?.toJS()) return meta.info .map(info => this.buildPowerActions(entitiesBeforeAction, parentAction, meta, info)) .reduce((a, b) => a.concat(b), []); } } buildPowerActions(entities, item, meta, info) { const entityId = parseInt(item.node.attributes.entity); // Prevent a spell from targeting itself if (entityId === info.entity && entities.get(entityId) && entities.get(entityId).getTag(GameTag.CARDTYPE) === CardType.SPELL) { return []; } let target = info.entity; if (!target && parseInt(item.node.attributes.target)) { target = parseInt(item.node.attributes.target); } if (!target) { return []; } return [ PowerTargetAction.create({ timestamp: item.timestamp, index: meta.index, originId: entityId, targetIds: [target], }, this.allCards), ]; } reduce(actions) { return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current)); } shouldMergeActions(previousAction, currentAction) { if (!(currentAction instanceof PowerTargetAction)) { return false; } if (previousAction instanceof PowerTargetAction) { return previousAction.originId === currentAction.originId; } if (previousAction instanceof ActionButtonUsedAction) { return previousAction.entityId === currentAction.originId; } // Spells that target would trigger twice otherwise if (previousAction instanceof CardTargetAction) { return previousAction.originId === currentAction.originId; } if (previousAction instanceof AttachingEnchantmentAction) { if (previousAction.originId === currentAction.originId && isEqual(previousAction.targetIds, currentAction.targetIds)) { return true; } } if (previousAction instanceof CardPlayedFromHandAction) { return previousAction.entityId === currentAction.originId; } if (previousAction instanceof SummonAction) { return previousAction.originId === currentAction.originId; } return false; } mergeActions(previousAction, currentAction) { if (!(currentAction instanceof PowerTargetAction)) { console.warn('incorrect currentAction as current action for power-target-parser', currentAction); return; } if (previousAction instanceof PowerTargetAction || previousAction instanceof CardTargetAction) { return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, originId: currentAction.originId, targetIds: uniq([ ...uniq(previousAction.targetIds || []), ...uniq(currentAction.targetIds || []), ]), }); } else if (previousAction instanceof AttachingEnchantmentAction) { return previousAction; } else if (previousAction instanceof SummonAction) { return previousAction; } else if (previousAction instanceof ActionButtonUsedAction) { return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, entityId: previousAction.entityId, targetIds: uniq([ ...uniq(previousAction.targetIds || []), ...uniq(currentAction.targetIds || []), ]), }); } else if (previousAction instanceof CardPlayedFromHandAction) { return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, originId: previousAction.entityId, targetIds: uniq([ ...uniq(previousAction.targetIds || []), ...uniq(currentAction.targetIds || []), ]), }); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93ZXItdGFyZ2V0LXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vcG93ZXItdGFyZ2V0LXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdEYsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDOUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSXJHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcvQyxNQUFNLE9BQU8saUJBQWlCO0lBQzdCLFlBQW9CLFFBQXlCO1FBQXpCLGFBQVEsR0FBUixRQUFRLENBQWlCO0lBQUcsQ0FBQztJQUUxQyxPQUFPLENBQUMsSUFBaUI7UUFDL0IsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLG1CQUFtQixDQUFDLEVBQUU7WUFDM0MsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJ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YyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7b0JBQ3ZDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO2lCQUN0QyxDQUFzQjthQUNHLENBQUMsQ0FBQztTQUM3QjthQUFNLElBQUksY0FBYyxZQUFZLHdCQUF3QixFQUFFO1lBQzlELE9BQU8sWUFBWSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUU7Z0JBQ3ZFLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDaEMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO2dCQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDO29CQUNmLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO29CQUN2QyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztpQkFDdEMsQ0FBc0I7YUFDSyxDQUFDLENBQUM7U0FDL0I7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja1R5cGUsIENhcmRUeXBlLCBHYW1lVGFnLCBNZXRhVGFncyB9IGZyb20gJ0BmaXJlc3RvbmUtaHMvcmVmZXJlbmNlLWRhdGEnO1xyXG5pbXBvcnQgeyBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xyXG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gtZXMvaXNFcXVhbCc7XHJcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC1lcy91bmlxJztcclxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9hY3Rpb24nO1xyXG5pbXBvcnQgeyBBdHRhY2hpbmdFbmNoYW50bWVudEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vYXR0YWNoaW5nLWVuY2hhbnRtZW50LWFjdGlvbic7XHJcbmltcG9ydCB7IENhcmRUYXJnZXRBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL2NhcmQtdGFyZ2V0LWFjdGlvbic7XHJcbmltcG9ydCB7IFBvd2VyVGFyZ2V0QWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9wb3dlci10YXJnZXQtYWN0aW9uJztcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvZW50aXR5JztcclxuaW1wb3J0IHsgQWN0aW9uSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9hY3Rpb24taGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBNZXRhZGF0YUhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvbWV0YWRhdGEtaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgQWN0aW9uQnV0dG9uVXNlZEFjdGlvbiwgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uLCBTdW1tb25BY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvbW9kZWxzJztcclxuaW1wb3J0IHsgSW5mbyB9IGZyb20gJy4uLy4uL21vZGVscy9wYXJzZXIvaW5mbyc7XHJcbmltcG9ydCB7IE1ldGFEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BhcnNlci9tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEFsbENhcmRzU2VydmljZSB9IGZyb20gJy4uL2FsbC1jYXJkcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWN0aW9uSGVscGVyIH0gZnJvbSAnLi9hY3Rpb24taGVscGVyJztcclxuaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBvd2VyVGFyZ2V0UGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHtcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFsbENhcmRzOiBBbGxDYXJkc1NlcnZpY2UpIHt9XHJcblxyXG5cdHB1YmxpYyBhcHBsaWVzKGl0ZW06IEhpc3RvcnlJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIShpdGVtIGluc3RhbmNlb2YgTWV0YWRhdGFIaXN0b3J5SXRlbSkpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgbWV0YSA9IGl0ZW0ubWV0YTtcclxuXHRcdGlmICghbWV0YS5pbmZvICYmICFtZXRhLm1ldGEpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKG1ldGEubWV0YSAhPT0gTWV0YVRhZ3NbTWV0YVRhZ3MuVEFSR0VUXSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBwYXJzZShcclxuXHRcdGl0ZW06IE1ldGFkYXRhSGlzdG9yeUl0ZW0sXHJcblx0XHRjdXJyZW50VHVybjogbnVtYmVyLFxyXG5cdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb246IE1hcDxudW1iZXIsIEVudGl0eT4sXHJcblx0XHRoaXN0b3J5OiByZWFkb25seSBIaXN0b3J5SXRlbVtdLFxyXG5cdCk6IEFjdGlvbltdIHtcclxuXHRcdGNvbnN0IG1ldGEgPSBpdGVtLm1ldGE7XHJcblx0XHRjb25zdCBwYXJlbnRBY3Rpb24gPSBoaXN0b3J5XHJcblx0XHRcdC5maWx0ZXIoaGlzdG9yeUl0ZW0gPT4gaGlzdG9yeUl0ZW0uaW5kZXggPT09IGl0ZW0ubWV0YS5wYXJlbnRJbmRleClcclxuXHRcdFx0LmZpbHRlcihoaXN0b3J5SXRlbSA9PiBoaXN0b3J5SXRlbSBpbnN0YW5jZW9mIEFjdGlvbkhpc3RvcnlJdGVtKVxyXG5cdFx0XHQubWFwKGhpc3RvcnlJdGVtID0+IGhpc3RvcnlJdGVtIGFzIEFjdGlvbkhpc3RvcnlJdGVtKVswXTtcclxuXHRcdGlmIChcclxuXHRcdFx0cGFyc2VJbnQocGFyZW50QWN0aW9uLm5vZGUuYXR0cmlidXRlcy50eXBlKSAhPT0gQmxvY2tUeXBlLlBPV0VSICYmXHJcblx0XHRcdHBhcnNlSW50KHBhcmVudEFjdGlvbi5ub2RlLmF0dHJpYnV0ZXMudHlwZSkgIT09IEJsb2NrVHlwZS5UUklHR0VSXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Ly8gVE9ETzogaGFyZC1jb2RlIE1hbGNoZXphYXI/XHJcblx0XHRpZiAobWV0YS5pbmZvKSB7XHJcblx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdidWlsZGluZyBwb3dlciBhY3Rpb24nLCBwYXJlbnRBY3Rpb24ubm9kZSwgcGFyZW50QWN0aW9uLCBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoMzUpPy50YWdzPy50b0pTKCkpXHJcblx0XHRcdHJldHVybiBtZXRhLmluZm9cclxuXHRcdFx0XHQubWFwKGluZm8gPT4gdGhpcy5idWlsZFBvd2VyQWN0aW9ucyhlbnRpdGllc0JlZm9yZUFjdGlvbiwgcGFyZW50QWN0aW9uLCBtZXRhLCBpbmZvKSlcclxuXHRcdFx0XHQucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBidWlsZFBvd2VyQWN0aW9ucyhcclxuXHRcdGVudGl0aWVzOiBNYXA8bnVtYmVyLCBFbnRpdHk+LFxyXG5cdFx0aXRlbTogQWN0aW9uSGlzdG9yeUl0ZW0sXHJcblx0XHRtZXRhOiBNZXRhRGF0YSxcclxuXHRcdGluZm86IEluZm8sXHJcblx0KTogUG93ZXJUYXJnZXRBY3Rpb25bXSB7XHJcblx0XHRjb25zdCBlbnRpdHlJZCA9IHBhcnNlSW50KGl0ZW0ubm9kZS5hdHRyaWJ1dGVzLmVudGl0eSk7XHJcblx0XHQvLyBQcmV2ZW50IGEgc3BlbGwgZnJvbSB0YXJnZXRpbmcgaXRzZWxmXHJcblx0XHRpZiAoXHJcblx0XHRcdGVudGl0eUlkID09PSBpbmZvLmVudGl0eSAmJlxyXG5cdFx0XHRlbnRpdGllcy5nZXQoZW50aXR5SWQpICYmXHJcblx0XHRcdGVudGl0aWVzLmdldChlbnRpdHlJZCkuZ2V0VGFnKEdhbWVUYWcuQ0FSRFRZUEUpID09PSBDYXJkVHlwZS5TUEVMTFxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHRcdGxldCB0YXJnZXQgPSBpbmZvLmVudGl0eTtcclxuXHRcdGlmICghdGFyZ2V0ICYmIHBhcnNlSW50KGl0ZW0ubm9kZS5hdHRyaWJ1dGVzLnRhcmdldCkpIHtcclxuXHRcdFx0dGFyZ2V0ID0gcGFyc2VJbnQoaXRlbS5ub2RlLmF0dHJpYnV0ZXMudGFyZ2V0KTtcclxuXHRcdH1cclxuXHRcdGlmICghdGFyZ2V0KSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBbXHJcblx0XHRcdFBvd2VyVGFyZ2V0QWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR0aW1lc3RhbXA6IGl0ZW0udGltZXN0YW1wLFxyXG5cdFx0XHRcdFx0aW5kZXg6IG1ldGEuaW5kZXgsXHJcblx0XHRcdFx0XHRvcmlnaW5JZDogZW50aXR5SWQsXHJcblx0XHRcdFx0XHR0YXJnZXRJZHM6IFt0YXJnZXRdLFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dGhpcy5hbGxDYXJkcyxcclxuXHRcdFx0KSxcclxuXHRcdF07XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgcmVkdWNlKGFjdGlvbnM6IHJlYWRvbmx5IEFjdGlvbltdKTogcmVhZG9ubHkgQWN0aW9uW10ge1xyXG5cdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5jb21iaW5lQWN0aW9uczxBY3Rpb24+KFxyXG5cdFx0XHRhY3Rpb25zLFxyXG5cdFx0XHQocHJldmlvdXMsIGN1cnJlbnQpID0+IHRoaXMuc2hvdWxkTWVyZ2VBY3Rpb25zKHByZXZpb3VzLCBjdXJyZW50KSxcclxuXHRcdFx0KHByZXZpb3VzLCBjdXJyZW50KSA9PiB0aGlzLm1lcmdlQWN0aW9ucyhwcmV2aW91cywgY3VycmVudCksXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzaG91bGRNZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IEFjdGlvbiwgY3VycmVudEFjdGlvbjogQWN0aW9uKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIShjdXJyZW50QWN0aW9uIGluc3RhbmNlb2YgUG93ZXJUYXJnZXRBY3Rpb24pKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIFBvd2VyVGFyZ2V0QWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBwcmV2aW91c0FjdGlvbi5vcmlnaW5JZCA9PT0gY3VycmVudEFjdGlvbi5vcmlnaW5JZDtcclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkJ1dHRvblVzZWRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIHByZXZpb3VzQWN0aW9uLmVudGl0eUlkID09PSBjdXJyZW50QWN0aW9uLm9yaWdpbklkO1xyXG5cdFx0fVxyXG5cdFx0Ly8gU3BlbGxzIHRoYXQgdGFyZ2V0IHdvdWxkIHRyaWdnZXIgdHdpY2Ugb3RoZXJ3aXNlXHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBDYXJkVGFyZ2V0QWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBwcmV2aW91c0FjdGlvbi5vcmlnaW5JZCA9PT0gY3VycmVudEFjdGlvbi5vcmlnaW5JZDtcclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIEF0dGFjaGluZ0VuY2hhbnRtZW50QWN0aW9uKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbi5vcmlnaW5JZCA9PT0gY3VycmVudEFjdGlvbi5vcmlnaW5JZCAmJlxyXG5cdFx0XHRcdGlzRXF1YWwocHJldmlvdXNBY3Rpb24udGFyZ2V0SWRzLCBjdXJyZW50QWN0aW9uLnRhcmdldElkcylcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRQbGF5ZWRGcm9tSGFuZEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb24uZW50aXR5SWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQ7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBTdW1tb25BY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIHByZXZpb3VzQWN0aW9uLm9yaWdpbklkID09PSBjdXJyZW50QWN0aW9uLm9yaWdpbklkO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBtZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IEFjdGlvbiwgY3VycmVudEFjdGlvbjogQWN0aW9uKTogQWN0aW9uIHtcclxuXHRcdGlmICghKGN1cnJlbnRBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbikpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdpbmNvcnJlY3QgY3VycmVudEFjdGlvbiBhcyBjdXJyZW50IGFjdGlvbiBmb3IgcG93ZXItdGFyZ2V0LXBhcnNlcicsIGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbiB8fCBwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRUYXJnZXRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5tZXJnZUludG9GaXJzdEFjdGlvbihwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbiwge1xyXG5cdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0XHRcdG9yaWdpbklkOiBjdXJyZW50QWN0aW9uLm9yaWdpbklkLFxyXG5cdFx0XHRcdHRhcmdldElkczogdW5pcShbXHJcblx0XHRcdFx0XHQuLi51bmlxKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdFx0XHQuLi51bmlxKGN1cnJlbnRBY3Rpb24udGFyZ2V0SWRzIHx8IFtdKSxcclxuXHRcdFx0XHRdKSBhcyByZWFkb25seSBudW1iZXJbXSxcclxuXHRcdFx0fSBhcyBQb3dlclRhcmdldEFjdGlvbik7XHJcblx0XHR9IGVsc2UgaWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQXR0YWNoaW5nRW5jaGFudG1lbnRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIHByZXZpb3VzQWN0aW9uO1xyXG5cdFx0fSBlbHNlIGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIFN1bW1vbkFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb247XHJcblx0XHR9IGVsc2UgaWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uQnV0dG9uVXNlZEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLm1lcmdlSW50b0ZpcnN0QWN0aW9uKHByZXZpb3VzQWN0aW9uLCBjdXJyZW50QWN0aW9uLCB7XHJcblx0XHRcdFx0ZW50aXRpZXM6IGN1cnJlbnRBY3Rpb24uZW50aXRpZXMsXHJcblx0XHRcdFx0ZW50aXR5SWQ6IHByZXZpb3VzQWN0aW9uLmVudGl0eUlkLFxyXG5cdFx0XHRcdHRhcmdldElkczogdW5pcShbXHJcblx0XHRcdFx0XHQuLi51bmlxKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdFx0XHQuLi51bmlxKGN1cnJlbnRBY3Rpb24udGFyZ2V0SWRzIHx8IFtdKSxcclxuXHRcdFx0XHRdKSBhcyByZWFkb25seSBudW1iZXJbXSxcclxuXHRcdFx0fSBhcyBBY3Rpb25CdXR0b25Vc2VkQWN0aW9uKTtcclxuXHRcdH0gZWxzZSBpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5tZXJnZUludG9GaXJzdEFjdGlvbihwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbiwge1xyXG5cdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0XHRcdG9yaWdpbklkOiBwcmV2aW91c0FjdGlvbi5lbnRpdHlJZCxcclxuXHRcdFx0XHR0YXJnZXRJZHM6IHVuaXEoW1xyXG5cdFx0XHRcdFx0Li4udW5pcShwcmV2aW91c0FjdGlvbi50YXJnZXRJZHMgfHwgW10pLFxyXG5cdFx0XHRcdFx0Li4udW5pcShjdXJyZW50QWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdFx0XSkgYXMgcmVhZG9ubHkgbnVtYmVyW10sXHJcblx0XHRcdH0gYXMgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIl19