raonkupload-angular
Version:
Angular component for RAON K Upload.
322 lines • 39.1 kB
JavaScript
/**
* @license Copyright (c) 2003-2022, RAONWIZ DevTeam. All rights reserved.
*/
import { Component, NgZone, Input, Output, EventEmitter, forwardRef, ElementRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { getRaonwizComponentNamespace } from 'raonwiz-integrations-common';
export class RaonkUploadComponent {
constructor(elementRef, ngZone) {
this.elementRef = elementRef;
this.ngZone = ngZone;
/**
* The id of the component
*/
this.id = "";
/**
* The component type
*/
this.componentType = 'RAONKUPLOAD';
/**
* RAON K Upload script url address. Script will be loaded only if RAONKUPLOAD namespace is missing.
*/
this.componentUrl = '/raonkupload/js/raonkupload.js';
/**
* Tag name of the component.
*
* The default tag is `div`.
*/
this.tagName = 'div';
/**
* The runtimes of the component interface.
*/
this.runtimes = "html5" /* HTML5 */;
/**
* Fired when the component namespace
* is loaded. It only triggers once, no matter how many components are initialised.
*/
this.namespaceLoaded = new EventEmitter();
this.change = new EventEmitter();
/**
* event.
*/
this.creationComplete = new EventEmitter();
this.beforeAddFile = new EventEmitter();
this.afterAddFile = new EventEmitter();
this.afterAddAllFile = new EventEmitter();
this.beforeDeleteFile = new EventEmitter();
this.afterDeleteFile = new EventEmitter();
this.deleteAllFile = new EventEmitter();
this.beforeUpload = new EventEmitter();
this.uploadComplete = new EventEmitter();
this.beforeDownloadFile = new EventEmitter();
this.beforeOpenFile = new EventEmitter();
this.downloadCompleteFile = new EventEmitter();
this.downloadCompleteAllFile = new EventEmitter();
this.onError = new EventEmitter();
this.uploadingCancel = new EventEmitter();
this.downloadCancel = new EventEmitter();
this.selectItem = new EventEmitter();
this.customAction = new EventEmitter();
this.alert = new EventEmitter();
/**
* If the component is view-mode before the component instance is created, it remembers that state,
* so the component can become view-mode once it is ready.
*/
this._viewMode = null;
this._data = null;
this._destroyed = false;
}
/**
* Keeps track of the component's data.
*
* It's also decorated as an input which is useful when not using the ngModel.
*
* See https://angular.io/api/forms/NgModel to learn more.
*/
set data(data) {
if (data === this._data) {
return;
}
if (this.instance) {
// not supported set data
// Data may be changed by ACF.
this._data = RAONKUPLOAD.GetListInfo('array', this.id);
return;
}
this._data = data;
}
get data() {
return this._data;
}
/**
* When set to `true`, the editor becomes view mode.
*/
set viewMode(isViewMode) {
if (this.instance) {
RAONKUPLOAD.SetUploadMode(isViewMode ? 'view' : 'edit', this.id);
return;
}
// Delay setting mode
this._viewMode = isViewMode;
}
get viewMode() {
if (this.instance) {
let retValue;
switch (RAONKUPLOAD.GetUploadByName(this.id)._config.mode.toLowerCase()) {
case 'upload':
case 'edit':
retValue = false;
break;
default:
retValue = true;
break;
}
return retValue;
}
return this._viewMode;
}
ngAfterViewInit() {
getRaonwizComponentNamespace(this.componentType, this.componentUrl, namespace => {
this.namespaceLoaded.emit(namespace);
}).then((namespace) => {
// Check if component instance was destroyed before `ngAfterViewInit` call (#110).
// Here, `this.instance` is still not initialized and so additional flag is needed.
if (this._destroyed) {
return;
}
this.ngZone.runOutsideAngular(this.createComponent.bind(this, namespace));
}).catch(window.console.error);
}
ngOnDestroy() {
this._destroyed = true;
this.ngZone.runOutsideAngular(() => {
if (this.instance) {
if (RAONKUPLOAD._ExternalComponentMap.has(this.id)) {
RAONKUPLOAD._ExternalComponentMap.delete(this.id);
}
if (RAONKUPLOAD._ExternalEventRetValueMap.has(this.id)) {
RAONKUPLOAD._ExternalEventRetValueMap.delete(this.id);
}
RAONKUPLOAD.Destroy(this.id, true);
this.instance = null;
}
});
}
writeValue(value) {
this.data = value;
}
registerOnChange(callback) {
this.onChange = callback;
}
registerOnTouched(callback) {
this.onTouched = callback;
}
getComponentUniqueName() {
return "raonkupload_" + Math.random()
.toString(36)
.replace(/[^a-z]+/g, '')
.substr(0, 5);
}
createComponent(namespace) {
let _uniqueName = this.getComponentUniqueName();
(typeof this.id === 'undefined') && (this.id = _uniqueName);
const element = document.createElement(this.tagName);
element.id = "componentHolder_" + _uniqueName;
this.elementRef.nativeElement.appendChild(element);
// view state may change during instance initialization.
(this._viewMode !== null) && (this.viewMode = this._viewMode);
// default config
let _compConfig = {
Id: this.id,
UploadHolder: element.id,
Runtimes: this.runtimes,
Mode: this._viewMode ? 'view' : 'edit',
Event: this.subscribe()
};
_compConfig = namespace.util.objectExtend(true, this.config, _compConfig);
// for event callback
(typeof namespace._ExternalComponentMap === 'undefined') && (namespace._ExternalComponentMap = new Map());
namespace._ExternalComponentMap.set(this.id, this);
(typeof namespace._ExternalEventRetValueMap === 'undefined') && (namespace._ExternalEventRetValueMap = new Map());
var _componentObject = new RAONKUpload(_compConfig);
_componentObject.name = element.id;
this.instance = _componentObject;
}
subscribe() {
let _configEvent = {};
const ComponentEvents = [
'CreationComplete',
'BeforeAddFile',
'AfterAddFile',
'AfterAddAllFile',
'BeforeDeleteFile',
'AfterDeleteFile',
'DeleteAllFile',
'BeforeUpload',
'UploadComplete',
'BeforeDownloadFile',
'BeforeOpenFile',
'DownloadCompleteFile',
'DownloadCompleteAllFile',
'OnError',
'UploadingCancel',
'DownloadCancel',
'SelectItem',
'CustomAction',
'Alert'
];
ComponentEvents.forEach(function (evtName) {
_configEvent[evtName] = (componentName, paramObj) => {
// Set default value
switch (evtName) {
case 'BeforeUpload':
case 'BeforeDownloadFile':
case 'BeforeOpenFile':
case 'BeforeAddFile':
case 'BeforeDeleteFile':
RAONKUPLOAD._ExternalEventRetValueMap.set(componentName, true);
break;
}
if (RAONKUPLOAD._ExternalComponentMap.has(componentName)) {
let _this = RAONKUPLOAD._ExternalComponentMap.get(componentName);
_this.ngZone.run(() => {
switch (evtName) {
case 'AfterAddAllFile':
case 'DeleteAllFile':
if (_this.onTouched) {
_this.onTouched();
}
break;
case 'UploadComplete':
_this.propagateChange(evtName, { componentName: componentName, paramObj: paramObj });
break;
}
_this[_this.capitalize(evtName)].emit({ componentName: componentName, paramObj: paramObj });
});
// Set default value
// return event
let _retValue = "";
switch (evtName) {
case 'BeforeUpload':
case 'BeforeDownloadFile':
case 'BeforeOpenFile':
case 'BeforeAddFile':
case 'BeforeDeleteFile':
if (RAONKUPLOAD._ExternalEventRetValueMap.has(componentName)) {
_retValue = RAONKUPLOAD._ExternalEventRetValueMap.get(componentName);
RAONKUPLOAD._ExternalEventRetValueMap.delete(componentName); // Initialization
return _retValue;
}
break;
}
}
};
});
return _configEvent;
}
capitalize(str) {
return str.charAt(0).toLowerCase() + str.slice(1);
}
propagateChange(eventName, eventParams) {
this.ngZone.run(() => {
const newData = RAONKUPLOAD.GetListInfo('array', this.id);
this.change.emit(eventParams);
if (newData === this.data) {
return;
}
this._data = newData;
if (this.onChange) {
this.onChange(newData);
}
});
}
}
RaonkUploadComponent.decorators = [
{ type: Component, args: [{
selector: 'RaonkUpload',
template: '<ng-template></ng-template>',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RaonkUploadComponent),
multi: true,
}
]
},] }
];
RaonkUploadComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: NgZone }
];
RaonkUploadComponent.propDecorators = {
id: [{ type: Input }],
config: [{ type: Input }],
componentType: [{ type: Input }],
componentUrl: [{ type: Input }],
tagName: [{ type: Input }],
runtimes: [{ type: Input }],
data: [{ type: Input }],
viewMode: [{ type: Input }],
namespaceLoaded: [{ type: Output }],
change: [{ type: Output }],
creationComplete: [{ type: Output }],
beforeAddFile: [{ type: Output }],
afterAddFile: [{ type: Output }],
afterAddAllFile: [{ type: Output }],
beforeDeleteFile: [{ type: Output }],
afterDeleteFile: [{ type: Output }],
deleteAllFile: [{ type: Output }],
beforeUpload: [{ type: Output }],
uploadComplete: [{ type: Output }],
beforeDownloadFile: [{ type: Output }],
beforeOpenFile: [{ type: Output }],
downloadCompleteFile: [{ type: Output }],
downloadCompleteAllFile: [{ type: Output }],
onError: [{ type: Output }],
uploadingCancel: [{ type: Output }],
downloadCancel: [{ type: Output }],
selectItem: [{ type: Output }],
customAction: [{ type: Output }],
alert: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFvbmt1cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jhb25rdXBsb2FkL3Jhb25rdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFDTixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUVOLGlCQUFpQixFQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBb0IzRSxNQUFNLE9BQU8sb0JBQW9CO0lBMEpoQyxZQUFxQixVQUFzQixFQUFVLE1BQWM7UUFBOUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUF6Sm5FOztXQUVHO1FBQ08sT0FBRSxHQUFHLEVBQUUsQ0FBQztRQVFsQjs7V0FFRztRQUNPLGtCQUFhLEdBQUUsYUFBYSxDQUFDO1FBRXZDOztXQUVHO1FBQ00saUJBQVksR0FBRyxnQ0FBZ0MsQ0FBQztRQUV6RDs7OztXQUlHO1FBQ00sWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV6Qjs7V0FFRztRQUNNLGFBQVEsdUJBQW9EO1FBNERyRTs7O1dBR0c7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBRTVELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUU3RDs7V0FFRztRQUNPLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBQzdELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFDMUQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUN6RCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBQzVELHFCQUFn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QUFDO1lBRXJCLElBQUssSUFBSSxDQUFDLFFBQVEsRUFBRztnQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBRSxPQUFPLENBQUUsQ0FBQzthQUN6QjtRQUNGLENBQUMsQ0FBRSxDQUFDO0lBQ0wsQ0FBQzs7O1lBcFdELFNBQVMsU0FBRTtnQkFDWCxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsUUFBUSxFQUFFLDZCQUE2QjtnQkFFdkMsU0FBUyxFQUFFO29CQUNWO3dCQUNDLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUUsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUU7d0JBQ3JELEtBQUssRUFBRSxJQUFJO3FCQUNYO2lCQUNEO2FBQ0Q7OztZQTNCQSxVQUFVO1lBTFYsTUFBTTs7O2lCQXNDSixLQUFLO3FCQU1OLEtBQUs7NEJBS0osS0FBSzsyQkFLTixLQUFLO3NCQU9MLEtBQUs7dUJBS0wsS0FBSzttQkFTTCxLQUFLO3VCQXNCTCxLQUFLOzhCQWlDTCxNQUFNO3FCQUVOLE1BQU07K0JBS04sTUFBTTs0QkFDTixNQUFNOzJCQUNOLE1BQU07OEJBQ04sTUFBTTsrQkFDTixNQUFNOzhCQUNOLE1BQU07NEJBQ04sTUFBTTsyQkFDTixNQUFNOzZCQUNOLE1BQU07aUNBQ04sTUFBTTs2QkFDTixNQUFNO21DQUNOLE1BQU07c0NBQ04sTUFBTTtzQkFDTixNQUFNOzhCQUNOLE1BQU07NkJBQ04sTUFBTTt5QkFDTixNQUFNOzJCQUNOLE1BQU07b0JBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMiwgUkFPTldJWiBEZXZUZWFtLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcblx0Q29tcG9uZW50LFxyXG5cdE5nWm9uZSxcclxuXHRJbnB1dCxcclxuXHRPdXRwdXQsXHJcblx0RXZlbnRFbWl0dGVyLFxyXG5cdGZvcndhcmRSZWYsXHJcblx0RWxlbWVudFJlZixcclxuXHRBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcblx0Q29udHJvbFZhbHVlQWNjZXNzb3IsXHJcblx0TkdfVkFMVUVfQUNDRVNTT1JcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBnZXRSYW9ud2l6Q29tcG9uZW50TmFtZXNwYWNlIH0gZnJvbSAncmFvbndpei1pbnRlZ3JhdGlvbnMtY29tbW9uJztcclxuXHJcbmltcG9ydCB7IFJhb25rVXBsb2FkIH0gZnJvbSAnLi9yYW9ua3VwbG9hZCc7XHJcblxyXG5kZWNsYXJlIGxldCBSQU9OS1VQTE9BRDogYW55O1xyXG5kZWNsYXJlIGxldCBSQU9OS1VwbG9hZDogYW55O1xyXG5cclxuQENvbXBvbmVudCgge1xyXG5cdHNlbGVjdG9yOiAnUmFvbmtVcGxvYWQnLFxyXG5cdHRlbXBsYXRlOiAnPG5nLXRlbXBsYXRlPjwvbmctdGVtcGxhdGU+JyxcclxuXHJcblx0cHJvdmlkZXJzOiBbXHJcblx0XHR7XHJcblx0XHRcdHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG5cdFx0XHR1c2VFeGlzdGluZzogZm9yd2FyZFJlZiggKCkgPT4gUmFvbmtVcGxvYWRDb21wb25lbnQgKSxcclxuXHRcdFx0bXVsdGk6IHRydWUsXHJcblx0XHR9XHJcblx0XVxyXG59IClcclxuXHJcbmV4cG9ydCBjbGFzcyBSYW9ua1VwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cdC8qKlxyXG5cdCAqIFRoZSBpZCBvZiB0aGUgY29tcG9uZW50XHJcblx0ICovXHJcblx0IEBJbnB1dCgpIGlkID0gXCJcIjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuXHJcblx0ICovXHJcblx0QElucHV0KCkgY29uZmlnPzogUmFvbmtVcGxvYWQuQ29uZmlnO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50IHR5cGVcclxuXHQgKi9cclxuXHQgQElucHV0KCkgY29tcG9uZW50VHlwZT0gJ1JBT05LVVBMT0FEJztcclxuXHJcblx0LyoqXHJcblx0ICogUkFPTiBLIFVwbG9hZCBzY3JpcHQgdXJsIGFkZHJlc3MuIFNjcmlwdCB3aWxsIGJlIGxvYWRlZCBvbmx5IGlmIFJBT05LVVBMT0FEIG5hbWVzcGFjZSBpcyBtaXNzaW5nLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIGNvbXBvbmVudFVybCA9ICcvcmFvbmt1cGxvYWQvanMvcmFvbmt1cGxvYWQuanMnO1xyXG5cclxuXHQvKipcclxuXHQgKiBUYWcgbmFtZSBvZiB0aGUgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogVGhlIGRlZmF1bHQgdGFnIGlzIGBkaXZgLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHRhZ05hbWUgPSAnZGl2JztcclxuXHRcclxuXHQvKipcclxuXHQgKiBUaGUgcnVudGltZXMgb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UuXHJcblx0ICovXHJcblx0QElucHV0KCkgcnVudGltZXM6IFJhb25rVXBsb2FkLlJ1bnRpbWVzID0gUmFvbmtVcGxvYWQuUnVudGltZXMuSFRNTDU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjb21wb25lbnQncyBkYXRhLlxyXG5cdCAqXHJcblx0ICogSXQncyBhbHNvIGRlY29yYXRlZCBhcyBhbiBpbnB1dCB3aGljaCBpcyB1c2VmdWwgd2hlbiBub3QgdXNpbmcgdGhlIG5nTW9kZWwuXHJcblx0ICpcclxuXHQgKiBTZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9OZ01vZGVsIHRvIGxlYXJuIG1vcmUuXHJcblx0ICovXHJcblx0QElucHV0KCkgc2V0IGRhdGEoIGRhdGE6IHN0cmluZyApIHtcclxuXHRcdGlmICggZGF0YSA9PT0gdGhpcy5fZGF0YSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5pbnN0YW5jZSApIHtcclxuXHRcdFx0Ly8gbm90IHN1cHBvcnRlZCBzZXQgZGF0YVxyXG5cdFx0XHQvLyBEYXRhIG1heSBiZSBjaGFuZ2VkIGJ5IEFDRi5cclxuXHRcdFx0dGhpcy5fZGF0YSA9IFJBT05LVVBMT0FELkdldExpc3RJbmZvKCdhcnJheScsIHRoaXMuaWQpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fZGF0YSA9IGRhdGE7XHJcblx0fVxyXG5cclxuXHRnZXQgZGF0YSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2RhdGE7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBlZGl0b3IgYmVjb21lcyB2aWV3IG1vZGUuXHJcblx0ICovXHJcblx0QElucHV0KCkgc2V0IHZpZXdNb2RlKCBpc1ZpZXdNb2RlOiBib29sZWFuICkge1xyXG5cdFx0aWYgKCB0aGlzLmluc3RhbmNlICkge1xyXG5cdFx0XHRSQU9OS1VQTE9BRC5TZXRVcGxvYWRNb2RlKCBpc1ZpZXdNb2RlPyd2aWV3JzonZWRpdCcsIHRoaXMuaWQgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERlbGF5IHNldHRpbmcgbW9kZVxyXG5cdFx0dGhpcy5fdmlld01vZGUgPSBpc1ZpZXdNb2RlO1xyXG5cdH1cclxuXHJcblx0Z2V0IHZpZXdNb2RlKCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCB0aGlzLmluc3RhbmNlICkge1xyXG5cdFx0XHRsZXQgcmV0VmFsdWU7XHJcblx0XHRcdHN3aXRjaChSQU9OS1VQTE9BRC5HZXRVcGxvYWRCeU5hbWUodGhpcy5pZCkuX2NvbmZpZy5tb2RlLnRvTG93ZXJDYXNlKCkpIHtcclxuXHRcdFx0XHRjYXNlICd1cGxvYWQnOlxyXG5cdFx0XHRcdGNhc2UgJ2VkaXQnOlxyXG5cdFx0XHRcdFx0cmV0VmFsdWUgPSBmYWxzZTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRyZXRWYWx1ZSA9IHRydWU7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRcclxuXHRcdFx0cmV0dXJuIHJldFZhbHVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl92aWV3TW9kZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZpcmVkIHdoZW4gdGhlIGNvbXBvbmVudCBuYW1lc3BhY2VcclxuXHQgKiBpcyBsb2FkZWQuIEl0IG9ubHkgdHJpZ2dlcnMgb25jZSwgbm8gbWF0dGVyIGhvdyBtYW55IGNvbXBvbmVudHMgYXJlIGluaXRpYWxpc2VkLlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKSBuYW1lc3BhY2VMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHJcblx0QE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmFvbmtVcGxvYWQuRXZlbnRJbmZvPigpO1xyXG5cdFxyXG5cdC8qKlxyXG5cdCAqIGV2ZW50LlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKSBjcmVhdGlvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxSYW9ua1VwbG9hZC5FdmVudEluZm8+KCk7XHJcblx0QE91dHB1dCgpIGJlZm9yZUFkZEZpbGUgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgYWZ0ZXJBZGRGaWxlID0gbmV3IEV2ZW50RW1pdHRlcjxSYW9ua1VwbG9hZC5FdmVudEluZm8+KCk7XHJcblx0QE91dHB1dCgpIGFmdGVyQWRkQWxsRmlsZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmFvbmtVcGxvYWQuRXZlbnRJbmZvPigpO1xyXG5cdEBPdXRwdXQoKSBiZWZvcmVEZWxldGVGaWxlID0gbmV3IEV2ZW50RW1pdHRlcjxSYW9ua1VwbG9hZC5FdmVudEluZm8+KCk7XHJcblx0QE91dHB1dCgpIGFmdGVyRGVsZXRlRmlsZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmFvbmtVcGxvYWQuRXZlbnRJbmZvPigpO1xyXG5cdEBPdXRwdXQoKSBkZWxldGVBbGxGaWxlID0gbmV3IEV2ZW50RW1pdHRlcjxSYW9ua1VwbG9hZC5FdmVudEluZm8+KCk7XHJcblx0QE91dHB1dCgpIGJlZm9yZVVwbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8UmFvbmtVcGxvYWQuRXZlbnRJbmZvPigpO1xyXG5cdEBPdXRwdXQoKSB1cGxvYWRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmFvbmtVcGxvYWQuRXZlbnRJbmZvPigpO1xyXG5cdEBPdXRwdXQoKSBiZWZvcmVEb3dubG9hZEZpbGUgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgYmVmb3JlT3BlbkZpbGUgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgZG93bmxvYWRDb21wbGV0ZUZpbGUgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgZG93bmxvYWRDb21wbGV0ZUFsbEZpbGUgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgb25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8UmFvbmtVcGxvYWQuRXZlbnRJbmZvPigpO1xyXG5cdEBPdXRwdXQoKSB1cGxvYWRpbmdDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgZG93bmxvYWRDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgc2VsZWN0SXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8UmFvbmtVcGxvYWQuRXZlbnRJbmZvPigpO1xyXG5cdEBPdXRwdXQoKSBjdXN0b21BY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHRAT3V0cHV0KCkgYWxlcnQgPSBuZXcgRXZlbnRFbWl0dGVyPFJhb25rVXBsb2FkLkV2ZW50SW5mbz4oKTtcclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBleGVjdXRlZCB3aGVuIHRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQgY2hhbmdlcy4gUGFydCBvZiB0aGVcclxuXHQgKiBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIChodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0NvbnRyb2xWYWx1ZUFjY2Vzc29yKSBpbnRlcmZhY2UuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBVbnNldCB1bmxlc3MgdGhlIGNvbXBvbmVudCB1c2VzIHRoZSBgbmdNb2RlbGAuXHJcblx0ICovXHJcblx0b25DaGFuZ2U/OiAoIGRhdGE6IHN0cmluZyApID0+IHZvaWQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgZXhlY3V0ZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGJsdXJyZWQuIFBhcnQgb2YgdGhlXHJcblx0ICogYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCAoaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Db250cm9sVmFsdWVBY2Nlc3NvcikgaW50ZXJmYWNlLlxyXG5cdCAqXHJcblx0ICogTm90ZTogVW5zZXQgdW5sZXNzIHRoZSBjb21wb25lbnQgdXNlcyB0aGUgYG5nTW9kZWxgLlxyXG5cdCAqL1xyXG5cdG9uVG91Y2hlZD86ICgpID0+IHZvaWQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGNyZWF0ZWQuXHJcblx0ICovXHJcblx0aW5zdGFuY2U6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhlIGNvbXBvbmVudCBpcyB2aWV3LW1vZGUgYmVmb3JlIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaXMgY3JlYXRlZCwgaXQgcmVtZW1iZXJzIHRoYXQgc3RhdGUsXHJcblx0ICogc28gdGhlIGNvbXBvbmVudCBjYW4gYmVjb21lIHZpZXctbW9kZSBvbmNlIGl0IGlzIHJlYWR5LlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3ZpZXdNb2RlOiBib29sZWFuID0gbnVsbDtcclxuXHJcblx0cHJpdmF0ZSBfZGF0YTogc3RyaW5nID0gbnVsbDtcclxuXHJcblx0cHJpdmF0ZSBfZGVzdHJveWVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUgKSB7fVxyXG5cclxuXHRuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHRnZXRSYW9ud2l6Q29tcG9uZW50TmFtZXNwYWNlKCB0aGlzLmNvbXBvbmVudFR5cGUsIHRoaXMuY29tcG9uZW50VXJsLCBuYW1lc3BhY2UgPT4ge1xyXG5cdFx0XHR0aGlzLm5hbWVzcGFjZUxvYWRlZC5lbWl0KCBuYW1lc3BhY2UgKTtcclxuXHRcdH0gKS50aGVuKCAobmFtZXNwYWNlKSA9PiB7XHJcblx0XHRcdC8vIENoZWNrIGlmIGNvbXBvbmVudCBpbnN0YW5jZSB3YXMgZGVzdHJveWVkIGJlZm9yZSBgbmdBZnRlclZpZXdJbml0YCBjYWxsICgjMTEwKS5cclxuXHRcdFx0Ly8gSGVyZSwgYHRoaXMuaW5zdGFuY2VgIGlzIHN0aWxsIG5vdCBpbml0aWFsaXplZCBhbmQgc28gYWRkaXRpb25hbCBmbGFnIGlzIG5lZWRlZC5cclxuXHRcdFx0aWYgKCB0aGlzLl9kZXN0cm95ZWQgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhciggdGhpcy5jcmVhdGVDb21wb25lbnQuYmluZCggdGhpcywgbmFtZXNwYWNlICkgKTtcclxuXHRcdH0gKS5jYXRjaCggd2luZG93LmNvbnNvbGUuZXJyb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoICgpID0+IHtcclxuXHRcdFx0aWYgKCB0aGlzLmluc3RhbmNlICkge1xyXG5cdFx0XHRcdGlmKFJBT05LVVBMT0FELl9FeHRlcm5hbENvbXBvbmVudE1hcC5oYXModGhpcy5pZCkpIHtcclxuXHRcdFx0XHRcdFJBT05LVVBMT0FELl9FeHRlcm5hbENvbXBvbmVudE1hcC5kZWxldGUodGhpcy5pZCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKFJBT05LVVBMT0FELl9FeHRlcm5hbEV2ZW50UmV0VmFsdWVNYXAuaGFzKHRoaXMuaWQpKSB7XHJcblx0XHRcdFx0XHRSQU9OS1VQTE9BRC5fRXh0ZXJuYWxFdmVudFJldFZhbHVlTWFwLmRlbGV0ZSh0aGlzLmlkKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0UkFPTktVUExPQUQuRGVzdHJveSh0aGlzLmlkLCB0cnVlKTtcclxuXHRcdFx0XHR0aGlzLmluc3RhbmNlID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cdH1cclxuXHJcblx0d3JpdGVWYWx1ZSggdmFsdWU6IHN0cmluZyApOiB2b2lkIHtcclxuXHRcdHRoaXMuZGF0YSA9IHZhbHVlO1xyXG5cdH1cclxuXHJcblx0cmVnaXN0ZXJPbkNoYW5nZSggY2FsbGJhY2s6ICggZGF0YTogc3RyaW5nICkgPT4gdm9pZCApOiB2b2lkIHtcclxuXHRcdHRoaXMub25DaGFuZ2UgPSBjYWxsYmFjaztcclxuXHR9XHJcblxyXG5cdHJlZ2lzdGVyT25Ub3VjaGVkKCBjYWxsYmFjazogKCkgPT4gdm9pZCApOiB2b2lkIHtcclxuXHRcdHRoaXMub25Ub3VjaGVkID0gY2FsbGJhY2s7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldENvbXBvbmVudFVuaXF1ZU5hbWUoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBcInJhb25rdXBsb2FkX1wiICsgTWF0aC5yYW5kb20oKVxyXG5cdFx0LnRvU3RyaW5nKCAzNiApXHJcblx0XHQucmVwbGFjZSggL1teYS16XSsvZywgJycgKVxyXG5cdFx0LnN1YnN0ciggMCwgNSApO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVDb21wb25lbnQobmFtZXNwYWNlKTogdm9pZCB7XHJcblx0XHRsZXQgX3VuaXF1ZU5hbWUgPSB0aGlzLmdldENvbXBvbmVudFVuaXF1ZU5hbWUoKTtcclxuXHRcdFxyXG5cdFx0KHR5cGVvZiB0aGlzLmlkID09PSAndW5kZWZpbmVkJykgJiYgKHRoaXMuaWQgPSBfdW5pcXVlTmFtZSk7XHJcblx0XHRcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0aGlzLnRhZ05hbWUgKTtcclxuXHRcdGVsZW1lbnQuaWQgPSBcImNvbXBvbmVudEhvbGRlcl9cIiArIF91bmlxdWVOYW1lO1xyXG5cdFx0dGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsZW1lbnQgKTtcclxuXHRcdFxyXG5cdFx0Ly8gdmlldyBzdGF0ZSBtYXkgY2hhbmdlIGR1cmluZyBpbnN0YW5jZSBpbml0aWFsaXphdGlvbi5cclxuXHRcdCh0aGlzLl92aWV3TW9kZSAhPT0gbnVsbCkgJiYgKHRoaXMudmlld01vZGUgPSB0aGlzLl92aWV3TW9kZSk7XHJcblxyXG5cdFx0Ly8gZGVmYXVsdCBjb25maWdcclxuXHRcdGxldCBfY29tcENvbmZpZyA9IHtcclxuXHRcdFx0SWQ6IHRoaXMuaWQsXHJcblx0XHRcdFVwbG9hZEhvbGRlcjogZWxlbWVudC5pZCxcclxuXHRcdFx0UnVudGltZXM6IHRoaXMucnVudGltZXMsXHJcblx0XHRcdE1vZGU6IHRoaXMuX3ZpZXdNb2RlID8gJ3ZpZXcnIDogJ2VkaXQnLFxyXG5cdFx0XHRFdmVudDogdGhpcy5zdWJzY3JpYmUoKVxyXG5cdFx0fTtcclxuXHJcblx0XHRfY29tcENvbmZpZyA9IG5hbWVzcGFjZS51dGlsLm9iamVjdEV4dGVuZCggdHJ1ZSwgdGhpcy5jb25maWcsIF9jb21wQ29uZmlnICk7XHJcblxyXG5cdFx0Ly8gZm9yIGV2ZW50IGNhbGxiYWNrXHJcblx0XHQodHlwZW9mIG5hbWVzcGFjZS5fRXh0ZXJuYWxDb21wb25lbnRNYXAgPT09ICd1bmRlZmluZWQnKSAmJiAobmFtZXNwYWNlLl9FeHRlcm5hbENvbXBvbmVudE1hcCA9IG5ldyBNYXAoKSk7XHJcblx0XHRuYW1lc3BhY2UuX0V4dGVybmFsQ29tcG9uZW50TWFwLnNldCh0aGlzLmlkLCB0aGlzKTtcclxuXHJcblx0XHQodHlwZW9mIG5hbWVzcGFjZS5fRXh0ZXJuYWxFdmVudFJldFZhbHVlTWFwID09PSAndW5kZWZpbmVkJykgJiYgKG5hbWVzcGFjZS5fRXh0ZXJuYWxFdmVudFJldFZhbHVlTWFwID0gbmV3IE1hcCgpKTtcclxuXHJcblx0XHR2YXIgX2NvbXBvbmVudE9iamVjdCA9IG5ldyBSQU9OS1VwbG9hZCggX2NvbXBDb25maWcgKTtcclxuXHRcdF9jb21wb25lbnRPYmplY3QubmFtZSA9IGVsZW1lbnQuaWQ7XHJcblx0XHR0aGlzLmluc3RhbmNlID0gX2NvbXBvbmVudE9iamVjdDtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc3Vic2NyaWJlKCk6IGFueSB7XHJcblx0XHRsZXQgX2NvbmZpZ0V2ZW50ID0ge307XHJcblxyXG5cdFx0Y29uc3QgQ29tcG9uZW50RXZlbnRzID0gW1xyXG5cdFx0XHQnQ3JlYXRpb25Db21wbGV0ZScsXHJcblx0XHRcdCdCZWZvcmVBZGRGaWxlJyxcclxuXHRcdFx0J0FmdGVyQWRkRmlsZScsXHJcblx0XHRcdCdBZnRlckFkZEFsbEZpbGUnLFxyXG5cdFx0XHQnQmVmb3JlRGVsZXRlRmlsZScsXHJcblx0XHRcdCdBZnRlckRlbGV0ZUZpbGUnLFxyXG5cdFx0XHQnRGVsZXRlQWxsRmlsZScsXHJcblx0XHRcdCdCZWZvcmVVcGxvYWQnLFxyXG5cdFx0XHQnVXBsb2FkQ29tcGxldGUnLFxyXG5cdFx0XHQnQmVmb3JlRG93bmxvYWRGaWxlJyxcclxuXHRcdFx0J0JlZm9yZU9wZW5GaWxlJyxcclxuXHRcdFx0J0Rvd25sb2FkQ29tcGxldGVGaWxlJyxcclxuXHRcdFx0J0Rvd25sb2FkQ29tcGxldGVBbGxGaWxlJyxcclxuXHRcdFx0J09uRXJyb3InLFxyXG5cdFx0XHQnVXBsb2FkaW5nQ2FuY2VsJyxcclxuXHRcdFx0J0Rvd25sb2FkQ2FuY2VsJyxcclxuXHRcdFx0J1NlbGVjdEl0ZW0nLFxyXG5cdFx0XHQnQ3VzdG9tQWN0aW9uJyxcclxuXHRcdFx0J0FsZXJ0J1xyXG5cdFx0XSBhcyBjb25zdDtcclxuXHJcblx0XHRDb21wb25lbnRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihldnROYW1lKSB7XHJcblx0XHRcdF9jb25maWdFdmVudFtldnROYW1lXSA9IChjb21wb25lbnROYW1lOiBhbnksIHBhcmFtT2JqOiBhbnkpID0+IHtcclxuXHRcdFx0XHQvLyBTZXQgZGVmYXVsdCB2YWx1ZVxyXG5cdFx0XHRcdHN3aXRjaChldnROYW1lKSB7XHJcblx0XHRcdFx0XHRjYXNlICdCZWZvcmVVcGxvYWQnOlxyXG5cdFx0XHRcdFx0Y2FzZSAnQmVmb3JlRG93bmxvYWRGaWxlJzpcclxuXHRcdFx0XHRcdGNhc2UgJ0JlZm9yZU9wZW5GaWxlJzpcclxuXHRcdFx0XHRcdGNhc2UgJ0JlZm9yZUFkZEZpbGUnOlxyXG5cdFx0XHRcdFx0Y2FzZSAnQmVmb3JlRGVsZXRlRmlsZSc6XHJcblx0XHRcdFx0XHRcdFJBT05LVVBMT0FELl9FeHRlcm5hbEV2ZW50UmV0VmFsdWVNYXAuc2V0KGNvbXBvbmVudE5hbWUsIHRydWUpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmKFJBT05LVVBMT0FELl9FeHRlcm5hbENvbXBvbmVudE1hcC5oYXMoY29tcG9uZW50TmFtZSkpIHtcclxuXHRcdFx0XHRcdGxldCBfdGhpcyA9IFJBT05LVVBMT0FELl9FeHRlcm5hbENvbXBvbmVudE1hcC5nZXQoY29tcG9uZW50TmFtZSk7XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdF90aGlzLm5nWm9uZS5ydW4oICgpID0+IHtcclxuXHRcdFx0XHRcdFx0c3dpdGNoKGV2dE5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXNlICdBZnRlckFkZEFsbEZpbGUnOlxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgJ0RlbGV0ZUFsbEZpbGUnOlxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBfdGhpcy5vblRvdWNoZWQgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdF90aGlzLm9uVG91Y2hlZCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSAnVXBsb2FkQ29tcGxldGUnOlxyXG5cdFx0XHRcdFx0XHRcdFx0X3RoaXMucHJvcGFnYXRlQ2hhbmdlKGV2dE5hbWUsIHsgY29tcG9uZW50TmFtZTogY29tcG9uZW50TmFtZSwgcGFyYW1PYmo6IHBhcmFtT2JqIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdF90aGlzWyBfdGhpcy5jYXBpdGFsaXplKGV2dE5hbWUpIF0uZW1pdCggeyBjb21wb25lbnROYW1lOiBjb21wb25lbnROYW1lLCBwYXJhbU9iajogcGFyYW1PYmogfSApO1xyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIFNldCBkZWZhdWx0IHZhbHVlXHJcblx0XHRcdFx0XHQvLyByZXR1cm4gZXZlbnRcclxuXHRcdFx0XHRcdGxldCBfcmV0VmFsdWUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0c3dpdGNoKGV2dE5hbWUpIHtcclxuXHRcdFx0XHRcdFx0Y2FzZSAnQmVmb3JlVXBsb2FkJzpcclxuXHRcdFx0XHRcdFx0Y2FzZSAnQmVmb3JlRG93bmxvYWRGaWxlJzpcclxuXHRcdFx0XHRcdFx0Y2FzZSAnQmVmb3JlT3BlbkZpbGUnOlxyXG5cdFx0XHRcdFx0XHRjYXNlICdCZWZvcmVBZGRGaWxlJzpcclxuXHRcdFx0XHRcdFx0Y2FzZSAnQmVmb3JlRGVsZXRlRmlsZSc6XHJcblx0XHRcdFx0XHRcdFx0aWYoUkFPTktVUExPQUQuX0V4dGVybmFsRXZlbnRSZXRWYWx1ZU1hcC5oYXMoY29tcG9uZW50TmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdF9yZXRWYWx1ZSA9IFJBT05LVVBMT0FELl9FeHRlcm5hbEV2ZW50UmV0VmFsdWVNYXAuZ2V0KGNvbXBvbmVudE5hbWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0UkFPTktVUExPQUQuX0V4dGVybmFsRXZlbnRSZXRWYWx1ZU1hcC5kZWxldGUoY29tcG9uZW50TmFtZSk7IC8vIEluaXRpYWxpemF0aW9uXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIF9yZXRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gX2NvbmZpZ0V2ZW50O1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjYXBpdGFsaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHByb3BhZ2F0ZUNoYW5nZSggZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50UGFyYW1zOiBhbnkgKTogdm9pZCB7XHJcblx0XHR0aGlzLm5nWm9uZS5ydW4oICgpID0+IHtcclxuXHRcdFx0Y29uc3QgbmV3RGF0YSA9IFJBT05LVVBMT0FELkdldExpc3RJbmZvKCdhcnJheScsIHRoaXMuaWQpO1xyXG5cdFx0XHRcclxuXHRcdFx0dGhpcy5jaGFuZ2UuZW1pdCggZXZlbnRQYXJhbXMgKTtcclxuXHJcblx0XHRcdGlmICggbmV3RGF0YSA9PT0gdGhpcy5kYXRhICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fZGF0YSA9IG5ld0RhdGE7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMub25DaGFuZ2UgKSB7XHJcblx0XHRcdFx0dGhpcy5vbkNoYW5nZSggbmV3RGF0YSApO1xyXG5cdFx0XHR9XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxufVxyXG4iXX0=