UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

648 lines 49.4 kB
/** * @fileoverview added by tsickle * Generated from: modal-container.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __assign, __extends } from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { BasePortalOutlet } from '@angular/cdk/portal'; import { EventEmitter } from '@angular/core'; import { getElementOffset } from 'ng-zorro-antd/core/util'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { FADE_CLASS_NAME_MAP, MODAL_MASK_CLASS_NAME, NZ_CONFIG_COMPONENT_NAME, ZOOM_CLASS_NAME_MAP } from './modal-config'; import { getValueWithConfig } from './utils'; /** * @return {?} */ export function throwNzModalContentAlreadyAttachedError() { throw Error('Attempting to attach modal content after content is already attached'); } var BaseModalContainer = /** @class */ (function (_super) { __extends(BaseModalContainer, _super); function BaseModalContainer(elementRef, focusTrapFactory, cdr, render, zone, overlayRef, nzConfigService, config, document, animationType) { var _this = _super.call(this) || this; _this.elementRef = elementRef; _this.focusTrapFactory = focusTrapFactory; _this.cdr = cdr; _this.render = render; _this.zone = zone; _this.overlayRef = overlayRef; _this.nzConfigService = nzConfigService; _this.config = config; _this.animationType = animationType; _this.animationStateChanged = new EventEmitter(); _this.containerClick = new EventEmitter(); _this.cancelTriggered = new EventEmitter(); _this.okTriggered = new EventEmitter(); _this.onDestroy = new EventEmitter(); _this.state = 'enter'; _this.isStringContent = false; _this.elementFocusedBeforeModalWasOpened = null; _this.latestMousedownTarget = null; _this.oldMaskStyle = null; _this.destroy$ = new Subject(); _this.document = document; _this.isStringContent = typeof config.nzContent === 'string'; _this.setContainer(); _this.nzConfigService .getConfigChangeEventForComponent(NZ_CONFIG_COMPONENT_NAME) .pipe(takeUntil(_this.destroy$)) .subscribe((/** * @return {?} */ function () { _this.updateMaskClassname(); })); return _this; } Object.defineProperty(BaseModalContainer.prototype, "showMask", { get: /** * @return {?} */ function () { /** @type {?} */ var defaultConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_COMPONENT_NAME) || {}; return !!getValueWithConfig(this.config.nzMask, defaultConfig.nzMask, true); }, enumerable: true, configurable: true }); Object.defineProperty(BaseModalContainer.prototype, "maskClosable", { get: /** * @return {?} */ function () { /** @type {?} */ var defaultConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_COMPONENT_NAME) || {}; return !!getValueWithConfig(this.config.nzMaskClosable, defaultConfig.nzMaskClosable, true); }, enumerable: true, configurable: true }); /** * @param {?} e * @return {?} */ BaseModalContainer.prototype.onMousedown = /** * @param {?} e * @return {?} */ function (e) { this.latestMousedownTarget = ((/** @type {?} */ (e.target))) || null; }; /** * @param {?} e * @return {?} */ BaseModalContainer.prototype.onMouseup = /** * @param {?} e * @return {?} */ function (e) { if (e.target === this.latestMousedownTarget && e.target === this.elementRef.nativeElement && this.showMask && this.maskClosable) { this.containerClick.emit(); } this.latestMousedownTarget = null; }; /** * @return {?} */ BaseModalContainer.prototype.onCloseClick = /** * @return {?} */ function () { this.cancelTriggered.emit(); }; /** * @return {?} */ BaseModalContainer.prototype.onOkClick = /** * @return {?} */ function () { this.okTriggered.emit(); }; /** * @template T * @param {?} portal * @return {?} */ BaseModalContainer.prototype.attachComponentPortal = /** * @template T * @param {?} portal * @return {?} */ function (portal) { if (this.portalOutlet.hasAttached()) { throwNzModalContentAlreadyAttachedError(); } this.savePreviouslyFocusedElement(); this.setModalTransformOrigin(); return this.portalOutlet.attachComponentPortal(portal); }; /** * @template C * @param {?} portal * @return {?} */ BaseModalContainer.prototype.attachTemplatePortal = /** * @template C * @param {?} portal * @return {?} */ function (portal) { if (this.portalOutlet.hasAttached()) { throwNzModalContentAlreadyAttachedError(); } this.savePreviouslyFocusedElement(); return this.portalOutlet.attachTemplatePortal(portal); }; /** * @return {?} */ BaseModalContainer.prototype.getNativeElement = /** * @return {?} */ function () { return this.elementRef.nativeElement; }; /** * @private * @return {?} */ BaseModalContainer.prototype.animationDisabled = /** * @private * @return {?} */ function () { return this.config.nzNoAnimation || this.animationType === 'NoopAnimations'; }; /** * @private * @return {?} */ BaseModalContainer.prototype.setModalTransformOrigin = /** * @private * @return {?} */ function () { /** @type {?} */ var modalElement = this.modalElementRef.nativeElement; if ((/** @type {?} */ (this.elementFocusedBeforeModalWasOpened))) { /** @type {?} */ var previouslyDOMRect = (/** @type {?} */ (this.elementFocusedBeforeModalWasOpened)).getBoundingClientRect(); /** @type {?} */ var lastPosition = getElementOffset((/** @type {?} */ (this.elementFocusedBeforeModalWasOpened))); /** @type {?} */ var x = lastPosition.left + previouslyDOMRect.width / 2; /** @type {?} */ var y = lastPosition.top + previouslyDOMRect.height / 2; /** @type {?} */ var transformOrigin = x - modalElement.offsetLeft + "px " + (y - modalElement.offsetTop) + "px 0px"; this.render.setStyle(modalElement, 'transform-origin', transformOrigin); } }; /** * @private * @return {?} */ BaseModalContainer.prototype.savePreviouslyFocusedElement = /** * @private * @return {?} */ function () { var _this = this; if (this.document) { this.elementFocusedBeforeModalWasOpened = (/** @type {?} */ (this.document.activeElement)); if (this.elementRef.nativeElement.focus) { Promise.resolve().then((/** * @return {?} */ function () { return _this.elementRef.nativeElement.focus(); })); } } }; /** * @private * @return {?} */ BaseModalContainer.prototype.trapFocus = /** * @private * @return {?} */ function () { /** @type {?} */ var element = this.elementRef.nativeElement; if (!this.focusTrap) { this.focusTrap = this.focusTrapFactory.create(element); } if (this.config.nzAutofocus) { this.focusTrap.focusInitialElementWhenReady().then(); } else { /** @type {?} */ var activeElement = this.document.activeElement; if (activeElement !== element && !element.contains(activeElement)) { element.focus(); } } }; /** * @private * @return {?} */ BaseModalContainer.prototype.restoreFocus = /** * @private * @return {?} */ function () { /** @type {?} */ var toFocus = (/** @type {?} */ (this.elementFocusedBeforeModalWasOpened)); // We need the extra check, because IE can set the `activeElement` to null in some cases. if (toFocus && typeof toFocus.focus === 'function') { /** @type {?} */ var activeElement = (/** @type {?} */ (this.document.activeElement)); /** @type {?} */ var element = this.elementRef.nativeElement; if (!activeElement || activeElement === this.document.body || activeElement === element || element.contains(activeElement)) { toFocus.focus(); } } if (this.focusTrap) { this.focusTrap.destroy(); } }; /** * @private * @return {?} */ BaseModalContainer.prototype.setEnterAnimationClass = /** * @private * @return {?} */ function () { var _this = this; if (this.animationDisabled()) { return; } this.zone.runOutsideAngular((/** * @return {?} */ function () { // Make sure to set the `TransformOrigin` style before set the modelElement's class names _this.setModalTransformOrigin(); /** @type {?} */ var modalElement = _this.modalElementRef.nativeElement; /** @type {?} */ var backdropElement = _this.overlayRef.backdropElement; _this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.enter); _this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.enterActive); _this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.enter); _this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.enterActive); })); }; /** * @private * @return {?} */ BaseModalContainer.prototype.setExitAnimationClass = /** * @private * @return {?} */ function () { var _this = this; this.zone.runOutsideAngular((/** * @return {?} */ function () { /** @type {?} */ var modalElement = _this.modalElementRef.nativeElement; /** @type {?} */ var backdropElement = _this.overlayRef.backdropElement; if (_this.animationDisabled()) { // https://github.com/angular/components/issues/18645 _this.render.removeClass(backdropElement, MODAL_MASK_CLASS_NAME); return; } _this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.leave); _this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.leaveActive); _this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.leave); _this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.leaveActive); })); }; /** * @private * @return {?} */ BaseModalContainer.prototype.cleanAnimationClass = /** * @private * @return {?} */ function () { var _this = this; if (this.animationDisabled()) { return; } this.zone.runOutsideAngular((/** * @return {?} */ function () { /** @type {?} */ var backdropElement = _this.overlayRef.backdropElement; /** @type {?} */ var modalElement = _this.modalElementRef.nativeElement; _this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.enter); _this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.enterActive); _this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.leave); _this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.leaveActive); _this.render.removeClass(backdropElement, FADE_CLASS_NAME_MAP.enter); _this.render.removeClass(backdropElement, FADE_CLASS_NAME_MAP.enterActive); })); }; /** * @private * @return {?} */ BaseModalContainer.prototype.bindBackdropStyle = /** * @private * @return {?} */ function () { var _this = this; this.zone.runOutsideAngular((/** * @return {?} */ function () { if (_this.oldMaskStyle) { /** @type {?} */ var backdropElement_1 = _this.overlayRef.backdropElement; /** @type {?} */ var styles = (/** @type {?} */ (_this.oldMaskStyle)); Object.keys(styles).forEach((/** * @param {?} key * @return {?} */ function (key) { _this.render.removeStyle(backdropElement_1, key); })); _this.oldMaskStyle = null; } if (typeof _this.config.nzMaskStyle === 'object' && Object.keys(_this.config.nzMaskStyle).length) { /** @type {?} */ var backdropElement_2 = _this.overlayRef.backdropElement; /** @type {?} */ var styles_1 = __assign({}, _this.config.nzMaskStyle); Object.keys(styles_1).forEach((/** * @param {?} key * @return {?} */ function (key) { _this.render.setStyle(backdropElement_2, key, styles_1[key]); })); _this.oldMaskStyle = styles_1; } })); }; /** * Set the container element. * @deprecated Not supported. * @breaking-change 10.0.0 */ /** * Set the container element. * @deprecated Not supported. * \@breaking-change 10.0.0 * @private * @return {?} */ BaseModalContainer.prototype.setContainer = /** * Set the container element. * @deprecated Not supported. * \@breaking-change 10.0.0 * @private * @return {?} */ function () { /** @type {?} */ var container = this.getContainer(); if (container) { this.render.appendChild(container, this.elementRef.nativeElement); } }; /** * Reset the container element. * @deprecated Not supported. * @breaking-change 10.0.0 */ /** * Reset the container element. * @deprecated Not supported. * \@breaking-change 10.0.0 * @private * @return {?} */ BaseModalContainer.prototype.resetContainer = /** * Reset the container element. * @deprecated Not supported. * \@breaking-change 10.0.0 * @private * @return {?} */ function () { /** @type {?} */ var container = this.getContainer(); if (container) { this.render.appendChild(this.overlayRef.overlayElement, this.elementRef.nativeElement); } }; /** * @private * @return {?} */ BaseModalContainer.prototype.getContainer = /** * @private * @return {?} */ function () { var nzGetContainer = this.config.nzGetContainer; /** @type {?} */ var container = typeof nzGetContainer === 'function' ? nzGetContainer() : nzGetContainer; return container instanceof HTMLElement ? container : null; }; /** * @return {?} */ BaseModalContainer.prototype.updateMaskClassname = /** * @return {?} */ function () { /** @type {?} */ var backdropElement = this.overlayRef.backdropElement; if (this.showMask) { this.render.addClass(backdropElement, MODAL_MASK_CLASS_NAME); } else { this.render.removeClass(backdropElement, MODAL_MASK_CLASS_NAME); } }; /** * @param {?} event * @return {?} */ BaseModalContainer.prototype.onAnimationDone = /** * @param {?} event * @return {?} */ function (event) { if (event.toState === 'void') { return; } if (event.toState === 'enter') { this.setContainer(); this.trapFocus(); } else if (event.toState === 'exit') { this.restoreFocus(); } this.cleanAnimationClass(); this.animationStateChanged.emit(event); }; /** * @param {?} event * @return {?} */ BaseModalContainer.prototype.onAnimationStart = /** * @param {?} event * @return {?} */ function (event) { if (event.toState === 'enter') { this.setEnterAnimationClass(); this.bindBackdropStyle(); } else if (event.toState === 'exit') { this.resetContainer(); this.setExitAnimationClass(); } this.animationStateChanged.emit(event); }; /** * @return {?} */ BaseModalContainer.prototype.startExitAnimation = /** * @return {?} */ function () { this.state = 'exit'; this.cdr.markForCheck(); }; /** * @return {?} */ BaseModalContainer.prototype.ngOnDestroy = /** * @return {?} */ function () { this.onDestroy.emit(); this.destroy$.next(); this.destroy$.complete(); }; return BaseModalContainer; }(BasePortalOutlet)); export { BaseModalContainer }; if (false) { /** @type {?} */ BaseModalContainer.prototype.portalOutlet; /** @type {?} */ BaseModalContainer.prototype.modalElementRef; /** @type {?} */ BaseModalContainer.prototype.animationStateChanged; /** @type {?} */ BaseModalContainer.prototype.containerClick; /** @type {?} */ BaseModalContainer.prototype.cancelTriggered; /** @type {?} */ BaseModalContainer.prototype.okTriggered; /** @type {?} */ BaseModalContainer.prototype.onDestroy; /** @type {?} */ BaseModalContainer.prototype.state; /** @type {?} */ BaseModalContainer.prototype.document; /** @type {?} */ BaseModalContainer.prototype.modalRef; /** @type {?} */ BaseModalContainer.prototype.isStringContent; /** * @type {?} * @private */ BaseModalContainer.prototype.elementFocusedBeforeModalWasOpened; /** * @type {?} * @private */ BaseModalContainer.prototype.focusTrap; /** * @type {?} * @private */ BaseModalContainer.prototype.latestMousedownTarget; /** * @type {?} * @private */ BaseModalContainer.prototype.oldMaskStyle; /** * @type {?} * @protected */ BaseModalContainer.prototype.destroy$; /** * @type {?} * @protected */ BaseModalContainer.prototype.elementRef; /** * @type {?} * @protected */ BaseModalContainer.prototype.focusTrapFactory; /** @type {?} */ BaseModalContainer.prototype.cdr; /** * @type {?} * @protected */ BaseModalContainer.prototype.render; /** * @type {?} * @protected */ BaseModalContainer.prototype.zone; /** * @type {?} * @protected */ BaseModalContainer.prototype.overlayRef; /** * @type {?} * @protected */ BaseModalContainer.prototype.nzConfigService; /** @type {?} */ BaseModalContainer.prototype.config; /** * @type {?} * @protected */ BaseModalContainer.prototype.animationType; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9tb2RhbC8iLCJzb3VyY2VzIjpbIm1vZGFsLWNvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBV0EsT0FBTyxFQUFFLGdCQUFnQixFQUFvRCxNQUFNLHFCQUFxQixDQUFDO0FBQ3pHLE9BQU8sRUFBZ0UsWUFBWSxFQUFnQyxNQUFNLGVBQWUsQ0FBQztBQUd6SSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUkzSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxTQUFTLENBQUM7Ozs7QUFFN0MsTUFBTSxVQUFVLHVDQUF1QztJQUNyRCxNQUFNLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRDtJQUF3QyxzQ0FBZ0I7SUFnQ3RELDRCQUNZLFVBQXNCLEVBQ3RCLGdCQUFrQyxFQUNyQyxHQUFzQixFQUNuQixNQUFpQixFQUNqQixJQUFZLEVBQ1osVUFBc0IsRUFDdEIsZUFBZ0MsRUFDbkMsTUFBb0IsRUFDM0IsUUFBb0IsRUFDVixhQUFzQjtRQVZsQyxZQVlFLGlCQUFPLFNBVVI7UUFyQlcsZ0JBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsc0JBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNyQyxTQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNuQixZQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLFVBQUksR0FBSixJQUFJLENBQVE7UUFDWixnQkFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixxQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDbkMsWUFBTSxHQUFOLE1BQU0sQ0FBYztRQUVqQixtQkFBYSxHQUFiLGFBQWEsQ0FBUztRQXRDbEMsMkJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDM0Qsb0JBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzFDLHFCQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMzQyxpQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDdkMsZUFBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFckMsV0FBSyxHQUE4QixPQUFPLENBQUM7UUFHM0MscUJBQWUsR0FBWSxLQUFLLENBQUM7UUFDekIsd0NBQWtDLEdBQXVCLElBQUksQ0FBQztRQUU5RCwyQkFBcUIsR0FBdUIsSUFBSSxDQUFDO1FBQ2pELGtCQUFZLEdBQXFDLElBQUksQ0FBQztRQUNwRCxjQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQTJCakMsS0FBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsS0FBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDO1FBQzVELEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixLQUFJLENBQUMsZUFBZTthQUNqQixnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQzthQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTOzs7UUFBQztZQUNULEtBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsRUFBQyxDQUFDOztJQUNQLENBQUM7SUFsQ0Qsc0JBQUksd0NBQVE7Ozs7UUFBWjs7Z0JBQ1EsYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFO1lBRWhHLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkYsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSw0Q0FBWTs7OztRQUFoQjs7Z0JBQ1EsYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFO1lBRWhHLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkcsQ0FBQzs7O09BQUE7Ozs7O0lBMEJELHdDQUFXOzs7O0lBQVgsVUFBWSxDQUFhO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLG1CQUFBLENBQUMsQ0FBQyxNQUFNLEVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNqRSxDQUFDOzs7OztJQUVELHNDQUFTOzs7O0lBQVQsVUFBVSxDQUFhO1FBQ3JCLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDL0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUM1QjtRQUNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELHlDQUFZOzs7SUFBWjtRQUNFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQzs7OztJQUVELHNDQUFTOzs7SUFBVDtRQUNFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7O0lBRUQsa0RBQXFCOzs7OztJQUFyQixVQUF5QixNQUEwQjtRQUNqRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDbkMsdUNBQXVDLEVBQUUsQ0FBQztTQUMzQztRQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RCxDQUFDOzs7Ozs7SUFFRCxpREFBb0I7Ozs7O0lBQXBCLFVBQXdCLE1BQXlCO1FBQy9DLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNuQyx1Q0FBdUMsRUFBRSxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7Ozs7SUFFRCw2Q0FBZ0I7OztJQUFoQjtRQUNFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQzs7Ozs7SUFFTyw4Q0FBaUI7Ozs7SUFBekI7UUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssZ0JBQWdCLENBQUM7SUFDOUUsQ0FBQzs7Ozs7SUFFTyxvREFBdUI7Ozs7SUFBL0I7O1lBQ1EsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYTtRQUN2RCxJQUFJLG1CQUFBLElBQUksQ0FBQyxrQ0FBa0MsRUFBZSxFQUFFOztnQkFDcEQsaUJBQWlCLEdBQUcsbUJBQUEsSUFBSSxDQUFDLGtDQUFrQyxFQUFDLENBQUMscUJBQXFCLEVBQUU7O2dCQUNwRixZQUFZLEdBQUcsZ0JBQWdCLENBQUMsbUJBQUEsSUFBSSxDQUFDLGtDQUFrQyxFQUFDLENBQUM7O2dCQUN6RSxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQzs7Z0JBQ25ELENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDOztnQkFDbkQsZUFBZSxHQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsVUFBVSxZQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxZQUFRO1lBQzlGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxlQUFlLENBQUMsQ0FBQztTQUN6RTtJQUNILENBQUM7Ozs7O0lBRU8seURBQTRCOzs7O0lBQXBDO1FBQUEsaUJBT0M7UUFOQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLG1CQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFlLENBQUM7WUFDckYsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJOzs7Z0JBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFyQyxDQUFxQyxFQUFDLENBQUM7YUFDckU7U0FDRjtJQUNILENBQUM7Ozs7O0lBRU8sc0NBQVM7Ozs7SUFBakI7O1lBQ1EsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtRQUU3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN0RDthQUFNOztnQkFDQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhO1lBQ2pELElBQUksYUFBYSxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ2pFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNqQjtTQUNGO0lBQ0gsQ0FBQzs7Ozs7SUFFTyx5Q0FBWTs7OztJQUFwQjs7WUFDUSxPQUFPLEdBQUcsbUJBQUEsSUFBSSxDQUFDLGtDQUFrQyxFQUFlO1FBRXRFLHlGQUF5RjtRQUN6RixJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFOztnQkFDNUMsYUFBYSxHQUFHLG1CQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFXOztnQkFDdEQsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtZQUU3QyxJQUFJLENBQUMsYUFBYSxJQUFJLGFBQWEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxhQUFhLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQzFILE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNqQjtTQUNGO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDOzs7OztJQUVPLG1EQUFzQjs7OztJQUE5QjtRQUFBLGlCQWNDO1FBYkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUM7WUFDMUIseUZBQXlGO1lBQ3pGLEtBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDOztnQkFDekIsWUFBWSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsYUFBYTs7Z0JBQ2pELGVBQWUsR0FBRyxLQUFJLENBQUMsVUFBVSxDQUFDLGVBQWU7WUFDdkQsS0FBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlELEtBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwRSxLQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFTyxrREFBcUI7Ozs7SUFBN0I7UUFBQSxpQkFnQkM7UUFmQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUM7O2dCQUNwQixZQUFZLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhOztnQkFDakQsZUFBZSxHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUMsZUFBZTtZQUV2RCxJQUFJLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO2dCQUM1QixxREFBcUQ7Z0JBQ3JELEtBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPO2FBQ1I7WUFFRCxLQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsS0FBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BFLEtBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRSxLQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekUsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUVPLGdEQUFtQjs7OztJQUEzQjtRQUFBLGlCQWNDO1FBYkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUM7O2dCQUNwQixlQUFlLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlOztnQkFDakQsWUFBWSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsYUFBYTtZQUN2RCxLQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZFLEtBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRSxLQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLEtBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RSxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRU8sOENBQWlCOzs7O0lBQXpCO1FBQUEsaUJBb0JDO1FBbkJDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCOzs7UUFBQztZQUMxQixJQUFJLEtBQUksQ0FBQyxZQUFZLEVBQUU7O29CQUNmLGlCQUFlLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlOztvQkFDakQsTUFBTSxHQUFHLG1CQUFBLEtBQUksQ0FBQyxZQUFZLEVBQTZCO2dCQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU87Ozs7Z0JBQUMsVUFBQSxHQUFHO29CQUM3QixLQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxpQkFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRCxDQUFDLEVBQUMsQ0FBQztnQkFDSCxLQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzthQUMxQjtZQUVELElBQUksT0FBTyxLQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sRUFBRTs7b0JBQ3hGLGlCQUFlLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlOztvQkFDakQsUUFBTSxnQkFBbUMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUU7Z0JBQ3hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBTSxDQUFDLENBQUMsT0FBTzs7OztnQkFBQyxVQUFBLEdBQUc7b0JBQzdCLEtBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFlLEVBQUUsR0FBRyxFQUFFLFFBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLEVBQUMsQ0FBQztnQkFDSCxLQUFJLENBQUMsWUFBWSxHQUFHLFFBQU0sQ0FBQzthQUM1QjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7O0lBQ0sseUNBQVk7Ozs7Ozs7SUFBcEI7O1lBQ1EsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7UUFDckMsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7OztJQUNLLDJDQUFjOzs7Ozs7O0lBQXRCOztZQUNRLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ3JDLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN4RjtJQUNILENBQUM7Ozs7O0lBRU8seUNBQVk7Ozs7SUFBcEI7UUFDVSxJQUFBLDJDQUFjOztZQUNoQixTQUFTLEdBQUcsT0FBTyxjQUFjLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYztRQUMxRixPQUFPLFNBQVMsWUFBWSxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdELENBQUM7Ozs7SUFFRCxnREFBbUI7OztJQUFuQjs7WUFDUSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlO1FBQ3ZELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUscUJBQXFCLENBQUMsQ0FBQztTQUM5RDthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLHFCQUFxQixDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDOzs7OztJQUVELDRDQUFlOzs7O0lBQWYsVUFBZ0IsS0FBcUI7UUFDbkMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO1lBQ25DLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtRQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7Ozs7SUFFRCw2Q0FBZ0I7Ozs7SUFBaEIsVUFBaUIsS0FBcUI7UUFDcEMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUM3QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDOzs7O0lBRUQsK0NBQWtCOzs7SUFBbEI7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7SUFFRCx3Q0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0gseUJBQUM7QUFBRCxDQUFDLEFBOVNELENBQXdDLGdCQUFnQixHQThTdkQ7Ozs7SUE3U0MsMENBQStCOztJQUMvQiw2Q0FBNkM7O0lBRTdDLG1EQUEyRDs7SUFDM0QsNENBQTBDOztJQUMxQyw2Q0FBMkM7O0lBQzNDLHlDQUF1Qzs7SUFDdkMsdUNBQXFDOztJQUVyQyxtQ0FBMkM7O0lBQzNDLHNDQUFtQjs7SUFDbkIsc0NBQXNCOztJQUN0Qiw2Q0FBaUM7Ozs7O0lBQ2pDLGdFQUFzRTs7Ozs7SUFDdEUsdUNBQThCOzs7OztJQUM5QixtREFBeUQ7Ozs7O0lBQ3pELDBDQUE4RDs7Ozs7SUFDOUQsc0NBQW1DOzs7OztJQWVqQyx3Q0FBZ0M7Ozs7O0lBQ2hDLDhDQUE0Qzs7SUFDNUMsaUNBQTZCOzs7OztJQUM3QixvQ0FBMkI7Ozs7O0lBQzNCLGtDQUFzQjs7Ozs7SUFDdEIsd0NBQWdDOzs7OztJQUNoQyw2Q0FBMEM7O0lBQzFDLG9DQUEyQjs7Ozs7SUFFM0IsMkNBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBGb2N1c1RyYXAsIEZvY3VzVHJhcEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQmFzZVBvcnRhbE91dGxldCwgQ2RrUG9ydGFsT3V0bGV0LCBDb21wb25lbnRQb3J0YWwsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpDb25maWdTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudE9mZnNldCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZBREVfQ0xBU1NfTkFNRV9NQVAsIE1PREFMX01BU0tfQ0xBU1NfTkFNRSwgTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FLCBaT09NX0NMQVNTX05BTUVfTUFQIH0gZnJvbSAnLi9tb2RhbC1jb25maWcnO1xuXG5pbXBvcnQgeyBOek1vZGFsUmVmIH0gZnJvbSAnLi9tb2RhbC1yZWYnO1xuaW1wb3J0IHsgTW9kYWxPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC10eXBlcyc7XG5pbXBvcnQgeyBnZXRWYWx1ZVdpdGhDb25maWcgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpOiBuZXZlciB7XG4gIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBtb2RhbCBjb250ZW50IGFmdGVyIGNvbnRlbnQgaXMgYWxyZWFkeSBhdHRhY2hlZCcpO1xufVxuXG5leHBvcnQgY2xhc3MgQmFzZU1vZGFsQ29udGFpbmVyIGV4dGVuZHMgQmFzZVBvcnRhbE91dGxldCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHBvcnRhbE91dGxldCE6IENka1BvcnRhbE91dGxldDtcbiAgbW9kYWxFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgYW5pbWF0aW9uU3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxBbmltYXRpb25FdmVudD4oKTtcbiAgY29udGFpbmVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIGNhbmNlbFRyaWdnZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgb2tUcmlnZ2VyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIG9uRGVzdHJveSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBzdGF0ZTogJ3ZvaWQnIHwgJ2VudGVyJyB8ICdleGl0JyA9ICdlbnRlcic7XG4gIGRvY3VtZW50OiBEb2N1bWVudDtcbiAgbW9kYWxSZWYhOiBOek1vZGFsUmVmO1xuICBpc1N0cmluZ0NvbnRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBlbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZvY3VzVHJhcCE6IEZvY3VzVHJhcDtcbiAgcHJpdmF0ZSBsYXRlc3RNb3VzZWRvd25UYXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb2xkTWFza1N0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgZ2V0IHNob3dNYXNrKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSB0aGlzLm56Q29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FKSB8fCB7fTtcblxuICAgIHJldHVybiAhIWdldFZhbHVlV2l0aENvbmZpZzxib29sZWFuPih0aGlzLmNvbmZpZy5uek1hc2ssIGRlZmF1bHRDb25maWcubnpNYXNrLCB0cnVlKTtcbiAgfVxuXG4gIGdldCBtYXNrQ2xvc2FibGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHRoaXMubnpDb25maWdTZXJ2aWNlLmdldENvbmZpZ0ZvckNvbXBvbmVudChOWl9DT05GSUdfQ09NUE9ORU5UX05BTUUpIHx8IHt9O1xuXG4gICAgcmV0dXJuICEhZ2V0VmFsdWVXaXRoQ29uZmlnPGJvb2xlYW4+KHRoaXMuY29uZmlnLm56TWFza0Nsb3NhYmxlLCBkZWZhdWx0Q29uZmlnLm56TWFza0Nsb3NhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBmb2N1c1RyYXBGYWN0b3J5OiBGb2N1c1RyYXBGYWN0b3J5LFxuICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCByZW5kZXI6IFJlbmRlcmVyMixcbiAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lLFxuICAgIHByb3RlY3RlZCBvdmVybGF5UmVmOiBPdmVybGF5UmVmLFxuICAgIHByb3RlY3RlZCBuekNvbmZpZ1NlcnZpY2U6IE56Q29uZmlnU2VydmljZSxcbiAgICBwdWJsaWMgY29uZmlnOiBNb2RhbE9wdGlvbnMsXG4gICAgZG9jdW1lbnQ/OiBOelNhZmVBbnksXG4gICAgcHJvdGVjdGVkIGFuaW1hdGlvblR5cGU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgdGhpcy5pc1N0cmluZ0NvbnRlbnQgPSB0eXBlb2YgY29uZmlnLm56Q29udGVudCA9PT0gJ3N0cmluZyc7XG4gICAgdGhpcy5zZXRDb250YWluZXIoKTtcbiAgICB0aGlzLm56Q29uZmlnU2VydmljZVxuICAgICAgLmdldENvbmZpZ0NoYW5nZUV2ZW50Rm9yQ29tcG9uZW50KE5aX0NPTkZJR19DT01QT05FTlRfTkFNRSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZU1hc2tDbGFzc25hbWUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgb25Nb3VzZWRvd24oZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubGF0ZXN0TW91c2Vkb3duVGFyZ2V0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSB8fCBudWxsO1xuICB9XG5cbiAgb25Nb3VzZXVwKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IHRoaXMubGF0ZXN0TW91c2Vkb3duVGFyZ2V0ICYmIGUudGFyZ2V0ID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCAmJiB0aGlzLnNob3dNYXNrICYmIHRoaXMubWFza0Nsb3NhYmxlKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lckNsaWNrLmVtaXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXRlc3RNb3VzZWRvd25UYXJnZXQgPSBudWxsO1xuICB9XG5cbiAgb25DbG9zZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsVHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uT2tDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9rVHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIGF0dGFjaENvbXBvbmVudFBvcnRhbDxUPihwb3J0YWw6IENvbXBvbmVudFBvcnRhbDxUPik6IENvbXBvbmVudFJlZjxUPiB7XG4gICAgaWYgKHRoaXMucG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICB0aGlzLnNldE1vZGFsVHJhbnNmb3JtT3JpZ2luKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbChwb3J0YWwpO1xuICB9XG5cbiAgYXR0YWNoVGVtcGxhdGVQb3J0YWw8Qz4ocG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDxDPik6IEVtYmVkZGVkVmlld1JlZjxDPiB7XG4gICAgaWYgKHRoaXMucG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKTtcbiAgfVxuXG4gIGdldE5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0aW9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm56Tm9BbmltYXRpb24gfHwgdGhpcy5hbmltYXRpb25UeXBlID09PSAnTm9vcEFuaW1hdGlvbnMnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNb2RhbFRyYW5zZm9ybU9yaWdpbigpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLm1vZGFsRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgYXMgSFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzbHlET01SZWN0ID0gdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkIS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IGdldEVsZW1lbnRPZmZzZXQodGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkISk7XG4gICAgICBjb25zdCB4ID0gbGFzdFBvc2l0aW9uLmxlZnQgKyBwcmV2aW91c2x5RE9NUmVjdC53aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gbGFzdFBvc2l0aW9uLnRvcCArIHByZXZpb3VzbHlET01SZWN0LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1PcmlnaW4gPSBgJHt4IC0gbW9kYWxFbGVtZW50Lm9mZnNldExlZnR9cHggJHt5IC0gbW9kYWxFbGVtZW50Lm9mZnNldFRvcH1weCAwcHhgO1xuICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUobW9kYWxFbGVtZW50LCAndHJhbnNmb3JtLW9yaWdpbicsIHRyYW5zZm9ybU9yaWdpbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRvY3VtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgPSB0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYXBGb2N1cygpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICB0aGlzLmZvY3VzVHJhcCA9IHRoaXMuZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm56QXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCkudGhlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgIT09IGVsZW1lbnQgJiYgIWVsZW1lbnQuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUZvY3VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRvRm9jdXMgPSB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAvLyBXZSBuZWVkIHRoZSBleHRyYSBjaGVjaywgYmVjYXVzZSBJRSBjYW4gc2V0IHRoZSBgYWN0aXZlRWxlbWVudGAgdG8gbnVsbCBpbiBzb21lIGNhc2VzLlxuICAgIGlmICh0b0ZvY3VzICYmIHR5cGVvZiB0b0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ID09PSB0aGlzLmRvY3VtZW50LmJvZHkgfHwgYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudCB8fCBlbGVtZW50LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRvRm9jdXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVudGVyQW5pbWF0aW9uQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gTWFrZSBzdXJlIHRvIHNldCB0aGUgYFRyYW5zZm9ybU9yaWdpbmAgc3R5bGUgYmVmb3JlIHNldCB0aGUgbW9kZWxFbGVtZW50J3MgY2xhc3MgbmFtZXNcbiAgICAgIHRoaXMuc2V0TW9kYWxUcmFuc2Zvcm1PcmlnaW4oKTtcbiAgICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IHRoaXMubW9kYWxFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmVudGVyKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5lbnRlckFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAuZW50ZXIpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RXhpdEFuaW1hdGlvbkNsYXNzKCk6IHZvaWQge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLm1vZGFsRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcblxuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uRGlzYWJsZWQoKSkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xODY0NVxuICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIE1PREFMX01BU0tfQ0xBU1NfTkFNRSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZUFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAubGVhdmUpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmxlYXZlQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5BbmltYXRpb25DbGFzcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25EaXNhYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgY29uc3QgbW9kYWxFbGVtZW50ID0gdGhpcy5tb2RhbEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5lbnRlcik7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhtb2RhbEVsZW1lbnQsIFpPT01fQ0xBU1NfTkFNRV9NQVAuZW50ZXJBY3RpdmUpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZUFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAuZW50ZXIpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZEJhY2tkcm9wU3R5bGUoKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9sZE1hc2tTdHlsZSkge1xuICAgICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLm9sZE1hc2tTdHlsZSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVTdHlsZShiYWNrZHJvcEVsZW1lbnQsIGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9sZE1hc2tTdHlsZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcubnpNYXNrU3R5bGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLm56TWFza1N0eWxlKS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi50aGlzLmNvbmZpZy5uek1hc2tTdHlsZSB9O1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZShiYWNrZHJvcEVsZW1lbnQsIGtleSwgc3R5bGVzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbGRNYXNrU3R5bGUgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICogQGRlcHJlY2F0ZWQgTm90IHN1cHBvcnRlZC5cbiAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjBcbiAgICovXG4gIHByaXZhdGUgc2V0Q29udGFpbmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKCk7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICogQGRlcHJlY2F0ZWQgTm90IHN1cHBvcnRlZC5cbiAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjBcbiAgICovXG4gIHByaXZhdGUgcmVzZXRDb250YWluZXIoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnJlbmRlci5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHsgbnpHZXRDb250YWluZXIgfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHR5cGVvZiBuekdldENvbnRhaW5lciA9PT0gJ2Z1bmN0aW9uJyA/IG56R2V0Q29udGFpbmVyKCkgOiBuekdldENvbnRhaW5lcjtcbiAgICByZXR1cm4gY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBjb250YWluZXIgOiBudWxsO1xuICB9XG5cbiAgdXBkYXRlTWFza0NsYXNzbmFtZSgpOiB2b2lkIHtcbiAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgIGlmICh0aGlzLnNob3dNYXNrKSB7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIE1PREFMX01BU0tfQ0xBU1NfTkFNRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKGJhY2tkcm9wRWxlbWVudCwgTU9EQUxfTUFTS19DTEFTU19OQU1FKTtcbiAgICB9XG4gIH1cblxuICBvbkFuaW1hdGlvbkRvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICd2b2lkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2VudGVyJykge1xuICAgICAgdGhpcy5zZXRDb250YWluZXIoKTtcbiAgICAgIHRoaXMudHJhcEZvY3VzKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC50b1N0YXRlID09PSAnZXhpdCcpIHtcbiAgICAgIHRoaXMucmVzdG9yZUZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMuY2xlYW5BbmltYXRpb25DbGFzcygpO1xuICAgIHRoaXMuYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25BbmltYXRpb25TdGFydChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2VudGVyJykge1xuICAgICAgdGhpcy5zZXRFbnRlckFuaW1hdGlvbkNsYXNzKCk7XG4gICAgICB0aGlzLmJpbmRCYWNrZHJvcFN0eWxlKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC50b1N0YXRlID09PSAnZXhpdCcpIHtcbiAgICAgIHRoaXMucmVzZXRDb250YWluZXIoKTtcbiAgICAgIHRoaXMuc2V0RXhpdEFuaW1hdGlvbkNsYXNzKCk7XG4gICAgfVxuICAgIHRoaXMuYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgc3RhcnRFeGl0QW5pbWF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnZXhpdCc7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5lbWl0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=