UNPKG

@lunaeme/circe-core

Version:
249 lines 37.3 kB
import { __decorate, __values } from "tslib"; import { Injectable } from '@angular/core'; import { ccElementFields, ccHashTypes } from '../_types/element.types'; export var boxModelTypeConstants = { HORIZONTAL: 'horizontal', VERTICAL: 'vertical' }; var BoxModelService = /** @class */ (function () { function BoxModelService() { this._defaultBoxModelType = boxModelTypeConstants.VERTICAL; this._defaultElementHashType = ccHashTypes.class; this._defaultComputedStylePropertyProcessed = false; this._allowCssUnits = ['px', '%']; this._additionHorizontalInsideClasses = ['padding-left', 'padding-right', 'border-left-width', 'border-right-width']; this._additionHorizontalOutsideClasses = ['margin-left', 'margin-right']; this._additionVerticalInsideClasses = ['padding-top', 'padding-bottom', 'border-top-width', 'border-bottom-width']; this._additionVerticalOutsideClasses = ['margin-top', 'margin-bottom']; this._fontSizeRule = { applyOnElements: ['i'], boxModelType: boxModelTypeConstants.HORIZONTAL }; } BoxModelService_1 = BoxModelService; /** * _isElementHash * * @description * Checks if element given param is ElementHash type. */ BoxModelService._isElementHash = function (element) { return !!(typeof element === 'object' && ccElementFields.type in element && ccElementFields.name in element && (Object.keys(element).length === 2 || Object.keys(element).length === 3)); }; /** * _isElementQuery * * @description * Checks if element given param is ElementQuery type. */ BoxModelService._isElementQuery = function (element) { return !!(typeof element === 'object' && ccElementFields.query in element && (Object.keys(element).length === 1 || Object.keys(element).length === 2)); }; /** * _isNativeDomElement * * @description * Checks if element given param is a native DOM element. */ BoxModelService._isNativeDomElement = function (param) { var _paramsToCheck = [ 'getBoundingClientRect', 'getElementsByClassName', 'getElementsByTagName', 'querySelector' ]; return (!!param) ? (_paramsToCheck.map(function (e) { return e in param; })).every(function (el) { return !!el; }) : false; }; /** * _convertToElementIdArray * * @description * Transform elementId type to array of Dom elements. */ BoxModelService.prototype._convertToElementIdArray = function (elementId) { var e_1, _a; var _auxArgument = []; var _elementId = (Array.isArray(elementId)) ? elementId : [elementId]; try { for (var _elementId_1 = __values(_elementId), _elementId_1_1 = _elementId_1.next(); !_elementId_1_1.done; _elementId_1_1 = _elementId_1.next()) { var element = _elementId_1_1.value; _auxArgument.push(this.getElement(element)); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_elementId_1_1 && !_elementId_1_1.done && (_a = _elementId_1.return)) _a.call(_elementId_1); } finally { if (e_1) throw e_1.error; } } return _auxArgument; }; BoxModelService.prototype._getElementAdditions = function (element, boxModelType) { var _this = this; var _type = boxModelType || this._defaultBoxModelType; var _elementStyle = window.getComputedStyle(element); var _output = { boxModelAdditionInside: 0, boxModelAdditionOutside: 0 }; var _auxOutputInside = []; var _auxOutputOutside = []; if (_type === boxModelTypeConstants.HORIZONTAL) { this._additionHorizontalInsideClasses.forEach(function (e) { _auxOutputInside.push(_elementStyle.getPropertyValue(e)); }); this._additionHorizontalOutsideClasses.forEach(function (e) { _auxOutputOutside.push(_elementStyle.getPropertyValue(e)); }); } else { this._additionVerticalInsideClasses.forEach(function (e) { _auxOutputInside.push(_elementStyle.getPropertyValue(e)); }); this._additionVerticalOutsideClasses.forEach(function (e) { _auxOutputOutside.push(_elementStyle.getPropertyValue(e)); }); } _auxOutputInside.forEach(function (el) { if (el !== '0px') { _output.boxModelAdditionInside += _this.readCssUnits(el).value; } }); _auxOutputOutside.forEach(function (el) { if (el !== '0px') { _output.boxModelAdditionOutside += _this.readCssUnits(el).value; } }); return _output; }; BoxModelService.prototype.getComputedStyleProperty = function (element, property, processed) { var _processed = processed || this._defaultComputedStylePropertyProcessed; var _elementComputedStyles = window.getComputedStyle(element); var _output = _elementComputedStyles.getPropertyValue(property); if (_output && _processed) { return this.readCssUnits(_output); } return _output; }; BoxModelService.prototype.processElementForSpecialRules = function (element) { if (this._fontSizeRule.applyOnElements.includes(element.tagName.toLowerCase())) { var _elementBoxModel = this.getBoxModel(element, boxModelTypeConstants.HORIZONTAL); var _elementFontSize = this.getComputedStyleProperty(element, 'font-size', true); if (_elementBoxModel.boxModelExtractedInside !== _elementFontSize.value) { element.style.width = _elementFontSize.value + "px"; return element; } } return element; }; BoxModelService.prototype.readCssUnits = function (expression) { var _output = { value: 0, unit: '' }; this._allowCssUnits.forEach(function (e) { if (expression.includes(e)) { _output.unit = e; var _aux = expression.split(e).filter(function (el) { return !!el; }); if (_aux.length === 1) { _output.value = Number(_aux[0]); } return; } }); return (_output.value && _output.unit) ? _output : null; }; BoxModelService.prototype.processSizeString = function (sizeString) { var _output = { with: null, height: null }; if (sizeString) { var _auxSize = sizeString.split(' '); if (_auxSize.length === 1) { var _cssUnit = this.readCssUnits(_auxSize[0]); _output.with = _cssUnit; _output.height = _cssUnit; } else if (_auxSize.length === 2) { _output.height = this.readCssUnits(_auxSize[0]); _output.with = this.readCssUnits(_auxSize[1]); } } return (_output.with && _output.height) ? _output : null; }; /** * getElement * * @description * Returns an element DOM native object from different types of given params. */ BoxModelService.prototype.getElement = function (element) { var _output = element; var _element = element; var _shadowElement = document; if (typeof element === 'string') { _element = { type: this._defaultElementHashType, name: element }; } else { if (ccElementFields.shadowElement in _element) { _shadowElement = this.getElement(_element.shadowElement); } } if (!BoxModelService_1._isNativeDomElement(_element)) { if (BoxModelService_1._isElementHash(_element)) { switch (_element.type) { case ccHashTypes.class: _output = _shadowElement.getElementsByClassName(_element.name).item(0); break; case ccHashTypes.tag: _output = _shadowElement.getElementsByTagName(_element.name).item(0); break; case ccHashTypes.id: _output = document.getElementById(_element.name); break; } } else if (BoxModelService_1._isElementQuery(_element)) { _output = _shadowElement.querySelector(_element.query); } } if (!BoxModelService_1._isNativeDomElement(_output)) { throw new Error('BoxModel.getElement: Unrecognizable element.'); } return _output; }; BoxModelService.prototype.getBoxModel = function (elementId, boxModelType) { var _this = this; var _output = { type: boxModelType || this._defaultBoxModelType, boxModel: 0, boxModelAdditions: 0, boxModelAggregated: 0, boxModelExtracted: 0, boxModelAdditionsInside: 0, boxModelAdditionsOutside: 0, boxModelAggregatedInside: 0, boxModelAggregatedOutside: 0, boxModelExtractedInside: 0, boxModelExtractedOutside: 0 }; var _elementId = this._convertToElementIdArray(elementId); _elementId.forEach(function (e) { var _elementRect = e.getBoundingClientRect(); var _additions = _this._getElementAdditions(e, _output.type); _output.boxModel += (_output.type === boxModelTypeConstants.HORIZONTAL) ? _elementRect.width : _elementRect.height; _output.boxModelAdditions += _additions.boxModelAdditionInside + _additions.boxModelAdditionOutside; _output.boxModelAdditionsInside += _additions.boxModelAdditionInside; _output.boxModelAdditionsOutside += _additions.boxModelAdditionOutside; }); _output.boxModelAggregated = _output.boxModel + _output.boxModelAdditions; _output.boxModelExtracted = _output.boxModel - _output.boxModelAdditions; _output.boxModelAggregatedInside = _output.boxModel + _output.boxModelAdditionsInside; _output.boxModelAggregatedOutside = _output.boxModel + _output.boxModelAdditionsOutside; _output.boxModelExtractedInside = _output.boxModel - _output.boxModelAdditionsInside; _output.boxModelExtractedOutside = _output.boxModel - _output.boxModelAdditionsOutside; return _output; }; var BoxModelService_1; BoxModelService = BoxModelService_1 = __decorate([ Injectable() ], BoxModelService); return BoxModelService; }()); export { BoxModelService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LW1vZGVsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHVuYWVtZS9jaXJjZS1jb3JlLyIsInNvdXJjZXMiOlsibGliL2JveC1tb2RlbC9ib3gtbW9kZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWEsZUFBZSxFQUE2QyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQXVDNUgsTUFBTSxDQUFDLElBQU0scUJBQXFCLEdBQUc7SUFDbkMsVUFBVSxFQUFFLFlBQTRCO0lBQ3hDLFFBQVEsRUFBRSxVQUEwQjtDQUNyQyxDQUFDO0FBRVk7SUFlWjtRQUNFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUM7UUFFM0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFFakQsSUFBSSxDQUFDLHNDQUFzQyxHQUFHLEtBQUssQ0FBQztRQUVwRCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUMsaUNBQWlDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLDhCQUE4QixHQUFHLENBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDbkgsSUFBSSxDQUFDLCtCQUErQixHQUFHLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxZQUFZLEVBQUUscUJBQXFC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d0IsQ0FBQztRQUN2RixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOztJQXhQd0IsZUFBZTtRQUF6QyxVQUFVLEVBQUU7T0FBYyxlQUFlLENBeVB6QztJQUFELHNCQUFDO0NBQUEsQUF6UGEsSUF5UGI7U0F6UDBCLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDY0VsZW1lbnQsIGNjRWxlbWVudEZpZWxkcywgQ2NFbGVtZW50SGFzaCwgQ2NFbGVtZW50UXVlcnksIENjSGFzaFR5cGUsIGNjSGFzaFR5cGVzfSBmcm9tICcuLi9fdHlwZXMvZWxlbWVudC50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZU9iamVjdCB7XG4gIHdpdGg6IFByb2Nlc3NlZFVuaXRPYmplY3Q7XG4gIGhlaWdodDogUHJvY2Vzc2VkVW5pdE9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzZWRVbml0T2JqZWN0IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50SWQgPSBDY0VsZW1lbnQgfCBBcnJheTxDY0VsZW1lbnQ+O1xuXG5leHBvcnQgdHlwZSBCb3hNb2RlbFR5cGUgPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuZXhwb3J0IGludGVyZmFjZSBCb3hNb2RlbFN3YXBPYmplY3Qge1xuICB0eXBlOiBCb3hNb2RlbFR5cGU7XG4gIGJveE1vZGVsOiBudW1iZXI7XG4gIGJveE1vZGVsQWRkaXRpb25zOiBudW1iZXI7XG4gIGJveE1vZGVsQWdncmVnYXRlZDogbnVtYmVyO1xuICBib3hNb2RlbEV4dHJhY3RlZDogbnVtYmVyO1xuICBib3hNb2RlbEFkZGl0aW9uc0luc2lkZTogbnVtYmVyO1xuICBib3hNb2RlbEFkZGl0aW9uc091dHNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxBZ2dyZWdhdGVkSW5zaWRlOiBudW1iZXI7XG4gIGJveE1vZGVsQWdncmVnYXRlZE91dHNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxFeHRyYWN0ZWRPdXRzaWRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm94TW9kZWxBZGRpdGlvbk9iamVjdCB7XG4gIGJveE1vZGVsQWRkaXRpb25JbnNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxBZGRpdGlvbk91dHNpZGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGVjaWFsUnVsZU9iamVjdCB7XG4gIGFwcGx5T25FbGVtZW50czogQXJyYXk8c3RyaW5nPjtcbiAgYm94TW9kZWxUeXBlOiBCb3hNb2RlbFR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBib3hNb2RlbFR5cGVDb25zdGFudHMgPSB7XG4gIEhPUklaT05UQUw6ICdob3Jpem9udGFsJyBhcyBCb3hNb2RlbFR5cGUsXG4gIFZFUlRJQ0FMOiAndmVydGljYWwnIGFzIEJveE1vZGVsVHlwZVxufTtcblxuQEluamVjdGFibGUoKSBleHBvcnQgY2xhc3MgQm94TW9kZWxTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEJveE1vZGVsVHlwZTogQm94TW9kZWxUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRFbGVtZW50SGFzaFR5cGU6IENjSGFzaFR5cGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdENvbXB1dGVkU3R5bGVQcm9wZXJ0eVByb2Nlc3NlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxvd0Nzc1VuaXRzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGRpdGlvbkhvcml6b250YWxJbnNpZGVDbGFzc2VzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGRpdGlvbkhvcml6b250YWxPdXRzaWRlQ2xhc3NlczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWRkaXRpb25WZXJ0aWNhbEluc2lkZUNsYXNzZXM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkZGl0aW9uVmVydGljYWxPdXRzaWRlQ2xhc3NlczogQXJyYXk8c3RyaW5nPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mb250U2l6ZVJ1bGU6IFNwZWNpYWxSdWxlT2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2RlZmF1bHRCb3hNb2RlbFR5cGUgPSBib3hNb2RlbFR5cGVDb25zdGFudHMuVkVSVElDQUw7XG5cbiAgICB0aGlzLl9kZWZhdWx0RWxlbWVudEhhc2hUeXBlID0gY2NIYXNoVHlwZXMuY2xhc3M7XG5cbiAgICB0aGlzLl9kZWZhdWx0Q29tcHV0ZWRTdHlsZVByb3BlcnR5UHJvY2Vzc2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9hbGxvd0Nzc1VuaXRzID0gWydweCcsICclJ107XG4gICAgdGhpcy5fYWRkaXRpb25Ib3Jpem9udGFsSW5zaWRlQ2xhc3NlcyA9IFsncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmctcmlnaHQnLCAnYm9yZGVyLWxlZnQtd2lkdGgnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJ107XG4gICAgdGhpcy5fYWRkaXRpb25Ib3Jpem9udGFsT3V0c2lkZUNsYXNzZXMgPSBbJ21hcmdpbi1sZWZ0JywgJ21hcmdpbi1yaWdodCddO1xuICAgIHRoaXMuX2FkZGl0aW9uVmVydGljYWxJbnNpZGVDbGFzc2VzID0gWydwYWRkaW5nLXRvcCcsICdwYWRkaW5nLWJvdHRvbScsICdib3JkZXItdG9wLXdpZHRoJywgJ2JvcmRlci1ib3R0b20td2lkdGgnXTtcbiAgICB0aGlzLl9hZGRpdGlvblZlcnRpY2FsT3V0c2lkZUNsYXNzZXMgPSBbJ21hcmdpbi10b3AnLCAnbWFyZ2luLWJvdHRvbSddO1xuXG4gICAgdGhpcy5fZm9udFNpemVSdWxlID0geyBhcHBseU9uRWxlbWVudHM6IFsnaSddLCBib3hNb2RlbFR5cGU6IGJveE1vZGVsVHlwZUNvbnN0YW50cy5IT1JJWk9OVEFMIH07XG4gIH1cblxuICAvKipcbiAgICogX2lzRWxlbWVudEhhc2hcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENoZWNrcyBpZiBlbGVtZW50IGdpdmVuIHBhcmFtIGlzIEVsZW1lbnRIYXNoIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIF9pc0VsZW1lbnRIYXNoKGVsZW1lbnQ6IENjRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJlxuICAgICAgY2NFbGVtZW50RmllbGRzLnR5cGUgaW4gZWxlbWVudCAmJlxuICAgICAgY2NFbGVtZW50RmllbGRzLm5hbWUgaW4gZWxlbWVudCAmJlxuICAgICAgKE9iamVjdC5rZXlzKGVsZW1lbnQpLmxlbmd0aCA9PT0gMiB8fCBPYmplY3Qua2V5cyhlbGVtZW50KS5sZW5ndGggPT09IDMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBfaXNFbGVtZW50UXVlcnlcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENoZWNrcyBpZiBlbGVtZW50IGdpdmVuIHBhcmFtIGlzIEVsZW1lbnRRdWVyeSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfaXNFbGVtZW50UXVlcnkoZWxlbWVudDogQ2NFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmXG4gICAgICBjY0VsZW1lbnRGaWVsZHMucXVlcnkgaW4gZWxlbWVudCAmJlxuICAgICAgKE9iamVjdC5rZXlzKGVsZW1lbnQpLmxlbmd0aCA9PT0gMSB8fCBPYmplY3Qua2V5cyhlbGVtZW50KS5sZW5ndGggPT09IDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBfaXNOYXRpdmVEb21FbGVtZW50XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDaGVja3MgaWYgZWxlbWVudCBnaXZlbiBwYXJhbSBpcyBhIG5hdGl2ZSBET00gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2lzTmF0aXZlRG9tRWxlbWVudChwYXJhbTogYW55KTogcGFyYW0gaXMgRWxlbWVudCB7XG4gICAgY29uc3QgX3BhcmFtc1RvQ2hlY2s6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgICAnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JywgJ2dldEVsZW1lbnRzQnlDbGFzc05hbWUnLCAnZ2V0RWxlbWVudHNCeVRhZ05hbWUnLCAncXVlcnlTZWxlY3RvcidcbiAgICBdO1xuICAgIHJldHVybiAoISFwYXJhbSkgPyAoX3BhcmFtc1RvQ2hlY2subWFwKChlOiBzdHJpbmcpID0+IGUgaW4gcGFyYW0pKS5ldmVyeSgoZWwpID0+ICEhZWwpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogX2NvbnZlcnRUb0VsZW1lbnRJZEFycmF5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUcmFuc2Zvcm0gZWxlbWVudElkIHR5cGUgdG8gYXJyYXkgb2YgRG9tIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29udmVydFRvRWxlbWVudElkQXJyYXkoZWxlbWVudElkOiBFbGVtZW50SWQpOiBBcnJheTxFbGVtZW50PiB7XG4gICAgY29uc3QgX2F1eEFyZ3VtZW50OiBBcnJheTxFbGVtZW50PiA9IFtdO1xuICAgIGNvbnN0IF9lbGVtZW50SWQ6IEFycmF5PENjRWxlbWVudD4gPSAoQXJyYXkuaXNBcnJheShlbGVtZW50SWQpKSA/IGVsZW1lbnRJZCA6IFtlbGVtZW50SWRdO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBfZWxlbWVudElkKSB7XG4gICAgICBfYXV4QXJndW1lbnQucHVzaCh0aGlzLmdldEVsZW1lbnQoZWxlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gX2F1eEFyZ3VtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RWxlbWVudEFkZGl0aW9ucyhlbGVtZW50OiBFbGVtZW50LCBib3hNb2RlbFR5cGU/OiBCb3hNb2RlbFR5cGUpOiBCb3hNb2RlbEFkZGl0aW9uT2JqZWN0IHtcbiAgICBjb25zdCBfdHlwZTogQm94TW9kZWxUeXBlID0gYm94TW9kZWxUeXBlIHx8IHRoaXMuX2RlZmF1bHRCb3hNb2RlbFR5cGU7XG4gICAgY29uc3QgX2VsZW1lbnRTdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IF9vdXRwdXQ6IEJveE1vZGVsQWRkaXRpb25PYmplY3QgPSB7XG4gICAgICBib3hNb2RlbEFkZGl0aW9uSW5zaWRlOiAwLFxuICAgICAgYm94TW9kZWxBZGRpdGlvbk91dHNpZGU6IDBcbiAgICB9O1xuICAgIGNvbnN0IF9hdXhPdXRwdXRJbnNpZGU6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBfYXV4T3V0cHV0T3V0c2lkZTogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGlmIChfdHlwZSA9PT0gYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uSG9yaXpvbnRhbEluc2lkZUNsYXNzZXMuZm9yRWFjaCgoZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIF9hdXhPdXRwdXRJbnNpZGUucHVzaChfZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9hZGRpdGlvbkhvcml6b250YWxPdXRzaWRlQ2xhc3Nlcy5mb3JFYWNoKChlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgX2F1eE91dHB1dE91dHNpZGUucHVzaChfZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uVmVydGljYWxJbnNpZGVDbGFzc2VzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgICBfYXV4T3V0cHV0SW5zaWRlLnB1c2goX2VsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fYWRkaXRpb25WZXJ0aWNhbE91dHNpZGVDbGFzc2VzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgICBfYXV4T3V0cHV0T3V0c2lkZS5wdXNoKF9lbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgX2F1eE91dHB1dEluc2lkZS5mb3JFYWNoKChlbDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZWwgIT09ICcwcHgnKSB7XG4gICAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbkluc2lkZSArPSB0aGlzLnJlYWRDc3NVbml0cyhlbCkudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2F1eE91dHB1dE91dHNpZGUuZm9yRWFjaCgoZWw6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGVsICE9PSAnMHB4Jykge1xuICAgICAgICBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25PdXRzaWRlICs9IHRoaXMucmVhZENzc1VuaXRzKGVsKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX291dHB1dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb21wdXRlZFN0eWxlUHJvcGVydHkoZWxlbWVudDogRWxlbWVudCwgcHJvcGVydHk6IHN0cmluZywgcHJvY2Vzc2VkPzogYm9vbGVhbik6IHN0cmluZyB8IFByb2Nlc3NlZFVuaXRPYmplY3Qge1xuICAgIGNvbnN0IF9wcm9jZXNzZWQ6IGJvb2xlYW4gPSBwcm9jZXNzZWQgfHwgdGhpcy5fZGVmYXVsdENvbXB1dGVkU3R5bGVQcm9wZXJ0eVByb2Nlc3NlZDtcbiAgICBjb25zdCBfZWxlbWVudENvbXB1dGVkU3R5bGVzOiBDU1NTdHlsZURlY2xhcmF0aW9uID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgY29uc3QgX291dHB1dDogc3RyaW5nID0gX2VsZW1lbnRDb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgICBpZiAoX291dHB1dCAmJiBfcHJvY2Vzc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQ3NzVW5pdHMoX291dHB1dCk7XG4gICAgfVxuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NFbGVtZW50Rm9yU3BlY2lhbFJ1bGVzKGVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50IHtcbiAgICBpZiAodGhpcy5fZm9udFNpemVSdWxlLmFwcGx5T25FbGVtZW50cy5pbmNsdWRlcyhlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIGNvbnN0IF9lbGVtZW50Qm94TW9kZWw6IEJveE1vZGVsU3dhcE9iamVjdCA9IHRoaXMuZ2V0Qm94TW9kZWwoZWxlbWVudCwgYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpO1xuICAgICAgY29uc3QgX2VsZW1lbnRGb250U2l6ZTogUHJvY2Vzc2VkVW5pdE9iamVjdCA9IHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVByb3BlcnR5KGVsZW1lbnQsICdmb250LXNpemUnLCB0cnVlKSBhcyBQcm9jZXNzZWRVbml0T2JqZWN0O1xuICAgICAgaWYgKF9lbGVtZW50Qm94TW9kZWwuYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGUgIT09IF9lbGVtZW50Rm9udFNpemUudmFsdWUpIHtcbiAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLndpZHRoID0gYCR7X2VsZW1lbnRGb250U2l6ZS52YWx1ZX1weGA7XG4gICAgICAgIHJldHVybiBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHVibGljIHJlYWRDc3NVbml0cyhleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9jZXNzZWRVbml0T2JqZWN0IHtcbiAgICBjb25zdCBfb3V0cHV0OiBQcm9jZXNzZWRVbml0T2JqZWN0ID0geyB2YWx1ZTogMCwgdW5pdDogJycgfTtcbiAgICB0aGlzLl9hbGxvd0Nzc1VuaXRzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGV4cHJlc3Npb24uaW5jbHVkZXMoZSkpIHtcbiAgICAgICAgX291dHB1dC51bml0ID0gZTtcbiAgICAgICAgY29uc3QgX2F1eDogQXJyYXk8c3RyaW5nPiA9IGV4cHJlc3Npb24uc3BsaXQoZSkuZmlsdGVyKChlbDogc3RyaW5nKSA9PiAhIWVsKTtcbiAgICAgICAgaWYgKF9hdXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgX291dHB1dC52YWx1ZSA9IE51bWJlcihfYXV4WzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIChfb3V0cHV0LnZhbHVlICYmIF9vdXRwdXQudW5pdCkgPyBfb3V0cHV0IDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzU2l6ZVN0cmluZyhzaXplU3RyaW5nOiBzdHJpbmcpOiBTaXplT2JqZWN0IHtcbiAgICBjb25zdCBfb3V0cHV0OiBTaXplT2JqZWN0ID0geyB3aXRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfTtcbiAgICBpZiAoc2l6ZVN0cmluZykge1xuICAgICAgY29uc3QgX2F1eFNpemU6IEFycmF5PHN0cmluZz4gPSBzaXplU3RyaW5nLnNwbGl0KCcgJyk7XG4gICAgICBpZiAoX2F1eFNpemUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IF9jc3NVbml0OiBQcm9jZXNzZWRVbml0T2JqZWN0ID0gdGhpcy5yZWFkQ3NzVW5pdHMoX2F1eFNpemVbMF0pO1xuICAgICAgICBfb3V0cHV0LndpdGggPSBfY3NzVW5pdDtcbiAgICAgICAgX291dHB1dC5oZWlnaHQgPSBfY3NzVW5pdDtcbiAgICAgIH0gZWxzZSBpZiAoX2F1eFNpemUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIF9vdXRwdXQuaGVpZ2h0ID0gdGhpcy5yZWFkQ3NzVW5pdHMoX2F1eFNpemVbMF0pO1xuICAgICAgICBfb3V0cHV0LndpdGggPSB0aGlzLnJlYWRDc3NVbml0cyhfYXV4U2l6ZVsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoX291dHB1dC53aXRoICYmIF9vdXRwdXQuaGVpZ2h0KSA/IF9vdXRwdXQgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldEVsZW1lbnRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgYW4gZWxlbWVudCBET00gbmF0aXZlIG9iamVjdCBmcm9tIGRpZmZlcmVudCB0eXBlcyBvZiBnaXZlbiBwYXJhbXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChlbGVtZW50OiBDY0VsZW1lbnQpOiBFbGVtZW50IHtcbiAgICBsZXQgX291dHB1dDogRWxlbWVudCA9IGVsZW1lbnQgYXMgRWxlbWVudDtcbiAgICBsZXQgX2VsZW1lbnQ6IENjRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgbGV0IF9zaGFkb3dFbGVtZW50OiBFbGVtZW50IHwgRG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBfZWxlbWVudCA9IHsgdHlwZTogdGhpcy5fZGVmYXVsdEVsZW1lbnRIYXNoVHlwZSwgbmFtZTogZWxlbWVudCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2NFbGVtZW50RmllbGRzLnNoYWRvd0VsZW1lbnQgaW4gKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2ggfCBDY0VsZW1lbnRRdWVyeSkpIHtcbiAgICAgICAgX3NoYWRvd0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQoKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2ggfCBDY0VsZW1lbnRRdWVyeSkuc2hhZG93RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghQm94TW9kZWxTZXJ2aWNlLl9pc05hdGl2ZURvbUVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICBpZiAoQm94TW9kZWxTZXJ2aWNlLl9pc0VsZW1lbnRIYXNoKF9lbGVtZW50KSkge1xuICAgICAgICBzd2l0Y2ggKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBjY0hhc2hUeXBlcy5jbGFzczpcbiAgICAgICAgICAgIF9vdXRwdXQgPSBfc2hhZG93RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS5uYW1lKS5pdGVtKDApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjY0hhc2hUeXBlcy50YWc6XG4gICAgICAgICAgICBfb3V0cHV0ID0gX3NoYWRvd0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2gpLm5hbWUpLml0ZW0oMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGNjSGFzaFR5cGVzLmlkOlxuICAgICAgICAgICAgX291dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS5uYW1lKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKEJveE1vZGVsU2VydmljZS5faXNFbGVtZW50UXVlcnkoX2VsZW1lbnQpKSB7XG4gICAgICAgIF9vdXRwdXQgPSBfc2hhZG93RWxlbWVudC5xdWVyeVNlbGVjdG9yKChfZWxlbWVudCBhcyBDY0VsZW1lbnRRdWVyeSkucXVlcnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIUJveE1vZGVsU2VydmljZS5faXNOYXRpdmVEb21FbGVtZW50KF9vdXRwdXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JveE1vZGVsLmdldEVsZW1lbnQ6IFVucmVjb2duaXphYmxlIGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIGdldEJveE1vZGVsKGVsZW1lbnRJZDogRWxlbWVudElkLCBib3hNb2RlbFR5cGU/OiBCb3hNb2RlbFR5cGUpOiBCb3hNb2RlbFN3YXBPYmplY3Qge1xuICAgIGNvbnN0IF9vdXRwdXQ6IEJveE1vZGVsU3dhcE9iamVjdCA9IHtcbiAgICAgIHR5cGU6IGJveE1vZGVsVHlwZSB8fCB0aGlzLl9kZWZhdWx0Qm94TW9kZWxUeXBlLFxuICAgICAgYm94TW9kZWw6IDAsXG4gICAgICBib3hNb2RlbEFkZGl0aW9uczogMCxcbiAgICAgIGJveE1vZGVsQWdncmVnYXRlZDogMCxcbiAgICAgIGJveE1vZGVsRXh0cmFjdGVkOiAwLFxuICAgICAgYm94TW9kZWxBZGRpdGlvbnNJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFkZGl0aW9uc091dHNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFnZ3JlZ2F0ZWRJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFnZ3JlZ2F0ZWRPdXRzaWRlOiAwLFxuICAgICAgYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEV4dHJhY3RlZE91dHNpZGU6IDBcbiAgICB9O1xuICAgIGNvbnN0IF9lbGVtZW50SWQ6IEFycmF5PEVsZW1lbnQ+ID0gdGhpcy5fY29udmVydFRvRWxlbWVudElkQXJyYXkoZWxlbWVudElkKTtcbiAgICBfZWxlbWVudElkLmZvckVhY2goKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IF9lbGVtZW50UmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgX2FkZGl0aW9uczogQm94TW9kZWxBZGRpdGlvbk9iamVjdCA9IHRoaXMuX2dldEVsZW1lbnRBZGRpdGlvbnMoZSwgX291dHB1dC50eXBlKTtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWwgKz0gKF9vdXRwdXQudHlwZSA9PT0gYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpID8gX2VsZW1lbnRSZWN0LndpZHRoIDogX2VsZW1lbnRSZWN0LmhlaWdodDtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnMgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uSW5zaWRlICsgX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uT3V0c2lkZTtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnNJbnNpZGUgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uSW5zaWRlO1xuICAgICAgX291dHB1dC5ib3hNb2RlbEFkZGl0aW9uc091dHNpZGUgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uT3V0c2lkZTtcbiAgICB9KTtcbiAgICBfb3V0cHV0LmJveE1vZGVsQWdncmVnYXRlZCA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zO1xuICAgIF9vdXRwdXQuYm94TW9kZWxFeHRyYWN0ZWQgPSBfb3V0cHV0LmJveE1vZGVsIC0gX291dHB1dC5ib3hNb2RlbEFkZGl0aW9ucztcbiAgICBfb3V0cHV0LmJveE1vZGVsQWdncmVnYXRlZEluc2lkZSA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zSW5zaWRlO1xuICAgIF9vdXRwdXQuYm94TW9kZWxBZ2dyZWdhdGVkT3V0c2lkZSA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zT3V0c2lkZTtcbiAgICBfb3V0cHV0LmJveE1vZGVsRXh0cmFjdGVkSW5zaWRlID0gX291dHB1dC5ib3hNb2RlbCAtIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnNJbnNpZGU7XG4gICAgX291dHB1dC5ib3hNb2RlbEV4dHJhY3RlZE91dHNpZGUgPSBfb3V0cHV0LmJveE1vZGVsIC0gX291dHB1dC5ib3hNb2RlbEFkZGl0aW9uc091dHNpZGU7XG4gICAgcmV0dXJuIF9vdXRwdXQ7XG4gIH1cbn1cbiJdfQ==