angular4x-auto-complete-multi
Version:
Remote autocomple for andular 4, 5, 6. Setup the url and field names of database which value will show in list, Multiple fiels can be set by comma separator. The data format of return value of remote url should be JSON. After start typing i
244 lines (233 loc) • 41.6 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common/http'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('angular4x-auto-complete-multi', ['exports', '@angular/core', '@angular/common/http', '@angular/common'], factory) :
(factory((global['angular4x-auto-complete-multi'] = {}),global.ng.core,global.ng.common.http,global.ng.common));
}(this, (function (exports,core,http,common) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function __values(o) {
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
if (m)
return m.call(o);
return {
next: function () {
if (o && i >= o.length)
o = void 0;
return { value: o && o[i++], done: !o };
}
};
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Angula4xAutoCompleteComponent = (function () {
function Angula4xAutoCompleteComponent(http$$1, renderer) {
this.http = http$$1;
this.renderer = renderer;
this.all_list_child = [];
this.selected_row = [];
this.selected_row_obj = {};
this._loading = "hidden";
}
/**
* @param {?} setting_obj
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.setting = /**
* @param {?} setting_obj
* @return {?}
*/
function (setting_obj) {
this.data_url = setting_obj.data_url;
this.db_fields = setting_obj.db_fields;
//console.log(this.data_url)
};
/**
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.clickout = /**
* @return {?}
*/
function () {
this._clearList();
};
/**
* @param {?} event
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.getData = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
var /** @type {?} */ input_val = event.target.value;
if (input_val.length == 0) {
this._clearList();
return;
}
var /** @type {?} */ final_url = this.data_url + '?q=' + input_val;
this._loading = "visible";
this.http.get(final_url).subscribe(function (todo) {
_this._clearList();
var _loop_1 = function (k) {
var /** @type {?} */ new_div = _this.renderer.createElement('div');
var /** @type {?} */ field_array = _this.db_fields.split(",");
var /** @type {?} */ display_text = "";
for (var /** @type {?} */ i = 0; i < field_array.length; i++) {
display_text += todo[k][field_array[i]] + " ";
}
display_text = display_text.trim();
_this.renderer.appendChild(new_div, _this.renderer.createText(display_text));
_this.all_list_child.push(new_div);
_this.renderer.listen(new_div, 'click', function (event) {
//this.text_fld.nativeElement.value=event.target.innerHTML
var /** @type {?} */ tindex = Array.from(event.target.parentNode.children).indexOf(event.target);
var /** @type {?} */ id = todo[tindex].id;
try {
for (var _a = __values(_this.selected_row), _b = _a.next(); !_b.done; _b = _a.next()) {
var row = _b.value;
if (row.id == id) {
_this.text_fld.nativeElement.value = "";
return;
}
}
}
catch (e_1_1) {
e_1 = { error: e_1_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_1)
throw e_1.error;
}
}
//this.selected_row.push(todo[tindex])
//this.selected_row.push(todo[tindex])
_this.selected_row_obj[display_text] = todo[tindex];
//console.log(this.selected_row_obj);
var /** @type {?} */ select_new_div = _this.renderer.createElement('div');
var /** @type {?} */ remove_new_div = _this.renderer.createElement('div');
_this.renderer.appendChild(remove_new_div, _this.renderer.createText("x"));
_this.renderer.addClass(remove_new_div, 'remove_div');
_this.renderer.setAttribute(remove_new_div, "id", display_text + "_" + "elem_autocomp");
_this.renderer.addClass(select_new_div, "selected_div");
_this.renderer.appendChild(select_new_div, remove_new_div);
_this.renderer.appendChild(select_new_div, _this.renderer.createText(event.target.innerHTML));
_this.renderer.listen(remove_new_div, 'click', function (event) {
var /** @type {?} */ id = event.target.id.split("_")[0];
delete _this.selected_row_obj[id];
_this.renderer.removeChild(_this.list_div.nativeElement, event.target.parentNode);
//console.log(this.selected_row_obj);
});
_this.text_fld.nativeElement.value = "";
_this.renderer.appendChild(_this.list_div.nativeElement, select_new_div);
var e_1, _c;
});
_this.renderer.appendChild(_this.list.nativeElement, new_div);
theight = _this.text_fld.nativeElement.parentElement.offsetHeight;
_this.renderer.setStyle(_this.list.nativeElement, "top", theight + "px");
_this.renderer.setStyle(_this.list.nativeElement, "display", "block");
_this.renderer.addClass(new_div, "ngxautocomp_list_el");
};
var theight;
for (var /** @type {?} */ k in todo) {
_loop_1(k);
}
_this._loading = "hidden";
});
};
/**
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype._clearList = /**
* @return {?}
*/
function () {
for (var /** @type {?} */ i = 0; i < this.all_list_child.length; i++)
this.renderer.removeChild(this.list.nativeElement, this.all_list_child[i]);
this.all_list_child = [];
this.renderer.setStyle(this.list.nativeElement, "display", "none");
};
/**
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.getSelectedRow = /**
* @return {?}
*/
function () {
var /** @type {?} */ i = 0;
this.selected_row = [];
for (var /** @type {?} */ row in this.selected_row_obj) {
this.selected_row[i++] = this.selected_row_obj[row];
}
return JSON.stringify(this.selected_row);
};
Angula4xAutoCompleteComponent.decorators = [
{ type: core.Component, args: [{
selector: 'angula4x-auto-complete',
template: "\n<div class=\"ngxautocomplete\">\n <div #_ng_autocomp_selected_list class=\"list_container\"></div>\n <input type=\"text\" value=\"\" name=\"ngx-autocomplete_field\" (keyup)=\"getData($event)\" #_ng_autocomp_txt>\n <div #_ng_autocom_list class=\"ngx-auto-list\"></div>\n <i class=\"fa fa-cog fa-spin\" [style.visibility]=\"_loading\" ></i>\n</div>",
styles: [":focus{outline:0}.ngxautocomplete{position:relative;width:100%;border:1px solid #ccc}.ngxautocomplete .list_container{width:100%;float:left}.ngxautocomplete input{border:0;width:90%}.ngx-auto-list{display:none;position:absolute;width:100%;min-height:300px;overflow-y:scroll;border-left:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;top:0;background:#fff;z-index:99}.ngxautocomp_list_el{text-align:left;cursor:pointer;padding:5px}.ngxautocomp_list_el:hover{background-color:#ccc}.ngxautocomplete .selected_div{background-color:#d0e1ec;border:1px solid #d0e1ec;border-radius:10px;padding:5px;margin:3px;width:auto;float:left}.ngxautocomplete .selected_div .remove_div{cursor:pointer;margin-left:4px;border:1px solid #7c7a7a;padding:0 2px 5px;color:#2c2b2b;text-align:center;font-size:13px;line-height:17px;border-radius:100px;width:14px;height:14px;background:#fff;float:right;font-family:Arial,Helvetica,sans-serif}.ngxautocomplete .selected_div .remove_div:hover{color:#ec0606;border:1px solid #ec0606}"]
},] },
];
/** @nocollapse */
Angula4xAutoCompleteComponent.ctorParameters = function () {
return [
{ type: http.HttpClient },
{ type: core.Renderer2 }
];
};
Angula4xAutoCompleteComponent.propDecorators = {
list: [{ type: core.ViewChild, args: ['_ng_autocom_list',] }],
text_fld: [{ type: core.ViewChild, args: ['_ng_autocomp_txt',] }],
list_div: [{ type: core.ViewChild, args: ['_ng_autocomp_selected_list',] }],
clickout: [{ type: core.HostListener, args: ['document:click',] }]
};
return Angula4xAutoCompleteComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Angular4xAutoCompleteModule = (function () {
function Angular4xAutoCompleteModule() {
}
Angular4xAutoCompleteModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule
],
declarations: [Angula4xAutoCompleteComponent],
exports: [Angula4xAutoCompleteComponent]
},] },
];
return Angular4xAutoCompleteModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.Angular4xAutoCompleteModule = Angular4xAutoCompleteModule;
exports.ɵa = Angula4xAutoCompleteComponent;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhcjR4LWF1dG8tY29tcGxldGUtbXVsdGkudW1kLmpzLm1hcCIsInNvdXJjZXMiOltudWxsLCJuZzovL2FuZ3VsYXI0eC1hdXRvLWNvbXBsZXRlLW11bHRpL3NyYy9hcHAvbW9kdWxlcy9hbmd1bGFyNHgtYXV0by1jb21wbGV0ZS9hbmd1bGE0eC1hdXRvLWNvbXBsZXRlL2FuZ3VsYTR4LWF1dG8tY29tcGxldGUuY29tcG9uZW50LnRzIiwibmc6Ly9hbmd1bGFyNHgtYXV0by1jb21wbGV0ZS1tdWx0aS9zcmMvYXBwL21vZHVsZXMvYW5ndWxhcjR4LWF1dG8tY29tcGxldGUvYW5ndWxhcjR4LWF1dG8tY29tcGxldGUubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FuZ3VsYTR4LWF1dG8tY29tcGxldGUnLFxuICB0ZW1wbGF0ZTogYFxuPGRpdiBjbGFzcz1cIm5neGF1dG9jb21wbGV0ZVwiPlxuICA8ZGl2ICNfbmdfYXV0b2NvbXBfc2VsZWN0ZWRfbGlzdCBjbGFzcz1cImxpc3RfY29udGFpbmVyXCI+PC9kaXY+XG4gIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgbmFtZT1cIm5neC1hdXRvY29tcGxldGVfZmllbGRcIiAoa2V5dXApPVwiZ2V0RGF0YSgkZXZlbnQpXCIgI19uZ19hdXRvY29tcF90eHQ+XG4gIDxkaXYgI19uZ19hdXRvY29tX2xpc3QgY2xhc3M9XCJuZ3gtYXV0by1saXN0XCI+PC9kaXY+XG4gIDxpIGNsYXNzPVwiZmEgZmEtY29nIGZhLXNwaW5cIiBbc3R5bGUudmlzaWJpbGl0eV09XCJfbG9hZGluZ1wiID48L2k+XG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgOmZvY3Vze291dGxpbmU6MH0ubmd4YXV0b2NvbXBsZXRle3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCAjY2NjfS5uZ3hhdXRvY29tcGxldGUgLmxpc3RfY29udGFpbmVye3dpZHRoOjEwMCU7ZmxvYXQ6bGVmdH0ubmd4YXV0b2NvbXBsZXRlIGlucHV0e2JvcmRlcjowO3dpZHRoOjkwJX0ubmd4LWF1dG8tbGlzdHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjMwMHB4O292ZXJmbG93LXk6c2Nyb2xsO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjY2NjO2JvcmRlci1yaWdodDoxcHggc29saWQgI2NjYztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjO3RvcDowO2JhY2tncm91bmQ6I2ZmZjt6LWluZGV4Ojk5fS5uZ3hhdXRvY29tcF9saXN0X2Vse3RleHQtYWxpZ246bGVmdDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjVweH0ubmd4YXV0b2NvbXBfbGlzdF9lbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjY2N9Lm5neGF1dG9jb21wbGV0ZSAuc2VsZWN0ZWRfZGl2e2JhY2tncm91bmQtY29sb3I6I2QwZTFlYztib3JkZXI6MXB4IHNvbGlkICNkMGUxZWM7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6NXB4O21hcmdpbjozcHg7d2lkdGg6YXV0bztmbG9hdDpsZWZ0fS5uZ3hhdXRvY29tcGxldGUgLnNlbGVjdGVkX2RpdiAucmVtb3ZlX2RpdntjdXJzb3I6cG9pbnRlcjttYXJnaW4tbGVmdDo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjN2M3YTdhO3BhZGRpbmc6MCAycHggNXB4O2NvbG9yOiMyYzJiMmI7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MTdweDtib3JkZXItcmFkaXVzOjEwMHB4O3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7YmFja2dyb3VuZDojZmZmO2Zsb2F0OnJpZ2h0O2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmfS5uZ3hhdXRvY29tcGxldGUgLnNlbGVjdGVkX2RpdiAucmVtb3ZlX2Rpdjpob3Zlcntjb2xvcjojZWMwNjA2O2JvcmRlcjoxcHggc29saWQgI2VjMDYwNn1gXVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGE0eEF1dG9Db21wbGV0ZUNvbXBvbmVudCB7XG4gIGRhdGFfdXJsOmFueTtcbiAgZGJfZmllbGRzOmFueTtcbiAgYWxsX2xpc3RfY2hpbGQ9W107XG4gIHNlbGVjdGVkX3Jvdz1bXVxuICBzZWxlY3RlZF9yb3dfb2JqPXt9XG4gIF9sb2FkaW5nOnN0cmluZz1cImhpZGRlblwiO1xuICBAVmlld0NoaWxkKCdfbmdfYXV0b2NvbV9saXN0JykgbGlzdDpFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdfbmdfYXV0b2NvbXBfdHh0JykgdGV4dF9mbGQ6RWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnX25nX2F1dG9jb21wX3NlbGVjdGVkX2xpc3QnKSBsaXN0X2RpdjpFbGVtZW50UmVmO1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cDpIdHRwQ2xpZW50LHByb3RlY3RlZCByZW5kZXJlcjpSZW5kZXJlcjIpIHsgfVxuICBzZXR0aW5nKHNldHRpbmdfb2JqKXtcbiAgICB0aGlzLmRhdGFfdXJsPXNldHRpbmdfb2JqLmRhdGFfdXJsO1xuICAgIHRoaXMuZGJfZmllbGRzPSBzZXR0aW5nX29iai5kYl9maWVsZHM7XG4gICAgLy9jb25zb2xlLmxvZyh0aGlzLmRhdGFfdXJsKVxuICB9XG4gIFxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgY2xpY2tvdXQoKSB7XG4gICAgXG4gICAgIHRoaXMuX2NsZWFyTGlzdCgpXG4gIH1cbiAgZ2V0RGF0YShldmVudCl7XG4gICAgICAgIGxldCBpbnB1dF92YWw9IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICBcbiAgICAgICAgaWYoaW5wdXRfdmFsLmxlbmd0aD09MCl7XG4gICAgICAgICAgdGhpcy5fY2xlYXJMaXN0KCk7XG4gICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBmaW5hbF91cmw9dGhpcy5kYXRhX3VybCsnP3E9JytpbnB1dF92YWxcbiAgICAgICAgdGhpcy5fbG9hZGluZz1cInZpc2libGVcIlxuICAgICAgICB0aGlzLmh0dHAuZ2V0KGZpbmFsX3VybCkuc3Vic2NyaWJlKHRvZG89PntcbiAgICAgICAgICAgICAgdGhpcy5fY2xlYXJMaXN0KClcbiAgICAgICAgICAgICAgZm9yKGxldCBrIGluIHRvZG8pe1xuICAgICAgICAgICAgICAgIGxldCBuZXdfZGl2PXRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkX2FycmF5PXRoaXMuZGJfZmllbGRzLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgICAgIGxldCBkaXNwbGF5X3RleHQ9XCJcIlxuICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8ZmllbGRfYXJyYXkubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICBkaXNwbGF5X3RleHQrPXRvZG9ba11bZmllbGRfYXJyYXlbaV1dK1wiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNwbGF5X3RleHQ9ZGlzcGxheV90ZXh0LnRyaW0oKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG5ld19kaXYsdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGRpc3BsYXlfdGV4dCkpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMuYWxsX2xpc3RfY2hpbGQucHVzaChuZXdfZGl2KVxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKG5ld19kaXYsJ2NsaWNrJywoZXZlbnQpPT57XG4gICAgICAgICAgICAgICAgICAvL3RoaXMudGV4dF9mbGQubmF0aXZlRWxlbWVudC52YWx1ZT1ldmVudC50YXJnZXQuaW5uZXJIVE1MXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgbGV0IHRpbmRleD1BcnJheS5mcm9tKGV2ZW50LnRhcmdldC5wYXJlbnROb2RlLmNoaWxkcmVuKS5pbmRleE9mKGV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICAgIGxldCBpZD10b2RvW3RpbmRleF0uaWRcbiAgICAgICAgICAgICAgICAgIGZvcihsZXQgcm93IG9mIHRoaXMuc2VsZWN0ZWRfcm93KXtcbiAgICAgICAgICAgICAgICAgICAgaWYocm93LmlkPT1pZCl7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0X2ZsZC5uYXRpdmVFbGVtZW50LnZhbHVlPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5zZWxlY3RlZF9yb3cucHVzaCh0b2RvW3RpbmRleF0pXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkX3Jvd19vYmpbZGlzcGxheV90ZXh0XT10b2RvW3RpbmRleF07XG4gICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRfcm93X29iaik7XG4gICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0X25ld19kaXY9dGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVfbmV3X2Rpdj10aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHJlbW92ZV9uZXdfZGl2LHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChcInhcIikpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHJlbW92ZV9uZXdfZGl2LCdyZW1vdmVfZGl2JylcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHJlbW92ZV9uZXdfZGl2LFwiaWRcIixkaXNwbGF5X3RleHQrXCJfXCIrXCJlbGVtX2F1dG9jb21wXCIpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHNlbGVjdF9uZXdfZGl2LFwic2VsZWN0ZWRfZGl2XCIpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHNlbGVjdF9uZXdfZGl2LHJlbW92ZV9uZXdfZGl2KVxuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzZWxlY3RfbmV3X2Rpdix0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoZXZlbnQudGFyZ2V0LmlubmVySFRNTCkpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihyZW1vdmVfbmV3X2RpdiwnY2xpY2snLChldmVudCk9PntcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQ9ZXZlbnQudGFyZ2V0LmlkLnNwbGl0KFwiX1wiKVswXVxuICAgICAgICAgICAgICAgICAgICAgIGxldCBpPTA7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0ZWRfcm93X29ialtpZF1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubGlzdF9kaXYubmF0aXZlRWxlbWVudCxldmVudC50YXJnZXQucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRfcm93X29iaik7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0X2ZsZC5uYXRpdmVFbGVtZW50LnZhbHVlPVwiXCJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5saXN0X2Rpdi5uYXRpdmVFbGVtZW50LHNlbGVjdF9uZXdfZGl2KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmxpc3QubmF0aXZlRWxlbWVudCxuZXdfZGl2KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciB0aGVpZ2h0PXRoaXMudGV4dF9mbGQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5saXN0Lm5hdGl2ZUVsZW1lbnQsXCJ0b3BcIix0aGVpZ2h0K1wicHhcIilcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LFwiZGlzcGxheVwiLFwiYmxvY2tcIilcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobmV3X2RpdixcIm5neGF1dG9jb21wX2xpc3RfZWxcIilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nPVwiaGlkZGVuXCJcbiAgICAgICAgfSlcblxuICB9IFxuXG4gIHByaXZhdGUgX2NsZWFyTGlzdCgpe1xuICAgIGZvcihsZXQgaT0wO2k8dGhpcy5hbGxfbGlzdF9jaGlsZC5sZW5ndGg7aSsrKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LHRoaXMuYWxsX2xpc3RfY2hpbGRbaV0pXG4gICAgdGhpcy5hbGxfbGlzdF9jaGlsZD1bXTsgICAgIFxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5saXN0Lm5hdGl2ZUVsZW1lbnQsXCJkaXNwbGF5XCIsXCJub25lXCIpXG4gIH1cblxuICBnZXRTZWxlY3RlZFJvdygpOnN0cmluZ3tcbiAgICBsZXQgaT0wO1xuICAgIHRoaXMuc2VsZWN0ZWRfcm93PVtdO1xuICAgIGZvcihsZXQgcm93IGluIHRoaXMuc2VsZWN0ZWRfcm93X29iail7XG4gICAgICB0aGlzLnNlbGVjdGVkX3Jvd1tpKytdPXRoaXMuc2VsZWN0ZWRfcm93X29ialtyb3ddO1xuICAgIH1cbiAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRfcm93KTtcbiAgfVxuXG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFuZ3VsYTR4QXV0b0NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi9hbmd1bGE0eC1hdXRvLWNvbXBsZXRlL2FuZ3VsYTR4LWF1dG8tY29tcGxldGUuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtBbmd1bGE0eEF1dG9Db21wbGV0ZUNvbXBvbmVudF0sXG4gIGV4cG9ydHM6W0FuZ3VsYTR4QXV0b0NvbXBsZXRlQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyNHhBdXRvQ29tcGxldGVNb2R1bGUgeyB9XG4iXSwibmFtZXMiOlsiaHR0cCIsInRzbGliXzEuX192YWx1ZXMiLCJDb21wb25lbnQiLCJIdHRwQ2xpZW50IiwiUmVuZGVyZXIyIiwiVmlld0NoaWxkIiwiSG9zdExpc3RlbmVyIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBLHNCQTRGeUIsQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixPQUFPO1lBQ0gsSUFBSSxFQUFFO2dCQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTTtvQkFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzNDO1NBQ0osQ0FBQztJQUNOLENBQUM7Ozs7Ozs7UUMxRkMsdUNBQXNC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