UNPKG

@lunaeme/circe-core

Version:
234 lines 36.2 kB
var BoxModelService_1; import { __decorate } from "tslib"; import { Injectable } from '@angular/core'; import { ccElementFields, ccHashTypes } from '../_types/element.types'; export const boxModelTypeConstants = { HORIZONTAL: 'horizontal', VERTICAL: 'vertical' }; let BoxModelService = BoxModelService_1 = class BoxModelService { constructor() { 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 }; } /** * _isElementHash * * @description * Checks if element given param is ElementHash type. */ static _isElementHash(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. */ static _isElementQuery(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. */ static _isNativeDomElement(param) { const _paramsToCheck = [ 'getBoundingClientRect', 'getElementsByClassName', 'getElementsByTagName', 'querySelector' ]; return (!!param) ? (_paramsToCheck.map((e) => e in param)).every((el) => !!el) : false; } /** * _convertToElementIdArray * * @description * Transform elementId type to array of Dom elements. */ _convertToElementIdArray(elementId) { const _auxArgument = []; const _elementId = (Array.isArray(elementId)) ? elementId : [elementId]; for (const element of _elementId) { _auxArgument.push(this.getElement(element)); } return _auxArgument; } _getElementAdditions(element, boxModelType) { const _type = boxModelType || this._defaultBoxModelType; const _elementStyle = window.getComputedStyle(element); const _output = { boxModelAdditionInside: 0, boxModelAdditionOutside: 0 }; const _auxOutputInside = []; const _auxOutputOutside = []; if (_type === boxModelTypeConstants.HORIZONTAL) { this._additionHorizontalInsideClasses.forEach((e) => { _auxOutputInside.push(_elementStyle.getPropertyValue(e)); }); this._additionHorizontalOutsideClasses.forEach((e) => { _auxOutputOutside.push(_elementStyle.getPropertyValue(e)); }); } else { this._additionVerticalInsideClasses.forEach((e) => { _auxOutputInside.push(_elementStyle.getPropertyValue(e)); }); this._additionVerticalOutsideClasses.forEach((e) => { _auxOutputOutside.push(_elementStyle.getPropertyValue(e)); }); } _auxOutputInside.forEach((el) => { if (el !== '0px') { _output.boxModelAdditionInside += this.readCssUnits(el).value; } }); _auxOutputOutside.forEach((el) => { if (el !== '0px') { _output.boxModelAdditionOutside += this.readCssUnits(el).value; } }); return _output; } getComputedStyleProperty(element, property, processed) { const _processed = processed || this._defaultComputedStylePropertyProcessed; const _elementComputedStyles = window.getComputedStyle(element); const _output = _elementComputedStyles.getPropertyValue(property); if (_output && _processed) { return this.readCssUnits(_output); } return _output; } processElementForSpecialRules(element) { if (this._fontSizeRule.applyOnElements.includes(element.tagName.toLowerCase())) { const _elementBoxModel = this.getBoxModel(element, boxModelTypeConstants.HORIZONTAL); const _elementFontSize = this.getComputedStyleProperty(element, 'font-size', true); if (_elementBoxModel.boxModelExtractedInside !== _elementFontSize.value) { element.style.width = `${_elementFontSize.value}px`; return element; } } return element; } readCssUnits(expression) { const _output = { value: 0, unit: '' }; this._allowCssUnits.forEach((e) => { if (expression.includes(e)) { _output.unit = e; const _aux = expression.split(e).filter((el) => !!el); if (_aux.length === 1) { _output.value = Number(_aux[0]); } return; } }); return (_output.value && _output.unit) ? _output : null; } processSizeString(sizeString) { const _output = { with: null, height: null }; if (sizeString) { const _auxSize = sizeString.split(' '); if (_auxSize.length === 1) { const _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. */ getElement(element) { let _output = element; let _element = element; let _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; } getBoxModel(elementId, boxModelType) { const _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 }; const _elementId = this._convertToElementIdArray(elementId); _elementId.forEach((e) => { const _elementRect = e.getBoundingClientRect(); const _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; } }; BoxModelService = BoxModelService_1 = __decorate([ Injectable() ], BoxModelService); export { BoxModelService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LW1vZGVsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHVuYWVtZS9jaXJjZS1jb3JlLyIsInNvdXJjZXMiOlsibGliL2JveC1tb2RlbC9ib3gtbW9kZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFhLGVBQWUsRUFBNkMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUF1QzVILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHO0lBQ25DLFVBQVUsRUFBRSxZQUE0QjtJQUN4QyxRQUFRLEVBQUUsVUFBMEI7Q0FDckMsQ0FBQztBQUVZLElBQWEsZUFBZSx1QkFBNUIsTUFBYSxlQUFlO0lBZXhDO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQztRQUUzRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUVqRCxJQUFJLENBQUMsc0NBQXNDLEdBQUcsS0FBSyxDQUFDO1FBRXBELElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3JILElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsK0JBQStCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdB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QUNGLENBQUE7QUF6UDBCLGVBQWU7SUFBekMsVUFBVSxFQUFFO0dBQWMsZUFBZSxDQXlQekM7U0F6UDBCLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDY0VsZW1lbnQsIGNjRWxlbWVudEZpZWxkcywgQ2NFbGVtZW50SGFzaCwgQ2NFbGVtZW50UXVlcnksIENjSGFzaFR5cGUsIGNjSGFzaFR5cGVzfSBmcm9tICcuLi9fdHlwZXMvZWxlbWVudC50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZU9iamVjdCB7XG4gIHdpdGg6IFByb2Nlc3NlZFVuaXRPYmplY3Q7XG4gIGhlaWdodDogUHJvY2Vzc2VkVW5pdE9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzZWRVbml0T2JqZWN0IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50SWQgPSBDY0VsZW1lbnQgfCBBcnJheTxDY0VsZW1lbnQ+O1xuXG5leHBvcnQgdHlwZSBCb3hNb2RlbFR5cGUgPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuZXhwb3J0IGludGVyZmFjZSBCb3hNb2RlbFN3YXBPYmplY3Qge1xuICB0eXBlOiBCb3hNb2RlbFR5cGU7XG4gIGJveE1vZGVsOiBudW1iZXI7XG4gIGJveE1vZGVsQWRkaXRpb25zOiBudW1iZXI7XG4gIGJveE1vZGVsQWdncmVnYXRlZDogbnVtYmVyO1xuICBib3hNb2RlbEV4dHJhY3RlZDogbnVtYmVyO1xuICBib3hNb2RlbEFkZGl0aW9uc0luc2lkZTogbnVtYmVyO1xuICBib3hNb2RlbEFkZGl0aW9uc091dHNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxBZ2dyZWdhdGVkSW5zaWRlOiBudW1iZXI7XG4gIGJveE1vZGVsQWdncmVnYXRlZE91dHNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxFeHRyYWN0ZWRPdXRzaWRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm94TW9kZWxBZGRpdGlvbk9iamVjdCB7XG4gIGJveE1vZGVsQWRkaXRpb25JbnNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxBZGRpdGlvbk91dHNpZGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGVjaWFsUnVsZU9iamVjdCB7XG4gIGFwcGx5T25FbGVtZW50czogQXJyYXk8c3RyaW5nPjtcbiAgYm94TW9kZWxUeXBlOiBCb3hNb2RlbFR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBib3hNb2RlbFR5cGVDb25zdGFudHMgPSB7XG4gIEhPUklaT05UQUw6ICdob3Jpem9udGFsJyBhcyBCb3hNb2RlbFR5cGUsXG4gIFZFUlRJQ0FMOiAndmVydGljYWwnIGFzIEJveE1vZGVsVHlwZVxufTtcblxuQEluamVjdGFibGUoKSBleHBvcnQgY2xhc3MgQm94TW9kZWxTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEJveE1vZGVsVHlwZTogQm94TW9kZWxUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRFbGVtZW50SGFzaFR5cGU6IENjSGFzaFR5cGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdENvbXB1dGVkU3R5bGVQcm9wZXJ0eVByb2Nlc3NlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxvd0Nzc1VuaXRzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGRpdGlvbkhvcml6b250YWxJbnNpZGVDbGFzc2VzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGRpdGlvbkhvcml6b250YWxPdXRzaWRlQ2xhc3NlczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWRkaXRpb25WZXJ0aWNhbEluc2lkZUNsYXNzZXM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkZGl0aW9uVmVydGljYWxPdXRzaWRlQ2xhc3NlczogQXJyYXk8c3RyaW5nPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mb250U2l6ZVJ1bGU6IFNwZWNpYWxSdWxlT2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2RlZmF1bHRCb3hNb2RlbFR5cGUgPSBib3hNb2RlbFR5cGVDb25zdGFudHMuVkVSVElDQUw7XG5cbiAgICB0aGlzLl9kZWZhdWx0RWxlbWVudEhhc2hUeXBlID0gY2NIYXNoVHlwZXMuY2xhc3M7XG5cbiAgICB0aGlzLl9kZWZhdWx0Q29tcHV0ZWRTdHlsZVByb3BlcnR5UHJvY2Vzc2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9hbGxvd0Nzc1VuaXRzID0gWydweCcsICclJ107XG4gICAgdGhpcy5fYWRkaXRpb25Ib3Jpem9udGFsSW5zaWRlQ2xhc3NlcyA9IFsncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmctcmlnaHQnLCAnYm9yZGVyLWxlZnQtd2lkdGgnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJ107XG4gICAgdGhpcy5fYWRkaXRpb25Ib3Jpem9udGFsT3V0c2lkZUNsYXNzZXMgPSBbJ21hcmdpbi1sZWZ0JywgJ21hcmdpbi1yaWdodCddO1xuICAgIHRoaXMuX2FkZGl0aW9uVmVydGljYWxJbnNpZGVDbGFzc2VzID0gWydwYWRkaW5nLXRvcCcsICdwYWRkaW5nLWJvdHRvbScsICdib3JkZXItdG9wLXdpZHRoJywgJ2JvcmRlci1ib3R0b20td2lkdGgnXTtcbiAgICB0aGlzLl9hZGRpdGlvblZlcnRpY2FsT3V0c2lkZUNsYXNzZXMgPSBbJ21hcmdpbi10b3AnLCAnbWFyZ2luLWJvdHRvbSddO1xuXG4gICAgdGhpcy5fZm9udFNpemVSdWxlID0geyBhcHBseU9uRWxlbWVudHM6IFsnaSddLCBib3hNb2RlbFR5cGU6IGJveE1vZGVsVHlwZUNvbnN0YW50cy5IT1JJWk9OVEFMIH07XG4gIH1cblxuICAvKipcbiAgICogX2lzRWxlbWVudEhhc2hcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENoZWNrcyBpZiBlbGVtZW50IGdpdmVuIHBhcmFtIGlzIEVsZW1lbnRIYXNoIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIF9pc0VsZW1lbnRIYXNoKGVsZW1lbnQ6IENjRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJlxuICAgICAgY2NFbGVtZW50RmllbGRzLnR5cGUgaW4gZWxlbWVudCAmJlxuICAgICAgY2NFbGVtZW50RmllbGRzLm5hbWUgaW4gZWxlbWVudCAmJlxuICAgICAgKE9iamVjdC5rZXlzKGVsZW1lbnQpLmxlbmd0aCA9PT0gMiB8fCBPYmplY3Qua2V5cyhlbGVtZW50KS5sZW5ndGggPT09IDMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBfaXNFbGVtZW50UXVlcnlcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENoZWNrcyBpZiBlbGVtZW50IGdpdmVuIHBhcmFtIGlzIEVsZW1lbnRRdWVyeSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfaXNFbGVtZW50UXVlcnkoZWxlbWVudDogQ2NFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmXG4gICAgICBjY0VsZW1lbnRGaWVsZHMucXVlcnkgaW4gZWxlbWVudCAmJlxuICAgICAgKE9iamVjdC5rZXlzKGVsZW1lbnQpLmxlbmd0aCA9PT0gMSB8fCBPYmplY3Qua2V5cyhlbGVtZW50KS5sZW5ndGggPT09IDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBfaXNOYXRpdmVEb21FbGVtZW50XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDaGVja3MgaWYgZWxlbWVudCBnaXZlbiBwYXJhbSBpcyBhIG5hdGl2ZSBET00gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2lzTmF0aXZlRG9tRWxlbWVudChwYXJhbTogYW55KTogcGFyYW0gaXMgRWxlbWVudCB7XG4gICAgY29uc3QgX3BhcmFtc1RvQ2hlY2s6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgICAnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JywgJ2dldEVsZW1lbnRzQnlDbGFzc05hbWUnLCAnZ2V0RWxlbWVudHNCeVRhZ05hbWUnLCAncXVlcnlTZWxlY3RvcidcbiAgICBdO1xuICAgIHJldHVybiAoISFwYXJhbSkgPyAoX3BhcmFtc1RvQ2hlY2subWFwKChlOiBzdHJpbmcpID0+IGUgaW4gcGFyYW0pKS5ldmVyeSgoZWwpID0+ICEhZWwpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogX2NvbnZlcnRUb0VsZW1lbnRJZEFycmF5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUcmFuc2Zvcm0gZWxlbWVudElkIHR5cGUgdG8gYXJyYXkgb2YgRG9tIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29udmVydFRvRWxlbWVudElkQXJyYXkoZWxlbWVudElkOiBFbGVtZW50SWQpOiBBcnJheTxFbGVtZW50PiB7XG4gICAgY29uc3QgX2F1eEFyZ3VtZW50OiBBcnJheTxFbGVtZW50PiA9IFtdO1xuICAgIGNvbnN0IF9lbGVtZW50SWQ6IEFycmF5PENjRWxlbWVudD4gPSAoQXJyYXkuaXNBcnJheShlbGVtZW50SWQpKSA/IGVsZW1lbnRJZCA6IFtlbGVtZW50SWRdO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBfZWxlbWVudElkKSB7XG4gICAgICBfYXV4QXJndW1lbnQucHVzaCh0aGlzLmdldEVsZW1lbnQoZWxlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gX2F1eEFyZ3VtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RWxlbWVudEFkZGl0aW9ucyhlbGVtZW50OiBFbGVtZW50LCBib3hNb2RlbFR5cGU/OiBCb3hNb2RlbFR5cGUpOiBCb3hNb2RlbEFkZGl0aW9uT2JqZWN0IHtcbiAgICBjb25zdCBfdHlwZTogQm94TW9kZWxUeXBlID0gYm94TW9kZWxUeXBlIHx8IHRoaXMuX2RlZmF1bHRCb3hNb2RlbFR5cGU7XG4gICAgY29uc3QgX2VsZW1lbnRTdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IF9vdXRwdXQ6IEJveE1vZGVsQWRkaXRpb25PYmplY3QgPSB7XG4gICAgICBib3hNb2RlbEFkZGl0aW9uSW5zaWRlOiAwLFxuICAgICAgYm94TW9kZWxBZGRpdGlvbk91dHNpZGU6IDBcbiAgICB9O1xuICAgIGNvbnN0IF9hdXhPdXRwdXRJbnNpZGU6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBfYXV4T3V0cHV0T3V0c2lkZTogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGlmIChfdHlwZSA9PT0gYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uSG9yaXpvbnRhbEluc2lkZUNsYXNzZXMuZm9yRWFjaCgoZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIF9hdXhPdXRwdXRJbnNpZGUucHVzaChfZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9hZGRpdGlvbkhvcml6b250YWxPdXRzaWRlQ2xhc3Nlcy5mb3JFYWNoKChlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgX2F1eE91dHB1dE91dHNpZGUucHVzaChfZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uVmVydGljYWxJbnNpZGVDbGFzc2VzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgICBfYXV4T3V0cHV0SW5zaWRlLnB1c2goX2VsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fYWRkaXRpb25WZXJ0aWNhbE91dHNpZGVDbGFzc2VzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgICBfYXV4T3V0cHV0T3V0c2lkZS5wdXNoKF9lbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgX2F1eE91dHB1dEluc2lkZS5mb3JFYWNoKChlbDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZWwgIT09ICcwcHgnKSB7XG4gICAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbkluc2lkZSArPSB0aGlzLnJlYWRDc3NVbml0cyhlbCkudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2F1eE91dHB1dE91dHNpZGUuZm9yRWFjaCgoZWw6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGVsICE9PSAnMHB4Jykge1xuICAgICAgICBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25PdXRzaWRlICs9IHRoaXMucmVhZENzc1VuaXRzKGVsKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX291dHB1dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb21wdXRlZFN0eWxlUHJvcGVydHkoZWxlbWVudDogRWxlbWVudCwgcHJvcGVydHk6IHN0cmluZywgcHJvY2Vzc2VkPzogYm9vbGVhbik6IHN0cmluZyB8IFByb2Nlc3NlZFVuaXRPYmplY3Qge1xuICAgIGNvbnN0IF9wcm9jZXNzZWQ6IGJvb2xlYW4gPSBwcm9jZXNzZWQgfHwgdGhpcy5fZGVmYXVsdENvbXB1dGVkU3R5bGVQcm9wZXJ0eVByb2Nlc3NlZDtcbiAgICBjb25zdCBfZWxlbWVudENvbXB1dGVkU3R5bGVzOiBDU1NTdHlsZURlY2xhcmF0aW9uID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgY29uc3QgX291dHB1dDogc3RyaW5nID0gX2VsZW1lbnRDb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgICBpZiAoX291dHB1dCAmJiBfcHJvY2Vzc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQ3NzVW5pdHMoX291dHB1dCk7XG4gICAgfVxuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NFbGVtZW50Rm9yU3BlY2lhbFJ1bGVzKGVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50IHtcbiAgICBpZiAodGhpcy5fZm9udFNpemVSdWxlLmFwcGx5T25FbGVtZW50cy5pbmNsdWRlcyhlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIGNvbnN0IF9lbGVtZW50Qm94TW9kZWw6IEJveE1vZGVsU3dhcE9iamVjdCA9IHRoaXMuZ2V0Qm94TW9kZWwoZWxlbWVudCwgYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpO1xuICAgICAgY29uc3QgX2VsZW1lbnRGb250U2l6ZTogUHJvY2Vzc2VkVW5pdE9iamVjdCA9IHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVByb3BlcnR5KGVsZW1lbnQsICdmb250LXNpemUnLCB0cnVlKSBhcyBQcm9jZXNzZWRVbml0T2JqZWN0O1xuICAgICAgaWYgKF9lbGVtZW50Qm94TW9kZWwuYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGUgIT09IF9lbGVtZW50Rm9udFNpemUudmFsdWUpIHtcbiAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLndpZHRoID0gYCR7X2VsZW1lbnRGb250U2l6ZS52YWx1ZX1weGA7XG4gICAgICAgIHJldHVybiBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHVibGljIHJlYWRDc3NVbml0cyhleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9jZXNzZWRVbml0T2JqZWN0IHtcbiAgICBjb25zdCBfb3V0cHV0OiBQcm9jZXNzZWRVbml0T2JqZWN0ID0geyB2YWx1ZTogMCwgdW5pdDogJycgfTtcbiAgICB0aGlzLl9hbGxvd0Nzc1VuaXRzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGV4cHJlc3Npb24uaW5jbHVkZXMoZSkpIHtcbiAgICAgICAgX291dHB1dC51bml0ID0gZTtcbiAgICAgICAgY29uc3QgX2F1eDogQXJyYXk8c3RyaW5nPiA9IGV4cHJlc3Npb24uc3BsaXQoZSkuZmlsdGVyKChlbDogc3RyaW5nKSA9PiAhIWVsKTtcbiAgICAgICAgaWYgKF9hdXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgX291dHB1dC52YWx1ZSA9IE51bWJlcihfYXV4WzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIChfb3V0cHV0LnZhbHVlICYmIF9vdXRwdXQudW5pdCkgPyBfb3V0cHV0IDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzU2l6ZVN0cmluZyhzaXplU3RyaW5nOiBzdHJpbmcpOiBTaXplT2JqZWN0IHtcbiAgICBjb25zdCBfb3V0cHV0OiBTaXplT2JqZWN0ID0geyB3aXRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfTtcbiAgICBpZiAoc2l6ZVN0cmluZykge1xuICAgICAgY29uc3QgX2F1eFNpemU6IEFycmF5PHN0cmluZz4gPSBzaXplU3RyaW5nLnNwbGl0KCcgJyk7XG4gICAgICBpZiAoX2F1eFNpemUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IF9jc3NVbml0OiBQcm9jZXNzZWRVbml0T2JqZWN0ID0gdGhpcy5yZWFkQ3NzVW5pdHMoX2F1eFNpemVbMF0pO1xuICAgICAgICBfb3V0cHV0LndpdGggPSBfY3NzVW5pdDtcbiAgICAgICAgX291dHB1dC5oZWlnaHQgPSBfY3NzVW5pdDtcbiAgICAgIH0gZWxzZSBpZiAoX2F1eFNpemUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIF9vdXRwdXQuaGVpZ2h0ID0gdGhpcy5yZWFkQ3NzVW5pdHMoX2F1eFNpemVbMF0pO1xuICAgICAgICBfb3V0cHV0LndpdGggPSB0aGlzLnJlYWRDc3NVbml0cyhfYXV4U2l6ZVsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoX291dHB1dC53aXRoICYmIF9vdXRwdXQuaGVpZ2h0KSA/IF9vdXRwdXQgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldEVsZW1lbnRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgYW4gZWxlbWVudCBET00gbmF0aXZlIG9iamVjdCBmcm9tIGRpZmZlcmVudCB0eXBlcyBvZiBnaXZlbiBwYXJhbXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChlbGVtZW50OiBDY0VsZW1lbnQpOiBFbGVtZW50IHtcbiAgICBsZXQgX291dHB1dDogRWxlbWVudCA9IGVsZW1lbnQgYXMgRWxlbWVudDtcbiAgICBsZXQgX2VsZW1lbnQ6IENjRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgbGV0IF9zaGFkb3dFbGVtZW50OiBFbGVtZW50IHwgRG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBfZWxlbWVudCA9IHsgdHlwZTogdGhpcy5fZGVmYXVsdEVsZW1lbnRIYXNoVHlwZSwgbmFtZTogZWxlbWVudCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2NFbGVtZW50RmllbGRzLnNoYWRvd0VsZW1lbnQgaW4gKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2ggfCBDY0VsZW1lbnRRdWVyeSkpIHtcbiAgICAgICAgX3NoYWRvd0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQoKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2ggfCBDY0VsZW1lbnRRdWVyeSkuc2hhZG93RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghQm94TW9kZWxTZXJ2aWNlLl9pc05hdGl2ZURvbUVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICBpZiAoQm94TW9kZWxTZXJ2aWNlLl9pc0VsZW1lbnRIYXNoKF9lbGVtZW50KSkge1xuICAgICAgICBzd2l0Y2ggKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBjY0hhc2hUeXBlcy5jbGFzczpcbiAgICAgICAgICAgIF9vdXRwdXQgPSBfc2hhZG93RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS5uYW1lKS5pdGVtKDApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjY0hhc2hUeXBlcy50YWc6XG4gICAgICAgICAgICBfb3V0cHV0ID0gX3NoYWRvd0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2gpLm5hbWUpLml0ZW0oMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGNjSGFzaFR5cGVzLmlkOlxuICAgICAgICAgICAgX291dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS5uYW1lKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKEJveE1vZGVsU2VydmljZS5faXNFbGVtZW50UXVlcnkoX2VsZW1lbnQpKSB7XG4gICAgICAgIF9vdXRwdXQgPSBfc2hhZG93RWxlbWVudC5xdWVyeVNlbGVjdG9yKChfZWxlbWVudCBhcyBDY0VsZW1lbnRRdWVyeSkucXVlcnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIUJveE1vZGVsU2VydmljZS5faXNOYXRpdmVEb21FbGVtZW50KF9vdXRwdXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JveE1vZGVsLmdldEVsZW1lbnQ6IFVucmVjb2duaXphYmxlIGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIGdldEJveE1vZGVsKGVsZW1lbnRJZDogRWxlbWVudElkLCBib3hNb2RlbFR5cGU/OiBCb3hNb2RlbFR5cGUpOiBCb3hNb2RlbFN3YXBPYmplY3Qge1xuICAgIGNvbnN0IF9vdXRwdXQ6IEJveE1vZGVsU3dhcE9iamVjdCA9IHtcbiAgICAgIHR5cGU6IGJveE1vZGVsVHlwZSB8fCB0aGlzLl9kZWZhdWx0Qm94TW9kZWxUeXBlLFxuICAgICAgYm94TW9kZWw6IDAsXG4gICAgICBib3hNb2RlbEFkZGl0aW9uczogMCxcbiAgICAgIGJveE1vZGVsQWdncmVnYXRlZDogMCxcbiAgICAgIGJveE1vZGVsRXh0cmFjdGVkOiAwLFxuICAgICAgYm94TW9kZWxBZGRpdGlvbnNJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFkZGl0aW9uc091dHNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFnZ3JlZ2F0ZWRJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFnZ3JlZ2F0ZWRPdXRzaWRlOiAwLFxuICAgICAgYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEV4dHJhY3RlZE91dHNpZGU6IDBcbiAgICB9O1xuICAgIGNvbnN0IF9lbGVtZW50SWQ6IEFycmF5PEVsZW1lbnQ+ID0gdGhpcy5fY29udmVydFRvRWxlbWVudElkQXJyYXkoZWxlbWVudElkKTtcbiAgICBfZWxlbWVudElkLmZvckVhY2goKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IF9lbGVtZW50UmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgX2FkZGl0aW9uczogQm94TW9kZWxBZGRpdGlvbk9iamVjdCA9IHRoaXMuX2dldEVsZW1lbnRBZGRpdGlvbnMoZSwgX291dHB1dC50eXBlKTtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWwgKz0gKF9vdXRwdXQudHlwZSA9PT0gYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpID8gX2VsZW1lbnRSZWN0LndpZHRoIDogX2VsZW1lbnRSZWN0LmhlaWdodDtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnMgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uSW5zaWRlICsgX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uT3V0c2lkZTtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnNJbnNpZGUgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uSW5zaWRlO1xuICAgICAgX291dHB1dC5ib3hNb2RlbEFkZGl0aW9uc091dHNpZGUgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uT3V0c2lkZTtcbiAgICB9KTtcbiAgICBfb3V0cHV0LmJveE1vZGVsQWdncmVnYXRlZCA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zO1xuICAgIF9vdXRwdXQuYm94TW9kZWxFeHRyYWN0ZWQgPSBfb3V0cHV0LmJveE1vZGVsIC0gX291dHB1dC5ib3hNb2RlbEFkZGl0aW9ucztcbiAgICBfb3V0cHV0LmJveE1vZGVsQWdncmVnYXRlZEluc2lkZSA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zSW5zaWRlO1xuICAgIF9vdXRwdXQuYm94TW9kZWxBZ2dyZWdhdGVkT3V0c2lkZSA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zT3V0c2lkZTtcbiAgICBfb3V0cHV0LmJveE1vZGVsRXh0cmFjdGVkSW5zaWRlID0gX291dHB1dC5ib3hNb2RlbCAtIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnNJbnNpZGU7XG4gICAgX291dHB1dC5ib3hNb2RlbEV4dHJhY3RlZE91dHNpZGUgPSBfb3V0cHV0LmJveE1vZGVsIC0gX291dHB1dC5ib3hNb2RlbEFkZGl0aW9uc091dHNpZGU7XG4gICAgcmV0dXJuIF9vdXRwdXQ7XG4gIH1cbn1cbiJdfQ==