/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Input, IterableDiffers, Output } from '@angular/core';
import { BasicList } from './basic-list';
/** @type {?} */
var nextId = 0;
export class DualListComponent {
/**
* @param {?} differs
*/
constructor(differs) {
this.differs = differs;
this.id = `dual-list-${nextId++}`;
this.key = '_id';
this.display = '_name';
this.height = '100px';
this.filter = false;
this.format = DualListComponent.DEFAULT_FORMAT;
this.sort = false;
this.disabled = false;
this.destinationChange = new EventEmitter();
this.sorter = (/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => { return (a._name < b._name) ? -1 : ((a._name > b._name) ? 1 : 0); });
this.available = new BasicList(DualListComponent.AVAILABLE_LIST_NAME);
this.confirmed = new BasicList(DualListComponent.CONFIRMED_LIST_NAME);
}
/**
* @param {?} changeRecord
* @return {?}
*/
ngOnChanges(changeRecord) {
if (changeRecord['filter']) {
if (changeRecord['filter'].currentValue === false) {
this.clearFilter(this.available);
this.clearFilter(this.confirmed);
}
}
if (changeRecord['sort']) {
if (changeRecord['sort'].currentValue === true && this.compare === undefined) {
this.compare = this.sorter;
}
else if (changeRecord['sort'].currentValue === false) {
this.compare = undefined;
}
}
if (changeRecord['format']) {
this.format = changeRecord['format'].currentValue;
if (typeof (this.format.direction) === 'undefined') {
this.format.direction = DualListComponent.LTR;
}
if (typeof (this.format.add) === 'undefined') {
this.format.add = DualListComponent.DEFAULT_FORMAT.add;
}
if (typeof (this.format.remove) === 'undefined') {
this.format.remove = DualListComponent.DEFAULT_FORMAT.remove;
}
if (typeof (this.format.all) === 'undefined') {
this.format.all = DualListComponent.DEFAULT_FORMAT.all;
}
if (typeof (this.format.none) === 'undefined') {
this.format.none = DualListComponent.DEFAULT_FORMAT.none;
}
if (typeof (this.format.draggable) === 'undefined') {
this.format.draggable = DualListComponent.DEFAULT_FORMAT.draggable;
}
}
if (changeRecord['source']) {
this.available = new BasicList(DualListComponent.AVAILABLE_LIST_NAME);
this.updatedSource();
this.updatedDestination();
}
if (changeRecord['destination']) {
this.confirmed = new BasicList(DualListComponent.CONFIRMED_LIST_NAME);
this.updatedDestination();
this.updatedSource();
}
}
/**
* @return {?}
*/
ngDoCheck() {
if (this.source && this.buildAvailable(this.source)) {
this.onFilter(this.available);
}
if (this.destination && this.buildConfirmed(this.destination)) {
this.onFilter(this.confirmed);
}
}
/**
* @param {?} source
* @return {?}
*/
buildAvailable(source) {
/** @type {?} */
const sourceChanges = this.sourceDiffer.diff(source);
if (sourceChanges) {
sourceChanges.forEachRemovedItem((/**
* @param {?} r
* @return {?}
*/
(r) => {
/** @type {?} */
const idx = this.findItemIndex(this.available.list, r.item, this.key);
if (idx !== -1) {
this.available.list.splice(idx, 1);
}
}));
sourceChanges.forEachAddedItem((/**
* @param {?} r
* @return {?}
*/
(r) => {
// Do not add duplicates even if source has duplicates.
if (this.findItemIndex(this.available.list, r.item, this.key) === -1) {
this.available.list.push({ _id: this.makeId(r.item), _name: this.makeName(r.item) });
}
}));
if (this.compare !== undefined) {
this.available.list.sort(this.compare);
}
this.available.sift = this.available.list;
return true;
}
return false;
}
/**
* @param {?} destination
* @return {?}
*/
buildConfirmed(destination) {
/** @type {?} */
let moved = false;
/** @type {?} */
const destChanges = this.destinationDiffer.diff(destination);
if (destChanges) {
destChanges.forEachRemovedItem((/**
* @param {?} r
* @return {?}
*/
(r) => {
/** @type {?} */
const idx = this.findItemIndex(this.confirmed.list, r.item, this.key);
if (idx !== -1) {
if (!this.isItemSelected(this.confirmed.pick, this.confirmed.list[idx])) {
this.selectItem(this.confirmed.pick, this.confirmed.list[idx]);
}
this.moveItem(this.confirmed, this.available, this.confirmed.list[idx], false);
moved = true;
}
}));
destChanges.forEachAddedItem((/**
* @param {?} r
* @return {?}
*/
(r) => {
/** @type {?} */
const idx = this.findItemIndex(this.available.list, r.item, this.key);
if (idx !== -1) {
if (!this.isItemSelected(this.available.pick, this.available.list[idx])) {
this.selectItem(this.available.pick, this.available.list[idx]);
}
this.moveItem(this.available, this.confirmed, this.available.list[idx], false);
moved = true;
}
}));
if (this.compare !== undefined) {
this.confirmed.list.sort(this.compare);
}
this.confirmed.sift = this.confirmed.list;
if (moved) {
this.trueUp();
}
return true;
}
return false;
}
/**
* @return {?}
*/
updatedSource() {
this.available.list.length = 0;
this.available.pick.length = 0;
if (this.source !== undefined) {
this.sourceDiffer = this.differs.find(this.source).create(null);
}
}
/**
* @return {?}
*/
updatedDestination() {
if (this.destination !== undefined) {
this.destinationDiffer = this.differs.find(this.destination).create(null);
}
}
/**
* @return {?}
*/
direction() {
return this.format.direction === DualListComponent.LTR;
}
/**
* @param {?=} list
* @return {?}
*/
dragEnd(list = null) {
if (list) {
list.dragStart = false;
}
else {
this.available.dragStart = false;
this.confirmed.dragStart = false;
}
return false;
}
/**
* @param {?} event
* @param {?} item
* @param {?} list
* @return {?}
*/
drag(event, item, list) {
if (!this.isItemSelected(list.pick, item)) {
this.selectItem(list.pick, item);
}
list.dragStart = true;
// Set a custom type to be this dual-list's id.
event.dataTransfer.setData(this.id, item['_id']);
}
/**
* @param {?} event
* @param {?} list
* @return {?}
*/
allowDrop(event, list) {
if (event.dataTransfer.types.length && (event.dataTransfer.types[0] === this.id)) {
event.preventDefault();
if (!list.dragStart) {
list.dragOver = true;
}
}
return false;
}
/**
* @return {?}
*/
dragLeave() {
this.available.dragOver = false;
this.confirmed.dragOver = false;
}
/**
* @param {?} event
* @param {?} list
* @return {?}
*/
drop(event, list) {
if (event.dataTransfer.types.length && (event.dataTransfer.types[0] === this.id)) {
event.preventDefault();
this.dragLeave();
this.dragEnd();
if (list === this.available) {
this.moveItem(this.available, this.confirmed);
}
else {
this.moveItem(this.confirmed, this.available);
}
}
}
/**
* @private
* @return {?}
*/
trueUp() {
/** @type {?} */
let changed = false;
// Clear removed items.
/** @type {?} */
let pos = this.destination.length;
while ((pos -= 1) >= 0) {
/** @type {?} */
const mv = this.confirmed.list.filter((/**
* @param {?} conf
* @return {?}
*/
conf => {
if (typeof this.destination[pos] === 'object') {
return conf._id === this.destination[pos][this.key];
}
else {
return conf._id === this.destination[pos];
}
}));
if (mv.length === 0) {
// Not found so remove.
this.destination.splice(pos, 1);
changed = true;
}
}
// Push added items.
for (let i = 0, len = this.confirmed.list.length; i < len; i += 1) {
/** @type {?} */
let mv = this.destination.filter((/**
* @param {?} d
* @return {?}
*/
(d) => {
if (typeof d === 'object') {
return (d[this.key] === this.confirmed.list[i]._id);
}
else {
return (d === this.confirmed.list[i]._id);
}
}));
if (mv.length === 0) {
// Not found so add.
mv = this.source.filter((/**
* @param {?} o
* @return {?}
*/
(o) => {
if (typeof o === 'object') {
return (o[this.key] === this.confirmed.list[i]._id);
}
else {
return (o === this.confirmed.list[i]._id);
}
}));
if (mv.length > 0) {
this.destination.push(mv[0]);
changed = true;
}
}
}
if (changed) {
this.destinationChange.emit(this.destination);
}
}
/**
* @param {?} list
* @param {?} item
* @param {?=} key
* @return {?}
*/
findItemIndex(list, item, key = '_id') {
/** @type {?} */
let idx = -1;
/**
* @param {?} e
* @return {?}
*/
function matchObject(e) {
if (e._id === item[key]) {
idx = list.indexOf(e);
return true;
}
return false;
}
/**
* @param {?} e
* @return {?}
*/
function match(e) {
if (e._id === item) {
idx = list.indexOf(e);
return true;
}
return false;
}
// Assumption is that the arrays do not have duplicates.
if (typeof item === 'object') {
list.filter(matchObject);
}
else {
list.filter(match);
}
return idx;
}
/**
* @private
* @param {?} source
* @param {?} item
* @return {?}
*/
makeUnavailable(source, item) {
/** @type {?} */
const idx = source.list.indexOf(item);
if (idx !== -1) {
source.list.splice(idx, 1);
}
}
/**
* @param {?} source
* @param {?} target
* @param {?=} item
* @param {?=} trueup
* @return {?}
*/
moveItem(source, target, item = null, trueup = true) {
/** @type {?} */
let i = 0;
/** @type {?} */
let len = source.pick.length;
if (item) {
i = source.list.indexOf(item);
len = i + 1;
}
for (; i < len; i += 1) {
// Is the pick still in list?
/** @type {?} */
let mv = [];
if (item) {
/** @type {?} */
const idx = this.findItemIndex(source.pick, item);
if (idx !== -1) {
mv[0] = source.pick[idx];
}
}
else {
mv = source.list.filter((/**
* @param {?} src
* @return {?}
*/
src => {
return (src._id === source.pick[i]._id);
}));
}
// Should only ever be 1
if (mv.length === 1) {
// Add if not already in target.
if (target.list.filter((/**
* @param {?} trg
* @return {?}
*/
trg => trg._id === mv[0]._id)).length === 0) {
target.list.push(mv[0]);
}
this.makeUnavailable(source, mv[0]);
}
}
if (this.compare !== undefined) {
target.list.sort(this.compare);
}
source.pick.length = 0;
// Update destination
if (trueup) {
this.trueUp();
}
// Delay ever-so-slightly to prevent race condition.
setTimeout((/**
* @return {?}
*/
() => {
this.onFilter(source);
this.onFilter(target);
}), 10);
}
/**
* @param {?} list
* @param {?} item
* @return {?}
*/
isItemSelected(list, item) {
if (list.filter((/**
* @param {?} e
* @return {?}
*/
e => Object.is(e, item))).length > 0) {
return true;
}
return false;
}
/**
* @param {?} event
* @param {?} index
* @param {?} source
* @param {?} item
* @return {?}
*/
shiftClick(event, index, source, item) {
if (event.shiftKey && source.last && !Object.is(item, source.last)) {
/** @type {?} */
const idx = source.sift.indexOf(source.last);
if (index > idx) {
for (let i = (idx + 1); i < index; i += 1) {
this.selectItem(source.pick, source.sift[i]);
}
}
else if (idx !== -1) {
for (let i = (index + 1); i < idx; i += 1) {
this.selectItem(source.pick, source.sift[i]);
}
}
}
source.last = item;
}
/**
* @param {?} list
* @param {?} item
* @return {?}
*/
selectItem(list, item) {
/** @type {?} */
const pk = list.filter((/**
* @param {?} e
* @return {?}
*/
(e) => {
return Object.is(e, item);
}));
if (pk.length > 0) {
// Already in list, so deselect.
for (let i = 0, len = pk.length; i < len; i += 1) {
/** @type {?} */
const idx = list.indexOf(pk[i]);
if (idx !== -1) {
list.splice(idx, 1);
}
}
}
else {
list.push(item);
}
}
/**
* @param {?} source
* @return {?}
*/
selectAll(source) {
source.pick.length = 0;
source.pick = source.sift.slice(0);
}
/**
* @param {?} source
* @return {?}
*/
selectNone(source) {
source.pick.length = 0;
}
/**
* @param {?} source
* @return {?}
*/
isAllSelected(source) {
if (source.list.length === 0 || source.list.length === source.pick.length) {
return true;
}
return false;
}
/**
* @param {?} source
* @return {?}
*/
isAnySelected(source) {
if (source.pick.length > 0) {
return true;
}
return false;
}
/**
* @private
* @param {?} source
* @return {?}
*/
unpick(source) {
for (let i = source.pick.length - 1; i >= 0; i -= 1) {
if (source.sift.indexOf(source.pick[i]) === -1) {
source.pick.splice(i, 1);
}
}
}
/**
* @param {?} source
* @return {?}
*/
clearFilter(source) {
if (source) {
source.picker = '';
this.onFilter(source);
}
}
/**
* @param {?} source
* @return {?}
*/
onFilter(source) {
if (source.picker.length > 0) {
try {
/** @type {?} */
const filtered = source.list.filter((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (Object.prototype.toString.call(item) === '[object Object]') {
if (item._name !== undefined) {
// @ts-ignore: remove when d.ts has locale as an argument.
return item._name.toLocaleLowerCase(this.format.locale).indexOf(source.picker.toLocaleLowerCase(this.format.locale)) !== -1;
}
else {
// @ts-ignore: remove when d.ts has locale as an argument.
return JSON.stringify(item).toLocaleLowerCase(this.format.locale).indexOf(source.picker.toLocaleLowerCase(this.format.locale)) !== -1;
}
}
else {
// @ts-ignore: remove when d.ts has locale as an argument.
return item.toLocaleLowerCase(this.format.locale).indexOf(source.picker.toLocaleLowerCase(this.format.locale)) !== -1;
}
}));
source.sift = filtered;
this.unpick(source);
}
catch (e) {
if (e instanceof RangeError) {
this.format.locale = undefined;
}
source.sift = source.list;
}
}
else {
source.sift = source.list;
}
}
/**
* @private
* @param {?} item
* @return {?}
*/
makeId(item) {
if (typeof item === 'object') {
return item[this.key];
}
else {
return item;
}
}
// Allow for complex names by passing an array of strings.
// Example: [display]="[ '_type.substring(0,1)', '_name' ]"
/**
* @protected
* @param {?} item
* @param {?=} separator
* @return {?}
*/
makeName(item, separator = '_') {
/** @type {?} */
const display = this.display;
/**
* @param {?} itm
* @return {?}
*/
function fallback(itm) {
switch (Object.prototype.toString.call(itm)) {
case '[object Number]':
return itm;
case '[object String]':
return itm;
default:
if (itm !== undefined) {
return itm[display];
}
else {
return 'undefined';
}
}
}
/** @type {?} */
let str = '';
if (this.display !== undefined) {
switch (Object.prototype.toString.call(this.display)) {
case '[object Function]':
str = this.display(item);
break;
case '[object Array]':
for (let i = 0, len = this.display.length; i < len; i += 1) {
if (str.length > 0) {
str = str + separator;
}
if (this.display[i].indexOf('.') === -1) {
// Simple, just add to string.
str = str + item[this.display[i]];
}
else {
// Complex, some action needs to be performed
/** @type {?} */
const parts = this.display[i].split('.');
/** @type {?} */
const s = item[parts[0]];
if (s) {
// Use brute force
if (parts[1].indexOf('substring') !== -1) {
/** @type {?} */
const nums = (parts[1].substring(parts[1].indexOf('(') + 1, parts[1].indexOf(')'))).split(',');
switch (nums.length) {
case 1:
str = str + s.substring(parseInt(nums[0], 10));
break;
case 2:
str = str + s.substring(parseInt(nums[0], 10), parseInt(nums[1], 10));
break;
default:
str = str + s;
break;
}
}
else {
// method not approved, so just add s.
str = str + s;
}
}
}
}
break;
default:
str = fallback(item);
break;
}
}
else {
str = fallback(item);
}
return str;
}
}
DualListComponent.AVAILABLE_LIST_NAME = 'available';
DualListComponent.CONFIRMED_LIST_NAME = 'confirmed';
DualListComponent.LTR = 'left-to-right';
DualListComponent.RTL = 'right-to-left';
DualListComponent.DEFAULT_FORMAT = {
add: 'Add',
remove: 'Remove',
all: 'All',
none: 'None',
direction: DualListComponent.LTR,
draggable: true,
locale: undefined
};
DualListComponent.decorators = [
{ type: Component, args: [{
selector: 'dual-list',
template: "
\n\t
\n\t\t
\n\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t
\n\n\t
\n\t\t
\n\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t
\n
\n",
styles: ["div.record-picker{overflow-x:hidden;overflow-y:auto;border:1px solid #ddd;border-radius:8px;position:relative;cursor:pointer;scrollbar-base-color:#337ab7;scrollbar-3dlight-color:#337ab7;scrollbar-highlight-color:#337ab7;scrollbar-track-color:#eee;scrollbar-arrow-color:gray;scrollbar-shadow-color:gray;scrollbar-dark-shadow-color:gray}div.record-picker::-webkit-scrollbar{width:12px}div.record-picker::-webkit-scrollbar-button{width:0;height:0}div.record-picker::-webkit-scrollbar-track{background:#eee;box-shadow:0 0 3px #dfdfdf inset;border-top-right-radius:8px;border-bottom-right-radius:8px}div.record-picker::-webkit-scrollbar-thumb{background:#337ab7;border:thin solid gray;border-top-right-radius:8px;border-bottom-right-radius:8px}div.record-picker::-webkit-scrollbar-thumb:hover{background:#286090}.record-picker ul{margin:0;padding:0 0 1px}.record-picker li{border-top:thin solid #ddd;border-bottom:1px solid #ddd;display:block;padding:2px 2px 2px 10px;margin-bottom:-1px;font-size:.85em;cursor:pointer;white-space:nowrap;min-height:16px}.record-picker li:hover{background-color:#f5f5f5}.record-picker li.selected{background-color:#d9edf7}.record-picker li.selected:hover{background-color:#c4e3f3}.record-picker li.disabled{opacity:.5;cursor:default;background-color:inherit}.record-picker li:first-child{border-top-left-radius:8px;border-top-right-radius:8px;border-top:none}.record-picker li:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-bottom:none}.record-picker label{cursor:pointer;font-weight:inherit;font-size:14px;padding:4px;margin-bottom:-1px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.record-picker ul.over{background-color:#d3d3d3}.dual-list{display:flex;flex-direction:row;align-content:flex-start}.dual-list .listbox{width:50%;margin:0}.dual-list .button-bar{margin-top:8px}.point-right::after{content:\"\\25B6\";padding-left:1em}.point-left::before{content:\"\\25C0\";padding-right:1em}.dual-list .button-bar button{width:47%}button.btn-block{display:block;width:100%;margin-bottom:8px}.filter{margin-bottom:-2.2em}.filter::after{content:\"o\";width:40px;color:transparent;font-size:2em;background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-position:center center;opacity:.2;top:-36px;left:calc(100% - 21px);position:relative}"]
}] }
];
/** @nocollapse */
DualListComponent.ctorParameters = () => [
{ type: IterableDiffers }
];
DualListComponent.propDecorators = {
id: [{ type: Input }],
key: [{ type: Input }],
display: [{ type: Input }],
height: [{ type: Input }],
filter: [{ type: Input }],
format: [{ type: Input }],
sort: [{ type: Input }],
compare: [{ type: Input }],
disabled: [{ type: Input }],
source: [{ type: Input }],
destination: [{ type: Input }],
destinationChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
DualListComponent.AVAILABLE_LIST_NAME;
/** @type {?} */
DualListComponent.CONFIRMED_LIST_NAME;
/** @type {?} */
DualListComponent.LTR;
/** @type {?} */
DualListComponent.RTL;
/** @type {?} */
DualListComponent.DEFAULT_FORMAT;
/** @type {?} */
DualListComponent.prototype.id;
/** @type {?} */
DualListComponent.prototype.key;
/** @type {?} */
DualListComponent.prototype.display;
/** @type {?} */
DualListComponent.prototype.height;
/** @type {?} */
DualListComponent.prototype.filter;
/** @type {?} */
DualListComponent.prototype.format;
/** @type {?} */
DualListComponent.prototype.sort;
/** @type {?} */
DualListComponent.prototype.compare;
/** @type {?} */
DualListComponent.prototype.disabled;
/** @type {?} */
DualListComponent.prototype.source;
/** @type {?} */
DualListComponent.prototype.destination;
/** @type {?} */
DualListComponent.prototype.destinationChange;
/** @type {?} */
DualListComponent.prototype.available;
/** @type {?} */
DualListComponent.prototype.confirmed;
/** @type {?} */
DualListComponent.prototype.sourceDiffer;
/** @type {?} */
DualListComponent.prototype.destinationDiffer;
/**
* @type {?}
* @private
*/
DualListComponent.prototype.sorter;
/**
* @type {?}
* @private
*/
DualListComponent.prototype.differs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZHVhbC1saXN0Ym94LyIsInNvdXJjZXMiOlsibGliL2R1YWwtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVcsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQ2hFLE1BQU0sRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7SUFJckMsTUFBTSxHQUFHLENBQUM7QUFRZCxNQUFNLE9BQU8saUJBQWlCOzs7O0lBc0M3QixZQUFvQixPQUF3QjtRQUF4QixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQXJCbkMsT0FBRSxHQUFHLGFBQWEsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUM3QixRQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ1osWUFBTyxHQUFRLE9BQU8sQ0FBQztRQUN2QixXQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixXQUFNLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDO1FBQzFDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFFYixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2hCLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFRekMsV0FBTTs7Ozs7UUFBRyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFB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QUUsUUFBUTtJQUNoQixHQUFHLEVBQUUsS0FBSztJQUNWLElBQUksRUFBRSxNQUFNO0lBQ1osU0FBUyxFQUFFLGlCQUFpQixDQUFDLEdBQUc7SUFDaEMsU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsU0FBUztDQUNqQixDQUFDOztZQXJCRixTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLDA5R0FBeUM7O2FBRXpDOzs7O1lBYmlELGVBQWU7OztpQkFnQy9ELEtBQUs7a0JBQ0wsS0FBSztzQkFDTCxLQUFLO3FCQUNMLEtBQUs7cUJBQ0wsS0FBSztxQkFDTCxLQUFLO21CQUNMLEtBQUs7c0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7MEJBQ0wsS0FBSztnQ0FDTCxNQUFNOzs7O0lBM0JQLHNDQUF5Qzs7SUFDekMsc0NBQXlDOztJQUV6QyxzQkFBNkI7O0lBQzdCLHNCQUE2Qjs7SUFFN0IsaUNBUUU7O0lBRUYsK0JBQXNDOztJQUN0QyxnQ0FBcUI7O0lBQ3JCLG9DQUFnQzs7SUFDaEMsbUNBQTBCOztJQUMxQixtQ0FBd0I7O0lBQ3hCLG1DQUFtRDs7SUFDbkQsaUNBQXNCOztJQUN0QixvQ0FBa0M7O0lBQ2xDLHFDQUEwQjs7SUFDMUIsbUNBQTRCOztJQUM1Qix3Q0FBaUM7O0lBQ2pDLDhDQUFpRDs7SUFFakQsc0NBQXFCOztJQUNyQixzQ0FBcUI7O0lBRXJCLHlDQUFrQjs7SUFDbEIsOENBQXVCOzs7OztJQUV2QixtQ0FBMEc7Ozs7O0lBRTlGLG9DQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRG9DaGVjaywgRXZlbnRFbWl0dGVyLCBJbnB1dCwgSXRlcmFibGVEaWZmZXJzLCBPbkNoYW5nZXMsXG5cdE91dHB1dCwgU2ltcGxlQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJhc2ljTGlzdCB9IGZyb20gJy4vYmFzaWMtbGlzdCc7XG5cbmV4cG9ydCB0eXBlIGNvbXBhcmVGdW5jdGlvbiA9IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyO1xuXG52YXIgbmV4dElkID0gMDtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnZHVhbC1saXN0Jyxcblx0dGVtcGxhdGVVcmw6ICcuL2R1YWwtbGlzdC5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWyAnLi9kdWFsLWxpc3QuY29tcG9uZW50LmNzcycgXVxufSlcblxuZXhwb3J0IGNsYXNzIER1YWxMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgT25DaGFuZ2VzIHtcblx0c3RhdGljIEFWQUlMQUJMRV9MSVNUX05BTUUgPSAnYXZhaWxhYmxlJztcblx0c3RhdGljIENPTkZJUk1FRF9MSVNUX05BTUUgPSAnY29uZmlybWVkJztcblxuXHRzdGF0aWMgTFRSID0gJ2xlZnQtdG8tcmlnaHQnO1xuXHRzdGF0aWMgUlRMID0gJ3JpZ2h0LXRvLWxlZnQnO1xuXG5cdHN0YXRpYyBERUZBVUxUX0ZPUk1BVCA9IHtcblx0XHRhZGQ6ICdBZGQnLFxuXHRcdHJlbW92ZTogJ1JlbW92ZScsXG5cdFx0YWxsOiAnQWxsJyxcblx0XHRub25lOiAnTm9uZScsXG5cdFx0ZGlyZWN0aW9uOiBEdWFsTGlzdENvbXBvbmVudC5MVFIsXG5cdFx0ZHJhZ2dhYmxlOiB0cnVlLFxuXHRcdGxvY2FsZTogdW5kZWZpbmVkXG5cdH07XG5cblx0QElucHV0KCkgaWQgPSBgZHVhbC1saXN0LSR7bmV4dElkKyt9YDtcblx0QElucHV0KCkga2V5ID0gJ19pZCc7XG5cdEBJbnB1dCgpIGRpc3BsYXk6IGFueSA9ICdfbmFtZSc7XG5cdEBJbnB1dCgpIGhlaWdodCA9ICcxMDBweCc7XG5cdEBJbnB1dCgpIGZpbHRlciA9IGZhbHNlO1xuXHRASW5wdXQoKSBmb3JtYXQgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVDtcblx0QElucHV0KCkgc29ydCA9IGZhbHNlO1xuXHRASW5wdXQoKSBjb21wYXJlOiBjb21wYXJlRnVuY3Rpb247XG5cdEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cdEBJbnB1dCgpIHNvdXJjZTogQXJyYXk8YW55Pjtcblx0QElucHV0KCkgZGVzdGluYXRpb246IEFycmF5PGFueT47XG5cdEBPdXRwdXQoKSBkZXN0aW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHRhdmFpbGFibGU6IEJhc2ljTGlzdDtcblx0Y29uZmlybWVkOiBCYXNpY0xpc3Q7XG5cblx0c291cmNlRGlmZmVyOiBhbnk7XG5cdGRlc3RpbmF0aW9uRGlmZmVyOiBhbnk7XG5cblx0cHJpdmF0ZSBzb3J0ZXIgPSAoYTogYW55LCBiOiBhbnkpID0+IHsgcmV0dXJuIChhLl9uYW1lIDwgYi5fbmFtZSkgPyAtMSA6ICgoYS5fbmFtZSA+IGIuX25hbWUpID8gMSA6IDApOyB9O1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzKSB7XG5cdFx0dGhpcy5hdmFpbGFibGUgPSBuZXcgQmFzaWNMaXN0KER1YWxMaXN0Q29tcG9uZW50LkFWQUlMQUJMRV9MSVNUX05BTUUpO1xuXHRcdHRoaXMuY29uZmlybWVkID0gbmV3IEJhc2ljTGlzdChEdWFsTGlzdENvbXBvbmVudC5DT05GSVJNRURfTElTVF9OQU1FKTtcblx0fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZVJlY29yZDoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pIHtcblx0XHRpZiAoY2hhbmdlUmVjb3JkWydmaWx0ZXInXSkge1xuXHRcdFx0aWYgKGNoYW5nZVJlY29yZFsnZmlsdGVyJ10uY3VycmVudFZhbHVlID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLmNsZWFyRmlsdGVyKHRoaXMuYXZhaWxhYmxlKTtcblx0XHRcdFx0dGhpcy5jbGVhckZpbHRlcih0aGlzLmNvbmZpcm1lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZVJlY29yZFsnc29ydCddKSB7XG5cdFx0XHRpZiAoY2hhbmdlUmVjb3JkWydzb3J0J10uY3VycmVudFZhbHVlID09PSB0cnVlICYmIHRoaXMuY29tcGFyZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuY29tcGFyZSA9IHRoaXMuc29ydGVyO1xuXHRcdFx0fSBlbHNlIGlmIChjaGFuZ2VSZWNvcmRbJ3NvcnQnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuY29tcGFyZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlUmVjb3JkWydmb3JtYXQnXSkge1xuXHRcdFx0dGhpcy5mb3JtYXQgPSBjaGFuZ2VSZWNvcmRbJ2Zvcm1hdCddLmN1cnJlbnRWYWx1ZTtcblxuXHRcdFx0aWYgKHR5cGVvZih0aGlzLmZvcm1hdC5kaXJlY3Rpb24pID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmZvcm1hdC5kaXJlY3Rpb24gPSBEdWFsTGlzdENvbXBvbmVudC5MVFI7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YodGhpcy5mb3JtYXQuYWRkKSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0dGhpcy5mb3JtYXQuYWRkID0gRHVhbExpc3RDb21wb25lbnQuREVGQVVMVF9GT1JNQVQuYWRkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mKHRoaXMuZm9ybWF0LnJlbW92ZSkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0LnJlbW92ZSA9IER1YWxMaXN0Q29tcG9uZW50LkRFRkFVTFRfRk9STUFULnJlbW92ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZih0aGlzLmZvcm1hdC5hbGwpID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmZvcm1hdC5hbGwgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVC5hbGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YodGhpcy5mb3JtYXQubm9uZSkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0Lm5vbmUgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVC5ub25lO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mKHRoaXMuZm9ybWF0LmRyYWdnYWJsZSkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0LmRyYWdnYWJsZSA9IER1YWxMaXN0Q29tcG9uZW50LkRFRkFVTFRfRk9STUFULmRyYWdnYWJsZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlUmVjb3JkWydzb3VyY2UnXSkge1xuXHRcdFx0dGhpcy5hdmFpbGFibGUgPSBuZXcgQmFzaWNMaXN0KER1YWxMaXN0Q29tcG9uZW50LkFWQUlMQUJMRV9MSVNUX05BTUUpO1xuXHRcdFx0dGhpcy51cGRhdGVkU291cmNlKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZWREZXN0aW5hdGlvbigpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VSZWNvcmRbJ2Rlc3RpbmF0aW9uJ10pIHtcblx0XHRcdHRoaXMuY29uZmlybWVkID0gbmV3IEJhc2ljTGlzdChEdWFsTGlzdENvbXBvbmVudC5DT05GSVJNRURfTElTVF9OQU1FKTtcblx0XHRcdHRoaXMudXBkYXRlZERlc3RpbmF0aW9uKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZWRTb3VyY2UoKTtcblx0XHR9XG5cdH1cblxuXHRuZ0RvQ2hlY2soKSB7XG5cdFx0aWYgKHRoaXMuc291cmNlICYmIHRoaXMuYnVpbGRBdmFpbGFibGUodGhpcy5zb3VyY2UpKSB7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHRoaXMuYXZhaWxhYmxlKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuZGVzdGluYXRpb24gJiYgdGhpcy5idWlsZENvbmZpcm1lZCh0aGlzLmRlc3RpbmF0aW9uKSkge1xuXHRcdFx0dGhpcy5vbkZpbHRlcih0aGlzLmNvbmZpcm1lZCk7XG5cdFx0fVxuXHR9XG5cblx0YnVpbGRBdmFpbGFibGUoc291cmNlOiBBcnJheTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc291cmNlQ2hhbmdlcyA9IHRoaXMuc291cmNlRGlmZmVyLmRpZmYoc291cmNlKTtcblx0XHRpZiAoc291cmNlQ2hhbmdlcykge1xuXHRcdFx0c291cmNlQ2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHI6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBpZHggPSB0aGlzLmZpbmRJdGVtSW5kZXgodGhpcy5hdmFpbGFibGUubGlzdCwgci5pdGVtLCB0aGlzLmtleSk7XG5cdFx0XHRcdGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRcdFx0dGhpcy5hdmFpbGFibGUubGlzdC5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHNvdXJjZUNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocjogYW55KSA9PiB7XG5cdFx0XHRcdC8vIERvIG5vdCBhZGQgZHVwbGljYXRlcyBldmVuIGlmIHNvdXJjZSBoYXMgZHVwbGljYXRlcy5cblx0XHRcdFx0aWYgKHRoaXMuZmluZEl0ZW1JbmRleCh0aGlzLmF2YWlsYWJsZS5saXN0LCByLml0ZW0sIHRoaXMua2V5KSA9PT0gLTEpIHtcblx0XHRcdFx0XHR0aGlzLmF2YWlsYWJsZS5saXN0LnB1c2goIHsgX2lkOiB0aGlzLm1ha2VJZChyLml0ZW0pLCBfbmFtZTogdGhpcy5tYWtlTmFtZShyLml0ZW0pIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHRoaXMuY29tcGFyZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuYXZhaWxhYmxlLmxpc3Quc29ydCh0aGlzLmNvbXBhcmUpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5hdmFpbGFibGUuc2lmdCA9IHRoaXMuYXZhaWxhYmxlLmxpc3Q7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRidWlsZENvbmZpcm1lZChkZXN0aW5hdGlvbjogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGxldCBtb3ZlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGRlc3RDaGFuZ2VzID0gdGhpcy5kZXN0aW5hdGlvbkRpZmZlci5kaWZmKGRlc3RpbmF0aW9uKTtcblx0XHRpZiAoZGVzdENoYW5nZXMpIHtcblx0XHRcdGRlc3RDaGFuZ2VzLmZvckVhY2hSZW1vdmVkSXRlbSgocjogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IHRoaXMuZmluZEl0ZW1JbmRleCh0aGlzLmNvbmZpcm1lZC5saXN0LCByLml0ZW0sIHRoaXMua2V5KTtcblx0XHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuaXNJdGVtU2VsZWN0ZWQodGhpcy5jb25maXJtZWQucGljaywgdGhpcy5jb25maXJtZWQubGlzdFtpZHhdKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RJdGVtKHRoaXMuY29uZmlybWVkLnBpY2ssIHRoaXMuY29uZmlybWVkLmxpc3RbaWR4XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubW92ZUl0ZW0odGhpcy5jb25maXJtZWQsIHRoaXMuYXZhaWxhYmxlLCB0aGlzLmNvbmZpcm1lZC5saXN0W2lkeF0sIGZhbHNlKTtcblx0XHRcdFx0XHRtb3ZlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRkZXN0Q2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChyOiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3QgaWR4ID0gdGhpcy5maW5kSXRlbUluZGV4KHRoaXMuYXZhaWxhYmxlLmxpc3QsIHIuaXRlbSwgdGhpcy5rZXkpO1xuXHRcdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRcdGlmICghdGhpcy5pc0l0ZW1TZWxlY3RlZCh0aGlzLmF2YWlsYWJsZS5waWNrLCB0aGlzLmF2YWlsYWJsZS5saXN0W2lkeF0pKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5hdmFpbGFibGUucGljaywgdGhpcy5hdmFpbGFibGUubGlzdFtpZHhdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5tb3ZlSXRlbSh0aGlzLmF2YWlsYWJsZSwgdGhpcy5jb25maXJtZWQsIHRoaXMuYXZhaWxhYmxlLmxpc3RbaWR4XSwgZmFsc2UpO1xuXHRcdFx0XHRcdG1vdmVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmICh0aGlzLmNvbXBhcmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLmNvbmZpcm1lZC5saXN0LnNvcnQodGhpcy5jb21wYXJlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuY29uZmlybWVkLnNpZnQgPSB0aGlzLmNvbmZpcm1lZC5saXN0O1xuXG5cdFx0XHRpZiAobW92ZWQpIHtcblx0XHRcdFx0dGhpcy50cnVlVXAoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHR1cGRhdGVkU291cmNlKCkge1xuXHRcdHRoaXMuYXZhaWxhYmxlLmxpc3QubGVuZ3RoID0gMDtcblx0XHR0aGlzLmF2YWlsYWJsZS5waWNrLmxlbmd0aCA9IDA7XG5cblx0XHRpZiAodGhpcy5zb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5zb3VyY2VEaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh0aGlzLnNvdXJjZSkuY3JlYXRlKG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZWREZXN0aW5hdGlvbigpIHtcblx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uRGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQodGhpcy5kZXN0aW5hdGlvbikuY3JlYXRlKG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdGRpcmVjdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5mb3JtYXQuZGlyZWN0aW9uID09PSBEdWFsTGlzdENvbXBvbmVudC5MVFI7XG5cdH1cblxuXHRkcmFnRW5kKGxpc3Q6IEJhc2ljTGlzdCA9IG51bGwpOiBib29sZWFuIHtcblx0XHRpZiAobGlzdCkge1xuXHRcdFx0bGlzdC5kcmFnU3RhcnQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5hdmFpbGFibGUuZHJhZ1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHR0aGlzLmNvbmZpcm1lZC5kcmFnU3RhcnQgPSBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZHJhZyhldmVudDogRHJhZ0V2ZW50LCBpdGVtOiBhbnksIGxpc3Q6IEJhc2ljTGlzdCkge1xuXHRcdGlmICghdGhpcy5pc0l0ZW1TZWxlY3RlZChsaXN0LnBpY2ssIGl0ZW0pKSB7XG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0obGlzdC5waWNrLCBpdGVtKTtcblx0XHR9XG5cdFx0bGlzdC5kcmFnU3RhcnQgPSB0cnVlO1xuXG5cdFx0Ly8gU2V0IGEgY3VzdG9tIHR5cGUgdG8gYmUgdGhpcyBkdWFsLWxpc3QncyBpZC5cblx0XHRldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSh0aGlzLmlkLCBpdGVtWydfaWQnXSk7XG5cdH1cblxuXHRhbGxvd0Ryb3AoZXZlbnQ6IERyYWdFdmVudCwgbGlzdDogQmFzaWNMaXN0KTogYm9vbGVhbiB7XG5cdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcy5sZW5ndGggJiYgKGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlc1swXSA9PT0gdGhpcy5pZCkpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRpZiAoIWxpc3QuZHJhZ1N0YXJ0KSB7XG5cdFx0XHRcdGxpc3QuZHJhZ092ZXIgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRkcmFnTGVhdmUoKSB7XG5cdFx0dGhpcy5hdmFpbGFibGUuZHJhZ092ZXIgPSBmYWxzZTtcblx0XHR0aGlzLmNvbmZpcm1lZC5kcmFnT3ZlciA9IGZhbHNlO1xuXHR9XG5cblx0ZHJvcChldmVudDogRHJhZ0V2ZW50LCBsaXN0OiBCYXNpY0xpc3QpIHtcblx0XHRpZiAoZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLmxlbmd0aCAmJiAoZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzWzBdID09PSB0aGlzLmlkKSkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMuZHJhZ0xlYXZlKCk7XG5cdFx0XHR0aGlzLmRyYWdFbmQoKTtcblxuXHRcdFx0aWYgKGxpc3QgPT09IHRoaXMuYXZhaWxhYmxlKSB7XG5cdFx0XHRcdHRoaXMubW92ZUl0ZW0odGhpcy5hdmFpbGFibGUsIHRoaXMuY29uZmlybWVkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMubW92ZUl0ZW0odGhpcy5jb25maXJtZWQsIHRoaXMuYXZhaWxhYmxlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHRydWVVcCgpIHtcblx0XHRsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ2xlYXIgcmVtb3ZlZCBpdGVtcy5cblx0XHRsZXQgcG9zID0gdGhpcy5kZXN0aW5hdGlvbi5sZW5ndGg7XG5cdFx0d2hpbGUgKChwb3MgLT0gMSkgPj0gMCkge1xuXHRcdFx0Y29uc3QgbXYgPSB0aGlzLmNvbmZpcm1lZC5saXN0LmZpbHRlciggY29uZiA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgdGhpcy5kZXN0aW5hdGlvbltwb3NdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHJldHVybiBjb25mLl9pZCA9PT0gdGhpcy5kZXN0aW5hdGlvbltwb3NdW3RoaXMua2V5XTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gY29uZi5faWQgPT09IHRoaXMuZGVzdGluYXRpb25bcG9zXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAobXYubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBmb3VuZCBzbyByZW1vdmUuXG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24uc3BsaWNlKHBvcywgMSk7XG5cdFx0XHRcdGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFB1c2ggYWRkZWQgaXRlbXMuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29uZmlybWVkLmxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcblx0XHRcdGxldCBtdiA9IHRoaXMuZGVzdGluYXRpb24uZmlsdGVyKCAoZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgZCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRyZXR1cm4gKGRbdGhpcy5rZXldID09PSB0aGlzLmNvbmZpcm1lZC5saXN0W2ldLl9pZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIChkID09PSB0aGlzLmNvbmZpcm1lZC5saXN0W2ldLl9pZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAobXYubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBmb3VuZCBzbyBhZGQuXG5cdFx0XHRcdG12ID0gdGhpcy5zb3VyY2UuZmlsdGVyKCAobzogYW55KSA9PiB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBvID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvW3RoaXMua2V5XSA9PT0gdGhpcy5jb25maXJtZWQubGlzdFtpXS5faWQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG8gPT09IHRoaXMuY29uZmlybWVkLmxpc3RbaV0uX2lkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChtdi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbi5wdXNoKG12WzBdKTtcblx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uQ2hhbmdlLmVtaXQodGhpcy5kZXN0aW5hdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0ZmluZEl0ZW1JbmRleChsaXN0OiBBcnJheTxhbnk+LCBpdGVtOiBhbnksIGtleTogYW55ID0gJ19pZCcpIHtcblx0XHRsZXQgaWR4ID0gLTE7XG5cblx0XHRmdW5jdGlvbiBtYXRjaE9iamVjdChlOiBhbnkpIHtcblx0XHRcdGlmIChlLl9pZCA9PT0gaXRlbVtrZXldKSB7XG5cdFx0XHRcdGlkeCA9IGxpc3QuaW5kZXhPZihlKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gbWF0Y2goZTogYW55KSB7XG5cdFx0XHRpZiAoZS5faWQgPT09IGl0ZW0pIHtcblx0XHRcdFx0aWR4ID0gbGlzdC5pbmRleE9mKGUpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBBc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGFycmF5cyBkbyBub3QgaGF2ZSBkdXBsaWNhdGVzLlxuXHRcdGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGxpc3QuZmlsdGVyKG1hdGNoT2JqZWN0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGlzdC5maWx0ZXIobWF0Y2gpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpZHg7XG5cdH1cblxuXHRwcml2YXRlIG1ha2VVbmF2YWlsYWJsZShzb3VyY2U6IEJhc2ljTGlzdCwgaXRlbTogYW55KSB7XG5cdFx0Y29uc3QgaWR4ID0gc291cmNlLmxpc3QuaW5kZXhPZihpdGVtKTtcblx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0c291cmNlLmxpc3Quc3BsaWNlKGlkeCwgMSk7XG5cdFx0fVxuXHR9XG5cblx0bW92ZUl0ZW0oc291cmNlOiBCYXNpY0xpc3QsIHRhcmdldDogQmFzaWNMaXN0LCBpdGVtOiBhbnkgPSBudWxsLCB0cnVldXAgPSB0cnVlKSB7XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBsZW4gPSBzb3VyY2UucGljay5sZW5ndGg7XG5cblx0XHRpZiAoaXRlbSkge1xuXHRcdFx0aSA9IHNvdXJjZS5saXN0LmluZGV4T2YoaXRlbSk7XG5cdFx0XHRsZW4gPSBpICsgMTtcblx0XHR9XG5cblx0XHRmb3IgKDsgaSA8IGxlbjsgaSArPSAxKSB7XG5cdFx0XHQvLyBJcyB0aGUgcGljayBzdGlsbCBpbiBsaXN0P1xuXHRcdFx0bGV0IG12OiBBcnJheTxhbnk+ID0gW107XG5cdFx0XHRpZiAoaXRlbSkge1xuXHRcdFx0XHRjb25zdCBpZHggPSB0aGlzLmZpbmRJdGVtSW5kZXgoc291cmNlLnBpY2ssIGl0ZW0pO1xuXHRcdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRcdG12WzBdID0gc291cmNlLnBpY2tbaWR4XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bXYgPSBzb3VyY2UubGlzdC5maWx0ZXIoIHNyYyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIChzcmMuX2lkID09PSBzb3VyY2UucGlja1tpXS5faWQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdWxkIG9ubHkgZXZlciBiZSAxXG5cdFx0XHRpZiAobXYubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIEFkZCBpZiBub3QgYWxyZWFkeSBpbiB0YXJnZXQuXG5cdFx0XHRcdGlmICh0YXJnZXQubGlzdC5maWx0ZXIodHJnID0+IHRyZy5faWQgPT09IG12WzBdLl9pZCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGFyZ2V0Lmxpc3QucHVzaCggbXZbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMubWFrZVVuYXZhaWxhYmxlKHNvdXJjZSwgbXZbMF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNvbXBhcmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGFyZ2V0Lmxpc3Quc29ydCh0aGlzLmNvbXBhcmUpO1xuXHRcdH1cblxuXHRcdHNvdXJjZS5waWNrLmxlbmd0aCA9IDA7XG5cblx0XHQvLyBVcGRhdGUgZGVzdGluYXRpb25cblx0XHRpZiAodHJ1ZXVwKSB7XG5cdFx0XHR0aGlzLnRydWVVcCgpO1xuXHRcdH1cblxuXHRcdC8vIERlbGF5IGV2ZXItc28tc2xpZ2h0bHkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbi5cblx0XHRzZXRUaW1lb3V0KCAoKSA9PiB7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHNvdXJjZSk7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHRhcmdldCk7XG5cdFx0fSwgMTApO1xuXHR9XG5cblx0aXNJdGVtU2VsZWN0ZWQobGlzdDogQXJyYXk8YW55PiwgaXRlbTogYW55KTogYm9vbGVhbiB7XG5cdFx0aWYgKGxpc3QuZmlsdGVyKGUgPT4gT2JqZWN0LmlzKGUsIGl0ZW0pKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0c2hpZnRDbGljayhldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlciwgc291cmNlOiBCYXNpY0xpc3QsIGl0ZW06IGFueSkge1xuXHRcdGlmIChldmVudC5zaGlmdEtleSAmJiBzb3VyY2UubGFzdCAmJiAhT2JqZWN0LmlzKGl0ZW0sIHNvdXJjZS5sYXN0KSkge1xuXHRcdFx0Y29uc3QgaWR4ID0gc291cmNlLnNpZnQuaW5kZXhPZihzb3VyY2UubGFzdCk7XG5cdFx0XHRpZiAoaW5kZXggPiBpZHgpIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IChpZHggKyAxKTsgaSA8IGluZGV4OyBpICs9IDEpIHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdEl0ZW0oc291cmNlLnBpY2ssIHNvdXJjZS5zaWZ0W2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAoaW5kZXggKyAxKTsgaSA8IGlkeDsgaSArPSAxKSAge1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0SXRlbShzb3VyY2UucGljaywgc291cmNlLnNpZnRbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNvdXJjZS5sYXN0ID0gaXRlbTtcblx0fVxuXG5cdHNlbGVjdEl0ZW0obGlzdDogQXJyYXk8YW55PiwgaXRlbTogYW55KSB7XG5cdFx0Y29uc3QgcGsgPSBsaXN0LmZpbHRlciggKGU6IGFueSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5pcyhlLCBpdGVtKTtcblx0XHR9KTtcblx0XHRpZiAocGsubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gQWxyZWFkeSBpbiBsaXN0LCBzbyBkZXNlbGVjdC5cblx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBway5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuXHRcdFx0XHRjb25zdCBpZHggPSBsaXN0LmluZGV4T2YocGtbaV0pO1xuXHRcdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRcdGxpc3Quc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG5cdHNlbGVjdEFsbChzb3VyY2U6IEJhc2ljTGlzdCkge1xuXHRcdHNvdXJjZS5waWNrLmxlbmd0aCA9IDA7XG5cdFx0c291cmNlLnBpY2sgPSBzb3VyY2Uuc2lmdC5zbGljZSgwKTtcblx0fVxuXG5cdHNlbGVjdE5vbmUoc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRzb3VyY2UucGljay5sZW5ndGggPSAwO1xuXHR9XG5cblx0aXNBbGxTZWxlY3RlZChzb3VyY2U6IEJhc2ljTGlzdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChzb3VyY2UubGlzdC5sZW5ndGggPT09IDAgfHwgc291cmNlLmxpc3QubGVuZ3RoID09PSBzb3VyY2UucGljay5sZW5ndGgpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpc0FueVNlbGVjdGVkKHNvdXJjZTogQmFzaWNMaXN0KTogYm9vbGVhbiB7XG5cdFx0aWYgKHNvdXJjZS5waWNrLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwcml2YXRlIHVucGljayhzb3VyY2U6IEJhc2ljTGlzdCkge1xuXHRcdGZvciAobGV0IGkgPSBzb3VyY2UucGljay5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuXHRcdFx0aWYgKHNvdXJjZS5zaWZ0LmluZGV4T2Yoc291cmNlLnBpY2tbaV0pID09PSAtMSkge1xuXHRcdFx0XHRzb3VyY2UucGljay5zcGxpY2UoaSwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y2xlYXJGaWx0ZXIoc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRpZiAoc291cmNlKSB7XG5cdFx0XHRzb3VyY2UucGlja2VyID0gJyc7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0b25GaWx0ZXIoc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRpZiAoc291cmNlLnBpY2tlci5sZW5ndGggPiAwKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHNvdXJjZS5saXN0LmZpbHRlciggKGl0ZW06IGFueSkgPT4ge1xuXHRcdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXRlbS5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmU6IHJlbW92ZSB3aGVuIGQudHMgaGFzIGxvY2FsZSBhcyBhbiBhcmd1bWVudC5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0uX25hbWUudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKS5pbmRleE9mKHNvdXJjZS5waWNrZXIudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKSkgIT09IC0xO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZTogcmVtb3ZlIHdoZW4gZC50cyBoYXMgbG9jYWxlIGFzIGFuIGFyZ3VtZW50LlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaXRlbSkudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKS5pbmRleE9mKHNvdXJjZS5waWNrZXIudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKSkgIT09IC0xO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlOiByZW1vdmUgd2hlbiBkLnRzIGhhcyBsb2NhbGUgYXMgYW4gYXJndW1lbnQuXG5cdFx0XHRcdFx0XHRyZXR1cm4gaXRlbS50b0xvY2FsZUxvd2VyQ2FzZSh0aGlzLmZvcm1hdC5sb2NhbGUpLmluZGV4T2Yoc291cmNlLnBpY2tlci50b0xvY2FsZUxvd2VyQ2FzZSh0aGlzLmZvcm1hdC5sb2NhbGUpKSAhPT0gLTE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c291cmNlLnNpZnQgPSBmaWx0ZXJlZDtcblx0XHRcdFx0dGhpcy51bnBpY2soc291cmNlKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aWYgKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XG5cdFx0XHRcdFx0dGhpcy5mb3JtYXQubG9jYWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNvdXJjZS5zaWZ0ID0gc291cmNlLmxpc3Q7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNvdXJjZS5zaWZ0ID0gc291cmNlLmxpc3Q7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBtYWtlSWQoaXRlbTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gaXRlbVt0aGlzLmtleV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBpdGVtO1xuXHRcdH1cblx0fVxuXG5cdC8vIEFsbG93IGZvciBjb21wbGV4IG5hbWVzIGJ5IHBhc3NpbmcgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cblx0Ly8gRXhhbXBsZTogW2Rpc3BsYXldPVwiWyAnX3R5cGUuc3Vic3RyaW5nKDAsMSknLCAnX25hbWUnIF1cIlxuXHRwcm90ZWN0ZWQgbWFrZU5hbWUoaXRlbTogYW55LCBzZXBhcmF0b3IgPSAnXycpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XG5cblx0XHRmdW5jdGlvbiBmYWxsYmFjayhpdG06IGFueSkge1xuXHRcdFx0c3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRtKSkge1xuXHRcdFx0Y2FzZSAnW29iamVjdCBOdW1iZXJdJzpcblx0XHRcdFx0cmV0dXJuIGl0bTtcblx0XHRcdGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG5cdFx0XHRcdHJldHVybiBpdG07XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZiAoaXRtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRtW2Rpc3BsYXldO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiAndW5kZWZpbmVkJztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzdHIgPSAnJztcblxuXHRcdGlmICh0aGlzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcy5kaXNwbGF5KSkge1xuXHRcdFx0Y2FzZSAnW29iamVjdCBGdW5jdGlvbl0nOlxuXHRcdFx0XHRzdHIgPSB0aGlzLmRpc3BsYXkoaXRlbSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEFycmF5XSc6XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmRpc3BsYXkubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcblx0XHRcdFx0XHRpZiAoc3RyLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHN0ciA9IHN0ciArIHNlcGFyYXRvcjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5kaXNwbGF5W2ldLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdC8vIFNpbXBsZSwganVzdCBhZGQgdG8gc3RyaW5nLlxuXHRcdFx0XHRcdFx0c3RyID0gc3RyICsgaXRlbVt0aGlzLmRpc3BsYXlbaV1dO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBDb21wbGV4LCBzb21lIGFjdGlvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWRcblx0XHRcdFx0XHRcdGNvbnN0IHBhcnRzID0gdGhpcy5kaXNwbGF5W2ldLnNwbGl0KCcuJyk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHMgPSBpdGVtW3BhcnRzWzBdXTtcblx0XHRcdFx0XHRcdGlmIChzKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBicnV0ZSBmb3JjZVxuXHRcdFx0XHRcdFx0XHRpZiAocGFydHNbMV0uaW5kZXhPZignc3Vic3RyaW5nJykgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbnVtcyA9IChwYXJ0c1sxXS5zdWJzdHJpbmcocGFydHNbMV0uaW5kZXhPZignKCcpICsgMSwgcGFydHNbMV0uaW5kZXhPZignKScpKSkuc3BsaXQoJywnKTtcblxuXHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAobnVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0XHRcdFx0XHRzdHIgPSBzdHIgKyBzLnN1YnN0cmluZyhwYXJzZUludChudW1zWzBdLCAxMCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRcdFx0XHRcdFx0c3RyID0gc3RyICsgcy5zdWJzdHJpbmcocGFyc2VJbnQobnVtc1swXSwgMTApLCBwYXJzZUludChudW1zWzFdLCAxMCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdHN0ciA9IHN0ciArIHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbWV0aG9kIG5vdCBhcHByb3ZlZCwgc28ganVzdCBhZGQgcy5cblx0XHRcdFx0XHRcdFx0XHRzdHIgPSBzdHIgKyBzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0c3RyID0gZmFsbGJhY2soaXRlbSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHIgPSBmYWxsYmFjayhpdGVtKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyO1xuXHR9XG59XG4iXX0=