@sapui5/sap.fe.core 1.136.1 → 1.138.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +76 -28
- package/src/sap/fe/core/ActionRuntime.ts +106 -30
- package/src/sap/fe/core/AppComponent.js +11 -1
- package/src/sap/fe/core/AppComponent.ts +10 -0
- package/src/sap/fe/core/AppStateHandler.js +9 -2
- package/src/sap/fe/core/AppStateHandler.ts +8 -2
- package/src/sap/fe/core/CommonUtils.js +15 -3
- package/src/sap/fe/core/CommonUtils.ts +13 -2
- package/src/sap/fe/core/PageController.controller.js +10 -0
- package/src/sap/fe/core/PageController.controller.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -4
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +3 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +2 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -12
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -16
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +20 -5
- package/src/sap/fe/core/controllerextensions/Paginator.ts +19 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +4 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -2
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +178 -125
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +222 -174
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +5 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +39 -5
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +51 -11
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +16 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +17 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +88 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +106 -7
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +16 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +15 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +25 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +24 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +11 -8
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +13 -10
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -4
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +7 -3
- package/src/sap/fe/core/controls/DataWatcher.js +2 -2
- package/src/sap/fe/core/controls/DataWatcher.tsx +1 -1
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +11 -6
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +13 -9
- package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
- package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +3 -2
- package/src/sap/fe/core/converters/MetaModelConverter.ts +12 -4
- package/src/sap/fe/core/converters/controls/Common/Action.js +42 -5
- package/src/sap/fe/core/converters/controls/Common/Action.ts +42 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +4 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +2 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +46 -13
- package/src/sap/fe/core/converters/controls/Common/Table.ts +50 -11
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +11 -10
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +13 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +2 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +9 -9
- package/src/sap/fe/core/helpers/DeleteHelper.ts +8 -9
- package/src/sap/fe/core/helpers/FPMHelper.js +2 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js +4 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +8 -4
- package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
- package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
- package/src/sap/fe/core/library.js +33 -4
- package/src/sap/fe/core/library.ts +33 -2
- package/src/sap/fe/core/messagebundle.properties +18 -2
- package/src/sap/fe/core/messagebundle_ar.properties +3 -2
- package/src/sap/fe/core/messagebundle_bg.properties +2 -1
- package/src/sap/fe/core/messagebundle_ca.properties +2 -1
- package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
- package/src/sap/fe/core/messagebundle_cs.properties +4 -3
- package/src/sap/fe/core/messagebundle_cy.properties +2 -1
- package/src/sap/fe/core/messagebundle_da.properties +2 -1
- package/src/sap/fe/core/messagebundle_de.properties +8 -7
- package/src/sap/fe/core/messagebundle_el.properties +2 -1
- package/src/sap/fe/core/messagebundle_en.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -1
- package/src/sap/fe/core/messagebundle_es.properties +5 -4
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
- package/src/sap/fe/core/messagebundle_et.properties +2 -1
- package/src/sap/fe/core/messagebundle_fi.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -1
- package/src/sap/fe/core/messagebundle_hr.properties +2 -1
- package/src/sap/fe/core/messagebundle_hu.properties +2 -1
- package/src/sap/fe/core/messagebundle_id.properties +2 -1
- package/src/sap/fe/core/messagebundle_it.properties +2 -1
- package/src/sap/fe/core/messagebundle_iw.properties +2 -1
- package/src/sap/fe/core/messagebundle_ja.properties +3 -2
- package/src/sap/fe/core/messagebundle_kk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ko.properties +2 -1
- package/src/sap/fe/core/messagebundle_lt.properties +2 -1
- package/src/sap/fe/core/messagebundle_lv.properties +2 -1
- package/src/sap/fe/core/messagebundle_mk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ms.properties +2 -1
- package/src/sap/fe/core/messagebundle_nl.properties +2 -1
- package/src/sap/fe/core/messagebundle_no.properties +3 -2
- package/src/sap/fe/core/messagebundle_pl.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
- package/src/sap/fe/core/messagebundle_ro.properties +2 -1
- package/src/sap/fe/core/messagebundle_ru.properties +2 -1
- package/src/sap/fe/core/messagebundle_sh.properties +2 -1
- package/src/sap/fe/core/messagebundle_sk.properties +2 -1
- package/src/sap/fe/core/messagebundle_sl.properties +2 -1
- package/src/sap/fe/core/messagebundle_sr.properties +2 -1
- package/src/sap/fe/core/messagebundle_sv.properties +2 -1
- package/src/sap/fe/core/messagebundle_th.properties +2 -1
- package/src/sap/fe/core/messagebundle_tr.properties +2 -1
- package/src/sap/fe/core/messagebundle_uk.properties +2 -1
- package/src/sap/fe/core/messagebundle_vi.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +6 -6
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +5 -5
- package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
- package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
- package/src/sap/fe/core/templating/UIFormatters.js +3 -3
- package/src/sap/fe/core/templating/UIFormatters.ts +1 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +0 -81
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +0 -126
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +0 -10
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +0 -2
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
|
@@ -240,7 +240,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
240
240
|
relatedPropertyNames.forEach(name => {
|
|
241
241
|
addPropertyToDisplayModeOfDescriptionPropertiesMap(displayModeOfDescriptionPropertiesMap, relatedPropertiesInfo, name);
|
|
242
242
|
});
|
|
243
|
-
const columnInfo = getColumnDefinitionFromProperty(property, converterContext.getEntitySetBasedAnnotationPath(property.fullyQualifiedName), property.name, true, true, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode, relatedPropertiesInfo);
|
|
243
|
+
const columnInfo = getColumnDefinitionFromProperty(property, converterContext.getEntitySetBasedAnnotationPath(property.fullyQualifiedName), property.name, true, true, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, tableType, restrictionsOnProperties, tableCreationMode, relatedPropertiesInfo);
|
|
244
244
|
if (relatedPropertyNames.length > 0) {
|
|
245
245
|
columnInfo.propertyInfos = relatedPropertyNames;
|
|
246
246
|
if (relatedPropertiesInfo.exportSettings.dataPointTargetValue) {
|
|
@@ -267,12 +267,12 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
267
267
|
if (getDisplayMode(property) === "Description") {
|
|
268
268
|
restrictionsOnProperties?.nonSortableProperties.push(property.name);
|
|
269
269
|
if (isPathAnnotationExpression(property?.annotations?.Common?.Text)) {
|
|
270
|
-
annotationColumns.push(getColumnDefinitionFromProperty(property, converterContext.getEntitySetBasedAnnotationPath(property.fullyQualifiedName), property.name, false, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode));
|
|
270
|
+
annotationColumns.push(getColumnDefinitionFromProperty(property, converterContext.getEntitySetBasedAnnotationPath(property.fullyQualifiedName), property.name, false, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, tableType, restrictionsOnProperties, tableCreationMode));
|
|
271
271
|
}
|
|
272
272
|
}
|
|
273
273
|
});
|
|
274
274
|
// Create a propertyInfo for each related property.
|
|
275
|
-
const relatedColumns = _createRelatedColumns(columnsToBeCreated, annotationColumns, converterContext, entityType, displayModeOfDescriptionPropertiesMap, tableCreationMode, restrictionsOnProperties);
|
|
275
|
+
const relatedColumns = _createRelatedColumns(columnsToBeCreated, annotationColumns, converterContext, entityType, displayModeOfDescriptionPropertiesMap, tableType, tableCreationMode, restrictionsOnProperties);
|
|
276
276
|
return annotationColumns.concat(relatedColumns);
|
|
277
277
|
};
|
|
278
278
|
|
|
@@ -293,7 +293,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
293
293
|
* @returns The annotation column definition
|
|
294
294
|
*/
|
|
295
295
|
_exports.getColumnsFromEntityType = getColumnsFromEntityType;
|
|
296
|
-
const getColumnDefinitionFromProperty = function (property, fullPropertyPath, relativePath, useDataFieldPrefix, availableForAdaptation, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode, relatedPropertiesInfo, relativePathForMultiValue) {
|
|
296
|
+
const getColumnDefinitionFromProperty = function (property, fullPropertyPath, relativePath, useDataFieldPrefix, availableForAdaptation, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, tableType, restrictionsOnProperties, tableCreationMode, relatedPropertiesInfo, relativePathForMultiValue) {
|
|
297
297
|
const semanticObjectAnnotationPath = getSemanticObjectPath(converterContext, property);
|
|
298
298
|
const isHidden = isReferencePropertyStaticallyHidden(property);
|
|
299
299
|
const groupPath = property.name ? _sliceAtSlash(property.name, true, false) : undefined;
|
|
@@ -304,6 +304,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
304
304
|
const isAPropertyFromTextOnlyAnnotation = displayModeOfDescriptionPropertiesMap[relativePath] === "Description";
|
|
305
305
|
const sortable = (!isHidden || isAPropertyFromTextOnlyAnnotation) && !restrictionsOnProperties?.nonSortableProperties.includes(relativePath);
|
|
306
306
|
const filterable = !restrictionsOnProperties?.nonFilterableProperties.includes(relativePath);
|
|
307
|
+
const groupable = aggregationHelper.isAnalyticsSupported() && tableType === "AnalyticalTable" ? !!aggregationHelper.isPropertyGroupable(property) : sortable;
|
|
307
308
|
const typeConfig = {
|
|
308
309
|
className: property.type || dataType,
|
|
309
310
|
formatOptions: propertyTypeConfig.formatOptions,
|
|
@@ -334,7 +335,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
334
335
|
relativePath: relativePath,
|
|
335
336
|
sortable: sortable,
|
|
336
337
|
filterable: filterable,
|
|
337
|
-
isGroupable:
|
|
338
|
+
isGroupable: groupable,
|
|
338
339
|
isKey: property.isKey,
|
|
339
340
|
exportSettings: exportSettings,
|
|
340
341
|
caseSensitive: isFilteringCaseSensitive(converterContext),
|
|
@@ -618,7 +619,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
618
619
|
* @returns The array of columns created.
|
|
619
620
|
*/
|
|
620
621
|
_exports.getRowStatusVisibility = getRowStatusVisibility;
|
|
621
|
-
const _createRelatedColumns = function (columnsToBeCreated, existingColumns, converterContext, entityType, displayModeOfDescriptionPropertiesMap, tableCreationMode, restrictionsOnProperties) {
|
|
622
|
+
const _createRelatedColumns = function (columnsToBeCreated, existingColumns, converterContext, entityType, displayModeOfDescriptionPropertiesMap, tableType, tableCreationMode, restrictionsOnProperties) {
|
|
622
623
|
const relatedColumns = [];
|
|
623
624
|
const relatedPropertyNameMap = {};
|
|
624
625
|
const aggregationHelper = new AggregationHelper(entityType, converterContext);
|
|
@@ -631,14 +632,14 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
631
632
|
const propertyObjectPath = enhanceDataModelPath(dataModelObjectPath, name);
|
|
632
633
|
if (isMultiValueField(propertyObjectPath)) {
|
|
633
634
|
const newNameRelativeTargetPath = getContextRelativeTargetObjectPath(propertyObjectPath, false, true);
|
|
634
|
-
const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode, undefined, newNameRelativeTargetPath);
|
|
635
|
+
const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, tableType, restrictionsOnProperties, tableCreationMode, undefined, newNameRelativeTargetPath);
|
|
635
636
|
computeHiddenOnRelatedColumns(existingColumns, name, column);
|
|
636
637
|
relatedColumns.push(column);
|
|
637
638
|
relatedPropertyNameMap[name] = newNameRelativeTargetPath ?? name;
|
|
638
639
|
} else if (relatedColumn === undefined) {
|
|
639
640
|
// Case 1: Key contains DataField prefix to ensure all property columns have the same key format.
|
|
640
641
|
// New created property column is set to hidden.
|
|
641
|
-
const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode);
|
|
642
|
+
const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, tableType, restrictionsOnProperties, tableCreationMode);
|
|
642
643
|
computeHiddenOnRelatedColumns(existingColumns, name, column);
|
|
643
644
|
relatedColumns.push(column);
|
|
644
645
|
} else if (relatedColumn.annotationPath !== annotationPath || relatedColumn.propertyInfos) {
|
|
@@ -649,7 +650,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
649
650
|
if (!existingColumns.some(column => column.name === newName)) {
|
|
650
651
|
// Create a new property column with 'Property::' prefix,
|
|
651
652
|
// Set it to hidden as it is only consumed by Complex property infos.
|
|
652
|
-
const column = getColumnDefinitionFromProperty(property, annotationPath, name, false, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode);
|
|
653
|
+
const column = getColumnDefinitionFromProperty(property, annotationPath, name, false, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, tableType, restrictionsOnProperties, tableCreationMode);
|
|
653
654
|
computeHiddenOnRelatedColumns(existingColumns, name, column);
|
|
654
655
|
relatedColumns.push(column);
|
|
655
656
|
relatedPropertyNameMap[name] = newName;
|
|
@@ -1681,4 +1682,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
|
|
|
1681
1682
|
}
|
|
1682
1683
|
return _exports;
|
|
1683
1684
|
}, false);
|
|
1684
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJ0ZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsInR5cGUiLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJlbnRpdHlUeXBlIiwidGFibGVDcmVhdGlvbk1vZGUiLCJkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwicmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwicHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkIiwiYWdncmVnYXRpb25IZWxwZXIiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImdyb3VwYWJsZVByb3BlcnRpZXMiLCJnZXRHcm91cGFibGVQcm9wZXJ0aWVzIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtYXAiLCIkdGFyZ2V0IiwiZmlsdGVyIiwidGFyZ2V0IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wIiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsInByb3AiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZXhpc3RzIiwic29tZSIsInRhcmdldFR5cGUiLCJpbmNsdWRlcyIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsInByb3BlcnRpZXMiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJsZW5ndGgiLCJkYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlIiwiYW5ub3RhdGlvblByb3BlcnR5IiwiYWRkaXRpb25hbFByb3BlcnR5SW5mb3MiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lIiwicHVzaCIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiVGV4dCIsInJlbGF0ZWRDb2x1bW5zIiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiY29uY2F0IiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4iLCJncm91cFBhdGgiLCJfc2xpY2VBdFNsYXNoIiwiaXNHcm91cCIsImxhYmVsIiwiZ2V0TGFiZWwiLCJkYXRhVHlwZSIsImdldERhdGFGaWVsZERhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiZ2V0VHlwZUNvbmZpZyIsImlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiIsInNvcnRhYmxlIiwiZmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwidHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsImNvbnN0cmFpbnRzIiwiX2lzRXhwb3J0YWJsZUNvbHVtbiIsImNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzIiwiY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzIiwiX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsImtleSIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJBbm5vdGF0aW9uIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwiYW5ub3RhdGlvblBhdGgiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImdldEltcG9ydGFuY2UiLCJVSSIsIkRhdGFGaWVsZERlZmF1bHQiLCJyZXF1aXJlZCIsImlzUmVxdWlyZWRDb2x1bW4iLCJhZGRpdGlvbmFsTGFiZWxzIiwiX2FkZFRvb2xUaXAiLCJfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQiLCJNb2RlbEhlbHBlciIsImlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkIiwiZXh0ZW5zaW9uIiwidGVjaG5pY2FsbHlBZ2dyZWdhdGFibGUiLCJ0ZWNobmljYWxseUdyb3VwYWJsZSIsInVuaXRQcm9wZXJ0eSIsInV0YyIsImlzQVRpbWV6b25lIiwiY3VycmVuY3lQcm9wZXJ0eSIsInNjYWxlIiwiaXNQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldFN0YXRpY1VuaXRPckN1cnJlbmN5IiwiZ2V0U3RhdGljVGltZXpvbmUiLCJpc1RpbWV6b25lIiwiZXhwb3J0VHlwZSIsImdldEV4cG9ydERhdGFUeXBlIiwiaW5wdXRGb3JtYXQiLCJnZXREYXRlSW5wdXRGb3JtYXQiLCJkZWxpbWl0ZXIiLCJnZXREZWxpbWl0ZXIiLCJ0ZW1wbGF0ZSIsIndyYXAiLCJhdXRvU2NhbGUiLCJyZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MiLCJzZXR0aW5nIiwic291cmNlIiwicHJvcGVydHlUeXBlIiwiZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5IiwiJFR5cGUiLCJUYXJnZXQiLCJWYWx1ZSIsIkNvcmUiLCJNZWRpYVR5cGUiLCJ0ZXJtIiwiaXNVUkwiLCJfaXNWYWxpZENvbHVtbiIsImRhdGFGaWVsZCIsIklubGluZSIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInByb3BlcnR5VmFsdWUiLCJpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkIiwiY29uc3RhbnQiLCJpc0FuYWx5dGljYWxMZWFmIiwiYW5kIiwibm90IiwiZXF1YWwiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJIaWRkZW4iLCJpZkVsc2UiLCJvciIsIl9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJkYXRhRmllbGRHcm91cCIsImZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImNvbXBpbGVFeHByZXNzaW9uIiwiRGF0YSIsImlubmVyRGF0YUZpZWxkIiwiYXJndW1lbnRzIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwicXVhbGlmaWVyIiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwidmFsdWVPZiIsIl9nZXRUb29sdGlwIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSIsImNvbE5hbWUiLCJpc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZm9ybWF0UmVzdWx0IiwicGF0aEluTW9kZWwiLCJ0YWJsZUZvcm1hdHRlcnMiLCJnZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZFByb3BlcnR5TmFtZU1hcCIsImdldEFic29sdXRlQW5ub3RhdGlvblBhdGgiLCJyZWxhdGVkQ29sdW1uIiwicHJvcGVydHlPYmplY3RQYXRoIiwiaXNNdWx0aVZhbHVlRmllbGQiLCJuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoIiwiY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMiLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsImNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsInZhbHVlIiwiaXNMYXN0U2xhc2giLCJpc0xhc3RQYXJ0IiwiaVNsYXNoSW5kZXgiLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJfaXNDb2x1bW5NdWx0aVZhbHVlZCIsIl9pc0NvbHVtblNvcnRhYmxlIiwicHJvcGVydHlQYXRoIiwibm9uU29ydGFibGVDb2x1bW5zIiwicHJvcE5hbWUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJfZ2V0RmlsdGVyRnVuY3Rpb25zIiwiQ29udmVydGVyQ29udGV4dCIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsIlR5cGVHdWFyZHMiLCJpc0VudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsIl9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXMiLCJzZW1hbnRpY0tleXMiLCJhU2VtYW50aWNLZXlWYWx1ZXMiLCJiU2VtYW50aWNLZXlGb3VuZCIsImkiLCJ2YWx1ZXMiLCJzZW1hbnRpY0tleUZvdW5kIiwiX2ZpbmRQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlWYWx1ZXMiLCJmaWVsZEdyb3VwUHJvcGVydGllcyIsInNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAiLCJzUHJvcGVydHlQYXRoIiwidG1wIiwiZmllbGRHcm91cFByb3BlcnR5UGF0aCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAiLCJhUHJvcGVydGllcyIsIl9wcm9wZXJ0aWVzRm91bmQiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJzZW1hbnRpY0tleSIsInNlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoIiwic2hvd0Vycm9yT2JqZWN0U3RhdHVzIiwiaGFzRHJhZnRJbmRpY2F0b3IiLCJfZ2V0SW1wTnVtYmVyIiwiSW1wb3J0YW5jZSIsIl9nZXREYXRhRmllbGRJbXBvcnRhbmNlIiwic3BsaXQiLCJOb25lIiwidGFyZ2V0VmFsdWVmcm9tRFAiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsIl9nZXRNYXhJbXBvcnRhbmNlIiwiZmllbGRzIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJmaWVsZCIsInRhcmdldEVudGl0eVR5cGUiLCJTZW1hbnRpY0tleSIsInJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsImhpZ2hLZXlzIiwiZmllbGRzV2l0aEltcG9ydGFuY2UiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJkYXRhRmllbGRUYXJnZXQiLCJmaWVsZEdyb3VwRGF0YSIsImZpZWxkR3JvdXBEYXRhRmllbGQiLCJIaWdoIiwiaXRlbSIsImdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInRhYmxlTWFuaWZlc3RTZXR0aW5ncyIsImRlZmF1bHRDcmVhdGlvbk1vZGUiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm1hY3JvcyIsInRhYmxlIiwiQ3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwidGFibGVTZXR0aW5ncyIsImNyZWF0aW9uTW9kZSIsImdldEFubm90YXRpb25zQnlUZXJtIiwiZ2V0RW50aXR5VHlwZSIsInRhYmxlQ29udmVydGVyQ29udGV4dCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRmllbGRHcm91cENvbHVtbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwic2l0dWF0aW9uc05hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiaXNDb2xsZWN0aW9uIiwiU0FQT2JqZWN0Tm9kZVR5cGUiLCJOYW1lIiwic2l0dWF0aW9uc05hdlByb3AiLCJoYXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiaXNNdWx0aVZhbHVlIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImlzUGFydE9mTGluZUl0ZW0iLCJ0b29sdGlwIiwicmVsYXRlZFByb3BlcnR5TmFtZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwiY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNvbHZlUGF0aCIsImlzUmVxdWlyZWRGaWVsZEdyb3VwIiwiZmllbGRHcm91cCIsImlzRGF0YUZpZWxkIiwiaXNTdGF0aWNhbGx5TWFuZGF0b3J5IiwiaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5IiwiaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24iLCJkYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkR3JvdXBUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsIklzRWRpdGFibGUiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJleHBvcnRQcm9wZXJ0aWVzIiwiam9pbiIsImludGVybmFsQ29sdW1ucyIsImlzQ29sdW1uT3ZlcnJpZGUiLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsInJlcGxhY2UiLCJpc1BhcnRPZkN1c3RvbUNvbHVtbiIsInZhbGlkYXRlS2V5IiwiYmFzZVRhYmxlQ29sdW1uIiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW4iLCJnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyIsInRvb2x0aXBUZXh0IiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsImhlYWRlclRleHQiLCJoZWFkZXIiLCJjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyIsImJhc2VNYW5pZmVzdENvbHVtbiIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiaWQiLCJjdXN0b21UYWJsZUNvbHVtbiIsIkRlZmF1bHQiLCJtZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yIiwic2l0dWF0aW9uc0luZGljYXRvckNvbHVtbiIsInByb3BlcnR5S2V5IiwiaXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiQ29tcHV0ZWQiLCJjbGlwYm9hcmRTZXR0aW5ncyIsImluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4iLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yIiwiaXNEcmFmdE5vZGUiLCJpc0RyYWZ0Um9vdCIsImNvbHVtbldpdGhEcmFmdEluZGljYXRvciIsImRyYWZ0SW5kaWNhdG9yQ29sdW1uIiwiaXNEcmFmdEluZGljYXRvciIsImNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciIsImdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uIiwiY2FwYWJpbGl0aWVzIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiaXNDdXJyZW5jeSIsImV4cG9ydERhdGFUeXBlIiwibmF2UHJvcGVydHkiLCJsaW5lSXRlbSIsImlzUHJvcGVydHlOYXZpZ2F0ZWQiLCJpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQiLCJ0YXJnZXRNYXBwaW5nIiwiaXNUeXBlRGVmaW5pdGlvbiIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsInNldFVwQ29uc3RyYWludHMiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJudWxsYWJsZSIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyIsImV4aXN0aW5nQ29sdW1uIiwiY29sdW1uS2V5IiwiY29sdW1uRnJvbUFubm90YXRpb25zIiwiZW5hYmxlV3JhcHBpbmciLCJjdXN0b21FeHBvcnRTZXR0aW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29sdW1ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJGdW5jdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc19FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNLZXkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdExpbmVJdGVtXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0RURNX1RZUEVfTUFQUElORyxcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRmb3JtYXRSZXN1bHQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRub3QsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbCxcblx0c2V0VXBDb25zdHJhaW50c1xufSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUge1xuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4sXG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRGb3JtYXRPcHRpb25zVHlwZSxcblx0VGFibGVDb2x1bW5TZXR0aW5ncyxcblx0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBIb3Jpem9udGFsQWxpZ24sIEltcG9ydGFuY2UsIFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGxleFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSxcblx0Z2V0RGF0YUZpZWxkRGF0YVR5cGUsXG5cdGdldFNlbWFudGljT2JqZWN0UGF0aCxcblx0Z2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCxcblx0aGFzRGF0YVBvaW50VGFyZ2V0LFxuXHRoYXNGaWVsZEdyb3VwVGFyZ2V0LFxuXHRpc0RhdGFGaWVsZCxcblx0aXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHRpc0RhdGFGaWVsZFR5cGVzLFxuXHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0LFxuXHRpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7IHR5cGUgVGFibGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IE92ZXJyaWRlVHlwZSwgUGxhY2VtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvRGF0YUZpZWxkSGVscGVyXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0ICogYXMgVHlwZUd1YXJkcyBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRpc0Fubm90YXRpb25PZlR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eSxcblx0aXNUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRlbmhhbmNlRGF0YU1vZGVsUGF0aCxcblx0Z2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSwgdHlwZSBEaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsIHR5cGUgUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5pbXBvcnQgeyBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnksIGlzU3RhdGljYWxseU1hbmRhdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0Z2V0U3RhdGljVGltZXpvbmUsXG5cdGdldFN0YXRpY1VuaXRPckN1cnJlbmN5LFxuXHRpc1RpbWV6b25lXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVGaWVsZCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0VHlwZUZvckVkbVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVzdHJpY3RlZC1pbXBvcnRzXG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgTURDVGFibGVQcm9wZXJ0eUluZm8gYXMgUHJvcGVydHlJbmZvLCBWaXN1YWxTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBTaW1wbGVUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvU2ltcGxlVHlwZVwiO1xuXG4vLyBDdXN0b20gQ29sdW1uIGZyb20gTWFuaWZlc3RcbnR5cGUgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlPzogQ29sdW1uVHlwZS5EZWZhdWx0O1xufTtcblxuLy8gU2xvdCBDb2x1bW4gZnJvbSBCdWlsZGluZyBCbG9ja1xudHlwZSBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Q7XG59O1xuLy8gUHJvcGVydGllcyBhbGwgQ29sdW1uVHlwZXMgaGF2ZTpcbnR5cGUgQmFzZVRhYmxlQ29sdW1uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlOyAvL09yaWdpbiBvZiB0aGUgc291cmNlIHdoZXJlIHdlIGFyZSBnZXR0aW5nIHRoZSB0ZW1wbGF0ZWQgaW5mb3JtYXRpb24gZnJvbVxuXHR3aWR0aD86IHN0cmluZztcblx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI/OiBib29sZWFuO1xuXHRpbXBvcnRhbmNlPzogSW1wb3J0YW5jZTtcblx0aG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuXHRhdmFpbGFiaWxpdHk/OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRsYWJlbD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcbn07XG5cbi8vIFByb3BlcnRpZXMgb24gQ3VzdG9tIENvbHVtbnMgYW5kIFNsb3QgQ29sdW1uc1xuZXhwb3J0IHR5cGUgQ3VzdG9tQmFzZWRUYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0aWQ6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHRoZWFkZXI/OiBzdHJpbmc7XG5cdHRlbXBsYXRlOiBzdHJpbmcgfCBDb250cm9sO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZTtcblx0aXNHcm91cGFibGU6IGJvb2xlYW47XG5cdGlzTmF2aWdhYmxlOiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9O1xuXHRwcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBDb21wdXRlZFRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdHByb3BlcnR5S2V5OiBzdHJpbmc7XG5cdGlzRHJhZnRJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGUgfCBudWxsO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRjbGlwYm9hcmRTZXR0aW5ncz86IE9iamVjdCB8IG51bGw7XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG4vLyBQcm9wZXJ0aWVzIGRlcml2ZWQgZnJvbSBNYW5pZmVzdCB0byBvdmVycmlkZSBBbm5vdGF0aW9uIGNvbmZpZ3VyYXRpb25zXG50eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRzZXR0aW5ncz86IFRhYmxlQ29sdW1uU2V0dGluZ3M7XG5cdGZvcm1hdE9wdGlvbnM/OiBGb3JtYXRPcHRpb25zVHlwZTtcblx0ZXhwb3J0U2V0dGluZ3M/OiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cyA9IFBhcnRpYWw8e1xuXHRzY2FsZTogbnVtYmVyO1xuXHRwcmVjaXNpb246IG51bWJlcjtcblx0bWF4TGVuZ3RoOiBudW1iZXI7XG5cdG51bGxhYmxlOiBib29sZWFuO1xuXHRtaW5pbXVtOiBzdHJpbmc7XG5cdG1heGltdW06IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlOiBib29sZWFuO1xufT47XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnMgPSBQYXJ0aWFsPHtcblx0cGFyc2VBc1N0cmluZzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc6IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBib29sZWFuO1xuXHRzdHlsZTogc3RyaW5nO1xufT47XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0dHlwZT86IHN0cmluZztcblx0Y29uc3RyYWludHM/OiBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9ucz86IFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnM7XG5cdHR5cGVJbnN0YW5jZT86IFNpbXBsZVR5cGU7XG5cdGJhc2VUeXBlPzogc3RyaW5nO1xuXHRjbGFzc05hbWU/OiBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSAmIHtcblx0ZGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdGlzQ3VycmVuY3k/OiBib29sZWFuO1xufTtcblxuLy8gUHJvcGVydGllcyBmb3IgQW5ub3RhdGlvbiBDb2x1bW5zXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSBQcm9wZXJ0eUluZm8gJlxuXHRBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZSAmIHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0XHR0b29sdGlwPzogc3RyaW5nO1xuXHRcdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdFx0Z3JvdXA/OiBzdHJpbmc7XG5cdFx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0c2hvd0RhdGFGaWVsZHNMYWJlbD86IGJvb2xlYW47XG5cdFx0cmVxdWlyZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRpc0dyb3VwYWJsZT86IGJvb2xlYW47XG5cdFx0dW5pdFRleHQ/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmVUZXh0Pzogc3RyaW5nO1xuXHRcdHRpbWV6b25lPzogc3RyaW5nO1xuXHRcdHNlbWFudGljT2JqZWN0UGF0aD86IHN0cmluZztcblx0XHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0XHR0ZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRcdG1vZGU6IERpc3BsYXlNb2RlO1xuXHRcdH07XG5cdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0XHR0eXBlQ29uZmlnPzogUHJvcGVydHlUeXBlQ29uZmlnO1xuXHRcdGlzUGFydE9mTGluZUl0ZW0/OiBib29sZWFuOyAvLyB0ZW1wb3JhcnkgaW5kaWNhdG9yIHRvIG9ubHkgYWxsb3cgZmlsdGVyaW5nIG9uIG5hdmlnYXRpb24gcHJvcGVydGllcyB3aGVuIHRoZXkncmUgcGFydCBvZiBhIGxpbmUgaXRlbVxuXHRcdGlzUGFydE9mQ3VzdG9tQ29sdW1uPzogYm9vbGVhbjtcblx0XHRhZGRpdGlvbmFsTGFiZWxzPzogc3RyaW5nW107XG5cdFx0ZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdFx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xuXHRcdGlzTXVsdGlWYWx1ZT86IGJvb2xlYW47XG5cdFx0ZGVzY3JpcHRpb25Qcm9wZXJ0eT86IHN0cmluZztcblx0XHRtb2RlPzogRGlzcGxheU1vZGU7XG5cdFx0dmFsdWVQcm9wZXJ0eT86IHN0cmluZztcblx0fTtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gUHJvcGVydHlJbmZvW1wiZXh0ZW5zaW9uXCJdICYge1xuXHRhZGRpdGlvbmFsUHJvcGVydGllcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgQ29tcHV0ZWRUYWJsZUNvbHVtbjtcblxudHlwZSBNYW5pZmVzdENvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPjtcblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlIChDdXN0b20gQ29sdW1uKVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIixcblx0Q29tcHV0ZWQgPSBcIkNvbXB1dGVkXCJcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0LWJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdHlwZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFJldHVybnMgYWxsIHRhYmxlIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRlbXBsYXRpbmcgb3IgcGVyc29uYWxpemF0aW9uIG9yIHRoZWlyIG9yaWdpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVUeXBlLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuY29sdW1ucyA/PyB7fSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKVxuXHQpO1xuXG5cdGNvbnN0IHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSA9IGluc2VydEN1c3RvbUVsZW1lbnRzKFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIFRhYmxlQ29sdW1uW10sXG5cdFx0bWFuaWZlc3RDb2x1bW5zIGFzIFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnQ8VGFibGVDb2x1bW4+Pixcblx0XHR7XG5cdFx0XHR3aWR0aDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0aW1wb3J0YW5jZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGhvcml6b250YWxBbGlnbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGlzTmF2aWdhYmxlOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0c2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0XHR9XG5cdCk7XG5cblx0cmV0dXJuIGFkZENvbXB1dGVkQ29sdW1ucyh0YWJsZUNvbHVtbnMsIHRhYmxlVHlwZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHBhdGg7XG5cdH0pO1xufVxuXG4vKipcbiAqIFNldHMgdGhlICd1bml0JywgJ3RleHRBcnJhbmdlbWVudCcsICd0aW1lem9uZScgYW5kICdleHBvcnRzZXR0aW5ncycgcHJvcGVydGllcyBpbiBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgY29sdW1ucyB0byBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IHRhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRcdFx0aWYgKHByb3BlcnR5KSB7XG5cdFx0XHRcdGFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZSA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0XHRcdFx0aWYgKHRpbWV6b25lUHJvcGVydHkpIHtcblx0XHRcdFx0XHRjb25zdCBvVGltZXpvbmVDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRpbWV6b25lUHJvcGVydHkubmFtZSwgdGFibGVDb2x1bW5zKTtcblx0XHRcdFx0XHR0YWJsZUNvbHVtbi50aW1lem9uZSA9IG9UaW1lem9uZUNvbHVtbj8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZSkge1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnRpbWV6b25lVGV4dCA9IHRpbWV6b25lLnRvU3RyaW5nKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgXCJ1bml0XCIgcHJvcGVydHkgaW50byB0aGUgY29sdW1ucyB3aGVuIG5lY2Nlc2FyeSBmb3IgY29sdW1ucyB3aXRoIHVuaXQgb2YgbWVhc3VyZSBhbmQgY3VycmVuY2llcy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwcm9wZXJ0eSBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGRpc3BsYXllZCBvbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbiBUaGUgdGFibGUgY29sdW1uIHdoaWNoIGFkZHMgdGhlIGN1cnJlbmN5IG9yIHVuaXRcbiAqL1xuZnVuY3Rpb24gYWRkQ3VycmVuY3lPclVvTVRvUHJvcGVydHkoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZUNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uXG4pOiB2b2lkIHtcblx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdGlmIChjdXJyZW5jeU9yVW9NUHJvcGVydHkpIHtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgY3VycmVuY3lPclVvTVByb3BlcnR5KTtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRpZiAoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgdW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCwgdGFibGVDb2x1bW5zKTtcblx0XHRcdHRhYmxlQ29sdW1uLnVuaXQgPSB1bml0Q29sdW1uPy5uYW1lO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCB1bml0ID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0XHRpZiAodW5pdCkge1xuXHRcdFx0dGFibGVDb2x1bW4udW5pdFRleHQgPSBgJHt1bml0fWA7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQWRkIHRoZSBcInRleHRBcnJhbmdlbWVudFwiIG9iamVjdCB0byBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5IGZvciBjb2x1bW5zIGNvbnRhaW5pbmcgdGV4dCwgc3VjaCBhcyBkZXNjcmlwdGlvbnMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgYnkgdGhlIGNvbHVtblxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcHJvcGVydHkgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBkaXNwbGF5ZWQgb24gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW4gVGhlIHRhYmxlIGNvbHVtbiB3aGljaCBhZGRzIHRoZSB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGFkZFRleHRBcnJhbmdlbnRJbmZvVG9Qcm9wZXJ0eShcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5cbik6IHZvaWQge1xuXHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSxcblx0XHR0ZXh0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAodGV4dFByb3BlcnR5UGF0aCAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHRleHRSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGlmICh0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCB0ZXh0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0ZXh0UmVsYXRpdmVQYXRoLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0aWYgKHRleHRDb2x1bW4gJiYgdGV4dENvbHVtbi5uYW1lICE9PSB0YWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdHRhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHR0ZXh0UHJvcGVydHk6IHRleHRDb2x1bW4ubmFtZSxcblx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBJZiB0ZXh0IHByb3BlcnRpZXMgYXJlIHVzZWQgYnV0IGhpZGRlbiwgd2UgbXVzdCBpbmNsdWRlIHRoZW0gdG8gdGhlIGV4cG9ydCBhcyB0aGVyZSBhcmUgdXNlZCBpbiB0aGUgcGFzdGVcblx0XHRcdFx0aWYgKCF0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzKSB7XG5cdFx0XHRcdFx0dGV4dENvbHVtbi5leHBvcnRTZXR0aW5ncyA9IHsgdHlwZTogXCJTdHJpbmdcIiB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGNvbHVtbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUsXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGlmIChhbm5vdGF0aW9uQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMgPSBbXTtcblx0fVxuXG5cdGxldCBwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQ6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBncm91cGFibGVQcm9wZXJ0aWVzID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0R3JvdXBhYmxlUHJvcGVydGllcygpO1xuXHQvL0ZvciBBbmFseXRpY2FsIHRhYmxlLCB3ZSBleGNsdWRlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBncm91cGFibGUgYW5kIHVzZWQgYXMgVGV4dCBpbiBhIGdyb3VwYWJsZSBQcm9wZXJ0eS5cblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmIGdyb3VwYWJsZVByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQgPSBncm91cGFibGVQcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkuJHRhcmdldClcblx0XHRcdC5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHQubWFwKCh0YXJnZXQpID0+IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkodGFyZ2V0IGFzIFByb3BlcnR5KSlcblx0XHRcdC5maWx0ZXIoKHRleHRQcm9wKSA9PiB0ZXh0UHJvcCAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZSh0ZXh0UHJvcCkpXG5cdFx0XHQubWFwKChwcm9wKSA9PiBwcm9wPy5uYW1lKVxuXHRcdFx0LmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gdW5kZWZpbmVkKSBhcyBzdHJpbmdbXTtcblx0fVxuXHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0XHRjb25zdCBleGlzdHMgPSBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblx0XHQvLyBpZiB0YXJnZXQgdHlwZSBleGlzdHMsIGl0IGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgc2hvdWxkIGJlIGlnbm9yZWRcblx0XHRpZiAoIXByb3BlcnR5LnRhcmdldFR5cGUgJiYgIWV4aXN0cyAmJiAhcHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkLmluY2x1ZGVzKHByb3BlcnR5Lm5hbWUpKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Ly8gSW5jbHVkZSB0aGUgdGV4dCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHRleHQgYXJyYW5nZW1lbnRcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCwgcmVsYXRlZFByb3BlcnRpZXNJbmZvLCBuYW1lKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5wcm9wZXJ0eUluZm9zID0gcmVsYXRlZFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbYWRkaXRpb25hbFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbYWRkaXRpb25hbFByb3BlcnR5TmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cdFx0Ly8gSW4gY2FzZSBhIHByb3BlcnR5IGhhcyBkZWZpbmVkIGEgI1RleHRPbmx5IHRleHQgYXJyYW5nZW1lbnQgdGhhdCBwb2ludHMgdG8gYSB0ZXh0IHByb3BlcnR5IChhbmQgbm90IGEgJ2hhcmQgY29kZWQgdGV4dCcpIGRvbid0IG9ubHkgY3JlYXRlIHRoZSBjb21wbGV4IHByb3BlcnR5IHdpdGggdGhlIHRleHQgcHJvcGVydHkgYXMgYSBjaGlsZCBwcm9wZXJ0eSxcblx0XHQvLyBidXQgYWxzbyB0aGUgcHJvcGVydHkgaXRzZWxmIGFzIGl0IGNhbiBiZSB1c2VkIGFzIHdpdGhpbiB0aGUgc29ydENvbmRpdGlvbnMgb3Igb24gY3VzdG9tIGNvbHVtbnMuXG5cdFx0Ly8gVGhpcyBzdGVwIG11c3QgYmUgdmFsaWQgYWxzbyBmcm9tIHRoZSBjb2x1bW5zIGFkZGVkIHZpYSBMaW5lSXRlbXMgb3IgZnJvbSBhIGNvbHVtbiBhdmFpbGFibGUgb24gdGhlIHAxM24uXG5cdFx0aWYgKGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5Lm5hbWUpO1xuXHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0KSkge1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0KTtcblx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLmNvbmNhdChyZWxhdGVkQ29sdW1ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbHVtbiBkZWZpbml0aW9uIGZyb20gYSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBFbnRpdHkgdHlwZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGNvbHVtbiBpcyBjcmVhdGVkXG4gKiBAcGFyYW0gZnVsbFByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dFxuICogQHBhcmFtIHVzZURhdGFGaWVsZFByZWZpeCBTaG91bGQgYmUgcHJlZml4ZWQgd2l0aCBcIkRhdGFGaWVsZDo6XCIsIGVsc2UgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIFwiUHJvcGVydHk6OlwiXG4gKiBAcGFyYW0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgYXZhaWxhYmxlIGZvciBhZGFwdGF0aW9uXG4gKiBAcGFyYW0gYWdncmVnYXRpb25IZWxwZXIgVGhlIGFnZ3JlZ2F0aW9uSGVscGVyIGZvciB0aGUgZW50aXR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIGRlc2NyaXB0aW9uIG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhciBmb3IgdGhlIGNvbHVtblxuICogQHBhcmFtIHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUgVGhlIE1EQyBwYXRoIHVzZWQgZm9yIHRoZSAxOm4gcHJvcGVydHkgdG8gYWxsb3cgZmlsdGVyaW5nIGZyb20gTURDXG4gKiBAcmV0dXJucyBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gZGVmaW5pdGlvblxuICovXG5jb25zdCBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvPzogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZT86IHN0cmluZ1xuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uIHtcblx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eSk7XG5cdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocHJvcGVydHkpO1xuXHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5Lm5hbWUgPyBfc2xpY2VBdFNsYXNoKHByb3BlcnR5Lm5hbWUsIHRydWUsIGZhbHNlKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSBwcm9wZXJ0eS5uYW1lO1xuXHRjb25zdCBsYWJlbCA9IGdldExhYmVsKHByb3BlcnR5LCBpc0dyb3VwKTtcblx0Y29uc3QgZGF0YVR5cGUgPSBnZXREYXRhRmllbGREYXRhVHlwZShwcm9wZXJ0eSk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcocHJvcGVydHksIGRhdGFUeXBlKTtcblx0Y29uc3QgaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uID0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGl2ZVBhdGhdID09PSBcIkRlc2NyaXB0aW9uXCI7XG5cdGNvbnN0IHNvcnRhYmxlID1cblx0XHQoIWlzSGlkZGVuIHx8IGlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbikgJiYgIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uU29ydGFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IGZpbHRlcmFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCB0eXBlQ29uZmlnID0ge1xuXHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyxcblx0XHRjb25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdH07XG5cdGxldCBleHBvcnRTZXR0aW5nczogUHJvcGVydHlJbmZvW1wiZXhwb3J0U2V0dGluZ3NcIl0gPSBudWxsO1xuXHRpZiAoX2lzRXhwb3J0YWJsZUNvbHVtbihwcm9wZXJ0eSkpIHtcblx0XHRleHBvcnRTZXR0aW5ncyA9IGNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHR9XG5cdGNvbnN0IGF2YWlsYWJpbGl0eSA9ICFpc0hpZGRlbiAmJiBhdmFpbGFibGVGb3JBZGFwdGF0aW9uID8gXCJBZGFwdGF0aW9uXCIgOiBcIkhpZGRlblwiO1xuXHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhyZWxhdGl2ZVBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAocmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU7XG5cdH1cblx0Y29uc3QgbmFtZSA9IHVzZURhdGFGaWVsZFByZWZpeCA/IHJlbGF0aXZlUGF0aCA6IGBQcm9wZXJ0eTo6JHtyZWxhdGl2ZVBhdGh9YDtcblx0Y29uc3Qga2V5ID0gKHVzZURhdGFGaWVsZFByZWZpeCA/IFwiRGF0YUZpZWxkOjpcIiA6IFwiUHJvcGVydHk6OlwiKSArIHJlcGxhY2VTcGVjaWFsQ2hhcnMocmVsYXRpdmVQYXRoKTtcblxuXHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRrZXk6IGtleSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IHByb3BlcnR5LnR5cGUsXG5cdFx0bGFiZWw6IGxhYmVsID8/IHByb3BlcnR5Lm5hbWUsXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKHByb3BlcnR5KSA6IHVuZGVmaW5lZCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0ZmlsdGVyYWJsZTogZmlsdGVyYWJsZSxcblx0XHRpc0dyb3VwYWJsZTogYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSA/ICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBzb3J0YWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnIGFzIFByb3BlcnR5VHlwZUNvbmZpZyxcblx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCksXG5cdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgcHJvcGVydHksIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRhZGRpdGlvbmFsTGFiZWxzOiBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHNcblx0fTtcblx0X2FkZFRvb2xUaXAocHJvcGVydHksIGNvbHVtbik7XG5cdF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eSwgY29sdW1uKTtcblxuXHRpZiAoXG5cdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJlxuXHRcdE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSAmJlxuXHRcdChyZWxhdGl2ZVBhdGggPT09IFwiSGFzQWN0aXZlRW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIkhhc0RyYWZ0RW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIklzQWN0aXZlRW50aXR5XCIpXG5cdCkge1xuXHRcdC8vIEluIGNhc2Ugb2YgYW5hbHl0aWNhbCB0YWJsZSBvbiBhIGRyYWZ0LWVuYWJsZWQgZW50aXR5LCB3ZSBhbHdheXMgY29uc2lkZXIgdGhlIEhhc0RyYWZ0RW50aXR5LCBIYXNBY3RpdmVFbnRpdHkgYW5kIElzQWN0aXZlRW50aXR5IHByb3BlcnRpZXMgYXNcblx0XHQvLyB0ZWNobmljYWxseSBncm91cGFibGUsIGFzIHdlIG5lZWQgdG8gbG9hZCB0aGVtIGZvciBvdXIgaW50ZXJuYWwgbG9naWMuXG5cdFx0Y29sdW1uLmV4dGVuc2lvbiA9IHtcblx0XHRcdHRlY2huaWNhbGx5QWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gY29sdW1uO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBhIGxpbmUgaXRlbSBhcyBhIGRhdGEgZmllbGQgb3IgYSBwcm9wZXJ0eSBmcm9tIHRoZSBlbnRpdHkgdHlwZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGluIGEgdGhlIGdpdmVuIGNvbHVtblxuICovXG5jb25zdCBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0bGV0IHVuaXRQcm9wZXJ0eSwgdGltZXpvbmVQcm9wZXJ0eSwgdW5pdFRleHQsIHRpbWV6b25lVGV4dCwgdXRjLCBpc0FUaW1lem9uZSwgY3VycmVuY3lQcm9wZXJ0eSwgc2NhbGU7XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvID8gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpIDogW107XG5cdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8gJiYgcmVsYXRlZFByb3BlcnR5TmFtZXM/Lmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGJhc2VkIG9uIHRoZSByZWxhdGVkIChjaGlsZCkgcHJvcGVydHkgaW4gY2FzZSB0aGVyZSBpcyBvbmx5IG9uZS5cblx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gd2UgaGF2ZSBhIHRleHQgb25seSBhbm5vdGF0aW9uIHRvIGNvbXB1dGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmcm9tIHRoZSB0ZXh0IGluc3RlYWQgb2YgdGhlIHZhbHVlXG5cdFx0Y29sdW1uID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZXNbMF1dLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0fVxuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKGNvbHVtbik7XG5cdGlmIChpc1Byb3BlcnR5KGNvbHVtbikpIHtcblx0XHR1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KGNvbHVtbik7XG5cdFx0Y3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dW5pdFRleHQgPSBnZXRTdGF0aWNVbml0T3JDdXJyZW5jeShjb2x1bW4pO1xuXHRcdHRpbWV6b25lVGV4dCA9IGdldFN0YXRpY1RpbWV6b25lKGNvbHVtbik7XG5cdFx0aXNBVGltZXpvbmUgPSBpc1RpbWV6b25lKGNvbHVtbik7XG5cdFx0c2NhbGUgPSBjb2x1bW4uc2NhbGU7XG5cdH1cblx0dW5pdFByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udW5pdFByb3BlcnR5ID8/IHVuaXRQcm9wZXJ0eT8ubmFtZSA/PyBjdXJyZW5jeVByb3BlcnR5Py5uYW1lO1xuXHR0aW1lem9uZVByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udGltZXpvbmVQcm9wZXJ0eSA/PyB0aW1lem9uZVByb3BlcnR5Py5uYW1lO1xuXHRzY2FsZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnNjYWxlID8/IHNjYWxlO1xuXHRjb25zdCBleHBvcnRUeXBlID0gZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGUsIGlzQVRpbWV6b25lLCAhIWN1cnJlbmN5UHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MpO1xuXHRpZiAodGltZXpvbmVQcm9wZXJ0eSB8fCAoZXhwb3J0VHlwZSA9PT0gXCJEYXRlVGltZVwiICYmICF0aW1lem9uZVRleHQpKSB7XG5cdFx0dXRjID0gZmFsc2U7XG5cdH1cblx0Y29uc3QgZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzID0ge1xuXHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0aW5wdXRGb3JtYXQ6IGdldERhdGVJbnB1dEZvcm1hdChkYXRhVHlwZSksXG5cdFx0ZGVsaW1pdGVyOiBnZXREZWxpbWl0ZXIoZGF0YVR5cGUpLFxuXHRcdHNjYWxlOiBzY2FsZSxcblx0XHR1bml0UHJvcGVydHk6IHVuaXRQcm9wZXJ0eSxcblx0XHR1bml0OiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnVuaXQgPz8gdW5pdFRleHQsXG5cdFx0dGltZXpvbmVQcm9wZXJ0eTogdGltZXpvbmVQcm9wZXJ0eSxcblx0XHR0aW1lem9uZTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA/PyB0aW1lem9uZVRleHQ/LnRvU3RyaW5nKCksXG5cdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUsXG5cdFx0Ly9vbmx5IGluIGNhc2Ugb2YgY29tcGxleCBwcm9wZXJ0aWVzLCB3cmFwIHRoZSBjZWxsIGNvbnRlbnRcdG9uIHRoZSBleGNlbCBleHBvcnRlZCBmaWxlXG5cdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy53cmFwLFxuXHRcdHV0YzogdXRjXG5cdH07XG5cdGlmIChleHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgfHwgZXhwb3J0U2V0dGluZ3MudW5pdCkge1xuXHRcdGV4cG9ydFNldHRpbmdzLmF1dG9TY2FsZSA9IHRydWU7XG5cdH1cblx0cmV0dXJuIHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyhleHBvcnRTZXR0aW5ncyk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBmb3JtYXQgdGVtcGxhdGUgZm9yIGNvbHVtbnMgd2l0aCBkYXRlcy5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRoZSBpbnB1dEZvcm1hdFxuICovXG5jb25zdCBnZXREYXRlSW5wdXRGb3JtYXQgPSBmdW5jdGlvbiAoZGF0YVR5cGU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkZWxpbWl0ZXIgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogVGhlIGRlbGltaXRlciBpcyB1c2VkIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUcnVlIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnNcbiAqL1xuY29uc3QgZ2V0RGVsaW1pdGVyID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBkYXRhVHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2JqZWN0IG9mIGEgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBleHBvcnQgc2V0dGluZ3MgY29uZmlndXJhdGlvbnMgZm9yIGEgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICovXG5jb25zdCByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzKTogQ29sdW1uRXhwb3J0U2V0dGluZ3Mge1xuXHQvL1JlbW92ZSB1bmRlZmluZWQgc2V0dGluZ3MgZnJvbSBleHBvcnRTZXR0aW5nIG9iamVjdFxuXHRmb3IgKGNvbnN0IHNldHRpbmcgaW4gZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRpZiAoZXhwb3J0U2V0dGluZ3Nbc2V0dGluZyBhcyBrZXlvZiBDb2x1bW5FeHBvcnRTZXR0aW5nc10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVsZXRlIGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0U2V0dGluZ3M7XG59O1xuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciBleHBvcnRhYmxlIGNvbHVtbnMsIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5zLlxuICogQHBhcmFtIHNvdXJjZSBUaGUgZGF0YUZpZWxkIG9yIHByb3BlcnR5IHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVHJ1ZSBmb3IgZXhwb3J0YWJsZSBjb2x1bW4sIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gX2lzRXhwb3J0YWJsZUNvbHVtbihzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IGJvb2xlYW4ge1xuXHRsZXQgcHJvcGVydHlUeXBlLCBwcm9wZXJ0eTtcblx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5ID0gKHNvdXJjZSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRpZiAoaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRwcm9wZXJ0eVR5cGUgPSBkYXRhRmllbGREZWZhdWx0UHJvcGVydHk/LiRUeXBlO1xuXHR9IGVsc2UgaWYgKGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0cHJvcGVydHkgPSBzb3VyY2U7XG5cdFx0cHJvcGVydHlUeXBlID0gcHJvcGVydHkuJFR5cGU7XG5cdFx0aWYgKHByb3BlcnR5VHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0Ly9Gb3IgQ2hhcnRcblx0XHRcdHByb3BlcnR5VHlwZSA9IChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlO1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5VHlwZSAhPT0gdW5kZWZpbmVkICYmICFVSUFubm90YXRpb25UeXBlcy5DaGFydERlZmluaXRpb25UeXBlLmluY2x1ZGVzKHByb3BlcnR5VHlwZSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdChwcm9wZXJ0eSBhcyBEYXRhRmllbGQpLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uTWVkaWFUeXBlPy50ZXJtID09PSBcIk9yZy5PRGF0YS5Db3JlLlYxLk1lZGlhVHlwZVwiICYmXG5cdFx0XHQocHJvcGVydHkgYXMgRGF0YUZpZWxkKS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/LmlzVVJMICE9PSB0cnVlXG5cdFx0KSB7XG5cdFx0XHQvL0ZvciBTdHJlYW1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VHlwZVxuXHRcdD8gIVtcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdFx0ICBdLmluY2x1ZGVzKHByb3BlcnR5VHlwZSlcblx0XHQ6IHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBUb2RvOiBSZXBsYWNlIHdpdGggcHJvcGVyIExvZyBzdGF0ZW1lbnQgb25jZSBhdmFpbGFibGVcblx0XHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgdGhlIHZpc2liaWxpdHkgb2YgYSBEYXRhRmllbGQgb3IgRGF0YVBvaW50IGFubm90YXRpb24uXG4gKlxuICogU0FQIEZpb3JpIGVsZW1lbnRzIHdpbGwgZXZhbHVhdGUgZWl0aGVyIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBkZWZpbmVkIG9uIHRoZSBhbm5vdGF0aW9uIGl0c2VsZiBvciBvbiB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICogQHBhcmFtIGRhdGFGaWVsZE1vZGVsUGF0aCBUaGUgbWV0YXBhdGggcmVmZXJyaW5nIHRvIHRoZSBhbm5vdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGJ5IFNBUCBGaW9yaSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5jb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQgPSAvKmZvcm1hdE9wdGlvbnM/LmlzQW5hbHl0aWNzID8gVUkuSXNFeHBhbmRlZCA6Ki8gY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gLypmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IGVxdWFsKFVJLk5vZGVMZXZlbCwgMCkgOiovIGNvbnN0YW50KGZhbHNlKTtcblx0Ly8gQSBkYXRhIGZpZWxkIGlzIHZpc2libGUgaWY6XG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgdGFyZ2V0IHByb3BlcnR5IGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIGluIGNhc2Ugb2YgQW5hbHl0aWNzIGl0J3Mgbm90IHZpc2libGUgZm9yIGFuIGV4cGFuZGVkIEdyb3VwSGVhZGVyXG5cdHJldHVybiBhbmQoXG5cdFx0Li4uW1xuXHRcdFx0bm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHQhIXByb3BlcnR5VmFsdWUsXG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgJiYgbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpLFxuXHRcdFx0b3Iobm90KGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQpLCBpc0FuYWx5dGljYWxMZWFmKVxuXHRcdF1cblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBoaWRkZW4gYmluZGluZyBleHByZXNzaW9ucyBmb3IgYSBmaWVsZCBncm91cC5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cCBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIENvbXBpbGUgYmluZGluZyBvZiBmaWVsZCBncm91cCBleHByZXNzaW9ucy5cbiAqL1xuY29uc3QgX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRpZiAoZGF0YUZpZWxkR3JvdXA/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGRHcm91cC5hbm5vdGF0aW9ucy5VSS5IaWRkZW4pLCB0cnVlKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxcblx0XHRcdFx0XHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHRcdFx0XHQ+KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKG9yKC4uLmZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyksIGNvbnN0YW50KHRydWUpLCBjb25zdGFudChmYWxzZSkpKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHByb3BlcnR5IGFuZCBkYXRhRmllbGQuXG4gKiBAcGFyYW0gW3Byb3BlcnR5XSBQcm9wZXJ0eSwgRGF0YUZpZWxkIG9yIE5hdmlnYXRpb24gUHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBpc0dyb3VwXG4gKiBAcmV0dXJucyBMYWJlbCBvZiB0aGUgcHJvcGVydHkgb3IgRGF0YUZpZWxkXG4gKi9cbmNvbnN0IGdldExhYmVsID0gZnVuY3Rpb24gKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHksIGlzR3JvdXAgPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSB8fCBpc05hdmlnYXRpb25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRjb25zdCBkYXRhRmllbGREZWZhdWx0ID0gKHByb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWwpIHtcblx0XHRcdHJldHVybiBkYXRhRmllbGREZWZhdWx0LkxhYmVsPy50b1N0cmluZygpO1xuXHRcdH1cblx0XHRyZXR1cm4gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSA/PyBwcm9wZXJ0eS5uYW1lO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMocHJvcGVydHkpKSB7XG5cdFx0aWYgKCEhaXNHcm91cCAmJiBwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwsIFtdLCBwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8ubmFtZSlcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpID8/XG5cdFx0XHRjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gcHJvcGVydHkuTGFiZWw/LnRvU3RyaW5nKCk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24gKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFzb3VyY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkgfHwgc291cmNlLmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mbykge1xuXHRcdHJldHVybiBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc291cmNlLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gc291cmNlLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQ7XG5cdFx0cmV0dXJuIGRhdGFwb2ludFRhcmdldD8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShjb2xOYW1lOiBzdHJpbmcsIGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXA/OiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRjb2xOYW1lLFxuXHRcdFx0aXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdF0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZC5cbiAqL1xuY29uc3QgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KGRhdGFNb2RlbE9iamVjdFBhdGgsIG5hbWUpO1xuXHRcdGlmIChpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpKSB7XG5cdFx0XHRjb25zdCBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eU9iamVjdFBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGhcblx0XHRcdCk7XG5cdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aCA/PyBuYW1lO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRlZENvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDYXNlIDE6IEtleSBjb250YWlucyBEYXRhRmllbGQgcHJlZml4IHRvIGVuc3VyZSBhbGwgcHJvcGVydHkgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGtleSBmb3JtYXQuXG5cdFx0XHQvLyBOZXcgY3JlYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaXMgc2V0IHRvIGhpZGRlbi5cblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHQpO1xuXHRcdFx0Y29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zLCBuYW1lLCBjb2x1bW4pO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRlZENvbHVtbi5hbm5vdGF0aW9uUGF0aCAhPT0gYW5ub3RhdGlvblBhdGggfHwgcmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHQvLyBDYXNlIDI6IFRoZSBleGlzdGluZyBjb2x1bW4gcG9pbnRzIHRvIGEgTGluZUl0ZW0gKG9yKVxuXHRcdFx0Ly8gQ2FzZSAzOiBUaGlzIGlzIGEgc2VsZiByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBjb2x1bW5cblx0XHRcdGNvbnN0IG5ld05hbWUgPSBgUHJvcGVydHk6OiR7bmFtZX1gO1xuXHRcdFx0Ly8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLlxuXHRcdFx0aWYgKCFleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkpIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IHByb3BlcnR5IGNvbHVtbiB3aXRoICdQcm9wZXJ0eTo6JyBwcmVmaXgsXG5cdFx0XHRcdC8vIFNldCBpdCB0byBoaWRkZW4gYXMgaXQgaXMgb25seSBjb25zdW1lZCBieSBDb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkgJiZcblx0XHRcdFx0ZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLnByb3BlcnR5SW5mb3M/LmluY2x1ZGVzKG5hbWUpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEdldHRpbmcgdGhlIENvbHVtbiBOYW1lXG4gKiBJZiBpdCBwb2ludHMgdG8gYSBEYXRhRmllbGQgd2l0aCBvbmUgcHJvcGVydHkgb3IgRGF0YVBvaW50IHdpdGggb25lIHByb3BlcnR5LCBpdCB3aWxsIHVzZSB0aGUgcHJvcGVydHkgbmFtZVxuICogaGVyZSB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGV4aXN0aW5nIGZsZXggY2hhbmdlcy5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgVGhlIG5hbWUgb2YgYW5ub3RhdGlvbiBjb2x1bW5zXG4gKi9cbmNvbnN0IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIG5lZWRlZCBhcyB3ZSBoYXZlIGZsZXhpYmlsaXR5IGNoYW5nZXMgYWxyZWFkeSB0aGF0IHdlIGhhdmUgdG8gY2hlY2sgYWdhaW5zdFxuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aCkge1xuXHRcdHJldHVybiBkYXRhRmllbGQuVmFsdWU/LnBhdGg7XG5cdH0gZWxzZSBpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy5wYXRoKSB7XG5cdFx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZpbmcgZHVwbGljYXRlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCAnUHJvZ3Jlc3MnIFByb3BlcnR5IGlzIHJlbW92ZWQgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgRGF0YVBvaW50XG5cdFx0cmV0dXJuIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0fVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhIGZpZWxkIGxhYmVscyBoYXZlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZmllbGRHcm91cE5hbWUgVGhlIGBEYXRhRmllbGRgIG5hbWUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsID0gZnVuY3Rpb24gKFxuXHRmaWVsZEdyb3VwTmFtZTogc3RyaW5nLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBjb2x1bW5zID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCk/LmNvbHVtbnM7XG5cdGNvbnN0IGNvbHVtbktleXMgPSBjb2x1bW5zICYmIE9iamVjdC5rZXlzKGNvbHVtbnMpO1xuXHRyZXR1cm4gKFxuXHRcdGNvbHVtbktleXMgJiZcblx0XHQhIWNvbHVtbktleXMuZmluZChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBrZXkgPT09IGZpZWxkR3JvdXBOYW1lICYmIChjb2x1bW5zW2tleV0gYXMgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUpLnNob3dEYXRhRmllbGRzTGFiZWw7XG5cdFx0fSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgd2l0aCByZXNwZWN0IHRvIHRoZSByb290IGVudGl0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGBEYXRhRmllbGRgIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRoXG4gKi9cbmNvbnN0IF9nZXRSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aCA9IFwiXCI7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy5wYXRoO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gZGF0YUZpZWxkPy5UYXJnZXQ/LnZhbHVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb25Hcm91cDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0XHRcdGJyZWFrO1xuXHR9XG5cdHJldHVybiByZWxhdGl2ZVBhdGg7XG59O1xuXG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRjb25zdCBpU2xhc2hJbmRleCA9IGlzTGFzdFNsYXNoID8gcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgOiBwYXRoLmluZGV4T2YoXCIvXCIpO1xuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgY29sdW1uIGNvbnRhaW5zIGEgbXVsdGktdmFsdWUgZmllbGQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIERhdGFGaWVsZCBjb3JyZXNwb25kcyB0byBhIG11bHRpLXZhbHVlIGZpZWxkLlxuICovXG5jb25zdCBfaXNDb2x1bW5NdWx0aVZhbHVlZCA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZC5WYWx1ZSkpIHtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRkYXRhRmllbGQuVmFsdWUucGF0aFxuXHRcdCk7XG5cdFx0cmV0dXJuIGlzTXVsdGlWYWx1ZUZpZWxkKHByb3BlcnR5T2JqZWN0UGF0aCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgY29sdW1uIGlzIHNvcnRhYmxlLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZVxuICovXG5jb25zdCBfaXNDb2x1bW5Tb3J0YWJsZSA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkgJiYgLy8gQ29sdW1uIGlzIG5vdCBtYXJrZWQgYXMgbm9uLXNvcnRhYmxlIHZpYSBhbm5vdGF0aW9uXG5cdFx0KCgoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpLnNvbWUoKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcHJvcE5hbWVdLmFubm90YXRpb25Qcm9wZXJ0eSk7XG5cdFx0XHRcdHJldHVybiAhaXNIaWRkZW4gJiYgIW5vblNvcnRhYmxlQ29sdW1ucy5pbmNsdWRlcyhwcm9wTmFtZSk7XG5cdFx0XHR9KSkgfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb24pXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyRnVuY3Rpb25zOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRnVuY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKHVuZGVmaW5lZCwgZmlsdGVyRnVuY3Rpb25zKTtcbn07XG5cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJGdW5jdGlvbnMoQ29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogRmlsdGVyRnVuY3Rpb25zIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0aWYgKFR5cGVHdWFyZHMuaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnMgPz9cblx0XHRcdENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5Q29udGFpbmVyKCkuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnNcblx0XHQpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIGZvciB0ZXh0IGZpZWxkcyBpbiBhIHRhYmxlLlxuICogQHBhcmFtIGZvcm1hdE9wdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZSB8IHVuZGVmaW5lZCk6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZFxuXHRcdD8gdW5kZWZpbmVkXG5cdFx0OiB7XG5cdFx0XHRcdHRleHRMaW5lc0VkaXQ6IDQsXG5cdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnNcblx0XHQgIH07XG59XG5cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSwgbmFtZTogc3RyaW5nKTogeyB2YWx1ZXM6IHN0cmluZ1tdOyBzZW1hbnRpY0tleUZvdW5kOiBib29sZWFuIH0ge1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbWFudGljS2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGFTZW1hbnRpY0tleVZhbHVlcy5wdXNoKHNlbWFudGljS2V5c1tpXS52YWx1ZSk7XG5cdFx0aWYgKHNlbWFudGljS2V5c1tpXS52YWx1ZSA9PT0gbmFtZSkge1xuXHRcdFx0YlNlbWFudGljS2V5Rm91bmQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHZhbHVlczogYVNlbWFudGljS2V5VmFsdWVzLFxuXHRcdHNlbWFudGljS2V5Rm91bmQ6IGJTZW1hbnRpY0tleUZvdW5kXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9maW5kUHJvcGVydGllcyhcblx0c2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdLFxuXHRmaWVsZEdyb3VwUHJvcGVydGllczogc3RyaW5nW11cbik6IHsgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogYm9vbGVhbjsgZmllbGRHcm91cFByb3BlcnR5UGF0aD86IHN0cmluZyB9IHtcblx0bGV0IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAgPSBmYWxzZTtcblx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdGlmIChzZW1hbnRpY0tleVZhbHVlcyAmJiBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGggPj0gMSAmJiBmaWVsZEdyb3VwUHJvcGVydGllcyAmJiBmaWVsZEdyb3VwUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChbc2VtYW50aWNLZXlWYWx1ZXNbaV1dLnNvbWUoKHRtcCkgPT4gZmllbGRHcm91cFByb3BlcnRpZXMuaW5jbHVkZXModG1wKSkpIHtcblx0XHRcdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IHRydWU7XG5cdFx0XHRcdHNQcm9wZXJ0eVBhdGggPSBzZW1hbnRpY0tleVZhbHVlc1tpXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiBzUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgZmlyc3QgcHJvcGVydHkgaW4gdGhlIGZpZWxkR3JvdXAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzZW1hbnRpYyBrZXlzLlxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlWYWx1ZXNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGEgZmxhZyB0cnVlIGlmIGEgcHJvcGVydHkgaXMgZm91bmQgYW5kIGEgcHJvcGVydHlQYXRoLlxuICovXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGwsXG5cdHNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBwcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSB7XG5cdC8vIHRoaXMgaW5mbyBpcyB1c2VkIGluIEZpZWxkSGVscGVyI2lzRHJhZnRJbmRpY2F0b3JWaXNpYmxlSW5GaWVsZEdyb3VwIHRvIHNob3cgYSBkcmFmdCBpbmRpY2F0b3IgYXQgdGhlIGVuZCBvZiBhIGZpZWxkIGdyb3VwXG5cdGNvbnN0IGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgX3Byb3BlcnRpZXNGb3VuZDogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0gPSB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogZmFsc2UsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogdW5kZWZpbmVkXG5cdH07XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cCAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmXG5cdFx0XHRcdGlubmVyRGF0YUZpZWxkLlZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChpbm5lckRhdGFGaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdH1cblx0XHRcdF9wcm9wZXJ0aWVzRm91bmQgPSBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXMsIGFQcm9wZXJ0aWVzKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IF9wcm9wZXJ0aWVzRm91bmQuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRwcm9wZXJ0eVBhdGg6IF9wcm9wZXJ0aWVzRm91bmQuZmllbGRHcm91cFByb3BlcnR5UGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXBcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oXG5cdG5hbWU6IHN0cmluZyxcblx0c2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSxcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsXG4pOiBQYXJ0aWFsPHtcblx0ZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdGZpZWxkR3JvdXBOYW1lOiBzdHJpbmc7XG5cdHNob3dFcnJvck9iamVjdFN0YXR1czogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGhhc0RyYWZ0SW5kaWNhdG9yOiBib29sZWFuO1xufT4ge1xuXHRpZiAoIXNlbWFudGljS2V5cykge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleSA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzLCBuYW1lKTtcblx0Y29uc3Qgc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKGRhdGFGaWVsZEdyb3VwLCBzZW1hbnRpY0tleS52YWx1ZXMpO1xuXHRpZiAoc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCkge1xuXHRcdC8vIFNlbWFudGljIEtleSBoYXMgYSBwcm9wZXJ0eSBpbiBhIEZpZWxkR3JvdXBcblx0XHRyZXR1cm4ge1xuXHRcdFx0Ly9UT0RPIHdlIHNob3VsZCByYXRoZXIgc3RvcmUgaGFzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXBcblx0XHRcdGZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAucHJvcGVydHlQYXRoLFxuXHRcdFx0ZmllbGRHcm91cE5hbWU6IG5hbWUsXG5cdFx0XHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IGNvbXBpbGVFeHByZXNzaW9uKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkobmFtZSwgdHJ1ZSkpXG5cdFx0fTtcblx0fSBlbHNlIGlmIChzZW1hbnRpY0tleS5zZW1hbnRpY0tleUZvdW5kKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhhc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KG5hbWUsIGZhbHNlKSlcblx0XHR9O1xuXHR9XG5cdHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gX2dldEltcE51bWJlcihkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogbnVtYmVyIHtcblx0Y29uc3QgaW1wb3J0YW5jZSA9IGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlIGFzIHN0cmluZztcblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0hpZ2hcIikpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTWVkaXVtXCIpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0xvd1wiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBvZiBhIGNvbHVtbiBjb250YWluaW5nIGRhdGFwb2ludHMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gYSBnaXZlbiBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRhcmdldFZhbHVlZnJvbURQID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChwcm9wZXJ0eSk7XG5cdGlmIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdHR5cGVvZiB0YXJnZXRWYWx1ZWZyb21EUCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncyAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncz8udW5pdCAhPT0gXCIlXCJcblx0KSB7XG5cdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWVmcm9tRFA7XG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlID0gXCJ7MH0vXCIgKyB0YXJnZXRWYWx1ZWZyb21EUDtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wb3J0YW5jZSB2YWx1ZSBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZFxuICogQHJldHVybnMgVGhlIGltcG9ydGFuY2UgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydGFuY2UoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkXG4pOiBJbXBvcnRhbmNlIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFkYXRhRmllbGQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleSA/PyBbXTtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBoaWdoS2V5cyA9IFsuLi5zZW1hbnRpY0tleXMsIC4uLnJlcXVpcmVkUHJvcGVydGllc10ubWFwKChwcm9wZXJ0eVBhdGgpID0+IHByb3BlcnR5UGF0aC4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHQvL0V2YWx1YXRlIGRlZmF1bHQgSW1wb3J0YW5jZSBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcblx0bGV0IGZpZWxkc1dpdGhJbXBvcnRhbmNlO1xuXHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPERhdGFGaWVsZEZvckFubm90YXRpb24+KGRhdGFGaWVsZCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKSkge1xuXHRcdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSBkYXRhRmllbGRUYXJnZXQuRGF0YTtcblx0XHRcdC8vSWYgYSBGaWVsZEdyb3VwIGNvbnRhaW5zIGEgc2VtYW50aWNLZXkgb3IgcmVxdWlyZWQgcHJvcGVydHksIGltcG9ydGFuY2Ugc2V0IHRvIEhpZ2hcblx0XHRcdGlmIChcblx0XHRcdFx0ZmllbGRHcm91cERhdGEuc29tZShmdW5jdGlvbiAoZmllbGRHcm91cERhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGZpZWxkR3JvdXBEYXRhRmllbGQpICYmIGhpZ2hLZXlzLmluY2x1ZGVzKGZpZWxkR3JvdXBEYXRhRmllbGQuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBJbXBvcnRhbmNlLkhpZ2g7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL0lmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBJbXBvcnRhbmNlIHdlIHRha2UgaXRcblx0XHRcdFx0aWYgKGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBlbHNlIHRoZSBoaWdoZXN0IGltcG9ydGFuY2UgKGlmIGFueSkgaXMgcmV0dXJuZWRcblx0XHRcdFx0ZmllbGRzV2l0aEltcG9ydGFuY2UgPSBmaWVsZEdyb3VwRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbT8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkc1dpdGhJbXBvcnRhbmNlIGFzIERhdGFGaWVsZFR5cGVzW10pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaGlnaEtleXMuaW5jbHVkZXMoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQ/IEltcG9ydGFuY2UuSGlnaFxuXHRcdDogX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgbGluZSBpdGVtcyBmcm9tIG1ldGFkYXRhIGFubm90YXRpb25zLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHdpdGggdGhlaXIgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZTogRW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5PiA9IHt9LFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPiA9IHt9LFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKSxcblx0XHRkZWZhdWx0Q3JlYXRpb25Nb2RlID1cblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0U2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24oKT8ubWFjcm9zPy50YWJsZT8uZGVmYXVsdENyZWF0aW9uTW9kZSA9PT1cblx0XHRcdFwiSW5saW5lQ3JlYXRpb25Sb3dzXCJcblx0XHRcdFx0PyBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUgPVxuXHRcdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5jcmVhdGlvbk1vZGU/Lm5hbWUgPz8gZGVmYXVsdENyZWF0aW9uTW9kZSA/PyBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRjb25zdCBzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5ID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNLZXksIFtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRdKVswXSBhcyBTZW1hbnRpY0tleTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IHRhYmxlQ29udmVydGVyQ29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcjxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Z2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSlcblx0XHQpO1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQpID0+IHtcblx0XHRcdC8vIFRPRE86IHZhcmlhYmxlIG5hbWUgc2hvdWxkIGJlIGRhdGFmaWVsZCBhbmQgbm90IGxpbmVJdGVtXG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGRhdGFGaWVsZCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGV4cG9ydFNldHRpbmdzOiBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSA9IG51bGw7XG5cdFx0XHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID1cblx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0PyBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gX2dldFJlbGF0aXZlUGF0aChkYXRhRmllbGQpO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByZWxhdGl2ZVBhdGggPyBfc2xpY2VBdFNsYXNoKHJlbGF0aXZlUGF0aCwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSByZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBsYWJlbCA9IGdldExhYmVsKGRhdGFGaWVsZCwgaXNHcm91cCk7XG5cdFx0XHRjb25zdCBuYW1lID0gX2dldEFubm90YXRpb25Db2x1bW5OYW1lKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGggPyBncm91cFBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXB9YCkgOiBmYWxzZTtcblx0XHRcdGNvbnN0IHNob3dEYXRhRmllbGRzTGFiZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBpc0ZpZWxkR3JvdXBDb2x1bW5cblx0XHRcdFx0PyBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbChuYW1lLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dClcblx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXREYXRhRmllbGREYXRhVHlwZShkYXRhRmllbGQpO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lLCBzZW1hbnRpY0tleXMsIGRhdGFGaWVsZCkpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4oXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGhcblx0XHRcdCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBhIHNpdHVhdGlvbnMgaW5kaWNhdG9yXG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wcyA9IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbHRlcihcblx0XHRcdFx0KG5hdmlnYXRpb25Qcm9wZXJ0eSkgPT5cblx0XHRcdFx0XHQhbmF2aWdhdGlvblByb3BlcnR5LmlzQ29sbGVjdGlvbiAmJlxuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU0FQT2JqZWN0Tm9kZVR5cGU/Lk5hbWUgPT09IFwiQnVzaW5lc3NTaXR1YXRpb25cIlxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQgPSBzaXR1YXRpb25zTmF2UHJvcHMubGVuZ3RoID49IDEgPyBzaXR1YXRpb25zTmF2UHJvcHNbMF0gOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc2l0dWF0aW9uc05hdlByb3AgJiYgZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRmb3JtYXRPcHRpb25zLmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRcdGlmIChcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMoZGF0YUZpZWxkKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzTXVsdGlWYWx1ZSA9IF9pc0NvbHVtbk11bHRpVmFsdWVkKGRhdGFGaWVsZCwgdGFibGVDb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGlmICghaXNNdWx0aVZhbHVlICYmIF9pc0V4cG9ydGFibGVDb2x1bW4oZGF0YUZpZWxkKSkge1xuXHRcdFx0XHQvL2V4Y2x1ZGUgdGhlIHR5cGVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlIEV4cG9ydCAoZ2VuZXJhdGVzIGVycm9yIG9uIEV4cG9ydCBhcyBQREYpXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzID0gY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MoZGF0YUZpZWxkLCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKGRhdGFUeXBlKSB7XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcoZGF0YUZpZWxkLCBkYXRhVHlwZSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0eXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdFx0XHRcdGNsYXNzTmFtZTogZGF0YVR5cGUgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0Li4ucHJvcGVydHlUeXBlQ29uZmlnPy5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNvbnN0cmFpbnRzOiBwcm9wZXJ0eVR5cGVDb25maWc/LmNvbnN0cmFpbnRzXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgdmlzdWFsU2V0dGluZ3M6IFZpc3VhbFNldHRpbmdzID0ge307XG5cdFx0XHRpZiAoIWRhdGFUeXBlIHx8ICF0eXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzb3J0YWJsZSA9XG5cdFx0XHRcdCFpc011bHRpVmFsdWUgJiZcblx0XHRcdFx0X2lzQ29sdW1uU29ydGFibGUoZGF0YUZpZWxkLCByZWxhdGl2ZVBhdGgsIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHRjb25zdCBhdmFpbGFiaWxpdHkgPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpID8gXCJIaWRkZW5cIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0Y29uc3QgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCA/PyBuYW1lLFxuXHRcdFx0XHRncm91cExhYmVsOiBpc0dyb3VwID8gZ2V0TGFiZWwoZGF0YUZpZWxkKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0XHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRzaG93RGF0YUZpZWxkc0xhYmVsOiBzaG93RGF0YUZpZWxkc0xhYmVsLFxuXHRcdFx0XHRyZXF1aXJlZDogaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMsIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBzb3J0YWJsZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID8gcmVsYXRlZFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zOiBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0d2lkdGg6IChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LkhUTUw1Py5Dc3NEZWZhdWx0cz8ud2lkdGg/LnZhbHVlT2YoKSBhcyBzdHJpbmcpIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZShjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3MgYXMgUHJvcGVydHlJbmZvW1widmlzdWFsU2V0dGluZ3NcIl0sXG5cdFx0XHRcdHRpbWV6b25lVGV4dDogZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lLFxuXHRcdFx0XHRpc1BhcnRPZkxpbmVJdGVtOiB0cnVlLFxuXHRcdFx0XHRkYXRhVHlwZTogZGF0YVR5cGUgPz8gKFwiRWRtLlN0cmluZ1wiIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUpLFxuXHRcdFx0XHRpc011bHRpVmFsdWVcblx0XHRcdH07XG5cdFx0XHRjb25zdCB0b29sdGlwID0gX2dldFRvb2x0aXAoZGF0YUZpZWxkKSA/PyBsYWJlbDtcblx0XHRcdGlmICh0b29sdGlwKSB7XG5cdFx0XHRcdGNvbHVtbi50b29sdGlwID0gdG9vbHRpcDtcblx0XHRcdH1cblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgbXVsdGktdmFsdWUsIHJlbGF0ZWQgcHJvcGVydGllcyBjYW5ub3QgYmUgc29ydGVkIGFzIHdlIGdvIHRocm91Z2ggYSAxLW4gcmVsYXRpb25cblx0XHRcdFx0aWYgKGlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGVkUHJvcGVydHlOYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGxpbmVJdGVtIHBvaW50cyB0byBhIG5hdmlnYXRpb24gcHJvcGVydHkgd2l0aCBhIHRleHRBcnJhbmdlbWVudCBUZXh0T25seSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuXHRcdFx0XHQvLyBUaGUgdGV4dCBwcm9wZXJ0eSBpcyByZWZlcmVuY2VkIG9uIHRoZSByZWxhdGVkIHByb3BlcnRpZXMgb2YgdGhlIGxpbmVJdGVtLCBzbyB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIF9jcmVhdGVSZWxhdGVkQ29sdW1ucyBtZXRob2QuXG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0Y3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seShcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0XHRcdFx0XHRyZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFthZGRpdGlvbmFsUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlOYW1lXTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdC8vIEdldCBjb2x1bW5zIGZyb20gdGhlIFByb3BlcnRpZXMgb2YgRW50aXR5VHlwZVxuXHRyZXR1cm4gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVUeXBlLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdCk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIG1hbmlmZXN0IGFuZCBjaGVja3MgYWdhaW5zdCBleGlzdGluZyBwcm9wZXJ0aWVzIGFscmVhZHkgYWRkZWQgYnkgYW5ub3RhdGlvbnMuXG4gKiBJZiBhIG5vdCB5ZXQgc3RvcmVkIHByb3BlcnR5IGlzIGZvdW5kIGl0IGFkZHMgaXQgZm9yIHNvcnRpbmcgYW5kIGZpbHRlcmluZyBvbmx5IHRvIHRoZSBhbm5vdGF0aW9uQ29sdW1ucy5cbiAqIEBwYXJhbSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgX2dldFByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRsZXQgbWF0Y2hlZFByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXHRpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzKSkge1xuXHRcdG1hdGNoZWRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0e31cblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBtYXRjaGVkUHJvcGVydGllcztcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZmllbGQgZ3JvdXAgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBmaWVsZEdyb3VwIFRoZSBmaWVsZEdyb3VwIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZEdyb3VwIGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRmllbGRHcm91cCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRmaWVsZEdyb3VwOiBGaWVsZEdyb3VwLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0Y29uc3QgZmllbGRHcm91cERhdGEgPSBmaWVsZEdyb3VwLkRhdGE7XG5cdHJldHVybiBmaWVsZEdyb3VwRGF0YS5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0Ly8gd2UgZXhjbHVkZSBib29sZWFuIHR5cGUsIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSB1bmRlcmx5aW5nIGNoZWNrIGJveCBlbXB0eSBvbiBwdXJwb3NlXG5cdFx0aWYgKGlzRGF0YUZpZWxkKGl0ZW0pICYmIGl0ZW0/LlZhbHVlPy4kdGFyZ2V0LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGl0ZW0pIHx8XG5cdFx0XHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShpdGVtLlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIHByb3BlcnR5IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24gPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdGNvbnN0IERhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkgPSBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbik7XG5cdC8vIENoZWNrIGlmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50cyB0byBhIEZpZWxkR3JvdXBcblx0aWYgKGhhc0ZpZWxkR3JvdXBUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRpZiAoaXNSZXF1aXJlZEZpZWxkR3JvdXAoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXAsIHRhYmxlQ3JlYXRpb25Nb2RlKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gKGRhdGFGaWVsZFRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhO1xuXHRcdHJldHVybiBmaWVsZEdyb3VwRGF0YS5zb21lKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0cmV0dXJuIGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgaW5uZXJEYXRhRmllbGQsIHRhYmxlQ3JlYXRpb25Nb2RlKTtcblx0XHR9KTtcblx0fVxuXHQvKklmIHRoZSB1bmRlcmx5aW5nIGRhdGFwb2ludCBpcyBhIHJhdGluZyBpbmRpY2F0b3IsIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSByYXRpbmcgZW1wdHkgKHZhbHVlIDApIG9uIHB1cnBvc2UuXG5cdEJlc2lkZXMsIGN1cnJlbnRseSwgb25seSBhIGZpZWxkQ29udHJvbCBzZXQgb24gYSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgZGF0YVBvaW50IGhhcyBhbiBpbmZsdWVuY2UgaW4gdGhlIHRhYmxlLlxuXHRBY2NvcmRpbmdseSwgaWYgYSBkYXRhcG9pbnQgY29tZXMgZnJvbSBhIGRhdGFGaWVsZEZvckFubm90YXRpb24gd2l0aCBhIGZpZWxkQ29udHJvbCBzZXQgYXMgbm90IG1hbmRhdG9yeSwgdGhpcyBkYXRhUG9pbnQgbXVzdCBub3QgYmUgZmxhZ2dlZCBhcyBcInJlcXVpcmVkXCIqL1xuXHRpZiAoaGFzRGF0YVBvaW50VGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb24pICYmIChkYXRhRmllbGRUYXJnZXQgYXMgRGF0YVBvaW50KS5WaXN1YWxpemF0aW9uICE9PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiKSB7XG5cdFx0aWYgKERhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGlzU3RhdGljYWxseU1hbmRhdG9yeShkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBpc1JlcXVpcmVkRGF0YVBvaW50KGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZFRhcmdldCBhcyBEYXRhUG9pbnQsIHRhYmxlQ3JlYXRpb25Nb2RlKTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHByb3BlcnR5IGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0cHJvcGVydHkudHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiICYmXG5cdFx0IWlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdChpc1N0YXRpY2FsbHlNYW5kYXRvcnkocHJvcGVydHkpIHx8XG5cdFx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpKVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhUG9pbnQgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkYXRhUG9pbnQgVGhlIGRhdGFQb2ludCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YVBvaW50IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRGF0YVBvaW50ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFQb2ludDogRGF0YVBvaW50LFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRpc1N0YXRpY2FsbHlNYW5kYXRvcnkoZGF0YVBvaW50KSB8fFxuXHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KGRhdGFQb2ludC5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHVuZGVybHlpbmcgY29sdW1uIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAncmVxdWlyZWQnIHByb3BlcnR5IG9mIHRoZSB0YWJsZSBjb2x1bW4uXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRDb2x1bW4gPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFyZ2V0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IGNyZWF0aW9uTW9kZSA9IHRhYmxlQ3JlYXRpb25Nb2RlIHx8IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXQpKSB7XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWRQcm9wZXJ0eShjb252ZXJ0ZXJDb250ZXh0LCB0YXJnZXQsIGNyZWF0aW9uTW9kZSkgPyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKSA6IHVuZGVmaW5lZDtcblx0fVxuXHQvLyBDaGVjayBpZiB0aGUgZGF0YUZpZWxkIGlzIG9mIHR5cGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvblxuXHRpZiAoaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKHRhcmdldCkpIHtcblx0XHRyZXR1cm4gaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24oY29udmVydGVyQ29udGV4dCwgdGFyZ2V0LCBjcmVhdGlvbk1vZGUpID8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0Ly9JZiB0aGUgdW5kZXJseWluZyBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4sIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSBjaGVjayBib3ggZW1wdHkgb24gcHVycG9zZVxuXHRpZiAoaXNEYXRhRmllbGQodGFyZ2V0KSAmJiB0YXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikge1xuXHRcdHJldHVybiBpc1N0YXRpY2FsbHlNYW5kYXRvcnkodGFyZ2V0KSB8fFxuXHRcdFx0KGNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkodGFyZ2V0LlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRleHBvcnRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoZXhwb3J0UHJvcGVydGllcykpIHtcblx0XHRwcm9wZXJ0aWVzID0gZXhwb3J0UHJvcGVydGllcztcblx0fVxuXHRpZiAocHJvcGVydGllcykge1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYHske3Byb3BlcnRpZXMhLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdFx0fSlcblx0XHRcdC5qb2luKGAke1wiXFxuXCJ9YCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0YWJsZSBjb2x1bW4gZGVmaW5pdGlvbnMgZnJvbSBtYW5pZmVzdC5cbiAqXG4gKiBUaGVzZSBtYXkgYmUgY3VzdG9tIGNvbHVtbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIHNsb3QgY29sdW1ucyBjb21pbmcgdGhyb3VnaFxuICogYSBidWlsZGluZyBibG9jaywgb3IgYW5ub3RhdGlvbiBjb2x1bW5zIHRvIG92ZXJ3cml0ZSBhbm5vdGF0aW9uLWJhc2VkIGNvbHVtbnMuXG4gKiBAcGFyYW0gY29sdW1uc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tTWFuaWZlc3QgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0Q29sdW1uPiB7XG5cdGNvbnN0IGludGVybmFsQ29sdW1uczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+ID0ge307XG5cdGZ1bmN0aW9uIGlzQ29sdW1uT3ZlcnJpZGUoXG5cdFx0Y29sdW1uOiBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0XHRrZXk6IHN0cmluZ1xuXHQpOiBjb2x1bW4gaXMgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmtleSA9PT0ga2V5KTtcblx0fVxuXHRmdW5jdGlvbiBpc1Nsb3RDb2x1bW4obWFuaWZlc3RDb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbik6IG1hbmlmZXN0Q29sdW1uIGlzIEZyYWdtZW50RGVmaW5lZFNsb3RDb2x1bW4ge1xuXHRcdHJldHVybiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBDb2x1bW5UeXBlLlNsb3Q7XG5cdH1cblx0ZnVuY3Rpb24gaXNDdXN0b21Db2x1bW4obWFuaWZlc3RDb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbik6IG1hbmlmZXN0Q29sdW1uIGlzIE1hbmlmZXN0RGVmaW5lZEN1c3RvbUNvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IHVuZGVmaW5lZCAmJiAhIW1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlO1xuXHR9XG5cdGZ1bmN0aW9uIF91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zKHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdLCBhbm5vdGF0aW9uVGFibGVDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRwcm9wZXJ0eUluZm9zLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRhbm5vdGF0aW9uVGFibGVDb2x1bW5zLmZvckVhY2goKHByb3ApID0+IHtcblx0XHRcdFx0aWYgKHByb3AubmFtZSA9PT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRwcm9wLnNvcnRhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHkucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIikpO1xuXHRcdFx0XHRcdHByb3AuaXNHcm91cGFibGUgPSBwcm9wLnNvcnRhYmxlO1xuXHRcdFx0XHRcdHByb3AuZmlsdGVyYWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHkucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIikpO1xuXHRcdFx0XHRcdHByb3AuaXNQYXJ0T2ZDdXN0b21Db2x1bW4gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHRmb3IgKGNvbnN0IGtleSBpbiBjb2x1bW5zKSB7XG5cdFx0Y29uc3QgbWFuaWZlc3RDb2x1bW4gPSBjb2x1bW5zW2tleV07XG5cdFx0S2V5SGVscGVyLnZhbGlkYXRlS2V5KGtleSk7XG5cdFx0Ly8gQmFzZVRhYmxlQ29sdW1uXG5cdFx0Y29uc3QgYmFzZVRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogbWFuaWZlc3RDb2x1bW4ud2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXIsXG5cdFx0XHR3aWR0aDogbWFuaWZlc3RDb2x1bW4ud2lkdGggfHwgdW5kZWZpbmVkLFxuXHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0YW5jaG9yOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbj8uYW5jaG9yLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdH0sXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHR9O1xuXHRcdGlmIChpc0NvbHVtbk92ZXJyaWRlKG1hbmlmZXN0Q29sdW1uLCBrZXkpKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uOiBDdXN0b21FbGVtZW50PEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPiA9IHtcblx0XHRcdFx0Li4uYmFzZVRhYmxlQ29sdW1uLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBtYW5pZmVzdENvbHVtbj8uaW1wb3J0YW5jZSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHVuZGVmaW5lZCxcblx0XHRcdFx0c2V0dGluZ3M6IG1hbmlmZXN0Q29sdW1uLnNldHRpbmdzLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShtYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zKSxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKFxuXHRcdFx0XHRcdG1hbmlmZXN0Q29sdW1uPy5leHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdGtleVxuXHRcdFx0XHQpXG5cdFx0XHR9O1xuXHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eUluZm9zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRQcm9wZXJ0eU5hbWVzKFxuXHRcdFx0XHRtYW5pZmVzdENvbHVtbi5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZW50aXR5VHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHRvb2x0aXBUZXh0ID0gY29udmVydGVyQ29udGV4dC5mZXRjaFRleHRGcm9tTWV0YU1vZGVsKG1hbmlmZXN0Q29sdW1uLnRvb2x0aXApLFxuXHRcdFx0XHRoZWFkZXJUZXh0ID0gY29udmVydGVyQ29udGV4dC5mZXRjaFRleHRGcm9tTWV0YU1vZGVsKG1hbmlmZXN0Q29sdW1uLmhlYWRlcik7XG5cblx0XHRcdGNvbnN0IGN1c3RvbUNvbHVtbkV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGwgPSBwcm9wZXJ0eUluZm9zXG5cdFx0XHRcdD8gZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MobWFuaWZlc3RDb2x1bW4/LmV4cG9ydFNldHRpbmdzLCBhbm5vdGF0aW9uQ29sdW1ucywgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSwgcHJvcGVydHlJbmZvcylcblx0XHRcdFx0OiBudWxsO1xuXHRcdFx0Y29uc3QgYmFzZU1hbmlmZXN0Q29sdW1uID0ge1xuXHRcdFx0XHQuLi5iYXNlVGFibGVDb2x1bW4sXG5cdFx0XHRcdGhlYWRlcjogaGVhZGVyVGV4dCxcblx0XHRcdFx0aW1wb3J0YW5jZTogbWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UgfHwgSW1wb3J0YW5jZS5Ob25lLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IG1hbmlmZXN0Q29sdW1uPy5ob3Jpem9udGFsQWxpZ24gfHwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHkgfHwgXCJEZWZhdWx0XCIsXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGN1c3RvbUNvbHVtbkV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRpZDogYEN1c3RvbUNvbHVtbjo6JHtrZXl9YCxcblx0XHRcdFx0bmFtZTogYEN1c3RvbUNvbHVtbjo6JHtrZXl9YCxcblx0XHRcdFx0Ly9OZWVkZWQgZm9yIE1EQzpcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogeyB0ZXh0TGluZXNFZGl0OiA0IH0sXG5cdFx0XHRcdGlzR3JvdXBhYmxlOiBmYWxzZSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGZhbHNlLFxuXHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB7IHdpZHRoQ2FsY3VsYXRpb246IG51bGwgfSxcblx0XHRcdFx0dG9vbHRpcDogdG9vbHRpcFRleHQgPyB0b29sdGlwVGV4dCA6IGhlYWRlclRleHQsXG5cdFx0XHRcdHByb3BlcnRpZXM6IG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRcdHJlcXVpcmVkOlxuXHRcdFx0XHRcdG1hbmlmZXN0Q29sdW1uLnJlcXVpcmVkICYmXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHRcdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHRcdGlmIChwcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdF91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zKHByb3BlcnR5SW5mb3MsIGFubm90YXRpb25Db2x1bW5zKTtcblx0XHRcdH1cblx0XHRcdGlmIChpc1Nsb3RDb2x1bW4obWFuaWZlc3RDb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbVRhYmxlQ29sdW1uOiBDdXN0b21FbGVtZW50PEN1c3RvbUJhc2VkVGFibGVDb2x1bW4+ID0ge1xuXHRcdFx0XHRcdC4uLmJhc2VNYW5pZmVzdENvbHVtbixcblx0XHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Rcblx0XHRcdFx0fTtcblx0XHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBjdXN0b21UYWJsZUNvbHVtbjtcblx0XHRcdH0gZWxzZSBpZiAoaXNDdXN0b21Db2x1bW4obWFuaWZlc3RDb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbVRhYmxlQ29sdW1uOiBDdXN0b21FbGVtZW50PEN1c3RvbUJhc2VkVGFibGVDb2x1bW4+ID0ge1xuXHRcdFx0XHRcdC4uLmJhc2VNYW5pZmVzdENvbHVtbixcblx0XHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkRlZmF1bHRcblx0XHRcdFx0fTtcblx0XHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBjdXN0b21UYWJsZUNvbHVtbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgVGhlIGFubm90YXRpb24gY29sdW1uICcke2tleX0nIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZGA7XG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHRcdC5hZGRJc3N1ZShcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsXG5cdFx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRcdG1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5VHlwZSxcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEFkZHMgY29tcHV0ZWQgY29sdW1ucyBzdWNoIGFzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIHNpdHVhdGlvbnMgc3RhdHVzLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgdGFibGUgY29sdW1ucyBjb2xsZWN0ZWQgc28gZmFyXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZW5yaWNoZWQgc2V0IG9mIHRhYmxlIGNvbHVtbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbXB1dGVkQ29sdW1ucyhcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0aWYgKCFbXCJHcmlkVGFibGVcIiwgXCJUcmVlVGFibGVcIiwgXCJBbmFseXRpY2FsVGFibGVcIl0uaW5jbHVkZXModGFibGVUeXBlKSkge1xuXHRcdC8vIENvbXB1dGVkIGNvbHVtbnMgYXJlIG5vdCB1c2VkIGluIFJlc3BvbnNpdmUgdGFibGVzXG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucztcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gYSBzZXBhcmF0ZSBjb2x1bW5cblx0Ly8gc28gd2UgaGF2ZSB0byBkaXNhYmxlIGl0IGhlcmUgdG8gZW5zdXJlLCB0aGF0IHRoZSBmaWVsZCBidWlsZGluZyBibG9ja1xuXHQvLyBkb2VzIG5vdCByZW5kZXIgaXQgaW50byB0aGUgSUQgY29sdW1uXG5cdGNvbnN0IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCA9IHRhYmxlQ29sdW1ucy5maW5kKFxuXHRcdChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWVcblx0KTtcblx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0Ly8gU3dpdGNoIG9mZiB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLmZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IGZhbHNlO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3Qgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbjogQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleTogXCJzaXR1YXRpb25zSW5kaWNhdG9yXCIsXG5cdFx0XHRuYW1lOiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvci5uYW1lLFxuXHRcdFx0aXNTaXR1YXRpb25zSW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dG9vbHRpcDogXCJ7c2FwLmZlLmkxOG4+Q19TSVRVQVRJT05TX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjbGlwYm9hcmRTZXR0aW5nczogbnVsbCxcblx0XHRcdHByb3BlcnR5SW5mb3M6IHVuZGVmaW5lZCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlXG5cdFx0fTtcblxuXHRcdC8vIFBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdGNvbnN0IGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW46IGludCA9IHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gY29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIik7XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uICsgMSwgMCwgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHQvLyBJbiBjYXNlIGEgZ3JpZCB0YWJsZSBvciB0cmVlIHRhYmxlIGlzIHVzZWQsIHdlIGRpc3BsYXkgdGhlIGRyYWZ0IGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Ly8gVGhlIGFkZGl0aW9uYWwgY29sdW1uIGlzIG9ubHkgYWRkZWQgZm9yIHRhYmxlcyBvbiBhIExSIGFuZCBpbiBjYXNlIHRlaGUgZW50aXR5IGlzIGRyYWZ0IGVuYWJsZWQhXG5cdGNvbnN0IGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uW10gPSB0YWJsZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNEcmFmdEluZGljYXRvciA9PT0gdHJ1ZSk7XG5cdGlmIChcblx0XHRjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yLmxlbmd0aCAmJlxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0KE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpIHx8IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpKVxuXHQpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBkcmFmdCBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IuZm9yRWFjaCgoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yOiBUYWJsZUNvbHVtbikgPT4ge1xuXHRcdFx0aWYgKGNvbHVtbldpdGhEcmFmdEluZGljYXRvcj8uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNEcmFmdEluZGljYXRvciA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgZHJhZnQgaW5kaWNhdG9yIGNvbHVtblxuXHRcdGNvbnN0IGRyYWZ0SW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRuYW1lOiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRwcm9wZXJ0eUtleTogY29sdW1uc1dpdGhEcmFmdEluZGljYXRvclswXS5uYW1lLFxuXHRcdFx0aXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJEZWZhdWx0XCIsXG5cdFx0XHRsYWJlbDogXCJ7c2FwLmZlLmkxOG4+Q19EUkFGVF9TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuXHRcdH07XG5cdFx0bGV0IGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlcjogaW50ID0gMDtcblx0XHRpZiAoY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBzaXR1YXRpb25zIGluZGljYXRvciBjb2x1bW4sIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGJlZm9yZSBpdFxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID1cblx0XHRcdFx0dGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiAoY29sdW1uIGFzIENvbXB1dGVkVGFibGVDb2x1bW4pLmlzU2l0dWF0aW9uc0luZGljYXRvciA9PT0gdHJ1ZSkgLSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlcndpc2UgcGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHZpc2libGUgY29sdW1uXG5cdFx0XHRjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgPSB0YWJsZUNvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+IGNvbHVtbi5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCIpO1xuXHRcdH1cblx0XHR0YWJsZUNvbHVtbnMuc3BsaWNlKGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciArIDEsIDAsIGRyYWZ0SW5kaWNhdG9yQ29sdW1uKTtcblx0fVxuXG5cdHJldHVybiB0YWJsZUNvbHVtbnM7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0ICBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgcGF0aHMgb2YgdGhlIHJlc3RyaWN0ZWQgcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IFByb3BlcnR5UGF0aFtdIHtcblx0cmV0dXJuIGdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdChjYXBhYmlsaXRpZXMpID0+IHtcblx0XHRcdHJldHVybiAoY2FwYWJpbGl0aWVzIGFzIEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcyB8IHVuZGVmaW5lZCk/Lkluc2VydFJlc3RyaWN0aW9ucz8uUmVxdWlyZWRQcm9wZXJ0aWVzO1xuXHRcdH0sXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbm5vdGF0ZWQgYXMgYSByZXF1aXJlZCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWRcbiAqL1xuZnVuY3Rpb24gaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KG5hbWU6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogYm9vbGVhbiB7XG5cdHJldHVybiBnZXRSZXF1aXJlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dClcblx0XHQubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkuJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKVxuXHRcdC5pbmNsdWRlcyhuYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIHR5cGUgb2YgYSBjb2x1bW4gZm9yIHRoZSBleHBvcnQuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiBhIHByb3BlcnR5LCBjb2x1bW5cbiAqIEBwYXJhbSBpc0FUaW1lem9uZSBJcyB0aGUgZ2l2ZW4gcHJvcGVydHkgYSB0aW1lem9uZVxuICogQHBhcmFtIGlzQ3VycmVuY3kgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgY3VycmVuY3lcbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgYWxyZWFkeSBkZXRlY3RlZCBleHBvcnQgc2V0dGluZ3MgZnJvbSBkYXRhZmllbGRzXG4gKiBAcmV0dXJucyBUaGUgc3VwcG9ydGVkIGV4cG9ydCB0eXBlXG4gKi9cbmZ1bmN0aW9uIGdldEV4cG9ydERhdGFUeXBlKFxuXHRkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRpc0FUaW1lem9uZSA9IGZhbHNlLFxuXHRpc0N1cnJlbmN5ID0gZmFsc2UsXG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3Ncbik6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdGlmICghZGF0YVR5cGUgfHwgZXhwb3J0U2V0dGluZ3M/LmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9XG5cdGlmIChleHBvcnRTZXR0aW5ncz8uaXNDdXJyZW5jeSB8fCBpc0N1cnJlbmN5KSB7XG5cdFx0cmV0dXJuIFwiQ3VycmVuY3lcIjtcblx0fVxuXHRpZiAoaXNBVGltZXpvbmUpIHtcblx0XHRyZXR1cm4gXCJUaW1lem9uZVwiO1xuXHR9XG5cdGlmIChleHBvcnRTZXR0aW5ncz8ud3JhcCkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRzd2l0Y2ggKGRhdGFUeXBlKSB7XG5cdFx0Y2FzZSBcIkVkbS5EZWNpbWFsXCI6XG5cdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdGNhc2UgXCJFZG0uSW50NjRcIjpcblx0XHRjYXNlIFwiRWRtLkRvdWJsZVwiOlxuXHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIk51bWJlclwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0Y2FzZSBcIkVkbS5EYXRlXCI6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiRGF0ZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlVGltZU9mZnNldFwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLlRpbWVPZkRheVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlRpbWVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkJvb2xlYW5cIjtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdH1cblx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xufVxuXG4vKipcbiAqIEFkZHMgdGhlIHRvb2x0aXAgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gdGhlIGNvbHVtblxuICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZnVuY3Rpb24gX2FkZFRvb2xUaXAocHJvcGVydHk6IFByb3BlcnR5LCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHRjb25zdCB0b29sdGlwID0gX2dldFRvb2x0aXAocHJvcGVydHkpID8/IGNvbHVtbi5sYWJlbDtcblx0aWYgKHRvb2x0aXApIHtcblx0XHRjb2x1bW4udG9vbHRpcCA9IHRvb2x0aXA7XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLCByZWxhdGl2ZVBhdGgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdID0gW107XG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcGVydHkpID0+IHtcblx0XHRcdGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscy5wdXNoKGdldExhYmVsKG5hdlByb3BlcnR5KSB8fCBuYXZQcm9wZXJ0eS5uYW1lKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb3BlcnR5IHVzaW5nIHRoZSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24gc2V0IHRvIHRleHQgb25seS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggVGhlIGNvcnJlc3BvbmRpbmcgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSBsaW5lSXRlbSBUaGUgY29sdW1uIHRvIGJlIGV2YWx1YXRlZC5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGxpc3Qgb2YgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0LlxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4sXG5cdGxpbmVJdGVtOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHJlc3RyaWN0aW9uc09uUHJvcGVydGllczogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiB2b2lkIHtcblx0Y29uc3QgaXNQcm9wZXJ0eU5hdmlnYXRlZCA9XG5cdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAhPT0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoO1xuXHRpZiAoaXNQcm9wZXJ0eU5hdmlnYXRlZCAmJiBpc0RhdGFGaWVsZChsaW5lSXRlbSkpIHtcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbcmVsYXRpdmVQYXRoXSA9IGxpbmVJdGVtLlZhbHVlLiR0YXJnZXQ7XG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHJlbGF0aXZlUGF0aCk7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKGxpbmVJdGVtKSAmJiBoYXNGaWVsZEdyb3VwVGFyZ2V0KGxpbmVJdGVtKSkge1xuXHRcdChsaW5lSXRlbS5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhLmZvckVhY2goKGZpZWxkKSA9PiB7XG5cdFx0XHRpZiAoaXNEYXRhRmllbGQoZmllbGQpICYmIGdldERpc3BsYXlNb2RlKGZpZWxkLlZhbHVlLiR0YXJnZXQpID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdFx0Y29uc3QgaW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRcdGZpZWxkLlZhbHVlLnBhdGhcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdFx0XHRcdGluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoICE9PVxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0XHRcdFx0aWYgKGlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkKSB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2ZpZWxkLlZhbHVlLnBhdGhdID0gZmllbGQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2goZmllbGQuVmFsdWUucGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgdHlwZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSBvciBkYXRhIHR5cGUuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IG9yIGRhdGEgZmllbGQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIGNvbmZpZ3VyYXRpb24gZm9yLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgdG8gdXNlIGZvciB0eXBlIGNvbmZpZ3VyYXRpb24gaWYgbm90IGRldGVybWluZWQgZnJvbSB0aGUgcHJvcGVydHkuXG4gKiBAcmV0dXJucyBUaGUgcHJvcGVydHkgdHlwZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcocHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZCwgZGF0YVR5cGU/OiBzdHJpbmcpOiBQcm9wZXJ0eVR5cGVDb25maWcge1xuXHRsZXQgdGFyZ2V0TWFwcGluZyxcblx0XHRmb3JtYXRPcHRpb25zOiBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zIHwgdW5kZWZpbmVkID0ge307XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdHRhcmdldE1hcHBpbmcgPSBpc1R5cGVEZWZpbml0aW9uKHByb3BlcnR5LnRhcmdldFR5cGUpXG5cdFx0XHQ/IEVETV9UWVBFX01BUFBJTkdbcHJvcGVydHkudGFyZ2V0VHlwZS51bmRlcmx5aW5nVHlwZV1cblx0XHRcdDogRURNX1RZUEVfTUFQUElOR1twcm9wZXJ0eS50eXBlXTtcblx0fVxuXHRpZiAoIXRhcmdldE1hcHBpbmcgJiYgZGF0YVR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXTtcblx0fVxuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHR0eXBlOiB0YXJnZXRNYXBwaW5nPy50eXBlXG5cdH07XG5cdGlmICh0YXJnZXRNYXBwaW5nICYmIGlzUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSBzZXRVcENvbnN0cmFpbnRzKHRhcmdldE1hcHBpbmcsIHByb3BlcnR5KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoY29uc3RyYWludHMpLmxlbmd0aCkge1xuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XG5cdFx0fVxuXHR9XG5cdGlmIChwcm9wZXJ0eVR5cGVDb25maWcudHlwZSAhPT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJlYW1cIikge1xuXHRcdGlmIChcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0KSB7XG5cdFx0XHRmb3JtYXRPcHRpb25zID0geyBwYXJzZUFzU3RyaW5nOiBmYWxzZSwgZW1wdHlTdHJpbmc6IFwiXCIgfTtcblx0XHR9XG5cdFx0aWYgKHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmIHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cz8ubnVsbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRmb3JtYXRPcHRpb25zID0geyBwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHRydWUgfTtcblx0XHR9XG5cdH1cblx0aWYgKE9iamVjdC5rZXlzKGZvcm1hdE9wdGlvbnMpLmxlbmd0aCkge1xuXHRcdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0gZm9ybWF0T3B0aW9ucztcblx0fVxuXHRyZXR1cm4gcHJvcGVydHlUeXBlQ29uZmlnO1xufVxuXG4vKipcbiAqIEFkZCBhIGRlc2NyaXB0aW9uIHByb3BlcnR5IHRvIHRoZSBsaXN0IG9mIGRlc2NyaXB0aW9uIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgY29sdW1ucyBvZiBhIHRhYmxlLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIGxpc3Qgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtbiAobmFtZWQgYWxzbyBjb21wbGV4IHByb3BlcnR5KVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUgdG8gYmUgYWRkZWRcbiAqL1xuZnVuY3Rpb24gYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGVkUHJvcGVydHlOYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuXHRpZiAoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gJiZcblx0XHQhZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGVkUHJvcGVydHlOYW1lXVxuXHQpIHtcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID1cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uITtcblx0fVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSByZWZlcmVuY2VkIHByb3BlcnRpZXMgb2YgYSBMaW5lSXRlbSBpbiBjYXNlIHRoZSBMaW5lSXRlbSBpcyBhbm5vdGF0ZWQgYXMgaGlkZGVuLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZnJvbSBMaW5lSXRlbXMgYW5kIGZyb20gcHJvcGVydGllcyBvZiBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBsaW5lSXRlbSBvciBwcm9wZXJ0eSBvZiBlbnRpdHlTZXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSwgbmFtZTogc3RyaW5nLCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHRjb25zdCByZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMgPSBleGlzdGluZ0NvbHVtbnMuZmlsdGVyKFxuXHRcdChleGlzdGluZ0NvbHVtbikgPT5cblx0XHRcdChleGlzdGluZ0NvbHVtbi5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhuYW1lKSAmJiBleGlzdGluZ0NvbHVtbi5pc1BhcnRPZkxpbmVJdGVtKSB8fFxuXHRcdFx0KGV4aXN0aW5nQ29sdW1uLmlzUGFydE9mTGluZUl0ZW0gJiYgZXhpc3RpbmdDb2x1bW4ucmVsYXRpdmVQYXRoID09PSBjb2x1bW4ucmVsYXRpdmVQYXRoKVxuXHQpO1xuXHRjb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSA9ICEhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aDtcblx0aWYgKFxuXHRcdHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucy5sZW5ndGggJiZcblx0XHQhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zPy5zb21lKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIilcblx0KSB7XG5cdFx0Y29sdW1uLnNvcnRhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmlzR3JvdXBhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmZpbHRlcmFibGUgPSBmYWxzZTtcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBwcm9wZXJ0aWVzIG9mIGEgbWFuaWZlc3QgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBjdXN0b21pemVkL292ZXJ3cml0dGVuIGV4cG9ydCBzZXR0aW5ncyBvZiBhIG1hbmlmZXN0IGNvbHVtblxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gcHJvcGVydHlJbmZvcyBUaGUgcHJvcGVydGllcyBsaW5rZWQgdG8gYSBjb21wbGV4IGNvbHVtblxuICogQHBhcmFtIGNvbHVtbktleSBUaGUgY29sdW1uIGtleSBvZiB0aGUgY29sdW1uIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIG9mIHRoZSBjb2x1bW4gbWVyZ2luZyBjdXN0b21pemVkIGV4cG9ydCBzZXR0aW5ncyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBkZXRlY3RlZCBvbiB0aGUgYW5ub3RhdGlvbiBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXSxcblx0Y29sdW1uS2V5Pzogc3RyaW5nXG4pOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGwge1xuXHRsZXQgY29sdW1uRnJvbUFubm90YXRpb25zO1xuXHRpZiAoY29sdW1uS2V5KSB7XG5cdFx0Y29sdW1uRnJvbUFubm90YXRpb25zID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZCgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5rZXkgPT09IGNvbHVtbktleSk7XG5cdFx0aWYgKGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzO1xuXHRcdH1cblx0fVxuXHRjb25zdCBlbmFibGVXcmFwcGluZyA9XG5cdFx0ZXhwb3J0U2V0dGluZ3M/LndyYXAgPz9cblx0XHQoISEoZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5ICYmIGV4cG9ydFNldHRpbmdzLnByb3BlcnR5Py5sZW5ndGggPiAxKSB8fCAhIShwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSkpO1xuXHRjb25zdCBjdXN0b21FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0Li4uY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyxcblx0XHR0eXBlOiBleHBvcnRTZXR0aW5ncz8udHlwZSA/PyBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50eXBlLFxuXHRcdHRlbXBsYXRlOlxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlID8/XG5cdFx0XHRfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcywgZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5KSA/P1xuXHRcdFx0Y29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUsXG5cdFx0cHJvcGVydHk6IGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eVxuXHRcdFx0PyBfZ2V0UHJvcGVydHlOYW1lcyhleHBvcnRTZXR0aW5ncz8ucHJvcGVydHksIGFubm90YXRpb25Db2x1bW5zLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKVxuXHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0d2lkdGg6IGV4cG9ydFNldHRpbmdzPy53aWR0aCxcblx0XHR3cmFwOiBlbmFibGVXcmFwcGluZ1xuXHR9O1xuXHRyZXR1cm4gcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzKGN1c3RvbUV4cG9ydFNldHRpbmdzKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFtR0E7RUFNQTtFQUtBO0VBSUE7RUFjQTtFQThCQTtFQXNDQTtFQUFBLElBMENZQSxVQUFVLDBCQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFDQTtJQURWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFBLE9BQVZBLFVBQVU7RUFBQTtFQU10QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFSQUMsUUFBQSxDQUFBRCxVQUFBLEdBQUFBLFVBQUE7RUFTTyxTQUFTRSxlQUFlQSxDQUM5QkMsa0JBQTRCLEVBQzVCQyxTQUFvQixFQUNwQkMsaUJBQXlCLEVBQ3pCQyxnQkFBeUQsRUFDekM7SUFDaEIsTUFBTUMsaUJBQWlCLEdBQUdDLHlCQUF5QixDQUFDTCxrQkFBa0IsRUFBRUMsU0FBUyxFQUFFQyxpQkFBaUIsRUFBRUMsZ0JBQWdCLENBQUM7SUFDdkgsTUFBTUcsZUFBZSxHQUFHQyxzQkFBc0IsQ0FDN0NKLGdCQUFnQixDQUFDSywrQkFBK0IsQ0FBNkJOLGlCQUFpQixDQUFDLENBQUNPLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFDN0dMLGlCQUFpQixFQUNqQkQsZ0JBQWdCLEVBQ2hCQSxnQkFBZ0IsQ0FBQ08sdUJBQXVCLENBQUNWLGtCQUFrQixDQUM1RCxDQUFDO0lBRUQsTUFBTVcsWUFBMkIsR0FBR0Msb0JBQW9CLENBQ3ZEUixpQkFBaUIsRUFDakJFLGVBQWUsRUFDZjtNQUNDTyxLQUFLLEVBQUVDLFlBQVksQ0FBQ0MsU0FBUztNQUM3QkMsMEJBQTBCLEVBQUVGLFlBQVksQ0FBQ0MsU0FBUztNQUNsREUsVUFBVSxFQUFFSCxZQUFZLENBQUNDLFNBQVM7TUFDbENHLGVBQWUsRUFBRUosWUFBWSxDQUFDQyxTQUFTO01BQ3ZDSSxZQUFZLEVBQUVMLFlBQVksQ0FBQ0MsU0FBUztNQUNwQ0ssV0FBVyxFQUFFTixZQUFZLENBQUNDLFNBQVM7TUFDbkNNLFFBQVEsRUFBRVAsWUFBWSxDQUFDQyxTQUFTO01BQ2hDTyxhQUFhLEVBQUVSLFlBQVksQ0FBQ0MsU0FBUztNQUNyQ1EsY0FBYyxFQUFFVCxZQUFZLENBQUNDO0lBQzlCLENBQ0QsQ0FBQztJQUVELE9BQU9TLGtCQUFrQixDQUFDYixZQUFZLEVBQUVWLFNBQVMsRUFBRUMsaUJBQWlCLEVBQUVDLGdCQUFnQixDQUFDO0VBQ3hGO0VBQUNMLFFBQUEsQ0FBQUMsZUFBQSxHQUFBQSxlQUFBO0VBRU0sU0FBUzBCLGdCQUFnQkEsQ0FBQ0MsSUFBWSxFQUFFZixZQUEyQixFQUEyQjtJQUNwRyxPQUFPQSxZQUFZLENBQUNnQixJQUFJLENBQUVDLE1BQU0sSUFBSztNQUNwQyxNQUFNQyxnQkFBZ0IsR0FBR0QsTUFBK0I7TUFDeEQsT0FBT0MsZ0JBQWdCLENBQUNDLGFBQWEsS0FBS0MsU0FBUyxJQUFJRixnQkFBZ0IsQ0FBQ0csWUFBWSxLQUFLTixJQUFJO0lBQzlGLENBQUMsQ0FBQztFQUNIOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFKQTVCLFFBQUEsQ0FBQTJCLGdCQUFBLEdBQUFBLGdCQUFBO0VBS08sU0FBU1Esc0JBQXNCQSxDQUFDOUIsZ0JBQWtDLEVBQUVRLFlBQTJCLEVBQVE7SUFDN0csTUFBTXVCLG1CQUFtQixHQUFHL0IsZ0JBQWdCLENBQUNnQyxzQkFBc0IsQ0FBQ2hDLGdCQUFnQixDQUFDaUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQy9IMUIsWUFBWSxDQUFDMkIsT0FBTyxDQUFFQyxPQUFPLElBQUs7TUFDakMsTUFBTUMsV0FBVyxHQUFHRCxPQUFnQztNQUNwRCxJQUFJQyxXQUFXLENBQUNWLGFBQWEsS0FBS0MsU0FBUyxJQUFJUyxXQUFXLENBQUNSLFlBQVksRUFBRTtRQUN4RSxNQUFNUywyQkFBMkIsR0FBR0Msb0JBQW9CLENBQVdSLG1CQUFtQixFQUFFTSxXQUFXLENBQUNSLFlBQVksQ0FBQztRQUNqSCxNQUFNVyxRQUFRLEdBQUdGLDJCQUEyQixDQUFDRyxZQUFZO1FBQ3pELElBQUlELFFBQVEsRUFBRTtVQUNiRSwwQkFBMEIsQ0FBQ0YsUUFBUSxFQUFFRiwyQkFBMkIsRUFBRTlCLFlBQVksRUFBRTZCLFdBQVcsQ0FBQztVQUM1RixNQUFNTSxnQkFBZ0IsR0FBR0MsNkJBQTZCLENBQUNKLFFBQVEsQ0FBQztVQUNoRSxNQUFNSyxRQUFRLEdBQUdMLFFBQVEsRUFBRU0sV0FBVyxFQUFFQyxNQUFNLEVBQUVDLFFBQVE7VUFDeEQsSUFBSUwsZ0JBQWdCLEVBQUU7WUFDckIsTUFBTU0sZUFBZSxHQUFHM0IsZ0JBQWdCLENBQUNxQixnQkFBZ0IsQ0FBQ08sSUFBSSxFQUFFMUMsWUFBWSxDQUFDO1lBQzdFNkIsV0FBVyxDQUFDUSxRQUFRLEdBQUdJLGVBQWUsRUFBRUMsSUFBSTtVQUM3QyxDQUFDLE1BQU0sSUFBSUwsUUFBUSxFQUFFO1lBQ3BCUixXQUFXLENBQUNjLFlBQVksR0FBR04sUUFBUSxDQUFDTyxRQUFRLENBQUMsQ0FBQztVQUMvQztVQUNBQyw4QkFBOEIsQ0FBQ2IsUUFBUSxFQUFFRiwyQkFBMkIsRUFBRTlCLFlBQVksRUFBRTZCLFdBQVcsQ0FBQztRQUNqRztNQUNEO0lBQ0QsQ0FBQyxDQUFDO0VBQ0g7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQTFDLFFBQUEsQ0FBQW1DLHNCQUFBLEdBQUFBLHNCQUFBO0VBT0EsU0FBU1ksMEJBQTBCQSxDQUNsQ0YsUUFBa0IsRUFDbEJGLDJCQUEwRCxFQUMxRDlCLFlBQTJCLEVBQzNCNkIsV0FBa0MsRUFDM0I7SUFDUCxNQUFNaUIscUJBQXFCLEdBQUdDLGlDQUFpQyxDQUFDZixRQUFRLENBQUMsSUFBSWdCLDZCQUE2QixDQUFDaEIsUUFBUSxDQUFDO0lBQ3BILElBQUljLHFCQUFxQixFQUFFO01BQzFCLE1BQU1HLHdDQUF3QyxHQUFHbEIsb0JBQW9CLENBQVdELDJCQUEyQixFQUFFZ0IscUJBQXFCLENBQUM7TUFDbkksTUFBTUkseUJBQXlCLEdBQUdDLGtDQUFrQyxDQUFDRix3Q0FBd0MsQ0FBQztNQUM5RyxJQUFJQyx5QkFBeUIsRUFBRTtRQUM5QixNQUFNRSxVQUFVLEdBQUd0QyxnQkFBZ0IsQ0FBQ29DLHlCQUF5QixFQUFFbEQsWUFBWSxDQUFDO1FBQzVFNkIsV0FBVyxDQUFDd0IsSUFBSSxHQUFHRCxVQUFVLEVBQUVWLElBQUk7TUFDcEM7SUFDRCxDQUFDLE1BQU07TUFDTixNQUFNVyxJQUFJLEdBQUdyQixRQUFRLEVBQUVNLFdBQVcsRUFBRWdCLFFBQVEsRUFBRUMsV0FBVyxJQUFJdkIsUUFBUSxFQUFFTSxXQUFXLEVBQUVnQixRQUFRLEVBQUVFLElBQUk7TUFDbEcsSUFBSUgsSUFBSSxFQUFFO1FBQ1R4QixXQUFXLENBQUM0QixRQUFRLEdBQUcsR0FBR0osSUFBSSxFQUFFO01BQ2pDO0lBQ0Q7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNSLDhCQUE4QkEsQ0FDdENiLFFBQWtCLEVBQ2xCRiwyQkFBMEQsRUFDMUQ5QixZQUEyQixFQUMzQjZCLFdBQWtDLEVBQzNCO0lBQ1AsTUFBTTZCLFdBQVcsR0FBR0MsY0FBYyxDQUFDM0IsUUFBUSxDQUFDO01BQzNDNEIsZ0JBQWdCLEdBQUdDLDZCQUE2QixDQUFDN0IsUUFBUSxDQUFDO0lBQzNELElBQUk0QixnQkFBZ0IsSUFBSUYsV0FBVyxLQUFLLE9BQU8sRUFBRTtNQUNoRCxNQUFNSSwrQkFBK0IsR0FBRy9CLG9CQUFvQixDQUFXRCwyQkFBMkIsRUFBRThCLGdCQUFnQixDQUFDO01BQ3JILE1BQU1HLGdCQUFnQixHQUFHWixrQ0FBa0MsQ0FBQ1csK0JBQStCLENBQUM7TUFDNUYsSUFBSUMsZ0JBQWdCLEVBQUU7UUFDckIsTUFBTUMsVUFBVSxHQUFHbEQsZ0JBQWdCLENBQUNpRCxnQkFBZ0IsRUFBRS9ELFlBQVksQ0FBQztRQUNuRSxJQUFJZ0UsVUFBVSxJQUFJQSxVQUFVLENBQUN0QixJQUFJLEtBQUtiLFdBQVcsQ0FBQ2EsSUFBSSxFQUFFO1VBQ3ZEYixXQUFXLENBQUNvQyxlQUFlLEdBQUc7WUFDN0JDLFlBQVksRUFBRUYsVUFBVSxDQUFDdEIsSUFBSTtZQUM3QnlCLElBQUksRUFBRVQ7VUFDUCxDQUFDO1VBQ0Q7VUFDQSxJQUFJLENBQUNNLFVBQVUsQ0FBQ3BELGNBQWMsRUFBRTtZQUMvQm9ELFVBQVUsQ0FBQ3BELGNBQWMsR0FBRztjQUFFd0QsSUFBSSxFQUFFO1lBQVMsQ0FBQztVQUMvQztRQUNEO01BQ0Q7SUFDRDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLE1BQU1DLHdCQUF3QixHQUFHLFNBQUFBLENBQ3ZDQyxrQkFBNEMsRUFDNUNDLFVBQXNCLEVBQ3RCOUUsaUJBQTBDLEVBQzFDRCxnQkFBeUQsRUFDekRGLFNBQW9CLEVBQ3BCa0YsaUJBQStCLEVBQy9CQyxxQ0FBa0UsRUFDbEVDLHdCQUFtRCxFQUN6QjtJQUMxQixJQUFJakYsaUJBQWlCLEtBQUsyQixTQUFTLEVBQUU7TUFDcEMzQixpQkFBaUIsR0FBRyxFQUFFO0lBQ3ZCO0lBRUEsSUFBSWtGLDJCQUFxQyxHQUFHLEVBQUU7SUFDOUMsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsaUJBQWlCLENBQUNOLFVBQVUsRUFBRS9FLGdCQUFnQixDQUFDO0lBQzdFLE1BQU1zRixtQkFBbUIsR0FBR0YsaUJBQWlCLENBQUNHLHNCQUFzQixDQUFDLENBQUM7SUFDdEU7SUFDQSxJQUFJekYsU0FBUyxLQUFLLGlCQUFpQixJQUFJc0YsaUJBQWlCLENBQUNJLG9CQUFvQixDQUFDLENBQUMsSUFBSUYsbUJBQW1CLEVBQUU7TUFDdkdILDJCQUEyQixHQUFHRyxtQkFBbUIsQ0FDL0NHLEdBQUcsQ0FBRWpELFFBQVEsSUFBS0EsUUFBUSxDQUFDa0QsT0FBTyxDQUFDLENBQ25DQyxNQUFNLENBQUVDLE1BQU0sSUFBS0EsTUFBTSxLQUFLaEUsU0FBUyxDQUFDLENBQ3hDNkQsR0FBRyxDQUFFRyxNQUFNLElBQUtDLHlCQUF5QixDQUFDRCxNQUFrQixDQUFDLENBQUMsQ0FDOURELE1BQU0sQ0FBRUcsUUFBUSxJQUFLQSxRQUFRLElBQUksQ0FBQ1YsaUJBQWlCLENBQUNXLG1CQUFtQixDQUFDRCxRQUFRLENBQUMsQ0FBQyxDQUNsRkwsR0FBRyxDQUFFTyxJQUFJLElBQUtBLElBQUksRUFBRTlDLElBQUksQ0FBQyxDQUN6QnlDLE1BQU0sQ0FBRXpDLElBQUksSUFBS0EsSUFBSSxLQUFLdEIsU0FBUyxDQUFhO0lBQ25EO0lBQ0FtRCxVQUFVLENBQUNrQixnQkFBZ0IsQ0FBQzlELE9BQU8sQ0FBRUssUUFBa0IsSUFBSztNQUMzRDtNQUNBLE1BQU0wRCxNQUFNLEdBQUdqRyxpQkFBaUIsQ0FBQ2tHLElBQUksQ0FBRTFFLE1BQU0sSUFBSztRQUNqRCxPQUFPQSxNQUFNLENBQUN5QixJQUFJLEtBQUtWLFFBQVEsQ0FBQ1UsSUFBSTtNQUNyQyxDQUFDLENBQUM7TUFDRjtNQUNBLElBQUksQ0FBQ1YsUUFBUSxDQUFDNEQsVUFBVSxJQUFJLENBQUNGLE1BQU0sSUFBSSxDQUFDZiwyQkFBMkIsQ0FBQ2tCLFFBQVEsQ0FBQzdELFFBQVEsQ0FBQ1UsSUFBSSxDQUFDLEVBQUU7UUFDNUYsTUFBTW9ELHFCQUEwQyxHQUFHQyx3QkFBd0IsQ0FDMUUvRCxRQUFRLENBQUNVLElBQUksRUFDYlYsUUFBUSxFQUNSeEMsZ0JBQWdCLEVBQ2hCLElBQUksRUFDSkYsU0FDRCxDQUFDO1FBQ0QsTUFBTTBHLG9CQUE4QixHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQ0oscUJBQXFCLENBQUNLLFVBQVUsQ0FBQztRQUNwRixNQUFNQyx1QkFBaUMsR0FBR0gsTUFBTSxDQUFDQyxJQUFJLENBQUNKLHFCQUFxQixDQUFDTyxvQkFBb0IsQ0FBQztRQUNqRztRQUNBTCxvQkFBb0IsQ0FBQ3JFLE9BQU8sQ0FBRWUsSUFBSSxJQUFLO1VBQ3RDNEQsa0RBQWtELENBQUM3QixxQ0FBcUMsRUFBRXFCLHFCQUFxQixFQUFFcEQsSUFBSSxDQUFDO1FBQ3ZILENBQUMsQ0FBQztRQUVGLE1BQU02RCxVQUFVLEdBQUdDLCtCQUErQixDQUNqRHhFLFFBQVEsRUFDUnhDLGdCQUFnQixDQUFDaUgsK0JBQStCLENBQUN6RSxRQUFRLENBQUMwRSxrQkFBa0IsQ0FBQyxFQUM3RTFFLFFBQVEsQ0FBQ1UsSUFBSSxFQUNiLElBQUksRUFDSixJQUFJLEVBQ0prQyxpQkFBaUIsRUFDakJwRixnQkFBZ0IsRUFDaEJpRixxQ0FBcUMsRUFDckNDLHdCQUF3QixFQUN4QkYsaUJBQWlCLEVBQ2pCc0IscUJBQ0QsQ0FBQztRQUNELElBQUlFLG9CQUFvQixDQUFDVyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ3BDSixVQUFVLENBQUNwRixhQUFhLEdBQUc2RSxvQkFBb0I7VUFDL0MsSUFBSUYscUJBQXFCLENBQUNsRixjQUFjLENBQUNnRyxvQkFBb0IsRUFBRTtZQUM5REwsVUFBVSxDQUFDTSwwQkFBMEIsR0FBR2YscUJBQXFCLENBQUNsRixjQUFjLENBQUNnRyxvQkFBb0I7VUFDbEc7VUFDQTtVQUNBWixvQkFBb0IsQ0FBQ3JFLE9BQU8sQ0FBRWUsSUFBSSxJQUFLO1lBQ3RDNEIsa0JBQWtCLENBQUM1QixJQUFJLENBQUMsR0FBR29ELHFCQUFxQixDQUFDSyxVQUFVLENBQUN6RCxJQUFJLENBQUMsQ0FBQ29FLGtCQUFrQjtVQUNyRixDQUFDLENBQUM7UUFDSDtRQUNBLElBQUlWLHVCQUF1QixDQUFDTyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ3ZDSixVQUFVLENBQUNRLHVCQUF1QixHQUFHWCx1QkFBdUI7VUFDNUQ7VUFDQUEsdUJBQXVCLENBQUN6RSxPQUFPLENBQUVxRixzQkFBc0IsSUFBSztZQUMzRDtZQUNBMUMsa0JBQWtCLENBQUMwQyxzQkFBc0IsQ0FBQyxHQUFHbEIscUJBQXFCLENBQUNPLG9CQUFvQixDQUFDVyxzQkFBc0IsQ0FBQztVQUNoSCxDQUFDLENBQUM7UUFDSDtRQUNBdkgsaUJBQWlCLENBQUN3SCxJQUFJLENBQUNWLFVBQVUsQ0FBQztNQUNuQztNQUNBO01BQ0E7TUFDQTtNQUNBLElBQUk1QyxjQUFjLENBQUMzQixRQUFRLENBQUMsS0FBSyxhQUFhLEVBQUU7UUFDL0MwQyx3QkFBd0IsRUFBRXdDLHFCQUFxQixDQUFDRCxJQUFJLENBQUNqRixRQUFRLENBQUNVLElBQUksQ0FBQztRQUNuRSxJQUFJeUUsMEJBQTBCLENBQUNuRixRQUFRLEVBQUVNLFdBQVcsRUFBRUMsTUFBTSxFQUFFNkUsSUFBSSxDQUFDLEVBQUU7VUFDcEUzSCxpQkFBaUIsQ0FBQ3dILElBQUksQ0FDckJULCtCQUErQixDQUM5QnhFLFFBQVEsRUFDUnhDLGdCQUFnQixDQUFDaUgsK0JBQStCLENBQUN6RSxRQUFRLENBQUMwRSxrQkFBa0IsQ0FBQyxFQUM3RTFFLFFBQVEsQ0FBQ1UsSUFBSSxFQUNiLEtBQUssRUFDTCxLQUFLLEVBQ0xrQyxpQkFBaUIsRUFDakJwRixnQkFBZ0IsRUFDaEJpRixxQ0FBcUMsRUFDckNDLHdCQUF3QixFQUN4QkYsaUJBQ0QsQ0FDRCxDQUFDO1FBQ0Y7TUFDRDtJQUNELENBQUMsQ0FBQztJQUNGO0lBQ0EsTUFBTTZDLGNBQWMsR0FBR0MscUJBQXFCLENBQzNDaEQsa0JBQWtCLEVBQ2xCN0UsaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEIrRSxVQUFVLEVBQ1ZFLHFDQUFxQyxFQUNyQ0QsaUJBQWlCLEVBQ2pCRSx3QkFDRCxDQUFDO0lBQ0QsT0FBT2pGLGlCQUFpQixDQUFDOEgsTUFBTSxDQUFDRixjQUFjLENBQUM7RUFDaEQsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQWZBbEksUUFBQSxDQUFBa0Ysd0JBQUEsR0FBQUEsd0JBQUE7RUFnQkEsTUFBTW1DLCtCQUErQixHQUFHLFNBQUFBLENBQ3ZDeEUsUUFBa0IsRUFDbEJ3RixnQkFBd0IsRUFDeEJuRyxZQUFvQixFQUNwQm9HLGtCQUEyQixFQUMzQkMsc0JBQStCLEVBQy9COUMsaUJBQW9DLEVBQ3BDcEYsZ0JBQXlELEVBQ3pEaUYscUNBQWtFLEVBQ2xFQyx3QkFBbUQsRUFDbkRGLGlCQUFnQyxFQUNoQ3NCLHFCQUEyQyxFQUMzQzZCLHlCQUFrQyxFQUNWO0lBQ3hCLE1BQU1DLDRCQUE0QixHQUFHQyxxQkFBcUIsQ0FBQ3JJLGdCQUFnQixFQUFFd0MsUUFBUSxDQUFDO0lBQ3RGLE1BQU04RixRQUFRLEdBQUdDLG1DQUFtQyxDQUFDL0YsUUFBUSxDQUFDO0lBQzlELE1BQU1nRyxTQUE2QixHQUFHaEcsUUFBUSxDQUFDVSxJQUFJLEdBQUd1RixhQUFhLENBQUNqRyxRQUFRLENBQUNVLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUd0QixTQUFTO0lBQzNHLE1BQU04RyxPQUFnQixHQUFHRixTQUFTLElBQUloRyxRQUFRLENBQUNVLElBQUk7SUFDbkQsTUFBTXlGLEtBQUssR0FBR0MsUUFBUSxDQUFDcEcsUUFBUSxFQUFFa0csT0FBTyxDQUFDO0lBQ3pDLE1BQU1HLFFBQVEsR0FBR0Msb0JBQW9CLENBQUN0RyxRQUFRLENBQUM7SUFDL0MsTUFBTXVHLGtCQUFrQixHQUFHQyxhQUFhLENBQUN4RyxRQUFRLEVBQUVxRyxRQUFRLENBQUM7SUFDNUQsTUFBTUksaUNBQWlDLEdBQUdoRSxxQ0FBcUMsQ0FBQ3BELFlBQVksQ0FBQyxLQUFLLGFBQWE7SUFDL0csTUFBTXFILFFBQVEsR0FDYixDQUFDLENBQUNaLFFBQVEsSUFBSVcsaUNBQWlDLEtBQUssQ0FBQy9ELHdCQUF3QixFQUFFd0MscUJBQXFCLENBQUNyQixRQUFRLENBQUN4RSxZQUFZLENBQUM7SUFDNUgsTUFBTXNILFVBQVUsR0FBRyxDQUFDakUsd0JBQXdCLEVBQUVrRSx1QkFBdUIsQ0FBQy9DLFFBQVEsQ0FBQ3hFLFlBQVksQ0FBQztJQUM1RixNQUFNd0gsVUFBVSxHQUFHO01BQ2xCQyxTQUFTLEVBQUU5RyxRQUFRLENBQUNvQyxJQUFJLElBQUlpRSxRQUFRO01BQ3BDMUgsYUFBYSxFQUFFNEgsa0JBQWtCLENBQUM1SCxhQUFhO01BQy9Db0ksV0FBVyxFQUFFUixrQkFBa0IsQ0FBQ1E7SUFDakMsQ0FBQztJQUNELElBQUluSSxjQUE4QyxHQUFHLElBQUk7SUFDekQsSUFBSW9JLG1CQUFtQixDQUFDaEgsUUFBUSxDQUFDLEVBQUU7TUFDbENwQixjQUFjLEdBQUdxSSwwQkFBMEIsQ0FBQ2pILFFBQVEsRUFBRThELHFCQUFxQixDQUFDO0lBQzdFO0lBQ0EsTUFBTXRGLFlBQVksR0FBRyxDQUFDc0gsUUFBUSxJQUFJSixzQkFBc0IsR0FBRyxZQUFZLEdBQUcsUUFBUTtJQUNsRixNQUFNd0IsaUNBQXVELEdBQUdDLHFDQUFxQyxDQUFDOUgsWUFBWSxFQUFFN0IsZ0JBQWdCLENBQUM7SUFDckksSUFBSW1JLHlCQUF5QixFQUFFO01BQzlCdEcsWUFBWSxHQUFHc0cseUJBQXlCO0lBQ3pDO0lBQ0EsTUFBTWpGLElBQUksR0FBRytFLGtCQUFrQixHQUFHcEcsWUFBWSxHQUFHLGFBQWFBLFlBQVksRUFBRTtJQUM1RSxNQUFNK0gsR0FBRyxHQUFHLENBQUMzQixrQkFBa0IsR0FBRyxhQUFhLEdBQUcsWUFBWSxJQUFJNEIsbUJBQW1CLENBQUNoSSxZQUFZLENBQUM7SUFFbkcsTUFBTUosTUFBNkIsR0FBRztNQUNyQ21JLEdBQUcsRUFBRUEsR0FBRztNQUNSaEYsSUFBSSxFQUFFbEYsVUFBVSxDQUFDb0ssVUFBVTtNQUMzQmpCLFFBQVEsRUFBRUEsUUFBUSxJQUFJckcsUUFBUSxDQUFDb0MsSUFBSTtNQUNuQytELEtBQUssRUFBRUEsS0FBSyxJQUFJbkcsUUFBUSxDQUFDVSxJQUFJO01BQzdCNkcsVUFBVSxFQUFFckIsT0FBTyxHQUFHRSxRQUFRLENBQUNwRyxRQUFRLENBQUMsR0FBR1osU0FBUztNQUNwRG9JLEtBQUssRUFBRXRCLE9BQU8sR0FBR0YsU0FBUyxHQUFHNUcsU0FBUztNQUN0Q3FJLGNBQWMsRUFBRWpDLGdCQUFnQjtNQUNoQ2tDLGtCQUFrQixFQUFFOUIsNEJBQTRCO01BQ2hEcEgsWUFBWSxFQUFFQSxZQUFZO01BQzFCa0MsSUFBSSxFQUFFQSxJQUFJO01BQ1ZyQixZQUFZLEVBQUVBLFlBQVk7TUFDMUJxSCxRQUFRLEVBQUVBLFFBQVE7TUFDbEJDLFVBQVUsRUFBRUEsVUFBVTtNQUN0QmdCLFdBQVcsRUFBRS9FLGlCQUFpQixDQUFDSSxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDSixpQkFBaUIsQ0FBQ1csbUJBQW1CLENBQUN2RCxRQUFRLENBQUMsR0FBRzBHLFFBQVE7TUFDcEhrQixLQUFLLEVBQUU1SCxRQUFRLENBQUM0SCxLQUFLO01BQ3JCaEosY0FBYyxFQUFFQSxjQUFjO01BQzlCaUosYUFBYSxFQUFFQyx3QkFBd0IsQ0FBQ3RLLGdCQUFnQixDQUFDO01BQ3pEcUosVUFBVSxFQUFFQSxVQUFnQztNQUM1Q3ZJLFVBQVUsRUFBRXlKLGFBQWEsQ0FBQ3ZLLGdCQUFnQixFQUFFd0MsUUFBUSxDQUFDTSxXQUFXLEVBQUUwSCxFQUFFLEVBQUVDLGdCQUFnQixDQUFDO01BQ3ZGQyxRQUFRLEVBQUVDLGdCQUFnQixDQUFDM0ssZ0JBQWdCLEVBQUV3QyxRQUFRLEVBQUV3QyxpQkFBaUIsQ0FBQztNQUN6RTRGLGdCQUFnQixFQUFFbEI7SUFDbkIsQ0FBQztJQUNEbUIsV0FBVyxDQUFDckksUUFBUSxFQUFFZixNQUFNLENBQUM7SUFDN0JxSiw4QkFBOEIsQ0FBQ3RJLFFBQVEsRUFBRWYsTUFBTSxDQUFDO0lBRWhELElBQ0MyRCxpQkFBaUIsQ0FBQ0ksb0JBQW9CLENBQUMsQ0FBQyxJQUN4Q3VGLFdBQVcsQ0FBQ0MsMEJBQTBCLENBQUNoTCxnQkFBZ0IsQ0FBQ2tDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUNoRkwsWUFBWSxLQUFLLGlCQUFpQixJQUFJQSxZQUFZLEtBQUssZ0JBQWdCLElBQUlBLFlBQVksS0FBSyxnQkFBZ0IsQ0FBQyxFQUM3RztNQUNEO01BQ0E7TUFDQUosTUFBTSxDQUFDd0osU0FBUyxHQUFHO1FBQ2xCQyx1QkFBdUIsRUFBRSxLQUFLO1FBQzlCQyxvQkFBb0IsRUFBRTtNQUN2QixDQUFDO0lBQ0Y7SUFDQSxPQUFPMUosTUFBTTtFQUNkLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTWdJLDBCQUEwQixHQUFHLFNBQUFBLENBQ2xDaEksTUFBeUMsRUFDekM2RSxxQkFBMkMsRUFDcEI7SUFDdkIsSUFBSThFLFlBQVksRUFBRXpJLGdCQUFnQixFQUFFc0IsUUFBUSxFQUFFZCxZQUFZLEVBQUVrSSxHQUFHLEVBQUVDLFdBQVcsRUFBRUMsZ0JBQWdCLEVBQUVDLEtBQUs7SUFDckcsTUFBTWhGLG9CQUFvQixHQUFHRixxQkFBcUIsR0FBR0csTUFBTSxDQUFDQyxJQUFJLENBQUNKLHFCQUFxQixDQUFDSyxVQUFVLENBQUMsR0FBRyxFQUFFO0lBQ3ZHLElBQUlMLHFCQUFxQixJQUFJRSxvQkFBb0IsRUFBRVcsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNoRTtNQUNBO01BQ0ExRixNQUFNLEdBQUc2RSxxQkFBcUIsQ0FBQ0ssVUFBVSxDQUFDSCxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDYyxrQkFBa0I7SUFDdEY7SUFDQSxNQUFNdUIsUUFBUSxHQUFHQyxvQkFBb0IsQ0FBQ3JILE1BQU0sQ0FBQztJQUM3QyxJQUFJZ0ssVUFBVSxDQUFDaEssTUFBTSxDQUFDLEVBQUU7TUFDdkIySixZQUFZLEdBQUdNLHlCQUF5QixDQUFDakssTUFBTSxDQUFDO01BQ2hEOEosZ0JBQWdCLEdBQUdJLDZCQUE2QixDQUFDbEssTUFBTSxDQUFDO01BQ3hEa0IsZ0JBQWdCLEdBQUdDLDZCQUE2QixDQUFDbkIsTUFBTSxDQUFDO01BQ3hEd0MsUUFBUSxHQUFHMkgsdUJBQXVCLENBQUNuSyxNQUFNLENBQUM7TUFDMUMwQixZQUFZLEdBQUcwSSxpQkFBaUIsQ0FBQ3BLLE1BQU0sQ0FBQztNQUN4QzZKLFdBQVcsR0FBR1EsVUFBVSxDQUFDckssTUFBTSxDQUFDO01BQ2hDK0osS0FBSyxHQUFHL0osTUFBTSxDQUFDK0osS0FBSztJQUNyQjtJQUNBSixZQUFZLEdBQUc5RSxxQkFBcUIsRUFBRWxGLGNBQWMsRUFBRWdLLFlBQVksSUFBSUEsWUFBWSxFQUFFbEksSUFBSSxJQUFJcUksZ0JBQWdCLEVBQUVySSxJQUFJO0lBQ2xIUCxnQkFBZ0IsR0FBRzJELHFCQUFxQixFQUFFbEYsY0FBYyxFQUFFdUIsZ0JBQWdCLElBQUlBLGdCQUFnQixFQUFFTyxJQUFJO0lBQ3BHc0ksS0FBSyxHQUFHbEYscUJBQXFCLEVBQUVsRixjQUFjLEVBQUVvSyxLQUFLLElBQUlBLEtBQUs7SUFDN0QsTUFBTU8sVUFBVSxHQUFHQyxpQkFBaUIsQ0FBQ25ELFFBQVEsRUFBRXlDLFdBQVcsRUFBRSxDQUFDLENBQUNDLGdCQUFnQixFQUFFakYscUJBQXFCLEVBQUVsRixjQUFjLENBQUM7SUFDdEgsSUFBSXVCLGdCQUFnQixJQUFLb0osVUFBVSxLQUFLLFVBQVUsSUFBSSxDQUFDNUksWUFBYSxFQUFFO01BQ3JFa0ksR0FBRyxHQUFHLEtBQUs7SUFDWjtJQUNBLE1BQU1qSyxjQUFvQyxHQUFHO01BQzVDd0QsSUFBSSxFQUFFbUgsVUFBVTtNQUNoQkUsV0FBVyxFQUFFQyxrQkFBa0IsQ0FBQ3JELFFBQVEsQ0FBQztNQUN6Q3NELFNBQVMsRUFBRUMsWUFBWSxDQUFDdkQsUUFBUSxDQUFDO01BQ2pDMkMsS0FBSyxFQUFFQSxLQUFLO01BQ1pKLFlBQVksRUFBRUEsWUFBWTtNQUMxQnZILElBQUksRUFBRXlDLHFCQUFxQixFQUFFbEYsY0FBYyxDQUFDeUMsSUFBSSxJQUFJSSxRQUFRO01BQzVEdEIsZ0JBQWdCLEVBQUVBLGdCQUFnQjtNQUNsQ0UsUUFBUSxFQUFFeUQscUJBQXFCLEVBQUVsRixjQUFjLENBQUN5QixRQUFRLElBQUlNLFlBQVksRUFBRUMsUUFBUSxDQUFDLENBQUM7TUFDcEZpSixRQUFRLEVBQUUvRixxQkFBcUIsRUFBRWxGLGNBQWMsQ0FBQ2lMLFFBQVE7TUFDeEQ7TUFDQUMsSUFBSSxFQUFFaEcscUJBQXFCLEVBQUVsRixjQUFjLENBQUNrTCxJQUFJO01BQ2hEakIsR0FBRyxFQUFFQTtJQUNOLENBQUM7SUFDRCxJQUFJakssY0FBYyxDQUFDZ0ssWUFBWSxJQUFJaEssY0FBYyxDQUFDeUMsSUFBSSxFQUFFO01BQ3ZEekMsY0FBYyxDQUFDbUwsU0FBUyxHQUFHLElBQUk7SUFDaEM7SUFDQSxPQUFPQyxpQ0FBaUMsQ0FBQ3BMLGNBQWMsQ0FBQztFQUN6RCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNOEssa0JBQWtCLEdBQUcsU0FBQUEsQ0FBVXJELFFBQWlCLEVBQXNCO0lBQzNFLE9BQU9BLFFBQVEsS0FBSyxVQUFVLEdBQUcsWUFBWSxHQUFHakgsU0FBUztFQUMxRCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU13SyxZQUFZLEdBQUcsU0FBQUEsQ0FBVXZELFFBQWlCLEVBQXVCO0lBQ3RFLE9BQU9BLFFBQVEsS0FBSyxXQUFXLEdBQUcsSUFBSSxHQUFHakgsU0FBUztFQUNuRCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNNEssaUNBQWlDLEdBQUcsU0FBQUEsQ0FBVXBMLGNBQW9DLEVBQXdCO0lBQy9HO0lBQ0EsS0FBSyxNQUFNcUwsT0FBTyxJQUFJckwsY0FBYyxFQUFFO01BQ3JDLElBQUlBLGNBQWMsQ0FBQ3FMLE9BQU8sQ0FBK0IsS0FBSzdLLFNBQVMsRUFBRTtRQUN4RSxPQUFPUixjQUFjLENBQUNxTCxPQUFPLENBQStCO01BQzdEO0lBQ0Q7SUFDQSxPQUFPckwsY0FBYztFQUN0QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTb0ksbUJBQW1CQSxDQUFDa0QsTUFBeUMsRUFBVztJQUNoRixJQUFJQyxZQUFZLEVBQUVuSyxRQUFRO0lBQzFCLE1BQU1vSyx3QkFBd0IsR0FBSUYsTUFBTSxDQUFjNUosV0FBVyxDQUFDMEgsRUFBRSxFQUFFQyxnQkFBZ0I7SUFDdEYsSUFBSWdCLFVBQVUsQ0FBQ2lCLE1BQU0sQ0FBQyxFQUFFO01BQ3ZCLElBQUluRSxtQ0FBbUMsQ0FBQ21FLE1BQU0sQ0FBQyxFQUFFO1FBQ2hELE9BQU8sS0FBSztNQUNiO01BQ0FDLFlBQVksR0FBR0Msd0JBQXdCLEVBQUVDLEtBQUs7SUFDL0MsQ0FBQyxNQUFNLElBQUl0RSxtQ0FBbUMsQ0FBQ21FLE1BQU0sQ0FBQyxFQUFFO01BQ3ZELE9BQU8sS0FBSztJQUNiLENBQUMsTUFBTTtNQUNObEssUUFBUSxHQUFHa0ssTUFBTTtNQUNqQkMsWUFBWSxHQUFHbkssUUFBUSxDQUFDcUssS0FBSztNQUM3QixJQUFJRixZQUFZLHdEQUE2QyxJQUFLbkssUUFBUSxDQUE0QnNLLE1BQU0sRUFBRXBILE9BQU8sRUFBRW1ILEtBQUssRUFBRTtRQUM3SDtRQUNBRixZQUFZLEdBQUluSyxRQUFRLENBQTRCc0ssTUFBTSxFQUFFcEgsT0FBTyxFQUFFbUgsS0FBSztRQUMxRSxPQUFPRixZQUFZLEtBQUsvSyxTQUFTLElBQUksQ0FBQyxpREFBc0N5RSxRQUFRLENBQUNzRyxZQUFZLENBQUM7TUFDbkcsQ0FBQyxNQUFNLElBQ0xuSyxRQUFRLENBQWV1SyxLQUFLLEVBQUVySCxPQUFPLEVBQUU1QyxXQUFXLEVBQUVrSyxJQUFJLEVBQUVDLFNBQVMsRUFBRUMsSUFBSSxLQUFLLDZCQUE2QixJQUMzRzFLLFFBQVEsQ0FBZXVLLEtBQUssRUFBRXJILE9BQU8sRUFBRTVDLFdBQVcsRUFBRWtLLElBQUksRUFBRUcsS0FBSyxLQUFLLElBQUksRUFDeEU7UUFDRDtRQUNBLE9BQU8sS0FBSztNQUNiO0lBQ0Q7SUFDQSxPQUFPUixZQUFZLEdBQ2hCLENBQUMsdUtBSUEsQ0FBQ3RHLFFBQVEsQ0FBQ3NHLFlBQVksQ0FBQyxHQUN4QixJQUFJO0VBQ1I7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU1TLGNBQWMsR0FBRyxTQUFBQSxDQUFVQyxTQUFpQyxFQUFXO0lBQzVFLFFBQVFBLFNBQVMsQ0FBQ1IsS0FBSztNQUN0QjtNQUNBO1FBQ0MsT0FBTyxDQUFDLENBQUNRLFNBQVMsQ0FBQ0MsTUFBTTtNQUMxQjtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7UUFDQyxPQUFPLElBQUk7TUFDWjtRQUNDO1FBQ0E7UUFDQSxPQUFPLEtBQUs7SUFDZDtFQUNELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxTQUFBQSxDQUM3QkMsa0JBQW9GLEVBQ2hEO0lBQ3BDLE1BQU0vSyxZQUFZLEdBQUcrSyxrQkFBa0IsQ0FBQy9LLFlBQVk7SUFDcEQsSUFBSWdMLGFBQWE7SUFDakIsSUFBSWhMLFlBQVksRUFBRTtNQUNqQixRQUFRQSxZQUFZLENBQUNvSyxLQUFLO1FBQ3pCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtVQUNDWSxhQUFhLEdBQUdoTCxZQUFZLENBQUNzSyxLQUFLLENBQUNySCxPQUFPO1VBQzFDO1FBQ0Q7VUFDQztVQUNBLElBQUlqRCxZQUFZLEVBQUVxSyxNQUFNLEVBQUVwSCxPQUFPLEVBQUVtSCxLQUFLLCtDQUFvQyxFQUFFO1lBQzdFWSxhQUFhLEdBQUdoTCxZQUFZLENBQUNxSyxNQUFNLENBQUNwSCxPQUFPLEVBQUVxSCxLQUFLLENBQUNySCxPQUFPO1VBQzNEO1VBQ0E7UUFDRDtRQUNBO1FBQ0E7VUFDQytILGFBQWEsR0FBRzdMLFNBQVM7TUFDM0I7SUFDRDtJQUNBLE1BQU04TCwrQkFBK0IsR0FBRyxnREFBaURDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDeEcsTUFBTUMsZ0JBQWdCLEdBQUcseURBQTBERCxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQ2xHO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsT0FBT0UsR0FBRyxDQUNULEdBQUcsQ0FDRkMsR0FBRyxDQUFDQyxLQUFLLENBQUNDLDJCQUEyQixDQUFDdkwsWUFBWSxFQUFFSyxXQUFXLEVBQUUwSCxFQUFFLEVBQUV5RCxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUNwRkMsTUFBTSxDQUNMLENBQUMsQ0FBQ1QsYUFBYSxFQUNmQSxhQUFhLElBQUlLLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDQywyQkFBMkIsQ0FBQ1AsYUFBYSxDQUFDM0ssV0FBVyxFQUFFMEgsRUFBRSxFQUFFeUQsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFDckcsSUFDRCxDQUFDLEVBQ0RFLEVBQUUsQ0FBQ0wsR0FBRyxDQUFDSiwrQkFBK0IsQ0FBQyxFQUFFRSxnQkFBZ0IsQ0FBQyxDQUU1RCxDQUFDO0VBQ0YsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTVEsK0JBQStCLEdBQUcsU0FBQUEsQ0FBVUMsY0FBc0MsRUFBZ0Q7SUFDdkksTUFBTUMsMkJBQWdFLEdBQUcsRUFBRTtJQUMzRSxJQUNDRCxjQUFjLENBQUN4QixLQUFLLHdEQUE2QyxJQUNqRXdCLGNBQWMsQ0FBQ3ZCLE1BQU0sRUFBRXBILE9BQU8sRUFBRW1ILEtBQUssZ0RBQXFDLEVBQ3pFO01BQ0QsSUFBSXdCLGNBQWMsRUFBRXZMLFdBQVcsRUFBRTBILEVBQUUsRUFBRXlELE1BQU0sRUFBRTtRQUM1QyxPQUFPTSxpQkFBaUIsQ0FBQ1QsR0FBRyxDQUFDQyxLQUFLLENBQUNDLDJCQUEyQixDQUFDSyxjQUFjLENBQUN2TCxXQUFXLENBQUMwSCxFQUFFLENBQUN5RCxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO01BQzlHLENBQUMsTUFBTTtRQUNOSSxjQUFjLENBQUN2QixNQUFNLENBQUNwSCxPQUFPLENBQUM4SSxJQUFJLEVBQUVyTSxPQUFPLENBQUVzTSxjQUEyRCxJQUFLO1VBQzVHSCwyQkFBMkIsQ0FBQzdHLElBQUksQ0FDL0I4RixxQkFBcUIsQ0FBQztZQUFFOUssWUFBWSxFQUFFZ007VUFBZSxDQUVwRCxDQUNGLENBQUM7UUFDRixDQUFDLENBQUM7UUFDRixPQUFPRixpQkFBaUIsQ0FBQ0wsTUFBTSxDQUFDQyxFQUFFLENBQUMsR0FBR0csMkJBQTJCLENBQUMsRUFBRVgsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFQSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUN0RztJQUNELENBQUMsTUFBTTtNQUNOLE9BQU8vTCxTQUFTO0lBQ2pCO0VBQ0QsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNZ0gsUUFBUSxHQUFHLFNBQUFBLENBQVVwRyxRQUFnRSxFQUF1QztJQUFBLElBQXJDa0csT0FBTyxHQUFBZ0csU0FBQSxDQUFBdkgsTUFBQSxRQUFBdUgsU0FBQSxRQUFBOU0sU0FBQSxHQUFBOE0sU0FBQSxNQUFHLEtBQUs7SUFDM0csSUFBSSxDQUFDbE0sUUFBUSxFQUFFO01BQ2QsT0FBT1osU0FBUztJQUNqQjtJQUNBLElBQUk2SixVQUFVLENBQUNqSixRQUFRLENBQUMsSUFBSW1NLG9CQUFvQixDQUFDbk0sUUFBUSxDQUFDLEVBQUU7TUFDM0QsTUFBTW9NLGdCQUFnQixHQUFJcE0sUUFBUSxDQUFjTSxXQUFXLEVBQUUwSCxFQUFFLEVBQUVDLGdCQUFnQjtNQUNqRixJQUFJbUUsZ0JBQWdCLElBQUksQ0FBQ0EsZ0JBQWdCLENBQUNDLFNBQVMsSUFBSUQsZ0JBQWdCLENBQUNFLEtBQUssRUFBRTtRQUM5RSxPQUFPRixnQkFBZ0IsQ0FBQ0UsS0FBSyxFQUFFMUwsUUFBUSxDQUFDLENBQUM7TUFDMUM7TUFDQSxPQUFPWixRQUFRLENBQUNNLFdBQVcsQ0FBQ0MsTUFBTSxFQUFFK0wsS0FBSyxFQUFFMUwsUUFBUSxDQUFDLENBQUMsSUFBSVosUUFBUSxDQUFDVSxJQUFJO0lBQ3ZFLENBQUMsTUFBTSxJQUFJNkwsZ0JBQWdCLENBQUN2TSxRQUFRLENBQUMsRUFBRTtNQUN0QyxJQUFJLENBQUMsQ0FBQ2tHLE9BQU8sSUFBSWxHLFFBQVEsQ0FBQ3FLLEtBQUssb0VBQXlELEVBQUU7UUFDekYsT0FBT3JLLFFBQVEsRUFBRXNNLEtBQUssRUFBRTFMLFFBQVEsQ0FBQyxDQUFDO01BQ25DO01BQ0EsT0FDQ1osUUFBUSxFQUFFc00sS0FBSyxFQUFFMUwsUUFBUSxDQUFDLENBQUMsSUFDM0JtTCxpQkFBaUIsQ0FDaEJQLDJCQUEyQixDQUFDeEwsUUFBUSxDQUFDdUssS0FBSyxFQUFFckgsT0FBTyxFQUFFNUMsV0FBVyxFQUFFQyxNQUFNLEVBQUUrTCxLQUFLLEVBQUUsRUFBRSxFQUFFdE0sUUFBUSxDQUFDdUssS0FBSyxFQUFFckgsT0FBTyxFQUFFeEMsSUFBSSxDQUNuSCxDQUFDO0lBRUgsQ0FBQyxNQUFNLElBQUlWLFFBQVEsQ0FBQ3FLLEtBQUssd0RBQTZDLEVBQUU7TUFDdkUsT0FDQ3JLLFFBQVEsQ0FBQ3NNLEtBQUssRUFBRTFMLFFBQVEsQ0FBQyxDQUFDLElBQzFCbUwsaUJBQWlCLENBQ2hCUCwyQkFBMkIsQ0FBRXhMLFFBQVEsQ0FBQ3NLLE1BQU0sRUFBRXBILE9BQU8sRUFBZ0JxSCxLQUFLLEVBQUVySCxPQUFPLEVBQUU1QyxXQUFXLEVBQUVDLE1BQU0sRUFBRStMLEtBQUssRUFBRUUsT0FBTyxDQUFDLENBQUMsQ0FDM0gsQ0FBQztJQUVILENBQUMsTUFBTTtNQUNOLE9BQU94TSxRQUFRLENBQUNzTSxLQUFLLEVBQUUxTCxRQUFRLENBQUMsQ0FBQztJQUNsQztFQUNELENBQUM7RUFFRCxNQUFNNkwsV0FBVyxHQUFHLFNBQUFBLENBQVV2QyxNQUF5QyxFQUFzQjtJQUM1RixJQUFJLENBQUNBLE1BQU0sRUFBRTtNQUNaLE9BQU85SyxTQUFTO0lBQ2pCO0lBQ0EsSUFBSTZKLFVBQVUsQ0FBQ2lCLE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUM1SixXQUFXLEVBQUVDLE1BQU0sRUFBRW1NLFNBQVMsRUFBRTtNQUNoRSxPQUFPeEMsTUFBTSxDQUFDNUosV0FBVyxFQUFFQyxNQUFNLEVBQUVtTSxTQUFTLEdBQ3pDWCxpQkFBaUIsQ0FBQ1AsMkJBQTJCLENBQUN0QixNQUFNLENBQUM1SixXQUFXLENBQUNDLE1BQU0sQ0FBQ21NLFNBQVMsQ0FBQyxDQUFDLEdBQ25GdE4sU0FBUztJQUNiLENBQUMsTUFBTSxJQUFJbU4sZ0JBQWdCLENBQUNyQyxNQUFNLENBQUMsRUFBRTtNQUNwQyxPQUFPQSxNQUFNLENBQUNLLEtBQUssRUFBRXJILE9BQU8sRUFBRTVDLFdBQVcsRUFBRUMsTUFBTSxFQUFFbU0sU0FBUyxHQUN6RFgsaUJBQWlCLENBQUNQLDJCQUEyQixDQUFDdEIsTUFBTSxDQUFDSyxLQUFLLENBQUNySCxPQUFPLENBQUM1QyxXQUFXLENBQUNDLE1BQU0sQ0FBQ21NLFNBQVMsQ0FBQyxDQUFDLEdBQ2pHdE4sU0FBUztJQUNiLENBQUMsTUFBTSxJQUFJOEssTUFBTSxDQUFDRyxLQUFLLHdEQUE2QyxFQUFFO01BQ3JFLE1BQU1zQyxlQUFlLEdBQUd6QyxNQUFNLENBQUNJLE1BQU0sRUFBRXBILE9BQW9CO01BQzNELE9BQU95SixlQUFlLEVBQUVwQyxLQUFLLEVBQUVySCxPQUFPLEVBQUU1QyxXQUFXLEVBQUVDLE1BQU0sRUFBRW1NLFNBQVMsR0FDbkVYLGlCQUFpQixDQUFDUCwyQkFBMkIsQ0FBQ21CLGVBQWUsQ0FBQ3BDLEtBQUssQ0FBQ3JILE9BQU8sQ0FBQzVDLFdBQVcsQ0FBQ0MsTUFBTSxDQUFDbU0sU0FBUyxDQUFDLENBQUMsR0FDMUd0TixTQUFTO0lBQ2IsQ0FBQyxNQUFNO01BQ04sT0FBT0EsU0FBUztJQUNqQjtFQUNELENBQUM7RUFFTSxTQUFTd04sc0JBQXNCQSxDQUFDQyxPQUFlLEVBQUVDLHlCQUFtQyxFQUFxQztJQUMvSCxPQUFPQyxZQUFZLENBQ2xCLENBQ0NDLFdBQVcsQ0FBQyw4QkFBOEIsRUFBRSxVQUFVLENBQUMsRUFDdkRBLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsRUFDM0NILE9BQU8sRUFDUEMseUJBQXlCLENBQ3pCLEVBQ0RHLGVBQWUsQ0FBQ0MscUNBQ2pCLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBVkEvUCxRQUFBLENBQUF5UCxzQkFBQSxHQUFBQSxzQkFBQTtFQVdBLE1BQU10SCxxQkFBcUIsR0FBRyxTQUFBQSxDQUM3QmhELGtCQUE0QyxFQUM1QzZLLGVBQXdDLEVBQ3hDM1AsZ0JBQXlELEVBQ3pEK0UsVUFBc0IsRUFDdEJFLHFDQUFrRSxFQUNsRUQsaUJBQWdDLEVBQ2hDRSx3QkFBbUQsRUFDekI7SUFDMUIsTUFBTTJDLGNBQXVDLEdBQUcsRUFBRTtJQUNsRCxNQUFNK0gsc0JBQThDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pELE1BQU14SyxpQkFBaUIsR0FBRyxJQUFJQyxpQkFBaUIsQ0FBQ04sVUFBVSxFQUFFL0UsZ0JBQWdCLENBQUM7SUFDN0V5RyxNQUFNLENBQUNDLElBQUksQ0FBQzVCLGtCQUFrQixDQUFDLENBQUMzQyxPQUFPLENBQUVlLElBQUksSUFBSztNQUNqRCxNQUFNVixRQUFRLEdBQUdzQyxrQkFBa0IsQ0FBQzVCLElBQUksQ0FBQztRQUN4QytHLGNBQWMsR0FBR2pLLGdCQUFnQixDQUFDNlAseUJBQXlCLENBQUMzTSxJQUFJLENBQUM7UUFDakU7UUFDQTRNLGFBQWEsR0FBR0gsZUFBZSxDQUFDbk8sSUFBSSxDQUFFQyxNQUFNLElBQUtBLE1BQU0sQ0FBQ3lCLElBQUksS0FBS0EsSUFBSSxDQUFDO01BQ3ZFLE1BQU1uQixtQkFBbUIsR0FBRy9CLGdCQUFnQixDQUFDZ0Msc0JBQXNCLENBQUNoQyxnQkFBZ0IsQ0FBQ2lDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0Msc0JBQXNCLENBQUMsQ0FBQztNQUMvSCxNQUFNNk4sa0JBQWtCLEdBQUd4TixvQkFBb0IsQ0FBd0JSLG1CQUFtQixFQUFFbUIsSUFBSSxDQUFDO01BQ2pHLElBQUk4TSxpQkFBaUIsQ0FBQ0Qsa0JBQWtCLENBQUMsRUFBRTtRQUMxQyxNQUFNRSx5QkFBeUIsR0FBR3RNLGtDQUFrQyxDQUFDb00sa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztRQUNyRyxNQUFNdE8sTUFBTSxHQUFHdUYsK0JBQStCLENBQzdDeEUsUUFBUSxFQUNSeUgsY0FBYyxFQUNkL0csSUFBSSxFQUNKLElBQUksRUFDSixLQUFLLEVBQ0xrQyxpQkFBaUIsRUFDakJwRixnQkFBZ0IsRUFDaEJpRixxQ0FBcUMsRUFDckNDLHdCQUF3QixFQUN4QkYsaUJBQWlCLEVBQ2pCcEQsU0FBUyxFQUNUcU8seUJBQ0QsQ0FBQztRQUNEQyw2QkFBNkIsQ0FBQ1AsZUFBZSxFQUFFek0sSUFBSSxFQUFFekIsTUFBTSxDQUFDO1FBQzVEb0csY0FBYyxDQUFDSixJQUFJLENBQUNoRyxNQUFNLENBQUM7UUFDM0JtTyxzQkFBc0IsQ0FBQzFNLElBQUksQ0FBQyxHQUFHK00seUJBQXlCLElBQUkvTSxJQUFJO01BQ2pFLENBQUMsTUFBTSxJQUFJNE0sYUFBYSxLQUFLbE8sU0FBUyxFQUFFO1FBQ3ZDO1FBQ0E7UUFDQSxNQUFNSCxNQUFNLEdBQUd1RiwrQkFBK0IsQ0FDN0N4RSxRQUFRLEVBQ1J5SCxjQUFjLEVBQ2QvRyxJQUFJLEVBQ0osSUFBSSxFQUNKLEtBQUssRUFDTGtDLGlCQUFpQixFQUNqQnBGLGdCQUFnQixFQUNoQmlGLHFDQUFxQyxFQUNyQ0Msd0JBQXdCLEVBQ3hCRixpQkFDRCxDQUFDO1FBQ0RrTCw2QkFBNkIsQ0FBQ1AsZUFBZSxFQUFFek0sSUFBSSxFQUFFekIsTUFBTSxDQUFDO1FBQzVEb0csY0FBYyxDQUFDSixJQUFJLENBQUNoRyxNQUFNLENBQUM7TUFDNUIsQ0FBQyxNQUFNLElBQUlxTyxhQUFhLENBQUM3RixjQUFjLEtBQUtBLGNBQWMsSUFBSTZGLGFBQWEsQ0FBQ25PLGFBQWEsRUFBRTtRQUMxRjtRQUNBO1FBQ0EsTUFBTXdPLE9BQU8sR0FBRyxhQUFhak4sSUFBSSxFQUFFO1FBQ25DO1FBQ0EsSUFBSSxDQUFDeU0sZUFBZSxDQUFDeEosSUFBSSxDQUFFMUUsTUFBTSxJQUFLQSxNQUFNLENBQUN5QixJQUFJLEtBQUtpTixPQUFPLENBQUMsRUFBRTtVQUMvRDtVQUNBO1VBQ0EsTUFBTTFPLE1BQU0sR0FBR3VGLCtCQUErQixDQUM3Q3hFLFFBQVEsRUFDUnlILGNBQWMsRUFDZC9HLElBQUksRUFDSixLQUFLLEVBQ0wsS0FBSyxFQUNMa0MsaUJBQWlCLEVBQ2pCcEYsZ0JBQWdCLEVBQ2hCaUYscUNBQXFDLEVBQ3JDQyx3QkFBd0IsRUFDeEJGLGlCQUNELENBQUM7VUFDRGtMLDZCQUE2QixDQUFDUCxlQUFlLEVBQUV6TSxJQUFJLEVBQUV6QixNQUFNLENBQUM7VUFDNURvRyxjQUFjLENBQUNKLElBQUksQ0FBQ2hHLE1BQU0sQ0FBQztVQUMzQm1PLHNCQUFzQixDQUFDMU0sSUFBSSxDQUFDLEdBQUdpTixPQUFPO1FBQ3ZDLENBQUMsTUFBTSxJQUNOUixlQUFlLENBQUN4SixJQUFJLENBQUUxRSxNQUFNLElBQUtBLE1BQU0sQ0FBQ3lCLElBQUksS0FBS2lOLE9BQU8sQ0FBQyxJQUN6RFIsZUFBZSxDQUFDeEosSUFBSSxDQUFFMUUsTUFBTSxJQUFLQSxNQUFNLENBQUNFLGFBQWEsRUFBRTBFLFFBQVEsQ0FBQ25ELElBQUksQ0FBQyxDQUFDLEVBQ3JFO1VBQ0QwTSxzQkFBc0IsQ0FBQzFNLElBQUksQ0FBQyxHQUFHaU4sT0FBTztRQUN2QztNQUNEO0lBQ0QsQ0FBQyxDQUFDO0lBQ0Y7SUFDQTtJQUNBUixlQUFlLENBQUN4TixPQUFPLENBQUVWLE1BQU0sSUFBSztNQUNuQ0EsTUFBTSxDQUFDRSxhQUFhLEdBQUdGLE1BQU0sQ0FBQ0UsYUFBYSxFQUFFOEQsR0FBRyxDQUFFMkssWUFBWSxJQUFLUixzQkFBc0IsQ0FBQ1EsWUFBWSxDQUFDLElBQUlBLFlBQVksQ0FBQztNQUN4SDNPLE1BQU0sQ0FBQzhGLHVCQUF1QixHQUFHOUYsTUFBTSxDQUFDOEYsdUJBQXVCLEVBQUU5QixHQUFHLENBQ2xFMkssWUFBWSxJQUFLUixzQkFBc0IsQ0FBQ1EsWUFBWSxDQUFDLElBQUlBLFlBQzNELENBQUM7SUFDRixDQUFDLENBQUM7SUFDRixPQUFPdkksY0FBYztFQUN0QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTXdJLHdCQUF3QixHQUFHLFNBQUFBLENBQVVoRCxTQUFpQyxFQUFVO0lBQ3JGO0lBQ0EsSUFBSTBCLGdCQUFnQixDQUFDMUIsU0FBUyxDQUFDLElBQUlBLFNBQVMsQ0FBQ04sS0FBSyxFQUFFeEwsSUFBSSxFQUFFO01BQ3pELE9BQU84TCxTQUFTLENBQUNOLEtBQUssRUFBRXhMLElBQUk7SUFDN0IsQ0FBQyxNQUFNLElBQUk4TCxTQUFTLENBQUNSLEtBQUssd0RBQTZDLElBQUtRLFNBQVMsQ0FBQ1AsTUFBTSxFQUFFcEgsT0FBTyxFQUFnQnFILEtBQUssRUFBRXhMLElBQUksRUFBRTtNQUNqSTtNQUNBLE9BQVE4TCxTQUFTLENBQUNQLE1BQU0sRUFBRXBILE9BQU8sRUFBZ0JxSCxLQUFLLENBQUN4TCxJQUFJO0lBQzVELENBQUMsTUFBTTtNQUNOLE9BQU8rTyxTQUFTLENBQUNDLHdCQUF3QixDQUFDbEQsU0FBUyxDQUFDO0lBQ3JEO0VBQ0QsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU1tRCx1QkFBdUIsR0FBRyxTQUFBQSxDQUMvQkMsY0FBc0IsRUFDdEIxUSxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUNuQztJQUN0QixNQUFNTSxPQUFPLEdBQUdOLGdCQUFnQixDQUFDSywrQkFBK0IsQ0FBNkJOLGlCQUFpQixDQUFDLEVBQUVPLE9BQU87SUFDeEgsTUFBTW9RLFVBQVUsR0FBR3BRLE9BQU8sSUFBSW1HLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDcEcsT0FBTyxDQUFDO0lBQ2xELE9BQ0NvUSxVQUFVLElBQ1YsQ0FBQyxDQUFDQSxVQUFVLENBQUNsUCxJQUFJLENBQUMsVUFBVW9JLEdBQVcsRUFBRTtNQUN4QyxPQUFPQSxHQUFHLEtBQUs2RyxjQUFjLElBQUtuUSxPQUFPLENBQUNzSixHQUFHLENBQUMsQ0FBeUMrRyxtQkFBbUI7SUFDM0csQ0FBQyxDQUFDO0VBRUosQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsU0FBQUEsQ0FBVXZELFNBQWlDLEVBQVU7SUFDN0UsSUFBSXhMLFlBQVksR0FBRyxFQUFFO0lBQ3JCLFFBQVF3TCxTQUFTLENBQUNSLEtBQUs7TUFDdEI7TUFDQTtNQUNBO01BQ0E7TUFDQTtRQUNDaEwsWUFBWSxHQUFJd0wsU0FBUyxFQUFnQk4sS0FBSyxFQUFFeEwsSUFBSTtRQUNwRDtNQUNEO1FBQ0NNLFlBQVksR0FBR3dMLFNBQVMsRUFBRVAsTUFBTSxFQUFFK0QsS0FBSztRQUN2QztNQUNEO01BQ0E7TUFDQTtNQUNBO1FBQ0NoUCxZQUFZLEdBQUd5TyxTQUFTLENBQUNDLHdCQUF3QixDQUFDbEQsU0FBUyxDQUFDO1FBQzVEO0lBQ0Y7SUFDQSxPQUFPeEwsWUFBWTtFQUNwQixDQUFDO0VBRUQsTUFBTTRHLGFBQWEsR0FBRyxTQUFBQSxDQUFVbEgsSUFBWSxFQUFFdVAsV0FBb0IsRUFBRUMsVUFBbUIsRUFBVTtJQUNoRyxNQUFNQyxXQUFXLEdBQUdGLFdBQVcsR0FBR3ZQLElBQUksQ0FBQzBQLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRzFQLElBQUksQ0FBQzJQLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDM0UsSUFBSUYsV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO01BQ3ZCLE9BQU96UCxJQUFJO0lBQ1o7SUFDQSxPQUFPd1AsVUFBVSxHQUFHeFAsSUFBSSxDQUFDNFAsU0FBUyxDQUFDSCxXQUFXLEdBQUcsQ0FBQyxFQUFFelAsSUFBSSxDQUFDNEYsTUFBTSxDQUFDLEdBQUc1RixJQUFJLENBQUM0UCxTQUFTLENBQUMsQ0FBQyxFQUFFSCxXQUFXLENBQUM7RUFDbEcsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNSSxvQkFBb0IsR0FBRyxTQUFBQSxDQUM1Qi9ELFNBQWlDLEVBQ2pDck4sZ0JBQXlELEVBQy9DO0lBQ1YsSUFBSStPLGdCQUFnQixDQUFDMUIsU0FBUyxDQUFDLElBQUkxRiwwQkFBMEIsQ0FBQzBGLFNBQVMsQ0FBQ04sS0FBSyxDQUFDLEVBQUU7TUFDL0UsTUFBTWdELGtCQUFrQixHQUFHeE4sb0JBQW9CLENBQzlDdkMsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQ3pDbUwsU0FBUyxDQUFDTixLQUFLLENBQUN4TCxJQUNqQixDQUFDO01BQ0QsT0FBT3lPLGlCQUFpQixDQUFDRCxrQkFBa0IsQ0FBQztJQUM3QyxDQUFDLE1BQU07TUFDTixPQUFPLEtBQUs7SUFDYjtFQUNELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU1zQixpQkFBaUIsR0FBRyxTQUFBQSxDQUN6QmhFLFNBQWlDLEVBQ2pDaUUsWUFBb0IsRUFDcEJDLGtCQUE0QixFQUM1QmpMLHFCQUEwQyxFQUNoQztJQUNWLE9BQ0MsQ0FBQ2lMLGtCQUFrQixDQUFDbEwsUUFBUSxDQUFDaUwsWUFBWSxDQUFDO0lBQUk7SUFDNUMsQ0FBQ2pFLFNBQVMsQ0FBQ1IsS0FBSywyQ0FBZ0MsSUFBSVEsU0FBUyxDQUFDUixLQUFLLHdEQUE2QyxLQUNqSHBHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSixxQkFBcUIsQ0FBQ0ssVUFBVSxDQUFDLENBQUNSLElBQUksQ0FBRXFMLFFBQVEsSUFBSztNQUNoRSxNQUFNbEosUUFBUSxHQUFHQyxtQ0FBbUMsQ0FBQ2pDLHFCQUFxQixDQUFDSyxVQUFVLENBQUM2SyxRQUFRLENBQUMsQ0FBQ2xLLGtCQUFrQixDQUFDO01BQ25ILE9BQU8sQ0FBQ2dCLFFBQVEsSUFBSSxDQUFDaUosa0JBQWtCLENBQUNsTCxRQUFRLENBQUNtTCxRQUFRLENBQUM7SUFDM0QsQ0FBQyxDQUFDLElBQ0ZuRSxTQUFTLENBQUNSLEtBQUssa0RBQXVDLElBQ3REUSxTQUFTLENBQUNSLEtBQUssb0VBQXlELElBQ3hFUSxTQUFTLENBQUNSLEtBQUsscURBQTBDLENBQUM7RUFFN0QsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sTUFBTXZDLHdCQUF3QixHQUFHLFNBQUFBLENBQVV0SyxnQkFBeUQsRUFBVztJQUNySCxNQUFNeVIsZUFBNEMsR0FBR0MsbUJBQW1CLENBQUMxUixnQkFBZ0IsQ0FBQztJQUMxRixPQUFPK0ssV0FBVyxDQUFDVCx3QkFBd0IsQ0FBQzFJLFNBQVMsRUFBRTZQLGVBQWUsQ0FBQztFQUN4RSxDQUFDO0VBQUM5UixRQUFBLENBQUEySyx3QkFBQSxHQUFBQSx3QkFBQTtFQUVGLFNBQVNvSCxtQkFBbUJBLENBQUNDLGdCQUF5RCxFQUErQjtJQUNwSCxNQUFNQyxTQUFTLEdBQUdELGdCQUFnQixDQUFDRSxZQUFZLENBQUMsQ0FBQztJQUNqRCxJQUFJQyxVQUFVLENBQUNDLFdBQVcsQ0FBQ0gsU0FBUyxDQUFDLEVBQUU7TUFDdEMsT0FDQ0EsU0FBUyxDQUFDOU8sV0FBVyxDQUFDa1AsWUFBWSxFQUFFQyxlQUFlLElBQ25ETixnQkFBZ0IsQ0FBQ08sa0JBQWtCLENBQUMsQ0FBQyxDQUFDcFAsV0FBVyxDQUFDa1AsWUFBWSxFQUFFQyxlQUFlO0lBRWpGO0lBQ0EsT0FBT3JRLFNBQVM7RUFDakI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVN1USxnQ0FBZ0NBLENBQUNoUixhQUE0QyxFQUFpQztJQUN0SCxPQUFPQSxhQUFhLEtBQUtTLFNBQVMsR0FDL0JBLFNBQVMsR0FDVDtNQUNBd1EsYUFBYSxFQUFFLENBQUM7TUFDaEIsR0FBR2pSO0lBQ0gsQ0FBQztFQUNMO0VBRUEsU0FBU2tSLHNCQUFzQkEsQ0FBQ0MsWUFBeUIsRUFBRXBQLElBQVksRUFBbUQ7SUFDekgsTUFBTXFQLGtCQUE0QixHQUFHLEVBQUU7SUFDdkMsSUFBSUMsaUJBQWlCLEdBQUcsS0FBSztJQUM3QixLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0gsWUFBWSxDQUFDbkwsTUFBTSxFQUFFc0wsQ0FBQyxFQUFFLEVBQUU7TUFDN0NGLGtCQUFrQixDQUFDOUssSUFBSSxDQUFDNkssWUFBWSxDQUFDRyxDQUFDLENBQUMsQ0FBQzVCLEtBQUssQ0FBQztNQUM5QyxJQUFJeUIsWUFBWSxDQUFDRyxDQUFDLENBQUMsQ0FBQzVCLEtBQUssS0FBSzNOLElBQUksRUFBRTtRQUNuQ3NQLGlCQUFpQixHQUFHLElBQUk7TUFDekI7SUFDRDtJQUNBLE9BQU87TUFDTkUsTUFBTSxFQUFFSCxrQkFBa0I7TUFDMUJJLGdCQUFnQixFQUFFSDtJQUNuQixDQUFDO0VBQ0Y7RUFFQSxTQUFTSSxlQUFlQSxDQUN2QkMsaUJBQTJCLEVBQzNCQyxvQkFBOEIsRUFDcUQ7SUFDbkYsSUFBSUMsa0NBQWtDLEdBQUcsS0FBSztJQUM5QyxJQUFJQyxhQUFhO0lBQ2pCLElBQUlILGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQzFMLE1BQU0sSUFBSSxDQUFDLElBQUkyTCxvQkFBb0IsSUFBSUEsb0JBQW9CLENBQUMzTCxNQUFNLElBQUksQ0FBQyxFQUFFO01BQ25ILEtBQUssSUFBSXNMLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0ksaUJBQWlCLENBQUMxTCxNQUFNLEVBQUVzTCxDQUFDLEVBQUUsRUFBRTtRQUNsRCxJQUFJLENBQUNJLGlCQUFpQixDQUFDSixDQUFDLENBQUMsQ0FBQyxDQUFDdE0sSUFBSSxDQUFFOE0sR0FBRyxJQUFLSCxvQkFBb0IsQ0FBQ3pNLFFBQVEsQ0FBQzRNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7VUFDN0VGLGtDQUFrQyxHQUFHLElBQUk7VUFDekNDLGFBQWEsR0FBR0gsaUJBQWlCLENBQUNKLENBQUMsQ0FBQztVQUNwQztRQUNEO01BQ0Q7SUFDRDtJQUNBLE9BQU87TUFDTk0sa0NBQWtDLEVBQUVBLGtDQUFrQztNQUN0RUcsc0JBQXNCLEVBQUVGO0lBQ3pCLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTRyxrQ0FBa0NBLENBQzFDOUUsY0FBNkMsRUFDN0N3RSxpQkFBMkIsRUFDOEM7SUFDekU7SUFDQSxNQUFNTyxXQUFxQixHQUFHLEVBQUU7SUFDaEMsSUFBSUMsZ0JBQWtHLEdBQUc7TUFDeEdOLGtDQUFrQyxFQUFFLEtBQUs7TUFDekNHLHNCQUFzQixFQUFFdFI7SUFDekIsQ0FBQztJQUNELElBQ0N5TSxjQUFjLElBQ2RBLGNBQWMsQ0FBQ3hCLEtBQUssd0RBQTZDLElBQ2pFd0IsY0FBYyxDQUFDdkIsTUFBTSxFQUFFcEgsT0FBTyxFQUFFbUgsS0FBSyxnREFBcUMsRUFDekU7TUFDRHdCLGNBQWMsQ0FBQ3ZCLE1BQU0sQ0FBQ3BILE9BQU8sQ0FBQzhJLElBQUksRUFBRXJNLE9BQU8sQ0FBRXNNLGNBQXNDLElBQUs7UUFDdkYsSUFDQyxDQUFDQSxjQUFjLENBQUM1QixLQUFLLDJDQUFnQyxJQUFJNEIsY0FBYyxDQUFDNUIsS0FBSyxrREFBdUMsS0FDcEg0QixjQUFjLENBQUMxQixLQUFLLEVBQ25CO1VBQ0RxRyxXQUFXLENBQUMzTCxJQUFJLENBQUNnSCxjQUFjLENBQUMxQixLQUFLLENBQUN4TCxJQUFJLENBQUM7UUFDNUM7UUFDQThSLGdCQUFnQixHQUFHVCxlQUFlLENBQUNDLGlCQUFpQixFQUFFTyxXQUFXLENBQUM7TUFDbkUsQ0FBQyxDQUFDO0lBQ0g7SUFDQSxPQUFPO01BQ05MLGtDQUFrQyxFQUFFTSxnQkFBZ0IsQ0FBQ04sa0NBQWtDO01BQ3ZGekIsWUFBWSxFQUFFK0IsZ0JBQWdCLENBQUNIO0lBQ2hDLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNJLGlDQUFpQ0EsQ0FDekNwUSxJQUFZLEVBQ1pvUCxZQUF5QixFQUN6QmpFLGNBQTZDLEVBTTNDO0lBQ0YsSUFBSSxDQUFDaUUsWUFBWSxFQUFFO01BQ2xCLE9BQU8sQ0FBQyxDQUFDO0lBQ1Y7SUFDQSxNQUFNaUIsV0FBVyxHQUFHbEIsc0JBQXNCLENBQUNDLFlBQVksRUFBRXBQLElBQUksQ0FBQztJQUM5RCxNQUFNc1EsdUJBQXVCLEdBQUdMLGtDQUFrQyxDQUFDOUUsY0FBYyxFQUFFa0YsV0FBVyxDQUFDYixNQUFNLENBQUM7SUFDdEcsSUFBSWMsdUJBQXVCLENBQUNULGtDQUFrQyxFQUFFO01BQy9EO01BQ0EsT0FBTztRQUNOO1FBQ0FVLG9DQUFvQyxFQUFFRCx1QkFBdUIsQ0FBQ2xDLFlBQVk7UUFDMUViLGNBQWMsRUFBRXZOLElBQUk7UUFDcEJ3USxxQkFBcUIsRUFBRW5GLGlCQUFpQixDQUFDYSxzQkFBc0IsQ0FBQ2xNLElBQUksRUFBRSxJQUFJLENBQUM7TUFDNUUsQ0FBQztJQUNGLENBQUMsTUFBTSxJQUFJcVEsV0FBVyxDQUFDWixnQkFBZ0IsRUFBRTtNQUN4QyxPQUFPO1FBQ05nQixpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCRCxxQkFBcUIsRUFBRW5GLGlCQUFpQixDQUFDYSxzQkFBc0IsQ0FBQ2xNLElBQUksRUFBRSxLQUFLLENBQUM7TUFDN0UsQ0FBQztJQUNGO0lBQ0EsT0FBTyxDQUFDLENBQUM7RUFDVjtFQUVBLFNBQVMwUSxhQUFhQSxDQUFDdkcsU0FBeUIsRUFBVTtJQUN6RCxNQUFNdk0sVUFBVSxHQUFHdU0sU0FBUyxFQUFFdkssV0FBVyxFQUFFMEgsRUFBRSxFQUFFcUosVUFBb0I7SUFDbkUsSUFBSS9TLFVBQVUsSUFBSUEsVUFBVSxDQUFDdUYsUUFBUSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7TUFDaEUsT0FBTyxDQUFDO0lBQ1Q7SUFDQSxJQUFJdkYsVUFBVSxJQUFJQSxVQUFVLENBQUN1RixRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFBRTtNQUNsRSxPQUFPLENBQUM7SUFDVDtJQUNBLElBQUl2RixVQUFVLElBQUlBLFVBQVUsQ0FBQ3VGLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO01BQy9ELE9BQU8sQ0FBQztJQUNUO0lBQ0EsT0FBTyxDQUFDO0VBQ1Q7RUFFQSxTQUFTeU4sdUJBQXVCQSxDQUFDekcsU0FBeUIsRUFBYztJQUN2RSxNQUFNdk0sVUFBVSxHQUFHdU0sU0FBUyxFQUFFdkssV0FBVyxFQUFFMEgsRUFBRSxFQUFFcUosVUFBb0I7SUFDbkUsT0FBTy9TLFVBQVUsR0FBSUEsVUFBVSxDQUFDaVQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFrQkYsVUFBVSxDQUFDRyxJQUFJO0VBQy9FOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTbEosOEJBQThCQSxDQUFDdEksUUFBa0IsRUFBRWYsTUFBNkIsRUFBUTtJQUNoRyxNQUFNd1MsaUJBQWlCLEdBQUdDLHlCQUF5QixDQUFDMVIsUUFBUSxDQUFDO0lBQzdELElBQ0MyUiwrQkFBK0IsQ0FBQzNSLFFBQVEsQ0FBQyxJQUN6QyxPQUFPeVIsaUJBQWlCLEtBQUssUUFBUSxJQUNyQ3hTLE1BQU0sQ0FBQ0wsY0FBYyxJQUNyQkssTUFBTSxDQUFDTCxjQUFjLEVBQUV5QyxJQUFJLEtBQUssR0FBRyxFQUNsQztNQUNEcEMsTUFBTSxDQUFDNEYsMEJBQTBCLEdBQUc0TSxpQkFBaUI7TUFDckR4UyxNQUFNLENBQUNMLGNBQWMsQ0FBQ2lMLFFBQVEsR0FBRyxNQUFNLEdBQUc0SCxpQkFBaUI7SUFDNUQ7RUFDRDtFQUVBLFNBQVNHLGlCQUFpQkEsQ0FBQ0MsTUFBd0IsRUFBYztJQUNoRSxJQUFJQSxNQUFNLElBQUlBLE1BQU0sQ0FBQ2xOLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDaEMsSUFBSW1OLFlBQVksR0FBRyxDQUFDLENBQUM7TUFDckIsSUFBSUMsU0FBUyxHQUFHLENBQUMsQ0FBQztNQUNsQixJQUFJQywwQkFBMEI7TUFDOUIsS0FBSyxNQUFNQyxLQUFLLElBQUlKLE1BQU0sRUFBRTtRQUMzQkUsU0FBUyxHQUFHWCxhQUFhLENBQUNhLEtBQUssQ0FBQztRQUNoQyxJQUFJRixTQUFTLEdBQUdELFlBQVksRUFBRTtVQUM3QkEsWUFBWSxHQUFHQyxTQUFTO1VBQ3hCQywwQkFBMEIsR0FBR0MsS0FBSztRQUNuQztNQUNEO01BQ0EsT0FBT1gsdUJBQXVCLENBQUNVLDBCQUE0QyxDQUFDO0lBQzdFO0lBQ0EsT0FBT1gsVUFBVSxDQUFDRyxJQUFJO0VBQ3ZCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVN6SixhQUFhQSxDQUM1QnZLLGdCQUF5RCxFQUN6RHFOLFNBQTZDLEVBQ3BCO0lBQ3pCLElBQUksQ0FBQ0EsU0FBUyxFQUFFO01BQ2YsT0FBT3pMLFNBQVM7SUFDakI7SUFDQSxNQUFNMFEsWUFBWSxHQUFHdFMsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUN3UyxnQkFBZ0IsQ0FBQzVSLFdBQVcsQ0FBQ0MsTUFBTSxFQUFFNFIsV0FBVyxJQUFJLEVBQUU7SUFDckgsTUFBTUMsa0JBQWtCLEdBQUdDLHFCQUFxQixDQUFDN1UsZ0JBQWdCLENBQUM7SUFDbEUsTUFBTThVLFFBQVEsR0FBRyxDQUFDLEdBQUd4QyxZQUFZLEVBQUUsR0FBR3NDLGtCQUFrQixDQUFDLENBQUNuUCxHQUFHLENBQUU2TCxZQUFZLElBQUtBLFlBQVksQ0FBQzVMLE9BQU8sRUFBRXdCLGtCQUFrQixDQUFDO0lBQ3pIO0lBQ0EsSUFBSTZOLG9CQUFvQjtJQUN4QixJQUFJQyxrQkFBa0IsQ0FBeUIzSCxTQUFTLHFEQUEwQyxDQUFDLEVBQUU7TUFDcEcsTUFBTTRILGVBQWUsR0FBRzVILFNBQVMsQ0FBQ1AsTUFBTSxDQUFDcEgsT0FBTztNQUNoRCxJQUFJc1Asa0JBQWtCLENBQWFDLGVBQWUsNkNBQWtDLENBQUMsRUFBRTtRQUN0RixNQUFNQyxjQUFjLEdBQUdELGVBQWUsQ0FBQ3pHLElBQUk7UUFDM0M7UUFDQSxJQUNDMEcsY0FBYyxDQUFDL08sSUFBSSxDQUFDLFVBQVVnUCxtQkFBMkMsRUFBVztVQUNuRixPQUNDcEcsZ0JBQWdCLENBQUNvRyxtQkFBbUIsQ0FBQyxJQUFJTCxRQUFRLENBQUN6TyxRQUFRLENBQUM4TyxtQkFBbUIsQ0FBQ3BJLEtBQUssRUFBRXJILE9BQU8sRUFBRXdCLGtCQUFrQixDQUFDO1FBRXBILENBQUMsQ0FBQyxFQUNEO1VBQ0QsT0FBTzJNLFVBQVUsQ0FBQ3VCLElBQUk7UUFDdkIsQ0FBQyxNQUFNO1VBQ047VUFDQSxJQUFJL0gsU0FBUyxFQUFFdkssV0FBVyxFQUFFMEgsRUFBRSxFQUFFcUosVUFBVSxFQUFFO1lBQzNDLE9BQU9DLHVCQUF1QixDQUFDekcsU0FBc0MsQ0FBQztVQUN2RTtVQUNBO1VBQ0EwSCxvQkFBb0IsR0FBR0csY0FBYyxDQUFDdlAsTUFBTSxDQUFDLFVBQVUwUCxJQUFJLEVBQUU7WUFDNUQsT0FBT0EsSUFBSSxFQUFFdlMsV0FBVyxFQUFFMEgsRUFBRSxFQUFFcUosVUFBVTtVQUN6QyxDQUFDLENBQUM7VUFDRixPQUFPTyxpQkFBaUIsQ0FBQ1csb0JBQXdDLENBQUM7UUFDbkU7TUFDRDtJQUNEO0lBQ0EsT0FBT0QsUUFBUSxDQUFDek8sUUFBUSxDQUFFZ0gsU0FBUyxDQUFvQk4sS0FBSyxFQUFFckgsT0FBTyxFQUFFd0Isa0JBQWtCLENBQUMsR0FDdkYyTSxVQUFVLENBQUN1QixJQUFJLEdBQ2Z0Qix1QkFBdUIsQ0FBQ3pHLFNBQXNDLENBQUM7RUFDbkU7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBMU4sUUFBQSxDQUFBNEssYUFBQSxHQUFBQSxhQUFBO0VBUUEsTUFBTXJLLHlCQUF5QixHQUFHLFNBQUFBLENBQ2pDTCxrQkFBNEIsRUFDNUJDLFNBQW9CLEVBQ3BCQyxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUMvQjtJQUMxQixNQUFNK0UsVUFBc0IsR0FBRy9FLGdCQUFnQixDQUFDTyx1QkFBdUIsQ0FBQ1Ysa0JBQWtCLENBQUM7TUFDMUZJLGlCQUEwQyxHQUFHLEVBQUU7TUFDL0M2RSxrQkFBNEMsR0FBRyxDQUFDLENBQUM7TUFDakRHLHFDQUFrRSxHQUFHLENBQUMsQ0FBQztNQUN2RUMsd0JBQXdCLEdBQUdvUSwyQkFBMkIsQ0FBQ3RWLGdCQUFnQixDQUFDO01BQ3hFdVYscUJBQWlELEdBQUd2VixnQkFBZ0IsQ0FBQ0ssK0JBQStCLENBQUNOLGlCQUFpQixDQUFDO01BQ3ZIeVYsbUJBQW1CLEdBQ2xCeFYsZ0JBQWdCLENBQUN5VixrQkFBa0IsQ0FBQyxDQUFDLENBQUNDLDZCQUE2QixDQUFDLENBQUMsRUFBRUMsTUFBTSxFQUFFQyxLQUFLLEVBQUVKLG1CQUFtQixLQUN6RyxvQkFBb0IsR0FDakJLLFlBQVksQ0FBQ0Msa0JBQWtCLEdBQy9CbFUsU0FBUztNQUNib0QsaUJBQStCLEdBQzlCdVEscUJBQXFCLEVBQUVRLGFBQWEsRUFBRUMsWUFBWSxFQUFFOVMsSUFBSSxJQUFJc1MsbUJBQW1CLElBQUlLLFlBQVksQ0FBQ3ZJLE1BQU07SUFDeEcsTUFBTWdGLFlBQXlCLEdBQUd0UyxnQkFBZ0IsQ0FBQ2lXLG9CQUFvQixDQUFDLFFBQVEsZ0RBQXFDLENBQ3BIalcsZ0JBQWdCLENBQUNrVyxhQUFhLENBQUMsQ0FBQyxDQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFnQjtJQUNwQixJQUFJclcsa0JBQWtCLEVBQUU7TUFDdkIsTUFBTXNXLHFCQUFxQixHQUFHblcsZ0JBQWdCLENBQUNnQyxzQkFBc0IsQ0FDcEVvVSxtQkFBbUIsQ0FBQ3BXLGdCQUFnQixDQUFDa0Msc0JBQXNCLENBQUMsQ0FBQyxDQUM5RCxDQUFDO01BQ0RyQyxrQkFBa0IsQ0FBQ3NDLE9BQU8sQ0FBRWtMLFNBQVMsSUFBSztRQUN6QztRQUNBLElBQUksQ0FBQ0QsY0FBYyxDQUFDQyxTQUFTLENBQUMsRUFBRTtVQUMvQjtRQUNEO1FBQ0EsSUFBSWpNLGNBQThDLEdBQUcsSUFBSTtRQUN6RCxNQUFNZ0gsNEJBQTRCLEdBQ2pDMkcsZ0JBQWdCLENBQUMxQixTQUFTLENBQUMsSUFBSUEsU0FBUyxDQUFDTixLQUFLLEVBQUVySCxPQUFPLEVBQUV3QixrQkFBa0IsR0FDeEVtQixxQkFBcUIsQ0FBQ3JJLGdCQUFnQixFQUFFcU4sU0FBUyxDQUFDLEdBQ2xEekwsU0FBUztRQUNiLE1BQU1DLFlBQVksR0FBRytPLGdCQUFnQixDQUFDdkQsU0FBUyxDQUFDO1FBQ2hEO1FBQ0EsTUFBTS9HLHFCQUEwQyxHQUFHK1AsbUNBQW1DLENBQUNoSixTQUFTLEVBQUVyTixnQkFBZ0IsRUFBRUYsU0FBUyxDQUFDO1FBQzlILE1BQU0wRyxvQkFBOEIsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNKLHFCQUFxQixDQUFDSyxVQUFVLENBQUM7UUFDcEYsTUFBTUMsdUJBQWlDLEdBQUdILE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSixxQkFBcUIsQ0FBQ08sb0JBQW9CLENBQUM7UUFDakcsTUFBTTJCLFNBQTZCLEdBQUczRyxZQUFZLEdBQUc0RyxhQUFhLENBQUM1RyxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHRCxTQUFTO1FBQ3pHLE1BQU04RyxPQUFnQixHQUFHRixTQUFTLElBQUkzRyxZQUFZO1FBQ2xELE1BQU04RyxLQUFLLEdBQUdDLFFBQVEsQ0FBQ3lFLFNBQVMsRUFBRTNFLE9BQU8sQ0FBQztRQUMxQyxNQUFNeEYsSUFBSSxHQUFHbU4sd0JBQXdCLENBQUNoRCxTQUFTLENBQUM7UUFDaEQsTUFBTWlKLGtCQUEyQixHQUFHOU4sU0FBUyxHQUFHQSxTQUFTLENBQUNuQyxRQUFRLENBQUMsNkNBQWtDLENBQUMsR0FBRyxLQUFLO1FBQzlHLE1BQU1zSyxtQkFBd0MsR0FBRzJGLGtCQUFrQixHQUNoRTlGLHVCQUF1QixDQUFDdE4sSUFBSSxFQUFFbkQsaUJBQWlCLEVBQUVDLGdCQUFnQixDQUFDLEdBQ2xFLEtBQUs7UUFDUixNQUFNNkksUUFBNEIsR0FBR0Msb0JBQW9CLENBQUN1RSxTQUFTLENBQUM7UUFDcEUsTUFBTWxNLGFBQWEsR0FBR2dSLGdDQUFnQyxDQUFDbUIsaUNBQWlDLENBQUNwUSxJQUFJLEVBQUVvUCxZQUFZLEVBQUVqRixTQUFTLENBQUMsQ0FBQztRQUN4SCxNQUFNL0ssMkJBQTJCLEdBQUdDLG9CQUFvQixDQUN2RHZDLGdCQUFnQixDQUFDa0Msc0JBQXNCLENBQUMsQ0FBQyxFQUN6Q0wsWUFDRCxDQUFDO1FBQ0Q7UUFDQSxNQUFNMFUsb0JBQTBDLEdBQUdqVSwyQkFBMkIsQ0FBQ29TLGdCQUFnQixDQUFDNkIsb0JBQW9CO1FBQ3BILE1BQU1DLGtCQUFrQixHQUFHRCxvQkFBb0IsQ0FBQzVRLE1BQU0sQ0FDcEQ4USxrQkFBa0IsSUFDbEIsQ0FBQ0Esa0JBQWtCLENBQUNDLFlBQVksSUFDaENELGtCQUFrQixDQUFDclEsVUFBVSxDQUFDdEQsV0FBVyxDQUFDQyxNQUFNLEVBQUU0VCxpQkFBaUIsRUFBRUMsSUFBSSxLQUFLLG1CQUNoRixDQUFDO1FBQ0QsTUFBTUMsaUJBQWlELEdBQUdMLGtCQUFrQixDQUFDclAsTUFBTSxJQUFJLENBQUMsR0FBR3FQLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxHQUFHNVUsU0FBUztRQUM1SCxJQUFJaVYsaUJBQWlCLElBQUkxVixhQUFhLEVBQUU7VUFDdkNBLGFBQWEsQ0FBQzJWLHNCQUFzQixHQUFHLElBQUk7UUFDNUM7UUFFQSxJQUFJeEksMkJBQTZEO1FBQ2pFLElBQ0NqQixTQUFTLENBQUNSLEtBQUssd0RBQTZDLElBQzVEUSxTQUFTLENBQUNQLE1BQU0sRUFBRXBILE9BQU8sRUFBRW1ILEtBQUssZ0RBQXFDLEVBQ3BFO1VBQ0R5QiwyQkFBMkIsR0FBR0YsK0JBQStCLENBQUNmLFNBQVMsQ0FBQztRQUN6RTtRQUNBLE1BQU0wSixZQUFZLEdBQUczRixvQkFBb0IsQ0FBQy9ELFNBQVMsRUFBRThJLHFCQUFxQixDQUFDO1FBQzNFLElBQUksQ0FBQ1ksWUFBWSxJQUFJdk4sbUJBQW1CLENBQUM2RCxTQUFTLENBQUMsRUFBRTtVQUNwRDtVQUNBak0sY0FBYyxHQUFHcUksMEJBQTBCLENBQUM0RCxTQUFTLEVBQUUvRyxxQkFBcUIsQ0FBQztRQUM5RTtRQUNBLElBQUl5QyxrQkFBa0Q7UUFDdEQsSUFBSUYsUUFBUSxFQUFFO1VBQ2JFLGtCQUFrQixHQUFHQyxhQUFhLENBQUNxRSxTQUFTLEVBQUV4RSxRQUFRLENBQUM7UUFDeEQ7UUFDQSxNQUFNUSxVQUE4QixHQUFHO1VBQ3RDQyxTQUFTLEVBQUVULFFBQThDO1VBQ3pEMUgsYUFBYSxFQUFFO1lBQ2QsR0FBR0EsYUFBYTtZQUNoQixHQUFHNEgsa0JBQWtCLEVBQUU1SDtVQUN4QixDQUFDO1VBQ0RvSSxXQUFXLEVBQUVSLGtCQUFrQixFQUFFUTtRQUNsQyxDQUFDO1FBQ0QsTUFBTXlOLGNBQThCLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQ25PLFFBQVEsSUFBSSxDQUFDUSxVQUFVLEVBQUU7VUFDN0I7VUFDQTJOLGNBQWMsQ0FBQ0MsZ0JBQWdCLEdBQUcsSUFBSTtRQUN2QztRQUNBLE1BQU0vTixRQUFRLEdBQ2IsQ0FBQzZOLFlBQVksSUFDYjFGLGlCQUFpQixDQUFDaEUsU0FBUyxFQUFFeEwsWUFBWSxFQUFFcUQsd0JBQXdCLENBQUN3QyxxQkFBcUIsRUFBRXBCLHFCQUFxQixDQUFDO1FBQ2xILE1BQU10RixZQUFZLEdBQUd1SCxtQ0FBbUMsQ0FBQzhFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxTQUFTO1FBQzFGLE1BQU01TCxNQUE2QixHQUFHO1VBQ3JDbUksR0FBRyxFQUFFMEcsU0FBUyxDQUFDQyx3QkFBd0IsQ0FBQ2xELFNBQVMsQ0FBQztVQUNsRHpJLElBQUksRUFBRWxGLFVBQVUsQ0FBQ29LLFVBQVU7VUFDM0JuQixLQUFLLEVBQUVBLEtBQUssSUFBSXpGLElBQUk7VUFDcEI2RyxVQUFVLEVBQUVyQixPQUFPLEdBQUdFLFFBQVEsQ0FBQ3lFLFNBQVMsQ0FBQyxHQUFHekwsU0FBUztVQUNyRG9JLEtBQUssRUFBRXRCLE9BQU8sR0FBR0YsU0FBUyxHQUFHNUcsU0FBUztVQUN0Q3NWLDJCQUEyQixFQUFFNUksMkJBQTJCO1VBQ3hEckUsY0FBYyxFQUFFakssZ0JBQWdCLENBQUNpSCwrQkFBK0IsQ0FBQ29HLFNBQVMsQ0FBQ25HLGtCQUFrQixDQUFDO1VBQzlGZ0Qsa0JBQWtCLEVBQUU5Qiw0QkFBNEI7VUFDaERwSCxZQUFZLEVBQUVBLFlBQVk7VUFDMUJrQyxJQUFJLEVBQUVBLElBQUk7VUFDVnlOLG1CQUFtQixFQUFFQSxtQkFBbUI7VUFDeENqRyxRQUFRLEVBQUVDLGdCQUFnQixDQUFDM0ssZ0JBQWdCLEVBQUVxTixTQUFTLEVBQW9CckksaUJBQWlCLENBQUM7VUFDNUZuRCxZQUFZLEVBQUVBLFlBQVk7VUFDMUJxSCxRQUFRLEVBQUVBLFFBQVE7VUFDbEJ2SCxhQUFhLEVBQUU2RSxvQkFBb0IsQ0FBQ1csTUFBTSxHQUFHWCxvQkFBb0IsR0FBRzVFLFNBQVM7VUFDN0UyRix1QkFBdUIsRUFBRVgsdUJBQXVCLENBQUNPLE1BQU0sR0FBRyxDQUFDLEdBQUdQLHVCQUF1QixHQUFHaEYsU0FBUztVQUNqR1IsY0FBYyxFQUFFQSxjQUFjO1VBQzlCVixLQUFLLEVBQUcyTSxTQUFTLENBQUN2SyxXQUFXLEVBQUVxVSxLQUFLLEVBQUVDLFdBQVcsRUFBRTFXLEtBQUssRUFBRXNPLE9BQU8sQ0FBQyxDQUFDLElBQWVwTixTQUFTO1VBQzNGZCxVQUFVLEVBQUV5SixhQUFhLENBQUN2SyxnQkFBZ0IsRUFBRXFOLFNBQTJCLENBQUM7VUFDeEVwTSxXQUFXLEVBQUUsSUFBSTtVQUNqQkUsYUFBYSxFQUFFQSxhQUFhO1VBQzVCa0osYUFBYSxFQUFFQyx3QkFBd0IsQ0FBQ3RLLGdCQUFnQixDQUFDO1VBQ3pEcUosVUFBVSxFQUFFQSxVQUFVO1VBQ3RCMk4sY0FBYyxFQUFFQSxjQUFnRDtVQUNoRTdULFlBQVksRUFBRS9CLGNBQWMsRUFBRXlCLFFBQVE7VUFDdEN3VSxnQkFBZ0IsRUFBRSxJQUFJO1VBQ3RCeE8sUUFBUSxFQUFFQSxRQUFRLElBQUssWUFBbUQ7VUFDMUVrTztRQUNELENBQUM7UUFDRCxNQUFNTyxPQUFPLEdBQUdySSxXQUFXLENBQUM1QixTQUFTLENBQUMsSUFBSTFFLEtBQUs7UUFDL0MsSUFBSTJPLE9BQU8sRUFBRTtVQUNaN1YsTUFBTSxDQUFDNlYsT0FBTyxHQUFHQSxPQUFPO1FBQ3pCO1FBQ0EsSUFBSWhSLHFCQUFxQixDQUFDbEYsY0FBYyxDQUFDZ0csb0JBQW9CLEVBQUU7VUFDOUQzRixNQUFNLENBQUM0RiwwQkFBMEIsR0FBR2YscUJBQXFCLENBQUNsRixjQUFjLENBQUNnRyxvQkFBb0I7UUFDOUY7UUFDQW5ILGlCQUFpQixDQUFDd0gsSUFBSSxDQUFDaEcsTUFBTSxDQUFDO1FBQzlCO1FBQ0ErRSxvQkFBb0IsQ0FBQ3JFLE9BQU8sQ0FBRW9WLG1CQUFtQixJQUFLO1VBQ3JEelMsa0JBQWtCLENBQUN5UyxtQkFBbUIsQ0FBQyxHQUFHalIscUJBQXFCLENBQUNLLFVBQVUsQ0FBQzRRLG1CQUFtQixDQUFDLENBQUNqUSxrQkFBa0I7VUFDbEg7VUFDQSxJQUFJeVAsWUFBWSxFQUFFO1lBQ2pCN1Isd0JBQXdCLENBQUN3QyxxQkFBcUIsQ0FBQ0QsSUFBSSxDQUFDOFAsbUJBQW1CLENBQUM7VUFDekU7VUFDQXpRLGtEQUFrRCxDQUNqRDdCLHFDQUFxQyxFQUNyQ3FCLHFCQUFxQixFQUNyQmlSLG1CQUNELENBQUM7VUFDRDtVQUNBO1VBQ0EsSUFBSWpSLHFCQUFxQixDQUFDSyxVQUFVLENBQUM0USxtQkFBbUIsQ0FBQyxDQUFDQyxzQ0FBc0MsS0FBSyxhQUFhLEVBQUU7WUFDbkhDLCtCQUErQixDQUM5QnpYLGdCQUFnQixFQUNoQnNDLDJCQUEyQixFQUMzQitLLFNBQVMsRUFDVHZJLGtCQUFrQixFQUNsQmpELFlBQVksRUFDWnFELHdCQUNELENBQUM7VUFDRjtRQUNELENBQUMsQ0FBQztRQUNGO1FBQ0EwQix1QkFBdUIsQ0FBQ3pFLE9BQU8sQ0FBRXFGLHNCQUFzQixJQUFLO1VBQzNEO1VBQ0ExQyxrQkFBa0IsQ0FBQzBDLHNCQUFzQixDQUFDLEdBQUdsQixxQkFBcUIsQ0FBQ08sb0JBQW9CLENBQUNXLHNCQUFzQixDQUFDO1FBQ2hILENBQUMsQ0FBQztNQUNILENBQUMsQ0FBQztJQUNIO0lBQ0E7SUFDQSxPQUFPM0Msd0JBQXdCLENBQzlCQyxrQkFBa0IsRUFDbEJDLFVBQVUsRUFDVjlFLGlCQUFpQixFQUNqQkQsZ0JBQWdCLEVBQ2hCRixTQUFTLEVBQ1RrRixpQkFBaUIsRUFDakJDLHFDQUFxQyxFQUNyQ0Msd0JBQ0QsQ0FBQztFQUNGLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTXdTLGlCQUFpQixHQUFHLFNBQUFBLENBQ3pCL1EsVUFBeUMsRUFDekMxRyxpQkFBMEMsRUFDMUNELGdCQUF5RCxFQUN6RCtFLFVBQXNCLEVBQ0M7SUFDdkIsSUFBSTRTLGlCQUF1QztJQUMzQyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2xSLFVBQVUsQ0FBQyxFQUFFO01BQzlCZ1IsaUJBQWlCLEdBQUdoUixVQUFVLENBQUNsQixHQUFHLENBQUMsVUFBVTZMLFlBQVksRUFBRTtRQUMxRCxNQUFNNVAsZ0JBQWdCLEdBQUd6QixpQkFBaUIsQ0FBQ3VCLElBQUksQ0FBQyxVQUFVRSxnQkFBZ0IsRUFBRTtVQUMzRSxPQUFPQSxnQkFBZ0IsQ0FBQ0csWUFBWSxLQUFLeVAsWUFBWSxJQUFJNVAsZ0JBQWdCLENBQUNDLGFBQWEsS0FBS0MsU0FBUztRQUN0RyxDQUFDLENBQUM7UUFDRixJQUFJRixnQkFBZ0IsRUFBRTtVQUNyQixPQUFPQSxnQkFBZ0IsQ0FBQ3dCLElBQUk7UUFDN0IsQ0FBQyxNQUFNO1VBQ04sTUFBTTJFLGNBQWMsR0FBR0MscUJBQXFCLENBQzNDO1lBQUUsQ0FBQ3dKLFlBQVksR0FBR3ZNLFVBQVUsQ0FBQytTLFdBQVcsQ0FBQ3hHLFlBQVk7VUFBRSxDQUFDLEVBQ3hEclIsaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEIrRSxVQUFVLEVBQ1YsQ0FBQyxDQUNGLENBQUM7VUFDRDlFLGlCQUFpQixDQUFDd0gsSUFBSSxDQUFDSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDekMsT0FBT0EsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDM0UsSUFBSTtRQUM5QjtNQUNELENBQUMsQ0FBQztJQUNIO0lBQ0EsT0FBT3lVLGlCQUFpQjtFQUN6QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUksb0JBQW9CLEdBQUcsU0FBQUEsQ0FDNUIvWCxnQkFBeUQsRUFDekRnWSxVQUFzQixFQUN0QmhULGlCQUErQixFQUNyQjtJQUNWLE1BQU1rUSxjQUFjLEdBQUc4QyxVQUFVLENBQUN4SixJQUFJO0lBQ3RDLE9BQU8wRyxjQUFjLENBQUMvTyxJQUFJLENBQUMsVUFBVWtQLElBQUksRUFBRTtNQUMxQztNQUNBLElBQUk0QyxXQUFXLENBQUM1QyxJQUFJLENBQUMsSUFBSUEsSUFBSSxFQUFFdEksS0FBSyxFQUFFckgsT0FBTyxDQUFDZCxJQUFJLEtBQUssYUFBYSxFQUFFO1FBQ3JFLE9BQ0NzVCxxQkFBcUIsQ0FBQzdDLElBQUksQ0FBQyxJQUMxQnJRLGlCQUFpQixLQUFLNlEsWUFBWSxDQUFDQyxrQkFBa0IsSUFDckRxQywyQkFBMkIsQ0FBQzlDLElBQUksQ0FBQ3RJLEtBQUssQ0FBQ3JILE9BQU8sQ0FBQ3dCLGtCQUFrQixFQUFFbEgsZ0JBQWdCLENBQUU7TUFFeEY7SUFDRCxDQUFDLENBQUM7RUFDSCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTW9ZLGdDQUFnQyxHQUFHLFNBQUFBLENBQ3hDcFksZ0JBQXlELEVBQ3pEcVksc0JBQThDLEVBQzlDclQsaUJBQStCLEVBQ3JCO0lBQ1YsTUFBTWlRLGVBQWUsR0FBR29ELHNCQUFzQixDQUFDdkwsTUFBTSxDQUFDcEgsT0FBTztJQUM3RCxNQUFNNFMsOENBQThDLEdBQUdDLDJCQUEyQixDQUFDRixzQkFBc0IsQ0FBQztJQUMxRztJQUNBLElBQUlHLG1CQUFtQixDQUFDSCxzQkFBc0IsQ0FBQyxFQUFFO01BQ2hELElBQUlOLG9CQUFvQixDQUFDL1gsZ0JBQWdCLEVBQUVpVixlQUFlLEVBQWdCalEsaUJBQWlCLENBQUMsRUFBRTtRQUM3RixPQUFPLElBQUk7TUFDWjtNQUNBLE1BQU1rUSxjQUFjLEdBQUlELGVBQWUsQ0FBZ0J6RyxJQUFJO01BQzNELE9BQU8wRyxjQUFjLENBQUMvTyxJQUFJLENBQUVzSSxjQUFzQyxJQUFLO1FBQ3RFLE9BQU85RCxnQkFBZ0IsQ0FBQzNLLGdCQUFnQixFQUFFeU8sY0FBYyxFQUFFekosaUJBQWlCLENBQUM7TUFDN0UsQ0FBQyxDQUFDO0lBQ0g7SUFDQTtBQUNEO0FBQ0E7SUFDQyxJQUFJeVQsa0JBQWtCLENBQUNKLHNCQUFzQixDQUFDLElBQUtwRCxlQUFlLENBQWV5RCxhQUFhLEtBQUssNkJBQTZCLEVBQUU7TUFDakksSUFBSUosOENBQThDLEVBQUU7UUFDbkQsT0FBTyxLQUFLO01BQ2I7TUFDQSxJQUFJSixxQkFBcUIsQ0FBQ0csc0JBQXNCLENBQUMsRUFBRTtRQUNsRCxPQUFPLElBQUk7TUFDWjtNQUNBLE9BQU9NLG1CQUFtQixDQUFDM1ksZ0JBQWdCLEVBQUVpVixlQUFlLEVBQWVqUSxpQkFBaUIsQ0FBQztJQUM5RjtJQUNBLE9BQU8sS0FBSztFQUNiLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNNFQsa0JBQWtCLEdBQUcsU0FBQUEsQ0FDMUI1WSxnQkFBeUQsRUFDekR3QyxRQUFrQixFQUNsQndDLGlCQUErQixFQUNyQjtJQUNWLE9BQ0N4QyxRQUFRLENBQUNvQyxJQUFJLEtBQUssYUFBYSxJQUMvQixDQUFDaVUseUNBQXlDLENBQUNyVyxRQUFRLENBQUMsS0FDbkQwVixxQkFBcUIsQ0FBQzFWLFFBQVEsQ0FBQyxJQUM5QndDLGlCQUFpQixLQUFLNlEsWUFBWSxDQUFDQyxrQkFBa0IsSUFDckRxQywyQkFBMkIsQ0FBQzNWLFFBQVEsQ0FBQzBFLGtCQUFrQixFQUFFbEgsZ0JBQWdCLENBQUUsQ0FBQztFQUVoRixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTTJZLG1CQUFtQixHQUFHLFNBQUFBLENBQzNCM1ksZ0JBQXlELEVBQ3pEOFksU0FBb0IsRUFDcEI5VCxpQkFBK0IsRUFDckI7SUFDVixPQUNDa1QscUJBQXFCLENBQUNZLFNBQVMsQ0FBQyxJQUMvQjlULGlCQUFpQixLQUFLNlEsWUFBWSxDQUFDQyxrQkFBa0IsSUFDckRxQywyQkFBMkIsQ0FBQ1csU0FBUyxDQUFDL0wsS0FBSyxDQUFDckgsT0FBTyxDQUFDd0Isa0JBQWtCLEVBQUVsSCxnQkFBZ0IsQ0FBRTtFQUU3RixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTTJLLGdCQUFnQixHQUFHLFNBQUFBLENBQ3hCM0ssZ0JBQXlELEVBQ3pENEYsTUFBeUMsRUFDekNaLGlCQUFnQyxFQUNHO0lBQ25DLE1BQU1nUixZQUFZLEdBQUdoUixpQkFBaUIsSUFBSTZRLFlBQVksQ0FBQ3ZJLE1BQU07SUFDN0QsSUFDQ3ROLGdCQUFnQixDQUFDK1ksZUFBZSxDQUFDLENBQUMsS0FBS0MsWUFBWSxDQUFDQyxVQUFVLElBQzlEalosZ0JBQWdCLENBQUMrWSxlQUFlLENBQUMsQ0FBQyxLQUFLQyxZQUFZLENBQUNFLGtCQUFrQixFQUNyRTtNQUNELE9BQU90WCxTQUFTO0lBQ2pCO0lBQ0EsSUFBSTZKLFVBQVUsQ0FBQzdGLE1BQU0sQ0FBQyxFQUFFO01BQ3ZCLE9BQU9nVCxrQkFBa0IsQ0FBQzVZLGdCQUFnQixFQUFFNEYsTUFBTSxFQUFFb1EsWUFBWSxDQUFDLEdBQUd6SCxpQkFBaUIsQ0FBQy9ELEVBQUUsQ0FBQzJPLFVBQVUsQ0FBQyxHQUFHdlgsU0FBUztJQUNqSDtJQUNBO0lBQ0EsSUFBSXdYLHdCQUF3QixDQUFDeFQsTUFBTSxDQUFDLEVBQUU7TUFDckMsT0FBT3dTLGdDQUFnQyxDQUFDcFksZ0JBQWdCLEVBQUU0RixNQUFNLEVBQUVvUSxZQUFZLENBQUMsR0FBR3pILGlCQUFpQixDQUFDL0QsRUFBRSxDQUFDMk8sVUFBVSxDQUFDLEdBQUd2WCxTQUFTO0lBQy9IO0lBQ0E7SUFDQSxJQUFJcVcsV0FBVyxDQUFDclMsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ21ILEtBQUssRUFBRXJILE9BQU8sRUFBRWQsSUFBSSxLQUFLLGFBQWEsRUFBRTtNQUN6RSxPQUFPc1QscUJBQXFCLENBQUN0UyxNQUFNLENBQUMsSUFDbENvUSxZQUFZLEtBQUtILFlBQVksQ0FBQ0Msa0JBQWtCLElBQ2hEcUMsMkJBQTJCLENBQUN2UyxNQUFNLENBQUNtSCxLQUFLLENBQUNySCxPQUFPLENBQUN3QixrQkFBa0IsRUFBRWxILGdCQUFnQixDQUFFLEdBQ3RGdU8saUJBQWlCLENBQUMvRCxFQUFFLENBQUMyTyxVQUFVLENBQUMsR0FDaEN2WCxTQUFTO0lBQ2I7SUFDQSxPQUFPQSxTQUFTO0VBQ2pCLENBQUM7RUFFRCxNQUFNeVgscUJBQXFCLEdBQUcsU0FBQUEsQ0FDN0IxUyxVQUFnQyxFQUNoQzJTLGdCQUErQyxFQUMxQjtJQUNyQixJQUFJMUIsS0FBSyxDQUFDQyxPQUFPLENBQUN5QixnQkFBZ0IsQ0FBQyxFQUFFO01BQ3BDM1MsVUFBVSxHQUFHMlMsZ0JBQWdCO0lBQzlCO0lBQ0EsSUFBSTNTLFVBQVUsRUFBRTtNQUNmLE9BQU9BLFVBQVUsQ0FDZmxCLEdBQUcsQ0FBRWpELFFBQVEsSUFBSztRQUNsQixPQUFPLElBQUltRSxVQUFVLENBQUV1SyxPQUFPLENBQUMxTyxRQUFRLENBQUMsR0FBRztNQUM1QyxDQUFDLENBQUMsQ0FDRCtXLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ2xCO0lBQ0EsT0FBTzNYLFNBQVM7RUFDakIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTXhCLHNCQUFzQixHQUFHLFNBQUFBLENBQzlCRSxPQUF1RixFQUN2RkwsaUJBQTBDLEVBQzFDRCxnQkFBeUQsRUFDekQrRSxVQUFzQixFQUNXO0lBQ2pDLE1BQU15VSxlQUErQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxTQUFTQyxnQkFBZ0JBLENBQ3hCaFksTUFBc0UsRUFDdEVtSSxHQUFXLEVBQ3FDO01BQ2hELE9BQU8zSixpQkFBaUIsQ0FBQ2tHLElBQUksQ0FBRXpFLGdCQUFnQixJQUFLQSxnQkFBZ0IsQ0FBQ2tJLEdBQUcsS0FBS0EsR0FBRyxDQUFDO0lBQ2xGO0lBQ0EsU0FBUzhQLFlBQVlBLENBQUNDLGNBQXdDLEVBQStDO01BQzVHLE9BQU9BLGNBQWMsQ0FBQy9VLElBQUksS0FBS2xGLFVBQVUsQ0FBQ2thLElBQUk7SUFDL0M7SUFDQSxTQUFTQyxjQUFjQSxDQUFDRixjQUF3QyxFQUFpRDtNQUNoSCxPQUFPQSxjQUFjLENBQUMvVSxJQUFJLEtBQUtoRCxTQUFTLElBQUksQ0FBQyxDQUFDK1gsY0FBYyxDQUFDdE4sUUFBUTtJQUN0RTtJQUNBLFNBQVN5TixzQ0FBc0NBLENBQUNuWSxhQUF1QixFQUFFb1ksc0JBQStDLEVBQVE7TUFDL0gsTUFBTTdVLHdCQUF3QixHQUFHb1EsMkJBQTJCLENBQUN0VixnQkFBZ0IsQ0FBQztNQUM5RTJCLGFBQWEsQ0FBQ1EsT0FBTyxDQUFFSyxRQUFRLElBQUs7UUFDbkN1WCxzQkFBc0IsQ0FBQzVYLE9BQU8sQ0FBRTZELElBQUksSUFBSztVQUN4QyxJQUFJQSxJQUFJLENBQUM5QyxJQUFJLEtBQUtWLFFBQVEsRUFBRTtZQUMzQndELElBQUksQ0FBQ2tELFFBQVEsR0FBRyxDQUFDaEUsd0JBQXdCLENBQUN3QyxxQkFBcUIsQ0FBQ3JCLFFBQVEsQ0FBQzdELFFBQVEsQ0FBQ3dYLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUdoVSxJQUFJLENBQUNtRSxXQUFXLEdBQUduRSxJQUFJLENBQUNrRCxRQUFRO1lBQ2hDbEQsSUFBSSxDQUFDbUQsVUFBVSxHQUFHLENBQUNqRSx3QkFBd0IsQ0FBQ2tFLHVCQUF1QixDQUFDL0MsUUFBUSxDQUFDN0QsUUFBUSxDQUFDd1gsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoSGhVLElBQUksQ0FBQ2lVLG9CQUFvQixHQUFHLElBQUk7VUFDakM7UUFDRCxDQUFDLENBQUM7TUFDSCxDQUFDLENBQUM7SUFDSDtJQUNBLEtBQUssTUFBTXJRLEdBQUcsSUFBSXRKLE9BQU8sRUFBRTtNQUMxQixNQUFNcVosY0FBYyxHQUFHclosT0FBTyxDQUFDc0osR0FBRyxDQUFDO01BQ25DMEcsU0FBUyxDQUFDNEosV0FBVyxDQUFDdFEsR0FBRyxDQUFDO01BQzFCO01BQ0EsTUFBTXVRLGVBQWUsR0FBRztRQUN2QnZRLEdBQUcsRUFBRUEsR0FBRztRQUNSL0ksMEJBQTBCLEVBQUU4WSxjQUFjLENBQUM5WSwwQkFBMEI7UUFDckVILEtBQUssRUFBRWlaLGNBQWMsQ0FBQ2paLEtBQUssSUFBSWtCLFNBQVM7UUFDeEN3WSxRQUFRLEVBQUU7VUFDVEMsTUFBTSxFQUFFVixjQUFjLENBQUNTLFFBQVEsRUFBRUMsTUFBTTtVQUN2Q0MsU0FBUyxFQUFFWCxjQUFjLENBQUNTLFFBQVEsS0FBS3hZLFNBQVMsR0FBRzJZLFNBQVMsQ0FBQ0MsS0FBSyxHQUFHYixjQUFjLENBQUNTLFFBQVEsQ0FBQ0U7UUFDOUYsQ0FBQztRQUNEalEsYUFBYSxFQUFFQyx3QkFBd0IsQ0FBQ3RLLGdCQUFnQjtNQUN6RCxDQUFDO01BQ0QsSUFBSXlaLGdCQUFnQixDQUFDRSxjQUFjLEVBQUUvUCxHQUFHLENBQUMsRUFBRTtRQUMxQyxNQUFNNlEscUNBQXNGLEdBQUc7VUFDOUYsR0FBR04sZUFBZTtVQUNsQnJaLFVBQVUsRUFBRTZZLGNBQWMsRUFBRTdZLFVBQVU7VUFDdENDLGVBQWUsRUFBRTRZLGNBQWMsRUFBRTVZLGVBQWU7VUFDaERDLFlBQVksRUFBRTJZLGNBQWMsRUFBRTNZLFlBQVk7VUFDMUM0RCxJQUFJLEVBQUVsRixVQUFVLENBQUNvSyxVQUFVO1VBQzNCN0ksV0FBVyxFQUFFVyxTQUFTO1VBQ3RCVixRQUFRLEVBQUV5WSxjQUFjLENBQUN6WSxRQUFRO1VBQ2pDQyxhQUFhLEVBQUVnUixnQ0FBZ0MsQ0FBQ3dILGNBQWMsQ0FBQ3hZLGFBQWEsQ0FBQztVQUM3RUMsY0FBYyxFQUFFc1osdUJBQXVCLENBQ3RDZixjQUFjLEVBQUV2WSxjQUFjLEVBQzlCbkIsaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEIrRSxVQUFVLEVBQ1ZuRCxTQUFTLEVBQ1RnSSxHQUNEO1FBQ0QsQ0FBQztRQUNENFAsZUFBZSxDQUFDNVAsR0FBRyxDQUFDLEdBQUc2USxxQ0FBcUM7TUFDN0QsQ0FBQyxNQUFNO1FBQ04sTUFBTTlZLGFBQW1DLEdBQUcrVixpQkFBaUIsQ0FDNURpQyxjQUFjLENBQUNoVCxVQUFVLEVBQ3pCMUcsaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEIrRSxVQUNELENBQUM7UUFDRCxNQUFNNFYsV0FBVyxHQUFHM2EsZ0JBQWdCLENBQUM0YSxzQkFBc0IsQ0FBQ2pCLGNBQWMsQ0FBQ3JDLE9BQU8sQ0FBQztVQUNsRnVELFVBQVUsR0FBRzdhLGdCQUFnQixDQUFDNGEsc0JBQXNCLENBQUNqQixjQUFjLENBQUNtQixNQUFNLENBQUM7UUFFNUUsTUFBTUMsMEJBQXVELEdBQUdwWixhQUFhLEdBQzFFK1ksdUJBQXVCLENBQUNmLGNBQWMsRUFBRXZZLGNBQWMsRUFBRW5CLGlCQUFpQixFQUFFRCxnQkFBZ0IsRUFBRStFLFVBQVUsRUFBRXBELGFBQWEsQ0FBQyxHQUN2SCxJQUFJO1FBQ1AsTUFBTXFaLGtCQUFrQixHQUFHO1VBQzFCLEdBQUdiLGVBQWU7VUFDbEJXLE1BQU0sRUFBRUQsVUFBVTtVQUNsQi9aLFVBQVUsRUFBRTZZLGNBQWMsRUFBRTdZLFVBQVUsSUFBSStTLFVBQVUsQ0FBQ0csSUFBSTtVQUN6RGpULGVBQWUsRUFBRTRZLGNBQWMsRUFBRTVZLGVBQWUsSUFBSWthLGVBQWUsQ0FBQ0MsS0FBSztVQUN6RWxhLFlBQVksRUFBRTJZLGNBQWMsRUFBRTNZLFlBQVksSUFBSSxTQUFTO1VBQ3ZEcUwsUUFBUSxFQUFFc04sY0FBYyxDQUFDdE4sUUFBUTtVQUNqQzFLLGFBQWEsRUFBRUEsYUFBYTtVQUM1QlAsY0FBYyxFQUFFMlosMEJBQTBCO1VBQzFDSSxFQUFFLEVBQUUsaUJBQWlCdlIsR0FBRyxFQUFFO1VBQzFCMUcsSUFBSSxFQUFFLGlCQUFpQjBHLEdBQUcsRUFBRTtVQUM1QjtVQUNBekksYUFBYSxFQUFFO1lBQUVpUixhQUFhLEVBQUU7VUFBRSxDQUFDO1VBQ25DakksV0FBVyxFQUFFLEtBQUs7VUFDbEJsSixXQUFXLEVBQUUsS0FBSztVQUNsQmlJLFFBQVEsRUFBRSxLQUFLO1VBQ2Y4TixjQUFjLEVBQUU7WUFBRUMsZ0JBQWdCLEVBQUU7VUFBSyxDQUFDO1VBQzFDSyxPQUFPLEVBQUVxRCxXQUFXLEdBQUdBLFdBQVcsR0FBR0UsVUFBVTtVQUMvQ2xVLFVBQVUsRUFBRWdULGNBQWMsQ0FBQ2hULFVBQVU7VUFDckMrRCxRQUFRLEVBQ1BpUCxjQUFjLENBQUNqUCxRQUFRLElBQ3ZCMUssZ0JBQWdCLENBQUMrWSxlQUFlLENBQUMsQ0FBQyxLQUFLQyxZQUFZLENBQUNDLFVBQVUsSUFDOURqWixnQkFBZ0IsQ0FBQytZLGVBQWUsQ0FBQyxDQUFDLEtBQUtDLFlBQVksQ0FBQ0Usa0JBQWtCLEdBQ25FM0ssaUJBQWlCLENBQUMvRCxFQUFFLENBQUMyTyxVQUFVLENBQUMsR0FDaEN2WDtRQUNMLENBQUM7UUFDRCxJQUFJRCxhQUFhLEVBQUU7VUFDbEJtWSxzQ0FBc0MsQ0FBQ25ZLGFBQWEsRUFBRTFCLGlCQUFpQixDQUFDO1FBQ3pFO1FBQ0EsSUFBSXlaLFlBQVksQ0FBQ0MsY0FBYyxDQUFDLEVBQUU7VUFDakMsTUFBTXlCLGlCQUF3RCxHQUFHO1lBQ2hFLEdBQUdKLGtCQUFrQjtZQUNyQnBXLElBQUksRUFBRWxGLFVBQVUsQ0FBQ2thO1VBQ2xCLENBQUM7VUFDREosZUFBZSxDQUFDNVAsR0FBRyxDQUFDLEdBQUd3UixpQkFBaUI7UUFDekMsQ0FBQyxNQUFNLElBQUl2QixjQUFjLENBQUNGLGNBQWMsQ0FBQyxFQUFFO1VBQzFDLE1BQU15QixpQkFBd0QsR0FBRztZQUNoRSxHQUFHSixrQkFBa0I7WUFDckJwVyxJQUFJLEVBQUVsRixVQUFVLENBQUMyYjtVQUNsQixDQUFDO1VBQ0Q3QixlQUFlLENBQUM1UCxHQUFHLENBQUMsR0FBR3dSLGlCQUFpQjtRQUN6QyxDQUFDLE1BQU07VUFDTixNQUFNRSxPQUFPLEdBQUcsMEJBQTBCMVIsR0FBRywyQ0FBMkM7VUFDeEY1SixnQkFBZ0IsQ0FDZHViLGNBQWMsQ0FBQyxDQUFDLENBQ2hCQyxRQUFRLENBQ1JDLGFBQWEsQ0FBQ0MsUUFBUSxFQUN0QkMsYUFBYSxDQUFDQyxHQUFHLEVBQ2pCTixPQUFPLEVBQ1BPLGlCQUFpQixFQUNqQkEsaUJBQWlCLEVBQUVDLGlCQUFpQixFQUFFQyxVQUN2QyxDQUFDO1FBQ0g7TUFDRDtJQUNEO0lBQ0EsT0FBT3ZDLGVBQWU7RUFDdkIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU25ZLGtCQUFrQkEsQ0FDakNiLFlBQTJCLEVBQzNCVixTQUFvQixFQUNwQkMsaUJBQXlCLEVBQ3pCQyxnQkFBeUQsRUFDekM7SUFDaEIsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDcUcsUUFBUSxDQUFDdkcsU0FBUyxDQUFDLEVBQUU7TUFDdkU7TUFDQSxPQUFPVSxZQUFZO0lBQ3BCOztJQUVBO0lBQ0E7SUFDQTtJQUNBLE1BQU13Yiw2QkFBc0QsR0FBR3hiLFlBQVksQ0FBQ2dCLElBQUksQ0FDOUVDLE1BQU0sSUFBS0EsTUFBTSxDQUFDTixhQUFhLEVBQUUyVixzQkFBc0IsS0FBS2xWLFNBQVMsSUFBSUgsTUFBTSxDQUFDTixhQUFhLEVBQUUyVixzQkFBc0IsS0FBSyxJQUM1SCxDQUFDO0lBQ0QsSUFBSWtGLDZCQUE2QixFQUFFN2EsYUFBYSxFQUFFO01BQ2pEO01BQ0E2YSw2QkFBNkIsQ0FBQzdhLGFBQWEsQ0FBQzJWLHNCQUFzQixHQUFHLEtBQUs7O01BRTFFO01BQ0EsTUFBTW1GLHlCQUE4QyxHQUFHO1FBQ3REclMsR0FBRyxFQUFFLHFCQUFxQjtRQUMxQjFHLElBQUksRUFBRSxxQkFBcUI7UUFDM0JnWixXQUFXLEVBQUVGLDZCQUE2QixDQUFDOVksSUFBSTtRQUMvQ2laLHFCQUFxQixFQUFFLElBQUk7UUFDM0JuYixZQUFZLEVBQUUsU0FBUztRQUN2QjJILEtBQUssRUFBRSx3REFBd0Q7UUFDL0QyTyxPQUFPLEVBQUUsd0RBQXdEO1FBQ2pFMVMsSUFBSSxFQUFFbEYsVUFBVSxDQUFDMGMsUUFBUTtRQUN6QmpiLGFBQWEsRUFBRSxJQUFJO1FBQ25CQyxjQUFjLEVBQUUsSUFBSTtRQUNwQmliLGlCQUFpQixFQUFFLElBQUk7UUFDdkIxYSxhQUFhLEVBQUVDLFNBQVM7UUFDeEJ5SSxhQUFhLEVBQUU7TUFDaEIsQ0FBQzs7TUFFRDtNQUNBLE1BQU1pUyx5QkFBOEIsR0FBRzliLFlBQVksQ0FBQytiLFNBQVMsQ0FBRTlhLE1BQU0sSUFBS0EsTUFBTSxDQUFDVCxZQUFZLEtBQUssUUFBUSxDQUFDO01BQzNHUixZQUFZLENBQUNnYyxNQUFNLENBQUNGLHlCQUF5QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUVMLHlCQUF5QixDQUFDO0lBQ2pGOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsTUFBTVEseUJBQXdDLEdBQUdqYyxZQUFZLENBQUNtRixNQUFNLENBQUVsRSxNQUFNLElBQUtBLE1BQU0sQ0FBQ04sYUFBYSxFQUFFd1MsaUJBQWlCLEtBQUssSUFBSSxDQUFDO0lBQ2xJLElBQ0M4SSx5QkFBeUIsQ0FBQ3RWLE1BQU0sSUFDaENuSCxnQkFBZ0IsQ0FBQytZLGVBQWUsQ0FBQyxDQUFDLEtBQUtDLFlBQVksQ0FBQ0MsVUFBVSxLQUM3RGxPLFdBQVcsQ0FBQzJSLFdBQVcsQ0FBQzFjLGdCQUFnQixDQUFDNlIsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJOUcsV0FBVyxDQUFDNFIsV0FBVyxDQUFDM2MsZ0JBQWdCLENBQUM2UixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDckg7TUFDRDtNQUNBNEsseUJBQXlCLENBQUN0YSxPQUFPLENBQUV5YSx3QkFBcUMsSUFBSztRQUM1RSxJQUFJQSx3QkFBd0IsRUFBRXpiLGFBQWEsRUFBRTtVQUM1Q3liLHdCQUF3QixDQUFDemIsYUFBYSxDQUFDd1MsaUJBQWlCLEdBQUcsS0FBSztRQUNqRTtNQUNELENBQUMsQ0FBQzs7TUFFRjtNQUNBLE1BQU1rSixvQkFBeUMsR0FBRztRQUNqRGpULEdBQUcsRUFBRSxhQUFhO1FBQ2xCMUcsSUFBSSxFQUFFLGFBQWE7UUFDbkJnWixXQUFXLEVBQUVPLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDdlosSUFBSTtRQUM5QzRaLGdCQUFnQixFQUFFLElBQUk7UUFDdEI5YixZQUFZLEVBQUUsU0FBUztRQUN2QjJILEtBQUssRUFBRSxtREFBbUQ7UUFDMUQyTyxPQUFPLEVBQUUsbURBQW1EO1FBQzVEMVMsSUFBSSxFQUFFbEYsVUFBVSxDQUFDMGMsUUFBUTtRQUN6QmpiLGFBQWEsRUFBRSxJQUFJO1FBQ25CQyxjQUFjLEVBQUUsSUFBSTtRQUNwQmlKLGFBQWEsRUFBRTtNQUNoQixDQUFDO01BQ0QsSUFBSTBTLHdCQUE2QixHQUFHLENBQUM7TUFDckMsSUFBSWYsNkJBQTZCLEVBQUU7UUFDbEM7UUFDQWUsd0JBQXdCLEdBQ3ZCdmMsWUFBWSxDQUFDK2IsU0FBUyxDQUFFOWEsTUFBTSxJQUFNQSxNQUFNLENBQXlCMGEscUJBQXFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQztNQUN4RyxDQUFDLE1BQU07UUFDTjtRQUNBWSx3QkFBd0IsR0FBR3ZjLFlBQVksQ0FBQytiLFNBQVMsQ0FBRTlhLE1BQU0sSUFBS0EsTUFBTSxDQUFDVCxZQUFZLEtBQUssUUFBUSxDQUFDO01BQ2hHO01BQ0FSLFlBQVksQ0FBQ2djLE1BQU0sQ0FBQ08sd0JBQXdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRUYsb0JBQW9CLENBQUM7SUFDM0U7SUFFQSxPQUFPcmMsWUFBWTtFQUNwQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFiLFFBQUEsQ0FBQTBCLGtCQUFBLEdBQUFBLGtCQUFBO0VBS08sU0FBU3dULHFCQUFxQkEsQ0FBQzdVLGdCQUF5RCxFQUFrQjtJQUNoSCxPQUFPZ2QsNkJBQTZCLENBQ25DaGQsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQ3hDK2EsWUFBWSxJQUFLO01BQ2pCLE9BQVFBLFlBQVksRUFBb0RDLGtCQUFrQixFQUFFQyxrQkFBa0I7SUFDL0csQ0FBQyxFQUNELEtBQ0QsQ0FBQztFQUNGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBeGQsUUFBQSxDQUFBa1YscUJBQUEsR0FBQUEscUJBQUE7RUFNQSxTQUFTc0QsMkJBQTJCQSxDQUFDalYsSUFBWSxFQUFFbEQsZ0JBQXlELEVBQVc7SUFDdEgsT0FBTzZVLHFCQUFxQixDQUFDN1UsZ0JBQWdCLENBQUMsQ0FDNUN5RixHQUFHLENBQUVqRCxRQUFRLElBQUtBLFFBQVEsQ0FBQ2tELE9BQU8sRUFBRXdCLGtCQUFrQixDQUFDLENBQ3ZEYixRQUFRLENBQUNuRCxJQUFJLENBQUM7RUFDakI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVM4SSxpQkFBaUJBLENBQ3pCbkQsUUFBNEIsRUFJbkI7SUFBQSxJQUhUeUMsV0FBVyxHQUFBb0QsU0FBQSxDQUFBdkgsTUFBQSxRQUFBdUgsU0FBQSxRQUFBOU0sU0FBQSxHQUFBOE0sU0FBQSxNQUFHLEtBQUs7SUFBQSxJQUNuQjBPLFVBQVUsR0FBQTFPLFNBQUEsQ0FBQXZILE1BQUEsUUFBQXVILFNBQUEsUUFBQTlNLFNBQUEsR0FBQThNLFNBQUEsTUFBRyxLQUFLO0lBQUEsSUFDbEJ0TixjQUFxQyxHQUFBc04sU0FBQSxDQUFBdkgsTUFBQSxPQUFBdUgsU0FBQSxNQUFBOU0sU0FBQTtJQUVyQyxJQUFJeWIsY0FBYyxHQUFHLFFBQVE7SUFDN0IsSUFBSSxDQUFDeFUsUUFBUSxJQUFJekgsY0FBYyxFQUFFZ0csb0JBQW9CLEVBQUU7TUFDdEQsT0FBT2lXLGNBQWM7SUFDdEI7SUFDQSxJQUFJamMsY0FBYyxFQUFFZ2MsVUFBVSxJQUFJQSxVQUFVLEVBQUU7TUFDN0MsT0FBTyxVQUFVO0lBQ2xCO0lBQ0EsSUFBSTlSLFdBQVcsRUFBRTtNQUNoQixPQUFPLFVBQVU7SUFDbEI7SUFDQSxJQUFJbEssY0FBYyxFQUFFa0wsSUFBSSxFQUFFO01BQ3pCLE9BQU8rUSxjQUFjO0lBQ3RCO0lBQ0EsUUFBUXhVLFFBQVE7TUFDZixLQUFLLGFBQWE7TUFDbEIsS0FBSyxXQUFXO01BQ2hCLEtBQUssV0FBVztNQUNoQixLQUFLLFlBQVk7TUFDakIsS0FBSyxVQUFVO1FBQ2R3VSxjQUFjLEdBQUcsUUFBUTtRQUN6QjtNQUNELEtBQUssZ0JBQWdCO01BQ3JCLEtBQUssVUFBVTtRQUNkQSxjQUFjLEdBQUcsTUFBTTtRQUN2QjtNQUNELEtBQUssb0JBQW9CO1FBQ3hCQSxjQUFjLEdBQUcsVUFBVTtRQUMzQjtNQUNELEtBQUssZUFBZTtRQUNuQkEsY0FBYyxHQUFHLE1BQU07UUFDdkI7TUFDRCxLQUFLLGFBQWE7UUFDakJBLGNBQWMsR0FBRyxTQUFTO1FBQzFCO01BQ0Q7UUFDQ0EsY0FBYyxHQUFHLFFBQVE7SUFDM0I7SUFDQSxPQUFPQSxjQUFjO0VBQ3RCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTeFMsV0FBV0EsQ0FBQ3JJLFFBQWtCLEVBQUVmLE1BQTZCLEVBQVE7SUFDN0UsTUFBTTZWLE9BQU8sR0FBR3JJLFdBQVcsQ0FBQ3pNLFFBQVEsQ0FBQyxJQUFJZixNQUFNLENBQUNrSCxLQUFLO0lBQ3JELElBQUkyTyxPQUFPLEVBQUU7TUFDWjdWLE1BQU0sQ0FBQzZWLE9BQU8sR0FBR0EsT0FBTztJQUN6QjtFQUNEO0VBRUEsU0FBUzNOLHFDQUFxQ0EsQ0FDN0M5SCxZQUFvQixFQUNwQjdCLGdCQUF5RCxFQUNsQztJQUN2QixNQUFNdVcsb0JBQW9CLEdBQUdoVSxvQkFBb0IsQ0FBQ3ZDLGdCQUFnQixDQUFDa0Msc0JBQXNCLENBQUMsQ0FBQyxFQUFFTCxZQUFZLENBQUMsQ0FBQzBVLG9CQUFvQjtJQUMvSCxJQUFJQSxvQkFBb0IsRUFBRXBQLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDckMsTUFBTXVDLGlDQUEyQyxHQUFHLEVBQUU7TUFDdEQ2TSxvQkFBb0IsQ0FBQ3BVLE9BQU8sQ0FBRW1iLFdBQVcsSUFBSztRQUM3QzVULGlDQUFpQyxDQUFDakMsSUFBSSxDQUFDbUIsUUFBUSxDQUFDMFUsV0FBVyxDQUFDLElBQUlBLFdBQVcsQ0FBQ3BhLElBQUksQ0FBQztNQUNsRixDQUFDLENBQUM7TUFDRixPQUFPd0csaUNBQWlDO0lBQ3pDO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUytOLCtCQUErQkEsQ0FDdkN6WCxnQkFBeUQsRUFDekRzQywyQkFBd0UsRUFDeEVpYixRQUFnQyxFQUNoQ3pZLGtCQUE0QyxFQUM1Q2pELFlBQW9CLEVBQ3BCcUQsd0JBQWtELEVBQzNDO0lBQ1AsTUFBTXNZLG1CQUFtQixHQUN4QmxiLDJCQUEyQixDQUFDaVUsb0JBQW9CLENBQUNwUCxNQUFNLEtBQUtuSCxnQkFBZ0IsQ0FBQ2tDLHNCQUFzQixDQUFDLENBQUMsQ0FBQ3FVLG9CQUFvQixDQUFDcFAsTUFBTTtJQUNsSSxJQUFJcVcsbUJBQW1CLElBQUl2RixXQUFXLENBQUNzRixRQUFRLENBQUMsRUFBRTtNQUNqRHpZLGtCQUFrQixDQUFDakQsWUFBWSxDQUFDLEdBQUcwYixRQUFRLENBQUN4USxLQUFLLENBQUNySCxPQUFPO01BQ3pEUix3QkFBd0IsQ0FBQ3dDLHFCQUFxQixDQUFDRCxJQUFJLENBQUM1RixZQUFZLENBQUM7SUFDbEUsQ0FBQyxNQUFNLElBQUl1WCx3QkFBd0IsQ0FBQ21FLFFBQVEsQ0FBQyxJQUFJL0UsbUJBQW1CLENBQUMrRSxRQUFRLENBQUMsRUFBRTtNQUM5RUEsUUFBUSxDQUFDelEsTUFBTSxDQUFDcEgsT0FBTyxDQUFnQjhJLElBQUksQ0FBQ3JNLE9BQU8sQ0FBRXNTLEtBQUssSUFBSztRQUMvRCxJQUFJd0QsV0FBVyxDQUFDeEQsS0FBSyxDQUFDLElBQUl0USxjQUFjLENBQUNzUSxLQUFLLENBQUMxSCxLQUFLLENBQUNySCxPQUFPLENBQUMsS0FBSyxhQUFhLEVBQUU7VUFDaEYsTUFBTStYLGtDQUFrQyxHQUFHbGIsb0JBQW9CLENBQzlEdkMsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQ3pDdVMsS0FBSyxDQUFDMUgsS0FBSyxDQUFDeEwsSUFDYixDQUFDO1VBQ0QsTUFBTW1jLDBCQUEwQixHQUMvQkQsa0NBQWtDLENBQUNsSCxvQkFBb0IsQ0FBQ3BQLE1BQU0sS0FDOURuSCxnQkFBZ0IsQ0FBQ2tDLHNCQUFzQixDQUFDLENBQUMsQ0FBQ3FVLG9CQUFvQixDQUFDcFAsTUFBTTtVQUN0RSxJQUFJdVcsMEJBQTBCLEVBQUU7WUFDL0I1WSxrQkFBa0IsQ0FBQzJQLEtBQUssQ0FBQzFILEtBQUssQ0FBQ3hMLElBQUksQ0FBQyxHQUFHa1QsS0FBSyxDQUFDMUgsS0FBSyxDQUFDckgsT0FBTztZQUMxRFIsd0JBQXdCLENBQUN3QyxxQkFBcUIsQ0FBQ0QsSUFBSSxDQUFDZ04sS0FBSyxDQUFDMUgsS0FBSyxDQUFDeEwsSUFBSSxDQUFDO1VBQ3RFO1FBQ0Q7TUFDRCxDQUFDLENBQUM7SUFDSDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVN5SCxhQUFhQSxDQUFDeEcsUUFBdUQsRUFBRXFHLFFBQWlCLEVBQXNCO0lBQzdILElBQUk4VSxhQUFhO01BQ2hCeGMsYUFBb0QsR0FBRyxDQUFDLENBQUM7SUFDMUQsSUFBSXNLLFVBQVUsQ0FBQ2pKLFFBQVEsQ0FBQyxFQUFFO01BQ3pCbWIsYUFBYSxHQUFHQyxnQkFBZ0IsQ0FBQ3BiLFFBQVEsQ0FBQzRELFVBQVUsQ0FBQyxHQUNsRHlYLGdCQUFnQixDQUFDcmIsUUFBUSxDQUFDNEQsVUFBVSxDQUFDMFgsY0FBYyxDQUFDLEdBQ3BERCxnQkFBZ0IsQ0FBQ3JiLFFBQVEsQ0FBQ29DLElBQUksQ0FBQztJQUNuQztJQUNBLElBQUksQ0FBQytZLGFBQWEsSUFBSTlVLFFBQVEsS0FBS2pILFNBQVMsRUFBRTtNQUM3QytiLGFBQWEsR0FBR0UsZ0JBQWdCLENBQUNoVixRQUFRLENBQUM7SUFDM0M7SUFDQSxNQUFNRSxrQkFBc0MsR0FBRztNQUM5Q25FLElBQUksRUFBRStZLGFBQWEsRUFBRS9ZO0lBQ3RCLENBQUM7SUFDRCxJQUFJK1ksYUFBYSxJQUFJbFMsVUFBVSxDQUFDakosUUFBUSxDQUFDLEVBQUU7TUFDMUMsTUFBTStHLFdBQVcsR0FBR3dVLGdCQUFnQixDQUFDSixhQUFhLEVBQUVuYixRQUFRLENBQUM7TUFDN0QsSUFBSWlFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDNkMsV0FBVyxDQUFDLENBQUNwQyxNQUFNLEVBQUU7UUFDcEM0QixrQkFBa0IsQ0FBQ1EsV0FBVyxHQUFHQSxXQUFXO01BQzdDO0lBQ0Q7SUFDQSxJQUFJUixrQkFBa0IsQ0FBQ25FLElBQUksS0FBSyxnQ0FBZ0MsRUFBRTtNQUNqRSxJQUNDbUUsa0JBQWtCLEVBQUVuRSxJQUFJLEVBQUVzTSxPQUFPLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLElBQ3RFbkksa0JBQWtCLEVBQUVuRSxJQUFJLEVBQUVzTSxPQUFPLENBQUMsZ0NBQWdDLENBQUMsS0FBSyxDQUFDLEVBQ3hFO1FBQ0QvUCxhQUFhLEdBQUc7VUFBRTZjLGFBQWEsRUFBRSxLQUFLO1VBQUVDLFdBQVcsRUFBRTtRQUFHLENBQUM7TUFDMUQ7TUFDQSxJQUFJbFYsa0JBQWtCLENBQUNuRSxJQUFJLEtBQUssZ0NBQWdDLElBQUltRSxrQkFBa0IsQ0FBQ1EsV0FBVyxFQUFFMlUsUUFBUSxLQUFLLEtBQUssRUFBRTtRQUN2SC9jLGFBQWEsR0FBRztVQUFFZ2QscUJBQXFCLEVBQUU7UUFBSyxDQUFDO01BQ2hEO0lBQ0Q7SUFDQSxJQUFJMVgsTUFBTSxDQUFDQyxJQUFJLENBQUN2RixhQUFhLENBQUMsQ0FBQ2dHLE1BQU0sRUFBRTtNQUN0QzRCLGtCQUFrQixDQUFDNUgsYUFBYSxHQUFHQSxhQUFhO0lBQ2pEO0lBQ0EsT0FBTzRILGtCQUFrQjtFQUMxQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQXBKLFFBQUEsQ0FBQXFKLGFBQUEsR0FBQUEsYUFBQTtFQU1BLFNBQVNsQyxrREFBa0RBLENBQzFEN0IscUNBQWtFLEVBQ2xFcUIscUJBQTBDLEVBQzFDaVIsbUJBQTJCLEVBQ3BCO0lBQ1AsSUFDQ2pSLHFCQUFxQixDQUFDSyxVQUFVLENBQUM0USxtQkFBbUIsQ0FBQyxDQUFDQyxzQ0FBc0MsSUFDNUYsQ0FBQ3ZTLHFDQUFxQyxDQUFDc1MsbUJBQW1CLENBQUMsRUFDMUQ7TUFDRHRTLHFDQUFxQyxDQUFDc1MsbUJBQW1CLENBQUMsR0FDekRqUixxQkFBcUIsQ0FBQ0ssVUFBVSxDQUFDNFEsbUJBQW1CLENBQUMsQ0FBQ0Msc0NBQXVDO0lBQy9GO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU3RILDZCQUE2QkEsQ0FBQ1AsZUFBd0MsRUFBRXpNLElBQVksRUFBRXpCLE1BQTZCLEVBQVE7SUFDbkksTUFBTTJjLHdCQUF3QixHQUFHek8sZUFBZSxDQUFDaEssTUFBTSxDQUNyRDBZLGNBQWMsSUFDYkEsY0FBYyxDQUFDMWMsYUFBYSxFQUFFMEUsUUFBUSxDQUFDbkQsSUFBSSxDQUFDLElBQUltYixjQUFjLENBQUNoSCxnQkFBZ0IsSUFDL0VnSCxjQUFjLENBQUNoSCxnQkFBZ0IsSUFBSWdILGNBQWMsQ0FBQ3hjLFlBQVksS0FBS0osTUFBTSxDQUFDSSxZQUM3RSxDQUFDO0lBQ0RKLE1BQU0sQ0FBQzRWLGdCQUFnQixHQUFHLENBQUMsQ0FBQytHLHdCQUF3QixDQUFDalgsTUFBTTtJQUMzRCxJQUNDaVgsd0JBQXdCLENBQUNqWCxNQUFNLElBQy9CLENBQUNpWCx3QkFBd0IsRUFBRWpZLElBQUksQ0FBRXpFLGdCQUFnQixJQUFLQSxnQkFBZ0IsQ0FBQ1YsWUFBWSxLQUFLLFFBQVEsQ0FBQyxFQUNoRztNQUNEUyxNQUFNLENBQUN5SCxRQUFRLEdBQUcsS0FBSztNQUN2QnpILE1BQU0sQ0FBQzBJLFdBQVcsR0FBRyxLQUFLO01BQzFCMUksTUFBTSxDQUFDMEgsVUFBVSxHQUFHLEtBQUs7SUFDMUI7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVN1Uix1QkFBdUJBLENBQy9CdFosY0FBZ0QsRUFDaERuQixpQkFBMEMsRUFDMUNELGdCQUF5RCxFQUN6RCtFLFVBQXNCLEVBQ3RCcEQsYUFBd0IsRUFDeEIyYyxTQUFrQixFQUNZO0lBQzlCLElBQUlDLHFCQUFxQjtJQUN6QixJQUFJRCxTQUFTLEVBQUU7TUFDZEMscUJBQXFCLEdBQUd0ZSxpQkFBaUIsQ0FBQ3VCLElBQUksQ0FBRUUsZ0JBQWdCLElBQUtBLGdCQUFnQixDQUFDa0ksR0FBRyxLQUFLMFUsU0FBUyxDQUFDO01BQ3hHLElBQUlDLHFCQUFxQixFQUFFbmQsY0FBYyxLQUFLLElBQUksRUFBRTtRQUNuRCxPQUFPbWQscUJBQXFCLEVBQUVuZCxjQUFjO01BQzdDO0lBQ0Q7SUFDQSxNQUFNb2QsY0FBYyxHQUNuQnBkLGNBQWMsRUFBRWtMLElBQUksS0FDbkIsQ0FBQyxFQUFFbEwsY0FBYyxFQUFFb0IsUUFBUSxJQUFJcEIsY0FBYyxDQUFDb0IsUUFBUSxFQUFFMkUsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRXhGLGFBQWEsSUFBSUEsYUFBYSxDQUFDd0YsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZILE1BQU1zWCxvQkFBMEMsR0FBRztNQUNsRCxHQUFHRixxQkFBcUIsRUFBRW5kLGNBQWM7TUFDeEN3RCxJQUFJLEVBQUV4RCxjQUFjLEVBQUV3RCxJQUFJLElBQUkyWixxQkFBcUIsRUFBRW5kLGNBQWMsRUFBRXdELElBQUk7TUFDekV5SCxRQUFRLEVBQ1BqTCxjQUFjLEVBQUVpTCxRQUFRLElBQ3hCZ04scUJBQXFCLENBQUMxWCxhQUFhLEVBQUVQLGNBQWMsRUFBRW9CLFFBQVEsQ0FBQyxJQUM5RCtiLHFCQUFxQixFQUFFbmQsY0FBYyxFQUFFaUwsUUFBUTtNQUNoRDdKLFFBQVEsRUFBRXBCLGNBQWMsRUFBRW9CLFFBQVEsR0FDL0JrVixpQkFBaUIsQ0FBQ3RXLGNBQWMsRUFBRW9CLFFBQVEsRUFBRXZDLGlCQUFpQixFQUFFRCxnQkFBZ0IsRUFBRStFLFVBQVUsQ0FBQyxHQUM1Rm5ELFNBQVM7TUFDWmxCLEtBQUssRUFBRVUsY0FBYyxFQUFFVixLQUFLO01BQzVCNEwsSUFBSSxFQUFFa1M7SUFDUCxDQUFDO0lBQ0QsT0FBT2hTLGlDQUFpQyxDQUFDaVMsb0JBQW9CLENBQUM7RUFDL0Q7RUFBQyxPQUFBOWUsUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119
|
|
1685
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJ0ZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsInR5cGUiLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJlbnRpdHlUeXBlIiwidGFibGVDcmVhdGlvbk1vZGUiLCJkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwicmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwicHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkIiwiYWdncmVnYXRpb25IZWxwZXIiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImdyb3VwYWJsZVByb3BlcnRpZXMiLCJnZXRHcm91cGFibGVQcm9wZXJ0aWVzIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtYXAiLCIkdGFyZ2V0IiwiZmlsdGVyIiwidGFyZ2V0IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wIiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsInByb3AiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZXhpc3RzIiwic29tZSIsInRhcmdldFR5cGUiLCJpbmNsdWRlcyIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsInByb3BlcnRpZXMiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJsZW5ndGgiLCJkYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlIiwiYW5ub3RhdGlvblByb3BlcnR5IiwiYWRkaXRpb25hbFByb3BlcnR5SW5mb3MiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lIiwicHVzaCIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiVGV4dCIsInJlbGF0ZWRDb2x1bW5zIiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiY29uY2F0IiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4iLCJncm91cFBhdGgiLCJfc2xpY2VBdFNsYXNoIiwiaXNHcm91cCIsImxhYmVsIiwiZ2V0TGFiZWwiLCJkYXRhVHlwZSIsImdldERhdGFGaWVsZERhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiZ2V0VHlwZUNvbmZpZyIsImlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiIsInNvcnRhYmxlIiwiZmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ3JvdXBhYmxlIiwidHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsImNvbnN0cmFpbnRzIiwiX2lzRXhwb3J0YWJsZUNvbHVtbiIsImNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzIiwiY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzIiwiX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsImtleSIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJBbm5vdGF0aW9uIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwiYW5ub3RhdGlvblBhdGgiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImdldEltcG9ydGFuY2UiLCJVSSIsIkRhdGFGaWVsZERlZmF1bHQiLCJyZXF1aXJlZCIsImlzUmVxdWlyZWRDb2x1bW4iLCJhZGRpdGlvbmFsTGFiZWxzIiwiX2FkZFRvb2xUaXAiLCJfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQiLCJNb2RlbEhlbHBlciIsImlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkIiwiZXh0ZW5zaW9uIiwidGVjaG5pY2FsbHlBZ2dyZWdhdGFibGUiLCJ0ZWNobmljYWxseUdyb3VwYWJsZSIsInVuaXRQcm9wZXJ0eSIsInV0YyIsImlzQVRpbWV6b25lIiwiY3VycmVuY3lQcm9wZXJ0eSIsInNjYWxlIiwiaXNQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldFN0YXRpY1VuaXRPckN1cnJlbmN5IiwiZ2V0U3RhdGljVGltZXpvbmUiLCJpc1RpbWV6b25lIiwiZXhwb3J0VHlwZSIsImdldEV4cG9ydERhdGFUeXBlIiwiaW5wdXRGb3JtYXQiLCJnZXREYXRlSW5wdXRGb3JtYXQiLCJkZWxpbWl0ZXIiLCJnZXREZWxpbWl0ZXIiLCJ0ZW1wbGF0ZSIsIndyYXAiLCJhdXRvU2NhbGUiLCJyZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MiLCJzZXR0aW5nIiwic291cmNlIiwicHJvcGVydHlUeXBlIiwiZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5IiwiJFR5cGUiLCJUYXJnZXQiLCJWYWx1ZSIsIkNvcmUiLCJNZWRpYVR5cGUiLCJ0ZXJtIiwiaXNVUkwiLCJfaXNWYWxpZENvbHVtbiIsImRhdGFGaWVsZCIsIklubGluZSIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInByb3BlcnR5VmFsdWUiLCJpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkIiwiY29uc3RhbnQiLCJpc0FuYWx5dGljYWxMZWFmIiwiYW5kIiwibm90IiwiZXF1YWwiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJIaWRkZW4iLCJpZkVsc2UiLCJvciIsIl9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJkYXRhRmllbGRHcm91cCIsImZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImNvbXBpbGVFeHByZXNzaW9uIiwiRGF0YSIsImlubmVyRGF0YUZpZWxkIiwiYXJndW1lbnRzIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwicXVhbGlmaWVyIiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwidmFsdWVPZiIsIl9nZXRUb29sdGlwIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSIsImNvbE5hbWUiLCJpc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZm9ybWF0UmVzdWx0IiwicGF0aEluTW9kZWwiLCJ0YWJsZUZvcm1hdHRlcnMiLCJnZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZFByb3BlcnR5TmFtZU1hcCIsImdldEFic29sdXRlQW5ub3RhdGlvblBhdGgiLCJyZWxhdGVkQ29sdW1uIiwicHJvcGVydHlPYmplY3RQYXRoIiwiaXNNdWx0aVZhbHVlRmllbGQiLCJuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoIiwiY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMiLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsImNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsInZhbHVlIiwiaXNMYXN0U2xhc2giLCJpc0xhc3RQYXJ0IiwiaVNsYXNoSW5kZXgiLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJfaXNDb2x1bW5NdWx0aVZhbHVlZCIsIl9pc0NvbHVtblNvcnRhYmxlIiwicHJvcGVydHlQYXRoIiwibm9uU29ydGFibGVDb2x1bW5zIiwicHJvcE5hbWUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJfZ2V0RmlsdGVyRnVuY3Rpb25zIiwiQ29udmVydGVyQ29udGV4dCIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsIlR5cGVHdWFyZHMiLCJpc0VudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsIl9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXMiLCJzZW1hbnRpY0tleXMiLCJhU2VtYW50aWNLZXlWYWx1ZXMiLCJiU2VtYW50aWNLZXlGb3VuZCIsImkiLCJ2YWx1ZXMiLCJzZW1hbnRpY0tleUZvdW5kIiwiX2ZpbmRQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlWYWx1ZXMiLCJmaWVsZEdyb3VwUHJvcGVydGllcyIsInNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAiLCJzUHJvcGVydHlQYXRoIiwidG1wIiwiZmllbGRHcm91cFByb3BlcnR5UGF0aCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAiLCJhUHJvcGVydGllcyIsIl9wcm9wZXJ0aWVzRm91bmQiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJzZW1hbnRpY0tleSIsInNlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoIiwic2hvd0Vycm9yT2JqZWN0U3RhdHVzIiwiaGFzRHJhZnRJbmRpY2F0b3IiLCJfZ2V0SW1wTnVtYmVyIiwiSW1wb3J0YW5jZSIsIl9nZXREYXRhRmllbGRJbXBvcnRhbmNlIiwic3BsaXQiLCJOb25lIiwidGFyZ2V0VmFsdWVmcm9tRFAiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsIl9nZXRNYXhJbXBvcnRhbmNlIiwiZmllbGRzIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJmaWVsZCIsInRhcmdldEVudGl0eVR5cGUiLCJTZW1hbnRpY0tleSIsInJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsImhpZ2hLZXlzIiwiZmllbGRzV2l0aEltcG9ydGFuY2UiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJkYXRhRmllbGRUYXJnZXQiLCJmaWVsZEdyb3VwRGF0YSIsImZpZWxkR3JvdXBEYXRhRmllbGQiLCJIaWdoIiwiaXRlbSIsImdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInRhYmxlTWFuaWZlc3RTZXR0aW5ncyIsImRlZmF1bHRDcmVhdGlvbk1vZGUiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm1hY3JvcyIsInRhYmxlIiwiQ3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwidGFibGVTZXR0aW5ncyIsImNyZWF0aW9uTW9kZSIsImdldEFubm90YXRpb25zQnlUZXJtIiwiZ2V0RW50aXR5VHlwZSIsInRhYmxlQ29udmVydGVyQ29udGV4dCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRmllbGRHcm91cENvbHVtbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwic2l0dWF0aW9uc05hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiaXNDb2xsZWN0aW9uIiwiU0FQT2JqZWN0Tm9kZVR5cGUiLCJOYW1lIiwic2l0dWF0aW9uc05hdlByb3AiLCJoYXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiaXNNdWx0aVZhbHVlIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImlzUGFydE9mTGluZUl0ZW0iLCJ0b29sdGlwIiwicmVsYXRlZFByb3BlcnR5TmFtZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwiY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNvbHZlUGF0aCIsImlzUmVxdWlyZWRGaWVsZEdyb3VwIiwiZmllbGRHcm91cCIsImlzRGF0YUZpZWxkIiwiaXNTdGF0aWNhbGx5TWFuZGF0b3J5IiwiaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5IiwiaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24iLCJkYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkR3JvdXBUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsIklzRWRpdGFibGUiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJleHBvcnRQcm9wZXJ0aWVzIiwiam9pbiIsImludGVybmFsQ29sdW1ucyIsImlzQ29sdW1uT3ZlcnJpZGUiLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsInJlcGxhY2UiLCJpc1BhcnRPZkN1c3RvbUNvbHVtbiIsInZhbGlkYXRlS2V5IiwiYmFzZVRhYmxlQ29sdW1uIiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW4iLCJnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyIsInRvb2x0aXBUZXh0IiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsImhlYWRlclRleHQiLCJoZWFkZXIiLCJjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyIsImJhc2VNYW5pZmVzdENvbHVtbiIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiaWQiLCJjdXN0b21UYWJsZUNvbHVtbiIsIkRlZmF1bHQiLCJtZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yIiwic2l0dWF0aW9uc0luZGljYXRvckNvbHVtbiIsInByb3BlcnR5S2V5IiwiaXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiQ29tcHV0ZWQiLCJjbGlwYm9hcmRTZXR0aW5ncyIsImluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4iLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yIiwiaXNEcmFmdE5vZGUiLCJpc0RyYWZ0Um9vdCIsImNvbHVtbldpdGhEcmFmdEluZGljYXRvciIsImRyYWZ0SW5kaWNhdG9yQ29sdW1uIiwiaXNEcmFmdEluZGljYXRvciIsImNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciIsImdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uIiwiY2FwYWJpbGl0aWVzIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiaXNDdXJyZW5jeSIsImV4cG9ydERhdGFUeXBlIiwibmF2UHJvcGVydHkiLCJsaW5lSXRlbSIsImlzUHJvcGVydHlOYXZpZ2F0ZWQiLCJpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQiLCJ0YXJnZXRNYXBwaW5nIiwiaXNUeXBlRGVmaW5pdGlvbiIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsInNldFVwQ29uc3RyYWludHMiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJudWxsYWJsZSIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyIsImV4aXN0aW5nQ29sdW1uIiwiY29sdW1uS2V5IiwiY29sdW1uRnJvbUFubm90YXRpb25zIiwiZW5hYmxlV3JhcHBpbmciLCJjdXN0b21FeHBvcnRTZXR0aW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29sdW1ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJGdW5jdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc19FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNLZXkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdExpbmVJdGVtXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0RURNX1RZUEVfTUFQUElORyxcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRmb3JtYXRSZXN1bHQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRub3QsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbCxcblx0c2V0VXBDb25zdHJhaW50c1xufSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUge1xuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4sXG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRGb3JtYXRPcHRpb25zVHlwZSxcblx0VGFibGVDb2x1bW5TZXR0aW5ncyxcblx0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBIb3Jpem9udGFsQWxpZ24sIEltcG9ydGFuY2UsIFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGxleFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSxcblx0Z2V0RGF0YUZpZWxkRGF0YVR5cGUsXG5cdGdldFNlbWFudGljT2JqZWN0UGF0aCxcblx0Z2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCxcblx0aGFzRGF0YVBvaW50VGFyZ2V0LFxuXHRoYXNGaWVsZEdyb3VwVGFyZ2V0LFxuXHRpc0RhdGFGaWVsZCxcblx0aXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHRpc0RhdGFGaWVsZFR5cGVzLFxuXHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0LFxuXHRpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7IHR5cGUgVGFibGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IE92ZXJyaWRlVHlwZSwgUGxhY2VtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvRGF0YUZpZWxkSGVscGVyXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0ICogYXMgVHlwZUd1YXJkcyBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRpc0Fubm90YXRpb25PZlR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eSxcblx0aXNUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRlbmhhbmNlRGF0YU1vZGVsUGF0aCxcblx0Z2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSwgdHlwZSBEaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsIHR5cGUgUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5pbXBvcnQgeyBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnksIGlzU3RhdGljYWxseU1hbmRhdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0Z2V0U3RhdGljVGltZXpvbmUsXG5cdGdldFN0YXRpY1VuaXRPckN1cnJlbmN5LFxuXHRpc1RpbWV6b25lXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVGaWVsZCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0VHlwZUZvckVkbVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVzdHJpY3RlZC1pbXBvcnRzXG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgTURDVGFibGVQcm9wZXJ0eUluZm8gYXMgUHJvcGVydHlJbmZvLCBWaXN1YWxTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBTaW1wbGVUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvU2ltcGxlVHlwZVwiO1xuXG4vLyBDdXN0b20gQ29sdW1uIGZyb20gTWFuaWZlc3RcbnR5cGUgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlPzogQ29sdW1uVHlwZS5EZWZhdWx0O1xufTtcblxuLy8gU2xvdCBDb2x1bW4gZnJvbSBCdWlsZGluZyBCbG9ja1xudHlwZSBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Q7XG59O1xuLy8gUHJvcGVydGllcyBhbGwgQ29sdW1uVHlwZXMgaGF2ZTpcbnR5cGUgQmFzZVRhYmxlQ29sdW1uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlOyAvL09yaWdpbiBvZiB0aGUgc291cmNlIHdoZXJlIHdlIGFyZSBnZXR0aW5nIHRoZSB0ZW1wbGF0ZWQgaW5mb3JtYXRpb24gZnJvbVxuXHR3aWR0aD86IHN0cmluZztcblx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI/OiBib29sZWFuO1xuXHRpbXBvcnRhbmNlPzogSW1wb3J0YW5jZTtcblx0aG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuXHRhdmFpbGFiaWxpdHk/OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRsYWJlbD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcbn07XG5cbi8vIFByb3BlcnRpZXMgb24gQ3VzdG9tIENvbHVtbnMgYW5kIFNsb3QgQ29sdW1uc1xuZXhwb3J0IHR5cGUgQ3VzdG9tQmFzZWRUYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0aWQ6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHRoZWFkZXI/OiBzdHJpbmc7XG5cdHRlbXBsYXRlOiBzdHJpbmcgfCBDb250cm9sO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZTtcblx0aXNHcm91cGFibGU6IGJvb2xlYW47XG5cdGlzTmF2aWdhYmxlOiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9O1xuXHRwcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBDb21wdXRlZFRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdHByb3BlcnR5S2V5OiBzdHJpbmc7XG5cdGlzRHJhZnRJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGUgfCBudWxsO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRjbGlwYm9hcmRTZXR0aW5ncz86IE9iamVjdCB8IG51bGw7XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG4vLyBQcm9wZXJ0aWVzIGRlcml2ZWQgZnJvbSBNYW5pZmVzdCB0byBvdmVycmlkZSBBbm5vdGF0aW9uIGNvbmZpZ3VyYXRpb25zXG50eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRzZXR0aW5ncz86IFRhYmxlQ29sdW1uU2V0dGluZ3M7XG5cdGZvcm1hdE9wdGlvbnM/OiBGb3JtYXRPcHRpb25zVHlwZTtcblx0ZXhwb3J0U2V0dGluZ3M/OiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cyA9IFBhcnRpYWw8e1xuXHRzY2FsZTogbnVtYmVyO1xuXHRwcmVjaXNpb246IG51bWJlcjtcblx0bWF4TGVuZ3RoOiBudW1iZXI7XG5cdG51bGxhYmxlOiBib29sZWFuO1xuXHRtaW5pbXVtOiBzdHJpbmc7XG5cdG1heGltdW06IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlOiBib29sZWFuO1xufT47XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnMgPSBQYXJ0aWFsPHtcblx0cGFyc2VBc1N0cmluZzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc6IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBib29sZWFuO1xuXHRzdHlsZTogc3RyaW5nO1xufT47XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0dHlwZT86IHN0cmluZztcblx0Y29uc3RyYWludHM/OiBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9ucz86IFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnM7XG5cdHR5cGVJbnN0YW5jZT86IFNpbXBsZVR5cGU7XG5cdGJhc2VUeXBlPzogc3RyaW5nO1xuXHRjbGFzc05hbWU/OiBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSAmIHtcblx0ZGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdGlzQ3VycmVuY3k/OiBib29sZWFuO1xufTtcblxuLy8gUHJvcGVydGllcyBmb3IgQW5ub3RhdGlvbiBDb2x1bW5zXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSBQcm9wZXJ0eUluZm8gJlxuXHRBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZSAmIHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0XHR0b29sdGlwPzogc3RyaW5nO1xuXHRcdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdFx0Z3JvdXA/OiBzdHJpbmc7XG5cdFx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0c2hvd0RhdGFGaWVsZHNMYWJlbD86IGJvb2xlYW47XG5cdFx0cmVxdWlyZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRpc0dyb3VwYWJsZT86IGJvb2xlYW47XG5cdFx0dW5pdFRleHQ/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmVUZXh0Pzogc3RyaW5nO1xuXHRcdHRpbWV6b25lPzogc3RyaW5nO1xuXHRcdHNlbWFudGljT2JqZWN0UGF0aD86IHN0cmluZztcblx0XHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0XHR0ZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRcdG1vZGU6IERpc3BsYXlNb2RlO1xuXHRcdH07XG5cdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0XHR0eXBlQ29uZmlnPzogUHJvcGVydHlUeXBlQ29uZmlnO1xuXHRcdGlzUGFydE9mTGluZUl0ZW0/OiBib29sZWFuOyAvLyB0ZW1wb3JhcnkgaW5kaWNhdG9yIHRvIG9ubHkgYWxsb3cgZmlsdGVyaW5nIG9uIG5hdmlnYXRpb24gcHJvcGVydGllcyB3aGVuIHRoZXkncmUgcGFydCBvZiBhIGxpbmUgaXRlbVxuXHRcdGlzUGFydE9mQ3VzdG9tQ29sdW1uPzogYm9vbGVhbjtcblx0XHRhZGRpdGlvbmFsTGFiZWxzPzogc3RyaW5nW107XG5cdFx0ZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdFx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xuXHRcdGlzTXVsdGlWYWx1ZT86IGJvb2xlYW47XG5cdFx0ZGVzY3JpcHRpb25Qcm9wZXJ0eT86IHN0cmluZztcblx0XHRtb2RlPzogRGlzcGxheU1vZGU7XG5cdFx0dmFsdWVQcm9wZXJ0eT86IHN0cmluZztcblx0fTtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gUHJvcGVydHlJbmZvW1wiZXh0ZW5zaW9uXCJdICYge1xuXHRhZGRpdGlvbmFsUHJvcGVydGllcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgQ29tcHV0ZWRUYWJsZUNvbHVtbjtcblxudHlwZSBNYW5pZmVzdENvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPjtcblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlIChDdXN0b20gQ29sdW1uKVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIixcblx0Q29tcHV0ZWQgPSBcIkNvbXB1dGVkXCJcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0LWJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdHlwZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFJldHVybnMgYWxsIHRhYmxlIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRlbXBsYXRpbmcgb3IgcGVyc29uYWxpemF0aW9uIG9yIHRoZWlyIG9yaWdpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVUeXBlLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuY29sdW1ucyA/PyB7fSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKVxuXHQpO1xuXG5cdGNvbnN0IHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSA9IGluc2VydEN1c3RvbUVsZW1lbnRzKFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIFRhYmxlQ29sdW1uW10sXG5cdFx0bWFuaWZlc3RDb2x1bW5zIGFzIFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnQ8VGFibGVDb2x1bW4+Pixcblx0XHR7XG5cdFx0XHR3aWR0aDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0aW1wb3J0YW5jZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGhvcml6b250YWxBbGlnbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGlzTmF2aWdhYmxlOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0c2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0XHR9XG5cdCk7XG5cblx0cmV0dXJuIGFkZENvbXB1dGVkQ29sdW1ucyh0YWJsZUNvbHVtbnMsIHRhYmxlVHlwZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHBhdGg7XG5cdH0pO1xufVxuXG4vKipcbiAqIFNldHMgdGhlICd1bml0JywgJ3RleHRBcnJhbmdlbWVudCcsICd0aW1lem9uZScgYW5kICdleHBvcnRzZXR0aW5ncycgcHJvcGVydGllcyBpbiBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgY29sdW1ucyB0byBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IHRhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRcdFx0aWYgKHByb3BlcnR5KSB7XG5cdFx0XHRcdGFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZSA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0XHRcdFx0aWYgKHRpbWV6b25lUHJvcGVydHkpIHtcblx0XHRcdFx0XHRjb25zdCBvVGltZXpvbmVDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRpbWV6b25lUHJvcGVydHkubmFtZSwgdGFibGVDb2x1bW5zKTtcblx0XHRcdFx0XHR0YWJsZUNvbHVtbi50aW1lem9uZSA9IG9UaW1lem9uZUNvbHVtbj8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZSkge1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnRpbWV6b25lVGV4dCA9IHRpbWV6b25lLnRvU3RyaW5nKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgXCJ1bml0XCIgcHJvcGVydHkgaW50byB0aGUgY29sdW1ucyB3aGVuIG5lY2Nlc2FyeSBmb3IgY29sdW1ucyB3aXRoIHVuaXQgb2YgbWVhc3VyZSBhbmQgY3VycmVuY2llcy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwcm9wZXJ0eSBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGRpc3BsYXllZCBvbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbiBUaGUgdGFibGUgY29sdW1uIHdoaWNoIGFkZHMgdGhlIGN1cnJlbmN5IG9yIHVuaXRcbiAqL1xuZnVuY3Rpb24gYWRkQ3VycmVuY3lPclVvTVRvUHJvcGVydHkoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZUNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uXG4pOiB2b2lkIHtcblx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdGlmIChjdXJyZW5jeU9yVW9NUHJvcGVydHkpIHtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgY3VycmVuY3lPclVvTVByb3BlcnR5KTtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRpZiAoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgdW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCwgdGFibGVDb2x1bW5zKTtcblx0XHRcdHRhYmxlQ29sdW1uLnVuaXQgPSB1bml0Q29sdW1uPy5uYW1lO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCB1bml0ID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0XHRpZiAodW5pdCkge1xuXHRcdFx0dGFibGVDb2x1bW4udW5pdFRleHQgPSBgJHt1bml0fWA7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQWRkIHRoZSBcInRleHRBcnJhbmdlbWVudFwiIG9iamVjdCB0byBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5IGZvciBjb2x1bW5zIGNvbnRhaW5pbmcgdGV4dCwgc3VjaCBhcyBkZXNjcmlwdGlvbnMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgYnkgdGhlIGNvbHVtblxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcHJvcGVydHkgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBkaXNwbGF5ZWQgb24gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW4gVGhlIHRhYmxlIGNvbHVtbiB3aGljaCBhZGRzIHRoZSB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGFkZFRleHRBcnJhbmdlbnRJbmZvVG9Qcm9wZXJ0eShcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5cbik6IHZvaWQge1xuXHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSxcblx0XHR0ZXh0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAodGV4dFByb3BlcnR5UGF0aCAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHRleHRSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGlmICh0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCB0ZXh0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0ZXh0UmVsYXRpdmVQYXRoLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0aWYgKHRleHRDb2x1bW4gJiYgdGV4dENvbHVtbi5uYW1lICE9PSB0YWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdHRhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHR0ZXh0UHJvcGVydHk6IHRleHRDb2x1bW4ubmFtZSxcblx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBJZiB0ZXh0IHByb3BlcnRpZXMgYXJlIHVzZWQgYnV0IGhpZGRlbiwgd2UgbXVzdCBpbmNsdWRlIHRoZW0gdG8gdGhlIGV4cG9ydCBhcyB0aGVyZSBhcmUgdXNlZCBpbiB0aGUgcGFzdGVcblx0XHRcdFx0aWYgKCF0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzKSB7XG5cdFx0XHRcdFx0dGV4dENvbHVtbi5leHBvcnRTZXR0aW5ncyA9IHsgdHlwZTogXCJTdHJpbmdcIiB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGNvbHVtbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUsXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGlmIChhbm5vdGF0aW9uQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMgPSBbXTtcblx0fVxuXG5cdGxldCBwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQ6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBncm91cGFibGVQcm9wZXJ0aWVzID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0R3JvdXBhYmxlUHJvcGVydGllcygpO1xuXHQvL0ZvciBBbmFseXRpY2FsIHRhYmxlLCB3ZSBleGNsdWRlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBncm91cGFibGUgYW5kIHVzZWQgYXMgVGV4dCBpbiBhIGdyb3VwYWJsZSBQcm9wZXJ0eS5cblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmIGdyb3VwYWJsZVByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQgPSBncm91cGFibGVQcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkuJHRhcmdldClcblx0XHRcdC5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHQubWFwKCh0YXJnZXQpID0+IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkodGFyZ2V0IGFzIFByb3BlcnR5KSlcblx0XHRcdC5maWx0ZXIoKHRleHRQcm9wKSA9PiB0ZXh0UHJvcCAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZSh0ZXh0UHJvcCkpXG5cdFx0XHQubWFwKChwcm9wKSA9PiBwcm9wPy5uYW1lKVxuXHRcdFx0LmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gdW5kZWZpbmVkKSBhcyBzdHJpbmdbXTtcblx0fVxuXHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0XHRjb25zdCBleGlzdHMgPSBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblx0XHQvLyBpZiB0YXJnZXQgdHlwZSBleGlzdHMsIGl0IGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgc2hvdWxkIGJlIGlnbm9yZWRcblx0XHRpZiAoIXByb3BlcnR5LnRhcmdldFR5cGUgJiYgIWV4aXN0cyAmJiAhcHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkLmluY2x1ZGVzKHByb3BlcnR5Lm5hbWUpKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Ly8gSW5jbHVkZSB0aGUgdGV4dCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHRleHQgYXJyYW5nZW1lbnRcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCwgcmVsYXRlZFByb3BlcnRpZXNJbmZvLCBuYW1lKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllc0luZm9cblx0XHRcdCk7XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdFx0XHRcdGNvbHVtbkluZm8uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW25hbWVdLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChhZGRpdGlvbmFsUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFthZGRpdGlvbmFsUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblx0XHQvLyBJbiBjYXNlIGEgcHJvcGVydHkgaGFzIGRlZmluZWQgYSAjVGV4dE9ubHkgdGV4dCBhcnJhbmdlbWVudCB0aGF0IHBvaW50cyB0byBhIHRleHQgcHJvcGVydHkgKGFuZCBub3QgYSAnaGFyZCBjb2RlZCB0ZXh0JykgZG9uJ3Qgb25seSBjcmVhdGUgdGhlIGNvbXBsZXggcHJvcGVydHkgd2l0aCB0aGUgdGV4dCBwcm9wZXJ0eSBhcyBhIGNoaWxkIHByb3BlcnR5LFxuXHRcdC8vIGJ1dCBhbHNvIHRoZSBwcm9wZXJ0eSBpdHNlbGYgYXMgaXQgY2FuIGJlIHVzZWQgYXMgd2l0aGluIHRoZSBzb3J0Q29uZGl0aW9ucyBvciBvbiBjdXN0b20gY29sdW1ucy5cblx0XHQvLyBUaGlzIHN0ZXAgbXVzdCBiZSB2YWxpZCBhbHNvIGZyb20gdGhlIGNvbHVtbnMgYWRkZWQgdmlhIExpbmVJdGVtcyBvciBmcm9tIGEgY29sdW1uIGF2YWlsYWJsZSBvbiB0aGUgcDEzbi5cblx0XHRpZiAoZ2V0RGlzcGxheU1vZGUocHJvcGVydHkpID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpKSB7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goXG5cdFx0XHRcdFx0Z2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHQvLyBDcmVhdGUgYSBwcm9wZXJ0eUluZm8gZm9yIGVhY2ggcmVsYXRlZCBwcm9wZXJ0eS5cblx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdHRhYmxlVHlwZSxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0KTtcblx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLmNvbmNhdChyZWxhdGVkQ29sdW1ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbHVtbiBkZWZpbml0aW9uIGZyb20gYSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBFbnRpdHkgdHlwZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGNvbHVtbiBpcyBjcmVhdGVkXG4gKiBAcGFyYW0gZnVsbFByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dFxuICogQHBhcmFtIHVzZURhdGFGaWVsZFByZWZpeCBTaG91bGQgYmUgcHJlZml4ZWQgd2l0aCBcIkRhdGFGaWVsZDo6XCIsIGVsc2UgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIFwiUHJvcGVydHk6OlwiXG4gKiBAcGFyYW0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgYXZhaWxhYmxlIGZvciBhZGFwdGF0aW9uXG4gKiBAcGFyYW0gYWdncmVnYXRpb25IZWxwZXIgVGhlIGFnZ3JlZ2F0aW9uSGVscGVyIGZvciB0aGUgZW50aXR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIGRlc2NyaXB0aW9uIG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhciBmb3IgdGhlIGNvbHVtblxuICogQHBhcmFtIHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUgVGhlIE1EQyBwYXRoIHVzZWQgZm9yIHRoZSAxOm4gcHJvcGVydHkgdG8gYWxsb3cgZmlsdGVyaW5nIGZyb20gTURDXG4gKiBAcmV0dXJucyBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gZGVmaW5pdGlvblxuICovXG5jb25zdCBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0dGFibGVUeXBlPzogVGFibGVUeXBlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm8/OiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlPzogc3RyaW5nXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID0gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5KTtcblx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihwcm9wZXJ0eSk7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApO1xuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKHByb3BlcnR5KTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eSwgZGF0YVR5cGUpO1xuXHRjb25zdCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24gPSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0aXZlUGF0aF0gPT09IFwiRGVzY3JpcHRpb25cIjtcblx0Y29uc3Qgc29ydGFibGUgPVxuXHRcdCghaXNIaWRkZW4gfHwgaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uKSAmJiAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgZmlsdGVyYWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IGdyb3VwYWJsZSA9XG5cdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJiB0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCJcblx0XHRcdD8gISFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHByb3BlcnR5KVxuXHRcdFx0OiBzb3J0YWJsZTtcblx0Y29uc3QgdHlwZUNvbmZpZyA9IHtcblx0XHRjbGFzc05hbWU6IHByb3BlcnR5LnR5cGUgfHwgZGF0YVR5cGUsXG5cdFx0Zm9ybWF0T3B0aW9uczogcHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0Y29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHR9O1xuXHRsZXQgZXhwb3J0U2V0dGluZ3M6IFByb3BlcnR5SW5mb1tcImV4cG9ydFNldHRpbmdzXCJdID0gbnVsbDtcblx0aWYgKF9pc0V4cG9ydGFibGVDb2x1bW4ocHJvcGVydHkpKSB7XG5cdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0fVxuXHRjb25zdCBhdmFpbGFiaWxpdHkgPSAhaXNIaWRkZW4gJiYgYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiA/IFwiQWRhcHRhdGlvblwiIDogXCJIaWRkZW5cIjtcblx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMocmVsYXRpdmVQYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0aWYgKHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUpIHtcblx0XHRyZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlO1xuXHR9XG5cdGNvbnN0IG5hbWUgPSB1c2VEYXRhRmllbGRQcmVmaXggPyByZWxhdGl2ZVBhdGggOiBgUHJvcGVydHk6OiR7cmVsYXRpdmVQYXRofWA7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cblx0Y29uc3QgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSB7XG5cdFx0a2V5OiBrZXksXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGRhdGFUeXBlOiBkYXRhVHlwZSA/PyBwcm9wZXJ0eS50eXBlLFxuXHRcdGxhYmVsOiBsYWJlbCA/PyBwcm9wZXJ0eS5uYW1lLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBnZXRMYWJlbChwcm9wZXJ0eSkgOiB1bmRlZmluZWQsXG5cdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdGF2YWlsYWJpbGl0eTogYXZhaWxhYmlsaXR5LFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdGZpbHRlcmFibGU6IGZpbHRlcmFibGUsXG5cdFx0aXNHcm91cGFibGU6IGdyb3VwYWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnIGFzIFByb3BlcnR5VHlwZUNvbmZpZyxcblx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCksXG5cdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgcHJvcGVydHksIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRhZGRpdGlvbmFsTGFiZWxzOiBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHNcblx0fTtcblx0X2FkZFRvb2xUaXAocHJvcGVydHksIGNvbHVtbik7XG5cdF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eSwgY29sdW1uKTtcblxuXHRpZiAoXG5cdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJlxuXHRcdE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSAmJlxuXHRcdChyZWxhdGl2ZVBhdGggPT09IFwiSGFzQWN0aXZlRW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIkhhc0RyYWZ0RW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIklzQWN0aXZlRW50aXR5XCIpXG5cdCkge1xuXHRcdC8vIEluIGNhc2Ugb2YgYW5hbHl0aWNhbCB0YWJsZSBvbiBhIGRyYWZ0LWVuYWJsZWQgZW50aXR5LCB3ZSBhbHdheXMgY29uc2lkZXIgdGhlIEhhc0RyYWZ0RW50aXR5LCBIYXNBY3RpdmVFbnRpdHkgYW5kIElzQWN0aXZlRW50aXR5IHByb3BlcnRpZXMgYXNcblx0XHQvLyB0ZWNobmljYWxseSBncm91cGFibGUsIGFzIHdlIG5lZWQgdG8gbG9hZCB0aGVtIGZvciBvdXIgaW50ZXJuYWwgbG9naWMuXG5cdFx0Y29sdW1uLmV4dGVuc2lvbiA9IHtcblx0XHRcdHRlY2huaWNhbGx5QWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gY29sdW1uO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBhIGxpbmUgaXRlbSBhcyBhIGRhdGEgZmllbGQgb3IgYSBwcm9wZXJ0eSBmcm9tIHRoZSBlbnRpdHkgdHlwZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGluIGEgdGhlIGdpdmVuIGNvbHVtblxuICovXG5jb25zdCBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0bGV0IHVuaXRQcm9wZXJ0eSwgdGltZXpvbmVQcm9wZXJ0eSwgdW5pdFRleHQsIHRpbWV6b25lVGV4dCwgdXRjLCBpc0FUaW1lem9uZSwgY3VycmVuY3lQcm9wZXJ0eSwgc2NhbGU7XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvID8gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpIDogW107XG5cdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8gJiYgcmVsYXRlZFByb3BlcnR5TmFtZXM/Lmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGJhc2VkIG9uIHRoZSByZWxhdGVkIChjaGlsZCkgcHJvcGVydHkgaW4gY2FzZSB0aGVyZSBpcyBvbmx5IG9uZS5cblx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gd2UgaGF2ZSBhIHRleHQgb25seSBhbm5vdGF0aW9uIHRvIGNvbXB1dGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmcm9tIHRoZSB0ZXh0IGluc3RlYWQgb2YgdGhlIHZhbHVlXG5cdFx0Y29sdW1uID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZXNbMF1dLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0fVxuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKGNvbHVtbik7XG5cdGlmIChpc1Byb3BlcnR5KGNvbHVtbikpIHtcblx0XHR1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KGNvbHVtbik7XG5cdFx0Y3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dW5pdFRleHQgPSBnZXRTdGF0aWNVbml0T3JDdXJyZW5jeShjb2x1bW4pO1xuXHRcdHRpbWV6b25lVGV4dCA9IGdldFN0YXRpY1RpbWV6b25lKGNvbHVtbik7XG5cdFx0aXNBVGltZXpvbmUgPSBpc1RpbWV6b25lKGNvbHVtbik7XG5cdFx0c2NhbGUgPSBjb2x1bW4uc2NhbGU7XG5cdH1cblx0dW5pdFByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udW5pdFByb3BlcnR5ID8/IHVuaXRQcm9wZXJ0eT8ubmFtZSA/PyBjdXJyZW5jeVByb3BlcnR5Py5uYW1lO1xuXHR0aW1lem9uZVByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udGltZXpvbmVQcm9wZXJ0eSA/PyB0aW1lem9uZVByb3BlcnR5Py5uYW1lO1xuXHRzY2FsZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnNjYWxlID8/IHNjYWxlO1xuXHRjb25zdCBleHBvcnRUeXBlID0gZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGUsIGlzQVRpbWV6b25lLCAhIWN1cnJlbmN5UHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MpO1xuXHRpZiAodGltZXpvbmVQcm9wZXJ0eSB8fCAoZXhwb3J0VHlwZSA9PT0gXCJEYXRlVGltZVwiICYmICF0aW1lem9uZVRleHQpKSB7XG5cdFx0dXRjID0gZmFsc2U7XG5cdH1cblx0Y29uc3QgZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzID0ge1xuXHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0aW5wdXRGb3JtYXQ6IGdldERhdGVJbnB1dEZvcm1hdChkYXRhVHlwZSksXG5cdFx0ZGVsaW1pdGVyOiBnZXREZWxpbWl0ZXIoZGF0YVR5cGUpLFxuXHRcdHNjYWxlOiBzY2FsZSxcblx0XHR1bml0UHJvcGVydHk6IHVuaXRQcm9wZXJ0eSxcblx0XHR1bml0OiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnVuaXQgPz8gdW5pdFRleHQsXG5cdFx0dGltZXpvbmVQcm9wZXJ0eTogdGltZXpvbmVQcm9wZXJ0eSxcblx0XHR0aW1lem9uZTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA/PyB0aW1lem9uZVRleHQ/LnRvU3RyaW5nKCksXG5cdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUsXG5cdFx0Ly9vbmx5IGluIGNhc2Ugb2YgY29tcGxleCBwcm9wZXJ0aWVzLCB3cmFwIHRoZSBjZWxsIGNvbnRlbnRcdG9uIHRoZSBleGNlbCBleHBvcnRlZCBmaWxlXG5cdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy53cmFwLFxuXHRcdHV0YzogdXRjXG5cdH07XG5cdGlmIChleHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgfHwgZXhwb3J0U2V0dGluZ3MudW5pdCkge1xuXHRcdGV4cG9ydFNldHRpbmdzLmF1dG9TY2FsZSA9IHRydWU7XG5cdH1cblx0cmV0dXJuIHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyhleHBvcnRTZXR0aW5ncyk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBmb3JtYXQgdGVtcGxhdGUgZm9yIGNvbHVtbnMgd2l0aCBkYXRlcy5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRoZSBpbnB1dEZvcm1hdFxuICovXG5jb25zdCBnZXREYXRlSW5wdXRGb3JtYXQgPSBmdW5jdGlvbiAoZGF0YVR5cGU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkZWxpbWl0ZXIgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogVGhlIGRlbGltaXRlciBpcyB1c2VkIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUcnVlIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnNcbiAqL1xuY29uc3QgZ2V0RGVsaW1pdGVyID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBkYXRhVHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2JqZWN0IG9mIGEgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBleHBvcnQgc2V0dGluZ3MgY29uZmlndXJhdGlvbnMgZm9yIGEgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICovXG5jb25zdCByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzKTogQ29sdW1uRXhwb3J0U2V0dGluZ3Mge1xuXHQvL1JlbW92ZSB1bmRlZmluZWQgc2V0dGluZ3MgZnJvbSBleHBvcnRTZXR0aW5nIG9iamVjdFxuXHRmb3IgKGNvbnN0IHNldHRpbmcgaW4gZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRpZiAoZXhwb3J0U2V0dGluZ3Nbc2V0dGluZyBhcyBrZXlvZiBDb2x1bW5FeHBvcnRTZXR0aW5nc10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVsZXRlIGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0U2V0dGluZ3M7XG59O1xuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciBleHBvcnRhYmxlIGNvbHVtbnMsIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5zLlxuICogQHBhcmFtIHNvdXJjZSBUaGUgZGF0YUZpZWxkIG9yIHByb3BlcnR5IHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVHJ1ZSBmb3IgZXhwb3J0YWJsZSBjb2x1bW4sIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gX2lzRXhwb3J0YWJsZUNvbHVtbihzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IGJvb2xlYW4ge1xuXHRsZXQgcHJvcGVydHlUeXBlLCBwcm9wZXJ0eTtcblx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5ID0gKHNvdXJjZSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRpZiAoaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRwcm9wZXJ0eVR5cGUgPSBkYXRhRmllbGREZWZhdWx0UHJvcGVydHk/LiRUeXBlO1xuXHR9IGVsc2UgaWYgKGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0cHJvcGVydHkgPSBzb3VyY2U7XG5cdFx0cHJvcGVydHlUeXBlID0gcHJvcGVydHkuJFR5cGU7XG5cdFx0aWYgKHByb3BlcnR5VHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0Ly9Gb3IgQ2hhcnRcblx0XHRcdHByb3BlcnR5VHlwZSA9IChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlO1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5VHlwZSAhPT0gdW5kZWZpbmVkICYmICFVSUFubm90YXRpb25UeXBlcy5DaGFydERlZmluaXRpb25UeXBlLmluY2x1ZGVzKHByb3BlcnR5VHlwZSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdChwcm9wZXJ0eSBhcyBEYXRhRmllbGQpLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uTWVkaWFUeXBlPy50ZXJtID09PSBcIk9yZy5PRGF0YS5Db3JlLlYxLk1lZGlhVHlwZVwiICYmXG5cdFx0XHQocHJvcGVydHkgYXMgRGF0YUZpZWxkKS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/LmlzVVJMICE9PSB0cnVlXG5cdFx0KSB7XG5cdFx0XHQvL0ZvciBTdHJlYW1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VHlwZVxuXHRcdD8gIVtcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdFx0ICBdLmluY2x1ZGVzKHByb3BlcnR5VHlwZSlcblx0XHQ6IHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBUb2RvOiBSZXBsYWNlIHdpdGggcHJvcGVyIExvZyBzdGF0ZW1lbnQgb25jZSBhdmFpbGFibGVcblx0XHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgdGhlIHZpc2liaWxpdHkgb2YgYSBEYXRhRmllbGQgb3IgRGF0YVBvaW50IGFubm90YXRpb24uXG4gKlxuICogU0FQIEZpb3JpIGVsZW1lbnRzIHdpbGwgZXZhbHVhdGUgZWl0aGVyIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBkZWZpbmVkIG9uIHRoZSBhbm5vdGF0aW9uIGl0c2VsZiBvciBvbiB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICogQHBhcmFtIGRhdGFGaWVsZE1vZGVsUGF0aCBUaGUgbWV0YXBhdGggcmVmZXJyaW5nIHRvIHRoZSBhbm5vdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGJ5IFNBUCBGaW9yaSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5jb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQgPSAvKmZvcm1hdE9wdGlvbnM/LmlzQW5hbHl0aWNzID8gVUkuSXNFeHBhbmRlZCA6Ki8gY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gLypmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IGVxdWFsKFVJLk5vZGVMZXZlbCwgMCkgOiovIGNvbnN0YW50KGZhbHNlKTtcblx0Ly8gQSBkYXRhIGZpZWxkIGlzIHZpc2libGUgaWY6XG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgdGFyZ2V0IHByb3BlcnR5IGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIGluIGNhc2Ugb2YgQW5hbHl0aWNzIGl0J3Mgbm90IHZpc2libGUgZm9yIGFuIGV4cGFuZGVkIEdyb3VwSGVhZGVyXG5cdHJldHVybiBhbmQoXG5cdFx0Li4uW1xuXHRcdFx0bm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHQhIXByb3BlcnR5VmFsdWUsXG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgJiYgbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpLFxuXHRcdFx0b3Iobm90KGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQpLCBpc0FuYWx5dGljYWxMZWFmKVxuXHRcdF1cblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBoaWRkZW4gYmluZGluZyBleHByZXNzaW9ucyBmb3IgYSBmaWVsZCBncm91cC5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cCBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIENvbXBpbGUgYmluZGluZyBvZiBmaWVsZCBncm91cCBleHByZXNzaW9ucy5cbiAqL1xuY29uc3QgX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRpZiAoZGF0YUZpZWxkR3JvdXA/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGRHcm91cC5hbm5vdGF0aW9ucy5VSS5IaWRkZW4pLCB0cnVlKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxcblx0XHRcdFx0XHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHRcdFx0XHQ+KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKG9yKC4uLmZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyksIGNvbnN0YW50KHRydWUpLCBjb25zdGFudChmYWxzZSkpKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHByb3BlcnR5IGFuZCBkYXRhRmllbGQuXG4gKiBAcGFyYW0gW3Byb3BlcnR5XSBQcm9wZXJ0eSwgRGF0YUZpZWxkIG9yIE5hdmlnYXRpb24gUHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBpc0dyb3VwXG4gKiBAcmV0dXJucyBMYWJlbCBvZiB0aGUgcHJvcGVydHkgb3IgRGF0YUZpZWxkXG4gKi9cbmNvbnN0IGdldExhYmVsID0gZnVuY3Rpb24gKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHksIGlzR3JvdXAgPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSB8fCBpc05hdmlnYXRpb25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRjb25zdCBkYXRhRmllbGREZWZhdWx0ID0gKHByb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWwpIHtcblx0XHRcdHJldHVybiBkYXRhRmllbGREZWZhdWx0LkxhYmVsPy50b1N0cmluZygpO1xuXHRcdH1cblx0XHRyZXR1cm4gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSA/PyBwcm9wZXJ0eS5uYW1lO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMocHJvcGVydHkpKSB7XG5cdFx0aWYgKCEhaXNHcm91cCAmJiBwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwsIFtdLCBwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8ubmFtZSlcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpID8/XG5cdFx0XHRjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gcHJvcGVydHkuTGFiZWw/LnRvU3RyaW5nKCk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24gKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFzb3VyY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkgfHwgc291cmNlLmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mbykge1xuXHRcdHJldHVybiBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc291cmNlLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gc291cmNlLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQ7XG5cdFx0cmV0dXJuIGRhdGFwb2ludFRhcmdldD8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShjb2xOYW1lOiBzdHJpbmcsIGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXA/OiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRjb2xOYW1lLFxuXHRcdFx0aXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdF0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZC5cbiAqL1xuY29uc3QgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHRhYmxlVHlwZT86IFRhYmxlVHlwZSxcblx0dGFibGVDcmVhdGlvbk1vZGU/OiBDcmVhdGlvbk1vZGUsXG5cdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz86IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCByZWxhdGVkQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXTtcblx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0T2JqZWN0LmtleXMoY29sdW1uc1RvQmVDcmVhdGVkKS5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0sXG5cdFx0XHRhbm5vdGF0aW9uUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChuYW1lKSxcblx0XHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIHJlbGF0ZWQgY29sdW1uIGFscmVhZHkgZXhpc3RzLlxuXHRcdFx0cmVsYXRlZENvbHVtbiA9IGV4aXN0aW5nQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuYW1lKTtcblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5T2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgbmFtZSk7XG5cdFx0aWYgKGlzTXVsdGlWYWx1ZUZpZWxkKHByb3BlcnR5T2JqZWN0UGF0aCkpIHtcblx0XHRcdGNvbnN0IG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHByb3BlcnR5T2JqZWN0UGF0aCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoXG5cdFx0XHQpO1xuXHRcdFx0Y29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zLCBuYW1lLCBjb2x1bW4pO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGggPz8gbmFtZTtcblx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2FzZSAxOiBLZXkgY29udGFpbnMgRGF0YUZpZWxkIHByZWZpeCB0byBlbnN1cmUgYWxsIHByb3BlcnR5IGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBrZXkgZm9ybWF0LlxuXHRcdFx0Ly8gTmV3IGNyZWF0ZWQgcHJvcGVydHkgY29sdW1uIGlzIHNldCB0byBoaWRkZW4uXG5cdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHQpO1xuXHRcdFx0Y29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zLCBuYW1lLCBjb2x1bW4pO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRlZENvbHVtbi5hbm5vdGF0aW9uUGF0aCAhPT0gYW5ub3RhdGlvblBhdGggfHwgcmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHQvLyBDYXNlIDI6IFRoZSBleGlzdGluZyBjb2x1bW4gcG9pbnRzIHRvIGEgTGluZUl0ZW0gKG9yKVxuXHRcdFx0Ly8gQ2FzZSAzOiBUaGlzIGlzIGEgc2VsZiByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBjb2x1bW5cblx0XHRcdGNvbnN0IG5ld05hbWUgPSBgUHJvcGVydHk6OiR7bmFtZX1gO1xuXHRcdFx0Ly8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLlxuXHRcdFx0aWYgKCFleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkpIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IHByb3BlcnR5IGNvbHVtbiB3aXRoICdQcm9wZXJ0eTo6JyBwcmVmaXgsXG5cdFx0XHRcdC8vIFNldCBpdCB0byBoaWRkZW4gYXMgaXQgaXMgb25seSBjb25zdW1lZCBieSBDb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zLCBuYW1lLCBjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0ZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpICYmXG5cdFx0XHRcdGV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhuYW1lKSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHQvLyBUaGUgcHJvcGVydHkgJ25hbWUnIGhhcyBiZWVuIHByZWZpeGVkIHdpdGggJ1Byb3BlcnR5OjonIGZvciB1bmlxdWVuZXNzLlxuXHQvLyBVcGRhdGUgdGhlIHNhbWUgaW4gb3RoZXIgcHJvcGVydHlJbmZvc1tdIHJlZmVyZW5jZXMgd2hpY2ggcG9pbnQgdG8gdGhpcyBwcm9wZXJ0eS5cblx0ZXhpc3RpbmdDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuXHRcdGNvbHVtbi5wcm9wZXJ0eUluZm9zID0gY29sdW1uLnByb3BlcnR5SW5mb3M/Lm1hcCgocHJvcGVydHlJbmZvKSA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvKTtcblx0XHRjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3M/Lm1hcChcblx0XHRcdChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm9cblx0XHQpO1xuXHR9KTtcblx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXR0aW5nIHRoZSBDb2x1bW4gTmFtZVxuICogSWYgaXQgcG9pbnRzIHRvIGEgRGF0YUZpZWxkIHdpdGggb25lIHByb3BlcnR5IG9yIERhdGFQb2ludCB3aXRoIG9uZSBwcm9wZXJ0eSwgaXQgd2lsbCB1c2UgdGhlIHByb3BlcnR5IG5hbWVcbiAqIGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBleGlzdGluZyBmbGV4IGNoYW5nZXMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIGFubm90YXRpb24gY29sdW1uc1xuICovXG5jb25zdCBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUgPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0Ly8gVGhpcyBpcyBuZWVkZWQgYXMgd2UgaGF2ZSBmbGV4aWJpbGl0eSBjaGFuZ2VzIGFscmVhZHkgdGhhdCB3ZSBoYXZlIHRvIGNoZWNrIGFnYWluc3Rcblx0aWYgKGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBkYXRhRmllbGQuVmFsdWU/LnBhdGgpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICogQHBhcmFtIGZpZWxkR3JvdXBOYW1lIFRoZSBgRGF0YUZpZWxkYCBuYW1lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIGBzaG93RGF0YUZpZWxkc0xhYmVsYCB2YWx1ZSBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCA9IGZ1bmN0aW9uIChcblx0ZmllbGRHcm91cE5hbWU6IHN0cmluZyxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgY29sdW1ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpPy5jb2x1bW5zO1xuXHRjb25zdCBjb2x1bW5LZXlzID0gY29sdW1ucyAmJiBPYmplY3Qua2V5cyhjb2x1bW5zKTtcblx0cmV0dXJuIChcblx0XHRjb2x1bW5LZXlzICYmXG5cdFx0ISFjb2x1bW5LZXlzLmZpbmQoZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4ga2V5ID09PSBmaWVsZEdyb3VwTmFtZSAmJiAoY29sdW1uc1trZXldIGFzIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlKS5zaG93RGF0YUZpZWxkc0xhYmVsO1xuXHRcdH0pXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHByb3BlcnR5IHdpdGggcmVzcGVjdCB0byB0aGUgcm9vdCBlbnRpdHkuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBgRGF0YUZpZWxkYCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aFxuICovXG5jb25zdCBfZ2V0UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IHN0cmluZyB7XG5cdGxldCByZWxhdGl2ZVBhdGggPSBcIlwiO1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGQpPy5WYWx1ZT8ucGF0aDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IGRhdGFGaWVsZD8uVGFyZ2V0Py52YWx1ZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uR3JvdXA6XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRicmVhaztcblx0fVxuXHRyZXR1cm4gcmVsYXRpdmVQYXRoO1xufTtcblxuY29uc3QgX3NsaWNlQXRTbGFzaCA9IGZ1bmN0aW9uIChwYXRoOiBzdHJpbmcsIGlzTGFzdFNsYXNoOiBib29sZWFuLCBpc0xhc3RQYXJ0OiBib29sZWFuKTogc3RyaW5nIHtcblx0Y29uc3QgaVNsYXNoSW5kZXggPSBpc0xhc3RTbGFzaCA/IHBhdGgubGFzdEluZGV4T2YoXCIvXCIpIDogcGF0aC5pbmRleE9mKFwiL1wiKTtcblx0aWYgKGlTbGFzaEluZGV4ID09PSAtMSkge1xuXHRcdHJldHVybiBwYXRoO1xuXHR9XG5cdHJldHVybiBpc0xhc3RQYXJ0ID8gcGF0aC5zdWJzdHJpbmcoaVNsYXNoSW5kZXggKyAxLCBwYXRoLmxlbmd0aCkgOiBwYXRoLnN1YnN0cmluZygwLCBpU2xhc2hJbmRleCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGNvbHVtbiBjb250YWlucyBhIG11bHRpLXZhbHVlIGZpZWxkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgRGF0YUZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBEYXRhRmllbGQgY29ycmVzcG9uZHMgdG8gYSBtdWx0aS12YWx1ZSBmaWVsZC5cbiAqL1xuY29uc3QgX2lzQ29sdW1uTXVsdGlWYWx1ZWQgPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBib29sZWFuIHtcblx0aWYgKGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuVmFsdWUpKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0ZGF0YUZpZWxkLlZhbHVlLnBhdGhcblx0XHQpO1xuXHRcdHJldHVybiBpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBhIGNvbHVtbiBpcyBzb3J0YWJsZS5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGRhdGEgZmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gbm9uU29ydGFibGVDb2x1bW5zIENvbGxlY3Rpb24gb2Ygbm9uLXNvcnRhYmxlIGNvbHVtbiBuYW1lcyBhcyBwZXIgYW5ub3RhdGlvblxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb2x1bW4gaXMgc29ydGFibGVcbiAqL1xuY29uc3QgX2lzQ29sdW1uU29ydGFibGUgPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10sXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mb1xuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0IW5vblNvcnRhYmxlQ29sdW1ucy5pbmNsdWRlcyhwcm9wZXJ0eVBhdGgpICYmIC8vIENvbHVtbiBpcyBub3QgbWFya2VkIGFzIG5vbi1zb3J0YWJsZSB2aWEgYW5ub3RhdGlvblxuXHRcdCgoKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkIHx8IGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikgJiZcblx0XHRcdE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKS5zb21lKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBpc0hpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3Byb3BOYW1lXS5hbm5vdGF0aW9uUHJvcGVydHkpO1xuXHRcdFx0XHRyZXR1cm4gIWlzSGlkZGVuICYmICFub25Tb3J0YWJsZUNvbHVtbnMuaW5jbHVkZXMocHJvcE5hbWUpO1xuXHRcdFx0fSkpIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwgfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbiB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uKVxuXHQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFJldHVybnMgJ2ZhbHNlJyBpZiBGaWx0ZXJGdW5jdGlvbnMgYW5ub3RhdGlvbiBzdXBwb3J0cyAndG9sb3dlcicsIGVsc2UgJ3RydWUnXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpbHRlckZ1bmN0aW9uczogRmlsdGVyRnVuY3Rpb25zIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZ1bmN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSh1bmRlZmluZWQsIGZpbHRlckZ1bmN0aW9ucyk7XG59O1xuXG5mdW5jdGlvbiBfZ2V0RmlsdGVyRnVuY3Rpb25zKENvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGVudGl0eVNldCA9IENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGlmIChUeXBlR3VhcmRzLmlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0ZW50aXR5U2V0LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zID8/XG5cdFx0XHRDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eUNvbnRhaW5lcigpLmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyBmb3IgdGV4dCBmaWVsZHMgaW4gYSB0YWJsZS5cbiAqIEBwYXJhbSBmb3JtYXRPcHRpb25zXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoZm9ybWF0T3B0aW9uczogRm9ybWF0T3B0aW9uc1R5cGUgfCB1bmRlZmluZWQpOiBGb3JtYXRPcHRpb25zVHlwZSB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBmb3JtYXRPcHRpb25zID09PSB1bmRlZmluZWRcblx0XHQ/IHVuZGVmaW5lZFxuXHRcdDoge1xuXHRcdFx0XHR0ZXh0TGluZXNFZGl0OiA0LFxuXHRcdFx0XHQuLi5mb3JtYXRPcHRpb25zXG5cdFx0ICB9O1xufVxuXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5czogU2VtYW50aWNLZXksIG5hbWU6IHN0cmluZyk6IHsgdmFsdWVzOiBzdHJpbmdbXTsgc2VtYW50aWNLZXlGb3VuZDogYm9vbGVhbiB9IHtcblx0Y29uc3QgYVNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgYlNlbWFudGljS2V5Rm91bmQgPSBmYWxzZTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleXMubGVuZ3RoOyBpKyspIHtcblx0XHRhU2VtYW50aWNLZXlWYWx1ZXMucHVzaChzZW1hbnRpY0tleXNbaV0udmFsdWUpO1xuXHRcdGlmIChzZW1hbnRpY0tleXNbaV0udmFsdWUgPT09IG5hbWUpIHtcblx0XHRcdGJTZW1hbnRpY0tleUZvdW5kID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHR2YWx1ZXM6IGFTZW1hbnRpY0tleVZhbHVlcyxcblx0XHRzZW1hbnRpY0tleUZvdW5kOiBiU2VtYW50aWNLZXlGb3VuZFxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZmluZFByb3BlcnRpZXMoXG5cdHNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXSxcblx0ZmllbGRHcm91cFByb3BlcnRpZXM6IHN0cmluZ1tdXG4pOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSB7XG5cdGxldCBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gZmFsc2U7XG5cdGxldCBzUHJvcGVydHlQYXRoO1xuXHRpZiAoc2VtYW50aWNLZXlWYWx1ZXMgJiYgc2VtYW50aWNLZXlWYWx1ZXMubGVuZ3RoID49IDEgJiYgZmllbGRHcm91cFByb3BlcnRpZXMgJiYgZmllbGRHcm91cFByb3BlcnRpZXMubGVuZ3RoID49IDEpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoW3NlbWFudGljS2V5VmFsdWVzW2ldXS5zb21lKCh0bXApID0+IGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmluY2x1ZGVzKHRtcCkpKSB7XG5cdFx0XHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAgPSB0cnVlO1xuXHRcdFx0XHRzUHJvcGVydHlQYXRoID0gc2VtYW50aWNLZXlWYWx1ZXNbaV07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogc1Byb3BlcnR5UGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IHByb3BlcnR5IGluIHRoZSBmaWVsZEdyb3VwIHRoYXQgaXMgcGFydCBvZiB0aGUgc2VtYW50aWMga2V5cy5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cFxuICogQHBhcmFtIHNlbWFudGljS2V5VmFsdWVzXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyBhIGZsYWcgdHJ1ZSBpZiBhIHByb3BlcnR5IGlzIGZvdW5kIGFuZCBhIHByb3BlcnR5UGF0aC5cbiAqL1xuZnVuY3Rpb24gX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cChcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsLFxuXHRzZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW11cbik6IHsgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogYm9vbGVhbjsgcHJvcGVydHlQYXRoPzogc3RyaW5nIH0ge1xuXHQvLyB0aGlzIGluZm8gaXMgdXNlZCBpbiBGaWVsZEhlbHBlciNpc0RyYWZ0SW5kaWNhdG9yVmlzaWJsZUluRmllbGRHcm91cCB0byBzaG93IGEgZHJhZnQgaW5kaWNhdG9yIGF0IHRoZSBlbmQgb2YgYSBmaWVsZCBncm91cFxuXHRjb25zdCBhUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0bGV0IF9wcm9wZXJ0aWVzRm91bmQ6IHsgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogYm9vbGVhbjsgZmllbGRHcm91cFByb3BlcnR5UGF0aD86IHN0cmluZyB9ID0ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGZhbHNlLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHVuZGVmaW5lZFxuXHR9O1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAgJiZcblx0XHRkYXRhRmllbGRHcm91cC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdCkge1xuXHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldC4kdGFyZ2V0LkRhdGE/LmZvckVhY2goKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChpbm5lckRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkIHx8IGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsKSAmJlxuXHRcdFx0XHRpbm5lckRhdGFGaWVsZC5WYWx1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGFQcm9wZXJ0aWVzLnB1c2goaW5uZXJEYXRhRmllbGQuVmFsdWUucGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRfcHJvcGVydGllc0ZvdW5kID0gX2ZpbmRQcm9wZXJ0aWVzKHNlbWFudGljS2V5VmFsdWVzLCBhUHJvcGVydGllcyk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBfcHJvcGVydGllc0ZvdW5kLnNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAsXG5cdFx0cHJvcGVydHlQYXRoOiBfcHJvcGVydGllc0ZvdW5kLmZpZWxkR3JvdXBQcm9wZXJ0eVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgd2l0aCBkcmFmdEluZGljYXRvciBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHNlbWFudGljS2V5c1xuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNlbWFudGljS2V5czogU2VtYW50aWNLZXksXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgbnVsbFxuKTogUGFydGlhbDx7XG5cdGZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHRmaWVsZEdyb3VwTmFtZTogc3RyaW5nO1xuXHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRoYXNEcmFmdEluZGljYXRvcjogYm9vbGVhbjtcbn0+IHtcblx0aWYgKCFzZW1hbnRpY0tleXMpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXkgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5cywgbmFtZSk7XG5cdGNvbnN0IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cChkYXRhRmllbGRHcm91cCwgc2VtYW50aWNLZXkudmFsdWVzKTtcblx0aWYgKHNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXApIHtcblx0XHQvLyBTZW1hbnRpYyBLZXkgaGFzIGEgcHJvcGVydHkgaW4gYSBGaWVsZEdyb3VwXG5cdFx0cmV0dXJuIHtcblx0XHRcdC8vVE9ETyB3ZSBzaG91bGQgcmF0aGVyIHN0b3JlIGhhc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwXG5cdFx0XHRmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGg6IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpZWxkR3JvdXBOYW1lOiBuYW1lLFxuXHRcdFx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KG5hbWUsIHRydWUpKVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoc2VtYW50aWNLZXkuc2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNob3dFcnJvck9iamVjdFN0YXR1czogY29tcGlsZUV4cHJlc3Npb24oZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShuYW1lLCBmYWxzZSkpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIF9nZXRJbXBOdW1iZXIoZGF0YUZpZWxkOiBEYXRhRmllbGRUeXBlcyk6IG51bWJlciB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9IaWdoXCIpKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL01lZGl1bVwiKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9Mb3dcIikpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXHRyZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkOiBEYXRhRmllbGRUeXBlcyk6IEltcG9ydGFuY2Uge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXHRyZXR1cm4gaW1wb3J0YW5jZSA/IChpbXBvcnRhbmNlLnNwbGl0KFwiL1wiKVsxXSBhcyBJbXBvcnRhbmNlKSA6IEltcG9ydGFuY2UuTm9uZTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgYSBjb2x1bW4gY29udGFpbmluZyBkYXRhcG9pbnRzLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIGEgZ2l2ZW4gY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdG8gYmUgdXBkYXRlZFxuICovXG5mdW5jdGlvbiBfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQocHJvcGVydHk6IFByb3BlcnR5LCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHRjb25zdCB0YXJnZXRWYWx1ZWZyb21EUCA9IGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQocHJvcGVydHkpO1xuXHRpZiAoXG5cdFx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHR0eXBlb2YgdGFyZ2V0VmFsdWVmcm9tRFAgPT09IFwic3RyaW5nXCIgJiZcblx0XHRjb2x1bW4uZXhwb3J0U2V0dGluZ3MgJiZcblx0XHRjb2x1bW4uZXhwb3J0U2V0dGluZ3M/LnVuaXQgIT09IFwiJVwiXG5cdCkge1xuXHRcdGNvbHVtbi5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHRhcmdldFZhbHVlZnJvbURQO1xuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncy50ZW1wbGF0ZSA9IFwiezB9L1wiICsgdGFyZ2V0VmFsdWVmcm9tRFA7XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldE1heEltcG9ydGFuY2UoZmllbGRzOiBEYXRhRmllbGRUeXBlc1tdKTogSW1wb3J0YW5jZSB7XG5cdGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRsZXQgbWF4SW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IGltcE51bWJlciA9IC0xO1xuXHRcdGxldCBEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZTtcblx0XHRmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuXHRcdFx0aW1wTnVtYmVyID0gX2dldEltcE51bWJlcihmaWVsZCk7XG5cdFx0XHRpZiAoaW1wTnVtYmVyID4gbWF4SW1wTnVtYmVyKSB7XG5cdFx0XHRcdG1heEltcE51bWJlciA9IGltcE51bWJlcjtcblx0XHRcdFx0RGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgPSBmaWVsZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlIGFzIERhdGFGaWVsZFR5cGVzKTtcblx0fVxuXHRyZXR1cm4gSW1wb3J0YW5jZS5Ob25lO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGltcG9ydGFuY2UgdmFsdWUgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBkYXRhRmllbGRcbiAqIEByZXR1cm5zIFRoZSBpbXBvcnRhbmNlIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBvcnRhbmNlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZFxuKTogSW1wb3J0YW5jZSB8IHVuZGVmaW5lZCB7XG5cdGlmICghZGF0YUZpZWxkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleXMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU2VtYW50aWNLZXkgPz8gW107XG5cdGNvbnN0IHJlcXVpcmVkUHJvcGVydGllcyA9IGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgaGlnaEtleXMgPSBbLi4uc2VtYW50aWNLZXlzLCAuLi5yZXF1aXJlZFByb3BlcnRpZXNdLm1hcCgocHJvcGVydHlQYXRoKSA9PiBwcm9wZXJ0eVBhdGguJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0Ly9FdmFsdWF0ZSBkZWZhdWx0IEltcG9ydGFuY2UgaXMgbm90IHNldCBleHBsaWNpdGx5XG5cdGxldCBmaWVsZHNXaXRoSW1wb3J0YW5jZTtcblx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhRmllbGRGb3JBbm5vdGF0aW9uPihkYXRhRmllbGQsIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSkpIHtcblx0XHRcdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gZGF0YUZpZWxkVGFyZ2V0LkRhdGE7XG5cdFx0XHQvL0lmIGEgRmllbGRHcm91cCBjb250YWlucyBhIHNlbWFudGljS2V5IG9yIHJlcXVpcmVkIHByb3BlcnR5LCBpbXBvcnRhbmNlIHNldCB0byBIaWdoXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZpZWxkR3JvdXBEYXRhLnNvbWUoZnVuY3Rpb24gKGZpZWxkR3JvdXBEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhmaWVsZEdyb3VwRGF0YUZpZWxkKSAmJiBoaWdoS2V5cy5pbmNsdWRlcyhmaWVsZEdyb3VwRGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gSW1wb3J0YW5jZS5IaWdoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9JZiB0aGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgYW4gSW1wb3J0YW5jZSB3ZSB0YWtlIGl0XG5cdFx0XHRcdGlmIChkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSkge1xuXHRcdFx0XHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZWxzZSB0aGUgaGlnaGVzdCBpbXBvcnRhbmNlIChpZiBhbnkpIGlzIHJldHVybmVkXG5cdFx0XHRcdGZpZWxkc1dpdGhJbXBvcnRhbmNlID0gZmllbGRHcm91cERhdGEuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHNXaXRoSW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlc1tdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGhpZ2hLZXlzLmluY2x1ZGVzKChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0PyBJbXBvcnRhbmNlLkhpZ2hcblx0XHQ6IF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGxpbmUgaXRlbXMgZnJvbSBtZXRhZGF0YSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB3aXRoIHRoZWlyIGFubm90YXRpb25zXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGggVGhlIHZpc3VhbGl6YXRpb24gcGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zID0gZnVuY3Rpb24gKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGU6IEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4gPSB7fSxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCksXG5cdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCksXG5cdFx0ZGVmYXVsdENyZWF0aW9uTW9kZSA9XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uKCk/Lm1hY3Jvcz8udGFibGU/LmRlZmF1bHRDcmVhdGlvbk1vZGUgPT09XG5cdFx0XHRcIklubGluZUNyZWF0aW9uUm93c1wiXG5cdFx0XHRcdD8gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93c1xuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlID1cblx0XHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8uY3JlYXRpb25Nb2RlPy5uYW1lID8/IGRlZmF1bHRDcmVhdGlvbk1vZGUgPz8gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljS2V5LCBbXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKClcblx0XSlbMF0gYXMgU2VtYW50aWNLZXk7XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRjb25zdCB0YWJsZUNvbnZlcnRlckNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3I8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihcblx0XHRcdGdldFRhcmdldE9iamVjdFBhdGgoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpXG5cdFx0KTtcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0XHQvLyBUT0RPOiB2YXJpYWJsZSBuYW1lIHNob3VsZCBiZSBkYXRhZmllbGQgYW5kIG5vdCBsaW5lSXRlbVxuXHRcdFx0aWYgKCFfaXNWYWxpZENvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBleHBvcnRTZXR0aW5nczogUHJvcGVydHlJbmZvW1wiZXhwb3J0U2V0dGluZ3NcIl0gPSBudWxsO1xuXHRcdFx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9XG5cdFx0XHRcdGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBkYXRhRmllbGQuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHRcdD8gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IF9nZXRSZWxhdGl2ZVBhdGgoZGF0YUZpZWxkKTtcblx0XHRcdC8vIERldGVybWluZSBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBjb25zdW1lZCBieSB0aGlzIExpbmVJdGVtLlxuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZVR5cGUpO1xuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcmVsYXRpdmVQYXRoID8gX3NsaWNlQXRTbGFzaChyZWxhdGl2ZVBhdGgsIHRydWUsIGZhbHNlKSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGlzR3JvdXA6IGJvb2xlYW4gPSBncm91cFBhdGggIT0gcmVsYXRpdmVQYXRoO1xuXHRcdFx0Y29uc3QgbGFiZWwgPSBnZXRMYWJlbChkYXRhRmllbGQsIGlzR3JvdXApO1xuXHRcdFx0Y29uc3QgbmFtZSA9IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZShkYXRhRmllbGQpO1xuXHRcdFx0Y29uc3QgaXNGaWVsZEdyb3VwQ29sdW1uOiBib29sZWFuID0gZ3JvdXBQYXRoID8gZ3JvdXBQYXRoLmluY2x1ZGVzKGBAJHtVSUFubm90YXRpb25UZXJtcy5GaWVsZEdyb3VwfWApIDogZmFsc2U7XG5cdFx0XHRjb25zdCBzaG93RGF0YUZpZWxkc0xhYmVsOiBib29sZWFuIHwgdW5kZWZpbmVkID0gaXNGaWVsZEdyb3VwQ29sdW1uXG5cdFx0XHRcdD8gX2dldFNob3dEYXRhRmllbGRzTGFiZWwobmFtZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdDogZmFsc2U7XG5cdFx0XHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUoZGF0YUZpZWxkKTtcblx0XHRcdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZSwgc2VtYW50aWNLZXlzLCBkYXRhRmllbGQpKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+KFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdFx0cmVsYXRpdmVQYXRoXG5cdFx0XHQpO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHdlIG5lZWQgYSBzaXR1YXRpb25zIGluZGljYXRvclxuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXM7XG5cdFx0XHRjb25zdCBzaXR1YXRpb25zTmF2UHJvcHMgPSBuYXZpZ2F0aW9uUHJvcGVydGllcy5maWx0ZXIoXG5cdFx0XHRcdChuYXZpZ2F0aW9uUHJvcGVydHkpID0+XG5cdFx0XHRcdFx0IW5hdmlnYXRpb25Qcm9wZXJ0eS5pc0NvbGxlY3Rpb24gJiZcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNBUE9iamVjdE5vZGVUeXBlPy5OYW1lID09PSBcIkJ1c2luZXNzU2l0dWF0aW9uXCJcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBzaXR1YXRpb25zTmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkID0gc2l0dWF0aW9uc05hdlByb3BzLmxlbmd0aCA+PSAxID8gc2l0dWF0aW9uc05hdlByb3BzWzBdIDogdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNpdHVhdGlvbnNOYXZQcm9wICYmIGZvcm1hdE9wdGlvbnMpIHtcblx0XHRcdFx0Zm9ybWF0T3B0aW9ucy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0XHRcdCkge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgPSBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zKGRhdGFGaWVsZCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc011bHRpVmFsdWUgPSBfaXNDb2x1bW5NdWx0aVZhbHVlZChkYXRhRmllbGQsIHRhYmxlQ29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoIWlzTXVsdGlWYWx1ZSAmJiBfaXNFeHBvcnRhYmxlQ29sdW1uKGRhdGFGaWVsZCkpIHtcblx0XHRcdFx0Ly9leGNsdWRlIHRoZSB0eXBlcyBsaXN0ZWQgYWJvdmUgZm9yIHRoZSBFeHBvcnQgKGdlbmVyYXRlcyBlcnJvciBvbiBFeHBvcnQgYXMgUERGKVxuXHRcdFx0XHRleHBvcnRTZXR0aW5ncyA9IGNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzKGRhdGFGaWVsZCwgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0XHRcdH1cblx0XHRcdGxldCBwcm9wZXJ0eVR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChkYXRhVHlwZSkge1xuXHRcdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKGRhdGFGaWVsZCwgZGF0YVR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHRcdFx0XHRjbGFzc05hbWU6IGRhdGFUeXBlIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IHtcblx0XHRcdFx0XHQuLi5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRcdC4uLnByb3BlcnR5VHlwZUNvbmZpZz8uZm9ybWF0T3B0aW9uc1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnPy5jb25zdHJhaW50c1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHZpc3VhbFNldHRpbmdzOiBWaXN1YWxTZXR0aW5ncyA9IHt9O1xuXHRcdFx0aWYgKCFkYXRhVHlwZSB8fCAhdHlwZUNvbmZpZykge1xuXHRcdFx0XHQvLyBmb3IgY2hhcnRzXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzLndpZHRoQ2FsY3VsYXRpb24gPSBudWxsO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc29ydGFibGUgPVxuXHRcdFx0XHQhaXNNdWx0aVZhbHVlICYmXG5cdFx0XHRcdF9pc0NvbHVtblNvcnRhYmxlKGRhdGFGaWVsZCwgcmVsYXRpdmVQYXRoLCByZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHRcdFx0Y29uc3QgYXZhaWxhYmlsaXR5ID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKSA/IFwiSGlkZGVuXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGNvbnN0IGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uID0ge1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRsYWJlbDogbGFiZWwgPz8gbmFtZSxcblx0XHRcdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKGRhdGFGaWVsZCkgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGdyb3VwOiBpc0dyb3VwID8gZ3JvdXBQYXRoIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IGF2YWlsYWJpbGl0eSxcblx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0c2hvd0RhdGFGaWVsZHNMYWJlbDogc2hvd0RhdGFGaWVsZHNMYWJlbCxcblx0XHRcdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzLCB0YWJsZUNyZWF0aW9uTW9kZSksXG5cdFx0XHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0XHRcdHByb3BlcnR5SW5mb3M6IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA/IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvczogYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdHdpZHRoOiAoZGF0YUZpZWxkLmFubm90YXRpb25zPy5IVE1MNT8uQ3NzRGVmYXVsdHM/LndpZHRoPy52YWx1ZU9mKCkgYXMgc3RyaW5nKSB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGltcG9ydGFuY2U6IGdldEltcG9ydGFuY2UoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdFx0dHlwZUNvbmZpZzogdHlwZUNvbmZpZyxcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3M6IHZpc3VhbFNldHRpbmdzIGFzIFByb3BlcnR5SW5mb1tcInZpc3VhbFNldHRpbmdzXCJdLFxuXHRcdFx0XHR0aW1lem9uZVRleHQ6IGV4cG9ydFNldHRpbmdzPy50aW1lem9uZSxcblx0XHRcdFx0aXNQYXJ0T2ZMaW5lSXRlbTogdHJ1ZSxcblx0XHRcdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IChcIkVkbS5TdHJpbmdcIiBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlKSxcblx0XHRcdFx0aXNNdWx0aVZhbHVlXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgdG9vbHRpcCA9IF9nZXRUb29sdGlwKGRhdGFGaWVsZCkgPz8gbGFiZWw7XG5cdFx0XHRpZiAodG9vbHRpcCkge1xuXHRcdFx0XHRjb2x1bW4udG9vbHRpcCA9IHRvb2x0aXA7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0XHRcdGNvbHVtbi5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZTtcblx0XHRcdH1cblx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChyZWxhdGVkUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtyZWxhdGVkUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIG11bHRpLXZhbHVlLCByZWxhdGVkIHByb3BlcnRpZXMgY2Fubm90IGJlIHNvcnRlZCBhcyB3ZSBnbyB0aHJvdWdoIGEgMS1uIHJlbGF0aW9uXG5cdFx0XHRcdGlmIChpc011bHRpVmFsdWUpIHtcblx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocmVsYXRlZFByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8sXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBsaW5lSXRlbSBwb2ludHMgdG8gYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpdGggYSB0ZXh0QXJyYW5nZW1lbnQgVGV4dE9ubHksIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBjb2x1bW4gd2l0aCB0aGUgdmFsdWUgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cblx0XHRcdFx0Ly8gVGhlIHRleHQgcHJvcGVydHkgaXMgcmVmZXJlbmNlZCBvbiB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIG9mIHRoZSBsaW5lSXRlbSwgc28gd2lsbCBiZSBjcmVhdGVkIG9uIHRoZSBfY3JlYXRlUmVsYXRlZENvbHVtbnMgbWV0aG9kLlxuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRcdGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdFx0XHRcdFx0cmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbYWRkaXRpb25hbFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbYWRkaXRpb25hbFByb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0cmV0dXJuIGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlVHlwZSxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0gcHJvcGVydGllc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IF9nZXRQcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0bGV0IG1hdGNoZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0aWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllcykpIHtcblx0XHRtYXRjaGVkUHJvcGVydGllcyA9IHByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcHJvcGVydHlQYXRoICYmIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5uYW1lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoXG5cdFx0XHRcdFx0eyBbcHJvcGVydHlQYXRoXTogZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpIH0sXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHt9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2gocmVsYXRlZENvbHVtbnNbMF0pO1xuXHRcdFx0XHRyZXR1cm4gcmVsYXRlZENvbHVtbnNbMF0ubmFtZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gbWF0Y2hlZFByb3BlcnRpZXM7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGZpZWxkIGdyb3VwIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZmllbGRHcm91cCBUaGUgZmllbGRHcm91cCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmllbGRHcm91cCBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZEZpZWxkR3JvdXAgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZmllbGRHcm91cDogRmllbGRHcm91cCxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gZmllbGRHcm91cC5EYXRhO1xuXHRyZXR1cm4gZmllbGRHcm91cERhdGEuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuXHRcdC8vIHdlIGV4Y2x1ZGUgYm9vbGVhbiB0eXBlLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgdW5kZXJseWluZyBjaGVjayBib3ggZW1wdHkgb24gcHVycG9zZVxuXHRcdGlmIChpc0RhdGFGaWVsZChpdGVtKSAmJiBpdGVtPy5WYWx1ZT8uJHRhcmdldC50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGlzU3RhdGljYWxseU1hbmRhdG9yeShpdGVtKSB8fFxuXHRcdFx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkoaXRlbS5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBwcm9wZXJ0eSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uLlRhcmdldC4kdGFyZ2V0O1xuXHRjb25zdCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uRmllbGRDb250cm9sTm90TWFuZGF0b3J5ID0gaGFzRmllbGRDb250cm9sTm90TWFuZGF0b3J5KGRhdGFGaWVsZEZvckFubm90YXRpb24pO1xuXHQvLyBDaGVjayBpZiB0aGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludHMgdG8gYSBGaWVsZEdyb3VwXG5cdGlmIChoYXNGaWVsZEdyb3VwVGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0aWYgKGlzUmVxdWlyZWRGaWVsZEdyb3VwKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZFRhcmdldCBhcyBGaWVsZEdyb3VwLCB0YWJsZUNyZWF0aW9uTW9kZSkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IChkYXRhRmllbGRUYXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YTtcblx0XHRyZXR1cm4gZmllbGRHcm91cERhdGEuc29tZSgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdHJldHVybiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIGlubmVyRGF0YUZpZWxkLCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdFx0fSk7XG5cdH1cblx0LypJZiB0aGUgdW5kZXJseWluZyBkYXRhcG9pbnQgaXMgYSByYXRpbmcgaW5kaWNhdG9yLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgcmF0aW5nIGVtcHR5ICh2YWx1ZSAwKSBvbiBwdXJwb3NlLlxuXHRCZXNpZGVzLCBjdXJyZW50bHksIG9ubHkgYSBmaWVsZENvbnRyb2wgc2V0IG9uIGEgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIGRhdGFQb2ludCBoYXMgYW4gaW5mbHVlbmNlIGluIHRoZSB0YWJsZS5cblx0QWNjb3JkaW5nbHksIGlmIGEgZGF0YXBvaW50IGNvbWVzIGZyb20gYSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIHdpdGggYSBmaWVsZENvbnRyb2wgc2V0IGFzIG5vdCBtYW5kYXRvcnksIHRoaXMgZGF0YVBvaW50IG11c3Qgbm90IGJlIGZsYWdnZWQgYXMgXCJyZXF1aXJlZFwiKi9cblx0aWYgKGhhc0RhdGFQb2ludFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJiAoZGF0YUZpZWxkVGFyZ2V0IGFzIERhdGFQb2ludCkuVmlzdWFsaXphdGlvbiAhPT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9SYXRpbmdcIikge1xuXHRcdGlmIChEYXRhRmllbGRGb3JBbm5vdGF0aW9uRmllbGRDb250cm9sTm90TWFuZGF0b3J5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChpc1N0YXRpY2FsbHlNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNSZXF1aXJlZERhdGFQb2ludChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGRUYXJnZXQgYXMgRGF0YVBvaW50LCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9wZXJ0eSBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHByb3BlcnR5LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIiAmJlxuXHRcdCFpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHByb3BlcnR5KSB8fFxuXHRcdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YVBvaW50IGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGF0YVBvaW50IFRoZSBkYXRhUG9pbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFQb2ludCBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFQb2ludCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhUG9pbnQ6IERhdGFQb2ludCxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGRhdGFQb2ludCkgfHxcblx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShkYXRhUG9pbnQuVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSB1bmRlcmx5aW5nIGNvbHVtbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3JlcXVpcmVkJyBwcm9wZXJ0eSBvZiB0aGUgdGFibGUgY29sdW1uLlxuICovXG5jb25zdCBpc1JlcXVpcmVkQ29sdW1uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhcmdldDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5LFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBjcmVhdGlvbk1vZGUgPSB0YWJsZUNyZWF0aW9uTW9kZSB8fCBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkodGFyZ2V0KSkge1xuXHRcdHJldHVybiBpc1JlcXVpcmVkUHJvcGVydHkoY29udmVydGVyQ29udGV4dCwgdGFyZ2V0LCBjcmVhdGlvbk1vZGUpID8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0Ly8gQ2hlY2sgaWYgdGhlIGRhdGFGaWVsZCBpcyBvZiB0eXBlIERhdGFGaWVsZEZvckFubm90YXRpb25cblx0aWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbih0YXJnZXQpKSB7XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uKGNvbnZlcnRlckNvbnRleHQsIHRhcmdldCwgY3JlYXRpb25Nb2RlKSA/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpIDogdW5kZWZpbmVkO1xuXHR9XG5cdC8vSWYgdGhlIHVuZGVybHlpbmcgcHJvcGVydHkgaXMgYSBib29sZWFuLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgY2hlY2sgYm94IGVtcHR5IG9uIHB1cnBvc2Vcblx0aWYgKGlzRGF0YUZpZWxkKHRhcmdldCkgJiYgdGFyZ2V0LlZhbHVlPy4kdGFyZ2V0Py50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIpIHtcblx0XHRyZXR1cm4gaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHRhcmdldCkgfHxcblx0XHRcdChjcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KHRhcmdldC5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0ZXhwb3J0UHJvcGVydGllczogc3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChBcnJheS5pc0FycmF5KGV4cG9ydFByb3BlcnRpZXMpKSB7XG5cdFx0cHJvcGVydGllcyA9IGV4cG9ydFByb3BlcnRpZXM7XG5cdH1cblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdFx0Lm1hcCgocHJvcGVydHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzIS5pbmRleE9mKHByb3BlcnR5KX19YDtcblx0XHRcdH0pXG5cdFx0XHQuam9pbihgJHtcIlxcblwifWApO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGFibGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gbWFuaWZlc3QuXG4gKlxuICogVGhlc2UgbWF5IGJlIGN1c3RvbSBjb2x1bW5zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LCBzbG90IGNvbHVtbnMgY29taW5nIHRocm91Z2hcbiAqIGEgYnVpbGRpbmcgYmxvY2ssIG9yIGFubm90YXRpb24gY29sdW1ucyB0byBvdmVyd3JpdGUgYW5ub3RhdGlvbi1iYXNlZCBjb2x1bW5zLlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0ID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZT4sXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbHVtbj4ge1xuXHRjb25zdCBpbnRlcm5hbENvbHVtbnM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0Q29sdW1uPiA9IHt9O1xuXHRmdW5jdGlvbiBpc0NvbHVtbk92ZXJyaWRlKFxuXHRcdGNvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uIHwgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUsXG5cdFx0a2V5OiBzdHJpbmdcblx0KTogY29sdW1uIGlzIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlIHtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbnMuc29tZSgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5rZXkgPT09IGtleSk7XG5cdH1cblx0ZnVuY3Rpb24gaXNTbG90Q29sdW1uKG1hbmlmZXN0Q29sdW1uOiBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4pOiBtYW5pZmVzdENvbHVtbiBpcyBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uIHtcblx0XHRyZXR1cm4gbWFuaWZlc3RDb2x1bW4udHlwZSA9PT0gQ29sdW1uVHlwZS5TbG90O1xuXHR9XG5cdGZ1bmN0aW9uIGlzQ3VzdG9tQ29sdW1uKG1hbmlmZXN0Q29sdW1uOiBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4pOiBtYW5pZmVzdENvbHVtbiBpcyBNYW5pZmVzdERlZmluZWRDdXN0b21Db2x1bW4ge1xuXHRcdHJldHVybiBtYW5pZmVzdENvbHVtbi50eXBlID09PSB1bmRlZmluZWQgJiYgISFtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZTtcblx0fVxuXHRmdW5jdGlvbiBfdXBkYXRlTGlua2VkUHJvcGVydGllc09uQ3VzdG9tQ29sdW1ucyhwcm9wZXJ0eUluZm9zOiBzdHJpbmdbXSwgYW5ub3RhdGlvblRhYmxlQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10pOiB2b2lkIHtcblx0XHRjb25zdCByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCk7XG5cdFx0cHJvcGVydHlJbmZvcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0YW5ub3RhdGlvblRhYmxlQ29sdW1ucy5mb3JFYWNoKChwcm9wKSA9PiB7XG5cdFx0XHRcdGlmIChwcm9wLm5hbWUgPT09IHByb3BlcnR5KSB7XG5cdFx0XHRcdFx0cHJvcC5zb3J0YWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3BlcnR5LnJlcGxhY2UoXCJQcm9wZXJ0eTo6XCIsIFwiXCIpKTtcblx0XHRcdFx0XHRwcm9wLmlzR3JvdXBhYmxlID0gcHJvcC5zb3J0YWJsZTtcblx0XHRcdFx0XHRwcm9wLmZpbHRlcmFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3BlcnR5LnJlcGxhY2UoXCJQcm9wZXJ0eTo6XCIsIFwiXCIpKTtcblx0XHRcdFx0XHRwcm9wLmlzUGFydE9mQ3VzdG9tQ29sdW1uID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdEtleUhlbHBlci52YWxpZGF0ZUtleShrZXkpO1xuXHRcdC8vIEJhc2VUYWJsZUNvbHVtblxuXHRcdGNvbnN0IGJhc2VUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleToga2V5LFxuXHRcdFx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI6IG1hbmlmZXN0Q29sdW1uLndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyLFxuXHRcdFx0d2lkdGg6IG1hbmlmZXN0Q29sdW1uLndpZHRoIHx8IHVuZGVmaW5lZCxcblx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0cGxhY2VtZW50OiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gUGxhY2VtZW50LkFmdGVyIDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24ucGxhY2VtZW50XG5cdFx0XHR9LFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0fTtcblx0XHRpZiAoaXNDb2x1bW5PdmVycmlkZShtYW5pZmVzdENvbHVtbiwga2V5KSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjogQ3VzdG9tRWxlbWVudDxBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZT4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aW1wb3J0YW5jZTogbWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbixcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB1bmRlZmluZWQsXG5cdFx0XHRcdHNldHRpbmdzOiBtYW5pZmVzdENvbHVtbi5zZXR0aW5ncyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUobWFuaWZlc3RDb2x1bW4uZm9ybWF0T3B0aW9ucyksXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRrZXlcblx0XHRcdFx0KVxuXHRcdFx0fTtcblx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB0b29sdGlwVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi50b29sdGlwKSxcblx0XHRcdFx0aGVhZGVyVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi5oZWFkZXIpO1xuXG5cdFx0XHRjb25zdCBjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsID0gcHJvcGVydHlJbmZvc1xuXHRcdFx0XHQ/IGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKG1hbmlmZXN0Q29sdW1uPy5leHBvcnRTZXR0aW5ncywgYW5ub3RhdGlvbkNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUsIHByb3BlcnR5SW5mb3MpXG5cdFx0XHRcdDogbnVsbDtcblx0XHRcdGNvbnN0IGJhc2VNYW5pZmVzdENvbHVtbiA9IHtcblx0XHRcdFx0Li4uYmFzZVRhYmxlQ29sdW1uLFxuXHRcdFx0XHRoZWFkZXI6IGhlYWRlclRleHQsXG5cdFx0XHRcdGltcG9ydGFuY2U6IG1hbmlmZXN0Q29sdW1uPy5pbXBvcnRhbmNlIHx8IEltcG9ydGFuY2UuTm9uZSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduIHx8IEhvcml6b250YWxBbGlnbi5CZWdpbixcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5IHx8IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHR0ZW1wbGF0ZTogbWFuaWZlc3RDb2x1bW4udGVtcGxhdGUsXG5cdFx0XHRcdHByb3BlcnR5SW5mb3M6IHByb3BlcnR5SW5mb3MsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0aWQ6IGBDdXN0b21Db2x1bW46OiR7a2V5fWAsXG5cdFx0XHRcdG5hbWU6IGBDdXN0b21Db2x1bW46OiR7a2V5fWAsXG5cdFx0XHRcdC8vTmVlZGVkIGZvciBNREM6XG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IHsgdGV4dExpbmVzRWRpdDogNCB9LFxuXHRcdFx0XHRpc0dyb3VwYWJsZTogZmFsc2UsXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiBmYWxzZSxcblx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogeyB3aWR0aENhbGN1bGF0aW9uOiBudWxsIH0sXG5cdFx0XHRcdHRvb2x0aXA6IHRvb2x0aXBUZXh0ID8gdG9vbHRpcFRleHQgOiBoZWFkZXJUZXh0LFxuXHRcdFx0XHRwcm9wZXJ0aWVzOiBtYW5pZmVzdENvbHVtbi5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRyZXF1aXJlZDpcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbi5yZXF1aXJlZCAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHRcdFx0XHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvcykge1xuXHRcdFx0XHRfdXBkYXRlTGlua2VkUHJvcGVydGllc09uQ3VzdG9tQ29sdW1ucyhwcm9wZXJ0eUluZm9zLCBhbm5vdGF0aW9uQ29sdW1ucyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTbG90Q29sdW1uKG1hbmlmZXN0Q29sdW1uKSkge1xuXHRcdFx0XHRjb25zdCBjdXN0b21UYWJsZUNvbHVtbjogQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uPiA9IHtcblx0XHRcdFx0XHQuLi5iYXNlTWFuaWZlc3RDb2x1bW4sXG5cdFx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5TbG90XG5cdFx0XHRcdH07XG5cdFx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gY3VzdG9tVGFibGVDb2x1bW47XG5cdFx0XHR9IGVsc2UgaWYgKGlzQ3VzdG9tQ29sdW1uKG1hbmlmZXN0Q29sdW1uKSkge1xuXHRcdFx0XHRjb25zdCBjdXN0b21UYWJsZUNvbHVtbjogQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uPiA9IHtcblx0XHRcdFx0XHQuLi5iYXNlTWFuaWZlc3RDb2x1bW4sXG5cdFx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5EZWZhdWx0XG5cdFx0XHRcdH07XG5cdFx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gY3VzdG9tVGFibGVDb2x1bW47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gYFRoZSBhbm5vdGF0aW9uIGNvbHVtbiAnJHtrZXl9JyByZWZlcmVuY2VkIGluIHRoZSBtYW5pZmVzdCBpcyBub3QgZm91bmRgO1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LFxuXHRcdFx0XHRcdFx0SXNzdWVTZXZlcml0eS5Mb3csXG5cdFx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGUsXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5VHlwZT8uQW5ub3RhdGlvbkNvbHVtbnM/LkludmFsaWRLZXlcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaW50ZXJuYWxDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBBZGRzIGNvbXB1dGVkIGNvbHVtbnMgc3VjaCBhcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBzaXR1YXRpb25zIHN0YXR1cy5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIHRhYmxlIGNvbHVtbnMgY29sbGVjdGVkIHNvIGZhclxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZVxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgVGhlIGVucmljaGVkIHNldCBvZiB0YWJsZSBjb2x1bW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDb21wdXRlZENvbHVtbnMoXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGlmICghW1wiR3JpZFRhYmxlXCIsIFwiVHJlZVRhYmxlXCIsIFwiQW5hbHl0aWNhbFRhYmxlXCJdLmluY2x1ZGVzKHRhYmxlVHlwZSkpIHtcblx0XHQvLyBDb21wdXRlZCBjb2x1bW5zIGFyZSBub3QgdXNlZCBpbiBSZXNwb25zaXZlIHRhYmxlc1xuXHRcdHJldHVybiB0YWJsZUNvbHVtbnM7XG5cdH1cblxuXHQvLyBJbiBjYXNlIGEgZ3JpZCB0YWJsZSBvciB0cmVlIHRhYmxlIGlzIHVzZWQsIHdlIGRpc3BsYXkgdGhlIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGluIGEgc2VwYXJhdGUgY29sdW1uXG5cdC8vIHNvIHdlIGhhdmUgdG8gZGlzYWJsZSBpdCBoZXJlIHRvIGVuc3VyZSwgdGhhdCB0aGUgZmllbGQgYnVpbGRpbmcgYmxvY2tcblx0Ly8gZG9lcyBub3QgcmVuZGVyIGl0IGludG8gdGhlIElEIGNvbHVtblxuXHRjb25zdCBjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvcjogVGFibGVDb2x1bW4gfCB1bmRlZmluZWQgPSB0YWJsZUNvbHVtbnMuZmluZChcblx0XHQoY29sdW1uKSA9PiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzU2l0dWF0aW9uc0luZGljYXRvciAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yID09PSB0cnVlXG5cdCk7XG5cdGlmIChjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvcj8uZm9ybWF0T3B0aW9ucykge1xuXHRcdC8vIFN3aXRjaCBvZmYgdGhlIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGluIHRoZSBmb3VuZCBjb2x1bW5cblx0XHRjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvci5mb3JtYXRPcHRpb25zLmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPSBmYWxzZTtcblxuXHRcdC8vIEluc2VydCBhIHNlcGFyYXRlIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGNvbHVtblxuXHRcdGNvbnN0IHNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW46IENvbXB1dGVkVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IFwic2l0dWF0aW9uc0luZGljYXRvclwiLFxuXHRcdFx0bmFtZTogXCJzaXR1YXRpb25zSW5kaWNhdG9yXCIsXG5cdFx0XHRwcm9wZXJ0eUtleTogY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IubmFtZSxcblx0XHRcdGlzU2l0dWF0aW9uc0luZGljYXRvcjogdHJ1ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJEZWZhdWx0XCIsXG5cdFx0XHRsYWJlbDogXCJ7c2FwLmZlLmkxOG4+Q19TSVRVQVRJT05TX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHRvb2x0aXA6IFwie3NhcC5mZS5pMThuPkNfU0lUVUFUSU9OU19TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkNvbXB1dGVkLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogbnVsbCxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBudWxsLFxuXHRcdFx0Y2xpcGJvYXJkU2V0dGluZ3M6IG51bGwsXG5cdFx0XHRwcm9wZXJ0eUluZm9zOiB1bmRlZmluZWQsXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuXHRcdH07XG5cblx0XHQvLyBQbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBhZnRlciB0aGUgZmlyc3QgdmlzaWJsZSBjb2x1bW5cblx0XHRjb25zdCBpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uOiBpbnQgPSB0YWJsZUNvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+IGNvbHVtbi5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCIpO1xuXHRcdHRhYmxlQ29sdW1ucy5zcGxpY2UoaW5kZXhPZkZpcnN0VmlzaWJsZUNvbHVtbiArIDEsIDAsIHNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW4pO1xuXHR9XG5cblx0Ly8gSW4gY2FzZSBhIGdyaWQgdGFibGUgb3IgdHJlZSB0YWJsZSBpcyB1c2VkLCB3ZSBkaXNwbGF5IHRoZSBkcmFmdCBpbmRpY2F0b3IgaW4gYSBzZXBhcmF0ZSBjb2x1bW5cblx0Ly8gc28gd2UgaGF2ZSB0byBkaXNhYmxlIGl0IGhlcmUgdG8gZW5zdXJlLCB0aGF0IHRoZSBmaWVsZCBidWlsZGluZyBibG9ja1xuXHQvLyBkb2VzIG5vdCByZW5kZXIgaXQgaW50byB0aGUgSUQgY29sdW1uXG5cdC8vIFRoZSBhZGRpdGlvbmFsIGNvbHVtbiBpcyBvbmx5IGFkZGVkIGZvciB0YWJsZXMgb24gYSBMUiBhbmQgaW4gY2FzZSB0ZWhlIGVudGl0eSBpcyBkcmFmdCBlbmFibGVkIVxuXHRjb25zdCBjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yOiBUYWJsZUNvbHVtbltdID0gdGFibGVDb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzRHJhZnRJbmRpY2F0b3IgPT09IHRydWUpO1xuXHRpZiAoXG5cdFx0Y29sdW1uc1dpdGhEcmFmdEluZGljYXRvci5sZW5ndGggJiZcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdChNb2RlbEhlbHBlci5pc0RyYWZ0Tm9kZShjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKSB8fCBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKSlcblx0KSB7XG5cdFx0Ly8gU3dpdGNoIG9mZiB0aGUgZHJhZnQgaW5kaWNhdG9yIGluIHRoZSBmb3VuZCBjb2x1bW5cblx0XHRjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yLmZvckVhY2goKGNvbHVtbldpdGhEcmFmdEluZGljYXRvcjogVGFibGVDb2x1bW4pID0+IHtcblx0XHRcdGlmIChjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3I/LmZvcm1hdE9wdGlvbnMpIHtcblx0XHRcdFx0Y29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yLmZvcm1hdE9wdGlvbnMuaGFzRHJhZnRJbmRpY2F0b3IgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEluc2VydCBhIHNlcGFyYXRlIGRyYWZ0IGluZGljYXRvciBjb2x1bW5cblx0XHRjb25zdCBkcmFmdEluZGljYXRvckNvbHVtbjogQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleTogXCJkcmFmdFN0YXR1c1wiLFxuXHRcdFx0bmFtZTogXCJkcmFmdFN0YXR1c1wiLFxuXHRcdFx0cHJvcGVydHlLZXk6IGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3JbMF0ubmFtZSxcblx0XHRcdGlzRHJhZnRJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiRGVmYXVsdFwiLFxuXHRcdFx0bGFiZWw6IFwie3NhcC5mZS5pMThuPkNfRFJBRlRfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dG9vbHRpcDogXCJ7c2FwLmZlLmkxOG4+Q19EUkFGVF9TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkNvbXB1dGVkLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogbnVsbCxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBudWxsLFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmFsc2Vcblx0XHR9O1xuXHRcdGxldCBjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXI6IGludCA9IDA7XG5cdFx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uLCBwbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBiZWZvcmUgaXRcblx0XHRcdGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciA9XG5cdFx0XHRcdHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gKGNvbHVtbiBhcyBDb21wdXRlZFRhYmxlQ29sdW1uKS5pc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWUpIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR9XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgKyAxLCAwLCBkcmFmdEluZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCAgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSByZXN0cmljdGVkIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBQcm9wZXJ0eVBhdGhbXSB7XG5cdHJldHVybiBnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbihcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHQoY2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gKGNhcGFiaWxpdGllcyBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQpPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcztcblx0XHR9LFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaXMgYW5ub3RhdGVkIGFzIGEgcmVxdWlyZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkXG4gKi9cbmZ1bmN0aW9uIGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQuaW5jbHVkZXMobmFtZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSB0eXBlIG9mIGEgY29sdW1uIGZvciB0aGUgZXhwb3J0LlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgYSBwcm9wZXJ0eSwgY29sdW1uXG4gKiBAcGFyYW0gaXNBVGltZXpvbmUgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgdGltZXpvbmVcbiAqIEBwYXJhbSBpc0N1cnJlbmN5IElzIHRoZSBnaXZlbiBwcm9wZXJ0eSBhIGN1cnJlbmN5XG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGFscmVhZHkgZGV0ZWN0ZWQgZXhwb3J0IHNldHRpbmdzIGZyb20gZGF0YWZpZWxkc1xuICogQHJldHVybnMgVGhlIHN1cHBvcnRlZCBleHBvcnQgdHlwZVxuICovXG5mdW5jdGlvbiBnZXRFeHBvcnREYXRhVHlwZShcblx0ZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0aXNBVGltZXpvbmUgPSBmYWxzZSxcblx0aXNDdXJyZW5jeSA9IGZhbHNlLFxuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzXG4pOiBzdHJpbmcge1xuXHRsZXQgZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRpZiAoIWRhdGFUeXBlIHx8IGV4cG9ydFNldHRpbmdzPy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LmlzQ3VycmVuY3kgfHwgaXNDdXJyZW5jeSkge1xuXHRcdHJldHVybiBcIkN1cnJlbmN5XCI7XG5cdH1cblx0aWYgKGlzQVRpbWV6b25lKSB7XG5cdFx0cmV0dXJuIFwiVGltZXpvbmVcIjtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LndyYXApIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH1cblx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZU9mVGltZVwiOlxuXHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSB0b29sdGlwIGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9hZGRUb29sVGlwKHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdG9vbHRpcCA9IF9nZXRUb29sdGlwKHByb3BlcnR5KSA/PyBjb2x1bW4ubGFiZWw7XG5cdGlmICh0b29sdGlwKSB7XG5cdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMoXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXMgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgcmVsYXRpdmVQYXRoKS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goKG5hdlByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMucHVzaChnZXRMYWJlbChuYXZQcm9wZXJ0eSkgfHwgbmF2UHJvcGVydHkubmFtZSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscztcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9wZXJ0eSB1c2luZyB0aGUgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uIHNldCB0byB0ZXh0IG9ubHkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBjb3JyZXNwb25kaW5nIERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gbGluZUl0ZW0gVGhlIGNvbHVtbiB0byBiZSBldmFsdWF0ZWQuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dC5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+LFxuXHRsaW5lSXRlbTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogdm9pZCB7XG5cdGNvbnN0IGlzUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0aWYgKGlzUHJvcGVydHlOYXZpZ2F0ZWQgJiYgaXNEYXRhRmllbGQobGluZUl0ZW0pKSB7XG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0aXZlUGF0aF0gPSBsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0O1xuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGl2ZVBhdGgpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihsaW5lSXRlbSkgJiYgaGFzRmllbGRHcm91cFRhcmdldChsaW5lSXRlbSkpIHtcblx0XHQobGluZUl0ZW0uVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGlzRGF0YUZpZWxkKGZpZWxkKSAmJiBnZXREaXNwbGF5TW9kZShmaWVsZC5WYWx1ZS4kdGFyZ2V0KSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdGNvbnN0IGluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdFx0XHRmaWVsZC5WYWx1ZS5wYXRoXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkID1cblx0XHRcdFx0XHRpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAhPT1cblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGg7XG5cdFx0XHRcdGlmIChpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtmaWVsZC5WYWx1ZS5wYXRoXSA9IGZpZWxkLlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKGZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IHR5cGUgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcHJvcGVydHkgb3IgZGF0YSB0eXBlLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBvciBkYXRhIGZpZWxkIHRvIGRldGVybWluZSB0aGUgdHlwZSBjb25maWd1cmF0aW9uIGZvci5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIHRvIHVzZSBmb3IgdHlwZSBjb25maWd1cmF0aW9uIGlmIG5vdCBkZXRlcm1pbmVkIGZyb20gdGhlIHByb3BlcnR5LlxuICogQHJldHVybnMgVGhlIHByb3BlcnR5IHR5cGUgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ29uZmlnKHByb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQsIGRhdGFUeXBlPzogc3RyaW5nKTogUHJvcGVydHlUeXBlQ29uZmlnIHtcblx0bGV0IHRhcmdldE1hcHBpbmcsXG5cdFx0Zm9ybWF0T3B0aW9uczogUHJvcGVydHlUeXBlRm9ybWF0T3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9O1xuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHR0YXJnZXRNYXBwaW5nID0gaXNUeXBlRGVmaW5pdGlvbihwcm9wZXJ0eS50YXJnZXRUeXBlKVxuXHRcdFx0PyBFRE1fVFlQRV9NQVBQSU5HW3Byb3BlcnR5LnRhcmdldFR5cGUudW5kZXJseWluZ1R5cGVdXG5cdFx0XHQ6IEVETV9UWVBFX01BUFBJTkdbcHJvcGVydHkudHlwZV07XG5cdH1cblx0aWYgKCF0YXJnZXRNYXBwaW5nICYmIGRhdGFUeXBlICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1tkYXRhVHlwZV07XG5cdH1cblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdFx0dHlwZTogdGFyZ2V0TWFwcGluZz8udHlwZVxuXHR9O1xuXHRpZiAodGFyZ2V0TWFwcGluZyAmJiBpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGNvbnN0cmFpbnRzID0gc2V0VXBDb25zdHJhaW50cyh0YXJnZXRNYXBwaW5nLCBwcm9wZXJ0eSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKGNvbnN0cmFpbnRzKS5sZW5ndGgpIHtcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuXHRcdH1cblx0fVxuXHRpZiAocHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgIT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyZWFtXCIpIHtcblx0XHRpZiAoXG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdCkge1xuXHRcdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VBc1N0cmluZzogZmFsc2UsIGVtcHR5U3RyaW5nOiBcIlwiIH07XG5cdFx0fVxuXHRcdGlmIChwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiAmJiBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHM/Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlIH07XG5cdFx0fVxuXHR9XG5cdGlmIChPYmplY3Qua2V5cyhmb3JtYXRPcHRpb25zKS5sZW5ndGgpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyA9IGZvcm1hdE9wdGlvbnM7XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn1cblxuLyoqXG4gKiBBZGQgYSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSB0byB0aGUgbGlzdCBvZiBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGNvbHVtbnMgb2YgYSB0YWJsZS5cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBsaXN0IG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyB0ZXh0IG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW4gKG5hbWVkIGFsc28gY29tcGxleCBwcm9wZXJ0eSlcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIGJlIGFkZGVkXG4gKi9cbmZ1bmN0aW9uIGFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwKFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRlZFByb3BlcnR5TmFtZTogc3RyaW5nXG4pOiB2b2lkIHtcblx0aWYgKFxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uICYmXG5cdFx0IWRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRlZFByb3BlcnR5TmFtZV1cblx0KSB7XG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGVkUHJvcGVydHlOYW1lXSA9XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiE7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0aWVzIG9mIGEgTGluZUl0ZW0gaW4gY2FzZSB0aGUgTGluZUl0ZW0gaXMgYW5ub3RhdGVkIGFzIGhpZGRlbi5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZyb20gTGluZUl0ZW1zIGFuZCBmcm9tIHByb3BlcnRpZXMgb2YgZW50aXR5VHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIGV2YWx1YXRlZFxuICogQHBhcmFtIGNvbHVtbiBUaGUgZ2l2ZW4gY29sdW1uIGZyb20gbGluZUl0ZW0gb3IgcHJvcGVydHkgb2YgZW50aXR5U2V0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sIG5hbWU6IHN0cmluZywgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgcmVsYXRlZEFubm90YXRpb25Db2x1bW5zID0gZXhpc3RpbmdDb2x1bW5zLmZpbHRlcihcblx0XHQoZXhpc3RpbmdDb2x1bW4pID0+XG5cdFx0XHQoZXhpc3RpbmdDb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkgJiYgZXhpc3RpbmdDb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSkgfHxcblx0XHRcdChleGlzdGluZ0NvbHVtbi5pc1BhcnRPZkxpbmVJdGVtICYmIGV4aXN0aW5nQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY29sdW1uLnJlbGF0aXZlUGF0aClcblx0KTtcblx0Y29sdW1uLmlzUGFydE9mTGluZUl0ZW0gPSAhIXJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucy5sZW5ndGg7XG5cdGlmIChcblx0XHRyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMubGVuZ3RoICYmXG5cdFx0IXJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucz8uc29tZSgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCIpXG5cdCkge1xuXHRcdGNvbHVtbi5zb3J0YWJsZSA9IGZhbHNlO1xuXHRcdGNvbHVtbi5pc0dyb3VwYWJsZSA9IGZhbHNlO1xuXHRcdGNvbHVtbi5maWx0ZXJhYmxlID0gZmFsc2U7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBleHBvcnQgc2V0dGluZ3MgcHJvcGVydGllcyBvZiBhIG1hbmlmZXN0IGNvbHVtbi5cbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgY3VzdG9taXplZC9vdmVyd3JpdHRlbiBleHBvcnQgc2V0dGluZ3Mgb2YgYSBtYW5pZmVzdCBjb2x1bW5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZnJvbSBMaW5lSXRlbXNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIHByb3BlcnR5SW5mb3MgVGhlIHByb3BlcnRpZXMgbGlua2VkIHRvIGEgY29tcGxleCBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW5LZXkgVGhlIGNvbHVtbiBrZXkgb2YgdGhlIGNvbHVtbiB0byBiZSBvdmVyd3JpdHRlblxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBvZiB0aGUgY29sdW1uIG1lcmdpbmcgY3VzdG9taXplZCBleHBvcnQgc2V0dGluZ3Mgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgZGV0ZWN0ZWQgb24gdGhlIGFubm90YXRpb24gY29sdW1uXG4gKi9cbmZ1bmN0aW9uIGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKFxuXHRleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCB1bmRlZmluZWQsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW10sXG5cdGNvbHVtbktleT86IHN0cmluZ1xuKTogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsIHtcblx0bGV0IGNvbHVtbkZyb21Bbm5vdGF0aW9ucztcblx0aWYgKGNvbHVtbktleSkge1xuXHRcdGNvbHVtbkZyb21Bbm5vdGF0aW9ucyA9IGFubm90YXRpb25Db2x1bW5zLmZpbmQoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4ua2V5ID09PSBjb2x1bW5LZXkpO1xuXHRcdGlmIChjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncztcblx0XHR9XG5cdH1cblx0Y29uc3QgZW5hYmxlV3JhcHBpbmcgPVxuXHRcdGV4cG9ydFNldHRpbmdzPy53cmFwID8/XG5cdFx0KCEhKGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSAmJiBleHBvcnRTZXR0aW5ncy5wcm9wZXJ0eT8ubGVuZ3RoID4gMSkgfHwgISEocHJvcGVydHlJbmZvcyAmJiBwcm9wZXJ0eUluZm9zLmxlbmd0aCA+IDEpKTtcblx0Y29uc3QgY3VzdG9tRXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzID0ge1xuXHRcdC4uLmNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0dHlwZTogZXhwb3J0U2V0dGluZ3M/LnR5cGUgPz8gY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncz8udHlwZSxcblx0XHR0ZW1wbGF0ZTpcblx0XHRcdGV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZSA/P1xuXHRcdFx0X2FwcGVuZEN1c3RvbVRlbXBsYXRlKHByb3BlcnR5SW5mb3MsIGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSkgPz9cblx0XHRcdGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlLFxuXHRcdHByb3BlcnR5OiBleHBvcnRTZXR0aW5ncz8ucHJvcGVydHlcblx0XHRcdD8gX2dldFByb3BlcnR5TmFtZXMoZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5LCBhbm5vdGF0aW9uQ29sdW1ucywgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSlcblx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHdpZHRoOiBleHBvcnRTZXR0aW5ncz8ud2lkdGgsXG5cdFx0d3JhcDogZW5hYmxlV3JhcHBpbmdcblx0fTtcblx0cmV0dXJuIHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyhjdXN0b21FeHBvcnRTZXR0aW5ncyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|