auto-complete2.js 33.5 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { NgModule, Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { SharedModule } from 'primeng/primeng';
import { Request } from '../_services/request.service';
import * as _ from 'lodash';
import { DxSelectBoxModule } from 'devextreme-angular';
import DataSource from 'devextreme/data/data_source';
import CustomStore from 'devextreme/data/custom_store';
import ArrayStore from 'devextreme/data/array_store';
var SocAutoComplete2Component = /** @class */ (function () {
    function SocAutoComplete2Component(request) {
        var _this = this;
        this.request = request;
        this.filteredOptions = [];
        /**
         * local, remote
         */
        this.mode = 'local';
        /**
         * API ที่ต้องการเรียกใช้เมื่อพิมพ์ auto complete
         */
        this.api = '';
        /**
         * field ที่ต้องการ query เมื่อยิง API
         */
        this.field = '';
        this.fieldApi = '';
        this.id = '';
        this.placeholder = '';
        this.disabled = false;
        this.orderBy = '';
        this.filter = '';
        this.ex_type_view = '';
        this.limit = 1000;
        this.onLoad = new EventEmitter();
        this.valueChange = new EventEmitter();
        this.valueSelete = new EventEmitter();
        this.storeOnLoaded = new EventEmitter();
        this.acceptCustomValue = true;
        this.resData = [];
        this.loadOptionData = [];
        this.openOnFieldClick = false;
        this.showDropDownButton = false;
        // acceptCustomValue = true;
        this.searchEnabled = true;
        this.inputValue = '';
        this.fnCustomStoreOnLoaded = function (result) {
            _this.storeOnLoaded.emit(result);
            return result;
        };
        /**
         * START Bind Value
         */
        this.onModelChange = function () { };
        this.onModelTouched = function () { };
    }
    /**
     * @return {?}
     */
    SocAutoComplete2Component.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            return tslib_1.__generator(this, function (_a) {
                if (this.mode === 'dropdown') {
                    this.acceptCustomValue = false;
                    this.searchEnabled = false;
                }
                /** ถ้าเป็น โหมด local จะแสดง list ให้เลือกเลย แตถ้่เป็น remote จะต้องขึ้นเมื่อพิมพ์เท่านั้น */
                if (this.mode === 'local' || this.mode === 'dropdown') {
                    this.openOnFieldClick = true;
                    this.showDropDownButton = true;
                    this.fnStartDataSourceLocal();
                }
                else {
                    this.fnStartDataSourceRemote();
                }
                return [2 /*return*/];
            });
        });
    };
    /**
     * @return {?}
     */
    SocAutoComplete2Component.prototype.ngAfterViewInit = /**
     * @return {?}
     */
    function () {
    };
    /**
     * @return {?}
     */
    SocAutoComplete2Component.prototype.fnStartDataSourceLocal = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var params, resData;
            return tslib_1.__generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        params = "?_fields=" + (this.fieldApi ? this.fieldApi : this.field);
                        if (this.filter) {
                            params += this.filter; //`&_where=(${this.filter})`
                        }
                        if (this.orderBy && this.orderBy !== '') {
                            params += "&_sort=" + this.orderBy;
                        }
                        params += "&_limit=" + this.limit;
                        return [4 /*yield*/, this.fnPreResponse(params)];
                    case 1:
                        resData = _a.sent();
                        this.ds = new DataSource({
                            store: new ArrayStore({
                                data: resData,
                                onLoaded: this.fnCustomStoreOnLoaded
                            })
                        });
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * @return {?}
     */
    SocAutoComplete2Component.prototype.fnStartDataSourceRemote = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var _this = this;
            return tslib_1.__generator(this, function (_a) {
                this.ds = new DataSource({
                    store: new CustomStore({
                        byKey: function (key) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
                            return tslib_1.__generator(this, function (_a) {
                                this.onLoad.emit(key);
                                return [2 /*return*/, this.fnGetCustomStore(key)];
                            });
                        }); },
                        load: function (loadOptions) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
                            return tslib_1.__generator(this, function (_a) {
                                this.onLoad.emit(loadOptions.searchValue);
                                return [2 /*return*/, this.fnGetCustomStore(loadOptions.searchValue)];
                            });
                        }); },
                        onLoaded: this.fnCustomStoreOnLoaded
                    })
                });
                return [2 /*return*/];
            });
        });
    };
    /**
     * @param {?} key
     * @return {?}
     */
    SocAutoComplete2Component.prototype.fnGetCustomStore = /**
     * @param {?} key
     * @return {?}
     */
    function (key) {
        /** @type {?} */
        var params = "?_fields=" + (this.fieldApi ? this.fieldApi : this.field) + "&_where=(" + this.field + ",like,$" + key + "$)";
        if (this.filter) {
            params = "?_fields=" + (this.fieldApi ? this.fieldApi : this.field) + "&_where=((" + this.field + ",like,$" + key + "$)$and(" + this.filter + "))";
        }
        if (this.orderBy && this.orderBy !== '') {
            params += "&_sort=" + this.orderBy;
        }
        params += "&_limit=" + this.limit;
        return this.fnPreResponse(params);
        ;
    };
    /**
     * @param {?} e
     * @return {?}
     */
    SocAutoComplete2Component.prototype.onValueChanged = /**
     * @param {?} e
     * @return {?}
     */
    function (e) {
        this.onValueSelete(e);
        console.log("​SocAutoCompleteComponent -> onValueChanged -> e", e);
        this.valueChange.emit(e.value);
    };
    /**
     * @param {?} e
     * @return {?}
     */
    SocAutoComplete2Component.prototype.onValueSelete = /**
     * @param {?} e
     * @return {?}
     */
    function (e) {
        var _this = this;
        /** @type {?} */
        var temp = _.find(this.loadOptionData, function (r) {
            if (_this.ex_type_view === "ct_dropdown") {
                return r.code + " - " + r.name === e.value;
            }
            else if (_this.ex_type_view === "ct_ext_departmen") {
                return r.short_name + " - " + r.name === e.value;
            }
            return r[_this.field] === e.value;
        });
        console.log("​SocAutoCompleteComponent -> onValueSelete -> e", e, temp);
        this.valueSelete.emit(temp);
    };
    /**
     * @param {?} params
     * @return {?}
     */
    SocAutoComplete2Component.prototype.fnPreResponse = /**
     * @param {?} params
     * @return {?}
     */
    function (params) {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var resData, _resData, i, temp;
            var _this = this;
            return tslib_1.__generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.request.get(this.api + params)];
                    case 1:
                        resData = _a.sent();
                        resData = _.map(resData, function (obj) {
                            return obj; //[this.field]
                        });
                        _resData = [];
                        for (i in resData) {
                            temp = _.find(_resData, function (r) { return r[_this.field] === resData[i][_this.field]; });
                            if (!temp) {
                                _resData.push(resData[i]);
                            }
                        }
                        this.loadOptionData = _resData;
                        return [2 /*return*/, _.map(_resData, function (obj) {
                                if (_this.ex_type_view === "ct_dropdown") {
                                    return obj.code + " - " + obj.name;
                                }
                                else if (_this.ex_type_view === "ct_ext_departmen") {
                                    return obj.short_name + " - " + obj.name;
                                }
                                return obj[_this.field];
                            })];
                }
            });
        });
    };
    /**
     * @param {?} e
     * @return {?}
     */
    SocAutoComplete2Component.prototype.onOpened = /**
     * @param {?} e
     * @return {?}
     */
    function (e) {
        /** @type {?} */
        var element = document.querySelector('.dx-overlay-wrapper.dx-dropdowneditor-overlay.dx-popup-wrapper.dx-dropdownlist-popup-wrapper.dx-selectbox-popup-wrapper');
        element.setAttribute('style', 'z-index:9999;');
    };
    /**
     * @param {?} value
     * @return {?}
     */
    SocAutoComplete2Component.prototype.writeValue = /**
     * @param {?} value
     * @return {?}
     */
    function (value) { };
    /**
     * @param {?} fn
     * @return {?}
     */
    SocAutoComplete2Component.prototype.registerOnChange = /**
     * @param {?} fn
     * @return {?}
     */
    function (fn) { };
    /**
     * @param {?} fn
     * @return {?}
     */
    SocAutoComplete2Component.prototype.registerOnTouched = /**
     * @param {?} fn
     * @return {?}
     */
    function (fn) { };
    SocAutoComplete2Component.decorators = [
        { type: Component, args: [{
                    selector: 'soc-auto-complete-2',
                    providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: forwardRef(function () { return SocAutoComplete2Component; }),
                            multi: true
                        }],
                    template: "\n      <dx-select-box [dataSource]=\"ds\"\n                [searchEnabled]=\"searchEnabled\"\n                [openOnFieldClick]=\"openOnFieldClick\"\n                [showClearButton]=\"true\"\n                [showDropDownButton]=\"showDropDownButton\"\n                [inputAttr]=\"{ id: id }\"\n                [acceptCustomValue]=\"acceptCustomValue\"\n                [placeholder]=\"placeholder\"\n                [(value)]=\"value\"\n                (onValueChanged)=\"onValueChanged($event)\"\n                (onOpened)=\"onOpened($event)\"\n                [disabled]=\"disabled\"\n                noDataText=\"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\"\n                placeholder=\"\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\"\n            ></dx-select-box>\n"
                }] }
    ];
    /** @nocollapse */
    SocAutoComplete2Component.ctorParameters = function () { return [
        { type: Request }
    ]; };
    SocAutoComplete2Component.propDecorators = {
        mode: [{ type: Input }],
        api: [{ type: Input }],
        field: [{ type: Input }],
        fieldApi: [{ type: Input }],
        id: [{ type: Input }],
        placeholder: [{ type: Input }],
        value: [{ type: Input }],
        disabled: [{ type: Input }],
        orderBy: [{ type: Input }],
        filter: [{ type: Input }],
        ex_type_view: [{ type: Input }],
        limit: [{ type: Input }],
        onLoad: [{ type: Output }],
        valueChange: [{ type: Output }],
        valueSelete: [{ type: Output }],
        storeOnLoaded: [{ type: Output }],
        acceptCustomValue: [{ type: Input }]
    };
    return SocAutoComplete2Component;
}());
export { SocAutoComplete2Component };
if (false) {
    /** @type {?} */
    SocAutoComplete2Component.prototype.filteredOptions;
    /**
     * local, remote
     * @type {?}
     */
    SocAutoComplete2Component.prototype.mode;
    /**
     * API ที่ต้องการเรียกใช้เมื่อพิมพ์ auto complete
     * @type {?}
     */
    SocAutoComplete2Component.prototype.api;
    /**
     * field ที่ต้องการ query เมื่อยิง API
     * @type {?}
     */
    SocAutoComplete2Component.prototype.field;
    /** @type {?} */
    SocAutoComplete2Component.prototype.fieldApi;
    /** @type {?} */
    SocAutoComplete2Component.prototype.id;
    /** @type {?} */
    SocAutoComplete2Component.prototype.placeholder;
    /** @type {?} */
    SocAutoComplete2Component.prototype.value;
    /** @type {?} */
    SocAutoComplete2Component.prototype.disabled;
    /** @type {?} */
    SocAutoComplete2Component.prototype.orderBy;
    /** @type {?} */
    SocAutoComplete2Component.prototype.filter;
    /** @type {?} */
    SocAutoComplete2Component.prototype.ex_type_view;
    /** @type {?} */
    SocAutoComplete2Component.prototype.limit;
    /** @type {?} */
    SocAutoComplete2Component.prototype.onLoad;
    /** @type {?} */
    SocAutoComplete2Component.prototype.valueChange;
    /** @type {?} */
    SocAutoComplete2Component.prototype.valueSelete;
    /** @type {?} */
    SocAutoComplete2Component.prototype.storeOnLoaded;
    /** @type {?} */
    SocAutoComplete2Component.prototype.acceptCustomValue;
    /** @type {?} */
    SocAutoComplete2Component.prototype.resData;
    /** @type {?} */
    SocAutoComplete2Component.prototype.loadOptionData;
    /** @type {?} */
    SocAutoComplete2Component.prototype.openOnFieldClick;
    /** @type {?} */
    SocAutoComplete2Component.prototype.showDropDownButton;
    /** @type {?} */
    SocAutoComplete2Component.prototype.searchEnabled;
    /** @type {?} */
    SocAutoComplete2Component.prototype.inputValue;
    /**
     * ds
     * @type {?}
     */
    SocAutoComplete2Component.prototype.ds;
    /** @type {?} */
    SocAutoComplete2Component.prototype.fnCustomStoreOnLoaded;
    /**
     * START Bind Value
     * @type {?}
     */
    SocAutoComplete2Component.prototype.onModelChange;
    /** @type {?} */
    SocAutoComplete2Component.prototype.onModelTouched;
    /** @type {?} */
    SocAutoComplete2Component.prototype.request;
}
var SharedAutoComplete2Module = /** @class */ (function () {
    function SharedAutoComplete2Module() {
    }
    SharedAutoComplete2Module.decorators = [
        { type: NgModule, args: [{
                    imports: [CommonModule, FormsModule, SharedModule, DxSelectBoxModule],
                    exports: [SocAutoComplete2Component, SharedModule],
                    declarations: [SocAutoComplete2Component],
                },] }
    ];
    return SharedAutoComplete2Module;
}());
export { SharedAutoComplete2Module };

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZTIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3RlbXBsYXRlL2F1dG8tY29tcGxldGUyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFFBQVEsRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUN2RSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sVUFBVSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JELE9BQU8sV0FBVyxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sVUFBVSxNQUFNLDZCQUE2QixDQUFDOztJQTZEakQsbUNBQW9CLE9BQWdCO1FBQXBDLGlCQUF5QztRQUFyQixZQUFPLEdBQVAsT0FBTyxDQUFTOytCQWpDbEIsRUFBRTs7OztvQkFFNkIsT0FBTzs7OzttQkFFekMsRUFBRTs7OztxQkFFQSxFQUFFO3dCQUNDLEVBQUU7a0JBRVIsRUFBRTsyQkFDTyxFQUFFO3dCQUVMLEtBQUs7dUJBQ04sRUFBRTtzQkFDSCxFQUFFOzRCQUNJLEVBQUU7cUJBRVQsSUFBSTtzQkFDaUIsSUFBSSxZQUFZLEVBQU87MkJBQ2YsSUFBSSxZQUFZLEVBQVU7MkJBQzFCLElBQUksWUFBWSxFQUFVOzZCQUN4QixJQUFJLFlBQVksRUFBVTtp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QUFLO3dCQUNMLEtBQUs7MkJBQ0wsS0FBSzswQkFDTCxLQUFLO3lCQUNMLEtBQUs7K0JBQ0wsS0FBSzt3QkFFTCxLQUFLO3lCQUNMLE1BQU07OEJBQ04sTUFBTTs4QkFDTixNQUFNO2dDQUNOLE1BQU07b0NBRU4sS0FBSzs7b0NBOURWOztTQXNDYSx5QkFBeUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dCQWlLckMsUUFBUSxTQUFDO29CQUNOLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixDQUFDO29CQUNyRSxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxZQUFZLENBQUM7b0JBQ2xELFlBQVksRUFBRSxDQUFDLHlCQUF5QixDQUFDO2lCQUM1Qzs7b0NBM01EOztTQTRNYSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIE5nTW9kdWxlLCBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBBZnRlclZpZXdJbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL3ByaW1lbmcnO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4uL19zZXJ2aWNlcy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRHhTZWxlY3RCb3hNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnZGV2ZXh0cmVtZS9kYXRhL2RhdGFfc291cmNlJztcbmltcG9ydCBDdXN0b21TdG9yZSBmcm9tICdkZXZleHRyZW1lL2RhdGEvY3VzdG9tX3N0b3JlJztcbmltcG9ydCBBcnJheVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9hcnJheV9zdG9yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc29jLWF1dG8tY29tcGxldGUtMicsXG4gICAgcHJvdmlkZXJzOiBbe1xuICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU29jQXV0b0NvbXBsZXRlMkNvbXBvbmVudCksXG4gICAgICAgIG11bHRpOiB0cnVlXG4gICAgfV0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgIDxkeC1zZWxlY3QtYm94IFtkYXRhU291cmNlXT1cImRzXCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJzZWFyY2hFbmFibGVkXCJcbiAgICAgICAgICAgICAgICBbb3Blbk9uRmllbGRDbGlja109XCJvcGVuT25GaWVsZENsaWNrXCJcbiAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwic2hvd0Ryb3BEb3duQnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRBdHRyXT1cInsgaWQ6IGlkIH1cIlxuICAgICAgICAgICAgICAgIFthY2NlcHRDdXN0b21WYWx1ZV09XCJhY2NlcHRDdXN0b21WYWx1ZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbk9wZW5lZCk9XCJvbk9wZW5lZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG5vRGF0YVRleHQ9XCLguYTguKHguYjguJ7guJrguILguYnguK3guKHguLnguKVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi4LiB4Lij4Li44LiT4Liy4LmA4Lil4Li34Lit4LiB4Lij4Liy4Lii4LiB4Liy4LijXCJcbiAgICAgICAgICAgID48L2R4LXNlbGVjdC1ib3g+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFNvY0F1dG9Db21wbGV0ZTJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICBmaWx0ZXJlZE9wdGlvbnMgPSBbXTtcbiAgICAvKiogbG9jYWwsIHJlbW90ZSAqL1xuICAgIEBJbnB1dCgpIG1vZGU6ICdsb2NhbCcgfCAncmVtb3RlJyB8ICdkcm9wZG93bicgPSAnbG9jYWwnO1xuICAgIC8qKiBBUEkg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmA4Lij4Li14Lii4LiB4LmD4LiK4LmJ4LmA4Lih4Li34LmI4Lit4Lie4Li04Lih4Lie4LmMIGF1dG8gY29tcGxldGUgKi9cbiAgICBASW5wdXQoKSBhcGkgPSAnJztcbiAgICAvKiogZmllbGQg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4LijIHF1ZXJ5IOC5gOC4oeC4t+C5iOC4reC4ouC4tOC4hyBBUEkgKi9cbiAgICBASW5wdXQoKSBmaWVsZCA9ICcnO1xuICAgIEBJbnB1dCgpIGZpZWxkQXBpID0gJyc7XG5cbiAgICBASW5wdXQoKSBpZCA9ICcnO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gICAgQElucHV0KCkgdmFsdWU6IFN0cmluZztcbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG9yZGVyQnkgPSAnJztcbiAgICBASW5wdXQoKSBmaWx0ZXIgPSAnJztcbiAgICBASW5wdXQoKSBleF90eXBlX3ZpZXcgPSAnJztcblxuICAgIEBJbnB1dCgpIGxpbWl0ID0gMTAwMDtcbiAgICBAT3V0cHV0KCkgb25Mb2FkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgICBAT3V0cHV0KCkgdmFsdWVTZWxldGU6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgQE91dHB1dCgpIHN0b3JlT25Mb2FkZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBASW5wdXQoKSBhY2NlcHRDdXN0b21WYWx1ZSA9IHRydWU7XG4gICAgcmVzRGF0YSA9IFtdO1xuICAgIGxvYWRPcHRpb25EYXRhID0gW107XG4gICAgb3Blbk9uRmllbGRDbGljayA9IGZhbHNlO1xuICAgIHNob3dEcm9wRG93bkJ1dHRvbiA9IGZhbHNlO1xuICAgIC8vIGFjY2VwdEN1c3RvbVZhbHVlID0gdHJ1ZTtcbiAgICBzZWFyY2hFbmFibGVkID0gdHJ1ZTtcbiAgICBpbnB1dFZhbHVlID0gJyc7XG4gICAgLyoqIGRzICovXG4gICAgZHM6IERhdGFTb3VyY2U7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZXF1ZXN0OiBSZXF1ZXN0KSB7IH1cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2Ryb3Bkb3duJykge1xuICAgICAgICAgICAgdGhpcy5hY2NlcHRDdXN0b21WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIOC4luC5ieC4suC5gOC4m+C5h+C4mSDguYLguKvguKHguJQgbG9jYWwg4LiI4Liw4LmB4Liq4LiU4LiHIGxpc3Qg4LmD4Lir4LmJ4LmA4Lil4Li34Lit4LiB4LmA4Lil4LiiIOC5geC4leC4luC5ieC5iOC5gOC4m+C5h+C4mSByZW1vdGUg4LiI4Liw4LiV4LmJ4Lit4LiH4LiC4Li24LmJ4LiZ4LmA4Lih4Li34LmI4Lit4Lie4Li04Lih4Lie4LmM4LmA4LiX4LmI4Liy4LiZ4Lix4LmJ4LiZICovXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdsb2NhbCcgfHwgdGhpcy5tb2RlID09PSAnZHJvcGRvd24nKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5PbkZpZWxkQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zaG93RHJvcERvd25CdXR0b24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5mblN0YXJ0RGF0YVNvdXJjZUxvY2FsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZuU3RhcnREYXRhU291cmNlUmVtb3RlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIH1cblxuICAgIGFzeW5jIGZuU3RhcnREYXRhU291cmNlTG9jYWwoKSB7XG4gICAgICAgIGxldCBwYXJhbXMgPSBgP19maWVsZHM9JHt0aGlzLmZpZWxkQXBpP3RoaXMuZmllbGRBcGk6dGhpcy5maWVsZH1gXG4gICAgICAgIGlmKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBwYXJhbXMgKz0gdGhpcy5maWx0ZXIvL2AmX3doZXJlPSgke3RoaXMuZmlsdGVyfSlgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3JkZXJCeSAmJiB0aGlzLm9yZGVyQnkgIT09ICcnKSB7XG4gICAgICAgICAgICBwYXJhbXMgKz0gYCZfc29ydD0ke3RoaXMub3JkZXJCeX1gO1xuICAgICAgICB9XG4gICAgICAgIHBhcmFtcyArPSBgJl9saW1pdD0ke3RoaXMubGltaXR9YDtcbiAgICAgICAgbGV0IHJlc0RhdGEgPSBhd2FpdCB0aGlzLmZuUHJlUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgdGhpcy5kcyA9IG5ldyBEYXRhU291cmNlKHtcbiAgICAgICAgICAgIHN0b3JlOiBuZXcgQXJyYXlTdG9yZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogcmVzRGF0YSxcbiAgICAgICAgICAgICAgICBvbkxvYWRlZDogdGhpcy5mbkN1c3RvbVN0b3JlT25Mb2FkZWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBmblN0YXJ0RGF0YVNvdXJjZVJlbW90ZSgpIHtcbiAgICAgICAgdGhpcy5kcyA9IG5ldyBEYXRhU291cmNlKHtcbiAgICAgICAgICAgIHN0b3JlOiBuZXcgQ3VzdG9tU3RvcmUoe1xuICAgICAgICAgICAgICAgIGJ5S2V5OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkLmVtaXQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm5HZXRDdXN0b21TdG9yZShrZXkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbG9hZDogYXN5bmMgKGxvYWRPcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkxvYWQuZW1pdChsb2FkT3B0aW9ucy5zZWFyY2hWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZuR2V0Q3VzdG9tU3RvcmUobG9hZE9wdGlvbnMuc2VhcmNoVmFsdWUpOztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uTG9hZGVkOiB0aGlzLmZuQ3VzdG9tU3RvcmVPbkxvYWRlZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZuR2V0Q3VzdG9tU3RvcmUoa2V5OiBhbnkpIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IGA/X2ZpZWxkcz0ke3RoaXMuZmllbGRBcGk/dGhpcy5maWVsZEFwaTp0aGlzLmZpZWxkfSZfd2hlcmU9KCR7dGhpcy5maWVsZH0sbGlrZSwkJHtrZXl9JClgO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IGA/X2ZpZWxkcz0ke3RoaXMuZmllbGRBcGk/dGhpcy5maWVsZEFwaTp0aGlzLmZpZWxkfSZfd2hlcmU9KCgke3RoaXMuZmllbGR9LGxpa2UsJCR7a2V5fSQpJGFuZCgke3RoaXMuZmlsdGVyfSkpYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcmRlckJ5ICYmIHRoaXMub3JkZXJCeSAhPT0gJycpIHtcbiAgICAgICAgICAgIHBhcmFtcyArPSBgJl9zb3J0PSR7dGhpcy5vcmRlckJ5fWA7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zICs9IGAmX2xpbWl0PSR7dGhpcy5saW1pdH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5mblByZVJlc3BvbnNlKHBhcmFtcyk7O1xuICAgIH1cbiAgICBmbkN1c3RvbVN0b3JlT25Mb2FkZWQgPSAocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmVPbkxvYWRlZC5lbWl0KHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIG9uVmFsdWVDaGFuZ2VkKGU6IGFueSkge1xuICAgICAgICB0aGlzLm9uVmFsdWVTZWxldGUoZSlcbiAgICAgICAgY29uc29sZS5sb2coXCLigItTb2NBdXRvQ29tcGxldGVDb21wb25lbnQgLT4gb25WYWx1ZUNoYW5nZWQgLT4gZVwiLCBlKVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZS52YWx1ZSk7XG5cbiAgICB9XG4gICAgb25WYWx1ZVNlbGV0ZShlOiBhbnkpIHtcbiAgICAgICAgbGV0IHRlbXAgPSBfLmZpbmQodGhpcy5sb2FkT3B0aW9uRGF0YSAscj0+e1xuICAgICAgICAgIGlmKHRoaXMuZXhfdHlwZV92aWV3PT09XCJjdF9kcm9wZG93blwiKXtcbiAgICAgICAgICAgIHJldHVybiBgJHtyLmNvZGV9IC0gJHtyLm5hbWV9YCA9PT0gIGUudmFsdWVcbiAgICAgICAgICB9ZWxzZSBpZih0aGlzLmV4X3R5cGVfdmlldz09PVwiY3RfZXh0X2RlcGFydG1lblwiKXtcbiAgICAgICAgICAgIHJldHVybiBgJHtyLnNob3J0X25hbWV9IC0gJHtyLm5hbWV9YCA9PT0gIGUudmFsdWVcbiAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgcmV0dXJuIHJbdGhpcy5maWVsZF0gID09PSBlLnZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKAi1NvY0F1dG9Db21wbGV0ZUNvbXBvbmVudCAtPiBvblZhbHVlU2VsZXRlIC0+IGVcIiwgZSx0ZW1wKVxuICAgICAgICB0aGlzLnZhbHVlU2VsZXRlLmVtaXQodGVtcCk7XG5cbiAgICB9XG5cbiAgICBhc3luYyBmblByZVJlc3BvbnNlKHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzRGF0YSA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQodGhpcy5hcGkgKyBwYXJhbXMpO1xuICAgICAgICByZXNEYXRhID0gXy5tYXAocmVzRGF0YSwgKG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIC8vW3RoaXMuZmllbGRdXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgX3Jlc0RhdGEgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpIGluIHJlc0RhdGEpe1xuICAgICAgICAgIGxldCB0ZW1wID0gXy5maW5kKF9yZXNEYXRhICwgcj0+clt0aGlzLmZpZWxkXSA9PT0gcmVzRGF0YVtpXVt0aGlzLmZpZWxkXSk7XG4gICAgICAgICAgaWYoIXRlbXApe1xuICAgICAgICAgICAgX3Jlc0RhdGEucHVzaChyZXNEYXRhW2ldKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRPcHRpb25EYXRhID0gX3Jlc0RhdGE7XG4gICAgICAgIHJldHVybiBfLm1hcChfcmVzRGF0YSwgKG9iajogYW55KSA9PiB7XG4gICAgICAgICAgaWYodGhpcy5leF90eXBlX3ZpZXc9PT1cImN0X2Ryb3Bkb3duXCIpe1xuICAgICAgICAgICAgcmV0dXJuIGAke29iai5jb2RlfSAtICR7b2JqLm5hbWV9YFxuICAgICAgICAgIH1lbHNlIGlmKHRoaXMuZXhfdHlwZV92aWV3PT09XCJjdF9leHRfZGVwYXJ0bWVuXCIpe1xuICAgICAgICAgICAgcmV0dXJuIGAke29iai5zaG9ydF9uYW1lfSAtICR7b2JqLm5hbWV9YFxuICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgIHJldHVybiBvYmpbdGhpcy5maWVsZF1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uT3BlbmVkKGUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5keC1vdmVybGF5LXdyYXBwZXIuZHgtZHJvcGRvd25lZGl0b3Itb3ZlcmxheS5keC1wb3B1cC13cmFwcGVyLmR4LWRyb3Bkb3dubGlzdC1wb3B1cC13cmFwcGVyLmR4LXNlbGVjdGJveC1wb3B1cC13cmFwcGVyJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICd6LWluZGV4Ojk5OTk7Jyk7XG4gICAgfVxuICAgIC8qKiBTVEFSVCBCaW5kIFZhbHVlICovXG4gICAgb25Nb2RlbENoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7IH07XG4gICAgb25Nb2RlbFRvdWNoZWQ6IEZ1bmN0aW9uID0gKCkgPT4geyB9O1xuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQgeyB9XG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogRnVuY3Rpb24pOiB2b2lkIHsgfVxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBGdW5jdGlvbik6IHZvaWQgeyB9XG4gICAgLyoqIEVORCBCaW5kIFZhbHVlICovXG5cbn1cblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgU2hhcmVkTW9kdWxlLCBEeFNlbGVjdEJveE1vZHVsZV0sXG4gICAgZXhwb3J0czogW1NvY0F1dG9Db21wbGV0ZTJDb21wb25lbnQsIFNoYXJlZE1vZHVsZV0sXG4gICAgZGVjbGFyYXRpb25zOiBbU29jQXV0b0NvbXBsZXRlMkNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIFNoYXJlZEF1dG9Db21wbGV0ZTJNb2R1bGUgeyB9XG4iXX0=