| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970 |
- /**
- * @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;
- var DualListComponent = /** @class */ (function () {
- function DualListComponent(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 {?}
- */
- function (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 {?}
- */
- DualListComponent.prototype.ngOnChanges = /**
- * @param {?} changeRecord
- * @return {?}
- */
- function (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 {?}
- */
- DualListComponent.prototype.ngDoCheck = /**
- * @return {?}
- */
- function () {
- 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 {?}
- */
- DualListComponent.prototype.buildAvailable = /**
- * @param {?} source
- * @return {?}
- */
- function (source) {
- var _this = this;
- /** @type {?} */
- var sourceChanges = this.sourceDiffer.diff(source);
- if (sourceChanges) {
- sourceChanges.forEachRemovedItem((/**
- * @param {?} r
- * @return {?}
- */
- function (r) {
- /** @type {?} */
- var idx = _this.findItemIndex(_this.available.list, r.item, _this.key);
- if (idx !== -1) {
- _this.available.list.splice(idx, 1);
- }
- }));
- sourceChanges.forEachAddedItem((/**
- * @param {?} r
- * @return {?}
- */
- function (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 {?}
- */
- DualListComponent.prototype.buildConfirmed = /**
- * @param {?} destination
- * @return {?}
- */
- function (destination) {
- var _this = this;
- /** @type {?} */
- var moved = false;
- /** @type {?} */
- var destChanges = this.destinationDiffer.diff(destination);
- if (destChanges) {
- destChanges.forEachRemovedItem((/**
- * @param {?} r
- * @return {?}
- */
- function (r) {
- /** @type {?} */
- var 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 {?}
- */
- function (r) {
- /** @type {?} */
- var 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 {?}
- */
- DualListComponent.prototype.updatedSource = /**
- * @return {?}
- */
- function () {
- this.available.list.length = 0;
- this.available.pick.length = 0;
- if (this.source !== undefined) {
- this.sourceDiffer = this.differs.find(this.source).create(null);
- }
- };
- /**
- * @return {?}
- */
- DualListComponent.prototype.updatedDestination = /**
- * @return {?}
- */
- function () {
- if (this.destination !== undefined) {
- this.destinationDiffer = this.differs.find(this.destination).create(null);
- }
- };
- /**
- * @return {?}
- */
- DualListComponent.prototype.direction = /**
- * @return {?}
- */
- function () {
- return this.format.direction === DualListComponent.LTR;
- };
- /**
- * @param {?=} list
- * @return {?}
- */
- DualListComponent.prototype.dragEnd = /**
- * @param {?=} list
- * @return {?}
- */
- function (list) {
- if (list === void 0) { 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 {?}
- */
- DualListComponent.prototype.drag = /**
- * @param {?} event
- * @param {?} item
- * @param {?} list
- * @return {?}
- */
- function (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 {?}
- */
- DualListComponent.prototype.allowDrop = /**
- * @param {?} event
- * @param {?} list
- * @return {?}
- */
- function (event, list) {
- if (event.dataTransfer.types.length && (event.dataTransfer.types[0] === this.id)) {
- event.preventDefault();
- if (!list.dragStart) {
- list.dragOver = true;
- }
- }
- return false;
- };
- /**
- * @return {?}
- */
- DualListComponent.prototype.dragLeave = /**
- * @return {?}
- */
- function () {
- this.available.dragOver = false;
- this.confirmed.dragOver = false;
- };
- /**
- * @param {?} event
- * @param {?} list
- * @return {?}
- */
- DualListComponent.prototype.drop = /**
- * @param {?} event
- * @param {?} list
- * @return {?}
- */
- function (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 {?}
- */
- DualListComponent.prototype.trueUp = /**
- * @private
- * @return {?}
- */
- function () {
- var _this = this;
- /** @type {?} */
- var changed = false;
- // Clear removed items.
- /** @type {?} */
- var pos = this.destination.length;
- while ((pos -= 1) >= 0) {
- /** @type {?} */
- var mv = this.confirmed.list.filter((/**
- * @param {?} conf
- * @return {?}
- */
- function (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;
- }
- }
- var _loop_1 = function (i, len) {
- /** @type {?} */
- var mv = this_1.destination.filter((/**
- * @param {?} d
- * @return {?}
- */
- function (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_1.source.filter((/**
- * @param {?} o
- * @return {?}
- */
- function (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_1.destination.push(mv[0]);
- changed = true;
- }
- }
- };
- var this_1 = this;
- // Push added items.
- for (var i = 0, len = this.confirmed.list.length; i < len; i += 1) {
- _loop_1(i, len);
- }
- if (changed) {
- this.destinationChange.emit(this.destination);
- }
- };
- /**
- * @param {?} list
- * @param {?} item
- * @param {?=} key
- * @return {?}
- */
- DualListComponent.prototype.findItemIndex = /**
- * @param {?} list
- * @param {?} item
- * @param {?=} key
- * @return {?}
- */
- function (list, item, key) {
- if (key === void 0) { key = '_id'; }
- /** @type {?} */
- var 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 {?}
- */
- DualListComponent.prototype.makeUnavailable = /**
- * @private
- * @param {?} source
- * @param {?} item
- * @return {?}
- */
- function (source, item) {
- /** @type {?} */
- var idx = source.list.indexOf(item);
- if (idx !== -1) {
- source.list.splice(idx, 1);
- }
- };
- /**
- * @param {?} source
- * @param {?} target
- * @param {?=} item
- * @param {?=} trueup
- * @return {?}
- */
- DualListComponent.prototype.moveItem = /**
- * @param {?} source
- * @param {?} target
- * @param {?=} item
- * @param {?=} trueup
- * @return {?}
- */
- function (source, target, item, trueup) {
- var _this = this;
- if (item === void 0) { item = null; }
- if (trueup === void 0) { trueup = true; }
- /** @type {?} */
- var i = 0;
- /** @type {?} */
- var len = source.pick.length;
- if (item) {
- i = source.list.indexOf(item);
- len = i + 1;
- }
- var _loop_2 = function () {
- // Is the pick still in list?
- /** @type {?} */
- var mv = [];
- if (item) {
- /** @type {?} */
- var idx = this_2.findItemIndex(source.pick, item);
- if (idx !== -1) {
- mv[0] = source.pick[idx];
- }
- }
- else {
- mv = source.list.filter((/**
- * @param {?} src
- * @return {?}
- */
- function (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 {?}
- */
- function (trg) { return trg._id === mv[0]._id; })).length === 0) {
- target.list.push(mv[0]);
- }
- this_2.makeUnavailable(source, mv[0]);
- }
- };
- var this_2 = this;
- for (; i < len; i += 1) {
- _loop_2();
- }
- 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 {?}
- */
- function () {
- _this.onFilter(source);
- _this.onFilter(target);
- }), 10);
- };
- /**
- * @param {?} list
- * @param {?} item
- * @return {?}
- */
- DualListComponent.prototype.isItemSelected = /**
- * @param {?} list
- * @param {?} item
- * @return {?}
- */
- function (list, item) {
- if (list.filter((/**
- * @param {?} e
- * @return {?}
- */
- function (e) { return Object.is(e, item); })).length > 0) {
- return true;
- }
- return false;
- };
- /**
- * @param {?} event
- * @param {?} index
- * @param {?} source
- * @param {?} item
- * @return {?}
- */
- DualListComponent.prototype.shiftClick = /**
- * @param {?} event
- * @param {?} index
- * @param {?} source
- * @param {?} item
- * @return {?}
- */
- function (event, index, source, item) {
- if (event.shiftKey && source.last && !Object.is(item, source.last)) {
- /** @type {?} */
- var idx = source.sift.indexOf(source.last);
- if (index > idx) {
- for (var i = (idx + 1); i < index; i += 1) {
- this.selectItem(source.pick, source.sift[i]);
- }
- }
- else if (idx !== -1) {
- for (var i = (index + 1); i < idx; i += 1) {
- this.selectItem(source.pick, source.sift[i]);
- }
- }
- }
- source.last = item;
- };
- /**
- * @param {?} list
- * @param {?} item
- * @return {?}
- */
- DualListComponent.prototype.selectItem = /**
- * @param {?} list
- * @param {?} item
- * @return {?}
- */
- function (list, item) {
- /** @type {?} */
- var pk = list.filter((/**
- * @param {?} e
- * @return {?}
- */
- function (e) {
- return Object.is(e, item);
- }));
- if (pk.length > 0) {
- // Already in list, so deselect.
- for (var i = 0, len = pk.length; i < len; i += 1) {
- /** @type {?} */
- var idx = list.indexOf(pk[i]);
- if (idx !== -1) {
- list.splice(idx, 1);
- }
- }
- }
- else {
- list.push(item);
- }
- };
- /**
- * @param {?} source
- * @return {?}
- */
- DualListComponent.prototype.selectAll = /**
- * @param {?} source
- * @return {?}
- */
- function (source) {
- source.pick.length = 0;
- source.pick = source.sift.slice(0);
- };
- /**
- * @param {?} source
- * @return {?}
- */
- DualListComponent.prototype.selectNone = /**
- * @param {?} source
- * @return {?}
- */
- function (source) {
- source.pick.length = 0;
- };
- /**
- * @param {?} source
- * @return {?}
- */
- DualListComponent.prototype.isAllSelected = /**
- * @param {?} source
- * @return {?}
- */
- function (source) {
- if (source.list.length === 0 || source.list.length === source.pick.length) {
- return true;
- }
- return false;
- };
- /**
- * @param {?} source
- * @return {?}
- */
- DualListComponent.prototype.isAnySelected = /**
- * @param {?} source
- * @return {?}
- */
- function (source) {
- if (source.pick.length > 0) {
- return true;
- }
- return false;
- };
- /**
- * @private
- * @param {?} source
- * @return {?}
- */
- DualListComponent.prototype.unpick = /**
- * @private
- * @param {?} source
- * @return {?}
- */
- function (source) {
- for (var 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 {?}
- */
- DualListComponent.prototype.clearFilter = /**
- * @param {?} source
- * @return {?}
- */
- function (source) {
- if (source) {
- source.picker = '';
- this.onFilter(source);
- }
- };
- /**
- * @param {?} source
- * @return {?}
- */
- DualListComponent.prototype.onFilter = /**
- * @param {?} source
- * @return {?}
- */
- function (source) {
- var _this = this;
- if (source.picker.length > 0) {
- try {
- /** @type {?} */
- var filtered = source.list.filter((/**
- * @param {?} item
- * @return {?}
- */
- function (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 {?}
- */
- DualListComponent.prototype.makeId = /**
- * @private
- * @param {?} item
- * @return {?}
- */
- function (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' ]"
- // Allow for complex names by passing an array of strings.
- // Example: [display]="[ '_type.substring(0,1)', '_name' ]"
- /**
- * @protected
- * @param {?} item
- * @param {?=} separator
- * @return {?}
- */
- DualListComponent.prototype.makeName =
- // Allow for complex names by passing an array of strings.
- // Example: [display]="[ '_type.substring(0,1)', '_name' ]"
- /**
- * @protected
- * @param {?} item
- * @param {?=} separator
- * @return {?}
- */
- function (item, separator) {
- if (separator === void 0) { separator = '_'; }
- /** @type {?} */
- var 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 {?} */
- var str = '';
- if (this.display !== undefined) {
- switch (Object.prototype.toString.call(this.display)) {
- case '[object Function]':
- str = this.display(item);
- break;
- case '[object Array]':
- for (var 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 {?} */
- var parts = this.display[i].split('.');
- /** @type {?} */
- var s = item[parts[0]];
- if (s) {
- // Use brute force
- if (parts[1].indexOf('substring') !== -1) {
- /** @type {?} */
- var 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: "<div class=\"dual-list\">\n\t<div class=\"listbox\" [ngStyle]=\"{ 'order' : direction() ? 1 : 2, 'margin-left' : direction() ? 0 : '10px' }\">\n\t\t<button type=\"button\" name=\"addBtn\" class=\"btn btn-primary btn-block\"\n\t\t\t(click)=\"moveItem(available, confirmed)\" [ngClass]=\"direction() ? 'point-right' : 'point-left'\"\n\t\t\t[disabled]=\"available.pick.length === 0\">{{format.add}}</button>\n\n\t\t<form *ngIf=\"filter\" class=\"filter\">\n\t\t\t<input class=\"form-control\" name=\"filterSource\" [(ngModel)]=\"available.picker\" (ngModelChange)=\"onFilter(available)\">\n\t\t</form>\n\n\t\t<div class=\"record-picker\">\n\t\t\t<ul [ngStyle]=\"{'max-height': height, 'min-height': height}\" [ngClass]=\"{over:available.dragOver}\"\n\t\t\t\t(drop)=\"drop($event, confirmed)\" (dragover)=\"allowDrop($event, available)\" (dragleave)=\"dragLeave()\">\n\t\t\t\t<li *ngFor=\"let item of available.sift; let idx=index;\"\n\t\t\t\t\t(click)=\"disabled ? null : selectItem(available.pick, item); shiftClick($event, idx, available, item)\"\n\t\t\t\t\t[ngClass]=\"{selected: isItemSelected(available.pick, item), disabled: disabled}\"\n\t\t\t\t\t[draggable]=\"!disabled && format.draggable\" (dragstart)=\"drag($event, item, available)\" (dragend)=\"dragEnd(available)\"\n\t\t\t\t><label>{{item._name}}</label></li>\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<div class=\"button-bar\">\n\t\t\t<button type=\"button\" class=\"btn btn-primary pull-left\" (click)=\"selectAll(available)\"\n\t\t\t\t[disabled]=\"disabled || isAllSelected(available)\">{{format.all}}</button>\n\t\t\t<button type=\"button\" class=\"btn btn-default pull-right\" (click)=\"selectNone(available)\"\n\t\t\t\t[disabled]=\"!isAnySelected(available)\">{{format.none}}</button>\n\t\t</div>\n\t</div>\n\n\t<div class=\"listbox\" [ngStyle]=\"{ 'order' : direction() ? 2 : 1, 'margin-left' : direction() ? '10px' : 0 }\">\n\t\t<button type=\"button\" name=\"removeBtn\" class=\"btn btn-primary btn-block\"\n\t\t\t(click)=\"moveItem(confirmed, available)\" [ngClass]=\"direction() ? 'point-left' : 'point-right'\"\n\t\t\t[disabled]=\"confirmed.pick.length === 0\">{{format.remove}}</button>\n\n\t\t<form *ngIf=\"filter\" class=\"filter\">\n\t\t\t<input class=\"form-control\" name=\"filterDestination\" [(ngModel)]=\"confirmed.picker\" (ngModelChange)=\"onFilter(confirmed)\">\n\t\t</form>\n\n\t\t<div class=\"record-picker\">\n\t\t\t<ul [ngStyle]=\"{'max-height': height, 'min-height': height}\" [ngClass]=\"{over:confirmed.dragOver}\"\n\t\t\t\t(drop)=\"drop($event, available)\" (dragover)=\"allowDrop($event, confirmed)\" (dragleave)=\"dragLeave()\">\n\t\t\t\t<li #itmConf *ngFor=\"let item of confirmed.sift; let idx=index;\"\n\t\t\t\t\t(click)=\"disabled ? null : selectItem(confirmed.pick, item); shiftClick($event, idx, confirmed, item)\"\n\t\t\t\t\t[ngClass]=\"{selected: isItemSelected(confirmed.pick, item), disabled: disabled}\"\n\t\t\t\t\t[draggable]=\"!disabled && format.draggable\" (dragstart)=\"drag($event, item, confirmed)\" (dragend)=\"dragEnd(confirmed)\"\n\t\t\t\t><label>{{item._name}}</label></li>\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<div class=\"button-bar\">\n\t\t\t<button type=\"button\" class=\"btn btn-primary pull-left\" (click)=\"selectAll(confirmed)\"\n\t\t\t\t[disabled]=\"disabled || isAllSelected(confirmed)\">{{format.all}}</button>\n\t\t\t<button type=\"button\" class=\"btn btn-default pull-right\" (click)=\"selectNone(confirmed)\"\n\t\t\t\t[disabled]=\"!isAnySelected(confirmed)\">{{format.none}}</button>\n\t\t</div>\n\t</div>\n</div>\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,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M0 64l192 192v192l128-32V256L512 64H0z\"/></svg>');background-repeat:no-repeat;background-position:center center;opacity:.2;top:-36px;left:calc(100% - 21px);position:relative}"]
- }] }
- ];
- /** @nocollapse */
- DualListComponent.ctorParameters = function () { return [
- { 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 }]
- };
- return DualListComponent;
- }());
- export { DualListComponent };
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZHVhbC1saXN0Ym94LyIsInNvdXJjZXMiOlsibGliL2R1YWwtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVcsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQ2hFLE1BQU0sRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7SUFJckMsTUFBTSxHQUFHLENBQUM7QUFFZDtJQTRDQywyQkFBb0IsT0FBd0I7UUFBeEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFyQm5DLE9BQUUsR0FBRyxlQUFhLE1BQU0sRUFBSSxDQUFDO1FBQzdCLFFBQUcsR0FBRyxLQUFLLENBQUM7UUFDWixZQUFPLEdBQVEsT0FBTyxDQUFDO1FBQ3ZCLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFDakIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFdBQU0sR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7UUFDMUMsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUViLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHaEIsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVF6QyxXQUFNOzs7OztRQUFHLFVBQUMsQ0FBTSxFQUFFLENBQU0sSUFBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7UUFHekcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNB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LGlDQUFzQjs7SUFDdEIsb0NBQWtDOztJQUNsQyxxQ0FBMEI7O0lBQzFCLG1DQUE0Qjs7SUFDNUIsd0NBQWlDOztJQUNqQyw4Q0FBaUQ7O0lBRWpELHNDQUFxQjs7SUFDckIsc0NBQXFCOztJQUVyQix5Q0FBa0I7O0lBQ2xCLDhDQUF1Qjs7Ozs7SUFFdkIsbUNBQTBHOzs7OztJQUU5RixvQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERvQ2hlY2ssIEV2ZW50RW1pdHRlciwgSW5wdXQsIEl0ZXJhYmxlRGlmZmVycywgT25DaGFuZ2VzLFxuXHRPdXRwdXQsIFNpbXBsZUNoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCYXNpY0xpc3QgfSBmcm9tICcuL2Jhc2ljLWxpc3QnO1xuXG5leHBvcnQgdHlwZSBjb21wYXJlRnVuY3Rpb24gPSAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcjtcblxudmFyIG5leHRJZCA9IDA7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2R1YWwtbGlzdCcsXG5cdHRlbXBsYXRlVXJsOiAnLi9kdWFsLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuXHRzdHlsZVVybHM6IFsgJy4vZHVhbC1saXN0LmNvbXBvbmVudC5jc3MnIF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBEdWFsTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uQ2hhbmdlcyB7XG5cdHN0YXRpYyBBVkFJTEFCTEVfTElTVF9OQU1FID0gJ2F2YWlsYWJsZSc7XG5cdHN0YXRpYyBDT05GSVJNRURfTElTVF9OQU1FID0gJ2NvbmZpcm1lZCc7XG5cblx0c3RhdGljIExUUiA9ICdsZWZ0LXRvLXJpZ2h0Jztcblx0c3RhdGljIFJUTCA9ICdyaWdodC10by1sZWZ0JztcblxuXHRzdGF0aWMgREVGQVVMVF9GT1JNQVQgPSB7XG5cdFx0YWRkOiAnQWRkJyxcblx0XHRyZW1vdmU6ICdSZW1vdmUnLFxuXHRcdGFsbDogJ0FsbCcsXG5cdFx0bm9uZTogJ05vbmUnLFxuXHRcdGRpcmVjdGlvbjogRHVhbExpc3RDb21wb25lbnQuTFRSLFxuXHRcdGRyYWdnYWJsZTogdHJ1ZSxcblx0XHRsb2NhbGU6IHVuZGVmaW5lZFxuXHR9O1xuXG5cdEBJbnB1dCgpIGlkID0gYGR1YWwtbGlzdC0ke25leHRJZCsrfWA7XG5cdEBJbnB1dCgpIGtleSA9ICdfaWQnO1xuXHRASW5wdXQoKSBkaXNwbGF5OiBhbnkgPSAnX25hbWUnO1xuXHRASW5wdXQoKSBoZWlnaHQgPSAnMTAwcHgnO1xuXHRASW5wdXQoKSBmaWx0ZXIgPSBmYWxzZTtcblx0QElucHV0KCkgZm9ybWF0ID0gRHVhbExpc3RDb21wb25lbnQuREVGQVVMVF9GT1JNQVQ7XG5cdEBJbnB1dCgpIHNvcnQgPSBmYWxzZTtcblx0QElucHV0KCkgY29tcGFyZTogY29tcGFyZUZ1bmN0aW9uO1xuXHRASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXHRASW5wdXQoKSBzb3VyY2U6IEFycmF5PGFueT47XG5cdEBJbnB1dCgpIGRlc3RpbmF0aW9uOiBBcnJheTxhbnk+O1xuXHRAT3V0cHV0KCkgZGVzdGluYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0YXZhaWxhYmxlOiBCYXNpY0xpc3Q7XG5cdGNvbmZpcm1lZDogQmFzaWNMaXN0O1xuXG5cdHNvdXJjZURpZmZlcjogYW55O1xuXHRkZXN0aW5hdGlvbkRpZmZlcjogYW55O1xuXG5cdHByaXZhdGUgc29ydGVyID0gKGE6IGFueSwgYjogYW55KSA9PiB7IHJldHVybiAoYS5fbmFtZSA8IGIuX25hbWUpID8gLTEgOiAoKGEuX25hbWUgPiBiLl9uYW1lKSA/IDEgOiAwKTsgfTtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xuXHRcdHRoaXMuYXZhaWxhYmxlID0gbmV3IEJhc2ljTGlzdChEdWFsTGlzdENvbXBvbmVudC5BVkFJTEFCTEVfTElTVF9OQU1FKTtcblx0XHR0aGlzLmNvbmZpcm1lZCA9IG5ldyBCYXNpY0xpc3QoRHVhbExpc3RDb21wb25lbnQuQ09ORklSTUVEX0xJU1RfTkFNRSk7XG5cdH1cblxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VSZWNvcmQ6IHtba2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2V9KSB7XG5cdFx0aWYgKGNoYW5nZVJlY29yZFsnZmlsdGVyJ10pIHtcblx0XHRcdGlmIChjaGFuZ2VSZWNvcmRbJ2ZpbHRlciddLmN1cnJlbnRWYWx1ZSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5jbGVhckZpbHRlcih0aGlzLmF2YWlsYWJsZSk7XG5cdFx0XHRcdHRoaXMuY2xlYXJGaWx0ZXIodGhpcy5jb25maXJtZWQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VSZWNvcmRbJ3NvcnQnXSkge1xuXHRcdFx0aWYgKGNoYW5nZVJlY29yZFsnc29ydCddLmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSAmJiB0aGlzLmNvbXBhcmUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLmNvbXBhcmUgPSB0aGlzLnNvcnRlcjtcblx0XHRcdH0gZWxzZSBpZiAoY2hhbmdlUmVjb3JkWydzb3J0J10uY3VycmVudFZhbHVlID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLmNvbXBhcmUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZVJlY29yZFsnZm9ybWF0J10pIHtcblx0XHRcdHRoaXMuZm9ybWF0ID0gY2hhbmdlUmVjb3JkWydmb3JtYXQnXS5jdXJyZW50VmFsdWU7XG5cblx0XHRcdGlmICh0eXBlb2YodGhpcy5mb3JtYXQuZGlyZWN0aW9uKSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0dGhpcy5mb3JtYXQuZGlyZWN0aW9uID0gRHVhbExpc3RDb21wb25lbnQuTFRSO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mKHRoaXMuZm9ybWF0LmFkZCkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0LmFkZCA9IER1YWxMaXN0Q29tcG9uZW50LkRFRkFVTFRfRk9STUFULmFkZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZih0aGlzLmZvcm1hdC5yZW1vdmUpID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmZvcm1hdC5yZW1vdmUgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVC5yZW1vdmU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YodGhpcy5mb3JtYXQuYWxsKSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0dGhpcy5mb3JtYXQuYWxsID0gRHVhbExpc3RDb21wb25lbnQuREVGQVVMVF9GT1JNQVQuYWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mKHRoaXMuZm9ybWF0Lm5vbmUpID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmZvcm1hdC5ub25lID0gRHVhbExpc3RDb21wb25lbnQuREVGQVVMVF9GT1JNQVQubm9uZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZih0aGlzLmZvcm1hdC5kcmFnZ2FibGUpID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmZvcm1hdC5kcmFnZ2FibGUgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVC5kcmFnZ2FibGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZVJlY29yZFsnc291cmNlJ10pIHtcblx0XHRcdHRoaXMuYXZhaWxhYmxlID0gbmV3IEJhc2ljTGlzdChEdWFsTGlzdENvbXBvbmVudC5BVkFJTEFCTEVfTElTVF9OQU1FKTtcblx0XHRcdHRoaXMudXBkYXRlZFNvdXJjZSgpO1xuXHRcdFx0dGhpcy51cGRhdGVkRGVzdGluYXRpb24oKTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlUmVjb3JkWydkZXN0aW5hdGlvbiddKSB7XG5cdFx0XHR0aGlzLmNvbmZpcm1lZCA9IG5ldyBCYXNpY0xpc3QoRHVhbExpc3RDb21wb25lbnQuQ09ORklSTUVEX0xJU1RfTkFNRSk7XG5cdFx0XHR0aGlzLnVwZGF0ZWREZXN0aW5hdGlvbigpO1xuXHRcdFx0dGhpcy51cGRhdGVkU291cmNlKCk7XG5cdFx0fVxuXHR9XG5cblx0bmdEb0NoZWNrKCkge1xuXHRcdGlmICh0aGlzLnNvdXJjZSAmJiB0aGlzLmJ1aWxkQXZhaWxhYmxlKHRoaXMuc291cmNlKSkge1xuXHRcdFx0dGhpcy5vbkZpbHRlcih0aGlzLmF2YWlsYWJsZSk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmRlc3RpbmF0aW9uICYmIHRoaXMuYnVpbGRDb25maXJtZWQodGhpcy5kZXN0aW5hdGlvbikpIHtcblx0XHRcdHRoaXMub25GaWx0ZXIodGhpcy5jb25maXJtZWQpO1xuXHRcdH1cblx0fVxuXG5cdGJ1aWxkQXZhaWxhYmxlKHNvdXJjZTogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHNvdXJjZUNoYW5nZXMgPSB0aGlzLnNvdXJjZURpZmZlci5kaWZmKHNvdXJjZSk7XG5cdFx0aWYgKHNvdXJjZUNoYW5nZXMpIHtcblx0XHRcdHNvdXJjZUNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyOiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3QgaWR4ID0gdGhpcy5maW5kSXRlbUluZGV4KHRoaXMuYXZhaWxhYmxlLmxpc3QsIHIuaXRlbSwgdGhpcy5rZXkpO1xuXHRcdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRcdHRoaXMuYXZhaWxhYmxlLmxpc3Quc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRzb3VyY2VDaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKHI6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZXMgZXZlbiBpZiBzb3VyY2UgaGFzIGR1cGxpY2F0ZXMuXG5cdFx0XHRcdGlmICh0aGlzLmZpbmRJdGVtSW5kZXgodGhpcy5hdmFpbGFibGUubGlzdCwgci5pdGVtLCB0aGlzLmtleSkgPT09IC0xKSB7XG5cdFx0XHRcdFx0dGhpcy5hdmFpbGFibGUubGlzdC5wdXNoKCB7IF9pZDogdGhpcy5tYWtlSWQoci5pdGVtKSwgX25hbWU6IHRoaXMubWFrZU5hbWUoci5pdGVtKSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmICh0aGlzLmNvbXBhcmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLmF2YWlsYWJsZS5saXN0LnNvcnQodGhpcy5jb21wYXJlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYXZhaWxhYmxlLnNpZnQgPSB0aGlzLmF2YWlsYWJsZS5saXN0O1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0YnVpbGRDb25maXJtZWQoZGVzdGluYXRpb246IEFycmF5PGFueT4pOiBib29sZWFuIHtcblx0XHRsZXQgbW92ZWQgPSBmYWxzZTtcblx0XHRjb25zdCBkZXN0Q2hhbmdlcyA9IHRoaXMuZGVzdGluYXRpb25EaWZmZXIuZGlmZihkZXN0aW5hdGlvbik7XG5cdFx0aWYgKGRlc3RDaGFuZ2VzKSB7XG5cdFx0XHRkZXN0Q2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHI6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBpZHggPSB0aGlzLmZpbmRJdGVtSW5kZXgodGhpcy5jb25maXJtZWQubGlzdCwgci5pdGVtLCB0aGlzLmtleSk7XG5cdFx0XHRcdGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLmlzSXRlbVNlbGVjdGVkKHRoaXMuY29uZmlybWVkLnBpY2ssIHRoaXMuY29uZmlybWVkLmxpc3RbaWR4XSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0SXRlbSh0aGlzLmNvbmZpcm1lZC5waWNrLCB0aGlzLmNvbmZpcm1lZC5saXN0W2lkeF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLm1vdmVJdGVtKHRoaXMuY29uZmlybWVkLCB0aGlzLmF2YWlsYWJsZSwgdGhpcy5jb25maXJtZWQubGlzdFtpZHhdLCBmYWxzZSk7XG5cdFx0XHRcdFx0bW92ZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0ZGVzdENoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocjogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IHRoaXMuZmluZEl0ZW1JbmRleCh0aGlzLmF2YWlsYWJsZS5saXN0LCByLml0ZW0sIHRoaXMua2V5KTtcblx0XHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuaXNJdGVtU2VsZWN0ZWQodGhpcy5hdmFpbGFibGUucGljaywgdGhpcy5hdmFpbGFibGUubGlzdFtpZHhdKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RJdGVtKHRoaXMuYXZhaWxhYmxlLnBpY2ssIHRoaXMuYXZhaWxhYmxlLmxpc3RbaWR4XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubW92ZUl0ZW0odGhpcy5hdmFpbGFibGUsIHRoaXMuY29uZmlybWVkLCB0aGlzLmF2YWlsYWJsZS5saXN0W2lkeF0sIGZhbHNlKTtcblx0XHRcdFx0XHRtb3ZlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodGhpcy5jb21wYXJlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5jb25maXJtZWQubGlzdC5zb3J0KHRoaXMuY29tcGFyZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmNvbmZpcm1lZC5zaWZ0ID0gdGhpcy5jb25maXJtZWQubGlzdDtcblxuXHRcdFx0aWYgKG1vdmVkKSB7XG5cdFx0XHRcdHRoaXMudHJ1ZVVwKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dXBkYXRlZFNvdXJjZSgpIHtcblx0XHR0aGlzLmF2YWlsYWJsZS5saXN0Lmxlbmd0aCA9IDA7XG5cdFx0dGhpcy5hdmFpbGFibGUucGljay5sZW5ndGggPSAwO1xuXG5cdFx0aWYgKHRoaXMuc291cmNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc291cmNlRGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQodGhpcy5zb3VyY2UpLmNyZWF0ZShudWxsKTtcblx0XHR9XG5cdH1cblxuXHR1cGRhdGVkRGVzdGluYXRpb24oKSB7XG5cdFx0aWYgKHRoaXMuZGVzdGluYXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbkRpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKHRoaXMuZGVzdGluYXRpb24pLmNyZWF0ZShudWxsKTtcblx0XHR9XG5cdH1cblxuXHRkaXJlY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZm9ybWF0LmRpcmVjdGlvbiA9PT0gRHVhbExpc3RDb21wb25lbnQuTFRSO1xuXHR9XG5cblx0ZHJhZ0VuZChsaXN0OiBCYXNpY0xpc3QgPSBudWxsKTogYm9vbGVhbiB7XG5cdFx0aWYgKGxpc3QpIHtcblx0XHRcdGxpc3QuZHJhZ1N0YXJ0ID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYXZhaWxhYmxlLmRyYWdTdGFydCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5jb25maXJtZWQuZHJhZ1N0YXJ0ID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGRyYWcoZXZlbnQ6IERyYWdFdmVudCwgaXRlbTogYW55LCBsaXN0OiBCYXNpY0xpc3QpIHtcblx0XHRpZiAoIXRoaXMuaXNJdGVtU2VsZWN0ZWQobGlzdC5waWNrLCBpdGVtKSkge1xuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKGxpc3QucGljaywgaXRlbSk7XG5cdFx0fVxuXHRcdGxpc3QuZHJhZ1N0YXJ0ID0gdHJ1ZTtcblxuXHRcdC8vIFNldCBhIGN1c3RvbSB0eXBlIHRvIGJlIHRoaXMgZHVhbC1saXN0J3MgaWQuXG5cdFx0ZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEodGhpcy5pZCwgaXRlbVsnX2lkJ10pO1xuXHR9XG5cblx0YWxsb3dEcm9wKGV2ZW50OiBEcmFnRXZlbnQsIGxpc3Q6IEJhc2ljTGlzdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChldmVudC5kYXRhVHJhbnNmZXIudHlwZXMubGVuZ3RoICYmIChldmVudC5kYXRhVHJhbnNmZXIudHlwZXNbMF0gPT09IHRoaXMuaWQpKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKCFsaXN0LmRyYWdTdGFydCkge1xuXHRcdFx0XHRsaXN0LmRyYWdPdmVyID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZHJhZ0xlYXZlKCkge1xuXHRcdHRoaXMuYXZhaWxhYmxlLmRyYWdPdmVyID0gZmFsc2U7XG5cdFx0dGhpcy5jb25maXJtZWQuZHJhZ092ZXIgPSBmYWxzZTtcblx0fVxuXG5cdGRyb3AoZXZlbnQ6IERyYWdFdmVudCwgbGlzdDogQmFzaWNMaXN0KSB7XG5cdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcy5sZW5ndGggJiYgKGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlc1swXSA9PT0gdGhpcy5pZCkpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR0aGlzLmRyYWdMZWF2ZSgpO1xuXHRcdFx0dGhpcy5kcmFnRW5kKCk7XG5cblx0XHRcdGlmIChsaXN0ID09PSB0aGlzLmF2YWlsYWJsZSkge1xuXHRcdFx0XHR0aGlzLm1vdmVJdGVtKHRoaXMuYXZhaWxhYmxlLCB0aGlzLmNvbmZpcm1lZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLm1vdmVJdGVtKHRoaXMuY29uZmlybWVkLCB0aGlzLmF2YWlsYWJsZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB0cnVlVXAoKSB7XG5cdFx0bGV0IGNoYW5nZWQgPSBmYWxzZTtcblxuXHRcdC8vIENsZWFyIHJlbW92ZWQgaXRlbXMuXG5cdFx0bGV0IHBvcyA9IHRoaXMuZGVzdGluYXRpb24ubGVuZ3RoO1xuXHRcdHdoaWxlICgocG9zIC09IDEpID49IDApIHtcblx0XHRcdGNvbnN0IG12ID0gdGhpcy5jb25maXJtZWQubGlzdC5maWx0ZXIoIGNvbmYgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIHRoaXMuZGVzdGluYXRpb25bcG9zXSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29uZi5faWQgPT09IHRoaXMuZGVzdGluYXRpb25bcG9zXVt0aGlzLmtleV07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbmYuX2lkID09PSB0aGlzLmRlc3RpbmF0aW9uW3Bvc107XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKG12Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHQvLyBOb3QgZm91bmQgc28gcmVtb3ZlLlxuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uLnNwbGljZShwb3MsIDEpO1xuXHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQdXNoIGFkZGVkIGl0ZW1zLlxuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmNvbmZpcm1lZC5saXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG5cdFx0XHRsZXQgbXYgPSB0aGlzLmRlc3RpbmF0aW9uLmZpbHRlciggKGQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIGQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChkW3RoaXMua2V5XSA9PT0gdGhpcy5jb25maXJtZWQubGlzdFtpXS5faWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiAoZCA9PT0gdGhpcy5jb25maXJtZWQubGlzdFtpXS5faWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKG12Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHQvLyBOb3QgZm91bmQgc28gYWRkLlxuXHRcdFx0XHRtdiA9IHRoaXMuc291cmNlLmZpbHRlciggKG86IGFueSkgPT4ge1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgbyA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRcdHJldHVybiAob1t0aGlzLmtleV0gPT09IHRoaXMuY29uZmlybWVkLmxpc3RbaV0uX2lkKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvID09PSB0aGlzLmNvbmZpcm1lZC5saXN0W2ldLl9pZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAobXYubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVzdGluYXRpb24ucHVzaChtdlswXSk7XG5cdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlZCkge1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbkNoYW5nZS5lbWl0KHRoaXMuZGVzdGluYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdGZpbmRJdGVtSW5kZXgobGlzdDogQXJyYXk8YW55PiwgaXRlbTogYW55LCBrZXk6IGFueSA9ICdfaWQnKSB7XG5cdFx0bGV0IGlkeCA9IC0xO1xuXG5cdFx0ZnVuY3Rpb24gbWF0Y2hPYmplY3QoZTogYW55KSB7XG5cdFx0XHRpZiAoZS5faWQgPT09IGl0ZW1ba2V5XSkge1xuXHRcdFx0XHRpZHggPSBsaXN0LmluZGV4T2YoZSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG1hdGNoKGU6IGFueSkge1xuXHRcdFx0aWYgKGUuX2lkID09PSBpdGVtKSB7XG5cdFx0XHRcdGlkeCA9IGxpc3QuaW5kZXhPZihlKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBhcnJheXMgZG8gbm90IGhhdmUgZHVwbGljYXRlcy5cblx0XHRpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRsaXN0LmZpbHRlcihtYXRjaE9iamVjdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpc3QuZmlsdGVyKG1hdGNoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaWR4O1xuXHR9XG5cblx0cHJpdmF0ZSBtYWtlVW5hdmFpbGFibGUoc291cmNlOiBCYXNpY0xpc3QsIGl0ZW06IGFueSkge1xuXHRcdGNvbnN0IGlkeCA9IHNvdXJjZS5saXN0LmluZGV4T2YoaXRlbSk7XG5cdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdHNvdXJjZS5saXN0LnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fVxuXG5cdG1vdmVJdGVtKHNvdXJjZTogQmFzaWNMaXN0LCB0YXJnZXQ6IEJhc2ljTGlzdCwgaXRlbTogYW55ID0gbnVsbCwgdHJ1ZXVwID0gdHJ1ZSkge1xuXHRcdGxldCBpID0gMDtcblx0XHRsZXQgbGVuID0gc291cmNlLnBpY2subGVuZ3RoO1xuXG5cdFx0aWYgKGl0ZW0pIHtcblx0XHRcdGkgPSBzb3VyY2UubGlzdC5pbmRleE9mKGl0ZW0pO1xuXHRcdFx0bGVuID0gaSArIDE7XG5cdFx0fVxuXG5cdFx0Zm9yICg7IGkgPCBsZW47IGkgKz0gMSkge1xuXHRcdFx0Ly8gSXMgdGhlIHBpY2sgc3RpbGwgaW4gbGlzdD9cblx0XHRcdGxldCBtdjogQXJyYXk8YW55PiA9IFtdO1xuXHRcdFx0aWYgKGl0ZW0pIHtcblx0XHRcdFx0Y29uc3QgaWR4ID0gdGhpcy5maW5kSXRlbUluZGV4KHNvdXJjZS5waWNrLCBpdGVtKTtcblx0XHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0XHRtdlswXSA9IHNvdXJjZS5waWNrW2lkeF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG12ID0gc291cmNlLmxpc3QuZmlsdGVyKCBzcmMgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoc3JjLl9pZCA9PT0gc291cmNlLnBpY2tbaV0uX2lkKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3VsZCBvbmx5IGV2ZXIgYmUgMVxuXHRcdFx0aWYgKG12Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHQvLyBBZGQgaWYgbm90IGFscmVhZHkgaW4gdGFyZ2V0LlxuXHRcdFx0XHRpZiAodGFyZ2V0Lmxpc3QuZmlsdGVyKHRyZyA9PiB0cmcuX2lkID09PSBtdlswXS5faWQpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRhcmdldC5saXN0LnB1c2goIG12WzBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLm1ha2VVbmF2YWlsYWJsZShzb3VyY2UsIG12WzBdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5jb21wYXJlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRhcmdldC5saXN0LnNvcnQodGhpcy5jb21wYXJlKTtcblx0XHR9XG5cblx0XHRzb3VyY2UucGljay5sZW5ndGggPSAwO1xuXG5cdFx0Ly8gVXBkYXRlIGRlc3RpbmF0aW9uXG5cdFx0aWYgKHRydWV1cCkge1xuXHRcdFx0dGhpcy50cnVlVXAoKTtcblx0XHR9XG5cblx0XHQvLyBEZWxheSBldmVyLXNvLXNsaWdodGx5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb24uXG5cdFx0c2V0VGltZW91dCggKCkgPT4ge1xuXHRcdFx0dGhpcy5vbkZpbHRlcihzb3VyY2UpO1xuXHRcdFx0dGhpcy5vbkZpbHRlcih0YXJnZXQpO1xuXHRcdH0sIDEwKTtcblx0fVxuXG5cdGlzSXRlbVNlbGVjdGVkKGxpc3Q6IEFycmF5PGFueT4sIGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuXHRcdGlmIChsaXN0LmZpbHRlcihlID0+IE9iamVjdC5pcyhlLCBpdGVtKSkubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHNoaWZ0Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIsIHNvdXJjZTogQmFzaWNMaXN0LCBpdGVtOiBhbnkpIHtcblx0XHRpZiAoZXZlbnQuc2hpZnRLZXkgJiYgc291cmNlLmxhc3QgJiYgIU9iamVjdC5pcyhpdGVtLCBzb3VyY2UubGFzdCkpIHtcblx0XHRcdGNvbnN0IGlkeCA9IHNvdXJjZS5zaWZ0LmluZGV4T2Yoc291cmNlLmxhc3QpO1xuXHRcdFx0aWYgKGluZGV4ID4gaWR4KSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAoaWR4ICsgMSk7IGkgPCBpbmRleDsgaSArPSAxKSB7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RJdGVtKHNvdXJjZS5waWNrLCBzb3VyY2Uuc2lmdFtpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gKGluZGV4ICsgMSk7IGkgPCBpZHg7IGkgKz0gMSkgIHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdEl0ZW0oc291cmNlLnBpY2ssIHNvdXJjZS5zaWZ0W2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRzb3VyY2UubGFzdCA9IGl0ZW07XG5cdH1cblxuXHRzZWxlY3RJdGVtKGxpc3Q6IEFycmF5PGFueT4sIGl0ZW06IGFueSkge1xuXHRcdGNvbnN0IHBrID0gbGlzdC5maWx0ZXIoIChlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuaXMoZSwgaXRlbSk7XG5cdFx0fSk7XG5cdFx0aWYgKHBrLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIEFscmVhZHkgaW4gbGlzdCwgc28gZGVzZWxlY3QuXG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbGVuID0gcGsubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcblx0XHRcdFx0Y29uc3QgaWR4ID0gbGlzdC5pbmRleE9mKHBrW2ldKTtcblx0XHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0XHRsaXN0LnNwbGljZShpZHgsIDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpc3QucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxuXHRzZWxlY3RBbGwoc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRzb3VyY2UucGljay5sZW5ndGggPSAwO1xuXHRcdHNvdXJjZS5waWNrID0gc291cmNlLnNpZnQuc2xpY2UoMCk7XG5cdH1cblxuXHRzZWxlY3ROb25lKHNvdXJjZTogQmFzaWNMaXN0KSB7XG5cdFx0c291cmNlLnBpY2subGVuZ3RoID0gMDtcblx0fVxuXG5cdGlzQWxsU2VsZWN0ZWQoc291cmNlOiBCYXNpY0xpc3QpOiBib29sZWFuIHtcblx0XHRpZiAoc291cmNlLmxpc3QubGVuZ3RoID09PSAwIHx8IHNvdXJjZS5saXN0Lmxlbmd0aCA9PT0gc291cmNlLnBpY2subGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aXNBbnlTZWxlY3RlZChzb3VyY2U6IEJhc2ljTGlzdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChzb3VyY2UucGljay5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHJpdmF0ZSB1bnBpY2soc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRmb3IgKGxldCBpID0gc291cmNlLnBpY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcblx0XHRcdGlmIChzb3VyY2Uuc2lmdC5pbmRleE9mKHNvdXJjZS5waWNrW2ldKSA9PT0gLTEpIHtcblx0XHRcdFx0c291cmNlLnBpY2suc3BsaWNlKGksIDEpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNsZWFyRmlsdGVyKHNvdXJjZTogQmFzaWNMaXN0KSB7XG5cdFx0aWYgKHNvdXJjZSkge1xuXHRcdFx0c291cmNlLnBpY2tlciA9ICcnO1xuXHRcdFx0dGhpcy5vbkZpbHRlcihzb3VyY2UpO1xuXHRcdH1cblx0fVxuXG5cdG9uRmlsdGVyKHNvdXJjZTogQmFzaWNMaXN0KSB7XG5cdFx0aWYgKHNvdXJjZS5waWNrZXIubGVuZ3RoID4gMCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBzb3VyY2UubGlzdC5maWx0ZXIoIChpdGVtOiBhbnkpID0+IHtcblx0XHRcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZW0pID09PSAnW29iamVjdCBPYmplY3RdJykge1xuXHRcdFx0XHRcdFx0aWYgKGl0ZW0uX25hbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlOiByZW1vdmUgd2hlbiBkLnRzIGhhcyBsb2NhbGUgYXMgYW4gYXJndW1lbnQuXG5cdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLl9uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKHRoaXMuZm9ybWF0LmxvY2FsZSkuaW5kZXhPZihzb3VyY2UucGlja2VyLnRvTG9jYWxlTG93ZXJDYXNlKHRoaXMuZm9ybWF0LmxvY2FsZSkpICE9PSAtMTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmU6IHJlbW92ZSB3aGVuIGQudHMgaGFzIGxvY2FsZSBhcyBhbiBhcmd1bWVudC5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KGl0ZW0pLnRvTG9jYWxlTG93ZXJDYXNlKHRoaXMuZm9ybWF0LmxvY2FsZSkuaW5kZXhPZihzb3VyY2UucGlja2VyLnRvTG9jYWxlTG93ZXJDYXNlKHRoaXMuZm9ybWF0LmxvY2FsZSkpICE9PSAtMTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZTogcmVtb3ZlIHdoZW4gZC50cyBoYXMgbG9jYWxlIGFzIGFuIGFyZ3VtZW50LlxuXHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0udG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKS5pbmRleE9mKHNvdXJjZS5waWNrZXIudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKSkgIT09IC0xO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvdXJjZS5zaWZ0ID0gZmlsdGVyZWQ7XG5cdFx0XHRcdHRoaXMudW5waWNrKHNvdXJjZSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikge1xuXHRcdFx0XHRcdHRoaXMuZm9ybWF0LmxvY2FsZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRzb3VyY2Uuc2lmdCA9IHNvdXJjZS5saXN0O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzb3VyY2Uuc2lmdCA9IHNvdXJjZS5saXN0O1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgbWFrZUlkKGl0ZW06IGFueSk6IHN0cmluZyB8IG51bWJlciB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGl0ZW1bdGhpcy5rZXldO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gaXRlbTtcblx0XHR9XG5cdH1cblxuXHQvLyBBbGxvdyBmb3IgY29tcGxleCBuYW1lcyBieSBwYXNzaW5nIGFuIGFycmF5IG9mIHN0cmluZ3MuXG5cdC8vIEV4YW1wbGU6IFtkaXNwbGF5XT1cIlsgJ190eXBlLnN1YnN0cmluZygwLDEpJywgJ19uYW1lJyBdXCJcblx0cHJvdGVjdGVkIG1ha2VOYW1lKGl0ZW06IGFueSwgc2VwYXJhdG9yID0gJ18nKTogc3RyaW5nIHtcblx0XHRjb25zdCBkaXNwbGF5ID0gdGhpcy5kaXNwbGF5O1xuXG5cdFx0ZnVuY3Rpb24gZmFsbGJhY2soaXRtOiBhbnkpIHtcblx0XHRcdHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0bSkpIHtcblx0XHRcdGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG5cdFx0XHRcdHJldHVybiBpdG07XG5cdFx0XHRjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuXHRcdFx0XHRyZXR1cm4gaXRtO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYgKGl0bSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGl0bVtkaXNwbGF5XTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gJ3VuZGVmaW5lZCc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc3RyID0gJyc7XG5cblx0XHRpZiAodGhpcy5kaXNwbGF5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMuZGlzcGxheSkpIHtcblx0XHRcdGNhc2UgJ1tvYmplY3QgRnVuY3Rpb25dJzpcblx0XHRcdFx0c3RyID0gdGhpcy5kaXNwbGF5KGl0ZW0pO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnW29iamVjdCBBcnJheV0nOlxuXHRcdFx0XHRmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5kaXNwbGF5Lmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG5cdFx0XHRcdFx0aWYgKHN0ci5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRzdHIgPSBzdHIgKyBzZXBhcmF0b3I7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGlzcGxheVtpXS5pbmRleE9mKCcuJykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBTaW1wbGUsIGp1c3QgYWRkIHRvIHN0cmluZy5cblx0XHRcdFx0XHRcdHN0ciA9IHN0ciArIGl0ZW1bdGhpcy5kaXNwbGF5W2ldXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gQ29tcGxleCwgc29tZSBhY3Rpb24gbmVlZHMgdG8gYmUgcGVyZm9ybWVkXG5cdFx0XHRcdFx0XHRjb25zdCBwYXJ0cyA9IHRoaXMuZGlzcGxheVtpXS5zcGxpdCgnLicpO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBzID0gaXRlbVtwYXJ0c1swXV07XG5cdFx0XHRcdFx0XHRpZiAocykge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgYnJ1dGUgZm9yY2Vcblx0XHRcdFx0XHRcdFx0aWYgKHBhcnRzWzFdLmluZGV4T2YoJ3N1YnN0cmluZycpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG51bXMgPSAocGFydHNbMV0uc3Vic3RyaW5nKHBhcnRzWzFdLmluZGV4T2YoJygnKSArIDEsIHBhcnRzWzFdLmluZGV4T2YoJyknKSkpLnNwbGl0KCcsJyk7XG5cblx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKG51bXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdFx0XHRcdFx0c3RyID0gc3RyICsgcy5zdWJzdHJpbmcocGFyc2VJbnQobnVtc1swXSwgMTApKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRcdHN0ciA9IHN0ciArIHMuc3Vic3RyaW5nKHBhcnNlSW50KG51bXNbMF0sIDEwKSwgcGFyc2VJbnQobnVtc1sxXSwgMTApKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRzdHIgPSBzdHIgKyBzO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG1ldGhvZCBub3QgYXBwcm92ZWQsIHNvIGp1c3QgYWRkIHMuXG5cdFx0XHRcdFx0XHRcdFx0c3RyID0gc3RyICsgcztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHN0ciA9IGZhbGxiYWNrKGl0ZW0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3RyID0gZmFsbGJhY2soaXRlbSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0cjtcblx0fVxufVxuIl19
|