UNPKG

@hxui/angular

Version:

This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.

596 lines (595 loc) 56.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Input, forwardRef, Component, ViewChild, Output, EventEmitter, IterableDiffers, ViewEncapsulation, Renderer2 } from '@angular/core'; import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms'; import * as _ from 'lodash'; import { SelectizeConfig } from './selectize.config'; export var /** @type {?} */ SELECTIZE_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return SelectizeComponent; }), multi: true }; var SelectizeComponent = /** @class */ (function () { function SelectizeComponent(_differs, renderer) { this._differs = _differs; this.renderer = renderer; this.enabled = true; this.onBlur = new EventEmitter(false); /** * Invoked anytime a key is pressed down on the selectize search field * @param e */ this.onKeydown = function (e) { console.log(e); var /** @type {?} */ TABKEY = 9; if (e.keyCode === TABKEY) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); } }; } /** * @return {?} */ SelectizeComponent.prototype.ngOnInit = /** * @return {?} */ function () { if (this.id && this.id.length > 0) { this.renderer.setAttribute(this.selectizeInput.nativeElement, 'id', this.id); } this.reset(); }; /** * @return {?} */ SelectizeComponent.prototype.reset = /** * @return {?} */ function () { this.selectize = $(this.selectizeInput.nativeElement).selectize(this.config)[0].selectize; this.selectize.on('change', this.onSelectizeValueChange.bind(this)); this.selectize.on('blur', this.onBlurEvent.bind(this)); this.selectize.on('type', this.onSelectizeType.bind(this)); this.selectize.on('item_add', this.onSelectizeItemSelected.bind(this)); this.updatePlaceholder(); this.onEnabledStatusChange(); }; /** * @return {?} */ SelectizeComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.selectize.off('change'); this.selectize.off('blur'); this.selectize.off('type'); }; /** * Change detection for primitive types. */ /** * Change detection for primitive types. * @param {?} changes * @return {?} */ SelectizeComponent.prototype.ngOnChanges = /** * Change detection for primitive types. * @param {?} changes * @return {?} */ function (changes) { if (this.selectize) { if (changes.hasOwnProperty('placeholder') || changes.hasOwnProperty('hasOptionsPlaceholder') || changes.hasOwnProperty('noOptionsPlaceholder')) { this.updatePlaceholder(); } if (changes.hasOwnProperty('enabled')) { this.onEnabledStatusChange(); } } }; /** * Implementing deep check for option comparison * * FIXME -> Implement deep check to only compare against label and value fields. */ /** * Implementing deep check for option comparison * * FIXME -> Implement deep check to only compare against label and value fields. * @return {?} */ SelectizeComponent.prototype.ngDoCheck = /** * Implementing deep check for option comparison * * FIXME -> Implement deep check to only compare against label and value fields. * @return {?} */ function () { if (this._options_differ) { var /** @type {?} */ changes = this._options_differ.diff(this._options); if (changes) { this._applyOptionsChanges(changes); } } if (this._optgroups_differ) { var /** @type {?} */ changes = this._optgroups_differ.diff(this._optgroups); if (changes) { this._applyOptionGroupChanges(changes); } } }; /** * @param {?} changes * @return {?} */ SelectizeComponent.prototype._applyOptionsChanges = /** * @param {?} changes * @return {?} */ function (changes) { var _this = this; changes.forEachAddedItem(function (record) { _this.onSelectizeOptionAdd(record.item); }); changes.forEachRemovedItem(function (record) { _this.onSelectizeOptionRemove(record.item); }); this.updatePlaceholder(); this.evalHasError(); }; /** * @param {?} changes * @return {?} */ SelectizeComponent.prototype._applyOptionGroupChanges = /** * @param {?} changes * @return {?} */ function (changes) { var _this = this; changes.forEachAddedItem(function (record) { _this.onSelectizeOptGroupAdd(record.item); }); changes.forEachRemovedItem(function (record) { _this.onSelectizeOptGroupRemove(record.item); }); this.updatePlaceholder(); this.evalHasError(); }; /** * @return {?} */ SelectizeComponent.prototype.clearhighlight = /** * @return {?} */ function () { // remove highlight to help selectize bug // https://github.com/selectize/selectize.js/issues/1141 this.selectize.$dropdown_content.removeHighlight(); }; /** * @return {?} */ SelectizeComponent.prototype.onBlurEvent = /** * @return {?} */ function () { if (this.formControl) { this.formControl.markAsTouched(); } this.onBlur.emit(); this.evalHasError(); }; /** * @param {?} optgroup * @return {?} */ SelectizeComponent.prototype.onSelectizeOptGroupAdd = /** * @param {?} optgroup * @return {?} */ function (optgroup) { this.selectize.addOptionGroup(optgroup[this.getOptgroupField()], optgroup); }; /** * @param {?} optgroup * @return {?} */ SelectizeComponent.prototype.onSelectizeOptGroupRemove = /** * @param {?} optgroup * @return {?} */ function (optgroup) { this.selectize.removeOptionGroup(optgroup[this.getOptgroupField()]); }; /** * Refresh selected values when options change. */ /** * Refresh selected values when options change. * @param {?} option * @return {?} */ SelectizeComponent.prototype.onSelectizeOptionAdd = /** * Refresh selected values when options change. * @param {?} option * @return {?} */ function (option) { this.selectize.addOption(_.cloneDeep(option)); var /** @type {?} */ valueField = this.config.valueField; if (this.value) { var /** @type {?} */ items = typeof this.value === 'string' || typeof this.value === 'number' ? [this.value] : this.value; if (items && items instanceof Array && items.find(function (value) { return value === option[valueField]; })) { this.selectize.addItem(option[valueField], true); } } }; /** * @param {?} option * @return {?} */ SelectizeComponent.prototype.onSelectizeOptionRemove = /** * @param {?} option * @return {?} */ function (option) { this.selectize.removeOption(option[this.config.valueField]); }; /** * @return {?} */ SelectizeComponent.prototype.evalHasError = /** * @return {?} */ function () { var /** @type {?} */ parent = $(this.selectize.$control).parent(); if (this.formControl) { if (this.formControl.touched && this.formControl.invalid) { parent.addClass(this.errorClass || 'has-error'); } else if (parent.hasClass('has-error')) { parent.removeClass(this.errorClass || 'has-error'); } } }; /** * Update the current placeholder based on the given input parameter. */ /** * Update the current placeholder based on the given input parameter. * @return {?} */ SelectizeComponent.prototype.updatePlaceholder = /** * Update the current placeholder based on the given input parameter. * @return {?} */ function () { if (this.selectize.items.length === 0 && this.selectize.settings.placeholder !== this.getPlaceholder()) { this.selectize.settings.placeholder = this.getPlaceholder(); this.selectize.updatePlaceholder(); this.selectize.showInput(); // Without this, when options are cleared placeholder only appears after focus. } }; /** * Called when a change is detected in the 'enabled' input field. * Sets the selectize state based on the new value. */ /** * Called when a change is detected in the 'enabled' input field. * Sets the selectize state based on the new value. * @return {?} */ SelectizeComponent.prototype.onEnabledStatusChange = /** * Called when a change is detected in the 'enabled' input field. * Sets the selectize state based on the new value. * @return {?} */ function () { this.enabled ? this.selectize.enable() : this.selectize.disable(); }; /** * Dispatches change event when a value change is detected. * @param $event */ /** * Dispatches change event when a value change is detected. * @param {?} $event * @return {?} */ SelectizeComponent.prototype.onSelectizeValueChange = /** * Dispatches change event when a value change is detected. * @param {?} $event * @return {?} */ function ($event) { var _this = this; // In some cases this gets called before registerOnChange. if (this.onChangeCallback) { // Map selectize's value collection back to original ISelectizeItem object var /** @type {?} */ data = this.selectize.items.map(function (v) { return _this.selectize.options[v]; }); this.onChangeCallback(data); } }; /** * Invoked when the user types while filtering options. * @param str */ /** * Invoked when the user types while filtering options. * @param {?} str * @return {?} */ SelectizeComponent.prototype.onSelectizeType = /** * Invoked when the user types while filtering options. * @param {?} str * @return {?} */ function (str) { if (str.length === 0) { this.clearhighlight(); this.selectize.close(); } }; /** * @param {?} $event * @return {?} */ SelectizeComponent.prototype.onSelectizeItemSelected = /** * @param {?} $event * @return {?} */ function ($event) { this.clearhighlight(); if (this.config.closeAfterSelect) { this.selectize.close(); } }; /** * Returns the applicable placeholder. */ /** * Returns the applicable placeholder. * @return {?} */ SelectizeComponent.prototype.getPlaceholder = /** * Returns the applicable placeholder. * @return {?} */ function () { if (this.hasOptionsPlaceholder) { if (this.options && this.options.length > 0) { return this.hasOptionsPlaceholder; } } if (this.noOptionsPlaceholder) { if (!this.options || this.options.length === 0) { return this.noOptionsPlaceholder; } } return this.placeholder; }; /** * Implementation from ControlValueAccessor * * @param obj */ /** * Implementation from ControlValueAccessor * * @param {?} obj * @return {?} */ SelectizeComponent.prototype.writeValue = /** * Implementation from ControlValueAccessor * * @param {?} obj * @return {?} */ function (obj) { var _this = this; if (obj === this.value) { return; } this.value = obj; if (!obj || obj.length === 0) { this.selectize.setValue(''); return; } var /** @type {?} */ stringValue = obj.map(function (v) { if (!Object.keys(_this.selectize.options).some(function (x) { return x === v.value; })) { _this.selectize.addOption(v); } return v.value; }); this.selectize.setValue(stringValue); }; /** * Implementation from ControlValueAccessor, callback for (ngModelChange) * @param fn */ /** * Implementation from ControlValueAccessor, callback for (ngModelChange) * @param {?} fn * @return {?} */ SelectizeComponent.prototype.registerOnChange = /** * Implementation from ControlValueAccessor, callback for (ngModelChange) * @param {?} fn * @return {?} */ function (fn) { this.onChangeCallback = fn; }; /** * Implementation from ControlValueAccessor * @param fn */ /** * Implementation from ControlValueAccessor * @param {?} fn * @return {?} */ SelectizeComponent.prototype.registerOnTouched = /** * Implementation from ControlValueAccessor * @param {?} fn * @return {?} */ function (fn) { this.onTouchedCallback = fn; }; /** * @return {?} */ SelectizeComponent.prototype.getOptgroupField = /** * @return {?} */ function () { return this.config['optgroupField'] ? this.config['optgroupField'] : 'optgroup'; }; Object.defineProperty(SelectizeComponent.prototype, "options", { get: /** * @return {?} */ function () { return this._options; }, set: /** * @param {?} value * @return {?} */ function (value) { this._options = value; if (!this._options_differ && value) { this._options_differ = this._differs.find(value).create(); } }, enumerable: true, configurable: true }); Object.defineProperty(SelectizeComponent.prototype, "optgroups", { get: /** * @return {?} */ function () { return this._optgroups; }, set: /** * @param {?} value * @return {?} */ function (value) { this._optgroups = value; if (!this._optgroups_differ && value) { this._optgroups_differ = this._differs.find(value).create(); } }, enumerable: true, configurable: true }); SelectizeComponent.decorators = [ { type: Component, args: [{ selector: 'hxa-selectize', template: "<select #selectizeInput></select>", providers: [SELECTIZE_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None, styles: [".selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#2a2c2d;font-family:inherit;font-size:.92rem;line-height:1.5;-webkit-font-smoothing:inherit}.selectize-control.single .selectize-input.input-active,.selectize-input{background:0 0;cursor:text;display:inline-block}.selectize-input{border:1px solid rgba(0,0,0,.2);padding:8px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:0;border-width:0 0 1px}.selectize-control.multi .selectize-input.has-items{padding:6px 8px 3px}.selectize-input.full{background-color:transparent}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{box-shadow:none}.selectize-input.dropdown-active{border-radius:0}.selectize-input>*{vertical-align:baseline;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:4px;padding:2px 6px;background:rgba(0,0,0,.05);color:#2a2c2d;border:0 solid transparent;border-radius:290486px;font-size:.75rem;justify-content:center;line-height:1.5;white-space:nowrap}.selectize-control.multi .selectize-input>div.active{background:#e8e8e8;color:#2a2c2d;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#787878;background:rgba(77,77,77,.05);border:0 solid rgba(77,77,77,0)}.selectize-input>input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0!important;text-indent:0!important;border:0!important;background:0 0!important;line-height:inherit!important;-webkit-user-select:auto!important}.selectize-input>input::-ms-clear{display:none}.selectize-input>input:focus{outline:0!important}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.hx-select-control:after{display:none}.selectize-dropdown{position:absolute;z-index:10;border:transparent;background:#fff;margin:-1px 0 0;border-top:0;box-sizing:border-box;box-shadow:0 6px 12px rgba(0,0,0,.145);border-radius:0}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(35,49,43,.23);border-radius:1px;font-weight:700}.selectize-dropdown .optgroup-header,.selectize-dropdown [data-selectable]{padding:5px 8px}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0}.selectize-dropdown .optgroup-header{color:#2a2c2d;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#41b987;color:#fff}.selectize-dropdown .active.create{color:#fff}.selectize-dropdown .create{color:rgba(42,44,45,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:grey transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent grey}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px!important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:.7rem!important}.selectize-control.plugin-remove_button [data-value].is-medium{padding-right:1rem!important}.selectize-control.plugin-remove_button [data-value] .hx-delete{margin-left:-.2rem;height:16px;width:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px}.selectize-control.plugin-remove_button [data-value].is-medium .hx-delete{margin-left:-.5rem}.selectize-control.plugin-remove_button [data-value].is-large .hx-delete{margin-left:-.2rem;height:20px;width:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px}.selectize-control.plugin-remove_button .disabled [data-value] .hx-remove:hover{background:0 0}.selectize-control.plugin-remove_button .disabled [data-value] .hx-remove{border-left-color:rgba(77,77,77,0)}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:28px;top:6px;font-size:23px}"] },] }, ]; /** @nocollapse */ SelectizeComponent.ctorParameters = function () { return [ { type: IterableDiffers, }, { type: Renderer2, }, ]; }; SelectizeComponent.propDecorators = { "config": [{ type: Input },], "id": [{ type: Input },], "placeholder": [{ type: Input },], "hasOptionsPlaceholder": [{ type: Input },], "noOptionsPlaceholder": [{ type: Input },], "enabled": [{ type: Input },], "value": [{ type: Input },], "formControl": [{ type: Input },], "errorClass": [{ type: Input },], "onBlur": [{ type: Output },], "selectizeInput": [{ type: ViewChild, args: ['selectizeInput',] },], "options": [{ type: Input },], "optgroups": [{ type: Input },], }; return SelectizeComponent; }()); export { SelectizeComponent }; function SelectizeComponent_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ SelectizeComponent.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ SelectizeComponent.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ SelectizeComponent.propDecorators; /** @type {?} */ SelectizeComponent.prototype._options; /** @type {?} */ SelectizeComponent.prototype._options_differ; /** @type {?} */ SelectizeComponent.prototype._optgroups; /** @type {?} */ SelectizeComponent.prototype._optgroups_differ; /** @type {?} */ SelectizeComponent.prototype.config; /** @type {?} */ SelectizeComponent.prototype.id; /** @type {?} */ SelectizeComponent.prototype.placeholder; /** @type {?} */ SelectizeComponent.prototype.hasOptionsPlaceholder; /** @type {?} */ SelectizeComponent.prototype.noOptionsPlaceholder; /** @type {?} */ SelectizeComponent.prototype.enabled; /** @type {?} */ SelectizeComponent.prototype.value; /** @type {?} */ SelectizeComponent.prototype.formControl; /** @type {?} */ SelectizeComponent.prototype.errorClass; /** @type {?} */ SelectizeComponent.prototype.onBlur; /** @type {?} */ SelectizeComponent.prototype.selectizeInput; /** @type {?} */ SelectizeComponent.prototype.selectize; /** @type {?} */ SelectizeComponent.prototype.onTouchedCallback; /** @type {?} */ SelectizeComponent.prototype.onChangeCallback; /** * Invoked anytime a key is pressed down on the selectize search field * \@param e * @type {?} */ SelectizeComponent.prototype.onKeydown; /** @type {?} */ SelectizeComponent.prototype._differs; /** @type {?} */ SelectizeComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aXplLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VsZWN0aXplL3NlbGVjdGl6ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxLQUFLLEVBS0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDWixlQUFlLEVBSWYsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLFdBQVcsRUFDWixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtyRCxNQUFNLENBQUMscUJBQU0sd0JBQXdCLEdBQVE7SUFDM0MsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxrQkFBa0IsRUFBbEIsQ0FBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7O0lBb0NBLDRCQUFvQixRQUF5QixFQUFVLFFBQW1CO1FBQXRELGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVzt1QkFmdkQsSUFBSTtzQkFLZ0IsSUFBSSxZQUFZLENBQU8sS0FBSyxDQUFDOzs7Ozt5QkE0TnhELFVBQUEsQ0FBQztZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixxQkFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixDQUFDLENBQUMsd0JBQXdC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Q0FBQztZQUN0QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUMzRDs7Ozs7MEJBUUMseUNBQVM7Ozs7UUFPYjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ3hCOzs7OztrQkFUYSxLQUFZO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUM3RDs7Ozs7O2dCQWpWSixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRSxtQ0FBbUM7b0JBQzdDLFNBQVMsRUFBRSxDQUFDLHdCQUF3QixDQUFDO29CQUNyQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsTUFBTSxFQUFFLENBQUMsNnBKQUE2cEosQ0FBQztpQkFDeHFKOzs7O2dCQWhDQyxlQUFlO2dCQUtmLFNBQVM7OzsyQkFtQ1IsS0FBSzt1QkFDTCxLQUFLO2dDQUNMLEtBQUs7MENBQ0wsS0FBSzt5Q0FDTCxLQUFLOzRCQUNMLEtBQUs7MEJBQ0wsS0FBSztnQ0FDTCxLQUFLOytCQUNMLEtBQUs7MkJBRUwsTUFBTTttQ0FFTixTQUFTLFNBQUMsZ0JBQWdCOzRCQXNTMUIsS0FBSzs4QkFZTCxLQUFLOzs2QkFqWFI7O1NBNENhLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIERvQ2hlY2ssXHJcbiAgZm9yd2FyZFJlZixcclxuICBDb21wb25lbnQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSXRlcmFibGVEaWZmZXJzLFxyXG4gIEl0ZXJhYmxlRGlmZmVyLFxyXG4gIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkLFxyXG4gIEl0ZXJhYmxlQ2hhbmdlcyxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBSZW5kZXJlcjIsXHJcbiAgT25EZXN0cm95XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXHJcbiAgRm9ybUNvbnRyb2xcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IFNlbGVjdGl6ZUNvbmZpZyB9IGZyb20gJy4vc2VsZWN0aXplLmNvbmZpZyc7XHJcbmltcG9ydCB7SVNlbGVjdGl6ZUl0ZW19IGZyb20gJy4vc2VsZWN0aXplLWl0ZW0uaW50ZXJmYWNlJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbmV4cG9ydCBjb25zdCBTRUxFQ1RJWkVfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RpemVDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4YS1zZWxlY3RpemUnLFxyXG4gIHRlbXBsYXRlOiBgPHNlbGVjdCAjc2VsZWN0aXplSW5wdXQ+PC9zZWxlY3Q+YCxcclxuICBwcm92aWRlcnM6IFtTRUxFQ1RJWkVfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgc3R5bGVzOiBbYC5zZWxlY3RpemUtY29udHJvbHtwb3NpdGlvbjpyZWxhdGl2ZX0uc2VsZWN0aXplLWRyb3Bkb3duLC5zZWxlY3RpemUtaW5wdXQsLnNlbGVjdGl6ZS1pbnB1dCBpbnB1dHtjb2xvcjojMmEyYzJkO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOi45MnJlbTtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC1mb250LXNtb290aGluZzppbmhlcml0fS5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUsLnNlbGVjdGl6ZS1pbnB1dHtiYWNrZ3JvdW5kOjAgMDtjdXJzb3I6dGV4dDtkaXNwbGF5OmlubGluZS1ibG9ja30uc2VsZWN0aXplLWlucHV0e2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7cGFkZGluZzo4cHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXJhZGl1czowO2JvcmRlci13aWR0aDowIDAgMXB4fS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0Lmhhcy1pdGVtc3twYWRkaW5nOjZweCA4cHggM3B4fS5zZWxlY3RpemUtaW5wdXQuZnVsbHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWQsLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZCAqe2N1cnNvcjpkZWZhdWx0IWltcG9ydGFudH0uc2VsZWN0aXplLWlucHV0LmZvY3Vze2JveC1zaGFkb3c6bm9uZX0uc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZXtib3JkZXItcmFkaXVzOjB9LnNlbGVjdGl6ZS1pbnB1dD4qe3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3pvb206MX0uc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dD5kaXZ7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luOjRweDtwYWRkaW5nOjJweCA2cHg7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6IzJhMmMyZDtib3JkZXI6MCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjI5MDQ4NnB4O2ZvbnQtc2l6ZTouNzVyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7d2hpdGUtc3BhY2U6bm93cmFwfS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0PmRpdi5hY3RpdmV7YmFja2dyb3VuZDojZThlOGU4O2NvbG9yOiMyYTJjMmQ7Ym9yZGVyOjAgc29saWQgI2NhY2FjYX0uc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZD5kaXYsLnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWQ+ZGl2LmFjdGl2ZXtjb2xvcjojNzg3ODc4O2JhY2tncm91bmQ6cmdiYSg3Nyw3Nyw3NywuMDUpO2JvcmRlcjowIHNvbGlkIHJnYmEoNzcsNzcsNzcsMCl9LnNlbGVjdGl6ZS1pbnB1dD5pbnB1dHtkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDttaW4taGVpZ2h0OjAhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWF4LXdpZHRoOjEwMCUhaW1wb3J0YW50O21hcmdpbjowIDJweCAwIDAhaW1wb3J0YW50O3RleHQtaW5kZW50OjAhaW1wb3J0YW50O2JvcmRlcjowIWltcG9ydGFudDtiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6aW5oZXJpdCFpbXBvcnRhbnQ7LXdlYmtpdC11c2VyLXNlbGVjdDphdXRvIWltcG9ydGFudH0uc2VsZWN0aXplLWlucHV0PmlucHV0OjotbXMtY2xlYXJ7ZGlzcGxheTpub25lfS5zZWxlY3RpemUtaW5wdXQ+aW5wdXQ6Zm9jdXN7b3V0bGluZTowIWltcG9ydGFudH0uc2VsZWN0aXplLWlucHV0OjphZnRlcntjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO2NsZWFyOmxlZnR9LnNlbGVjdGl6ZS1pbnB1dC5kcm9wZG93bi1hY3RpdmU6OmJlZm9yZXtjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6I2YwZjBmMDtoZWlnaHQ6MXB4O2JvdHRvbTowO2xlZnQ6MDtyaWdodDowfS5oeC1zZWxlY3QtY29udHJvbDphZnRlcntkaXNwbGF5Om5vbmV9LnNlbGVjdGl6ZS1kcm9wZG93bntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwO2JvcmRlcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kOiNmZmY7bWFyZ2luOi0xcHggMCAwO2JvcmRlci10b3A6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNoYWRvdzowIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE0NSk7Ym9yZGVyLXJhZGl1czowfS5zZWxlY3RpemUtZHJvcGRvd24gW2RhdGEtc2VsZWN0YWJsZV17Y3Vyc29yOnBvaW50ZXI7b3ZlcmZsb3c6aGlkZGVufS5zZWxlY3RpemUtZHJvcGRvd24gW2RhdGEtc2VsZWN0YWJsZV0gLmhpZ2hsaWdodHtiYWNrZ3JvdW5kOnJnYmEoMzUsNDksNDMsLjIzKTtib3JkZXItcmFkaXVzOjFweDtmb250LXdlaWdodDo3MDB9LnNlbGVjdGl6ZS1kcm9wZG93biAub3B0Z3JvdXAtaGVhZGVyLC5zZWxlY3RpemUtZHJvcGRvd24gW2RhdGEtc2VsZWN0YWJsZV17cGFkZGluZzo1cHggOHB4fS5zZWxlY3RpemUtZHJvcGRvd24gLm9wdGdyb3VwOmZpcnN0LWNoaWxkIC5vcHRncm91cC1oZWFkZXJ7Ym9yZGVyLXRvcDowfS5zZWxlY3RpemUtZHJvcGRvd24gLm9wdGdyb3VwLWhlYWRlcntjb2xvcjojMmEyYzJkO2JhY2tncm91bmQ6I2ZmZjtjdXJzb3I6ZGVmYXVsdH0uc2VsZWN0aXplLWRyb3Bkb3duIC5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNDFiOTg3O2NvbG9yOiNmZmZ9LnNlbGVjdGl6ZS1kcm9wZG93biAuYWN0aXZlLmNyZWF0ZXtjb2xvcjojZmZmfS5zZWxlY3RpemUtZHJvcGRvd24gLmNyZWF0ZXtjb2xvcjpyZ2JhKDQyLDQ0LDQ1LC41KX0uc2VsZWN0aXplLWRyb3Bkb3duLWNvbnRlbnR7b3ZlcmZsb3cteTphdXRvO292ZXJmbG93LXg6aGlkZGVuO21heC1oZWlnaHQ6MjAwcHg7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0LC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dCBpbnB1dHtjdXJzb3I6cG9pbnRlcn0uc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQuaW5wdXQtYWN0aXZlLC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUgaW5wdXR7Y3Vyc29yOnRleHR9LnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVye2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNXB4O21hcmdpbi10b3A6LTNweDt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci1jb2xvcjpncmV5IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5kcm9wZG93bi1hY3RpdmU6YWZ0ZXJ7bWFyZ2luLXRvcDotNHB4O2JvcmRlci13aWR0aDowIDVweCA1cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGdyZXl9LnNlbGVjdGl6ZS1jb250cm9sLnJ0bC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dDphZnRlcntsZWZ0OjE1cHg7cmlnaHQ6YXV0b30uc2VsZWN0aXplLWNvbnRyb2wucnRsIC5zZWxlY3RpemUtaW5wdXQ+aW5wdXR7bWFyZ2luOjAgNHB4IDAgLTJweCFpbXBvcnRhbnR9LnNlbGVjdGl6ZS1jb250cm9sIC5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWR7b3BhY2l0eTouNTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9LnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIFtkYXRhLXZhbHVlXXtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXJpZ2h0Oi43cmVtIWltcG9ydGFudH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdLmlzLW1lZGl1bXtwYWRkaW5nLXJpZ2h0OjFyZW0haW1wb3J0YW50fS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV0gLmh4LWRlbGV0ZXttYXJnaW4tbGVmdDotLjJyZW07aGVpZ2h0OjE2cHg7d2lkdGg6MTZweDttYXgtaGVpZ2h0OjE2cHg7bWF4LXdpZHRoOjE2cHg7bWluLWhlaWdodDoxNnB4O21pbi13aWR0aDoxNnB4fS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV0uaXMtbWVkaXVtIC5oeC1kZWxldGV7bWFyZ2luLWxlZnQ6LS41cmVtfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV0uaXMtbGFyZ2UgLmh4LWRlbGV0ZXttYXJnaW4tbGVmdDotLjJyZW07aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDttYXgtaGVpZ2h0OjIwcHg7bWF4LXdpZHRoOjIwcHg7bWluLWhlaWdodDoyMHB4O21pbi13aWR0aDoyMHB4fS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiAuZGlzYWJsZWQgW2RhdGEtdmFsdWVdIC5oeC1yZW1vdmU6aG92ZXJ7YmFja2dyb3VuZDowIDB9LnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIC5kaXNhYmxlZCBbZGF0YS12YWx1ZV0gLmh4LXJlbW92ZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDc3LDc3LDc3LDApfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiAucmVtb3ZlLXNpbmdsZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoyOHB4O3RvcDo2cHg7Zm9udC1zaXplOjIzcHh9YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlbGVjdGl6ZUNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIERvQ2hlY2ssIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX29wdGlvbnM6IGFueVtdO1xyXG4gIHByaXZhdGUgX29wdGlvbnNfZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+O1xyXG4gIHByaXZhdGUgX29wdGdyb3VwczogYW55W107XHJcbiAgcHJpdmF0ZSBfb3B0Z3JvdXBzX2RpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PjtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnOiBTZWxlY3RpemVDb25maWc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhhc09wdGlvbnNQbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG5vT3B0aW9uc1BsYWNlaG9sZGVyOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZW5hYmxlZCA9IHRydWU7XHJcbiAgQElucHV0KCkgdmFsdWU6IElTZWxlY3RpemVJdGVtW107XHJcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gIEBJbnB1dCgpIGVycm9yQ2xhc3M6IHN0cmluZztcclxuXHJcbiAgQE91dHB1dCgpIG9uQmx1cjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPihmYWxzZSk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGl6ZUlucHV0Jykgc2VsZWN0aXplSW5wdXQ6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RpemU6IGFueTtcclxuXHJcbiAgLy8gQ29udHJvbCB2YWx1ZSBhY2Nlc3NvcnMuXHJcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlmZmVyczogSXRlcmFibGVEaWZmZXJzLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5pZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0aXplSW5wdXQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAnaWQnLFxyXG4gICAgICAgIHRoaXMuaWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5zZWxlY3RpemUgPSAkKHRoaXMuc2VsZWN0aXplSW5wdXQubmF0aXZlRWxlbWVudCkuc2VsZWN0aXplKFxyXG4gICAgICB0aGlzLmNvbmZpZ1xyXG4gICAgKVswXS5zZWxlY3RpemU7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5vbignY2hhbmdlJywgdGhpcy5vblNlbGVjdGl6ZVZhbHVlQ2hhbmdlLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5zZWxlY3RpemUub24oJ2JsdXInLCB0aGlzLm9uQmx1ckV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5zZWxlY3RpemUub24oJ3R5cGUnLCB0aGlzLm9uU2VsZWN0aXplVHlwZS5iaW5kKHRoaXMpKTtcclxuICAgIHRoaXMuc2VsZWN0aXplLm9uKCdpdGVtX2FkZCcsIHRoaXMub25TZWxlY3RpemVJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSk7XHJcbiAgICB0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XHJcbiAgICB0aGlzLm9uRW5hYmxlZFN0YXR1c0NoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5vZmYoJ2NoYW5nZScpO1xyXG4gICAgdGhpcy5zZWxlY3RpemUub2ZmKCdibHVyJyk7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5vZmYoJ3R5cGUnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBkZXRlY3Rpb24gZm9yIHByaW1pdGl2ZSB0eXBlcy5cclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RpemUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3BsYWNlaG9sZGVyJykgfHxcclxuICAgICAgICBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdoYXNPcHRpb25zUGxhY2Vob2xkZXInKSB8fFxyXG4gICAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ25vT3B0aW9uc1BsYWNlaG9sZGVyJylcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdlbmFibGVkJykpIHtcclxuICAgICAgICB0aGlzLm9uRW5hYmxlZFN0YXR1c0NoYW5nZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbXBsZW1lbnRpbmcgZGVlcCBjaGVjayBmb3Igb3B0aW9uIGNvbXBhcmlzb25cclxuICAgKlxyXG4gICAqIEZJWE1FIC0+IEltcGxlbWVudCBkZWVwIGNoZWNrIHRvIG9ubHkgY29tcGFyZSBhZ2FpbnN0IGxhYmVsIGFuZCB2YWx1ZSBmaWVsZHMuXHJcbiAgICovXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX29wdGlvbnNfZGlmZmVyKSB7XHJcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9vcHRpb25zX2RpZmZlci5kaWZmKHRoaXMuX29wdGlvbnMpO1xyXG4gICAgICBpZiAoY2hhbmdlcykge1xyXG4gICAgICAgIHRoaXMuX2FwcGx5T3B0aW9uc0NoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9vcHRncm91cHNfZGlmZmVyKSB7XHJcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9vcHRncm91cHNfZGlmZmVyLmRpZmYodGhpcy5fb3B0Z3JvdXBzKTtcclxuICAgICAgaWYgKGNoYW5nZXMpIHtcclxuICAgICAgICB0aGlzLl9hcHBseU9wdGlvbkdyb3VwQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXBwbHlPcHRpb25zQ2hhbmdlcyhjaGFuZ2VzOiBJdGVyYWJsZUNoYW5nZXM8YW55Pik6IHZvaWQge1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPGFueT4pID0+IHtcclxuICAgICAgdGhpcy5vblNlbGVjdGl6ZU9wdGlvbkFkZChyZWNvcmQuaXRlbSk7XHJcbiAgICB9KTtcclxuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPGFueT4pID0+IHtcclxuICAgICAgdGhpcy5vblNlbGVjdGl6ZU9wdGlvblJlbW92ZShyZWNvcmQuaXRlbSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcclxuICAgIHRoaXMuZXZhbEhhc0Vycm9yKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hcHBseU9wdGlvbkdyb3VwQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcclxuICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxhbnk+KSA9PiB7XHJcbiAgICAgIHRoaXMub25TZWxlY3RpemVPcHRHcm91cEFkZChyZWNvcmQuaXRlbSk7XHJcbiAgICB9KTtcclxuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPGFueT4pID0+IHtcclxuICAgICAgdGhpcy5vblNlbGVjdGl6ZU9wdEdyb3VwUmVtb3ZlKHJlY29yZC5pdGVtKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5ldmFsSGFzRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJoaWdobGlnaHQoKTogdm9pZCB7XHJcbiAgICAvLyByZW1vdmUgaGlnaGxpZ2h0IHRvIGhlbHAgc2VsZWN0aXplIGJ1Z1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlbGVjdGl6ZS9zZWxlY3RpemUuanMvaXNzdWVzLzExNDFcclxuICAgIHRoaXMuc2VsZWN0aXplLiRkcm9wZG93bl9jb250ZW50LnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyRXZlbnQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbCkge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIH1cclxuICAgIHRoaXMub25CbHVyLmVtaXQoKTtcclxuICAgIHRoaXMuZXZhbEhhc0Vycm9yKCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdGl6ZU9wdEdyb3VwQWRkKG9wdGdyb3VwOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aXplLmFkZE9wdGlvbkdyb3VwKG9wdGdyb3VwW3RoaXMuZ2V0T3B0Z3JvdXBGaWVsZCgpXSwgb3B0Z3JvdXApO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RpemVPcHRHcm91cFJlbW92ZShvcHRncm91cDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5yZW1vdmVPcHRpb25Hcm91cChvcHRncm91cFt0aGlzLmdldE9wdGdyb3VwRmllbGQoKV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVmcmVzaCBzZWxlY3RlZCB2YWx1ZXMgd2hlbiBvcHRpb25zIGNoYW5nZS5cclxuICAgKi9cclxuICBvblNlbGVjdGl6ZU9wdGlvbkFkZChvcHRpb246IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RpemUuYWRkT3B0aW9uKF8uY2xvbmVEZWVwKG9wdGlvbikpO1xyXG4gICAgY29uc3QgdmFsdWVGaWVsZCA9IHRoaXMuY29uZmlnLnZhbHVlRmllbGQ7XHJcbiAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICBjb25zdCBpdGVtcyA9XHJcbiAgICAgICAgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgPyBbdGhpcy52YWx1ZV1cclxuICAgICAgICAgIDogdGhpcy52YWx1ZTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGl0ZW1zICYmXHJcbiAgICAgICAgaXRlbXMgaW5zdGFuY2VvZiBBcnJheSAmJlxyXG4gICAgICAgIGl