@greg-md/ng-flex-css-layout
Version:
Flex-CSS-Layout is an alternative behaviour of Flex-Layout directives, that will still work with Angular Universal and App Shell.
3,287 lines • 253 kB
JavaScript
import { __extends, __read } from 'tslib';
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import { Injectable, Inject, InjectionToken, Directive, ElementRef, Input, Renderer2, Optional, Self, Host, SkipSelf, PLATFORM_ID, NgModule } from '@angular/core';
import { ReplaySubject } from 'rxjs';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @license
* Copyright Google LLC 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://angular.io/license
*/
/**
* Applies CSS prefixes to appropriate style keys.
*
* Note: `-ms-`, `-moz` and `-webkit-box` are no longer supported. e.g.
* {
* display: -webkit-flex; NEW - Safari 6.1+. iOS 7.1+, BB10
* display: flex; NEW, Spec - Firefox, Chrome, Opera
* // display: -webkit-box; OLD - iOS 6-, Safari 3.1-6, BB7
* // display: -ms-flexbox; TWEENER - IE 10
* // display: -moz-flexbox; OLD - Firefox
* }
* @param {?} target
* @return {?}
*/
function applyCssPrefixes(target) {
Object.keys(target).forEach(function (key) {
var /** @type {?} */ value = target[key] || '';
switch (key) {
case 'display':
if (value === 'flex') {
target['display'] = [
'-webkit-flex',
'flex'
];
}
else if (value === 'inline-flex') {
target['display'] = [
'-webkit-inline-flex',
'inline-flex'
];
}
else {
target['display'] = value;
}
break;
case 'align-items':
case 'align-self':
case 'align-content':
case 'flex':
case 'flex-basis':
case 'flex-flow':
case 'flex-grow':
case 'flex-shrink':
case 'flex-wrap':
case 'justify-content':
target['-webkit-' + key] = value;
break;
case 'flex-direction':
value = value || 'row';
target['-webkit-flex-direction'] = value;
target['flex-direction'] = value;
break;
case 'order':
target['order'] = target['-webkit-' + key] = isNaN(value) ? '0' : value;
break;
}
});
return target;
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @license
* Copyright Google LLC 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://angular.io/license
*/
var /** @type {?} */ INLINE = 'inline';
var /** @type {?} */ LAYOUT_VALUES = ['row', 'column', 'row-reverse', 'column-reverse'];
/**
* Validate the value to be one of the acceptable value options
* Use default fallback of 'row'
* @param {?} value
* @return {?}
*/
function validateValue(value) {
value = value ? value.toLowerCase() : '';
var _a = __read(value.split(' '), 3), direction = _a[0], wrap = _a[1], inline = _a[2];
// First value must be the `flex-direction`
if (!LAYOUT_VALUES.find(function (x) { return x === direction; })) {
direction = LAYOUT_VALUES[0];
}
if (wrap === INLINE) {
wrap = (inline !== INLINE) ? inline : '';
inline = INLINE;
}
return [direction, validateWrapValue(wrap), !!inline];
}
/**
* Determine if the validated, flex-direction value specifies
* a horizontal/row flow.
* @param {?} value
* @return {?}
*/
function isFlowHorizontal(value) {
var _a = __read(validateValue(value), 1), flow = _a[0];
return flow.indexOf('row') > -1;
}
/**
* Convert layout-wrap='<value>' to expected flex-wrap style
* @param {?} value
* @return {?}
*/
function validateWrapValue(value) {
if (!!value) {
switch (value.toLowerCase()) {
case 'reverse':
case 'wrap-reverse':
case 'reverse-wrap':
value = 'wrap-reverse';
break;
case 'no':
case 'none':
case 'nowrap':
value = 'nowrap';
break;
// All other values fallback to 'wrap'
default:
value = 'wrap';
break;
}
}
return value;
}
/**
* Build the CSS that should be assigned to the element instance
* BUG:
* 1) min-height on a column flex container won’t apply to its flex item children in IE 10-11.
* Use height instead if possible; height : <xxx>vh;
*
* This way any padding or border specified on the child elements are
* laid out and drawn inside that element's specified width and height.
* @param {?} direction
* @param {?=} wrap
* @param {?=} inline
* @return {?}
*/
function buildCSS(direction, wrap, inline) {
if (wrap === void 0) { wrap = null; }
if (inline === void 0) { inline = false; }
return {
'display': inline ? 'inline-flex' : 'flex',
'box-sizing': 'border-box',
'flex-direction': direction,
'flex-wrap': !!wrap ? wrap : null
};
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @param {?} align
* @return {?}
*/
function normalizeLayoutAlignValue(align) {
align = align || 'start stretch';
var _a = __read(align.split(' '), 2), mainAxis = _a[0], crossAxis = _a[1];
switch (mainAxis) {
case 'center':
case 'space-around':
case 'space-between':
case 'space-evenly':
break;
case 'end':
case 'flex-end':
mainAxis = 'flex-end';
break;
case 'start':
case 'flex-start':
default:
mainAxis = 'flex-start'; // default main axis
break;
}
switch (crossAxis) {
case 'start':
case 'flex-start':
crossAxis = 'flex-start';
break;
case 'baseline':
case 'center':
crossAxis = 'center';
break;
case 'end':
case 'flex-end':
crossAxis = 'flex-end';
break;
case 'stretch':
default:
// 'stretch'
crossAxis = 'stretch'; // default cross axis
break;
}
return [mainAxis, crossAxis];
}
/**
* @param {?} direction
* @param {?} wrap
* @param {?} isInline
* @param {?} breakpoint
* @return {?}
*/
function generateLayoutClassName(direction, wrap, isInline, breakpoint) {
return 'fcLayout'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + direction + (wrap ? '-' + wrap : '') + (isInline ? '-inline' : '');
}
/**
* @param {?} mainAxis
* @param {?} crossAxis
* @param {?} breakpoint
* @return {?}
*/
function generateLayoutAlignClassName(mainAxis, crossAxis, breakpoint) {
return 'fcLayoutAlign'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + mainAxis + '-' + crossAxis;
}
/**
* @param {?} value
* @param {?} breakpoint
* @return {?}
*/
function generateLayoutGapClassName(value, breakpoint) {
return 'fcLayoutGap'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + valueToClassName(value);
}
/**
* @param {?} grow
* @param {?} shrink
* @param {?} basis
* @param {?} breakpoint
* @return {?}
*/
function generateFlexClassName(grow, shrink, basis, breakpoint) {
return 'fcFlex'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + valueToClassName(grow) + '-' + valueToClassName(shrink) + (basis ? '-' + valueToClassName(basis) : '');
}
/**
* @param {?} order
* @param {?} breakpoint
* @return {?}
*/
function generateFlexOrderClassName(order, breakpoint) {
return 'fcFlexOrder'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + valueToClassName(order);
}
/**
* @param {?} offset
* @param {?} breakpoint
* @return {?}
*/
function generateFlexOffsetClassName(offset, breakpoint) {
return 'fcFlexOffset'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + valueToClassName(offset);
}
/**
* @param {?} align
* @param {?} breakpoint
* @return {?}
*/
function generateFlexAlignClassName(align, breakpoint) {
return 'fcFlexAlign'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + valueToClassName(align);
}
/**
* @return {?}
*/
function generateFlexFillClassName() {
return 'fcFlexFill';
}
/**
* @param {?} display
* @param {?} show
* @param {?} breakpoint
* @return {?}
*/
function generateFlexShowHideClassName(display, show, breakpoint) {
return 'fcShow'
+ (breakpoint !== 'all' ? '--' + breakpoint : '')
+ '--' + valueToClassName(display)
+ '--' + (show ? 'show' : 'hide');
}
/**
* @param {?} value
* @return {?}
*/
function valueToClassName(value) {
return String(value).replace(/[^a-zA-Z0-9-]/, '-');
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @license
* Copyright Google LLC 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://angular.io/license
*/
/**
* The flex API permits 3 or 1 parts of the value:
* - `flex-grow flex-shrink flex-basis`, or
* - `flex-basis`
* @param {?} basis
* @param {?=} grow
* @param {?=} shrink
* @return {?}
*/
function validateBasis(basis, grow, shrink) {
if (grow === void 0) { grow = '1'; }
if (shrink === void 0) { shrink = '1'; }
var /** @type {?} */ parts = [grow, shrink, basis];
var /** @type {?} */ j = basis.indexOf('calc');
if (j > 0) {
parts[2] = _validateCalcValue(basis.substring(j).trim());
var /** @type {?} */ matches = basis.substr(0, j).trim().split(' ');
if (matches.length === 2) {
parts[0] = matches[0];
parts[1] = matches[1];
}
}
else if (j === 0) {
parts[2] = _validateCalcValue(basis.trim());
}
else {
var /** @type {?} */ matches = basis.split(' ');
parts = (matches.length === 3) ? matches : [
grow, shrink, basis
];
}
return parts;
}
/**
* Calc expressions require whitespace before & after any expression operators
* This is a simple, crude whitespace padding solution.
* - '3 3 calc(15em + 20px)'
* - calc(100% / 7 * 2)
* - 'calc(15em + 20px)'
* - 'calc(15em+20px)'
* - '37px'
* = '43%'
* @param {?} calc
* @return {?}
*/
function _validateCalcValue(calc) {
return calc.replace(/[\s]/g, '').replace(/[\/\*\+\-]/g, ' $& ');
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ FLEX_CSS_DEFAULT_BREAKPOINTS = [
{ alias: 'gt-xs', media: ['screen', '(min-width: 600px)'] },
{ alias: 'lt-xl', media: ['screen', '(max-width: 1919px)'] },
{ alias: 'gt-sm', media: ['screen', '(min-width: 960px)'] },
{ alias: 'lt-lg', media: ['screen', '(max-width: 1279px)'] },
{ alias: 'gt-md', media: ['screen', '(min-width: 1280px)'] },
{ alias: 'lt-md', media: ['screen', '(max-width: 959px)'] },
{ alias: 'gt-lg', media: ['screen', '(min-width: 1920px)'] },
{ alias: 'lt-sm', media: ['screen', '(max-width: 599px)'] },
{ alias: 'xl', media: ['screen', '(min-width: 1920px)', '(max-width: 5000px)'] },
{ alias: 'lg', media: ['screen', '(min-width: 1280px)', '(max-width: 1919px)'] },
{ alias: 'md', media: ['screen', '(min-width: 960px)', '(max-width: 1279px)'] },
{ alias: 'sm', media: ['screen', '(min-width: 600px)', '(max-width: 959px)'] },
{ alias: 'xs', media: ['screen', '(max-width: 599px)'] },
];
var /** @type {?} */ FLEX_CSS_BREAKPOINTS = new InjectionToken('flex_css_breakpoints');
var FlexCssStyleElement = /** @class */ (function () {
function FlexCssStyleElement(style) {
this.style = style;
this.storage = {};
}
return FlexCssStyleElement;
}());
var FlexCssService = /** @class */ (function () {
function FlexCssService(doc, breakpoints) {
this.doc = doc;
this.breakpoints = breakpoints;
this.initLayout();
this.initFlex();
this.initFill();
}
/**
* @return {?}
*/
FlexCssService.prototype.initLayout = /**
* @return {?}
*/
function () {
var /** @type {?} */ style = this.doc.createElement('style');
style.id = 'fc-layout';
this.doc.head.appendChild(style);
this.layout = new FlexCssStyleElement(style);
};
/**
* @return {?}
*/
FlexCssService.prototype.initFlex = /**
* @return {?}
*/
function () {
var /** @type {?} */ style = this.doc.createElement('style');
style.id = 'fc-flex';
this.doc.head.appendChild(style);
this.flex = new FlexCssStyleElement(style);
};
/**
* @return {?}
*/
FlexCssService.prototype.initFill = /**
* @return {?}
*/
function () {
var /** @type {?} */ style = this.doc.createElement('style');
style.id = 'fc-fill';
this.doc.head.appendChild(style);
this.fill = new FlexCssStyleElement(style);
};
/**
* @param {?} layout
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.addLayout = /**
* @param {?} layout
* @param {?} breakpoint
* @return {?}
*/
function (layout, breakpoint) {
var _a = __read(validateValue(layout), 3), direction = _a[0], wrap = _a[1], isInline = _a[2];
var /** @type {?} */ className = generateLayoutClassName(direction, wrap, isInline, breakpoint);
if (!this.hasInLayoutStorage(className, breakpoint)) {
var /** @type {?} */ style = buildCSS(direction, wrap, isInline);
this.addToLayoutStorage(className, style, breakpoint);
}
return className;
};
/**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} align
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.addLayoutAlign = /**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} align
* @param {?} breakpoint
* @return {?}
*/
function (layout, layoutBreakpoint, align, breakpoint) {
var _a = __read(normalizeLayoutAlignValue(align), 2), mainAxis = _a[0], crossAxis = _a[1];
var /** @type {?} */ layoutAlignClassName = generateLayoutAlignClassName(mainAxis, crossAxis, breakpoint);
if (!this.hasInLayoutStorage(layoutAlignClassName, breakpoint)) {
var /** @type {?} */ style = {
'justify-content': mainAxis,
};
switch (crossAxis) {
case 'baseline':
style['align-items'] = crossAxis;
break;
default:
style['align-items'] = style['align-content'] = crossAxis;
break;
}
this.addToLayoutStorage(layoutAlignClassName, style, breakpoint);
}
if (crossAxis === 'stretch') {
var _b = __read(validateValue(layout), 3), direction = _b[0], wrap = _b[1], isInline = _b[2];
var /** @type {?} */ layoutClassName = generateLayoutClassName(direction, wrap, isInline, layoutBreakpoint);
var /** @type {?} */ className = layoutAlignClassName + '.' + layoutClassName;
if (!this.hasInLayoutStorage(className, breakpoint)) {
var /** @type {?} */ style = isFlowHorizontal(layout) ? { 'max-height': '100%' } : { 'max-width': '100%' };
this.addToLayoutStorage(className, style, breakpoint, [layoutBreakpoint]);
}
}
return layoutAlignClassName;
};
/**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} value
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.addLayoutGap = /**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} value
* @param {?} breakpoint
* @return {?}
*/
function (layout, layoutBreakpoint, value, breakpoint) {
value = value || '0';
var _a = __read(validateValue(layout), 3), direction = _a[0], wrap = _a[1], isInline = _a[2];
var /** @type {?} */ layoutClassName = generateLayoutClassName(direction, wrap, isInline, layoutBreakpoint);
var /** @type {?} */ layoutGapClassName = generateLayoutGapClassName(value, breakpoint);
var /** @type {?} */ className = layoutGapClassName + '.' + layoutClassName + ' > *:not(:last-child)';
if (!this.hasInLayoutStorage(className, breakpoint)) {
var /** @type {?} */ style = isFlowHorizontal(layout) ? { 'margin-right': value } : { 'margin-bottom': value };
this.addToLayoutStorage(className, style, breakpoint, [layoutBreakpoint]);
}
return layoutGapClassName;
};
/**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} value
* @param {?} breakpoint
* @param {?=} grow
* @param {?=} shrink
* @return {?}
*/
FlexCssService.prototype.addFlex = /**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} value
* @param {?} breakpoint
* @param {?=} grow
* @param {?=} shrink
* @return {?}
*/
function (layout, layoutBreakpoint, value, breakpoint, grow, shrink) {
value = value.replace(';', '');
var _a = __read(validateBasis(value, grow, shrink), 3), theGrow = _a[0], theShrink = _a[1], theBasis = _a[2];
theGrow = (theGrow === '0') ? 0 : theGrow;
theShrink = (theShrink === '0') ? 0 : theShrink;
// flex-basis allows you to specify the initial/starting main-axis size of the element,
// before anything else is computed. It can either be a percentage or an absolute value.
// It is, however, not the breaking point for flex-grow/shrink properties
//
// flex-grow can be seen as this:
// 0: Do not stretch. Either size to element's content width, or obey 'flex-basis'.
// 1: (Default value). Stretch; will be the same size to all other flex items on
// the same row since they have a default value of 1.
// ≥2 (integer n): Stretch. Will be n times the size of other elements
// with 'flex-grow: 1' on the same row.
var /** @type {?} */ style = {
'box-sizing': 'border-box',
};
switch (theBasis || '') {
case '':
style['flex'] = theGrow + " " + theShrink + " 0.000000001px";
break;
case 'initial': // default
case 'nogrow':
theGrow = 0;
style['flex'] = "0 1 auto";
break;
case 'grow':
style['flex'] = "1 1 100%";
break;
case 'noshrink':
theShrink = 0;
style['flex'] = "1 0 auto";
break;
case 'auto':
style['flex'] = theGrow + " " + theShrink + " auto";
break;
case 'none':
theGrow = 0;
theShrink = 0;
style['flex'] = "0 0 auto";
break;
default:
var /** @type {?} */ isCalc = String(theBasis).indexOf('calc') > -1;
var /** @type {?} */ isPercent = !isCalc && String(theBasis).indexOf('%') > -1;
var /** @type {?} */ isValue = isCalc || isPercent ||
String(theBasis).indexOf('px') > -1 ||
String(theBasis).indexOf('em') > -1 ||
String(theBasis).indexOf('vw') > -1 ||
String(theBasis).indexOf('vh') > -1;
// Defaults to percentage sizing unless `px` is explicitly set
if (!isValue && !isPercent && !isNaN(/** @type {?} */ (theBasis))) {
theBasis = theBasis + '%';
}
if (theBasis === '0px') {
theBasis = '0%';
}
style['flex-grow'] = "" + theGrow;
style['flex-shrink'] = "" + theShrink;
style['flex-basis'] = style['min-width'] = style['max-width'] = isValue ? "" + theBasis : '100%';
break;
}
var /** @type {?} */ flexClassName = generateFlexClassName(theGrow, theShrink, theBasis, breakpoint);
if (!this.hasInFlexStorage(flexClassName, breakpoint)) {
this.addToFlexStorage(flexClassName, style, breakpoint);
}
var _b = __read(validateValue(layout), 3), direction = _b[0], wrap = _b[1], isInline = _b[2];
var /** @type {?} */ layoutClassName = generateLayoutClassName(direction, wrap, isInline, layoutBreakpoint);
var /** @type {?} */ className = flexClassName + '.' + layoutClassName;
if (!this.hasInFlexStorage(className, breakpoint)) {
var /** @type {?} */ max = isFlowHorizontal(direction) ? 'max-width' : 'max-height';
var /** @type {?} */ min = isFlowHorizontal(direction) ? 'min-width' : 'min-height';
var /** @type {?} */ usingCalc = (String(theBasis).indexOf('calc') > -1) || (theBasis === 'auto');
var /** @type {?} */ isPx = String(theBasis).indexOf('px') > -1 || usingCalc;
// make box inflexible when shrink and grow are both zero
// should not set a min when the grow is zero
// should not set a max when the shrink is zero
var /** @type {?} */ isFixed = !theGrow && !theShrink;
var /** @type {?} */ layoutStyle = {};
layoutStyle[min] = (theBasis === '0%') ? 0 : isFixed || (isPx && theGrow) ? theBasis : null;
layoutStyle[max] = (theBasis === '0%') ? 0 : isFixed || (!usingCalc && theShrink) ? theBasis : null;
this.addToFlexStorage(className, layoutStyle, breakpoint, [layoutBreakpoint]);
}
return flexClassName;
};
/**
* @param {?} order
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.addFlexOrder = /**
* @param {?} order
* @param {?} breakpoint
* @return {?}
*/
function (order, breakpoint) {
order = parseInt(order, 10);
order = isNaN(order) ? 0 : order;
var /** @type {?} */ className = generateFlexOrderClassName(order, breakpoint);
if (!this.hasInFlexStorage(className, breakpoint)) {
var /** @type {?} */ style = { 'order': order };
this.addToFlexStorage(className, style, breakpoint);
}
return className;
};
/**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} offset
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.addFlexOffset = /**
* @param {?} layout
* @param {?} layoutBreakpoint
* @param {?} offset
* @param {?} breakpoint
* @return {?}
*/
function (layout, layoutBreakpoint, offset, breakpoint) {
var /** @type {?} */ isPercent = String(offset).indexOf('%') > -1;
var /** @type {?} */ isPx = String(offset).indexOf('px') > -1;
if (!isPx && !isPercent && !isNaN(offset)) {
offset = offset + '%';
}
var _a = __read(validateValue(layout), 3), direction = _a[0], wrap = _a[1], isInline = _a[2];
var /** @type {?} */ offsetClassName = generateFlexOffsetClassName(offset, breakpoint);
var /** @type {?} */ layoutClassName = generateLayoutClassName(direction, wrap, isInline, layoutBreakpoint);
var /** @type {?} */ className = offsetClassName + '.' + layoutClassName;
if (!this.hasInFlexStorage(className, breakpoint)) {
var /** @type {?} */ style = isFlowHorizontal(direction) ? { 'margin-left': "" + offset } : { 'margin-top': "" + offset };
this.addToFlexStorage(className, style, breakpoint, [layoutBreakpoint]);
}
return offsetClassName;
};
/**
* @param {?} align
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.addFlexAlign = /**
* @param {?} align
* @param {?} breakpoint
* @return {?}
*/
function (align, breakpoint) {
align = align || 'stretch';
// Cross-axis
switch (align) {
case 'start':
align = 'flex-start';
break;
case 'end':
align = 'flex-end';
break;
}
var /** @type {?} */ className = generateFlexAlignClassName(align, breakpoint);
if (!this.hasInFlexStorage(className, breakpoint)) {
var /** @type {?} */ style = { 'align-self': align };
this.addToFlexStorage(className, style, breakpoint);
}
return className;
};
/**
* @return {?}
*/
FlexCssService.prototype.addFlexFill = /**
* @return {?}
*/
function () {
var /** @type {?} */ className = generateFlexFillClassName();
if (!this.hasInFillStorage(className, 'all')) {
var /** @type {?} */ style = {
'margin': 0,
'width': '100%',
'height': '100%',
'min-width': '100%',
'min-height': '100%',
};
this.addToFillStorage(className, style, 'all');
}
return className;
};
/**
* @param {?} display
* @param {?} show
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.addShowHide = /**
* @param {?} display
* @param {?} show
* @param {?} breakpoint
* @return {?}
*/
function (display, show, breakpoint) {
var /** @type {?} */ className = generateFlexShowHideClassName(display, show, breakpoint);
if (!this.hasInFillStorage(className, breakpoint)) {
var /** @type {?} */ style = {
'display': show ? display || 'block' : 'none',
};
this.addToFillStorage(className, style, breakpoint);
}
return className;
};
/**
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.hasInLayoutStorage = /**
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
function (className, breakpoint) {
return this.hasInStorage(this.layout, className, breakpoint);
};
/**
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
FlexCssService.prototype.addToLayoutStorage = /**
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
function (className, style, breakpoint, customBreakpoints) {
return this.addToStorage(this.layout, className, style, breakpoint, customBreakpoints);
};
/**
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.hasInFlexStorage = /**
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
function (className, breakpoint) {
return this.hasInStorage(this.flex, className, breakpoint);
};
/**
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
FlexCssService.prototype.addToFlexStorage = /**
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
function (className, style, breakpoint, customBreakpoints) {
return this.addToStorage(this.flex, className, style, breakpoint, customBreakpoints);
};
/**
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.hasInFillStorage = /**
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
function (className, breakpoint) {
return this.hasInStorage(this.fill, className, breakpoint);
};
/**
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
FlexCssService.prototype.addToFillStorage = /**
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
function (className, style, breakpoint, customBreakpoints) {
return this.addToStorage(this.fill, className, style, breakpoint, customBreakpoints);
};
/**
* @param {?} styleElement
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
FlexCssService.prototype.hasInStorage = /**
* @param {?} styleElement
* @param {?} className
* @param {?} breakpoint
* @return {?}
*/
function (styleElement, className, breakpoint) {
return !!(styleElement.storage[breakpoint] && styleElement.storage[breakpoint][className]);
};
/**
* @param {?} styleElement
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
FlexCssService.prototype.addToStorage = /**
* @param {?} styleElement
* @param {?} className
* @param {?} style
* @param {?} breakpoint
* @param {?=} customBreakpoints
* @return {?}
*/
function (styleElement, className, style, breakpoint, customBreakpoints) {
customBreakpoints = customBreakpoints || [];
var /** @type {?} */ styles = applyCssPrefixes(style);
var /** @type {?} */ css = this.generateCss(styles);
if (css !== '') {
var /** @type {?} */ classCss = '.' + className + ' { ' + css + ' }';
var /** @type {?} */ cssElement = this.doc.createTextNode(this.addBreakpoints([breakpoint].concat(customBreakpoints), classCss));
if (!styleElement.storage[breakpoint]) {
styleElement.storage[breakpoint] = {};
}
styleElement.storage[breakpoint][className] = cssElement;
this.reorderTextElements(styleElement);
}
};
/**
* @param {?} styleElement
* @return {?}
*/
FlexCssService.prototype.reorderTextElements = /**
* @param {?} styleElement
* @return {?}
*/
function (styleElement) {
var _this = this;
var /** @type {?} */ position = this.reorderBreakpointElements(styleElement, 'all');
this.breakpoints.forEach(function (breakpoint) {
position = _this.reorderBreakpointElements(styleElement, breakpoint.alias, position);
});
};
/**
* @param {?} styleElement
* @param {?} breakpoint
* @param {?=} position
* @return {?}
*/
FlexCssService.prototype.reorderBreakpointElements = /**
* @param {?} styleElement
* @param {?} breakpoint
* @param {?=} position
* @return {?}
*/
function (styleElement, breakpoint, position) {
if (position === void 0) { position = 0; }
var /** @type {?} */ breakpointElements = styleElement.storage[breakpoint];
if (!breakpointElements) {
return position;
}
Object.keys(breakpointElements).forEach(function (key) {
if (styleElement.style.children.length) {
styleElement.style.insertBefore(breakpointElements[key], styleElement.style.children[position]);
}
else {
styleElement.style.appendChild(breakpointElements[key]);
}
++position;
});
return position;
};
/**
* @param {?} styles
* @return {?}
*/
FlexCssService.prototype.generateCss = /**
* @param {?} styles
* @return {?}
*/
function (styles) {
var /** @type {?} */ css = [];
Object.keys(styles).sort().forEach(function (key) {
var /** @type {?} */ values = Array.isArray(styles[key]) ? styles[key] : [styles[key]];
values.sort();
values.forEach(function (value) {
if (value !== null && value !== '') {
css.push(key + ': ' + value + ';');
}
});
});
return css.join(' ');
};
/**
* @param {?} breakpointsAliases
* @param {?} css
* @return {?}
*/
FlexCssService.prototype.addBreakpoints = /**
* @param {?} breakpointsAliases
* @param {?} css
* @return {?}
*/
function (breakpointsAliases, css) {
breakpointsAliases = breakpointsAliases.filter(function (breakpoint) { return breakpoint !== 'all'; });
if (!breakpointsAliases.length) {
return css;
}
var /** @type {?} */ theBreakpoints = [];
this.breakpoints
.filter(function (breakpoint) { return breakpointsAliases.indexOf(breakpoint.alias) >= 0; })
.forEach(function (breakpoint) { return theBreakpoints = theBreakpoints.concat(breakpoint.media); });
theBreakpoints = theBreakpoints.filter(function (value, index, self) { return self.indexOf(value) === index; });
return '@media ' + theBreakpoints.join(' and ') + ' { ' + css + ' }';
};
FlexCssService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
FlexCssService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [FLEX_CSS_BREAKPOINTS,] }] }
]; };
return FlexCssService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @abstract
*/
var /**
* @abstract
*/
BaseDirective = /** @class */ (function () {
function BaseDirective(elementRef, renderer) {
this.elementRef = elementRef;
this.renderer = renderer;
this.classNames = [];
}
/**
* @param {?} classNames
* @return {?}
*/
BaseDirective.prototype.setClassNames = /**
* @param {?} classNames
* @return {?}
*/
function (classNames) {
var _this = this;
classNames = classNames.filter(function (value, index, self) { return self.indexOf(value) === index; });
classNames.forEach(function (className) { return _this.addClassName(className); });
this.classNames
.filter(function (className) { return classNames.indexOf(className) < 0; })
.forEach(function (className) { return _this.removeClassName(className); });
this.classNames = classNames;
};
/**
* @param {?} className
* @return {?}
*/
BaseDirective.prototype.addClassName = /**
* @param {?} className
* @return {?}
*/
function (className) {
this.renderer.addClass(this.elementRef.nativeElement, className);
};
/**
* @param {?} className
* @return {?}
*/
BaseDirective.prototype.removeClassName = /**
* @param {?} className
* @return {?}
*/
function (className) {
this.renderer.removeClass(this.elementRef.nativeElement, className);
};
return BaseDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var LayoutDirective = /** @class */ (function (_super) {
__extends(LayoutDirective, _super);
function LayoutDirective(elementRef, renderer, service) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
return _this;
}
Object.defineProperty(LayoutDirective.prototype, "layout", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutXs", {
// get layout() { return this.fcValues['all']; }
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutDirective.prototype, "layoutLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = val; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
LayoutDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
LayoutDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
this.breakpoints.forEach(function (breakpoint) {
classNames.push(_this.service.addLayout(_this.fcValues[breakpoint], breakpoint));
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @param {?} breakpoints
* @param {?=} defaultValue
* @return {?}
*/
LayoutDirective.prototype.addNewBreakpoints = /**
* @param {?} breakpoints
* @param {?=} defaultValue
* @return {?}
*/
function (breakpoints, defaultValue) {
var _this = this;
breakpoints.forEach(function (breakpoint) {
if (!_this.fcValues[breakpoint]) {
_this.fcValues[breakpoint] = defaultValue;
}
});
this.reload();
};
Object.defineProperty(LayoutDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
LayoutDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcLayout],\n [fcLayout.xs], [fcLayout.sm], [fcLayout.md], [fcLayout.lg], [fcLayout.xl],\n [fcLayout.lt-sm], [fcLayout.lt-md], [fcLayout.lt-lg], [fcLayout.lt-xl],\n [fcLayout.gt-xs], [fcLayout.gt-sm], [fcLayout.gt-md], [fcLayout.gt-lg]\n ",
},] },
];
/** @nocollapse */
LayoutDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService }
]; };
LayoutDirective.propDecorators = {
layout: [{ type: Input, args: ['fcLayout',] }],
layoutXs: [{ type: Input, args: ['fcLayout.xs',] }],
layoutSm: [{ type: Input, args: ['fcLayout.sm',] }],
layoutMd: [{ type: Input, args: ['fcLayout.md',] }],
layoutLg: [{ type: Input, args: ['fcLayout.lg',] }],
layoutXl: [{ type: Input, args: ['fcLayout.xl',] }],
layoutGtXs: [{ type: Input, args: ['fcLayout.gt-xs',] }],
layoutGtSm: [{ type: Input, args: ['fcLayout.gt-sm',] }],
layoutGtMd: [{ type: Input, args: ['fcLayout.gt-md',] }],
layoutGtLg: [{ type: Input, args: ['fcLayout.gt-lg',] }],
layoutLtSm: [{ type: Input, args: ['fcLayout.lt-sm',] }],
layoutLtMd: [{ type: Input, args: ['fcLayout.lt-md',] }],
layoutLtLg: [{ type: Input, args: ['fcLayout.lt-lg',] }],
layoutLtXl: [{ type: Input, args: ['fcLayout.lt-xl',] }]
};
return LayoutDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var LayoutAlignDirective = /** @class */ (function (_super) {
__extends(LayoutAlignDirective, _super);
function LayoutAlignDirective(elementRef, renderer, service, layout) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.layout = layout;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
return _this;
}
Object.defineProperty(LayoutAlignDirective.prototype, "align", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "alignLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = val; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
LayoutAlignDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.dependsOnLayout();
};
/**
* @return {?}
*/
LayoutAlignDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
LayoutAlignDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
this.breakpoints.forEach(function (breakpoint) {
Object.keys(_this.layoutValues).forEach(function (layoutBreakpoint) {
classNames.push(_this.service.addLayoutAlign(_this.layoutValues[layoutBreakpoint], layoutBreakpoint, _this.fcValues[breakpoint], breakpoint));
});
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @return {?}
*/
LayoutAlignDirective.prototype.dependsOnLayout = /**
* @return {?}
*/
function () {
var _this = this;
if (this.layout) {
this.layout.addNewBreakpoints(this.breakpoints, 'row');
}
else {
this.breakpoints.forEach(function (breakpoint) {
_this.addClassName(_this.service.addLayout('row', breakpoint));
});
}
};
Object.defineProperty(LayoutAlignDirective.prototype, "layoutValues", {
get: /**
* @return {?}
*/
function () {
return this.layout ? this.layout.fcValues : { 'all': '' };
},
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutAlignDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
LayoutAlignDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcLayoutAlign],\n [fcLayoutAlign.xs], [fcLayoutAlign.sm], [fcLayoutAlign.md], [fcLayoutAlign.lg],[fcLayoutAlign.xl],\n [fcLayoutAlign.lt-sm], [fcLayoutAlign.lt-md], [fcLayoutAlign.lt-lg], [fcLayoutAlign.lt-xl],\n [fcLayoutAlign.gt-xs], [fcLayoutAlign.gt-sm], [fcLayoutAlign.gt-md], [fcLayoutAlign.gt-lg]\n ",
},] },
];
/** @nocollapse */
LayoutAlignDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Self }] }
]; };
LayoutAlignDirective.propDecorators = {
align: [{ type: Input, args: ['fcLayoutAlign',] }],
alignXs: [{ type: Input, args: ['fcLayoutAlign.xs',] }],
alignSm: [{ type: Input, args: ['fcLayoutAlign.sm',] }],
alignMd: [{ type: Input, args: ['fcLayoutAlign.md',] }],
alignLg: [{ type: Input, args: ['fcLayoutAlign.lg',] }],
alignXl: [{ type: Input, args: ['fcLayoutAlign.xl',] }],
alignGtXs: [{ type: Input, args: ['fcLayoutAlign.gt-xs',] }],
alignGtSm: [{ type: Input, args: ['fcLayoutAlign.gt-sm',] }],
alignGtMd: [{ type: Input, args: ['fcLayoutAlign.gt-md',] }],
alignGtLg: [{ type: Input, args: ['fcLayoutAlign.gt-lg',] }],
alignLtSm: [{ type: Input, args: ['fcLayoutAlign.lt-sm',] }],
alignLtMd: [{ type: Input, args: ['fcLayoutAlign.lt-md',] }],
alignLtLg: [{ type: Input, args: ['fcLayoutAlign.lt-lg',] }],
alignLtXl: [{ type: Input, args: ['fcLayoutAlign.lt-xl',] }]
};
return LayoutAlignDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var LayoutGapDirective = /** @class */ (function (_super) {
__extends(LayoutGapDirective, _super);
function LayoutGapDirective(elementRef, renderer, service, layout) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.layout = layout;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
return _this;
}
Object.defineProperty(LayoutGapDirective.prototype, "gap", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "gapLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = val; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
LayoutGapDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.dependsOnLayout();
};
/**
* @return {?}
*/
LayoutGapDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
LayoutGapDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
this.breakpoints.forEach(function (breakpoint) {
Object.keys(_this.layoutValues).forEach(function (layoutBreakpoint) {
classNames.push(_this.service.addLayoutGap(_this.layoutValues[layoutBreakpoint], layoutBreakpoint, _this.fcValues[breakpoint], breakpoint));
});
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @return {?}
*/
LayoutGapDirective.prototype.dependsOnLayout = /**
* @return {?}
*/
function () {
var _this = this;
if (this.layout) {
this.layout.addNewBreakpoints(this.breakpoints);
}
else {
this.breakpoints.forEach(function (breakpoint) {
_this.addClassName(_this.service.addLayout('row', breakpoint));
});
}
};
Object.defineProperty(LayoutGapDirective.prototype, "layoutValues", {
get: /**
* @return {?}
*/
function () {
return this.layout ? this.layout.fcValues : { 'all': '' };
},
enumerable: true,
configurable: true
});
Object.defineProperty(LayoutGapDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
LayoutGapDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcLayoutGap],\n [fcLayoutGap.xs], [fcLayoutGap.sm], [fcLayoutGap.md], [fcLayoutGap.lg], [fcLayoutGap.xl],\n [fcLayoutGap.lt-sm], [fcLayoutGap.lt-md], [fcLayoutGap.lt-lg], [fcLayoutGap.lt-xl],\n [fcLayoutGap.gt-xs], [fcLayoutGap.gt-sm], [fcLayoutGap.gt-md], [fcLayoutGap.gt-lg]\n ",
},] },
];
/** @nocollapse */
LayoutGapDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Self }] }
]; };
LayoutGapDirective.propDecorators = {
gap: [{ type: Input, args: ['fcLayoutGap',] }],
gapXs: [{ type: Input, args: ['fcLayoutGap.xs',] }],
gapSm: [{ type: Input, args: ['fcLayoutGap.sm',] }],
gapMd: [{ type: Input, args: ['fcLayoutGap.md',] }],
gapLg: [{ type: Input, args: ['fcLayoutGap.lg',] }],
gapXl: [{ type: Input, args: ['fcLayoutGap.xl',] }],
gapGtXs: [{ type: Input, args: ['fcLayoutGap.gt-xs',] }],
gapGtSm: [{ type: Input, args: ['fcLayoutGap.gt-sm',] }],
gapGtMd: [{ type: Input, args: ['fcLayoutGap.gt-md',] }],
gapGtLg: [{ type: Input, args: ['fcLayoutGap.gt-lg',] }],
gapLtSm: [{ type: Input, args: ['fcLayoutGap.lt-sm',] }],
gapLtMd: [{ type: Input, args: ['fcLayoutGap.lt-md',] }],
gapLtLg: [{ type: Input, args: ['fcLayoutGap.lt-lg',] }],
gapLtXl: [{ type: Input, args: ['fcLayoutGap.lt-xl',] }]
};
return LayoutGapDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FlexDirective = /** @class */ (function (_super) {
__extends(FlexDirective, _super);
function FlexDirective(elementRef, renderer, service, layout) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
_this.fcShrink = 1;
_this.fcGrow = 1;
if (layout && layout.elementRef.nativeElement === _this.parentElement) {
_this.layout = layout;
}
return _this;
}
Object.defineProperty(FlexDirective.prototype, "flex", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "flexLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = val; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FlexDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.dependsOnParentLayout();
};
/**
* @return {?}
*/
FlexDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
FlexDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
this.breakpoints.forEach(function (breakpoint) {
Object.keys(_this.layoutValues).forEach(function (layoutBreakpoint) {
classNames.push(_this.service.addFlex(_this.layoutValues[layoutBreakpoint], layoutBreakpoint, _this.fcValues[breakpoint], breakpoint, _this.fcGrow, _this.fcShrink));
});
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @return {?}
*/
FlexDirective.prototype.dependsOnParentLayout = /**
* @return {?}
*/
function () {
var _this = this;
if (this.layout) {
this.layout.addNewBreakpoints(this.breakpoints, 'row');
}
else {
this.breakpoints.forEach(function (breakpoint) {
_this.renderer.addClass(_this.parentElement, _this.service.addLayout('row', breakpoint));
});
}
};
Object.defineProperty(FlexDirective.prototype, "layoutValues", {
get: /**
* @return {?}
*/
function () {
return this.layout ? this.layout.fcValues : { 'all': '' };
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "parentElement", {
get: /**
* @return {?}
*/
function () {
return this.renderer.parentNode(this.elementRef.nativeElement);
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlexDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
FlexDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcFlex],\n [fcFlex.xs], [fcFlex.sm], [fcFlex.md], [fcFlex.lg], [fcFlex.xl],\n [fcFlex.lt-sm], [fcFlex.lt-md], [fcFlex.lt-lg], [fcFlex.lt-xl],\n [fcFlex.gt-xs], [fcFlex.gt-sm], [fcFlex.gt-md], [fcFlex.gt-lg],\n ",
},] },
];
/** @nocollapse */
FlexDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Host }, { type: SkipSelf }] }
]; };
FlexDirective.propDecorators = {
fcShrink: [{ type: Input }],
fcGrow: [{ type: Input }],
flex: [{ type: Input, args: ['fcFlex',] }],
flexXs: [{ type: Input, args: ['fcFlex.xs',] }],
flexSm: [{ type: Input, args: ['fcFlex.sm',] }],
flexMd: [{ type: Input, args: ['fcFlex.md',] }],
flexLg: [{ type: Input, args: ['fcFlex.lg',] }],
flexXl: [{ type: Input, args: ['fcFlex.xl',] }],
flexGtXs: [{ type: Input, args: ['fcFlex.gt-xs',] }],
flexGtSm: [{ type: Input, args: ['fcFlex.gt-sm',] }],
flexGtMd: [{ type: Input, args: ['fcFlex.gt-md',] }],
flexGtLg: [{ type: Input, args: ['fcFlex.gt-lg',] }],
flexLtSm: [{ type: Input, args: ['fcFlex.lt-sm',] }],
flexLtMd: [{ type: Input, args: ['fcFlex.lt-md',] }],
flexLtLg: [{ type: Input, args: ['fcFlex.lt-lg',] }],
flexLtXl: [{ type: Input, args: ['fcFlex.lt-xl',] }]
};
return FlexDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FlexAlignDirective = /** @class */ (function (_super) {
__extends(FlexAlignDirective, _super);
function FlexAlignDirective(elementRef, renderer, service, layout) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
if (layout && layout.elementRef.nativeElement === _this.parentElement) {
_this.layout = layout;
}
return _this;
}
Object.defineProperty(FlexAlignDirective.prototype, "align", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "alignLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = val; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FlexAlignDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.dependsOnParentLayout();
};
/**
* @return {?}
*/
FlexAlignDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
FlexAlignDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
this.breakpoints.forEach(function (breakpoint) {
classNames.push(_this.service.addFlexAlign(_this.fcValues[breakpoint], breakpoint));
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @return {?}
*/
FlexAlignDirective.prototype.dependsOnParentLayout = /**
* @return {?}
*/
function () {
var _this = this;
if (this.layout) {
this.layout.addNewBreakpoints(this.breakpoints, 'row');
}
else {
this.breakpoints.forEach(function (breakpoint) {
_this.renderer.addClass(_this.parentElement, _this.service.addLayout('row', breakpoint));
});
}
};
Object.defineProperty(FlexAlignDirective.prototype, "parentElement", {
get: /**
* @return {?}
*/
function () {
return this.renderer.parentNode(this.elementRef.nativeElement);
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlexAlignDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
FlexAlignDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcFlexAlign],\n [fcFlexAlign.xs], [fcFlexAlign.sm], [fcFlexAlign.md], [fcFlexAlign.lg], [fcFlexAlign.xl],\n [fcFlexAlign.lt-sm], [fcFlexAlign.lt-md], [fcFlexAlign.lt-lg], [fcFlexAlign.lt-xl],\n [fcFlexAlign.gt-xs], [fcFlexAlign.gt-sm], [fcFlexAlign.gt-md], [fcFlexAlign.gt-lg]\n ",
},] },
];
/** @nocollapse */
FlexAlignDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Host }] }
]; };
FlexAlignDirective.propDecorators = {
align: [{ type: Input, args: ['fcFlexAlign',] }],
alignXs: [{ type: Input, args: ['fcFlexAlign.xs',] }],
alignSm: [{ type: Input, args: ['fcFlexAlign.sm',] }],
alignMd: [{ type: Input, args: ['fcFlexAlign.md',] }],
alignLg: [{ type: Input, args: ['fcFlexAlign.lg',] }],
alignXl: [{ type: Input, args: ['fcFlexAlign.xl',] }],
alignGtXs: [{ type: Input, args: ['fcFlexAlign.gt-xs',] }],
alignGtSm: [{ type: Input, args: ['fcFlexAlign.gt-sm',] }],
alignGtMd: [{ type: Input, args: ['fcFlexAlign.gt-md',] }],
alignGtLg: [{ type: Input, args: ['fcFlexAlign.gt-lg',] }],
alignLtSm: [{ type: Input, args: ['fcFlexAlign.lt-sm',] }],
alignLtMd: [{ type: Input, args: ['fcFlexAlign.lt-md',] }],
alignLtLg: [{ type: Input, args: ['fcFlexAlign.lt-lg',] }],
alignLtXl: [{ type: Input, args: ['fcFlexAlign.lt-xl',] }]
};
return FlexAlignDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FlexOrderDirective = /** @class */ (function (_super) {
__extends(FlexOrderDirective, _super);
function FlexOrderDirective(elementRef, renderer, service, layout) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
if (layout && layout.elementRef.nativeElement === _this.parentElement) {
_this.layout = layout;
}
return _this;
}
Object.defineProperty(FlexOrderDirective.prototype, "order", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "orderLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = val; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FlexOrderDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.dependsOnParentLayout();
};
/**
* @return {?}
*/
FlexOrderDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
FlexOrderDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
this.breakpoints.forEach(function (breakpoint) {
classNames.push(_this.service.addFlexOrder(_this.fcValues[breakpoint], breakpoint));
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @return {?}
*/
FlexOrderDirective.prototype.dependsOnParentLayout = /**
* @return {?}
*/
function () {
var _this = this;
if (this.layout) {
this.layout.addNewBreakpoints(this.breakpoints, 'row');
}
else {
this.breakpoints.forEach(function (breakpoint) {
_this.renderer.addClass(_this.parentElement, _this.service.addLayout('row', breakpoint));
});
}
};
Object.defineProperty(FlexOrderDirective.prototype, "parentElement", {
get: /**
* @return {?}
*/
function () {
return this.renderer.parentNode(this.elementRef.nativeElement);
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOrderDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
FlexOrderDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcFlexOrder],\n [fcFlexOrder.xs], [fcFlexOrder.sm], [fcFlexOrder.md], [fcFlexOrder.lg], [fcFlexOrder.xl],\n [fcFlexOrder.lt-sm], [fcFlexOrder.lt-md], [fcFlexOrder.lt-lg], [fcFlexOrder.lt-xl],\n [fcFlexOrder.gt-xs], [fcFlexOrder.gt-sm], [fcFlexOrder.gt-md], [fcFlexOrder.gt-lg]\n ",
},] },
];
/** @nocollapse */
FlexOrderDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Host }, { type: SkipSelf }] }
]; };
FlexOrderDirective.propDecorators = {
order: [{ type: Input, args: ['fcFlexOrder',] }],
orderXs: [{ type: Input, args: ['fcFlexOrder.xs',] }],
orderSm: [{ type: Input, args: ['fcFlexOrder.sm',] }],
orderMd: [{ type: Input, args: ['fcFlexOrder.md',] }],
orderLg: [{ type: Input, args: ['fcFlexOrder.lg',] }],
orderXl: [{ type: Input, args: ['fcFlexOrder.xl',] }],
orderGtXs: [{ type: Input, args: ['fcFlexOrder.gt-xs',] }],
orderGtSm: [{ type: Input, args: ['fcFlexOrder.gt-sm',] }],
orderGtMd: [{ type: Input, args: ['fcFlexOrder.gt-md',] }],
orderGtLg: [{ type: Input, args: ['fcFlexOrder.gt-lg',] }],
orderLtSm: [{ type: Input, args: ['fcFlexOrder.lt-sm',] }],
orderLtMd: [{ type: Input, args: ['fcFlexOrder.lt-md',] }],
orderLtLg: [{ type: Input, args: ['fcFlexOrder.lt-lg',] }],
orderLtXl: [{ type: Input, args: ['fcFlexOrder.lt-xl',] }]
};
return FlexOrderDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FlexOffsetDirective = /** @class */ (function (_super) {
__extends(FlexOffsetDirective, _super);
function FlexOffsetDirective(elementRef, renderer, service, layout) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
if (layout && layout.elementRef.nativeElement === _this.parentElement) {
_this.layout = layout;
}
return _this;
}
Object.defineProperty(FlexOffsetDirective.prototype, "offset", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "offsetLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = val; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FlexOffsetDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.dependsOnParentLayout();
};
/**
* @return {?}
*/
FlexOffsetDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
FlexOffsetDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
this.breakpoints.forEach(function (breakpoint) {
Object.keys(_this.layoutValues).forEach(function (layoutBreakpoint) {
classNames.push(_this.service.addFlexOffset(_this.layoutValues[layoutBreakpoint], layoutBreakpoint, _this.fcValues[breakpoint], breakpoint));
});
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @return {?}
*/
FlexOffsetDirective.prototype.dependsOnParentLayout = /**
* @return {?}
*/
function () {
var _this = this;
if (this.layout) {
this.layout.addNewBreakpoints(this.breakpoints, 'row');
}
else {
this.breakpoints.forEach(function (breakpoint) {
_this.renderer.addClass(_this.parentElement, _this.service.addLayout('row', breakpoint));
});
}
};
Object.defineProperty(FlexOffsetDirective.prototype, "parentElement", {
get: /**
* @return {?}
*/
function () {
return this.renderer.parentNode(this.elementRef.nativeElement);
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "layoutValues", {
get: /**
* @return {?}
*/
function () {
return this.layout ? this.layout.fcValues : { 'all': '' };
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlexOffsetDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
FlexOffsetDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcFlexOffset],\n [fcFlexOffset.xs], [fcFlexOffset.sm], [fcFlexOffset.md], [fcFlexOffset.lg], [fcFlexOffset.xl],\n [fcFlexOffset.lt-sm], [fcFlexOffset.lt-md], [fcFlexOffset.lt-lg], [fcFlexOffset.lt-xl],\n [fcFlexOffset.gt-xs], [fcFlexOffset.gt-sm], [fcFlexOffset.gt-md], [fcFlexOffset.gt-lg]\n ",
},] },
];
/** @nocollapse */
FlexOffsetDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Host }, { type: SkipSelf }] }
]; };
FlexOffsetDirective.propDecorators = {
offset: [{ type: Input, args: ['fcFlexOffset',] }],
offsetXs: [{ type: Input, args: ['fcFlexOffset.xs',] }],
offsetSm: [{ type: Input, args: ['fcFlexOffset.sm',] }],
offsetMd: [{ type: Input, args: ['fcFlexOffset.md',] }],
offsetLg: [{ type: Input, args: ['fcFlexOffset.lg',] }],
offsetXl: [{ type: Input, args: ['fcFlexOffset.xl',] }],
offsetGtXs: [{ type: Input, args: ['fcFlexOffset.gt-xs',] }],
offsetGtSm: [{ type: Input, args: ['fcFlexOffset.gt-sm',] }],
offsetGtMd: [{ type: Input, args: ['fcFlexOffset.gt-md',] }],
offsetGtLg: [{ type: Input, args: ['fcFlexOffset.gt-lg',] }],
offsetLtSm: [{ type: Input, args: ['fcFlexOffset.lt-sm',] }],
offsetLtMd: [{ type: Input, args: ['fcFlexOffset.lt-md',] }],
offsetLtLg: [{ type: Input, args: ['fcFlexOffset.lt-lg',] }],
offsetLtXl: [{ type: Input, args: ['fcFlexOffset.lt-xl',] }]
};
return FlexOffsetDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FlexFillDirective = /** @class */ (function (_super) {
__extends(FlexFillDirective, _super);
function FlexFillDirective(elementRef, renderer, service, layout) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
if (layout && layout.elementRef.nativeElement === _this.parentElement) {
_this.layout = layout;
}
return _this;
}
/**
* @return {?}
*/
FlexFillDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.dependsOnParentLayout();
this.service.addFlexFill();
};
/**
* @return {?}
*/
FlexFillDirective.prototype.dependsOnParentLayout = /**
* @return {?}
*/
function () {
if (this.layout) {
this.layout.addNewBreakpoints(['all'], 'row');
}
else {
this.renderer.addClass(this.parentElement, this.service.addLayout('row', 'all'));
}
};
Object.defineProperty(FlexFillDirective.prototype, "parentElement", {
get: /**
* @return {?}
*/
function () {
return this.renderer.parentNode(this.elementRef.nativeElement);
},
enumerable: true,
configurable: true
});
FlexFillDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcFill],\n [fcFlexFill]\n ",
},] },
];
/** @nocollapse */
FlexFillDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Host }] }
]; };
return FlexFillDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ TRULY = ['true', true, 1];
/**
* @param {?} value
* @return {?}
*/
function isTrueValue(value) {
return value === '' || TRULY.indexOf(value) >= 0;
}
var ShowHideDirective = /** @class */ (function (_super) {
__extends(ShowHideDirective, _super);
function ShowHideDirective(elementRef, renderer, service, layout, platformId) {
var _this = _super.call(this, elementRef, renderer) || this;
_this.service = service;
_this.layout = layout;
_this.platformId = platformId;
_this.fcValues = {};
_this.observer$ = new ReplaySubject(1);
return _this;
}
Object.defineProperty(ShowHideDirective.prototype, "show", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "showGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hide", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['all'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xs'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['sm'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['md'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lg'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['xl'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideLtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-sm'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideLtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-md'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideLtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-lg'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideLtXl", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['lt-xl'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideGtXs", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-xs'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideGtSm", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-sm'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideGtMd", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-md'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ShowHideDirective.prototype, "hideGtLg", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) { this.fcValues['gt-lg'] = !isTrueValue(val); },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ShowHideDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.reload();
};
/**
* @return {?}
*/
ShowHideDirective.prototype.reload = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ classNames = [];
var /** @type {?} */ display = this.getDisplayStyle();
this.breakpoints.forEach(function (breakpoint) {
classNames.push(_this.service.addShowHide(display, _this.fcValues[breakpoint], breakpoint));
});
this.setClassNames(classNames);
this.observer$.next(this.fcValues);
};
/**
* @return {?}
*/
ShowHideDirective.prototype.getDisplayStyle = /**
* @return {?}
*/
function () {
return this.layout ? 'flex' : (this.getElementStyle(this.elementRef.nativeElement, 'display')
|| this.fcDisplayDefault
|| 'block');
};
/**
* @param {?} element
* @param {?} styleName
* @return {?}
*/
ShowHideDirective.prototype.getElementStyle = /**
* @param {?} element
* @param {?} styleName
* @return {?}
*/
function (element, styleName) {
return (element ? element.style[styleName] || element.style.getPropertyValue(styleName) : '')
|| (isPlatformBrowser(this.platformId) ? getComputedStyle(element).getPropertyValue(styleName) : '');
};
Object.defineProperty(ShowHideDirective.prototype, "breakpoints", {
get: /**
* @return {?}
*/
function () {
return Object.keys(this.fcValues);
},
enumerable: true,
configurable: true
});
ShowHideDirective.decorators = [
{ type: Directive, args: [{
selector: "\n [fcShow],\n [fcShow.xs], [fcShow.sm], [fcShow.md], [fcShow.lg], [fcShow.xl],\n [fcShow.lt-sm], [fcShow.lt-md], [fcShow.lt-lg], [fcShow.lt-xl],\n [fcShow.gt-xs], [fcShow.gt-sm], [fcShow.gt-md], [fcShow.gt-lg],\n [fcHide],\n [fcHide.xs], [fcHide.sm], [fcHide.md], [fcHide.lg], [fcHide.xl],\n [fcHide.lt-sm], [fcHide.lt-md], [fcHide.lt-lg], [fcHide.lt-xl],\n [fcHide.gt-xs], [fcHide.gt-sm], [fcHide.gt-md], [fcHide.gt-lg]\n ",
},] },
];
/** @nocollapse */
ShowHideDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FlexCssService },
{ type: LayoutDirective, decorators: [{ type: Optional }, { type: Self }] },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
]; };
ShowHideDirective.propDecorators = {
fcDisplayDefault: [{ type: Input }],
show: [{ type: Input, args: ['fcShow',] }],
showXs: [{ type: Input, args: ['fcShow.xs',] }],
showSm: [{ type: Input, args: ['fcShow.sm',] }],
showMd: [{ type: Input, args: ['fcShow.md',] }],
showLg: [{ type: Input, args: ['fcShow.lg',] }],
showXl: [{ type: Input, args: ['fcShow.xl',] }],
showLtSm: [{ type: Input, args: ['fcShow.lt-sm',] }],
showLtMd: [{ type: Input, args: ['fcShow.lt-md',] }],
showLtLg: [{ type: Input, args: ['fcShow.lt-lg',] }],
showLtXl: [{ type: Input, args: ['fcShow.lt-xl',] }],
showGtXs: [{ type: Input, args: ['fcShow.gt-xs',] }],
showGtSm: [{ type: Input, args: ['fcShow.gt-sm',] }],
showGtMd: [{ type: Input, args: ['fcShow.gt-md',] }],
showGtLg: [{ type: Input, args: ['fcShow.gt-lg',] }],
hide: [{ type: Input, args: ['fcHide',] }],
hideXs: [{ type: Input, args: ['fcHide.xs',] }],
hideSm: [{ type: Input, args: ['fcHide.sm',] }],
hideMd: [{ type: Input, args: ['fcHide.md',] }],
hideLg: [{ type: Input, args: ['fcHide.lg',] }],
hideXl: [{ type: Input, args: ['fcHide.xl',] }],
hideLtSm: [{ type: Input, args: ['fcHide.lt-sm',] }],
hideLtMd: [{ type: Input, args: ['fcHide.lt-md',] }],
hideLtLg: [{ type: Input, args: ['fcHide.lt-lg',] }],
hideLtXl: [{ type: Input, args: ['fcHide.lt-xl',] }],
hideGtXs: [{ type: Input, args: ['fcHide.gt-xs',] }],
hideGtSm: [{ type: Input, args: ['fcHide.gt-sm',] }],
hideGtMd: [{ type: Input, args: ['fcHide.gt-md',] }],
hideGtLg: [{ type: Input, args: ['fcHide.gt-lg',] }]
};
return ShowHideDirective;
}(BaseDirective));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @param {?} breakpoints
* @return {?}
*/
function customizeBreakPoints(breakpoints) {
if (typeof breakpoints === 'function') {
breakpoints = breakpoints(FLEX_CSS_DEFAULT_BREAKPOINTS);
}
return breakpoints || FLEX_CSS_DEFAULT_BREAKPOINTS;
}
var FlexCssModule = /** @class */ (function () {
function FlexCssModule() {
}
/**
* @param {?=} breakpoints
* @return {?}
*/
FlexCssModule.forRoot = /**
* @param {?=} breakpoints
* @return {?}
*/
function (breakpoints) {
return {
ngModule: FlexCssModule,
providers: [
FlexCssService,
{
provide: 'flex_css_module_breakpoints',
useValue: breakpoints,
},
{
provide: FLEX_CSS_BREAKPOINTS,
useFactory: customizeBreakPoints,
deps: ['flex_css_module_breakpoints']
},
],
};
};
FlexCssModule.decorators = [
{ type: NgModule, args: [{
declarations: [
LayoutDirective,
LayoutAlignDirective,
LayoutGapDirective,
FlexDirective,
FlexOrderDirective,
FlexOffsetDirective,
FlexAlignDirective,
FlexFillDirective,
ShowHideDirective,
],
exports: [
LayoutDirective,
LayoutAlignDirective,
LayoutGapDirective,
FlexDirective,
FlexOrderDirective,
FlexOffsetDirective,
FlexAlignDirective,
FlexFillDirective,
ShowHideDirective,
],
},] },
];
return FlexCssModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { LayoutDirective, LayoutAlignDirective, LayoutGapDirective, FlexDirective, FlexAlignDirective, FlexOrderDirective, FlexOffsetDirective, FlexFillDirective, customizeBreakPoints, FlexCssModule, BaseDirective as ɵa, FLEX_CSS_BREAKPOINTS as ɵb, FlexCssService as ɵc, ShowHideDirective as ɵd };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlZy1tZC1uZy1mbGV4LWNzcy1sYXlvdXQuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BncmVnLW1kL25nLWZsZXgtY3NzLWxheW91dC9saWIvYXV0by1wcmVmaXhlci50cyIsIm5nOi8vQGdyZWctbWQvbmctZmxleC1jc3MtbGF5b3V0L2xpYi9sYXlvdXQtdmFsaWRhdG9yLnRzIiwibmc6Ly9AZ3JlZy1tZC9uZy1mbGV4LWNzcy1sYXlvdXQvbGliL2hlbHBlcnMudHMiLCJuZzovL0BncmVnLW1kL25nLWZsZXgtY3NzLWxheW91dC9saWIvYmFzaXMtdmFsaWRhdG9yLnRzIiwibmc6Ly9AZ3JlZy1tZC9uZy1mbGV4LWNzcy1sYXlvdXQvbGliL2ZsZXgtY3NzLnNlcnZpY2UudHMiLCJuZzovL0BncmVnLW1kL25nLWZsZXgtY3NzLWxheW91dC9saWIvZGlyZWN0aXZlLnRzIiwibmc6Ly9AZ3JlZy1tZC9uZy1mbGV4LWNzcy1sYXlvdXQvbGliL2xheW91dC5kaXJlY3RpdmUudHMiLCJuZzovL0BncmVnLW1kL25nLWZsZXgtY3NzLWxheW91dC9saWIvbGF5b3V0LWFsaWduLmRpcmVjdGl2ZS50cyIsIm5nOi8vQGdyZWctbWQvbmctZmxleC1jc3MtbGF5b3V0L2xpYi9sYXlvdXQtZ2FwLmRpcmVjdGl2ZS50cyIsIm5nOi8vQGdyZWctbWQvbmctZmxleC1jc3MtbGF5b3V0L2xpYi9mbGV4LmRpcmVjdGl2ZS50cyIsIm5nOi8vQGdyZWctbWQvbmctZmxleC1jc3MtbGF5b3V0L2xpYi9mbGV4LWFsaWduLmRpcmVjdGl2ZS50cyIsIm5nOi8vQGdyZWctbWQvbmctZmxleC1jc3MtbGF5b3V0L2xpYi9mbGV4LW9yZGVyLmRpcmVjdGl2ZS50cyIsIm5nOi8vQGdyZWctbWQvbmctZmxleC1jc3MtbGF5b3V0L2xpYi9mbGV4LW9mZnNldC5kaXJlY3RpdmUudHMiLCJuZzovL0BncmVnLW1kL25nLWZsZXgtY3NzLWxheW91dC9saWIvZmxleC1maWxsLmRpcmVjdGl2ZS50cyIsIm5nOi8vQGdyZWctbWQvbmctZmxleC1jc3MtbGF5b3V0L2xpYi9zaG93LWhpZGUuZGlyZWN0aXZlLnRzIiwibmc6Ly9AZ3JlZy1tZC9uZy1mbGV4LWNzcy1sYXlvdXQvbGliL2ZsZXgtY3NzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBBcHBsaWVzIENTUyBwcmVmaXhlcyB0byBhcHByb3ByaWF0ZSBzdHlsZSBrZXlzLlxuICpcbiAqIE5vdGU6IGAtbXMtYCwgYC1tb3pgIGFuZCBgLXdlYmtpdC1ib3hgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLiBlLmcuXG4gKiAgICB7XG4gKiAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsgICAgIE5FVyAtIFNhZmFyaSA2LjErLiBpT1MgNy4xKywgQkIxMFxuICogICAgICBkaXNwbGF5OiBmbGV4OyAgICAgICAgICAgICBORVcsIFNwZWMgLSBGaXJlZm94LCBDaHJvbWUsIE9wZXJhXG4gKiAgICAgIC8vIGRpc3BsYXk6IC13ZWJraXQtYm94OyAgIE9MRCAtIGlPUyA2LSwgU2FmYXJpIDMuMS02LCBCQjdcbiAqICAgICAgLy8gZGlzcGxheTogLW1zLWZsZXhib3g7ICAgVFdFRU5FUiAtIElFIDEwXG4gKiAgICAgIC8vIGRpc3BsYXk6IC1tb3otZmxleGJveDsgIE9MRCAtIEZpcmVmb3hcbiAqICAgIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Q3NzUHJlZml4ZXModGFyZ2V0KSB7XG4gIE9iamVjdC5rZXlzKHRhcmdldCkuZm9yRWFjaChrZXkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IHRhcmdldFtrZXldIHx8ICcnO1xuXG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ2Rpc3BsYXknOlxuICAgICAgICBpZiAodmFsdWUgPT09ICdmbGV4Jykge1xuICAgICAgICAgIHRhcmdldFsnZGlzcGxheSddID0gW1xuICAgICAgICAgICAgJy13ZWJraXQtZmxleCcsXG4gICAgICAgICAgICAnZmxleCdcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnaW5saW5lLWZsZXgnKSB7XG4gICAgICAgICAgdGFyZ2V0WydkaXNwbGF5J10gPSBbXG4gICAgICAgICAgICAnLXdlYmtpdC1pbmxpbmUtZmxleCcsXG4gICAgICAgICAgICAnaW5saW5lLWZsZXgnXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRbJ2Rpc3BsYXknXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhbGlnbi1pdGVtcyc6XG4gICAgICBjYXNlICdhbGlnbi1zZWxmJzpcbiAgICAgIGNhc2UgJ2FsaWduLWNvbnRlbnQnOlxuICAgICAgY2FzZSAnZmxleCc6XG4gICAgICBjYXNlICdmbGV4LWJhc2lzJzpcbiAgICAgIGNhc2UgJ2ZsZXgtZmxvdyc6XG4gICAgICBjYXNlICdmbGV4LWdyb3cnOlxuICAgICAgY2FzZSAnZmxleC1zaHJpbmsnOlxuICAgICAgY2FzZSAnZmxleC13cmFwJzpcbiAgICAgIGNhc2UgJ2p1c3RpZnktY29udGVudCc6XG4gICAgICAgIHRhcmdldFsnLXdlYmtpdC0nICsga2V5XSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZmxleC1kaXJlY3Rpb24nOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8ICdyb3cnO1xuICAgICAgICB0YXJnZXRbJy13ZWJraXQtZmxleC1kaXJlY3Rpb24nXSA9IHZhbHVlO1xuICAgICAgICB0YXJnZXRbJ2ZsZXgtZGlyZWN0aW9uJ10gPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29yZGVyJzpcbiAgICAgICAgdGFyZ2V0WydvcmRlciddID0gdGFyZ2V0Wyctd2Via2l0LScgKyBrZXldID0gaXNOYU4odmFsdWUpID8gJzAnIDogdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZXhwb3J0IGNvbnN0IElOTElORSA9ICdpbmxpbmUnO1xuZXhwb3J0IGNvbnN0IExBWU9VVF9WQUxVRVMgPSBbJ3JvdycsICdjb2x1bW4nLCAncm93LXJldmVyc2UnLCAnY29sdW1uLXJldmVyc2UnXTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGUgZGlyZWN0aW9ufCdkaXJlY3Rpb24gd3JhcCcgdmFsdWUgYW5kIHRoZW4gdXBkYXRlIHRoZSBob3N0J3MgaW5saW5lIGZsZXhib3ggc3R5bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExheW91dENTUyh2YWx1ZTogc3RyaW5nKSB7XG4gIGNvbnN0IFtkaXJlY3Rpb24sIHdyYXAsIGlzSW5saW5lXSA9IHZhbGlkYXRlVmFsdWUodmFsdWUpO1xuICByZXR1cm4gYnVpbGRDU1MoZGlyZWN0aW9uLCB3cmFwLCBpc0lubGluZSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIHZhbHVlIHRvIGJlIG9uZSBvZiB0aGUgYWNjZXB0YWJsZSB2YWx1ZSBvcHRpb25zXG4gKiBVc2UgZGVmYXVsdCBmYWxsYmFjayBvZiAncm93J1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gIHZhbHVlID0gdmFsdWUgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIGxldCBbZGlyZWN0aW9uLCB3cmFwLCBpbmxpbmVdID0gdmFsdWUuc3BsaXQoJyAnKTtcblxuICAvLyBGaXJzdCB2YWx1ZSBtdXN0IGJlIHRoZSBgZmxleC1kaXJlY3Rpb25gXG4gIGlmICghTEFZT1VUX1ZBTFVFUy5maW5kKHggPT4geCA9PT0gZGlyZWN0aW9uKSkge1xuICAgIGRpcmVjdGlvbiA9IExBWU9VVF9WQUxVRVNbMF07XG4gIH1cblxuICBpZiAod3JhcCA9PT0gSU5MSU5FKSB7XG4gICAgd3JhcCA9IChpbmxpbmUgIT09IElOTElORSkgPyBpbmxpbmUgOiAnJztcbiAgICBpbmxpbmUgPSBJTkxJTkU7XG4gIH1cblxuICByZXR1cm4gW2RpcmVjdGlvbiwgdmFsaWRhdGVXcmFwVmFsdWUod3JhcCksICEhaW5saW5lXTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHZhbGlkYXRlZCwgZmxleC1kaXJlY3Rpb24gdmFsdWUgc3BlY2lmaWVzXG4gKiBhIGhvcml6b250YWwvcm93IGZsb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dIb3Jpem9udGFsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW2Zsb3csIF0gPSB2YWxpZGF0ZVZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIGZsb3cuaW5kZXhPZigncm93JykgPiAtMTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGxheW91dC13cmFwPSc8dmFsdWU+JyB0byBleHBlY3RlZCBmbGV4LXdyYXAgc3R5bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlV3JhcFZhbHVlKHZhbHVlKSB7XG4gIGlmICghIXZhbHVlKSB7XG4gICAgc3dpdGNoICh2YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdyZXZlcnNlJzpcbiAgICAgIGNhc2UgJ3dyYXAtcmV2ZXJzZSc6XG4gICAgICBjYXNlICdyZXZlcnNlLXdyYXAnOlxuICAgICAgICB2YWx1ZSA9ICd3cmFwLXJldmVyc2UnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbm8nOlxuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICBjYXNlICdub3dyYXAnOlxuICAgICAgICB2YWx1ZSA9ICdub3dyYXAnO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gQWxsIG90aGVyIHZhbHVlcyBmYWxsYmFjayB0byAnd3JhcCdcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhbHVlID0gJ3dyYXAnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBDU1MgdGhhdCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgaW5zdGFuY2VcbiAqIEJVRzpcbiAqICAgMSkgbWluLWhlaWdodCBvbiBhIGNvbHVtbiBmbGV4IGNvbnRhaW5lciB3b27DosKAwpl0IGFwcGx5IHRvIGl0cyBmbGV4IGl0ZW0gY2hpbGRyZW4gaW4gSUUgMTAtMTEuXG4gKiAgICAgIFVzZSBoZWlnaHQgaW5zdGVhZCBpZiBwb3NzaWJsZTsgaGVpZ2h0IDogPHh4eD52aDtcbiAqXG4gKiAgVGhpcyB3YXkgYW55IHBhZGRpbmcgb3IgYm9yZGVyIHNwZWNpZmllZCBvbiB0aGUgY2hpbGQgZWxlbWVudHMgYXJlXG4gKiAgbGFpZCBvdXQgYW5kIGRyYXduIGluc2lkZSB0aGF0IGVsZW1lbnQncyBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ1NTKGRpcmVjdGlvbiwgd3JhcCA9IG51bGwsIGlubGluZSA9IGZhbHNlKSB7XG4gIHJldHVybiB7XG4gICAgJ2Rpc3BsYXknOiBpbmxpbmUgPyAnaW5saW5lLWZsZXgnIDogJ2ZsZXgnLFxuICAgICdib3gtc2l6aW5nJzogJ2JvcmRlci1ib3gnLFxuICAgICdmbGV4LWRpcmVjdGlvbic6IGRpcmVjdGlvbixcbiAgICAnZmxleC13cmFwJzogISF3cmFwID8gd3JhcCA6IG51bGxcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVMYXlvdXRBbGlnblZhbHVlKGFsaWduOiBzdHJpbmcpIHtcbiAgYWxpZ24gPSBhbGlnbiB8fCAnc3RhcnQgc3RyZXRjaCc7XG5cbiAgbGV0IFttYWluQXhpcywgY3Jvc3NBeGlzXSA9IGFsaWduLnNwbGl0KCcgJyk7XG5cbiAgc3dpdGNoIChtYWluQXhpcykge1xuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgY2FzZSAnc3BhY2UtYXJvdW5kJzpcbiAgICBjYXNlICdzcGFjZS1iZXR3ZWVuJzpcbiAgICBjYXNlICdzcGFjZS1ldmVubHknOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kJzpcbiAgICBjYXNlICdmbGV4LWVuZCc6XG4gICAgICBtYWluQXhpcyA9ICdmbGV4LWVuZCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdGFydCc6XG4gICAgY2FzZSAnZmxleC1zdGFydCc6XG4gICAgZGVmYXVsdCA6XG4gICAgICBtYWluQXhpcyA9ICdmbGV4LXN0YXJ0JzsgIC8vIGRlZmF1bHQgbWFpbiBheGlzXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHN3aXRjaCAoY3Jvc3NBeGlzKSB7XG4gICAgY2FzZSAnc3RhcnQnOlxuICAgIGNhc2UgJ2ZsZXgtc3RhcnQnOlxuICAgICAgY3Jvc3NBeGlzID0gJ2ZsZXgtc3RhcnQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZWxpbmUnOlxuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjcm9zc0F4aXMgPSAnY2VudGVyJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZCc6XG4gICAgY2FzZSAnZmxleC1lbmQnOlxuICAgICAgY3Jvc3NBeGlzID0gJ2ZsZXgtZW5kJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0cmV0Y2gnOlxuICAgIGRlZmF1bHQgOiAvLyAnc3RyZXRjaCdcbiAgICAgIGNyb3NzQXhpcyA9ICdzdHJldGNoJzsgICAvLyBkZWZhdWx0IGNyb3NzIGF4aXNcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIFttYWluQXhpcywgY3Jvc3NBeGlzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTGF5b3V0Q2xhc3NOYW1lKGRpcmVjdGlvbjogc3RyaW5nLCB3cmFwOiBzdHJpbmcsIGlzSW5saW5lOiBib29sZWFuLCBicmVha3BvaW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuICdmY0xheW91dCdcbiAgICArIChicmVha3BvaW50ICE9PSAnYWxsJyA/ICctLScgKyBicmVha3BvaW50IDogJycpXG4gICAgKyAnLS0nICsgZGlyZWN0aW9uICsgKHdyYXAgPyAnLScgKyB3cmFwIDogJycpICsgKGlzSW5saW5lID8gJy1pbmxpbmUnIDogJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVMYXlvdXRBbGlnbkNsYXNzTmFtZShtYWluQXhpczogc3RyaW5nLCBjcm9zc0F4aXM6IHN0cmluZywgYnJlYWtwb2ludDogc3RyaW5nKSB7XG4gIHJldHVybiAnZmNMYXlvdXRBbGlnbidcbiAgICArIChicmVha3BvaW50ICE9PSAnYWxsJyA/ICctLScgKyBicmVha3BvaW50IDogJycpXG4gICAgKyAnLS0nICsgbWFpbkF4aXMgKyAnLScgKyBjcm9zc0F4aXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUxheW91dEdhcENsYXNzTmFtZSh2YWx1ZTogc3RyaW5nLCBicmVha3BvaW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuICdmY0xheW91dEdhcCdcbiAgICArIChicmVha3BvaW50ICE9PSAnYWxsJyA/ICctLScgKyBicmVha3BvaW50IDogJycpXG4gICAgKyAnLS0nICsgdmFsdWVUb0NsYXNzTmFtZSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUZsZXhDbGFzc05hbWUoZ3Jvdywgc2hyaW5rLCBiYXNpcywgYnJlYWtwb2ludDogc3RyaW5nKSB7XG4gIHJldHVybiAnZmNGbGV4J1xuICAgICsgKGJyZWFrcG9pbnQgIT09ICdhbGwnID8gJy0tJyArIGJyZWFrcG9pbnQgOiAnJylcbiAgICArICctLScgKyB2YWx1ZVRvQ2xhc3NOYW1lKGdyb3cpICsgJy0nICsgdmFsdWVUb0NsYXNzTmFtZShzaHJpbmspICsgKGJhc2lzID8gJy0nICsgdmFsdWVUb0NsYXNzTmFtZShiYXNpcykgOiAnJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUZsZXhPcmRlckNsYXNzTmFtZShvcmRlciwgYnJlYWtwb2ludDogc3RyaW5nKSB7XG4gIHJldHVybiAnZmNGbGV4T3JkZXInXG4gICAgKyAoYnJlYWtwb2ludCAhPT0gJ2FsbCcgPyAnLS0nICsgYnJlYWtwb2ludCA6ICcnKVxuICAgICsgJy0tJyArIHZhbHVlVG9DbGFzc05hbWUob3JkZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGbGV4T2Zmc2V0Q2xhc3NOYW1lKG9mZnNldCwgYnJlYWtwb2ludDogc3RyaW5nKSB7XG4gIHJldHVybiAnZmNGbGV4T2Zmc2V0J1xuICAgICsgKGJyZWFrcG9pbnQgIT09ICdhbGwnID8gJy0tJyArIGJyZWFrcG9pbnQgOiAnJylcbiAgICArICctLScgKyB2YWx1ZVRvQ2xhc3NOYW1lKG9mZnNldCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUZsZXhBbGlnbkNsYXNzTmFtZShhbGlnbiwgYnJlYWtwb2ludDogc3RyaW5nKSB7XG4gIHJldHVybiAnZmNGbGV4QWxpZ24nXG4gICAgKyAoYnJlYWtwb2ludCAhPT0gJ2FsbCcgPyAnLS0nICsgYnJlYWtwb2ludCA6ICcnKVxuICAgICsgJy0tJyArIHZhbHVlVG9DbGFzc05hbWUoYWxpZ24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGbGV4RmlsbENsYXNzTmFtZSgpIHtcbiAgcmV0dXJuICdmY0ZsZXhGaWxsJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRmxleFNob3dIaWRlQ2xhc3NOYW1lKGRpc3BsYXksIHNob3c6IGJvb2xlYW4sIGJyZWFrcG9pbnQ6IHN0cmluZykge1xuICByZXR1cm4gJ2ZjU2hvdydcbiAgICArIChicmVha3BvaW50ICE9PSAnYWxsJyA/ICctLScgKyBicmVha3BvaW50IDogJycpXG4gICAgKyAnLS0nICsgdmFsdWVUb0NsYXNzTmFtZShkaXNwbGF5KVxuICAgICsgJy0tJyArIChzaG93ID8gJ3Nob3cnIDogJ2hpZGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlVG9DbGFzc05hbWUodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvW15hLXpBLVowLTktXS8sICctJyk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBUaGUgZmxleCBBUEkgcGVybWl0cyAzIG9yIDEgcGFydHMgb2YgdGhlIHZhbHVlOlxuICogICAgLSBgZmxleC1ncm93IGZsZXgtc2hyaW5rIGZsZXgtYmFzaXNgLCBvclxuICogICAgLSBgZmxleC1iYXNpc2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQmFzaXMoYmFzaXM6IHN0cmluZywgZ3JvdyA9ICcxJywgc2hyaW5rID0gJzEnKTogc3RyaW5nW118bnVtYmVyW10ge1xuICBsZXQgcGFydHMgPSBbZ3Jvdywgc2hyaW5rLCBiYXNpc107XG5cbiAgY29uc3QgaiA9IGJhc2lzLmluZGV4T2YoJ2NhbGMnKTtcbiAgaWYgKGogPiAwKSB7XG4gICAgcGFydHNbMl0gPSBfdmFsaWRhdGVDYWxjVmFsdWUoYmFzaXMuc3Vic3RyaW5nKGopLnRyaW0oKSk7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGJhc2lzLnN1YnN0cigwLCBqKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHBhcnRzWzBdID0gbWF0Y2hlc1swXTtcbiAgICAgIHBhcnRzWzFdID0gbWF0Y2hlc1sxXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaiA9PT0gMCkge1xuICAgIHBhcnRzWzJdID0gX3ZhbGlkYXRlQ2FsY1ZhbHVlKGJhc2lzLnRyaW0oKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGJhc2lzLnNwbGl0KCcgJyk7XG4gICAgcGFydHMgPSAobWF0Y2hlcy5sZW5ndGggPT09IDMpID8gbWF0Y2hlcyA6IFtcbiAgICAgIGdyb3csIHNocmluaywgYmFzaXNcbiAgICBdO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG5cbi8qKlxuICogQ2FsYyBleHByZXNzaW9ucyByZXF1aXJlIHdoaXRlc3BhY2UgYmVmb3JlICYgYWZ0ZXIgYW55IGV4cHJlc3Npb24gb3BlcmF0b3JzXG4gKiBUaGlzIGlzIGEgc2ltcGxlLCBjcnVkZSB3aGl0ZXNwYWNlIHBhZGRpbmcgc29sdXRpb24uXG4gKiAgIC0gJzMgMyBjYWxjKDE1ZW0gKyAyMHB4KSdcbiAqICAgLSBjYWxjKDEwMCUgLyA3ICogMilcbiAqICAgLSAnY2FsYygxNWVtICsgMjBweCknXG4gKiAgIC0gJ2NhbGMoMTVlbSsyMHB4KSdcbiAqICAgLSAnMzdweCdcbiAqICAgPSAnNDMlJ1xuICovXG5mdW5jdGlvbiBfdmFsaWRhdGVDYWxjVmFsdWUoY2FsYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhbGMucmVwbGFjZSgvW1xcc10vZywgJycpLnJlcGxhY2UoL1tcXC9cXCpcXCtcXC1dL2csICcgJCYgJyk7XG59XG4iLCJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGFwcGx5Q3NzUHJlZml4ZXMgfSBmcm9tICcuL2F1dG8tcHJlZml4ZXInO1xuaW1wb3J0IHsgdmFsaWRhdGVWYWx1ZSwgYnVpbGRDU1MsIGlzRmxvd0hvcml6b250YWwgfSBmcm9tICcuL2xheW91dC12YWxpZGF0b3InO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVMYXlvdXRDbGFzc05hbWUsIG5vcm1hbGl6ZUxheW91dEFsaWduVmFsdWUsIGdlbmVyYXRlTGF5b3V0QWxpZ25DbGFzc05hbWUsXG4gIGdlbmVyYXRlTGF5b3V0R2FwQ2xhc3NOYW1lLCBnZW5lcmF0ZUZsZXhDbGFzc05hbWUsIGdlbmVyYXRlRmxleE9yZGVyQ2xhc3NOYW1lLCBnZW5lcmF0ZUZsZXhPZmZzZXRDbGFzc05hbWUsXG4gIGdlbmVyYXRlRmxleEFsaWduQ2xhc3NOYW1lLCBnZW5lcmF0ZUZsZXhGaWxsQ2xhc3NOYW1lLCBnZW5lcmF0ZUZsZXhTaG93SGlkZUNsYXNzTmFtZVxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVCYXNpcyB9IGZyb20gJy4vYmFzaXMtdmFsaWRhdG9yJztcblxuZXhwb3J0IGludGVyZmFjZSBCcmVha3BvaW50IHtcbiAgYWxpYXM6IHN0cmluZztcbiAgbWVkaWE6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgRkxFWF9DU1NfREVGQVVMVF9CUkVBS1BPSU5UUzogQnJlYWtwb2ludFtdID0gW1xuICB7IGFsaWFzOiAnZ3QteHMnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogNjAwcHgpJ10gfSxcbiAgeyBhbGlhczogJ2x0LXhsJywgbWVkaWE6IFsnc2NyZWVuJywgJyhtYXgtd2lkdGg6IDE5MTlweCknXSB9LFxuICB7IGFsaWFzOiAnZ3Qtc20nLCBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogOTYwcHgpJ10gfSxcbiAgeyBhbGlhczogJ2x0LWxnJywgbWVkaWE6IFsnc2NyZWVuJywgJyhtYXgtd2lkdGg6IDEyNzlweCknXSB9LFxuICB7IGFsaWFzOiAnZ3QtbWQnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogMTI4MHB4KSddIH0sXG4gIHsgYWxpYXM6ICdsdC1tZCcsIG1lZGlhOiBbJ3NjcmVlbicsICcobWF4LXdpZHRoOiA5NTlweCknXSB9LFxuICB7IGFsaWFzOiAnZ3QtbGcnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogMTkyMHB4KSddIH0sXG4gIHsgYWxpYXM6ICdsdC1zbScsIG1lZGlhOiBbJ3NjcmVlbicsICcobWF4LXdpZHRoOiA1OTlweCknXSB9LFxuICB7IGFsaWFzOiAneGwnLCAgICBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogMTkyMHB4KScsICcobWF4LXdpZHRoOiA1MDAwcHgpJ10gfSxcbiAgeyBhbGlhczogJ2xnJywgICAgbWVkaWE6IFsnc2NyZWVuJywgJyhtaW4td2lkdGg6IDEyODBweCknLCAnKG1heC13aWR0aDogMTkxOXB4KSddIH0sXG4gIHsgYWxpYXM6ICdtZCcsICAgIG1lZGlhOiBbJ3NjcmVlbicsICcobWluLXdpZHRoOiA5NjBweCknLCAnKG1heC13aWR0aDogMTI3OXB4KSddIH0sXG4gIHsgYWxpYXM6ICdzbScsICAgIG1lZGlhOiBbJ3NjcmVlbicsICcobWluLXdpZHRoOiA2MDBweCknLCAnKG1heC13aWR0aDogOTU5cHgpJ10gfSxcbiAgeyBhbGlhczogJ3hzJywgICAgbWVkaWE6IFsnc2NyZWVuJywgJyhtYXgtd2lkdGg6IDU5OXB4KSddIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgRkxFWF9DU1NfQlJFQUtQT0lOVFNfU01BTExfVE9fTEFSR0U6IEJyZWFrcG9pbnRbXSA9IFtcbiAgeyBhbGlhczogJ2x0LXNtJywgbWVkaWE6IFsnc2NyZWVuJywgJyhtYXgtd2lkdGg6IDU5OXB4KSddIH0sXG4gIHsgYWxpYXM6ICd4cycsICAgIG1lZGlhOiBbJ3NjcmVlbicsICcobWF4LXdpZHRoOiA1OTlweCknXSB9LFxuICB7IGFsaWFzOiAnZ3QteHMnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogNjAwcHgpJ10gfSxcblxuICB7IGFsaWFzOiAnbHQtbWQnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1heC13aWR0aDogOTU5cHgpJ10gfSxcbiAgeyBhbGlhczogJ3NtJywgICAgbWVkaWE6IFsnc2NyZWVuJywgJyhtaW4td2lkdGg6IDYwMHB4KScsICcobWF4LXdpZHRoOiA5NTlweCknXSB9LFxuICB7IGFsaWFzOiAnZ3Qtc20nLCBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogOTYwcHgpJ10gfSxcblxuICB7IGFsaWFzOiAnbHQtbGcnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1heC13aWR0aDogMTI3OXB4KSddIH0sXG4gIHsgYWxpYXM6ICdtZCcsICAgIG1lZGlhOiBbJ3NjcmVlbicsICcobWluLXdpZHRoOiA5NjBweCknLCAnKG1heC13aWR0aDogMTI3OXB4KSddIH0sXG4gIHsgYWxpYXM6ICdndC1tZCcsIG1lZGlhOiBbJ3NjcmVlbicsICcobWluLXdpZHRoOiAxMjgwcHgpJ10gfSxcblxuICB7IGFsaWFzOiAnbHQteGwnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1heC13aWR0aDogMTkxOXB4KSddIH0sXG4gIHsgYWxpYXM6ICdsZycsICAgIG1lZGlhOiBbJ3NjcmVlbicsICcobWluLXdpZHRoOiAxMjgwcHgpJywgJyhtYXgtd2lkdGg6IDE5MTlweCknXSB9LFxuICB7IGFsaWFzOiAnZ3QtbGcnLCBtZWRpYTogWydzY3JlZW4nLCAnKG1pbi13aWR0aDogMTkyMHB4KSddIH0sXG5cbiAgeyBhbGlhczogJ3hsJywgICAgbWVkaWE6IFsnc2NyZWVuJywgJyhtaW4td2lkdGg6IDE5MjBweCknLCAnKG1heC13aWR0aDogNTAwMHB4KSddIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgRkxFWF9DU1NfQlJFQUtQT0lOVFMgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignZmxleF9jc3NfYnJlYWtwb2ludHMnKTtcblxuZXhwb3J0IHR5cGUgU3R5bGVEZWZpbml0aW9uID0gc3RyaW5nIHwgeyBbcHJvcGVydHk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IG51bGwgfTtcblxuZXhwb3J0IGNsYXNzIEZsZXhDc3NTdHlsZUVsZW1lbnQge1xuICBwdWJsaWMgc3RvcmFnZTogeyBbcHJvcGVydHk6IHN0cmluZ106IHsgW3Byb3BlcnR5OiBzdHJpbmddOiBUZXh0IH0gfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzdHlsZTogSFRNTFN0eWxlRWxlbWVudCxcbiAgKSB7fVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmxleENzc1NlcnZpY2Uge1xuICBwcml2YXRlIGxheW91dDogRmxleENzc1N0eWxlRWxlbWVudDtcblxuICBwcml2YXRlIGZsZXg6IEZsZXhDc3NTdHlsZUVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBmaWxsOiBGbGV4Q3NzU3R5bGVFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jLFxuICAgIEBJbmplY3QoRkxFWF9DU1NfQlJFQUtQT0lOVFMpIHByaXZhdGUgYnJlYWtwb2ludHMsXG4gICkge1xuICAgIHRoaXMuaW5pdExheW91dCgpO1xuICAgIHRoaXMuaW5pdEZsZXgoKTtcbiAgICB0aGlzLmluaXRGaWxsKCk7XG4gIH1cblxuICBpbml0TGF5b3V0KCkge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcblxuICAgIHN0eWxlLmlkID0gJ2ZjLWxheW91dCc7XG5cbiAgICB0aGlzLmRvYy5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblxuICAgIHRoaXMubGF5b3V0ID0gbmV3IEZsZXhDc3NTdHlsZUVsZW1lbnQoc3R5bGUpO1xuICB9XG5cbiAgaW5pdEZsZXgoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXG4gICAgc3R5bGUuaWQgPSAnZmMtZmxleCc7XG5cbiAgICB0aGlzLmRvYy5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblxuICAgIHRoaXMuZmxleCA9IG5ldyBGbGV4Q3NzU3R5bGVFbGVtZW50KHN0eWxlKTtcbiAgfVxuXG4gIGluaXRGaWxsKCkge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcblxuICAgIHN0eWxlLmlkID0gJ2ZjLWZpbGwnO1xuXG4gICAgdGhpcy5kb2MuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cbiAgICB0aGlzLmZpbGwgPSBuZXcgRmxleENzc1N0eWxlRWxlbWVudChzdHlsZSk7XG4gIH1cblxuICBhZGRMYXlvdXQobGF5b3V0OiBzdHJpbmcsIGJyZWFrcG9pbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IFtkaXJlY3Rpb24sIHdyYXAsIGlzSW5saW5lXSA9IHZhbGlkYXRlVmFsdWUobGF5b3V0KTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGdlbmVyYXRlTGF5b3V0Q2xhc3NOYW1lKGRpcmVjdGlvbiwgd3JhcCwgaXNJbmxpbmUsIGJyZWFrcG9pbnQpO1xuXG4gICAgaWYgKCF0aGlzLmhhc0luTGF5b3V0U3RvcmFnZShjbGFzc05hbWUsIGJyZWFrcG9pbnQpKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGJ1aWxkQ1NTKGRpcmVjdGlvbiwgd3JhcCwgaXNJbmxpbmUpO1xuXG4gICAgICB0aGlzLmFkZFRvTGF5b3V0U3RvcmFnZShjbGFzc05hbWUsIHN0eWxlLCBicmVha3BvaW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG5cbiAgYWRkTGF5b3V0QWxpZ24obGF5b3V0OiBzdHJpbmcsIGxheW91dEJyZWFrcG9pbnQ6IHN0cmluZywgYWxpZ246IHN0cmluZywgYnJlYWtwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBbbWFpbkF4aXMsIGNyb3NzQXhpc10gPSBub3JtYWxpemVMYXlvdXRBbGlnblZhbHVlKGFsaWduKTtcblxuICAgIGNvbnN0IGxheW91dEFsaWduQ2xhc3NOYW1lID0gZ2VuZXJhdGVMYXlvdXRBbGlnbkNsYXNzTmFtZShtYWluQXhpcywgY3Jvc3NBeGlzLCBicmVha3BvaW50KTtcblxuICAgIGlmICghdGhpcy5oYXNJbkxheW91dFN0b3JhZ2UobGF5b3V0QWxpZ25DbGFzc05hbWUsIGJyZWFrcG9pbnQpKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgICAgJ2p1c3RpZnktY29udGVudCc6IG1haW5BeGlzLFxuICAgICAgfTtcblxuICAgICAgc3dpdGNoIChjcm9zc0F4aXMpIHtcbiAgICAgICAgY2FzZSAnYmFzZWxpbmUnOlxuICAgICAgICAgIHN0eWxlWydhbGlnbi1pdGVtcyddID0gY3Jvc3NBeGlzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHN0eWxlWydhbGlnbi1pdGVtcyddID0gc3R5bGVbJ2FsaWduLWNvbnRlbnQnXSA9IGNyb3NzQXhpcztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdGhpcy5hZGRUb0xheW91dFN0b3JhZ2UobGF5b3V0QWxpZ25DbGFzc05hbWUsIHN0eWxlLCBicmVha3BvaW50KTtcbiAgICB9XG5cbiAgICBpZiAoY3Jvc3NBeGlzID09PSAnc3RyZXRjaCcpIHtcbiAgICAgIGNvbnN0IFtkaXJlY3Rpb24sIHdyYXAsIGlzSW5saW5lXSA9IHZhbGlkYXRlVmFsdWUobGF5b3V0KTtcblxuICAgICAgY29uc3QgbGF5b3V0Q2xhc3NOYW1lID0gZ2VuZXJhdGVMYXlvdXRDbGFzc05hbWUoZGlyZWN0aW9uLCB3cmFwLCBpc0lubGluZSwgbGF5b3V0QnJlYWtwb2ludCk7XG5cbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGxheW91dEFsaWduQ2xhc3NOYW1lICsgJy4nICsgbGF5b3V0Q2xhc3NOYW1lO1xuXG4gICAgICBpZiAoIXRoaXMuaGFzSW5MYXlvdXRTdG9yYWdlKGNsYXNzTmFtZSwgYnJlYWtwb2ludCkpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBpc0Zsb3dIb3Jpem9udGFsKGxheW91dCkgPyB7ICdtYXgtaGVpZ2h0JzogJzEwMCUnIH0gOiB7ICdtYXgtd2lkdGgnOiAnMTAwJScgfTtcblxuICAgICAgICB0aGlzLmFkZFRvTGF5b3V0U3RvcmFnZShjbGFzc05hbWUsIHN0eWxlLCBicmVha3BvaW50LCBbbGF5b3V0QnJlYWtwb2ludF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXlvdXRBbGlnbkNsYXNzTmFtZTtcbiAgfVxuXG4gIGFkZExheW91dEdhcChsYXlvdXQ6IHN0cmluZywgbGF5b3V0QnJlYWtwb2ludDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBicmVha3BvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhbHVlID0gdmFsdWUgfHwgJzAnO1xuXG4gICAgY29uc3QgW2RpcmVjdGlvbiwgd3JhcCwgaXNJbmxpbmVdID0gdmFsaWRhdGVWYWx1ZShsYXlvdXQpO1xuXG4gICAgY29uc3QgbGF5b3V0Q2xhc3NOYW1lID0gZ2VuZXJhdGVMYXlvdXRDbGFzc05hbWUoZGlyZWN0aW9uLCB3cmFwLCBpc0lubGluZSwgbGF5b3V0QnJlYWtwb2ludCk7XG5cbiAgICBjb25zdCBsYXlvdXRHYXBDbGFzc05hbWUgPSBnZW5lcmF0ZUxheW91dEdhcENsYXNzTmFtZSh2YWx1ZSwgYnJlYWtwb2ludCk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBsYXlvdXRHYXBDbGFzc05hbWUgKyAnLicgKyBsYXlvdXRDbGFzc05hbWUgKyAnID4gKjpub3QoOmxhc3QtY2hpbGQpJztcblxuICAgIGlmICghdGhpcy5oYXNJbkxheW91dFN0b3JhZ2UoY2xhc3NOYW1lLCBicmVha3BvaW50KSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBpc0Zsb3dIb3Jpem9udGFsKGxheW91dCkgPyB7ICdtYXJnaW4tcmlnaHQnOiB2YWx1ZSB9IDogeyAnbWFyZ2luLWJvdHRvbSc6IHZhbHVlIH07XG5cbiAgICAgIHRoaXMuYWRkVG9MYXlvdXRTdG9yYWdlKGNsYXNzTmFtZSwgc3R5bGUsIGJyZWFrcG9pbnQsIFtsYXlvdXRCcmVha3BvaW50XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheW91dEdhcENsYXNzTmFtZTtcbiAgfVxuXG4gIGFkZEZsZXgobGF5b3V0OiBzdHJpbmcsIGxheW91dEJyZWFrcG9pbnQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgYnJlYWtwb2ludDogc3RyaW5nLCBncm93Pywgc2hyaW5rPykge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnOycsICcnKTtcblxuICAgIGxldCBbdGhlR3JvdywgdGhlU2hyaW5rLCB0aGVCYXNpc10gPSB2YWxpZGF0ZUJhc2lzKHZhbHVlLCBncm93LCBzaHJpbmspO1xuXG4gICAgdGhlR3JvdyA9ICh0aGVHcm93ID09PSAnMCcpID8gMCA6IHRoZUdyb3c7XG4gICAgdGhlU2hyaW5rID0gKHRoZVNocmluayA9PT0gJzAnKSA/IDAgOiB0aGVTaHJpbms7XG5cbiAgICAvLyBmbGV4LWJhc2lzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgaW5pdGlhbC9zdGFydGluZyBtYWluLWF4aXMgc2l6ZSBvZiB0aGUgZWxlbWVudCxcbiAgICAvLyBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb21wdXRlZC4gSXQgY2FuIGVpdGhlciBiZSBhIHBlcmNlbnRhZ2Ugb3IgYW4gYWJzb2x1dGUgdmFsdWUuXG4gICAgLy8gSXQgaXMsIGhvd2V2ZXIsIG5vdCB0aGUgYnJlYWtpbmcgcG9pbnQgZm9yIGZsZXgtZ3Jvdy9zaHJpbmsgcHJvcGVydGllc1xuICAgIC8vXG4gICAgLy8gZmxleC1ncm93IGNhbiBiZSBzZWVuIGFzIHRoaXM6XG4gICAgLy8gICAwOiBEbyBub3Qgc3RyZXRjaC4gRWl0aGVyIHNpemUgdG8gZWxlbWVudCdzIGNvbnRlbnQgd2lkdGgsIG9yIG9iZXkgJ2ZsZXgtYmFzaXMnLlxuICAgIC8vICAgMTogKERlZmF1bHQgdmFsdWUpLiBTdHJldGNoOyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgdG8gYWxsIG90aGVyIGZsZXggaXRlbXMgb25cbiAgICAvLyAgICAgICB0aGUgc2FtZSByb3cgc2luY2UgdGhleSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBvZiAxLlxuICAgIC8vICAgw6LCicKlMiAoaW50ZWdlciBuKTogU3RyZXRjaC4gV2lsbCBiZSBuIHRpbWVzIHRoZSBzaXplIG9mIG90aGVyIGVsZW1lbnRzXG4gICAgLy8gICAgICB3aXRoICdmbGV4LWdyb3c6IDEnIG9uIHRoZSBzYW1lIHJvdy5cblxuICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgJ2JveC1zaXppbmcnOiAnYm9yZGVyLWJveCcsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhlQmFzaXMgfHwgJycpIHtcbiAgICAgIGNhc2UgJyc6XG4gICAgICAgIHN0eWxlWydmbGV4J10gPSBgJHt0aGVHcm93fSAke3RoZVNocmlua30gMC4wMDAwMDAwMDFweGA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5pdGlhbCc6ICAgLy8gZGVmYXVsdFxuICAgICAgY2FzZSAnbm9ncm93JzpcbiAgICAgICAgdGhlR3JvdyA9IDA7XG4gICAgICAgIHN0eWxlWydmbGV4J10gPSBgMCAxIGF1dG9gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dyb3cnOlxuICAgICAgICBzdHlsZVsnZmxleCddID0gYDEgMSAxMDAlYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub3Nocmluayc6XG4gICAgICAgIHRoZVNocmluayA9IDA7XG4gICAgICAgIHN0eWxlWydmbGV4J10gPSBgMSAwIGF1dG9gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2F1dG8nOlxuICAgICAgICBzdHlsZVsnZmxleCddID0gYCR7dGhlR3Jvd30gJHt0aGVTaHJpbmt9IGF1dG9gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICB0aGVHcm93ID0gMDtcbiAgICAgICAgdGhlU2hyaW5rID0gMDtcbiAgICAgICAgc3R5bGVbJ2ZsZXgnXSA9IGAwIDAgYXV0b2A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgaXNDYWxjID0gU3RyaW5nKHRoZUJhc2lzKS5pbmRleE9mKCdjYWxjJykgPiAtMTtcbiAgICAgICAgY29uc3QgaXNQZXJjZW50ID0gIWlzQ2FsYyAmJiBTdHJpbmcodGhlQmFzaXMpLmluZGV4T2YoJyUnKSA+IC0xO1xuXG4gICAgICAgIGNvbnN0IGlzVmFsdWUgPSBpc0NhbGMgfHwgaXNQZXJjZW50IHx8XG4gICAgICAgICAgU3RyaW5nKHRoZUJhc2lzKS5pbmRleE9mKCdweCcpID4gLTEgfHxcbiAgICAgICAgICBTdHJpbmcodGhlQmFzaXMpLmluZGV4T2YoJ2VtJykgPiAtMSB8fFxuICAgICAgICAgIFN0cmluZyh0aGVCYXNpcykuaW5kZXhPZigndncnKSA+IC0xIHx8XG4gICAgICAgICAgU3RyaW5nKHRoZUJhc2lzKS5pbmRleE9mKCd2aCcpID4gLTE7XG5cbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gcGVyY2VudGFnZSBzaXppbmcgdW5sZXNzIGBweGAgaXMgZXhwbGljaXRseSBzZXRcbiAgICAgICAgaWYgKCFpc1ZhbHVlICYmICFpc1BlcmNlbnQgJiYgIWlzTmFOKHRoZUJhc2lzIGFzIGFueSkpIHtcbiAgICAgICAgICB0aGVCYXNpcyA9IHRoZUJhc2lzICsgJyUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoZUJhc2lzID09PSAnMHB4Jykge1xuICAgICAgICAgIHRoZUJhc2lzID0gJzAlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlWydmbGV4LWdyb3cnXSA9IGAke3RoZUdyb3d9YDtcbiAgICAgICAgc3R5bGVbJ2ZsZXgtc2hyaW5rJ10gPSBgJHt0aGVTaHJpbmt9YDtcbiAgICAgICAgc3R5bGVbJ2ZsZXgtYmFzaXMnXSA9IHN0eWxlWydtaW4td2lkdGgnXSA9IHN0eWxlWydtYXgtd2lkdGgnXSA9IGlzVmFsdWUgPyBgJHt0aGVCYXNpc31gIDogJzEwMCUnO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBmbGV4Q2xhc3NOYW1lID0gZ2VuZXJhdGVGbGV4Q2xhc3NOYW1lKHRoZUdyb3csIHRoZVNocmluaywgdGhlQmFzaXMsIGJyZWFrcG9pbnQpO1xuXG4gICAgaWYgKCF0aGlzLmhhc0luRmxleFN0b3JhZ2UoZmxleENsYXNzTmFtZSwgYnJlYWtwb2ludCkpIHtcbiAgICAgIHRoaXMuYWRkVG9GbGV4U3RvcmFnZShmbGV4Q2xhc3NOYW1lLCBzdHlsZSwgYnJlYWtwb2ludCk7XG4gICAgfVxuXG4gICAgY29uc3QgW2RpcmVjdGlvbiwgd3JhcCwgaXNJbmxpbmVdID0gdmFsaWRhdGVWYWx1ZShsYXlvdXQpO1xuXG4gICAgY29uc3QgbGF5b3V0Q2xhc3NOYW1lID0gZ2VuZXJhdGVMYXlvdXRDbGFzc05hbWUoZGlyZWN0aW9uLCB3cmFwLCBpc0lubGluZSwgbGF5b3V0QnJlYWtwb2ludCk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBmbGV4Q2xhc3NOYW1lICsgJy4nICsgbGF5b3V0Q2xhc3NOYW1lO1xuXG4gICAgaWYgKCF0aGlzLmhhc0luRmxleFN0b3JhZ2UoY2xhc3NOYW1lLCBicmVha3BvaW50KSkge1xuICAgICAgY29uc3QgbWF4ID0gaXNGbG93SG9yaXpvbnRhbChkaXJlY3Rpb24pID8gJ21heC13aWR0aCcgOiAnbWF4LWhlaWdodCc7XG4gICAgICBjb25zdCBtaW4gPSBpc0Zsb3dIb3Jpem9udGFsKGRpcmVjdGlvbikgPyAnbWluLXdpZHRoJyA6ICdtaW4taGVpZ2h0JztcblxuICAgICAgY29uc3QgdXNpbmdDYWxjID0gKFN0cmluZyh0aGVCYXNpcykuaW5kZXhPZignY2FsYycpID4gLTEpIHx8ICh0aGVCYXNpcyA9PT0gJ2F1dG8nKTtcbiAgICAgIGNvbnN0IGlzUHggPSBTdHJpbmcodGhlQmFzaXMpLmluZGV4T2YoJ3B4JykgPiAtMSB8fCB1c2luZ0NhbGM7XG5cbiAgICAgIC8vIG1ha2UgYm94IGluZmxleGlibGUgd2hlbiBzaHJpbmsgYW5kIGdyb3cgYXJlIGJvdGggemVyb1xuICAgICAgLy8gc2hvdWxkIG5vdCBzZXQgYSBtaW4gd2hlbiB0aGUgZ3JvdyBpcyB6ZXJvXG4gICAgICAvLyBzaG91bGQgbm90IHNldCBhIG1heCB3aGVuIHRoZSBzaHJpbmsgaXMgemVyb1xuICAgICAgY29uc3QgaXNGaXhlZCA9ICF0aGVHcm93ICYmICF0aGVTaHJpbms7XG5cbiAgICAgIGNvbnN0IGxheW91dFN0eWxlID0ge307XG5cbiAgICAgIGxheW91dFN0eWxlW21pbl0gPSAodGhlQmFzaXMgPT09ICcwJScpID8gMCA6IGlzRml4ZWQgfHwgKGlzUHggJiYgdGhlR3JvdykgPyB0aGVCYXNpcyA6IG51bGw7XG4gICAgICBsYXlvdXRTdHlsZVttYXhdID0gKHRoZUJhc2lzID09PSAnMCUnKSA/IDAgOiBpc0ZpeGVkIHx8ICghdXNpbmdDYWxjICYmIHRoZVNocmluaykgPyB0aGVCYXNpcyA6IG51bGw7XG5cbiAgICAgIHRoaXMuYWRkVG9GbGV4U3RvcmFnZShjbGFzc05hbWUsIGxheW91dFN0eWxlLCBicmVha3BvaW50LCBbbGF5b3V0QnJlYWtwb2ludF0pO1xuICAgIH1cblxuICAgIHJldHVybiBmbGV4Q2xhc3NOYW1lO1xuICB9XG5cbiAgYWRkRmxleE9yZGVyKG9yZGVyLCBicmVha3BvaW50OiBzdHJpbmcpIHtcbiAgICBvcmRlciA9IHBhcnNlSW50KG9yZGVyLCAxMCk7XG5cbiAgICBvcmRlciA9IGlzTmFOKG9yZGVyKSA/IDAgOiBvcmRlcjtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGdlbmVyYXRlRmxleE9yZGVyQ2xhc3NOYW1lKG9yZGVyLCBicmVha3BvaW50KTtcblxuICAgIGlmICghdGhpcy5oYXNJbkZsZXhTdG9yYWdlKGNsYXNzTmFtZSwgYnJlYWtwb2ludCkpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0geydvcmRlcic6IG9yZGVyfTtcblxuICAgICAgdGhpcy5hZGRUb0ZsZXhTdG9yYWdlKGNsYXNzTmFtZSwgc3R5bGUsIGJyZWFrcG9pbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBhZGRGbGV4T2Zmc2V0KGxheW91dDogc3RyaW5nLCBsYXlvdXRCcmVha3BvaW50OiBzdHJpbmcsIG9mZnNldCwgYnJlYWtwb2ludDogc3RyaW5nKSB7XG4gICAgY29uc3QgaXNQZXJjZW50ID0gU3RyaW5nKG9mZnNldCkuaW5kZXhPZignJScpID4gLTE7XG4gICAgY29uc3QgaXNQeCA9IFN0cmluZyhvZmZzZXQpLmluZGV4T2YoJ3B4JykgPiAtMTtcblxuICAgIGlmICghaXNQeCAmJiAhaXNQZXJjZW50ICYmICFpc05hTihvZmZzZXQpKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgKyAnJSc7XG4gICAgfVxuXG4gICAgY29uc3QgW2RpcmVjdGlvbiwgd3JhcCwgaXNJbmxpbmVdID0gdmFsaWRhdGVWYWx1ZShsYXlvdXQpO1xuXG4gICAgY29uc3Qgb2Zmc2V0Q2xhc3NOYW1lID0gZ2VuZXJhdGVGbGV4T2Zmc2V0Q2xhc3NOYW1lKG9mZnNldCwgYnJlYWtwb2ludCk7XG5cbiAgICBjb25zdCBsYXlvdXRDbGFzc05hbWUgPSBnZW5lcmF0ZUxheW91dENsYXNzTmFtZShkaXJlY3Rpb24sIHdyYXAsIGlzSW5saW5lLCBsYXlvdXRCcmVha3BvaW50KTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IG9mZnNldENsYXNzTmFtZSArICcuJyArIGxheW91dENsYXNzTmFtZTtcblxuICAgIGlmICghdGhpcy5oYXNJbkZsZXhTdG9yYWdlKGNsYXNzTmFtZSwgYnJlYWtwb2ludCkpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gaXNGbG93SG9yaXpvbnRhbChkaXJlY3Rpb24pID8geydtYXJnaW4tbGVmdCc6IGAke29mZnNldH1gfSA6IHsnbWFyZ2luLXRvcCc6IGAke29mZnNldH1gfTtcblxuICAgICAgdGhpcy5hZGRUb0ZsZXhTdG9yYWdlKGNsYXNzTmFtZSwgc3R5bGUsIGJyZWFrcG9pbnQsIFtsYXlvdXRCcmVha3BvaW50XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldENsYXNzTmFtZTtcbiAgfVxuXG4gIGFkZEZsZXhBbGlnbihhbGlnbiwgYnJlYWtwb2ludDogc3RyaW5nKSB7XG4gICAgYWxpZ24gPSBhbGlnbiB8fCAnc3RyZXRjaCc7XG5cbiAgICAvLyBDcm9zcy1heGlzXG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICBhbGlnbiA9ICdmbGV4LXN0YXJ0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbmQnOlxuICAgICAgICBhbGlnbiA9ICdmbGV4LWVuZCc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGdlbmVyYXRlRmxleEFsaWduQ2xhc3NOYW1lKGFsaWduLCBicmVha3BvaW50KTtcblxuICAgIGlmICghdGhpcy5oYXNJbkZsZXhTdG9yYWdlKGNsYXNzTmFtZSwgYnJlYWtwb2ludCkpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0geydhbGlnbi1zZWxmJzogYWxpZ259O1xuXG4gICAgICB0aGlzLmFkZFRvRmxleFN0b3JhZ2UoY2xhc3NOYW1lLCBzdHlsZSwgYnJlYWtwb2ludCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGFkZEZsZXhGaWxsKCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGdlbmVyYXRlRmxleEZpbGxDbGFzc05hbWUoKTtcblxuICAgIGlmICghdGhpcy5oYXNJbkZpbGxTdG9yYWdlKGNsYXNzTmFtZSwgJ2FsbCcpKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgICAgJ21hcmdpbic6IDAsXG4gICAgICAgICd3aWR0aCc6ICcxMDAlJyxcbiAgICAgICAgJ2hlaWdodCc6ICcxMDAlJyxcbiAgICAgICAgJ21pbi13aWR0aCc6ICcxMDAlJyxcbiAgICAgICAgJ21pbi1oZWlnaHQnOiAnMTAwJScsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmFkZFRvRmlsbFN0b3JhZ2UoY2xhc3NOYW1lLCBzdHlsZSwgJ2FsbCcpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBhZGRTaG93SGlkZShkaXNwbGF5OiBzdHJpbmcsIHNob3c6IGJvb2xlYW4sIGJyZWFrcG9pbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGdlbmVyYXRlRmxleFNob3dIaWRlQ2xhc3NOYW1lKGRpc3BsYXksIHNob3csIGJyZWFrcG9pbnQpO1xuXG4gICAgaWYgKCF0aGlzLmhhc0luRmlsbFN0b3JhZ2UoY2xhc3NOYW1lLCBicmVha3BvaW50KSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICAgICdkaXNwbGF5Jzogc2hvdyA/IGRpc3BsYXkgfHwgJ2Jsb2NrJyA6ICdub25lJyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuYWRkVG9GaWxsU3RvcmFnZShjbGFzc05hbWUsIHN0eWxlLCBicmVha3BvaW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNJbkxheW91dFN0b3JhZ2UoY2xhc3NOYW1lOiBzdHJpbmcsIGJyZWFrcG9pbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0luU3RvcmFnZSh0aGlzLmxheW91dCwgY2xhc3NOYW1lLCBicmVha3BvaW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9MYXlvdXRTdG9yYWdlKGNsYXNzTmFtZTogc3RyaW5nLCBzdHlsZTogU3R5bGVEZWZpbml0aW9uLCBicmVha3BvaW50OiBzdHJpbmcsIGN1c3RvbUJyZWFrcG9pbnRzPzogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1N0b3JhZ2UodGhpcy5sYXlvdXQsIGNsYXNzTmFtZSwgc3R5bGUsIGJyZWFrcG9pbnQsIGN1c3RvbUJyZWFrcG9pbnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzSW5GbGV4U3RvcmFnZShjbGFzc05hbWU6IHN0cmluZywgYnJlYWtwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzSW5TdG9yYWdlKHRoaXMuZmxleCwgY2xhc3NOYW1lLCBicmVha3BvaW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9GbGV4U3RvcmFnZShjbGFzc05hbWU6IHN0cmluZywgc3R5bGU6IFN0eWxlRGVmaW5pdGlvbiwgYnJlYWtwb2ludDogc3RyaW5nLCBjdXN0b21CcmVha3BvaW50cz86IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVG9TdG9yYWdlKHRoaXMuZmxleCwgY2xhc3NOYW1lLCBzdHlsZSwgYnJlYWtwb2ludCwgY3VzdG9tQnJlYWtwb2ludHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNJbkZpbGxTdG9yYWdlKGNsYXNzTmFtZTogc3RyaW5nLCBicmVha3BvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNJblN0b3JhZ2UodGhpcy5maWxsLCBjbGFzc05hbWUsIGJyZWFrcG9pbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUb0ZpbGxTdG9yYWdlKGNsYXNzTmFtZTogc3RyaW5nLCBzdHlsZTogU3R5bGVEZWZpbml0aW9uLCBicmVha3BvaW50OiBzdHJpbmcsIGN1c3RvbUJyZWFrcG9pbnRzPzogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1N0b3JhZ2UodGhpcy5maWxsLCBjbGFzc05hbWUsIHN0eWxlLCBicmVha3BvaW50LCBjdXN0b21CcmVha3BvaW50cyk7XG4gIH1cblxuICBwcml2YXRlIGhhc0luU3RvcmFnZShzdHlsZUVsZW1lbnQ6IEZsZXhDc3NTdHlsZUVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBicmVha3BvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoc3R5bGVFbGVtZW50LnN0b3JhZ2VbYnJlYWtwb2ludF0gJiYgc3R5bGVFbGVtZW50LnN0b3JhZ2VbYnJlYWtwb2ludF1bY2xhc3NOYW1lXSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRvU3RvcmFnZShcbiAgICBzdHlsZUVsZW1lbnQ6IEZsZXhDc3NTdHlsZUVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBzdHlsZTogU3R5bGVEZWZpbml0aW9uLCBicmVha3BvaW50OiBzdHJpbmcsIGN1c3RvbUJyZWFrcG9pbnRzPzogc3RyaW5nW10pIHtcbiAgICBjdXN0b21CcmVha3BvaW50cyA9IGN1c3RvbUJyZWFrcG9pbnRzIHx8IFtdO1xuXG4gICAgY29uc3Qgc3R5bGVzID0gYXBwbHlDc3NQcmVmaXhlcyhzdHlsZSk7XG5cbiAgICBjb25zdCBjc3MgPSB0aGlzLmdlbmVyYXRlQ3NzKHN0eWxlcyk7XG5cbiAgICBpZiAoY3NzICE9PSAnJykge1xuICAgICAgY29uc3QgY2xhc3NDc3MgPSAnLicgKyBjbGFzc05hbWUgKyAnIHsgJyArIGNzcyArICcgfSc7XG5cbiAgICAgIGNvbnN0IGNzc0VsZW1lbnQgPSB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZSh0aGlzLmFkZEJyZWFrcG9pbnRzKFticmVha3BvaW50XS5jb25jYXQoY3VzdG9tQnJlYWtwb2ludHMpLCBjbGFzc0NzcykpO1xuXG4gICAgICBpZiAoIXN0eWxlRWxlbWVudC5zdG9yYWdlW2JyZWFrcG9pbnRdKSB7XG4gICAgICAgIHN0eWxlRWxlbWVudC5zdG9yYWdlW2JyZWFrcG9pbnRdID0ge307XG4gICAgICB9XG5cbiAgICAgIHN0eWxlRWxlbWVudC5zdG9yYWdlW2JyZWFrcG9pbnRdW2NsYXNzTmFtZV0gPSBjc3NFbGVtZW50O1xuXG4gICAgICB0aGlzLnJlb3JkZXJUZXh0RWxlbWVudHMoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlb3JkZXJUZXh0RWxlbWVudHMoc3R5bGVFbGVtZW50OiBGbGV4Q3NzU3R5bGVFbGVtZW50KSB7XG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5yZW9yZGVyQnJlYWtwb2ludEVsZW1lbnRzKHN0eWxlRWxlbWVudCwgJ2FsbCcpO1xuXG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGJyZWFrcG9pbnQgPT4ge1xuICAgICAgcG9zaXRpb24gPSB0aGlzLnJlb3JkZXJCcmVha3BvaW50RWxlbWVudHMoc3R5bGVFbGVtZW50LCBicmVha3BvaW50LmFsaWFzLCBwb3NpdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVvcmRlckJyZWFrcG9pbnRFbGVtZW50cyhzdHlsZUVsZW1lbnQ6IEZsZXhDc3NTdHlsZUVsZW1lbnQsIGJyZWFrcG9pbnQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlciA9IDApIHtcbiAgICBjb25zdCBicmVha3BvaW50RWxlbWVudHMgPSBzdHlsZUVsZW1lbnQuc3RvcmFnZVticmVha3BvaW50XTtcblxuICAgIGlmICghYnJlYWtwb2ludEVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoYnJlYWtwb2ludEVsZW1lbnRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBzdHlsZUVsZW1lbnQuc3R5bGUuaW5zZXJ0QmVmb3JlKGJyZWFrcG9pbnRFbGVtZW50c1trZXldLCBzdHlsZUVsZW1lbnQuc3R5bGUuY2hpbGRyZW5bcG9zaXRpb25dKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlRWxlbWVudC5zdHlsZS5hcHBlbmRDaGlsZChicmVha3BvaW50RWxlbWVudHNba2V5XSk7XG4gICAgICB9XG5cbiAgICAgICsrcG9zaXRpb247XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQ3NzKHN0eWxlczogT2JqZWN0KSB7XG4gICAgY29uc3QgY3NzID0gW107XG5cbiAgICBPYmplY3Qua2V5cyhzdHlsZXMpLnNvcnQoKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHN0eWxlc1trZXldKSA/IHN0eWxlc1trZXldIDogW3N0eWxlc1trZXldXTtcblxuICAgICAgdmFsdWVzLnNvcnQoKTtcblxuICAgICAgdmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgY3NzLnB1c2goa2V5ICsgJzogJyArIHZhbHVlICsgJzsnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3NzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQnJlYWtwb2ludHMoYnJlYWtwb2ludHNBbGlhc2VzOiBzdHJpbmdbXSwgY3NzOiBzdHJpbmcpIHtcbiAgICBicmVha3BvaW50c0FsaWFzZXMgPSBicmVha3BvaW50c0FsaWFzZXMuZmlsdGVyKGJyZWFrcG9pbnQgPT4gYnJlYWtwb2ludCAhPT0gJ2FsbCcpO1xuXG4gICAgaWYgKCFicmVha3BvaW50c0FsaWFzZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY3NzO1xuICAgIH1cblxuICAgIGxldCB0aGVCcmVha3BvaW50cyA9IFtdO1xuXG4gICAgdGhpcy5icmVha3BvaW50c1xuICAgICAgLmZpbHRlcihicmVha3BvaW50ID0+IGJyZWFrcG9pbnRzQWxpYXNlcy5pbmRleE9mKGJyZWFrcG9pbnQuYWxpYXMpID49IDApXG4gICAgICAuZm9yRWFjaChicmVha3BvaW50ID0+IHRoZUJyZWFrcG9pbnRzID0gdGhlQnJlYWtwb2ludHMuY29uY2F0KGJyZWFrcG9pbnQubWVkaWEpKTtcblxuICAgIHRoZUJyZWFrcG9pbnRzID0gdGhlQnJlYWtwb2ludHMuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KTtcblxuICAgIHJldHVybiAnQG1lZGlhICcgKyB0aGVCcmVha3BvaW50cy5qb2luKCcgYW5kICcpICsgJyB7ICcgKyBjc3MgKyAnIH0nO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbGVtZW50UmVmLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEaXJlY3RpdmUge1xuICBwcml2YXRlIGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICkge1xuICB9XG5cbiAgc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzOiBzdHJpbmdbXSkge1xuICAgIGNsYXNzTmFtZXMgPSBjbGFzc05hbWVzLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCk7XG5cbiAgICBjbGFzc05hbWVzLmZvckVhY2goY2xhc3NOYW1lID0+IHRoaXMuYWRkQ2xhc3NOYW1lKGNsYXNzTmFtZSkpO1xuXG4gICAgdGhpcy5jbGFzc05hbWVzXG4gICAgICAuZmlsdGVyKGNsYXNzTmFtZSA9PiBjbGFzc05hbWVzLmluZGV4T2YoY2xhc3NOYW1lKSA8IDApXG4gICAgICAuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5yZW1vdmVDbGFzc05hbWUoY2xhc3NOYW1lKSk7XG5cbiAgICB0aGlzLmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuICB9XG5cbiAgYWRkQ2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgfVxuXG4gIHJlbW92ZUNsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIFJlbmRlcmVyMiwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZsZXhDc3NTZXJ2aWNlIH0gZnJvbSAnLi9mbGV4LWNzcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogYFxuICAgIFtmY0xheW91dF0sXG4gICAgW2ZjTGF5b3V0LnhzXSwgW2ZjTGF5b3V0LnNtXSwgW2ZjTGF5b3V0Lm1kXSwgW2ZjTGF5b3V0LmxnXSwgW2ZjTGF5b3V0LnhsXSxcbiAgICBbZmNMYXlvdXQubHQtc21dLCBbZmNMYXlvdXQubHQtbWRdLCBbZmNMYXlvdXQubHQtbGddLCBbZmNMYXlvdXQubHQteGxdLFxuICAgIFtmY0xheW91dC5ndC14c10sIFtmY0xheW91dC5ndC1zbV0sIFtmY0xheW91dC5ndC1tZF0sIFtmY0xheW91dC5ndC1sZ11cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgTGF5b3V0RGlyZWN0aXZlIGV4dGVuZHMgQmFzZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHJlYWRvbmx5IGZjVmFsdWVzID0ge307XG5cbiAgcmVhZG9ubHkgb2JzZXJ2ZXIkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgQElucHV0KCdmY0xheW91dCcpICAgICAgICBzZXQgbGF5b3V0KHZhbCkgICAgIHsgdGhpcy5mY1ZhbHVlc1snYWxsJ10gPSB2YWw7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbGF5b3V0KCkgICAgICAgIHsgcmV0dXJuIHRoaXMuZmNWYWx1ZXNbJ2FsbCddOyB9XG5cbiAgQElucHV0KCdmY0xheW91dC54cycpICAgICBzZXQgbGF5b3V0WHModmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1sneHMnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0LnNtJykgICAgIHNldCBsYXlvdXRTbSh2YWwpICAgeyB0aGlzLmZjVmFsdWVzWydzbSddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXQubWQnKSAgICAgc2V0IGxheW91dE1kKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ21kJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dC5sZycpICAgICBzZXQgbGF5b3V0TGcodmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1snbGcnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0LnhsJykgICAgIHNldCBsYXlvdXRYbCh2YWwpICAgeyB0aGlzLmZjVmFsdWVzWyd4bCddID0gdmFsOyB9XG5cbiAgQElucHV0KCdmY0xheW91dC5ndC14cycpICBzZXQgbGF5b3V0R3RYcyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QteHMnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0Lmd0LXNtJykgIHNldCBsYXlvdXRHdFNtKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1zbSddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXQuZ3QtbWQnKSAgc2V0IGxheW91dEd0TWQodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2d0LW1kJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dC5ndC1sZycpICBzZXQgbGF5b3V0R3RMZyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbGcnXSA9IHZhbDsgfVxuXG4gIEBJbnB1dCgnZmNMYXlvdXQubHQtc20nKSAgc2V0IGxheW91dEx0U20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXNtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dC5sdC1tZCcpICBzZXQgbGF5b3V0THRNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQtbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0Lmx0LWxnJykgIHNldCBsYXlvdXRMdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1sZyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXQubHQteGwnKSAgc2V0IGxheW91dEx0WGwodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXhsJ10gPSB2YWw7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBGbGV4Q3NzU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgcmVuZGVyZXIpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gW107XG5cbiAgICB0aGlzLmJyZWFrcG9pbnRzLmZvckVhY2goYnJlYWtwb2ludCA9PiB7XG4gICAgICBjbGFzc05hbWVzLnB1c2godGhpcy5zZXJ2aWNlLmFkZExheW91dCh0aGlzLmZjVmFsdWVzW2JyZWFrcG9pbnRdLCBicmVha3BvaW50KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldENsYXNzTmFtZXMoY2xhc3NOYW1lcyk7XG5cbiAgICB0aGlzLm9ic2VydmVyJC5uZXh0KHRoaXMuZmNWYWx1ZXMpO1xuICB9XG5cbiAgYWRkTmV3QnJlYWtwb2ludHMoYnJlYWtwb2ludHM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU/KSB7XG4gICAgYnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50ID0+IHtcbiAgICAgIGlmICghdGhpcy5mY1ZhbHVlc1ticmVha3BvaW50XSkge1xuICAgICAgICB0aGlzLmZjVmFsdWVzW2JyZWFrcG9pbnRdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGdldCBicmVha3BvaW50cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5mY1ZhbHVlcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT25Jbml0LCBJbnB1dCwgUmVuZGVyZXIyLCBPcHRpb25hbCwgU2VsZiwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZsZXhDc3NTZXJ2aWNlIH0gZnJvbSAnLi9mbGV4LWNzcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlvdXREaXJlY3RpdmUgfSBmcm9tICcuL2xheW91dC5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBcbiAgICBbZmNMYXlvdXRBbGlnbl0sXG4gICAgW2ZjTGF5b3V0QWxpZ24ueHNdLCBbZmNMYXlvdXRBbGlnbi5zbV0sIFtmY0xheW91dEFsaWduLm1kXSwgW2ZjTGF5b3V0QWxpZ24ubGddLFtmY0xheW91dEFsaWduLnhsXSxcbiAgICBbZmNMYXlvdXRBbGlnbi5sdC1zbV0sIFtmY0xheW91dEFsaWduLmx0LW1kXSwgW2ZjTGF5b3V0QWxpZ24ubHQtbGddLCBbZmNMYXlvdXRBbGlnbi5sdC14bF0sXG4gICAgW2ZjTGF5b3V0QWxpZ24uZ3QteHNdLCBbZmNMYXlvdXRBbGlnbi5ndC1zbV0sIFtmY0xheW91dEFsaWduLmd0LW1kXSwgW2ZjTGF5b3V0QWxpZ24uZ3QtbGddXG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIExheW91dEFsaWduRGlyZWN0aXZlIGV4dGVuZHMgQmFzZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgZmNWYWx1ZXMgPSB7fTtcblxuICBvYnNlcnZlciQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcblxuICBASW5wdXQoJ2ZjTGF5b3V0QWxpZ24nKSAgICAgICBzZXQgYWxpZ24odmFsKSAgICAgeyB0aGlzLmZjVmFsdWVzWydhbGwnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0QWxpZ24ueHMnKSAgICBzZXQgYWxpZ25Ycyh2YWwpICAgeyB0aGlzLmZjVmFsdWVzWyd4cyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRBbGlnbi5zbScpICAgIHNldCBhbGlnblNtKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3NtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dEFsaWduLm1kJykgICAgc2V0IGFsaWduTWQodmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1snbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0QWxpZ24ubGcnKSAgICBzZXQgYWxpZ25MZyh2YWwpICAgeyB0aGlzLmZjVmFsdWVzWydsZyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRBbGlnbi54bCcpICAgIHNldCBhbGlnblhsKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3hsJ10gPSB2YWw7IH1cblxuICBASW5wdXQoJ2ZjTGF5b3V0QWxpZ24uZ3QteHMnKSBzZXQgYWxpZ25HdFhzKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC14cyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRBbGlnbi5ndC1zbScpIHNldCBhbGlnbkd0U20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2d0LXNtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dEFsaWduLmd0LW1kJykgc2V0IGFsaWduR3RNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0QWxpZ24uZ3QtbGcnKSBzZXQgYWxpZ25HdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1sZyddID0gdmFsOyB9XG5cbiAgQElucHV0KCdmY0xheW91dEFsaWduLmx0LXNtJykgc2V0IGFsaWduTHRTbSh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQtc20nXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0QWxpZ24ubHQtbWQnKSBzZXQgYWxpZ25MdE1kKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1tZCddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRBbGlnbi5sdC1sZycpIHNldCBhbGlnbkx0TGcodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LWxnJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dEFsaWduLmx0LXhsJykgc2V0IGFsaWduTHRYbCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQteGwnXSA9IHZhbDsgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEZsZXhDc3NTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHJpdmF0ZSBsYXlvdXQ6IExheW91dERpcmVjdGl2ZSxcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgcmVuZGVyZXIpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kZXBlbmRzT25MYXlvdXQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICByZWxvYWQoKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IFtdO1xuXG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGJyZWFrcG9pbnQgPT4ge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5sYXlvdXRWYWx1ZXMpLmZvckVhY2gobGF5b3V0QnJlYWtwb2ludCA9PiB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChcbiAgICAgICAgICB0aGlzLnNlcnZpY2UuYWRkTGF5b3V0QWxpZ24odGhpcy5sYXlvdXRWYWx1ZXNbbGF5b3V0QnJlYWtwb2ludF0sIGxheW91dEJyZWFrcG9pbnQsIHRoaXMuZmNWYWx1ZXNbYnJlYWtwb2ludF0sIGJyZWFrcG9pbnQpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzKTtcblxuICAgIHRoaXMub2JzZXJ2ZXIkLm5leHQodGhpcy5mY1ZhbHVlcyk7XG4gIH1cblxuICBkZXBlbmRzT25MYXlvdXQoKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dC5hZGROZXdCcmVha3BvaW50cyh0aGlzLmJyZWFrcG9pbnRzLCAncm93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50ID0+IHtcbiAgICAgICAgdGhpcy5hZGRDbGFzc05hbWUodGhpcy5zZXJ2aWNlLmFkZExheW91dCgncm93JywgYnJlYWtwb2ludCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxheW91dFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQgPyB0aGlzLmxheW91dC5mY1ZhbHVlcyA6IHsgJ2FsbCc6ICcnIH07XG4gIH1cblxuICBnZXQgYnJlYWtwb2ludHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmNWYWx1ZXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uSW5pdCwgSW5wdXQsIFJlbmRlcmVyMiwgT3B0aW9uYWwsIFNlbGYsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBGbGV4Q3NzU2VydmljZSB9IGZyb20gJy4vZmxleC1jc3Muc2VydmljZSc7XG5pbXBvcnQgeyBCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTGF5b3V0RGlyZWN0aXZlIH0gZnJvbSAnLi9sYXlvdXQuZGlyZWN0aXZlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBgXG4gICAgW2ZjTGF5b3V0R2FwXSxcbiAgICBbZmNMYXlvdXRHYXAueHNdLCBbZmNMYXlvdXRHYXAuc21dLCBbZmNMYXlvdXRHYXAubWRdLCBbZmNMYXlvdXRHYXAubGddLCBbZmNMYXlvdXRHYXAueGxdLFxuICAgIFtmY0xheW91dEdhcC5sdC1zbV0sIFtmY0xheW91dEdhcC5sdC1tZF0sIFtmY0xheW91dEdhcC5sdC1sZ10sIFtmY0xheW91dEdhcC5sdC14bF0sXG4gICAgW2ZjTGF5b3V0R2FwLmd0LXhzXSwgW2ZjTGF5b3V0R2FwLmd0LXNtXSwgW2ZjTGF5b3V0R2FwLmd0LW1kXSwgW2ZjTGF5b3V0R2FwLmd0LWxnXVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBMYXlvdXRHYXBEaXJlY3RpdmUgZXh0ZW5kcyBCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBmY1ZhbHVlcyA9IHt9O1xuXG4gIG9ic2VydmVyJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuXG4gIEBJbnB1dCgnZmNMYXlvdXRHYXAnKSAgICAgICBzZXQgZ2FwKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydhbGwnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0R2FwLnhzJykgICAgc2V0IGdhcFhzKHZhbCkgeyB0aGlzLmZjVmFsdWVzWyd4cyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRHYXAuc20nKSAgICBzZXQgZ2FwU20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ3NtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dEdhcC5tZCcpICAgIHNldCBnYXBNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0R2FwLmxnJykgICAgc2V0IGdhcExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsZyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRHYXAueGwnKSAgICBzZXQgZ2FwWGwodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ3hsJ10gPSB2YWw7IH1cblxuICBASW5wdXQoJ2ZjTGF5b3V0R2FwLmd0LXhzJykgc2V0IGdhcEd0WHModmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2d0LXhzJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dEdhcC5ndC1zbScpIHNldCBnYXBHdFNtKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1zbSddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRHYXAuZ3QtbWQnKSBzZXQgZ2FwR3RNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0R2FwLmd0LWxnJykgc2V0IGdhcEd0TGcodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2d0LWxnJ10gPSB2YWw7IH1cblxuICBASW5wdXQoJ2ZjTGF5b3V0R2FwLmx0LXNtJykgc2V0IGdhcEx0U20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXNtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0xheW91dEdhcC5sdC1tZCcpIHNldCBnYXBMdE1kKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1tZCddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNMYXlvdXRHYXAubHQtbGcnKSBzZXQgZ2FwTHRMZyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQtbGcnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjTGF5b3V0R2FwLmx0LXhsJykgc2V0IGdhcEx0WGwodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXhsJ10gPSB2YWw7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBGbGV4Q3NzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHByaXZhdGUgbGF5b3V0OiBMYXlvdXREaXJlY3RpdmUsXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIHJlbmRlcmVyKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGVwZW5kc09uTGF5b3V0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbXTtcblxuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50ID0+IHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMubGF5b3V0VmFsdWVzKS5mb3JFYWNoKGxheW91dEJyZWFrcG9pbnQgPT4ge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goXG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLmFkZExheW91dEdhcCh0aGlzLmxheW91dFZhbHVlc1tsYXlvdXRCcmVha3BvaW50XSwgbGF5b3V0QnJlYWtwb2ludCwgdGhpcy5mY1ZhbHVlc1ticmVha3BvaW50XSwgYnJlYWtwb2ludClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRDbGFzc05hbWVzKGNsYXNzTmFtZXMpO1xuXG4gICAgdGhpcy5vYnNlcnZlciQubmV4dCh0aGlzLmZjVmFsdWVzKTtcbiAgfVxuXG4gIGRlcGVuZHNPbkxheW91dCgpIHtcbiAgICBpZiAodGhpcy5sYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0LmFkZE5ld0JyZWFrcG9pbnRzKHRoaXMuYnJlYWtwb2ludHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJyZWFrcG9pbnRzLmZvckVhY2goYnJlYWtwb2ludCA9PiB7XG4gICAgICAgIHRoaXMuYWRkQ2xhc3NOYW1lKHRoaXMuc2VydmljZS5hZGRMYXlvdXQoJ3JvdycsIGJyZWFrcG9pbnQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXlvdXRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0ID8gdGhpcy5sYXlvdXQuZmNWYWx1ZXMgOiB7ICdhbGwnOiAnJyB9O1xuICB9XG5cbiAgZ2V0IGJyZWFrcG9pbnRzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZjVmFsdWVzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIElucHV0LCBSZW5kZXJlcjIsIE9wdGlvbmFsLCBIb3N0LCBPbkNoYW5nZXMsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZsZXhDc3NTZXJ2aWNlIH0gZnJvbSAnLi9mbGV4LWNzcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlvdXREaXJlY3RpdmUgfSBmcm9tICcuL2xheW91dC5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBcbiAgICBbZmNGbGV4XSxcbiAgICBbZmNGbGV4LnhzXSwgW2ZjRmxleC5zbV0sIFtmY0ZsZXgubWRdLCBbZmNGbGV4LmxnXSwgW2ZjRmxleC54bF0sXG4gICAgW2ZjRmxleC5sdC1zbV0sIFtmY0ZsZXgubHQtbWRdLCBbZmNGbGV4Lmx0LWxnXSwgW2ZjRmxleC5sdC14bF0sXG4gICAgW2ZjRmxleC5ndC14c10sIFtmY0ZsZXguZ3Qtc21dLCBbZmNGbGV4Lmd0LW1kXSwgW2ZjRmxleC5ndC1sZ10sXG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEZsZXhEaXJlY3RpdmUgZXh0ZW5kcyBCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBmY1ZhbHVlcyA9IHt9O1xuXG4gIG9ic2VydmVyJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuXG4gIHByaXZhdGUgbGF5b3V0OiBMYXlvdXREaXJlY3RpdmU7XG5cbiAgQElucHV0KCkgZmNTaHJpbmsgPSAxO1xuICBASW5wdXQoKSBmY0dyb3cgPSAxO1xuXG4gIEBJbnB1dCgnZmNGbGV4JykgICAgICAgc2V0IGZsZXgodmFsKSAgICAgeyB0aGlzLmZjVmFsdWVzWydhbGwnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleC54cycpICAgIHNldCBmbGV4WHModmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1sneHMnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleC5zbScpICAgIHNldCBmbGV4U20odmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1snc20nXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleC5tZCcpICAgIHNldCBmbGV4TWQodmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1snbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleC5sZycpICAgIHNldCBmbGV4TGcodmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1snbGcnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleC54bCcpICAgIHNldCBmbGV4WGwodmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1sneGwnXSA9IHZhbDsgfVxuXG4gIEBJbnB1dCgnZmNGbGV4Lmd0LXhzJykgc2V0IGZsZXhHdFhzKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC14cyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4Lmd0LXNtJykgc2V0IGZsZXhHdFNtKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1zbSddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4Lmd0LW1kJykgc2V0IGZsZXhHdE1kKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1tZCddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4Lmd0LWxnJykgc2V0IGZsZXhHdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1sZyddID0gdmFsOyB9XG5cbiAgQElucHV0KCdmY0ZsZXgubHQtc20nKSBzZXQgZmxleEx0U20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXNtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXgubHQtbWQnKSBzZXQgZmxleEx0TWQodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LW1kJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXgubHQtbGcnKSBzZXQgZmxleEx0TGcodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LWxnJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXgubHQteGwnKSBzZXQgZmxleEx0WGwodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXhsJ10gPSB2YWw7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBGbGV4Q3NzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASG9zdCgpIEBTa2lwU2VsZigpIGxheW91dDogTGF5b3V0RGlyZWN0aXZlLFxuICApIHtcbiAgICBzdXBlcihlbGVtZW50UmVmLCByZW5kZXJlcik7XG5cbiAgICBpZiAobGF5b3V0ICYmIGxheW91dC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgPT09IHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kZXBlbmRzT25QYXJlbnRMYXlvdXQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICByZWxvYWQoKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IFtdO1xuXG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGJyZWFrcG9pbnQgPT4ge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5sYXlvdXRWYWx1ZXMpLmZvckVhY2gobGF5b3V0QnJlYWtwb2ludCA9PiB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChcbiAgICAgICAgICB0aGlzLnNlcnZpY2UuYWRkRmxleChcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmFsdWVzW2xheW91dEJyZWFrcG9pbnRdLCBsYXlvdXRCcmVha3BvaW50LCB0aGlzLmZjVmFsdWVzW2JyZWFrcG9pbnRdLCBicmVha3BvaW50LCB0aGlzLmZjR3JvdywgdGhpcy5mY1Nocmlua1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRDbGFzc05hbWVzKGNsYXNzTmFtZXMpO1xuXG4gICAgdGhpcy5vYnNlcnZlciQubmV4dCh0aGlzLmZjVmFsdWVzKTtcbiAgfVxuXG4gIGRlcGVuZHNPblBhcmVudExheW91dCgpIHtcbiAgICBpZiAodGhpcy5sYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0LmFkZE5ld0JyZWFrcG9pbnRzKHRoaXMuYnJlYWtwb2ludHMsICdyb3cnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGJyZWFrcG9pbnQgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMucGFyZW50RWxlbWVudCwgdGhpcy5zZXJ2aWNlLmFkZExheW91dCgncm93JywgYnJlYWtwb2ludCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxheW91dFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQgPyB0aGlzLmxheW91dC5mY1ZhbHVlcyA6IHsgJ2FsbCc6ICcnIH07XG4gIH1cblxuICBnZXQgcGFyZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJlbnROb2RlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGdldCBicmVha3BvaW50cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5mY1ZhbHVlcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT25Jbml0LCBJbnB1dCwgUmVuZGVyZXIyLCBPcHRpb25hbCwgSG9zdCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZsZXhDc3NTZXJ2aWNlIH0gZnJvbSAnLi9mbGV4LWNzcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlvdXREaXJlY3RpdmUgfSBmcm9tICcuL2xheW91dC5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBcbiAgICBbZmNGbGV4QWxpZ25dLFxuICAgIFtmY0ZsZXhBbGlnbi54c10sIFtmY0ZsZXhBbGlnbi5zbV0sIFtmY0ZsZXhBbGlnbi5tZF0sIFtmY0ZsZXhBbGlnbi5sZ10sIFtmY0ZsZXhBbGlnbi54bF0sXG4gICAgW2ZjRmxleEFsaWduLmx0LXNtXSwgW2ZjRmxleEFsaWduLmx0LW1kXSwgW2ZjRmxleEFsaWduLmx0LWxnXSwgW2ZjRmxleEFsaWduLmx0LXhsXSxcbiAgICBbZmNGbGV4QWxpZ24uZ3QteHNdLCBbZmNGbGV4QWxpZ24uZ3Qtc21dLCBbZmNGbGV4QWxpZ24uZ3QtbWRdLCBbZmNGbGV4QWxpZ24uZ3QtbGddXG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEZsZXhBbGlnbkRpcmVjdGl2ZSBleHRlbmRzIEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIGZjVmFsdWVzID0ge307XG5cbiAgb2JzZXJ2ZXIkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dERpcmVjdGl2ZTtcblxuICBASW5wdXQoJ2ZjRmxleEFsaWduJykgICAgICAgc2V0IGFsaWduKHZhbCkgICAgIHsgdGhpcy5mY1ZhbHVlc1snYWxsJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhBbGlnbi54cycpICAgIHNldCBhbGlnblhzKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3hzJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhBbGlnbi5zbScpICAgIHNldCBhbGlnblNtKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3NtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhBbGlnbi5tZCcpICAgIHNldCBhbGlnbk1kKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ21kJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhBbGlnbi5sZycpICAgIHNldCBhbGlnbkxnKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ2xnJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhBbGlnbi54bCcpICAgIHNldCBhbGlnblhsKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3hsJ10gPSB2YWw7IH1cblxuICBASW5wdXQoJ2ZjRmxleEFsaWduLmd0LXhzJykgc2V0IGFsaWduR3RYcyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QteHMnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleEFsaWduLmd0LXNtJykgc2V0IGFsaWduR3RTbSh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3Qtc20nXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleEFsaWduLmd0LW1kJykgc2V0IGFsaWduR3RNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleEFsaWduLmd0LWxnJykgc2V0IGFsaWduR3RMZyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbGcnXSA9IHZhbDsgfVxuXG4gIEBJbnB1dCgnZmNGbGV4QWxpZ24ubHQtc20nKSBzZXQgYWxpZ25MdFNtKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1zbSddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4QWxpZ24ubHQtbWQnKSBzZXQgYWxpZ25MdE1kKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1tZCddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4QWxpZ24ubHQtbGcnKSBzZXQgYWxpZ25MdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1sZyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4QWxpZ24ubHQteGwnKSBzZXQgYWxpZ25MdFhsKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC14bCddID0gdmFsOyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgc2VydmljZTogRmxleENzc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBsYXlvdXQ6IExheW91dERpcmVjdGl2ZSxcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgcmVuZGVyZXIpO1xuXG4gICAgaWYgKGxheW91dCAmJiBsYXlvdXQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ID09PSB0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGVwZW5kc09uUGFyZW50TGF5b3V0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbXTtcblxuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50ID0+IHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaChcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFkZEZsZXhBbGlnbih0aGlzLmZjVmFsdWVzW2JyZWFrcG9pbnRdLCBicmVha3BvaW50KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzKTtcblxuICAgIHRoaXMub2JzZXJ2ZXIkLm5leHQodGhpcy5mY1ZhbHVlcyk7XG4gIH1cblxuICBkZXBlbmRzT25QYXJlbnRMYXlvdXQoKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dC5hZGROZXdCcmVha3BvaW50cyh0aGlzLmJyZWFrcG9pbnRzLCAncm93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50ID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnBhcmVudEVsZW1lbnQsIHRoaXMuc2VydmljZS5hZGRMYXlvdXQoJ3JvdycsIGJyZWFrcG9pbnQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXJlbnRFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0IGJyZWFrcG9pbnRzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZjVmFsdWVzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIElucHV0LCBSZW5kZXJlcjIsIE9wdGlvbmFsLCBIb3N0LCBPbkNoYW5nZXMsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZsZXhDc3NTZXJ2aWNlIH0gZnJvbSAnLi9mbGV4LWNzcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlvdXREaXJlY3RpdmUgfSBmcm9tICcuL2xheW91dC5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBcbiAgICBbZmNGbGV4T3JkZXJdLFxuICAgIFtmY0ZsZXhPcmRlci54c10sIFtmY0ZsZXhPcmRlci5zbV0sIFtmY0ZsZXhPcmRlci5tZF0sIFtmY0ZsZXhPcmRlci5sZ10sIFtmY0ZsZXhPcmRlci54bF0sXG4gICAgW2ZjRmxleE9yZGVyLmx0LXNtXSwgW2ZjRmxleE9yZGVyLmx0LW1kXSwgW2ZjRmxleE9yZGVyLmx0LWxnXSwgW2ZjRmxleE9yZGVyLmx0LXhsXSxcbiAgICBbZmNGbGV4T3JkZXIuZ3QteHNdLCBbZmNGbGV4T3JkZXIuZ3Qtc21dLCBbZmNGbGV4T3JkZXIuZ3QtbWRdLCBbZmNGbGV4T3JkZXIuZ3QtbGddXG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEZsZXhPcmRlckRpcmVjdGl2ZSBleHRlbmRzIEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIGZjVmFsdWVzID0ge307XG5cbiAgb2JzZXJ2ZXIkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dERpcmVjdGl2ZTtcblxuICBASW5wdXQoJ2ZjRmxleE9yZGVyJykgICAgICAgc2V0IG9yZGVyKHZhbCkgICAgIHsgdGhpcy5mY1ZhbHVlc1snYWxsJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPcmRlci54cycpICAgIHNldCBvcmRlclhzKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3hzJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPcmRlci5zbScpICAgIHNldCBvcmRlclNtKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3NtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPcmRlci5tZCcpICAgIHNldCBvcmRlck1kKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ21kJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPcmRlci5sZycpICAgIHNldCBvcmRlckxnKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ2xnJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPcmRlci54bCcpICAgIHNldCBvcmRlclhsKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3hsJ10gPSB2YWw7IH1cblxuICBASW5wdXQoJ2ZjRmxleE9yZGVyLmd0LXhzJykgc2V0IG9yZGVyR3RYcyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QteHMnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleE9yZGVyLmd0LXNtJykgc2V0IG9yZGVyR3RTbSh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3Qtc20nXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleE9yZGVyLmd0LW1kJykgc2V0IG9yZGVyR3RNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleE9yZGVyLmd0LWxnJykgc2V0IG9yZGVyR3RMZyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbGcnXSA9IHZhbDsgfVxuXG4gIEBJbnB1dCgnZmNGbGV4T3JkZXIubHQtc20nKSBzZXQgb3JkZXJMdFNtKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1zbSddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4T3JkZXIubHQtbWQnKSBzZXQgb3JkZXJMdE1kKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1tZCddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4T3JkZXIubHQtbGcnKSBzZXQgb3JkZXJMdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1sZyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4T3JkZXIubHQteGwnKSBzZXQgb3JkZXJMdFhsKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC14bCddID0gdmFsOyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgc2VydmljZTogRmxleENzc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBAU2tpcFNlbGYoKSBsYXlvdXQ6IExheW91dERpcmVjdGl2ZSxcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgcmVuZGVyZXIpO1xuXG4gICAgaWYgKGxheW91dCAmJiBsYXlvdXQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ID09PSB0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGVwZW5kc09uUGFyZW50TGF5b3V0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbXTtcblxuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50ID0+IHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaChcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFkZEZsZXhPcmRlcih0aGlzLmZjVmFsdWVzW2JyZWFrcG9pbnRdLCBicmVha3BvaW50KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzKTtcblxuICAgIHRoaXMub2JzZXJ2ZXIkLm5leHQodGhpcy5mY1ZhbHVlcyk7XG4gIH1cblxuICBkZXBlbmRzT25QYXJlbnRMYXlvdXQoKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dC5hZGROZXdCcmVha3BvaW50cyh0aGlzLmJyZWFrcG9pbnRzLCAncm93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50ID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnBhcmVudEVsZW1lbnQsIHRoaXMuc2VydmljZS5hZGRMYXlvdXQoJ3JvdycsIGJyZWFrcG9pbnQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXJlbnRFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0IGJyZWFrcG9pbnRzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZjVmFsdWVzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIElucHV0LCBSZW5kZXJlcjIsIE9wdGlvbmFsLCBIb3N0LCBPbkNoYW5nZXMsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZsZXhDc3NTZXJ2aWNlIH0gZnJvbSAnLi9mbGV4LWNzcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlvdXREaXJlY3RpdmUgfSBmcm9tICcuL2xheW91dC5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBcbiAgICBbZmNGbGV4T2Zmc2V0XSxcbiAgICBbZmNGbGV4T2Zmc2V0LnhzXSwgW2ZjRmxleE9mZnNldC5zbV0sIFtmY0ZsZXhPZmZzZXQubWRdLCBbZmNGbGV4T2Zmc2V0LmxnXSwgW2ZjRmxleE9mZnNldC54bF0sXG4gICAgW2ZjRmxleE9mZnNldC5sdC1zbV0sIFtmY0ZsZXhPZmZzZXQubHQtbWRdLCBbZmNGbGV4T2Zmc2V0Lmx0LWxnXSwgW2ZjRmxleE9mZnNldC5sdC14bF0sXG4gICAgW2ZjRmxleE9mZnNldC5ndC14c10sIFtmY0ZsZXhPZmZzZXQuZ3Qtc21dLCBbZmNGbGV4T2Zmc2V0Lmd0LW1kXSwgW2ZjRmxleE9mZnNldC5ndC1sZ11cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgRmxleE9mZnNldERpcmVjdGl2ZSBleHRlbmRzIEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIGZjVmFsdWVzID0ge307XG5cbiAgb2JzZXJ2ZXIkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dERpcmVjdGl2ZTtcblxuICBASW5wdXQoJ2ZjRmxleE9mZnNldCcpICAgICAgIHNldCBvZmZzZXQodmFsKSAgICAgeyB0aGlzLmZjVmFsdWVzWydhbGwnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleE9mZnNldC54cycpICAgIHNldCBvZmZzZXRYcyh2YWwpICAgeyB0aGlzLmZjVmFsdWVzWyd4cyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4T2Zmc2V0LnNtJykgICAgc2V0IG9mZnNldFNtKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3NtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPZmZzZXQubWQnKSAgICBzZXQgb2Zmc2V0TWQodmFsKSAgIHsgdGhpcy5mY1ZhbHVlc1snbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleE9mZnNldC5sZycpICAgIHNldCBvZmZzZXRMZyh2YWwpICAgeyB0aGlzLmZjVmFsdWVzWydsZyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4T2Zmc2V0LnhsJykgICAgc2V0IG9mZnNldFhsKHZhbCkgICB7IHRoaXMuZmNWYWx1ZXNbJ3hsJ10gPSB2YWw7IH1cblxuICBASW5wdXQoJ2ZjRmxleE9mZnNldC5ndC14cycpIHNldCBvZmZzZXRHdFhzKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC14cyddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4T2Zmc2V0Lmd0LXNtJykgc2V0IG9mZnNldEd0U20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2d0LXNtJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPZmZzZXQuZ3QtbWQnKSBzZXQgb2Zmc2V0R3RNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbWQnXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleE9mZnNldC5ndC1sZycpIHNldCBvZmZzZXRHdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1sZyddID0gdmFsOyB9XG5cbiAgQElucHV0KCdmY0ZsZXhPZmZzZXQubHQtc20nKSBzZXQgb2Zmc2V0THRTbSh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQtc20nXSA9IHZhbDsgfVxuICBASW5wdXQoJ2ZjRmxleE9mZnNldC5sdC1tZCcpIHNldCBvZmZzZXRMdE1kKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1tZCddID0gdmFsOyB9XG4gIEBJbnB1dCgnZmNGbGV4T2Zmc2V0Lmx0LWxnJykgc2V0IG9mZnNldEx0TGcodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LWxnJ10gPSB2YWw7IH1cbiAgQElucHV0KCdmY0ZsZXhPZmZzZXQubHQteGwnKSBzZXQgb2Zmc2V0THRYbCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQteGwnXSA9IHZhbDsgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEZsZXhDc3NTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgQFNraXBTZWxmKCkgbGF5b3V0OiBMYXlvdXREaXJlY3RpdmUsXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIHJlbmRlcmVyKTtcblxuICAgIGlmIChsYXlvdXQgJiYgbGF5b3V0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCA9PT0gdGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRlcGVuZHNPblBhcmVudExheW91dCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gW107XG5cbiAgICB0aGlzLmJyZWFrcG9pbnRzLmZvckVhY2goYnJlYWtwb2ludCA9PiB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmxheW91dFZhbHVlcykuZm9yRWFjaChsYXlvdXRCcmVha3BvaW50ID0+IHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKFxuICAgICAgICAgIHRoaXMuc2VydmljZS5hZGRGbGV4T2Zmc2V0KHRoaXMubGF5b3V0VmFsdWVzW2xheW91dEJyZWFrcG9pbnRdLCBsYXlvdXRCcmVha3BvaW50LCB0aGlzLmZjVmFsdWVzW2JyZWFrcG9pbnRdLCBicmVha3BvaW50KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldENsYXNzTmFtZXMoY2xhc3NOYW1lcyk7XG5cbiAgICB0aGlzLm9ic2VydmVyJC5uZXh0KHRoaXMuZmNWYWx1ZXMpO1xuICB9XG5cbiAgZGVwZW5kc09uUGFyZW50TGF5b3V0KCkge1xuICAgIGlmICh0aGlzLmxheW91dCkge1xuICAgICAgdGhpcy5sYXlvdXQuYWRkTmV3QnJlYWtwb2ludHModGhpcy5icmVha3BvaW50cywgJ3JvdycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJyZWFrcG9pbnRzLmZvckVhY2goYnJlYWtwb2ludCA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wYXJlbnRFbGVtZW50LCB0aGlzLnNlcnZpY2UuYWRkTGF5b3V0KCdyb3cnLCBicmVha3BvaW50KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFyZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJlbnROb2RlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGdldCBsYXlvdXRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0ID8gdGhpcy5sYXlvdXQuZmNWYWx1ZXMgOiB7ICdhbGwnOiAnJyB9O1xuICB9XG5cbiAgZ2V0IGJyZWFrcG9pbnRzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZjVmFsdWVzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIFJlbmRlcmVyMiwgT3B0aW9uYWwsIEhvc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRmxleENzc1NlcnZpY2UgfSBmcm9tICcuL2ZsZXgtY3NzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlJztcbmltcG9ydCB7IExheW91dERpcmVjdGl2ZSB9IGZyb20gJy4vbGF5b3V0LmRpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogYFxuICAgIFtmY0ZpbGxdLFxuICAgIFtmY0ZsZXhGaWxsXVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBGbGV4RmlsbERpcmVjdGl2ZSBleHRlbmRzIEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGxheW91dDogTGF5b3V0RGlyZWN0aXZlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEZsZXhDc3NTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgbGF5b3V0OiBMYXlvdXREaXJlY3RpdmUsXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIHJlbmRlcmVyKTtcblxuICAgIGlmIChsYXlvdXQgJiYgbGF5b3V0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCA9PT0gdGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRlcGVuZHNPblBhcmVudExheW91dCgpO1xuXG4gICAgdGhpcy5zZXJ2aWNlLmFkZEZsZXhGaWxsKCk7XG4gIH1cblxuICBkZXBlbmRzT25QYXJlbnRMYXlvdXQoKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dC5hZGROZXdCcmVha3BvaW50cyhbJ2FsbCddLCAncm93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wYXJlbnRFbGVtZW50LCB0aGlzLnNlcnZpY2UuYWRkTGF5b3V0KCdyb3cnLCAnYWxsJykpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXJlbnRFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBSZW5kZXJlcjIsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIFNlbGYsIEluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRmxleENzc1NlcnZpY2UgfSBmcm9tICcuL2ZsZXgtY3NzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlJztcbmltcG9ydCB7IExheW91dERpcmVjdGl2ZSB9IGZyb20gJy4vbGF5b3V0LmRpcmVjdGl2ZSc7XG5cbmNvbnN0IFRSVUxZID0gWyd0cnVlJywgdHJ1ZSwgMV07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RydWVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gJycgfHwgVFJVTFkuaW5kZXhPZih2YWx1ZSkgPj0gMDtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBgXG4gIFtmY1Nob3ddLFxuICBbZmNTaG93LnhzXSwgW2ZjU2hvdy5zbV0sIFtmY1Nob3cubWRdLCBbZmNTaG93LmxnXSwgW2ZjU2hvdy54bF0sXG4gIFtmY1Nob3cubHQtc21dLCBbZmNTaG93Lmx0LW1kXSwgW2ZjU2hvdy5sdC1sZ10sIFtmY1Nob3cubHQteGxdLFxuICBbZmNTaG93Lmd0LXhzXSwgW2ZjU2hvdy5ndC1zbV0sIFtmY1Nob3cuZ3QtbWRdLCBbZmNTaG93Lmd0LWxnXSxcbiAgW2ZjSGlkZV0sXG4gIFtmY0hpZGUueHNdLCBbZmNIaWRlLnNtXSwgW2ZjSGlkZS5tZF0sIFtmY0hpZGUubGddLCBbZmNIaWRlLnhsXSxcbiAgW2ZjSGlkZS5sdC1zbV0sIFtmY0hpZGUubHQtbWRdLCBbZmNIaWRlLmx0LWxnXSwgW2ZjSGlkZS5sdC14bF0sXG4gIFtmY0hpZGUuZ3QteHNdLCBbZmNIaWRlLmd0LXNtXSwgW2ZjSGlkZS5ndC1tZF0sIFtmY0hpZGUuZ3QtbGddXG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFNob3dIaWRlRGlyZWN0aXZlIGV4dGVuZHMgQmFzZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHJlYWRvbmx5IGZjVmFsdWVzID0ge307XG5cbiAgcmVhZG9ubHkgb2JzZXJ2ZXIkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgQElucHV0KCkgZmNEaXNwbGF5RGVmYXVsdDtcblxuICBASW5wdXQoJ2ZjU2hvdycpICAgICAgIHNldCBzaG93KHZhbCkgIHsgdGhpcy5mY1ZhbHVlc1snYWxsJ10gPSBpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNTaG93LnhzJykgICAgc2V0IHNob3dYcyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1sneHMnXSA9IGlzVHJ1ZVZhbHVlKHZhbCk7IH1cbiAgQElucHV0KCdmY1Nob3cuc20nKSAgICBzZXQgc2hvd1NtKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydzbSddID0gaXNUcnVlVmFsdWUodmFsKTsgfVxuICBASW5wdXQoJ2ZjU2hvdy5tZCcpICAgIHNldCBzaG93TWQodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ21kJ10gPSBpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNTaG93LmxnJykgICAgc2V0IHNob3dMZyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbGcnXSA9IGlzVHJ1ZVZhbHVlKHZhbCk7IH1cbiAgQElucHV0KCdmY1Nob3cueGwnKSAgICBzZXQgc2hvd1hsKHZhbCkgeyB0aGlzLmZjVmFsdWVzWyd4bCddID0gaXNUcnVlVmFsdWUodmFsKTsgfVxuXG4gIEBJbnB1dCgnZmNTaG93Lmx0LXNtJykgc2V0IHNob3dMdFNtKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1zbSddID0gaXNUcnVlVmFsdWUodmFsKTsgfVxuICBASW5wdXQoJ2ZjU2hvdy5sdC1tZCcpIHNldCBzaG93THRNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQtbWQnXSA9IGlzVHJ1ZVZhbHVlKHZhbCk7IH1cbiAgQElucHV0KCdmY1Nob3cubHQtbGcnKSBzZXQgc2hvd0x0TGcodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LWxnJ10gPSBpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNTaG93Lmx0LXhsJykgc2V0IHNob3dMdFhsKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC14bCddID0gaXNUcnVlVmFsdWUodmFsKTsgfVxuXG4gIEBJbnB1dCgnZmNTaG93Lmd0LXhzJykgc2V0IHNob3dHdFhzKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC14cyddID0gaXNUcnVlVmFsdWUodmFsKTsgfVxuICBASW5wdXQoJ2ZjU2hvdy5ndC1zbScpIHNldCBzaG93R3RTbSh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3Qtc20nXSA9IGlzVHJ1ZVZhbHVlKHZhbCk7IH1cbiAgQElucHV0KCdmY1Nob3cuZ3QtbWQnKSBzZXQgc2hvd0d0TWQodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2d0LW1kJ10gPSBpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNTaG93Lmd0LWxnJykgc2V0IHNob3dHdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1sZyddID0gaXNUcnVlVmFsdWUodmFsKTsgfVxuXG4gIEBJbnB1dCgnZmNIaWRlJykgICAgICAgc2V0IGhpZGUodmFsKSAgeyB0aGlzLmZjVmFsdWVzWydhbGwnXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNIaWRlLnhzJykgICAgc2V0IGhpZGVYcyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1sneHMnXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNIaWRlLnNtJykgICAgc2V0IGhpZGVTbSh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snc20nXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNIaWRlLm1kJykgICAgc2V0IGhpZGVNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbWQnXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNIaWRlLmxnJykgICAgc2V0IGhpZGVMZyh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbGcnXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNIaWRlLnhsJykgICAgc2V0IGhpZGVYbCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1sneGwnXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG5cbiAgQElucHV0KCdmY0hpZGUubHQtc20nKSBzZXQgaGlkZUx0U20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXNtJ10gPSAhaXNUcnVlVmFsdWUodmFsKTsgfVxuICBASW5wdXQoJ2ZjSGlkZS5sdC1tZCcpIHNldCBoaWRlTHRNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snbHQtbWQnXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNIaWRlLmx0LWxnJykgc2V0IGhpZGVMdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydsdC1sZyddID0gIWlzVHJ1ZVZhbHVlKHZhbCk7IH1cbiAgQElucHV0KCdmY0hpZGUubHQteGwnKSBzZXQgaGlkZUx0WGwodmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2x0LXhsJ10gPSAhaXNUcnVlVmFsdWUodmFsKTsgfVxuXG4gIEBJbnB1dCgnZmNIaWRlLmd0LXhzJykgc2V0IGhpZGVHdFhzKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC14cyddID0gIWlzVHJ1ZVZhbHVlKHZhbCk7IH1cbiAgQElucHV0KCdmY0hpZGUuZ3Qtc20nKSBzZXQgaGlkZUd0U20odmFsKSB7IHRoaXMuZmNWYWx1ZXNbJ2d0LXNtJ10gPSAhaXNUcnVlVmFsdWUodmFsKTsgfVxuICBASW5wdXQoJ2ZjSGlkZS5ndC1tZCcpIHNldCBoaWRlR3RNZCh2YWwpIHsgdGhpcy5mY1ZhbHVlc1snZ3QtbWQnXSA9ICFpc1RydWVWYWx1ZSh2YWwpOyB9XG4gIEBJbnB1dCgnZmNIaWRlLmd0LWxnJykgc2V0IGhpZGVHdExnKHZhbCkgeyB0aGlzLmZjVmFsdWVzWydndC1sZyddID0gIWlzVHJ1ZVZhbHVlKHZhbCk7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBGbGV4Q3NzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHByaXZhdGUgbGF5b3V0OiBMYXlvdXREaXJlY3RpdmUsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJvdGVjdGVkIHBsYXRmb3JtSWQ6IE9iamVjdFxuICApIHtcbiAgICBzdXBlcihlbGVtZW50UmVmLCByZW5kZXJlcik7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbXTtcblxuICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLmdldERpc3BsYXlTdHlsZSgpO1xuXG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGJyZWFrcG9pbnQgPT4ge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKHRoaXMuc2VydmljZS5hZGRTaG93SGlkZShkaXNwbGF5LCB0aGlzLmZjVmFsdWVzW2JyZWFrcG9pbnRdLCBicmVha3BvaW50KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldENsYXNzTmFtZXMoY2xhc3NOYW1lcyk7XG5cbiAgICB0aGlzLm9ic2VydmVyJC5uZXh0KHRoaXMuZmNWYWx1ZXMpO1xuICB9XG5cbiAgZ2V0RGlzcGxheVN0eWxlKCkge1xuICAgIHJldHVybiB0aGlzLmxheW91dCA/ICdmbGV4JyA6IChcbiAgICAgIHRoaXMuZ2V0RWxlbWVudFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScpXG4gICAgICB8fCB0aGlzLmZjRGlzcGxheURlZmF1bHRcbiAgICAgIHx8ICdibG9jaydcbiAgICApO1xuICB9XG5cbiAgZ2V0RWxlbWVudFN0eWxlKGVsZW1lbnQsIHN0eWxlTmFtZSkge1xuICAgIHJldHVybiAoZWxlbWVudCA/IGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSB8fCBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVOYW1lKSA6ICcnKVxuICAgICAgfHwgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgPyBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoc3R5bGVOYW1lKSA6ICcnKTtcbiAgfVxuXG4gIGdldCBicmVha3BvaW50cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5mY1ZhbHVlcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZsZXhDc3NTZXJ2aWNlLCBGTEVYX0NTU19CUkVBS1BPSU5UUywgRkxFWF9DU1NfREVGQVVMVF9CUkVBS1BPSU5UUywgQnJlYWtwb2ludCB9IGZyb20gJy4vZmxleC1jc3Muc2VydmljZSc7XG5cbmltcG9ydCB7IExheW91dERpcmVjdGl2ZSB9IGZyb20gJy4vbGF5b3V0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlvdXRBbGlnbkRpcmVjdGl2ZSB9IGZyb20gJy4vbGF5b3V0LWFsaWduLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlvdXRHYXBEaXJlY3RpdmUgfSBmcm9tICcuL2xheW91dC1nYXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZsZXhEaXJlY3RpdmUgfSBmcm9tICcuL2ZsZXguZGlyZWN0aXZlJztcbmltcG9ydCB7IEZsZXhPcmRlckRpcmVjdGl2ZSB9IGZyb20gJy4vZmxleC1vcmRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmxleE9mZnNldERpcmVjdGl2ZSB9IGZyb20gJy4vZmxleC1vZmZzZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZsZXhBbGlnbkRpcmVjdGl2ZSB9IGZyb20gJy4vZmxleC1hbGlnbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmxleEZpbGxEaXJlY3RpdmUgfSBmcm9tICcuL2ZsZXgtZmlsbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2hvd0hpZGVEaXJlY3RpdmUgfSBmcm9tICcuL3Nob3ctaGlkZS5kaXJlY3RpdmUnO1xuXG5leHBvcnQgdHlwZSBCcmVha3BvaW50c0ZuID0gKGRlZmF1bHRCcmVha3BvaW50czogQnJlYWtwb2ludFtdKSA9PiBCcmVha3BvaW50W107XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21pemVCcmVha1BvaW50cyhicmVha3BvaW50czogQnJlYWtwb2ludFtdfEJyZWFrcG9pbnRzRm4pIHtcbiAgaWYgKHR5cGVvZiBicmVha3BvaW50cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGJyZWFrcG9pbnRzID0gYnJlYWtwb2ludHMoRkxFWF9DU1NfREVGQVVMVF9CUkVBS1BPSU5UUyk7XG4gIH1cblxuICByZXR1cm4gYnJlYWtwb2ludHMgfHwgRkxFWF9DU1NfREVGQVVMVF9CUkVBS1BPSU5UUztcbn1cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgTGF5b3V0RGlyZWN0aXZlLFxuICAgIExheW91dEFsaWduRGlyZWN0aXZlLFxuICAgIExheW91dEdhcERpcmVjdGl2ZSxcblxuICAgIEZsZXhEaXJlY3RpdmUsXG4gICAgRmxleE9yZGVyRGlyZWN0aXZlLFxuICAgIEZsZXhPZmZzZXREaXJlY3RpdmUsXG4gICAgRmxleEFsaWduRGlyZWN0aXZlLFxuXG4gICAgRmxleEZpbGxEaXJlY3RpdmUsXG4gICAgU2hvd0hpZGVEaXJlY3RpdmUsXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBMYXlvdXREaXJlY3RpdmUsXG4gICAgTGF5b3V0QWxpZ25EaXJlY3RpdmUsXG4gICAgTGF5b3V0R2FwRGlyZWN0aXZlLFxuXG4gICAgRmxleERpcmVjdGl2ZSxcbiAgICBGbGV4T3JkZXJEaXJlY3RpdmUsXG4gICAgRmxleE9mZnNldERpcmVjdGl2ZSxcbiAgICBGbGV4QWxpZ25EaXJlY3RpdmUsXG5cbiAgICBGbGV4RmlsbERpcmVjdGl2ZSxcbiAgICBTaG93SGlkZURpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRmxleENzc01vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KGJyZWFrcG9pbnRzPzogQnJlYWtwb2ludFtdfEJyZWFrcG9pbnRzRm4pOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IEZsZXhDc3NNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRmxleENzc1NlcnZpY2UsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiAnZmxleF9jc3NfbW9kdWxlX2JyZWFrcG9pbnRzJyxcbiAgICAgICAgICB1c2VWYWx1ZTogYnJlYWtwb2ludHMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBGTEVYX0NTU19CUkVBS1BPSU5UUyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiBjdXN0b21pemVCcmVha1BvaW50cyxcbiAgICAgICAgICBkZXBzOiBbJ2ZsZXhfY3NzX21vZHVsZV9icmVha3BvaW50cyddXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJ0c2xpYl8xLl9fZXh0ZW5kcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLDBCQUFpQyxNQUFNO0lBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztRQUM3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QzVFLHNCQUE4QixxQ0FBUTs7Ozs7UUFBdEMsVUFBdUMsR0FBRyxJQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzVFLHNCQUE4QixxQ0FBUTs7Ozs7UUFBdEMsVUFBdUMsR0FBRyxJQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzVFLHNCQUE4QixxQ0FBUTs7Ozs7UUFBdEMsVUFBdUMsR0FBRyxJQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBRTVFLHNCQUE4Qix1Q0FBVTs7Ozs7UUFBeEMsVUFBeUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQy9FLHNCQUE4Qix1Q0FBVTs7Ozs7UUFBeEMsVUFBeUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQy9FLHNCQUE4Qix1Q0FBVTs7Ozs7UUFBeEMsVUFBeUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQy9FLHNCQUE4Qix1Q0FBVTs7Ozs7UUFBeEMsVUFBeUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBRS9FLHNCQUE4Qix1Q0FBVTs7Ozs7UUFBeEMsVUFBeUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQy9FLHNCQUE4Qix1Q0FBVTs7Ozs7UUFBeEMsVUFBeUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxD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QUU7OztPQUFBO0lBQy9FLHNCQUFrQyx5Q0FBTzs7Ozs7UUFBekMsVUFBMEMsR0FBRyxJQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQy9FLHNCQUFrQyx5Q0FBTzs7Ozs7UUFBekMsVUFBMEMsR0FBRyxJQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQy9FLHNCQUFrQyx5Q0FBTzs7Ozs7UUFBekMsVUFBMEMsR0FBRyxJQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQy9FLHNCQUFrQyx5Q0FBTzs7Ozs7UUFBekMsVUFBMEMsR0FBRyxJQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBRS9FLHNCQUFrQywyQ0FBUzs7Ozs7UUFBM0MsVUFBNEMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQ2xGLHNCQUFrQywyQ0FBUzs7Ozs7UUFBM0MsVUFBNEMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQ2xGLHNCQUFrQywyQ0FBUzs7Ozs7UUFBM0MsVUFBNEMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQ2xGLHNCQUFrQywyQ0FBUzs7Ozs7UUFBM0MsVUFBNEMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBRWxGLHNCQUFrQywyQ0FBUzs7Ozs7UUFBM0MsVUFBNEMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFD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QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBRXpFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzlFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzlFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzlFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBRTlFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzlFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzlFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBO0lBQzlFLHNCQUFnQyx1Q0FBTzs7Ozs7UUFBdkMsVUFBd0MsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7OztPQUFBOzs7O0lBVzlFLHFDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztLQUN4Qjs7OztJQUVELHdDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNmOzs7O0lBRUQsbUNBQU07OztJQUFOO1FBQUEsaUJBY0M7UUFiQyxxQkFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXRCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUEsVUFBVTtZQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxnQkFBZ0I7Z0JBQ3JELFVBQVUsQ0FBQyxJQUFJLENBQ2IsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQ3hILENBQUM7YUFDSCxDQUFDLENBQUM7U0FDSixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNwQzs7OztJQUVELDRDQUFlOzs7SUFBZjtRQUFBLGlCQVFDO1FBUEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUEsVUFBVTtnQkFDakMsS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUM5RCxDQUFDLENBQUM7U0FDSjtLQUNGO0lBRUQsc0JBQUksNENBQVk7Ozs7UUFBaEI7WUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDM0Q7OztPQUFBO0lBRUQsc0JBQUksMkNBQVc7Ozs7UUFBZjtZQUNFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbkM7OztPQUFBOztnQkEvRUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwwU0FLVDtpQkFDRjs7OztnQkFkbUIsVUFBVTtnQkFBaUIsU0FBUztnQkFHL0MsY0FBYztnQkFFZCxlQUFlLHVCQW9DbkIsUUFBUSxZQUFJLElBQUk7OztzQkFyQmxCLEtBQUssU0FBQyxhQUFhO3dCQUNuQixLQUFLLFNBQUMsZ0JBQWdCO3dCQUN0QixLQUFLLFNBQUMsZ0JBQWdCO3dCQUN0QixLQUFLLFNBQUMsZ0JBQWdCO3dCQUN0QixLQUFLLFNBQUMsZ0JBQWdCO3dCQUN0QixLQUFLLFNBQUMsZ0JBQWdCOzBCQUV0QixLQUFLLFNBQUMsbUJBQW1COzBCQUN6QixLQUFLLFNBQUMsbUJBQW1COzBCQUN6QixLQUFLLFNBQUMsbUJBQW1COzBCQUN6QixLQUFLLFNBQUMsbUJBQW1COzBCQUV6QixLQUFLLFNBQUMsbUJBQW1COzBCQUN6QixLQUFLLFNBQUMsbUJBQW1COzBCQUN6QixLQUFLLFNBQUMsbUJBQW1COzBCQUN6QixLQUFLLFNBQUMsbUJBQW1COzs2QkFuQzVCO0VBZXdDLGFBQWE7Ozs7Ozs7SUNBbEJBLGlDQUFhO0lBMkI5Qyx1QkFDRSxVQUFzQixFQUN0QixRQUFtQixFQUNYLFNBQ3dCLE1BQXVCO1FBSnpELFlBTUUsa0JBQU0sVUFBVSxFQUFFLFFBQVEsQ0FBQyxTQUs1QjtRQVJTLGFBQU8sR0FBUCxPQUFPO3lCQTdCTixFQUFFOzBCQUVELElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQzt5QkFJWixDQUFDO3VCQUNILENBQUM7UUEyQmpCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxLQUFLLEtBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEUsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdEI7O0tBQ0Y7SUE1QkQsc0JBQTJCLCtCQUFJOzs7OztRQUEvQixVQUFnQyxHQUFHLElBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDeEUsc0JBQTJCLGlDQUFNOzs7OztRQUFqQyxVQUFrQyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDdkUsc0JBQTJCLGlDQUFNOzs7OztRQUFqQyxVQUFrQyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDdkUsc0JBQTJCLGlDQUFNOzs7OztRQUFqQyxVQUFrQyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDdkUsc0JBQTJCLGlDQUFNOzs7OztRQUFqQyxVQUFrQyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDdkUsc0JBQTJCLGlDQUFNOzs7OztRQUFqQyxVQUFrQyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFFdkUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDMUUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDMUUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDMUUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFFMUUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDMUUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDMUUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDMUUsc0JBQTJCLG1DQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7Ozs7SUFlMUUsZ0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7S0FDOUI7Ozs7SUFFRCxtQ0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDZjs7OztJQUVELDhCQUFNOzs7SUFBTjtRQUFBLGlCQWdCQztRQWZDLHFCQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFFdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQSxVQUFVO1lBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLGdCQUFnQjtnQkFDckQsVUFBVSxDQUFDLElBQUksQ0FDYixLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDbEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLFFBQVEsQ0FDekgsQ0FDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDcEM7Ozs7SUFFRCw2Q0FBcUI7OztJQUFyQjtRQUFBLGlCQVFDO1FBUEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFBLFVBQVU7Z0JBQ2pDLEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDdkYsQ0FBQyxDQUFDO1NBQ0o7S0FDRjtJQUVELHNCQUFJLHVDQUFZOzs7O1FBQWhCO1lBQ0UsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQzNEOzs7T0FBQTtJQUVELHNCQUFJLHdDQUFhOzs7O1FBQWpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hFOzs7T0FBQTtJQUVELHNCQUFJLHNDQUFXOzs7O1FBQWY7WUFDRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ25DOzs7T0FBQTs7Z0JBOUZGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUscU9BS1Q7aUJBQ0Y7Ozs7Z0JBZG1CLFVBQVU7Z0JBQWlCLFNBQVM7Z0JBRy9DLGNBQWM7Z0JBRWQsZUFBZSx1QkF5Q25CLFFBQVEsWUFBSSxJQUFJLFlBQUksUUFBUTs7OzJCQXhCOUIsS0FBSzt5QkFDTCxLQUFLO3VCQUVMLEtBQUssU0FBQyxRQUFRO3lCQUNkLEtBQUssU0FBQyxXQUFXO3lCQUNqQixLQUFLLFNBQUMsV0FBVzt5QkFDakIsS0FBSyxTQUFDLFdBQVc7eUJBQ2pCLEtBQUssU0FBQyxXQUFXO3lCQUNqQixLQUFLLFNBQUMsV0FBVzsyQkFFakIsS0FBSyxTQUFDLGNBQWM7MkJBQ3BCLEtBQUssU0FBQyxjQUFjOzJCQUNwQixLQUFLLFNBQUMsY0FBYzsyQkFDcEIsS0FBSyxTQUFDLGNBQWM7MkJBRXBCLEtBQUssU0FBQyxjQUFjOzJCQUNwQixLQUFLLFNBQUMsY0FBYzsyQkFDcEIsS0FBSyxTQUFDLGNBQWM7MkJBQ3BCLEtBQUssU0FBQyxjQUFjOzt3QkF4Q3ZCO0VBZW1DLGFBQWE7Ozs7Ozs7SUNBUkEsc0NBQWE7SUF3Qm5ELDRCQUNFLFVBQXNCLEVBQ3RCLFFBQW1CLEVBQ1gsU0FDWSxNQUF1QjtRQUo3QyxZQU1FLGtCQUFNLFVBQVUsRUFBRSxRQUFRLENBQUMsU0FLNUI7UUFSUyxhQUFPLEdBQVAsT0FBTzt5QkExQk4sRUFBRTswQkFFRCxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUE2QjlCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxLQUFLLEtBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEUsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdEI7O0tBQ0Y7SUE1QkQsc0JBQWdDLHFDQUFLOzs7OztRQUFyQyxVQUFzQyxHQUFHLElBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDOUUsc0JBQWdDLHVDQUFPOzs7OztRQUF2QyxVQUF3QyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDN0Usc0JBQWdDLHVDQUFPOzs7OztRQUF2QyxVQUF3QyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDN0Usc0JBQWdDLHVDQUFPOzs7OztRQUF2QyxVQUF3QyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDN0Usc0JBQWdDLHVDQUFPOzs7OztRQUF2QyxVQUF3QyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDN0Usc0JBQWdDLHVDQUFPOzs7OztRQUF2QyxVQUF3QyxHQUFHLElBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFFN0Usc0JBQWdDLHlDQUFTOzs7OztRQUF6QyxVQUEwQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDaEYsc0JBQWdDLHlDQUFTOzs7OztRQUF6QyxVQUEwQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDaEYsc0JBQWdDLHlDQUFTOzs7OztRQUF6QyxVQUEwQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTs7O09BQUE7SUFDaEYs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Ozs7O1FBQXZDLFVBQXdDLEdBQUcsSUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUM3RSxzQkFBZ0MsdUNBQU87Ozs7O1FBQXZDLFVBQXdDLEdBQUcsSUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUU3RSxzQkFBZ0MseUNBQVM7Ozs7O1FBQXpDLFVBQTBDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUNoRixzQkFBZ0MseUNBQVM7Ozs7O1FBQXpDLFVBQTBDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUNoRixzQkFBZ0MseUNBQVM7Ozs7O1FBQXpDLFVBQTBDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUNoRixzQkFBZ0MseUNBQVM7Ozs7O1FBQXpDLFVBQTBDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUVoRixzQkFBZ0MseUNBQVM7Ozs7O1FBQXpDLFVBQTBDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUNoRixzQkFBZ0MseUNBQVM7Ozs7O1FBQXpDLFVBQTBDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJQUNoRixzQkFBZ0MseUNBQVM7Ozs7O1FBQXpDLFVBQTBDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzs7T0FBQTtJ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SSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs7O09BQUE7SUFDdkYsc0JBQTJCLHVDQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs7O09BQUE7SUFDdkYsc0JBQTJCLHVDQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs7O09BQUE7SUFFdkYsc0JBQTJCLHVDQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs7O09BQUE7SUFDdkYsc0JBQTJCLHVDQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs7O09BQUE7SUFDdkYsc0JBQTJCLHVDQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs7O09BQUE7SUFDdkYsc0JBQTJCLHVDQUFROzs7OztRQUFuQyxVQUFvQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs7O09BQUE7SUFFdkYsc0JBQTJCLG1DQUFJOzs7OztRQUEvQixVQUFnQyxHQUFHLElBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFOzs7T0FBQTtJQUNuRixz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