com.phloxui
Version:
PhloxUI Ng2+ Framework
316 lines (315 loc) • 30.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, ElementRef } from '@angular/core';
import { DialogService } from '../../../service/DialogService.service';
import { AbstractComponentDataLangSelector } from '../../dataview/AbstractComponentDataLangSelector';
import { LanguageButtonModel } from '../../model/LanguageButtonModel';
import { PhloxAppInfo } from '../../../component/model/PhloxAppInfo';
const /** @type {?} */ TYPE_NAME = "phx-data-lang-selector";
const /** @type {?} */ LANG_BTN_CLICK = 'languageBtnClicked';
export class DataLangSelectorPane extends AbstractComponentDataLangSelector {
/**
* @param {?} elementRef
* @param {?} dialogService
*/
constructor(elementRef, dialogService) {
super(elementRef, dialogService);
this.LANGUAGE_FIELD_NAME = PhloxAppInfo.DEFAULT_LANGUAGE_FIELD_NAME;
this.OBJECT_ID_FIELD_NAME = PhloxAppInfo.DEFAULT_OBJECT_ID_FIELD_NAME;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @return {?}
*/
getEditor() {
if (this.data !== null && typeof this.data !== 'undefined') {
if (this.data.editor !== null && typeof this.data.editor !== 'undefined') {
return this.data.editor;
}
}
return null;
}
/**
* @param {?} dataObject
* @return {?}
*/
getWrapDataObject(dataObject) {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ data = {
editor: editor,
objects: dataObject
};
return data;
}
/**
* @return {?} any as one object.
*/
getDefaultData() {
let /** @type {?} */ objects = null;
if (this.data !== null && typeof this.data !== 'undefined') {
objects = this.data.objects;
}
if (objects === null || typeof objects === 'undefined') {
return null;
}
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ langFieldName = null;
if (editor !== null) {
langFieldName = editor.getLanguageField();
}
let /** @type {?} */ oneObj = null;
if (Array.isArray(objects)) {
let /** @type {?} */ moreThanOneDef = false;
let /** @type {?} */ defObj = null;
for (let /** @type {?} */ obj of objects) {
let /** @type {?} */ lang = obj[langFieldName];
if (lang === null || typeof lang === 'undefined') {
if (defObj === null) {
defObj = obj;
}
else {
moreThanOneDef = true;
break;
}
}
}
if (!moreThanOneDef && defObj !== null && typeof defObj !== 'undefined') {
oneObj = defObj;
}
}
else {
if (objects[langFieldName] === null || typeof objects[langFieldName] === 'undefined') {
oneObj = objects;
}
}
return oneObj;
}
/**
* @return {?}
*/
getDataObjects() {
let /** @type {?} */ objects = null;
if (this.data !== null && typeof this.data !== 'undefined') {
objects = this.data.objects;
}
if (objects === null || typeof objects === 'undefined') {
return null;
}
return objects;
}
/**
* @return {?}
*/
hasModel() {
if (this.model !== null && typeof this.model !== 'undefined') {
return true;
}
return false;
}
/**
* @return {?}
*/
getModel() {
return this.model;
}
/**
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
}
/**
* @return {?}
*/
getLanguageFieldName() {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ langFieldName = (editor === null) ? null : editor.getLanguageField();
if (langFieldName !== null && typeof langFieldName !== 'undefined') {
return langFieldName;
}
return this.LANGUAGE_FIELD_NAME;
}
/**
* @return {?}
*/
getObjectIdFieldName() {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ objIdFieldName = (editor === null) ? null : editor.getObjectIdField();
if (objIdFieldName !== null && typeof objIdFieldName !== 'undefined') {
return objIdFieldName;
}
return this.OBJECT_ID_FIELD_NAME;
}
/**
* @param {?} data
* @return {?}
*/
getInstanceDefaultData(data) {
return this.getWrapDataObject([data]);
}
/**
* @param {?} data
* @return {?}
*/
getInstanceDataLanguage(data) {
return this.getWrapDataObject([data]);
}
/**
* @return {?} any as object in pattern {iconURL: string, code: string, label: string}
*/
getLanguageList() {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ languageList = [];
if (editor !== null) {
let /** @type {?} */ setting = editor.getAppSetting();
if (setting !== null && typeof setting !== 'undefined') {
let /** @type {?} */ defaultLangs = setting.DEFAULT_DATA_LANGUAGES;
if (defaultLangs !== null && typeof defaultLangs !== 'undefined' && Array.isArray(defaultLangs)) {
for (let /** @type {?} */ lang of defaultLangs) {
languageList.push(lang.code);
}
}
}
}
return languageList;
}
/**
* @param {?} defaultData
* @return {?}
*/
loadDataLanguageList(defaultData) {
return new Promise((resolve, reject) => {
let /** @type {?} */ editor = this.getEditor();
if (editor !== null) {
let /** @type {?} */ langProm = editor.getLanguageList(defaultData);
if (langProm !== null && typeof langProm !== 'undefined') {
langProm.then((result) => {
let /** @type {?} */ tempArray = [];
if (result !== null && typeof result !== 'undefined') {
if (Array.isArray(result)) {
tempArray = result;
}
else {
tempArray.push(result);
}
}
resolve(tempArray);
});
}
}
else {
resolve([]);
}
});
}
/**
* when new language was created this method will be called
* @param {?} newLangData as any
* @return {?}
*/
onLanguageAdded(newLangData) {
if (newLangData !== null && typeof newLangData !== 'undefined') {
// do sth here
}
// this.data.objects.push(newLangData);
}
/**
* when language was removed this method will be called
* @param {?} deletedData as any
* @return {?}
*/
onLanguageRemoved(deletedData) {
// do sth
}
/**
* @param {?} langCode
* @return {?}
*/
parseLanguageButtonModel(langCode) {
return new LanguageButtonModel('', langCode, 'label');
}
}
DataLangSelectorPane.TYPE_NAME = TYPE_NAME;
DataLangSelectorPane.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-data-lang-selector">
<div class="wrapper left" [class.expand]="!hasLanguage()">
<div class="component-pane">
<!-- default -->
<div class="component-wrapper" [class.show]="_isSelectedLanguageByIndex(null)">
<phx-component-wrapper *ngIf="hasModel()" [type]="getModel().tabComponentType" [model]="getModel().tabComponentModel"
[handler]="getDefaultComponentHandler()" [data]="getDefaultData()" [dataParent]="this"></phx-component-wrapper>
</div>
<!-- by lang -->
<ng-template ngFor let-item [ngForOf]="_getDataLangList()" let-i="index">
<div class="component-wrapper" [class.show]="_isSelectedLanguageByIndex(i)">
<ng-template [ngIf]="item !== null && item !== undefined">
<phx-component-wrapper *ngIf="hasModel()" [type]="getModel().tabComponentType" [model]="getModel().tabComponentModel"
[handler]="getComponentHandler()" [setting]="getComponentSetting(i)" [data]="item" [dataParent]="this"></phx-component-wrapper>
</ng-template>
</div>
</ng-template>
</div>
</div>
<div class="wrapper right" [class.hide]="!hasLanguage()">
<div class="lang-pane">
<div class="language-btn default data" [class.selected]="isSelectedLanguage(null)" [class.dirty]="_isDataDirtyByIndex(null)"
(click)="onActionBtnClicked($event, null, undefined)">
<div class="table-wrapper fluid">
<div class="table-cell-wrapper middle">
Default
</div>
</div>
</div>
<div *ngFor="let item of getMergedLanguageList(); let i = index" class="language-btn" [class.data]="_langHasDataByIndex(i)"
[class.dirty]="_isDataDirtyByIndex(i)"
[class.selected]="isSelectedLanguage(item)" (click)="onActionBtnClicked($event, item, i)">
<div class="table-wrapper fluid">
<div class="table-cell-wrapper middle">
<div *ngIf="!_hasButtonIcon(item)">{{item.code}}</div>
<div *ngIf="_hasButtonIcon(item)">
<img src="{{item.iconURL}}">
</div>
</div>
</div>
</div>
<div class="mocking-btn"></div>
</div>
</div>
</div>
`
},] },
];
/** @nocollapse */
DataLangSelectorPane.ctorParameters = () => [
{ type: ElementRef, },
{ type: DialogService, },
];
function DataLangSelectorPane_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
DataLangSelectorPane.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
DataLangSelectorPane.ctorParameters;
/** @type {?} */
DataLangSelectorPane.TYPE_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.LANGUAGE_FIELD_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.OBJECT_ID_FIELD_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.model;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUxhbmdTZWxlY3RvclBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2VkaXRvci9lZGl0b3IuaW50ZXJuYWwvRGF0YUxhbmdTZWxlY3RvclBhbmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF5QixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBSXJHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUlyRSx1QkFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUM7QUFFbkQsdUJBQU0sY0FBYyxHQUFXLG9CQUFvQixDQUFDO0FBc0RwRCxNQUFNLDJCQUE0QixTQUFRLGlDQUFpQzs7Ozs7SUFRekUsWUFBWSxVQUFzQixFQUFFLGFBQTRCO1FBQzlELEtBQUssQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7bUNBTEcsWUFBWSxDQUFDLDJCQUEyQjtvQ0FDdkMsWUFBWSxDQUFDLDRCQUE0QjtLQUsvRTs7OztJQUVNLFFBQVE7UUFDYixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Ozs7O0lBR1gsU0FBUztRQUNmLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFL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QUFnQjs7Ozs7OztJQUlsQyx3QkFBd0IsQ0FBQyxRQUFnQjtRQUM5QyxNQUFNLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDOzs7aUNBL01iLFNBQVM7O1lBcERyRCxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNuQixRQUFRLEVBQUUsU0FBUztnQkFDbkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2Q1g7YUFDQTs7OztZQW5FMEMsVUFBVTtZQUM1QyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL0RpYWxvZ1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdERhdGFFZGl0b3IgfSBmcm9tICcuLi9BYnN0cmFjdERhdGFFZGl0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RDb21wb25lbnREYXRhTGFuZ1NlbGVjdG9yIH0gZnJvbSAnLi4vLi4vZGF0YXZpZXcvQWJzdHJhY3RDb21wb25lbnREYXRhTGFuZ1NlbGVjdG9yJztcblxuaW1wb3J0IHsgSUhhc01vZGVsIH0gZnJvbSAnLi4vLi4vSUhhc01vZGVsJztcbmltcG9ydCB7IERhdGFMYW5nU2VsZWN0b3JNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0RhdGFMYW5nU2VsZWN0b3JNb2RlbCc7XG5pbXBvcnQgeyBMYW5ndWFnZUJ1dHRvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvTGFuZ3VhZ2VCdXR0b25Nb2RlbCc7XG5pbXBvcnQgeyBQaGxveEFwcEluZm8gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnQvbW9kZWwvUGhsb3hBcHBJbmZvJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LWRhdGEtbGFuZy1zZWxlY3RvclwiO1xuXG5jb25zdCBMQU5HX0JUTl9DTElDSzogc3RyaW5nID0gJ2xhbmd1YWdlQnRuQ2xpY2tlZCc7XG5cbi8vIHVzZSBtYXRlcmlhbCBEYXRhTGFuZ1NlbGVjdG9yUGFuZSBpbnN0YWRlID8/IChTaG91bGQgd2UgZGVsZXRlIHRoaXMgY29tcG9uZW50KVxuLy8gdHJ5IHRvIGZpbmQgaWYgbm8gY29tcG9uZW50IHVzZVxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1kYXRhLWxhbmctc2VsZWN0b3JcIj5cblx0PGRpdiBjbGFzcz1cIndyYXBwZXIgbGVmdFwiIFtjbGFzcy5leHBhbmRdPVwiIWhhc0xhbmd1YWdlKClcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXBhbmVcIj5cblx0XHRcdDwhLS0gZGVmYXVsdCAtLT5cblx0XHRcdDxkaXYgY2xhc3M9XCJjb21wb25lbnQtd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cIl9pc1NlbGVjdGVkTGFuZ3VhZ2VCeUluZGV4KG51bGwpXCI+XG5cdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgKm5nSWY9XCJoYXNNb2RlbCgpXCIgW3R5cGVdPVwiZ2V0TW9kZWwoKS50YWJDb21wb25lbnRUeXBlXCIgW21vZGVsXT1cImdldE1vZGVsKCkudGFiQ29tcG9uZW50TW9kZWxcIlxuXHRcdFx0XHRcdFtoYW5kbGVyXT1cImdldERlZmF1bHRDb21wb25lbnRIYW5kbGVyKClcIiBbZGF0YV09XCJnZXREZWZhdWx0RGF0YSgpXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8IS0tIGJ5IGxhbmcgLS0+XG5cdFx0XHQ8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwiX2dldERhdGFMYW5nTGlzdCgpXCIgbGV0LWk9XCJpbmRleFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXdyYXBwZXJcIiBbY2xhc3Muc2hvd109XCJfaXNTZWxlY3RlZExhbmd1YWdlQnlJbmRleChpKVwiPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IHVuZGVmaW5lZFwiPlxuXHRcdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciAqbmdJZj1cImhhc01vZGVsKClcIiBbdHlwZV09XCJnZXRNb2RlbCgpLnRhYkNvbXBvbmVudFR5cGVcIiBbbW9kZWxdPVwiZ2V0TW9kZWwoKS50YWJDb21wb25lbnRNb2RlbFwiXG5cdFx0XHRcdFx0XHRcdFtoYW5kbGVyXT1cImdldENvbXBvbmVudEhhbmRsZXIoKVwiIFtzZXR0aW5nXT1cImdldENvbXBvbmVudFNldHRpbmcoaSlcIiBbZGF0YV09XCJpdGVtXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJ3cmFwcGVyIHJpZ2h0XCIgW2NsYXNzLmhpZGVdPVwiIWhhc0xhbmd1YWdlKClcIj5cblx0XHQ8ZGl2IGNsYXNzPVwibGFuZy1wYW5lXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UtYnRuIGRlZmF1bHQgZGF0YVwiIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkTGFuZ3VhZ2UobnVsbClcIiBbY2xhc3MuZGlydHldPVwiX2lzRGF0YURpcnR5QnlJbmRleChudWxsKVwiXG5cdFx0XHRcdChjbGljayk9XCJvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50LCBudWxsLCB1bmRlZmluZWQpXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGZsdWlkXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHRcdFx0XHRcdERlZmF1bHRcblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TWVyZ2VkTGFuZ3VhZ2VMaXN0KCk7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImxhbmd1YWdlLWJ0blwiIFtjbGFzcy5kYXRhXT1cIl9sYW5nSGFzRGF0YUJ5SW5kZXgoaSlcIlxuXHRcdFx0XHRbY2xhc3MuZGlydHldPVwiX2lzRGF0YURpcnR5QnlJbmRleChpKVwiXG5cdFx0XHRcdFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkTGFuZ3VhZ2UoaXRlbSlcIiAoY2xpY2spPVwib25BY3Rpb25CdG5DbGlja2VkKCRldmVudCwgaXRlbSwgaSlcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXIgZmx1aWRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cIiFfaGFzQnV0dG9uSWNvbihpdGVtKVwiPnt7aXRlbS5jb2RlfX08L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgKm5nSWY9XCJfaGFzQnV0dG9uSWNvbihpdGVtKVwiPlxuXHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cInt7aXRlbS5pY29uVVJMfX1cIj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz1cIm1vY2tpbmctYnRuXCI+PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIERhdGFMYW5nU2VsZWN0b3JQYW5lIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnREYXRhTGFuZ1NlbGVjdG9yIGltcGxlbWVudHMgT25Jbml0LCBJSGFzTW9kZWwge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgcHJpdmF0ZSBMQU5HVUFHRV9GSUVMRF9OQU1FOiBzdHJpbmcgPSBQaGxveEFwcEluZm8uREVGQVVMVF9MQU5HVUFHRV9GSUVMRF9OQU1FO1xuICBwcml2YXRlIE9CSkVDVF9JRF9GSUVMRF9OQU1FOiBzdHJpbmcgPSBQaGxveEFwcEluZm8uREVGQVVMVF9PQkpFQ1RfSURfRklFTERfTkFNRTtcbiAgcHJpdmF0ZSBtb2RlbDogRGF0YUxhbmdTZWxlY3Rvck1vZGVsO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHtcbiAgICBzdXBlcihlbGVtZW50UmVmLCBkaWFsb2dTZXJ2aWNlKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFZGl0b3IoKTogQWJzdHJhY3REYXRhRWRpdG9yIHtcbiAgICBpZiAodGhpcy5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5kYXRhLmVkaXRvciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5kYXRhLmVkaXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5lZGl0b3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXcmFwRGF0YU9iamVjdChkYXRhT2JqZWN0OiBhbnlbXSk6IGFueSB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICBlZGl0b3I6IGVkaXRvcixcbiAgICAgIG9iamVjdHM6IGRhdGFPYmplY3RcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGRhdGEgYXMgYW55XG4gICAqIEByZXR1cm4gYW55IGFzIG9uZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdERhdGEoKTogYW55IHtcbiAgICBsZXQgb2JqZWN0cyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvYmplY3RzID0gdGhpcy5kYXRhLm9iamVjdHM7XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdHMgPT09IG51bGwgfHwgdHlwZW9mIG9iamVjdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3IoKTtcbiAgICBsZXQgbGFuZ0ZpZWxkTmFtZSA9IG51bGw7XG4gICAgaWYgKGVkaXRvciAhPT0gbnVsbCkge1xuICAgICAgbGFuZ0ZpZWxkTmFtZSA9IGVkaXRvci5nZXRMYW5ndWFnZUZpZWxkKCk7XG4gICAgfVxuICAgIGxldCBvbmVPYmogPSBudWxsO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdHMpKSB7XG4gICAgICBsZXQgbW9yZVRoYW5PbmVEZWY6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGxldCBkZWZPYmogPSBudWxsO1xuICAgICAgZm9yIChsZXQgb2JqIG9mIG9iamVjdHMpIHtcbiAgICAgICAgbGV0IGxhbmcgPSBvYmpbbGFuZ0ZpZWxkTmFtZV07XG4gICAgICAgIGlmIChsYW5nID09PSBudWxsIHx8IHR5cGVvZiBsYW5nID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChkZWZPYmogPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlZk9iaiA9IG9iajtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW9yZVRoYW5PbmVEZWYgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghbW9yZVRoYW5PbmVEZWYgJiYgZGVmT2JqICE9PSBudWxsICYmIHR5cGVvZiBkZWZPYmogIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9uZU9iaiA9IGRlZk9iajtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9iamVjdHNbbGFuZ0ZpZWxkTmFtZV0gPT09IG51bGwgfHwgdHlwZW9mIG9iamVjdHNbbGFuZ0ZpZWxkTmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9uZU9iaiA9IG9iamVjdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9uZU9iajtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhT2JqZWN0cygpOiBhbnlbXSB7XG4gICAgbGV0IG9iamVjdHMgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgb2JqZWN0cyA9IHRoaXMuZGF0YS5vYmplY3RzO1xuICAgIH1cblxuICAgIGlmIChvYmplY3RzID09PSBudWxsIHx8IHR5cGVvZiBvYmplY3RzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cblxuICBwdWJsaWMgaGFzTW9kZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYW5ndWFnZUZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGxldCBsYW5nRmllbGROYW1lID0gKGVkaXRvciA9PT0gbnVsbCkgPyBudWxsIDogZWRpdG9yLmdldExhbmd1YWdlRmllbGQoKTtcblxuICAgIGlmIChsYW5nRmllbGROYW1lICE9PSBudWxsICYmIHR5cGVvZiBsYW5nRmllbGROYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGxhbmdGaWVsZE5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuTEFOR1VBR0VfRklFTERfTkFNRTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPYmplY3RJZEZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGxldCBvYmpJZEZpZWxkTmFtZSA9IChlZGl0b3IgPT09IG51bGwpID8gbnVsbCA6IGVkaXRvci5nZXRPYmplY3RJZEZpZWxkKCk7XG4gICAgaWYgKG9iaklkRmllbGROYW1lICE9PSBudWxsICYmIHR5cGVvZiBvYmpJZEZpZWxkTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBvYmpJZEZpZWxkTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5PQkpFQ1RfSURfRklFTERfTkFNRTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbnN0YW5jZURlZmF1bHREYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JhcERhdGFPYmplY3QoW2RhdGFdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbnN0YW5jZURhdGFMYW5ndWFnZShkYXRhOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFdyYXBEYXRhT2JqZWN0KFtkYXRhXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGRhdGEgYXMgYW55XG4gICAqIEByZXR1cm4gYW55IGFzIG9iamVjdCBpbiBwYXR0ZXJuIHtpY29uVVJMOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgbGFiZWw6IHN0cmluZ31cbiAgICovXG4gIHB1YmxpYyBnZXRMYW5ndWFnZUxpc3QoKTogc3RyaW5nW10ge1xuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuXG4gICAgbGV0IGxhbmd1YWdlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoZWRpdG9yICE9PSBudWxsKSB7XG4gICAgICBsZXQgc2V0dGluZyA9IGVkaXRvci5nZXRBcHBTZXR0aW5nKCk7XG5cbiAgICAgIGlmIChzZXR0aW5nICE9PSBudWxsICYmIHR5cGVvZiBzZXR0aW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgZGVmYXVsdExhbmdzID0gc2V0dGluZy5ERUZBVUxUX0RBVEFfTEFOR1VBR0VTO1xuICAgICAgICBpZiAoZGVmYXVsdExhbmdzICE9PSBudWxsICYmIHR5cGVvZiBkZWZhdWx0TGFuZ3MgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdExhbmdzKSkge1xuICAgICAgICAgIGZvciAobGV0IGxhbmcgb2YgZGVmYXVsdExhbmdzKSB7XG4gICAgICAgICAgICBsYW5ndWFnZUxpc3QucHVzaChsYW5nLmNvZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYW5ndWFnZUxpc3Q7XG4gIH1cblxuICBwdWJsaWMgbG9hZERhdGFMYW5ndWFnZUxpc3QoZGVmYXVsdERhdGE6IGFueSk6IFByb21pc2U8YW55W10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgICBpZiAoZWRpdG9yICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBsYW5nUHJvbSA9IGVkaXRvci5nZXRMYW5ndWFnZUxpc3QoZGVmYXVsdERhdGEpO1xuICAgICAgICBpZiAobGFuZ1Byb20gIT09IG51bGwgJiYgdHlwZW9mIGxhbmdQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxhbmdQcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRlbXBBcnJheSA9IFtdO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5ID0gcmVzdWx0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheS5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUodGVtcEFycmF5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogd2hlbiBuZXcgbGFuZ3VhZ2Ugd2FzIGNyZWF0ZWQgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWRcbiAgICogQHBhcmFtIG5ld0xhbmdEYXRhIGFzIGFueVxuICAgKi9cbiAgcHVibGljIG9uTGFuZ3VhZ2VBZGRlZChuZXdMYW5nRGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKG5ld0xhbmdEYXRhICE9PSBudWxsICYmIHR5cGVvZiBuZXdMYW5nRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGRvIHN0aCBoZXJlXG4gICAgfVxuICAgIC8vICAgICAgICB0aGlzLmRhdGEub2JqZWN0cy5wdXNoKG5ld0xhbmdEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAqIHdoZW4gbGFuZ3VhZ2Ugd2FzIHJlbW92ZWQgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWRcbiAgKiBAcGFyYW0gZGVsZXRlZERhdGEgYXMgYW55XG4gICovXG4gIHB1YmxpYyBvbkxhbmd1YWdlUmVtb3ZlZChkZWxldGVkRGF0YTogYW55KTogdm9pZCB7XG4gICAgLy8gZG8gc3RoXG4gIH1cblxuICBwdWJsaWMgcGFyc2VMYW5ndWFnZUJ1dHRvbk1vZGVsKGxhbmdDb2RlOiBzdHJpbmcpOiBMYW5ndWFnZUJ1dHRvbk1vZGVsIHtcbiAgICByZXR1cm4gbmV3IExhbmd1YWdlQnV0dG9uTW9kZWwoJycsIGxhbmdDb2RlLCAnbGFiZWwnKTtcbiAgfVxufVxuIl19