mobx-keystone 0.69.2 → 0.69.3

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.
@@ -7981,4 +7981,4 @@ const types = {
7981
7981
  dateTimestamp: typesInteger
7982
7982
  };
7983
7983
  export { ActionContextActionType, ActionContextAsyncStepType, ActionTrackingResult, ArraySet, ArraySetTypeInfo, ArrayTypeInfo, BaseDataModel, BaseModel, BooleanTypeInfo, BuiltInAction, DataModel, Draft, ExtendedDataModel, ExtendedModel, Frozen, FrozenCheckMode, FrozenTypeInfo, HookAction, InternalPatchRecorder, LiteralTypeInfo, MobxKeystoneError, Model, ModelAutoTypeCheckingMode, ModelTypeInfo, NumberTypeInfo, ObjectMap, ObjectMapTypeInfo, ObjectTypeInfo, OrTypeInfo, RecordTypeInfo, Ref, RefTypeInfo, RefinementTypeInfo, SandboxManager, StringTypeInfo, TagTypeInfo, TupleTypeInfo, TypeCheckError, TypeInfo, UncheckedTypeInfo, UndoEventType, UndoManager, UndoStore, WalkTreeMode, _async, _await, abstractModelClass, actionCallToReduxAction, actionTrackingMiddleware, addActionMiddleware, addHiddenProp, addLateInitializationFunction, applyAction, applyDelete, applyMethodCall, applyPatches, applySerializedActionAndSyncNewModelIds, applySerializedActionAndTrackNewModelIds, applySet, applySnapshot, arrayActions, arraySet, arrayToMapTransform, arrayToSetTransform, asMap, asReduxStore, asSet, assertIsDataModel, assertIsDataModelClass, assertIsFunction, assertIsMap, assertIsModel, assertIsModelClass, assertIsObject, assertIsObservableArray, assertIsObservableObject, assertIsPlainObject, assertIsPrimitive, assertIsSet, assertIsString, assertIsTreeNode, assertTweakedObject, baseDataModelPropNames, baseModelPropNames, cannotSerialize, clone, computedTree, computedWalkTreeAggregate, connectReduxDevTools, createContext, customRef, decorateWrapMethodOrField, decoratedModel, deepEquals, deleteFromArray, deserializeActionCall, deserializeActionCallArgument, detach, draft, failure, fastGetParent, fastGetParentIncludingDataObjects, fastGetParentPath, fastGetParentPathIncludingDataObjects, fastGetRoot, fastGetRootPath, fastGetRootStore, fastIsModelDataObject, fastIsRootStore, findChildren, findParent, findParentPath, flow, fromSnapshot, fromSnapshotOverrideTypeSymbol, frozen, frozenKey, getActionMiddlewares, getChildrenObjects, getCurrentActionContext, getDataModelMetadata, getGlobalConfig, getMobxVersion, getModelIdPropertyName, getModelMetadata, getModelRefId, getNodeSandboxManager, getParent, getParentPath, getParentToChildPath, getRefsResolvingTo, getRoot, getRootPath, getRootStore, getSnapshot, getTypeInfo, idProp, identityFn, inDevMode, internalApplyDelete, internalApplyMethodCall, internalApplyPatches, internalApplySnapshot, internalCustomRef, internalFromSnapshot, internalPatchRecorder, isArray, isBuiltInAction, isChildOfParent, isComputedTreeNode, isDataModel, isDataModelClass, isFrozenSnapshot, isGlobalUndoRecordingDisabled, isHookAction, isJSONPrimitive, isMap, isModel, isModelAction, isModelAutoTypeCheckingEnabled, isModelClass, isModelDataObject, isModelFlow, isModelSnapshot, isObject, isParentOfChild, isPlainObject, isPrimitive, isRefOfType, isReservedModelKey, isRoot, isRootStore, isSandboxedNode, isSet, isTreeNode, isTweakedObject, isoStringToDateTransform, jsonPatchToPatch, jsonPointerToPath, lazy, logWarning, makePropReadonly, mapToArray, mapToObject, mobx6, model, modelAction, modelActionSymbol, modelClass, modelFlow, modelIdKey, modelIdPropertyNameSymbol, modelInitializedSymbol, modelSnapshotInWithMetadata, modelSnapshotOutWithMetadata, modelTypeKey, namespace$2 as namespace, noDefaultValue, objectActions, objectMap, objectToMapTransform, observableOptions, onActionMiddleware, onChildAttachedTo, onGlobalPatches, onPatches, onSnapshot, patchRecorder, patchToJsonPatch, pathToJsonPointer, prop, propNameToSetterName, propsTypeSymbol, readonlyMiddleware, reduxActionType, registerActionCallArgumentSerializer, registerRootStore, registerSnapshotter, registerTweaker, resolveId, resolvePath, resolvePathCheckingIds, rootRef, runAfterNewSymbol, runBeforeOnInitSymbol, runLateInitializationFunctions, runUnprotected, runWithoutSnapshotOrPatches, runningWithoutSnapshotOrPatches, sandbox, serializeActionCall, serializeActionCallArgument, setCurrentActionContext, setGlobalConfig, setToArray, simplifyActionContext, skipIdChecking, standaloneAction, standaloneFlow, stringToBigIntTransform, tProp, tag, timestampToDateTransform, toSnapshotOverrideTypeSymbol, toTreeNode, transaction, transactionMiddleware, tryUntweak, tweak, tweakedObjects, typeCheck, types, undoMiddleware, unregisterRootStore, walkTree, withoutUndo };
7984
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS5lc20ubWpzIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YU1vZGVsL2FjdGlvbnMudHMiLCIuLi9zcmMvYWN0aW9uL2J1aWx0SW5BY3Rpb25zLnRzIiwiLi4vc3JjL2FjdGlvbi9jb250ZXh0LnRzIiwiLi4vc3JjL2FjdGlvbi9pc01vZGVsQWN0aW9uLnRzIiwiLi4vc3JjL21vZGVsL21ldGFkYXRhLnRzIiwiLi4vc3JjL3V0aWxzL2luZGV4LnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZC50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9tb2RlbEluZm8udHMiLCIuLi9zcmMvdXRpbHMvbWFwVXRpbHMudHMiLCIuLi9zcmMvcGFyZW50L2NvcmUudHMiLCIuLi9zcmMvdHdlYWtlci9jb3JlLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsU3ltYm9scy50cyIsIi4uL3NyYy9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsUHJvcHNJbmZvLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL3Byb3AudHMiLCIuLi9zcmMvdHlwZXMvZ2V0VHlwZUluZm8udHMiLCIuLi9zcmMvdHlwZXMvVHlwZUNoZWNrRXJyb3IudHMiLCIuLi9zcmMvdHlwZXMvVHlwZUNoZWNrZXIudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNNb2RlbC50cyIsIi4uL3NyYy90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZS50cyIsIi4uL3NyYy90eXBlcy9yZWdpc3RlckRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnMudHMiLCIuLi9zcmMvdHlwZXMvcmVzb2x2ZVR5cGVDaGVja2VyLnRzIiwiLi4vc3JjL3NuYXBzaG90L2ludGVybmFsLnRzIiwiLi4vc3JjL3NuYXBzaG90L2dldFNuYXBzaG90LnRzIiwiLi4vc3JjL3R5cGVzL3R5cGVDaGVjay50cyIsIi4uL25vZGVfbW9kdWxlcy9uYW5vaWQvbm9uLXNlY3VyZS9pbmRleC5qcyIsIi4uL3NyYy9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsQ2xhc3NJbml0aWFsaXplci50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9uZXdNb2RlbC50cyIsIi4uL3NyYy9hY3Rpb24vcHJvdGVjdGlvbi50cyIsIi4uL3NyYy9hY3Rpb24vcGVuZGluZ0FjdGlvbnMudHMiLCIuLi9zcmMvYWN0aW9uL2hvb2tBY3Rpb25zLnRzIiwiLi4vc3JjL3BhcmVudC9jb3JlT2JqZWN0Q2hpbGRyZW4udHMiLCIuLi9zcmMvcGFyZW50L3dhbGtUcmVlLnRzIiwiLi4vc3JjL3Jvb3RTdG9yZS9hdHRhY2hEZXRhY2gudHMiLCIuLi9zcmMvcm9vdFN0b3JlL3Jvb3RTdG9yZS50cyIsIi4uL3NyYy9wYXRjaC9lbWl0UGF0Y2gudHMiLCIuLi9zcmMvZGF0YU1vZGVsL2dldERhdGFNb2RlbE1ldGFkYXRhLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzRGF0YU1vZGVsRGF0YS50cyIsIi4uL3NyYy9kYXRhTW9kZWwvbmV3RGF0YU1vZGVsLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC91dGlscy50cyIsIi4uL3NyYy9mcm96ZW4vRnJvemVuLnRzIiwiLi4vc3JjL3R3ZWFrZXIvVHdlYWtlclByaW9yaXR5LnRzIiwiLi4vc3JjL3R3ZWFrZXIvdHdlYWtGcm96ZW4udHMiLCIuLi9zcmMvcGFyZW50L2ZpbmRQYXJlbnQudHMiLCIuLi9zcmMvcGFyZW50L2dldENoaWxkcmVuT2JqZWN0cy50cyIsIi4uL3NyYy9wYXJlbnQvZmluZENoaWxkcmVuLnRzIiwiLi4vc3JjL3BhcmVudC9vbkNoaWxkQXR0YWNoZWRUby50cyIsIi4uL3NyYy9wYXJlbnQvcGF0aDIudHMiLCIuLi9zcmMvdHdlYWtlci93aXRob3V0VHlwZUNoZWNraW5nLnRzIiwiLi4vc3JjL3NuYXBzaG90L1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlY29uY2lsZUFycmF5U25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlRnJvemVuU25hcHNob3QudHMiLCIuLi9ub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsL2VzNi9pbmRleC5qcyIsIi4uL3NyYy91dGlscy9Nb2RlbFBvb2wudHMiLCIuLi9zcmMvc25hcHNob3QvYXBwbHlTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9vblNuYXBzaG90LnRzIiwiLi4vc3JjL3RyZWVVdGlscy9kZWVwRXF1YWxzLnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlY29uY2lsZU1vZGVsU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWdpc3RlckRlZmF1bHRSZWNvbmNpbGVycy50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWNvbmNpbGVTbmFwc2hvdC50cyIsIi4uL3NyYy9wYXRjaC9hcHBseVBhdGNoZXMudHMiLCIuLi9zcmMvdHdlYWtlci90eXBlQ2hlY2tpbmcudHMiLCIuLi9zcmMvdHdlYWtlci90d2Vha1BsYWluT2JqZWN0LnRzIiwiLi4vc3JjL3R3ZWFrZXIvcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnMudHMiLCIuLi9zcmMvdHdlYWtlci90d2Vhay50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrQXJyYXkudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbUFycmF5U25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbUZyb3plblNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L2Zyb21Nb2RlbFNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L2Zyb21QbGFpbk9iamVjdFNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVycy50cyIsIi4uL3NyYy9zbmFwc2hvdC9mcm9tU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvY2xvbmUudHMiLCIuLi9zcmMvcGFyZW50L3NldFBhcmVudC50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrTW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvbmV3TW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvQmFzZU1vZGVsLnRzIiwiLi4vc3JjL21vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL3BhcmVudC9wYXRoLnRzIiwiLi4vc3JjL2FjdGlvbi9taWRkbGV3YXJlLnRzIiwiLi4vc3JjL2FjdGlvbi93cmFwSW5BY3Rpb24udHMiLCIuLi9zcmMvcGFyZW50L2RldGFjaC50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9jaGVja01vZGVsRGVjb3JhdG9yQXJncy50cyIsIi4uL3NyYy9hY3Rpb24vYWN0aW9uRGVjb3JhdG9yVXRpbHMudHMiLCIuLi9zcmMvYWN0aW9uL21vZGVsRmxvdy50cyIsIi4uL3NyYy9zdGFuZGFyZEFjdGlvbnMvYWN0aW9ucy50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlEZWxldGUudHMiLCIuLi9zcmMvYWN0aW9uL2FwcGx5TWV0aG9kQ2FsbC50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlTZXQudHMiLCIuLi9zcmMvYWN0aW9uL2FwcGx5QWN0aW9uLnRzIiwiLi4vc3JjL2FjdGlvbi9tb2RlbEFjdGlvbi50cyIsIi4uL3NyYy9hY3Rpb24vcnVuVW5wcm90ZWN0ZWQudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9jb3JlLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vYXJyYXlTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vZGF0ZVNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9tYXBTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL3V0aWxzLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vb2JqZWN0UGF0aFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9vYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9wbGFpbk9iamVjdFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9wcmltaXRpdmVTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vc2V0U2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL2FjdGlvblNlcmlhbGl6YXRpb24udHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9hcHBseVNlcmlhbGl6ZWRBY3Rpb24udHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL29uQWN0aW9uTWlkZGxld2FyZS50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9yZWFkb25seU1pZGRsZXdhcmUudHMiLCIuLi9zcmMvcGF0Y2gvanNvblBhdGNoLnRzIiwiLi4vc3JjL3BhdGNoL3BhdGNoUmVjb3JkZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvdHJhbnNhY3Rpb25NaWRkbGV3YXJlLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzT2JqZWN0LnRzIiwiLi4vc3JjL3R5cGVzL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWQudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc09yLnRzIiwiLi4vc3JjL3R5cGVzL3RQcm9wLnRzIiwiLi4vc3JjL3V0aWxzL2NoYWluRm5zLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL3V0aWxzLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL3NoYXJlZEludGVybmFsTW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxEZWNvcmF0b3IudHMiLCIuLi9zcmMvdHlwZXMvYXJyYXlCYXNlZC90eXBlc0FycmF5LnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL3VuZG9NaWRkbGV3YXJlLnRzIiwiLi4vc3JjL2NvbnRleHQvY29udGV4dC50cyIsIi4uL3NyYy9jb21wdXRlZFRyZWUvY29tcHV0ZWRUcmVlLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC9EYXRhTW9kZWwudHMiLCIuLi9zcmMvcmVkdXgvY29ubmVjdFJlZHV4RGV2VG9vbHMudHMiLCIuLi9zcmMvcmVkdXgvcmVkdXgudHMiLCIuLi9zcmMvcmVmL1JlZi50cyIsIi4uL3NyYy9yZWYvY29yZS50cyIsIi4uL3NyYy9yZWYvY3VzdG9tUmVmLnRzIiwiLi4vc3JjL3JlZi9yb290UmVmLnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9zdGFuZGFsb25lQWN0aW9ucy50cyIsIi4uL3NyYy9zdGFuZGFyZEFjdGlvbnMvYXJyYXlBY3Rpb25zLnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9vYmplY3RBY3Rpb25zLnRzIiwiLi4vc3JjL3V0aWxzL3RhZy50cyIsIi4uL3NyYy93cmFwcGVycy9hc01hcC50cyIsIi4uL3NyYy90cmFuc2Zvcm1zL2FzTWFwLnRzIiwiLi4vc3JjL3dyYXBwZXJzL2FzU2V0LnRzIiwiLi4vc3JjL3RyYW5zZm9ybXMvYXNTZXQudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9iaWdpbnQudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9JbW11dGFibGVEYXRlLnRzIiwiLi4vc3JjL3RyYW5zZm9ybXMvZGF0ZS50cyIsIi4uL3NyYy90cmVlVXRpbHMvZHJhZnQudHMiLCIuLi9zcmMvdHJlZVV0aWxzL3NhbmRib3gudHMiLCIuLi9zcmMvdHlwZXMvYXJyYXlCYXNlZC90eXBlc1R1cGxlLnRzIiwiLi4vc3JjL3dyYXBwZXJzL0FycmF5U2V0LnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzQXJyYXlTZXQudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNSZWNvcmQudHMiLCIuLi9zcmMvd3JhcHBlcnMvT2JqZWN0TWFwLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzT2JqZWN0TWFwLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzUmVmLnRzIiwiLi4vc3JjL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzRW51bS50cyIsIi4uL3NyYy90eXBlcy91dGlsaXR5L3R5cGVzUmVmaW5lbWVudC50cyIsIi4uL3NyYy90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1JlZmluZWRQcmltaXRpdmUudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc01heWJlLnRzIiwiLi4vc3JjL3R5cGVzL3V0aWxpdHkvdHlwZXNUYWcudHMiLCIuLi9zcmMvdHlwZXMvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcblxuY29uc3QgZGF0YU1vZGVsQWN0aW9uUmVnaXN0cnkgPSBuZXcgTWFwPFxuICBzdHJpbmcsXG4gIHtcbiAgICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbiAgICBmbk5hbWU6IHN0cmluZ1xuICB9XG4+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFNb2RlbEFjdGlvbihmdWxsQWN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBkYXRhTW9kZWxBY3Rpb25SZWdpc3RyeS5nZXQoZnVsbEFjdGlvbk5hbWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREYXRhTW9kZWxBY3Rpb24oXG4gIGZ1bGxBY3Rpb25OYW1lOiBzdHJpbmcsXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbiAgZm5OYW1lOiBzdHJpbmdcbikge1xuICBkYXRhTW9kZWxBY3Rpb25SZWdpc3RyeS5zZXQoZnVsbEFjdGlvbk5hbWUsIHtcbiAgICBtb2RlbENsYXNzLFxuICAgIGZuTmFtZSxcbiAgfSlcbn1cbiIsIi8qKlxuICogQSBidWlsdC1pbiBhY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIEJ1aWx0SW5BY3Rpb24ge1xuICAvKipcbiAgICogYXBwbHlQYXRjaGVzXG4gICAqL1xuICBBcHBseVBhdGNoZXMgPSBcIiQkYXBwbHlQYXRjaGVzXCIsXG4gIC8qKlxuICAgKiBhcHBseVNuYXBzaG90XG4gICAqL1xuICBBcHBseVNuYXBzaG90ID0gXCIkJGFwcGx5U25hcHNob3RcIixcbiAgLyoqXG4gICAqIGRldGFjaFxuICAgKi9cbiAgRGV0YWNoID0gXCIkJGRldGFjaFwiLFxuICAvKipcbiAgICogYXBwbHlTZXRcbiAgICovXG4gIEFwcGx5U2V0ID0gXCIkJGFwcGx5U2V0XCIsXG4gIC8qKlxuICAgKiBhcHBseURlbGV0ZVxuICAgKi9cbiAgQXBwbHlEZWxldGUgPSBcIiQkYXBwbHlEZWxldGVcIixcbiAgLyoqXG4gICAqIGFwcGx5TWV0aG9kQ2FsbFxuICAgKi9cbiAgQXBwbHlNZXRob2RDYWxsID0gXCIkJGFwcGx5TWV0aG9kQ2FsbFwiLFxufVxuXG5jb25zdCBidWlsdEluQWN0aW9uVmFsdWVzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChPYmplY3QudmFsdWVzKEJ1aWx0SW5BY3Rpb24pKVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBhY3Rpb24gbmFtZSBpcyBhIGJ1aWx0LWluIGFjdGlvbiwgdGhpcyBpcywgb25lIG9mOlxuICogLSBhcHBseVBhdGNoZXMoKVxuICogLSBhcHBseVNuYXBzaG90KClcbiAqIC0gZGV0YWNoKClcbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBBY3Rpb24gbmFtZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBidWlsdC1pbiBhY3Rpb24sIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbHRJbkFjdGlvbihhY3Rpb25OYW1lOiBzdHJpbmcpOiBhY3Rpb25OYW1lIGlzIEJ1aWx0SW5BY3Rpb24ge1xuICByZXR1cm4gYnVpbHRJbkFjdGlvblZhbHVlcy5oYXMoYWN0aW9uTmFtZSlcbn1cbiIsImltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcblxuLyoqXG4gKiBMb3cgbGV2ZWwgYWN0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBBY3Rpb24gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBBY3Rpb24gdHlwZSwgc3luYyBvciBhc3luYy5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlXG4gIC8qKlxuICAgKiBBY3Rpb24gdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldDogQW55TW9kZWxcbiAgLyoqXG4gICAqIEFycmF5IG9mIGFjdGlvbiBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBhcmdzOiBSZWFkb25seUFycmF5PGFueT5cbiAgLyoqXG4gICAqIFBhcmVudCBhY3Rpb24gY29udGV4dCwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50Q29udGV4dD86IEFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIFJvb3QgYWN0aW9uIGNvbnRleHQsIG9yIGl0c2VsZiBpZiB0aGUgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RDb250ZXh0OiBBY3Rpb25Db250ZXh0XG4gIC8qKlxuICAgKiBQcmV2aW91cyBhc3luYyBzdGVwIGNvbnRleHQsIHVuZGVmaW5lZCBmb3Igc3luYyBhY3Rpb25zIG9yIHRoZSBmaXJzdCBhY3Rpb24gb2YgYSBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0PzogQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogU3Bhd24gYXN5bmMgc3RlcCBjb250ZXh0LCB1bmRlZmluZWQgZm9yIHN5bmMgYWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHNwYXduQXN5bmNTdGVwQ29udGV4dD86IEFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIEFzeW5jIHN0ZXAgdHlwZSwgb3IgdW5kZWZpbmVkIGZvciBzeW5jIGFjdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBhc3luY1N0ZXBUeXBlPzogQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGVcbiAgLyoqXG4gICAqIEN1c3RvbSBkYXRhIGZvciB0aGUgYWN0aW9uIGNvbnRleHQgdG8gYmUgc2V0IGJ5IG1pZGRsZXdhcmVzLCBhbiBvYmplY3QuXG4gICAqIFN5bWJvbHMgbXVzdCBiZSB1c2VkIGFzIGtleXMgdG8gYXZvaWQgbmFtZSBjbGFzaGluZyBiZXR3ZWVuIG1pZGRsZXdhcmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogUmVjb3JkPHN5bWJvbCwgYW55PlxufVxuXG4vKipcbiAqIEFjdGlvbiB0eXBlLCBzeW5jIG9yIGFzeW5jLlxuICovXG5leHBvcnQgZW51bSBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB7XG4gIFN5bmMgPSBcInN5bmNcIixcbiAgQXN5bmMgPSBcImFzeW5jXCIsXG59XG5cbi8qKlxuICogQW4gYXN5bmMgc3RlcCB0eXBlLlxuICovXG5leHBvcnQgZW51bSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZSB7XG4gIC8qKlxuICAgKiBUaGUgZmxvdyBpcyBhYm91dCB0byBzdGFydC5cbiAgICovXG4gIFNwYXduID0gXCJzcGF3blwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgaXMgYWJvdXQgdG8gcmV0dXJuIChmaW5pc2gpLlxuICAgKi9cbiAgUmV0dXJuID0gXCJyZXR1cm5cIixcbiAgLyoqXG4gICAqIFRoZSBmbG93IGlzIGFib3V0IHRvIGNvbnRpbnVlLlxuICAgKi9cbiAgUmVzdW1lID0gXCJyZXN1bWVcIixcbiAgLyoqXG4gICAqIFRoZSBmbG93IHlpZWxkIGp1c3QgdGhyZXcsIHdoaWNoIG1pZ2h0IGJlIHJlY292ZXJlZCAoY2F1Z2h0KSBvciBub3QuXG4gICAqL1xuICBSZXN1bWVFcnJvciA9IFwicmVzdW1lRXJyb3JcIixcbiAgLyoqXG4gICAqIFRoZSBmbG93IGlzIGFib3V0IHRvIHRocm93IGFuIGVycm9yIHRvIHRoZSBmbG93IGNhbGxlci5cbiAgICovXG4gIFRocm93ID0gXCJ0aHJvd1wiLFxufVxuXG5sZXQgY3VycmVudEFjdGlvbkNvbnRleHQ6IEFjdGlvbkNvbnRleHQgfCB1bmRlZmluZWRcblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50bHkgcnVubmluZyBhY3Rpb24gY29udGV4dCwgb3IgdW5kZWZpbmVkIGlmIG5vbmUuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRBY3Rpb25Db250ZXh0KCk6IEFjdGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY3VycmVudEFjdGlvbkNvbnRleHRcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBTZXRzIHRoZSBjdXJyZW50IGFjdGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBjdHggQ3VycmVudCBhY3Rpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEN1cnJlbnRBY3Rpb25Db250ZXh0KGN0eDogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBjdXJyZW50QWN0aW9uQ29udGV4dCA9IGN0eFxufVxuIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsQWN0aW9uU3ltYm9sID0gU3ltYm9sKFwibW9kZWxBY3Rpb25cIilcblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIG1vZGVsIGFjdGlvbiBvciBub3QuXG4gKlxuICogQHBhcmFtIGZuIEZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxBY3Rpb24oZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiAmJiBtb2RlbEFjdGlvblN5bWJvbCBpbiBmblxufVxuIiwiLyoqXG4gKiBLZXkgd2hlcmUgbW9kZWwgc25hcHNob3RzIHdpbGwgc3RvcmUgbW9kZWwgdHlwZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsVHlwZUtleSA9IFwiJG1vZGVsVHlwZVwiXG5cbi8qKlxuICogS2V5IHRoYXQgc2VydmVzIGFzIHByb3h5IHRvIHRoZSBtb2RlbCBwcm9wZXJ0eSBkZXNpZ25lZCBhcyAnaWRQcm9wJyAoaWYgYW55KS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSWRLZXkgPSBcIiRtb2RlbElkXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBrZXkgaXMgYSByZXNlcnZlZCBrZXkgaW4gbW9kZWwgc25hcHNob3RzLlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc2VydmVkTW9kZWxLZXkoa2V5OiBzdHJpbmcpIHtcbiAgLy8gbm90ZSAkbW9kZWxJZCBpcyBOT1QgYSByZXNlcnZlZCBrZXksIHNpbmNlIGl0IHdpbGwgZXZlbnR1YWxseSBlbmQgdXAgaW4gdGhlIGRhdGFcbiAgLy8gYW5kIGNhbiBhY3R1YWxseSBiZSBjaGFuZ2VkXG4gIHJldHVybiBrZXkgPT09IG1vZGVsVHlwZUtleVxufVxuIiwiaW1wb3J0ICogYXMgbW9ieCBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBJT2JzZXJ2YWJsZUFycmF5LFxuICBpc09ic2VydmFibGVBcnJheSxcbiAgaXNPYnNlcnZhYmxlTWFwLFxuICBpc09ic2VydmFibGVPYmplY3QsXG4gIGlzT2JzZXJ2YWJsZVNldCxcbiAgT2JzZXJ2YWJsZU1hcCxcbiAgT2JzZXJ2YWJsZVNldCxcbn0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgSlNPTlByaW1pdGl2ZVZhbHVlLCBQcmltaXRpdmVWYWx1ZSB9IGZyb20gXCIuL3R5cGVzXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtc2cpXG5cbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVFcnJvcihtc2cpXG59XG5cbmNvbnN0IHdyaXRhYmxlSGlkZGVuUHJvcERlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IHtcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB2YWx1ZTogdW5kZWZpbmVkLFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSGlkZGVuUHJvcChvYmplY3Q6IGFueSwgcHJvcE5hbWU6IFByb3BlcnR5S2V5LCB2YWx1ZTogYW55LCB3cml0YWJsZSA9IHRydWUpIHtcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUsIHdyaXRhYmxlSGlkZGVuUHJvcERlc2NyaXB0b3IpXG4gICAgb2JqZWN0W3Byb3BOYW1lXSA9IHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZSxcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUHJvcFJlYWRvbmx5PFQ+KG9iamVjdDogVCwgcHJvcE5hbWU6IGtleW9mIFQsIGVudW1lcmFibGU6IGJvb2xlYW4pIHtcbiAgY29uc3QgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcE5hbWUpXG4gIGlmIChwcm9wRGVzYykge1xuICAgIHByb3BEZXNjLmVudW1lcmFibGUgPSBlbnVtZXJhYmxlXG4gICAgaWYgKHByb3BEZXNjLmdldCkge1xuICAgICAgZGVsZXRlIHByb3BEZXNjLnNldFxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wRGVzYy53cml0YWJsZSA9IGZhbHNlXG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BOYW1lLCBwcm9wRGVzYylcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlVmFsdWUge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSlNPTlByaW1pdGl2ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpTT05QcmltaXRpdmVWYWx1ZSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKVxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUZyb21BcnJheTxUPihhcnJheTogVFtdLCB2YWx1ZTogVCk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKHZhbHVlKVxuICBpZiAoaW5kZXggPj0gMCkge1xuICAgIGFycmF5LnNwbGljZShpbmRleCwgMSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXAodmFsOiB1bmtub3duKTogdmFsIGlzIE1hcDxhbnksIGFueT4gfCBPYnNlcnZhYmxlTWFwIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIE1hcCB8fCBpc09ic2VydmFibGVNYXAodmFsKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXQodmFsOiB1bmtub3duKTogdmFsIGlzIFNldDxhbnk+IHwgT2JzZXJ2YWJsZVNldCB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBTZXQgfHwgaXNPYnNlcnZhYmxlU2V0KHZhbClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsOiB1bmtub3duKTogdmFsIGlzIGFueVtdIHwgSU9ic2VydmFibGVBcnJheSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgfHwgaXNPYnNlcnZhYmxlQXJyYXkodmFsKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5EZXZNb2RlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc09iamVjdCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBvYmplY3Qge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhbiBvYmplY3RgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIG9iamVjdCB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBwbGFpbiBvYmplY3RgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc09ic2VydmFibGVPYmplY3QodmFsdWU6IHVua25vd24sIGFyZ05hbWU6IHN0cmluZyk6IGFzc2VydHMgdmFsdWUgaXMgb2JqZWN0IHtcbiAgaWYgKCFpc09ic2VydmFibGVPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGFuIG9ic2VydmFibGUgb2JqZWN0YClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXkoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmdcbik6IGFzc2VydHMgdmFsdWUgaXMgSU9ic2VydmFibGVBcnJheSB7XG4gIGlmICghaXNPYnNlcnZhYmxlQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGFuIG9ic2VydmFibGUgYXJyYXlgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc01hcCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBNYXA8YW55LCBhbnk+IHtcbiAgaWYgKCFpc01hcCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBtYXBgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc1NldCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBTZXQ8YW55PiB7XG4gIGlmICghaXNTZXQodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgc2V0YClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNGdW5jdGlvbih2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBGdW5jdGlvbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIGZ1bmN0aW9uYClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNQcmltaXRpdmUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmdcbik6IGFzc2VydHMgdmFsdWUgaXMgUHJpbWl0aXZlVmFsdWUge1xuICBpZiAoIWlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHByaW1pdGl2ZWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzU3RyaW5nKHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBzdHJpbmdgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGVNZXRob2RPckZpZWxkRGF0YSB7XG4gIHRhcmdldDogYW55XG4gIHByb3BlcnR5S2V5OiBzdHJpbmdcbiAgYmFzZURlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IgJiB7IGluaXRpYWxpemVyPzogKCkgPT4gYW55IH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bkFmdGVyTmV3U3ltYm9sID0gU3ltYm9sKFwicnVuQWZ0ZXJOZXdcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bkJlZm9yZU9uSW5pdFN5bWJvbCA9IFN5bWJvbChcInJ1bkJlZm9yZU9uSW5pdFwiKVxuXG50eXBlIFdyYXBGdW5jdGlvbiA9IChkYXRhOiBEZWNvcmF0ZU1ldGhvZE9yRmllbGREYXRhLCBmbjogYW55KSA9PiBhbnlcbnR5cGUgTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zQXJyYXkgPSAoKGluc3RhbmNlOiBhbnkpID0+IHZvaWQpW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uKFxuICB0YXJnZXQ6IGFueSxcbiAgc3ltYm9sOiBzeW1ib2wsXG4gIGZuOiAoaW5zdGFuY2U6IGFueSkgPT4gdm9pZFxuKSB7XG4gIGxldCBhcnJheTogTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zQXJyYXkgPSB0YXJnZXRbc3ltYm9sXVxuICBpZiAoIWFycmF5IHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBzeW1ib2wpKSB7XG4gICAgLy8gbGVhdmUgYmFzZSBhcnJheSB1bm1vZGlmaWVkLCBjcmVhdGUgbmV3IGFycmF5IGluIHRoZSBkZXJpdmVkIGNsYXNzXG4gICAgYXJyYXkgPSBhcnJheSA/IGFycmF5LnNsaWNlKCkgOiBbXVxuICAgIGFkZEhpZGRlblByb3AodGFyZ2V0LCBzeW1ib2wsIGFycmF5KVxuICB9XG4gIGFycmF5LnB1c2goZm4pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZVdyYXBNZXRob2RPckZpZWxkKFxuICBkZWNvcmF0b3JOYW1lOiBzdHJpbmcsXG4gIGRhdGE6IERlY29yYXRlTWV0aG9kT3JGaWVsZERhdGEsXG4gIHdyYXA6IFdyYXBGdW5jdGlvblxuKTogYW55IHtcbiAgY29uc3QgeyB0YXJnZXQsIHByb3BlcnR5S2V5LCBiYXNlRGVzY3JpcHRvciB9ID0gZGF0YVxuXG4gIGNvbnN0IGFkZEZpZWxkRGVjb3JhdG9yID0gKCkgPT4ge1xuICAgIGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uKHRhcmdldCwgcnVuQWZ0ZXJOZXdTeW1ib2wsIChpbnN0YW5jZSkgPT4ge1xuICAgICAgaW5zdGFuY2VbcHJvcGVydHlLZXldID0gd3JhcChkYXRhLCBpbnN0YW5jZVtwcm9wZXJ0eUtleV0pXG4gICAgfSlcbiAgfVxuXG4gIGlmIChiYXNlRGVzY3JpcHRvcikge1xuICAgIGlmIChiYXNlRGVzY3JpcHRvci5nZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgQCR7ZGVjb3JhdG9yTmFtZX0gY2Fubm90IGJlIHVzZWQgd2l0aCBnZXR0ZXJzYClcbiAgICB9XG5cbiAgICBpZiAoYmFzZURlc2NyaXB0b3IudmFsdWUpIHtcbiAgICAgIC8vIGJhYmVsIC8gdHlwZXNjcmlwdCAtIG1ldGhvZCBkZWNvcmF0b3JcbiAgICAgIC8vIEBhY3Rpb24gbWV0aG9kKCkgeyB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHdyYXAoZGF0YSwgYmFzZURlc2NyaXB0b3IudmFsdWUpLFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBiYWJlbCAtIGZpZWxkIGRlY29yYXRvcjogQGFjdGlvbiBtZXRob2QgPSAoKSA9PiB7fVxuICAgICAgYWRkRmllbGREZWNvcmF0b3IoKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB0eXBlc2NyaXB0IC0gZmllbGQgZGVjb3JhdG9yXG4gICAgYWRkRmllbGREZWNvcmF0b3IoKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnModGFyZ2V0OiBhbnksIHN5bWJvbDogc3ltYm9sKTogdm9pZCB7XG4gIGNvbnN0IGZuczogTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zQXJyYXkgfCB1bmRlZmluZWQgPSB0YXJnZXRbc3ltYm9sXVxuICBpZiAoZm5zKSB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmbnMpIHtcbiAgICAgIGZuKHRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgd2FybmluZ3NBbHJlYWR5RGlzcGxheWVkID0gbmV3IFNldDxzdHJpbmc+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ1dhcm5pbmcodHlwZTogXCJ3YXJuXCIgfCBcImVycm9yXCIsIG1zZzogc3RyaW5nLCB1bmlxdWVLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHVuaXF1ZUtleSkge1xuICAgIGlmICh3YXJuaW5nc0FscmVhZHlEaXNwbGF5ZWQuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB3YXJuaW5nc0FscmVhZHlEaXNwbGF5ZWQuYWRkKHVuaXF1ZUtleSlcbiAgfVxuXG4gIG1zZyA9IFwiW21vYngta2V5c3RvbmVdIFwiICsgbXNnXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICBjb25zb2xlLndhcm4obXNnKVxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgZmFpbHVyZShgdW5rbm93biBsb2cgdHlwZSAtICR7dHlwZX1gKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXp5PEEgZXh0ZW5kcyB1bmtub3duW10sIFI+KGdldHRlcjogKC4uLmFyZ3M6IEEpID0+IFIpOiB0eXBlb2YgZ2V0dGVyIHtcbiAgbGV0IG1lbW9pemVkVmFsdWU6IFJcbiAgbGV0IG1lbW9pemVkID0gZmFsc2VcblxuICByZXR1cm4gKC4uLmFyZ3M6IEEpOiBSID0+IHtcbiAgICBpZiAoIW1lbW9pemVkKSB7XG4gICAgICBtZW1vaXplZFZhbHVlID0gZ2V0dGVyKC4uLmFyZ3MpXG4gICAgICBtZW1vaXplZCA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIG1lbW9pemVkVmFsdWVcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaWRlbnRpdHlGbiA9IDxUPih4OiBUKTogVCA9PiB4XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBtb2J4NiA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY29uY2F0XG4gIG1ha2VPYnNlcnZhYmxlOiAobW9ieCBhcyBhbnkpW1xuICAgIC8vIGp1c3QgdG8gZW5zdXJlIGltcG9ydCAqIGlzIGtlcHQgcHJvcGVybHlcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKFwibFwiLmNoYXJDb2RlQXQoMCkgKyAxKSArIFwiYWtlT2JzZXJ2YWJsZVwiXG4gIF0sXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTmFtZVRvU2V0dGVyTmFtZShwcm9wTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBzZXQke3Byb3BOYW1lWzBdLnRvVXBwZXJDYXNlKCl9JHtwcm9wTmFtZS5zbGljZSgxKX1gXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2J4VmVyc2lvbigpOiBudW1iZXIge1xuICBpZiAobW9ieDYubWFrZU9ic2VydmFibGUhKSB7XG4gICAgcmV0dXJuIDZcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gNVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBuYW1lc3BhY2UgPSBcIm1vYngta2V5c3RvbmVcIlxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBGbGF0dGVuLCBJc05ldmVyVHlwZSB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUHJvcHNUb0NyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90RGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YSxcbn0gZnJvbSBcIi4vcHJvcFwiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgcHJvcHNUeXBlU3ltYm9sID0gU3ltYm9sKFwicHJvcHNUeXBlXCIpXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sID0gU3ltYm9sKFwiZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlXCIpXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbCA9IFN5bWJvbChcInRvU25hcHNob3RPdmVycmlkZVR5cGVcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wgPSBTeW1ib2woXCJtb2RlbEluaXRpYWxpemVkXCIpXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGluc3RhbmNlIHR5cGUgb2YgYSBtb2RlbCBjbGFzcy5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxDbGFzczxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+ID0ge1xuICBuZXcgKGluaXRpYWxEYXRhOiBhbnkpOiBNXG5cbiAgZnJvbVNuYXBzaG90UHJvY2Vzc29yPyhzbjogYW55KTogYW55XG4gIHRvU25hcHNob3RQcm9jZXNzb3I/KHNuOiBhbnksIG1vZGVsSW5zdGFuY2U6IGFueSk6IGFueVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBpbnN0YW5jZSB0eXBlIG9mIGFuIGFic3RyYWN0IG1vZGVsIGNsYXNzLlxuICovXG5leHBvcnQgdHlwZSBBYnN0cmFjdE1vZGVsQ2xhc3M8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IGFic3RyYWN0IG5ldyAoXG4gIGluaXRpYWxEYXRhOiBhbnlcbikgPT4gTVxuXG4vKipcbiAqIFRoZSBwcm9wcyBvZiBhIG1vZGVsLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzT2Y8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IE1bdHlwZW9mIHByb3BzVHlwZVN5bWJvbF1cblxuLyoqXG4gKiBUaGUgZGF0YSB0eXBlIG9mIGEgbW9kZWwuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsRGF0YTxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+ID0gRmxhdHRlbjxNW1wiJFwiXT5cblxuLyoqXG4gKiBUaGUgY3JlYXRpb24gZGF0YSB0eXBlIG9mIGEgbW9kZWwuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsQ3JlYXRpb25EYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPSBNb2RlbFByb3BzVG9DcmVhdGlvbkRhdGE8XG4gIE1vZGVsUHJvcHNPZjxNPlxuPlxuXG4vKipcbiAqIFRoZSB0cmFuc2Zvcm1lZCBkYXRhIHR5cGUgb2YgYSBtb2RlbC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxUcmFuc2Zvcm1lZERhdGE8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YTxcbiAgTW9kZWxQcm9wc09mPE0+XG4+XG5cbi8qKlxuICogVGhlIHRyYW5zZm9ybWVkIGNyZWF0aW9uIGRhdGEgdHlwZSBvZiBhIG1vZGVsLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbFRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPVxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxNb2RlbFByb3BzT2Y8TT4+XG5cbi8qKlxuICogVGhlIGZyb20gc25hcHNob3QgdHlwZSBvZiBhIG1vZGVsLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTbmFwc2hvdEluT2Y8TW9kZWw+IGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsRnJvbVNuYXBzaG90PE0gZXh0ZW5kcyBBbnlNb2RlbD4gPSBJc05ldmVyVHlwZTxcbiAgTVt0eXBlb2YgZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXSxcbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGE8TW9kZWxQcm9wc09mPE0+PixcbiAgTVt0eXBlb2YgZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXVxuPiAmIHsgW21vZGVsVHlwZUtleV0/OiBzdHJpbmcgfVxuXG4vKipcbiAqIFRoZSB0byBzbmFwc2hvdCB0eXBlIG9mIGEgbW9kZWwuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFNuYXBzaG90T3V0T2Y8TW9kZWw+IGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsVG9TbmFwc2hvdDxNIGV4dGVuZHMgQW55TW9kZWw+ID0gSXNOZXZlclR5cGU8XG4gIE1bdHlwZW9mIHRvU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGE8TW9kZWxQcm9wc09mPE0+PixcbiAgTVt0eXBlb2YgdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF1cbj4gJiB7IFttb2RlbFR5cGVLZXldPzogc3RyaW5nIH1cblxuLyoqXG4gKiBUcmlja3MgVHlwZVNjcmlwdCBpbnRvIGFjY2VwdGluZyBhIHBhcnRpY3VsYXIga2luZCBvZiBnZW5lcmljIGNsYXNzIGFzIGEgcGFyYW1ldGVyIGZvciBgRXh0ZW5kZWRNb2RlbGAuXG4gKiBEb2VzIG5vdGhpbmcgaW4gcnVudGltZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgR2VuZXJpYyBtb2RlbCBjbGFzcyB0eXBlLlxuICogQHBhcmFtIHR5cGUgR2VuZXJpYyBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbENsYXNzPFQgZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4odHlwZToge1xuICBwcm90b3R5cGU6IFRcbn0pOiBNb2RlbENsYXNzPFQ+IHtcbiAgcmV0dXJuIHR5cGUgYXMgYW55XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi9CYXNlTW9kZWxTaGFyZWRcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsSW5mbyB7XG4gIG5hbWU6IHN0cmluZ1xuICBjbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSW5mb0J5TmFtZToge1xuICBbbmFtZTogc3RyaW5nXTogTW9kZWxJbmZvXG59ID0ge31cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSW5mb0J5Q2xhc3MgPSBuZXcgTWFwPE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+LCBNb2RlbEluZm8+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSW5mb0Zvck5hbWUobmFtZTogc3RyaW5nKTogTW9kZWxJbmZvIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG1vZGVsSW5mb0J5TmFtZVtuYW1lXVxufVxuIiwidHlwZSBBbnlNYXA8ViA9IGFueT4gPSBNYXA8YW55LCBWPiB8IFdlYWtNYXA8YW55LCBWPlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JDcmVhdGU8SywgViwgQyA9IFY+KG1hcDogTWFwPEssIFY+LCBrZXk6IEssIGNyZWF0ZTogKCkgPT4gQyk6IFZcbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZTxLIGV4dGVuZHMgb2JqZWN0LCBWLCBDID0gVj4oXG4gIG1hcDogV2Vha01hcDxLLCBWPixcbiAga2V5OiBLLFxuICBjcmVhdGU6ICgpID0+IENcbik6IFZcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yQ3JlYXRlPFY+KG1hcDogQW55TWFwPFY+LCBrZXk6IGFueSwgY3JlYXRlOiAoKSA9PiBWKSB7XG4gIGxldCB2YWx1ZSA9IG1hcC5nZXQoa2V5KVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gY3JlYXRlKClcbiAgICBtYXAuc2V0KGtleSwgdmFsdWUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG4iLCJpbXBvcnQgeyBjcmVhdGVBdG9tLCBJQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQYXJlbnRQYXRoIH0gZnJvbSBcIi4vcGF0aFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBvYmplY3RQYXJlbnRzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBQYXJlbnRQYXRoPG9iamVjdD4gfCB1bmRlZmluZWQ+KClcblxuY29uc3Qgb2JqZWN0UGFyZW50c0F0b21zID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyZW50UGF0aEVxdWFscyhcbiAgcGFyZW50UGF0aDE6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcbiAgcGFyZW50UGF0aDI6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcbiAgY29tcGFyZVBhdGggPSB0cnVlXG4pIHtcbiAgaWYgKCFwYXJlbnRQYXRoMSAmJiAhcGFyZW50UGF0aDIpIHJldHVybiB0cnVlXG4gIGlmICghcGFyZW50UGF0aDEgfHwgIXBhcmVudFBhdGgyKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgcGFyZW50RXF1YWxzID0gcGFyZW50UGF0aDEucGFyZW50ID09PSBwYXJlbnRQYXRoMi5wYXJlbnRcbiAgaWYgKCFwYXJlbnRFcXVhbHMpIHJldHVybiBmYWxzZVxuICByZXR1cm4gY29tcGFyZVBhdGggPyBwYXJlbnRQYXRoMS5wYXRoID09PSBwYXJlbnRQYXRoMi5wYXRoIDogdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXJlbnRQYXRoQXRvbShvYmo6IG9iamVjdCkge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUob2JqZWN0UGFyZW50c0F0b21zLCBvYmosICgpID0+IGNyZWF0ZUF0b20oXCJwYXJlbnRBdG9tXCIpKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0UGFyZW50UGF0aE9ic2VydmVkKG5vZGU6IG9iamVjdCkge1xuICBjcmVhdGVQYXJlbnRQYXRoQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRQYXJlbnRQYXRoQ2hhbmdlZChub2RlOiBvYmplY3QpIHtcbiAgY3JlYXRlUGFyZW50UGF0aEF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkYXRhT2JqZWN0UGFyZW50ID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3Q+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFUb01vZGVsTm9kZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBUKTogVCB7XG4gIGNvbnN0IG1vZGVsTm9kZSA9IGRhdGFPYmplY3RQYXJlbnQuZ2V0KG5vZGUpXG4gIHJldHVybiAobW9kZWxOb2RlIGFzIFQpID8/IG5vZGVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsVG9EYXRhTm9kZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBUKTogVCB7XG4gIHJldHVybiBpc01vZGVsKG5vZGUpID8gbm9kZS4kIDogbm9kZVxufVxuIiwiaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBkYXRhT2JqZWN0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHR3ZWFrZWRPYmplY3RzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCB1bmRlZmluZWQgfCAoKCkgPT4gdm9pZCk+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHdlYWtlZE9iamVjdCh2YWx1ZTogdW5rbm93biwgY2FuQmVEYXRhT2JqZWN0OiBib29sZWFuKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgaWYgKCFjYW5CZURhdGFPYmplY3QgJiYgZGF0YU9iamVjdFBhcmVudC5oYXModmFsdWUgYXMgb2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0d2Vha2VkT2JqZWN0cy5oYXModmFsdWUgYXMgb2JqZWN0KVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIG9iamVjdCBpcyBub3cgYSB0cmVlIG5vZGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIHRyZWUgbm9kZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmVlTm9kZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhaXNQcmltaXRpdmUodmFsdWUpICYmIGlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgZmFsc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUd2Vha2VkT2JqZWN0KFxuICB0cmVlTm9kZTogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nLFxuICBjYW5CZURhdGFPYmplY3QgPSBmYWxzZVxuKTogYXNzZXJ0cyB0cmVlTm9kZSBpcyBvYmplY3Qge1xuICBpZiAoIWNhbkJlRGF0YU9iamVjdCAmJiBkYXRhT2JqZWN0UGFyZW50Lmhhcyh0cmVlTm9kZSBhcyBvYmplY3QpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIHRoZSBtb2RlbCBvYmplY3QgaW5zdGFuY2UgaW5zdGVhZCBvZiB0aGUgJyQnIHN1Yi1vYmplY3RgKVxuICB9XG4gIGlmIChpc1ByaW1pdGl2ZSh0cmVlTm9kZSkgfHwgIWlzVHdlYWtlZE9iamVjdCh0cmVlTm9kZSwgdHJ1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHRyZWUgbm9kZSAodXN1YWxseSBhIG1vZGVsIG9yIGEgc2hhbGxvdyAvIGRlZXAgY2hpbGQgcGFydCBvZiBhIG1vZGVsICdkYXRhJyBvYmplY3QpYFxuICAgIClcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgYSBnaXZlbiBvYmplY3QgaXMgbm93IGEgdHJlZSBub2RlLCBvciB0aHJvd3Mgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSBhcmdOYW1lIEFyZ3VtZW50IG5hbWUsIHBhcnQgb2YgdGhlIHRocm93biBlcnJvciBkZXNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzVHJlZU5vZGUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcgPSBcImFyZ3VtZW50XCJcbik6IGFzc2VydHMgdmFsdWUgaXMgb2JqZWN0IHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgYXJnTmFtZSwgZmFsc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBsZXQgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyA9IGZhbHNlXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRob3V0U25hcHNob3RPclBhdGNoZXMoZm46ICgpID0+IHZvaWQpIHtcbiAgY29uc3Qgb2xkID0gcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlc1xuICBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzID0gdHJ1ZVxuICB0cnkge1xuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgIGZuKClcbiAgICB9KVxuICB9IGZpbmFsbHkge1xuICAgIHJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgPSBvbGRcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IG1vZGVsTWV0YWRhdGFTeW1ib2wgPSBTeW1ib2woXCJtb2RlbE1ldGFkYXRhXCIpXG5leHBvcnQgY29uc3QgbW9kZWxVbndyYXBwZWRDbGFzc1N5bWJvbCA9IFN5bWJvbChcIm1vZGVsVW53cmFwcGVkQ2xhc3NcIilcbmV4cG9ydCBjb25zdCBydW5BZnRlck1vZGVsRGVjb3JhdG9yU3ltYm9sID0gU3ltYm9sKFwicnVuQWZ0ZXJNb2RlbERlY29yYXRvclwiKVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbE1ldGFkYXRhU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgaXNNb2RlbCwgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEFzc29jaWF0ZWQgbW9kZWwgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBBc3NvY2lhdGVkIGRhdGEgdHlwZSBmb3IgcnVudGltZSBjaGVja2luZyAoaWYgYW55KS5cbiAgICovXG4gIGRhdGFUeXBlPzogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSB1c2VkIGFzIG1vZGVsIGlkLlxuICAgKi9cbiAgbW9kZWxJZFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogQSB2YWx1ZSB0eXBlIHdpbGwgYmUgY2xvbmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBiZWluZyBhdHRhY2hlZCB0byBhIG5ldyB0cmVlLlxuICAgKi9cbiAgdmFsdWVUeXBlOiBib29sZWFuXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBmb3IgYSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gbW9kZWxDbGFzc09ySW5zdGFuY2UgTW9kZWwgY2xhc3Mgb3IgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsTWV0YWRhdGEoXG4gIG1vZGVsQ2xhc3NPckluc3RhbmNlOiBBbnlNb2RlbCB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+XG4pOiBNb2RlbE1ldGFkYXRhIHtcbiAgaWYgKGlzTW9kZWwobW9kZWxDbGFzc09ySW5zdGFuY2UpKSB7XG4gICAgcmV0dXJuIChtb2RlbENsYXNzT3JJbnN0YW5jZSBhcyBhbnkpLmNvbnN0cnVjdG9yW21vZGVsTWV0YWRhdGFTeW1ib2xdXG4gIH0gZWxzZSBpZiAoaXNNb2RlbENsYXNzKG1vZGVsQ2xhc3NPckluc3RhbmNlKSkge1xuICAgIHJldHVybiAobW9kZWxDbGFzc09ySW5zdGFuY2UgYXMgYW55KVttb2RlbE1ldGFkYXRhU3ltYm9sXVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoYG1vZGVsQ2xhc3NPckluc3RhbmNlIG11c3QgYmUgYSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZWApXG4gIH1cbn1cblxuY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZUNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUobW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUoXG4gICAgbW9kZWxJZFByb3BlcnR5TmFtZUNhY2hlLFxuICAgIG1vZGVsQ2xhc3MsXG4gICAgKCkgPT4gZ2V0TW9kZWxNZXRhZGF0YShtb2RlbENsYXNzKS5tb2RlbElkUHJvcGVydHlcbiAgKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4vQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxQcm9wcyB9IGZyb20gXCIuL3Byb3BcIlxuXG5jb25zdCBtb2RlbFByb3BlcnRpZXNTeW1ib2wgPSBTeW1ib2woXCJtb2RlbFByb3BlcnRpZXNcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBHZXRzIHRoZSBpbmZvIHJlbGF0ZWQgdG8gYSBtb2RlbCBjbGFzcyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBtb2RlbENsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8oXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+XG4pOiBNb2RlbFByb3BzIHtcbiAgcmV0dXJuIChtb2RlbENsYXNzIGFzIGFueSlbbW9kZWxQcm9wZXJ0aWVzU3ltYm9sXVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFNldHMgdGhlIGluZm8gcmVsYXRlZCB0byBhIG1vZGVsIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIG1vZGVsQ2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4sXG4gIHByb3BzOiBNb2RlbFByb3BzXG4pOiB2b2lkIHtcbiAgOyhtb2RlbENsYXNzIGFzIGFueSlbbW9kZWxQcm9wZXJ0aWVzU3ltYm9sXSA9IHByb3BzXG59XG4iLCJpbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZiwgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuLi9zbmFwc2hvdC9TbmFwc2hvdE9mXCJcbmltcG9ydCB0eXBlIHsgTGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgdHlwZSB7IEZsYXR0ZW4sIElzTmV2ZXJUeXBlLCBJc09wdGlvbmFsVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvdHlwZXNcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IG5vRGVmYXVsdFZhbHVlID0gU3ltYm9sKFwibm9EZWZhdWx0VmFsdWVcIilcblxuLyoqXG4gKiBBIG1vZGVsIHByb3BlcnR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJvcDxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BDcmVhdGlvblZhbHVlLFxuICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZSxcbiAgVElzUmVxdWlyZWQsXG4gIFRJc0lkIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBUSGFzU2V0dGVyID0gbmV2ZXIsXG4gIFRGcm9tU25hcHNob3RPdmVycmlkZSA9IG5ldmVyLFxuICBUVG9TbmFwc2hvdE92ZXJyaWRlID0gbmV2ZXJcbj4ge1xuICBfaW50ZXJuYWw6IHtcbiAgICAkdmFsdWVUeXBlOiBUUHJvcFZhbHVlXG4gICAgJGNyZWF0aW9uVmFsdWVUeXBlOiBUUHJvcENyZWF0aW9uVmFsdWVcbiAgICAkdHJhbnNmb3JtZWRWYWx1ZVR5cGU6IFRUcmFuc2Zvcm1lZFZhbHVlXG4gICAgJHRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVR5cGU6IFRUcmFuc2Zvcm1lZENyZWF0aW9uVmFsdWVcbiAgICAkaXNSZXF1aXJlZDogVElzUmVxdWlyZWRcbiAgICAkaXNJZDogVElzSWRcbiAgICAkaGFzU2V0dGVyOiBUSGFzU2V0dGVyXG4gICAgJGZyb21TbmFwc2hvdE92ZXJyaWRlOiBURnJvbVNuYXBzaG90T3ZlcnJpZGVcbiAgICAkdG9TbmFwc2hvdE92ZXJyaWRlOiBUVG9TbmFwc2hvdE92ZXJyaWRlXG5cbiAgICBkZWZhdWx0Rm46ICgoKSA9PiBUUHJvcFZhbHVlKSB8IHR5cGVvZiBub0RlZmF1bHRWYWx1ZVxuICAgIGRlZmF1bHRWYWx1ZTogVFByb3BWYWx1ZSB8IHR5cGVvZiBub0RlZmF1bHRWYWx1ZVxuICAgIHR5cGVDaGVja2VyOiBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlciB8IHVuZGVmaW5lZFxuICAgIHNldHRlcjogYm9vbGVhbiB8IFwiYXNzaWduXCJcbiAgICBpc0lkOiBib29sZWFuXG4gICAgdHJhbnNmb3JtOlxuICAgICAgfCB7XG4gICAgICAgICAgdHJhbnNmb3JtKFxuICAgICAgICAgICAgb3JpZ2luYWw6IHVua25vd24sXG4gICAgICAgICAgICBtb2RlbDogb2JqZWN0LFxuICAgICAgICAgICAgcHJvcE5hbWU6IFByb3BlcnR5S2V5LFxuICAgICAgICAgICAgc2V0T3JpZ2luYWxWYWx1ZTogKG5ld09yaWdpbmFsVmFsdWU6IHVua25vd24pID0+IHZvaWRcbiAgICAgICAgICApOiB1bmtub3duXG4gICAgICAgICAgdW50cmFuc2Zvcm0odHJhbnNmb3JtZWQ6IHVua25vd24sIG1vZGVsOiBvYmplY3QsIHByb3BOYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd25cbiAgICAgICAgfVxuICAgICAgfCB1bmRlZmluZWRcbiAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I/KHNuOiB1bmtub3duKTogdW5rbm93blxuICAgIHRvU25hcHNob3RQcm9jZXNzb3I/KHNuOiB1bmtub3duKTogdW5rbm93blxuICB9XG5cbiAgd2l0aFNldHRlcigpOiBNb2RlbFByb3A8XG4gICAgVFByb3BWYWx1ZSxcbiAgICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZSxcbiAgICBUSXNSZXF1aXJlZCxcbiAgICBUSXNJZCxcbiAgICBzdHJpbmcsXG4gICAgVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRUb1NuYXBzaG90T3ZlcnJpZGVcbiAgPlxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2V0dGVyIG1ldGhvZHMgYXJlIHByZWZlcnJlZC5cbiAgICovXG4gIHdpdGhTZXR0ZXIoXG4gICAgbW9kZTogXCJhc3NpZ25cIlxuICApOiBNb2RlbFByb3A8XG4gICAgVFByb3BWYWx1ZSxcbiAgICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZSxcbiAgICBUSXNSZXF1aXJlZCxcbiAgICBUSXNJZCxcbiAgICBzdHJpbmcsXG4gICAgVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRUb1NuYXBzaG90T3ZlcnJpZGVcbiAgPlxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdHJhbnNmb3JtIGZvciB0aGUgcHJvcGVydHkgaW5zdGFuY2UgdmFsdWUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gVFRWIFRyYW5zZm9ybWVkIHZhbHVlIHR5cGUuXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm0gVHJhbnNmb3JtIHRvIGJlIHVzZWQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB3aXRoVHJhbnNmb3JtPFRUVj4oXG4gICAgdHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08Tm9uTnVsbGFibGU8VFByb3BWYWx1ZT4sIFRUVj5cbiAgKTogTW9kZWxQcm9wPFxuICAgIFRQcm9wVmFsdWUsXG4gICAgVFByb3BDcmVhdGlvblZhbHVlLFxuICAgIFRUViB8IEV4dHJhY3Q8VFByb3BWYWx1ZSwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gICAgVFRWIHwgRXh0cmFjdDxUUHJvcENyZWF0aW9uVmFsdWUsIG51bGwgfCB1bmRlZmluZWQ+LFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIFRIYXNTZXR0ZXIsXG4gICAgVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRUb1NuYXBzaG90T3ZlcnJpZGVcbiAgPlxuXG4gIHdpdGhTbmFwc2hvdFByb2Nlc3NvcjxcbiAgICBGUyA9IFRGcm9tU25hcHNob3RPdmVycmlkZSxcbiAgICBUUyA9IFRUb1NuYXBzaG90T3ZlcnJpZGUsXG4gICAgVGhpcyBleHRlbmRzIEFueU1vZGVsUHJvcCA9IHRoaXNcbiAgPihwcm9jZXNzb3I6IHtcbiAgICBmcm9tU25hcHNob3Q/KHNuOiBGUyk6IE1vZGVsUHJvcEZyb21TbmFwc2hvdDxUaGlzPlxuICAgIHRvU25hcHNob3Q/KHNuOiBNb2RlbFByb3BUb1NuYXBzaG90PFRoaXM+KTogVFNcbiAgfSk6IE1vZGVsUHJvcDxcbiAgICBUUHJvcFZhbHVlLFxuICAgIFRQcm9wQ3JlYXRpb25WYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIFRIYXNTZXR0ZXIsXG4gICAgRlMsXG4gICAgVFNcbiAgPlxufVxuXG4vKipcbiAqIFRoZSBzbmFwc2hvdCBpbiB0eXBlIG9mIGEgbW9kZWwgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcEZyb21TbmFwc2hvdDxNUCBleHRlbmRzIEFueU1vZGVsUHJvcD4gPSBJc05ldmVyVHlwZTxcbiAgTVBbXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl0sXG4gIFNuYXBzaG90SW5PZjxNUFtcIl9pbnRlcm5hbFwiXVtcIiRjcmVhdGlvblZhbHVlVHlwZVwiXT4sXG4gIE1QW1wiX2ludGVybmFsXCJdW1wiJGZyb21TbmFwc2hvdE92ZXJyaWRlXCJdXG4+XG5cbi8qKlxuICogVGhlIHNuYXBzaG90IG91dCB0eXBlIG9mIGEgbW9kZWwgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcFRvU25hcHNob3Q8TVAgZXh0ZW5kcyBBbnlNb2RlbFByb3A+ID0gSXNOZXZlclR5cGU8XG4gIE1QW1wiX2ludGVybmFsXCJdW1wiJHRvU25hcHNob3RPdmVycmlkZVwiXSxcbiAgU25hcHNob3RPdXRPZjxNUFtcIl9pbnRlcm5hbFwiXVtcIiR2YWx1ZVR5cGVcIl0+LFxuICBNUFtcIl9pbnRlcm5hbFwiXVtcIiR0b1NuYXBzaG90T3ZlcnJpZGVcIl1cbj5cblxuLyoqXG4gKiBBIG1vZGVsIHByb3AgdHJhbnNmb3JtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJvcFRyYW5zZm9ybTxUT3JpZ2luYWwsIFRUcmFuc2Zvcm1lZD4ge1xuICB0cmFuc2Zvcm0ocGFyYW1zOiB7XG4gICAgb3JpZ2luYWxWYWx1ZTogVE9yaWdpbmFsXG4gICAgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogVFRyYW5zZm9ybWVkIHwgdW5kZWZpbmVkXG4gICAgc2V0T3JpZ2luYWxWYWx1ZSh2YWx1ZTogVE9yaWdpbmFsKTogdm9pZFxuICB9KTogVFRyYW5zZm9ybWVkXG5cbiAgdW50cmFuc2Zvcm0ocGFyYW1zOiB7IHRyYW5zZm9ybWVkVmFsdWU6IFRUcmFuc2Zvcm1lZDsgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKCk6IHZvaWQgfSk6IFRPcmlnaW5hbFxufVxuXG4vKipcbiAqIEFueSBtb2RlbCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IHR5cGUgQW55TW9kZWxQcm9wID0gTW9kZWxQcm9wPGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnk+XG5cbi8qKlxuICogTW9kZWwgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFByb3BzIHtcbiAgW2s6IHN0cmluZ106IEFueU1vZGVsUHJvcFxufVxuXG5leHBvcnQgdHlwZSBSZXF1aXJlZE1vZGVsUHJvcHM8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IHtcbiAgW0sgaW4ga2V5b2YgTVBdOiBNUFtLXVtcIl9pbnRlcm5hbFwiXVtcIiRpc1JlcXVpcmVkXCJdICYgS1xufVtrZXlvZiBNUF1cblxuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjx7XG4gIFtrIGluIGtleW9mIE1QXTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdmFsdWVUeXBlXCJdXG59PlxuXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IEZsYXR0ZW48e1xuICBbayBpbiBrZXlvZiBNUF06IE1vZGVsUHJvcFRvU25hcHNob3Q8TVBba10+IGV4dGVuZHMgaW5mZXIgUiA/IFIgOiBuZXZlclxufT5cblxuLy8gd2UgZG9uJ3QgdXNlIE8uT3B0aW9uYWwgYW55bW9yZSBzaW5jZSBpdCBnZW5lcmF0ZXMgdW5pb25zIHRvbyBoZWF2eVxuLy8gYWxzbyBpZiB3ZSB1c2UgcGljayBvdmVyIHRoZSBvcHRpb25hbCBwcm9wcyB3ZSB3aWxsIGxvb3NlIHRoZSBhYmlsaXR5XG4vLyB0byBpbmZlciBnZW5lcmljc1xuLy8gd2UgYWxzbyBkb24ndCB1c2UgRmxhdHRlbiBiZWNhdXNlIGlmIHdlIGRvIHNvbWUgZ2VuZXJpY3Mgd29uJ3Qgd29ya1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvQ3JlYXRpb25EYXRhPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSB7XG4gIFtrIGluIGtleW9mIE1QXT86IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJGNyZWF0aW9uVmFsdWVUeXBlXCJdXG59ICYge1xuICBbayBpbiBSZXF1aXJlZE1vZGVsUHJvcHM8TVA+XTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkY3JlYXRpb25WYWx1ZVR5cGVcIl1cbn1cblxuLy8gd2UgZG9uJ3QgdXNlIE8uT3B0aW9uYWwgYW55bW9yZSBzaW5jZSBpdCBnZW5lcmF0ZXMgdW5pb25zIHRvbyBoZWF2eVxuLy8gYWxzbyBpZiB3ZSB1c2UgcGljayBvdmVyIHRoZSBvcHRpb25hbCBwcm9wcyB3ZSB3aWxsIGxvb3NlIHRoZSBhYmlsaXR5XG4vLyB0byBpbmZlciBnZW5lcmljc1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IEZsYXR0ZW48XG4gIHtcbiAgICBbayBpbiBrZXlvZiBNUF0/OiBNb2RlbFByb3BGcm9tU25hcHNob3Q8TVBba10+IGV4dGVuZHMgaW5mZXIgUiA/IFIgOiBuZXZlclxuICB9ICYge1xuICAgIFtrIGluIHtcbiAgICAgIFtLIGluIGtleW9mIE1QXTogSXNOZXZlclR5cGU8XG4gICAgICAgIE1QW0tdW1wiX2ludGVybmFsXCJdW1wiJGZyb21TbmFwc2hvdE92ZXJyaWRlXCJdLFxuICAgICAgICBNUFtLXVtcIl9pbnRlcm5hbFwiXVtcIiRpc1JlcXVpcmVkXCJdICYgSywgLy8gbm8gb3ZlcnJpZGVcbiAgICAgICAgSXNPcHRpb25hbFZhbHVlPE1QW0tdW1wiX2ludGVybmFsXCJdW1wiJGZyb21TbmFwc2hvdE92ZXJyaWRlXCJdLCBuZXZlciwgSz4gLy8gd2l0aCBvdmVycmlkZVxuICAgICAgPlxuICAgIH1ba2V5b2YgTVBdXTogTW9kZWxQcm9wRnJvbVNuYXBzaG90PE1QW2tdPiBleHRlbmRzIGluZmVyIFIgPyBSIDogbmV2ZXJcbiAgfVxuPlxuXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IEZsYXR0ZW48e1xuICBbayBpbiBrZXlvZiBNUF06IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJHRyYW5zZm9ybWVkVmFsdWVUeXBlXCJdXG59PlxuXG4vLyB3ZSBkb24ndCB1c2UgTy5PcHRpb25hbCBhbnltb3JlIHNpbmNlIGl0IGdlbmVyYXRlcyB1bmlvbnMgdG9vIGhlYXZ5XG4vLyBhbHNvIGlmIHdlIHVzZSBwaWNrIG92ZXIgdGhlIG9wdGlvbmFsIHByb3BzIHdlIHdpbGwgbG9vc2UgdGhlIGFiaWxpdHlcbi8vIHRvIGluZmVyIGdlbmVyaWNzXG4vLyB3ZSBhbHNvIGRvbid0IHVzZSBGbGF0dGVuIGJlY2F1c2UgaWYgd2UgZG8gc29tZSBnZW5lcmljcyB3b24ndCB3b3JrXG4vLyB3ZSBhbHNvIGRvbid0IHVzZSBPbWl0IGJlY2F1c2UgaWYgd2UgZG8gc29tZSBnZW5lcmljcyB3b24ndCB3b3JrXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0ge1xuICBbayBpbiBrZXlvZiBNUF0/OiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiR0cmFuc2Zvcm1lZENyZWF0aW9uVmFsdWVUeXBlXCJdXG59ICYge1xuICBbayBpbiBSZXF1aXJlZE1vZGVsUHJvcHM8TVA+XTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlVHlwZVwiXVxufVxuXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9TZXR0ZXI8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IEZsYXR0ZW48e1xuICBbayBpbiBrZXlvZiBNUCBhcyBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiRoYXNTZXR0ZXJcIl0gJiBgc2V0JHtDYXBpdGFsaXplPGsgJiBzdHJpbmc+fWBdOiAoXG4gICAgdmFsdWU6IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJHRyYW5zZm9ybWVkVmFsdWVUeXBlXCJdXG4gICkgPT4gdm9pZFxufT5cblxuZXhwb3J0IHR5cGUgTW9kZWxJZFByb3AgPSBNb2RlbFByb3A8XG4gIHN0cmluZyxcbiAgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdHJpbmcsXG4gIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbmV2ZXIsIC8vIG5vdCByZXF1aXJlZFxuICB0cnVlXG4+XG5cbi8qKlxuICogQSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBtb2RlbCBpZCwgYWNjZXNzaWJsZSB0aHJvdWdoICRtb2RlbElkLlxuICogQ2FuIG9ubHkgYmUgdXNlZCBpbiBtb2RlbHMgYW5kIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBwZXIgbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBpZFByb3AgPSB7XG4gIF9pbnRlcm5hbDoge1xuICAgIHNldHRlcjogZmFsc2UsXG4gICAgaXNJZDogdHJ1ZSxcbiAgfSxcblxuICB3aXRoU2V0dGVyKG1vZGU/OiBib29sZWFuIHwgXCJhc3NpZ25cIikge1xuICAgIHJldHVybiB7IC4uLnRoaXMsIF9pbnRlcm5hbDogeyAuLi50aGlzLl9pbnRlcm5hbCwgc2V0dGVyOiBtb2RlID8/IHRydWUgfSB9XG4gIH0sXG59IGFzIGFueSBhcyBNb2RlbElkUHJvcFxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IHR5cGUgT25seVByaW1pdGl2ZXM8VD4gPSBFeGNsdWRlPFQsIG9iamVjdD5cblxuLyoqXG4gKiBBIG1vZGVsIHByb3AgdGhhdCBtYXliZSAvIG1heWJlIG5vdCBpcyBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIGlmIHRoZSB2YWx1ZSBjYW4gdGFrZSB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1heWJlT3B0aW9uYWxNb2RlbFByb3A8VFByb3BWYWx1ZT4gPSBNb2RlbFByb3A8XG4gIFRQcm9wVmFsdWUsXG4gIFRQcm9wVmFsdWUsXG4gIFRQcm9wVmFsdWUsXG4gIFRQcm9wVmFsdWUsXG4gIElzT3B0aW9uYWxWYWx1ZTxUUHJvcFZhbHVlLCBuZXZlciwgc3RyaW5nPiAvLyBjYWxjdWxhdGUgaWYgcmVxdWlyZWRcbj5cblxuLyoqXG4gKiBBIG1vZGVsIHByb3AgdGhhdCBpcyBkZWZpbml0ZWx5IG9wdGlvbmFsLlxuICovXG5leHBvcnQgdHlwZSBPcHRpb25hbE1vZGVsUHJvcDxUUHJvcFZhbHVlPiA9IE1vZGVsUHJvcDxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIFRQcm9wVmFsdWUsXG4gIFRQcm9wVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBuZXZlciAvLyBub3QgcmVxdWlyZWRcbj5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbW9kZWwgcHJvcGVydHksIHdpdGggYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IHZhbHVlXG4gKiBpZiB0aGUgaW5wdXQgc25hcHNob3QgLyBtb2RlbCBjcmVhdGlvbiBkYXRhIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHByb3AoKCkgPT4gMTApIC8vIGFuIG9wdGlvbmFsIG51bWJlciwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgMTBcbiAqIHg6IHByb3A8bnVtYmVyW10+KCgpID0+IFtdKSAvLyBhbiBvcHRpb25hbCBudW1iZXIgYXJyYXksIHdpdGggYSBkZWZhdWx0IGVtcHR5IGFycmF5XG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFRWYWx1ZSBWYWx1ZSB0eXBlLlxuICogQHBhcmFtIGRlZmF1bHRGbiBEZWZhdWx0IHZhbHVlIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wPFRWYWx1ZT4oZGVmYXVsdEZuOiAoKSA9PiBUVmFsdWUpOiBPcHRpb25hbE1vZGVsUHJvcDxUVmFsdWU+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5LCB3aXRoIGFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWVcbiAqIGlmIHRoZSBpbnB1dCBzbmFwc2hvdCAvIG1vZGVsIGNyZWF0aW9uIGRhdGEgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICogWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIHdpdGggcHJpbWl0aXZlIHZhbHVlcyBhbmQgbmV2ZXIgd2l0aCBvYmplY3QgdmFsdWVzXG4gKiAoYXJyYXksIG1vZGVsLCBvYmplY3QsIGV0YykuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiBwcm9wKDEwKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mIDEwXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFRWYWx1ZSBWYWx1ZSB0eXBlLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHByaW1pdGl2ZSB2YWx1ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wPFRWYWx1ZT4oZGVmYXVsdFZhbHVlOiBPbmx5UHJpbWl0aXZlczxUVmFsdWU+KTogT3B0aW9uYWxNb2RlbFByb3A8VFZhbHVlPlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSB3aXRoIG5vIGRlZmF1bHQgdmFsdWUuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiBwcm9wPG51bWJlcj4oKSAvLyBhIHJlcXVpcmVkIG51bWJlclxuICogeDogcHJvcDxudW1iZXIgfCB1bmRlZmluZWQ+KCkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aGljaCBkZWZhdWx0cyB0byB1bmRlZmluZWRcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFZhbHVlIFZhbHVlIHR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcDxUVmFsdWU+KCk6IE1heWJlT3B0aW9uYWxNb2RlbFByb3A8VFZhbHVlPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gcHJvcChkZWY/OiBhbnkpOiBBbnlNb2RlbFByb3Age1xuICBsZXQgaGFzRGVmYXVsdFZhbHVlID0gZmFsc2VcblxuICAvLyBkZWZhdWx0XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDEpIHtcbiAgICBoYXNEZWZhdWx0VmFsdWUgPSB0cnVlXG4gIH1cblxuICBjb25zdCBpc0RlZkZuID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiXG5cbiAgY29uc3Qgb2JqOiBBbnlNb2RlbFByb3AgPSB7XG4gICAgX2ludGVybmFsOiB7XG4gICAgICAkdmFsdWVUeXBlOiBudWxsIGFzIGFueSxcbiAgICAgICRjcmVhdGlvblZhbHVlVHlwZTogbnVsbCBhcyBhbnksXG4gICAgICAkdHJhbnNmb3JtZWRWYWx1ZVR5cGU6IG51bGwgYXMgYW55LFxuICAgICAgJHRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVR5cGU6IG51bGwgYXMgYW55LFxuICAgICAgJGlzUmVxdWlyZWQ6IG51bGwgYXMgbmV2ZXIsXG4gICAgICAkaXNJZDogbnVsbCBhcyBuZXZlcixcbiAgICAgICRoYXNTZXR0ZXI6IG51bGwgYXMgbmV2ZXIsXG4gICAgICAkZnJvbVNuYXBzaG90T3ZlcnJpZGU6IG51bGwgYXMgbmV2ZXIsXG4gICAgICAkdG9TbmFwc2hvdE92ZXJyaWRlOiBudWxsIGFzIG5ldmVyLFxuXG4gICAgICBkZWZhdWx0Rm46IGhhc0RlZmF1bHRWYWx1ZSAmJiBpc0RlZkZuID8gZGVmIDogbm9EZWZhdWx0VmFsdWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IGhhc0RlZmF1bHRWYWx1ZSAmJiAhaXNEZWZGbiA/IGRlZiA6IG5vRGVmYXVsdFZhbHVlLFxuICAgICAgdHlwZUNoZWNrZXI6IHVuZGVmaW5lZCxcbiAgICAgIHNldHRlcjogZmFsc2UsXG4gICAgICBpc0lkOiBmYWxzZSxcbiAgICAgIHRyYW5zZm9ybTogdW5kZWZpbmVkLFxuICAgICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiB1bmRlZmluZWQsXG4gICAgICB0b1NuYXBzaG90UHJvY2Vzc29yOiB1bmRlZmluZWQsXG4gICAgfSxcblxuICAgIHdpdGhTZXR0ZXIobW9kZT86IGJvb2xlYW4gfCBcImFzc2lnblwiKSB7XG4gICAgICByZXR1cm4geyAuLi50aGlzLCBfaW50ZXJuYWw6IHsgLi4udGhpcy5faW50ZXJuYWwsIHNldHRlcjogbW9kZSA/PyB0cnVlIH0gfVxuICAgIH0sXG5cbiAgICB3aXRoVHJhbnNmb3JtKHRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPHVua25vd24sIHVua25vd24+KSB7XG4gICAgICByZXR1cm4geyAuLi50aGlzLCBfaW50ZXJuYWw6IHsgLi4udGhpcy5faW50ZXJuYWwsIHRyYW5zZm9ybTogdG9GdWxsVHJhbnNmb3JtKHRyYW5zZm9ybSkgfSB9XG4gICAgfSxcblxuICAgIHdpdGhTbmFwc2hvdFByb2Nlc3Nvcih7IGZyb21TbmFwc2hvdCwgdG9TbmFwc2hvdCB9KSB7XG4gICAgICBsZXQgbmV3RnJvbVNuYXBzaG90XG5cbiAgICAgIGlmICh0aGlzLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3IgJiYgZnJvbVNuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IG9sZEZuID0gdGhpcy5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gICAgICAgIGNvbnN0IG5ld0ZuID0gZnJvbVNuYXBzaG90XG4gICAgICAgIG5ld0Zyb21TbmFwc2hvdCA9IChzbjogYW55KSA9PiBvbGRGbihuZXdGbihzbikpXG4gICAgICB9IGVsc2UgaWYgKGZyb21TbmFwc2hvdCkge1xuICAgICAgICBuZXdGcm9tU25hcHNob3QgPSBmcm9tU25hcHNob3RcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0Zyb21TbmFwc2hvdCA9IHRoaXMuX2ludGVybmFsLmZyb21TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgfVxuXG4gICAgICBsZXQgbmV3VG9TbmFwc2hvdFxuXG4gICAgICBpZiAodGhpcy5faW50ZXJuYWwudG9TbmFwc2hvdFByb2Nlc3NvciAmJiB0b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IG9sZEZuOiBhbnkgPSB0aGlzLl9pbnRlcm5hbC50b1NuYXBzaG90UHJvY2Vzc29yXG4gICAgICAgIGNvbnN0IG5ld0ZuID0gdG9TbmFwc2hvdFxuICAgICAgICBuZXdUb1NuYXBzaG90ID0gKHNuOiBhbnkpID0+IG5ld0ZuKG9sZEZuKHNuKSlcbiAgICAgIH0gZWxzZSBpZiAodG9TbmFwc2hvdCkge1xuICAgICAgICBuZXdUb1NuYXBzaG90ID0gdG9TbmFwc2hvdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VG9TbmFwc2hvdCA9IHRoaXMuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcyxcbiAgICAgICAgX2ludGVybmFsOiB7XG4gICAgICAgICAgLi4udGhpcy5faW50ZXJuYWwsXG4gICAgICAgICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiBuZXdGcm9tU25hcHNob3QsXG4gICAgICAgICAgdG9TbmFwc2hvdFByb2Nlc3NvcjogbmV3VG9TbmFwc2hvdCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5sZXQgY2FjaGVUcmFuc2Zvcm1SZXN1bHQgPSBmYWxzZVxuY29uc3QgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlRm4gPSAoKSA9PiB7XG4gIGNhY2hlVHJhbnNmb3JtUmVzdWx0ID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiB0b0Z1bGxUcmFuc2Zvcm0odHJhbnNmb3JtT2JqZWN0OiBNb2RlbFByb3BUcmFuc2Zvcm08dW5rbm93biwgdW5rbm93bj4pIHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcDxcbiAgICBvYmplY3QsXG4gICAgTWFwPFByb3BlcnR5S2V5LCB7IG9yaWdpbmFsVmFsdWU6IHVua25vd247IHRyYW5zZm9ybWVkVmFsdWU6IHVua25vd24gfT5cbiAgPigpXG5cbiAgY29uc3QgdHJhbnNmb3JtID0gKHBhcmFtczoge1xuICAgIG9yaWdpbmFsVmFsdWU6IHVua25vd25cbiAgICBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiB1bmtub3duXG4gICAgc2V0T3JpZ2luYWxWYWx1ZShuZXdPcmlnaW5hbFZhbHVlOiB1bmtub3duKTogdm9pZFxuICB9KSA9PiAocGFyYW1zLm9yaWdpbmFsVmFsdWUgPT0gbnVsbCA/IHBhcmFtcy5vcmlnaW5hbFZhbHVlIDogdHJhbnNmb3JtT2JqZWN0LnRyYW5zZm9ybShwYXJhbXMpKVxuXG4gIGNvbnN0IHVudHJhbnNmb3JtID0gKHBhcmFtczogeyB0cmFuc2Zvcm1lZFZhbHVlOiB1bmtub3duOyBjYWNoZVRyYW5zZm9ybWVkVmFsdWUoKTogdm9pZCB9KSA9PlxuICAgIHBhcmFtcy50cmFuc2Zvcm1lZFZhbHVlID09IG51bGwgPyBwYXJhbXMudHJhbnNmb3JtZWRWYWx1ZSA6IHRyYW5zZm9ybU9iamVjdC51bnRyYW5zZm9ybShwYXJhbXMpXG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2Zvcm0oXG4gICAgICBvcmlnaW5hbFZhbHVlOiB1bmtub3duLFxuICAgICAgbW9kZWw6IG9iamVjdCxcbiAgICAgIHByb3BOYW1lOiBQcm9wZXJ0eUtleSxcbiAgICAgIHNldE9yaWdpbmFsVmFsdWU6IChuZXdPcmlnaW5hbFZhbHVlOiB1bmtub3duKSA9PiB2b2lkXG4gICAgKSB7XG4gICAgICBjb25zdCBtb2RlbENhY2hlID0gZ2V0T3JDcmVhdGUoY2FjaGUsIG1vZGVsLCAoKSA9PiBuZXcgTWFwKCkpXG5cbiAgICAgIGxldCBwcm9wQ2FjaGUgPSBtb2RlbENhY2hlLmdldChwcm9wTmFtZSlcbiAgICAgIGlmIChwcm9wQ2FjaGU/Lm9yaWdpbmFsVmFsdWUgIT09IG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgLy8gb3JpZ2luYWwgY2hhbmdlZCwgaW52YWxpZGF0ZSBjYWNoZVxuICAgICAgICBtb2RlbENhY2hlLmRlbGV0ZShwcm9wTmFtZSlcbiAgICAgICAgcHJvcENhY2hlID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm0oe1xuICAgICAgICBvcmlnaW5hbFZhbHVlLFxuICAgICAgICBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiBwcm9wQ2FjaGU/LnRyYW5zZm9ybWVkVmFsdWUsXG4gICAgICAgIHNldE9yaWdpbmFsVmFsdWUsXG4gICAgICB9KVxuXG4gICAgICBtb2RlbENhY2hlLnNldChwcm9wTmFtZSwge1xuICAgICAgICBvcmlnaW5hbFZhbHVlLFxuICAgICAgICB0cmFuc2Zvcm1lZFZhbHVlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkVmFsdWVcbiAgICB9LFxuXG4gICAgdW50cmFuc2Zvcm0odHJhbnNmb3JtZWRWYWx1ZTogdW5rbm93biwgbW9kZWw6IG9iamVjdCwgcHJvcE5hbWU6IFByb3BlcnR5S2V5KSB7XG4gICAgICBjb25zdCBtb2RlbENhY2hlID0gZ2V0T3JDcmVhdGUoY2FjaGUsIG1vZGVsLCAoKSA9PiBuZXcgTWFwKCkpXG5cbiAgICAgIGNhY2hlVHJhbnNmb3JtUmVzdWx0ID0gZmFsc2VcbiAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB1bnRyYW5zZm9ybSh7XG4gICAgICAgIHRyYW5zZm9ybWVkVmFsdWUsXG4gICAgICAgIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZTogY2FjaGVUcmFuc2Zvcm1lZFZhbHVlRm4sXG4gICAgICB9KVxuICAgICAgaWYgKGNhY2hlVHJhbnNmb3JtUmVzdWx0KSB7XG4gICAgICAgIG1vZGVsQ2FjaGUuc2V0KHByb3BOYW1lLCB7IG9yaWdpbmFsVmFsdWUsIHRyYW5zZm9ybWVkVmFsdWUgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vZGVsQ2FjaGUuZGVsZXRlKHByb3BOYW1lKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxWYWx1ZVxuICAgIH0sXG4gIH1cbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSB9IGZyb20gXCIuL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB0eXBlIHsgTGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciwgVHlwZUluZm8gfSBmcm9tIFwiLi9UeXBlQ2hlY2tlclwiXG5cbi8qKlxuICogR2V0cyB0aGUgdHlwZSBpbmZvIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUeXBlIHRvIGdldCB0aGUgaW5mbyBmcm9tLlxuICogQHJldHVybnMgVGhlIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVJbmZvKHR5cGU6IEFueVR5cGUpOiBUeXBlSW5mbyB7XG4gIGNvbnN0IHN0ZFR5cGUgPSByZXNvbHZlU3RhbmRhcmRUeXBlKHR5cGUpXG4gIGNvbnN0IHR5cGVJbmZvID0gKHN0ZFR5cGUgYXMgYW55IGFzIFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyKS50eXBlSW5mb1xuICBpZiAoIXR5cGVJbmZvKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgdHlwZSBpbmZvIG5vdCBmb3VuZCBmb3IgJHt0eXBlfWApXG4gIH1cbiAgcmV0dXJuIHR5cGVJbmZvXG59XG4iLCJpbXBvcnQgeyBnZXRSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBBIHR5cGUgY2hlY2tpbmcgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlQ2hlY2tFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFR5cGVFcnJvci5cbiAgICogQHBhcmFtIHBhdGggU3ViLXBhdGggd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuXG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGVOYW1lIE5hbWUgb2YgdGhlIGV4cGVjdGVkIHR5cGUuXG4gICAqIEBwYXJhbSBhY3R1YWxWYWx1ZSBBY3R1YWwgdmFsdWUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwYXRoOiBQYXRoLCByZWFkb25seSBleHBlY3RlZFR5cGVOYW1lOiBzdHJpbmcsIHJlYWRvbmx5IGFjdHVhbFZhbHVlOiBhbnkpIHt9XG5cbiAgLyoqXG4gICAqIFRocm93cyB0aGUgdHlwZSBjaGVjayBlcnJvciBhcyBhbiBhY3R1YWwgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlQ2hlY2tlZFZhbHVlIFVzdWFsbHkgdGhlIHZhbHVlIHdoZXJlIHRoZSB0eXBlIGNoZWNrIHdhcyBpbnZva2VkLlxuICAgKi9cbiAgdGhyb3codHlwZUNoZWNrZWRWYWx1ZTogYW55KTogbmV2ZXIge1xuICAgIGxldCBtc2cgPSBcIlR5cGVDaGVja0Vycm9yOiBcIlxuICAgIGxldCByb290UGF0aDogUGF0aCA9IFtdXG4gICAgaWYgKGlzVHdlYWtlZE9iamVjdCh0eXBlQ2hlY2tlZFZhbHVlLCB0cnVlKSkge1xuICAgICAgcm9vdFBhdGggPSBnZXRSb290UGF0aCh0eXBlQ2hlY2tlZFZhbHVlKS5wYXRoXG4gICAgfVxuXG4gICAgbXNnICs9IFwiWy9cIiArIFsuLi5yb290UGF0aCwgLi4udGhpcy5wYXRoXS5qb2luKFwiL1wiKSArIFwiXSBcIlxuXG4gICAgbXNnICs9IFwiRXhwZWN0ZWQ6IFwiICsgdGhpcy5leHBlY3RlZFR5cGVOYW1lXG5cbiAgICB0aHJvdyBmYWlsdXJlKG1zZylcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFzdEdldFBhcmVudEluY2x1ZGluZ0RhdGFPYmplY3RzIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB0eXBlIHsgUGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGlzVHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgaXNBcnJheSwgaXNPYmplY3QsIGlzUHJpbWl0aXZlLCBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlIH0gZnJvbSBcIi4vc2NoZW1hc1wiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuL1R5cGVDaGVja0Vycm9yXCJcblxudHlwZSBDaGVja0Z1bmN0aW9uID0gKHZhbHVlOiBhbnksIHBhdGg6IFBhdGgpID0+IFR5cGVDaGVja0Vycm9yIHwgbnVsbFxuXG5jb25zdCBlbXB0eVBhdGg6IFBhdGggPSBbXVxuXG50eXBlIENoZWNrUmVzdWx0ID0gVHlwZUNoZWNrRXJyb3IgfCBudWxsXG50eXBlIENoZWNrUmVzdWx0Q2FjaGUgPSBXZWFrTWFwPG9iamVjdCwgQ2hlY2tSZXN1bHQ+XG5cbmNvbnN0IHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRSZXN1bHRzT2ZPYmplY3QgPSBuZXcgV2Vha01hcDxvYmplY3QsIFNldDxUeXBlQ2hlY2tlcj4+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGVudW0gVHlwZUNoZWNrZXJCYXNlVHlwZSB7XG4gIE9iamVjdCA9IFwib2JqZWN0XCIsXG4gIEFycmF5ID0gXCJhcnJheVwiLFxuICBQcmltaXRpdmUgPSBcInByaW1pdGl2ZVwiLFxuICBBbnkgPSBcImFueVwiLFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUNoZWNrZXJCYXNlVHlwZUZyb21WYWx1ZSh2YWx1ZTogYW55KTogVHlwZUNoZWNrZXJCYXNlVHlwZSB7XG4gIC8vIGFycmF5IG11c3QgYmUgYmVmb3JlIG9iamVjdCBzaW5jZSBhcnJheXMgYXJlIGFsc28gb2JqZWN0c1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHJldHVybiBUeXBlQ2hlY2tlckJhc2VUeXBlLkFycmF5XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHJldHVybiBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdFxuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSByZXR1cm4gVHlwZUNoZWNrZXJCYXNlVHlwZS5QcmltaXRpdmVcbiAgcmV0dXJuIFR5cGVDaGVja2VyQmFzZVR5cGUuQW55XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlQ2FjaGVkVHlwZUNoZWNrZXJSZXN1bHQob2JqOiBvYmplY3QpIHtcbiAgLy8gd2UgbmVlZCB0byBpbnZhbGlkYXRlIGl0IGZvciB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIHBhcmVudHNcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG9ialxuICB3aGlsZSAoY3VycmVudCkge1xuICAgIGNvbnN0IHNldCA9IHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRSZXN1bHRzT2ZPYmplY3QuZ2V0KGN1cnJlbnQpXG4gICAgaWYgKHNldCkge1xuICAgICAgZm9yIChjb25zdCB0eXBlQ2hlY2tlciBvZiBzZXQpIHtcbiAgICAgICAgdHlwZUNoZWNrZXIuaW52YWxpZGF0ZUNhY2hlZFJlc3VsdChjdXJyZW50KVxuICAgICAgfVxuICAgICAgdHlwZUNoZWNrZXJzV2l0aENhY2hlZFJlc3VsdHNPZk9iamVjdC5kZWxldGUoY3VycmVudClcbiAgICB9XG5cbiAgICBjdXJyZW50ID0gZmFzdEdldFBhcmVudEluY2x1ZGluZ0RhdGFPYmplY3RzKGN1cnJlbnQpXG4gIH1cbn1cblxuY29uc3QgdHlwZUNoZWNrZXJzV2l0aENhY2hlZFNuYXBzaG90UHJvY2Vzc29yUmVzdWx0c09mT2JqZWN0ID0gbmV3IFdlYWtNYXA8XG4gIG9iamVjdCxcbiAgU2V0PFR5cGVDaGVja2VyPlxuPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlQ2FjaGVkVG9TbmFwc2hvdFByb2Nlc3NvclJlc3VsdChvYmo6IG9iamVjdCkge1xuICBjb25zdCBzZXQgPSB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkU25hcHNob3RQcm9jZXNzb3JSZXN1bHRzT2ZPYmplY3QuZ2V0KG9iailcblxuICBpZiAoc2V0KSB7XG4gICAgc2V0LmZvckVhY2goKHR5cGVDaGVja2VyKSA9PiB0eXBlQ2hlY2tlci5pbnZhbGlkYXRlU25hcHNob3RQcm9jZXNzb3JDYWNoZWRSZXN1bHQob2JqKSlcbiAgICB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkU25hcHNob3RQcm9jZXNzb3JSZXN1bHRzT2ZPYmplY3QuZGVsZXRlKG9iailcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgVHlwZUNoZWNrZXIge1xuICBwcml2YXRlIGNoZWNrUmVzdWx0Q2FjaGU/OiBDaGVja1Jlc3VsdENhY2hlXG5cbiAgdW5jaGVja2VkOiBib29sZWFuXG5cbiAgcHJpdmF0ZSBjcmVhdGVDYWNoZUlmTmVlZGVkKCk6IENoZWNrUmVzdWx0Q2FjaGUge1xuICAgIGlmICghdGhpcy5jaGVja1Jlc3VsdENhY2hlKSB7XG4gICAgICB0aGlzLmNoZWNrUmVzdWx0Q2FjaGUgPSBuZXcgV2Vha01hcCgpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzdWx0Q2FjaGVcbiAgfVxuXG4gIHNldENhY2hlZFJlc3VsdChvYmo6IG9iamVjdCwgbmV3Q2FjaGVWYWx1ZTogQ2hlY2tSZXN1bHQpIHtcbiAgICB0aGlzLmNyZWF0ZUNhY2hlSWZOZWVkZWQoKS5zZXQob2JqLCBuZXdDYWNoZVZhbHVlKVxuXG4gICAgLy8gcmVnaXN0ZXIgdGhpcyB0eXBlIGNoZWNrZXIgYXMgbGlzdGVuZXIgb2YgdGhhdCBvYmplY3QgY2hhbmdlc1xuICAgIGNvbnN0IHR5cGVDaGVja2VyU2V0ID0gZ2V0T3JDcmVhdGUodHlwZUNoZWNrZXJzV2l0aENhY2hlZFJlc3VsdHNPZk9iamVjdCwgb2JqLCAoKSA9PiBuZXcgU2V0KCkpXG5cbiAgICB0eXBlQ2hlY2tlclNldC5hZGQodGhpcylcbiAgfVxuXG4gIGludmFsaWRhdGVDYWNoZWRSZXN1bHQob2JqOiBvYmplY3QpIHtcbiAgICB0aGlzLmNoZWNrUmVzdWx0Q2FjaGU/LmRlbGV0ZShvYmopXG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlZFJlc3VsdChvYmo6IG9iamVjdCk6IENoZWNrUmVzdWx0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja1Jlc3VsdENhY2hlPy5nZXQob2JqKVxuICB9XG5cbiAgY2hlY2sodmFsdWU6IGFueSwgcGF0aDogUGF0aCk6IFR5cGVDaGVja0Vycm9yIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMudW5jaGVja2VkKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmICghaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCB0cnVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrISh2YWx1ZSwgcGF0aClcbiAgICB9XG5cbiAgICAvLyBvcHRpbWl6ZWQgY2hlY2tpbmcgd2l0aCBjYWNoZWQgdmFsdWVzXG5cbiAgICBsZXQgY2FjaGVkUmVzdWx0ID0gdGhpcy5nZXRDYWNoZWRSZXN1bHQodmFsdWUpXG5cbiAgICBpZiAoY2FjaGVkUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHdlIHNldCB0aGUgcGF0aCBlbXB0eSBzaW5jZSB0aGUgcmVzdWx0IGNvdWxkIGJlIHVzZWQgZm9yIHBhdGhzIG90aGVyIHRoYW4gdGhpcyBiYXNlXG4gICAgICBjYWNoZWRSZXN1bHQgPSB0aGlzLl9jaGVjayEodmFsdWUsIGVtcHR5UGF0aClcbiAgICAgIHRoaXMuc2V0Q2FjaGVkUmVzdWx0KHZhbHVlLCBjYWNoZWRSZXN1bHQpXG4gICAgfVxuXG4gICAgaWYgKGNhY2hlZFJlc3VsdCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihcbiAgICAgICAgWy4uLnBhdGgsIC4uLmNhY2hlZFJlc3VsdC5wYXRoXSxcbiAgICAgICAgY2FjaGVkUmVzdWx0LmV4cGVjdGVkVHlwZU5hbWUsXG4gICAgICAgIGNhY2hlZFJlc3VsdC5hY3R1YWxWYWx1ZVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhY2hlZFR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlblxuXG4gIGdldCB0eXBlSW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkVHlwZUluZm9HZW4odGhpcyBhcyBhbnkpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBiYXNlVHlwZTogVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGVjazogQ2hlY2tGdW5jdGlvbiB8IG51bGwsXG4gICAgcmVhZG9ubHkgZ2V0VHlwZU5hbWU6ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+IHN0cmluZyxcbiAgICByZWFkb25seSB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4sXG4gICAgcmVhZG9ubHkgc25hcHNob3RUeXBlOiAoc246IHVua25vd24pID0+IFR5cGVDaGVja2VyIHwgbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mcm9tU25hcHNob3RQcm9jZXNzb3I6IChzbjogYW55KSA9PiB1bmtub3duLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RvU25hcHNob3RQcm9jZXNzb3I6IChzbjogYW55KSA9PiB1bmtub3duXG4gICkge1xuICAgIHRoaXMudW5jaGVja2VkID0gIV9jaGVja1xuICAgIHRoaXMuX2NhY2hlZFR5cGVJbmZvR2VuID0gbGF6eSh0eXBlSW5mb0dlbilcbiAgfVxuXG4gIGZyb21TbmFwc2hvdFByb2Nlc3NvciA9IChzbjogYW55KTogdW5rbm93biA9PiB7XG4gICAgLy8gd2UgY2Fubm90IGNhY2hlIGZyb21TbmFwc2hvdFByb2Nlc3NvciBzaW5jZSBub2JvZHkgZW5zdXJlcyB1c1xuICAgIC8vIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCB3b24ndCBiZSB0d2Vha2VkIGFmdGVyIHVzZVxuICAgIHJldHVybiB0aGlzLl9mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF90b1NuYXBzaG90UHJvY2Vzc29yQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHVua25vd24+KClcblxuICBpbnZhbGlkYXRlU25hcHNob3RQcm9jZXNzb3JDYWNoZWRSZXN1bHQob2JqOiBvYmplY3QpIHtcbiAgICB0aGlzLl90b1NuYXBzaG90UHJvY2Vzc29yQ2FjaGUuZGVsZXRlKG9iailcbiAgfVxuXG4gIHRvU25hcHNob3RQcm9jZXNzb3IgPSAoc246IGFueSk6IHVua25vd24gPT4ge1xuICAgIGlmICh0eXBlb2Ygc24gIT09IFwib2JqZWN0XCIgfHwgc24gPT09IG51bGwpIHtcbiAgICAgIC8vIG5vdCBjYWNoZWFibGVcbiAgICAgIHJldHVybiB0aGlzLl90b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl90b1NuYXBzaG90UHJvY2Vzc29yQ2FjaGUuaGFzKHNuKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZS5nZXQoc24pXG4gICAgfVxuXG4gICAgY29uc3QgdmFsID0gdGhpcy5fdG9TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICB0aGlzLl90b1NuYXBzaG90UHJvY2Vzc29yQ2FjaGUuc2V0KHNuLCB2YWwpXG5cbiAgICAvLyByZWdpc3RlciB0aGlzIHR5cGUgY2hlY2tlciBhcyBsaXN0ZW5lciBvZiB0aGF0IHNuIGNoYW5nZXNcbiAgICBjb25zdCB0eXBlQ2hlY2tlclNldCA9IGdldE9yQ3JlYXRlKFxuICAgICAgdHlwZUNoZWNrZXJzV2l0aENhY2hlZFNuYXBzaG90UHJvY2Vzc29yUmVzdWx0c09mT2JqZWN0LFxuICAgICAgc24sXG4gICAgICAoKSA9PiBuZXcgU2V0KClcbiAgICApXG5cbiAgICB0eXBlQ2hlY2tlclNldC5hZGQodGhpcylcblxuICAgIHJldHVybiB2YWxcbiAgfVxufVxuXG5jb25zdCBsYXRlVHlwZUNoZWNrZXJTeW1ib2wgPSBTeW1ib2woXCJsYXRlVHlwZUNoZWtlclwiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhdGVUeXBlQ2hlY2tlciB7XG4gIFtsYXRlVHlwZUNoZWNrZXJTeW1ib2xdOiB0cnVlXG4gICgpOiBUeXBlQ2hlY2tlclxuICB0eXBlSW5mbzogVHlwZUluZm9cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdGVUeXBlQ2hlY2tlcihmbjogKCkgPT4gVHlwZUNoZWNrZXIsIHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbik6IExhdGVUeXBlQ2hlY2tlciB7XG4gIGxldCBjYWNoZWQ6IFR5cGVDaGVja2VyIHwgdW5kZWZpbmVkXG4gIGNvbnN0IGx0YyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkXG4gICAgfVxuXG4gICAgY2FjaGVkID0gZm4oKVxuICAgIHJldHVybiBjYWNoZWRcbiAgfVxuICA7KGx0YyBhcyBMYXRlVHlwZUNoZWNrZXIpW2xhdGVUeXBlQ2hlY2tlclN5bWJvbF0gPSB0cnVlXG5cbiAgY29uc3QgY2FjaGVkVHlwZUluZm9HZW4gPSBsYXp5KHR5cGVJbmZvR2VuKVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsdGMsIFwidHlwZUluZm9cIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjYWNoZWRUeXBlSW5mb0dlbihsdGMgYXMgYW55KVxuICAgIH0sXG4gIH0pXG5cbiAgcmV0dXJuIGx0YyBhcyBMYXRlVHlwZUNoZWNrZXJcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGF0ZVR5cGVDaGVja2VyKGx0YzogdW5rbm93bik6IGx0YyBpcyBMYXRlVHlwZUNoZWNrZXIge1xuICByZXR1cm4gdHlwZW9mIGx0YyA9PT0gXCJmdW5jdGlvblwiICYmIGxhdGVUeXBlQ2hlY2tlclN5bWJvbCBpbiBsdGNcbn1cblxuLyoqXG4gKiBUeXBlIGluZm8gYmFzZSBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVJbmZvIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgdGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSkge31cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgVHlwZUluZm9HZW4gPSAodDogQW55U3RhbmRhcmRUeXBlKSA9PiBUeXBlSW5mb1xuIiwiaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsUHJvcHNJbmZvXCJcbmltcG9ydCB7IG5vRGVmYXVsdFZhbHVlIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgaXNPYmplY3QsIGxhenkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHsgcmVnaXN0ZXJTdGFuZGFyZFR5cGVSZXNvbHZlciwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgTW9kZWxUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuXG5jb25zdCBjYWNoZWRNb2RlbFR5cGVDaGVja2VyID0gbmV3IFdlYWtNYXA8TW9kZWxDbGFzczxBbnlNb2RlbD4sIFR5cGVDaGVja2VyPigpXG5cbnR5cGUgX0NsYXNzPFQ+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxudHlwZSBfQ2xhc3NPck9iamVjdDxNLCBLPiA9IEsgZXh0ZW5kcyBNID8gb2JqZWN0IDogX0NsYXNzPEs+IHwgKCgpID0+IF9DbGFzczxLPilcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgbW9kZWwuIFRoZSB0eXBlIHJlZmVyZW5jZWQgaW4gdGhlIG1vZGVsIGRlY29yYXRvciB3aWxsIGJlIHVzZWQgZm9yIHR5cGUgY2hlY2tpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBzb21lTW9kZWxUeXBlID0gdHlwZXMubW9kZWwoU29tZU1vZGVsKVxuICogLy8gb3IgZm9yIHJlY3Vyc2l2ZSBtb2RlbHNcbiAqIGNvbnN0IHNvbWVNb2RlbFR5cGUgPSB0eXBlcy5tb2RlbDxTb21lTW9kZWw+KCgpID0+IFNvbWVNb2RlbClcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gTSBNb2RlbCB0eXBlLlxuICogQHBhcmFtIG1vZGVsQ2xhc3MgTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNNb2RlbDxNID0gbmV2ZXIsIEsgPSBNPihtb2RlbENsYXNzOiBfQ2xhc3NPck9iamVjdDxNLCBLPik6IE1vZGVsVHlwZTxLPiB7XG4gIC8vIGlmIHdlIHR5cGUgaXQgYW55IHN0cm9uZ2VyIHRoZW4gcmVjdXJzaXZlIGRlZnMgYW5kIHNvIG9uIHN0b3Agd29ya2luZ1xuXG4gIGlmICghaXNNb2RlbENsYXNzKG1vZGVsQ2xhc3MpICYmIHR5cGVvZiBtb2RlbENsYXNzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyByZXNvbHZlIGxhdGVyXG4gICAgY29uc3QgbW9kZWxDbGFzc0ZuID0gbW9kZWxDbGFzcyBhcyAoKSA9PiBNb2RlbENsYXNzPEFueU1vZGVsPlxuICAgIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgTW9kZWxUeXBlSW5mbyh0LCBtb2RlbENsYXNzRm4oKSlcbiAgICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHR5cGVzTW9kZWwobW9kZWxDbGFzc0ZuKCkpIGFzIGFueSwgdHlwZUluZm9HZW4pIGFzIGFueVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1vZGVsQ2xheno6IE1vZGVsQ2xhc3M8QW55TW9kZWw+ID0gbW9kZWxDbGFzcyBhcyBhbnlcblxuICAgIGNvbnN0IGNhY2hlZFR5cGVDaGVja2VyID0gY2FjaGVkTW9kZWxUeXBlQ2hlY2tlci5nZXQobW9kZWxDbGF6eilcbiAgICBpZiAoY2FjaGVkVHlwZUNoZWNrZXIpIHtcbiAgICAgIHJldHVybiBjYWNoZWRUeXBlQ2hlY2tlciBhcyBhbnlcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IE1vZGVsVHlwZUluZm8odCwgbW9kZWxDbGF6eilcblxuICAgIGNvbnN0IHRjID0gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhenopIVxuICAgICAgY29uc3QgdHlwZU5hbWUgPSBgTW9kZWwoJHttb2RlbEluZm8ubmFtZX0pYFxuXG4gICAgICBjb25zdCBkYXRhVHlwZUNoZWNrZXIgPSBnZXRNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhenopLmRhdGFUeXBlXG4gICAgICBjb25zdCByZXNvbHZlZERhdGFUeXBlQ2hlY2tlciA9IGRhdGFUeXBlQ2hlY2tlclxuICAgICAgICA/IHJlc29sdmVUeXBlQ2hlY2tlcihkYXRhVHlwZUNoZWNrZXIpXG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LFxuXG4gICAgICAgICh2YWx1ZSwgcGF0aCkgPT4ge1xuICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgbW9kZWxDbGF6eikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgdHlwZU5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZlZERhdGFUeXBlQ2hlY2tlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLmNoZWNrKHZhbHVlLiQsIHBhdGgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4gdHlwZU5hbWUsXG4gICAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZVttb2RlbFR5cGVLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGZhc3QgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVttb2RlbFR5cGVLZXldID09PSBtb2RlbEluZm8ubmFtZSA/IHRoaXNUYyA6IG51bGxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5zbmFwc2hvdFR5cGUodmFsdWUpID8gdGhpc1RjIDogbnVsbFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG5vdCBlbm91Z2ggaW5mbyB0byBiZSBhYmxlIHRvIHRlbGxcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuXG4gICAgICAgIChzbikgPT4ge1xuICAgICAgICAgIGlmIChzblttb2RlbFR5cGVLZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gc25cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uc24sXG4gICAgICAgICAgICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgKHNuKSA9PiBzblxuICAgICAgKVxuXG4gICAgICByZXR1cm4gdGhpc1RjXG4gICAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxuXG4gICAgY2FjaGVkTW9kZWxUeXBlQ2hlY2tlci5zZXQobW9kZWxDbGF6eiwgdGMpXG5cbiAgICByZXR1cm4gdGMgYXMgYW55XG4gIH1cbn1cblxuLyoqXG4gKiBgdHlwZXMubW9kZWxgIHR5cGUgaW5mbyBmb3IgYSBtb2RlbCBwcm9wcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFR5cGVJbmZvUHJvcHMge1xuICByZWFkb25seSBbcHJvcE5hbWU6IHN0cmluZ106IFJlYWRvbmx5PHtcbiAgICB0eXBlOiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWRcbiAgICB0eXBlSW5mbzogVHlwZUluZm8gfCB1bmRlZmluZWRcbiAgICBoYXNEZWZhdWx0OiBib29sZWFuXG4gICAgZGVmYXVsdDogYW55XG4gIH0+XG59XG5cbi8qKlxuICogYHR5cGVzLm1vZGVsYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICBwcml2YXRlIF9wcm9wcyA9IGxhenkoKCkgPT4ge1xuICAgIGNvbnN0IG9ialNjaGVtYSA9IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyh0aGlzLm1vZGVsQ2xhc3MpXG5cbiAgICBjb25zdCBwcm9wVHlwZXM6IE8uV3JpdGFibGU8TW9kZWxUeXBlSW5mb1Byb3BzPiA9IHt9XG4gICAgT2JqZWN0LmtleXMob2JqU2NoZW1hKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcHJvcERhdGEgPSBvYmpTY2hlbWFbcHJvcE5hbWVdXG5cbiAgICAgIGNvbnN0IHR5cGUgPSBwcm9wRGF0YS5faW50ZXJuYWwudHlwZUNoZWNrZXIgYXMgYW55IGFzIEFueVN0YW5kYXJkVHlwZVxuXG4gICAgICBsZXQgdHlwZUluZm86IFR5cGVJbmZvIHwgdW5kZWZpbmVkXG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICB0eXBlSW5mbyA9IGdldFR5cGVJbmZvKHR5cGUpXG4gICAgICB9XG5cbiAgICAgIGxldCBoYXNEZWZhdWx0ID0gZmFsc2VcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueVxuICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm5cbiAgICAgICAgaGFzRGVmYXVsdCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZSAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZVxuICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBwcm9wVHlwZXNbcHJvcE5hbWVdID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICB0eXBlSW5mbyxcbiAgICAgICAgaGFzRGVmYXVsdCxcbiAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlLFxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHByb3BUeXBlc1xuICB9KVxuXG4gIGdldCBwcm9wcygpOiBNb2RlbFR5cGVJbmZvUHJvcHMge1xuICAgIHJldHVybiB0aGlzLl9wcm9wcygpXG4gIH1cblxuICBnZXQgbW9kZWxUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQodGhpcy5tb2RlbENsYXNzKSFcbiAgICByZXR1cm4gbW9kZWxJbmZvLm5hbWVcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55TW9kZWw+KSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kZWxTdGFuZGFyZFR5cGVSZXNvbHZlcigpIHtcbiAgcmVnaXN0ZXJTdGFuZGFyZFR5cGVSZXNvbHZlcigodikgPT4gKGlzTW9kZWxDbGFzcyh2KSA/IHR5cGVzTW9kZWwodikgOiB1bmRlZmluZWQpKVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0SXNQcmltaXRpdmUsIGlkZW50aXR5Rm4gfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQcmltaXRpdmVWYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy90eXBlc1wiXG5pbXBvcnQgeyByZWdpc3RlclN0YW5kYXJkVHlwZVJlc29sdmVyLCBTdGFuZGFyZFR5cGVSZXNvbHZlckZuIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgSWRlbnRpdHlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHsgVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyQmFzZVR5cGUsIFR5cGVJbmZvLCBUeXBlSW5mb0dlbiB9IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5cbmNvbnN0IHN0YW5kYXJkVHlwZVJlc29sdmVyczogU3RhbmRhcmRUeXBlUmVzb2x2ZXJGbltdID0gW11cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgY2VydGFpbiB2YWx1ZSBvZiBhIHByaW1pdGl2ZSAoZm9yIGV4YW1wbGUgYW4gKmV4YWN0KiBudW1iZXIgb3Igc3RyaW5nKS5cbiAqXG4gKiBFeGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgaGlUeXBlID0gdHlwZXMubGl0ZXJhbChcImhpXCIpIC8vIHRoZSBzdHJpbmcgd2l0aCB2YWx1ZSBcImhpXCJcbiAqIGNvbnN0IG51bWJlcjVUeXBlID0gdHlwZXMubGl0ZXJhbCg1KSAvLyB0aGUgbnVtYmVyIHdpdGggdmFsdWUgNVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIExpdGVyYWwgdmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBsaXRlcmFsIExpdGVyYWwgdmFsdWUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNMaXRlcmFsPFQgZXh0ZW5kcyBQcmltaXRpdmVWYWx1ZT4obGl0ZXJhbDogVCk6IElkZW50aXR5VHlwZTxUPiB7XG4gIGFzc2VydElzUHJpbWl0aXZlKGxpdGVyYWwsIFwibGl0ZXJhbFwiKVxuICBsZXQgdHlwZU5hbWU6IHN0cmluZ1xuICBzd2l0Y2ggKGxpdGVyYWwpIHtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHR5cGVOYW1lID0gXCJ1bmRlZmluZWRcIlxuICAgICAgYnJlYWtcbiAgICBjYXNlIG51bGw6XG4gICAgICB0eXBlTmFtZSA9IFwibnVsbFwiXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0eXBlTmFtZSA9IEpTT04uc3RyaW5naWZ5KGxpdGVyYWwpXG4gICAgICBicmVha1xuICB9XG5cbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBMaXRlcmFsVHlwZUluZm8odCwgbGl0ZXJhbClcblxuICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuUHJpbWl0aXZlLFxuXG4gICAgKHZhbHVlLCBwYXRoKSA9PiAodmFsdWUgPT09IGxpdGVyYWwgPyBudWxsIDogbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIHR5cGVOYW1lLCB2YWx1ZSkpLFxuXG4gICAgKCkgPT4gdHlwZU5hbWUsXG4gICAgdHlwZUluZm9HZW4sXG5cbiAgICAodmFsdWUpID0+ICh2YWx1ZSA9PT0gbGl0ZXJhbCA/IHRoaXNUYyA6IG51bGwpLFxuICAgIGlkZW50aXR5Rm4sXG4gICAgaWRlbnRpdHlGblxuICApXG5cbiAgcmV0dXJuIHRoaXNUYyBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMubGl0ZXJhbGAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgTGl0ZXJhbFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBsaXRlcmFsOiBQcmltaXRpdmVWYWx1ZSkge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgdW5kZWZpbmVkLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMubGl0ZXJhbCh1bmRlZmluZWQpYC5cbiAqXG4gKiBgYGB0c1xuICogdHlwZXMudW5kZWZpbmVkXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVzVW5kZWZpbmVkID0gdHlwZXNMaXRlcmFsKHVuZGVmaW5lZClcblxuc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLnB1c2goKHYpID0+ICh2ID09PSB1bmRlZmluZWQgPyB0eXBlc1VuZGVmaW5lZCA6IHVuZGVmaW5lZCkpXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgbnVsbC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLmxpdGVyYWwobnVsbClgLlxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy5udWxsXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVzTnVsbCA9IHR5cGVzTGl0ZXJhbChudWxsKVxuXG5zdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaCgodikgPT4gKHYgPT09IG51bGwgPyB0eXBlc051bGwgOiB1bmRlZmluZWQpKVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW55IGJvb2xlYW4gdmFsdWUuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLmJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNCb29sZWFuOiBJZGVudGl0eVR5cGU8Ym9vbGVhbj4gPSBuZXcgVHlwZUNoZWNrZXIoXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUuUHJpbWl0aXZlLFxuXG4gICh2YWx1ZSwgcGF0aCkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgPyBudWxsIDogbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIFwiYm9vbGVhblwiLCB2YWx1ZSkpLFxuXG4gICgpID0+IFwiYm9vbGVhblwiLFxuICAodCkgPT4gbmV3IEJvb2xlYW5UeXBlSW5mbyh0KSxcblxuICAodmFsdWUpID0+ICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gKHR5cGVzQm9vbGVhbiBhcyBhbnkpIDogbnVsbCksXG4gIGlkZW50aXR5Rm4sXG4gIGlkZW50aXR5Rm5cbikgYXMgYW55XG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gQm9vbGVhbiA/IHR5cGVzQm9vbGVhbiA6IHVuZGVmaW5lZCkpXG5cbi8qKlxuICogYHR5cGVzLmJvb2xlYW5gIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvb2xlYW5UeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHt9XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbnkgbnVtYmVyIHZhbHVlLlxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy5udW1iZXJcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNOdW1iZXI6IElkZW50aXR5VHlwZTxudW1iZXI+ID0gbmV3IFR5cGVDaGVja2VyKFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLlByaW1pdGl2ZSxcblxuICAodmFsdWUsIHBhdGgpID0+ICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyBudWxsIDogbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIFwibnVtYmVyXCIsIHZhbHVlKSksXG5cbiAgKCkgPT4gXCJudW1iZXJcIixcbiAgKHQpID0+IG5ldyBOdW1iZXJUeXBlSW5mbyh0KSxcblxuICAodmFsdWUpID0+ICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyAodHlwZXNOdW1iZXIgYXMgYW55KSA6IG51bGwpLFxuICBpZGVudGl0eUZuLFxuICBpZGVudGl0eUZuXG4pIGFzIGFueVxuXG5zdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaCgodikgPT4gKHYgPT09IE51bWJlciA/IHR5cGVzTnVtYmVyIDogdW5kZWZpbmVkKSlcblxuLyoqXG4gKiBgdHlwZXMubnVtYmVyYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1iZXJUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHt9XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbnkgc3RyaW5nIHZhbHVlLlxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy5zdHJpbmdcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNTdHJpbmc6IElkZW50aXR5VHlwZTxzdHJpbmc+ID0gbmV3IFR5cGVDaGVja2VyKFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLlByaW1pdGl2ZSxcblxuICAodmFsdWUsIHBhdGgpID0+ICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBudWxsIDogbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIFwic3RyaW5nXCIsIHZhbHVlKSksXG5cbiAgKCkgPT4gXCJzdHJpbmdcIixcbiAgKHQpID0+IG5ldyBTdHJpbmdUeXBlSW5mbyh0KSxcblxuICAodmFsdWUpID0+ICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyAodHlwZXNTdHJpbmcgYXMgYW55KSA6IG51bGwpLFxuICBpZGVudGl0eUZuLFxuICBpZGVudGl0eUZuXG4pIGFzIGFueVxuXG5zdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaCgodikgPT4gKHYgPT09IFN0cmluZyA/IHR5cGVzU3RyaW5nIDogdW5kZWZpbmVkKSlcblxuLyoqXG4gKiBgdHlwZXMuc3RyaW5nYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHt9XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclByaW1pdGl2ZVN0YW5kYXJkVHlwZVJlc29sdmVycygpIHtcbiAgc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLmZvckVhY2goKHN0cikgPT4ge1xuICAgIHJlZ2lzdGVyU3RhbmRhcmRUeXBlUmVzb2x2ZXIoc3RyKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJNb2RlbFN0YW5kYXJkVHlwZVJlc29sdmVyIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNNb2RlbFwiXG5pbXBvcnQgeyByZWdpc3RlclByaW1pdGl2ZVN0YW5kYXJkVHlwZVJlc29sdmVycyB9IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcblxubGV0IGRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVycygpIHtcbiAgaWYgKGRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgcmVnaXN0ZXJNb2RlbFN0YW5kYXJkVHlwZVJlc29sdmVyKClcbiAgcmVnaXN0ZXJQcmltaXRpdmVTdGFuZGFyZFR5cGVSZXNvbHZlcnMoKVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyByZWdpc3RlckRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnMgfSBmcm9tIFwiLi9yZWdpc3RlckRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnNcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB7IGlzTGF0ZVR5cGVDaGVja2VyLCBMYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyIH0gZnJvbSBcIi4vVHlwZUNoZWNrZXJcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBTdGFuZGFyZFR5cGVSZXNvbHZlckZuID0gKHZhbHVlOiBhbnkpID0+IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZFxuXG5jb25zdCBzdGFuZGFyZFR5cGVSZXNvbHZlcnM6IFN0YW5kYXJkVHlwZVJlc29sdmVyRm5bXSA9IFtdXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclN0YW5kYXJkVHlwZVJlc29sdmVyKHJlc29sdmVyRm46IFN0YW5kYXJkVHlwZVJlc29sdmVyRm4pIHtcbiAgc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLnB1c2gocmVzb2x2ZXJGbilcbn1cblxuZnVuY3Rpb24gZmluZFN0YW5kYXJkVHlwZSh2YWx1ZTogYW55KTogQW55U3RhbmRhcmRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgcmVnaXN0ZXJEZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzKClcblxuICBmb3IgKGNvbnN0IHJlc29sdmVyRm4gb2Ygc3RhbmRhcmRUeXBlUmVzb2x2ZXJzKSB7XG4gICAgY29uc3QgdGMgPSByZXNvbHZlckZuKHZhbHVlKVxuICAgIGlmICh0YykgcmV0dXJuIHRjXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVR5cGVDaGVja2VyKHY6IEFueVR5cGUgfCBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlcik6IFR5cGVDaGVja2VyIHtcbiAgbGV0IG5leHQ6IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyID0gdiBhcyBhbnlcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFR5cGVDaGVja2VyKSB7XG4gICAgICByZXR1cm4gbmV4dFxuICAgIH0gZWxzZSBpZiAoaXNMYXRlVHlwZUNoZWNrZXIobmV4dCkpIHtcbiAgICAgIG5leHQgPSBuZXh0KClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGMgPSBmaW5kU3RhbmRhcmRUeXBlKHYpXG4gICAgICBpZiAodGMpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVUeXBlQ2hlY2tlcih0YylcbiAgICAgIH1cbiAgICAgIHRocm93IGZhaWx1cmUoXCJ0eXBlIGNoZWNrZXIgY291bGQgbm90IGJlIHJlc29sdmVkXCIpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3RhbmRhcmRUeXBlTm9UaHJvdyhcbiAgdjogQW55VHlwZSB8IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyXG4pOiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWQge1xuICBpZiAodiBpbnN0YW5jZW9mIFR5cGVDaGVja2VyIHx8IGlzTGF0ZVR5cGVDaGVja2VyKHYpKSB7XG4gICAgcmV0dXJuIHYgYXMgYW55XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGMgPSBmaW5kU3RhbmRhcmRUeXBlKHYpXG4gICAgaWYgKHRjKSB7XG4gICAgICByZXR1cm4gdGNcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3RhbmRhcmRUeXBlKHY6IEFueVR5cGUgfCBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlcik6IEFueVN0YW5kYXJkVHlwZSB7XG4gIGNvbnN0IHRjID0gcmVzb2x2ZVN0YW5kYXJkVHlwZU5vVGhyb3codilcbiAgaWYgKHRjKSB7XG4gICAgcmV0dXJuIHRjXG4gIH1cbiAgdGhyb3cgZmFpbHVyZShcInN0YW5kYXJkIHR5cGUgY291bGQgbm90IGJlIHJlc29sdmVkXCIpXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNyZWF0ZUF0b20sIElBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGgsIFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgaW52YWxpZGF0ZUNhY2hlZFRvU25hcHNob3RQcm9jZXNzb3JSZXN1bHQgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgUHJpbWl0aXZlVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvdHlwZXNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBTbmFwc2hvdFRyYW5zZm9ybUZuID0gKHNuOiB1bmtub3duKSA9PiB1bmtub3duXG5cbmludGVyZmFjZSBTbmFwc2hvdERhdGEge1xuICB1bnRyYW5zZm9ybWVkOiBhbnlcbiAgcmVhZG9ubHkgdHJhbnNmb3JtRm46IFNuYXBzaG90VHJhbnNmb3JtRm4gfCB1bmRlZmluZWRcbiAgdHJhbnNmb3JtZWQ6IGFueVxuICByZWFkb25seSBhdG9tOiBJQXRvbVxufVxuXG5jb25zdCBzbmFwc2hvdHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFNuYXBzaG90RGF0YT4oKVxuXG4vLyB0cnVlIGlmIGl0IGhhcyBiZWVuIGFjY2Vzc2VkIHB1YmxpY2x5IGFuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIGNsb25lZFxuLy8gcmF0aGVyIHRoYW4gbW9kaWZpZWQgaW4gcGxhY2VcbmNvbnN0IGZyb3plblN0YXRlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBib29sZWFuPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbFNuYXBzaG90PFQgZXh0ZW5kcyBvYmplY3Q+KFxuICB2YWx1ZTogVFxuKTogUmVhZG9ubHk8U25hcHNob3REYXRhPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzbmFwc2hvdHMuZ2V0KHZhbHVlKVxufVxuXG5pbnRlcmZhY2UgSW50ZXJuYWxTbmFwc2hvdFBhcmVudCB7XG4gIHBhcmVudFNuYXBzaG90OiBTbmFwc2hvdERhdGEgfCB1bmRlZmluZWRcbiAgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+XG59XG5cbmZ1bmN0aW9uIGdldEludGVybmFsU25hcHNob3RQYXJlbnQoXG4gIHNuOiBSZWFkb25seTxTbmFwc2hvdERhdGE+IHwgdW5kZWZpbmVkLFxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWRcbik6IEludGVybmFsU25hcHNob3RQYXJlbnQgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhcmVudFBhdGggfHwgIXNuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGFyZW50U24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHBhcmVudFBhdGgucGFyZW50KVxuICBpZiAoIXBhcmVudFNuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJlbnRTbmFwc2hvdDogcGFyZW50U24sXG4gICAgcGFyZW50UGF0aDogcGFyZW50UGF0aCxcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgdW5zZXRJbnRlcm5hbFNuYXBzaG90ID0gYWN0aW9uKFwidW5zZXRJbnRlcm5hbFNuYXBzaG90XCIsICh2YWx1ZTogYW55KSA9PiB7XG4gIGNvbnN0IG9sZFNuID0gZ2V0SW50ZXJuYWxTbmFwc2hvdCh2YWx1ZSlcblxuICBpZiAob2xkU24pIHtcbiAgICBzbmFwc2hvdHMuZGVsZXRlKHZhbHVlKVxuICAgIG9sZFNuLmF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cbn0pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzZXROZXdJbnRlcm5hbFNuYXBzaG90ID0gYWN0aW9uKFxuICBcInNldE5ld0ludGVybmFsU25hcHNob3RcIixcbiAgPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHZhbHVlOiBhbnksXG4gICAgdW50cmFuc2Zvcm1lZDogVCxcbiAgICB0cmFuc2Zvcm1GbjogU25hcHNob3RUcmFuc2Zvcm1GbiB8IHVuZGVmaW5lZCxcbiAgICBtYXJrQXNGcm96ZW4gPSBmYWxzZVxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBzbjogU25hcHNob3REYXRhID0ge1xuICAgICAgdW50cmFuc2Zvcm1lZCxcbiAgICAgIHRyYW5zZm9ybUZuLFxuICAgICAgdHJhbnNmb3JtZWQ6IHRyYW5zZm9ybUZuID8gdHJhbnNmb3JtRm4odW50cmFuc2Zvcm1lZCkgOiB1bnRyYW5zZm9ybWVkLFxuICAgICAgYXRvbTogY3JlYXRlQXRvbShcInNuYXBzaG90XCIpLFxuICAgIH1cbiAgICBmcm96ZW5TdGF0ZS5zZXQoc24udW50cmFuc2Zvcm1lZCwgbWFya0FzRnJvemVuKVxuICAgIGZyb3plblN0YXRlLnNldChzbi50cmFuc2Zvcm1lZCwgbWFya0FzRnJvemVuKVxuXG4gICAgc25hcHNob3RzLnNldCh2YWx1ZSwgc24pXG5cbiAgICBzbi5hdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG4pXG5cbnR5cGUgTXV0YXRlSW50ZXJuYWxTbmFwc2hvdEZuPFQ+ID0gKHByZXZTbjogVCkgPT4gdm9pZFxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgdXBkYXRlSW50ZXJuYWxTbmFwc2hvdCA9IGFjdGlvbihcbiAgXCJ1cGRhdGVJbnRlcm5hbFNuYXBzaG90XCIsXG4gIDxUIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogYW55LCBtdXRhdGU6IE11dGF0ZUludGVybmFsU25hcHNob3RGbjxUPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHNuID0gZ2V0SW50ZXJuYWxTbmFwc2hvdCh2YWx1ZSkhIGFzIFNuYXBzaG90RGF0YVxuXG4gICAgbGV0IHVudHJhbnNmb3JtZWQgPSBzbi51bnRyYW5zZm9ybWVkXG4gICAgY29uc3Qgc25Gcm96ZW4gPSBmcm96ZW5TdGF0ZS5nZXQodW50cmFuc2Zvcm1lZCkhXG4gICAgaWYgKHNuRnJvemVuKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1bnRyYW5zZm9ybWVkKSkge1xuICAgICAgICB1bnRyYW5zZm9ybWVkID0gdW50cmFuc2Zvcm1lZC5zbGljZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnRyYW5zZm9ybWVkID0gT2JqZWN0LmFzc2lnbih7fSwgdW50cmFuc2Zvcm1lZClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIHByb2Nlc3NvciBjYWNoZWQgcmVzdWx0IGlzIG5vIGxvbmdlciB2YWxpZCBzaW5jZSB3ZSB3aWxsXG4gICAgICAvLyBtdXRhdGUgdGhlIG9iamVjdFxuICAgICAgaW52YWxpZGF0ZUNhY2hlZFRvU25hcHNob3RQcm9jZXNzb3JSZXN1bHQodW50cmFuc2Zvcm1lZClcbiAgICB9XG5cbiAgICBtdXRhdGUodW50cmFuc2Zvcm1lZClcblxuICAgIHNuLnVudHJhbnNmb3JtZWQgPSB1bnRyYW5zZm9ybWVkXG4gICAgc24udHJhbnNmb3JtZWQgPSBzbi50cmFuc2Zvcm1GbiA/IHNuLnRyYW5zZm9ybUZuKHVudHJhbnNmb3JtZWQpIDogdW50cmFuc2Zvcm1lZFxuXG4gICAgZnJvemVuU3RhdGUuc2V0KHNuLnVudHJhbnNmb3JtZWQsIGZhbHNlKVxuICAgIGZyb3plblN0YXRlLnNldChzbi50cmFuc2Zvcm1lZCwgZmFsc2UpXG5cbiAgICBzbi5hdG9tLnJlcG9ydENoYW5nZWQoKVxuXG4gICAgLy8gYWxzbyB1cGRhdGUgcGFyZW50KHMpIHNuYXBzaG90KHMpIGlmIG5lZWRlZFxuICAgIGNvbnN0IHBhcmVudCA9IGdldEludGVybmFsU25hcHNob3RQYXJlbnQoc24sIGZhc3RHZXRQYXJlbnRQYXRoKHZhbHVlKSlcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBjb25zdCB7IHBhcmVudFNuYXBzaG90LCBwYXJlbnRQYXRoIH0gPSBwYXJlbnRcbiAgICAgIC8vIG1pZ2h0IGJlIGZhbHNlIGluIHRoZSBjYXNlcyB3aGVyZSB0aGUgcGFyZW50IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZFxuICAgICAgaWYgKHBhcmVudFNuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBwYXJlbnRQYXRoLnBhdGhcblxuICAgICAgICAvLyBwYXRjaGVzIGZvciBwYXJlbnQgY2hhbmdlcyBzaG91bGQgbm90IGJlIGVtaXR0ZWRcbiAgICAgICAgdXBkYXRlSW50ZXJuYWxTbmFwc2hvdChwYXJlbnRQYXRoLnBhcmVudCwgKG9iak9yQXJyYXk6IGFueSkgPT4ge1xuICAgICAgICAgIG9iak9yQXJyYXlbcGF0aF0gPSBzbi50cmFuc2Zvcm1lZFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0SW50ZXJuYWxTbmFwc2hvdE9ic2VydmVkKHNuOiBTbmFwc2hvdERhdGEpIHtcbiAgc24uYXRvbS5yZXBvcnRPYnNlcnZlZCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemVJbnRlcm5hbFNuYXBzaG90PFQgZXh0ZW5kcyBQcmltaXRpdmVWYWx1ZSB8IG9iamVjdD4oZGF0YTogVCk6IFQge1xuICBpZiAoaXNQcmltaXRpdmUoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLy8gdGhpcyBtaWdodCBiZSB1bmRlZmluZWQgaWYgdGhlIGRhdGEgY29tZXMgZnJvbSBleGFtcGxlIGZyb20gdHJhbnNmb3Jtc1xuICBjb25zdCBpc0Zyb3plbiA9IGZyb3plblN0YXRlLmdldChkYXRhKVxuXG4gIGlmIChpc0Zyb3plbiA9PT0gdW5kZWZpbmVkIHx8IGlzRnJvemVuID09PSB0cnVlKSB7XG4gICAgLy8gYWxyZWFkeSBmcm96ZW4gb3IgYW4gZXh0ZXJuYWwgZGF0YSAoZS5nLiBmcm9tIGEgdHJhbnNmb3JtKVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdChkYXRhW2ldKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZyZWV6ZUludGVybmFsU25hcHNob3QoKGRhdGEgYXMgYW55KVtrZXlzW2ldXSlcbiAgICB9XG4gIH1cblxuICBmcm96ZW5TdGF0ZS5zZXQoZGF0YSwgdHJ1ZSlcblxuICByZXR1cm4gZGF0YVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxyXG5pbXBvcnQgeyByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vdHlwZXMvcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHsgQW55VHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSwgaWRlbnRpdHlGbiwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5pbXBvcnQge1xyXG4gIGZyZWV6ZUludGVybmFsU25hcHNob3QsXHJcbiAgZ2V0SW50ZXJuYWxTbmFwc2hvdCxcclxuICByZXBvcnRJbnRlcm5hbFNuYXBzaG90T2JzZXJ2ZWQsXHJcbn0gZnJvbSBcIi4vaW50ZXJuYWxcIlxyXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcclxuXHJcbi8qKlxyXG4gKiBSZXRyaWV2ZXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IGZvciBhIGRhdGEgc3RydWN0dXJlLlxyXG4gKiBTaW5jZSByZXR1cm5lZCBzbmFwc2hvdHMgYXJlIGltbXV0YWJsZSB0aGV5IHdpbGwgcmVzcGVjdCBzaGFsbG93IGVxdWFsaXR5LCB0aGlzIGlzLFxyXG4gKiBpZiBubyBjaGFuZ2VzIGFyZSBtYWRlIHRoZW4gdGhlIHNuYXBzaG90IHdpbGwgYmUga2VwdCB0aGUgc2FtZS5cclxuICpcclxuICogQHR5cGVwYXJhbSBUIE9iamVjdCB0eXBlLlxyXG4gKiBAcGFyYW0gbm9kZU9yUHJpbWl0aXZlIERhdGEgc3RydWN0dXJlLCBpbmNsdWRpbmcgcHJpbXRpdmVzLlxyXG4gKiBAcmV0dXJucyBUaGUgc25hcHNob3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U25hcHNob3Q8VCBleHRlbmRzIEFueVR5cGU+KFxyXG4gIHR5cGU6IFQsXHJcbiAgbm9kZU9yUHJpbWl0aXZlOiBUeXBlVG9EYXRhPFQ+XHJcbik6IFNuYXBzaG90T3V0T2Y8VHlwZVRvRGF0YTxUPj5cclxuXHJcbi8qKlxyXG4gKiBSZXRyaWV2ZXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IGZvciBhIGRhdGEgc3RydWN0dXJlLlxyXG4gKiBTaW5jZSByZXR1cm5lZCBzbmFwc2hvdHMgYXJlIGltbXV0YWJsZSB0aGV5IHdpbGwgcmVzcGVjdCBzaGFsbG93IGVxdWFsaXR5LCB0aGlzIGlzLFxyXG4gKiBpZiBubyBjaGFuZ2VzIGFyZSBtYWRlIHRoZW4gdGhlIHNuYXBzaG90IHdpbGwgYmUga2VwdCB0aGUgc2FtZS5cclxuICpcclxuICogQHR5cGVwYXJhbSBUIE9iamVjdCB0eXBlLlxyXG4gKiBAcGFyYW0gbm9kZU9yUHJpbWl0aXZlIERhdGEgc3RydWN0dXJlLCBpbmNsdWRpbmcgcHJpbXRpdmVzLlxyXG4gKiBAcmV0dXJucyBUaGUgc25hcHNob3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U25hcHNob3Q8VD4obm9kZU9yUHJpbWl0aXZlOiBUKTogU25hcHNob3RPdXRPZjxUPlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNuYXBzaG90KGFyZzE6IGFueSwgYXJnMj86IGFueSk6IGFueSB7XHJcbiAgbGV0IHRvU25hcHNob3RQcm9jZXNzb3IgPSBpZGVudGl0eUZuIGFzIChzbjogYW55KSA9PiB1bmtub3duXHJcbiAgbGV0IG5vZGVPclByaW1pdGl2ZTogYW55XHJcblxyXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDIpIHtcclxuICAgIHRvU25hcHNob3RQcm9jZXNzb3IgPSByZXNvbHZlVHlwZUNoZWNrZXIoYXJnMSkudG9TbmFwc2hvdFByb2Nlc3NvclxyXG4gICAgbm9kZU9yUHJpbWl0aXZlID0gYXJnMlxyXG4gIH0gZWxzZSB7XHJcbiAgICBub2RlT3JQcmltaXRpdmUgPSBhcmcxXHJcbiAgfVxyXG5cclxuICBpZiAoaXNQcmltaXRpdmUobm9kZU9yUHJpbWl0aXZlKSkge1xyXG4gICAgcmV0dXJuIHRvU25hcHNob3RQcm9jZXNzb3Iobm9kZU9yUHJpbWl0aXZlKVxyXG4gIH1cclxuXHJcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlT3JQcmltaXRpdmUsIFwibm9kZU9yUHJpbWl0aXZlXCIpXHJcblxyXG4gIGNvbnN0IHNuYXBzaG90ID0gZ2V0SW50ZXJuYWxTbmFwc2hvdChub2RlT3JQcmltaXRpdmUpXHJcbiAgaWYgKCFzbmFwc2hvdCkge1xyXG4gICAgdGhyb3cgZmFpbHVyZShcImdldFNuYXBzaG90IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMga2luZCBvZiBvYmplY3RcIilcclxuICB9XHJcblxyXG4gIGZyZWV6ZUludGVybmFsU25hcHNob3Qoc25hcHNob3QudHJhbnNmb3JtZWQpXHJcbiAgcmVwb3J0SW50ZXJuYWxTbmFwc2hvdE9ic2VydmVkKHNuYXBzaG90KVxyXG4gIHJldHVybiB0b1NuYXBzaG90UHJvY2Vzc29yKHNuYXBzaG90LnRyYW5zZm9ybWVkKVxyXG59XHJcbiIsImltcG9ydCB7IHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuL3NjaGVtYXNcIlxyXG5pbXBvcnQgdHlwZSB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4vVHlwZUNoZWNrRXJyb3JcIlxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGNvbmZvcm1zIHRvIGEgZ2l2ZW4gdHlwZS5cclxuICpcclxuICogQHR5cGVwYXJhbSBUIFR5cGUuXHJcbiAqIEBwYXJhbSB0eXBlIFR5cGUgdG8gY2hlY2sgZm9yLlxyXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2suXHJcbiAqIEByZXR1cm5zIEEgVHlwZUVycm9yIGlmIHRoZSBjaGVjayBmYWlscyBvciBudWxsIGlmIG5vIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVDaGVjazxUIGV4dGVuZHMgQW55VHlwZT4odHlwZTogVCwgdmFsdWU6IFR5cGVUb0RhdGE8VD4pOiBUeXBlQ2hlY2tFcnJvciB8IG51bGwge1xyXG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKHR5cGUpXHJcblxyXG4gIGlmICh0eXBlQ2hlY2tlci51bmNoZWNrZWQpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB0eXBlQ2hlY2tlci5jaGVjayh2YWx1ZSwgW10pXHJcbiAgfVxyXG59XHJcbiIsImxldCB1cmxBbHBoYWJldCA9XG4gICd1c2VhbmRvbS0yNlQxOTgzNDBQWDc1cHhKQUNLVkVSWU1JTkRCVVNIV09MRl9HUVpiZmdoamtscXZ3eXpyaWN0J1xubGV0IGN1c3RvbUFscGhhYmV0ID0gKGFscGhhYmV0LCBkZWZhdWx0U2l6ZSA9IDIxKSA9PiB7XG4gIHJldHVybiAoc2l6ZSA9IGRlZmF1bHRTaXplKSA9PiB7XG4gICAgbGV0IGlkID0gJydcbiAgICBsZXQgaSA9IHNpemVcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZCArPSBhbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIGFscGhhYmV0Lmxlbmd0aCkgfCAwXVxuICAgIH1cbiAgICByZXR1cm4gaWRcbiAgfVxufVxubGV0IG5hbm9pZCA9IChzaXplID0gMjEpID0+IHtcbiAgbGV0IGlkID0gJydcbiAgbGV0IGkgPSBzaXplXG4gIHdoaWxlIChpLS0pIHtcbiAgICBpZCArPSB1cmxBbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdXG4gIH1cbiAgcmV0dXJuIGlkXG59XG5leHBvcnQgeyBuYW5vaWQsIGN1c3RvbUFscGhhYmV0IH1cbiIsImltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCJuYW5vaWQvbm9uLXNlY3VyZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIE1vZGVsIGF1dG8gdHlwZS1jaGVja2luZyBtb2RlLlxuICovXG5leHBvcnQgZW51bSBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlIHtcbiAgLyoqXG4gICAqIEF1dG8gdHlwZSBjaGVjayBtb2RlbHMgb25seSBpbiBkZXYgbW9kZVxuICAgKi9cbiAgRGV2TW9kZU9ubHkgPSBcImRldk1vZGVPbmx5XCIsXG4gIC8qKlxuICAgKiBBdXRvIHR5cGUgY2hlY2sgbW9kZWxzIG5vIG1hdHRlciB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICAgKi9cbiAgQWx3YXlzT24gPSBcImFsd2F5c09uXCIsXG4gIC8qKlxuICAgKiBEbyBub3QgYXV0byB0eXBlIGNoZWNrIG1vZGVscyBubyBtYXR0ZXIgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcbiAgICovXG4gIEFsd2F5c09mZiA9IFwiYWx3YXlzT2ZmXCIsXG59XG5cbi8qKlxuICogR2xvYmFsIGNvbmZpZyBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsQ29uZmlnIHtcbiAgLyoqXG4gICAqIE1vZGVsIGF1dG8gdHlwZS1jaGVja2luZyBtb2RlLlxuICAgKi9cbiAgbW9kZWxBdXRvVHlwZUNoZWNraW5nOiBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlXG5cbiAgLyoqXG4gICAqIElEIGdlbmVyYXRvciBmdW5jdGlvbiBmb3IgbW9kZWwgaWRzLlxuICAgKi9cbiAgbW9kZWxJZEdlbmVyYXRvcigpOiBzdHJpbmdcblxuICAvKipcbiAgICogQWxsb3cgYXJyYXkgZWxlbWVudHMgdG8gYmUgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBhbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHM6IGJvb2xlYW5cblxuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyB3YXJuaW5ncyByZWxhdGVkIHRvIGR1cGxpY2F0ZWQgbW9kZWwgbmFtZXMgKGRlZmF1bHRzIHRvIGB0cnVlYCkuXG4gICAqIFVzdWFsbHkgc2V0IHRvIGZhbHNlIGluIHRlc3QgZW52aXJvbm1lbnRzIChlLmcuIGplc3QpLlxuICAgKi9cbiAgc2hvd0R1cGxpY2F0ZU1vZGVsTmFtZVdhcm5pbmdzOiBib29sZWFuXG59XG5cbmxldCBsb2NhbElkID0gMFxuY29uc3QgbG9jYWxCYXNlSWQgPSBuYW5vaWQoKVxuXG5mdW5jdGlvbiBkZWZhdWx0TW9kZWxJZEdlbmVyYXRvcigpOiBzdHJpbmcge1xuICAvLyB3ZSB1c2UgYmFzZSAzNiBmb3IgbG9jYWwgaWQgc2luY2UgaXQgaXMgc2hvcnQgYW5kIGZhc3RcbiAgY29uc3QgaWQgPSBsb2NhbElkLnRvU3RyaW5nKDM2KSArIFwiLVwiICsgbG9jYWxCYXNlSWRcbiAgbG9jYWxJZCsrXG4gIHJldHVybiBpZFxufVxuXG4vLyBkZWZhdWx0c1xubGV0IGdsb2JhbENvbmZpZzogR2xvYmFsQ29uZmlnID0ge1xuICBtb2RlbEF1dG9UeXBlQ2hlY2tpbmc6IE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGUuRGV2TW9kZU9ubHksXG4gIG1vZGVsSWRHZW5lcmF0b3I6IGRlZmF1bHRNb2RlbElkR2VuZXJhdG9yLFxuICBhbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHM6IGZhbHNlLFxuICBzaG93RHVwbGljYXRlTW9kZWxOYW1lV2FybmluZ3M6IHRydWUsXG59XG5cbi8qKlxuICogUGFydGlhbGx5IHNldHMgdGhlIGN1cnJlbnQgZ2xvYmFsIGNvbmZpZy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIFBhcnRpYWwgb2JqZWN0IHdpdGggdGhlIG5ldyBjb25maWd1cmF0aW9ucy4gT3B0aW9ucyBub3QgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCB3b24ndCBiZSBjaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2xvYmFsQ29uZmlnKGNvbmZpZzogUGFydGlhbDxHbG9iYWxDb25maWc+KSB7XG4gIGdsb2JhbENvbmZpZyA9IE9iamVjdC5mcmVlemUoe1xuICAgIC4uLmdsb2JhbENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gIH0pXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBnbG9iYWwgY29uZmlnIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsQ29uZmlnKCk6IFJlYWRvbmx5PEdsb2JhbENvbmZpZz4ge1xuICByZXR1cm4gZ2xvYmFsQ29uZmlnXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogUmV0dXJucyBpZiB0aGUgYXV0byB0eXBlIGNoZWNraW5nIGZvciBtb2RlbHMgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkKCkge1xuICBzd2l0Y2ggKGdldEdsb2JhbENvbmZpZygpLm1vZGVsQXV0b1R5cGVDaGVja2luZykge1xuICAgIGNhc2UgTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZS5EZXZNb2RlT25seTpcbiAgICAgIHJldHVybiBpbkRldk1vZGUoKVxuICAgIGNhc2UgTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZS5BbHdheXNPZmY6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBjYXNlIE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGUuQWx3YXlzT246XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCAnbW9kZWxBdXRvVHlwZUNoZWNraW5nJyBjb25maWcgdmFsdWUgLSAke2dsb2JhbENvbmZpZy5tb2RlbEF1dG9UeXBlQ2hlY2tpbmd9YFxuICAgICAgKVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi9CYXNlTW9kZWxTaGFyZWRcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJbml0aWFsaXplcnNTeW1ib2wgPSBTeW1ib2woXCJtb2RlbEluaXRpYWxpemVyc1wiKVxuXG50eXBlIE1vZGVsQ2xhc3NJbml0aWFsaXplciA9IChtb2RlbEluc3RhbmNlOiBBbnlNb2RlbCB8IEFueURhdGFNb2RlbCkgPT4gdm9pZFxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTW9kZWxDbGFzc0luaXRpYWxpemVyKFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPixcbiAgaW5pdDogTW9kZWxDbGFzc0luaXRpYWxpemVyXG4pIHtcbiAgbGV0IGluaXRpYWxpemVycyA9IChtb2RlbENsYXNzIGFzIGFueSlbbW9kZWxJbml0aWFsaXplcnNTeW1ib2xdXG4gIGlmICghaW5pdGlhbGl6ZXJzKSB7XG4gICAgaW5pdGlhbGl6ZXJzID0gW11cbiAgICA7KG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbEluaXRpYWxpemVyc1N5bWJvbF0gPSBpbml0aWFsaXplcnNcbiAgfVxuICBpbml0aWFsaXplcnMucHVzaChpbml0KVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxDbGFzc0luaXRpYWxpemVycyhcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD5cbik6IE1vZGVsQ2xhc3NJbml0aWFsaXplcltdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIChtb2RlbENsYXNzIGFzIGFueSlbbW9kZWxJbml0aWFsaXplcnNTeW1ib2xdXG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsQ2xhc3NJbml0aWFsaXplcnMgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxDbGFzc0luaXRpYWxpemVyXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9kZWxJbml0aWFsaXplcnMoXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+LFxuICBtb2RlbE9iajogYW55XG4pIHtcbiAgY29uc3QgaW5pdGlhbGl6ZXJzID0gZ2V0TW9kZWxDbGFzc0luaXRpYWxpemVycyhtb2RlbENsYXNzKVxuICBpZiAoaW5pdGlhbGl6ZXJzKSB7XG4gICAgY29uc3QgbGVuID0gaW5pdGlhbGl6ZXJzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGluaXQgPSBpbml0aWFsaXplcnNbaV1cbiAgICAgIGluaXQobW9kZWxPYmopXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldEN1cnJlbnRBY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5cbmZ1bmN0aW9uIGNhbldyaXRlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWdldEFjdGlvblByb3RlY3Rpb24oKSB8fCAhIWdldEN1cnJlbnRBY3Rpb25Db250ZXh0KClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENhbldyaXRlKCkge1xuICBpZiAoIWNhbldyaXRlKCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiZGF0YSBjaGFuZ2VzIG11c3QgYmUgcGVyZm9ybWVkIGluc2lkZSBtb2RlbCBhY3Rpb25zXCIpXG4gIH1cbn1cblxubGV0IGFjdGlvblByb3RlY3Rpb24gPSB0cnVlXG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogR2V0cyBpZiB0aGUgYWN0aW9uIHByb3RlY3Rpb24gaXMgY3VycmVudGx5IGVuYWJsZWQgb3Igbm90LlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25Qcm90ZWN0aW9uKCkge1xuICByZXR1cm4gYWN0aW9uUHJvdGVjdGlvblxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFNldHMgaWYgdGhlIGFjdGlvbiBwcm90ZWN0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkIG9yIG5vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEFjdGlvblByb3RlY3Rpb24ocHJvdGVjdGlvbjogYm9vbGVhbikge1xuICBhY3Rpb25Qcm90ZWN0aW9uID0gcHJvdGVjdGlvblxufVxuIiwiaW1wb3J0IHsgZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IGdldEFjdGlvblByb3RlY3Rpb24gfSBmcm9tIFwiLi9wcm90ZWN0aW9uXCJcblxuY29uc3QgcGVuZGluZ0FjdGlvbnM6ICgoKSA9PiB2b2lkKVtdID0gW11cblxuZnVuY3Rpb24gaXNBY3Rpb25SdW5uaW5nKCkge1xuICByZXR1cm4gIWdldEFjdGlvblByb3RlY3Rpb24oKSB8fCBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ0FjdGlvbihhY3Rpb246ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgLy8gZGVsYXkgYWN0aW9uIHVudGlsIGFsbCBjdXJyZW50IGFjdGlvbnMgYXJlIGZpbmlzaGVkXG4gIGlmIChpc0FjdGlvblJ1bm5pbmcoKSkge1xuICAgIHBlbmRpbmdBY3Rpb25zLnB1c2goYWN0aW9uKVxuICB9IGVsc2Uge1xuICAgIGFjdGlvbigpXG4gIH1cbn1cblxubGV0IHBlbmRpbmdBY3Rpb25zUnVubmluZyA9IGZhbHNlXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSdW5QZW5kaW5nQWN0aW9ucygpOiB2b2lkIHtcbiAgaWYgKGlzQWN0aW9uUnVubmluZygpIHx8IHBlbmRpbmdBY3Rpb25zUnVubmluZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgcGVuZGluZ0FjdGlvbnNSdW5uaW5nID0gdHJ1ZVxuXG4gIHRyeSB7XG4gICAgd2hpbGUgKHBlbmRpbmdBY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5leHRBY3Rpb24gPSBwZW5kaW5nQWN0aW9ucy5zaGlmdCgpIVxuICAgICAgbmV4dEFjdGlvbigpXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHBlbmRpbmdBY3Rpb25zUnVubmluZyA9IGZhbHNlXG4gIH1cbn1cbiIsIi8qKlxuICogQSBob29rIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gSG9va0FjdGlvbiB7XG4gIC8qKlxuICAgKiBvbkluaXQgaG9va1xuICAgKi9cbiAgT25Jbml0ID0gXCIkJG9uSW5pdFwiLFxuICAvKipcbiAgICogb25MYXp5SW5pdCBob29rXG4gICAqL1xuICBPbkxhenlJbml0ID0gXCIkJG9uTGF6eUluaXRcIixcbiAgLyoqXG4gICAqIG9uQXR0YWNoZWRUb1Jvb3RTdG9yZSBob29rXG4gICAqL1xuICBPbkF0dGFjaGVkVG9Sb290U3RvcmUgPSBcIiQkb25BdHRhY2hlZFRvUm9vdFN0b3JlXCIsXG4gIC8qKlxuICAgKiBkaXNwb3NlciBmb3Igb25BdHRhY2hlZFRvUm9vdFN0b3JlIGhvb2tcbiAgICovXG4gIE9uQXR0YWNoZWRUb1Jvb3RTdG9yZURpc3Bvc2VyID0gXCIkJG9uQXR0YWNoZWRUb1Jvb3RTdG9yZURpc3Bvc2VyXCIsXG59XG5cbmNvbnN0IGhvb2tBY3Rpb25WYWx1ZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KE9iamVjdC52YWx1ZXMoSG9va0FjdGlvbikpXG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIGFjdGlvbiBuYW1lIGNvcnJlc3BvbmRzIHRvIGEgaG9vaywgdGhpcyBpcywgb25lIG9mOlxuICogLSBvbkluaXQoKSBob29rXG4gKiAtIG9uTGF6eUluaXQoKSBob29rXG4gKiAtIG9uQXR0YWNoZWRUb1Jvb3RTdG9yZSgpIGhvb2tcbiAqIC0gZGlzcG9zZXIgcmV0dXJuZWQgYnkgYSBvbkF0dGFjaGVkVG9Sb290U3RvcmUoKSBob29rXG4gKlxuICogQHBhcmFtIGFjdGlvbk5hbWUgQWN0aW9uIG5hbWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IGlzIGEgaG9vaywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNIb29rQWN0aW9uKGFjdGlvbk5hbWU6IHN0cmluZyk6IGFjdGlvbk5hbWUgaXMgSG9va0FjdGlvbiB7XG4gIHJldHVybiBob29rQWN0aW9uVmFsdWVzLmhhcyhhY3Rpb25OYW1lKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjcmVhdGVBdG9tLCBJQXRvbSwgb2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZVNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnQgfSBmcm9tIFwiLi9wYXRoXCJcblxuY29uc3QgZGVmYXVsdE9ic2VydmFibGVTZXRPcHRpb25zID0geyBkZWVwOiBmYWxzZSB9XG5cbmludGVyZmFjZSBEZWVwT2JqZWN0Q2hpbGRyZW4ge1xuICBkZWVwOiBTZXQ8b2JqZWN0PlxuXG4gIGV4dGVuc2lvbnNEYXRhOiBXZWFrTWFwPFN5bWJvbCwgYW55PlxufVxuXG5pbnRlcmZhY2UgT2JqZWN0Q2hpbGRyZW5EYXRhIGV4dGVuZHMgRGVlcE9iamVjdENoaWxkcmVuIHtcbiAgc2hhbGxvdzogT2JzZXJ2YWJsZVNldDxvYmplY3Q+XG5cbiAgZGVlcERpcnR5OiBib29sZWFuXG4gIGRlZXBBdG9tOiBJQXRvbVxufVxuXG5jb25zdCBvYmplY3RDaGlsZHJlbiA9IG5ldyBXZWFrTWFwPG9iamVjdCwgT2JqZWN0Q2hpbGRyZW5EYXRhPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplT2JqZWN0Q2hpbGRyZW4obm9kZTogb2JqZWN0KSB7XG4gIGlmIChvYmplY3RDaGlsZHJlbi5oYXMobm9kZSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIG9iamVjdENoaWxkcmVuLnNldChub2RlLCB7XG4gICAgc2hhbGxvdzogb2JzZXJ2YWJsZS5zZXQodW5kZWZpbmVkLCBkZWZhdWx0T2JzZXJ2YWJsZVNldE9wdGlvbnMpLFxuXG4gICAgZGVlcDogbmV3IFNldCgpLFxuICAgIGV4dGVuc2lvbnNEYXRhOiBpbml0RXh0ZW5zaW9uc0RhdGEoKSxcblxuICAgIGRlZXBEaXJ0eTogdHJ1ZSxcbiAgICBkZWVwQXRvbTogY3JlYXRlQXRvbShcImRlZXBDaGlsZHJlbkF0b21cIiksXG4gIH0pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RDaGlsZHJlbihub2RlOiBvYmplY3QpOiBPYmplY3RDaGlsZHJlbkRhdGFbXCJzaGFsbG93XCJdIHtcbiAgcmV0dXJuIG9iamVjdENoaWxkcmVuLmdldChub2RlKSEuc2hhbGxvd1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVlcE9iamVjdENoaWxkcmVuKG5vZGU6IG9iamVjdCk6IERlZXBPYmplY3RDaGlsZHJlbiB7XG4gIGNvbnN0IG9iaiA9IG9iamVjdENoaWxkcmVuLmdldChub2RlKSFcblxuICBpZiAob2JqLmRlZXBEaXJ0eSkge1xuICAgIHVwZGF0ZURlZXBPYmplY3RDaGlsZHJlbihub2RlKVxuICB9XG5cbiAgb2JqLmRlZXBBdG9tLnJlcG9ydE9ic2VydmVkKClcblxuICByZXR1cm4gb2JqXG59XG5cbmZ1bmN0aW9uIGFkZE5vZGVUb0RlZXBMaXN0cyhub2RlOiBhbnksIGRhdGE6IERlZXBPYmplY3RDaGlsZHJlbikge1xuICBkYXRhLmRlZXAuYWRkKG5vZGUpXG4gIGV4dGVuc2lvbnMuZm9yRWFjaCgoZXh0ZW5zaW9uLCBkYXRhU3ltYm9sKSA9PiB7XG4gICAgZXh0ZW5zaW9uLmFkZE5vZGUobm9kZSwgZGF0YS5leHRlbnNpb25zRGF0YS5nZXQoZGF0YVN5bWJvbCkpXG4gIH0pXG59XG5cbmNvbnN0IHVwZGF0ZURlZXBPYmplY3RDaGlsZHJlbiA9IGFjdGlvbigobm9kZTogb2JqZWN0KTogRGVlcE9iamVjdENoaWxkcmVuID0+IHtcbiAgY29uc3Qgb2JqID0gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIVxuICBpZiAoIW9iai5kZWVwRGlydHkpIHtcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBjb25zdCBkYXRhOiBEZWVwT2JqZWN0Q2hpbGRyZW4gPSB7XG4gICAgZGVlcDogbmV3IFNldCgpLFxuICAgIGV4dGVuc2lvbnNEYXRhOiBpbml0RXh0ZW5zaW9uc0RhdGEoKSxcbiAgfVxuXG4gIGNvbnN0IGNoaWxkcmVuSXRlciA9IGdldE9iamVjdENoaWxkcmVuKG5vZGUpIS52YWx1ZXMoKVxuICBsZXQgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG4gIHdoaWxlICghY2guZG9uZSkge1xuICAgIGFkZE5vZGVUb0RlZXBMaXN0cyhjaC52YWx1ZSwgZGF0YSlcblxuICAgIGNvbnN0IHJldCA9IHVwZGF0ZURlZXBPYmplY3RDaGlsZHJlbihjaC52YWx1ZSkuZGVlcFxuICAgIGNvbnN0IHJldEl0ZXIgPSByZXQudmFsdWVzKClcbiAgICBsZXQgcmV0Q3VyID0gcmV0SXRlci5uZXh0KClcbiAgICB3aGlsZSAoIXJldEN1ci5kb25lKSB7XG4gICAgICBhZGROb2RlVG9EZWVwTGlzdHMocmV0Q3VyLnZhbHVlLCBkYXRhKVxuICAgICAgcmV0Q3VyID0gcmV0SXRlci5uZXh0KClcbiAgICB9XG5cbiAgICBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgfVxuXG4gIE9iamVjdC5hc3NpZ24ob2JqLCBkYXRhKVxuXG4gIG9iai5kZWVwRGlydHkgPSBmYWxzZVxuICBvYmouZGVlcEF0b20ucmVwb3J0Q2hhbmdlZCgpXG5cbiAgcmV0dXJuIG9ialxufSlcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZE9iamVjdENoaWxkID0gYWN0aW9uKChub2RlOiBvYmplY3QsIGNoaWxkOiBvYmplY3QpID0+IHtcbiAgY29uc3Qgb2JqID0gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIVxuICBvYmouc2hhbGxvdy5hZGQoY2hpbGQpXG5cbiAgaW52YWxpZGF0ZURlZXBDaGlsZHJlbihub2RlKVxufSlcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZU9iamVjdENoaWxkID0gYWN0aW9uKChub2RlOiBvYmplY3QsIGNoaWxkOiBvYmplY3QpID0+IHtcbiAgY29uc3Qgb2JqID0gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIVxuICBvYmouc2hhbGxvdy5kZWxldGUoY2hpbGQpXG5cbiAgaW52YWxpZGF0ZURlZXBDaGlsZHJlbihub2RlKVxufSlcblxuZnVuY3Rpb24gaW52YWxpZGF0ZURlZXBDaGlsZHJlbihub2RlOiBvYmplY3QpIHtcbiAgY29uc3Qgb2JqID0gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIVxuXG4gIGlmICghb2JqLmRlZXBEaXJ0eSkge1xuICAgIG9iai5kZWVwRGlydHkgPSB0cnVlXG4gICAgb2JqLmRlZXBBdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG5cbiAgY29uc3QgcGFyZW50ID0gZmFzdEdldFBhcmVudChub2RlKVxuICBpZiAocGFyZW50KSB7XG4gICAgaW52YWxpZGF0ZURlZXBDaGlsZHJlbihwYXJlbnQpXG4gIH1cbn1cblxuY29uc3QgZXh0ZW5zaW9ucyA9IG5ldyBNYXA8U3ltYm9sLCBEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248YW55Pj4oKVxuXG5pbnRlcmZhY2UgRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uPEQ+IHtcbiAgaW5pdERhdGEoKTogRFxuICBhZGROb2RlKG5vZGU6IGFueSwgZGF0YTogRCk6IHZvaWRcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uPEQ+KGV4dGVuc2lvbjogRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uPEQ+KSB7XG4gIGNvbnN0IGRhdGFTeW1ib2wgPSBTeW1ib2woXCJkZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb25cIilcbiAgZXh0ZW5zaW9ucy5zZXQoZGF0YVN5bWJvbCwgZXh0ZW5zaW9uKVxuXG4gIHJldHVybiAoZGF0YTogRGVlcE9iamVjdENoaWxkcmVuKTogRCA9PiB7XG4gICAgcmV0dXJuIGRhdGEuZXh0ZW5zaW9uc0RhdGEuZ2V0KGRhdGFTeW1ib2wpIGFzIERcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0RXh0ZW5zaW9uc0RhdGEoKSB7XG4gIGNvbnN0IGV4dGVuc2lvbnNEYXRhID0gbmV3IE1hcDxTeW1ib2wsIGFueT4oKVxuXG4gIGV4dGVuc2lvbnMuZm9yRWFjaCgoZXh0ZW5zaW9uLCBkYXRhU3ltYm9sKSA9PiB7XG4gICAgZXh0ZW5zaW9uc0RhdGEuc2V0KGRhdGFTeW1ib2wsIGV4dGVuc2lvbi5pbml0RGF0YSgpKVxuICB9KVxuXG4gIHJldHVybiBleHRlbnNpb25zRGF0YVxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZ2V0T2JqZWN0Q2hpbGRyZW4gfSBmcm9tIFwiLi9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuXG4vKipcbiAqIE1vZGUgZm9yIHRoZSBgd2Fsa1RyZWVgIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGVudW0gV2Fsa1RyZWVNb2RlIHtcbiAgLyoqXG4gICAqIFRoZSB3YWxrIHdpbGwgYmUgZG9uZSBwYXJlbnQgKHJvb3RzKSBmaXJzdCwgdGhlbiBjaGlsZHJlbi5cbiAgICovXG4gIFBhcmVudEZpcnN0ID0gXCJwYXJlbnRGaXJzdFwiLFxuICAvKipcbiAgICogVGhlIHdhbGsgd2lsbCBiZSBkb25lIGNoaWxkcmVuIChsZWFmcykgZmlyc3QsIHRoZW4gcGFyZW50cy5cbiAgICovXG4gIENoaWxkcmVuRmlyc3QgPSBcImNoaWxkcmVuRmlyc3RcIixcbn1cblxuLyoqXG4gKiBXYWxrcyBhIHRyZWUsIHJ1bm5pbmcgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiBmb3IgZWFjaCBub2RlLlxuICogSWYgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zIHNvbWV0aGluZyBvdGhlciB0aGFuIHVuZGVmaW5lZCxcbiAqIHRoZW4gdGhlIHdhbGsgd2lsbCBiZSBzdG9wcGVkIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHJldHVybmVkIHZhbHVlLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZXR1cm5lZCBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gdm9pZC5cbiAqIEBwYXJhbSByb290IFN1YnRyZWUgcm9vdCBvYmplY3QuXG4gKiBAcGFyYW0gdmlzaXQgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biBmb3IgZWFjaCBub2RlIG9mIHRoZSB0cmVlLlxuICogQHBhcmFtIG1vZGUgTW9kZSB0byB3YWxrIHRoZSB0cmVlLCBhcyBkZWZpbmVkIGluIGBXYWxrVHJlZU1vZGVgLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhbGtUcmVlPFQgPSB2b2lkPihcbiAgcm9vdDogb2JqZWN0LFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gVCB8IHVuZGVmaW5lZCxcbiAgbW9kZTogV2Fsa1RyZWVNb2RlXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChyb290LCBcInJvb3RcIilcblxuICBpZiAobW9kZSA9PT0gV2Fsa1RyZWVNb2RlLlBhcmVudEZpcnN0KSB7XG4gICAgcmV0dXJuIHdhbGtUcmVlUGFyZW50Rmlyc3Qocm9vdCwgdmlzaXQpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHdhbGtUcmVlQ2hpbGRyZW5GaXJzdChyb290LCB2aXNpdClcbiAgfVxufVxuXG5mdW5jdGlvbiB3YWxrVHJlZVBhcmVudEZpcnN0PFQgPSB2b2lkPihcbiAgcm9vdDogb2JqZWN0LFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gVCB8IHVuZGVmaW5lZFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XVxuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpIVxuXG4gICAgY29uc3QgcmV0ID0gdmlzaXQobm9kZSlcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXRcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IGdldE9iamVjdENoaWxkcmVuKG5vZGUpIVxuXG4gICAgc3RhY2subGVuZ3RoICs9IGNoaWxkcmVuLnNpemVcbiAgICBsZXQgaSA9IHN0YWNrLmxlbmd0aCAtIDFcblxuICAgIGNvbnN0IGNoaWxkcmVuSXRlciA9IGNoaWxkcmVuIS52YWx1ZXMoKVxuICAgIGxldCBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgICB3aGlsZSAoIWNoLmRvbmUpIHtcbiAgICAgIHN0YWNrW2ktLV0gPSBjaC52YWx1ZVxuICAgICAgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiB3YWxrVHJlZUNoaWxkcmVuRmlyc3Q8VCA9IHZvaWQ+KFxuICByb290OiBvYmplY3QsXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2hpbGRyZW5JdGVyID0gZ2V0T2JqZWN0Q2hpbGRyZW4ocm9vdCkhLnZhbHVlcygpXG4gIGxldCBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgd2hpbGUgKCFjaC5kb25lKSB7XG4gICAgY29uc3QgcmV0ID0gd2Fsa1RyZWVDaGlsZHJlbkZpcnN0KGNoLnZhbHVlLCB2aXNpdClcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gICAgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG4gIH1cblxuICBjb25zdCByZXQgPSB2aXNpdChyb290KVxuICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZTxSPiB7XG4gIHdhbGsodGFyZ2V0OiBvYmplY3QpOiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBnZXRDb21wdXRlZFRyZWVSZXN1bHQ8Uj4oXG4gIGNvbXB1dGVkRm5zOiBXZWFrTWFwPG9iamVjdCwgSUNvbXB1dGVkVmFsdWU8TWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWQ+PixcbiAgdmlzaXQ6IChub2RlOiBvYmplY3QpID0+IFIgfCB1bmRlZmluZWQsXG4gIHRyZWU6IG9iamVjdFxuKTogTWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWQge1xuICBsZXQgY21wdGVkID0gY29tcHV0ZWRGbnMuZ2V0KHRyZWUpXG4gIGlmICghY21wdGVkKSB7XG4gICAgY21wdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHdhbGtUcmVlQWdncmVnYXRlKHRyZWUsIHZpc2l0LCAoY2gpID0+IGdldENvbXB1dGVkVHJlZVJlc3VsdChjb21wdXRlZEZucywgdmlzaXQsIGNoKSlcbiAgICB9KVxuICAgIGNvbXB1dGVkRm5zLnNldCh0cmVlLCBjbXB0ZWQpXG4gIH1cbiAgcmV0dXJuIGNtcHRlZC5nZXQoKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZTxSPihcbiAgdmlzaXQ6IChub2RlOiBvYmplY3QpID0+IFIgfCB1bmRlZmluZWRcbik6IENvbXB1dGVkV2Fsa1RyZWVBZ2dyZWdhdGU8Uj4ge1xuICBjb25zdCBjb21wdXRlZEZucyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgSUNvbXB1dGVkVmFsdWU8TWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWQ+PigpXG5cbiAgcmV0dXJuIHtcbiAgICB3YWxrOiAobikgPT4gZ2V0Q29tcHV0ZWRUcmVlUmVzdWx0KGNvbXB1dGVkRm5zLCB2aXNpdCwgbiksXG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fsa1RyZWVBZ2dyZWdhdGU8Uj4oXG4gIHRhcmdldDogb2JqZWN0LFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gUiB8IHVuZGVmaW5lZCxcbiAgcmVjdXJzZTogKG5vZGU6IG9iamVjdCkgPT4gTWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWRcbik6IE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG1hcDogTWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWRcbiAgY29uc3Qgcm9vdFZhbCA9IHZpc2l0KHRhcmdldClcblxuICBjb25zdCBjaGlsZHJlbk1hcCA9IGdldE9iamVjdENoaWxkcmVuKHRhcmdldCkhXG4gIGNvbnN0IGNoaWxkcmVuSXRlciA9IGNoaWxkcmVuTWFwIS52YWx1ZXMoKVxuICBsZXQgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG5cbiAgLy8gc21hbGwgb3B0aW1pemF0aW9uLCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjaGlsZCBhbmQgdGhpc1xuICAvLyBvYmplY3QgcHJvdmlkZXMgbm8gdmFsdWUgd2UgY2FuIGp1c3QgcmV1c2UgdGhlIGNoaWxkIG9uZXNcbiAgaWYgKHJvb3RWYWwgPT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbk1hcC5zaXplID09PSAxKSB7XG4gICAgcmV0dXJuIHJlY3Vyc2UoY2gudmFsdWUpXG4gIH1cblxuICB3aGlsZSAoIWNoLmRvbmUpIHtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHJlY3Vyc2UoY2gudmFsdWUpXG5cbiAgICBpZiAoY2hpbGRNYXApIHtcbiAgICAgIGlmICghbWFwKSB7XG4gICAgICAgIG1hcCA9IG5ldyBNYXAoKVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgY2hpbGQgbWFwIGtleXMvdmFsdWVzIHRvIG93biBtYXBcbiAgICAgIGNvbnN0IG1hcEl0ZXIgPSBjaGlsZE1hcC5rZXlzKClcblxuICAgICAgbGV0IG1hcEN1ciA9IG1hcEl0ZXIubmV4dCgpXG4gICAgICB3aGlsZSAoIW1hcEN1ci5kb25lKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG1hcEN1ci52YWx1ZVxuICAgICAgICBjb25zdCB2YWwgPSBjaGlsZE1hcC5nZXQoa2V5KSFcbiAgICAgICAgbWFwLnNldChrZXksIHZhbClcbiAgICAgICAgbWFwQ3VyID0gbWFwSXRlci5uZXh0KClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgfVxuXG4gIC8vIGFkZCBpdCBhdCB0aGUgZW5kIHNvIHBhcmVudCByZXNvbHV0aW9ucyBoYXZlIGhpZ2hlclxuICAvLyBwcmlvcml0eSB0aGFuIGNoaWxkIG9uZXNcbiAgaWYgKHJvb3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghbWFwKSB7XG4gICAgICBtYXAgPSBuZXcgTWFwKClcbiAgICB9XG4gICAgbWFwLnNldChyb290VmFsLCB0YXJnZXQpXG4gIH1cblxuICByZXR1cm4gbWFwXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQgeyBIb29rQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9ob29rQWN0aW9uc1wiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24sIHdyYXBNb2RlbE1ldGhvZEluQWN0aW9uSWZOZWVkZWQgfSBmcm9tIFwiLi4vYWN0aW9uL3dyYXBJbkFjdGlvblwiXG5pbXBvcnQgeyBBbnlNb2RlbCwgQmFzZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyB3YWxrVHJlZSwgV2Fsa1RyZWVNb2RlIH0gZnJvbSBcIi4uL3BhcmVudC93YWxrVHJlZVwiXG5cbmNvbnN0IG9uQXR0YWNoZWREaXNwb3NlcnMgPSBuZXcgV2Vha01hcDxvYmplY3QsICgpID0+IHZvaWQ+KClcbmNvbnN0IGF0dGFjaGVkVG9Sb290U3RvcmUgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGF0dGFjaFRvUm9vdFN0b3JlID0gYWN0aW9uKFxuICBcImF0dGFjaFRvUm9vdFN0b3JlXCIsXG4gIChyb290U3RvcmU6IG9iamVjdCwgY2hpbGQ6IG9iamVjdCk6IHZvaWQgPT4ge1xuICAgIC8vIHdlIHVzZSBhbiBhcnJheSB0byBlbnN1cmUgdGhleSB3aWxsIGdldCBjYWxsZWQgZXZlbiBpZiB0aGUgYWN0dWFsIGhvb2sgbW9kaWZpZXMgdGhlIHRyZWVcbiAgICBjb25zdCBjaGlsZHJlblRvQ2FsbDogQW55TW9kZWxbXSA9IFtdXG5cbiAgICB3YWxrVHJlZShcbiAgICAgIGNoaWxkLFxuICAgICAgKGNoKSA9PiB7XG4gICAgICAgIC8vIHdlIHVzZSB0aGlzIHRvIGF2b2lkIGNhbGxpbmcgb25BdHRhY2hlZFRvUm9vdFN0b3JlXG4gICAgICAgIC8vIHR3aWNlXG4gICAgICAgIGlmIChhdHRhY2hlZFRvUm9vdFN0b3JlLmhhcyhjaCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBhdHRhY2hlZFRvUm9vdFN0b3JlLmFkZChjaClcblxuICAgICAgICBpZiAoY2ggaW5zdGFuY2VvZiBCYXNlTW9kZWwgJiYgKGNoIGFzIGFueSkub25BdHRhY2hlZFRvUm9vdFN0b3JlKSB7XG4gICAgICAgICAgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZChcbiAgICAgICAgICAgIGNoIGFzIGFueSxcbiAgICAgICAgICAgIFwib25BdHRhY2hlZFRvUm9vdFN0b3JlXCIsXG4gICAgICAgICAgICBIb29rQWN0aW9uLk9uQXR0YWNoZWRUb1Jvb3RTdG9yZVxuICAgICAgICAgIClcblxuICAgICAgICAgIGNoaWxkcmVuVG9DYWxsLnB1c2goY2ggYXMgQW55TW9kZWwpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBXYWxrVHJlZU1vZGUuUGFyZW50Rmlyc3RcbiAgICApXG5cbiAgICBjb25zdCBjaGlsZHJlblRvQ2FsbExlbiA9IGNoaWxkcmVuVG9DYWxsLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW5Ub0NhbGxMZW47IGkrKykge1xuICAgICAgY29uc3QgY2ggPSBjaGlsZHJlblRvQ2FsbFtpXVxuXG4gICAgICBjb25zdCBkaXNwb3NlciA9IChjaCBhcyBhbnkpLm9uQXR0YWNoZWRUb1Jvb3RTdG9yZSEocm9vdFN0b3JlKVxuICAgICAgaWYgKGRpc3Bvc2VyKSB7XG4gICAgICAgIG9uQXR0YWNoZWREaXNwb3NlcnMuc2V0KGNoLCBkaXNwb3NlcilcbiAgICAgIH1cbiAgICB9XG4gIH1cbilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRldGFjaEZyb21Sb290U3RvcmUgPSBhY3Rpb24oXCJkZXRhY2hGcm9tUm9vdFN0b3JlXCIsIChjaGlsZDogb2JqZWN0KTogdm9pZCA9PiB7XG4gIC8vIHdlIHVzZSBhbiBhcnJheSB0byBlbnN1cmUgdGhleSB3aWxsIGdldCBjYWxsZWQgZXZlbiBpZiB0aGUgYWN0dWFsIGhvb2sgbW9kaWZpZXMgdGhlIHRyZWVcbiAgY29uc3QgZGlzcG9zZXJzVG9DYWxsOiAoKCkgPT4gdm9pZClbXSA9IFtdXG5cbiAgd2Fsa1RyZWUoXG4gICAgY2hpbGQsXG4gICAgKGNoKSA9PiB7XG4gICAgICBpZiAoIWF0dGFjaGVkVG9Sb290U3RvcmUuZGVsZXRlKGNoKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlzcG9zZXIgPSBvbkF0dGFjaGVkRGlzcG9zZXJzLmdldChjaClcbiAgICAgIGlmIChkaXNwb3Nlcikge1xuICAgICAgICAvLyB3cmFwIGRpc3Bvc2VyIGluIGFjdGlvblxuICAgICAgICBjb25zdCBkaXNwb3NlckFjdGlvbiA9IHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgbmFtZU9yTmFtZUZuOiBIb29rQWN0aW9uLk9uQXR0YWNoZWRUb1Jvb3RTdG9yZURpc3Bvc2VyLFxuICAgICAgICAgIGZuOiBkaXNwb3NlcixcbiAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICAgICAgICB9KS5iaW5kKGNoKVxuICAgICAgICBvbkF0dGFjaGVkRGlzcG9zZXJzLmRlbGV0ZShjaClcblxuICAgICAgICBkaXNwb3NlcnNUb0NhbGwucHVzaChkaXNwb3NlckFjdGlvbilcbiAgICAgIH1cbiAgICB9LFxuICAgIFdhbGtUcmVlTW9kZS5DaGlsZHJlbkZpcnN0XG4gIClcblxuICBjb25zdCBkaXNwb3NlcnNUb0NhbGxMZW4gPSBkaXNwb3NlcnNUb0NhbGwubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcG9zZXJzVG9DYWxsTGVuOyBpKyspIHtcbiAgICBkaXNwb3NlcnNUb0NhbGxbaV0oKVxuICB9XG59KVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjcmVhdGVBdG9tLCBJQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGZhc3RHZXRSb290LCBpc1Jvb3QgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgeyBhdHRhY2hUb1Jvb3RTdG9yZSwgZGV0YWNoRnJvbVJvb3RTdG9yZSB9IGZyb20gXCIuL2F0dGFjaERldGFjaFwiXG5cbmNvbnN0IHJvb3RTdG9yZXMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcbmNvbnN0IHJvb3RTdG9yZUF0b21zID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQXRvbT4oKVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG1vZGVsIC8gdHJlZSBub2RlIG9iamVjdCBhcyBhIHJvb3Qgc3RvcmUgdHJlZS5cbiAqIE1hcmtpbmcgYSBtb2RlbCBvYmplY3QgYXMgYSByb290IHN0b3JlIHRyZWUgc2VydmVzIHNldmVyYWwgcHVycG9zZXM6XG4gKiAtIEl0IGFsbG93cyB0aGUgYG9uQXR0YWNoZWRUb1Jvb3RTdG9yZWAgaG9vayAocGx1cyBkaXNwb3NlcikgdG8gYmUgaW52b2tlZCBvbiBtb2RlbHMgb25jZSB0aGV5IGJlY29tZSBwYXJ0IG9mIHRoaXMgdHJlZS5cbiAqICAgVGhlc2UgaG9va3MgY2FuIGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gYXR0YWNoIGVmZmVjdHMgYW5kIHNlcnZlIGFzIHNvbWUgc29ydCBvZiBpbml0aWFsaXphdGlvbi5cbiAqIC0gSXQgYWxsb3dzIGF1dG8gZGV0YWNoYWJsZSByZWZlcmVuY2VzIHRvIHdvcmsgcHJvcGVybHkuXG4gKlxuICogQHR5cGVwYXJhbSBUIE9iamVjdCB0eXBlLlxuICogQHBhcmFtIG5vZGUgTm9kZSBvYmplY3QgdG8gcmVnaXN0ZXIgYXMgcm9vdCBzdG9yZS5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIG1vZGVsIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCByZWdpc3RlclJvb3RTdG9yZTogPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQpID0+IFQgPSBhY3Rpb24oXG4gIFwicmVnaXN0ZXJSb290U3RvcmVcIixcbiAgKG5vZGUpID0+IHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gICAgaWYgKHJvb3RTdG9yZXMuaGFzKG5vZGUpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwib2JqZWN0IGFscmVhZHkgcmVnaXN0ZXJlZCBhcyByb290IHN0b3JlXCIpXG4gICAgfVxuXG4gICAgaWYgKCFpc1Jvb3Qobm9kZSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHJvb3Qgc3RvcmUgbXVzdCBub3QgaGF2ZSBhIHBhcmVudFwiKVxuICAgIH1cblxuICAgIHJvb3RTdG9yZXMuYWRkKG5vZGUpXG5cbiAgICBhdHRhY2hUb1Jvb3RTdG9yZShub2RlLCBub2RlKVxuXG4gICAgZ2V0T3JDcmVhdGVSb290U3RvcmVBdG9tKG5vZGUpLnJlcG9ydENoYW5nZWQoKVxuICAgIHJldHVybiBub2RlXG4gIH1cbilcblxuLyoqXG4gKiBVbnJlZ2lzdGVycyBhbiBvYmplY3QgdG8gbWFyayBpdCBhcyBubyBsb25nZXIgYSByb290IHN0b3JlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgb2JqZWN0IHRvIHVucmVnaXN0ZXIgYXMgcm9vdCBzdG9yZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVucmVnaXN0ZXJSb290U3RvcmU6IChub2RlOiBvYmplY3QpID0+IHZvaWQgPSBhY3Rpb24oXCJ1bnJlZ2lzdGVyUm9vdFN0b3JlXCIsIChub2RlKSA9PiB7XG4gIGlmICghaXNSb290U3RvcmUobm9kZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwibm90IGEgcm9vdCBzdG9yZVwiKVxuICB9XG5cbiAgcm9vdFN0b3Jlcy5kZWxldGUobm9kZSlcblxuICBkZXRhY2hGcm9tUm9vdFN0b3JlKG5vZGUpXG5cbiAgZ2V0T3JDcmVhdGVSb290U3RvcmVBdG9tKG5vZGUpLnJlcG9ydENoYW5nZWQoKVxufSlcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBvYmplY3QgaXMgbWFya2VkIGFzIGEgcm9vdCBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBPYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSb290U3RvcmUobm9kZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgcmV0dXJuIGZhc3RJc1Jvb3RTdG9yZShub2RlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdElzUm9vdFN0b3JlKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBnZXRPckNyZWF0ZVJvb3RTdG9yZUF0b20obm9kZSkucmVwb3J0T2JzZXJ2ZWQoKVxuICByZXR1cm4gcm9vdFN0b3Jlcy5oYXMobm9kZSlcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSByb290IHN0b3JlIG9mIGEgZ2l2ZW4gdHJlZSBjaGlsZCwgb3IgdW5kZWZpbmVkIGlmIG5vbmUuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJvb3Qgc3RvcmUgdHlwZS5cbiAqIEBwYXJhbSBub2RlIFRhcmdldCB0byBmaW5kIHRoZSByb290IHN0b3JlIGZvci5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290U3RvcmU8VCBleHRlbmRzIG9iamVjdD4obm9kZTogb2JqZWN0KTogVCB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgcmV0dXJuIGZhc3RHZXRSb290U3RvcmUobm9kZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRSb290U3RvcmU8VCBleHRlbmRzIG9iamVjdD4obm9kZTogb2JqZWN0KTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJvb3QgPSBmYXN0R2V0Um9vdChub2RlKVxuICByZXR1cm4gZmFzdElzUm9vdFN0b3JlKHJvb3QpID8gcm9vdCA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBnZXRPckNyZWF0ZVJvb3RTdG9yZUF0b20obm9kZTogb2JqZWN0KTogSUF0b20ge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUocm9vdFN0b3JlQXRvbXMsIG5vZGUsICgpID0+IGNyZWF0ZUF0b20oXCJyb290U3RvcmVcIikpXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIGlzQWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBQYXRoRWxlbWVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzRnVuY3Rpb24sIGRlbGV0ZUZyb21BcnJheSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4vUGF0Y2hcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxQYXRjaFJlY29yZGVyIHtcbiAgcGF0Y2hlcyE6IFBhdGNoW11cbiAgaW52UGF0Y2hlcyE6IFBhdGNoW11cblxuICByZWNvcmQocGF0Y2hlczogUGF0Y2hbXSwgaW52UGF0Y2hlczogUGF0Y2hbXSkge1xuICAgIHRoaXMucGF0Y2hlcyA9IHBhdGNoZXNcbiAgICB0aGlzLmludlBhdGNoZXMgPSBpbnZQYXRjaGVzXG4gIH1cblxuICBlbWl0KG9iajogb2JqZWN0KSB7XG4gICAgZW1pdFBhdGNoKG9iaiwgdGhpcy5wYXRjaGVzLCB0aGlzLmludlBhdGNoZXMsIHRydWUpXG4gIH1cbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiBhIHBhdGNoIGlzIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE9uUGF0Y2hlc0xpc3RlbmVyID0gKHBhdGNoZXM6IFBhdGNoW10sIGludmVyc2VQYXRjaGVzOiBQYXRjaFtdKSA9PiB2b2lkXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gYSBnbG9iYWwgcGF0Y2ggaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgT25HbG9iYWxQYXRjaGVzTGlzdGVuZXIgPSAoXG4gIHRhcmdldDogb2JqZWN0LFxuICBwYXRjaGVzOiBQYXRjaFtdLFxuICBpbnZlcnNlUGF0Y2hlczogUGF0Y2hbXVxuKSA9PiB2b2lkXG5cbi8qKlxuICogRGlzcG9zZXIgZnVuY3Rpb24gdG8gc3RvcCBsaXN0ZW5pbmcgdG8gcGF0Y2hlcy5cbiAqL1xuZXhwb3J0IHR5cGUgT25QYXRjaGVzRGlzcG9zZXIgPSAoKSA9PiB2b2lkXG5cbmNvbnN0IHBhdGNoTGlzdGVuZXJzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBPblBhdGNoZXNMaXN0ZW5lcltdPigpXG5jb25zdCBnbG9iYWxQYXRjaExpc3RlbmVyczogT25HbG9iYWxQYXRjaGVzTGlzdGVuZXJbXSA9IFtdXG5cbi8qKlxuICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIHBhdGNoIGlzIGdlbmVyYXRlZCBmb3IgdGhlIHRyZWUgb2YgdGhlIGdpdmVuIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCBvYmplY3Qgb2YgdGhlIHBhdGNoIGxpc3RlbmVyLlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGV2ZXJ5dGltZSBhIHBhdGNoIGlzIGdlbmVyYXRlZCBmb3IgdGhlIG9iamVjdCBvciBpdHMgY2hpbGRyZW4uXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHBhdGNoZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblBhdGNoZXMoc3VidHJlZVJvb3Q6IG9iamVjdCwgbGlzdGVuZXI6IE9uUGF0Y2hlc0xpc3RlbmVyKTogT25QYXRjaGVzRGlzcG9zZXIge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG4gIGFzc2VydElzRnVuY3Rpb24obGlzdGVuZXIsIFwibGlzdGVuZXJcIilcblxuICBpZiAoIWlzQWN0aW9uKGxpc3RlbmVyKSkge1xuICAgIGxpc3RlbmVyID0gYWN0aW9uKGxpc3RlbmVyLm5hbWUgfHwgXCJvblBhdGNoZXNMaXN0ZW5lclwiLCBsaXN0ZW5lcilcbiAgfVxuXG4gIGxldCBsaXN0ZW5lcnNGb3JPYmplY3QgPSBwYXRjaExpc3RlbmVycy5nZXQoc3VidHJlZVJvb3QpXG4gIGlmICghbGlzdGVuZXJzRm9yT2JqZWN0KSB7XG4gICAgbGlzdGVuZXJzRm9yT2JqZWN0ID0gW11cbiAgICBwYXRjaExpc3RlbmVycy5zZXQoc3VidHJlZVJvb3QsIGxpc3RlbmVyc0Zvck9iamVjdClcbiAgfVxuXG4gIGxpc3RlbmVyc0Zvck9iamVjdC5wdXNoKGxpc3RlbmVyKVxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRlbGV0ZUZyb21BcnJheShsaXN0ZW5lcnNGb3JPYmplY3QhLCBsaXN0ZW5lcilcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBwYXRjaCBpcyBnZW5lcmF0ZWQgYW55d2hlcmUuXG4gKiBVc3VhbGx5IHByZWZlciB1c2luZyBgb25QYXRjaGVzYC5cbiAqXG4gKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgZXZlcnl0aW1lIGEgcGF0Y2ggaXMgZ2VuZXJhdGVkIGFueXdoZXJlLlxuICogQHJldHVybnMgQSBkaXNwb3NlciB0byBzdG9wIGxpc3RlbmluZyB0byBwYXRjaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25HbG9iYWxQYXRjaGVzKGxpc3RlbmVyOiBPbkdsb2JhbFBhdGNoZXNMaXN0ZW5lcik6IE9uUGF0Y2hlc0Rpc3Bvc2VyIHtcbiAgYXNzZXJ0SXNGdW5jdGlvbihsaXN0ZW5lciwgXCJsaXN0ZW5lclwiKVxuXG4gIGlmICghaXNBY3Rpb24obGlzdGVuZXIpKSB7XG4gICAgbGlzdGVuZXIgPSBhY3Rpb24obGlzdGVuZXIubmFtZSB8fCBcIm9uR2xvYmFsUGF0Y2hlc0xpc3RlbmVyXCIsIGxpc3RlbmVyKVxuICB9XG5cbiAgZ2xvYmFsUGF0Y2hMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcbiAgcmV0dXJuICgpID0+IHtcbiAgICBkZWxldGVGcm9tQXJyYXkoZ2xvYmFsUGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKVxuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRQYXRjaChcbiAgb2JqOiBvYmplY3QsXG4gIHBhdGNoZXM6IFBhdGNoW10sXG4gIGludmVyc2VQYXRjaGVzOiBQYXRjaFtdLFxuICBlbWl0R2xvYmFsbHk6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAocGF0Y2hlcy5sZW5ndGggPD0gMCAmJiBpbnZlcnNlUGF0Y2hlcy5sZW5ndGggPD0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZmlyc3QgZW1pdCBnbG9iYWwgbGlzdGVuZXJzXG4gIGlmIChlbWl0R2xvYmFsbHkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsb2JhbFBhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGdsb2JhbFBhdGNoTGlzdGVuZXJzW2ldXG4gICAgICBsaXN0ZW5lcihvYmosIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRoZW4gcGVyIHN1YnRyZWUgbGlzdGVuZXJzXG4gIGNvbnN0IGxpc3RlbmVyc0Zvck9iamVjdCA9IHBhdGNoTGlzdGVuZXJzLmdldChvYmopXG4gIGlmIChsaXN0ZW5lcnNGb3JPYmplY3QpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVyc0Zvck9iamVjdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBsaXN0ZW5lcnNGb3JPYmplY3RbaV1cbiAgICAgIGxpc3RlbmVyKHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKVxuICAgIH1cbiAgfVxuXG4gIC8vIGFuZCBhbHNvIGVtaXQgc3VidHJlZSBsaXN0ZW5lcnMgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3RcbiAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoKG9iailcbiAgaWYgKHBhcmVudFBhdGgpIHtcbiAgICAvLyB0d2VhayBwYXRjaGVzIHNvIHRoZXkgaW5jbHVkZSB0aGUgY2hpbGQgcGF0aFxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhcmVudFBhdGgucGF0aFxuICAgIGNvbnN0IG5ld1BhdGNoZXMgPSBwYXRjaGVzLm1hcCgocCkgPT4gYWRkUGF0aFRvUGF0Y2gocCwgY2hpbGRQYXRoKSlcbiAgICBjb25zdCBuZXdJbnZlcnNlUGF0Y2hlcyA9IGludmVyc2VQYXRjaGVzLm1hcCgocCkgPT4gYWRkUGF0aFRvUGF0Y2gocCwgY2hpbGRQYXRoKSlcblxuICAgIC8vIGZhbHNlIHRvIGF2b2lkIGVtaXR0aW5nIGdsb2JhbCBwYXRjaGVzIGFnYWluIGZvciB0aGUgc2FtZSBjaGFuZ2VcbiAgICBlbWl0UGF0Y2gocGFyZW50UGF0aC5wYXJlbnQsIG5ld1BhdGNoZXMsIG5ld0ludmVyc2VQYXRjaGVzLCBmYWxzZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRQYXRoVG9QYXRjaChwYXRjaDogUGF0Y2gsIHBhdGg6IFBhdGhFbGVtZW50KTogUGF0Y2gge1xuICByZXR1cm4ge1xuICAgIC4uLnBhdGNoLFxuICAgIHBhdGg6IFtwYXRoLCAuLi5wYXRjaC5wYXRoXSxcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbE1ldGFkYXRhU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBpc0RhdGFNb2RlbCwgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBBc3NvY2lhdGVkIGRhdGEgbW9kZWwgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YU1vZGVsTWV0YWRhdGEge1xuICAvKipcbiAgICogQXNzb2NpYXRlZCBkYXRhIHR5cGUgZm9yIHJ1bnRpbWUgY2hlY2tpbmcgKGlmIGFueSkuXG4gICAqL1xuICBkYXRhVHlwZT86IEFueVR5cGVcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGZvciBhIGRhdGEgbW9kZWwgaW5zdGFuY2Ugb3IgY2xhc3MuXG4gKlxuICogQHBhcmFtIG1vZGVsQ2xhc3NPckluc3RhbmNlIERhdGEgbW9kZWwgY2xhc3Mgb3IgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFNb2RlbE1ldGFkYXRhKFxuICBtb2RlbENsYXNzT3JJbnN0YW5jZTogQW55RGF0YU1vZGVsIHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+XG4pOiBEYXRhTW9kZWxNZXRhZGF0YSB7XG4gIGlmIChpc0RhdGFNb2RlbChtb2RlbENsYXNzT3JJbnN0YW5jZSkpIHtcbiAgICByZXR1cm4gKG1vZGVsQ2xhc3NPckluc3RhbmNlIGFzIGFueSkuY29uc3RydWN0b3JbbW9kZWxNZXRhZGF0YVN5bWJvbF1cbiAgfSBlbHNlIGlmIChpc0RhdGFNb2RlbENsYXNzKG1vZGVsQ2xhc3NPckluc3RhbmNlKSkge1xuICAgIHJldHVybiAobW9kZWxDbGFzc09ySW5zdGFuY2UgYXMgYW55KVttb2RlbE1ldGFkYXRhU3ltYm9sXVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoYG1vZGVsQ2xhc3NPckluc3RhbmNlIG11c3QgYmUgYSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZWApXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi8uLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBnZXREYXRhTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi8uLi9kYXRhTW9kZWwvZ2V0RGF0YU1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi8uLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzLCBNb2RlbERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbFByb3BzSW5mb1wiXG5pbXBvcnQgeyBub0RlZmF1bHRWYWx1ZSB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGZhaWx1cmUsIGxhenkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgSWRlbnRpdHlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuXG5jb25zdCBjYWNoZWREYXRhTW9kZWxUeXBlQ2hlY2tlciA9IG5ldyBXZWFrTWFwPE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiwgVHlwZUNoZWNrZXI+KClcblxudHlwZSBfQ2xhc3M8VD4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG50eXBlIF9DbGFzc09yT2JqZWN0PE0sIEs+ID0gSyBleHRlbmRzIE0gPyBvYmplY3QgOiBfQ2xhc3M8Sz4gfCAoKCkgPT4gX0NsYXNzPEs+KVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBkYXRhIG1vZGVsIGRhdGEuXG4gKiBUaGUgdHlwZSByZWZlcmVuY2VkIGluIHRoZSBtb2RlbCBkZWNvcmF0b3Igd2lsbCBiZSB1c2VkIGZvciB0eXBlIGNoZWNraW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3Qgc29tZURhdGFNb2RlbERhdGFUeXBlID0gdHlwZXMuZGF0YU1vZGVsRGF0YShTb21lTW9kZWwpXG4gKiAvLyBvciBmb3IgcmVjdXJzaXZlIG1vZGVsc1xuICogY29uc3Qgc29tZURhdGFNb2RlbERhdGFUeXBlID0gdHlwZXMuZGF0YU1vZGVsRGF0YTxTb21lTW9kZWw+KCgpID0+IFNvbWVNb2RlbClcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gTSBEYXRhIG1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxDbGFzcyBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0RhdGFNb2RlbERhdGE8TSA9IG5ldmVyLCBLID0gTT4oXG4gIG1vZGVsQ2xhc3M6IF9DbGFzc09yT2JqZWN0PE0sIEs+XG4pOiBJZGVudGl0eVR5cGU8XG4gIE1vZGVsRGF0YTxLIGV4dGVuZHMgTSA/IChNIGV4dGVuZHMgQW55RGF0YU1vZGVsID8gTSA6IG5ldmVyKSA6IEsgZXh0ZW5kcyBBbnlEYXRhTW9kZWwgPyBLIDogbmV2ZXI+XG4+IHtcbiAgLy8gaWYgd2UgdHlwZSBpdCBhbnkgc3Ryb25nZXIgdGhlbiByZWN1cnNpdmUgZGVmcyBhbmQgc28gb24gc3RvcCB3b3JraW5nXG5cbiAgaWYgKCFpc0RhdGFNb2RlbENsYXNzKG1vZGVsQ2xhc3MpICYmIHR5cGVvZiBtb2RlbENsYXNzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyByZXNvbHZlIGxhdGVyXG4gICAgY29uc3QgbW9kZWxDbGFzc0ZuID0gbW9kZWxDbGFzcyBhcyAoKSA9PiBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbiAgICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IERhdGFNb2RlbERhdGFUeXBlSW5mbyh0LCBtb2RlbENsYXNzRm4oKSlcbiAgICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHR5cGVzRGF0YU1vZGVsRGF0YShtb2RlbENsYXNzRm4oKSkgYXMgYW55LCB0eXBlSW5mb0dlbikgYXMgYW55XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbW9kZWxDbGF6ejogTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+ID0gbW9kZWxDbGFzcyBhcyBhbnlcblxuICAgIGNvbnN0IGNhY2hlZFR5cGVDaGVja2VyID0gY2FjaGVkRGF0YU1vZGVsVHlwZUNoZWNrZXIuZ2V0KG1vZGVsQ2xhenopXG4gICAgaWYgKGNhY2hlZFR5cGVDaGVja2VyKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVHlwZUNoZWNrZXIgYXMgYW55XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBEYXRhTW9kZWxEYXRhVHlwZUluZm8odCwgbW9kZWxDbGF6eilcblxuICAgIGNvbnN0IHRjID0gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhenopIVxuICAgICAgY29uc3QgdHlwZU5hbWUgPSBgRGF0YU1vZGVsRGF0YSgke21vZGVsSW5mby5uYW1lfSlgXG5cbiAgICAgIGNvbnN0IGRhdGFUeXBlQ2hlY2tlciA9IGdldERhdGFNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhenopLmRhdGFUeXBlXG4gICAgICBpZiAoIWRhdGFUeXBlQ2hlY2tlcikge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGB0eXBlIGNoZWNraW5nIGNhbm5vdCBiZSBwZXJmb3JtZWQgb3ZlciBkYXRhIG1vZGVsIGRhdGEgb2YgdHlwZSAnJHttb2RlbEluZm8ubmFtZX0nIHNpbmNlIHRoYXQgbW9kZWwgdHlwZSBoYXMgbm8gZGF0YSB0eXBlIGRlY2xhcmVkLCBjb25zaWRlciBhZGRpbmcgYSBkYXRhIHR5cGUgb3IgdXNpbmcgdHlwZXMudW5jaGVja2VkKCkgaW5zdGVhZGBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvbHZlZERhdGFUeXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihkYXRhVHlwZUNoZWNrZXIpXG5cbiAgICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LFxuXG4gICAgICAgICh2YWx1ZSwgcGF0aCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5jaGVjayh2YWx1ZSwgcGF0aClcbiAgICAgICAgfSxcblxuICAgICAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLnNuYXBzaG90VHlwZSh2YWx1ZSkgPyB0aGlzVGMgOiBudWxsXG4gICAgICAgIH0sXG5cbiAgICAgICAgKHNuOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgKHNuOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgICAgICB9XG4gICAgICApXG5cbiAgICAgIHJldHVybiB0aGlzVGNcbiAgICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG5cbiAgICBjYWNoZWREYXRhTW9kZWxUeXBlQ2hlY2tlci5zZXQobW9kZWxDbGF6eiwgdGMpXG5cbiAgICByZXR1cm4gdGMgYXMgYW55XG4gIH1cbn1cblxuLyoqXG4gKiBgdHlwZXMuZGF0YU1vZGVsRGF0YWAgdHlwZSBpbmZvIGZvciBhIG1vZGVsIHByb3BzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFNb2RlbERhdGFUeXBlSW5mb1Byb3BzIHtcbiAgcmVhZG9ubHkgW3Byb3BOYW1lOiBzdHJpbmddOiBSZWFkb25seTx7XG4gICAgdHlwZTogQW55U3RhbmRhcmRUeXBlIHwgdW5kZWZpbmVkXG4gICAgdHlwZUluZm86IFR5cGVJbmZvIHwgdW5kZWZpbmVkXG4gICAgaGFzRGVmYXVsdDogYm9vbGVhblxuICAgIGRlZmF1bHQ6IGFueVxuICB9PlxufVxuXG4vKipcbiAqIGB0eXBlcy5kYXRhTW9kZWxEYXRhYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhTW9kZWxEYXRhVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIHByaXZhdGUgX3Byb3BzID0gbGF6eSgoKSA9PiB7XG4gICAgY29uc3Qgb2JqU2NoZW1hID0gZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKHRoaXMubW9kZWxDbGFzcylcblxuICAgIGNvbnN0IHByb3BUeXBlczogTy5Xcml0YWJsZTxEYXRhTW9kZWxEYXRhVHlwZUluZm9Qcm9wcz4gPSB7fVxuICAgIE9iamVjdC5rZXlzKG9ialNjaGVtYSkuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHByb3BEYXRhID0gb2JqU2NoZW1hW3Byb3BOYW1lXVxuXG4gICAgICBjb25zdCB0eXBlID0gcHJvcERhdGEuX2ludGVybmFsLnR5cGVDaGVja2VyIGFzIGFueSBhcyBBbnlTdGFuZGFyZFR5cGVcblxuICAgICAgbGV0IHR5cGVJbmZvOiBUeXBlSW5mbyB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgdHlwZUluZm8gPSBnZXRUeXBlSW5mbyh0eXBlKVxuICAgICAgfVxuXG4gICAgICBsZXQgaGFzRGVmYXVsdCA9IGZhbHNlXG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnlcbiAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuXG4gICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWUgIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWVcbiAgICAgICAgaGFzRGVmYXVsdCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgcHJvcFR5cGVzW3Byb3BOYW1lXSA9IHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdHlwZUluZm8sXG4gICAgICAgIGhhc0RlZmF1bHQsXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBwcm9wVHlwZXNcbiAgfSlcblxuICBnZXQgcHJvcHMoKTogRGF0YU1vZGVsRGF0YVR5cGVJbmZvUHJvcHMge1xuICAgIHJldHVybiB0aGlzLl9wcm9wcygpXG4gIH1cblxuICBnZXQgbW9kZWxUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQodGhpcy5tb2RlbENsYXNzKSFcbiAgICByZXR1cm4gbW9kZWxJbmZvLm5hbWVcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPikge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHsgaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbERhdGEgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGFwcGx5TW9kZWxJbml0aWFsaXplcnMgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbmV3TW9kZWxcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlLCBtYWtlUHJvcFJlYWRvbmx5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuL0RhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyBnZXREYXRhTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuL2dldERhdGFNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGFzc2VydElzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcm5hbE5ld0RhdGFNb2RlbCA9IGFjdGlvbihcbiAgXCJuZXdNb2RlbFwiLFxuICA8TSBleHRlbmRzIEFueURhdGFNb2RlbD4oXG4gICAgb3JpZ01vZGVsT2JqOiBNLFxuICAgIHR3ZWFrZWREYXRhOiBNb2RlbERhdGE8TT4sXG4gICAgb3B0aW9uczogUGljazxEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMsIFwibW9kZWxDbGFzc1wiPlxuICApOiBNID0+IHtcbiAgICBjb25zdCB7IG1vZGVsQ2xhc3M6IF9tb2RlbENsYXNzIH0gPSBvcHRpb25zXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IF9tb2RlbENsYXNzIVxuXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBhc3NlcnRJc0RhdGFNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIFwibW9kZWxDbGFzc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsT2JqID0gb3JpZ01vZGVsT2JqIGFzIE8uV3JpdGFibGU8TT5cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpXG4gICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBubyBtb2RlbCBpbmZvIGZvciBjbGFzcyAke21vZGVsQ2xhc3MubmFtZX0gY291bGQgYmUgZm91bmQgLSBkaWQgeW91IGZvcmdldCB0byBhZGQgdGhlIEBtb2RlbCBkZWNvcmF0b3I/YFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIGxpbmsgaXQsIGFuZCBtYWtlIGl0IHJlYWRvbmx5XG4gICAgbW9kZWxPYmouJCA9IHR3ZWFrZWREYXRhXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBtYWtlUHJvcFJlYWRvbmx5KG1vZGVsT2JqLCBcIiRcIiwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyB0eXBlIGNoZWNrIGl0IGlmIG5lZWRlZFxuICAgIGlmIChpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSAmJiBnZXREYXRhTW9kZWxNZXRhZGF0YShtb2RlbENsYXNzKS5kYXRhVHlwZSkge1xuICAgICAgY29uc3QgZXJyID0gbW9kZWxPYmoudHlwZUNoZWNrKClcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZXJyLnRocm93KG1vZGVsT2JqKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJ1biBhbnkgZXh0cmEgaW5pdGlhbGl6ZXJzIGZvciB0aGUgY2xhc3MgYXMgbmVlZGVkXG4gICAgYXBwbHlNb2RlbEluaXRpYWxpemVycyhtb2RlbENsYXNzLCBtb2RlbE9iailcblxuICAgIHJldHVybiBtb2RlbE9iaiBhcyBNXG4gIH1cbilcbiIsImltcG9ydCB7IE1vZGVsQ2xhc3MsIHByb3BzVHlwZVN5bWJvbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsUHJvcHNJbmZvXCJcbmltcG9ydCB7XG4gIE1vZGVsUHJvcHMsXG4gIE1vZGVsUHJvcHNUb0NyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvRGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIG5vRGVmYXVsdFZhbHVlLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyBpc1RyZWVOb2RlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyB0b1RyZWVOb2RlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgdHlwZXNEYXRhTW9kZWxEYXRhIH0gZnJvbSBcIi4uL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzRGF0YU1vZGVsRGF0YVwiXG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZUNoZWNrXCJcbmltcG9ydCB0eXBlIHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrRXJyb3JcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi9EYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHsgaW50ZXJuYWxOZXdEYXRhTW9kZWwgfSBmcm9tIFwiLi9uZXdEYXRhTW9kZWxcIlxuXG5jb25zdCBkYXRhTW9kZWxJbnN0YW5jZUNhY2hlID0gbmV3IFdlYWtNYXA8TW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LCBXZWFrTWFwPGFueSwgQW55RGF0YU1vZGVsPj4oKVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGEgbW9kZWxzLiBVc2UgYERhdGFNb2RlbGAgaW5zdGVhZCB3aGVuIGV4dGVuZGluZy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25MYXp5SW5pdGAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIERhdGEgUHJvcHMgZGF0YSB0eXBlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZURhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiB7XG4gIC8vIGp1c3QgdG8gbWFrZSB0eXBpbmcgd29yayBwcm9wZXJseVxuICBbcHJvcHNUeXBlU3ltYm9sXSE6IFRQcm9wc1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQgd2hlbiB0aGVyZSdzIHRoZSBmaXJzdCBjYWxsIHRvIGBmbihNLCBkYXRhKWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25MYXp5SW5pdD8oKTogdm9pZFxuXG4gIC8qKlxuICAgKiBEYXRhIHBhcnQgb2YgdGhlIG1vZGVsLCB3aGljaCBpcyBvYnNlcnZhYmxlIGFuZCB3aWxsIGJlIHNlcmlhbGl6ZWQgaW4gc25hcHNob3RzLlxuICAgKiBVc2UgaXQgaWYgb25lIG9mIHRoZSBkYXRhIHByb3BlcnRpZXMgbWF0Y2hlcyBvbmUgb2YgdGhlIG1vZGVsIHByb3BlcnRpZXMvZnVuY3Rpb25zLlxuICAgKiBUaGlzIGFsc28gYWxsb3dzIGFjY2VzcyB0byB0aGUgYmFja2VkIHZhbHVlcyBvZiB0cmFuc2Zvcm1lZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgJCE6IE1vZGVsUHJvcHNUb0RhdGE8VFByb3BzPlxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHR5cGUgY2hlY2sgb3ZlciB0aGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEZvciB0aGlzIHRvIHdvcmsgYSBkYXRhIHR5cGUgaGFzIHRvIGJlIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1vZGVsIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYFR5cGVDaGVja0Vycm9yYCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gZXJyb3IuXG4gICAqL1xuICB0eXBlQ2hlY2soKTogVHlwZUNoZWNrRXJyb3IgfCBudWxsIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZXNEYXRhTW9kZWxEYXRhPHRoaXM+KHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuICAgIHJldHVybiB0eXBlQ2hlY2sodHlwZSwgdGhpcy4kIGFzIGFueSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgZGF0YSBtb2RlbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGE6IE1vZGVsUHJvcHNUb0NyZWF0aW9uRGF0YTxUUHJvcHM+IHwgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPlxuICApIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiZGF0YSBtb2RlbHMgY2FuIG9ubHkgd29yayBvdmVyIGRhdGEgb2JqZWN0c1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHsgbW9kZWxDbGFzczogX21vZGVsQ2xhc3MgfTogRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zID0gYXJndW1lbnRzWzFdIGFzIGFueVxuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBfbW9kZWxDbGFzcyFcblxuICAgIHR5cGUgRGF0YSA9IE1vZGVsUHJvcHNUb0RhdGE8VFByb3BzPlxuICAgIGxldCB0d2Vha2VkRGF0YTogRGF0YVxuICAgIGlmIChpc1RyZWVOb2RlKGRhdGEpKSB7XG4gICAgICAvLyBpbiB0aGVvcnkgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgdHdlYWtlZERhdGEgPSBkYXRhIGFzIGFueSBhcyBEYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpXG4gICAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBubyBtb2RlbCBpbmZvIGZvciBjbGFzcyAke21vZGVsQ2xhc3MubmFtZX0gY291bGQgYmUgZm91bmQgLSBkaWQgeW91IGZvcmdldCB0byBhZGQgdGhlIEBtb2RlbCBkZWNvcmF0b3I/YFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZGVsUHJvcHMgPSBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8obW9kZWxDbGFzcylcblxuICAgICAgY29uc3QgaW5pdGlhbERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKVxuXG4gICAgICBjb25zdCBtb2RlbFByb3BzS2V5cyA9IE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGVsUHJvcHNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBtb2RlbFByb3BzS2V5c1tpXVxuICAgICAgICBjb25zdCBwcm9wRGF0YSA9IG1vZGVsUHJvcHNba11cblxuICAgICAgICBsZXQgbmV3VmFsdWUgPSBpbml0aWFsRGF0YSFba11cbiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgICAgIC8vIGFwcGx5IHVudHJhbnNmb3JtIChpZiBhbnkpXG4gICAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwudHJhbnNmb3JtKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC50cmFuc2Zvcm0udW50cmFuc2Zvcm0obmV3VmFsdWUsIHRoaXMsIGspXG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlIChpZiBuZWVkZWQpXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuKClcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWUgIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICBpbml0aWFsRGF0YVtrXSA9IG5ld1ZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHdlYWtlZERhdGEgPSB0b1RyZWVOb2RlKGluaXRpYWxEYXRhIGFzIERhdGEpXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VzRm9yTW9kZWxDbGFzcyA9IGdldE9yQ3JlYXRlKFxuICAgICAgZGF0YU1vZGVsSW5zdGFuY2VDYWNoZSxcbiAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAoKSA9PiBuZXcgV2Vha01hcCgpXG4gICAgKVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNGb3JNb2RlbENsYXNzLmdldCh0d2Vha2VkRGF0YSlcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgIH1cblxuICAgIGluc3RhbmNlc0Zvck1vZGVsQ2xhc3Muc2V0KHR3ZWFrZWREYXRhLCB0aGlzKVxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG1vZGVsQ2xhc3MucHJvdG90eXBlKVxuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55XG5cbiAgICAvLyBkZWxldGUgdW5uZWNlc3NhcnkgcHJvcHNcbiAgICBkZWxldGUgc2VsZltwcm9wc1R5cGVTeW1ib2xdXG5cbiAgICBpbnRlcm5hbE5ld0RhdGFNb2RlbCh0aGlzLCB0d2Vha2VkRGF0YSBhcyBhbnksIHtcbiAgICAgIG1vZGVsQ2xhc3MsXG4gICAgfSlcbiAgfVxuXG4gIHRvU3RyaW5nKG9wdGlvbnM/OiB7IHdpdGhEYXRhPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0ge1xuICAgICAgd2l0aERhdGE6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuXG4gICAgY29uc3QgZmlyc3RQYXJ0ID0gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke21vZGVsSW5mbyEubmFtZX1gXG5cbiAgICByZXR1cm4gZmluYWxPcHRpb25zLndpdGhEYXRhXG4gICAgICA/IGBbJHtmaXJzdFBhcnR9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U25hcHNob3QodGhpcykpfV1gXG4gICAgICA6IGBbJHtmaXJzdFBhcnR9XWBcbiAgfVxufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IHR5cGUgQmFzZURhdGFNb2RlbEtleXMgPSBrZXlvZiBBbnlEYXRhTW9kZWwgfCBcIm9uTGF6eUluaXRcIlxuXG4vLyB0aGVzZSBwcm9wcyB3aWxsIG5ldmVyIGJlIGhvaXN0ZWQgdG8gdGhpc1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2VEYXRhTW9kZWxQcm9wTmFtZXMgPSBuZXcgU2V0PEJhc2VEYXRhTW9kZWxLZXlzPihbXCJvbkxhenlJbml0XCIsIFwiJFwiLCBcInR5cGVDaGVja1wiXSlcblxuLyoqXG4gKiBBbnkga2luZCBvZiBkYXRhIG1vZGVsIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFueURhdGFNb2RlbCBleHRlbmRzIEJhc2VEYXRhTW9kZWw8YW55PiB7fVxuXG4vKipcbiAqIEEgZGF0YSBtb2RlbCBjbGFzcyBkZWNsYXJhdGlvbiwgbWFkZSBvZiBhIGJhc2UgbW9kZWwgYW5kIHRoZSBtb2RlbCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCB0eXBlIERhdGFNb2RlbENsYXNzRGVjbGFyYXRpb248QmFzZU1vZGVsQ2xhc3MsIE1vZGVsSW50ZXJmYWNlPiA9IEJhc2VNb2RlbENsYXNzICYge1xuICAoLi4uYXJnczogYW55W10pOiBNb2RlbEludGVyZmFjZVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBCYXNlRGF0YU1vZGVsIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIGRhdGEgbW9kZWwgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhTW9kZWwobW9kZWw6IHVua25vd24pOiBtb2RlbCBpcyBBbnlEYXRhTW9kZWwge1xuICByZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBCYXNlRGF0YU1vZGVsXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogQXNzZXJ0cyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgYSBkYXRhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBtb2RlbFxuICogQHBhcmFtIGFyZ05hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzRGF0YU1vZGVsKFxuICBtb2RlbDogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nLFxuICBjdXN0b21FcnJNc2cgPSBcIm11c3QgYmUgYSBkYXRhIG1vZGVsIGluc3RhbmNlXCJcbik6IGFzc2VydHMgbW9kZWwgaXMgQW55RGF0YU1vZGVsIHtcbiAgaWYgKCFpc0RhdGFNb2RlbChtb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9ICR7Y3VzdG9tRXJyTXNnfWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU1vZGVsQ2xhc3MobW9kZWxDbGFzczogdW5rbm93bik6IG1vZGVsQ2xhc3MgaXMgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+IHtcbiAgaWYgKHR5cGVvZiBtb2RlbENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChtb2RlbENsYXNzICE9PSBCYXNlRGF0YU1vZGVsICYmICEobW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlRGF0YU1vZGVsKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzRGF0YU1vZGVsQ2xhc3MoXG4gIG1vZGVsQ2xhc3M6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZ1xuKTogYXNzZXJ0cyBtb2RlbENsYXNzIGlzIE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiB7XG4gIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgY2xhc3NgKVxuICB9XG5cbiAgaWYgKG1vZGVsQ2xhc3MgIT09IEJhc2VEYXRhTW9kZWwgJiYgIShtb2RlbENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWwpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGV4dGVuZCBEYXRhTW9kZWxgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBnZXRHbG9iYWxDb25maWcgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mRnJvemVuIH0gZnJvbSBcIi4uL3NuYXBzaG90XCJcbmltcG9ydCB7IHR3ZWFrIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogU2hvdWxkIGZyZWV6ZSBhbmQgcGxhaW4ganNvbiBjaGVja3MgYmUgZG9uZSB3aGVuIGNyZWF0aW5nIHRoZSBmcm96ZW4gb2JqZWN0P1xuICovXG5leHBvcnQgZW51bSBGcm96ZW5DaGVja01vZGUge1xuICAvKiogT25seSB3aGVuIGluIGRldiBtb2RlICovXG4gIERldk1vZGVPbmx5ID0gXCJkZXZNb2RlT25seVwiLFxuICAvKiogQWx3YXlzICovXG4gIE9uID0gXCJvblwiLFxuICAvKiogTmV2ZXIgKi9cbiAgT2ZmID0gXCJvZmZcIixcbn1cblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBjb25zdCBmcm96ZW5LZXkgPSBcIiRmcm96ZW5cIlxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBjb250YWlucyBmcm96ZW4gZGF0YS5cbiAqIFVzZSBgZnJvemVuYCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgRGF0YSB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgRnJvemVuPFQ+IHtcbiAgLyoqXG4gICAqIEZyb3plbiBkYXRhLCBkZWVwbHkgaW1tdXRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogVFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEZyb3plbi5cbiAgICogRG8gbm90IHVzZSBkaXJlY3RseSwgdXNlIGBmcm96ZW5gIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhVG9GcmVlemVcbiAgICogQHBhcmFtIGNoZWNrTW9kZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YVRvRnJlZXplOiBULCBjaGVja01vZGU6IEZyb3plbkNoZWNrTW9kZSA9IEZyb3plbkNoZWNrTW9kZS5EZXZNb2RlT25seSkge1xuICAgIGNvbnN0IGNoZWNrID1cbiAgICAgIGNoZWNrTW9kZSA9PT0gRnJvemVuQ2hlY2tNb2RlLk9uIHx8IChjaGVja01vZGUgPT09IEZyb3plbkNoZWNrTW9kZS5EZXZNb2RlT25seSAmJiBpbkRldk1vZGUoKSlcbiAgICBpZiAoY2hlY2spIHtcbiAgICAgIGNoZWNrRGF0YUlzU2VyaWFsaXphYmxlQW5kRnJlZXplKGRhdGFUb0ZyZWV6ZSlcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhVG9GcmVlemVcblxuICAgIGlmIChjaGVjaykge1xuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLmRhdGEpXG4gICAgfVxuXG4gICAgdHdlYWsodGhpcywgdW5kZWZpbmVkKVxuICB9XG59XG5cbi8qKlxuICogTWFya3Mgc29tZSBkYXRhIGFzIGZyb3plbi4gRnJvemVuIGRhdGEgYmVjb21lcyBpbW11dGFibGUgKGF0IGxlYXN0IGluIGRldiBtb2RlKSwgYW5kIGlzIG5vdCBlbmhhbmNlZFxuICogd2l0aCBjYXBhYmlsaXRpZXMgc3VjaCBhcyBnZXR0aW5nIHRoZSBwYXJlbnQgb2YgdGhlIG9iamVjdHMgKGV4Y2VwdCBmb3IgdGhlIHJvb3Qgb2JqZWN0KSwgaXQgaXMgbm90XG4gKiBtYWRlIGRlZXBseSBvYnNlcnZhYmxlICh0aG91Z2ggdGhlIHJvb3Qgb2JqZWN0IGlzIG9ic2VydmFibGUgYnkgcmVmZXJlbmNlKSwgZXRjLlxuICogT24gdGhlIG90aGVyIGhhbmQsIHRoaXMgbWVhbnMgaXQgd2lsbCBiZSBtdWNoIGZhc3RlciB0byBjcmVhdGUvYWNjZXNzLiBVc2UgdGhpcyBmb3IgYmlnIGRhdGEgcGllY2VzXG4gKiB0aGF0IGFyZSB1bmxpa2VseSB0byBjaGFuZ2UgdW5sZXNzIGFsbCBvZiB0aGVtIGNoYW5nZSAoZm9yIGV4YW1wbGUgbGlzdHMgb2YgcG9pbnRzIGZvciBhIHBvbHlnb24sIGV0YykuXG4gKlxuICogTm90ZSB0aGF0IGRhdGEgcGFzc2VkIHRvIGZyb3plbiBtdXN0IGJlIHNlcmlhbGl6YWJsZSB0byBKU09OLCB0aGlzIGlzOlxuICogLSBwcmltaXRpdmUsIHBsYWluIG9iamVjdCwgb3IgYXJyYXlcbiAqIC0gd2l0aG91dCBjeWNsZXNcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHBhcmFtIGNoZWNrTW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvemVuPFQ+KFxuICBkYXRhOiBULFxuICBjaGVja01vZGU6IEZyb3plbkNoZWNrTW9kZSA9IEZyb3plbkNoZWNrTW9kZS5EZXZNb2RlT25seVxuKTogRnJvemVuPFQ+IHtcbiAgcmV0dXJuIG5ldyBGcm96ZW48VD4oZGF0YSwgY2hlY2tNb2RlKVxufVxuXG5mdW5jdGlvbiBjaGVja0RhdGFJc1NlcmlhbGl6YWJsZUFuZEZyZWV6ZShkYXRhOiBhbnkpIHtcbiAgLy8gVE9ETzogZGV0ZWN0IGN5Y2xlcyBhbmQgdGhyb3cgaWYgcHJlc2VudD9cblxuICAvLyBwcmltaXRpdmVzIGFyZSBva1xuICBpZiAoaXNQcmltaXRpdmUoZGF0YSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgY29uc3QgYXJyTGVuID0gZGF0YS5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyckxlbjsgaSsrKSB7XG4gICAgICBjb25zdCB2ID0gZGF0YVtpXVxuICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCAmJiAhZ2V0R2xvYmFsQ29uZmlnKCkuYWxsb3dVbmRlZmluZWRBcnJheUVsZW1lbnRzKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgXCJ1bmRlZmluZWQgaXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXJyYXlzIHNpbmNlIGl0IGlzIG5vdCBzZXJpYWxpemFibGUgaW4gSlNPTiwgY29uc2lkZXIgdXNpbmcgbnVsbCBpbnN0ZWFkXCJcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUodilcbiAgICB9XG4gICAgT2JqZWN0LmZyZWV6ZShkYXRhKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoZGF0YSkpIHtcbiAgICBjb25zdCBkYXRhS2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpXG4gICAgY29uc3QgZGF0YUtleXNMZW4gPSBkYXRhS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFLZXlzTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBkYXRhS2V5c1tpXVxuICAgICAgY29uc3QgdiA9IGRhdGFba11cblxuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUoaylcbiAgICAgIGNoZWNrRGF0YUlzU2VyaWFsaXphYmxlQW5kRnJlZXplKHYpXG4gICAgfVxuICAgIE9iamVjdC5mcmVlemUoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYGZyb3plbiBkYXRhIG11c3QgYmUgcGxhaW5seSBzZXJpYWxpemFibGUgdG8gSlNPTiwgYnV0ICR7ZGF0YX0gaXMgbm90YClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBDaGVja3MgaWYgYW4gc25hcHNob3QgaXMgYW4gc25hcHNob3QgZm9yIGEgZnJvemVuIGRhdGEuXG4gKlxuICogQHBhcmFtIHNuYXBzaG90XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGcm96ZW5TbmFwc2hvdChzbmFwc2hvdDogdW5rbm93bik6IHNuYXBzaG90IGlzIFNuYXBzaG90SW5PZkZyb3plbjxGcm96ZW48YW55Pj4ge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChzbmFwc2hvdCkgJiYgZnJvemVuS2V5IGluIHNuYXBzaG90XG59XG4iLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZW51bSBUd2Vha2VyUHJpb3JpdHkge1xuICBNb2RlbCxcbiAgQXJyYXksXG4gIFBsYWluT2JqZWN0LFxuICBGcm96ZW4sXG59XG4iLCJpbXBvcnQgeyBGcm96ZW4sIGZyb3plbktleSB9IGZyb20gXCIuLi9mcm96ZW4vRnJvemVuXCJcbmltcG9ydCB0eXBlIHsgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyBzZXROZXdJbnRlcm5hbFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2ludGVybmFsXCJcbmltcG9ydCB7IHR3ZWFrZWRPYmplY3RzIH0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgeyByZWdpc3RlclR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha1wiXG5pbXBvcnQgeyBUd2Vha2VyUHJpb3JpdHkgfSBmcm9tIFwiLi9Ud2Vha2VyUHJpb3JpdHlcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHdlYWtGcm96ZW48VCBleHRlbmRzIEZyb3plbjxhbnk+PihcbiAgZnJvemVuT2JqOiBULFxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWRcbik6IFQge1xuICB0d2Vha2VkT2JqZWN0cy5zZXQoZnJvemVuT2JqLCB1bmRlZmluZWQpXG4gIHNldFBhcmVudCh7XG4gICAgdmFsdWU6IGZyb3plbk9iaixcbiAgICBwYXJlbnRQYXRoLFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXG4gICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICAvLyBhIGZyb3plbiBpcyBub3QgYSB2YWx1ZS10eXBlXG4gICAgY2xvbmVJZkFwcGxpY2FibGU6IGZhbHNlLFxuICB9KVxuXG4gIC8vIHdlIERPTidUIHdhbnQgZGF0YSBwcm94aWZpZWQsIGJ1dCB0aGUgc25hcHNob3QgaXMgdGhlIGRhdGEgaXRzZWxmXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QoZnJvemVuT2JqLCB7IFtmcm96ZW5LZXldOiB0cnVlLCBkYXRhOiBmcm96ZW5PYmouZGF0YSB9LCB1bmRlZmluZWQsIHRydWUpXG5cbiAgcmV0dXJuIGZyb3plbk9ialxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm96ZW5Ud2Vha2VyKCkge1xuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5LkZyb3plbiwgKHZhbHVlLCBwYXJlbnRQYXRoKSA9PiB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnJvemVuKSB7XG4gICAgICByZXR1cm4gdHdlYWtGcm96ZW4odmFsdWUsIHBhcmVudFBhdGgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnRQYXRoLCBQYXJlbnRQYXRoIH0gZnJvbSBcIi4vcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGgsIFdyaXRhYmxlUGF0aCB9IGZyb20gXCIuL3BhdGhUeXBlc1wiXG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIHBhcmVudHMgKGZyb20gdGhlIG5lYXJlc3QgdW50aWwgdGhlIHJvb3QpXG4gKiB1bnRpbCBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBnaXZlbiBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzIG1hdGNoZWQgaXQgd2lsbCByZXR1cm4gdGhlIGZvdW5kIG5vZGUuXG4gKiBJZiBub25lIGlzIGZvdW5kIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIGNoaWxkIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gZm9yIGV2ZXJ5IHBhcmVudCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgZnJvbSBpbW1lZGlhdGUgcGFyZW50IHRvIHRoZSByb290LlxuICogQHBhcmFtIG1heERlcHRoIE1heCBkZXB0aCwgb3IgMCBmb3IgaW5maW5pdGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgY2hpbGQ6IG9iamVjdCxcbiAgcHJlZGljYXRlOiAocGFyZW50Tm9kZTogb2JqZWN0KSA9PiBib29sZWFuLFxuICBtYXhEZXB0aCA9IDBcbik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBmb3VuZFBhcmVudFBhdGggPSBmaW5kUGFyZW50UGF0aChjaGlsZCwgcHJlZGljYXRlLCBtYXhEZXB0aClcbiAgcmV0dXJuIGZvdW5kUGFyZW50UGF0aCA/IGZvdW5kUGFyZW50UGF0aC5wYXJlbnQgOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYGZpbmRQYXJlbnRQYXRoYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3VuZFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogRm91bmQgcGFyZW50IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudDogVFxuXG4gIC8qKlxuICAgKiBQYXRoIGZyb20gdGhlIGZvdW5kIHBhcmVudCB0byB0aGUgY2hpbGQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBQYXRoXG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIHBhcmVudHMgKGZyb20gdGhlIG5lYXJlc3QgdW50aWwgdGhlIHJvb3QpXG4gKiB1bnRpbCBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBnaXZlbiBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzIG1hdGNoZWQgaXQgd2lsbCByZXR1cm4gdGhlIGZvdW5kIG5vZGUgcGx1cyB0aGVcbiAqIHBhdGggdG8gZ2V0IGZyb20gdGhlIHBhcmVudCB0byB0aGUgY2hpbGQuXG4gKiBJZiBub25lIGlzIGZvdW5kIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIGNoaWxkIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gZm9yIGV2ZXJ5IHBhcmVudCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgZnJvbSBpbW1lZGlhdGUgcGFyZW50IHRvIHRoZSByb290LlxuICogQHBhcmFtIG1heERlcHRoIE1heCBkZXB0aCwgb3IgMCBmb3IgaW5maW5pdGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4oXG4gIGNoaWxkOiBvYmplY3QsXG4gIHByZWRpY2F0ZTogKHBhcmVudE5vZGU6IG9iamVjdCkgPT4gYm9vbGVhbixcbiAgbWF4RGVwdGggPSAwXG4pOiBGb3VuZFBhcmVudFBhdGg8VD4gfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KGNoaWxkLCBcImNoaWxkXCIpXG5cbiAgY29uc3QgcGF0aDogV3JpdGFibGVQYXRoID0gW11cblxuICBsZXQgY3VycmVudDogYW55ID0gY2hpbGRcbiAgbGV0IGRlcHRoID0gMFxuXG4gIGxldCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWRcbiAgd2hpbGUgKChwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgoY3VycmVudCkpKSB7XG4gICAgcGF0aC51bnNoaWZ0KHBhcmVudFBhdGgucGF0aClcbiAgICBjdXJyZW50ID0gcGFyZW50UGF0aC5wYXJlbnRcbiAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJlbnQ6IGN1cnJlbnQsXG4gICAgICAgIHBhdGgsXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVwdGgrK1xuICAgIGlmIChtYXhEZXB0aCA+IDAgJiYgZGVwdGggPT09IG1heERlcHRoKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBnZXREZWVwT2JqZWN0Q2hpbGRyZW4sIGdldE9iamVjdENoaWxkcmVuIH0gZnJvbSBcIi4vY29yZU9iamVjdENoaWxkcmVuXCJcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCB0aGUgY2hpbGRyZW4gb2JqZWN0cyAodGhpcyBpcywgZXhjbHVkaW5nIHByaW1pdGl2ZXMpIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbm9kZSBPYmplY3QgdG8gZ2V0IHRoZSBsaXN0IG9mIGNoaWxkcmVuIGZyb20uXG4gKiBAcGFyYW0gW29wdGlvbnNdIEFuIG9wdGlvbmFsIG9iamVjdCB3aXRoIHRoZSBgZGVlcGAgb3B0aW9uIChkZWZhdWx0cyB0byBmYWxzZSkgdG8gdHJ1ZSB0byBnZXRcbiAqIHRoZSBjaGlsZHJlbiBkZWVwbHkgb3IgZmFsc2UgdG8gZ2V0IHRoZW0gc2hhbGxvd2x5LlxuICogQHJldHVybnMgQSByZWFkb25seSBvYnNlcnZhYmxlIHNldCB3aXRoIHRoZSBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoaWxkcmVuT2JqZWN0cyhcbiAgbm9kZTogb2JqZWN0LFxuICBvcHRpb25zPzoge1xuICAgIGRlZXA/OiBib29sZWFuXG4gIH1cbik6IFJlYWRvbmx5U2V0PG9iamVjdD4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5kZWVwKSB7XG4gICAgcmV0dXJuIGdldE9iamVjdENoaWxkcmVuKG5vZGUpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldERlZXBPYmplY3RDaGlsZHJlbihub2RlKS5kZWVwXG4gIH1cbn1cbiIsImltcG9ydCB7IGdldENoaWxkcmVuT2JqZWN0cyB9IGZyb20gXCIuL2dldENoaWxkcmVuT2JqZWN0c1wiXG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgY2hpbGRyZW4gYW5kIGNvbGxlY3RzIHRoZW0gaW4gYSBzZXQgaWYgdGhlXG4gKiBnaXZlbiBwcmVkaWNhdGUgbWF0Y2hlcy5cbiAqXG4gKiBAcGFyYW0gcm9vdCBSb290IG9iamVjdCB0byBnZXQgdGhlIG1hdGNoaW5nIGNoaWxkcmVuIGZyb20uXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gZm9yIGV2ZXJ5IGNoaWxkIG9mIHRoZSByb290IG9iamVjdC5cbiAqIEBwYXJhbSBbb3B0aW9uc10gQW4gb3B0aW9uYWwgb2JqZWN0IHdpdGggdGhlIGBkZWVwYCBvcHRpb24gKGRlZmF1bHRzIHRvIGBmYWxzZWApIHNldCB0byBgdHJ1ZWAgdG9cbiAqIGdldCB0aGUgY2hpbGRyZW4gZGVlcGx5IG9yIGBmYWxzZWAgdG8gZ2V0IHRoZW0gc2hhbGxvd2x5LlxuICogQHJldHVybnMgQSByZWFkb25seSBvYnNlcnZhYmxlIHNldCB3aXRoIHRoZSBtYXRjaGluZyBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDaGlsZHJlbjxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgcm9vdDogb2JqZWN0LFxuICBwcmVkaWNhdGU6IChub2RlOiBvYmplY3QpID0+IGJvb2xlYW4sXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVlcD86IGJvb2xlYW5cbiAgfVxuKTogUmVhZG9ubHlTZXQ8VD4ge1xuICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuT2JqZWN0cyhyb290LCBvcHRpb25zKVxuXG4gIGNvbnN0IHNldCA9IG5ldyBTZXQ8YW55PigpXG5cbiAgY29uc3QgaXRlciA9IGNoaWxkcmVuLnZhbHVlcygpXG4gIGxldCBjdXIgPSBpdGVyLm5leHQoKVxuICB3aGlsZSAoIWN1ci5kb25lKSB7XG4gICAgaWYgKHByZWRpY2F0ZShjdXIudmFsdWUpKSB7XG4gICAgICBzZXQuYWRkKGN1ci52YWx1ZSlcbiAgICB9XG4gICAgY3VyID0gaXRlci5uZXh0KClcbiAgfVxuXG4gIHJldHVybiBzZXRcbn1cbiIsImltcG9ydCB7IHJlYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRDaGlsZHJlbk9iamVjdHMgfSBmcm9tIFwiLi9nZXRDaGlsZHJlbk9iamVjdHNcIlxuXG4vKipcbiAqIFJ1bnMgYSBjYWxsYmFjayBldmVyeXRpbWUgYSBuZXcgb2JqZWN0IGlzIGF0dGFjaGVkIHRvIGEgZ2l2ZW4gbm9kZS5cbiAqIFRoZSBjYWxsYmFjayBjYW4gb3B0aW9uYWxseSByZXR1cm4gYSBkaXNwb3NlciB3aGljaCB3aWxsIGJlIHJ1biB3aGVuIHRoZSBjaGlsZCBpcyBkZXRhY2hlZC5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgb3B0aW9ucyBwYXJhbWV0ZXIgYWNjZXB0cyBhbmQgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICogLSBgZGVlcDogYm9vbGVhbmAgKGRlZmF1bHQ6IGBmYWxzZWApIC0gdHJ1ZSBpZiB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHJ1biBmb3IgYWxsIGNoaWxkcmVuIGRlZXBseVxuICogb3IgZmFsc2UgaWYgaXQgaXQgc2hvdWxkIG9ubHkgcnVuIGZvciBzaGFsbG93IGNoaWxkcmVuLlxuICogLSBgZmlyZUZvckN1cnJlbnRDaGlsZHJlbjogYm9vbGVhbmAgKGRlZmF1bHQ6IGB0cnVlYCkgLSB0cnVlIGlmIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW1tZWRpYXRlbHlcbiAqIGNhbGxlZCBmb3IgY3VycmVudGx5IGF0dGFjaGVkIGNoaWxkcmVuLCBmYWxzZSBpZiBvbmx5IGZvciBmdXR1cmUgYXR0YWNobWVudHMuXG4gKlxuICogUmV0dXJucyBhIGRpc3Bvc2VyLCB3aGljaCBoYXMgYSBib29sZWFuIHBhcmFtZXRlciB3aGljaCBzaG91bGQgYmUgdHJ1ZSBpZiBwZW5kaW5nIGRldGFjaG1lbnRcbiAqIGNhbGxiYWNrcyBzaG91bGQgYmUgcnVuIG9yIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgb2JqZWN0IHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkLlxuICogQHBhcmFtIGZuIENhbGxiYWNrIGNhbGxlZCB3aGVuIGEgY2hpbGQgaXMgYXR0YWNoZWQgdG8gdGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gW29wdGlvbnNdXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DaGlsZEF0dGFjaGVkVG8oXG4gIHRhcmdldDogKCkgPT4gb2JqZWN0LFxuICBmbjogKGNoaWxkOiBvYmplY3QpID0+ICgoKSA9PiB2b2lkKSB8IHZvaWQsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVlcD86IGJvb2xlYW5cbiAgICBmaXJlRm9yQ3VycmVudENoaWxkcmVuPzogYm9vbGVhblxuICB9XG4pOiAocnVuRGV0YWNoRGlzcG9zZXJzOiBib29sZWFuKSA9PiB2b2lkIHtcbiAgYXNzZXJ0SXNGdW5jdGlvbih0YXJnZXQsIFwidGFyZ2V0XCIpXG4gIGFzc2VydElzRnVuY3Rpb24oZm4sIFwiZm5cIilcblxuICBjb25zdCBvcHRzID0ge1xuICAgIGRlZXA6IGZhbHNlLFxuICAgIHJ1bkZvckN1cnJlbnRDaGlsZHJlbjogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgY29uc3QgZGV0YWNoRGlzcG9zZXJzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCAoKSA9PiB2b2lkPigpXG5cbiAgY29uc3QgcnVuRGV0YWNoRGlzcG9zZXIgPSAobjogb2JqZWN0KSA9PiB7XG4gICAgY29uc3QgZGV0YWNoRGlzcG9zZXIgPSBkZXRhY2hEaXNwb3NlcnMuZ2V0KG4pXG4gICAgaWYgKGRldGFjaERpc3Bvc2VyKSB7XG4gICAgICBkZXRhY2hEaXNwb3NlcnMuZGVsZXRlKG4pXG4gICAgICBkZXRhY2hEaXNwb3NlcigpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWRkRGV0YWNoRGlzcG9zZXIgPSAobjogb2JqZWN0LCBkaXNwb3NlcjogKCgpID0+IHZvaWQpIHwgdm9pZCkgPT4ge1xuICAgIGlmIChkaXNwb3Nlcikge1xuICAgICAgZGV0YWNoRGlzcG9zZXJzLnNldChuLCBkaXNwb3NlcilcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRDaGlsZHJlbk9iamVjdE9wdHMgPSB7IGRlZXA6IG9wdHMuZGVlcCB9XG4gIGNvbnN0IGdldEN1cnJlbnRDaGlsZHJlbiA9ICgpID0+IHtcbiAgICBsZXQgdCA9IHRhcmdldCgpXG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0LCBcInRhcmdldCgpXCIpXG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuT2JqZWN0cyh0LCBnZXRDaGlsZHJlbk9iamVjdE9wdHMpXG5cbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0PG9iamVjdD4oKVxuXG4gICAgY29uc3QgaXRlciA9IGNoaWxkcmVuLnZhbHVlcygpXG4gICAgbGV0IGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFjdXIuZG9uZSkge1xuICAgICAgc2V0LmFkZChjdXIudmFsdWUpXG4gICAgICBjdXIgPSBpdGVyLm5leHQoKVxuICAgIH1cblxuICAgIHJldHVybiBzZXRcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRDaGlsZHJlbiA9IG9wdHMucnVuRm9yQ3VycmVudENoaWxkcmVuID8gbmV3IFNldDxvYmplY3Q+KCkgOiBnZXRDdXJyZW50Q2hpbGRyZW4oKVxuXG4gIGNvbnN0IGRpc3Bvc2VyID0gcmVhY3Rpb24oXG4gICAgKCkgPT4gZ2V0Q3VycmVudENoaWxkcmVuKCksXG4gICAgKG5ld0NoaWxkcmVuKSA9PiB7XG4gICAgICBjb25zdCBkaXNwb3NlcnNUb1J1bjogb2JqZWN0W10gPSBbXVxuXG4gICAgICAvLyBmaW5kIGRlYWRcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGlsZHJlbkl0ZXIgPSBjdXJyZW50Q2hpbGRyZW4udmFsdWVzKClcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRyZW5DdXIgPSBjdXJyZW50Q2hpbGRyZW5JdGVyLm5leHQoKVxuICAgICAgd2hpbGUgKCFjdXJyZW50Q2hpbGRyZW5DdXIuZG9uZSkge1xuICAgICAgICBjb25zdCBuID0gY3VycmVudENoaWxkcmVuQ3VyLnZhbHVlXG4gICAgICAgIGlmICghbmV3Q2hpbGRyZW4uaGFzKG4pKSB7XG4gICAgICAgICAgY3VycmVudENoaWxkcmVuLmRlbGV0ZShuKVxuXG4gICAgICAgICAgLy8gd2Ugc2hvdWxkIHJ1biBpdCBpbiBpbnZlcnNlIG9yZGVyXG4gICAgICAgICAgZGlzcG9zZXJzVG9SdW4ucHVzaChuKVxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudENoaWxkcmVuQ3VyID0gY3VycmVudENoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc3Bvc2Vyc1RvUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRpc3Bvc2Vyc1RvUnVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgcnVuRGV0YWNoRGlzcG9zZXIoZGlzcG9zZXJzVG9SdW5baV0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZmluZCBuZXdcbiAgICAgIGNvbnN0IG5ld0NoaWxkcmVuSXRlciA9IG5ld0NoaWxkcmVuLnZhbHVlcygpXG4gICAgICBsZXQgbmV3Q2hpbGRyZW5DdXIgPSBuZXdDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB3aGlsZSAoIW5ld0NoaWxkcmVuQ3VyLmRvbmUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ld0NoaWxkcmVuQ3VyLnZhbHVlXG4gICAgICAgIGlmICghY3VycmVudENoaWxkcmVuLmhhcyhuKSkge1xuICAgICAgICAgIGN1cnJlbnRDaGlsZHJlbi5hZGQobilcblxuICAgICAgICAgIGFkZERldGFjaERpc3Bvc2VyKG4sIGZuKG4pKVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3Q2hpbGRyZW5DdXIgPSBuZXdDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuIChydW5EZXRhY2hEaXNwb3NlcnM6IGJvb2xlYW4pID0+IHtcbiAgICBkaXNwb3NlcigpXG5cbiAgICBpZiAocnVuRGV0YWNoRGlzcG9zZXJzKSB7XG4gICAgICBjb25zdCBjdXJyZW50Q2hpbGRyZW5JdGVyID0gY3VycmVudENoaWxkcmVuLnZhbHVlcygpXG4gICAgICBsZXQgY3VycmVudENoaWxkcmVuQ3VyID0gY3VycmVudENoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIHdoaWxlICghY3VycmVudENoaWxkcmVuQ3VyLmRvbmUpIHtcbiAgICAgICAgY29uc3QgbiA9IGN1cnJlbnRDaGlsZHJlbkN1ci52YWx1ZVxuICAgICAgICBydW5EZXRhY2hEaXNwb3NlcihuKVxuXG4gICAgICAgIGN1cnJlbnRDaGlsZHJlbkN1ciA9IGN1cnJlbnRDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB9XG4gICAgfVxuICAgIGN1cnJlbnRDaGlsZHJlbi5jbGVhcigpXG4gIH1cbn1cbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldERlZXBPYmplY3RDaGlsZHJlbiB9IGZyb20gXCIuL2NvcmVPYmplY3RDaGlsZHJlblwiXG5cbi8qKlxuICogUmV0dXJucyBpZiB0aGUgdGFyZ2V0IGlzIGEgXCJjaGlsZFwiIG9mIHRoZSB0cmVlIG9mIHRoZSBnaXZlbiBcInBhcmVudFwiIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NoaWxkT2ZQYXJlbnQoY2hpbGQ6IG9iamVjdCwgcGFyZW50OiBvYmplY3QpOiBib29sZWFuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChjaGlsZCwgXCJjaGlsZFwiKVxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHBhcmVudCwgXCJwYXJlbnRcIilcblxuICByZXR1cm4gZ2V0RGVlcE9iamVjdENoaWxkcmVuKHBhcmVudCkuZGVlcC5oYXMoY2hpbGQpXG59XG5cbi8qKlxuICogUmV0dXJucyBpZiB0aGUgdGFyZ2V0IGlzIGEgXCJwYXJlbnRcIiB0aGF0IGhhcyBpbiBpdHMgdHJlZSB0aGUgZ2l2ZW4gXCJjaGlsZFwiIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gcGFyZW50IFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gY2hpbGQgQ2hpbGQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyZW50T2ZDaGlsZChwYXJlbnQ6IG9iamVjdCwgY2hpbGQ6IG9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNDaGlsZE9mUGFyZW50KGNoaWxkLCBwYXJlbnQpXG59XG4iLCJsZXQgdHlwZUNoZWNraW5nQWxsb3dlZCA9IHRydWVcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRUeXBlQ2hlY2tpbmcoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgbGV0IG9sZFR5cGVDaGVja2luZ0FsbG93ZWQgPSB0eXBlQ2hlY2tpbmdBbGxvd2VkXG4gIHR5cGVDaGVja2luZ0FsbG93ZWQgPSBmYWxzZVxuXG4gIHRyeSB7XG4gICAgZm4oKVxuICB9IGZpbmFsbHkge1xuICAgIHR5cGVDaGVja2luZ0FsbG93ZWQgPSBvbGRUeXBlQ2hlY2tpbmdBbGxvd2VkXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZUNoZWNraW5nQWxsb3dlZCgpIHtcbiAgcmV0dXJuIHR5cGVDaGVja2luZ0FsbG93ZWRcbn1cbiIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBlbnVtIFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IHtcbiAgQXJyYXksXG4gIEZyb3plbixcbiAgTW9kZWwsXG4gIFBsYWluT2JqZWN0LFxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi4vdHdlYWtlci90eXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgd2l0aG91dFR5cGVDaGVja2luZyB9IGZyb20gXCIuLi90d2Vha2VyL3dpdGhvdXRUeXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGRldGFjaElmTmVlZGVkLCByZWNvbmNpbGVTbmFwc2hvdCwgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZPYmplY3QgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiByZWNvbmNpbGVBcnJheVNuYXBzaG90KFxuICB2YWx1ZTogYW55LFxuICBzbjogU25hcHNob3RJbk9mT2JqZWN0PGFueVtdPixcbiAgbW9kZWxQb29sOiBNb2RlbFBvb2xcbik6IGFueVtdIHtcbiAgaWYgKCFpc0FycmF5KHZhbHVlKSkge1xuICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgcmV0dXJuIGZyb21TbmFwc2hvdChzbilcbiAgfVxuXG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlQ2hhbmdlcyA9IGdldFNuYXBzaG90KHZhbHVlKVxuXG4gIHdpdGhvdXRUeXBlQ2hlY2tpbmcoKCkgPT4ge1xuICAgIC8vIHJlbW92ZSBleGNlc3MgaXRlbXNcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gc24ubGVuZ3RoKSB7XG4gICAgICB2YWx1ZS5zcGxpY2Uoc24ubGVuZ3RoLCB2YWx1ZS5sZW5ndGggLSBzbi5sZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gcmVjb25jaWxlIHByZXNlbnQgaXRlbXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHZhbHVlW2ldXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KG9sZFZhbHVlLCBzbltpXSwgbW9kZWxQb29sLCB2YWx1ZSlcblxuICAgICAgZGV0YWNoSWZOZWVkZWQobmV3VmFsdWUsIG9sZFZhbHVlLCBtb2RlbFBvb2wpXG5cbiAgICAgIHNldCh2YWx1ZSwgaSwgbmV3VmFsdWUpXG4gICAgfVxuXG4gICAgLy8gYWRkIGV4Y2VzcyBpdGVtc1xuICAgIGZvciAobGV0IGkgPSB2YWx1ZS5sZW5ndGg7IGkgPCBzbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUucHVzaChyZWNvbmNpbGVTbmFwc2hvdCh1bmRlZmluZWQsIHNuW2ldLCBtb2RlbFBvb2wsIHZhbHVlKSlcbiAgICB9XG4gIH0pXG5cbiAgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UodmFsdWUsIHVuZGVmaW5lZCwgc25hcHNob3RCZWZvcmVDaGFuZ2VzKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBcnJheVNuYXBzaG90UmVjb25jaWxlcigpIHtcbiAgcmVnaXN0ZXJSZWNvbmNpbGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LkFycmF5LCAodmFsdWUsIHNuLCBtb2RlbFBvb2wpID0+IHtcbiAgICBpZiAoaXNBcnJheShzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVBcnJheVNuYXBzaG90KHZhbHVlLCBzbiwgbW9kZWxQb29sKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBGcm96ZW4sIGZyb3plbiwgaXNGcm96ZW5TbmFwc2hvdCB9IGZyb20gXCIuLi9mcm96ZW4vRnJvemVuXCJcbmltcG9ydCB7IHJlZ2lzdGVyUmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mRnJvemVuIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gcmVjb25jaWxlRnJvemVuU25hcHNob3QodmFsdWU6IGFueSwgc246IFNuYXBzaG90SW5PZkZyb3plbjxGcm96ZW48YW55Pj4pOiBGcm96ZW48YW55PiB7XG4gIC8vIHJlY29uY2lsaWF0aW9uIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHRhcmdldCBpcyBhIEZyb3plbiBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIGRhdGEgKGJ5IHJlZilcbiAgLy8gaW4gdGhlb3J5IHdlIGNvdWxkIGNvbXBhcmUgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYm90aCBkYXRhcyBvciBkbyBhIGRlZXAgY29tcGFyaXNvbiwgYnV0IHRoYXQnZCBiZSB0b28gc2xvd1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGcm96ZW4gJiYgdmFsdWUuZGF0YSA9PT0gc24uZGF0YSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIHJldHVybiBmcm96ZW4oc24uZGF0YSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvemVuU25hcHNob3RSZWNvbmNpbGVyKCkge1xuICByZWdpc3RlclJlY29uY2lsZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuRnJvemVuLCAodmFsdWUsIHNuKSA9PiB7XG4gICAgaWYgKGlzRnJvemVuU25hcHNob3Qoc24pKSB7XG4gICAgICByZXR1cm4gcmVjb25jaWxlRnJvemVuU25hcHNob3QodmFsdWUsIHNuKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGRvIG5vdCBlZGl0IC5qcyBmaWxlcyBkaXJlY3RseSAtIGVkaXQgc3JjL2luZGV4LmpzdFxuXG5cbiAgdmFyIGVudkhhc0JpZ0ludDY0QXJyYXkgPSB0eXBlb2YgQmlnSW50NjRBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW5ndGgsIGksIGtleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoIWVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGlmICgoYSBpbnN0YW5jZW9mIE1hcCkgJiYgKGIgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSBvZiBhLmVudHJpZXMoKSlcbiAgICAgICAgaWYgKCFiLmhhcyhpWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICBpZiAoIWVxdWFsKGlbMV0sIGIuZ2V0KGlbMF0pKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKChhIGluc3RhbmNlb2YgU2V0KSAmJiAoYiBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGEpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIWVxdWFsKGFba2V5XSwgYltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gdHJ1ZSBpZiBib3RoIE5hTiwgZmFsc2Ugb3RoZXJ3aXNlXG4gIHJldHVybiBhIT09YSAmJiBiIT09Yjtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwsIGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBnZXRNb2RlbEluZm9Gb3JOYW1lIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBkYXRhT2JqZWN0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB7XG4gIGdldERlZXBPYmplY3RDaGlsZHJlbixcbiAgcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb24sXG59IGZyb20gXCIuLi9wYXJlbnQvY29yZU9iamVjdENoaWxkcmVuXCJcblxuZnVuY3Rpb24gYnlNb2RlbFR5cGVBbmRJZEtleShtb2RlbFR5cGU6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nKSB7XG4gIHJldHVybiBtb2RlbFR5cGUgKyBcIiBcIiArIG1vZGVsSWRcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsUG9vbCB7XG4gIHByaXZhdGUgcG9vbDogUmVhZG9ubHlNYXA8c3RyaW5nLCBBbnlNb2RlbD5cblxuICBjb25zdHJ1Y3Rvcihyb290OiBvYmplY3QpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgdXNlIHRoZSBzdWItZGF0YSAkIG9iamVjdFxuICAgIHJvb3QgPSBkYXRhT2JqZWN0UGFyZW50LmdldChyb290KSA/PyByb290XG5cbiAgICB0aGlzLnBvb2wgPSBnZXREZWVwQ2hpbGRyZW5Nb2RlbHMoZ2V0RGVlcE9iamVjdENoaWxkcmVuKHJvb3QpKVxuICB9XG5cbiAgZmluZE1vZGVsQnlUeXBlQW5kSWQobW9kZWxUeXBlOiBzdHJpbmcsIG1vZGVsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEFueU1vZGVsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbW9kZWxJZCA/IHRoaXMucG9vbC5nZXQoYnlNb2RlbFR5cGVBbmRJZEtleShtb2RlbFR5cGUsIG1vZGVsSWQpKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZmluZE1vZGVsRm9yU25hcHNob3Qoc246IGFueSk6IEFueU1vZGVsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbFR5cGUgPSBzblttb2RlbFR5cGVLZXldXG4gICAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZShtb2RlbFR5cGUpIVxuICAgIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPilcblxuICAgIHJldHVybiBtb2RlbElkUHJvcGVydHlOYW1lXG4gICAgICA/IHRoaXMuZmluZE1vZGVsQnlUeXBlQW5kSWQoc25bbW9kZWxUeXBlS2V5XSwgKHNuIGFzIGFueSlbbW9kZWxJZFByb3BlcnR5TmFtZV0pXG4gICAgICA6IHVuZGVmaW5lZFxuICB9XG59XG5cbmNvbnN0IGdldERlZXBDaGlsZHJlbk1vZGVscyA9IHJlZ2lzdGVyRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uPE1hcDxzdHJpbmcsIEFueU1vZGVsPj4oe1xuICBpbml0RGF0YSgpIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpXG4gIH0sXG5cbiAgYWRkTm9kZShub2RlLCBkYXRhKSB7XG4gICAgaWYgKGlzTW9kZWwobm9kZSkpIHtcbiAgICAgIGNvbnN0IGlkID0gbm9kZVttb2RlbElkS2V5XVxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGRhdGEuc2V0KGJ5TW9kZWxUeXBlQW5kSWRLZXkobm9kZVttb2RlbFR5cGVLZXldLCBpZCksIG5vZGUpXG4gICAgICB9XG4gICAgfVxuICB9LFxufSlcbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZU9iamVjdCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB7IGlzRnJvemVuU25hcHNob3QgfSBmcm9tIFwiLi4vZnJvemVuL0Zyb3plblwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwsIGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUsIG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlLCBpbkRldk1vZGUsIGlzQXJyYXksIGlzUGxhaW5PYmplY3QsIGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgTW9kZWxQb29sIH0gZnJvbSBcIi4uL3V0aWxzL01vZGVsUG9vbFwiXG5pbXBvcnQgeyByZWNvbmNpbGVTbmFwc2hvdCB9IGZyb20gXCIuL3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mLCBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bGwgc25hcHNob3Qgb3ZlciBhbiBvYmplY3QsIHJlY29uY2lsaW5nIGl0IHdpdGggdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBUYXJnZXQgb2JqZWN0IChtb2RlbCBvYmplY3QsIG9iamVjdCBvciBhcnJheSkuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QgdG8gYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNuYXBzaG90PFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQsIHNuYXBzaG90OiBTbmFwc2hvdEluT2Y8VD4pOiB2b2lkXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bGwgc25hcHNob3Qgb3ZlciBhbiBvYmplY3QsIHJlY29uY2lsaW5nIGl0IHdpdGggdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBUYXJnZXQgb2JqZWN0IChtb2RlbCBvYmplY3QsIG9iamVjdCBvciBhcnJheSkuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QgdG8gYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNuYXBzaG90PFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQsIHNuYXBzaG90OiBTbmFwc2hvdE91dE9mPFQ+KTogdm9pZFxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTbmFwc2hvdChub2RlOiBvYmplY3QsIHNuYXBzaG90OiB1bmtub3duKTogdm9pZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG4gIGFzc2VydElzT2JqZWN0KHNuYXBzaG90LCBcInNuYXBzaG90XCIpXG5cbiAgd3JhcHBlZEludGVybmFsQXBwbHlTbmFwc2hvdCgpLmNhbGwobm9kZSwgc25hcHNob3QpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEFwcGx5U25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4oXG4gIHRoaXM6IFQsXG4gIHNuOiBTbmFwc2hvdEluT2Y8VD4gfCBTbmFwc2hvdE91dE9mPFQ+XG4pOiB2b2lkIHtcbiAgY29uc3Qgb2JqID0gdGhpc1xuXG4gIGNvbnN0IHJlY29uY2lsZSA9ICgpID0+IHtcbiAgICBjb25zdCBtb2RlbFBvb2wgPSBuZXcgTW9kZWxQb29sKG9iailcbiAgICBjb25zdCByZXQgPSByZWNvbmNpbGVTbmFwc2hvdChvYmosIHNuLCBtb2RlbFBvb2wsIHVuZGVmaW5lZClcblxuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgaWYgKHJldCAhPT0gb2JqKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiByZWNvbmNpbGVkIG9iamVjdCBoYXMgdG8gYmUgdGhlIHNhbWVcIilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaXNBcnJheShzbikpIHtcbiAgICBpZiAoIWlzQXJyYXkob2JqKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImlmIHRoZSBzbmFwc2hvdCBpcyBhbiBhcnJheSB0aGUgdGFyZ2V0IG11c3QgYmUgYW4gYXJyYXkgdG9vXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgpXG4gIH1cblxuICBpZiAoaXNGcm96ZW5TbmFwc2hvdChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYXBwbHlTbmFwc2hvdCBjYW5ub3QgYmUgdXNlZCBvdmVyIGZyb3plbiBvYmplY3RzXCIpXG4gIH1cblxuICAvLyBhZGFwdCBzbmFwc2hvdCB0byB0YXJnZXQgbW9kZWwgaWYgcG9zc2libGVcbiAgaWYgKGlzUGxhaW5PYmplY3Qoc24pICYmIChzbiBhcyBhbnkpW21vZGVsVHlwZUtleV0gPT09IHVuZGVmaW5lZCAmJiBpc01vZGVsKG9iaikpIHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldCgob2JqIGFzIGFueSkuY29uc3RydWN0b3IpIVxuICAgIHNuID0geyAuLi5zbiwgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lIH1cbiAgfVxuXG4gIGlmIChpc01vZGVsU25hcHNob3Qoc24pKSB7XG4gICAgY29uc3QgdHlwZSA9IHNuW21vZGVsVHlwZUtleV1cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUodHlwZSlcbiAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShgbW9kZWwgd2l0aCBuYW1lIFwiJHt0eXBlfVwiIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnlgKVxuICAgIH1cblxuICAgIC8vIHdlIGRvbid0IGNoZWNrIGJ5IGFjdHVhbCBpbnN0YW5jZSBzaW5jZSB0aGUgY2xhc3MgbWlnaHQgYmUgYSBkaWZmZXJlbnQgb25lIGR1ZSB0byBob3QgcmVsb2FkaW5nXG4gICAgaWYgKCFpc01vZGVsKG9iaikpIHtcbiAgICAgIC8vIG5vdCBhIG1vZGVsIGluc3RhbmNlLCBubyByZWNvbmNpbGlhdGlvbiBwb3NzaWJsZVxuICAgICAgdGhyb3cgZmFpbHVyZShgdGhlIHRhcmdldCBmb3IgYSBtb2RlbCBzbmFwc2hvdCBtdXN0IGJlIGEgbW9kZWwgaW5zdGFuY2VgKVxuICAgIH1cblxuICAgIGlmIChvYmpbbW9kZWxUeXBlS2V5XSAhPT0gdHlwZSkge1xuICAgICAgLy8gZGlmZmVyZW50IGtpbmQgb2YgbW9kZWwsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgc25hcHNob3QgbW9kZWwgdHlwZSAnJHt0eXBlfScgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IG1vZGVsIHR5cGUgJyR7XG4gICAgICAgICAgKG9iaiBhcyBhbnkpW21vZGVsVHlwZUtleV1cbiAgICAgICAgfSdgXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZSA9IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUobW9kZWxJbmZvLmNsYXNzIGFzIE1vZGVsQ2xhc3M8QW55TW9kZWw+KVxuICAgIGlmIChtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICBjb25zdCBpZCA9IChzbiBhcyBhbnkpW21vZGVsSWRQcm9wZXJ0eU5hbWVdXG4gICAgICBpZiAob2JqW21vZGVsSWRLZXldICE9PSBpZCkge1xuICAgICAgICAvLyBkaWZmZXJlbnQgaWQsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYHNuYXBzaG90IG1vZGVsIGlkICcke2lkfScgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IG1vZGVsIGlkICcke29ialttb2RlbElkS2V5XX0nYFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgpXG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdChzbikpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qob2JqKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KG9iaikpIHtcbiAgICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICB0aHJvdyBmYWlsdXJlKFwiaWYgdGhlIHNuYXBzaG90IGlzIGFuIG9iamVjdCB0aGUgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0IHRvb1wiKVxuICAgIH1cblxuICAgIHJldHVybiByZWNvbmNpbGUoKVxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgc25hcHNob3QgLSAke3NufWApXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5U25hcHNob3QgPSBsYXp5KCgpID0+XG4gIHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBCdWlsdEluQWN0aW9uLkFwcGx5U25hcHNob3QsXG4gICAgZm46IGludGVybmFsQXBwbHlTbmFwc2hvdCxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuIiwiaW1wb3J0IHsgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuXG4vKipcbiAqIExpc3RlbmVyIGZ1bmN0aW9uIGZvciBvblNuYXBzaG90LlxuICovXG5leHBvcnQgdHlwZSBPblNuYXBzaG90TGlzdGVuZXI8VD4gPSAoc246IFNuYXBzaG90T3V0T2Y8VD4sIHByZXZTbjogU25hcHNob3RPdXRPZjxUPikgPT4gdm9pZFxuXG4vKipcbiAqIERpc3Bvc2VyIGZ1bmN0aW9uIGZvciBvblNuYXBzaG90LlxuICovXG5leHBvcnQgdHlwZSBPblNuYXBzaG90RGlzcG9zZXIgPSAoKSA9PiB2b2lkXG5cbi8qKlxuICogQWRkcyBhIHJlYWN0aW9uIHRoYXQgd2lsbCB0cmlnZ2VyIGV2ZXJ5IHRpbWUgYW4gc25hcHNob3QgY2hhbmdlcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZU9yRm4gT2JqZWN0IHRvIGdldCB0aGUgc25hcHNob3QgZnJvbSBvciBhIGZ1bmN0aW9uIHRvIGdldCBpdC5cbiAqIEBwYXJhbSBsaXN0ZW5lciBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHNuYXBzaG90IGNoYW5nZXMuXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25TbmFwc2hvdDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgbm9kZU9yRm46IFQgfCAoKCkgPT4gVCksXG4gIGxpc3RlbmVyOiBPblNuYXBzaG90TGlzdGVuZXI8VD5cbik6IE9uU25hcHNob3REaXNwb3NlciB7XG4gIGNvbnN0IG5vZGVGbiA9IHR5cGVvZiBub2RlT3JGbiA9PT0gXCJmdW5jdGlvblwiID8gKG5vZGVPckZuIGFzICgpID0+IFQpIDogKCkgPT4gbm9kZU9yRm5cblxuICBjb25zdCBub2RlID0gbm9kZUZuKClcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICBsZXQgY3VycmVudFNuYXBzaG90ID0gZ2V0U25hcHNob3Qobm9kZSlcblxuICByZXR1cm4gcmVhY3Rpb24oXG4gICAgKCkgPT4gZ2V0U25hcHNob3Qobm9kZUZuKCkpLFxuICAgIChuZXdTbmFwc2hvdCkgPT4ge1xuICAgICAgY29uc3QgcHJldlNuID0gY3VycmVudFNuYXBzaG90XG4gICAgICBjdXJyZW50U25hcHNob3QgPSBuZXdTbmFwc2hvdFxuICAgICAgbGlzdGVuZXIobmV3U25hcHNob3QsIHByZXZTbilcbiAgICB9XG4gIClcbn1cbiIsImltcG9ydCBmYXN0RGVlcEVxdWFsIGZyb20gXCJmYXN0LWRlZXAtZXF1YWwvZXM2XCJcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgdG9KUyB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90XCJcbmltcG9ydCB7IGlzVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlclwiXG5pbXBvcnQgeyBnZXRNb2J4VmVyc2lvbiB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogRGVlcGx5IGNvbXBhcmVzIHR3byB2YWx1ZXMuXG4gKlxuICogU3VwcG9ydGVkIHZhbHVlcyBhcmU6XG4gKiAtIFByaW1pdGl2ZXNcbiAqIC0gQm94ZWQgb2JzZXJ2YWJsZXNcbiAqIC0gT2JqZWN0cywgb2JzZXJ2YWJsZSBvYmplY3RzXG4gKiAtIEFycmF5cywgb2JzZXJ2YWJsZSBhcnJheXNcbiAqIC0gVHlwZWQgYXJyYXlzXG4gKiAtIE1hcHMsIG9ic2VydmFibGUgbWFwc1xuICogLSBTZXRzLCBvYnNlcnZhYmxlIHNldHNcbiAqIC0gVHJlZSBub2RlcyAob3B0aW1pemVkIGJ5IHVzaW5nIHNuYXBzaG90IGNvbXBhcmlzb24gaW50ZXJuYWxseSlcbiAqXG4gKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgbW9kZWxzIHRoZSByZXN1bHQgd2lsbCBiZSBmYWxzZSBpZiB0aGVpciBtb2RlbCBJRHMgYXJlIGRpZmZlcmVudC5cbiAqXG4gKiBAcGFyYW0gYSBGaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhleSBhcmUgdGhlIGVxdWl2YWxlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFscyhhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICAvLyBxdWljayBjaGVjayBmb3IgcmVmZXJlbmNlXG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIHVzZSBzbmFwc2hvdHMgdG8gY29tcGFyZSBpZiBwb3NzaWJsZVxuICAvLyBzaW5jZSBzbmFwc2hvdHMgdXNlIHN0cnVjdHVyYWwgc2hhcmluZyBpdCBpcyBtb3JlIGxpa2VseVxuICAvLyB0byBzcGVlZCB1cCBjb21wYXJpc29uc1xuICBpZiAoaXNUcmVlTm9kZShhKSkge1xuICAgIGEgPSBnZXRTbmFwc2hvdChhKVxuICB9IGVsc2UgaWYgKGlzT2JzZXJ2YWJsZShhKSkge1xuICAgIGEgPSB0b0pTKGEsIHRvSlNPcHRpb25zKVxuICB9XG4gIGlmIChpc1RyZWVOb2RlKGIpKSB7XG4gICAgYiA9IGdldFNuYXBzaG90KGIpXG4gIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKGIpKSB7XG4gICAgYiA9IHRvSlMoYiwgdG9KU09wdGlvbnMpXG4gIH1cblxuICByZXR1cm4gZmFzdERlZXBFcXVhbChhLCBiKVxufVxuXG5jb25zdCB0b0pTT3B0aW9ucyA9XG4gIGdldE1vYnhWZXJzaW9uKCkgPj0gNlxuICAgID8gdW5kZWZpbmVkXG4gICAgOiB7XG4gICAgICAgIGV4cG9ydE1hcHNBc09iamVjdHM6IGZhbHNlLFxuICAgICAgICByZWN1cnNlRXZlcnl0aGluZzogZmFsc2UsXG4gICAgICB9XG4iLCJpbXBvcnQgeyByZW1vdmUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBpc1Jlc2VydmVkTW9kZWxLZXksIG1vZGVsSWRLZXksIG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsLCBpc01vZGVsU25hcHNob3QgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBnZXRNb2RlbEluZm9Gb3JOYW1lIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBkZWVwRXF1YWxzIH0gZnJvbSBcIi4uL3RyZWVVdGlscy9kZWVwRXF1YWxzXCJcbmltcG9ydCB7IHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IHdpdGhvdXRUeXBlQ2hlY2tpbmcgfSBmcm9tIFwiLi4vdHdlYWtlci93aXRob3V0VHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGRldGFjaElmTmVlZGVkLCByZWNvbmNpbGVTbmFwc2hvdCwgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZNb2RlbCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIHJlY29uY2lsZU1vZGVsU25hcHNob3QoXG4gIHZhbHVlOiBhbnksXG4gIHNuOiBTbmFwc2hvdEluT2ZNb2RlbDxBbnlNb2RlbD4sXG4gIG1vZGVsUG9vbDogTW9kZWxQb29sLFxuICBwYXJlbnQ6IGFueVxuKTogQW55TW9kZWwge1xuICBjb25zdCB0eXBlID0gc25bbW9kZWxUeXBlS2V5XSFcblxuICBjb25zdCBtb2RlbEluZm8gPSBnZXRNb2RlbEluZm9Gb3JOYW1lKHR5cGUpXG4gIGlmICghbW9kZWxJbmZvKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgbW9kZWwgd2l0aCBuYW1lIFwiJHt0eXBlfVwiIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnlgKVxuICB9XG5cbiAgLy8gdHJ5IHRvIHVzZSBtb2RlbCBmcm9tIHBvb2wgaWYgcG9zc2libGVcbiAgY29uc3QgbW9kZWxJblBvb2wgPSBtb2RlbFBvb2wuZmluZE1vZGVsRm9yU25hcHNob3Qoc24pXG4gIGlmIChtb2RlbEluUG9vbCkge1xuICAgIHZhbHVlID0gbW9kZWxJblBvb2xcbiAgfVxuXG4gIC8vIHdlIGRvbid0IGNoZWNrIGJ5IGFjdHVhbCBpbnN0YW5jZSBzaW5jZSB0aGUgY2xhc3MgbWlnaHQgYmUgYSBkaWZmZXJlbnQgb25lIGR1ZSB0byBob3QgcmVsb2FkaW5nXG4gIGlmICghaXNNb2RlbCh2YWx1ZSkgfHwgdmFsdWVbbW9kZWxUeXBlS2V5XSAhPT0gdHlwZSkge1xuICAgIC8vIGRpZmZlcmVudCBraW5kIG9mIG1vZGVsIHR5cGUsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgcmV0dXJuIGZyb21TbmFwc2hvdDxBbnlNb2RlbD4oc24pXG4gIH1cblxuICBjb25zdCBtb2RlbElkUHJvcGVydHlOYW1lID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pXG4gIGlmIChtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgY29uc3QgaWQgPSBzblttb2RlbElkUHJvcGVydHlOYW1lXVxuXG4gICAgaWYgKHZhbHVlW21vZGVsSWRLZXldICE9PSBpZCkge1xuICAgICAgLy8gZGlmZmVyZW50IGlkLCBubyByZWNvbmNpbGlhdGlvbiBwb3NzaWJsZVxuICAgICAgcmV0dXJuIGZyb21TbmFwc2hvdDxBbnlNb2RlbD4oc24pXG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQXJyYXkocGFyZW50KSkge1xuICAgIC8vIG5vIGlkIGFuZCBpbnNpZGUgYW4gYXJyYXk/IG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlLFxuICAgIC8vIHVubGVzcyB0aGUgc25hcHNob3RzIGFyZSBlcXVpdmFsZW50IChub3RlIGRlZXAgZXF1YWxzIHdpbGwgdXNlIHRoZSBzbmFwc2hvdCBvZiB2YWx1ZSBhdXRvKVxuICAgIGlmICghZGVlcEVxdWFscyh2YWx1ZSwgc24pKSB7XG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90PEFueU1vZGVsPihzbilcbiAgICB9XG4gIH1cblxuICBjb25zdCBtb2RlbE9iajogQW55TW9kZWwgPSB2YWx1ZVxuICBjb25zdCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMgPSBnZXRTbmFwc2hvdChtb2RlbE9iailcblxuICB3aXRob3V0VHlwZUNoZWNraW5nKCgpID0+IHtcbiAgICBsZXQgcHJvY2Vzc2VkU246IGFueSA9IHNuXG4gICAgY29uc3QgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbD4gPSAobW9kZWxPYmogYXMgYW55KS5jb25zdHJ1Y3RvclxuICAgIGlmIChtb2RlbENsYXNzLmZyb21TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgICAgcHJvY2Vzc2VkU24gPSBtb2RlbENsYXNzLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gbW9kZWxPYmouJFxuXG4gICAgLy8gcmVtb3ZlIGV4Y2VzcyBwcm9wc1xuICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgICBjb25zdCBkYXRhS2V5c0xlbiA9IGRhdGFLZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUtleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGRhdGFLZXlzW2ldXG4gICAgICBpZiAoIShrIGluIHByb2Nlc3NlZFNuKSkge1xuICAgICAgICByZW1vdmUoZGF0YSwgaylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZWNvbmNpbGUgdGhlIHJlc3RcbiAgICBjb25zdCBwcm9jZXNzZWRTbktleXMgPSBPYmplY3Qua2V5cyhwcm9jZXNzZWRTbilcbiAgICBjb25zdCBwcm9jZXNzZWRTbktleXNMZW4gPSBwcm9jZXNzZWRTbktleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWRTbktleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IHByb2Nlc3NlZFNuS2V5c1tpXVxuICAgICAgaWYgKCFpc1Jlc2VydmVkTW9kZWxLZXkoaykpIHtcbiAgICAgICAgY29uc3QgdiA9IHByb2Nlc3NlZFNuW2tdXG5cbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBkYXRhW2tdXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3Qob2xkVmFsdWUsIHYsIG1vZGVsUG9vbCwgbW9kZWxPYmopXG5cbiAgICAgICAgZGV0YWNoSWZOZWVkZWQobmV3VmFsdWUsIG9sZFZhbHVlLCBtb2RlbFBvb2wpXG5cbiAgICAgICAgc2V0KGRhdGEsIGssIG5ld1ZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShtb2RlbE9iaiwgdW5kZWZpbmVkLCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMpXG5cbiAgcmV0dXJuIG1vZGVsT2JqXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vZGVsU25hcHNob3RSZWNvbmNpbGVyKCkge1xuICByZWdpc3RlclJlY29uY2lsZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuTW9kZWwsICh2YWx1ZSwgc24sIG1vZGVsUG9vbCwgcGFyZW50KSA9PiB7XG4gICAgaWYgKGlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVNb2RlbFNuYXBzaG90KHZhbHVlLCBzbiwgbW9kZWxQb29sLCBwYXJlbnQpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZU9iamVjdCwgcmVtb3ZlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuLi90d2Vha2VyL3R5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyB3aXRob3V0VHlwZUNoZWNraW5nIH0gZnJvbSBcIi4uL3R3ZWFrZXIvd2l0aG91dFR5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxQb29sIH0gZnJvbSBcIi4uL3V0aWxzL01vZGVsUG9vbFwiXG5pbXBvcnQgeyBmcm9tU25hcHNob3QgfSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyBkZXRhY2hJZk5lZWRlZCwgcmVjb25jaWxlU25hcHNob3QsIHJlZ2lzdGVyUmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mT2JqZWN0IH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdChcbiAgdmFsdWU6IGFueSxcbiAgc246IFNuYXBzaG90SW5PZk9iamVjdDxhbnk+LFxuICBtb2RlbFBvb2w6IE1vZGVsUG9vbFxuKTogb2JqZWN0IHtcbiAgLy8gcGxhaW4gb2JqXG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgIWlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkpIHtcbiAgICAvLyBubyByZWNvbmNpbGlhdGlvbiBwb3NzaWJsZVxuICAgIHJldHVybiBmcm9tU25hcHNob3Qoc24pXG4gIH1cblxuICBjb25zdCBwbGFpbk9iaiA9IHZhbHVlXG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlQ2hhbmdlcyA9IGdldFNuYXBzaG90KHBsYWluT2JqKVxuXG4gIHdpdGhvdXRUeXBlQ2hlY2tpbmcoKCkgPT4ge1xuICAgIC8vIHJlbW92ZSBleGNlc3MgcHJvcHNcbiAgICBjb25zdCBwbGFpbk9iaktleXMgPSBPYmplY3Qua2V5cyhwbGFpbk9iailcbiAgICBjb25zdCBwbGFpbk9iaktleXNMZW4gPSBwbGFpbk9iaktleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFpbk9iaktleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IHBsYWluT2JqS2V5c1tpXVxuICAgICAgaWYgKCEoayBpbiBzbikpIHtcbiAgICAgICAgcmVtb3ZlKHBsYWluT2JqLCBrKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY29uY2lsZSB0aGUgcmVzdFxuICAgIGNvbnN0IHNuS2V5cyA9IE9iamVjdC5rZXlzKHNuKVxuICAgIGNvbnN0IHNuS2V5c0xlbiA9IHNuS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNuS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gc25LZXlzW2ldXG4gICAgICBjb25zdCB2ID0gc25ba11cblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBwbGFpbk9ialtrXVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdChvbGRWYWx1ZSwgdiwgbW9kZWxQb29sLCBwbGFpbk9iailcblxuICAgICAgZGV0YWNoSWZOZWVkZWQobmV3VmFsdWUsIG9sZFZhbHVlLCBtb2RlbFBvb2wpXG5cbiAgICAgIHNldChwbGFpbk9iaiwgaywgbmV3VmFsdWUpXG4gICAgfVxuICB9KVxuXG4gIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKHBsYWluT2JqLCB1bmRlZmluZWQsIHNuYXBzaG90QmVmb3JlQ2hhbmdlcylcblxuICByZXR1cm4gcGxhaW5PYmpcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGxhaW5PYmplY3RTbmFwc2hvdFJlY29uY2lsZXIoKSB7XG4gIHJlZ2lzdGVyUmVjb25jaWxlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5QbGFpbk9iamVjdCwgKHZhbHVlLCBzbiwgbW9kZWxQb29sKSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3Qoc24pKSB7XG4gICAgICByZXR1cm4gcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdCh2YWx1ZSwgc24sIG1vZGVsUG9vbClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJBcnJheVNuYXBzaG90UmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZUFycmF5U25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm96ZW5TbmFwc2hvdFJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVGcm96ZW5TbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3Rlck1vZGVsU25hcHNob3RSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlTW9kZWxTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlclBsYWluT2JqZWN0U25hcHNob3RSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdFwiXG5cbmxldCBkZWZhdWx0UmVjb25jaWxlcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzKCkge1xuICBpZiAoZGVmYXVsdFJlY29uY2lsZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRSZWNvbmNpbGVyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgcmVnaXN0ZXJBcnJheVNuYXBzaG90UmVjb25jaWxlcigpXG4gIHJlZ2lzdGVyRnJvemVuU25hcHNob3RSZWNvbmNpbGVyKClcbiAgcmVnaXN0ZXJNb2RlbFNuYXBzaG90UmVjb25jaWxlcigpXG4gIHJlZ2lzdGVyUGxhaW5PYmplY3RTbmFwc2hvdFJlY29uY2lsZXIoKVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGhJbmNsdWRpbmdEYXRhT2JqZWN0cyB9IGZyb20gXCIuLi9wYXJlbnRcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNNYXAsIGlzUHJpbWl0aXZlLCBpc1NldCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckRlZmF1bHRSZWNvbmNpbGVycyB9IGZyb20gXCIuL3JlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzXCJcblxudHlwZSBSZWNvbmNpbGVyID0gKHZhbHVlOiBhbnksIHNuOiBhbnksIG1vZGVsUG9vbDogTW9kZWxQb29sLCBwYXJlbnQ6IGFueSkgPT4gYW55IHwgdW5kZWZpbmVkXG5cbmNvbnN0IHJlY29uY2lsZXJzOiB7IHByaW9yaXR5OiBudW1iZXI7IHJlY29uY2lsZXI6IFJlY29uY2lsZXIgfVtdID0gW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVjb25jaWxlcihwcmlvcml0eTogbnVtYmVyLCByZWNvbmNpbGVyOiBSZWNvbmNpbGVyKTogdm9pZCB7XG4gIHJlY29uY2lsZXJzLnB1c2goeyBwcmlvcml0eSwgcmVjb25jaWxlciB9KVxuICByZWNvbmNpbGVycy5zb3J0KChhLCBiKSA9PiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29uY2lsZVNuYXBzaG90KHZhbHVlOiBhbnksIHNuOiBhbnksIG1vZGVsUG9vbDogTW9kZWxQb29sLCBwYXJlbnQ6IGFueSk6IGFueSB7XG4gIGlmIChpc1ByaW1pdGl2ZShzbikpIHtcbiAgICByZXR1cm4gc25cbiAgfVxuXG4gIC8vIGlmIHRoZSBzbmFwc2hvdCBwYXNzZWQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmVcbiAgLy8gdGhlbiBpdCBpcyBhbHJlYWR5IHJlY29uY2lsZWRcbiAgaWYgKGdldFNuYXBzaG90KHZhbHVlKSA9PT0gc24pIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHJlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzKClcblxuICBjb25zdCByZWNvbmNpbGVyc0xlbiA9IHJlY29uY2lsZXJzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29uY2lsZXJzTGVuOyBpKyspIHtcbiAgICBjb25zdCB7IHJlY29uY2lsZXIgfSA9IHJlY29uY2lsZXJzW2ldXG4gICAgY29uc3QgcmV0ID0gcmVjb25jaWxlcih2YWx1ZSwgc24sIG1vZGVsUG9vbCwgcGFyZW50KVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgfVxuXG4gIGlmIChpc01hcChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIG1hcHNcIilcbiAgfVxuXG4gIGlmIChpc1NldChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIHNldHNcIilcbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIHNuYXBzaG90IC0gJHtzbn1gKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0YWNoSWZOZWVkZWQobmV3VmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSwgbW9kZWxQb29sOiBNb2RlbFBvb2wpIHtcbiAgLy8gZWRnZSBjYXNlIGZvciB3aGVuIHdlIGFyZSBzd2FwcGluZyBtb2RlbHMgYXJvdW5kIHRoZSB0cmVlXG5cbiAgaWYgKG5ld1ZhbHVlID09PSBvbGRWYWx1ZSkge1xuICAgIC8vIGFscmVhZHkgd2hlcmUgaXQgc2hvdWxkIGJlXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoXG4gICAgaXNNb2RlbChuZXdWYWx1ZSkgJiZcbiAgICBtb2RlbFBvb2wuZmluZE1vZGVsQnlUeXBlQW5kSWQobmV3VmFsdWVbbW9kZWxUeXBlS2V5XSwgbmV3VmFsdWVbbW9kZWxJZEtleV0pXG4gICkge1xuICAgIGNvbnN0IHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzKG5ld1ZhbHVlKVxuICAgIGlmIChwYXJlbnRQYXRoKSB7XG4gICAgICBzZXQocGFyZW50UGF0aC5wYXJlbnQsIHBhcmVudFBhdGgucGF0aCwgbnVsbClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlbW92ZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgbW9kZWxUb0RhdGFOb2RlIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUGF0aEVsZW1lbnQgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4uL3BhdGNoL1BhdGNoXCJcbmltcG9ydCB7IHJlY29uY2lsZVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNBcnJheSwgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBwYXRjaGVzIHRvIHRoZSBnaXZlbiB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBub2RlIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gcGF0Y2hlcyBMaXN0IG9mIHBhdGNoZXMgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcmV2ZXJzZSBXaGV0aGVyIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyhcbiAgbm9kZTogb2JqZWN0LFxuICBwYXRjaGVzOiBSZWFkb25seUFycmF5PFBhdGNoPiB8IFJlYWRvbmx5QXJyYXk8UmVhZG9ubHlBcnJheTxQYXRjaD4+LFxuICByZXZlcnNlOiBib29sZWFuID0gZmFsc2Vcbik6IHZvaWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGlmIChwYXRjaGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB3cmFwcGVkSW50ZXJuYWxBcHBseVBhdGNoZXMoKS5jYWxsKG5vZGUsIHBhdGNoZXMsIHJldmVyc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEFwcGx5UGF0Y2hlcyhcbiAgdGhpczogb2JqZWN0LFxuICBwYXRjaGVzOiBSZWFkb25seUFycmF5PFBhdGNoPiB8IFJlYWRvbmx5QXJyYXk8UmVhZG9ubHlBcnJheTxQYXRjaD4+LFxuICByZXZlcnNlOiBib29sZWFuID0gZmFsc2Vcbik6IHZvaWQge1xuICBjb25zdCBvYmogPSB0aGlzXG4gIGNvbnN0IG1vZGVsUG9vbCA9IG5ldyBNb2RlbFBvb2wob2JqKVxuXG4gIGlmIChyZXZlcnNlKSB7XG4gICAgbGV0IGkgPSBwYXRjaGVzLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRjaGVzW2ldXG4gICAgICBpZiAoIWlzQXJyYXkocCkpIHtcbiAgICAgICAgYXBwbHlTaW5nbGVQYXRjaChvYmosIHAgYXMgUGF0Y2gsIG1vZGVsUG9vbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBqID0gcC5sZW5ndGhcbiAgICAgICAgd2hpbGUgKGotLSkge1xuICAgICAgICAgIGFwcGx5U2luZ2xlUGF0Y2gob2JqLCBwW2pdLCBtb2RlbFBvb2wpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbGVuID0gcGF0Y2hlcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBwID0gcGF0Y2hlc1tpXVxuICAgICAgaWYgKCFpc0FycmF5KHApKSB7XG4gICAgICAgIGFwcGx5U2luZ2xlUGF0Y2gob2JqLCBwIGFzIFBhdGNoLCBtb2RlbFBvb2wpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsZW4yID0gcC5sZW5ndGhcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW4yOyBqKyspIHtcbiAgICAgICAgICBhcHBseVNpbmdsZVBhdGNoKG9iaiwgcFtqXSwgbW9kZWxQb29sKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5UGF0Y2hlcyA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlQYXRjaGVzLFxuICAgIGZuOiBpbnRlcm5hbEFwcGx5UGF0Y2hlcyxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuXG5mdW5jdGlvbiBhcHBseVNpbmdsZVBhdGNoKG9iajogb2JqZWN0LCBwYXRjaDogUGF0Y2gsIG1vZGVsUG9vbDogTW9kZWxQb29sKTogdm9pZCB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBwcm9wIH0gPSBwYXRoQXJyYXlUb09iamVjdEFuZFByb3Aob2JqLCBwYXRjaC5wYXRoKVxuXG4gIGlmIChpc0FycmF5KHRhcmdldCkpIHtcbiAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSArcHJvcCFcbiAgICAgICAgLy8gcmVjb25jaWxlIGZyb20gdGhlIHBvb2wgaWYgcG9zc2libGVcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdCh1bmRlZmluZWQsIHBhdGNoLnZhbHVlLCBtb2RlbFBvb2wsIHRhcmdldClcbiAgICAgICAgdGFyZ2V0LnNwbGljZShpbmRleCwgMCwgbmV3VmFsdWUpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICBjb25zdCBpbmRleCA9ICtwcm9wIVxuICAgICAgICAvLyBubyByZWNvbmNpbGlhdGlvbiwgcmVtb3ZpbmdcbiAgICAgICAgdGFyZ2V0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICBpZiAocHJvcCA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgIHRhcmdldC5sZW5ndGggPSBwYXRjaC52YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gK3Byb3AhXG4gICAgICAgICAgLy8gdHJ5IHRvIHJlY29uY2lsZVxuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3QodGFyZ2V0W2luZGV4XSwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICAgIHNldCh0YXJnZXQsIGluZGV4IGFzIGFueSwgbmV3VmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiAkeyhwYXRjaCBhcyBhbnkpLm9wfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAvLyByZWNvbmNpbGUgZnJvbSB0aGUgcG9vbCBpZiBwb3NzaWJsZVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KHVuZGVmaW5lZCwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wLCBuZXdWYWx1ZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uLCByZW1vdmluZ1xuICAgICAgICByZW1vdmUodGFyZ2V0LCBwcm9wKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgIC8vIHRyeSB0byByZWNvbmNpbGVcbiAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byB0d2VhayB0aGUgcG9vbCBzaW5jZSByZWNvbmNpbGVTbmFwc2hvdCB3aWxsIGRvIHRoYXQgZm9yIHVzXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3QodGFyZ2V0W3Byb3AhXSwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wLCBuZXdWYWx1ZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiAkeyhwYXRjaCBhcyBhbnkpLm9wfWApXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhdGhBcnJheVRvT2JqZWN0QW5kUHJvcChcbiAgb2JqOiBvYmplY3QsXG4gIHBhdGg6IFBhdGNoW1wicGF0aFwiXVxuKTogeyB0YXJnZXQ6IGFueTsgcHJvcD86IFBhdGhFbGVtZW50IH0ge1xuICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICBpZiAoIWlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0aDogJHtwYXRofWApXG4gICAgfVxuICB9XG5cbiAgbGV0IHRhcmdldDogYW55ID0gbW9kZWxUb0RhdGFOb2RlKG9iailcblxuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0LFxuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IHBhdGgubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgdGFyZ2V0ID0gbW9kZWxUb0RhdGFOb2RlKHRhcmdldFtwYXRoW2ldXSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFyZ2V0LFxuICAgIHByb3A6IHBhdGhbcGF0aC5sZW5ndGggLSAxXSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZGF0YVRvTW9kZWxOb2RlIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB7IGZpbmRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L2ZpbmRQYXJlbnRcIlxuaW1wb3J0IHsgaW50ZXJuYWxBcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IEludGVybmFsUGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaC9lbWl0UGF0Y2hcIlxuaW1wb3J0IHsgaW50ZXJuYWxBcHBseVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2FwcGx5U25hcHNob3RcIlxuaW1wb3J0IHsgaW52YWxpZGF0ZUNhY2hlZFR5cGVDaGVja2VyUmVzdWx0IH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IHJ1bldpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgaXNUeXBlQ2hlY2tpbmdBbGxvd2VkIH0gZnJvbSBcIi4vd2l0aG91dFR5cGVDaGVja2luZ1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShcbiAgb2JqOiBvYmplY3QsXG4gIHBhdGNoUmVjb3JkZXI6IEludGVybmFsUGF0Y2hSZWNvcmRlciB8IHVuZGVmaW5lZCxcbiAgc25hcHNob3RCZWZvcmVDaGFuZ2VzPzogb2JqZWN0XG4pIHtcbiAgaWYgKCFpc1R5cGVDaGVja2luZ0FsbG93ZWQoKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gaW52YWxpZGF0ZSB0eXBlIGNoZWNrIGNhY2hlZCByZXN1bHRcbiAgaW52YWxpZGF0ZUNhY2hlZFR5cGVDaGVja2VyUmVzdWx0KG9iailcblxuICBpZiAoaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkKCkpIHtcbiAgICBjb25zdCBwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlciA9IGZpbmROZWFyZXN0UGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIob2JqKVxuICAgIGlmIChwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlcikge1xuICAgICAgY29uc3QgZXJyID0gcGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIudHlwZUNoZWNrKClcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gcXVpZXRseSBhcHBseSBpbnZlcnNlIHBhdGNoZXMgKGRvIG5vdCBnZW5lcmF0ZSBwYXRjaGVzLCBzbmFwc2hvdHMsIGFjdGlvbnMsIGV0YylcbiAgICAgICAgcnVuV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzKCgpID0+IHtcbiAgICAgICAgICBpZiAocGF0Y2hSZWNvcmRlcikge1xuICAgICAgICAgICAgaW50ZXJuYWxBcHBseVBhdGNoZXMuY2FsbChvYmosIHBhdGNoUmVjb3JkZXIuaW52UGF0Y2hlcywgdHJ1ZSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHNuYXBzaG90QmVmb3JlQ2hhbmdlcykge1xuICAgICAgICAgICAgaW50ZXJuYWxBcHBseVNuYXBzaG90LmNhbGwob2JqLCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIGFwcGx5IHBhdGNoZXMgaXQgd2lsbCBiZSB0eXBlIGNoZWNrZWQgYWdhaW4gYW5kIGl0cyByZXN1bHQgY2FjaGVkIG9uY2UgbW9yZVxuICAgICAgICBlcnIudGhyb3cocGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogRmluZHMgdGhlIGNsb3Nlc3QgcGFyZW50IG1vZGVsIHRoYXQgaGFzIGEgdHlwZSBjaGVja2VyIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGNoaWxkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBmaW5kTmVhcmVzdFBhcmVudE1vZGVsV2l0aFR5cGVDaGVja2VyKGNoaWxkOiBvYmplY3QpOiBBbnlNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIC8vIGNoaWxkIG1pZ2h0IGJlIC4kLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBwYXJlbnQgbW9kZWwgaW4gdGhhdCBjYXNlXG4gIGNvbnN0IGFjdHVhbENoaWxkID0gZGF0YVRvTW9kZWxOb2RlKGNoaWxkKVxuXG4gIGlmIChjaGlsZCAhPT0gYWN0dWFsQ2hpbGQpIHtcbiAgICBjaGlsZCA9IGFjdHVhbENoaWxkXG4gICAgaWYgKGlzTW9kZWwoY2hpbGQpICYmICEhZ2V0TW9kZWxNZXRhZGF0YShjaGlsZCkuZGF0YVR5cGUpIHtcbiAgICAgIHJldHVybiBjaGlsZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kUGFyZW50KGNoaWxkLCAocGFyZW50KSA9PiB7XG4gICAgcmV0dXJuIGlzTW9kZWwocGFyZW50KSAmJiAhIWdldE1vZGVsTWV0YWRhdGEocGFyZW50KS5kYXRhVHlwZVxuICB9KVxufVxuIiwiaW1wb3J0IHtcbiAgaW50ZXJjZXB0LFxuICBJT2JqZWN0RGlkQ2hhbmdlLFxuICBJT2JqZWN0V2lsbENoYW5nZSxcbiAgaXNPYnNlcnZhYmxlT2JqZWN0LFxuICBvYnNlcnZhYmxlLFxuICBvYnNlcnZlLFxuICBzZXQsXG59IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydENhbldyaXRlIH0gZnJvbSBcIi4uL2FjdGlvbi9wcm90ZWN0aW9uXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGRhdGFUb01vZGVsTm9kZSB9IGZyb20gXCIuLi9wYXJlbnQvY29yZVwiXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxuaW1wb3J0IHsgSW50ZXJuYWxQYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoL2VtaXRQYXRjaFwiXG5pbXBvcnQge1xuICBmcmVlemVJbnRlcm5hbFNuYXBzaG90LFxuICBnZXRJbnRlcm5hbFNuYXBzaG90LFxuICBzZXROZXdJbnRlcm5hbFNuYXBzaG90LFxuICBTbmFwc2hvdFRyYW5zZm9ybUZuLFxuICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90LFxufSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNQbGFpbk9iamVjdCwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcywgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyVHdlYWtlciwgdHJ5VW50d2VhaywgdHdlYWsgfSBmcm9tIFwiLi90d2Vha1wiXG5pbXBvcnQgeyBUd2Vha2VyUHJpb3JpdHkgfSBmcm9tIFwiLi9Ud2Vha2VyUHJpb3JpdHlcIlxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi90eXBlQ2hlY2tpbmdcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHdlYWtQbGFpbk9iamVjdDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIHZhbHVlOiBULFxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQsXG4gIHNuYXBzaG90TW9kZWxUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRvTm90VHdlYWtDaGlsZHJlbjogYm9vbGVhbixcbiAgaXNEYXRhT2JqZWN0OiBib29sZWFuXG4pOiBUIHtcbiAgY29uc3Qgb3JpZ2luYWxPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB2YWx1ZVxuICBjb25zdCB0d2Vha2VkT2JqID0gaXNPYnNlcnZhYmxlT2JqZWN0KG9yaWdpbmFsT2JqKVxuICAgID8gb3JpZ2luYWxPYmpcbiAgICA6IG9ic2VydmFibGUub2JqZWN0KHt9LCB1bmRlZmluZWQsIG9ic2VydmFibGVPcHRpb25zKVxuXG4gIGxldCBpbnRlcmNlcHREaXNwb3NlcjogKCkgPT4gdm9pZFxuICBsZXQgb2JzZXJ2ZURpc3Bvc2VyOiAoKSA9PiB2b2lkXG5cbiAgY29uc3QgdW50d2VhayA9ICgpID0+IHtcbiAgICBpbnRlcmNlcHREaXNwb3NlcigpXG4gICAgb2JzZXJ2ZURpc3Bvc2VyKClcbiAgfVxuXG4gIHR3ZWFrZWRPYmplY3RzLnNldCh0d2Vha2VkT2JqLCB1bnR3ZWFrKVxuICBzZXRQYXJlbnQoe1xuICAgIHZhbHVlOiB0d2Vha2VkT2JqLFxuICAgIHBhcmVudFBhdGgsXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICBpc0RhdGFPYmplY3QsXG4gICAgLy8gYW4gb2JqZWN0IHNob3VsZG4ndCBiZSBjbG9uZWRcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXG4gIH0pXG5cbiAgbGV0IHVudHJhbnNmb3JtZWRTbjogYW55ID0ge31cblxuICAvLyBzdWJzdGl0dXRlIGluaXRpYWwgdmFsdWVzIGJ5IHR3ZWFrZWQgdmFsdWVzXG4gIGNvbnN0IG9yaWdpbmFsT2JqS2V5cyA9IE9iamVjdC5rZXlzKG9yaWdpbmFsT2JqKVxuICBjb25zdCBvcmlnaW5hbE9iaktleXNMZW4gPSBvcmlnaW5hbE9iaktleXMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZ2luYWxPYmpLZXlzTGVuOyBpKyspIHtcbiAgICBjb25zdCBrID0gb3JpZ2luYWxPYmpLZXlzW2ldXG4gICAgY29uc3QgdiA9IG9yaWdpbmFsT2JqW2tdXG5cbiAgICBpZiAoaXNQcmltaXRpdmUodikpIHtcbiAgICAgIGlmICghZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XG4gICAgICAgIHNldCh0d2Vha2VkT2JqLCBrLCB2KVxuICAgICAgfVxuICAgICAgdW50cmFuc2Zvcm1lZFNuW2tdID0gdlxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXRoID0geyBwYXJlbnQ6IHR3ZWFrZWRPYmosIHBhdGg6IGsgfVxuXG4gICAgICBsZXQgdHdlYWtlZFZhbHVlXG4gICAgICBpZiAoZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XG4gICAgICAgIHR3ZWFrZWRWYWx1ZSA9IHZcbiAgICAgICAgc2V0UGFyZW50KHtcbiAgICAgICAgICB2YWx1ZTogdHdlYWtlZFZhbHVlLFxuICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxuICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGEgbmV3IHZhbHVlICh0aGUgcmVzdWx0IG9mIGEgZnJvbVNuYXBzaG90KVxuICAgICAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR3ZWFrZWRWYWx1ZSA9IHR3ZWFrKHYsIHBhdGgpXG4gICAgICAgIHNldCh0d2Vha2VkT2JqLCBrLCB0d2Vha2VkVmFsdWUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHR3ZWFrZWRWYWx1ZSkhXG4gICAgICB1bnRyYW5zZm9ybWVkU25ba10gPSB2YWx1ZVNuLnRyYW5zZm9ybWVkXG4gICAgfVxuICB9XG5cbiAgbGV0IHRyYW5zZm9ybUZuOiBTbmFwc2hvdFRyYW5zZm9ybUZuIHwgdW5kZWZpbmVkXG4gIGlmIChzbmFwc2hvdE1vZGVsVHlwZSkge1xuICAgIHVudHJhbnNmb3JtZWRTblttb2RlbFR5cGVLZXldID0gc25hcHNob3RNb2RlbFR5cGVcblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUoc25hcHNob3RNb2RlbFR5cGUpXG4gICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYG1vZGVsIHdpdGggbmFtZSBcIiR7c25hcHNob3RNb2RlbFR5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxUcmFuc2Zvcm1GbiA9IChtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgICBpZiAob3JpZ2luYWxUcmFuc2Zvcm1Gbikge1xuICAgICAgdHJhbnNmb3JtRm4gPSAoc24pID0+IG9yaWdpbmFsVHJhbnNmb3JtRm4oc24sIGRhdGFUb01vZGVsTm9kZSh0d2Vha2VkT2JqKSlcbiAgICB9XG4gIH1cblxuICBzZXROZXdJbnRlcm5hbFNuYXBzaG90KFxuICAgIGlzRGF0YU9iamVjdCA/IGRhdGFUb01vZGVsTm9kZSh0d2Vha2VkT2JqKSA6IHR3ZWFrZWRPYmosXG4gICAgdW50cmFuc2Zvcm1lZFNuLFxuICAgIHRyYW5zZm9ybUZuXG4gIClcblxuICBpbnRlcmNlcHREaXNwb3NlciA9IGludGVyY2VwdCh0d2Vha2VkT2JqLCBpbnRlcmNlcHRPYmplY3RNdXRhdGlvbilcbiAgb2JzZXJ2ZURpc3Bvc2VyID0gb2JzZXJ2ZSh0d2Vha2VkT2JqLCBvYmplY3REaWRDaGFuZ2UpXG5cbiAgcmV0dXJuIHR3ZWFrZWRPYmogYXMgYW55XG59XG5cbmNvbnN0IG9ic2VydmFibGVPcHRpb25zID0ge1xuICBkZWVwOiBmYWxzZSxcbn1cblxuZnVuY3Rpb24gb2JqZWN0RGlkQ2hhbmdlKGNoYW5nZTogSU9iamVjdERpZENoYW5nZSk6IHZvaWQge1xuICBjb25zdCBvYmogPSBjaGFuZ2Uub2JqZWN0XG4gIGNvbnN0IGFjdHVhbE5vZGUgPSBkYXRhVG9Nb2RlbE5vZGUob2JqKVxuICBsZXQgeyB1bnRyYW5zZm9ybWVkOiBvbGRVbnRyYW5zZm9ybWVkU24gfSA9IGdldEludGVybmFsU25hcHNob3QoYWN0dWFsTm9kZSkhXG5cbiAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IG5ldyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIoKVxuXG4gIGxldCBtdXRhdGU6ICgoc246IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgY2FzZSBcImFkZFwiOlxuICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgayA9IGNoYW5nZS5uYW1lXG4gICAgICAgIGNvbnN0IHZhbCA9IGNoYW5nZS5uZXdWYWx1ZVxuXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFVudHJhbnNmb3JtZWRTbltrXVxuXG4gICAgICAgIGxldCBuZXdWYWw6IGFueVxuICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xuICAgICAgICAgIG5ld1ZhbCA9IHZhbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbCkhXG4gICAgICAgICAgbmV3VmFsID0gdmFsdWVTbi50cmFuc2Zvcm1lZFxuICAgICAgICB9XG5cbiAgICAgICAgbXV0YXRlID0gKHNuKSA9PiB7XG4gICAgICAgICAgc25ba10gPSBuZXdWYWxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBbayBhcyBzdHJpbmddXG4gICAgICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gXCJhZGRcIikge1xuICAgICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3QobmV3VmFsKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJyZW1vdmVcIjpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgayA9IGNoYW5nZS5uYW1lXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFVudHJhbnNmb3JtZWRTbltrXVxuICAgICAgICBtdXRhdGUgPSAoc24pID0+IHtcbiAgICAgICAgICBkZWxldGUgc25ba11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBbayBhcyBzdHJpbmddXG5cbiAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGJyZWFrXG4gIH1cblxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShvYmosIHBhdGNoUmVjb3JkZXIpXG5cbiAgaWYgKCFydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzICYmIG11dGF0ZSEpIHtcbiAgICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90KGFjdHVhbE5vZGUsIG11dGF0ZSlcbiAgICBwYXRjaFJlY29yZGVyLmVtaXQoYWN0dWFsTm9kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnRlcmNlcHRPYmplY3RNdXRhdGlvbihjaGFuZ2U6IElPYmplY3RXaWxsQ2hhbmdlKSB7XG4gIGFzc2VydENhbldyaXRlKClcblxuICBpZiAodHlwZW9mIGNoYW5nZS5uYW1lID09PSBcInN5bWJvbFwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcInN5bWJvbCBwcm9wZXJ0aWVzIGFyZSBub3Qgc3VwcG9ydGVkXCIpXG4gIH1cblxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgY2FzZSBcImFkZFwiOlxuICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHdlYWsoY2hhbmdlLm5ld1ZhbHVlLCB7XG4gICAgICAgIHBhcmVudDogY2hhbmdlLm9iamVjdCxcbiAgICAgICAgcGF0aDogXCJcIiArIGNoYW5nZS5uYW1lLFxuICAgICAgfSlcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IGNoYW5nZS5vYmplY3RbY2hhbmdlLm5hbWVdXG4gICAgICB0d2VhayhvbGRWYWwsIHVuZGVmaW5lZClcbiAgICAgIHRyeVVudHdlYWsob2xkVmFsKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IGNoYW5nZS5vYmplY3RbY2hhbmdlLm5hbWVdXG4gICAgICB0d2VhayhvbGRWYWwsIHVuZGVmaW5lZClcbiAgICAgIHRyeVVudHdlYWsob2xkVmFsKVxuXG4gICAgICBjaGFuZ2UubmV3VmFsdWUgPSB0d2VhayhjaGFuZ2UubmV3VmFsdWUsIHtcbiAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxuICAgICAgICBwYXRoOiBcIlwiICsgY2hhbmdlLm5hbWUsXG4gICAgICB9KVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBsYWluT2JqZWN0VHdlYWtlcigpIHtcbiAgcmVnaXN0ZXJUd2Vha2VyKFR3ZWFrZXJQcmlvcml0eS5QbGFpbk9iamVjdCwgKHZhbHVlLCBwYXJlbnRQYXRoKSA9PiB7XG4gICAgLy8gcGxhaW4gb2JqZWN0XG4gICAgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0d2Vha1BsYWluT2JqZWN0KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sIHBhcmVudFBhdGgsIHVuZGVmaW5lZCwgZmFsc2UsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3RlckFycmF5VHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrQXJyYXlcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm96ZW5Ud2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtGcm96ZW5cIlxuaW1wb3J0IHsgcmVnaXN0ZXJNb2RlbFR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha01vZGVsXCJcbmltcG9ydCB7IHJlZ2lzdGVyUGxhaW5PYmplY3RUd2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtQbGFpbk9iamVjdFwiXG5cbmxldCBkZWZhdWx0VHdlYWtlcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdFR3ZWFrZXJzKCkge1xuICBpZiAoZGVmYXVsdFR3ZWFrZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRUd2Vha2Vyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgcmVnaXN0ZXJBcnJheVR3ZWFrZXIoKVxuICByZWdpc3RlckZyb3plblR3ZWFrZXIoKVxuICByZWdpc3Rlck1vZGVsVHdlYWtlcigpXG4gIHJlZ2lzdGVyUGxhaW5PYmplY3RUd2Vha2VyKClcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgeyBnZXRPYmplY3RDaGlsZHJlbiB9IGZyb20gXCIuLi9wYXJlbnQvY29yZU9iamVjdENoaWxkcmVuXCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnQsIFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxuaW1wb3J0IHsgdW5zZXRJbnRlcm5hbFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2ludGVybmFsXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4uL3R5cGVzL3NjaGVtYXNcIlxuaW1wb3J0IHsgdHlwZUNoZWNrIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVDaGVja1wiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzTWFwLCBpc09iamVjdCwgaXNQcmltaXRpdmUsIGlzU2V0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGlzVHdlYWtlZE9iamVjdCwgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFR3ZWFrZXJzIH0gZnJvbSBcIi4vcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnNcIlxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCAoYXJyYXksIHBsYWluIG9iamVjdCkgaW50byBhIHRyZWUgbm9kZSxcbiAqIHdoaWNoIHRoZW4gY2FuIGFjY2VwdCBjYWxscyB0byBgZ2V0UGFyZW50YCwgYGdldFNuYXBzaG90YCwgZXRjLlxuICogSWYgYSB0cmVlIG5vZGUgaXMgcGFzc2VkIGl0IHdpbGwgcmV0dXJuIHRoZSBwYXNzZWQgYXJndW1lbnQgZGlyZWN0bHkuXG4gKiBBZGRpdGlvbmFsbHkgdGhpcyBtZXRob2Qgd2lsbCB1c2UgdGhlIHR5cGUgcGFzc2VkIHRvIGNoZWNrIHRoZSB2YWx1ZVxuICogY29uZm9ybXMgdG8gdGhlIHR5cGUgd2hlbiBtb2RlbCBhdXRvIHR5cGUgY2hlY2tpbmcgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUeXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRvIHR1cm4gaW50byBhIHRyZWUgbm9kZS5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3QgYXMgYSB0cmVlIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1RyZWVOb2RlPFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlLCBWIGV4dGVuZHMgVHlwZVRvRGF0YTxUVHlwZT4+KFxuICB0eXBlOiBUVHlwZSxcbiAgdmFsdWU6IFZcbik6IFZcblxuLyoqXG4gKiBUdXJucyBhbiBvYmplY3QgKGFycmF5LCBwbGFpbiBvYmplY3QpIGludG8gYSB0cmVlIG5vZGUsXG4gKiB3aGljaCB0aGVuIGNhbiBhY2NlcHQgY2FsbHMgdG8gYGdldFBhcmVudGAsIGBnZXRTbmFwc2hvdGAsIGV0Yy5cbiAqIElmIGEgdHJlZSBub2RlIGlzIHBhc3NlZCBpdCB3aWxsIHJldHVybiB0aGUgcGFzc2VkIGFyZ3VtZW50IGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gdHVybiBpbnRvIGEgdHJlZSBub2RlLlxuICogQHJldHVybnMgVGhlIG9iamVjdCBhcyBhIHRyZWUgbm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVHJlZU5vZGU8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IFQpOiBUXG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiB0b1RyZWVOb2RlKGFyZzE6IGFueSwgYXJnMj86IGFueSk6IGFueSB7XG4gIGxldCB2YWx1ZTogb2JqZWN0LCB0eXBlOiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWRcbiAgbGV0IGhhc1R5cGVcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBoYXNUeXBlID0gZmFsc2VcbiAgICB2YWx1ZSA9IGFyZzFcbiAgfSBlbHNlIHtcbiAgICB0eXBlID0gYXJnMVxuICAgIGhhc1R5cGUgPSB0cnVlXG4gICAgdmFsdWUgPSBhcmcyXG4gIH1cblxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJvbmx5IG9iamVjdHMgY2FuIGJlIHR1cm5lZCBpbnRvIHRyZWUgbm9kZXNcIilcbiAgfVxuXG4gIGlmIChoYXNUeXBlICYmIGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCgpKSB7XG4gICAgY29uc3QgZXJyb3JzID0gdHlwZUNoZWNrKHR5cGUsIHZhbHVlKVxuICAgIGlmIChlcnJvcnMpIHtcbiAgICAgIGVycm9ycy50aHJvdyh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgdHJ1ZSkpIHtcbiAgICByZXR1cm4gdHdlYWsodmFsdWUsIHVuZGVmaW5lZClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgVHdlYWtlcjxUPiA9ICh2YWx1ZTogVCwgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkKSA9PiBUIHwgdW5kZWZpbmVkXG5cbmNvbnN0IHR3ZWFrZXJzOiB7IHByaW9yaXR5OiBudW1iZXI7IHR3ZWFrZXI6IFR3ZWFrZXI8YW55PiB9W10gPSBbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUd2Vha2VyPFQ+KHByaW9yaXR5OiBudW1iZXIsIHR3ZWFrZXI6IFR3ZWFrZXI8VD4pOiB2b2lkIHtcbiAgdHdlYWtlcnMucHVzaCh7IHByaW9yaXR5LCB0d2Vha2VyIH0pXG4gIHR3ZWFrZXJzLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbFR3ZWFrPFQ+KHZhbHVlOiBULCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQpOiBUIHtcbiAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gYWxyZWFkeSB0d2Vha2VkXG4gIGlmIChpc1R3ZWFrZWRPYmplY3QodmFsdWUsIHRydWUpKSB7XG4gICAgdmFsdWUgPSBzZXRQYXJlbnQoe1xuICAgICAgdmFsdWUsXG4gICAgICBwYXJlbnRQYXRoLFxuICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgICBjbG9uZUlmQXBwbGljYWJsZTogdHJ1ZSxcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gdW5zdXBwb3J0ZWQgKG11c3QgZ28gYmVmb3JlIHBsYWluIG9iamVjdCB0d2Vha2VyKVxuICBpZiAoaXNEYXRhTW9kZWwodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcbiAgICAgIFwiZGF0YSBtb2RlbHMgYXJlIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQuIHlvdSBtYXkgaW5zZXJ0IHRoZSBkYXRhIGluIHRoZSB0cmVlIGluc3RlYWQgKCckJyBwcm9wZXJ0eSkuXCJcbiAgICApXG4gIH1cblxuICByZWdpc3RlckRlZmF1bHRUd2Vha2VycygpXG5cbiAgY29uc3QgdHdlYWtlcnNMZW4gPSB0d2Vha2Vycy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0d2Vha2Vyc0xlbjsgaSsrKSB7XG4gICAgY29uc3QgeyB0d2Vha2VyIH0gPSB0d2Vha2Vyc1tpXVxuICAgIGNvbnN0IHR3ZWFrZWRWYWwgPSB0d2Vha2VyKHZhbHVlLCBwYXJlbnRQYXRoKVxuICAgIGlmICh0d2Vha2VkVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0d2Vha2VkVmFsXG4gICAgfVxuICB9XG5cbiAgLy8gdW5zdXBwb3J0ZWRcbiAgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJtYXBzIGFyZSBub3QgZGlyZWN0bHkgc3VwcG9ydGVkLiBjb25zaWRlciB1c2luZyAnT2JqZWN0TWFwJyAvICdhc01hcCcgaW5zdGVhZC5cIilcbiAgfVxuXG4gIC8vIHVuc3VwcG9ydGVkXG4gIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwic2V0cyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZC4gY29uc2lkZXIgdXNpbmcgJ0FycmF5U2V0JyAvICdhc1NldCcgaW5zdGVhZC5cIilcbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoXG4gICAgYHR3ZWFrIGNhbiBvbmx5IHdvcmsgb3ZlciBtb2RlbHMsIG9ic2VydmFibGUgb2JqZWN0cy9hcnJheXMsIG9yIHByaW1pdGl2ZXMsIGJ1dCBnb3QgJHt2YWx1ZX0gaW5zdGVhZGBcbiAgKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgdHdlYWsgPSBhY3Rpb24oXCJ0d2Vha1wiLCBpbnRlcm5hbFR3ZWFrKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW50d2Vhayh2YWx1ZTogYW55KSB7XG4gIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgaWYgKGZhc3RHZXRQYXJlbnQodmFsdWUpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYXNzZXJ0aW9uIGZhaWxlZDogb2JqZWN0IGNhbm5vdCBiZSB1bnR3ZWFrZWQgd2hpbGUgaXQgaGFzIGEgcGFyZW50XCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdW50d2Vha2VyID0gdHdlYWtlZE9iamVjdHMuZ2V0KHZhbHVlKVxuICBpZiAoIXVudHdlYWtlcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgaGF2ZSB0byBtYWtlIGEgY29weSBzaW5jZSBpdCB3aWxsIGJlIGNoYW5nZWRcbiAgLy8gd2UgaGF2ZSB0byBpdGVyYXRlIG91cnNlbHZlcyBzaW5jZSBpdCBzZWVtcyBsaWtlIGJhYmVsIGRvZXMgbm90IGRvIGRvd25sZXZlbCBpdGVyYXRpb25cbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBjb25zdCBjaGlsZHJlbkl0ZXIgPSBnZXRPYmplY3RDaGlsZHJlbih2YWx1ZSkhLnZhbHVlcygpXG4gIGxldCBjaGlsZHJlbkN1ciA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgd2hpbGUgKCFjaGlsZHJlbkN1ci5kb25lKSB7XG4gICAgY2hpbGRyZW4ucHVzaChjaGlsZHJlbkN1ci52YWx1ZSlcbiAgICBjaGlsZHJlbkN1ciA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBzZXRQYXJlbnQoe1xuICAgICAgdmFsdWU6IGNoaWxkcmVuW2ldLFxuICAgICAgcGFyZW50UGF0aDogdW5kZWZpbmVkLFxuICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgICAvLyBubyBuZWVkIHRvIGNsb25lIGlmIHVuc2V0dGluZyB0aGUgcGFyZW50XG4gICAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXG4gICAgfSlcbiAgfVxuXG4gIHVudHdlYWtlcigpXG5cbiAgdHdlYWtlZE9iamVjdHMuZGVsZXRlKHZhbHVlKVxuICB1bnNldEludGVybmFsU25hcHNob3QodmFsdWUpXG4gIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQge1xyXG4gIElBcnJheVdpbGxDaGFuZ2UsXHJcbiAgSUFycmF5V2lsbFNwbGljZSxcclxuICBpbnRlcmNlcHQsXHJcbiAgSU9ic2VydmFibGVBcnJheSxcclxuICBpc09ic2VydmFibGVBcnJheSxcclxuICBvYnNlcnZhYmxlLFxyXG4gIG9ic2VydmUsXHJcbiAgc2V0LFxyXG59IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHsgYXNzZXJ0Q2FuV3JpdGUgfSBmcm9tIFwiLi4vYWN0aW9uL3Byb3RlY3Rpb25cIlxyXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnXCJcclxuaW1wb3J0IHR5cGUgeyBQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcclxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxyXG5pbXBvcnQgeyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIgfSBmcm9tIFwiLi4vcGF0Y2gvZW1pdFBhdGNoXCJcclxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuLi9wYXRjaC9QYXRjaFwiXHJcbmltcG9ydCB7XHJcbiAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdCxcclxuICBnZXRJbnRlcm5hbFNuYXBzaG90LFxyXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QsXHJcbiAgdXBkYXRlSW50ZXJuYWxTbmFwc2hvdCxcclxufSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxyXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzQXJyYXksIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHsgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcywgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcclxuaW1wb3J0IHsgcmVnaXN0ZXJUd2Vha2VyLCB0cnlVbnR3ZWFrLCB0d2VhayB9IGZyb20gXCIuL3R3ZWFrXCJcclxuaW1wb3J0IHsgVHdlYWtlclByaW9yaXR5IH0gZnJvbSBcIi4vVHdlYWtlclByaW9yaXR5XCJcclxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi90eXBlQ2hlY2tpbmdcIlxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWFrQXJyYXk8VCBleHRlbmRzIGFueVtdPihcclxuICB2YWx1ZTogVCxcclxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQsXHJcbiAgZG9Ob3RUd2Vha0NoaWxkcmVuOiBib29sZWFuXHJcbik6IFQge1xyXG4gIGNvbnN0IG9yaWdpbmFsQXJyOiBSZWFkb25seUFycmF5PGFueT4gPSB2YWx1ZVxyXG4gIGNvbnN0IGFyckxuID0gb3JpZ2luYWxBcnIubGVuZ3RoXHJcbiAgY29uc3QgdHdlYWtlZEFyciA9IGlzT2JzZXJ2YWJsZUFycmF5KG9yaWdpbmFsQXJyKVxyXG4gICAgPyBvcmlnaW5hbEFyclxyXG4gICAgOiBvYnNlcnZhYmxlLmFycmF5KFtdLCBvYnNlcnZhYmxlT3B0aW9ucylcclxuICBpZiAodHdlYWtlZEFyciAhPT0gb3JpZ2luYWxBcnIpIHtcclxuICAgIHR3ZWFrZWRBcnIubGVuZ3RoID0gb3JpZ2luYWxBcnIubGVuZ3RoXHJcbiAgfVxyXG5cclxuICBsZXQgaW50ZXJjZXB0RGlzcG9zZXI6ICgpID0+IHZvaWRcclxuICBsZXQgb2JzZXJ2ZURpc3Bvc2VyOiAoKSA9PiB2b2lkXHJcblxyXG4gIGNvbnN0IHVudHdlYWsgPSAoKSA9PiB7XHJcbiAgICBpbnRlcmNlcHREaXNwb3NlcigpXHJcbiAgICBvYnNlcnZlRGlzcG9zZXIoKVxyXG4gIH1cclxuXHJcbiAgdHdlYWtlZE9iamVjdHMuc2V0KHR3ZWFrZWRBcnIsIHVudHdlYWspXHJcbiAgc2V0UGFyZW50KHtcclxuICAgIHZhbHVlOiB0d2Vha2VkQXJyLFxyXG4gICAgcGFyZW50UGF0aCxcclxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXHJcbiAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxyXG4gICAgLy8gYXJyYXlzIHNob3VsZG4ndCBiZSBjbG9uZWQgYW55d2F5XHJcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgdW50cmFuc2Zvcm1lZFNuOiBhbnlbXSA9IFtdXHJcbiAgdW50cmFuc2Zvcm1lZFNuLmxlbmd0aCA9IGFyckxuXHJcblxyXG4gIC8vIHN1YnN0aXR1dGUgaW5pdGlhbCB2YWx1ZXMgYnkgcHJveGllZCB2YWx1ZXNcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyckxuOyBpKyspIHtcclxuICAgIGNvbnN0IHYgPSBvcmlnaW5hbEFycltpXVxyXG5cclxuICAgIGlmIChpc1ByaW1pdGl2ZSh2KSkge1xyXG4gICAgICBpZiAoIWRvTm90VHdlYWtDaGlsZHJlbikge1xyXG4gICAgICAgIHNldCh0d2Vha2VkQXJyLCBpLCB2KVxyXG4gICAgICB9XHJcblxyXG4gICAgICB1bnRyYW5zZm9ybWVkU25baV0gPSB2XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwYXRoID0geyBwYXJlbnQ6IHR3ZWFrZWRBcnIsIHBhdGg6IGkgfVxyXG5cclxuICAgICAgbGV0IHR3ZWFrZWRWYWx1ZVxyXG4gICAgICBpZiAoZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XHJcbiAgICAgICAgdHdlYWtlZFZhbHVlID0gdlxyXG4gICAgICAgIHNldFBhcmVudCh7XHJcbiAgICAgICAgICB2YWx1ZTogdHdlYWtlZFZhbHVlLFxyXG4gICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcclxuICAgICAgICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gdGhlIHZhbHVlIGlzIGFscmVhZHkgYSBuZXcgdmFsdWUgKHRoZSByZXN1bHQgb2YgYSBmcm9tU25hcHNob3QpXHJcbiAgICAgICAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0d2Vha2VkVmFsdWUgPSB0d2Vhayh2LCBwYXRoKVxyXG4gICAgICAgIHNldCh0d2Vha2VkQXJyLCBpLCB0d2Vha2VkVmFsdWUpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHR3ZWFrZWRWYWx1ZSkhXHJcbiAgICAgIHVudHJhbnNmb3JtZWRTbltpXSA9IHZhbHVlU24udHJhbnNmb3JtZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QodHdlYWtlZEFyciwgdW50cmFuc2Zvcm1lZFNuLCB1bmRlZmluZWQpXHJcblxyXG4gIGludGVyY2VwdERpc3Bvc2VyID0gaW50ZXJjZXB0KHR3ZWFrZWRBcnIsIGludGVyY2VwdEFycmF5TXV0YXRpb24uYmluZCh1bmRlZmluZWQsIHR3ZWFrZWRBcnIpKVxyXG4gIG9ic2VydmVEaXNwb3NlciA9IG9ic2VydmUodHdlYWtlZEFyciwgYXJyYXlEaWRDaGFuZ2UpXHJcblxyXG4gIHJldHVybiB0d2Vha2VkQXJyIGFzIGFueVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheURpZENoYW5nZShjaGFuZ2U6IGFueSAvKklBcnJheURpZENoYW5nZSovKSB7XHJcbiAgY29uc3QgYXJyID0gY2hhbmdlLm9iamVjdFxyXG4gIGxldCB7IHVudHJhbnNmb3JtZWQ6IG9sZFNuYXBzaG90IH0gPSBnZXRJbnRlcm5hbFNuYXBzaG90KGFyciBhcyBBcnJheTxhbnk+KSFcclxuXHJcbiAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IG5ldyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIoKVxyXG5cclxuICBsZXQgbXV0YXRlOiAoKHNuOiBhbnlbXSkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xyXG4gICAgY2FzZSBcInNwbGljZVwiOlxyXG4gICAgICB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGFuZ2UuaW5kZXhcclxuICAgICAgICBjb25zdCBhZGRlZENvdW50ID0gY2hhbmdlLmFkZGVkQ291bnRcclxuICAgICAgICBjb25zdCByZW1vdmVkQ291bnQgPSBjaGFuZ2UucmVtb3ZlZENvdW50XHJcblxyXG4gICAgICAgIGxldCBhZGRlZEl0ZW1zOiBhbnlbXSA9IFtdXHJcbiAgICAgICAgYWRkZWRJdGVtcy5sZW5ndGggPSBhZGRlZENvdW50XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRlZENvdW50OyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHYgPSBjaGFuZ2UuYWRkZWRbaV1cclxuICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2KSkge1xyXG4gICAgICAgICAgICBhZGRlZEl0ZW1zW2ldID0gdlxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYWRkZWRJdGVtc1tpXSA9IGdldEludGVybmFsU25hcHNob3QodikhLnRyYW5zZm9ybWVkXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbGRMZW4gPSBvbGRTbmFwc2hvdC5sZW5ndGhcclxuICAgICAgICBtdXRhdGUgPSAobmV3U25hcHNob3QpID0+IHtcclxuICAgICAgICAgIG5ld1NuYXBzaG90LnNwbGljZShpbmRleCwgcmVtb3ZlZENvdW50LCAuLi5hZGRlZEl0ZW1zKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICAgICAgY29uc3QgaW52UGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcblxyXG4gICAgICAgIC8vIG9wdGltaXphdGlvbjogaWYgd2UgYWRkIGFzIG1hbnkgYXMgd2UgcmVtb3ZlIHRoZW4gcmVtb3ZlL3JlYWRkIGluc3RlYWRcclxuXHJcbiAgICAgICAgLy8gd2UgY2Fubm90IHJlcGxhY2Ugc2luY2Ugd2UgbWlnaHQgZW5kIHVwIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBzYW1lIG5vZGVcclxuICAgICAgICAvLyBtaWdodCBhdHRlbXB0IHRvIGJlIHRlbXBvcmFyaWx5IHR3aWNlIGluc2lkZSB0aGUgc2FtZSB0cmVlIChlLmcuIHNvcnRpbmcpXHJcblxyXG4gICAgICAgIC8vIGl0IHdvdWxkIGJlIGZhc3RlciB0byBrZWVwIGhvbGVzIHJhdGhlciB0aGFuIHJlbW92ZS9yZWFkZCwgYnV0IGlmIHdlIGRvIHRoYXQgdGhlblxyXG4gICAgICAgIC8vIHZhbGlkYXRpb24gbWlnaHQgZmFpbFxyXG5cclxuICAgICAgICBpZiAoYWRkZWRDb3VudCA9PT0gcmVtb3ZlZENvdW50KSB7XHJcbiAgICAgICAgICBjb25zdCByZWFkZFBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gICAgICAgICAgY29uc3QgcmVhZGRJbnZQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgICAgICAgIGxldCByZW1vdmVkID0gMFxyXG5cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkZWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYWxJbmRleCA9IGluZGV4ICsgaVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gZ2V0VmFsdWVBZnRlclNwbGljZShcclxuICAgICAgICAgICAgICBvbGRTbmFwc2hvdCxcclxuICAgICAgICAgICAgICByZWFsSW5kZXgsXHJcbiAgICAgICAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgICAgICAgcmVtb3ZlZENvdW50LFxyXG4gICAgICAgICAgICAgIGFkZGVkSXRlbXNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBjb25zdCBvbGRWYWwgPSBvbGRTbmFwc2hvdFtyZWFsSW5kZXhdXHJcblxyXG4gICAgICAgICAgICBpZiAobmV3VmFsICE9PSBvbGRWYWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCByZW1vdmVQYXRoID0gW3JlYWxJbmRleCAtIHJlbW92ZWRdXHJcbiAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogcmVtb3ZlUGF0aCxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IHJlbW92ZVBhdGgsXHJcbiAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgcmVtb3ZlZCsrXHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHJlYWRkUGF0aCA9IFtyZWFsSW5kZXhdXHJcbiAgICAgICAgICAgICAgcmVhZGRQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiByZWFkZFBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxyXG4gICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgIHJlYWRkSW52UGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogcmVhZGRQYXRoLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3Qob2xkVmFsKSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLnJlYWRkUGF0Y2hlcylcclxuICAgICAgICAgIGludlBhdGNoZXMucHVzaCguLi5yZWFkZEludlBhdGNoZXMpXHJcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJldmVyc2Ugc2luY2UgaW52ZXJzZSBwYXRjaGVzIGFyZSBhcHBsaWVkIGluIHJldmVyc2VcclxuICAgICAgICAgIGludlBhdGNoZXMucmV2ZXJzZSgpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGludGVyaW1MZW4gPSBvbGRMZW4gLSByZW1vdmVkQ291bnRcclxuXHJcbiAgICAgICAgICAvLyBmaXJzdCByZW1vdmUgaXRlbXNcclxuICAgICAgICAgIGlmIChyZW1vdmVkQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwgd2hlbiByZW1vdmluZyBmcm9tIHRoZSBlbmQgc2V0IHRoZSBsZW5ndGggaW5zdGVhZFxyXG4gICAgICAgICAgICBjb25zdCByZW1vdmVVc2luZ1NldExlbmd0aCA9IGluZGV4ID49IGludGVyaW1MZW5cclxuICAgICAgICAgICAgaWYgKHJlbW92ZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IFtcImxlbmd0aFwiXSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBpbnRlcmltTGVuLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSByZW1vdmVkQ291bnQgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxJbmRleCA9IGluZGV4ICsgaVxyXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBbcmVhbEluZGV4XVxyXG5cclxuICAgICAgICAgICAgICBpZiAoIXJlbW92ZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgLi4uMiwgMSwgMFxyXG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gYWRkIDAsIDEsIDIuLi4gc2luY2UgaW52ZXJzZSBwYXRjaGVzIGFyZSBhcHBsaWVkIGluIHJldmVyc2VcclxuICAgICAgICAgICAgICBpbnZQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3Qob2xkU25hcHNob3RbcmVhbEluZGV4XSksXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoZW4gYWRkIGl0ZW1zXHJcbiAgICAgICAgICBpZiAoYWRkZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBmb3IgaW52ZXJzZSBwYXRjaGVzLCB3aGVuIGFkZGluZyBmcm9tIHRoZSBlbmQgc2V0IHRoZSBsZW5ndGggdG8gcmVzdG9yZSBpbnN0ZWFkXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3RvcmVVc2luZ1NldExlbmd0aCA9IGluZGV4ID49IGludGVyaW1MZW5cclxuICAgICAgICAgICAgaWYgKHJlc3RvcmVVc2luZ1NldExlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBbXCJsZW5ndGhcIl0sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW50ZXJpbUxlbixcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGVkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxJbmRleCA9IGluZGV4ICsgaVxyXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBbcmVhbEluZGV4XVxyXG5cclxuICAgICAgICAgICAgICAvLyBhZGQgMCwgMSwgMi4uLlxyXG4gICAgICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChcclxuICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVBZnRlclNwbGljZShvbGRTbmFwc2hvdCwgcmVhbEluZGV4LCBpbmRleCwgcmVtb3ZlZENvdW50LCBhZGRlZEl0ZW1zKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAvLyByZW1vdmUgLi4uMiwgMSwgMCBzaW5jZSBpbnZlcnNlIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZVxyXG4gICAgICAgICAgICAgIGlmICghcmVzdG9yZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpbnZQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXRjaFJlY29yZGVyLnJlY29yZChwYXRjaGVzLCBpbnZQYXRjaGVzKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcblxyXG4gICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICB7XHJcbiAgICAgICAgY29uc3QgayA9IGNoYW5nZS5pbmRleFxyXG4gICAgICAgIGNvbnN0IHZhbCA9IGNoYW5nZS5uZXdWYWx1ZVxyXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFNuYXBzaG90W2tdXHJcbiAgICAgICAgbGV0IG5ld1ZhbDogYW55XHJcbiAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcclxuICAgICAgICAgIG5ld1ZhbCA9IHZhbFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZVNuID0gZ2V0SW50ZXJuYWxTbmFwc2hvdCh2YWwpIVxyXG4gICAgICAgICAgbmV3VmFsID0gdmFsdWVTbi50cmFuc2Zvcm1lZFxyXG4gICAgICAgIH1cclxuICAgICAgICBtdXRhdGUgPSAobmV3U25hcHNob3QpID0+IHtcclxuICAgICAgICAgIG5ld1NuYXBzaG90W2tdID0gbmV3VmFsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXRoID0gW2tdXHJcblxyXG4gICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3QobmV3VmFsKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UoYXJyLCBwYXRjaFJlY29yZGVyKVxyXG5cclxuICBpZiAoIXJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgJiYgbXV0YXRlKSB7XHJcbiAgICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90KGFyciwgbXV0YXRlKVxyXG4gICAgcGF0Y2hSZWNvcmRlci5lbWl0KGFycilcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHVuZGVmaW5lZEluc2lkZUFycmF5RXJyb3JNc2cgPVxyXG4gIFwidW5kZWZpbmVkIGlzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGFycmF5cyBzaW5jZSBpdCBpcyBub3Qgc2VyaWFsaXphYmxlIGluIEpTT04sIGNvbnNpZGVyIHVzaW5nIG51bGwgaW5zdGVhZFwiXHJcblxyXG4vLyBUT0RPOiByZW1vdmUgYXJyYXkgcGFyYW1ldGVyIGFuZCBqdXN0IHVzZSBjaGFuZ2Uub2JqZWN0IG9uY2UgbW9ieCB1cGRhdGUgZXZlbnQgaXMgZml4ZWRcclxuZnVuY3Rpb24gaW50ZXJjZXB0QXJyYXlNdXRhdGlvbihcclxuICBhcnJheTogSU9ic2VydmFibGVBcnJheSxcclxuICBjaGFuZ2U6IElBcnJheVdpbGxDaGFuZ2UgfCBJQXJyYXlXaWxsU3BsaWNlXHJcbikge1xyXG4gIGFzc2VydENhbldyaXRlKClcclxuXHJcbiAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xyXG4gICAgY2FzZSBcInNwbGljZVwiOlxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGluRGV2TW9kZSgpICYmICFnZXRHbG9iYWxDb25maWcoKS5hbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHMpIHtcclxuICAgICAgICAgIGNvbnN0IGxlbiA9IGNoYW5nZS5hZGRlZC5sZW5ndGhcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdiA9IGNoYW5nZS5hZGRlZFtpXVxyXG4gICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZmFpbHVyZSh1bmRlZmluZWRJbnNpZGVBcnJheUVycm9yTXNnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5yZW1vdmVkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZFZhbHVlID0gY2hhbmdlLm9iamVjdFtjaGFuZ2UuaW5kZXggKyBpXVxyXG4gICAgICAgICAgdHdlYWsocmVtb3ZlZFZhbHVlLCB1bmRlZmluZWQpXHJcbiAgICAgICAgICB0cnlVbnR3ZWFrKHJlbW92ZWRWYWx1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmFkZGVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjaGFuZ2UuYWRkZWRbaV0gPSB0d2VhayhjaGFuZ2UuYWRkZWRbaV0sIHtcclxuICAgICAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxyXG4gICAgICAgICAgICBwYXRoOiBjaGFuZ2UuaW5kZXggKyBpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHdlIG1pZ2h0IGFsc28gbmVlZCB0byB1cGRhdGUgdGhlIHBhcmVudCBvZiB0aGUgbmV4dCBpbmRleGVzXHJcbiAgICAgICAgY29uc3Qgb2xkTmV4dEluZGV4ID0gY2hhbmdlLmluZGV4ICsgY2hhbmdlLnJlbW92ZWRDb3VudFxyXG4gICAgICAgIGNvbnN0IG5ld05leHRJbmRleCA9IGNoYW5nZS5pbmRleCArIGNoYW5nZS5hZGRlZC5sZW5ndGhcclxuXHJcbiAgICAgICAgaWYgKG9sZE5leHRJbmRleCAhPT0gbmV3TmV4dEluZGV4KSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gb2xkTmV4dEluZGV4LCBqID0gbmV3TmV4dEluZGV4OyBpIDwgY2hhbmdlLm9iamVjdC5sZW5ndGg7IGkrKywgaisrKSB7XHJcbiAgICAgICAgICAgIHNldFBhcmVudCh7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNoYW5nZS5vYmplY3RbaV0sXHJcbiAgICAgICAgICAgICAgcGFyZW50UGF0aDoge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgcGF0aDogaixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIC8vIGp1c3QgcmUtaW5kZXhpbmdcclxuICAgICAgICAgICAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcblxyXG4gICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgaW5EZXZNb2RlKCkgJiZcclxuICAgICAgICAhZ2V0R2xvYmFsQ29uZmlnKCkuYWxsb3dVbmRlZmluZWRBcnJheUVsZW1lbnRzICYmXHJcbiAgICAgICAgY2hhbmdlLm5ld1ZhbHVlID09PSB1bmRlZmluZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZSh1bmRlZmluZWRJbnNpZGVBcnJheUVycm9yTXNnKVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUT0RPOiBzaG91bGQgYmUgY2hhbmdlLm9iamVjdCwgYnV0IG1vYnggaXMgYnVnZ2VkIGFuZCBkb2Vzbid0IHNlbmQgdGhlIHByb3h5XHJcbiAgICAgIGNvbnN0IG9sZFZhbCA9IGFycmF5W2NoYW5nZS5pbmRleF1cclxuICAgICAgdHdlYWsob2xkVmFsLCB1bmRlZmluZWQpIC8vIHNldCBvbGQgcHJvcCBvYmogcGFyZW50IHRvIHVuZGVmaW5lZFxyXG4gICAgICB0cnlVbnR3ZWFrKG9sZFZhbClcclxuXHJcbiAgICAgIGNoYW5nZS5uZXdWYWx1ZSA9IHR3ZWFrKGNoYW5nZS5uZXdWYWx1ZSwgeyBwYXJlbnQ6IGFycmF5LCBwYXRoOiBjaGFuZ2UuaW5kZXggfSlcclxuICAgICAgYnJlYWtcclxuICB9XHJcbiAgcmV0dXJuIGNoYW5nZVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBcnJheVR3ZWFrZXIoKSB7XHJcbiAgcmVnaXN0ZXJUd2Vha2VyKFR3ZWFrZXJQcmlvcml0eS5BcnJheSwgKHZhbHVlLCBwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHR3ZWFrQXJyYXkodmFsdWUsIHBhcmVudFBhdGgsIGZhbHNlKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IG9ic2VydmFibGVPcHRpb25zID0ge1xyXG4gIGRlZXA6IGZhbHNlLFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRWYWx1ZUFmdGVyU3BsaWNlPFQ+KFxyXG4gIGFycmF5OiByZWFkb25seSBUW10sXHJcbiAgaTogbnVtYmVyLFxyXG4gIGluZGV4OiBudW1iZXIsXHJcbiAgcmVtb3ZlOiBudW1iZXIsXHJcbiAgYWRkZWRJdGVtczogcmVhZG9ubHkgVFtdXHJcbikge1xyXG4gIGNvbnN0IGJhc2UgPSBpIC0gaW5kZXhcclxuICBpZiAoYmFzZSA8IDApIHtcclxuICAgIHJldHVybiBhcnJheVtpXVxyXG4gIH1cclxuXHJcbiAgaWYgKGJhc2UgPCBhZGRlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGFkZGVkSXRlbXNbYmFzZV1cclxuICB9XHJcblxyXG4gIHJldHVybiBhcnJheVtpIC0gYWRkZWRJdGVtcy5sZW5ndGggKyByZW1vdmVdXHJcbn1cclxuIiwiaW1wb3J0IHsgb2JzZXJ2YWJsZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHR3ZWFrQXJyYXkgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha0FycmF5XCJcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgRnJvbVNuYXBzaG90Q29udGV4dCxcbiAgaW50ZXJuYWxGcm9tU25hcHNob3QsXG4gIG9ic2VydmFibGVPcHRpb25zLFxuICByZWdpc3RlclNuYXBzaG90dGVyLFxufSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgU25hcHNob3RJbk9mT2JqZWN0IH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gZnJvbUFycmF5U25hcHNob3Qoc246IFNuYXBzaG90SW5PZk9iamVjdDxhbnk+LCBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQpOiBhbnlbXSB7XG4gIGNvbnN0IGFyciA9IG9ic2VydmFibGUuYXJyYXkoW10gYXMgYW55W10sIG9ic2VydmFibGVPcHRpb25zKVxuICBjb25zdCBsbiA9IHNuLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxuOyBpKyspIHtcbiAgICBhcnIucHVzaChpbnRlcm5hbEZyb21TbmFwc2hvdChzbltpXSwgY3R4KSlcbiAgfVxuICByZXR1cm4gdHdlYWtBcnJheShhcnIsIHVuZGVmaW5lZCwgdHJ1ZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvbUFycmF5U25hcHNob3R0ZXIoKSB7XG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuQXJyYXksIChzbiwgY3R4KSA9PiB7XG4gICAgaWYgKGlzQXJyYXkoc24pKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5U25hcHNob3Qoc24sIGN0eClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgZnJvemVuLCBpc0Zyb3plblNuYXBzaG90IH0gZnJvbSBcIi4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHsgcmVnaXN0ZXJTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvbUZyb3plblNuYXBzaG90dGVyKCkge1xuICByZWdpc3RlclNuYXBzaG90dGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LkZyb3plbiwgKHNuKSA9PiB7XG4gICAgaWYgKGlzRnJvemVuU25hcHNob3Qoc24pKSB7XG4gICAgICByZXR1cm4gZnJvemVuKHNuLmRhdGEpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBnZXRNb2RlbEluZm9Gb3JOYW1lIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEZyb21TbmFwc2hvdENvbnRleHQsIHJlZ2lzdGVyU25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgU25hcHNob3RJbk9mTW9kZWwgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiBmcm9tTW9kZWxTbmFwc2hvdChzbjogU25hcHNob3RJbk9mTW9kZWw8QW55TW9kZWw+LCBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQpOiBBbnlNb2RlbCB7XG4gIGNvbnN0IHR5cGUgPSBzblttb2RlbFR5cGVLZXldXG5cbiAgaWYgKCF0eXBlKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgYSBtb2RlbCBzbmFwc2hvdCBtdXN0IGNvbnRhaW4gYSB0eXBlIGtleSAoJHttb2RlbFR5cGVLZXl9KSwgYnV0IG5vbmUgd2FzIGZvdW5kYClcbiAgfVxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUodHlwZSlcbiAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBtb2RlbCB3aXRoIG5hbWUgXCIke3R5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gIH1cblxuICBjb25zdCBtb2RlbElkUHJvcGVydHlOYW1lID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pXG4gIGlmIChtb2RlbElkUHJvcGVydHlOYW1lICYmIChzbiBhcyBhbnkpW21vZGVsSWRQcm9wZXJ0eU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgYGEgbW9kZWwgc25hcHNob3Qgb2YgdHlwZSAnJHt0eXBlfScgbXVzdCBjb250YWluIGFuIGlkIGtleSAoJHttb2RlbElkUHJvcGVydHlOYW1lfSksIGJ1dCBub25lIHdhcyBmb3VuZGBcbiAgICApXG4gIH1cblxuICByZXR1cm4gbmV3IChtb2RlbEluZm8uY2xhc3MgYXMgYW55KSh1bmRlZmluZWQsIHtcbiAgICBzbmFwc2hvdEluaXRpYWxEYXRhOiB7XG4gICAgICB1bnByb2Nlc3NlZFNuYXBzaG90OiBzbixcbiAgICAgIHNuYXBzaG90VG9Jbml0aWFsRGF0YTogY3R4LnNuYXBzaG90VG9Jbml0aWFsRGF0YSxcbiAgICB9LFxuICAgIGdlbmVyYXRlTmV3SWRzOiBjdHgub3B0aW9ucy5nZW5lcmF0ZU5ld0lkcyxcbiAgfSBhcyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucylcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvbU1vZGVsU25hcHNob3R0ZXIoKSB7XG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuTW9kZWwsIChzbiwgY3R4KSA9PiB7XG4gICAgaWYgKGlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiBmcm9tTW9kZWxTbmFwc2hvdChzbiwgY3R4KVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBvYnNlcnZhYmxlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyB0d2Vha1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtQbGFpbk9iamVjdFwiXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIEZyb21TbmFwc2hvdENvbnRleHQsXG4gIGludGVybmFsRnJvbVNuYXBzaG90LFxuICBvYnNlcnZhYmxlT3B0aW9ucyxcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcixcbn0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IFNuYXBzaG90SW5PZk9iamVjdCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIGZyb21QbGFpbk9iamVjdFNuYXBzaG90KHNuOiBTbmFwc2hvdEluT2ZPYmplY3Q8YW55PiwgY3R4OiBGcm9tU25hcHNob3RDb250ZXh0KTogb2JqZWN0IHtcbiAgY29uc3QgcGxhaW5PYmogPSBvYnNlcnZhYmxlLm9iamVjdCh7fSwgdW5kZWZpbmVkLCBvYnNlcnZhYmxlT3B0aW9ucylcblxuICBjb25zdCBzbktleXMgPSBPYmplY3Qua2V5cyhzbilcbiAgY29uc3Qgc25LZXlzTGVuID0gc25LZXlzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNuS2V5c0xlbjsgaSsrKSB7XG4gICAgY29uc3QgayA9IHNuS2V5c1tpXVxuICAgIGNvbnN0IHYgPSBzbltrXVxuICAgIHNldChwbGFpbk9iaiwgaywgaW50ZXJuYWxGcm9tU25hcHNob3QodiwgY3R4KSlcbiAgfVxuICByZXR1cm4gdHdlYWtQbGFpbk9iamVjdChwbGFpbk9iaiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIGZhbHNlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tUGxhaW5PYmplY3RTbmFwc2hvdHRlcigpIHtcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5QbGFpbk9iamVjdCwgKHNuLCBjdHgpID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChzbikpIHtcbiAgICAgIHJldHVybiBmcm9tUGxhaW5PYmplY3RTbmFwc2hvdChzbiwgY3R4KVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3RlckZyb21BcnJheVNuYXBzaG90dGVyIH0gZnJvbSBcIi4vZnJvbUFycmF5U25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm9tRnJvemVuU25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tRnJvemVuU25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm9tTW9kZWxTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21Nb2RlbFNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyRnJvbVBsYWluT2JqZWN0U25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tUGxhaW5PYmplY3RTbmFwc2hvdFwiXG5cbmxldCBkZWZhdWx0U25hcHNob3R0ZXJzUmVnaXN0ZXJlZCA9IGZhbHNlXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnMoKSB7XG4gIGlmIChkZWZhdWx0U25hcHNob3R0ZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRTbmFwc2hvdHRlcnNSZWdpc3RlcmVkID0gdHJ1ZVxuXG4gIHJlZ2lzdGVyRnJvbUFycmF5U25hcHNob3R0ZXIoKVxuICByZWdpc3RlckZyb21Gcm96ZW5TbmFwc2hvdHRlcigpXG4gIHJlZ2lzdGVyRnJvbU1vZGVsU25hcHNob3R0ZXIoKVxuICByZWdpc3RlckZyb21QbGFpbk9iamVjdFNuYXBzaG90dGVyKClcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgb2JzZXJ2YWJsZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgaXNSZXNlcnZlZE1vZGVsS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyBpc0xhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNNYXAsIGlzUHJpbWl0aXZlLCBpc1NldCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyByZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnMgfSBmcm9tIFwiLi9yZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnNcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2YsIFNuYXBzaG90SW5PZk1vZGVsLCBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFNuYXBzaG90dGVyID0gKHNuOiBhbnksIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCkgPT4gYW55IHwgdW5kZWZpbmVkXG5cbmNvbnN0IHNuYXBzaG90dGVyczogeyBwcmlvcml0eTogbnVtYmVyOyBzbmFwc2hvdHRlcjogU25hcHNob3R0ZXIgfVtdID0gW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU25hcHNob3R0ZXIocHJpb3JpdHk6IG51bWJlciwgc25hcHNob3R0ZXI6IFNuYXBzaG90dGVyKTogdm9pZCB7XG4gIHNuYXBzaG90dGVycy5wdXNoKHsgcHJpb3JpdHksIHNuYXBzaG90dGVyIH0pXG4gIHNuYXBzaG90dGVycy5zb3J0KChhLCBiKSA9PiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSlcbn1cblxuLyoqXG4gKiBGcm9tIHNuYXBzaG90IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVNuYXBzaG90T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYXNzIGB0cnVlYCB0byBnZW5lcmF0ZSBuZXcgaW50ZXJuYWwgaWRzIGZvciBtb2RlbHMgcmF0aGVyIHRoYW4gcmV1c2luZyB0aGVtLiAoRGVmYXVsdCBpcyBgZmFsc2VgKVxuICAgKi9cbiAgZ2VuZXJhdGVOZXdJZHM6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcm9tU25hcHNob3RDb250ZXh0IHtcbiAgb3B0aW9uczogRnJvbVNuYXBzaG90T3B0aW9uc1xuICBzbmFwc2hvdFRvSW5pdGlhbERhdGEocHJvY2Vzc2VkU246IFNuYXBzaG90SW5PZk1vZGVsPEFueU1vZGVsPik6IGFueVxufVxuXG4vKipcbiAqIEdpdmVuIGEgdHlwZSBkZXNlcmlhbGl6ZXMgYSBkYXRhIHN0cnVjdHVyZSBmcm9tIGl0cyBzbmFwc2hvdCBmb3JtLlxuICpcbiAqIEB0eXBlcGFyYW0gVFR5cGUgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBUeXBlLlxuICogQHBhcmFtIHNuYXBzaG90IFNuYXBzaG90LCBldmVuIGlmIGEgcHJpbWl0aXZlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNuYXBzaG90PFxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+XG4+KFxuICB0eXBlOiBUVHlwZSxcbiAgc25hcHNob3Q6IFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4sXG4gIG9wdGlvbnM/OiBQYXJ0aWFsPEZyb21TbmFwc2hvdE9wdGlvbnM+XG4pOiBUeXBlVG9EYXRhPFRUeXBlPlxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBhIGRhdGEgc3RydWN0dXJlIGZyb20gaXRzIHNuYXBzaG90IGZvcm0uXG4gKlxuICogQHR5cGVwYXJhbSBUIE9iamVjdCB0eXBlLlxuICogQHBhcmFtIHNuYXBzaG90IFNuYXBzaG90LCBldmVuIGlmIGEgcHJpbWl0aXZlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNuYXBzaG90PFQ+KFxuICBzbmFwc2hvdDogU25hcHNob3RJbk9mPFQ+IHwgU25hcHNob3RPdXRPZjxUPixcbiAgb3B0aW9ucz86IFBhcnRpYWw8RnJvbVNuYXBzaG90T3B0aW9ucz5cbik6IFRcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TbmFwc2hvdDxUPihhcmcxOiBhbnksIGFyZzI6IGFueSwgYXJnMz86IGFueSk6IFQge1xuICBsZXQgc25hcHNob3Q6IGFueVxuICBsZXQgb3B0aW9uczogUGFydGlhbDxGcm9tU25hcHNob3RPcHRpb25zPiB8IHVuZGVmaW5lZFxuXG4gIGlmIChpc0xhdGVUeXBlQ2hlY2tlcihhcmcxKSB8fCBhcmcxIGluc3RhbmNlb2YgVHlwZUNoZWNrZXIgfHwgaXNNb2RlbENsYXNzKGFyZzEpKSB7XG4gICAgY29uc3QgdHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoYXJnMSlcbiAgICBzbmFwc2hvdCA9IHR5cGVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvciA/IHR5cGVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihhcmcyKSA6IGFyZzJcbiAgICBvcHRpb25zID0gYXJnM1xuICB9IGVsc2Uge1xuICAgIHNuYXBzaG90ID0gYXJnMVxuICAgIG9wdGlvbnMgPSBhcmcyXG4gIH1cblxuICByZXR1cm4gZnJvbVNuYXBzaG90QWN0aW9uKHNuYXBzaG90LCBvcHRpb25zKVxufVxuXG5jb25zdCBmcm9tU25hcHNob3RBY3Rpb24gPSBhY3Rpb24oXG4gIFwiZnJvbVNuYXBzaG90XCIsXG4gIDxUPihzbmFwc2hvdDogU25hcHNob3RJbk9mPFQ+LCBvcHRpb25zPzogUGFydGlhbDxGcm9tU25hcHNob3RPcHRpb25zPik6IFQgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBnZW5lcmF0ZU5ld0lkczogZmFsc2UsXG4gICAgICBvdmVycmlkZVJvb3RNb2RlbElkOiB1bmRlZmluZWQsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cblxuICAgIGNvbnN0IGN0eDogUGFydGlhbDxGcm9tU25hcHNob3RDb250ZXh0PiA9IHtcbiAgICAgIG9wdGlvbnM6IG9wdHMsXG4gICAgfVxuICAgIGN0eC5zbmFwc2hvdFRvSW5pdGlhbERhdGEgPSBzbmFwc2hvdFRvSW5pdGlhbERhdGEuYmluZCh1bmRlZmluZWQsIGN0eCBhcyBGcm9tU25hcHNob3RDb250ZXh0KVxuXG4gICAgcmV0dXJuIGludGVybmFsRnJvbVNuYXBzaG90PFQ+KHNuYXBzaG90LCBjdHggYXMgRnJvbVNuYXBzaG90Q29udGV4dClcbiAgfVxuKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxGcm9tU25hcHNob3Q8VD4oXG4gIHNuOiBTbmFwc2hvdEluT2Y8VD4gfCBTbmFwc2hvdE91dE9mPFQ+LFxuICBjdHg6IEZyb21TbmFwc2hvdENvbnRleHRcbik6IFQge1xuICBpZiAoaXNQcmltaXRpdmUoc24pKSB7XG4gICAgcmV0dXJuIHNuIGFzIGFueVxuICB9XG5cbiAgcmVnaXN0ZXJEZWZhdWx0U25hcHNob3R0ZXJzKClcblxuICBjb25zdCBzbmFwc2hvdHRlckxlbiA9IHNuYXBzaG90dGVycy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbmFwc2hvdHRlckxlbjsgaSsrKSB7XG4gICAgY29uc3QgeyBzbmFwc2hvdHRlciB9ID0gc25hcHNob3R0ZXJzW2ldXG4gICAgY29uc3QgcmV0ID0gc25hcHNob3R0ZXIoc24sIGN0eClcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gIH1cblxuICBpZiAoaXNNYXAoc24pKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImEgc25hcHNob3QgbXVzdCBub3QgY29udGFpbiBtYXBzXCIpXG4gIH1cblxuICBpZiAoaXNTZXQoc24pKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImEgc25hcHNob3QgbXVzdCBub3QgY29udGFpbiBzZXRzXCIpXG4gIH1cblxuICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBzbmFwc2hvdCAtICR7c259YClcbn1cblxuZnVuY3Rpb24gc25hcHNob3RUb0luaXRpYWxEYXRhKFxuICBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQsXG4gIHByb2Nlc3NlZFNuOiBTbmFwc2hvdEluT2ZNb2RlbDxBbnlNb2RlbD5cbik6IGFueSB7XG4gIGNvbnN0IGluaXRpYWxEYXRhID0gb2JzZXJ2YWJsZS5vYmplY3Qoe30sIHVuZGVmaW5lZCwgb2JzZXJ2YWJsZU9wdGlvbnMpXG5cbiAgY29uc3QgcHJvY2Vzc2VkU25LZXlzID0gT2JqZWN0LmtleXMocHJvY2Vzc2VkU24pXG4gIGNvbnN0IHByb2Nlc3NlZFNuS2V5c0xlbiA9IHByb2Nlc3NlZFNuS2V5cy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWRTbktleXNMZW47IGkrKykge1xuICAgIGNvbnN0IGsgPSBwcm9jZXNzZWRTbktleXNbaV1cbiAgICBpZiAoIWlzUmVzZXJ2ZWRNb2RlbEtleShrKSkge1xuICAgICAgY29uc3QgdiA9IHByb2Nlc3NlZFNuW2tdXG4gICAgICBzZXQoaW5pdGlhbERhdGEsIGssIGludGVybmFsRnJvbVNuYXBzaG90KHYsIGN0eCkpXG4gICAgfVxuICB9XG4gIHJldHVybiBpbml0aWFsRGF0YVxufVxuXG5leHBvcnQgY29uc3Qgb2JzZXJ2YWJsZU9wdGlvbnMgPSB7XG4gIGRlZXA6IGZhbHNlLFxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuXG4vKipcbiAqIENsb25lIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvbmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhc3MgYHRydWVgIHRvIGdlbmVyYXRlIG5ldyBpbnRlcm5hbCBpZHMgZm9yIG1vZGVscyByYXRoZXIgdGhhbiByZXVzaW5nIHRoZW0uIChEZWZhdWx0IGlzIGB0cnVlYClcbiAgICovXG4gIGdlbmVyYXRlTmV3SWRzOiBib29sZWFuXG59XG5cbi8qKlxuICogQ2xvbmVzIGFuIG9iamVjdCBieSBkb2luZyBhIGBmcm9tU25hcHNob3QoZ2V0U25hcHNob3QodmFsdWUpLCB7IGdlbmVyYXRlTmV3SWRzOiB0cnVlIH0pYC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBPYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0gW29wdGlvbnNdIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgY2xvbmVkIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQsIG9wdGlvbnM/OiBQYXJ0aWFsPENsb25lT3B0aW9ucz4pOiBUIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICBjb25zdCBvcHRzID0ge1xuICAgIGdlbmVyYXRlTmV3SWRzOiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cblxuICBjb25zdCBzbiA9IGdldFNuYXBzaG90KG5vZGUpXG4gIHJldHVybiBmcm9tU25hcHNob3Qoc24sIG9wdHMpXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBlbnF1ZXVlUGVuZGluZ0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vcGVuZGluZ0FjdGlvbnNcIlxuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBhdHRhY2hUb1Jvb3RTdG9yZSwgZGV0YWNoRnJvbVJvb3RTdG9yZSB9IGZyb20gXCIuLi9yb290U3RvcmUvYXR0YWNoRGV0YWNoXCJcbmltcG9ydCB7IGlzUm9vdFN0b3JlIH0gZnJvbSBcIi4uL3Jvb3RTdG9yZS9yb290U3RvcmVcIlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi4vc25hcHNob3QvY2xvbmVcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIGRhdGFPYmplY3RQYXJlbnQsXG4gIGRhdGFUb01vZGVsTm9kZSxcbiAgb2JqZWN0UGFyZW50cyxcbiAgcGFyZW50UGF0aEVxdWFscyxcbiAgcmVwb3J0UGFyZW50UGF0aENoYW5nZWQsXG59IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgYWRkT2JqZWN0Q2hpbGQsIGluaXRpYWxpemVPYmplY3RDaGlsZHJlbiwgcmVtb3ZlT2JqZWN0Q2hpbGQgfSBmcm9tIFwiLi9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGgsIGZhc3RHZXRSb290LCBQYXJlbnRQYXRoIH0gZnJvbSBcIi4vcGF0aFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRQYXJlbnQgPSBhY3Rpb24oXG4gIFwic2V0UGFyZW50XCIsXG4gICh7XG4gICAgdmFsdWUsXG4gICAgcGFyZW50UGF0aCxcbiAgICBpbmRleENoYW5nZUFsbG93ZWQsXG4gICAgaXNEYXRhT2JqZWN0LFxuICAgIGNsb25lSWZBcHBsaWNhYmxlLFxuICB9OiB7XG4gICAgdmFsdWU6IGFueVxuICAgIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogYm9vbGVhblxuICAgIGlzRGF0YU9iamVjdDogYm9vbGVhblxuICAgIGNsb25lSWZBcHBsaWNhYmxlOiBib29sZWFuXG4gIH0pOiBhbnkgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgaWYgKGluZGV4Q2hhbmdlQWxsb3dlZCAmJiBjbG9uZUlmQXBwbGljYWJsZSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIFwiYXNzZXJ0aW9uIGZhaWxlZDogJ2luZGV4Q2hhbmdlQWxsb3dlZCcgYW5kICdjbG9uZUlmQXBwbGljYWJsZScgY2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lXCJcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBhc3NlcnRpb24gZmFpbGVkOiB2YWx1ZSBjYW5ub3QgYmUgYSBmdW5jdGlvbiBvciBhIHN5bWJvbGApXG4gICAgICB9XG4gICAgICBpZiAoIWlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgYXNzZXJ0aW9uIGZhaWxlZDogdmFsdWUgaXMgbm90IHJlYWR5IHRvIHRha2UgYSBwYXJlbnRgKVxuICAgICAgfVxuICAgICAgaWYgKHBhcmVudFBhdGggJiYgIWlzVHdlYWtlZE9iamVjdChwYXJlbnRQYXRoLnBhcmVudCwgdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgYXNzZXJ0aW9uIGZhaWxlZDogcGFyZW50IGlzIG5vdCByZWFkeSB0byB0YWtlIGNoaWxkcmVuYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNEYXRhT2JqZWN0KSB7XG4gICAgICBkYXRhT2JqZWN0UGFyZW50LnNldCh2YWx1ZSwgcGFyZW50UGF0aCEucGFyZW50KVxuICAgICAgLy8gZGF0YSBvYmplY3Qgd2lsbCBwcm94eSB0byB1c2UgdGhlIGFjdHVhbCBwYXJlbnQgbW9kZWwgZm9yIGNoaWxkL3BhcmVudCBzdHVmZlxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZU9iamVjdENoaWxkcmVuKHZhbHVlKVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBuZXcgcGFyZW50IGFjdHVhbGx5IHBvaW50cyB0byBtb2RlbHMgd2hlbiB3ZSBnaXZlIG1vZGVsIGRhdGEgb2Jqc1xuICAgIGlmIChwYXJlbnRQYXRoKSB7XG4gICAgICBjb25zdCBhY3R1YWxQYXJlbnQgPSBkYXRhVG9Nb2RlbE5vZGUocGFyZW50UGF0aC5wYXJlbnQpXG4gICAgICBpZiAocGFyZW50UGF0aC5wYXJlbnQgIT09IGFjdHVhbFBhcmVudCkge1xuICAgICAgICBwYXJlbnRQYXRoID0ge1xuICAgICAgICAgIHBhcmVudDogYWN0dWFsUGFyZW50LFxuICAgICAgICAgIHBhdGg6IHBhcmVudFBhdGgucGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBvbGRQYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG4gICAgaWYgKHBhcmVudFBhdGhFcXVhbHMob2xkUGFyZW50UGF0aCwgcGFyZW50UGF0aCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChpc1Jvb3RTdG9yZSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJyb290IHN0b3JlcyBjYW5ub3QgYmUgYXR0YWNoZWQgdG8gYW55IHBhcmVudHNcIilcbiAgICB9XG5cbiAgICAvLyB2YWx1ZSB0eXBlIG1vZGVscyBzaG91bGQgYmUgY2xvbmVkIHdoZW4gdGhleSBhcmUgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgcGFyZW50XG4gICAgLy8gYW5kIHRoZXkgaGFkIG9uZSBwcmV2aW91c2x5XG4gICAgaWYgKFxuICAgICAgY2xvbmVJZkFwcGxpY2FibGUgJiZcbiAgICAgIHBhcmVudFBhdGg/LnBhcmVudCAmJlxuICAgICAgb2xkUGFyZW50UGF0aD8ucGFyZW50ICYmXG4gICAgICBpc01vZGVsKHZhbHVlKSAmJlxuICAgICAgZ2V0TW9kZWxNZXRhZGF0YSh2YWx1ZSkudmFsdWVUeXBlXG4gICAgKSB7XG4gICAgICB2YWx1ZSA9IGNsb25lKHZhbHVlLCB7IGdlbmVyYXRlTmV3SWRzOiB0cnVlIH0pXG4gICAgICBvbGRQYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKG9sZFBhcmVudFBhdGggJiYgcGFyZW50UGF0aCkge1xuICAgICAgaWYgKG9sZFBhcmVudFBhdGgucGFyZW50ID09PSBwYXJlbnRQYXRoLnBhcmVudCAmJiBpbmRleENoYW5nZUFsbG93ZWQpIHtcbiAgICAgICAgLy8ganVzdCBjaGFuZ2luZyB0aGUgaW5kZXhcbiAgICAgICAgb2JqZWN0UGFyZW50cy5zZXQodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgICAgIHJlcG9ydFBhcmVudFBhdGhDaGFuZ2VkKHZhbHVlKVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhbiBvYmplY3QgY2Fubm90IGJlIGFzc2lnbmVkIGEgbmV3IHBhcmVudCB3aGVuIGl0IGFscmVhZHkgaGFzIG9uZVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaFRvTmV3UGFyZW50ID0gKCkgPT4ge1xuICAgICAgLy8gZGV0YWNoIGZyb20gb2xkXG4gICAgICBpZiAob2xkUGFyZW50UGF0aD8ucGFyZW50KSB7XG4gICAgICAgIHJlbW92ZU9iamVjdENoaWxkKG9sZFBhcmVudFBhdGgucGFyZW50LCB2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gYXR0YWNoIHRvIG5ld1xuICAgICAgb2JqZWN0UGFyZW50cy5zZXQodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgICBpZiAocGFyZW50UGF0aD8ucGFyZW50KSB7XG4gICAgICAgIGFkZE9iamVjdENoaWxkKHBhcmVudFBhdGgucGFyZW50LCB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJlcG9ydFBhcmVudFBhdGhDaGFuZ2VkKHZhbHVlKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJhc2VNb2RlbCkge1xuICAgICAgY29uc3Qgb2xkUm9vdCA9IGZhc3RHZXRSb290KHZhbHVlKVxuICAgICAgY29uc3Qgb2xkUm9vdFN0b3JlID0gaXNSb290U3RvcmUob2xkUm9vdCkgPyBvbGRSb290IDogdW5kZWZpbmVkXG5cbiAgICAgIGF0dGFjaFRvTmV3UGFyZW50KClcblxuICAgICAgY29uc3QgbmV3Um9vdCA9IGZhc3RHZXRSb290KHZhbHVlKVxuICAgICAgY29uc3QgbmV3Um9vdFN0b3JlID0gaXNSb290U3RvcmUobmV3Um9vdCkgPyBuZXdSb290IDogdW5kZWZpbmVkXG5cbiAgICAgIC8vIGludm9rZSBtb2RlbCByb290IHN0b3JlIGV2ZW50c1xuICAgICAgaWYgKG9sZFJvb3RTdG9yZSAhPT0gbmV3Um9vdFN0b3JlICYmIChvbGRSb290U3RvcmUgfHwgbmV3Um9vdFN0b3JlKSkge1xuICAgICAgICBlbnF1ZXVlUGVuZGluZ0FjdGlvbigoKSA9PiB7XG4gICAgICAgICAgaWYgKG9sZFJvb3RTdG9yZSkge1xuICAgICAgICAgICAgZGV0YWNoRnJvbVJvb3RTdG9yZSh2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5ld1Jvb3RTdG9yZSkge1xuICAgICAgICAgICAgYXR0YWNoVG9Sb290U3RvcmUobmV3Um9vdFN0b3JlLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dGFjaFRvTmV3UGFyZW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuKVxuIiwiaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxuaW1wb3J0IHsgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyVHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrXCJcbmltcG9ydCB7IFR3ZWFrZXJQcmlvcml0eSB9IGZyb20gXCIuL1R3ZWFrZXJQcmlvcml0eVwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d2Vha01vZGVsPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBULCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQpOiBUIHtcbiAgdHdlYWtlZE9iamVjdHMuc2V0KHZhbHVlLCB1bmRlZmluZWQpXG4gIHNldFBhcmVudCh7XG4gICAgdmFsdWUsXG4gICAgcGFyZW50UGF0aCxcbiAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgY2xvbmVJZkFwcGxpY2FibGU6IHRydWUsXG4gIH0pXG5cbiAgLy8gbm90aGluZyB0byBkbyBmb3IgbW9kZWxzLCBkYXRhIGlzIGFscmVhZHkgcHJveGlmaWVkIGFuZCBpdHMgcGFyZW50IGlzIHNldFxuICAvLyBmb3Igc25hcHNob3RzIHdlIHdpbGwgdXNlIGl0cyBcIiRcIiBvYmplY3Qgc25hcHNob3QgZGlyZWN0bHlcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kZWxUd2Vha2VyKCkge1xuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5Lk1vZGVsLCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcbiAgICBpZiAoaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0d2Vha01vZGVsKHZhbHVlLCBwYXJlbnRQYXRoKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgeyBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbFByb3BzSW5mb1wiXG5pbXBvcnQgeyBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL25ld01vZGVsXCJcbmltcG9ydCB7IG5vRGVmYXVsdFZhbHVlIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgdHdlYWtNb2RlbCB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrTW9kZWxcIlxuaW1wb3J0IHsgdHdlYWtQbGFpbk9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrUGxhaW5PYmplY3RcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlLCBtYWtlUHJvcFJlYWRvbmx5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSwgZ2V0TW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4vbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuL01vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGFzc2VydElzTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGludGVybmFsTmV3TW9kZWwgPSBhY3Rpb24oXG4gIFwibmV3TW9kZWxcIixcbiAgPE0gZXh0ZW5kcyBBbnlNb2RlbD4oXG4gICAgb3JpZ01vZGVsT2JqOiBNLFxuICAgIGluaXRpYWxEYXRhOiBNb2RlbFRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE0+IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFBpY2s8TW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMsIFwibW9kZWxDbGFzc1wiIHwgXCJzbmFwc2hvdEluaXRpYWxEYXRhXCIgfCBcImdlbmVyYXRlTmV3SWRzXCI+XG4gICk6IE0gPT4ge1xuICAgIGNvbnN0IG1vZGUgPSBpbml0aWFsRGF0YSA/IFwibmV3XCIgOiBcImZyb21TbmFwc2hvdFwiXG4gICAgY29uc3QgeyBtb2RlbENsYXNzOiBfbW9kZWxDbGFzcywgc25hcHNob3RJbml0aWFsRGF0YSwgZ2VuZXJhdGVOZXdJZHMgfSA9IG9wdGlvbnNcbiAgICBjb25zdCBtb2RlbENsYXNzID0gX21vZGVsQ2xhc3MhXG5cbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIGFzc2VydElzTW9kZWxDbGFzcyhtb2RlbENsYXNzLCBcIm1vZGVsQ2xhc3NcIilcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbE9iaiA9IG9yaWdNb2RlbE9iaiBhcyBPLldyaXRhYmxlPE0+XG5cbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChtb2RlbENsYXNzKVxuICAgIGlmICghbW9kZWxJbmZvKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgbm8gbW9kZWwgaW5mbyBmb3IgY2xhc3MgJHttb2RlbENsYXNzLm5hbWV9IGNvdWxkIGJlIGZvdW5kIC0gZGlkIHlvdSBmb3JnZXQgdG8gYWRkIHRoZSBAbW9kZWwgZGVjb3JhdG9yP2BcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbElkUHJvcGVydHlOYW1lID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbENsYXNzKVxuICAgIGNvbnN0IG1vZGVsUHJvcHMgPSBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8obW9kZWxDbGFzcylcbiAgICBjb25zdCBtb2RlbElkUHJvcERhdGEgPSBtb2RlbElkUHJvcGVydHlOYW1lID8gbW9kZWxQcm9wc1ttb2RlbElkUHJvcGVydHlOYW1lXSEgOiB1bmRlZmluZWRcblxuICAgIGxldCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgaWYgKHNuYXBzaG90SW5pdGlhbERhdGEpIHtcbiAgICAgIGxldCBzbiA9IHNuYXBzaG90SW5pdGlhbERhdGEudW5wcm9jZXNzZWRTbmFwc2hvdFxuXG4gICAgICBpZiAobW9kZWxJZFByb3BEYXRhICYmIG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgaWYgKGdlbmVyYXRlTmV3SWRzKSB7XG4gICAgICAgICAgaWQgPSAobW9kZWxJZFByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gYXMgKCkgPT4gc3RyaW5nKSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWQgPSBzblttb2RlbElkUHJvcGVydHlOYW1lXVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlbENsYXNzLmZyb21TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgICAgICBzbiA9IG1vZGVsQ2xhc3MuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgICAgfVxuXG4gICAgICBpbml0aWFsRGF0YSA9IHNuYXBzaG90SW5pdGlhbERhdGEuc25hcHNob3RUb0luaXRpYWxEYXRhKHNuKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1c2Ugc3ltYm9sIGlmIHByb3ZpZGVkXG4gICAgICBpZiAobW9kZWxJZFByb3BEYXRhICYmIG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgaWYgKGluaXRpYWxEYXRhIVttb2RlbElkUHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgIGlkID0gaW5pdGlhbERhdGEhW21vZGVsSWRQcm9wZXJ0eU5hbWVdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWQgPSAobW9kZWxJZFByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gYXMgKCkgPT4gc3RyaW5nKSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBtb2RlbE9ialttb2RlbFR5cGVLZXldID0gbW9kZWxJbmZvLm5hbWVcblxuICAgIC8vIGZpbGwgaW4gZGVmYXVsdHMgaW4gaW5pdGlhbCBkYXRhXG4gICAgY29uc3QgbW9kZWxQcm9wc0tleXMgPSBPYmplY3Qua2V5cyhtb2RlbFByb3BzKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kZWxQcm9wc0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBtb2RlbFByb3BzS2V5c1tpXVxuXG4gICAgICAvLyBpZCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIGFib3ZlXG4gICAgICBpZiAoayA9PT0gbW9kZWxJZFByb3BlcnR5TmFtZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wRGF0YSA9IG1vZGVsUHJvcHNba11cblxuICAgICAgbGV0IG5ld1ZhbHVlID0gaW5pdGlhbERhdGEhW2tdXG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG5cbiAgICAgIC8vIGFwcGx5IHVudHJhbnNmb3JtIChpZiBhbnkpXG4gICAgICBpZiAobW9kZSA9PT0gXCJuZXdcIiAmJiBwcm9wRGF0YS5faW50ZXJuYWwudHJhbnNmb3JtKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgIG5ld1ZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLnRyYW5zZm9ybS51bnRyYW5zZm9ybShuZXdWYWx1ZSwgbW9kZWxPYmosIGspXG4gICAgICB9XG5cbiAgICAgIC8vIGFwcGx5IGRlZmF1bHQgdmFsdWUgKGlmIG5lZWRlZClcbiAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuKClcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlXG4gICAgICAgIH0gZWxzZSBpZiAoIShcImtcIiBpbiBpbml0aWFsRGF0YSEpKSB7XG4gICAgICAgICAgLy8gZm9yIG1vYng0LCB3ZSBuZWVkIHRvIHNldCB1cCBwcm9wZXJ0aWVzIGV2ZW4gaWYgdGhleSBhcmUgdW5kZWZpbmVkXG4gICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBzZXQoaW5pdGlhbERhdGEgYXMgYW55LCBrLCBuZXdWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kZWxJZFByb3BlcnR5TmFtZSkge1xuICAgICAgc2V0KGluaXRpYWxEYXRhIGFzIGFueSwgbW9kZWxJZFByb3BlcnR5TmFtZSwgaWQpXG4gICAgfVxuXG4gICAgdHdlYWtNb2RlbChtb2RlbE9iaiwgdW5kZWZpbmVkKVxuXG4gICAgLy8gY3JlYXRlIG9ic2VydmFibGUgZGF0YSBvYmplY3Qgd2l0aCBpbml0aWFsIGRhdGFcbiAgICBsZXQgb2JzRGF0YSA9IHR3ZWFrUGxhaW5PYmplY3QoXG4gICAgICBpbml0aWFsRGF0YSEsXG4gICAgICB7IHBhcmVudDogbW9kZWxPYmosIHBhdGg6IFwiJFwiIH0sXG4gICAgICBtb2RlbE9ialttb2RlbFR5cGVLZXldLFxuICAgICAgZmFsc2UsXG4gICAgICB0cnVlXG4gICAgKVxuXG4gICAgLy8gbGluayBpdCwgYW5kIG1ha2UgaXQgcmVhZG9ubHlcbiAgICBtb2RlbE9iai4kID0gb2JzRGF0YVxuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgbWFrZVByb3BSZWFkb25seShtb2RlbE9iaiwgXCIkXCIsIHRydWUpXG4gICAgfVxuXG4gICAgLy8gdHlwZSBjaGVjayBpdCBpZiBuZWVkZWRcbiAgICBpZiAoaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkKCkgJiYgZ2V0TW9kZWxNZXRhZGF0YShtb2RlbENsYXNzKS5kYXRhVHlwZSkge1xuICAgICAgY29uc3QgZXJyID0gbW9kZWxPYmoudHlwZUNoZWNrKClcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZXJyLnRocm93KG1vZGVsT2JqKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJ1biBhbnkgZXh0cmEgaW5pdGlhbGl6ZXJzIGZvciB0aGUgY2xhc3MgYXMgbmVlZGVkXG4gICAgYXBwbHlNb2RlbEluaXRpYWxpemVycyhtb2RlbENsYXNzLCBtb2RlbE9iailcblxuICAgIHJldHVybiBtb2RlbE9iaiBhcyBNXG4gIH1cbilcbiIsImltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBmcm9tU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2wsXG4gIE1vZGVsQ2xhc3MsXG4gIHByb3BzVHlwZVN5bWJvbCxcbiAgdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbCxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUHJvcHMsXG4gIE1vZGVsUHJvcHNUb0RhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZk1vZGVsLCBTbmFwc2hvdE91dE9mTW9kZWwgfSBmcm9tIFwiLi4vc25hcHNob3QvU25hcHNob3RPZlwiXG5pbXBvcnQgeyB0eXBlc01vZGVsIH0gZnJvbSBcIi4uL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzTW9kZWxcIlxuaW1wb3J0IHsgdHlwZUNoZWNrIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVDaGVja1wiXG5pbXBvcnQgdHlwZSB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsSWRLZXksIG1vZGVsVHlwZUtleSB9IGZyb20gXCIuL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi9Nb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyBpbnRlcm5hbE5ld01vZGVsIH0gZnJvbSBcIi4vbmV3TW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0SXNNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWVTeW1ib2wgPSBTeW1ib2woXCJtb2RlbElkUHJvcGVydHlOYW1lXCIpXG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgbW9kZWxzLiBVc2UgYE1vZGVsYCBpbnN0ZWFkIHdoZW4gZXh0ZW5kaW5nLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkluaXRgIG9yIGBvbkF0dGFjaGVkVG9Sb290U3RvcmVgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBEYXRhIERhdGEgdHlwZS5cbiAqIEB0eXBlcGFyYW0gQ3JlYXRpb25EYXRhIENyZWF0aW9uIGRhdGEgdHlwZS5cbiAqIEB0eXBlcGFyYW0gTW9kZWxJZFByb3BlcnR5TmFtZSBNb2RlbCBpZCBwcm9wZXJ0eSBuYW1lLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBGcm9tU25hcHNob3RPdmVycmlkZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRvU25hcHNob3RPdmVycmlkZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIE1vZGVsSWRQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlclxuPiB7XG4gIC8vIGp1c3QgdG8gbWFrZSB0eXBpbmcgd29yayBwcm9wZXJseVxuICBbcHJvcHNUeXBlU3ltYm9sXSE6IFRQcm9wcztcbiAgW2Zyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF0hOiBGcm9tU25hcHNob3RPdmVycmlkZTtcbiAgW3RvU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdITogVG9TbmFwc2hvdE92ZXJyaWRlO1xuICBbbW9kZWxJZFByb3BlcnR5TmFtZVN5bWJvbF0hOiBNb2RlbElkUHJvcGVydHlOYW1lO1xuXG4gIC8qKlxuICAgKiBNb2RlbCB0eXBlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBbbW9kZWxUeXBlS2V5XSE6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBNb2RlbCBpbnRlcm5hbCBpZC4gQ2FuIGJlIG1vZGlmaWVkIGluc2lkZSBhIG1vZGVsIGFjdGlvbi5cbiAgICogSXQgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgaWYgdGhlcmUncyBubyBpZCBwcm9wIHNldC5cbiAgICovXG4gIGdldCBbbW9kZWxJZEtleV0oKTogW01vZGVsSWRQcm9wZXJ0eU5hbWVdIGV4dGVuZHMgW25ldmVyXSA/IG5ldmVyIDogc3RyaW5nIHtcbiAgICBjb25zdCBpZFByb3AgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuICAgIHJldHVybiBpZFByb3AgPyB0aGlzLiRbaWRQcm9wXSA6ICh1bmRlZmluZWQgYXMgYW55KVxuICB9XG5cbiAgc2V0IFttb2RlbElkS2V5XShuZXdJZDogW01vZGVsSWRQcm9wZXJ0eU5hbWVdIGV4dGVuZHMgW25ldmVyXSA/IG5ldmVyIDogc3RyaW5nKSB7XG4gICAgY29uc3QgaWRQcm9wID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSlcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIiRtb2RlbElkIGNhbm5vdCBiZSBzZXQgd2hlbiB0aGVyZSBpcyBubyBpZFByb3Agc2V0IGluIHRoZSBtb2RlbFwiKVxuICAgIH1cbiAgICA7KHRoaXMuJCBhcyBhbnkpW2lkUHJvcF0gPSBuZXdJZFxuICB9XG5cbiAgLyoqXG4gICAqIENhbiBiZSBvdmVycmlkZGVuIHRvIG9mZmVyIGEgcmVmZXJlbmNlIGlkIHRvIGJlIHVzZWQgaW4gcmVmZXJlbmNlIHJlc29sdXRpb24uXG4gICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCB1c2UgdGhlIGBpZFByb3BgIGlmIGF2YWlsYWJsZSBvciByZXR1cm4gYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0UmVmSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpc1ttb2RlbElkS2V5XVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciB0aGUgbW9kZWwgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBvbkluaXQ/KCk6IHZvaWRcblxuICAvKipcbiAgICogRGF0YSBwYXJ0IG9mIHRoZSBtb2RlbCwgd2hpY2ggaXMgb2JzZXJ2YWJsZSBhbmQgd2lsbCBiZSBzZXJpYWxpemVkIGluIHNuYXBzaG90cy5cbiAgICogVXNlIGl0IGlmIG9uZSBvZiB0aGUgZGF0YSBwcm9wZXJ0aWVzIG1hdGNoZXMgb25lIG9mIHRoZSBtb2RlbCBwcm9wZXJ0aWVzL2Z1bmN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5ICQhOiBNb2RlbFByb3BzVG9EYXRhPFRQcm9wcz5cblxuICAvKipcbiAgICogT3B0aW9uYWwgaG9vayB0aGF0IHdpbGwgcnVuIG9uY2UgdGhpcyBtb2RlbCBpbnN0YW5jZSBpcyBhdHRhY2hlZCB0byB0aGUgdHJlZSBvZiBhIG1vZGVsIG1hcmtlZCBhc1xuICAgKiByb290IHN0b3JlIHZpYSBgcmVnaXN0ZXJSb290U3RvcmVgLlxuICAgKiBCYXNpY2FsbHkgdGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgeW91IGtub3cgdGhlIGZ1bGwgcm9vdCBzdG9yZSBpcyBjb21wbGV0ZSBhbmQgd2hlcmUgdGhpbmdzIHN1Y2ggYXNcbiAgICogbWlkZGxld2FyZXMsIGVmZmVjdHMgKHJlYWN0aW9ucywgZXRjKSwgYW5kIG90aGVyIHNpZGUgZWZmZWN0cyBzaG91bGQgYmUgcmVnaXN0ZXJlZCwgc2luY2UgaXQgbWVhbnNcbiAgICogdGhhdCB0aGUgbW9kZWwgaXMgbm93IHBhcnQgb2YgdGhlIGFjdGl2ZSBhcHBsaWNhdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogSXQgY2FuIHJldHVybiBhIGRpc3Bvc2VyIHRoYXQgd2lsbCBiZSBydW4gb25jZSB0aGlzIG1vZGVsIGluc3RhbmNlIGlzIGRldGFjaGVkIGZyb20gc3VjaCByb290IHN0b3JlIHRyZWUuXG4gICAqXG4gICAqIEBwYXJhbSByb290U3RvcmVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3RlY3RlZCBvbkF0dGFjaGVkVG9Sb290U3RvcmU/KHJvb3RTdG9yZTogb2JqZWN0KTogKCgpID0+IHZvaWQpIHwgdm9pZFxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHR5cGUgY2hlY2sgb3ZlciB0aGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEZvciB0aGlzIHRvIHdvcmsgYSBkYXRhIHR5cGUgaGFzIHRvIGJlIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1vZGVsIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYFR5cGVDaGVja0Vycm9yYCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gZXJyb3IuXG4gICAqL1xuICB0eXBlQ2hlY2soKTogVHlwZUNoZWNrRXJyb3IgfCBudWxsIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZXNNb2RlbDx0aGlzPih0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSlcbiAgICByZXR1cm4gdHlwZUNoZWNrKHR5cGUsIHRoaXMgYXMgYW55KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBtb2RlbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGE6IE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFRQcm9wcz4pIHtcbiAgICBsZXQgaW5pdGlhbERhdGEgPSBkYXRhIGFzIGFueVxuICAgIGNvbnN0IHsgc25hcHNob3RJbml0aWFsRGF0YSwgbW9kZWxDbGFzcywgZ2VuZXJhdGVOZXdJZHMgfTogTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgPVxuICAgICAgYXJndW1lbnRzWzFdIGFzIGFueVxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG1vZGVsQ2xhc3MhLnByb3RvdHlwZSlcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzIGFzIGFueVxuXG4gICAgLy8gZGVsZXRlIHVubmVjZXNzYXJ5IHByb3BzXG4gICAgZGVsZXRlIHNlbGZbcHJvcHNUeXBlU3ltYm9sXVxuICAgIGRlbGV0ZSBzZWxmW2Zyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF1cbiAgICBkZWxldGUgc2VsZlt0b1NuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXVxuICAgIGRlbGV0ZSBzZWxmW21vZGVsSWRQcm9wZXJ0eU5hbWVTeW1ib2xdXG5cbiAgICBpZiAoIXNuYXBzaG90SW5pdGlhbERhdGEpIHtcbiAgICAgIC8vIHBsYWluIG5ld1xuICAgICAgYXNzZXJ0SXNPYmplY3QoaW5pdGlhbERhdGEsIFwiaW5pdGlhbERhdGFcIilcblxuICAgICAgaW50ZXJuYWxOZXdNb2RlbCh0aGlzLCBvYnNlcnZhYmxlLm9iamVjdChpbml0aWFsRGF0YSBhcyBhbnksIHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KSwge1xuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICBnZW5lcmF0ZU5ld0lkczogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZyb20gc25hcHNob3RcbiAgICAgIGludGVybmFsTmV3TW9kZWwodGhpcywgdW5kZWZpbmVkLCB7IG1vZGVsQ2xhc3MsIHNuYXBzaG90SW5pdGlhbERhdGEsIGdlbmVyYXRlTmV3SWRzIH0pXG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcob3B0aW9ucz86IHsgd2l0aERhdGE/OiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSB7XG4gICAgICB3aXRoRGF0YTogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RQYXJ0ID0gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXNbbW9kZWxUeXBlS2V5XX1gXG5cbiAgICByZXR1cm4gZmluYWxPcHRpb25zLndpdGhEYXRhXG4gICAgICA/IGBbJHtmaXJzdFBhcnR9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U25hcHNob3QodGhpcykpfV1gXG4gICAgICA6IGBbJHtmaXJzdFBhcnR9XWBcbiAgfVxufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IHR5cGUgQmFzZU1vZGVsS2V5cyA9IGtleW9mIEFueU1vZGVsIHwgXCJvbkluaXRcIiB8IFwib25BdHRhY2hlZFRvUm9vdFN0b3JlXCJcblxuLy8gdGhlc2UgcHJvcHMgd2lsbCBuZXZlciBiZSBob2lzdGVkIHRvIHRoaXMgKGV4Y2VwdCBmb3IgbW9kZWwgaWQpXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYmFzZU1vZGVsUHJvcE5hbWVzID0gbmV3IFNldDxCYXNlTW9kZWxLZXlzPihbXG4gIG1vZGVsVHlwZUtleSxcbiAgbW9kZWxJZEtleSxcbiAgXCJvbkluaXRcIixcbiAgXCIkXCIsXG4gIFwiZ2V0UmVmSWRcIixcbiAgXCJvbkF0dGFjaGVkVG9Sb290U3RvcmVcIixcbiAgXCJ0eXBlQ2hlY2tcIixcbl0pXG5cbi8qKlxuICogQW55IGtpbmQgb2YgbW9kZWwgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW55TW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWw8YW55LCBhbnksIGFueSwgYW55PiB7fVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUuXG4gKlxuICogVHJpY2tzIFR5cGVTY3JpcHQgaW50byBhY2NlcHRpbmcgYWJzdHJhY3QgY2xhc3NlcyBhcyBhIHBhcmFtZXRlciBmb3IgYEV4dGVuZGVkTW9kZWxgLlxuICogRG9lcyBub3RoaW5nIGluIHJ1bnRpbWUuXG4gKlxuICogQHR5cGVwYXJhbSBUIEFic3RyYWN0IG1vZGVsIGNsYXNzIHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBBYnN0cmFjdCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYnN0cmFjdE1vZGVsQ2xhc3M8VD4odHlwZTogVCk6IFQgJiBPYmplY3Qge1xuICByZXR1cm4gdHlwZSBhcyBhbnlcbn1cblxuLyoqXG4gKiBUaGUgbW9kZWwgaWQgcHJvcGVydHkgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxJZFByb3BlcnR5TmFtZTxNIGV4dGVuZHMgQW55TW9kZWw+ID0gTVt0eXBlb2YgbW9kZWxJZFByb3BlcnR5TmFtZVN5bWJvbF1cblxuLyoqXG4gKiBBZGQgbWlzc2luZyBtb2RlbCBtZXRhZGF0YSB0byBhIG1vZGVsIGNyZWF0aW9uIHNuYXBzaG90IHRvIGdlbmVyYXRlIGEgcHJvcGVyIG1vZGVsIHNuYXBzaG90LlxuICogVXN1YWxseSB1c2VkIGFsb25nc2lkZSBgZnJvbVNuYXBzaG90YC5cbiAqXG4gKiBAdHlwZXBhcmFtIE0gTW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbENsYXNzIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHNuYXBzaG90IE1vZGVsIGNyZWF0aW9uIHNuYXBzaG90IHdpdGhvdXQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgbW9kZWwgc25hcHNob3QgKGluY2x1ZGluZyBtZXRhZGF0YSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNuYXBzaG90SW5XaXRoTWV0YWRhdGE8TSBleHRlbmRzIEFueU1vZGVsPihcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxNPixcbiAgc25hcHNob3Q6IE9taXQ8U25hcHNob3RJbk9mTW9kZWw8TT4sIHR5cGVvZiBtb2RlbFR5cGVLZXk+XG4pOiBTbmFwc2hvdEluT2ZNb2RlbDxNPiB7XG4gIGFzc2VydElzTW9kZWxDbGFzcyhtb2RlbENsYXNzLCBcIm1vZGVsQ2xhc3NcIilcbiAgYXNzZXJ0SXNPYmplY3Qoc25hcHNob3QsIFwiaW5pdGlhbERhdGFcIilcblxuICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChtb2RlbENsYXNzKSFcblxuICByZXR1cm4ge1xuICAgIC4uLnNuYXBzaG90LFxuICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgfSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBZGQgbWlzc2luZyBtb2RlbCBtZXRhZGF0YSB0byBhIG1vZGVsIG91dHB1dCBzbmFwc2hvdCB0byBnZW5lcmF0ZSBhIHByb3BlciBtb2RlbCBzbmFwc2hvdC5cbiAqIFVzdWFsbHkgdXNlZCBhbG9uZ3NpZGUgYGFwcGx5U25hcHNob3RgLlxuICpcbiAqIEB0eXBlcGFyYW0gTSBNb2RlbCB0eXBlLlxuICogQHBhcmFtIG1vZGVsQ2xhc3MgTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gc25hcHNob3QgTW9kZWwgb3V0cHV0IHNuYXBzaG90IHdpdGhvdXQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgbW9kZWwgc25hcHNob3QgKGluY2x1ZGluZyBtZXRhZGF0YSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbD4oXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8TT4sXG4gIHNuYXBzaG90OiBPbWl0PFNuYXBzaG90T3V0T2ZNb2RlbDxNPiwgdHlwZW9mIG1vZGVsVHlwZUtleT5cbik6IFNuYXBzaG90T3V0T2ZNb2RlbDxNPiB7XG4gIGFzc2VydElzTW9kZWxDbGFzcyhtb2RlbENsYXNzLCBcIm1vZGVsQ2xhc3NcIilcbiAgYXNzZXJ0SXNPYmplY3Qoc25hcHNob3QsIFwiaW5pdGlhbERhdGFcIilcblxuICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChtb2RlbENsYXNzKSFcblxuICByZXR1cm4ge1xuICAgIC4uLnNuYXBzaG90LFxuICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgfSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBIG1vZGVsIGNsYXNzIGRlY2xhcmF0aW9uLCBtYWRlIG9mIGEgYmFzZSBtb2RlbCBhbmQgdGhlIG1vZGVsIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxDbGFzc0RlY2xhcmF0aW9uPEJhc2VNb2RlbENsYXNzLCBNb2RlbEludGVyZmFjZT4gPSBCYXNlTW9kZWxDbGFzcyAmIHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IE1vZGVsSW50ZXJmYWNlXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQW55TW9kZWwsIEJhc2VNb2RlbCB9IGZyb20gXCIuL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi9tZXRhZGF0YVwiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBtb2RlbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWwobW9kZWw6IHVua25vd24pOiBtb2RlbCBpcyBBbnlNb2RlbCB7XG4gIHJldHVybiBtb2RlbCBpbnN0YW5jZW9mIEJhc2VNb2RlbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEFzc2VydHMgc29tZXRoaW5nIGlzIGFjdHVhbGx5IGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcGFyYW0gYXJnTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNNb2RlbChcbiAgbW9kZWw6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZyxcbiAgY3VzdG9tRXJyTXNnID0gXCJtdXN0IGJlIGEgbW9kZWwgaW5zdGFuY2VcIlxuKTogYXNzZXJ0cyBtb2RlbCBpcyBBbnlNb2RlbCB7XG4gIGlmICghaXNNb2RlbChtb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9ICR7Y3VzdG9tRXJyTXNnfWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxDbGFzcyhtb2RlbENsYXNzOiB1bmtub3duKTogbW9kZWxDbGFzcyBpcyBNb2RlbENsYXNzPEFueU1vZGVsPiB7XG4gIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobW9kZWxDbGFzcyAhPT0gQmFzZU1vZGVsICYmICEobW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlTW9kZWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNNb2RlbENsYXNzKFxuICBtb2RlbENsYXNzOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmdcbik6IGFzc2VydHMgbW9kZWxDbGFzcyBpcyBNb2RlbENsYXNzPEFueU1vZGVsPiB7XG4gIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgY2xhc3NgKVxuICB9XG5cbiAgaWYgKG1vZGVsQ2xhc3MgIT09IEJhc2VNb2RlbCAmJiAhKG1vZGVsQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgQmFzZU1vZGVsKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBleHRlbmQgTW9kZWxgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsU25hcHNob3Qoc246IHVua25vd24pOiBzbiBpcyB7IFttb2RlbFR5cGVLZXldOiBzdHJpbmcgfSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHNuKSAmJiBtb2RlbFR5cGVLZXkgaW4gc25cbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG1vZGVsSWRLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBpc0FycmF5LCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQge1xuICBkYXRhT2JqZWN0UGFyZW50LFxuICBkYXRhVG9Nb2RlbE5vZGUsXG4gIG1vZGVsVG9EYXRhTm9kZSxcbiAgb2JqZWN0UGFyZW50cyxcbiAgcmVwb3J0UGFyZW50UGF0aE9ic2VydmVkLFxufSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUGF0aCwgUGF0aEVsZW1lbnQsIFdyaXRhYmxlUGF0aCB9IGZyb20gXCIuL3BhdGhUeXBlc1wiXG5cbi8qKlxuICogUGF0aCBmcm9tIGFuIG9iamVjdCB0byBpdHMgaW1tZWRpYXRlIHBhcmVudC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogUGFyZW50IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudDogVFxuICAvKipcbiAgICogUHJvcGVydHkgbmFtZSAoaWYgdGhlIHBhcmVudCBpcyBhbiBvYmplY3QpIG9yIGluZGV4IG51bWJlciAoaWYgdGhlIHBhcmVudCBpcyBhbiBhcnJheSkuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBQYXRoRWxlbWVudFxufVxuXG4vKipcbiAqIFBhdGggZnJvbSBhbiBvYmplY3QgdG8gaXRzIHJvb3QuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJvb3Qgb2JqZWN0IHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFBhdGg8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogUm9vdCBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSByb290OiBUXG4gIC8qKlxuICAgKiBQYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIGdpdmVuIHRhcmdldCwgYXMgYSBzdHJpbmcgYXJyYXkuXG4gICAqIElmIHRoZSB0YXJnZXQgaXMgYSByb290IGl0c2VsZiB0aGVuIHRoZSBhcnJheSB3aWxsIGJlIGVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogUGF0aFxuXG4gIC8qKlxuICAgKiBPYmplY3RzIGluIHRoZSBwYXRoLCBmcm9tIHJvb3QgKGluY2x1ZGVkKSB1bnRpbCB0YXJnZXQgKGluY2x1ZGVkKS5cbiAgICogSWYgdGhlIHRhcmdldCBpcyBhIHJvb3QgdGhlbiBvbmx5IHRoZSB0YXJnZXQgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPYmplY3RzOiBSZWFkb25seUFycmF5PHVua25vd24+XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSB0YXJnZXQgcGx1cyB0aGUgcGF0aCBmcm9tIHRoZSBwYXJlbnQgdG8gdGhlIHRhcmdldCwgb3IgdW5kZWZpbmVkIGlmIGl0IGhhcyBubyBwYXJlbnQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFBhcmVudCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFBhcmVudFBhdGg8VD4gfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIpXG5cbiAgcmV0dXJuIGZhc3RHZXRQYXJlbnRQYXRoKHZhbHVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4oXG4gIHZhbHVlOiBvYmplY3Rcbik6IFBhcmVudFBhdGg8VD4gfCB1bmRlZmluZWQge1xuICByZXBvcnRQYXJlbnRQYXRoT2JzZXJ2ZWQodmFsdWUpXG4gIHJldHVybiBvYmplY3RQYXJlbnRzLmdldCh2YWx1ZSkgYXMgYW55XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICB2YWx1ZTogb2JqZWN0XG4pOiBQYXJlbnRQYXRoPFQ+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyZW50TW9kZWwgPSBkYXRhT2JqZWN0UGFyZW50LmdldCh2YWx1ZSlcbiAgaWYgKHBhcmVudE1vZGVsKSB7XG4gICAgcmV0dXJuIHsgcGFyZW50OiBwYXJlbnRNb2RlbCBhcyBULCBwYXRoOiBcIiRcIiB9XG4gIH1cblxuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG4gIGlmIChwYXJlbnRQYXRoICYmIGlzTW9kZWwocGFyZW50UGF0aC5wYXJlbnQpKSB7XG4gICAgcmV0dXJuIHsgcGFyZW50OiBwYXJlbnRQYXRoLnBhcmVudC4kIGFzIFQsIHBhdGg6IHBhcmVudFBhdGgucGF0aCB9XG4gIH1cbiAgcmV0dXJuIHBhcmVudFBhdGhcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBwYXJlbnQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFBhcmVudCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogVCB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIilcblxuICByZXR1cm4gZmFzdEdldFBhcmVudCh2YWx1ZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRQYXJlbnQ8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG5cbiAgcmV0dXJuIHBhcmVudFBhdGggPyBwYXJlbnRQYXRoLnBhcmVudCA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFBhcmVudEluY2x1ZGluZ0RhdGFPYmplY3RzPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICB2YWx1ZTogb2JqZWN0XG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoSW5jbHVkaW5nRGF0YU9iamVjdHModmFsdWUpXG5cbiAgcmV0dXJuIHBhcmVudFBhdGggPyBwYXJlbnRQYXRoLnBhcmVudCA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBvYmplY3QgaXMgYSBtb2RlbCBpbnRlcmltIGRhdGEgb2JqZWN0IChgJGApLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IGlzLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsRGF0YU9iamVjdCh2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIiwgdHJ1ZSlcblxuICByZXR1cm4gZmFzdElzTW9kZWxEYXRhT2JqZWN0KHZhbHVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdElzTW9kZWxEYXRhT2JqZWN0KHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGFPYmplY3RQYXJlbnQuaGFzKHZhbHVlKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIHRhcmdldCBwbHVzIHRoZSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gZ2V0IHRvIHRoZSB0YXJnZXQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJvb3Qgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdmFsdWUgVGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogUm9vdFBhdGg8VD4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIpXG5cbiAgcmV0dXJuIGZhc3RHZXRSb290UGF0aCh2YWx1ZSlcbn1cblxuLy8gd2UgdXNlIGNvbXB1dGVkcyBzbyB0aGV5IGFyZSBjYWNoZWQgd2hlbmV2ZXIgcG9zc2libGVcbmNvbnN0IGNvbXB1dGVkc0dldFJvb3RQYXRoID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQ29tcHV0ZWRWYWx1ZTxSb290UGF0aDxhbnk+Pj4oKVxuXG5mdW5jdGlvbiBpbnRlcm5hbEdldFJvb3RQYXRoPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBSb290UGF0aDxUPiB7XG4gIGNvbnN0IHJvb3RQYXRoID0ge1xuICAgIHJvb3Q6IHZhbHVlLFxuICAgIHBhdGg6IFtdIGFzIFdyaXRhYmxlUGF0aCxcbiAgICBwYXRoT2JqZWN0czogW3ZhbHVlXSBhcyB1bmtub3duW10sXG4gIH1cblxuICBsZXQgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkXG4gIHdoaWxlICgocGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoKHJvb3RQYXRoLnJvb3QpKSkge1xuICAgIHJvb3RQYXRoLnJvb3QgPSBwYXJlbnRQYXRoLnBhcmVudFxuICAgIHJvb3RQYXRoLnBhdGgudW5zaGlmdChwYXJlbnRQYXRoLnBhdGgpXG4gICAgcm9vdFBhdGgucGF0aE9iamVjdHMudW5zaGlmdChwYXJlbnRQYXRoLnBhcmVudClcbiAgfVxuXG4gIHJldHVybiByb290UGF0aCBhcyBSb290UGF0aDxhbnk+XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0Um9vdFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFJvb3RQYXRoPFQ+IHtcbiAgcmV0dXJuIGdldE9yQ3JlYXRlKGNvbXB1dGVkc0dldFJvb3RQYXRoLCB2YWx1ZSwgKCkgPT5cbiAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gaW50ZXJuYWxHZXRSb290UGF0aCh2YWx1ZSlcbiAgICB9KVxuICApLmdldCgpXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgb3IgaXRzZWxmIGlmIHRoZSB0YXJnZXQgaXMgYSByb290LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSb290IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHZhbHVlIFRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vdDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogVCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIilcblxuICByZXR1cm4gZmFzdEdldFJvb3QodmFsdWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0Um9vdDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogVCB7XG4gIHJldHVybiBmYXN0R2V0Um9vdFBhdGgodmFsdWUpLnJvb3Rcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gb2JqZWN0IGlzIGEgcm9vdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSb290KHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgXCJ2YWx1ZVwiKVxuXG4gIHJldHVybiAhZmFzdEdldFBhcmVudCh2YWx1ZSlcbn1cblxuY29uc3QgdW5yZXNvbHZlZCA9IHsgcmVzb2x2ZWQ6IGZhbHNlIH0gYXMgY29uc3RcblxuLyoqXG4gKiBUcmllcyB0byByZXNvbHZlIGEgcGF0aCBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmV0dXJuZWQgdmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBwYXRoUm9vdE9iamVjdCBPYmplY3QgdGhhdCBzZXJ2ZXMgYXMgcGF0aCByb290LlxuICogQHBhcmFtIHBhdGggUGF0aCBhcyBhbiBzdHJpbmcgb3IgbnVtYmVyIGFycmF5LlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYHsgcmVzb2x2ZWQ6IHRydWUsIHZhbHVlOiBUIH1gIG9yIGB7IHJlc29sdmVkOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoPFQgPSBhbnk+KFxuICBwYXRoUm9vdE9iamVjdDogb2JqZWN0LFxuICBwYXRoOiBQYXRoXG4pOlxuICB8IHtcbiAgICAgIHJlc29sdmVkOiB0cnVlXG4gICAgICB2YWx1ZTogVFxuICAgIH1cbiAgfCB7XG4gICAgICByZXNvbHZlZDogZmFsc2VcbiAgICAgIHZhbHVlPzogdW5kZWZpbmVkXG4gICAgfSB7XG4gIC8vIHVuaXQgdGVzdHMgcmVseSBvbiB0aGlzIHRvIHdvcmsgd2l0aCBhbnkgb2JqZWN0XG4gIC8vIGFzc2VydFR3ZWFrZWRPYmplY3QocGF0aFJvb3RPYmplY3QsIFwicGF0aFJvb3RPYmplY3RcIilcblxuICBsZXQgY3VycmVudDogYW55ID0gcGF0aFJvb3RPYmplY3RcblxuICBsZXQgbGVuID0gcGF0aC5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghaXNPYmplY3QoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiB1bnJlc29sdmVkXG4gICAgfVxuXG4gICAgY29uc3QgcCA9IHBhdGhbaV1cblxuICAgIC8vIGNoZWNrIGp1c3QgdG8gYXZvaWQgbW9ieCB3YXJuaW5ncyBhYm91dCB0cnlpbmcgdG8gYWNjZXNzIG91dCBvZiBib3VuZHMgaW5kZXhcbiAgICBpZiAoaXNBcnJheShjdXJyZW50KSAmJiArcCA+PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVucmVzb2x2ZWRcbiAgICB9XG5cbiAgICBpZiAoaXNNb2RlbChjdXJyZW50KSkge1xuICAgICAgY29uc3QgZGF0YU5vZGUgPSBtb2RlbFRvRGF0YU5vZGUoY3VycmVudClcbiAgICAgIGlmIChwIGluIGRhdGFOb2RlKSB7XG4gICAgICAgIGN1cnJlbnQgPSBkYXRhTm9kZVxuICAgICAgfSBlbHNlIGlmICghKHAgaW4gY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuIHVucmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50ID0gY3VycmVudFtwXVxuICB9XG5cbiAgcmV0dXJuIHsgcmVzb2x2ZWQ6IHRydWUsIHZhbHVlOiBjdXJyZW50IH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNraXBJZENoZWNraW5nID0gU3ltYm9sKFwic2tpcElkQ2hlY2tpbmdcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBUcmllcyB0byByZXNvbHZlIGEgcGF0aCBmcm9tIGFuIG9iamVjdCB3aGlsZSBjaGVja2luZyBpZHMuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybmVkIHZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gcGF0aFJvb3RPYmplY3QgT2JqZWN0IHRoYXQgc2VydmVzIGFzIHBhdGggcm9vdC5cbiAqIEBwYXJhbSBwYXRoIFBhdGggYXMgYW4gc3RyaW5nIG9yIG51bWJlciBhcnJheS5cbiAqIEBwYXJhbSBwYXRoSWRzIEFuIGFycmF5IG9mIGlkcyBvZiB0aGUgbW9kZWxzIHRoYXQgbXVzdCBiZSBjaGVja2VkLCBudWxsIGlmIG5vdCBhIG1vZGVsIG9yIGBza2lwSWRDaGVja2luZ2AgdG8gc2tpcCBpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGB7IHJlc29sdmVkOiB0cnVlLCB2YWx1ZTogVCB9YCBvciBgeyByZXNvbHZlZDogZmFsc2UgfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aENoZWNraW5nSWRzPFQgPSBhbnk+KFxuICBwYXRoUm9vdE9iamVjdDogb2JqZWN0LFxuICBwYXRoOiBQYXRoLFxuICBwYXRoSWRzOiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bGwgfCB0eXBlb2Ygc2tpcElkQ2hlY2tpbmc+XG4pOlxuICB8IHtcbiAgICAgIHJlc29sdmVkOiB0cnVlXG4gICAgICB2YWx1ZTogVFxuICAgIH1cbiAgfCB7XG4gICAgICByZXNvbHZlZDogZmFsc2VcbiAgICAgIHZhbHVlPzogdW5kZWZpbmVkXG4gICAgfSB7XG4gIC8vIHVuaXQgdGVzdHMgcmVseSBvbiB0aGlzIHRvIHdvcmsgd2l0aCBhbnkgb2JqZWN0XG4gIC8vIGFzc2VydFR3ZWFrZWRPYmplY3QocGF0aFJvb3RPYmplY3QsIFwicGF0aFJvb3RPYmplY3RcIilcblxuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWxUb0RhdGFOb2RlKHBhdGhSb290T2JqZWN0KVxuICAvLyByb290IGlkIGlzIG5ldmVyIGNoZWNrZWRcblxuICBsZXQgbGVuID0gcGF0aC5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghaXNPYmplY3QoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiB7IHJlc29sdmVkOiBmYWxzZSB9XG4gICAgfVxuXG4gICAgY29uc3QgcCA9IHBhdGhbaV1cblxuICAgIC8vIGNoZWNrIGp1c3QgdG8gYXZvaWQgbW9ieCB3YXJuaW5ncyBhYm91dCB0cnlpbmcgdG8gYWNjZXNzIG91dCBvZiBib3VuZHMgaW5kZXhcbiAgICBpZiAoaXNBcnJheShjdXJyZW50KSAmJiArcCA+PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgcmVzb2x2ZWQ6IGZhbHNlIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50TWF5YmVNb2RlbCA9IGN1cnJlbnRbcF1cbiAgICBjdXJyZW50ID0gbW9kZWxUb0RhdGFOb2RlKGN1cnJlbnRNYXliZU1vZGVsIGFzIG9iamVjdClcblxuICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBwYXRoSWRzW2ldXG4gICAgaWYgKGV4cGVjdGVkSWQgIT09IHNraXBJZENoZWNraW5nKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWQgPSBpc01vZGVsKGN1cnJlbnRNYXliZU1vZGVsKSA/IGN1cnJlbnRNYXliZU1vZGVsW21vZGVsSWRLZXldID8/IG51bGwgOiBudWxsXG4gICAgICBpZiAoZXhwZWN0ZWRJZCAhPT0gY3VycmVudElkKSB7XG4gICAgICAgIHJldHVybiB7IHJlc29sdmVkOiBmYWxzZSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgcmVzb2x2ZWQ6IHRydWUsIHZhbHVlOiBkYXRhVG9Nb2RlbE5vZGUoY3VycmVudCkgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHBhdGggdG8gZ2V0IGZyb20gYSBwYXJlbnQgdG8gYSBnaXZlbiBjaGlsZC5cbiAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIGNoaWxkIGlzIGFjdHVhbGx5IHRoZSBnaXZlbiBwYXJlbnQgb3IgdW5kZWZpbmVkIGlmIHRoZSBjaGlsZCBpcyBub3QgYSBjaGlsZCBvZiB0aGUgcGFyZW50LlxuICpcbiAqIEBwYXJhbSBmcm9tUGFyZW50XG4gKiBAcGFyYW0gdG9DaGlsZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFRvQ2hpbGRQYXRoKGZyb21QYXJlbnQ6IG9iamVjdCwgdG9DaGlsZDogb2JqZWN0KTogUGF0aCB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QoZnJvbVBhcmVudCwgXCJmcm9tUGFyZW50XCIpXG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodG9DaGlsZCwgXCJ0b0NoaWxkXCIpXG5cbiAgaWYgKGZyb21QYXJlbnQgPT09IHRvQ2hpbGQpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHBhdGg6IFdyaXRhYmxlUGF0aCA9IFtdXG5cbiAgbGV0IGN1cnJlbnQgPSB0b0NoaWxkXG4gIGxldCBwYXJlbnRQYXRoXG4gIHdoaWxlICgocGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoKGN1cnJlbnQpKSkge1xuICAgIHBhdGgudW5zaGlmdChwYXJlbnRQYXRoLnBhdGgpXG5cbiAgICBjdXJyZW50ID0gcGFyZW50UGF0aC5wYXJlbnRcbiAgICBpZiAoY3VycmVudCA9PT0gZnJvbVBhcmVudCkge1xuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIiwiaW1wb3J0IHsgZmFzdEdldFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBpc0NoaWxkT2ZQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGgyXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzRnVuY3Rpb24sIGFzc2VydElzT2JqZWN0LCBkZWxldGVGcm9tQXJyYXksIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5cbi8qKlxuICogQW4gYWN0aW9uIG1pZGRsZXdhcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uTWlkZGxld2FyZSB7XG4gIC8qKlxuICAgKiBTdWJ0cmVlIHJvb3Qgb2JqZWN0IChvYmplY3QgYW5kIGNoaWxkIG9iamVjdHMpIHRoaXMgbWlkZGxld2FyZSB3aWxsIHJ1biBmb3IuXG4gICAqIFRoaXMgdGFyZ2V0IFwiZmlsdGVyXCIgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBjdXN0b20gZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VidHJlZVJvb3Q6IG9iamVjdFxuXG4gIC8qKlxuICAgKiBBIGZpbHRlciBmdW5jdGlvbiB0byBkZWNpZGUgaWYgYW4gYWN0aW9uIG1pZGRsZXdhcmUgZnVuY3Rpb24gc2hvdWxkIGJlIHJ1biBvciBub3QuXG4gICAqL1xuICBmaWx0ZXI/KGN0eDogQWN0aW9uQ29udGV4dCk6IGJvb2xlYW5cblxuICAvKipcbiAgICogQW4gYWN0aW9uIG1pZGRsZXdhcmUgZnVuY3Rpb24uXG4gICAqIFJlbWJlciB0byBgcmV0dXJuIG5leHQoKWAgaWYgeW91IHdhbnQgdG8gY29udGludWUgdGhlIGFjdGlvbiBvciB0aHJvdyBpZiB5b3Ugd2FudCB0byBjYW5jZWwgaXQuXG4gICAqL1xuICBtaWRkbGV3YXJlKGN0eDogQWN0aW9uQ29udGV4dCwgbmV4dDogKCkgPT4gYW55KTogYW55XG59XG5cbi8qKlxuICogVGhlIGRpc3Bvc2VyIG9mIGFuIGFjdGlvbiBtaWRkbGV3YXJlLlxuICovXG5leHBvcnQgdHlwZSBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgPSAoKSA9PiB2b2lkXG5cbnR5cGUgUGFydGlhbEFjdGlvbk1pZGRsZXdhcmUgPSBQaWNrPEFjdGlvbk1pZGRsZXdhcmUsIFwiZmlsdGVyXCIgfCBcIm1pZGRsZXdhcmVcIj5cblxuY29uc3QgcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFBhcnRpYWxBY3Rpb25NaWRkbGV3YXJlW10+KClcblxuaW50ZXJmYWNlIEFjdGlvbk1pZGRsZXdhcmVzSXRlcmF0b3IgZXh0ZW5kcyBJdGVyYWJsZTxQYXJ0aWFsQWN0aW9uTWlkZGxld2FyZT4ge31cblxuY29uc3QgcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvciA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvcj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aW9uIG1pZGRsZXdhcmVzIHRvIGJlIHJ1biBvdmVyIGEgZ2l2ZW4gb2JqZWN0IGFzIGFuIGl0ZXJhYmxlIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uTWlkZGxld2FyZXMob2JqOiBvYmplY3QpOiBBY3Rpb25NaWRkbGV3YXJlc0l0ZXJhdG9yIHtcbiAgLy8gd2hlbiB3ZSBjYWxsIGEgbWlkZGxld2FyZSB3ZSB3aWxsIGNhbGwgdGhlIG1pZGRsZXdhcmVzIG9mIHRoYXQgb2JqZWN0IHBsdXMgYWxsIHBhcmVudCBvYmplY3RzXG4gIC8vIHRoZSBwYXJlbnQgb2JqZWN0IG1pZGRsZXdhcmVzIGFyZSBydW4gbGFzdFxuXG4gIC8vIHNpbmNlIGFuIGFycmF5IGxpa2UgW2EsIGIsIGNdIHdpbGwgYmUgY2FsbGVkIGxpa2UgYyhiKGEoKSkpIHRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHB1dFxuICAvLyB0aGUgcGFyZW50IG9iamVjdCBvbmVzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5XG5cbiAgbGV0IGl0ZXJhYmxlID0gcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvci5nZXQob2JqKVxuICBpZiAoIWl0ZXJhYmxlKSB7XG4gICAgaXRlcmFibGUgPSB7XG4gICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgbGV0IGN1cnJlbnQ6IGFueSA9IG9ialxuXG4gICAgICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRJdGVyYXRvcigpIHtcbiAgICAgICAgICBjb25zdCBvYmpNd2FyZXMgPSBjdXJyZW50ID8gcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXMuZ2V0KGN1cnJlbnQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKCFvYmpNd2FyZXMgfHwgb2JqTXdhcmVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmpNd2FyZXNbU3ltYm9sLml0ZXJhdG9yXSgpXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmaW5kTmV4dEl0ZXJhdG9yKCkge1xuICAgICAgICAgIGxldCBuZXh0SXRlclxuICAgICAgICAgIHdoaWxlIChjdXJyZW50ICYmICFuZXh0SXRlcikge1xuICAgICAgICAgICAgY3VycmVudCA9IGZhc3RHZXRQYXJlbnQoY3VycmVudClcbiAgICAgICAgICAgIG5leHRJdGVyID0gZ2V0Q3VycmVudEl0ZXJhdG9yKClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5leHRJdGVyXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXRlciA9IGdldEN1cnJlbnRJdGVyYXRvcigpXG4gICAgICAgIGlmICghaXRlcikge1xuICAgICAgICAgIGl0ZXIgPSBmaW5kTmV4dEl0ZXJhdG9yKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yOiBJdGVyYXRvcjxQYXJ0aWFsQWN0aW9uTWlkZGxld2FyZT4gPSB7XG4gICAgICAgICAgbmV4dCgpIHtcbiAgICAgICAgICAgIGlmICghaXRlcikge1xuICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGl0ZXIubmV4dCgpXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlciA9IGZpbmROZXh0SXRlcmF0b3IoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVyYXRvclxuICAgICAgfSxcbiAgICB9XG4gICAgcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvci5zZXQob2JqLCBpdGVyYWJsZSlcbiAgfVxuICByZXR1cm4gaXRlcmFibGVcbn1cblxuLyoqXG4gKiBBZGRzIGEgZ2xvYmFsIGFjdGlvbiBtaWRkbGV3YXJlIHRvIGJlIHJ1biB3aGVuIGFuIGFjdGlvbiBpcyBwZXJmb3JtZWQuXG4gKiBJdCBpcyB1c3VhbGx5IHByZWZlcmFibGUgdG8gdXNlIGBvbkFjdGlvbk1pZGRsZXdhcmVgIGluc3RlYWQgdG8gbGltaXQgaXQgdG8gYSBnaXZlbiB0cmVlIGFuZCBvbmx5IHRvIHRvcG1vc3QgbGV2ZWwgYWN0aW9uc1xuICogb3IgYGFjdGlvblRyYWNraW5nTWlkZGxld2FyZWAgZm9yIGEgc2ltcGxpZmllZCBtaWRkbGV3YXJlLlxuICpcbiAqIEBwYXJhbSBtd2FyZSBBY3Rpb24gbWlkZGxld2FyZSB0byBiZSBydW4uXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyIHRvIGNhbmNlbCB0aGUgbWlkZGxld2FyZS4gTm90ZSB0aGF0IGlmIHlvdSBkb24ndCBwbGFuIHRvIGRvIGFuIGVhcmx5IGRpc3Bvc2FsIG9mIHRoZSBtaWRkbGV3YXJlXG4gKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBvcHRpb25hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEFjdGlvbk1pZGRsZXdhcmUobXdhcmU6IEFjdGlvbk1pZGRsZXdhcmUpOiBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIge1xuICBhc3NlcnRJc09iamVjdChtd2FyZSwgXCJtaWRkbGV3YXJlXCIpXG5cbiAgbGV0IHsgbWlkZGxld2FyZSwgZmlsdGVyLCBzdWJ0cmVlUm9vdCB9ID0gbXdhcmVcblxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcIm1pZGRsZXdhcmUuc3VidHJlZVJvb3RcIilcbiAgYXNzZXJ0SXNGdW5jdGlvbihtaWRkbGV3YXJlLCBcIm1pZGRsZXdhcmUubWlkZGxld2FyZVwiKVxuICBpZiAoZmlsdGVyICYmIHR5cGVvZiBmaWx0ZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoXCJtaWRkbGV3YXJlLmZpbHRlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIpXG4gIH1cblxuICAvLyByZW1pbmRlcjogbmV2ZXIgdHVybiBtaWRkbGV3YXJlcyBpbnRvIGFjdGlvbnMgb3IgZWxzZVxuICAvLyByZWFjdGlvbnMgd2lsbCBub3QgYmUgcGlja2VkIHVwIGJ5IHRoZSB1bmRvIG1hbmFnZXJcblxuICBpZiAoc3VidHJlZVJvb3QpIHtcbiAgICBjb25zdCB0YXJnZXRGaWx0ZXIgPSAoY3R4OiBBY3Rpb25Db250ZXh0KSA9PlxuICAgICAgY3R4LnRhcmdldCA9PT0gc3VidHJlZVJvb3QgfHwgaXNDaGlsZE9mUGFyZW50KGN0eC50YXJnZXQsIHN1YnRyZWVSb290ISlcblxuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSB0YXJnZXRGaWx0ZXJcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VzdG9tRmlsdGVyID0gZmlsdGVyXG4gICAgICBmaWx0ZXIgPSAoY3R4KSA9PiB7XG4gICAgICAgIHJldHVybiB0YXJnZXRGaWx0ZXIoY3R4KSAmJiBjdXN0b21GaWx0ZXIoY3R4KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdHVhbE13YXJlID0geyBtaWRkbGV3YXJlLCBmaWx0ZXIgfVxuXG4gIGxldCBvYmpNd2FyZXMgPSBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlcy5nZXQoc3VidHJlZVJvb3QpIVxuICBpZiAoIW9iak13YXJlcykge1xuICAgIG9iak13YXJlcyA9IFthY3R1YWxNd2FyZV1cbiAgICBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlcy5zZXQoc3VidHJlZVJvb3QsIG9iak13YXJlcylcbiAgfSBlbHNlIHtcbiAgICBvYmpNd2FyZXMucHVzaChhY3R1YWxNd2FyZSlcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZGVsZXRlRnJvbUFycmF5KG9iak13YXJlcywgYWN0dWFsTXdhcmUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQge1xuICBBY3Rpb25Db250ZXh0LFxuICBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSxcbiAgZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQsXG4gIHNldEN1cnJlbnRBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IGlzTW9kZWxBY3Rpb24sIG1vZGVsQWN0aW9uU3ltYm9sIH0gZnJvbSBcIi4vaXNNb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBnZXRBY3Rpb25NaWRkbGV3YXJlcyB9IGZyb20gXCIuL21pZGRsZXdhcmVcIlxuaW1wb3J0IHR5cGUgeyBGbG93RmluaXNoZXIgfSBmcm9tIFwiLi9tb2RlbEZsb3dcIlxuaW1wb3J0IHsgdHJ5UnVuUGVuZGluZ0FjdGlvbnMgfSBmcm9tIFwiLi9wZW5kaW5nQWN0aW9uc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuID0gKGN0eDogTy5Xcml0YWJsZTxBY3Rpb25Db250ZXh0Piwgc2VsZjogYW55KSA9PiB2b2lkXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5BY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPih7XG4gIG5hbWVPck5hbWVGbixcbiAgZm4sXG4gIGFjdGlvblR5cGUsXG4gIG92ZXJyaWRlQ29udGV4dCxcbiAgaXNGbG93RmluaXNoZXIgPSBmYWxzZSxcbn06IHtcbiAgbmFtZU9yTmFtZUZuOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKVxuICBmbjogVFxuICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZVxuICBvdmVycmlkZUNvbnRleHQ/OiBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGblxuICBpc0Zsb3dGaW5pc2hlcj86IGJvb2xlYW5cbn0pOiBUIHtcbiAgbGV0IGZuSW5BY3Rpb24gPSBmYWxzZVxuXG4gIGNvbnN0IHdyYXBwZWRBY3Rpb24gPSBmdW5jdGlvbiAodGhpczogYW55KSB7XG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JOYW1lRm4gPT09IFwiZnVuY3Rpb25cIiA/IG5hbWVPck5hbWVGbigpIDogbmFtZU9yTmFtZUZuXG5cbiAgICBpZiAoIWZuSW5BY3Rpb24pIHtcbiAgICAgIGZuSW5BY3Rpb24gPSB0cnVlXG5cbiAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBvbmx5IGlubmVyIGFjdGlvbnMgYWN0dWFsIG1vYnggYWN0aW9uc1xuICAgICAgLy8gc28gcmVhY3Rpb25zIChlLmcuIHJlZmVyZW5jZSBkZXRhY2hpbmcpIGFyZSBwaWNrZWQgdXAgaW4gdGhlXG4gICAgICAvLyByaWdodCBjb250ZXh0XG4gICAgICBmbiA9IGFjdGlvbihuYW1lLCBmbilcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzXG5cbiAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKVxuXG4gICAgY29uc3QgY29udGV4dDogTy5Xcml0YWJsZTxBY3Rpb25Db250ZXh0PiA9IHtcbiAgICAgIGFjdGlvbk5hbWU6IG5hbWUsXG4gICAgICB0eXBlOiBhY3Rpb25UeXBlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgYXJnczogQXJyYXkuZnJvbShhcmd1bWVudHMpLFxuICAgICAgcGFyZW50Q29udGV4dCxcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgcm9vdENvbnRleHQ6IHVuZGVmaW5lZCBhcyBhbnksIC8vIHdpbGwgYmUgc2V0IGFmdGVyIHRoZSBvdmVycmlkZVxuICAgIH1cbiAgICBpZiAob3ZlcnJpZGVDb250ZXh0KSB7XG4gICAgICBvdmVycmlkZUNvbnRleHQoY29udGV4dCwgdGhpcylcbiAgICB9XG4gICAgaWYgKCFjb250ZXh0LnJvb3RDb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dC5wcmV2aW91c0FzeW5jU3RlcENvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC5yb290Q29udGV4dCA9IGNvbnRleHQucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0LnJvb3RDb250ZXh0XG4gICAgICB9IGVsc2UgaWYgKGNvbnRleHQucGFyZW50Q29udGV4dCkge1xuICAgICAgICBjb250ZXh0LnJvb3RDb250ZXh0ID0gY29udGV4dC5wYXJlbnRDb250ZXh0LnJvb3RDb250ZXh0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LnJvb3RDb250ZXh0ID0gY29udGV4dFxuICAgICAgfVxuICAgIH1cblxuICAgIHNldEN1cnJlbnRBY3Rpb25Db250ZXh0KGNvbnRleHQpXG5cbiAgICBsZXQgbXdhcmVGbjogKCkgPT4gYW55ID0gZm4uYmluZCh0YXJnZXQsIC4uLmFyZ3VtZW50cylcbiAgICBjb25zdCBtd2FyZUl0ZXIgPSBnZXRBY3Rpb25NaWRkbGV3YXJlcyhjb250ZXh0LnRhcmdldClbU3ltYm9sLml0ZXJhdG9yXSgpXG4gICAgbGV0IG13YXJlQ3VyID0gbXdhcmVJdGVyLm5leHQoKVxuICAgIHdoaWxlICghbXdhcmVDdXIuZG9uZSkge1xuICAgICAgY29uc3QgbXdhcmUgPSBtd2FyZUN1ci52YWx1ZVxuXG4gICAgICBjb25zdCBmaWx0ZXJQYXNzZWQgPSBtd2FyZS5maWx0ZXIgPyBtd2FyZS5maWx0ZXIoY29udGV4dCkgOiB0cnVlXG4gICAgICBpZiAoZmlsdGVyUGFzc2VkKSB7XG4gICAgICAgIG13YXJlRm4gPSBtd2FyZS5taWRkbGV3YXJlLmJpbmQodW5kZWZpbmVkLCBjb250ZXh0LCBtd2FyZUZuKVxuICAgICAgfVxuXG4gICAgICBtd2FyZUN1ciA9IG13YXJlSXRlci5uZXh0KClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gbXdhcmVGbigpXG5cbiAgICAgIGlmIChpc0Zsb3dGaW5pc2hlcikge1xuICAgICAgICBjb25zdCBmbG93RmluaXNoZXIgPSByZXQgYXMgRmxvd0ZpbmlzaGVyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZmxvd0ZpbmlzaGVyLnZhbHVlXG4gICAgICAgIGlmIChmbG93RmluaXNoZXIucmVzb2x1dGlvbiA9PT0gXCJhY2NlcHRcIikge1xuICAgICAgICAgIGZsb3dGaW5pc2hlci5hY2NlcHRlcih2YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbG93RmluaXNoZXIucmVqZWN0ZXIodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlIC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgZXZlbiBuZWVkZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudEFjdGlvbkNvbnRleHQoY29udGV4dC5wYXJlbnRDb250ZXh0KVxuXG4gICAgICB0cnlSdW5QZW5kaW5nQWN0aW9ucygpXG4gICAgfVxuICB9XG4gIDsod3JhcHBlZEFjdGlvbiBhcyBhbnkpW21vZGVsQWN0aW9uU3ltYm9sXSA9IHRydWVcblxuICByZXR1cm4gd3JhcHBlZEFjdGlvbiBhcyBhbnlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNb2RlbE1ldGhvZEluQWN0aW9uSWZOZWVkZWQ8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BlcnR5S2V5OiBrZXlvZiBNLFxuICBuYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCBmbiA9IG1vZGVsW3Byb3BlcnR5S2V5XSBhcyBhbnlcbiAgaWYgKGlzTW9kZWxBY3Rpb24oZm4pKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB3cmFwcGVkRm4gPSB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICBmbixcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcbiAgY29uc3QgcHJvdG9GbiA9IHByb3RvW3Byb3BlcnR5S2V5XVxuICBpZiAocHJvdG9GbiA9PT0gZm4pIHtcbiAgICBwcm90b1twcm9wZXJ0eUtleV0gPSB3cmFwcGVkRm5cbiAgfSBlbHNlIHtcbiAgICBtb2RlbFtwcm9wZXJ0eUtleV0gPSB3cmFwcGVkRm5cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlQXJyYXksIGlzT2JzZXJ2YWJsZU9iamVjdCwgcmVtb3ZlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzIH0gZnJvbSBcIi4vcGF0aFwiXG5cbi8qKlxuICogRGV0YWNoZXMgYSBnaXZlbiBvYmplY3QgZnJvbSBhIHRyZWUuXG4gKiBJZiB0aGUgcGFyZW50IGlzIGFuIG9iamVjdCAvIG1vZGVsLCBkZXRhY2hpbmcgd2lsbCBkZWxldGUgdGhlIHByb3BlcnR5LlxuICogSWYgdGhlIHBhcmVudCBpcyBhbiBhcnJheSBkZXRhY2hpbmcgd2lsbCByZW1vdmUgdGhlIG5vZGUgYnkgc3BsaWNpbmcgaXQuXG4gKiBJZiB0aGVyZSdzIG5vIHBhcmVudCBpdCB3aWxsIHRocm93LlxuICpcbiAqIEBwYXJhbSBub2RlIE9iamVjdCB0byBiZSBkZXRhY2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaChub2RlOiBvYmplY3QpOiB2b2lkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICB3cmFwcGVkSW50ZXJuYWxEZXRhY2goKS5jYWxsKG5vZGUpXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbERldGFjaCA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uRGV0YWNoLFxuICAgIGZuOiBpbnRlcm5hbERldGFjaCxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuXG5mdW5jdGlvbiBpbnRlcm5hbERldGFjaCh0aGlzOiBvYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgbm9kZSA9IHRoaXNcblxuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGhJbmNsdWRpbmdEYXRhT2JqZWN0cyhub2RlKVxuICBpZiAoIXBhcmVudFBhdGgpIHJldHVyblxuXG4gIGNvbnN0IHsgcGFyZW50LCBwYXRoIH0gPSBwYXJlbnRQYXRoXG4gIGlmIChpc09ic2VydmFibGVBcnJheShwYXJlbnQpKSB7XG4gICAgcGFyZW50LnNwbGljZSgrcGF0aCwgMSlcbiAgfSBlbHNlIGlmIChpc09ic2VydmFibGVPYmplY3QocGFyZW50KSkge1xuICAgIHJlbW92ZShwYXJlbnQsIFwiXCIgKyBwYXRoKVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoXCJwYXJlbnQgbXVzdCBiZSBhbiBvYnNlcnZhYmxlIG9iamVjdCBvciBhbiBvYnNlcnZhYmxlIGFycmF5XCIpXG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzKGZuTmFtZTogc3RyaW5nLCB0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykge1xuICBpZiAodHlwZW9mIHByb3BlcnR5S2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHtmbk5hbWV9IGNhbm5vdCBiZSB1c2VkIG92ZXIgc3ltYm9sIHByb3BlcnRpZXNgKVxuICB9XG5cbiAgY29uc3QgZXJyTWVzc2FnZSA9IGAke2ZuTmFtZX0gbXVzdCBiZSB1c2VkIG92ZXIgbW9kZWwgY2xhc3NlcyBvciBpbnN0YW5jZXNgXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICAvLyBjaGVjayB0YXJnZXQgaXMgYSBtb2RlbCBvYmplY3Qgb3IgZXh0ZW5kZWQgY2xhc3NcbiAgY29uc3QgaXNNb2RlbCA9XG4gICAgdGFyZ2V0IGluc3RhbmNlb2YgQmFzZU1vZGVsIHx8IHRhcmdldCA9PT0gQmFzZU1vZGVsIHx8IHRhcmdldC5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlTW9kZWxcbiAgaWYgKGlzTW9kZWwpIHJldHVyblxuXG4gIGNvbnN0IGlzRGF0YU1vZGVsID1cbiAgICB0YXJnZXQgaW5zdGFuY2VvZiBCYXNlRGF0YU1vZGVsIHx8XG4gICAgdGFyZ2V0ID09PSBCYXNlRGF0YU1vZGVsIHx8XG4gICAgdGFyZ2V0LnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWxcbiAgaWYgKGlzRGF0YU1vZGVsKSByZXR1cm5cblxuICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG59XG4iLCJpbXBvcnQgeyBzZXREYXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vZGF0YU1vZGVsL2FjdGlvbnNcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWwsIGlzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzXCJcbmltcG9ydCB7IGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUoXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nXG4pOiB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpXG4gIG92ZXJyaWRlQ29udGV4dDogV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gfCB1bmRlZmluZWRcbn0ge1xuICBsZXQgYWN0aW9uTmFtZTogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgPSBwcm9wZXJ0eUtleVxuICBsZXQgb3ZlcnJpZGVDb250ZXh0OiBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGbiB8IHVuZGVmaW5lZFxuXG4gIGlmIChpc0RhdGFNb2RlbENsYXNzKHRhcmdldCkgfHwgaXNEYXRhTW9kZWwodGFyZ2V0KSkge1xuICAgIG92ZXJyaWRlQ29udGV4dCA9IChjdHgsIHNlbGYpID0+IHtcbiAgICAgIGN0eC50YXJnZXQgPSBzZWxmLiRcbiAgICB9XG5cbiAgICBsZXQgZnVsbEFjdGlvbk5hbWU6IHN0cmluZ1xuICAgIGFjdGlvbk5hbWUgPSAoKSA9PiBmdWxsQWN0aW9uTmFtZVxuXG4gICAgY29uc3QgbW9kZWxDbGFzczogYW55ID0gaXNEYXRhTW9kZWxDbGFzcyh0YXJnZXQpID8gdGFyZ2V0IDogdGFyZ2V0LmNvbnN0cnVjdG9yXG5cbiAgICBhZGRMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbihtb2RlbENsYXNzLCBydW5BZnRlck1vZGVsRGVjb3JhdG9yU3ltYm9sLCAoZmluYWxDbGFzcykgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQoZmluYWxDbGFzcykhXG4gICAgICBmdWxsQWN0aW9uTmFtZSA9IGBmbjo6JHttb2RlbEluZm8ubmFtZX06OiR7cHJvcGVydHlLZXl9YFxuICAgICAgc2V0RGF0YU1vZGVsQWN0aW9uKGZ1bGxBY3Rpb25OYW1lLCBtb2RlbEluZm8uY2xhc3MsIHByb3BlcnR5S2V5KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHsgYWN0aW9uTmFtZSwgb3ZlcnJpZGVDb250ZXh0IH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgeyBjaGVja01vZGVsRGVjb3JhdG9yQXJncyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9jaGVja01vZGVsRGVjb3JhdG9yQXJnc1wiXG5pbXBvcnQgeyBkZWNvcmF0ZVdyYXBNZXRob2RPckZpZWxkLCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUgfSBmcm9tIFwiLi9hY3Rpb25EZWNvcmF0b3JVdGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0LCBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSwgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiwgV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG5jb25zdCBtb2RlbEZsb3dTeW1ib2wgPSBTeW1ib2woXCJtb2RlbEZsb3dcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb3c8UiwgQXJncyBleHRlbmRzIGFueVtdPih7XG4gIG5hbWVPck5hbWVGbixcbiAgZ2VuZXJhdG9yLFxuICBvdmVycmlkZUNvbnRleHQsXG59OiB7XG4gIG5hbWVPck5hbWVGbjogc3RyaW5nIHwgKCgpID0+IHN0cmluZylcbiAgZ2VuZXJhdG9yOiAoLi4uYXJnczogQXJncykgPT4gSXRlcmFibGVJdGVyYXRvcjxhbnk+XG4gIG92ZXJyaWRlQ29udGV4dD86IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuXG59KTogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8YW55PiB7XG4gIC8vIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS90ai9jby9ibG9iL21hc3Rlci9pbmRleC5qc1xuICBjb25zdCBmbG93Rm4gPSBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgbmFtZU9yTmFtZUZuID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lT3JOYW1lRm4oKSA6IG5hbWVPck5hbWVGblxuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpc1xuXG4gICAgbGV0IHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dDogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgY3R4T3ZlcnJpZGUgPSAoc3RlcFR5cGU6IEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlKTogV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gPT4ge1xuICAgICAgcmV0dXJuIChjdHg6IE8uV3JpdGFibGU8QWN0aW9uQ29udGV4dD4sIHNlbGYpID0+IHtcbiAgICAgICAgaWYgKG92ZXJyaWRlQ29udGV4dCkge1xuICAgICAgICAgIG92ZXJyaWRlQ29udGV4dChjdHgsIHNlbGYpXG4gICAgICAgIH1cblxuICAgICAgICBjdHgucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0ID0gcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0XG4gICAgICAgIGN0eC5zcGF3bkFzeW5jU3RlcENvbnRleHQgPSBwcmV2aW91c0FzeW5jU3RlcENvbnRleHRcbiAgICAgICAgICA/IHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dC5zcGF3bkFzeW5jU3RlcENvbnRleHRcbiAgICAgICAgICA6IGN0eFxuICAgICAgICBjdHguYXN5bmNTdGVwVHlwZSA9IHN0ZXBUeXBlXG4gICAgICAgIGN0eC5hcmdzID0gYXJnc1xuXG4gICAgICAgIHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dCA9IGN0eFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBnZW5lcmF0b3JSdW4gPSBmYWxzZVxuICAgIGNvbnN0IGdlbiA9IHdyYXBJbkFjdGlvbih7XG4gICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICBmbjogKCkgPT4ge1xuICAgICAgICBnZW5lcmF0b3JSdW4gPSB0cnVlXG4gICAgICAgIHJldHVybiBnZW5lcmF0b3IuYXBwbHkodGFyZ2V0LCBhcmdzIGFzIEFyZ3MpXG4gICAgICB9LFxuICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlNwYXduKSxcbiAgICB9KS5hcHBseSh0YXJnZXQpXG5cbiAgICBpZiAoIWdlbmVyYXRvclJ1bikge1xuICAgICAgLy8gbWF5YmUgaXQgZ290IG92ZXJyaWRkZW4gaW50byBhIHN5bmMgYWN0aW9uXG5cbiAgICAgIHJldHVybiBnZW4gaW5zdGFuY2VvZiBQcm9taXNlID8gZ2VuIDogUHJvbWlzZS5yZXNvbHZlKGdlbilcbiAgICB9XG5cbiAgICAvLyB1c2UgYm91bmQgZnVuY3Rpb25zIHRvIGZpeCBlczYgY29tcGlsYXRpb25cbiAgICBjb25zdCBnZW5OZXh0ID0gZ2VuLm5leHQuYmluZChnZW4pXG4gICAgY29uc3QgZ2VuVGhyb3cgPSBnZW4udGhyb3chLmJpbmQoZ2VuKVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFI+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbGVkKHJlczogYW55KTogdm9pZCB7XG4gICAgICAgIGxldCByZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgICAgICAgICAgZm46IGdlbk5leHQsXG4gICAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgICAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lKSxcbiAgICAgICAgICB9KS5jYWxsKHRhcmdldCwgcmVzKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgICAgICAgIGZuOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgZmxvdyBmaW5pc2hlciB0byBhbGxvdyBtaWRkbGV3YXJlcyB0byB0d2VhayB0aGUgcmV0dXJuIHZhbHVlIGJlZm9yZSByZXNvbHV0aW9uXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVycixcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiBcInJlamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgYWNjZXB0ZXI6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0ZXI6IHJlamVjdCxcbiAgICAgICAgICAgICAgfSBhcyBGbG93RmluaXNoZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgICAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuVGhyb3cpLFxuICAgICAgICAgICAgaXNGbG93RmluaXNoZXI6IHRydWUsXG4gICAgICAgICAgfSkuY2FsbCh0YXJnZXQsIGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBuZXh0KHJldClcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25SZWplY3RlZChlcnI6IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgcmV0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgICAgICAgIGZuOiBnZW5UaHJvdyxcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jLFxuICAgICAgICAgICAgb3ZlcnJpZGVDb250ZXh0OiBjdHhPdmVycmlkZShBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWVFcnJvciksXG4gICAgICAgICAgfSkuY2FsbCh0YXJnZXQsIGVycilcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICAgICAgICBmbjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIC8vIHdlIHVzZSBhIGZsb3cgZmluaXNoZXIgdG8gYWxsb3cgbWlkZGxld2FyZXMgdG8gdHdlYWsgdGhlIHJldHVybiB2YWx1ZSBiZWZvcmUgcmVzb2x1dGlvblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBlcnIsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogXCJyZWplY3RcIixcblxuICAgICAgICAgICAgICAgIGFjY2VwdGVyOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdGVyOiByZWplY3QsXG4gICAgICAgICAgICAgIH0gYXMgRmxvd0ZpbmlzaGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICAgICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlRocm93KSxcbiAgICAgICAgICAgIGlzRmxvd0ZpbmlzaGVyOiB0cnVlLFxuICAgICAgICAgIH0pLmNhbGwodGFyZ2V0LCBlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dChyZXQpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG5leHQocmV0OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHJldCAmJiB0eXBlb2YgcmV0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIGFuIGFzeW5jIGl0ZXJhdG9yXG4gICAgICAgICAgcmV0LnRoZW4obmV4dCwgcmVqZWN0KVxuICAgICAgICB9IGVsc2UgaWYgKHJldC5kb25lKSB7XG4gICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgIHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICAgICAgICBmbjogKHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIC8vIHdlIHVzZSBhIGZsb3cgZmluaXNoZXIgdG8gYWxsb3cgbWlkZGxld2FyZXMgdG8gdHdlYWsgdGhlIHJldHVybiB2YWx1ZSBiZWZvcmUgcmVzb2x1dGlvblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogXCJhY2NlcHRcIixcblxuICAgICAgICAgICAgICAgIGFjY2VwdGVyOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdGVyOiByZWplY3QsXG4gICAgICAgICAgICAgIH0gYXMgRmxvd0ZpbmlzaGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICAgICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJldHVybiksXG4gICAgICAgICAgICBpc0Zsb3dGaW5pc2hlcjogdHJ1ZSxcbiAgICAgICAgICB9KS5jYWxsKHRhcmdldCwgcmV0LnZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbnRpbnVlXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJldC52YWx1ZSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvbkZ1bGZpbGxlZCh1bmRlZmluZWQpIC8vIGtpY2sgb2ZmIHRoZSBwcm9jZXNzXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cbiAgOyhmbG93Rm4gYXMgYW55KVttb2RlbEZsb3dTeW1ib2xdID0gdHJ1ZVxuXG4gIHJldHVybiBmbG93Rm5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93RmluaXNoZXIge1xuICB2YWx1ZTogYW55XG4gIHJlc29sdXRpb246IFwiYWNjZXB0XCIgfCBcInJlamVjdFwiXG5cbiAgYWNjZXB0ZXIodmFsdWU6IGFueSk6IHZvaWRcbiAgcmVqZWN0ZXIodmFsdWU6IGFueSk6IHZvaWRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIG1vZGVsIGZsb3cgb3Igbm90LlxuICpcbiAqIEBwYXJhbSBmbiBGdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsRmxvdyhmbjogdW5rbm93bikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgJiYgbW9kZWxGbG93U3ltYm9sIGluIGZuXG59XG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgdHVybnMgYSBmdW5jdGlvbiBnZW5lcmF0b3IgaW50byBhIG1vZGVsIGZsb3cuXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHByb3BlcnR5S2V5XG4gKiBAcGFyYW0gW2Jhc2VEZXNjcmlwdG9yXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsRmxvdyhcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gIGJhc2VEZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4pOiB2b2lkIHtcbiAgY29uc3QgeyBhY3Rpb25OYW1lLCBvdmVycmlkZUNvbnRleHQgfSA9IGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUodGFyZ2V0LCBwcm9wZXJ0eUtleSlcblxuICByZXR1cm4gZGVjb3JhdGVXcmFwTWV0aG9kT3JGaWVsZChcbiAgICBcIm1vZGVsRmxvd1wiLFxuICAgIHtcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgYmFzZURlc2NyaXB0b3IsXG4gICAgfSxcbiAgICAoZGF0YSwgZm4pID0+IHtcbiAgICAgIGlmIChpc01vZGVsRmxvdyhmbikpIHtcbiAgICAgICAgcmV0dXJuIGZuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja01vZGVsRmxvd0FyZ3MoZGF0YS50YXJnZXQsIGRhdGEucHJvcGVydHlLZXksIGZuKVxuXG4gICAgICAgIHJldHVybiBmbG93KHsgbmFtZU9yTmFtZUZuOiBhY3Rpb25OYW1lLCBnZW5lcmF0b3I6IGZuLCBvdmVycmlkZUNvbnRleHQgfSlcbiAgICAgIH1cbiAgICB9XG4gIClcbn1cblxuZnVuY3Rpb24gY2hlY2tNb2RlbEZsb3dBcmdzKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoXCJtb2RlbEZsb3cgaGFzIHRvIGJlIHVzZWQgb3ZlciBmdW5jdGlvbnNcIilcbiAgfVxuICBjaGVja01vZGVsRGVjb3JhdG9yQXJncyhcIm1vZGVsRmxvd1wiLCB0YXJnZXQsIHByb3BlcnR5S2V5KVxufVxuXG4vKipcbiAqIFRyaWNrcyB0aGUgVFMgY29tcGlsZXIgaW50byB0aGlua2luZyB0aGF0IGEgbW9kZWwgZmxvdyBnZW5lcmF0b3IgZnVuY3Rpb24gY2FuIGJlIGF3YWl0ZWRcbiAqIChpcyBhIHByb21pc2UpLlxuICpcbiAqIEB0eXBlcGFyYW0gQSBGdW5jdGlvbiBhcmd1bWVudHMuXG4gKiBAdHlwZXBhcmFtIFIgUmV0dXJuIHZhbHVlLlxuICogQHBhcmFtIGZuIEZsb3cgZnVuY3Rpb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gX2FzeW5jPEEgZXh0ZW5kcyBhbnlbXSwgUj4oXG4gIGZuOiAoLi4uYXJnczogQSkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55PlxuKTogKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4ge1xuICByZXR1cm4gZm4gYXMgYW55XG59XG5cbi8qKlxuICogTWFrZXMgYSBwcm9taXNlIGEgZmxvdywgc28gaXQgY2FuIGJlIGF3YWl0ZWQgd2l0aCB5aWVsZCouXG4gKlxuICogQHR5cGVwYXJhbSBUIFByb21pc2UgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0gcHJvbWlzZSBQcm9taXNlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hd2FpdDxUPihwcm9taXNlOiBQcm9taXNlPFQ+KTogR2VuZXJhdG9yPFByb21pc2U8VD4sIFQsIHVua25vd24+IHtcbiAgcmV0dXJuIHByb21pc2VHZW5lcmF0b3IuY2FsbChwcm9taXNlKVxufVxuXG4vKlxuZnVuY3Rpb24qIHByb21pc2VHZW5lcmF0b3I8VD4oXG4gIHRoaXM6IFByb21pc2U8VD5cbikge1xuICBjb25zdCByZXQ6IFQgPSB5aWVsZCB0aGlzXG4gIHJldHVybiByZXRcbn1cbiovXG5cbi8vIGFib3ZlIGNvZGUgYnV0IGNvbXBpbGVkIGJ5IFRTIGZvciBFUzVcbi8vIHNvIHdlIGRvbid0IGluY2x1ZGUgYSBkZXBlbmRlbmN5IHRvIHJlZ2VuZXJhdG9yIHJ1bnRpbWVcblxuY29uc3QgX19nZW5lcmF0b3IgPSBmdW5jdGlvbiAodGhpc0FyZzogYW55LCBib2R5OiBhbnkpIHtcbiAgbGV0IF86IGFueSA9IHtcbiAgICAgIGxhYmVsOiAwLFxuICAgICAgc2VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV1cbiAgICAgICAgcmV0dXJuIHRbMV1cbiAgICAgIH0sXG4gICAgICB0cnlzOiBbXSxcbiAgICAgIG9wczogW10sXG4gICAgfSxcbiAgICBmOiBhbnksXG4gICAgeTogYW55LFxuICAgIHQ6IGFueSxcbiAgICBnOiBhbnlcbiAgcmV0dXJuIChcbiAgICAoZyA9IHsgbmV4dDogdmVyYigwKSwgdGhyb3c6IHZlcmIoMSksIHJldHVybjogdmVyYigyKSB9KSxcbiAgICB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICB9KSxcbiAgICBnXG4gIClcbiAgZnVuY3Rpb24gdmVyYihuOiBhbnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHY6IGFueSkge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzdGVwKG9wOiBhbnkpIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIilcbiAgICB3aGlsZSAoXylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGYgPSAxKSxcbiAgICAgICAgICB5ICYmXG4gICAgICAgICAgICAodCA9XG4gICAgICAgICAgICAgIG9wWzBdICYgMlxuICAgICAgICAgICAgICAgID8geVtcInJldHVyblwiXVxuICAgICAgICAgICAgICAgIDogb3BbMF1cbiAgICAgICAgICAgICAgICA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApXG4gICAgICAgICAgICAgICAgOiB5Lm5leHQpICYmXG4gICAgICAgICAgICAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgaWYgKCgoeSA9IDApLCB0KSkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXVxuICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHQgPSBvcFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfLmxhYmVsKytcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfVxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF8ubGFiZWwrK1xuICAgICAgICAgICAgeSA9IG9wWzFdXG4gICAgICAgICAgICBvcCA9IFswXVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpXG4gICAgICAgICAgICBfLnRyeXMucG9wKClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgISgodCA9IF8udHJ5cyksICh0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkpICYmXG4gICAgICAgICAgICAgIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBfID0gMFxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdXG4gICAgICAgICAgICAgIHQgPSBvcFxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl1cbiAgICAgICAgICAgICAgXy5vcHMucHVzaChvcClcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKVxuICAgICAgICAgICAgXy50cnlzLnBvcCgpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9wID0gWzYsIGVdXG4gICAgICAgIHkgPSAwXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmID0gdCA9IDBcbiAgICAgIH1cbiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXVxuICAgIHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9taXNlR2VuZXJhdG9yKHRoaXM6IFByb21pc2U8YW55Pikge1xuICBsZXQgcmV0XG4gIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAodGhpczogYW55LCBfYTogYW55KSB7XG4gICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXVxuICAgICAgY2FzZSAxOlxuICAgICAgICByZXQgPSBfYS5zZW50KClcbiAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJldF1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IGlzTW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2lzTW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgZmxvdywgaXNNb2RlbEZsb3cgfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsRmxvd1wiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL3dyYXBJbkFjdGlvblwiXG5pbXBvcnQgeyBhc3NlcnRJc1RyZWVOb2RlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uLCBmYWlsdXJlLCBsb2dXYXJuaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdpdGggYW4gb2JqZWN0IGFzIHRhcmdldC5cbiAqL1xudHlwZSBUYXJnZXRlZEFjdGlvbiA9ICh0YXJnZXQ6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueVxuXG5jb25zdCBzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgVGFyZ2V0ZWRBY3Rpb24+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYWxvbmVBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkuZ2V0KGFjdGlvbk5hbWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdGFuZGFsb25lQWN0aW9uKGZ1bGxBY3Rpb25OYW1lOiBzdHJpbmcsIGZuOiBUYXJnZXRlZEFjdGlvbiwgaXNGbG93OiBib29sZWFuKSB7XG4gIGFzc2VydElzRnVuY3Rpb24oZm4sIGZ1bGxBY3Rpb25OYW1lKVxuXG4gIGlmIChzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkuaGFzKGZ1bGxBY3Rpb25OYW1lKSkge1xuICAgIGxvZ1dhcm5pbmcoXG4gICAgICBcIndhcm5cIixcbiAgICAgIGBhbiBzdGFuZGFsb25lIGFjdGlvbiB3aXRoIG5hbWUgXCIke2Z1bGxBY3Rpb25OYW1lfVwiIGFscmVhZHkgZXhpc3RzIChpZiB5b3UgYXJlIHVzaW5nIGhvdC1yZWxvYWRpbmcgeW91IG1heSBzYWZlbHkgaWdub3JlIHRoaXMgd2FybmluZylgLFxuICAgICAgYGR1cGxpY2F0ZUFjdGlvbk5hbWUgLSAke2Z1bGxBY3Rpb25OYW1lfWBcbiAgICApXG4gIH1cblxuICBpZiAoaXNNb2RlbEFjdGlvbihmbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwidGhlIHN0YW5kYWxvbmUgYWN0aW9uIG11c3Qgbm90IGJlIHByZXZpb3VzbHkgbWFya2VkIGFzIGFuIGFjdGlvblwiKVxuICB9XG4gIGlmIChpc01vZGVsRmxvdyhmbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwidGhlIHN0YW5kYWxvbmUgYWN0aW9uIG11c3Qgbm90IGJlIHByZXZpb3VzbHkgbWFya2VkIGFzIGEgZmxvdyBhY3Rpb25cIilcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRBY3Rpb24gPSBpc0Zsb3dcbiAgICA/IGZsb3coeyBuYW1lT3JOYW1lRm46IGZ1bGxBY3Rpb25OYW1lLCBnZW5lcmF0b3I6IGZuIH0pXG4gICAgOiB3cmFwSW5BY3Rpb24oe1xuICAgICAgICBuYW1lT3JOYW1lRm46IGZ1bGxBY3Rpb25OYW1lLFxuICAgICAgICBmbixcbiAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgICAgIH0pXG5cbiAgY29uc3QgZmluYWxBY3Rpb24gPSAodGFyZ2V0OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgYXNzZXJ0SXNUcmVlTm9kZSh0YXJnZXQsIFwidGFyZ2V0XCIpXG5cbiAgICAvLyB3ZSBuZWVkIHRvIHB1dCB0aGUgdGFyZ2V0IGludG8gdGhpc1xuICAgIHJldHVybiB3cmFwcGVkQWN0aW9uLmNhbGwodGFyZ2V0LCB0YXJnZXQsIC4uLmFyZ3MpXG4gIH1cblxuICBzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkuc2V0KGZ1bGxBY3Rpb25OYW1lLCBmaW5hbEFjdGlvbilcbiAgcmV0dXJuIGZpbmFsQWN0aW9uXG59XG4iLCJpbXBvcnQgeyByZW1vdmUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxuLyoqXG4gKiBEZWxldGVzIGFuIG9iamVjdCBmaWVsZCB3cmFwcGVkIGluIGFuIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBmaWVsZE5hbWUgRmllbGQgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVsZXRlPE8gZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBPPihub2RlOiBPLCBmaWVsZE5hbWU6IEspOiB2b2lkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIiwgdHJ1ZSlcblxuICB3cmFwcGVkSW50ZXJuYWxBcHBseURlbGV0ZSgpLmNhbGwobm9kZSwgZmllbGROYW1lIGFzIHN0cmluZyB8IG51bWJlcilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlEZWxldGU8TyBleHRlbmRzIG9iamVjdD4odGhpczogTywgZmllbGROYW1lOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgcmVtb3ZlKHRoaXMsIFwiXCIgKyBmaWVsZE5hbWUpXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5RGVsZXRlID0gbGF6eSgoKSA9PlxuICB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogQnVpbHRJbkFjdGlvbi5BcHBseURlbGV0ZSxcbiAgICBmbjogaW50ZXJuYWxBcHBseURlbGV0ZSxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuL3dyYXBJbkFjdGlvblwiXG5cbnR5cGUgQW55RnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IGFueVxuXG4vKipcbiAqIENhbGxzIGFuIG9iamVjdCBtZXRob2Qgd3JhcHBlZCBpbiBhbiBhY3Rpb24uXG4gKlxuICogQHBhcmFtIG5vZGUgIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSBNZXRob2QgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWV0aG9kQ2FsbDxPIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgTywgRk4gZXh0ZW5kcyBPW0tdPihcbiAgbm9kZTogTyxcbiAgbWV0aG9kTmFtZTogSyxcbiAgLi4uYXJnczogRk4gZXh0ZW5kcyBBbnlGdW5jdGlvbiA/IFBhcmFtZXRlcnM8Rk4+IDogbmV2ZXJcbik6IEZOIGV4dGVuZHMgQW55RnVuY3Rpb24gPyBSZXR1cm5UeXBlPEZOPiA6IG5ldmVyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICByZXR1cm4gd3JhcHBlZEludGVybmFsQXBwbHlNZXRob2RDYWxsKCkuY2FsbChub2RlLCBtZXRob2ROYW1lIGFzIHN0cmluZyB8IG51bWJlciwgYXJncylcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlNZXRob2RDYWxsKHRoaXM6IGFueSwgbWV0aG9kTmFtZTogc3RyaW5nIHwgbnVtYmVyLCBhcmdzOiBhbnlbXSk6IGFueSB7XG4gIHJldHVybiB0aGlzW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5TWV0aG9kQ2FsbCA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlNZXRob2RDYWxsLFxuICAgIGZuOiBpbnRlcm5hbEFwcGx5TWV0aG9kQ2FsbCxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG4vKipcbiAqIFNldHMgYW4gb2JqZWN0IGZpZWxkIHdyYXBwZWQgaW4gYW4gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSBub2RlICBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIGZpZWxkTmFtZSBGaWVsZCBuYW1lLlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2V0PE8gZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBPLCBWIGV4dGVuZHMgT1tLXT4oXG4gIG5vZGU6IE8sXG4gIGZpZWxkTmFtZTogSyxcbiAgdmFsdWU6IFZcbik6IHZvaWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiLCB0cnVlKVxuXG4gIHdyYXBwZWRJbnRlcm5hbEFwcGx5U2V0KCkuY2FsbChub2RlLCBmaWVsZE5hbWUgYXMgc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZSlcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxBcHBseVNldDxPIGV4dGVuZHMgb2JqZWN0Pih0aGlzOiBPLCBmaWVsZE5hbWU6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIGEgbW9kZWwgc2luY2UgbW9kZWxzIGNhbiBiZWNvbWUgb2JzZXJ2YWJsZSBvYmplY3RzXG4gIC8vIChlLmcuIGJ5IGhhdmluZyBhIGNvbXB1dGVkIHZhbHVlKVxuICBpZiAoIWlzTW9kZWwodGhpcykgJiYgaXNPYnNlcnZhYmxlKHRoaXMpKSB7XG4gICAgc2V0KHRoaXMsIGZpZWxkTmFtZSwgdmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgOyh0aGlzIGFzIGFueSlbZmllbGROYW1lXSA9IHZhbHVlXG4gIH1cbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlTZXQgPSBsYXp5KCgpID0+XG4gIHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBCdWlsdEluQWN0aW9uLkFwcGx5U2V0LFxuICAgIGZuOiBpbnRlcm5hbEFwcGx5U2V0LFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG4iLCJpbXBvcnQgeyBnZXREYXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vZGF0YU1vZGVsL2FjdGlvbnNcIlxuaW1wb3J0IHsgZGV0YWNoIH0gZnJvbSBcIi4uL3BhcmVudC9kZXRhY2hcIlxuaW1wb3J0IHsgcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzIH0gZnJvbSBcIi4uL3BhdGNoL2FwcGx5UGF0Y2hlc1wiXG5pbXBvcnQgeyBhcHBseVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2FwcGx5U25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U3RhbmRhbG9uZUFjdGlvbiB9IGZyb20gXCIuLi9zdGFuZGFyZEFjdGlvbnMvYWN0aW9uc1wiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGFwcGx5RGVsZXRlIH0gZnJvbSBcIi4vYXBwbHlEZWxldGVcIlxuaW1wb3J0IHsgYXBwbHlNZXRob2RDYWxsIH0gZnJvbSBcIi4vYXBwbHlNZXRob2RDYWxsXCJcbmltcG9ydCB7IGFwcGx5U2V0IH0gZnJvbSBcIi4vYXBwbHlTZXRcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiwgaXNCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgaXNIb29rQWN0aW9uIH0gZnJvbSBcIi4vaG9va0FjdGlvbnNcIlxuXG4vKipcbiAqIEFuIGFjdGlvbiBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkNhbGwge1xuICAvKipcbiAgICogQWN0aW9uIG5hbWUgKG5hbWUgb2YgdGhlIGZ1bmN0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBY3Rpb24gYXJndW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJnczogUmVhZG9ubHlBcnJheTxhbnk+XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIG1vZGVsIHdoZXJlIHRoZSBhY3Rpb24gd2lsbCBiZSBydW4sIGFzIGFuIGFycmF5IG9mIHN0cmluZyB8IG51bWJlci5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGg6IFBhdGhcblxuICAvKipcbiAgICogSWRzIG9mIG1vZGVscyBhbG9uZyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0LCBudWxsIGlmIGl0IGlzIG5vdCBhIG1vZGVsLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aElkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudWxsPlxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGlzIGFjdGlvbiBjYWxsIGFzIG5vbi1zZXJpYWxpemVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VyaWFsaXplZD86IHVuZGVmaW5lZFxufVxuXG5jb25zdCBidWlsdEluQWN0aW9uVG9GdW5jdGlvbiA9IHtcbiAgW0J1aWx0SW5BY3Rpb24uQXBwbHlTbmFwc2hvdF06IGFwcGx5U25hcHNob3QsXG4gIFtCdWlsdEluQWN0aW9uLkFwcGx5UGF0Y2hlc106IGFwcGx5UGF0Y2hlcyxcbiAgW0J1aWx0SW5BY3Rpb24uRGV0YWNoXTogZGV0YWNoLFxuICBbQnVpbHRJbkFjdGlvbi5BcHBseVNldF06IGFwcGx5U2V0LFxuICBbQnVpbHRJbkFjdGlvbi5BcHBseURlbGV0ZV06IGFwcGx5RGVsZXRlLFxuICBbQnVpbHRJbkFjdGlvbi5BcHBseU1ldGhvZENhbGxdOiBhcHBseU1ldGhvZENhbGwsXG59XG5cbi8qKlxuICogQXBwbGllcyAocnVucykgYW4gYWN0aW9uIG92ZXIgYSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIElmIHlvdSBpbnRlbmQgdG8gYXBwbHkgc2VyaWFsaXplZCBhY3Rpb25zIGNoZWNrIG9uZSBvZiB0aGUgYGFwcGx5U2VyaWFsaXplZEFjdGlvbmAgbWV0aG9kcyBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdCB0byBydW4gdGhlIGFjdGlvbiBvdmVyLlxuICogQHBhcmFtIGNhbGwgVGhlIGFjdGlvbiwgdXN1YWxseSBhcyBjb21pbmcgZnJvbSBgb25BY3Rpb25NaWRkbGV3YXJlYC5cbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGlvbiwgaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBY3Rpb248VFJldCA9IGFueT4oc3VidHJlZVJvb3Q6IG9iamVjdCwgY2FsbDogQWN0aW9uQ2FsbCk6IFRSZXQge1xuICBpZiAoY2FsbC5zZXJpYWxpemVkKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcbiAgICAgIFwiY2Fubm90IGFwcGx5IGEgc2VyaWFsaXplZCBhY3Rpb24gY2FsbCwgdXNlIG9uZSBvZiB0aGUgJ2FwcGx5U2VyaWFsaXplZEFjdGlvbicgbWV0aG9kcyBpbnN0ZWFkXCJcbiAgICApXG4gIH1cblxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgLy8gcmVzb2x2ZSBwYXRoIHdoaWxlIGNoZWNraW5nIGlkc1xuICBjb25zdCB7IHZhbHVlOiBjdXJyZW50LCByZXNvbHZlZCB9ID0gcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyhcbiAgICBzdWJ0cmVlUm9vdCxcbiAgICBjYWxsLnRhcmdldFBhdGgsXG4gICAgY2FsbC50YXJnZXRQYXRoSWRzXG4gIClcbiAgaWYgKCFyZXNvbHZlZCkge1xuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgb2JqZWN0IGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeShjYWxsLnRhcmdldFBhdGgpfSB3aXRoIGlkcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBjYWxsLnRhcmdldFBhdGhJZHNcbiAgICAgICl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZGBcbiAgICApXG4gIH1cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChjdXJyZW50LCBgcmVzb2x2ZWQgJHtjdXJyZW50fWAsIHRydWUpXG5cbiAgaWYgKGlzQnVpbHRJbkFjdGlvbihjYWxsLmFjdGlvbk5hbWUpKSB7XG4gICAgY29uc3QgZm5Ub0NhbGw6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID0gYnVpbHRJbkFjdGlvblRvRnVuY3Rpb25bY2FsbC5hY3Rpb25OYW1lXVxuICAgIGlmICghZm5Ub0NhbGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYGFzc2VydGlvbiBmYWlsZWQ6IHVua25vd24gYnVpbHQtaW4gYWN0aW9uIC0gJHtjYWxsLmFjdGlvbk5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZm5Ub0NhbGwuYXBwbHkoY3VycmVudCwgW2N1cnJlbnQsIC4uLmNhbGwuYXJnc10pXG4gIH1cblxuICBpZiAoaXNIb29rQWN0aW9uKGNhbGwuYWN0aW9uTmFtZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBjYWxscyB0byBob29rcyAoJHtjYWxsLmFjdGlvbk5hbWV9KSBjYW5ub3QgYmUgYXBwbGllZGApXG4gIH1cblxuICBjb25zdCBkYXRhTW9kZWxBY3Rpb24gPSBnZXREYXRhTW9kZWxBY3Rpb24oY2FsbC5hY3Rpb25OYW1lKVxuICBpZiAoZGF0YU1vZGVsQWN0aW9uKSB7XG4gICAgY29uc3QgaW5zdGFuY2U6IGFueSA9IG5ldyBkYXRhTW9kZWxBY3Rpb24ubW9kZWxDbGFzcyhjdXJyZW50KVxuICAgIHJldHVybiBpbnN0YW5jZVtkYXRhTW9kZWxBY3Rpb24uZm5OYW1lXS5hcHBseShpbnN0YW5jZSwgY2FsbC5hcmdzKVxuICB9XG5cbiAgY29uc3Qgc3RhbmRhbG9uZUFjdGlvbiA9IGdldFN0YW5kYWxvbmVBY3Rpb24oY2FsbC5hY3Rpb25OYW1lKVxuICBpZiAoc3RhbmRhbG9uZUFjdGlvbikge1xuICAgIHJldHVybiBzdGFuZGFsb25lQWN0aW9uLmFwcGx5KGN1cnJlbnQsIGNhbGwuYXJncyBhcyBhbnkpXG4gIH1cblxuICByZXR1cm4gKGN1cnJlbnQgYXMgYW55KVtjYWxsLmFjdGlvbk5hbWVdLmFwcGx5KGN1cnJlbnQsIGNhbGwuYXJncylcbn1cbiIsImltcG9ydCB7IGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL2NoZWNrTW9kZWxEZWNvcmF0b3JBcmdzXCJcbmltcG9ydCB7IGRlY29yYXRlV3JhcE1ldGhvZE9yRmllbGQsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0QWN0aW9uTmFtZUFuZENvbnRleHRPdmVycmlkZSB9IGZyb20gXCIuL2FjdGlvbkRlY29yYXRvclV0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyBpc01vZGVsQWN0aW9uIH0gZnJvbSBcIi4vaXNNb2RlbEFjdGlvblwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG5mdW5jdGlvbiBjaGVja01vZGVsQWN0aW9uQXJncyh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwibW9kZWxBY3Rpb24gaGFzIHRvIGJlIHVzZWQgb3ZlciBmdW5jdGlvbnNcIilcbiAgfVxuICBjaGVja01vZGVsRGVjb3JhdG9yQXJncyhcIm1vZGVsQWN0aW9uXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpXG59XG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgdHVybnMgYSBmdW5jdGlvbiBpbnRvIGEgbW9kZWwgYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleVxuICogQHBhcmFtIFtiYXNlRGVzY3JpcHRvcl1cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEFjdGlvbihcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gIGJhc2VEZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4pOiB2b2lkIHtcbiAgY29uc3QgeyBhY3Rpb25OYW1lLCBvdmVycmlkZUNvbnRleHQgfSA9IGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUodGFyZ2V0LCBwcm9wZXJ0eUtleSlcblxuICByZXR1cm4gZGVjb3JhdGVXcmFwTWV0aG9kT3JGaWVsZChcbiAgICBcIm1vZGVsQWN0aW9uXCIsXG4gICAge1xuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXksXG4gICAgICBiYXNlRGVzY3JpcHRvcixcbiAgICB9LFxuICAgIChkYXRhLCBmbikgPT4ge1xuICAgICAgaWYgKGlzTW9kZWxBY3Rpb24oZm4pKSB7XG4gICAgICAgIHJldHVybiBmblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tNb2RlbEFjdGlvbkFyZ3MoZGF0YS50YXJnZXQsIGRhdGEucHJvcGVydHlLZXksIGZuKVxuXG4gICAgICAgIHJldHVybiB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgIG5hbWVPck5hbWVGbjogYWN0aW9uTmFtZSxcbiAgICAgICAgICBmbixcbiAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICAgICAgICAgIG92ZXJyaWRlQ29udGV4dCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIClcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHRyeVJ1blBlbmRpbmdBY3Rpb25zIH0gZnJvbSBcIi4vcGVuZGluZ0FjdGlvbnNcIlxuaW1wb3J0IHsgZ2V0QWN0aW9uUHJvdGVjdGlvbiwgc2V0QWN0aW9uUHJvdGVjdGlvbiB9IGZyb20gXCIuL3Byb3RlY3Rpb25cIlxuXG4vKipcbiAqIFJ1bnMgYSBibG9jayBpbiB1bnByb2N0ZWQgbW9kZSwgYXMgaWYgaXQgd2VyZSBydW4gaW5zaWRlIGEgbW9kZWwgYWN0aW9uLlxuICogQ29uc2lkZXIgdXNpbmcgYSBwcm9wZXIgbW9kZWwgYWN0aW9uIGluc3RlYWQgc2luY2UgdGhlc2Uga2luZCBvZiBhY3Rpb25zIGFyZSBub3QgcmVjb3JkZWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybiB0eXBlLlxuICogQHBhcmFtIG5hbWUgTW9ieCBhY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSBmbiBBY3Rpb24gYmxvY2suXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuVW5wcm90ZWN0ZWQ8VD4obmFtZTogc3RyaW5nLCBmbjogKCkgPT4gVCk6IFRcblxuLyoqXG4gKiBSdW5zIGEgYmxvY2sgaW4gdW5wcm9jdGVkIG1vZGUsIGFzIGlmIGl0IHdlcmUgcnVuIGluc2lkZSBhIG1vZGVsIGFjdGlvbi5cbiAqIENvbnNpZGVyIHVzaW5nIGEgcHJvcGVyIG1vZGVsIGFjdGlvbiBpbnN0ZWFkIHNpbmNlIHRoZXNlIGtpbmQgb2YgYWN0aW9ucyBhcmUgbm90IHJlY29yZGVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSBmbiBBY3Rpb24gYmxvY2suXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuVW5wcm90ZWN0ZWQ8VD4oZm46ICgpID0+IFQpOiBUXG5cbi8vIGJhc2UgY2FzZVxuZXhwb3J0IGZ1bmN0aW9uIHJ1blVucHJvdGVjdGVkPFQ+KGFyZzE6IGFueSwgYXJnMj86IGFueSk6IFQge1xuICBjb25zdCBuYW1lID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgPyBhcmcxIDogdW5kZWZpbmVkXG4gIGNvbnN0IGZuOiAoKSA9PiBUID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgPyBhcmcyIDogYXJnMVxuXG4gIGNvbnN0IGlubmVyQWN0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IG9sZEFjdGlvblByb3RlY3Rpb24gPSBnZXRBY3Rpb25Qcm90ZWN0aW9uKClcbiAgICBzZXRBY3Rpb25Qcm90ZWN0aW9uKGZhbHNlKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEFjdGlvblByb3RlY3Rpb24ob2xkQWN0aW9uUHJvdGVjdGlvbilcblxuICAgICAgdHJ5UnVuUGVuZGluZ0FjdGlvbnMoKVxuICAgIH1cbiAgfVxuXG4gIGlmIChuYW1lKSB7XG4gICAgcmV0dXJuIGFjdGlvbihuYW1lLCBpbm5lckFjdGlvbikoKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBhY3Rpb24oaW5uZXJBY3Rpb24pKClcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IGNhbm5vdFNlcmlhbGl6ZSA9IFN5bWJvbChcImNhbm5vdFNlcmlhbGl6ZVwiKVxuXG4vKipcbiAqIFNlcmlhbGl6ZXIgb2YgYWN0aW9uIGNhbGwgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8VE9yaWdpbmFsLCBUU2VyaWFsaXplZD4ge1xuICAvKipcbiAgICogU2VyaWFsaXplciBJRCwgbXVzdCBiZSB1bmlxdWUuXG4gICAqL1xuICBpZDogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYW4gYWN0aW9uIGNhbGwgYXJndW1lbnQsIHJldHVybmluZyBgY2Fubm90U2VyaWFsaXplYCBpZiBub3QgcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuXG4gICAqIEBwYXJhbSB0YXJnZXRSb290IFRhcmdldCByb290LCBpZiBwcm92aWRlZC5cbiAgICogQHBhcmFtIHNlcmlhbGl6ZUNoaWxkIFNlcmlhbGl6ZSBhIGNoaWxkLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc2VyaWFsaXplKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNlcmlhbGl6ZUNoaWxkOiAodjogdW5rbm93bikgPT4gdW5rbm93bixcbiAgICB0YXJnZXRSb290OiBvYmplY3QgfCB1bmRlZmluZWRcbiAgKTogVFNlcmlhbGl6ZWQgfCB0eXBlb2YgY2Fubm90U2VyaWFsaXplXG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBhbiBhY3Rpb24gY2FsbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLlxuICAgKiBAcGFyYW0gdGFyZ2V0Um9vdCBUYXJnZXQgcm9vdCwgaWYgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSBkZXNlcmlhbGl6ZUNoaWxkIERlc2VyaWFsaXplIGEgY2hpbGQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBkZXNlcmlhbGl6ZShcbiAgICB2YWx1ZTogVFNlcmlhbGl6ZWQsXG4gICAgZGVzZXJpYWxpemVDaGlsZDogKHY6IHVua25vd24pID0+IHVua25vd24sXG4gICAgdGFyZ2V0Um9vdDogb2JqZWN0IHwgdW5kZWZpbmVkXG4gICk6IFRPcmlnaW5hbFxufVxuIiwiaW1wb3J0IHR5cGUgeyBJT2JzZXJ2YWJsZUFycmF5IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNBcnJheSwgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3QgYXJyYXlTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPGFueVtdIHwgSU9ic2VydmFibGVBcnJheTxhbnk+LCBhbnlbXT4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L2FycmF5YCxcblxuICBzZXJpYWxpemUodmFsdWUsIHNlcmlhbGl6ZSkge1xuICAgIGlmICghaXNBcnJheSh2YWx1ZSkpIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIC8vIHRoaXMgd2lsbCBhbHNvIHRyYW5zZm9ybSBvYnNlcnZhYmxlIGFycmF5cyBpbnRvIG5vbi1vYnNlcnZhYmxlIG9uZXNcbiAgICByZXR1cm4gdmFsdWUubWFwKHNlcmlhbGl6ZSlcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShhcnIsIGRlc2VyaWFsaXplKSB7XG4gICAgcmV0dXJuIGFyci5tYXAoZGVzZXJpYWxpemUpXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBkYXRlU2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxEYXRlLCBudW1iZXI+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9kYXRlQXNUaW1lc3RhbXBgLFxuXG4gIHNlcmlhbGl6ZShkYXRlKSB7XG4gICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG4gICAgcmV0dXJuICtkYXRlXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUodGltZXN0YW1wKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcClcbiAgfSxcbn1cbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZU1hcCwgT2JzZXJ2YWJsZU1hcCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IG1hcFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8XG4gIE1hcDxhbnksIGFueT4gfCBPYnNlcnZhYmxlTWFwPGFueSwgYW55PixcbiAgW2FueSwgYW55XVtdXG4+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9tYXBBc0FycmF5YCxcblxuICBzZXJpYWxpemUobWFwLCBzZXJpYWxpemUpIHtcbiAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBNYXApICYmICFpc09ic2VydmFibGVNYXAobWFwKSkgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuXG4gICAgY29uc3QgYXJyOiBbYW55LCBhbnldW10gPSBbXVxuXG4gICAgY29uc3QgaXRlciA9IG1hcC5rZXlzKClcbiAgICBsZXQgY3VyID0gaXRlci5uZXh0KClcbiAgICB3aGlsZSAoIWN1ci5kb25lKSB7XG4gICAgICBjb25zdCBrID0gY3VyLnZhbHVlXG4gICAgICBjb25zdCB2ID0gbWFwLmdldChrKVxuICAgICAgYXJyLnB1c2goW3NlcmlhbGl6ZShrKSwgc2VyaWFsaXplKHYpXSlcbiAgICAgIGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFyclxuICB9LFxuXG4gIGRlc2VyaWFsaXplKGFyciwgZGVzZXJpYWxpemUpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKClcblxuICAgIGNvbnN0IGxlbiA9IGFyci5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gYXJyW2ldWzBdXG4gICAgICBjb25zdCB2ID0gYXJyW2ldWzFdXG4gICAgICBtYXAuc2V0KGRlc2VyaWFsaXplKGspLCBkZXNlcmlhbGl6ZSh2KSlcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBtb2RlbElkS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb290UGF0aFRvVGFyZ2V0UGF0aElkcyhyb290UGF0aDogUm9vdFBhdGg8YW55Pik6IChzdHJpbmcgfCBudWxsKVtdIHtcbiAgY29uc3QgdGFyZ2V0UGF0aElkczogKHN0cmluZyB8IG51bGwpW10gPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdFBhdGgucGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRhcmdldE9iaiA9IHJvb3RQYXRoLnBhdGhPYmplY3RzW2kgKyAxXSAvLyBmaXJzdCBpcyByb290LCB3ZSBkb24ndCBjYXJlIGFib3V0IGl0cyBJRFxuICAgIGNvbnN0IHRhcmdldE9iaklkID0gaXNNb2RlbCh0YXJnZXRPYmopID8gdGFyZ2V0T2JqW21vZGVsSWRLZXldID8/IG51bGwgOiBudWxsXG4gICAgdGFyZ2V0UGF0aElkcy5wdXNoKHRhcmdldE9iaklkKVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldFBhdGhJZHNcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhUb1RhcmdldFBhdGhJZHMocm9vdDogYW55LCBwYXRoOiBQYXRoKTogKHN0cmluZyB8IG51bGwpW10ge1xuICBjb25zdCB0YXJnZXRQYXRoSWRzOiAoc3RyaW5nIHwgbnVsbClbXSA9IFtdXG4gIGxldCBjdXJyZW50ID0gcm9vdCAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSByb290IElEXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aFtpXV1cbiAgICBjb25zdCB0YXJnZXRPYmpJZCA9IGlzTW9kZWwoY3VycmVudCkgPyBjdXJyZW50W21vZGVsSWRLZXldID8/IG51bGwgOiBudWxsXG4gICAgdGFyZ2V0UGF0aElkcy5wdXNoKHRhcmdldE9iaklkKVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldFBhdGhJZHNcbn1cbiIsImltcG9ydCB7IGZhc3RHZXRSb290UGF0aCwgcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyB9IGZyb20gXCIuLi8uLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSBcIi4uLy4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgcm9vdFBhdGhUb1RhcmdldFBhdGhJZHMgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmludGVyZmFjZSBPYmplY3RQYXRoIHtcbiAgdGFyZ2V0UGF0aDogUGF0aFxuICB0YXJnZXRQYXRoSWRzOiAoc3RyaW5nIHwgbnVsbClbXVxufVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0UGF0aFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8b2JqZWN0LCBPYmplY3RQYXRoPiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vb2JqZWN0UGF0aGAsXG5cbiAgc2VyaWFsaXplKHZhbHVlLCBfLCB0YXJnZXRSb290KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCB8fCAhaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCBmYWxzZSkpXG4gICAgICByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICAvLyB0cnkgdG8gc2VyaWFsaXplIGEgcmVmIHRvIGl0cyBwYXRoIGlmIHBvc3NpYmxlIGluc3RlYWRcbiAgICBpZiAodGFyZ2V0Um9vdCkge1xuICAgICAgY29uc3Qgcm9vdFBhdGggPSBmYXN0R2V0Um9vdFBhdGgodmFsdWUpXG4gICAgICBpZiAocm9vdFBhdGgucm9vdCA9PT0gdGFyZ2V0Um9vdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRhcmdldFBhdGg6IHJvb3RQYXRoLnBhdGgsXG4gICAgICAgICAgdGFyZ2V0UGF0aElkczogcm9vdFBhdGhUb1RhcmdldFBhdGhJZHMocm9vdFBhdGgpLFxuICAgICAgICB9IGFzIE9iamVjdFBhdGhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2Fubm90U2VyaWFsaXplXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUocmVmLCBfLCB0YXJnZXRSb290KSB7XG4gICAgLy8gdHJ5IHRvIHJlc29sdmUgdGhlIG5vZGUgYmFja1xuICAgIGlmICh0YXJnZXRSb290KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlUGF0aENoZWNraW5nSWRzKHRhcmdldFJvb3QsIHJlZi50YXJnZXRQYXRoLCByZWYudGFyZ2V0UGF0aElkcylcbiAgICAgIGlmIChyZXN1bHQucmVzb2x2ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgb2JqZWN0IGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeShyZWYudGFyZ2V0UGF0aCl9IHdpdGggaWRzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHJlZi50YXJnZXRQYXRoSWRzXG4gICAgICApfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWRgXG4gICAgKVxuICB9LFxufVxuIiwiaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4uLy4uL3NuYXBzaG90L2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi8uLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IG9iamVjdFNuYXBzaG90U2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxvYmplY3QsIG9iamVjdD4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L29iamVjdFNuYXBzaG90YCxcblxuICBzZXJpYWxpemUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsIHx8ICFpc1R3ZWFrZWRPYmplY3QodmFsdWUsIGZhbHNlKSlcbiAgICAgIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIHJldHVybiBnZXRTbmFwc2hvdCh2YWx1ZSlcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShzbmFwc2hvdCkge1xuICAgIHJldHVybiBmcm9tU25hcHNob3Qoc25hcHNob3QpXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBpc09ic2VydmFibGVPYmplY3QgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0LCBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBwbGFpbk9iamVjdFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8b2JqZWN0LCBvYmplY3Q+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9wbGFpbk9iamVjdGAsXG5cbiAgc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpICYmICFpc09ic2VydmFibGVPYmplY3QodmFsdWUpKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICAvLyB0aGlzIHdpbGwgbWFrZSBvYnNlcnZhYmxlIG9iamVjdHMgbm9uLW9ic2VydmFibGUgb25lc1xuICAgIHJldHVybiBtYXBPYmplY3RGaWVsZHModmFsdWUsIHNlcmlhbGl6ZSlcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShvYmosIHNlcmlhbGl6ZSkge1xuICAgIHJldHVybiBtYXBPYmplY3RGaWVsZHMob2JqLCBzZXJpYWxpemUpXG4gIH0sXG59XG5cbmZ1bmN0aW9uIG1hcE9iamVjdEZpZWxkcyhvcmlnaW5hbE9iajogYW55LCBtYXBGbjogKHg6IGFueSkgPT4gYW55KTogYW55IHtcbiAgY29uc3Qgb2JqOiBhbnkgPSB7fVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3JpZ2luYWxPYmopXG4gIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgIGNvbnN0IHYgPSBvcmlnaW5hbE9ialtrXVxuICAgIG9ialtrXSA9IG1hcEZuKHYpXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuIiwiaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3QgcHJpbWl0aXZlU2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxcbiAgbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkLFxuICBzdHJpbmdcbj4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L3ByaW1pdGl2ZUFzU3RyaW5nYCxcblxuICBzZXJpYWxpemUodmFsdWUpIHtcbiAgICAvLyBudW1iZXJcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFwibmFuXCJcbiAgICB9XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSArSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBcIitpbmZcIlxuICAgICAgY2FzZSAtSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBcIi1pbmZcIlxuICAgIH1cblxuICAgIC8vIGJpZ2ludFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgLy8gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuICB9LFxuXG4gIGRlc2VyaWFsaXplKHN0cikge1xuICAgIHN3aXRjaCAoc3RyKSB7XG4gICAgICBjYXNlIFwibmFuXCI6XG4gICAgICAgIHJldHVybiBOYU5cbiAgICAgIGNhc2UgXCIraW5mXCI6XG4gICAgICAgIHJldHVybiArSW5maW5pdHlcbiAgICAgIGNhc2UgXCItaW5mXCI6XG4gICAgICAgIHJldHVybiAtSW5maW5pdHlcbiAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEJpZ0ludChzdHIpXG4gICAgfVxuICB9LFxufVxuIiwiaW1wb3J0IHR5cGUgeyBPYnNlcnZhYmxlU2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3Qgc2V0U2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxTZXQ8YW55PiB8IE9ic2VydmFibGVTZXQ8YW55PiwgYW55W10+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9zZXRBc0FycmF5YCxcblxuICBzZXJpYWxpemUoc2V0LCBzZXJpYWxpemUpIHtcbiAgICBpZiAoIShzZXQgaW5zdGFuY2VvZiBTZXQpKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICBjb25zdCBhcnI6IGFueVtdID0gW11cblxuICAgIGNvbnN0IGl0ZXIgPSBzZXQua2V5cygpXG4gICAgbGV0IGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFjdXIuZG9uZSkge1xuICAgICAgY29uc3QgayA9IGN1ci52YWx1ZVxuICAgICAgYXJyLnB1c2goc2VyaWFsaXplKGspKVxuICAgICAgY3VyID0gaXRlci5uZXh0KClcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUoYXJyLCBkZXNlcmlhbGl6ZSkge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKVxuXG4gICAgY29uc3QgbGVuID0gYXJyLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBhcnJbaV1cbiAgICAgIHNldC5hZGQoZGVzZXJpYWxpemUoaykpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNldFxuICB9LFxufVxuIiwiaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uQ2FsbCB9IGZyb20gXCIuLi8uLi9hY3Rpb24vYXBwbHlBY3Rpb25cIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi8uLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNKU09OUHJpbWl0aXZlLCBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgSlNPTlByaW1pdGl2ZVZhbHVlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3R5cGVzXCJcbmltcG9ydCB7IGFycmF5U2VyaWFsaXplciB9IGZyb20gXCIuL2FycmF5U2VyaWFsaXplclwiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IGRhdGVTZXJpYWxpemVyIH0gZnJvbSBcIi4vZGF0ZVNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgbWFwU2VyaWFsaXplciB9IGZyb20gXCIuL21hcFNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgb2JqZWN0UGF0aFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9vYmplY3RQYXRoU2VyaWFsaXplclwiXG5pbXBvcnQgeyBvYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9vYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgcGxhaW5PYmplY3RTZXJpYWxpemVyIH0gZnJvbSBcIi4vcGxhaW5PYmplY3RTZXJpYWxpemVyXCJcbmltcG9ydCB7IHByaW1pdGl2ZVNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9wcmltaXRpdmVTZXJpYWxpemVyXCJcbmltcG9ydCB7IHNldFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9zZXRTZXJpYWxpemVyXCJcblxuY29uc3Qgc2VyaWFsaXplcnNBcnJheTogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxhbnksIGFueT5bXSA9IFtdXG5jb25zdCBzZXJpYWxpemVyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPGFueSwgYW55Pj4oKVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG5ldyBhY3Rpb24gY2FsbCBhcmd1bWVudCBzZXJpYWxpemVycy5cbiAqIFNlcmlhbGl6ZXJzIGFyZSBjYWxsZWQgaW4gdGhlIGludmVyc2Ugb3JkZXIgdGhleSBhcmUgcmVnaXN0ZXJlZCwgbWVhbmluZyB0aGVcbiAqIGxhdGVzdCBvbmUgcmVnaXN0ZXJlZCB3aWxsIGJlIGNhbGxlZCBmaXJzdC5cbiAqXG4gKiBAcGFyYW0gc2VyaWFsaXplciBTZXJpYWxpemVyIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSBkaXNwb3NlciB0byB1bnJlZ2lzdGVyIHRoZSBzZXJpYWxpemVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKFxuICBzZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPGFueSwgYW55PlxuKTogKCkgPT4gdm9pZCB7XG4gIHJlZ2lzdGVyRGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzKClcblxuICBpZiAoc2VyaWFsaXplcnNBcnJheS5pbmNsdWRlcyhzZXJpYWxpemVyKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhY3Rpb24gY2FsbCBhcmd1bWVudCBzZXJpYWxpemVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKVxuICB9XG4gIGlmIChzZXJpYWxpemVyc01hcC5oYXMoc2VyaWFsaXplci5pZCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBhY3Rpb24gY2FsbCBhcmd1bWVudCBzZXJpYWxpemVyIHdpdGggaWQgJyR7c2VyaWFsaXplci5pZH0nIGFscmVhZHkgcmVnaXN0ZXJlZGApXG4gIH1cblxuICBzZXJpYWxpemVyc0FycmF5LnVuc2hpZnQoc2VyaWFsaXplcilcbiAgc2VyaWFsaXplcnNNYXAuc2V0KHNlcmlhbGl6ZXIuaWQsIHNlcmlhbGl6ZXIpXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHNlcmlhbGl6ZXJzQXJyYXkuaW5kZXhPZihzZXJpYWxpemVyKVxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBzZXJpYWxpemVyc0FycmF5LnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gICAgc2VyaWFsaXplcnNNYXAuZGVsZXRlKHNlcmlhbGl6ZXIuaWQpXG4gIH1cbn1cblxuLyoqXG4gKiBTZXJpYWxpemVkIGFjdGlvbiBjYWxsIGFyZ3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnQge1xuICAvKipcbiAgICogU2VyaWFsaXplciBpZC5cbiAgICovXG4gIHJlYWRvbmx5ICRtb2J4S2V5c3RvbmVTZXJpYWxpemVyOiBzdHJpbmdcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogYW55XG59XG5cbi8qKlxuICogQSBzZXJpYWxpemVkIGFjdGlvbiBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRBY3Rpb25DYWxsIGV4dGVuZHMgT21pdDxBY3Rpb25DYWxsLCBcInNlcmlhbGl6ZWRcIj4ge1xuICAvKipcbiAgICogU2VyaWFsaXplZCBhY3Rpb24gYXJndW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJnczogUmVhZG9ubHlBcnJheTxTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50IHwgSlNPTlByaW1pdGl2ZVZhbHVlPlxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGlzIGFjdGlvbiBjYWxsIGFzIHNlcmlhbGl6ZWQuXG4gICAqL1xuICBzZXJpYWxpemVkOiB0cnVlXG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhbiBhY3Rpb24gY2FsbCBhcmd1bWVudCBieSByZXR1cm5pbmcgYSBgU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudGAuXG4gKiBUaGUgZm9sbG93aW5nIGFyZSBzdXBwb3J0ZWQgb3V0IG9mIHRoZSBib3g6XG4gKiAtIFByaW1pdGl2ZXMuXG4gKiAtIE5vZGVzIHRoYXQgYXJlIHVuZGVyIHRoZSBzYW1lIHJvb3Qgbm9kZSBhcyB0aGUgdGFyZ2V0IHJvb3QgKHdoZW4gcHJvdmlkZWQpIHdpbGwgYmUgc2VyaWFsaXplZFxuICogICBhcyBhIHBhdGguXG4gKiAtIE5vZGVzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUgc2FtZSByb290IG5vZGUgYXMgdGhlIHRhcmdldCByb290IHdpbGwgYmUgc2VyaWFsaXplZCBhcyB0aGVpciBzbmFwc2hvdC5cbiAqIC0gQXJyYXlzIChvYnNlcnZhYmxlIG9yIG5vdCkuXG4gKiAtIERhdGVzLlxuICogLSBNYXBzIChvYnNlcnZhYmxlIG9yIG5vdCkuXG4gKiAtIFNldHMgKG9ic2VydmFibGUgb3Igbm90KS5cbiAqIC0gUGxhaW4gb2JqZWN0cyAob2JzZXJ2YWJsZSBvciBub3QpLlxuICpcbiAqIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgc2VyaWFsaXplZCBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXJnVmFsdWUgQXJndW1lbnQgdmFsdWUgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBpdHMgc2VyaWFsaXphYmxlIGZvcm0uXG4gKiBAcGFyYW0gW3RhcmdldFJvb3RdIFRhcmdldCByb290IG5vZGUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoaXMgYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC5cbiAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemFibGUgZm9ybSBvZiB0aGUgcGFzc2VkIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KFxuICBhcmdWYWx1ZTogYW55LFxuICB0YXJnZXRSb290Pzogb2JqZWN0XG4pOiBTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50IHwgSlNPTlByaW1pdGl2ZVZhbHVlIHtcbiAgcmVnaXN0ZXJEZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnMoKVxuXG4gIGlmIChpc0pTT05QcmltaXRpdmUoYXJnVmFsdWUpKSB7XG4gICAgcmV0dXJuIGFyZ1ZhbHVlXG4gIH1cblxuICBjb25zdCBvcmlnVmFsdWUgPSBhcmdWYWx1ZVxuXG4gIGNvbnN0IHNlcmlhbGl6ZSA9ICh2OiBhbnkpID0+IHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudCh2LCB0YXJnZXRSb290KVxuXG4gIC8vIHRyeSBzZXJpYWxpemVyc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcmlhbGl6ZXJzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzZXJpYWxpemVyID0gc2VyaWFsaXplcnNBcnJheVtpXVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFyZ1ZhbHVlLCBzZXJpYWxpemUsIHRhcmdldFJvb3QpXG4gICAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY2Fubm90U2VyaWFsaXplKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAkbW9ieEtleXN0b25lU2VyaWFsaXplcjogc2VyaWFsaXplci5pZCxcbiAgICAgICAgdmFsdWU6IHNlcmlhbGl6ZWRWYWx1ZSxcbiAgICAgIH0gYXMgU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudFxuICAgIH1cbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudCBjb3VsZCBub3Qgc2VyaWFsaXplIHRoZSBnaXZlbiB2YWx1ZTogJHtvcmlnVmFsdWV9YClcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYW4gYWN0aW9uIGNhbGwgaXMgc2VyaWFsaXphYmxlIGJ5IG1hcHBpbmcgdGhlIGFjdGlvbiBhcmd1bWVudHMgaW50byBpdHNcbiAqIHNlcmlhbGl6YWJsZSB2ZXJzaW9uIGJ5IHVzaW5nIGBzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnRgLlxuICpcbiAqIEBwYXJhbSBhY3Rpb25DYWxsIEFjdGlvbiBjYWxsIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gW3RhcmdldFJvb3RdIFRhcmdldCByb290IG5vZGUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoaXMgYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC5cbiAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemFibGUgYWN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVBY3Rpb25DYWxsKFxuICBhY3Rpb25DYWxsOiBBY3Rpb25DYWxsLFxuICB0YXJnZXRSb290Pzogb2JqZWN0XG4pOiBTZXJpYWxpemVkQWN0aW9uQ2FsbCB7XG4gIGlmIChhY3Rpb25DYWxsLnNlcmlhbGl6ZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHNlcmlhbGl6ZSBhbiBhbHJlYWR5IHNlcmlhbGl6ZWQgYWN0aW9uIGNhbGxcIilcbiAgfVxuXG4gIGlmICh0YXJnZXRSb290ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldFJvb3QsIFwidGFyZ2V0Um9vdFwiKVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplID0gKHY6IGFueSkgPT4gc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KHYsIHRhcmdldFJvb3QpXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5hY3Rpb25DYWxsLFxuICAgIHNlcmlhbGl6ZWQ6IHRydWUsXG4gICAgYXJnczogYWN0aW9uQ2FsbC5hcmdzLm1hcChzZXJpYWxpemUpLFxuICB9XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhbiBhY3Rpb24gY2FsbCBhcmd1bWVudCBieSByZXR1cm5pbmcgaXRzIGRlc2VyaWFsaXplZCBlcXVpdmFsZW50LlxuICpcbiAqIEBwYXJhbSBhcmdWYWx1ZSBBcmd1bWVudCB2YWx1ZSB0byBiZSB0cmFuc2Zvcm1lZCBpbnRvIGl0cyBkZXNlcmlhbGl6ZWQgZm9ybS5cbiAqIEBwYXJhbSBbdGFyZ2V0Um9vdF0gVGFyZ2V0IHJvb3Qgbm9kZSBvZiB0aGUgbW9kZWwgd2hlcmUgdGhpcyBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBmb3JtIG9mIHRoZSBwYXNzZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudChcbiAgYXJnVmFsdWU6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnQgfCBKU09OUHJpbWl0aXZlVmFsdWUsXG4gIHRhcmdldFJvb3Q/OiBvYmplY3Rcbik6IGFueSB7XG4gIHJlZ2lzdGVyRGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzKClcblxuICBpZiAoaXNKU09OUHJpbWl0aXZlKGFyZ1ZhbHVlKSkge1xuICAgIHJldHVybiBhcmdWYWx1ZVxuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGFyZ1ZhbHVlKSB8fCB0eXBlb2YgYXJnVmFsdWUuJG1vYnhLZXlzdG9uZVNlcmlhbGl6ZXIgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiaW52YWxpZCBzZXJpYWxpemVkIGFjdGlvbiBjYWxsIGFyZ3VtZW50XCIpXG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVySWQgPSBhcmdWYWx1ZS4kbW9ieEtleXN0b25lU2VyaWFsaXplclxuICBjb25zdCBzZXJpYWxpemVyID0gc2VyaWFsaXplcnNNYXAuZ2V0KHNlcmlhbGl6ZXJJZClcblxuICBpZiAoIXNlcmlhbGl6ZXIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBhIHNlcmlhbGl6ZXIgd2l0aCBpZCAnJHtzZXJpYWxpemVySWR9JyBjb3VsZCBub3QgYmUgZm91bmRgKVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gYXJnVmFsdWUgYXMgU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudFxuXG4gIGNvbnN0IGRlc2VyaWFsaXplID0gKHY6IGFueSkgPT4gZGVzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQodiwgdGFyZ2V0Um9vdClcbiAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc2VyaWFsaXplZFZhbHVlLnZhbHVlLCBkZXNlcmlhbGl6ZSwgdGFyZ2V0Um9vdClcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYW4gYWN0aW9uIGNhbGwgaXMgZGVzZXJpYWxpemVkIGJ5IG1hcHBpbmcgdGhlIGFjdGlvbiBhcmd1bWVudHMgaW50byBpdHNcbiAqIGRlc2VyaWFsaXplZCB2ZXJzaW9uIGJ5IHVzaW5nIGBkZXNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudGAuXG4gKlxuICogQHBhcmFtIGFjdGlvbkNhbGwgQWN0aW9uIGNhbGwgdG8gY29udmVydC5cbiAqIEBwYXJhbSBbdGFyZ2V0Um9vdF0gVGFyZ2V0IHJvb3Qgbm9kZSBvZiB0aGUgbW9kZWwgd2hlcmUgdGhpcyBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBhY3Rpb24gY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQWN0aW9uQ2FsbChcbiAgYWN0aW9uQ2FsbDogU2VyaWFsaXplZEFjdGlvbkNhbGwsXG4gIHRhcmdldFJvb3Q/OiBvYmplY3Rcbik6IEFjdGlvbkNhbGwge1xuICBpZiAoIWFjdGlvbkNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgZGVzZXJpYWxpemUgYSBub24tc2VyaWFsaXplZCBhY3Rpb24gY2FsbFwiKVxuICB9XG5cbiAgaWYgKHRhcmdldFJvb3QgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3QodGFyZ2V0Um9vdCwgXCJ0YXJnZXRSb290XCIpXG4gIH1cblxuICBjb25zdCBkZXNlcmlhbGl6ZSA9ICh2OiBhbnkpID0+IGRlc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KHYsIHRhcmdldFJvb3QpXG4gIGNvbnN0IGRlc2VyaWFsaXplZEFjdGlvbkNhbGw6IEFjdGlvbkNhbGwgPSB7XG4gICAgLi4uYWN0aW9uQ2FsbCxcbiAgICBzZXJpYWxpemVkOiB1bmRlZmluZWQsXG4gICAgYXJnczogYWN0aW9uQ2FsbC5hcmdzLm1hcChkZXNlcmlhbGl6ZSksXG4gIH1cbiAgZGVsZXRlIChkZXNlcmlhbGl6ZWRBY3Rpb25DYWxsIGFzIE8uV3JpdGFibGU8QWN0aW9uQ2FsbD4pLnNlcmlhbGl6ZWRcbiAgcmV0dXJuIGRlc2VyaWFsaXplZEFjdGlvbkNhbGxcbn1cblxubGV0IGRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG5mdW5jdGlvbiByZWdpc3RlckRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVycygpIHtcbiAgaWYgKGRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnNSZWdpc3RlcmVkID0gdHJ1ZVxuXG4gIC8vIHNlcmlhbGl6ZXIgcmVnaXN0cmF0aW9uIChmcm9tIGxvdyBwcmlvcml0eSB0byBoaWdoIHByaW9yaXR5KVxuXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihwcmltaXRpdmVTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIocGxhaW5PYmplY3RTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIoc2V0U2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKG1hcFNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihkYXRlU2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKGFycmF5U2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKG9iamVjdFNuYXBzaG90U2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKG9iamVjdFBhdGhTZXJpYWxpemVyKVxufVxuIiwiaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhcHBseUFjdGlvbiB9IGZyb20gXCIuLi8uLi9hY3Rpb24vYXBwbHlBY3Rpb25cIlxuaW1wb3J0IHsgZnJvemVuS2V5IH0gZnJvbSBcIi4uLy4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuLi8uLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tIFwiLi4vLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBXcml0YWJsZVBhdGggfSBmcm9tIFwiLi4vLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IG9uUGF0Y2hlcyB9IGZyb20gXCIuLi8uLi9wYXRjaC9lbWl0UGF0Y2hcIlxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuLi8uLi9wYXRjaC9QYXRjaFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBkZXNlcmlhbGl6ZUFjdGlvbkNhbGwsIFNlcmlhbGl6ZWRBY3Rpb25DYWxsIH0gZnJvbSBcIi4vYWN0aW9uU2VyaWFsaXphdGlvblwiXG5cbi8qKlxuICogU2VyaWFsaXplZCBhY3Rpb24gY2FsbCB3aXRoIG1vZGVsIElEIG92ZXJyaWRlcy5cbiAqIENhbiBiZSBnZW5lcmF0ZWQgd2l0aCBgYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kVHJhY2tOZXdNb2RlbElkc2AuXG4gKiBUbyBiZSBhcHBsaWVkIHdpdGggYGFwcGx5U2VyaWFsaXplZEFjdGlvbkFuZFN5bmNOZXdNb2RlbElkc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZEFjdGlvbkNhbGxXaXRoTW9kZWxJZE92ZXJyaWRlcyBleHRlbmRzIFNlcmlhbGl6ZWRBY3Rpb25DYWxsIHtcbiAgLyoqXG4gICAqIE1vZGVsIElkIG92ZXJyaWRlcyB0byBiZSBhcHBsaWVkIGF0IHRoZSBlbmQgb2YgYXBwbHlpbmcgdGhlIGFjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGVsSWRPdmVycmlkZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+XG59XG5cbi8qKlxuICogQXBwbGllcyAocnVucykgYSBzZXJpYWxpemVkIGFjdGlvbiBvdmVyIGEgdGFyZ2V0IG9iamVjdC5cbiAqIEluIHRoaXMgbW9kZSBuZXdseSBnZW5lcmF0ZWQgLyBtb2RpZmllZCBtb2RlbCBJRHMgd2lsbCBiZSB0cmFja2VkXG4gKiBzbyB0aGV5IGNhbiBiZSBsYXRlciBzeW5jaHJvbml6ZWQgd2hlbiBhcHBseWluZyBpdCBvbiBhbm90aGVyIG1hY2hpbmVcbiAqIHZpYSBgYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kU3luY05ld01vZGVsSWRzYC5cbiAqIFRoaXMgbWVhbnMgdGhpcyBtZXRob2QgaXMgdXN1YWxseSB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBJZiB5b3UgaW50ZW5kIHRvIGFwcGx5IG5vbi1zZXJpYWxpemVkIGFjdGlvbnMgY2hlY2sgYGFwcGx5QWN0aW9uYCBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdCB0byBydW4gdGhlIGFjdGlvbiBvdmVyLlxuICogQHBhcmFtIGNhbGwgVGhlIHNlcmlhbGl6ZWQgYWN0aW9uLCB1c3VhbGx5IGFzIGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIvY2xpZW50LlxuICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLCBpZiBhbnksIHBsdXMgYSBuZXcgc2VyaWFsaXplZCBhY3Rpb25cbiAqIHdpdGggbW9kZWwgb3ZlcnJpZGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kVHJhY2tOZXdNb2RlbElkczxUUmV0ID0gYW55PihcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgY2FsbDogU2VyaWFsaXplZEFjdGlvbkNhbGxcbik6IHtcbiAgcmV0dXJuVmFsdWU6IFRSZXRcbiAgc2VyaWFsaXplZEFjdGlvbkNhbGw6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsV2l0aE1vZGVsSWRPdmVycmlkZXNcbn0ge1xuICBpZiAoIWNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgYXBwbHkgYSBub24tc2VyaWFsaXplZCBhY3Rpb24gY2FsbCwgdXNlICdhcHBseUFjdGlvbicgaW5zdGVhZFwiKVxuICB9XG5cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGNvbnN0IGRlc2VyaWFsaXplZENhbGwgPSBkZXNlcmlhbGl6ZUFjdGlvbkNhbGwoY2FsbCwgc3VidHJlZVJvb3QpXG5cbiAgY29uc3QgbW9kZWxJZE92ZXJyaWRlczogUGF0Y2hbXSA9IFtdXG5cbiAgLy8gc2V0IGEgcGF0Y2ggbGlzdGVuZXIgdG8gdHJhY2sgY2hhbmdlcyB0byBtb2RlbCBpZHNcbiAgY29uc3QgcGF0Y2hEaXNwb3NlciA9IG9uUGF0Y2hlcyhzdWJ0cmVlUm9vdCwgKHBhdGNoZXMpID0+IHtcbiAgICBzY2FuUGF0Y2hlc0Zvck1vZGVsSWRDaGFuZ2VzKHN1YnRyZWVSb290LCBtb2RlbElkT3ZlcnJpZGVzLCBwYXRjaGVzKVxuICB9KVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBhcHBseUFjdGlvbihzdWJ0cmVlUm9vdCwgZGVzZXJpYWxpemVkQ2FsbClcblxuICAgIHJldHVybiB7XG4gICAgICByZXR1cm5WYWx1ZSxcbiAgICAgIHNlcmlhbGl6ZWRBY3Rpb25DYWxsOiB7XG4gICAgICAgIC4uLmNhbGwsXG4gICAgICAgIG1vZGVsSWRPdmVycmlkZXMsXG4gICAgICB9LFxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwYXRjaERpc3Bvc2VyKClcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2FuUGF0Y2hlc0Zvck1vZGVsSWRDaGFuZ2VzKHJvb3Q6IG9iamVjdCwgbW9kZWxJZE92ZXJyaWRlczogUGF0Y2hbXSwgcGF0Y2hlczogUGF0Y2hbXSkge1xuICBjb25zdCBsZW4gPSBwYXRjaGVzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgcGF0Y2ggPSBwYXRjaGVzW2ldXG4gICAgaWYgKHBhdGNoLm9wID09PSBcInJlcGxhY2VcIiB8fCBwYXRjaC5vcCA9PT0gXCJhZGRcIikge1xuICAgICAgZGVlcFNjYW5WYWx1ZUZvck1vZGVsSWRDaGFuZ2VzKFxuICAgICAgICByb290LFxuICAgICAgICBtb2RlbElkT3ZlcnJpZGVzLFxuICAgICAgICBwYXRjaC52YWx1ZSxcbiAgICAgICAgcGF0Y2gucGF0aCBhcyBXcml0YWJsZVBhdGhcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVlcFNjYW5WYWx1ZUZvck1vZGVsSWRDaGFuZ2VzKFxuICByb290OiBvYmplY3QsXG4gIG1vZGVsSWRPdmVycmlkZXM6IFBhdGNoW10sXG4gIHZhbHVlOiBhbnksXG4gIHBhdGg6IFdyaXRhYmxlUGF0aFxuKSB7XG4gIGlmIChwYXRoLmxlbmd0aCA+PSAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIGVuc3VyZSB0aGUgcGFyZW50IGlzIGFuIGFjdHVhbCBtb2RlbFxuICAgIGNvbnN0IHBhcmVudCA9IHJlc29sdmVQYXRoKHJvb3QsIHBhdGguc2xpY2UoMCwgcGF0aC5sZW5ndGggLSAxKSkudmFsdWVcblxuICAgIGlmIChpc01vZGVsKHBhcmVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXVxuICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShwYXJlbnQuY29uc3RydWN0b3IgYXMgYW55KSkge1xuICAgICAgICAvLyBmb3VuZCBvbmVcbiAgICAgICAgbW9kZWxJZE92ZXJyaWRlcy5wdXNoKHtcbiAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgcGF0aDogcGF0aC5zbGljZSgpLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBsZW4gPSB2YWx1ZS5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBwYXRoLnB1c2goaSlcbiAgICAgIGRlZXBTY2FuVmFsdWVGb3JNb2RlbElkQ2hhbmdlcyhyb290LCBtb2RlbElkT3ZlcnJpZGVzLCB2YWx1ZVtpXSwgcGF0aClcbiAgICAgIHBhdGgucG9wKClcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgLy8gc2tpcCBmcm96ZW4gdmFsdWVzXG4gICAgaWYgKCF2YWx1ZVtmcm96ZW5LZXldKSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpXG4gICAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IGtleXNbaV1cbiAgICAgICAgY29uc3QgcHJvcFZhbHVlID0gdmFsdWVbcHJvcE5hbWVdXG5cbiAgICAgICAgcGF0aC5wdXNoKHByb3BOYW1lKVxuICAgICAgICBkZWVwU2NhblZhbHVlRm9yTW9kZWxJZENoYW5nZXMocm9vdCwgbW9kZWxJZE92ZXJyaWRlcywgcHJvcFZhbHVlLCBwYXRoKVxuICAgICAgICBwYXRoLnBvcCgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyAocnVucykgYSBzZXJpYWxpemVkIGFjdGlvbiBvdmVyIGEgdGFyZ2V0IG9iamVjdC5cbiAqIEluIHRoaXMgbW9kZSBuZXdseSBnZW5lcmF0ZWQgLyBtb2RpZmllZCBtb2RlbCBJRHMgcHJldmlvdXNseSB0cmFja2VkXG4gKiBieSBgYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kVHJhY2tOZXdNb2RlbElkc2Agd2lsbCBiZSBzeW5jaHJvbml6ZWQgYWZ0ZXJcbiAqIHRoZSBhY3Rpb24gaXMgYXBwbGllZC5cbiAqIFRoaXMgbWVhbnMgdGhpcyBtZXRob2QgaXMgdXN1YWxseSB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZS5cbiAqXG4gKiBJZiB5b3UgaW50ZW5kIHRvIGFwcGx5IG5vbi1zZXJpYWxpemVkIGFjdGlvbnMgY2hlY2sgYGFwcGx5QWN0aW9uYCBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdCB0byBydW4gdGhlIGFjdGlvbiBvdmVyLlxuICogQHBhcmFtIGNhbGwgVGhlIHNlcmlhbGl6ZWQgYWN0aW9uLCB1c3VhbGx5IGFzIGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIvY2xpZW50LlxuICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlcmlhbGl6ZWRBY3Rpb25BbmRTeW5jTmV3TW9kZWxJZHM8VFJldCA9IGFueT4oXG4gIHN1YnRyZWVSb290OiBvYmplY3QsXG4gIGNhbGw6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsV2l0aE1vZGVsSWRPdmVycmlkZXNcbik6IFRSZXQge1xuICBpZiAoIWNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgYXBwbHkgYSBub24tc2VyaWFsaXplZCBhY3Rpb24gY2FsbCwgdXNlICdhcHBseUFjdGlvbicgaW5zdGVhZFwiKVxuICB9XG5cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGNvbnN0IGRlc2VyaWFsaXplZENhbGwgPSBkZXNlcmlhbGl6ZUFjdGlvbkNhbGwoY2FsbCwgc3VidHJlZVJvb3QpXG5cbiAgbGV0IHJldHVyblZhbHVlOiBhbnlcbiAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgIHJldHVyblZhbHVlID0gYXBwbHlBY3Rpb24oc3VidHJlZVJvb3QsIGRlc2VyaWFsaXplZENhbGwpXG5cbiAgICAvLyBhcHBseSBtb2RlbCBpZCBvdmVycmlkZXNcbiAgICBhcHBseVBhdGNoZXMoc3VidHJlZVJvb3QsIGNhbGwubW9kZWxJZE92ZXJyaWRlcylcbiAgfSlcblxuICByZXR1cm4gcmV0dXJuVmFsdWVcbn1cbiIsImltcG9ydCB7XG4gIEFjdGlvbkNvbnRleHQsXG4gIEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLFxuICBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZSxcbn0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7XG4gIEFjdGlvbk1pZGRsZXdhcmUsXG4gIEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlcixcbiAgYWRkQWN0aW9uTWlkZGxld2FyZSxcbn0gZnJvbSBcIi4uL2FjdGlvbi9taWRkbGV3YXJlXCJcbmltcG9ydCB0eXBlIHsgRmxvd0ZpbmlzaGVyIH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEZsb3dcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogU2ltcGxpZmllZCB2ZXJzaW9uIG9mIGFjdGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZUFjdGlvbkNvbnRleHQge1xuICAvKipcbiAgICogQWN0aW9uIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZ1xuICAvKipcbiAgICogQWN0aW9uIHR5cGUsIHN5bmMgb3IgYXN5bmMuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZVxuICAvKipcbiAgICogQWN0aW9uIHRhcmdldCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldDogQW55TW9kZWxcbiAgLyoqXG4gICAqIEFycmF5IG9mIGFjdGlvbiBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBhcmdzOiBSZWFkb25seUFycmF5PGFueT5cbiAgLyoqXG4gICAqIFBhcmVudCBhY3Rpb24gY29udGV4dCwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50Q29udGV4dD86IFNpbXBsZUFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIFJvb3QgYWN0aW9uIGNvbnRleHQsIG9yIGl0c2VsZiBpZiB0aGUgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RDb250ZXh0OiBTaW1wbGVBY3Rpb25Db250ZXh0XG4gIC8qKlxuICAgKiBDdXN0b20gZGF0YSBmb3IgdGhlIGFjdGlvbiBjb250ZXh0IHRvIGJlIHNldCBieSBtaWRkbGV3YXJlcywgYW4gb2JqZWN0LlxuICAgKiBTeW1ib2xzIG11c3QgYmUgdXNlZCBhcyBrZXlzIHRvIGF2b2lkIG5hbWUgY2xhc2hpbmcgYmV0d2VlbiBtaWRkbGV3YXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE6IFJlY29yZDxzeW1ib2wsIGFueT5cbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJhY2tpbmcgbWlkZGxld2FyZSBmaW5pc2ggcmVzdWx0LlxuICovXG5leHBvcnQgZW51bSBBY3Rpb25UcmFja2luZ1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHJldHVybmVkIG5vcm1hbGx5ICh3aXRob3V0IHRocm93aW5nKS5cbiAgICovXG4gIFJldHVybiA9IFwicmV0dXJuXCIsXG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRocmV3IGFuIGVycm9yLlxuICAgKi9cbiAgVGhyb3cgPSBcInRocm93XCIsXG59XG5cbi8qKlxuICogQWN0aW9uIHRyYWNraW5nIG1pZGRsZXdhcmUgaG9va3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlIHtcbiAgLyoqXG4gICAqIEZpbHRlciBmdW5jdGlvbiBjYWxsZWQgd2hlbmV2ZXIgZWFjaCBhY3Rpb24gc3RhcnRzLCBhbmQgb25seSB0aGVuLlxuICAgKlxuICAgKiBJZiB0aGUgYWN0aW9uIGlzIGFjY2VwdGVkIHRoZW4gYG9uU3RhcnRgLCBgb25SZXN1bWVgLCBgb25TdXNwZW5kYCBhbmQgYG9uRmluaXNoYFxuICAgKiBmb3IgdGhhdCBwYXJ0aWN1bGFyIGFjdGlvbiB3aWxsIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQWxsIGFjdGlvbnMgYXJlIGFjY2VwdGVkIGJ5IGRlZmF1bHQgaWYgbm8gZmlsdGVyIGZ1bmN0aW9uIGlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICogQHJldHVybnMgdHJ1ZSB0byBhY2NlcHQgdGhlIGFjdGlvbiwgZmFsc2UgdG8gc2tpcCBpdC5cbiAgICovXG4gIGZpbHRlcj8oY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24ganVzdCBzdGFydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIENhbiBvcHRpb25hbGx5IHJldHVybiBhIHJlc3VsdCB0aGF0IHdpbGwgY2FuY2VsIHRoZSBvcmlnaW5hbCBhY3Rpb24gYW5kIGZpbmlzaCBpdFxuICAgKiB3aXRoIHRoZSByZXR1cm5lZCB2YWx1ZSAvIGVycm9yIHRvIGJlIHRocm93bi4gSW4gZWl0aGVyIGNhc2UgY2FzZSByZXN1bWUgLyBzdXNwZW5kIC8gZmluaXNoIHdpbGxcbiAgICogc3RpbGwgYmUgY2FsbGVkIG5vcm1hbGx5LlxuICAgKi9cbiAgb25TdGFydD8oY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogdm9pZCB8IEFjdGlvblRyYWNraW5nUmV0dXJuXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBqdXN0IHJlc3VtZWQgYSBzeW5jaHJvbm91cyBwaWVjZSBvZiBjb2RlIGV4ZWN1dGlvbi5cbiAgICogR2V0cyBjYWxsZWQgb25jZSBmb3Igc3luYyBhY3Rpb25zIGFuZCBtdWx0aXBsZSB0aW1lcyBmb3IgZmxvd3MuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICovXG4gIG9uUmVzdW1lPyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBqdXN0IGZpbmlzaGVkIGEgc3luY2hyb25vdXMgcGljZSBvZiBjb2RlIGV4ZWN1dGlvbi5cbiAgICogTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuIHRoZSBhY3Rpb24gaXMgZmluaXNoZWQuXG4gICAqIEdldHMgY2FsbGVkIG9uY2UgZm9yIHN5bmMgYWN0aW9ucyBhbmQgbXVsdGlwbGUgdGltZXMgZm9yIGZsb3dzLlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gICAqL1xuICBvblN1c3BlbmQ/KGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IHZvaWRcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIGp1c3QgZmluaXNoZWQsIGVpdGhlciBieSByZXR1cm5pbmcgbm9ybWFsbHkgb3IgYnkgdGhyb3dpbmcgYW4gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICogQHBhcmFtIHJldCBBY3Rpb24gcmV0dXJuIHJlc3VsdC5cbiAgICogQHJldHVybnMgQ2FuIG9wdGlvbmFsbHkgcmV0dXJuIGEgbmV3IHJlc3VsdCB0aGF0IHdpbGwgb3ZlcnJpZGUgdGhlIG9yaWdpbmFsIG9uZS5cbiAgICovXG4gIG9uRmluaXNoPyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQsIHJldDogQWN0aW9uVHJhY2tpbmdSZXR1cm4pOiB2b2lkIHwgQWN0aW9uVHJhY2tpbmdSZXR1cm5cbn1cblxuLyoqXG4gKiBSZXR1cm4gcmVzdWx0IG9mIGFuIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25UcmFja2luZ1JldHVybiB7XG4gIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHRcbiAgdmFsdWU6IGFueVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYWN0aW9uIHRyYWNraW5nIG1pZGRsZXdhcmUsIHdoaWNoIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgc3RhbmRhcmQgYWN0aW9uIG1pZGRsZXdhcmUuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIGhvb2tzIE1pZGRsZXdhcmUgaG9va3MuXG4gKiBAcmV0dXJucyBUaGUgbWlkZGxld2FyZSBkaXNwb3Nlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgaG9va3M6IEFjdGlvblRyYWNraW5nTWlkZGxld2FyZVxuKTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGNvbnN0IGRhdGFTeW1ib2wgPSBTeW1ib2woXCJhY3Rpb25UcmFja2luZ01pZGRsZXdhcmVEYXRhXCIpXG5cbiAgZW51bSBTdGF0ZSB7XG4gICAgSWRsZSA9IFwiaWRsZVwiLFxuICAgIFN0YXJ0ZWQgPSBcInN0YXJ0ZWRcIixcbiAgICBSZWFsUmVzdW1lZCA9IFwicmVhbFJlc3VtZWRcIixcbiAgICBGYWtlUmVzdW1lZCA9IFwiZmFrZVJlc3VtZWRcIixcbiAgICBTdXNwZW5kZWQgPSBcInN1c3BlbmRlZFwiLFxuICAgIEZpbmlzaGVkID0gXCJmaW5pc2hlZFwiLFxuICB9XG5cbiAgaW50ZXJmYWNlIERhdGEge1xuICAgIHN0YXJ0QWNjZXB0ZWQ6IGJvb2xlYW5cbiAgICBzdGF0ZTogU3RhdGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEN0eERhdGEoY3R4OiBBY3Rpb25Db250ZXh0IHwgU2ltcGxlQWN0aW9uQ29udGV4dCk6IERhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjdHguZGF0YVtkYXRhU3ltYm9sXVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0Q3R4RGF0YShjdHg6IEFjdGlvbkNvbnRleHQgfCBTaW1wbGVBY3Rpb25Db250ZXh0LCBwYXJ0aWFsRGF0YTogUGFydGlhbDxEYXRhPikge1xuICAgIGxldCBjdXJyZW50RGF0YSA9IGN0eC5kYXRhW2RhdGFTeW1ib2xdXG4gICAgaWYgKCFjdXJyZW50RGF0YSkge1xuICAgICAgY3R4LmRhdGFbZGF0YVN5bWJvbF0gPSBwYXJ0aWFsRGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuYXNzaWduKGN1cnJlbnREYXRhLCBwYXJ0aWFsRGF0YSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB1c2VyRmlsdGVyOiBBY3Rpb25NaWRkbGV3YXJlW1wiZmlsdGVyXCJdID0gKGN0eCkgPT4ge1xuICAgIGlmIChob29rcy5maWx0ZXIpIHtcbiAgICAgIHJldHVybiBob29rcy5maWx0ZXIoc2ltcGxpZnlBY3Rpb25Db250ZXh0KGN0eCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0IHJlc3VtZVN1c3BlbmRTdXBwb3J0ID0gISFob29rcy5vblJlc3VtZSB8fCAhIWhvb2tzLm9uU3VzcGVuZFxuXG4gIGNvbnN0IGZpbHRlcjogQWN0aW9uTWlkZGxld2FyZVtcImZpbHRlclwiXSA9IChjdHgpID0+IHtcbiAgICBpZiAoY3R4LnR5cGUgPT09IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMpIHtcbiAgICAgIC8vIHN0YXJ0IGFuZCBmaW5pc2ggaXMgb24gdGhlIHNhbWUgY29udGV4dFxuICAgICAgY29uc3QgYWNjZXB0ZWQgPSB1c2VyRmlsdGVyKGN0eClcbiAgICAgIGlmIChhY2NlcHRlZCkge1xuICAgICAgICBzZXRDdHhEYXRhKGN0eCwge1xuICAgICAgICAgIHN0YXJ0QWNjZXB0ZWQ6IHRydWUsXG4gICAgICAgICAgc3RhdGU6IFN0YXRlLklkbGUsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjZXB0ZWRcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChjdHguYXN5bmNTdGVwVHlwZSkge1xuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlNwYXduOlxuICAgICAgICAgIGNvbnN0IGFjY2VwdGVkID0gdXNlckZpbHRlcihjdHgpXG4gICAgICAgICAgaWYgKGFjY2VwdGVkKSB7XG4gICAgICAgICAgICBzZXRDdHhEYXRhKGN0eCwge1xuICAgICAgICAgICAgICBzdGFydEFjY2VwdGVkOiB0cnVlLFxuICAgICAgICAgICAgICBzdGF0ZTogU3RhdGUuSWRsZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2NlcHRlZFxuXG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmV0dXJuOlxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlRocm93OlxuICAgICAgICAgIC8vIGRlcGVuZHMgaWYgdGhlIHNwYXduIG9uZSB3YXMgYWNjZXB0ZWQgb3Igbm90XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGdldEN0eERhdGEoY3R4LnNwYXduQXN5bmNTdGVwQ29udGV4dCEpXG4gICAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhLnN0YXJ0QWNjZXB0ZWQgOiBmYWxzZVxuXG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lOlxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJlc3VtZUVycm9yOlxuICAgICAgICAgIGlmICghcmVzdW1lU3VzcGVuZFN1cHBvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBkZXBlbmRzIGlmIHRoZSBzcGF3biBvbmUgd2FzIGFjY2VwdGVkIG9yIG5vdFxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGdldEN0eERhdGEoY3R4LnNwYXduQXN5bmNTdGVwQ29udGV4dCEpXG4gICAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGEuc3RhcnRBY2NlcHRlZCA6IGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSAoc2ltcGxlQ3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogQWN0aW9uVHJhY2tpbmdSZXR1cm4gfCB1bmRlZmluZWQgPT4ge1xuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogU3RhdGUuU3RhcnRlZCxcbiAgICB9KVxuICAgIGlmIChob29rcy5vblN0YXJ0KSB7XG4gICAgICByZXR1cm4gaG9va3Mub25TdGFydChzaW1wbGVDdHgpIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBmaW5pc2ggPSAoXG4gICAgc2ltcGxlQ3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LFxuICAgIHJldDogQWN0aW9uVHJhY2tpbmdSZXR1cm5cbiAgKTogQWN0aW9uVHJhY2tpbmdSZXR1cm4gPT4ge1xuICAgIC8vIGZha2VseSByZXN1bWUgYW5kIHN1c3BlbmQgdGhlIHBhcmVudCBpZiBuZWVkZWRcbiAgICBjb25zdCBwYXJlbnRDdHggPSBzaW1wbGVDdHgucGFyZW50Q29udGV4dFxuICAgIGxldCBwYXJlbnRSZXN1bWVkID0gZmFsc2VcbiAgICBpZiAocGFyZW50Q3R4KSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gZ2V0Q3R4RGF0YShwYXJlbnRDdHgpXG4gICAgICBpZiAocGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLnN0YXJ0QWNjZXB0ZWQgJiYgcGFyZW50RGF0YS5zdGF0ZSA9PT0gU3RhdGUuU3VzcGVuZGVkKSB7XG4gICAgICAgIHBhcmVudFJlc3VtZWQgPSB0cnVlXG4gICAgICAgIHJlc3VtZShwYXJlbnRDdHgsIGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogU3RhdGUuRmluaXNoZWQsXG4gICAgfSlcblxuICAgIGlmIChob29rcy5vbkZpbmlzaCkge1xuICAgICAgcmV0ID0gaG9va3Mub25GaW5pc2goc2ltcGxlQ3R4LCByZXQpIHx8IHJldFxuICAgIH1cblxuICAgIGlmIChwYXJlbnRSZXN1bWVkKSB7XG4gICAgICBzdXNwZW5kKHBhcmVudEN0eCEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgY29uc3QgcmVzdW1lID0gKHNpbXBsZUN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCwgcmVhbDogYm9vbGVhbikgPT4ge1xuICAgIC8vIGVuc3VyZSBwYXJlbnRzIGFyZSByZXN1bWVkXG4gICAgY29uc3QgcGFyZW50Q3R4ID0gc2ltcGxlQ3R4LnBhcmVudENvbnRleHRcbiAgICBpZiAocGFyZW50Q3R4KSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gZ2V0Q3R4RGF0YShwYXJlbnRDdHgpXG4gICAgICBpZiAocGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLnN0YXJ0QWNjZXB0ZWQgJiYgcGFyZW50RGF0YS5zdGF0ZSA9PT0gU3RhdGUuU3VzcGVuZGVkKSB7XG4gICAgICAgIHJlc3VtZShwYXJlbnRDdHgsIGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogcmVhbCA/IFN0YXRlLlJlYWxSZXN1bWVkIDogU3RhdGUuRmFrZVJlc3VtZWQsXG4gICAgfSlcbiAgICBpZiAoaG9va3Mub25SZXN1bWUpIHtcbiAgICAgIGhvb2tzLm9uUmVzdW1lKHNpbXBsZUN0eClcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdXNwZW5kID0gKHNpbXBsZUN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCkgPT4ge1xuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogU3RhdGUuU3VzcGVuZGVkLFxuICAgIH0pXG4gICAgaWYgKGhvb2tzLm9uU3VzcGVuZCkge1xuICAgICAgaG9va3Mub25TdXNwZW5kKHNpbXBsZUN0eClcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgcGFyZW50cyBhcmUgc3VzcGVuZGVkIGlmIHRoZXkgd2VyZSBmYWtlbHkgcmVzdW1lZFxuICAgIGNvbnN0IHBhcmVudEN0eCA9IHNpbXBsZUN0eC5wYXJlbnRDb250ZXh0XG4gICAgaWYgKHBhcmVudEN0eCkge1xuICAgICAgY29uc3QgcGFyZW50RGF0YSA9IGdldEN0eERhdGEocGFyZW50Q3R4KVxuICAgICAgaWYgKHBhcmVudERhdGEgJiYgcGFyZW50RGF0YS5zdGFydEFjY2VwdGVkICYmIHBhcmVudERhdGEuc3RhdGUgPT09IFN0YXRlLkZha2VSZXN1bWVkKSB7XG4gICAgICAgIHN1c3BlbmQocGFyZW50Q3R4KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG13YXJlOiBBY3Rpb25NaWRkbGV3YXJlW1wibWlkZGxld2FyZVwiXSA9IChjdHgsIG5leHQpID0+IHtcbiAgICBjb25zdCBzaW1wbGVDdHggPSBzaW1wbGlmeUFjdGlvbkNvbnRleHQoY3R4KVxuXG4gICAgY29uc3Qgb3JpZ05leHQgPSBuZXh0XG4gICAgbmV4dCA9ICgpID0+IHtcbiAgICAgIHJlc3VtZShzaW1wbGVDdHgsIHRydWUpXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZ05leHQoKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3VzcGVuZChzaW1wbGVDdHgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN0eC50eXBlID09PSBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jKSB7XG4gICAgICBsZXQgcmV0T2JqID0gc3RhcnQoc2ltcGxlQ3R4KVxuXG4gICAgICBpZiAocmV0T2JqKSB7XG4gICAgICAgIC8vIGFjdGlvbiBjYW5jZWxlZCAvIG92ZXJyaWRkZW4gYnkgb25TdGFydFxuICAgICAgICByZXN1bWUoc2ltcGxlQ3R4LCB0cnVlKVxuICAgICAgICBzdXNwZW5kKHNpbXBsZUN0eClcbiAgICAgICAgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwgcmV0T2JqKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCB7IHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuLCB2YWx1ZTogbmV4dCgpIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldE9iaiA9IGZpbmlzaChzaW1wbGVDdHgsIHsgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdywgdmFsdWU6IGVyciB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5PclRocm93QWN0aW9uVHJhY2tpbmdSZXR1cm4ocmV0T2JqKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhc3luY1xuXG4gICAgICBzd2l0Y2ggKGN0eC5hc3luY1N0ZXBUeXBlKSB7XG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuU3Bhd246IHtcbiAgICAgICAgICBsZXQgcmV0T2JqID0gc3RhcnQoc2ltcGxlQ3R4KVxuICAgICAgICAgIGlmIChyZXRPYmopIHtcbiAgICAgICAgICAgIC8vIGFjdGlvbiBjYW5jZWxlZCAvIG92ZXJyaWRkZW4gYnkgb25TdGFydFxuICAgICAgICAgICAgcmVzdW1lKHNpbXBsZUN0eCwgdHJ1ZSlcbiAgICAgICAgICAgIHN1c3BlbmQoc2ltcGxlQ3R4KVxuICAgICAgICAgICAgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwgcmV0T2JqKVxuICAgICAgICAgICAgcmV0dXJuIHJldHVybk9yVGhyb3dBY3Rpb25UcmFja2luZ1JldHVybihyZXRPYmopXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJldHVybjoge1xuICAgICAgICAgIGNvbnN0IGZsb3dGaW5pc2hlcjogRmxvd0ZpbmlzaGVyID0gbmV4dCgpXG4gICAgICAgICAgY29uc3QgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwge1xuICAgICAgICAgICAgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdC5SZXR1cm4sXG4gICAgICAgICAgICB2YWx1ZTogZmxvd0ZpbmlzaGVyLnZhbHVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLnJlc29sdXRpb24gPVxuICAgICAgICAgICAgcmV0T2JqLnJlc3VsdCA9PT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuID8gXCJhY2NlcHRcIiA6IFwicmVqZWN0XCJcbiAgICAgICAgICBmbG93RmluaXNoZXIudmFsdWUgPSByZXRPYmoudmFsdWVcbiAgICAgICAgICByZXR1cm4gZmxvd0ZpbmlzaGVyXG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlRocm93OiB7XG4gICAgICAgICAgY29uc3QgZmxvd0ZpbmlzaGVyOiBGbG93RmluaXNoZXIgPSBuZXh0KClcbiAgICAgICAgICBjb25zdCByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCB7XG4gICAgICAgICAgICByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93LFxuICAgICAgICAgICAgdmFsdWU6IGZsb3dGaW5pc2hlci52YWx1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGZsb3dGaW5pc2hlci5yZXNvbHV0aW9uID1cbiAgICAgICAgICAgIHJldE9iai5yZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlJldHVybiA/IFwiYWNjZXB0XCIgOiBcInJlamVjdFwiXG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLnZhbHVlID0gcmV0T2JqLnZhbHVlXG4gICAgICAgICAgcmV0dXJuIGZsb3dGaW5pc2hlclxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWU6XG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lRXJyb3I6XG4gICAgICAgICAgaWYgKHJlc3VtZVN1c3BlbmRTdXBwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgICAgIGBhc3NlcnRpb24gZXJyb3I6IGFzeW5jIHN0ZXAgc2hvdWxkIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQgLSAke2N0eC5hc3luY1N0ZXBUeXBlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgICAgYGFzc2VydGlvbiBlcnJvcjogYXN5bmMgc3RlcCBzaG91bGQgaGF2ZSBiZWVuIGZpbHRlcmVkIG91dCAtICR7Y3R4LmFzeW5jU3RlcFR5cGV9YFxuICAgICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWRkQWN0aW9uTWlkZGxld2FyZSh7IG1pZGRsZXdhcmU6IG13YXJlLCBmaWx0ZXIsIHN1YnRyZWVSb290OiBzdWJ0cmVlUm9vdCB9KVxufVxuXG5mdW5jdGlvbiByZXR1cm5PclRocm93QWN0aW9uVHJhY2tpbmdSZXR1cm4ocmV0T2JqOiBBY3Rpb25UcmFja2luZ1JldHVybikge1xuICBpZiAocmV0T2JqLnJlc3VsdCA9PT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuKSB7XG4gICAgcmV0dXJuIHJldE9iai52YWx1ZVxuICB9IGVsc2Uge1xuICAgIHRocm93IHJldE9iai52YWx1ZVxuICB9XG59XG5cbmNvbnN0IHNpbXBsZURhdGFDb250ZXh0U3ltYm9sID0gU3ltYm9sKFwic2ltcGxlRGF0YUNvbnRleHRcIilcblxuLyoqXG4gKiBTaW1wbGlmaWVzIGFuIGFjdGlvbiBjb250ZXh0IGJ5IGNvbnZlcnRpbmcgYW4gYXN5bmMgY2FsbCBoaWVyYXJjaHkgaW50byBhIHNpbXBsZXIgb25lLlxuICpcbiAqIEBwYXJhbSBjdHggQWN0aW9uIGNvbnRleHQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeUFjdGlvbkNvbnRleHQoY3R4OiBBY3Rpb25Db250ZXh0KTogU2ltcGxlQWN0aW9uQ29udGV4dCB7XG4gIHdoaWxlIChjdHgucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0KSB7XG4gICAgY3R4ID0gY3R4LnByZXZpb3VzQXN5bmNTdGVwQ29udGV4dFxuICB9XG5cbiAgbGV0IHNpbXBsZUN0eCA9IGN0eC5kYXRhW3NpbXBsZURhdGFDb250ZXh0U3ltYm9sXVxuICBpZiAoIXNpbXBsZUN0eCkge1xuICAgIGNvbnN0IHBhcmVudENvbnRleHQgPSBjdHgucGFyZW50Q29udGV4dCA/IHNpbXBsaWZ5QWN0aW9uQ29udGV4dChjdHgucGFyZW50Q29udGV4dCkgOiB1bmRlZmluZWRcblxuICAgIHNpbXBsZUN0eCA9IHtcbiAgICAgIGFjdGlvbk5hbWU6IGN0eC5hY3Rpb25OYW1lLFxuICAgICAgdHlwZTogY3R4LnR5cGUsXG4gICAgICB0YXJnZXQ6IGN0eC50YXJnZXQsXG4gICAgICBhcmdzOiBjdHguYXJncyxcbiAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgcGFyZW50Q29udGV4dCxcbiAgICB9XG4gICAgc2ltcGxlQ3R4LnJvb3RDb250ZXh0ID0gcGFyZW50Q29udGV4dCA/IHBhcmVudENvbnRleHQucm9vdENvbnRleHQgOiBzaW1wbGVDdHhcblxuICAgIGN0eC5kYXRhW3NpbXBsZURhdGFDb250ZXh0U3ltYm9sXSA9IHNpbXBsZUN0eFxuICB9XG4gIHJldHVybiBzaW1wbGVDdHhcbn1cbiIsImltcG9ydCB0eXBlIHsgQWN0aW9uQ2FsbCB9IGZyb20gXCIuLi9hY3Rpb24vYXBwbHlBY3Rpb25cIlxuaW1wb3J0IHsgaXNIb29rQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9ob29rQWN0aW9uc1wiXG5pbXBvcnQgdHlwZSB7IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB9IGZyb20gXCIuLi9hY3Rpb24vbWlkZGxld2FyZVwiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLFxuICBBY3Rpb25UcmFja2luZ1JldHVybixcbiAgU2ltcGxlQWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4vYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlXCJcbmltcG9ydCB7IHJvb3RQYXRoVG9UYXJnZXRQYXRoSWRzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEF0dGFjaGVzIGFuIGFjdGlvbiBtaWRkbGV3YXJlIHRoYXQgaW52b2tlcyBhIGxpc3RlbmVyIGZvciBhbGwgYWN0aW9ucyBvZiBhIGdpdmVuIHRyZWUuXG4gKiBOb3RlIHRoYXQgdGhlIGxpc3RlbmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciB0aGUgdG9wbW9zdCBsZXZlbCBhY3Rpb25zLCBzbyBpdCB3b24ndCBydW4gZm9yIGNoaWxkIGFjdGlvbnMgb3IgaW50ZXJtZWRpYXJ5IGZsb3cgc3RlcHMuXG4gKiBBbHNvIGl0IHdvbid0IHRyaWdnZXIgdGhlIGxpc3RlbmVyIGZvciBjYWxscyB0byBob29rcyBzdWNoIGFzIGBvbkF0dGFjaGVkVG9Sb290U3RvcmVgIG9yIGl0cyByZXR1cm5lZCBkaXNwb3Nlci5cbiAqXG4gKiBJdHMgbWFpbiB1c2UgaXMgdG8ga2VlcCB0cmFjayBvZiB0b3AgbGV2ZWwgYWN0aW9ucyB0aGF0IGNhbiBiZSBsYXRlciByZXBsaWNhdGVkIHZpYSBgYXBwbHlBY3Rpb25gIHNvbWV3aGVyZSBlbHNlIChhbm90aGVyIG1hY2hpbmUsIGV0Yy4pLlxuICpcbiAqIFRoZXJlIGFyZSB0d28ga2luZCBvZiBwb3NzaWJsZSBsaXN0ZW5lcnMsIGBvblN0YXJ0YCBhbmQgYG9uRmluaXNoYCBsaXN0ZW5lcnMuXG4gKiBgb25TdGFydGAgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYmVmb3JlIHRoZSBhY3Rpb24gZXhlY3V0ZXMgYW5kIGFsbG93IGNhbmNlbGxhdGlvbiBieSByZXR1cm5pbmcgYSBuZXcgcmV0dXJuIHZhbHVlICh3aGljaCBtaWdodCBiZSBhIHJldHVybiBvciBhIHRocm93KS5cbiAqIGBvbkZpbmlzaGAgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRlcywgaGF2ZSBhY2Nlc3MgdG8gdGhlIGFjdGlvbiBhY3R1YWwgcmV0dXJuIHZhbHVlIGFuZCBhbGxvdyBvdmVycmlkaW5nIGJ5IHJldHVybmluZyBhXG4gKiBuZXcgcmV0dXJuIHZhbHVlICh3aGljaCBtaWdodCBiZSBhIHJldHVybiBvciBhIHRocm93KS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0dWFsIGFjdGlvbiBjYWxscyBhcmUgc2VyaWFsaXphYmxlIHlvdSBzaG91bGQgdXNlIGVpdGhlciBgc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50YCBvdmVyIHRoZSBhcmd1bWVudHNcbiAqIG9yIGBzZXJpYWxpemVBY3Rpb25DYWxsYCBvdmVyIHRoZSB3aG9sZSBhY3Rpb24gYmVmb3JlIHNlbmRpbmcgdGhlIGFjdGlvbiBjYWxsIG92ZXIgdGhlIHdpcmUgLyBzdG9yaW5nIHRoZW0gLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBsaXN0ZW5lcnMgTGlzdGVuZXIgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5dGltZSBhIHRvcG1vc3QgYWN0aW9uIGlzIGludm9rZWQgb24gdGhlIG1vZGVsIG9yIGFueSBjaGlsZHJlbi5cbiAqIEByZXR1cm5zIFRoZSBtaWRkbGV3YXJlIGRpc3Bvc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25BY3Rpb25NaWRkbGV3YXJlKFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0LFxuICBsaXN0ZW5lcnM6IHtcbiAgICBvblN0YXJ0PzogKFxuICAgICAgYWN0aW9uQ2FsbDogQWN0aW9uQ2FsbCxcbiAgICAgIGFjdGlvbkNvbnRleHQ6IFNpbXBsZUFjdGlvbkNvbnRleHRcbiAgICApID0+IHZvaWQgfCBBY3Rpb25UcmFja2luZ1JldHVyblxuICAgIG9uRmluaXNoPzogKFxuICAgICAgYWN0aW9uQ2FsbDogQWN0aW9uQ2FsbCxcbiAgICAgIGFjdGlvbkNvbnRleHQ6IFNpbXBsZUFjdGlvbkNvbnRleHQsXG4gICAgICByZXQ6IEFjdGlvblRyYWNraW5nUmV0dXJuXG4gICAgKSA9PiB2b2lkIHwgQWN0aW9uVHJhY2tpbmdSZXR1cm5cbiAgfVxuKTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuICBhc3NlcnRJc09iamVjdChsaXN0ZW5lcnMsIFwibGlzdGVuZXJzXCIpXG5cbiAgcmV0dXJuIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShzdWJ0cmVlUm9vdCwge1xuICAgIGZpbHRlcihjdHgpIHtcbiAgICAgIGlmIChjdHgucGFyZW50Q29udGV4dCkge1xuICAgICAgICAvLyBzdWItYWN0aW9uLCBkbyBub3RoaW5nXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBza2lwIGhvb2tzXG4gICAgICBpZiAoaXNIb29rQWN0aW9uKGN0eC5hY3Rpb25OYW1lKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgb25TdGFydChjdHgpIHtcbiAgICAgIGlmIChsaXN0ZW5lcnMub25TdGFydCkge1xuICAgICAgICBjb25zdCBhY3Rpb25DYWxsID0gYWN0aW9uQ29udGV4dFRvQWN0aW9uQ2FsbChjdHgpXG4gICAgICAgIHJldHVybiBsaXN0ZW5lcnMub25TdGFydChhY3Rpb25DYWxsLCBjdHgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uRmluaXNoKGN0eCwgcmV0KSB7XG4gICAgICBpZiAobGlzdGVuZXJzLm9uRmluaXNoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkNhbGwgPSBhY3Rpb25Db250ZXh0VG9BY3Rpb25DYWxsKGN0eClcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVycy5vbkZpbmlzaChhY3Rpb25DYWxsLCBjdHgsIHJldClcbiAgICAgIH1cbiAgICB9LFxuICB9KVxufVxuXG5mdW5jdGlvbiBhY3Rpb25Db250ZXh0VG9BY3Rpb25DYWxsKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IEFjdGlvbkNhbGwge1xuICBjb25zdCByb290UGF0aCA9IGZhc3RHZXRSb290UGF0aChjdHgudGFyZ2V0KVxuXG4gIHJldHVybiB7XG4gICAgYWN0aW9uTmFtZTogY3R4LmFjdGlvbk5hbWUsXG4gICAgYXJnczogY3R4LmFyZ3MsXG4gICAgdGFyZ2V0UGF0aDogcm9vdFBhdGgucGF0aCxcbiAgICB0YXJnZXRQYXRoSWRzOiByb290UGF0aFRvVGFyZ2V0UGF0aElkcyhyb290UGF0aCksXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzSG9va0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vaG9va0FjdGlvbnNcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQge1xuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUsXG4gIEFjdGlvblRyYWNraW5nUmVzdWx0LFxuICBTaW1wbGVBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi9hY3Rpb25UcmFja2luZ01pZGRsZXdhcmVcIlxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciByZWFkb25seSBtaWRkbGV3YXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRvbmx5TWlkZGxld2FyZVJldHVybiB7XG4gIGFsbG93V3JpdGU8Uj4oZm46ICgpID0+IFIpOiBSXG5cbiAgZGlzcG9zZTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyXG59XG5cbi8qKlxuICogQXR0YWNoZXMgYW4gYWN0aW9uIG1pZGRsZXdhcmUgdGhhdCB3aWxsIHRocm93IHdoZW4gYW55IGFjdGlvbiBpcyBzdGFydGVkXG4gKiBvdmVyIHRoZSBub2RlIG9yIGFueSBvZiB0aGUgY2hpbGQgbm9kZXMsIHRodXMgZWZmZWN0aXZlbHkgbWFraW5nIHRoZSBzdWJ0cmVlXG4gKiByZWFkb25seS5cbiAqXG4gKiBJdCB3aWxsIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhIGBkaXNwb3NlYCBmdW5jdGlvbiB0byByZW1vdmUgdGhlIG1pZGRsZXdhcmUgYW5kIGEgYGFsbG93V3JpdGVgIGZ1bmN0aW9uXG4gKiB0aGF0IHdpbGwgYWxsb3cgYWN0aW9ucyB0byBiZSBzdGFydGVkIGluc2lkZSB0aGUgcHJvdmlkZWQgY29kZSBibG9jay5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIC8vIGdpdmVuIGEgbW9kZWwgaW5zdGFuY2UgbmFtZWQgdG9kb1xuICogY29uc3QgeyBkaXNwb3NlLCBhbGxvd1dyaXRlIH0gPSByZWFkb25seU1pZGRsZXdhcmUodG9kbylcbiAqXG4gKiAvLyB0aGlzIHdpbGwgdGhyb3dcbiAqIHRvZG8uc2V0RG9uZShmYWxzZSlcbiAqIGF3YWl0IHRvZG8uc2V0RG9uZUFzeW5jKGZhbHNlKVxuICpcbiAqIC8vIHRoaXMgd2lsbCB3b3JrXG4gKiBhbGxvd1dyaXRlKCgpID0+IHRvZG8uc2V0RG9uZShmYWxzZSkpXG4gKiAvLyBub3RlOiBmb3IgYXN5bmMgYWx3YXlzIHVzZSBvbmUgYWN0aW9uIGludm9jYXRpb24gcGVyIGFsbG93V3JpdGUhXG4gKiBhd2FpdCBhbGxvd1dyaXRlKCgpID0+IHRvZG8uc2V0RG9uZUFzeW5jKGZhbHNlKSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBtaWRkbGV3YXJlIGRpc3Bvc2VyIChgZGlzcG9zZWApIGFuZCBhIGBhbGxvd1dyaXRlYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5TWlkZGxld2FyZShzdWJ0cmVlUm9vdDogb2JqZWN0KTogUmVhZG9ubHlNaWRkbGV3YXJlUmV0dXJuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGxldCB3cml0YWJsZSA9IGZhbHNlXG4gIGNvbnN0IHdyaXRhYmxlU3ltYm9sID0gU3ltYm9sKFwid3JpdGFibGVcIilcblxuICBjb25zdCBkaXNwb3NlciA9IGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShzdWJ0cmVlUm9vdCwge1xuICAgIGZpbHRlcihjdHgpIHtcbiAgICAgIC8vIHNraXAgaG9va3NcbiAgICAgIGlmIChpc0hvb2tBY3Rpb24oY3R4LmFjdGlvbk5hbWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBhcmUgaW5zaWRlIGFsbG93V3JpdGUgaXQgaXMgd3JpdGFibGVcbiAgICAgIGxldCBjdXJyZW50bHlXcml0YWJsZSA9IHdyaXRhYmxlXG5cbiAgICAgIGlmICghY3VycmVudGx5V3JpdGFibGUpIHtcbiAgICAgICAgLy8gaWYgYSBwYXJlbnQgY29udGV4dCB3YXMgd3JpdGFibGUgdGhlbiB0aGUgY2hpbGQgc2hvdWxkIGJlIGFzIHdlbGxcbiAgICAgICAgbGV0IGN1cnJlbnRDdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQgfCB1bmRlZmluZWQgPSBjdHhcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRDdHggJiYgIWN1cnJlbnRseVdyaXRhYmxlKSB7XG4gICAgICAgICAgY3VycmVudGx5V3JpdGFibGUgPSAhIWN1cnJlbnRDdHguZGF0YVt3cml0YWJsZVN5bWJvbF1cbiAgICAgICAgICBjdXJyZW50Q3R4ID0gY3VycmVudEN0eC5wYXJlbnRDb250ZXh0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRseVdyaXRhYmxlKSB7XG4gICAgICAgIGN0eC5kYXRhW3dyaXRhYmxlU3ltYm9sXSA9IHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICAvLyBpZiB3ZSBnZXQgaGVyZSAod2Fzbid0IGZpbHRlcmVkIG91dCkgaXQgaXMgbm90IHdyaXRhYmxlXG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93LFxuICAgICAgICB2YWx1ZTogZmFpbHVyZShgdHJpZWQgdG8gaW52b2tlIGFjdGlvbiAnJHtjdHguYWN0aW9uTmFtZX0nIG92ZXIgYSByZWFkb25seSBub2RlYCksXG4gICAgICB9XG4gICAgfSxcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGRpc3Bvc2U6IGRpc3Bvc2VyLFxuICAgIGFsbG93V3JpdGUoZm4pIHtcbiAgICAgIGNvbnN0IG9sZFdyaXRhYmxlID0gd3JpdGFibGVcbiAgICAgIHdyaXRhYmxlID0gdHJ1ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdyaXRhYmxlID0gb2xkV3JpdGFibGVcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi9QYXRjaFwiXG5cbmV4cG9ydCB0eXBlIEpzb25QYXRjaCA9XG4gIHwgSnNvblBhdGNoQWRkT3BlcmF0aW9uPGFueT5cbiAgfCBKc29uUGF0Y2hSZW1vdmVPcGVyYXRpb25cbiAgfCBKc29uUGF0Y2hSZXBsYWNlT3BlcmF0aW9uPGFueT5cblxuZXhwb3J0IGludGVyZmFjZSBKc29uUGF0Y2hCYXNlT3BlcmF0aW9uIHtcbiAgcGF0aDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGNoQWRkT3BlcmF0aW9uPFQ+IGV4dGVuZHMgSnNvblBhdGNoQmFzZU9wZXJhdGlvbiB7XG4gIG9wOiBcImFkZFwiXG4gIHZhbHVlOiBUXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGNoUmVtb3ZlT3BlcmF0aW9uIGV4dGVuZHMgSnNvblBhdGNoQmFzZU9wZXJhdGlvbiB7XG4gIG9wOiBcInJlbW92ZVwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGNoUmVwbGFjZU9wZXJhdGlvbjxUPiBleHRlbmRzIEpzb25QYXRjaEJhc2VPcGVyYXRpb24ge1xuICBvcDogXCJyZXBsYWNlXCJcbiAgdmFsdWU6IFRcbn1cblxuLyoqXG4gKiBFc2NhcGVzIGEganNvbiBwb2ludGVyIHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHJhdyBwb2ludGVyXG4gKiBAcmV0dXJuIHRoZSBFc2NhcGVkIHBhdGhcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUGF0aENvbXBvbmVudChwYXRoOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gXCJcIiArIHBhdGhcbiAgfVxuICBpZiAocGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gLTEgJiYgcGF0aC5pbmRleE9mKFwiflwiKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL34vZywgXCJ+MFwiKS5yZXBsYWNlKC9cXC8vZywgXCJ+MVwiKVxufVxuXG4vKipcbiAqIFVuZXNjYXBlcyBhIGpzb24gcG9pbnRlciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBlc2NhcGVkIHBvaW50ZXJcbiAqIEByZXR1cm4gVGhlIHVuZXNjYXBlZCBwYXRoXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlUGF0aENvbXBvbmVudChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9+MS9nLCBcIi9cIikucmVwbGFjZSgvfjAvZywgXCJ+XCIpXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBwYXRoIGludG8gYSBKU09OIHBvaW50ZXIuXG4gKlxuICogQHBhcmFtIHBhdGggUGF0aCB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQ29udmVydGVkIEpTT04gcG9pbnRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhUb0pzb25Qb2ludGVyKHBhdGg6IFBhdGgpOiBzdHJpbmcge1xuICBpZiAocGF0aC5sZW5ndGggPD0gMCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cbiAgcmV0dXJuIFwiL1wiICsgcGF0aC5tYXAoZXNjYXBlUGF0aENvbXBvbmVudCkuam9pbihcIi9cIilcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIEpTT04gcG9pbnRlciBpbnRvIGEgcGF0aC5cbiAqXG4gKiBAcGFyYW0ganNvblBvaW50ZXIgSlNPTiBwb2ludGVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBDb252ZXJ0ZWQgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25Qb2ludGVyVG9QYXRoKGpzb25Qb2ludGVyOiBzdHJpbmcpOiBQYXRoIHtcbiAgaWYgKGpzb25Qb2ludGVyID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgaWYgKCFqc29uUG9pbnRlci5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhIEpTT04gcG9pbnRlciBtdXN0IHN0YXJ0IHdpdGggJy8nIG9yIGJlIGVtcHR5XCIpXG4gIH1cbiAganNvblBvaW50ZXIgPSBqc29uUG9pbnRlci5zbGljZSgxKVxuICByZXR1cm4ganNvblBvaW50ZXIuc3BsaXQoXCIvXCIpLm1hcCh1bmVzY2FwZVBhdGhDb21wb25lbnQpXG59XG5cbi8qKlxuICogQ29udmVydCBhIHBhdGNoIGludG8gYSBKU09OIHBhdGNoLlxuICpcbiAqIEBwYXJhbSBwYXRjaCBBIHBhdGNoLlxuICogQHJldHVybnMgQSBKU09OIHBhdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hUb0pzb25QYXRjaChwYXRjaDogUGF0Y2gpOiBKc29uUGF0Y2gge1xuICByZXR1cm4ge1xuICAgIC4uLnBhdGNoLFxuICAgIHBhdGg6IHBhdGhUb0pzb25Qb2ludGVyKHBhdGNoLnBhdGgpLFxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHBhdGNoIGludG8gYSBwYXRjaC5cbiAqXG4gKiBAcGFyYW0ganNvblBhdGNoIEEgSlNPTiBwYXRjaC5cbiAqIEByZXR1cm5zIEEgcGF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUGF0Y2hUb1BhdGNoKGpzb25QYXRjaDogSnNvblBhdGNoKTogUGF0Y2gge1xuICByZXR1cm4ge1xuICAgIC4uLmpzb25QYXRjaCxcbiAgICBwYXRoOiBqc29uUG9pbnRlclRvUGF0aChqc29uUGF0Y2gucGF0aCksXG4gIH1cbn1cbiIsImltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBvbkdsb2JhbFBhdGNoZXMsIG9uUGF0Y2hlcywgT25QYXRjaGVzRGlzcG9zZXIsIE9uUGF0Y2hlc0xpc3RlbmVyIH0gZnJvbSBcIi4vZW1pdFBhdGNoXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi9QYXRjaFwiXG5cbi8qKlxuICogUGF0Y2ggcmVjb3JkZXIgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hSZWNvcmRlckV2ZW50IHtcbiAgLyoqXG4gICAqIFRhcmdldCBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ6IG9iamVjdFxuICAvKipcbiAgICogUmVjb3JkZWQgcGF0Y2hlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoZXM6IFBhdGNoW11cbiAgLyoqXG4gICAqIFJlY29yZGVkIGludmVyc2UgcGF0Y2hlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG59XG5cbi8qKlxuICogUGF0Y2ggcmVjb3JkZXIgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoUmVjb3JkZXIge1xuICAvKipcbiAgICogR2V0cy9zZXRzIGlmIHRoZSBwYXRjaCByZWNvcmRlciBpcyBjdXJyZW50bHkgcmVjb3JkaW5nLlxuICAgKi9cbiAgcmVjb3JkaW5nOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgYXJyYXkgb2YgcGF0Y2hpbmcgZXZlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzOiBQYXRjaFJlY29yZGVyRXZlbnRbXVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHRoZSBwYXRjaCByZWNvcmRlci5cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZFxufVxuXG4vKipcbiAqIFBhdGNoIHJlY29yZGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hSZWNvcmRlck9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdGhlIHBhdGNoIHJlY29yZGVyIGlzIGluaXRpYWxseSByZWNvcmRpbmcgd2hlbiBjcmVhdGVkLlxuICAgKi9cbiAgcmVjb3JkaW5nPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBjYWxsYmFjayBmaWx0ZXIgdG8gc2VsZWN0IHdpY2ggcGF0Y2hlcyB0byByZWNvcmQvc2tpcC5cbiAgICogSXQgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIGV2ZW50IGlzIGFkZGVkIHRvIHRoZSBldmVudHMgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGNoZXMgUGF0Y2hlcyBhYm91dCB0byBiZSByZWNvcmRlZC5cbiAgICogQHBhcmFtIGludmVyc2VQYXRjaGVzIEludmVyc2UgcGF0Y2hlcyBhYm91dCB0byBiZSByZWNvcmRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHRvIHJlY29yZCB0aGUgcGF0Y2gsIGBmYWxzZWAgdG8gc2tpcCBpdC5cbiAgICovXG4gIGZpbHRlcj8ocGF0Y2hlczogUGF0Y2hbXSwgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW10pOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHJ1biBvbmNlIGEgcGF0Y2ggaXMgcmVjb3JkZWQuXG4gICAqIEl0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGV2ZW50IGlzIGFkZGVkIHRvIHRoZSBldmVudHMgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGNoZXMgUGF0Y2hlcyBqdXN0IHJlY29yZGVkLlxuICAgKiBAcGFyYW0gaW52ZXJzZVBhdGNoZXMgSW52ZXJzZSBwYXRjaGVzIGp1c3QgcmVjb3JkZWQuXG4gICAqL1xuICBvblBhdGNoZXM/OiBPblBhdGNoZXNMaXN0ZW5lclxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwYXRjaCByZWNvcmRlci5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3RcbiAqIEBwYXJhbSBbb3B0c11cbiAqIEByZXR1cm5zIFRoZSBwYXRjaCByZWNvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoUmVjb3JkZXIoc3VidHJlZVJvb3Q6IG9iamVjdCwgb3B0cz86IFBhdGNoUmVjb3JkZXJPcHRpb25zKTogUGF0Y2hSZWNvcmRlciB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICByZXR1cm4gaW50ZXJuYWxQYXRjaFJlY29yZGVyKHN1YnRyZWVSb290LCBvcHRzKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIENyZWF0ZXMgYSBnbG9iYWwgb3IgbG9jYWwgcGF0Y2ggcmVjb3JkZXIuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290XG4gKiBAcGFyYW0gW29wdHNdXG4gKiBAcmV0dXJucyBUaGUgcGF0Y2ggcmVjb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbFBhdGNoUmVjb3JkZXIoXG4gIHN1YnRyZWVSb290OiBvYmplY3QgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBQYXRjaFJlY29yZGVyT3B0aW9uc1xuKTogUGF0Y2hSZWNvcmRlciB7XG4gIGxldCB7IHJlY29yZGluZywgZmlsdGVyIH0gPSB7XG4gICAgcmVjb3JkaW5nOiB0cnVlLFxuICAgIGZpbHRlcjogYWx3YXlzQWNjZXB0RmlsdGVyLFxuICAgIC4uLm9wdHMsXG4gIH1cblxuICBjb25zdCBldmVudHMgPSBvYnNlcnZhYmxlLmFycmF5PFBhdGNoUmVjb3JkZXJFdmVudD4oW10sIHtcbiAgICBkZWVwOiBmYWxzZSxcbiAgfSlcblxuICBsZXQgb25QYXRjaGVzRGlzcG9zZXI6IE9uUGF0Y2hlc0Rpc3Bvc2VyXG5cbiAgaWYgKHN1YnRyZWVSb290KSB7XG4gICAgb25QYXRjaGVzRGlzcG9zZXIgPSBvblBhdGNoZXMoc3VidHJlZVJvb3QsIChwLCBpbnZQKSA9PiB7XG4gICAgICBpZiAocmVjb3JkaW5nICYmIGZpbHRlcihwLCBpbnZQKSkge1xuICAgICAgICBldmVudHMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBzdWJ0cmVlUm9vdCxcbiAgICAgICAgICBwYXRjaGVzOiBwLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzOiBpbnZQLFxuICAgICAgICB9KVxuICAgICAgICBvcHRzPy5vblBhdGNoZXM/LihwLCBpbnZQKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgb25QYXRjaGVzRGlzcG9zZXIgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcCwgaW52UCkgPT4ge1xuICAgICAgaWYgKHJlY29yZGluZyAmJiBmaWx0ZXIocCwgaW52UCkpIHtcbiAgICAgICAgZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwYXRjaGVzOiBwLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzOiBpbnZQLFxuICAgICAgICB9KVxuICAgICAgICBvcHRzPy5vblBhdGNoZXM/LihwLCBpbnZQKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldCByZWNvcmRpbmcoKSB7XG4gICAgICByZXR1cm4gcmVjb3JkaW5nXG4gICAgfSxcbiAgICBzZXQgcmVjb3JkaW5nKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHJlY29yZGluZyA9IGVuYWJsZWRcbiAgICB9LFxuICAgIGdldCBldmVudHMoKSB7XG4gICAgICByZXR1cm4gZXZlbnRzXG4gICAgfSxcbiAgICBkaXNwb3NlKCkge1xuICAgICAgb25QYXRjaGVzRGlzcG9zZXIoKVxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgYWx3YXlzQWNjZXB0RmlsdGVyID0gKCkgPT4gdHJ1ZVxuIiwiaW1wb3J0IHR5cGUgeyBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0SXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBjaGVja01vZGVsRGVjb3JhdG9yQXJncyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9jaGVja01vZGVsRGVjb3JhdG9yQXJnc1wiXG5pbXBvcnQgeyBhZGRNb2RlbENsYXNzSW5pdGlhbGl6ZXIgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxDbGFzc0luaXRpYWxpemVyXCJcbmltcG9ydCB7IGFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaFwiXG5pbXBvcnQgeyBpbnRlcm5hbFBhdGNoUmVjb3JkZXIsIFBhdGNoUmVjb3JkZXIgfSBmcm9tIFwiLi4vcGF0Y2gvcGF0Y2hSZWNvcmRlclwiXG5pbXBvcnQgeyBhc3NlcnRJc09iamVjdCwgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQge1xuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUsXG4gIEFjdGlvblRyYWNraW5nUmVzdWx0LFxuICBTaW1wbGVBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi9hY3Rpb25UcmFja2luZ01pZGRsZXdhcmVcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmFuc2FjdGlvbiBtaWRkbGV3YXJlLCB3aGljaCByZXZlcnRzIGNoYW5nZXMgbWFkZSBieSBhbiBhY3Rpb24gLyBjaGlsZFxuICogYWN0aW9ucyB3aGVuIHRoZSByb290IGFjdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGJ5IGFwcGx5aW5nIGludmVyc2UgcGF0Y2hlcy5cbiAqXG4gKiBAdHlwZXBhcmFtIE0gTW9kZWxcbiAqIEBwYXJhbSB0YXJnZXQgT2JqZWN0IHdpdGggdGhlIHJvb3QgdGFyZ2V0IG1vZGVsIG9iamVjdCAoYG1vZGVsYCkgYW5kIHJvb3QgYWN0aW9uIG5hbWUgKGBhY3Rpb25OYW1lYCkuXG4gKiBAcmV0dXJucyBUaGUgbWlkZGxld2FyZSBkaXNwb3Nlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uTWlkZGxld2FyZTxNIGV4dGVuZHMgQW55TW9kZWw+KHRhcmdldDoge1xuICBtb2RlbDogTVxuICBhY3Rpb25OYW1lOiBrZXlvZiBNXG59KTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIHtcbiAgYXNzZXJ0SXNPYmplY3QodGFyZ2V0LCBcInRhcmdldFwiKVxuXG4gIGNvbnN0IHsgbW9kZWwsIGFjdGlvbk5hbWUgfSA9IHRhcmdldFxuXG4gIGFzc2VydElzTW9kZWwobW9kZWwsIFwidGFyZ2V0Lm1vZGVsXCIpXG5cbiAgaWYgKHR5cGVvZiBhY3Rpb25OYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcInRhcmdldC5hY3Rpb25OYW1lIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgfVxuXG4gIGNvbnN0IHBhdGNoUmVjb3JkZXJTeW1ib2wgPSBTeW1ib2woXCJwYXRjaFJlY29yZGVyXCIpXG4gIGZ1bmN0aW9uIGluaXRQYXRjaFJlY29yZGVyKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCkge1xuICAgIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdID0gaW50ZXJuYWxQYXRjaFJlY29yZGVyKHVuZGVmaW5lZCwge1xuICAgICAgcmVjb3JkaW5nOiBmYWxzZSxcbiAgICB9KVxuICB9XG4gIGZ1bmN0aW9uIGdldFBhdGNoUmVjb3JkZXIoY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogUGF0Y2hSZWNvcmRlciB7XG4gICAgcmV0dXJuIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdXG4gIH1cblxuICByZXR1cm4gYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlKG1vZGVsLCB7XG4gICAgZmlsdGVyKGN0eCkge1xuICAgICAgLy8gdGhlIHByaW1hcnkgYWN0aW9uIG11c3QgYmUgb24gdGhlIHJvb3Qgb2JqZWN0XG4gICAgICBjb25zdCByb290Q29udGV4dCA9IGN0eC5yb290Q29udGV4dFxuICAgICAgcmV0dXJuIHJvb3RDb250ZXh0LnRhcmdldCA9PT0gbW9kZWwgJiYgcm9vdENvbnRleHQuYWN0aW9uTmFtZSA9PT0gYWN0aW9uTmFtZVxuICAgIH0sXG4gICAgb25TdGFydChjdHgpIHtcbiAgICAgIGlmIChjdHggPT09IGN0eC5yb290Q29udGV4dCkge1xuICAgICAgICBpbml0UGF0Y2hSZWNvcmRlcihjdHgpXG4gICAgICB9XG4gICAgfSxcbiAgICBvblJlc3VtZShjdHgpIHtcbiAgICAgIGdldFBhdGNoUmVjb3JkZXIoY3R4KS5yZWNvcmRpbmcgPSB0cnVlXG4gICAgfSxcbiAgICBvblN1c3BlbmQoY3R4KSB7XG4gICAgICBnZXRQYXRjaFJlY29yZGVyKGN0eCkucmVjb3JkaW5nID0gZmFsc2VcbiAgICB9LFxuICAgIG9uRmluaXNoKGN0eCwgcmV0KSB7XG4gICAgICBpZiAoY3R4ID09PSBjdHgucm9vdENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IGdldFBhdGNoUmVjb3JkZXIoY3R4KVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHJldC5yZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93KSB7XG4gICAgICAgICAgICAvLyB1bmRvIGNoYW5nZXMgKGJhY2t3YXJkcyBmb3IgaW52ZXJzZSBwYXRjaGVzKVxuICAgICAgICAgICAgY29uc3QgeyBldmVudHMgfSA9IHBhdGNoUmVjb3JkZXJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBldmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaV1cbiAgICAgICAgICAgICAgYXBwbHlQYXRjaGVzKGV2ZW50LnRhcmdldCwgZXZlbnQuaW52ZXJzZVBhdGNoZXMsIHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHBhdGNoUmVjb3JkZXIuZGlzcG9zZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9KVxufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uIG1pZGRsZXdhcmUgYXMgYSBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHByb3BlcnR5S2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQge1xuICBjaGVja01vZGVsRGVjb3JhdG9yQXJncyhcInRyYW5zYWN0aW9uXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpXG5cbiAgYWRkTW9kZWxDbGFzc0luaXRpYWxpemVyKHRhcmdldC5jb25zdHJ1Y3RvciwgKG1vZGVsSW5zdGFuY2UpID0+IHtcbiAgICB0cmFuc2FjdGlvbk1pZGRsZXdhcmUoe1xuICAgICAgbW9kZWw6IG1vZGVsSW5zdGFuY2UgYXMgQW55TW9kZWwsXG4gICAgICBhY3Rpb25OYW1lOiBwcm9wZXJ0eUtleSBhcyBhbnksXG4gICAgfSlcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXHJcbmltcG9ydCB7IEZyb3plbiB9IGZyb20gXCIuLi8uLi9mcm96ZW4vRnJvemVuXCJcclxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiwgYXNzZXJ0SXNPYmplY3QsIGlzT2JqZWN0LCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcclxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxyXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUge1xyXG4gIEFueVN0YW5kYXJkVHlwZSxcclxuICBBbnlUeXBlLFxyXG4gIE1vZGVsVHlwZSxcclxuICBPYmplY3RUeXBlRnVuY3Rpb24sXHJcbiAgVHlwZVRvRGF0YSxcclxufSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7XHJcbiAgbGF0ZVR5cGVDaGVja2VyLFxyXG4gIExhdGVUeXBlQ2hlY2tlcixcclxuICBUeXBlQ2hlY2tlcixcclxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxyXG4gIFR5cGVJbmZvLFxyXG4gIFR5cGVJbmZvR2VuLFxyXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcclxuXHJcbmZ1bmN0aW9uIHR5cGVzT2JqZWN0SGVscGVyPFM+KG9iakZuOiBTLCBmcm96ZW46IGJvb2xlYW4sIHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbik6IFMge1xyXG4gIGFzc2VydElzRnVuY3Rpb24ob2JqRm4sIFwib2JqRm5cIilcclxuXHJcbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XHJcbiAgICBjb25zdCBvYmplY3RTY2hlbWE6IHtcclxuICAgICAgW2s6IHN0cmluZ106IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyXHJcbiAgICB9ID0gKG9iakZuIGFzIGFueSkoKVxyXG4gICAgYXNzZXJ0SXNPYmplY3Qob2JqZWN0U2NoZW1hLCBcIm9iamVjdFNjaGVtYVwiKVxyXG5cclxuICAgIGNvbnN0IHNjaGVtYUVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmplY3RTY2hlbWEpXHJcblxyXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb3BzTXNnOiBzdHJpbmdbXSA9IFtdXHJcbiAgICAgIGZvciAoY29uc3QgW2ssIHVucmVzb2x2ZWRUY10gb2Ygc2NoZW1hRW50cmllcykge1xyXG4gICAgICAgIGNvbnN0IHRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKHVucmVzb2x2ZWRUYylcclxuICAgICAgICBsZXQgcHJvcFR5cGVuYW1lID0gXCIuLi5cIlxyXG4gICAgICAgIGlmICghcmVjdXJzaXZlVHlwZUNoZWNrZXJzLmluY2x1ZGVzKHRjKSkge1xyXG4gICAgICAgICAgcHJvcFR5cGVuYW1lID0gdGMuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB0YylcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvcHNNc2cucHVzaChgJHtrfTogJHtwcm9wVHlwZW5hbWV9O2ApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBgeyAke3Byb3BzTXNnLmpvaW4oXCIgXCIpfSB9YFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGx5U25hcHNob3RQcm9jZXNzb3IgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbW9kZTogXCJmcm9tXCIgfCBcInRvXCIpID0+IHtcclxuICAgICAgY29uc3QgbmV3T2JqOiB0eXBlb2Ygb2JqID0ge31cclxuXHJcbiAgICAgIC8vIG5vdGU6IHdlIGFsbG93IGV4Y2VzcyBwcm9wZXJ0aWVzIHdoZW4gY2hlY2tpbmcgb2JqZWN0c1xyXG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBrID0ga2V5c1tpXVxyXG4gICAgICAgIGNvbnN0IHVucmVzb2x2ZWRUYyA9IG9iamVjdFNjaGVtYVtrXVxyXG4gICAgICAgIGlmICh1bnJlc29sdmVkVGMpIHtcclxuICAgICAgICAgIGNvbnN0IHRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKHVucmVzb2x2ZWRUYylcclxuICAgICAgICAgIG5ld09ialtrXSA9XHJcbiAgICAgICAgICAgIG1vZGUgPT09IFwiZnJvbVwiID8gdGMuZnJvbVNuYXBzaG90UHJvY2Vzc29yKG9ialtrXSkgOiB0Yy50b1NuYXBzaG90UHJvY2Vzc29yKG9ialtrXSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdW5rbm93biBwcm9wLCBjb3B5IGFzIGlzXHJcbiAgICAgICAgICBuZXdPYmpba10gPSBvYmpba11cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXdPYmpcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcclxuXHJcbiAgICAgIChvYmosIHBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikgfHwgKGZyb3plbiAmJiAhKG9iaiBpbnN0YW5jZW9mIEZyb3plbikpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIG9iailcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG5vdGU6IHdlIGFsbG93IGV4Y2VzcyBwcm9wZXJ0aWVzIHdoZW4gY2hlY2tpbmcgb2JqZWN0c1xyXG4gICAgICAgIGZvciAoY29uc3QgW2ssIHVucmVzb2x2ZWRUY10gb2Ygc2NoZW1hRW50cmllcykge1xyXG4gICAgICAgICAgY29uc3QgdGMgPSByZXNvbHZlVHlwZUNoZWNrZXIodW5yZXNvbHZlZFRjKVxyXG4gICAgICAgICAgY29uc3Qgb2JqVmFsID0gb2JqW2tdXHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWVFcnJvciA9IHRjLmNoZWNrKG9ialZhbCwgWy4uLnBhdGgsIGtdKVxyXG4gICAgICAgICAgaWYgKHZhbHVlRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXJyb3JcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBnZXRUeXBlTmFtZSxcclxuICAgICAgdHlwZUluZm9HZW4sXHJcblxyXG4gICAgICAob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbm90ZTogd2UgYWxsb3cgZXhjZXNzIHByb3BlcnRpZXMgd2hlbiBjaGVja2luZyBvYmplY3RzXHJcbiAgICAgICAgZm9yIChjb25zdCBbaywgdW5yZXNvbHZlZFRjXSBvZiBzY2hlbWFFbnRyaWVzKSB7XHJcbiAgICAgICAgICBjb25zdCB0YyA9IHJlc29sdmVUeXBlQ2hlY2tlcih1bnJlc29sdmVkVGMpXHJcbiAgICAgICAgICBjb25zdCBvYmpWYWwgPSBvYmpba11cclxuXHJcbiAgICAgICAgICBjb25zdCB2YWx1ZUFjdHVhbENoZWNrZXIgPSB0Yy5zbmFwc2hvdFR5cGUob2JqVmFsKVxyXG4gICAgICAgICAgaWYgKCF2YWx1ZUFjdHVhbENoZWNrZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzVGNcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFwcGx5U25hcHNob3RQcm9jZXNzb3Iob2JqLCBcImZyb21cIilcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFwcGx5U25hcHNob3RQcm9jZXNzb3Iob2JqLCBcInRvXCIpXHJcbiAgICAgIH1cclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gdGhpc1RjXHJcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxyXG59XHJcblxyXG4vKipcclxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIHBsYWluIG9iamVjdC5cclxuICogTm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBvYmplY3QuIFRoaXMgaXMgZG9uZSBzbyBvYmplY3RzIGNhbiBzdXBwb3J0IHNlbGYgLyBjcm9zcyB0eXBlcy5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogLy8gbm90aWNlIHRoZSAoeyAuLi4gfSksIG5vdCBqdXN0IHsgLi4uIH1cclxuICogY29uc3QgcG9pbnRUeXBlID0gdHlwZXMub2JqZWN0KCgpID0+ICh7XHJcbiAqICAgeDogdHlwZXMubnVtYmVyLFxyXG4gKiAgIHk6IHR5cGVzLm51bWJlclxyXG4gKiB9KSlcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxyXG4gKiBAcGFyYW0gb2JqZWN0RnVuY3Rpb24gRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgYW4gb2JqZWN0IHdpdGggdHlwZXMuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPYmplY3Q8VD4ob2JqZWN0RnVuY3Rpb246IFQpOiBUIHtcclxuICAvLyB3ZSBjYW4ndCB0eXBlIHRoaXMgZnVuY3Rpb24gb3IgZWxzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIG1ha2UgaXQgd29yayByZWN1cnNpdmVseVxyXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgT2JqZWN0VHlwZUluZm8odCwgb2JqZWN0RnVuY3Rpb24gYXMgYW55KVxyXG5cclxuICByZXR1cm4gdHlwZXNPYmplY3RIZWxwZXIob2JqZWN0RnVuY3Rpb24sIGZhbHNlLCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMub2JqZWN0YCB0eXBlIGluZm8gZm9yIGFuIG9iamVjdCBwcm9wcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0VHlwZUluZm9Qcm9wcyB7XHJcbiAgcmVhZG9ubHkgW3Byb3BOYW1lOiBzdHJpbmddOiBSZWFkb25seTx7XHJcbiAgICB0eXBlOiBBbnlTdGFuZGFyZFR5cGVcclxuICAgIHR5cGVJbmZvOiBUeXBlSW5mb1xyXG4gIH0+XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMub2JqZWN0YCB0eXBlIGluZm8uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgT2JqZWN0VHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XHJcbiAgLy8gbWVtb2l6ZSB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG9iamVjdFxyXG4gIHByaXZhdGUgX3Byb3BzID0gbGF6eSgoKSA9PiB7XHJcbiAgICBjb25zdCBvYmpTY2hlbWEgPSB0aGlzLl9vYmpUeXBlRm4oKVxyXG5cclxuICAgIGNvbnN0IHByb3BUeXBlczogTy5Xcml0YWJsZTxPYmplY3RUeXBlSW5mb1Byb3BzPiA9IHt9XHJcbiAgICBPYmplY3Qua2V5cyhvYmpTY2hlbWEpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IHR5cGUgPSByZXNvbHZlU3RhbmRhcmRUeXBlKG9ialNjaGVtYVtwcm9wTmFtZV0pXHJcbiAgICAgIHByb3BUeXBlc1twcm9wTmFtZV0gPSB7IHR5cGUsIHR5cGVJbmZvOiBnZXRUeXBlSW5mbyh0eXBlKSB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHByb3BUeXBlc1xyXG4gIH0pXHJcblxyXG4gIGdldCBwcm9wcygpOiBPYmplY3RUeXBlSW5mb1Byb3BzIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wcygpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCBwcml2YXRlIF9vYmpUeXBlRm46IE9iamVjdFR5cGVGdW5jdGlvbikge1xyXG4gICAgc3VwZXIodGhpc1R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBmcm96ZW4gZGF0YS5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3QgZnJvemVuTnVtYmVyVHlwZSA9IHR5cGVzLmZyb3plbih0eXBlcy5udW1iZXIpXHJcbiAqIGNvbnN0IGZyb3plbkFueVR5cGUgPSB0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPGFueT4oKSlcclxuICogY29uc3QgZnJvemVuTnVtYmVyQXJyYXlUeXBlID0gdHlwZXMuZnJvemVuKHR5cGVzLmFycmF5KHR5cGVzLm51bWJlcikpXHJcbiAqIGNvbnN0IGZyb3plblVuY2hlY2tlZE51bWJlckFycmF5VHlwZSA9IHR5cGVzLmZyb3plbih0eXBlcy51bmNoZWNrZWQ8bnVtYmVyW10+KCkpXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cclxuICogQHBhcmFtIGRhdGFUeXBlIFR5cGUgb2YgdGhlIGZyb3plbiBkYXRhLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzRnJvemVuPFQgZXh0ZW5kcyBBbnlUeXBlPihkYXRhVHlwZTogVCk6IE1vZGVsVHlwZTxGcm96ZW48VHlwZVRvRGF0YTxUPj4+IHtcclxuICByZXR1cm4gdHlwZXNPYmplY3RIZWxwZXIoXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBkYXRhOiBkYXRhVHlwZSxcclxuICAgIH0pLFxyXG4gICAgdHJ1ZSxcclxuICAgICh0KSA9PiBuZXcgRnJvemVuVHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZShkYXRhVHlwZSkpXHJcbiAgKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy5mcm96ZW5gIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBGcm96ZW5UeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcclxuICBnZXQgZGF0YVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcclxuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLmRhdGFUeXBlKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgZGF0YVR5cGU6IEFueVN0YW5kYXJkVHlwZSkge1xyXG4gICAgc3VwZXIodGhpc1R5cGUpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IGlkZW50aXR5Rm4gfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxyXG5pbXBvcnQgdHlwZSB7IElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcclxuaW1wb3J0IHsgVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyQmFzZVR5cGUsIFR5cGVJbmZvIH0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcclxuXHJcbmNvbnN0IHVuY2hlY2tlZDogSWRlbnRpdHlUeXBlPGFueT4gPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZS5BbnksXHJcbiAgbnVsbCxcclxuICAoKSA9PiBcImFueVwiLFxyXG4gICh0KSA9PiBuZXcgVW5jaGVja2VkVHlwZUluZm8odCksXHJcblxyXG4gICgpID0+IHVuY2hlY2tlZCBhcyBhbnksXHJcblxyXG4gIGlkZW50aXR5Rm4sXHJcbiAgaWRlbnRpdHlGblxyXG4pIGFzIGFueVxyXG5cclxuLyoqXHJcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBnaXZlbiB2YWx1ZSB0aGF0IHdvbid0IGJlIHR5cGUgY2hlY2tlZC5cclxuICogVGhpcyBpcyBiYXNpY2FsbHkgYSB3YXkgdG8gYmFpbCBvdXQgb2YgdGhlIHJ1bnRpbWUgdHlwZSBjaGVja2luZyBzeXN0ZW0uXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IHVuY2hlY2tlZFNvbWVNb2RlbCA9IHR5cGVzLnVuY2hlY2tlZDxTb21lTW9kZWw+KClcclxuICogY29uc3QgYW55VHlwZSA9IHR5cGVzLnVuY2hlY2tlZDxhbnk+KClcclxuICogY29uc3QgY3VzdG9tVW5jaGVja2VkVHlwZSA9IHR5cGVzLnVuY2hlY2tlZDwoQSAmIEIpIHwgQz4oKVxyXG4gKiBgYGBcclxuICpcclxuICogQHR5cGVwYXJhbSBUIFR5cGUgb2YgdGhlIHZhbHVlLCBvciB1bmtvd24gaWYgbm90IGdpdmVuLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzVW5jaGVja2VkPFQgPSBuZXZlcj4oKTogSWRlbnRpdHlUeXBlPFQ+IHtcclxuICByZXR1cm4gdW5jaGVja2VkXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMudW5jaGVja2VkYCB0eXBlIGluZm8uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVW5jaGVja2VkVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7fVxyXG4iLCJpbXBvcnQgeyBmYWlsdXJlLCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7XG4gIHJlc29sdmVTdGFuZGFyZFR5cGUsXG4gIHJlc29sdmVTdGFuZGFyZFR5cGVOb1Rocm93LFxuICByZXNvbHZlVHlwZUNoZWNrZXIsXG59IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBnZXRUeXBlQ2hlY2tlckJhc2VUeXBlRnJvbVZhbHVlLFxuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuL3R5cGVzVW5jaGVja2VkXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSB1bmlvbiBvZiBzZXZlcmFsIG90aGVyIHR5cGVzIChhIHwgYiB8IGMgfCAuLi4pLlxuICogQWNjZXB0cyBhIGRpc3BhdGNoZXIgdGhhdCwgZ2l2ZW4gYSBzbmFwc2hvdCwgcmV0dXJucyB0aGUgdHlwZVxuICogdGhhdCBzbmFwc2hvdCBpcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cbiAqIEBwYXJhbSBkaXNwYXRjaGVyIEZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYSBzbmFwc2hvdCByZXR1cm5zIHRoZSB0eXBlLlxuICogQHBhcmFtIG9yVHlwZXMgUG9zc2libGUgdHlwZXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPcjxUIGV4dGVuZHMgQW55VHlwZVtdPihcbiAgZGlzcGF0Y2hlcjogKHNuOiBhbnkpID0+IFRbbnVtYmVyXSxcbiAgLi4ub3JUeXBlczogVFxuKTogVFtudW1iZXJdXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pb24gb2Ygc2V2ZXJhbCBvdGhlciB0eXBlcyAoYSB8IGIgfCBjIHwgLi4uKS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IGJvb2xlYW5Pck51bWJlclR5cGUgPSB0eXBlcy5vcih0eXBlcy5ib29sZWFuLCB0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cbiAqIEBwYXJhbSBvclR5cGVzIFBvc3NpYmxlIHR5cGVzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzT3I8VCBleHRlbmRzIEFueVR5cGVbXT4oLi4ub3JUeXBlczogVCk6IFRbbnVtYmVyXVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPcihcbiAgZGlzcGF0Y2hlck9yVHlwZTogKChzbjogYW55KSA9PiBBbnlUeXBlKSB8IEFueVR5cGUsXG4gIC4uLm1vcmVPclR5cGVzOiBBbnlUeXBlW11cbik6IEFueVR5cGUge1xuICBjb25zdCBvclR5cGVzID0gbW9yZU9yVHlwZXMuc2xpY2UoKVxuICBsZXQgZmluYWxEaXNwYXRjaGVyOiAoKHNuOiBhbnkpID0+IFR5cGVDaGVja2VyKSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGZpcnN0VHlwZUNoZWNrZXIgPSByZXNvbHZlU3RhbmRhcmRUeXBlTm9UaHJvdyhkaXNwYXRjaGVyT3JUeXBlIGFzIEFueVR5cGUpXG5cbiAgaWYgKGZpcnN0VHlwZUNoZWNrZXIpIHtcbiAgICBvclR5cGVzLnVuc2hpZnQoZmlyc3RUeXBlQ2hlY2tlcilcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlck9yVHlwZSBhcyAoc246IGFueSkgPT4gQW55VHlwZVxuICAgIGZpbmFsRGlzcGF0Y2hlciA9IChzbjogYW55KSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZGlzcGF0Y2hlcihzbilcbiAgICAgIGNvbnN0IHR5cGVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKHR5cGUpXG4gICAgICByZXR1cm4gdHlwZUNoZWNrZXJcbiAgICB9XG4gIH1cblxuICBpZiAob3JUeXBlcy5sZW5ndGggPD0gMCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJvciB0eXBlIG11c3QgaGF2ZSBhdCBsZWFzdCAxIHBvc3NpYmxlIHR5cGVcIilcbiAgfVxuXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgT3JUeXBlSW5mbyh0LCBvclR5cGVzLm1hcChyZXNvbHZlU3RhbmRhcmRUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBjaGVja2VycyA9IG9yVHlwZXMubWFwKHJlc29sdmVUeXBlQ2hlY2tlcilcblxuICAgIC8vIGlmIHRoZSBvciBpbmNsdWRlcyB1bmNoZWNrZWQgdGhlbiBpdCBpcyB1bmNoZWNrZWRcbiAgICBpZiAoY2hlY2tlcnMuc29tZSgodGMpID0+IHRjLnVuY2hlY2tlZCkpIHtcbiAgICAgIHJldHVybiB0eXBlc1VuY2hlY2tlZCgpIGFzIGFueVxuICAgIH1cblxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZU5hbWVzID0gY2hlY2tlcnMubWFwKCh0YykgPT4ge1xuICAgICAgICBpZiAocmVjdXJzaXZlVHlwZUNoZWNrZXJzLmluY2x1ZGVzKHRjKSkge1xuICAgICAgICAgIHJldHVybiBcIi4uLlwiXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRjLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdGMpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gdHlwZU5hbWVzLmpvaW4oXCIgfCBcIilcbiAgICB9XG5cbiAgICBsZXQgdGhpc1RjQmFzZVR5cGU6IFR5cGVDaGVja2VyQmFzZVR5cGVcbiAgICBpZiAoY2hlY2tlcnMuc29tZSgoYykgPT4gYy5iYXNlVHlwZSAhPT0gY2hlY2tlcnNbMF0uYmFzZVR5cGUpKSB7XG4gICAgICB0aGlzVGNCYXNlVHlwZSA9IFR5cGVDaGVja2VyQmFzZVR5cGUuQW55XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNUY0Jhc2VUeXBlID0gY2hlY2tlcnNbMF0uYmFzZVR5cGVcbiAgICB9XG5cbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgdGhpc1RjQmFzZVR5cGUsXG5cbiAgICAgICh2YWx1ZSwgcGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBzb21lTWF0Y2hpbmdUeXBlID0gY2hlY2tlcnMuc29tZSgodGMpID0+ICF0Yy5jaGVjayh2YWx1ZSwgcGF0aCkpXG4gICAgICAgIGlmIChzb21lTWF0Y2hpbmdUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVCYXNlVHlwZSA9IGdldFR5cGVDaGVja2VyQmFzZVR5cGVGcm9tVmFsdWUodmFsdWUpXG5cbiAgICAgICAgY29uc3QgY2hlY2tlckZvckJhc2VUeXBlID0gY2hlY2tlcnMuZmlsdGVyKFxuICAgICAgICAgIChjKSA9PiBjLmJhc2VUeXBlID09PSB2YWx1ZUJhc2VUeXBlIHx8IGMuYmFzZVR5cGUgPT09IFR5cGVDaGVja2VyQmFzZVR5cGUuQW55XG4gICAgICAgIClcblxuICAgICAgICBpZiAoY2hlY2tlckZvckJhc2VUeXBlLmxlbmd0aCA9PT0gMSAmJiBjaGVja2VyRm9yQmFzZVR5cGVbMF0uYmFzZVR5cGUgPT09IHZhbHVlQmFzZVR5cGUpIHtcbiAgICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIHZhbGlkIG9wdGlvbiBhY2NlcHQgaXQgd2l0aG91dCBhc2tpbmdcbiAgICAgICAgICAvLyB0aGlzIGlzIGRvbmUgYmVjYXVzZTpcbiAgICAgICAgICAvLyAxKSBwZXJmb3JtYW5jZSAoYXZvaWQgY2hlY2tpbmcgc3RydWN0dXJlIGlmIG5vdCBuZWVkZWQpXG4gICAgICAgICAgLy8gMikgc28gd2UgY2FuIGFjY2VwdCB1bnR5cGVkIG1vZGVscyB3aGVuIHBhaXJlZCB3aXRoIHVuZGVmaW5lZCB8IG51bGxcbiAgICAgICAgICByZXR1cm4gY2hlY2tlckZvckJhc2VUeXBlWzBdXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrZXJGb3JCYXNlVHlwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVHlwZSA9IGNoZWNrZXJGb3JCYXNlVHlwZVtpXS5zbmFwc2hvdFR5cGUodmFsdWUpXG4gICAgICAgICAgaWYgKG1hdGNoaW5nVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoaW5nVHlwZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9LFxuXG4gICAgICAoc24pID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGZpbmFsRGlzcGF0Y2hlciA/IGZpbmFsRGlzcGF0Y2hlcihzbikgOiB0aGlzVGMuc25hcHNob3RUeXBlKHNuKVxuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgICAgYHNuYXBzaG90ICcke0pTT04uc3RyaW5naWZ5KHNuKX0nIGRvZXMgbm90IG1hdGNoIHRoZSBmb2xsb3dpbmcgdHlwZTogJHtnZXRUeXBlTmFtZShcbiAgICAgICAgICAgICAgdGhpc1RjXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHlwZS5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICB9LFxuXG4gICAgICAoc24pID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGZpbmFsRGlzcGF0Y2hlciA/IGZpbmFsRGlzcGF0Y2hlcihzbikgOiB0aGlzVGMuc25hcHNob3RUeXBlKHNuKVxuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgICAgYHNuYXBzaG90ICcke0pTT04uc3RyaW5naWZ5KHNuKX0nIGRvZXMgbm90IG1hdGNoIHRoZSBmb2xsb3dpbmcgdHlwZTogJHtnZXRUeXBlTmFtZShcbiAgICAgICAgICAgICAgdGhpc1RjXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHlwZS50b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiB0aGlzVGNcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5vcmAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgT3JUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgLy8gbWVtb2l6ZSB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFycmF5IG9uIHRoZSBnZXR0ZXJcbiAgcHJpdmF0ZSBfb3JUeXBlSW5mb3MgPSBsYXp5KCgpID0+IHRoaXMub3JUeXBlcy5tYXAoZ2V0VHlwZUluZm8pKVxuXG4gIGdldCBvclR5cGVJbmZvcygpOiBSZWFkb25seUFycmF5PFR5cGVJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuX29yVHlwZUluZm9zKClcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IG9yVHlwZXM6IFJlYWRvbmx5QXJyYXk8QW55U3RhbmRhcmRUeXBlPikge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBBbnlNb2RlbFByb3AsIE1heWJlT3B0aW9uYWxNb2RlbFByb3AsIE9wdGlvbmFsTW9kZWxQcm9wLCBwcm9wIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHtcbiAgdHlwZXNCb29sZWFuLFxuICB0eXBlc051bGwsXG4gIHR5cGVzTnVtYmVyLFxuICB0eXBlc1N0cmluZyxcbiAgdHlwZXNVbmRlZmluZWQsXG59IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB7IExhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyB0eXBlc09yIH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc09yXCJcblxuLyoqXG4gKiBEZWZpbmVzIGEgc3RyaW5nIG1vZGVsIHByb3BlcnR5IHdpdGggYSBkZWZhdWx0IHZhbHVlLlxuICogRXF1aXZhbGVudCB0byBgdFByb3AodHlwZXMuc3RyaW5nLCBkZWZhdWx0VmFsdWUpYC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHRQcm9wKFwiZm9vXCIpIC8vIGFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHdpbGwgdGFrZSB0aGUgdmFsdWUgYFwiZm9vXCJgIHdoZW4gdW5kZWZpbmVkLlxuICogYGBgXG4gKlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wKGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogT3B0aW9uYWxNb2RlbFByb3A8c3RyaW5nPlxuXG4vKipcbiAqIERlZmluZXMgYSBudW1iZXIgbW9kZWwgcHJvcGVydHkgd2l0aCBhIGRlZmF1bHQgdmFsdWUuXG4gKiBFcXVpdmFsZW50IHRvIGB0UHJvcCh0eXBlcy5udW1iZXIsIGRlZmF1bHRWYWx1ZSlgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AoNDIpIC8vIGFuIG9wdGlvbmFsIG51bWJlciB0aGF0IHdpbGwgdGFrZSB0aGUgdmFsdWUgYDQyYCB3aGVuIHVuZGVmaW5lZC5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcChkZWZhdWx0VmFsdWU6IG51bWJlcik6IE9wdGlvbmFsTW9kZWxQcm9wPG51bWJlcj5cblxuLyoqXG4gKiBEZWZpbmVzIGEgYm9vbGVhbiBtb2RlbCBwcm9wZXJ0eSB3aXRoIGEgZGVmYXVsdCB2YWx1ZS5cbiAqIEVxdWl2YWxlbnQgdG8gYHRQcm9wKHR5cGVzLmJvb2xlYW4sIGRlZmF1bHRWYWx1ZSlgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AodHJ1ZSkgLy8gYW4gb3B0aW9uYWwgYm9vbGVhbiB0aGF0IHdpbGwgdGFrZSB0aGUgdmFsdWUgYHRydWVgIHdoZW4gdW5kZWZpbmVkLlxuICogYGBgXG4gKlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIG9wdGlvbnMgTW9kZWwgcHJvcGVydHkgb3B0aW9ucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcChkZWZhdWx0VmFsdWU6IGJvb2xlYW4pOiBPcHRpb25hbE1vZGVsUHJvcDxib29sZWFuPlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSwgd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgdmFsdWVcbiAqIGlmIHRoZSBpbnB1dCBzbmFwc2hvdCAvIG1vZGVsIGNyZWF0aW9uIGRhdGEgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIGFuZCB3aXRoIGFuIGFzc29jaWF0ZWQgdHlwZSBjaGVja2VyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AodHlwZXMubnVtYmVyLCAoKSA9PiAxMCkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiAxMFxuICogeDogdFByb3AodHlwZXMuYXJyYXkodHlwZXMubnVtYmVyKSwgKCkgPT4gW10pIC8vIGFuIG9wdGlvbmFsIG51bWJlciBhcnJheSwgd2l0aCBhIGRlZmF1bHQgZW1wdHkgYXJyYXlcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFR5cGUgVHlwZSBjaGVja2VyIHR5cGUuXG4gKlxuICogQHBhcmFtIHR5cGUgVHlwZSBjaGVja2VyLlxuICogQHBhcmFtIGRlZmF1bHRGbiBEZWZhdWx0IHZhbHVlIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcDxUVHlwZSBleHRlbmRzIEFueVR5cGU+KFxuICB0eXBlOiBUVHlwZSxcbiAgZGVmYXVsdEZuOiAoKSA9PiBUeXBlVG9EYXRhPFRUeXBlPlxuKTogT3B0aW9uYWxNb2RlbFByb3A8VHlwZVRvRGF0YTxUVHlwZT4+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5LCB3aXRoIGFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWVcbiAqIGlmIHRoZSBpbnB1dCBzbmFwc2hvdCAvIG1vZGVsIGNyZWF0aW9uIGRhdGEgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIGFuZCB3aXRoIGFuIGFzc29jaWF0ZWQgdHlwZSBjaGVja2VyLlxuICogWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIHdpdGggcHJpbWl0aXZlIHZhbHVlcyBhbmQgbmV2ZXIgd2l0aCBvYmplY3QgdmFsdWVzXG4gKiAoYXJyYXksIG1vZGVsLCBvYmplY3QsIGV0YykuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiB0UHJvcCh0eXBlcy5udW1iZXIsIDEwKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mIDEwXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFRUeXBlIFR5cGUgY2hlY2tlciB0eXBlLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZSBnZW5lcmF0b3IgZnVuY3Rpb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdFByb3A8VFR5cGUgZXh0ZW5kcyBBbnlUeXBlPihcbiAgdHlwZTogVFR5cGUsXG4gIGRlZmF1bHRWYWx1ZTogVHlwZVRvRGF0YTxUVHlwZT5cbik6IE9wdGlvbmFsTW9kZWxQcm9wPFR5cGVUb0RhdGE8VFR5cGU+PlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSB3aXRoIG5vIGRlZmF1bHQgdmFsdWUgYW5kIGFuIGFzc29jaWF0ZWQgdHlwZSBjaGVja2VyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AodHlwZXMubnVtYmVyKSAvLyBhIHJlcXVpcmVkIG51bWJlclxuICogeDogdFByb3AodHlwZXMubWF5YmUodHlwZXMubnVtYmVyKSkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aGljaCBkZWZhdWx0cyB0byB1bmRlZmluZWRcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFR5cGUgVHlwZSBjaGVja2VyIHR5cGUuXG4gKlxuICogQHBhcmFtIHR5cGUgVHlwZSBjaGVja2VyLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wPFRUeXBlIGV4dGVuZHMgQW55VHlwZT4odHlwZTogVFR5cGUpOiBNYXliZU9wdGlvbmFsTW9kZWxQcm9wPFR5cGVUb0RhdGE8VFR5cGU+PlxuXG5leHBvcnQgZnVuY3Rpb24gdFByb3AodHlwZU9yRGVmYXVsdFZhbHVlOiBhbnksIGRlZj86IGFueSk6IEFueU1vZGVsUHJvcCB7XG4gIGxldCBoYXNEZWZhdWx0VmFsdWUgPSBmYWxzZVxuXG4gIHN3aXRjaCAodHlwZW9mIHR5cGVPckRlZmF1bHRWYWx1ZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiB0UHJvcCh0eXBlc1N0cmluZywgdHlwZU9yRGVmYXVsdFZhbHVlKVxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiB0UHJvcCh0eXBlc051bWJlciwgdHlwZU9yRGVmYXVsdFZhbHVlKVxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gdFByb3AodHlwZXNCb29sZWFuLCB0eXBlT3JEZWZhdWx0VmFsdWUpXG4gIH1cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgLy8gdHlwZSwgZGVmYXVsdFxuICAgIGhhc0RlZmF1bHRWYWx1ZSA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IG5ld1Byb3AgPSBoYXNEZWZhdWx0VmFsdWUgPyBwcm9wKGRlZikgOiBwcm9wKClcblxuICBjb25zdCB0eXBlQ2hlY2tlciA9IHJlc29sdmVTdGFuZGFyZFR5cGUodHlwZU9yRGVmYXVsdFZhbHVlKSBhcyB1bmtub3duIGFzXG4gICAgfCBUeXBlQ2hlY2tlclxuICAgIHwgTGF0ZVR5cGVDaGVja2VyXG5cbiAgY29uc3QgZnJvbVNuYXBzaG90VHlwZUNoZWNrZXIgPSBoYXNEZWZhdWx0VmFsdWVcbiAgICA/IHR5cGVzT3IodHlwZUNoZWNrZXIgYXMgdW5rbm93biBhcyBBbnlUeXBlLCB0eXBlc1VuZGVmaW5lZCwgdHlwZXNOdWxsKVxuICAgIDogdHlwZUNoZWNrZXJcblxuICByZXR1cm4ge1xuICAgIC4uLm5ld1Byb3AsXG4gICAgX2ludGVybmFsOiB7XG4gICAgICAuLi5uZXdQcm9wLl9pbnRlcm5hbCxcblxuICAgICAgdHlwZUNoZWNrZXIsXG5cbiAgICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvcjogKHNuKSA9PiB7XG4gICAgICAgIGNvbnN0IGZzbnAgPSByZXNvbHZlVHlwZUNoZWNrZXIoZnJvbVNuYXBzaG90VHlwZUNoZWNrZXIpLmZyb21TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgICByZXR1cm4gZnNucCA/IGZzbnAoc24pIDogc25cbiAgICAgIH0sXG5cbiAgICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IChzbikgPT4ge1xuICAgICAgICBjb25zdCB0c25wID0gcmVzb2x2ZVR5cGVDaGVja2VyKHR5cGVDaGVja2VyKS50b1NuYXBzaG90UHJvY2Vzc29yXG4gICAgICAgIHJldHVybiB0c25wID8gdHNucChzbikgOiBzblxuICAgICAgfSxcbiAgICB9LFxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY2hhaW5GbnM8RiBleHRlbmRzIEZ1bmN0aW9uPiguLi5mbnM6IChGIHwgdW5kZWZpbmVkKVtdKTogRiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlZmluZWRGbnMgPSBmbnMuZmlsdGVyKChmbikgPT4gISFmbilcbiAgaWYgKGRlZmluZWRGbnMubGVuZ3RoIDw9IDApIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBjaGFpbmVkRm4gPSAodjogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGxldCByZXQgPSB2XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZmluZWRGbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJldCA9IGRlZmluZWRGbnNbaV0hKHJldCwgLi4uYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICByZXR1cm4gY2hhaW5lZEZuIGFzIHVua25vd24gYXMgRlxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4vQmFzZU1vZGVsU2hhcmVkXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBhY3R1YWxseSBhIGNsYXNzIG9yIGRhdGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcGFyYW0gYXJnTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNDbGFzc09yRGF0YU1vZGVsQ2xhc3MoXG4gIG1vZGVsOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcsXG4gIGN1c3RvbUVyck1zZyA9IFwibXVzdCBiZSBhIGNsYXNzIG9yIGRhdGEgbW9kZWwgY2xhc3NcIlxuKTogYXNzZXJ0cyBtb2RlbCBpcyBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiB7XG4gIGlmICghaXNNb2RlbENsYXNzKG1vZGVsKSAmJiAhaXNEYXRhTW9kZWxDbGFzcyhtb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9ICR7Y3VzdG9tRXJyTXNnfWApXG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5U2V0IH0gZnJvbSBcIi4uL2FjdGlvbi9hcHBseVNldFwiXG5pbXBvcnQgeyBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCB9IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQgeyBtb2RlbEFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vbW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgQW55RGF0YU1vZGVsLCBCYXNlRGF0YU1vZGVsLCBiYXNlRGF0YU1vZGVsUHJvcE5hbWVzIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9EYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi9kYXRhTW9kZWwvZ2V0RGF0YU1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHsgQW55TW9kZWwsIEJhc2VNb2RlbCwgYmFzZU1vZGVsUHJvcE5hbWVzIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyB0eXBlc09iamVjdCB9IGZyb20gXCIuLi90eXBlcy9vYmplY3RCYXNlZC90eXBlc09iamVjdFwiXG5pbXBvcnQgeyB0eXBlc1N0cmluZyB9IGZyb20gXCIuLi90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgdHlwZSB7IExhdGVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuLi90eXBlcy91dGlsaXR5L3R5cGVzVW5jaGVja2VkXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlLCBwcm9wTmFtZVRvU2V0dGVyTmFtZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBjaGFpbkZucyB9IGZyb20gXCIuLi91dGlscy9jaGFpbkZuc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzLCBtb2RlbEluaXRpYWxpemVkU3ltYm9sIH0gZnJvbSBcIi4vQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sIH0gZnJvbSBcIi4vbW9kZWxDbGFzc0luaXRpYWxpemVyXCJcbmltcG9ydCB7IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbywgc2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvIH0gZnJvbSBcIi4vbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHsgbW9kZWxNZXRhZGF0YVN5bWJvbCwgbW9kZWxVbndyYXBwZWRDbGFzc1N5bWJvbCB9IGZyb20gXCIuL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQgeyBBbnlNb2RlbFByb3AsIE1vZGVsUHJvcHMsIHByb3AgfSBmcm9tIFwiLi9wcm9wXCJcbmltcG9ydCB7IGFzc2VydElzQ2xhc3NPckRhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG5mdW5jdGlvbiBfX2V4dGVuZHMoc3ViQ2xhc3M6IGFueSwgc3VwZXJDbGFzczogYW55KSB7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcylcbiAgZnVuY3Rpb24gX18odGhpczogYW55KSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzXG4gIH1cbiAgX18ucHJvdG90eXBlID0gc3VwZXJDbGFzcy5wcm90b3R5cGVcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gbmV3IChfXyBhcyBhbnkpKClcbn1cblxuZnVuY3Rpb24gY3JlYXRlTW9kZWxQcm9wRGVzY3JpcHRvcihcbiAgbW9kZWxQcm9wTmFtZTogc3RyaW5nLFxuICBtb2RlbFByb3A6IEFueU1vZGVsUHJvcCB8IHVuZGVmaW5lZCxcbiAgZW51bWVyYWJsZTogYm9vbGVhblxuKTogUHJvcGVydHlEZXNjcmlwdG9yIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQodGhpczogQW55TW9kZWwgfCBBbnlEYXRhTW9kZWwpIHtcbiAgICAgIHJldHVybiBnZXRNb2RlbEluc3RhbmNlRGF0YUZpZWxkKHRoaXMsIG1vZGVsUHJvcCwgbW9kZWxQcm9wTmFtZSlcbiAgICB9LFxuICAgIHNldCh0aGlzOiBBbnlNb2RlbCB8IEFueURhdGFNb2RlbCwgdj86IGFueSkge1xuICAgICAgLy8gaGFjayB0byBvbmx5IHBlcm1pdCBzZXR0aW5nIHRoZXNlIHZhbHVlcyBvbmNlIGZ1bGx5IGNvbnN0cnVjdGVkXG4gICAgICAvLyB0aGlzIGlzIHRvIGlnbm9yZSBhYnN0cmFjdCBwcm9wZXJ0aWVzIGJlaW5nIHNldCBieSBiYWJlbFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94YXZpZXJnb256L21vYngta2V5c3RvbmUvaXNzdWVzLzE4XG4gICAgICBpZiAoIShtb2RlbEluaXRpYWxpemVkU3ltYm9sIGluIHRoaXMpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2V0TW9kZWxJbnN0YW5jZURhdGFGaWVsZCh0aGlzLCBtb2RlbFByb3AsIG1vZGVsUHJvcE5hbWUsIHYpXG4gICAgfSxcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNb2RlbEluc3RhbmNlRGF0YUZpZWxkPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBtb2RlbFByb3A6IEFueU1vZGVsUHJvcCB8IHVuZGVmaW5lZCxcbiAgbW9kZWxQcm9wTmFtZTogc3RyaW5nXG4pOiBhbnkge1xuICAvLyBubyBuZWVkIHRvIHVzZSBnZXQgc2luY2UgdGhlc2UgdmFycyBhbHdheXMgZ2V0IG9uIHRoZSBpbml0aWFsICRcbiAgY29uc3QgdmFsdWUgPSBtb2RlbC4kW21vZGVsUHJvcE5hbWVdXG5cbiAgaWYgKG1vZGVsUHJvcD8uX2ludGVybmFsLnRyYW5zZm9ybSkge1xuICAgIHJldHVybiBtb2RlbFByb3AuX2ludGVybmFsLnRyYW5zZm9ybS50cmFuc2Zvcm0odmFsdWUsIG1vZGVsLCBtb2RlbFByb3BOYW1lLCAobmV3VmFsdWUpID0+IHtcbiAgICAgIC8vIHVzZSBhcHBseSBzZXQgaW5zdGVhZCB0byB3cmFwIGl0IGluIGFuIGFjdGlvblxuICAgICAgLy8gc2V0IHRoZSAkIG9iamVjdCB0byBzZXQgdGhlIG9yaWdpbmFsIHZhbHVlIGRpcmVjdGx5XG4gICAgICBhcHBseVNldChtb2RlbC4kLCBtb2RlbFByb3BOYW1lLCBuZXdWYWx1ZSlcbiAgICB9KSBhcyBhbnlcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBzZXRNb2RlbEluc3RhbmNlRGF0YUZpZWxkPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBtb2RlbFByb3A6IEFueU1vZGVsUHJvcCB8IHVuZGVmaW5lZCxcbiAgbW9kZWxQcm9wTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogYW55XG4pOiB2b2lkIHtcbiAgaWYgKG1vZGVsUHJvcD8uX2ludGVybmFsLnNldHRlciA9PT0gXCJhc3NpZ25cIiAmJiAhZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKSkge1xuICAgIC8vIHVzZSBhcHBseSBzZXQgaW5zdGVhZCB0byB3cmFwIGl0IGluIGFuIGFjdGlvblxuICAgIGFwcGx5U2V0KG1vZGVsLCBtb2RlbFByb3BOYW1lIGFzIGFueSwgdmFsdWUpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gbW9kZWxQcm9wPy5faW50ZXJuYWwudHJhbnNmb3JtXG4gICAgPyBtb2RlbFByb3AuX2ludGVybmFsLnRyYW5zZm9ybS51bnRyYW5zZm9ybSh2YWx1ZSwgbW9kZWwsIG1vZGVsUHJvcE5hbWUpXG4gICAgOiB2YWx1ZVxuICAvLyBubyBuZWVkIHRvIHVzZSBzZXQgc2luY2UgdGhlc2UgdmFycyBhbHdheXMgZ2V0IG9uIHRoZSBpbml0aWFsICRcbiAgbW9kZWwuJFttb2RlbFByb3BOYW1lXSA9IHRyYW5zZm9ybWVkVmFsdWVcbn1cblxuY29uc3QgaWRHZW5lcmF0b3IgPSAoKSA9PiBnZXRHbG9iYWxDb25maWcoKS5tb2RlbElkR2VuZXJhdG9yKClcbmNvbnN0IHRQcm9wRm9ySWQgPSB0UHJvcCh0eXBlc1N0cmluZywgaWRHZW5lcmF0b3IpXG50UHJvcEZvcklkLl9pbnRlcm5hbC5pc0lkID0gdHJ1ZVxuY29uc3QgcHJvcEZvcklkID0gcHJvcChpZEdlbmVyYXRvcilcbnByb3BGb3JJZC5faW50ZXJuYWwuaXNJZCA9IHRydWVcblxudHlwZSBGcm9tU25hcHNob3RQcm9jZXNzb3JGbiA9IChzbjogYW55KSA9PiBhbnlcbnR5cGUgVG9TbmFwc2hvdFByb2Nlc3NvckZuID0gKHNuOiBhbnksIGluc3RhbmNlOiBhbnkpID0+IGFueVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkSW50ZXJuYWxNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVEJhc2VNb2RlbCBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsXG4+KHtcbiAgbW9kZWxQcm9wcyxcbiAgYmFzZU1vZGVsLFxuICB0eXBlLFxuICB2YWx1ZVR5cGUsXG4gIGZyb21TbmFwc2hvdFByb2Nlc3NvcixcbiAgdG9TbmFwc2hvdFByb2Nlc3Nvcixcbn06IHtcbiAgbW9kZWxQcm9wczogVFByb3BzXG4gIGJhc2VNb2RlbDogTW9kZWxDbGFzczxUQmFzZU1vZGVsPiB8IHVuZGVmaW5lZFxuICB0eXBlOiBcImNsYXNzXCIgfCBcImRhdGFcIlxuICB2YWx1ZVR5cGU6IGJvb2xlYW5cbiAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiBGcm9tU25hcHNob3RQcm9jZXNzb3JGbiB8IHVuZGVmaW5lZFxuICB0b1NuYXBzaG90UHJvY2Vzc29yOiBUb1NuYXBzaG90UHJvY2Vzc29yRm4gfCB1bmRlZmluZWRcbn0pOiBhbnkge1xuICBhc3NlcnRJc09iamVjdChtb2RlbFByb3BzLCBcIm1vZGVsUHJvcHNcIilcbiAgaWYgKGJhc2VNb2RlbCkge1xuICAgIGFzc2VydElzQ2xhc3NPckRhdGFNb2RlbENsYXNzKGJhc2VNb2RlbCwgXCJiYXNlTW9kZWxcIilcblxuICAgIC8vIGlmIHRoZSBiYXNlTW9kZWwgaXMgd3JhcHBlZCB3aXRoIHRoZSBtb2RlbCBkZWNvcmF0b3IgZ2V0IHRoZSBvcmlnaW5hbCBvbmVcbiAgICBjb25zdCB1bndyYXBwZWRDbGFzcyA9IChiYXNlTW9kZWwgYXMgYW55KVttb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sXVxuICAgIGlmICh1bndyYXBwZWRDbGFzcykge1xuICAgICAgYmFzZU1vZGVsID0gdW53cmFwcGVkQ2xhc3NcbiAgICAgIGFzc2VydElzQ2xhc3NPckRhdGFNb2RlbENsYXNzKGJhc2VNb2RlbCwgXCJiYXNlTW9kZWxcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBleHRyYURlc2NyaXB0b3JzOiBQcm9wZXJ0eURlc2NyaXB0b3JNYXAgPSB7fVxuXG4gIGNvbnN0IGNvbXBvc2VkTW9kZWxQcm9wczogTW9kZWxQcm9wcyA9IG1vZGVsUHJvcHNcbiAgaWYgKGJhc2VNb2RlbCkge1xuICAgIGNvbnN0IG9sZE1vZGVsUHJvcHMgPSBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8oYmFzZU1vZGVsKVxuICAgIGZvciAoY29uc3Qgb2xkTW9kZWxQcm9wS2V5IG9mIE9iamVjdC5rZXlzKG9sZE1vZGVsUHJvcHMpKSB7XG4gICAgICBpZiAobW9kZWxQcm9wc1tvbGRNb2RlbFByb3BLZXldKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGV4dGVuZGVkIG1vZGVsIGNhbm5vdCByZWRlY2xhcmUgYmFzZSBtb2RlbCBwcm9wZXJ0eSBuYW1lZCAnJHtvbGRNb2RlbFByb3BLZXl9J2BcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY29tcG9zZWRNb2RlbFByb3BzW29sZE1vZGVsUHJvcEtleV0gPSBvbGRNb2RlbFByb3BzW29sZE1vZGVsUHJvcEtleV1cbiAgICB9XG4gIH1cblxuICAvLyBsb29rIGZvciBpZCBrZXlzXG4gIGNvbnN0IGlkS2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvc2VkTW9kZWxQcm9wcykuZmlsdGVyKChrKSA9PiB7XG4gICAgY29uc3QgcCA9IGNvbXBvc2VkTW9kZWxQcm9wc1trXVxuICAgIHJldHVybiBwLl9pbnRlcm5hbC5pc0lkXG4gIH0pXG4gIGlmICh0eXBlID09PSBcImNsYXNzXCIpIHtcbiAgICBpZiAoaWRLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYGV4cGVjdGVkIGF0IG1vc3Qgb25lIGlkUHJvcCBidXQgZ290IG1hbnk6ICR7SlNPTi5zdHJpbmdpZnkoaWRLZXlzKX1gKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaWRLZXlzLmxlbmd0aCA+PSAxKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBleHBlY3RlZCBubyBpZFByb3AgYnV0IGdvdCBzb21lOiAke0pTT04uc3RyaW5naWZ5KGlkS2V5cyl9YClcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZWVkc1R5cGVDaGVja2VyID0gT2JqZWN0LnZhbHVlcyhjb21wb3NlZE1vZGVsUHJvcHMpLnNvbWUoXG4gICAgKG1wKSA9PiAhIW1wLl9pbnRlcm5hbC50eXBlQ2hlY2tlclxuICApXG5cbiAgLy8gdHJhbnNmb3JtIGlkIGtleXMgKG9ubHkgb25lIHJlYWxseSlcbiAgbGV0IGlkS2V5OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgaWYgKGlkS2V5cy5sZW5ndGggPj0gMSkge1xuICAgIGlkS2V5ID0gaWRLZXlzWzBdXG4gICAgY29uc3QgaWRQcm9wID0gY29tcG9zZWRNb2RlbFByb3BzW2lkS2V5XVxuICAgIGxldCBiYXNlUHJvcDogQW55TW9kZWxQcm9wID0gbmVlZHNUeXBlQ2hlY2tlciA/IHRQcm9wRm9ySWQgOiBwcm9wRm9ySWRcbiAgICBzd2l0Y2ggKGlkUHJvcD8uX2ludGVybmFsLnNldHRlcikge1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICBiYXNlUHJvcCA9IGJhc2VQcm9wLndpdGhTZXR0ZXIoKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImFzc2lnblwiOlxuICAgICAgICBiYXNlUHJvcCA9IGJhc2VQcm9wLndpdGhTZXR0ZXIoXCJhc3NpZ25cIilcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNvbXBvc2VkTW9kZWxQcm9wc1tpZEtleV0gPSBiYXNlUHJvcFxuICB9XG5cbiAgLy8gY3JlYXRlIHR5cGUgY2hlY2tlciBpZiBuZWVkZWRcbiAgbGV0IGRhdGFUeXBlQ2hlY2tlcjogTGF0ZVR5cGVDaGVja2VyIHwgdW5kZWZpbmVkXG4gIGlmIChuZWVkc1R5cGVDaGVja2VyKSB7XG4gICAgY29uc3QgdHlwZUNoZWNrZXJPYmo6IHtcbiAgICAgIFtrOiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrLCBtcF0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9zZWRNb2RlbFByb3BzKSkge1xuICAgICAgdHlwZUNoZWNrZXJPYmpba10gPSAhbXAuX2ludGVybmFsLnR5cGVDaGVja2VyID8gdHlwZXNVbmNoZWNrZWQoKSA6IG1wLl9pbnRlcm5hbC50eXBlQ2hlY2tlclxuICAgIH1cbiAgICBkYXRhVHlwZUNoZWNrZXIgPSB0eXBlc09iamVjdCgoKSA9PiB0eXBlQ2hlY2tlck9iaikgYXMgYW55XG4gIH1cblxuICBjb25zdCBiYXNlUHJvcE5hbWVzID0gdHlwZSA9PT0gXCJjbGFzc1wiID8gYmFzZU1vZGVsUHJvcE5hbWVzIDogYmFzZURhdGFNb2RlbFByb3BOYW1lc1xuXG4gIC8vIHNraXAgcHJvcHMgdGhhdCBhcmUgb24gYmFzZSBtb2RlbCwgdGhlc2UgaGF2ZSB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoICRcbiAgLy8gd2Ugb25seSBuZWVkIHRvIHByb3h5IG5ldyBwcm9wcywgbm90IG9sZCBvbmVzXG4gIGZvciAoY29uc3QgbW9kZWxQcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhtb2RlbFByb3BzKS5maWx0ZXIoXG4gICAgKG1wKSA9PiAhYmFzZVByb3BOYW1lcy5oYXMobXAgYXMgYW55KVxuICApKSB7XG4gICAgZXh0cmFEZXNjcmlwdG9yc1ttb2RlbFByb3BOYW1lXSA9IGNyZWF0ZU1vZGVsUHJvcERlc2NyaXB0b3IoXG4gICAgICBtb2RlbFByb3BOYW1lLFxuICAgICAgbW9kZWxQcm9wc1ttb2RlbFByb3BOYW1lXSxcbiAgICAgIGZhbHNlXG4gICAgKVxuICB9XG5cbiAgY29uc3QgZXh0cmFQcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhleHRyYURlc2NyaXB0b3JzKVxuICBjb25zdCBleHRyYVByb3BOYW1lc0xlbiA9IGV4dHJhUHJvcE5hbWVzLmxlbmd0aFxuXG4gIGNvbnN0IGJhc2U6IGFueSA9IGJhc2VNb2RlbCA/PyAodHlwZSA9PT0gXCJjbGFzc1wiID8gQmFzZU1vZGVsIDogQmFzZURhdGFNb2RlbClcblxuICAvLyB3ZSB1c2UgdGhpcyB3ZWlyZCBoYWNrIHJhdGhlciB0aGFuIGp1c3QgY2xhc3MgQ3VzdG9tQmFzZU1vZGVsIGV4dGVuZHMgYmFzZSB7fVxuICAvLyBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCBwcm9ibGVtcyB3aXRoIEVTNSBjbGFzc2VzIGV4dGVuZGluZyBFUzYgY2xhc3Nlc1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3hhdmllcmdvbnovbW9ieC1rZXlzdG9uZS9pc3N1ZXMvMTVcbiAgY29uc3QgQ3VzdG9tQmFzZU1vZGVsOiBhbnkgPSAoZnVuY3Rpb24gKF9iYXNlKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbUJhc2VNb2RlbCwgX2Jhc2UpXG5cbiAgICBmdW5jdGlvbiBDdXN0b21CYXNlTW9kZWwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBpbml0aWFsRGF0YTogYW55LFxuICAgICAgY29uc3RydWN0b3JPcHRpb25zPzogTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfCBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcbiAgICApIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBjb25zdHJ1Y3Rvck9wdGlvbnM/Lm1vZGVsQ2xhc3MgPz8gdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgY29uc3QgYmFzZU1vZGVsID0gbmV3IF9iYXNlKGluaXRpYWxEYXRhLCB7XG4gICAgICAgIC4uLmNvbnN0cnVjdG9yT3B0aW9ucyxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgIH0gYXMgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgJiBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMpXG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBhYnN0cmFjdCBjbGFzc2VzIGRvIG5vdCBvdmVycmlkZSBwcm90b3R5cGUgcHJvcHNcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0cmFQcm9wTmFtZXNMZW47IGkrKykge1xuICAgICAgICBjb25zdCBleHRyYVByb3BOYW1lID0gZXh0cmFQcm9wTmFtZXNbaV1cbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZU1vZGVsLCBleHRyYVByb3BOYW1lKSkge1xuICAgICAgICAgIGRlbGV0ZSBiYXNlTW9kZWxbZXh0cmFQcm9wTmFtZV1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFzZU1vZGVsXG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUJhc2VNb2RlbFxuICB9KShiYXNlKVxuXG4gIGNvbnN0IGluaXRpYWxpemVycyA9IGJhc2VbbW9kZWxJbml0aWFsaXplcnNTeW1ib2xdXG4gIGlmIChpbml0aWFsaXplcnMpIHtcbiAgICBDdXN0b21CYXNlTW9kZWxbbW9kZWxJbml0aWFsaXplcnNTeW1ib2xdID0gaW5pdGlhbGl6ZXJzLnNsaWNlKClcbiAgfVxuXG4gIHNldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhDdXN0b21CYXNlTW9kZWwsIGNvbXBvc2VkTW9kZWxQcm9wcylcblxuICBpZiAodHlwZSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IE1vZGVsTWV0YWRhdGEgPSB7XG4gICAgICBkYXRhVHlwZTogZGF0YVR5cGVDaGVja2VyIGFzIHVua25vd24gYXMgQW55VHlwZSB8IHVuZGVmaW5lZCxcbiAgICAgIG1vZGVsSWRQcm9wZXJ0eTogaWRLZXksXG4gICAgICB2YWx1ZVR5cGUsXG4gICAgfVxuICAgIEN1c3RvbUJhc2VNb2RlbFttb2RlbE1ldGFkYXRhU3ltYm9sXSA9IG1ldGFkYXRhXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IERhdGFNb2RlbE1ldGFkYXRhID0ge1xuICAgICAgZGF0YVR5cGU6IGRhdGFUeXBlQ2hlY2tlciBhcyB1bmtub3duIGFzIEFueVR5cGUgfCB1bmRlZmluZWQsXG4gICAgfVxuICAgIEN1c3RvbUJhc2VNb2RlbFttb2RlbE1ldGFkYXRhU3ltYm9sXSA9IG1ldGFkYXRhXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlLCBleHRyYURlc2NyaXB0b3JzKVxuXG4gIC8vIGFkZCBzZXR0ZXIgYWN0aW9ucyB0byBwcm90b3R5cGVcbiAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BEYXRhXSBvZiBPYmplY3QuZW50cmllcyhtb2RlbFByb3BzKSkge1xuICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuc2V0dGVyID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzZXR0ZXJOYW1lID0gcHJvcE5hbWVUb1NldHRlck5hbWUocHJvcE5hbWUpXG5cbiAgICAgIEN1c3RvbUJhc2VNb2RlbC5wcm90b3R5cGVbc2V0dGVyTmFtZV0gPSBmdW5jdGlvbiAodGhpczogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXNbcHJvcE5hbWVdID0gdmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3UHJvcERlc2NyaXB0b3I6IGFueSA9IG1vZGVsQWN0aW9uKFxuICAgICAgICBDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlLFxuICAgICAgICBzZXR0ZXJOYW1lLFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEN1c3RvbUJhc2VNb2RlbC5wcm90b3R5cGUsIHNldHRlck5hbWUpXG4gICAgICApXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlLCBzZXR0ZXJOYW1lLCBuZXdQcm9wRGVzY3JpcHRvcilcbiAgICB9XG4gIH1cblxuICBjb25zdCBtb2RlbFByb3BzRnJvbVNuYXBzaG90UHJvY2Vzc29yID0gZ2V0TW9kZWxQcm9wc0Zyb21TbmFwc2hvdFByb2Nlc3Nvcihjb21wb3NlZE1vZGVsUHJvcHMpXG5cbiAgY29uc3QgbW9kZWxQcm9wc1RvU25hcHNob3RQcm9jZXNzb3IgPSBnZXRNb2RlbFByb3BzVG9TbmFwc2hvdFByb2Nlc3Nvcihjb21wb3NlZE1vZGVsUHJvcHMpXG5cbiAgaWYgKGZyb21TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgIGNvbnN0IGZuID0gZnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yID0gKHNuKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5mbihzbiksXG4gICAgICAgIFttb2RlbFR5cGVLZXldOiBzblttb2RlbFR5cGVLZXldLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0b1NuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgY29uc3QgZm4gPSB0b1NuYXBzaG90UHJvY2Vzc29yXG4gICAgdG9TbmFwc2hvdFByb2Nlc3NvciA9IChzbiwgbW9kZWxJbnN0YW5jZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZm4oc24sIG1vZGVsSW5zdGFuY2UpLFxuICAgICAgICBbbW9kZWxUeXBlS2V5XTogc25bbW9kZWxUeXBlS2V5XSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBDdXN0b21CYXNlTW9kZWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yID0gY2hhaW5GbnMoXG4gICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yLFxuICAgIG1vZGVsUHJvcHNGcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgKVxuICBDdXN0b21CYXNlTW9kZWwudG9TbmFwc2hvdFByb2Nlc3NvciA9IGNoYWluRm5zKG1vZGVsUHJvcHNUb1NuYXBzaG90UHJvY2Vzc29yLCB0b1NuYXBzaG90UHJvY2Vzc29yKVxuXG4gIHJldHVybiBDdXN0b21CYXNlTW9kZWxcbn1cblxuZnVuY3Rpb24gZ2V0TW9kZWxQcm9wc0Zyb21TbmFwc2hvdFByb2Nlc3NvcihcbiAgY29tcG9zZWRNb2RlbFByb3BzOiBNb2RlbFByb3BzXG4pOiBGcm9tU25hcHNob3RQcm9jZXNzb3JGbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb3BzV2l0aEZyb21TbmFwc2hvdFByb2Nlc3NvciA9IE9iamVjdC5lbnRyaWVzKGNvbXBvc2VkTW9kZWxQcm9wcykuZmlsdGVyKFxuICAgIChbX3Byb3BOYW1lLCBwcm9wRGF0YV0pID0+IHByb3BEYXRhLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgKVxuICBpZiAocHJvcHNXaXRoRnJvbVNuYXBzaG90UHJvY2Vzc29yLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIChzbikgPT4ge1xuICAgIGNvbnN0IG5ld1NuID0geyAuLi5zbiB9XG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BEYXRhXSBvZiBwcm9wc1dpdGhGcm9tU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICAgIG5ld1NuW3Byb3BOYW1lXSA9IHByb3BEYXRhLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc25bcHJvcE5hbWVdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3U25cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNb2RlbFByb3BzVG9TbmFwc2hvdFByb2Nlc3NvcihcbiAgY29tcG9zZWRNb2RlbFByb3BzOiBNb2RlbFByb3BzXG4pOiBUb1NuYXBzaG90UHJvY2Vzc29yRm4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9wc1dpdGhUb1NuYXBzaG90UHJvY2Vzc29yID0gT2JqZWN0LmVudHJpZXMoY29tcG9zZWRNb2RlbFByb3BzKS5maWx0ZXIoXG4gICAgKFtfcHJvcE5hbWUsIHByb3BEYXRhXSkgPT4gcHJvcERhdGEuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgKVxuXG4gIGlmIChwcm9wc1dpdGhUb1NuYXBzaG90UHJvY2Vzc29yLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIChzbikgPT4ge1xuICAgIGNvbnN0IG5ld1NuID0geyAuLi5zbiB9XG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BEYXRhXSBvZiBwcm9wc1dpdGhUb1NuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICAgICAgbmV3U25bcHJvcE5hbWVdID0gcHJvcERhdGEuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3Ioc25bcHJvcE5hbWVdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3U25cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHR5cGUge1xuICBNb2RlbFByb3BzLFxuICBNb2RlbFByb3BzVG9TZXR0ZXIsXG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90Q3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGEsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IHNoYXJlZEludGVybmFsTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvc2hhcmVkSW50ZXJuYWxNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsLCBCYXNlTW9kZWwsIEJhc2VNb2RlbEtleXMsIE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0SXNNb2RlbENsYXNzLCBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCB0eXBlIF9Db21wb3NlZENyZWF0aW9uRGF0YTxcbiAgU3VwZXJNb2RlbCxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wc1xuPiA9IFN1cGVyTW9kZWwgZXh0ZW5kcyBBbnlNb2RlbFxuICA/IE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFRQcm9wcz4gJiBNb2RlbFRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWw+XG4gIDogTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPlxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHR5cGUgdXNlZCBieSBmcm9tU25hcHNob3QgYmVmb3JlIHByb2Nlc3NvcnMgYXJlIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEZyb21TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID1cbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGE8VFByb3BzPlxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHR5cGUgdXNlZCBieSBnZXRTbmFwc2hvdCBiZWZvcmUgcHJvY2Vzc29ycyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID0gTW9kZWxQcm9wc1RvU25hcHNob3REYXRhPFRQcm9wcz5cblxuZXhwb3J0IHR5cGUgX01vZGVsSWQ8U3VwZXJNb2RlbCwgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBTdXBlck1vZGVsIGV4dGVuZHMgQW55TW9kZWxcbiAgPyBNb2RlbElkUHJvcGVydHlOYW1lPFN1cGVyTW9kZWw+XG4gIDogRXh0cmFjdE1vZGVsSWRQcm9wPFRQcm9wcz4gJiBzdHJpbmdcblxuZXhwb3J0IGludGVyZmFjZSBfTW9kZWw8XG4gIFN1cGVyTW9kZWwsXG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIEZyb21TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVG9TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PlxuPiB7XG4gIG5ldyAoZGF0YTogX0NvbXBvc2VkQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWwsIFRQcm9wcz4pOiBTdXBlck1vZGVsICZcbiAgICBCYXNlTW9kZWw8VFByb3BzLCBGcm9tU25hcHNob3RPdmVycmlkZSwgVG9TbmFwc2hvdE92ZXJyaWRlLCBfTW9kZWxJZDxTdXBlck1vZGVsLCBUUHJvcHM+PiAmXG4gICAgT21pdDxNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGE8VFByb3BzPiwgQmFzZU1vZGVsS2V5cz4gJlxuICAgIE1vZGVsUHJvcHNUb1NldHRlcjxUUHJvcHM+XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgbW9kZWwgaWQgcHJvcGVydHkgZnJvbSB0aGUgbW9kZWwgcHJvcHMuXG4gKi9cbmV4cG9ydCB0eXBlIEV4dHJhY3RNb2RlbElkUHJvcDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFByb3BzXTogVFByb3BzW0tdW1wiX2ludGVybmFsXCJdW1wiJGlzSWRcIl0gZXh0ZW5kcyB0cnVlID8gSyA6IG5ldmVyXG59W2tleW9mIFRQcm9wc11cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBtb2RlbHMgdGhhdCBleHRlbmRzIGFub3RoZXIgbW9kZWwuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTmV3IG1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEB0eXBlcGFyYW0gVE1vZGVsQ2xhc3MgTW9kZWwgY2xhc3MgdHlwZS5cbiAqIEBwYXJhbSBnZW5GbiBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGJhc2UgbW9kZWwgYW5kIG1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWRNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ2xhc3M8QW55TW9kZWw+LFxuICBBIGV4dGVuZHMgW10sXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgZ2VuRm46ICguLi5hcmdzOiBBKSA9PiB7XG4gICAgYmFzZU1vZGVsOiBUTW9kZWxDbGFzc1xuICAgIHByb3BzOiBUUHJvcHNcbiAgfSxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPEluc3RhbmNlVHlwZTxUTW9kZWxDbGFzcz4sIFRQcm9wcywgRlMsIFRTPlxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscyB0aGF0IGV4dGVuZHMgYW5vdGhlciBtb2RlbC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBOZXcgbW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHR5cGVwYXJhbSBUTW9kZWxDbGFzcyBNb2RlbCBjbGFzcyB0eXBlLlxuICogQHBhcmFtIGJhc2VNb2RlbCBCYXNlIG1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIG1vZGVsT3B0aW9ucyBNb2RlbCBvcHRpb25zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV4dGVuZGVkTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRNb2RlbENsYXNzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENsYXNzPEFueU1vZGVsPixcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KFxuICBiYXNlTW9kZWw6IFRNb2RlbENsYXNzLFxuICBtb2RlbFByb3BzOiBUUHJvcHMsXG4gIG1vZGVsT3B0aW9ucz86IE1vZGVsT3B0aW9uczxUUHJvcHMsIEZTLCBUUz5cbik6IF9Nb2RlbDxJbnN0YW5jZVR5cGU8VE1vZGVsQ2xhc3M+LCBUUHJvcHMsIEZTLCBUUz4gJiB7XG4gIFtQIGluIEV4Y2x1ZGU8a2V5b2YgVE1vZGVsQ2xhc3MsIFwicHJvdG90eXBlXCI+XTogVE1vZGVsQ2xhc3NbUF1cbn1cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIEV4dGVuZGVkTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRNb2RlbENsYXNzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENsYXNzPEFueU1vZGVsPixcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KC4uLmFyZ3M6IGFueVtdKTogX01vZGVsPEluc3RhbmNlVHlwZTxUTW9kZWxDbGFzcz4sIFRQcm9wcywgRlMsIFRTPiB7XG4gIGxldCBiYXNlTW9kZWxcbiAgbGV0IG1vZGVsUHJvcHNcbiAgbGV0IG1vZGVsT3B0aW9uc1xuICBpZiAoaXNNb2RlbENsYXNzKGFyZ3NbMF0pKSB7XG4gICAgYmFzZU1vZGVsID0gYXJnc1swXVxuICAgIG1vZGVsUHJvcHMgPSBhcmdzWzFdXG4gICAgbW9kZWxPcHRpb25zID0gYXJnc1syXVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGdlbiA9IGFyZ3NbMF0oKVxuXG4gICAgYmFzZU1vZGVsID0gZ2VuLmJhc2VNb2RlbFxuICAgIG1vZGVsUHJvcHMgPSBnZW4ucHJvcHNcbiAgICBtb2RlbE9wdGlvbnMgPSBhcmdzWzFdXG4gIH1cblxuICBhc3NlcnRJc01vZGVsQ2xhc3MoYmFzZU1vZGVsLCBcImJhc2VNb2RlbFwiKVxuXG4gIHJldHVybiBpbnRlcm5hbE1vZGVsKG1vZGVsUHJvcHMsIGJhc2VNb2RlbCBhcyBhbnksIG1vZGVsT3B0aW9ucylcbn1cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBtb2RlbHMuXG4gKlxuICogTmV2ZXIgb3ZlcnJpZGUgdGhlIGNvbnN0cnVjdG9yLCB1c2UgYG9uSW5pdGAgb3IgYG9uQXR0YWNoZWRUb1Jvb3RTdG9yZWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAcGFyYW0gZm5Nb2RlbFByb3BzIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIG1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgQSBleHRlbmRzIFtdLFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oXG4gIGZuTW9kZWxQcm9wczogKC4uLmFyZ3M6IEEpID0+IFRQcm9wcyxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPHVua25vd24sIFRQcm9wcywgRlMsIFRTPlxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25Jbml0YCBvciBgb25BdHRhY2hlZFRvUm9vdFN0b3JlYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFByb3BzIE1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KG1vZGVsUHJvcHM6IFRQcm9wcywgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPik6IF9Nb2RlbDx1bmtub3duLCBUUHJvcHMsIEZTLCBUUz5cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oXG4gIGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wczogKCgpID0+IFRQcm9wcykgfCBUUHJvcHMsXG4gIG1vZGVsT3B0aW9ucz86IE1vZGVsT3B0aW9uczxUUHJvcHMsIEZTLCBUUz5cbik6IF9Nb2RlbDx1bmtub3duLCBUUHJvcHMsIEZTLCBUUz4ge1xuICBjb25zdCBtb2RlbFByb3BzID1cbiAgICB0eXBlb2YgZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzKClcbiAgICAgIDogZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzXG4gIHJldHVybiBpbnRlcm5hbE1vZGVsKG1vZGVsUHJvcHMsIHVuZGVmaW5lZCwgbW9kZWxPcHRpb25zKVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBUQmFzZU1vZGVsIGV4dGVuZHMgQW55TW9kZWwsXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgbW9kZWxQcm9wczogVFByb3BzLFxuICBiYXNlTW9kZWw6IE1vZGVsQ2xhc3M8VEJhc2VNb2RlbD4gfCB1bmRlZmluZWQsXG4gIG1vZGVsT3B0aW9ucz86IE1vZGVsT3B0aW9uczxUUHJvcHMsIEZTLCBUUz5cbik6IF9Nb2RlbDxUQmFzZU1vZGVsLCBUUHJvcHMsIEZTLCBUUz4ge1xuICByZXR1cm4gc2hhcmVkSW50ZXJuYWxNb2RlbCh7XG4gICAgbW9kZWxQcm9wcyxcbiAgICBiYXNlTW9kZWwsXG4gICAgdHlwZTogXCJjbGFzc1wiLFxuICAgIHZhbHVlVHlwZTogbW9kZWxPcHRpb25zPy52YWx1ZVR5cGUgPz8gZmFsc2UsXG4gICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiBtb2RlbE9wdGlvbnM/LmZyb21TbmFwc2hvdFByb2Nlc3NvcixcbiAgICB0b1NuYXBzaG90UHJvY2Vzc29yOiBtb2RlbE9wdGlvbnM/LnRvU25hcHNob3RQcm9jZXNzb3IsXG4gIH0pXG59XG5cbi8qKlxuICogTW9kZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbE9wdGlvbnM8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgRlMsIFRTPiB7XG4gIC8qKlxuICAgKiBBIHZhbHVlIHR5cGUgd2lsbCBiZSBjbG9uZWQgYXV0b21hdGljYWxseSB3aGVuIGJlaW5nIGF0dGFjaGVkIHRvIGEgbmV3IHRyZWUuXG4gICAqIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICB2YWx1ZVR5cGU/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSBydW4gd2hlbiBjb252ZXJ0aW5nIGZyb20gYSBzbmFwc2hvdCB0byB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBtb2RlbC5cbiAgICogVXNlZnVsIGZvciBleGFtcGxlIHRvIGRvIHZlcnNpb25pbmcgYW5kIGtlZXAgdGhlIGRhdGEgcGFydCB1cCB0byBkYXRlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHNuIFRoZSBjdXN0b20gaW5wdXQgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIEFuIGlucHV0IHNuYXBzaG90IHRoYXQgbXVzdCBtYXRjaCB0aGUgZXhwZWN0ZWQgbW9kZWwgaW5wdXQgc25hcHNob3QuXG4gICAqL1xuICBmcm9tU25hcHNob3RQcm9jZXNzb3I/KHNuOiBGUyk6IEZyb21TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcz5cblxuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gdGhhdCB3aWxsIGJlIHJ1biB3aGVuIGNvbnZlcnRpbmcgdGhlIGRhdGEgcGFydCBvZiB0aGUgbW9kZWwgaW50byBhIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gc24gVGhlIG91dHB1dCBzbmFwc2hvdC5cbiAgICogQHBhcmFtIG1vZGVsSW5zdGFuY2UgVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyAgYSBjdXN0b20gb3V0cHV0IHNuYXBzaG90LlxuICAgKi9cbiAgdG9TbmFwc2hvdFByb2Nlc3Nvcj8oc246IFRvU25hcHNob3REZWZhdWx0VHlwZTxUUHJvcHM+LCBtb2RlbEluc3RhbmNlOiBhbnkpOiBUU1xufVxuIiwiaW1wb3J0IHsgSG9va0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vaG9va0FjdGlvbnNcIlxuaW1wb3J0IHsgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZCB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGdldEdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzLCBtb2RlbEluaXRpYWxpemVkU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzLCBtb2RlbEluZm9CeU5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7XG4gIG1vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2wsXG4gIHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbFN5bWJvbHNcIlxuaW1wb3J0IHtcbiAgYWRkSGlkZGVuUHJvcCxcbiAgZmFpbHVyZSxcbiAgZ2V0TW9ieFZlcnNpb24sXG4gIGxvZ1dhcm5pbmcsXG4gIG1vYng2LFxuICBydW5BZnRlck5ld1N5bWJvbCxcbiAgcnVuQmVmb3JlT25Jbml0U3ltYm9sLFxuICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMsXG59IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgbWFya3MgdGhpcyBjbGFzcyAod2hpY2ggTVVTVCBpbmhlcml0IGZyb20gdGhlIGBNb2RlbGAgb3IgYERhdGFNb2RlbGAgYWJzdHJhY3QgY2xhc3NlcylcbiAqIGFzIGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG5hbWUgVW5pcXVlIG5hbWUgZm9yIHRoZSBtb2RlbCB0eXBlLiBOb3RlIHRoYXQgdGhpcyBuYW1lIG11c3QgYmUgdW5pcXVlIGZvciB5b3VyIHdob2xlXG4gKiBhcHBsaWNhdGlvbiwgc28gaXQgaXMgdXN1YWxseSBhIGdvb2QgaWRlYSB0byB1c2Ugc29tZSBwcmVmaXggdW5pcXVlIHRvIHlvdXIgYXBwbGljYXRpb24gZG9tYWluLlxuICovXG5leHBvcnQgY29uc3QgbW9kZWwgPVxuICAobmFtZTogc3RyaW5nKSA9PlxuICA8TUMgZXh0ZW5kcyBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPj4oY2xheno6IE1DKTogTUMgPT4ge1xuICAgIHJldHVybiBpbnRlcm5hbE1vZGVsKG5hbWUpKGNsYXp6KVxuICB9XG5cbmNvbnN0IGludGVybmFsTW9kZWwgPVxuICAobmFtZTogc3RyaW5nKSA9PlxuICA8TUMgZXh0ZW5kcyBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPj4oY2xheno6IE1DKTogTUMgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBpc01vZGVsQ2xhc3MoY2xhenopID8gXCJjbGFzc1wiIDogaXNEYXRhTW9kZWxDbGFzcyhjbGF6eikgPyBcImRhdGFcIiA6IHVuZGVmaW5lZFxuICAgIGlmICghdHlwZSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgY2xhenogbXVzdCBiZSBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBmcm9tIE1vZGVsL0RhdGFNb2RlbGApXG4gICAgfVxuXG4gICAgaWYgKG1vZGVsSW5mb0J5TmFtZVtuYW1lXSkge1xuICAgICAgaWYgKGdldEdsb2JhbENvbmZpZygpLnNob3dEdXBsaWNhdGVNb2RlbE5hbWVXYXJuaW5ncykge1xuICAgICAgICBsb2dXYXJuaW5nKFxuICAgICAgICAgIFwid2FyblwiLFxuICAgICAgICAgIGBhIG1vZGVsIHdpdGggbmFtZSBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0cyAoaWYgeW91IGFyZSB1c2luZyBob3QtcmVsb2FkaW5nIHlvdSBtYXkgc2FmZWx5IGlnbm9yZSB0aGlzIHdhcm5pbmcpYCxcbiAgICAgICAgICBgZHVwbGljYXRlTW9kZWxOYW1lIC0gJHtuYW1lfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sIGluIGNsYXp6KSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYSBjbGFzcyBhbHJlYWR5IGRlY29yYXRlZCB3aXRoIGBAbW9kZWxgIGNhbm5vdCBiZSByZS1kZWNvcmF0ZWRcIilcbiAgICB9XG5cbiAgICAvLyB0cmFjayBpZiB3ZSBmYWlsIHNvIHdlIG9ubHkgdHJ5IGl0IG9uY2UgcGVyIGNsYXNzXG4gICAgbGV0IG1ha2VPYnNlcnZhYmxlRmFpbGVkID0gZmFsc2VcblxuICAgIC8vIHRyaWNrIHNvIHBsYWluIG5ldyB3b3Jrc1xuICAgIGNvbnN0IG5ld0NsYXp6OiBhbnkgPSBmdW5jdGlvbiAodGhpczogYW55LCBpbml0aWFsRGF0YTogYW55LCBtb2RlbENvbnN0cnVjdG9yT3B0aW9uczogYW55KSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyAoY2xhenogYXMgYW55KShpbml0aWFsRGF0YSwgbW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMpXG5cbiAgICAgIC8vIHNldCBvciBlbHNlIGl0IHBvaW50cyB0byB0aGUgdW5kZWNvcmF0ZWQgY2xhc3NcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbmV3Q2xhenosXG4gICAgICB9KVxuXG4gICAgICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMoaW5zdGFuY2UsIHJ1bkFmdGVyTmV3U3ltYm9sKVxuXG4gICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggbW9ieCA2XG4gICAgICBpZiAoIW1ha2VPYnNlcnZhYmxlRmFpbGVkICYmIGdldE1vYnhWZXJzaW9uKCkgPj0gNikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vYng2Lm1ha2VPYnNlcnZhYmxlKGluc3RhbmNlKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gc2FkbHkgd2UgbmVlZCB0byB1c2UgdGhpcyBoYWNrIHNpbmNlIHRoZSBQUiB0byBkbyB0aGlzIHRoZSBwcm9wZXIgd2F5XG4gICAgICAgICAgLy8gd2FzIHJlamVjdGVkIG9uIHRoZSBtb2J4IHNpZGVcbiAgICAgICAgICBtYWtlT2JzZXJ2YWJsZUZhaWxlZCA9IHRydWVcblxuICAgICAgICAgIGNvbnN0IGVyciA9IGUgYXMgRXJyb3JcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlcnIubWVzc2FnZSAhPT1cbiAgICAgICAgICAgICAgXCJbTW9iWF0gTm8gYW5ub3RhdGlvbnMgd2VyZSBwYXNzZWQgdG8gbWFrZU9ic2VydmFibGUsIGJ1dCBubyBkZWNvcmF0b3IgbWVtYmVycyBoYXZlIGJlZW4gZm91bmQgZWl0aGVyXCIgJiZcbiAgICAgICAgICAgIGVyci5tZXNzYWdlICE9PVxuICAgICAgICAgICAgICBcIltNb2JYXSBObyBhbm5vdGF0aW9ucyB3ZXJlIHBhc3NlZCB0byBtYWtlT2JzZXJ2YWJsZSwgYnV0IG5vIGRlY29yYXRlZCBtZW1iZXJzIGhhdmUgYmVlbiBmb3VuZCBlaXRoZXJcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgZXJyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHRoZSBvYmplY3QgaXMgcmVhZHlcbiAgICAgIGFkZEhpZGRlblByb3AoaW5zdGFuY2UsIG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wsIHRydWUsIGZhbHNlKVxuXG4gICAgICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMoaW5zdGFuY2UsIHJ1bkJlZm9yZU9uSW5pdFN5bWJvbClcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY2xhc3NcIiAmJiBpbnN0YW5jZS5vbkluaXQpIHtcbiAgICAgICAgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZChpbnN0YW5jZSwgXCJvbkluaXRcIiwgSG9va0FjdGlvbi5PbkluaXQpXG5cbiAgICAgICAgaW5zdGFuY2Uub25Jbml0KClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09IFwiZGF0YVwiICYmIGluc3RhbmNlLm9uTGF6eUluaXQpIHtcbiAgICAgICAgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZChpbnN0YW5jZSwgXCJvbkxhenlJbml0XCIsIEhvb2tBY3Rpb24uT25MYXp5SW5pdClcblxuICAgICAgICBpbnN0YW5jZS5vbkxhenlJbml0KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuXG4gICAgY2xhenoudG9TdHJpbmcgPSAoKSA9PiBgY2xhc3MgJHtjbGF6ei5uYW1lfSMke25hbWV9YFxuICAgIGlmICh0eXBlID09PSBcImNsYXNzXCIpIHtcbiAgICAgIDsoY2xhenogYXMgYW55KVttb2RlbFR5cGVLZXldID0gbmFtZVxuICAgIH1cblxuICAgIC8vIHRoaXMgYWxzbyBnaXZlcyBhY2Nlc3MgdG8gbW9kZWxJbml0aWFsaXplcnNTeW1ib2wsIG1vZGVsUHJvcGVydGllc1N5bWJvbCwgbW9kZWxEYXRhVHlwZUNoZWNrZXJTeW1ib2xcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3Q2xhenosIGNsYXp6KVxuICAgIG5ld0NsYXp6LnByb3RvdHlwZSA9IGNsYXp6LnByb3RvdHlwZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NsYXp6LCBcIm5hbWVcIiwge1xuICAgICAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXdDbGF6eiwgXCJuYW1lXCIpLFxuICAgICAgdmFsdWU6IGNsYXp6Lm5hbWUsXG4gICAgfSlcbiAgICBuZXdDbGF6elttb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sXSA9IGNsYXp6XG5cbiAgICBjb25zdCBtb2RlbEluZm8gPSB7XG4gICAgICBuYW1lLFxuICAgICAgY2xhc3M6IG5ld0NsYXp6LFxuICAgIH1cblxuICAgIG1vZGVsSW5mb0J5TmFtZVtuYW1lXSA9IG1vZGVsSW5mb1xuXG4gICAgbW9kZWxJbmZvQnlDbGFzcy5zZXQobmV3Q2xhenosIG1vZGVsSW5mbylcbiAgICBtb2RlbEluZm9CeUNsYXNzLnNldChjbGF6eiwgbW9kZWxJbmZvKVxuXG4gICAgcnVuTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zKGNsYXp6LCBydW5BZnRlck1vZGVsRGVjb3JhdG9yU3ltYm9sKVxuXG4gICAgcmV0dXJuIG5ld0NsYXp6XG4gIH1cblxuLy8gYmFzaWNhbGx5IHRha2VuIGZyb20gVFNcbmZ1bmN0aW9uIHRzRGVjb3JhdGUoZGVjb3JhdG9yczogYW55LCB0YXJnZXQ6IGFueSwga2V5OiBhbnksIGRlc2M6IGFueSkge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyAoZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpKSA6IGRlc2MsXG4gICAgZFxuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIChSZWZsZWN0IGFzIGFueSkuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIilcbiAgICByID0gKFJlZmxlY3QgYXMgYW55KS5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYylcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZXF1ZW5jZXNcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgclxufVxuXG4vKipcbiAqIE1hcmtzIGEgY2xhc3MgKHdoaWNoIE1VU1QgaW5oZXJpdCBmcm9tIHRoZSBgTW9kZWxgIGFic3RyYWN0IGNsYXNzKVxuICogYXMgYSBtb2RlbCBhbmQgZGVjb3JhdGVzIHNvbWUgb2YgaXRzIG1ldGhvZHMvcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gbmFtZSBVbmlxdWUgbmFtZSBmb3IgdGhlIG1vZGVsIHR5cGUuIE5vdGUgdGhhdCB0aGlzIG5hbWUgbXVzdCBiZSB1bmlxdWUgZm9yIHlvdXIgd2hvbGVcbiAqIGFwcGxpY2F0aW9uLCBzbyBpdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvIHVzZSBzb21lIHByZWZpeCB1bmlxdWUgdG8geW91ciBhcHBsaWNhdGlvbiBkb21haW4uXG4gKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhc3NpZ24gYSBuYW1lIHlldCAoZS5nLiBmb3IgYSBiYXNlIG1vZGVsKSBwYXNzIGB1bmRlZmluZWRgLlxuICogQHBhcmFtIGNsYXp6IE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIGRlY29yYXRvcnMgRGVjb3JhdG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlZE1vZGVsPE0sIE1DIGV4dGVuZHMgYWJzdHJhY3QgbmV3ICguLi5hZ3M6IGFueSkgPT4gTT4oXG4gIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY2xheno6IE1DLFxuICBkZWNvcmF0b3JzOiB7XG4gICAgW2sgaW4ga2V5b2YgTV0/OiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgUmVhZG9ubHlBcnJheTwoLi4uYXJnczogYW55W10pID0+IGFueT5cbiAgfVxuKTogTUMge1xuICAvLyBkZWNvcmF0ZSBjbGFzcyBtZW1iZXJzXG4gIGZvciAoY29uc3QgW2ssIGRlY29yYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9ycykpIHtcbiAgICBjb25zdCBwcm90b3R5cGVWYWx1ZURlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNsYXp6LnByb3RvdHlwZSwgaylcbiAgICAvLyBUUyBzZWVtcyB0byBzZW5kIG51bGwgZm9yIG1ldGhvZHMgaW4gdGhlIHByb3RvdHlwZVxuICAgIC8vICh3aGljaCB3ZSBzdWJzdGl0dXRlIGZvciB0aGUgZGVzY3JpcHRvciB0byBhdm9pZCBhIGRvdWJsZSBsb29rLXVwKSBhbmQgdm9pZCAwICh1bmRlZmluZWQpIGZvciBwcm9wc1xuICAgIHRzRGVjb3JhdGUoXG4gICAgICBBcnJheS5pc0FycmF5KGRlY29yYXRvcikgPyBkZWNvcmF0b3IgOiBbZGVjb3JhdG9yXSxcbiAgICAgIGNsYXp6LnByb3RvdHlwZSxcbiAgICAgIGssXG4gICAgICBwcm90b3R5cGVWYWx1ZURlc2MgPyBwcm90b3R5cGVWYWx1ZURlc2MgOiB2b2lkIDBcbiAgICApXG4gIH1cblxuICByZXR1cm4gKG5hbWUgPyBtb2RlbChuYW1lKShjbGF6eiBhcyB1bmtub3duIGFzIE1vZGVsQ2xhc3M8QW55TW9kZWw+KSA6IGNsYXp6KSBhcyBNQ1xufVxuIiwiaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXHJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcclxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlLCBBcnJheVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7XHJcbiAgbGF0ZVR5cGVDaGVja2VyLFxyXG4gIFR5cGVDaGVja2VyLFxyXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXHJcbiAgVHlwZUluZm8sXHJcbiAgVHlwZUluZm9HZW4sXHJcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcclxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxyXG5cclxuLyoqXHJcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdmFsdWVzIG9mIGEgZ2l2ZW4gdHlwZS5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3QgbnVtYmVyQXJyYXlUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMubnVtYmVyKVxyXG4gKiBgYGBcclxuICpcclxuICogQHR5cGVwYXJhbSBUIEl0ZW0gdHlwZS5cclxuICogQHBhcmFtIGl0ZW1UeXBlIFR5cGUgb2YgaW5uZXIgaXRlbXMuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNBcnJheTxUIGV4dGVuZHMgQW55VHlwZT4oaXRlbVR5cGU6IFQpOiBBcnJheVR5cGU8VFtdPiB7XHJcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBBcnJheVR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUoaXRlbVR5cGUpKVxyXG5cclxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcclxuICAgIGNvbnN0IGl0ZW1DaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGl0ZW1UeXBlKVxyXG5cclxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT5cclxuICAgICAgYEFycmF5PCR7aXRlbUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCBpdGVtQ2hlY2tlcil9PmBcclxuXHJcbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLkFycmF5LFxyXG5cclxuICAgICAgKGFycmF5LCBwYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBhcnJheSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXRlbUNoZWNrZXIudW5jaGVja2VkKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1FcnJvciA9IGl0ZW1DaGVja2VyLmNoZWNrKGFycmF5W2ldLCBbLi4ucGF0aCwgaV0pXHJcbiAgICAgICAgICAgIGlmIChpdGVtRXJyb3IpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gaXRlbUVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldFR5cGVOYW1lLFxyXG4gICAgICB0eXBlSW5mb0dlbixcclxuXHJcbiAgICAgIChhcnJheSkgPT4ge1xyXG4gICAgICAgIGlmICghaXNBcnJheShhcnJheSkpIHtcclxuICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWl0ZW1DaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQWN0dWFsQ2hlY2tlciA9IGl0ZW1DaGVja2VyLnNuYXBzaG90VHlwZShhcnJheVtpXSlcclxuICAgICAgICAgICAgaWYgKCFpdGVtQWN0dWFsQ2hlY2tlcikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzVGNcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChzbjogdW5rbm93bltdKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW1DaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc24ubWFwKChpdGVtKSA9PiBpdGVtQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3IoaXRlbSkpXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICAoc246IHVua25vd25bXSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtQ2hlY2tlci51bmNoZWNrZWQpIHtcclxuICAgICAgICAgIHJldHVybiBzblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNuLm1hcCgoaXRlbSkgPT4gaXRlbUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3NvcihpdGVtKSlcclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiB0aGlzVGNcclxuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMuYXJyYXlgIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBBcnJheVR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xyXG4gIGdldCBpdGVtVHlwZUluZm8oKTogVHlwZUluZm8ge1xyXG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMuaXRlbVR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBpdGVtVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XHJcbiAgICBzdXBlcih0aGlzVHlwZSlcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjb21wdXRlZCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIH0gZnJvbSBcIi4uL2FjdGlvbi9taWRkbGV3YXJlXCJcbmltcG9ydCB7IG1vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiXG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbERlY29yYXRvclwiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzLCBQYXRjaCwgcGF0Y2hSZWNvcmRlciwgUGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyB0eXBlc0FycmF5IH0gZnJvbSBcIi4uL3R5cGVzL2FycmF5QmFzZWQvdHlwZXNBcnJheVwiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuLi90eXBlcy91dGlsaXR5L3R5cGVzVW5jaGVja2VkXCJcbmltcG9ydCB7IGZhaWx1cmUsIGdldE1vYnhWZXJzaW9uLCBtb2J4NiwgbmFtZXNwYWNlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGFjdGlvblRyYWNraW5nTWlkZGxld2FyZSwgU2ltcGxlQWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL2FjdGlvblRyYWNraW5nTWlkZGxld2FyZVwiXG5cbi8qKlxuICogQW4gdW5kby9yZWRvIGV2ZW50IHdpdGhvdXQgYXR0YWNoZWQgc3RhdGUuXG4gKi9cbmV4cG9ydCB0eXBlIFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlID0gVW5kb1NpbmdsZUV2ZW50IHwgVW5kb0V2ZW50R3JvdXBcblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gZXZlbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFVuZG9FdmVudCA9IFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlICYge1xuICAvKipcbiAgICogVGhlIHN0YXRlIHNhdmVkIGJlZm9yZSB0aGUgZXZlbnQgYWN0aW9ucyBzdGFydGVkIC8gYWZ0ZXIgdGhlIGV2ZW50IGFjdGlvbnMgZmluaXNoZWQuXG4gICAqL1xuICBhdHRhY2hlZFN0YXRlOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIHNhdmVkIGJlZm9yZSB0aGUgZXZlbnQgYWN0aW9ucyBzdGFydGVkLlxuICAgICAqL1xuICAgIGJlZm9yZUV2ZW50PzogdW5rbm93blxuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBzYXZlZCBhZnRlciB0aGUgZXZlbnQgYWN0aW9ucyBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBhZnRlckV2ZW50PzogdW5rbm93blxuICB9XG59XG5cbi8qKlxuICogVW5kbyBldmVudCB0eXBlLlxuICovXG5leHBvcnQgZW51bSBVbmRvRXZlbnRUeXBlIHtcbiAgU2luZ2xlID0gXCJzaW5nbGVcIixcbiAgR3JvdXAgPSBcImdyb3VwXCIsXG59XG5cbi8qKlxuICogQW4gdW5kby9yZWRvIHNpbmdsZSBldmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmRvU2luZ2xlRXZlbnQge1xuICAvKipcbiAgICogRXhwcmVzc2VzIHRoaXMgaXMgYSBzaW5nbGUgZXZlbnQuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBVbmRvRXZlbnRUeXBlLlNpbmdsZVxuICAvKipcbiAgICogUGF0aCB0byB0aGUgb2JqZWN0IHRoYXQgaW52b2tlZCB0aGUgYWN0aW9uIGZyb20gaXRzIHJvb3QuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoOiBQYXRoXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCB3YXMgaW52b2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZ1xuICAvKipcbiAgICogUGF0Y2hlcyB3aXRoIGNoYW5nZXMgZG9uZSBpbnNpZGUgdGhlIGFjdGlvbi5cbiAgICogVXNlIGByZWRvKClgIGluIHRoZSBgVW5kb01hbmFnZXJgIHRvIGFwcGx5IHRoZW0uXG4gICAqL1xuICByZWFkb25seSBwYXRjaGVzOiBSZWFkb25seUFycmF5PFBhdGNoPlxuICAvKipcbiAgICogUGF0Y2hlcyB0byB1bmRvIHRoZSBjaGFuZ2VzIGRvbmUgaW5zaWRlIHRoZSBhY3Rpb24uXG4gICAqIFVzZSBgdW5kbygpYCBpbiB0aGUgYFVuZG9NYW5hZ2VyYCB0byBhcHBseSB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52ZXJzZVBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+XG59XG5cbi8qKlxuICogQW4gdW5kby9yZWRvIGV2ZW50IGdyb3VwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuZG9FdmVudEdyb3VwIHtcbiAgLyoqXG4gICAqIEV4cHJlc3NlcyB0aGlzIGlzIGFuIGV2ZW50IGdyb3VwLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVW5kb0V2ZW50VHlwZS5Hcm91cFxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgZ3JvdXAgKGlmIGFueSkuXG4gICAqL1xuICByZWFkb25seSBncm91cE5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEV2ZW50cyB0aGF0IGNvbmZvcm0gdGhpcyBncm91cCAobWlnaHQgYmUgc2luZ2xlIGV2ZW50cyBvciBvdGhlciBuZXN0ZWQgZ3JvdXBzKS5cbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50czogUmVhZG9ubHlBcnJheTxVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZT5cbn1cblxuZnVuY3Rpb24gdG9TaW5nbGVFdmVudHMoXG4gIGV2ZW50OiBVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZSxcbiAgcmV2ZXJzZTogYm9vbGVhblxuKTogUmVhZG9ubHlBcnJheTxVbmRvU2luZ2xlRXZlbnQ+IHtcbiAgaWYgKGV2ZW50LnR5cGUgPT09IFVuZG9FdmVudFR5cGUuU2luZ2xlKSByZXR1cm4gW2V2ZW50XVxuICBlbHNlIHtcbiAgICBjb25zdCBhcnJheTogVW5kb1NpbmdsZUV2ZW50W10gPSBbXVxuICAgIGZvciAoY29uc3QgZSBvZiBldmVudC5ldmVudHMpIHtcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIGFycmF5LnVuc2hpZnQoLi4udG9TaW5nbGVFdmVudHMoZSwgdHJ1ZSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheS5wdXNoKC4uLnRvU2luZ2xlRXZlbnRzKGUsIGZhbHNlKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5XG4gIH1cbn1cblxuLyoqXG4gKiBTdG9yZSBtb2RlbCBpbnN0YW5jZSBmb3IgdW5kby9yZWRvIGFjdGlvbnMuXG4gKiBEbyBub3QgbWFuaXB1bGF0ZSBkaXJlY3RseSwgb3RoZXIgdGhhdCBjcmVhdGluZyBpdC5cbiAqL1xuQG1vZGVsKGAke25hbWVzcGFjZX0vVW5kb1N0b3JlYClcbmV4cG9ydCBjbGFzcyBVbmRvU3RvcmUgZXh0ZW5kcyBNb2RlbCh7XG4gIC8vIFRPRE86IGFkZCBwcm9wZXIgdHlwZSBjaGVja2luZyB0byB1bmRvIHN0b3JlXG4gIHVuZG9FdmVudHM6IHRQcm9wKHR5cGVzQXJyYXkodHlwZXNVbmNoZWNrZWQ8VW5kb0V2ZW50PigpKSwgKCkgPT4gW10pLFxuICByZWRvRXZlbnRzOiB0UHJvcCh0eXBlc0FycmF5KHR5cGVzVW5jaGVja2VkPFVuZG9FdmVudD4oKSksICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfY2xlYXJVbmRvKCkge1xuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIHRoaXMudW5kb0V2ZW50cy5sZW5ndGggPSAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAbW9kZWxBY3Rpb25cbiAgX2NsZWFyUmVkbygpIHtcbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0aGlzLnJlZG9FdmVudHMubGVuZ3RoID0gMFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQG1vZGVsQWN0aW9uXG4gIF91bmRvKCkge1xuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy51bmRvRXZlbnRzLnBvcCgpIVxuICAgICAgdGhpcy5yZWRvRXZlbnRzLnB1c2goZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAbW9kZWxBY3Rpb25cbiAgX3JlZG8oKSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnJlZG9FdmVudHMucG9wKCkhXG4gICAgICB0aGlzLnVuZG9FdmVudHMucHVzaChldmVudClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfYWRkVW5kbyhldmVudDogVW5kb0V2ZW50KSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgdGhpcy51bmRvRXZlbnRzLnB1c2goZXZlbnQpXG4gICAgICAvLyBvbmNlIGFuIHVuZG8gZXZlbnQgaXMgYWRkZWQgcmVkbyBxdWV1ZSBpcyBubyBsb25nZXIgdmFsaWRcbiAgICAgIHRoaXMucmVkb0V2ZW50cy5sZW5ndGggPSAwXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2dyb3VwU3RhY2s6IFVuZG9FdmVudEdyb3VwW10gPSBbXVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBfYWRkVW5kb1RvUGFyZW50R3JvdXAocGFyZW50R3JvdXA6IFVuZG9FdmVudEdyb3VwLCBldmVudDogVW5kb0V2ZW50V2l0aG91dEF0dGFjaGVkU3RhdGUpIHtcbiAgICA7KHBhcmVudEdyb3VwLmV2ZW50cyBhcyBVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZVtdKS5wdXNoKGV2ZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldCBfY3VycmVudEdyb3VwKCk6IFVuZG9FdmVudEdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBTdGFja1t0aGlzLl9ncm91cFN0YWNrLmxlbmd0aCAtIDFdXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgX3N0YXJ0R3JvdXAoXG4gICAgZ3JvdXBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3RhcnRSdW5uaW5nOiBib29sZWFuLFxuICAgIG9wdGlvbnM6IFVuZG9NaWRkbGV3YXJlT3B0aW9uczx1bmtub3duPiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlXG4gICAgbGV0IGVuZGVkID0gZmFsc2VcbiAgICBjb25zdCBwYXJlbnRHcm91cCA9IHRoaXMuX2N1cnJlbnRHcm91cFxuXG4gICAgY29uc3QgZ3JvdXA6IFVuZG9FdmVudEdyb3VwID0ge1xuICAgICAgdHlwZTogVW5kb0V2ZW50VHlwZS5Hcm91cCxcbiAgICAgIGdyb3VwTmFtZSxcbiAgICAgIGV2ZW50czogW10sXG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNoZWRTdGF0ZUJlZm9yZUV2ZW50ID0gcGFyZW50R3JvdXAgPyB1bmRlZmluZWQgOiBvcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5zYXZlKClcblxuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIHBhdXNlOiAoKSA9PiB7XG4gICAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcGF1c2UgYSBncm91cCB3aGVuIGl0IGlzIGFscmVhZHkgZW5kZWRcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHBhdXNlIGEgZ3JvdXAgd2hlbiBpdCBpcyBub3QgcnVubmluZ1wiKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50R3JvdXAgIT09IGdyb3VwKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcImdyb3VwIG91dCBvZiBvcmRlclwiKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2dyb3VwU3RhY2sucG9wKClcbiAgICAgICAgcnVubmluZyA9IGZhbHNlXG4gICAgICB9LFxuICAgICAgcmVzdW1lOiAoKSA9PiB7XG4gICAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVzdW1lIGEgZ3JvdXAgd2hlbiBpdCBpcyBhbHJlYWR5IGVuZGVkXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHJlc3VtZSBhIGdyb3VwIHdoZW4gaXQgaXMgYWxyZWFkeSBydW5uaW5nXCIpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ3JvdXBTdGFjay5wdXNoKGdyb3VwKVxuICAgICAgICBydW5uaW5nID0gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIGFwaS5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIGlmIChwYXJlbnRHcm91cCkge1xuICAgICAgICAgIHRoaXMuX2FkZFVuZG9Ub1BhcmVudEdyb3VwKHBhcmVudEdyb3VwLCBncm91cClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9hZGRVbmRvKHtcbiAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgYXR0YWNoZWRTdGF0ZToge1xuICAgICAgICAgICAgICBiZWZvcmVFdmVudDogYXR0YWNoZWRTdGF0ZUJlZm9yZUV2ZW50LFxuICAgICAgICAgICAgICBhZnRlckV2ZW50OiBvcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5zYXZlKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0UnVubmluZykge1xuICAgICAgYXBpLnJlc3VtZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFwaVxuICB9XG59XG5cbi8qKlxuICogTWFuYWdlciBjbGFzcyByZXR1cm5lZCBieSBgdW5kb01pZGRsZXdhcmVgIHRoYXQgYWxsb3dzIHlvdSB0byBwZXJmb3JtIHVuZG8vcmVkbyBhY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVW5kb01hbmFnZXIge1xuICAvKipcbiAgICogVGhlIHN0b3JlIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvIHN0b3JlIHVuZG8vcmVkbyBhY3Rpb24gZXZlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmU6IFVuZG9TdG9yZVxuXG4gIC8qKlxuICAgKiBUaGUgdW5kbyBzdGFjaywgd2hlcmUgdGhlIGZpcnN0IG9wZXJhdGlvbiB0byB1bmRvIHdpbGwgYmUgdGhlIGxhc3Qgb2YgdGhlIGFycmF5LlxuICAgKiBEbyBub3QgbWFuaXB1bGF0ZSB0aGlzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB1bmRvUXVldWUoKTogUmVhZG9ubHlBcnJheTxVbmRvRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS51bmRvRXZlbnRzXG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZG8gc3RhY2ssIHdoZXJlIHRoZSBmaXJzdCBvcGVyYXRpb24gdG8gcmVkbyB3aWxsIGJlIHRoZSBsYXN0IG9mIHRoZSBhcnJheS5cbiAgICogRG8gbm90IG1hbmlwdWxhdGUgdGhpcyBhcnJheSBkaXJlY3RseS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgcmVkb1F1ZXVlKCk6IFJlYWRvbmx5QXJyYXk8VW5kb0V2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUucmVkb0V2ZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgdW5kbyBhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgdW5kb0xldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvUXVldWUubGVuZ3RoXG4gIH1cblxuICAvKipcbiAgICogSWYgdW5kbyBjYW4gYmUgcGVyZm9ybWVkIChpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdW5kbyBhY3Rpb24gYXZhaWxhYmxlKS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgY2FuVW5kbygpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvTGV2ZWxzID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgdW5kbyBxdWV1ZS5cbiAgICovXG4gIEBhY3Rpb25cbiAgY2xlYXJVbmRvKCkge1xuICAgIHRoaXMuc3RvcmUuX2NsZWFyVW5kbygpXG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZWRvIGFjdGlvbnMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCByZWRvTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlZG9RdWV1ZS5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiByZWRvIGNhbiBiZSBwZXJmb3JtZWQgKGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZWRvIGFjdGlvbiBhdmFpbGFibGUpXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IGNhblJlZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMucmVkb0xldmVscyA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHJlZG8gcXVldWUuXG4gICAqL1xuICBAYWN0aW9uXG4gIGNsZWFyUmVkbygpIHtcbiAgICB0aGlzLnN0b3JlLl9jbGVhclJlZG8oKVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZG9lcyB0aGUgbGFzdCBhY3Rpb24uXG4gICAqIFdpbGwgdGhyb3cgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIHRvIHVuZG8uXG4gICAqL1xuICBAYWN0aW9uXG4gIHVuZG8oKSB7XG4gICAgaWYgKCF0aGlzLmNhblVuZG8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJub3RoaW5nIHRvIHVuZG9cIilcbiAgICB9XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLnVuZG9RdWV1ZVt0aGlzLnVuZG9RdWV1ZS5sZW5ndGggLSAxXVxuXG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgdG9TaW5nbGVFdmVudHMoZXZlbnQsIHRydWUpLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3QsIGUuaW52ZXJzZVBhdGNoZXMsIHRydWUpXG4gICAgICB9KVxuXG4gICAgICAvLyByZXN0b3JlIHRoZSBhdHRhY2hlZCBzdGF0ZSBiZWZvcmUgdGhlIG9wZXJhdGlvbiB3YXMgbWFkZVxuICAgICAgaWYgKGV2ZW50LmF0dGFjaGVkU3RhdGU/LmJlZm9yZUV2ZW50KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8ucmVzdG9yZShldmVudC5hdHRhY2hlZFN0YXRlLmJlZm9yZUV2ZW50KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnN0b3JlLl91bmRvKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRvZXMgdGhlIHByZXZpb3VzIGFjdGlvbi5cbiAgICogV2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBubyBhY3Rpb24gdG8gcmVkby5cbiAgICovXG4gIEBhY3Rpb25cbiAgcmVkbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVkbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIm5vdGhpbmcgdG8gcmVkb1wiKVxuICAgIH1cbiAgICBjb25zdCBldmVudCA9IHRoaXMucmVkb1F1ZXVlW3RoaXMucmVkb1F1ZXVlLmxlbmd0aCAtIDFdXG5cbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0b1NpbmdsZUV2ZW50cyhldmVudCwgZmFsc2UpLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3QsIGUucGF0Y2hlcylcbiAgICAgIH0pXG5cbiAgICAgIC8vIHJlc3RvcmUgdGhlIGF0dGFjaGVkIHN0YXRlIGFmdGVyIHRoZSBvcGVyYXRpb24gd2FzIG1hZGVcbiAgICAgIGlmIChldmVudC5hdHRhY2hlZFN0YXRlPy5hZnRlckV2ZW50KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8ucmVzdG9yZShldmVudC5hdHRhY2hlZFN0YXRlLmFmdGVyRXZlbnQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuc3RvcmUuX3JlZG8oKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSB1bmRvIG1pZGRsZXdhcmUuXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuZGlzcG9zZXIoKVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGlmIHVuZG8gcmVjb3JkaW5nIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBvciBub3QgZm9yIHRoaXMgcGFydGljdWxhciBgVW5kb01hbmFnZXJgLlxuICAgKi9cbiAgZ2V0IGlzVW5kb1JlY29yZGluZ0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZFxuICB9XG5cbiAgLyoqXG4gICAqIFNraXBzIHRoZSB1bmRvIHJlY29yZGluZyBtZWNoYW5pc20gZm9yIHRoZSBjb2RlIGJsb2NrIHRoYXQgZ2V0cyBydW4gc3luY2hyb25vdXNseSBpbnNpZGUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gVCBDb2RlIGJsb2NrIHJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0gZm4gQ29kZSBibG9jayB0byBydW4uXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHdpdGhvdXRVbmRvPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3Qgc2F2ZWRVbmRvRGlzYWJsZWQgPSB0aGlzLl9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZFxuICAgIHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gdHJ1ZVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZCA9IHNhdmVkVW5kb0Rpc2FibGVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gZ3JvdXAgdGhhdCBjYW4gYmUgY29udGludWVkIG11bHRpcGxlIHRpbWVzIGFuZCB0aGVuIGVuZGVkLlxuICAgKiBAcGFyYW0gZ3JvdXBOYW1lIE9wdGlvbmFsIGdyb3VwIG5hbWUuXG4gICAqIEByZXR1cm5zIEFuIEFQSSB0byBjb250aW51ZS9lbmQgdGhlIGdyb3VwLlxuICAgKi9cbiAgY3JlYXRlR3JvdXAoZ3JvdXBOYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLnN0b3JlLl9zdGFydEdyb3VwKGdyb3VwTmFtZSwgZmFsc2UsIHRoaXMub3B0aW9ucylcblxuICAgIHJldHVybiB7XG4gICAgICBjb250aW51ZTxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgICAgICBncm91cC5yZXN1bWUoKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbigpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZ3JvdXAucGF1c2UoKVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBlbmQoKSB7XG4gICAgICAgIGdyb3VwLmVuZCgpXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwTmFtZSBHcm91cCBuYW1lLlxuICAgKiBAcGFyYW0gZm4gQ29kZSBibG9jay5cbiAgICogQHJldHVybnMgQ29kZSBibG9jayByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB3aXRoR3JvdXA8VD4oZ3JvdXBOYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBUKTogVFxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGZuIENvZGUgYmxvY2suXG4gICAqIEByZXR1cm5zIENvZGUgYmxvY2sgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgd2l0aEdyb3VwPFQ+KGZuOiAoKSA9PiBUKTogVFxuXG4gIHdpdGhHcm91cDxUPihhcmcxOiBhbnksIGFyZzI/OiBhbnkpOiBUIHtcbiAgICBsZXQgZ3JvdXBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBsZXQgZm46ICgpID0+IFRcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGdyb3VwTmFtZSA9IGFyZzFcbiAgICAgIGZuID0gYXJnMlxuICAgIH0gZWxzZSB7XG4gICAgICBmbiA9IGFyZzFcbiAgICB9XG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuc3RvcmUuX3N0YXJ0R3JvdXAoZ3JvdXBOYW1lLCB0cnVlLCB0aGlzLm9wdGlvbnMpXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdyb3VwLmVuZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gYXN5bmNocm9ub3VzIGNvZGUgYmxvY2sgYXMgYW4gdW5kbyBncm91cC5cbiAgICogTm90ZSB0aGF0IG5lc3RlZCBncm91cHMgYXJlIGFsbG93ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBncm91cE5hbWUgR3JvdXAgbmFtZS5cbiAgICogQHBhcmFtIGZuIEZsb3cgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIEZsb3cgZnVuY3Rpb24gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgd2l0aEdyb3VwRmxvdzxSPihncm91cE5hbWU6IHN0cmluZywgZm46ICgpID0+IEdlbmVyYXRvcjxhbnksIFIsIGFueT4pOiBQcm9taXNlPFI+XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gYXN5bmNocm9ub3VzIGNvZGUgYmxvY2sgYXMgYW4gdW5kbyBncm91cC5cbiAgICogTm90ZSB0aGF0IG5lc3RlZCBncm91cHMgYXJlIGFsbG93ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmbiBGbG93IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBGbG93IGZ1bmN0aW9uIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHdpdGhHcm91cEZsb3c8Uj4oZm46ICgpID0+IEdlbmVyYXRvcjxhbnksIFIsIGFueT4pOiBQcm9taXNlPFI+XG5cbiAgd2l0aEdyb3VwRmxvdzxSPihhcmcxOiBhbnksIGFyZzI/OiBhbnkpOiBQcm9taXNlPFI+IHtcbiAgICBsZXQgZ3JvdXBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBsZXQgZm46ICgpID0+IEdlbmVyYXRvcjxhbnksIFIsIGFueT5cbiAgICBpZiAodHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGdyb3VwTmFtZSA9IGFyZzFcbiAgICAgIGZuID0gYXJnMlxuICAgIH0gZWxzZSB7XG4gICAgICBmbiA9IGFyZzFcbiAgICB9XG5cbiAgICBjb25zdCBnZW4gPSBmbigpXG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuc3RvcmUuX3N0YXJ0R3JvdXAoZ3JvdXBOYW1lLCBmYWxzZSwgdGhpcy5vcHRpb25zKVxuXG4gICAgLy8gdXNlIGJvdW5kIGZ1bmN0aW9ucyB0byBmaXggZXM2IGNvbXBpbGF0aW9uXG4gICAgY29uc3QgZ2VuTmV4dCA9IGdlbi5uZXh0LmJpbmQoZ2VuKVxuICAgIGNvbnN0IGdlblRocm93ID0gZ2VuLnRocm93IS5iaW5kKGdlbilcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxSPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxlZChyZXM6IGFueSk6IHZvaWQge1xuICAgICAgICBncm91cC5yZXN1bWUoKVxuICAgICAgICBsZXQgcmV0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gZ2VuTmV4dChyZXMpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBncm91cC5lbmQoKVxuICAgICAgICAgIHJlamVjdChlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXAucGF1c2UoKVxuICAgICAgICBuZXh0KHJldClcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25SZWplY3RlZChlcnI6IGFueSk6IHZvaWQge1xuICAgICAgICBncm91cC5yZXN1bWUoKVxuICAgICAgICBsZXQgcmV0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gZ2VuVGhyb3coZXJyKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZ3JvdXAuZW5kKClcbiAgICAgICAgICByZWplY3QoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGdyb3VwLnBhdXNlKClcbiAgICAgICAgbmV4dChyZXQpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG5leHQocmV0OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHJldCAmJiB0eXBlb2YgcmV0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIGFuIGFzeW5jIGl0ZXJhdG9yXG4gICAgICAgICAgcmV0LnRoZW4obmV4dCwgcmVqZWN0KVxuICAgICAgICB9IGVsc2UgaWYgKHJldC5kb25lKSB7XG4gICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgIGdyb3VwLmVuZCgpXG4gICAgICAgICAgcmVzb2x2ZShyZXQudmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29udGludWVcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmV0LnZhbHVlKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9uRnVsZmlsbGVkKHVuZGVmaW5lZCkgLy8ga2ljayBvZmYgdGhlIHByb2Nlc3NcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBVbmRvTWFuYWdlcmAuXG4gICAqIERvIG5vdCB1c2UgZGlyZWN0bHksIHVzZSBgdW5kb01pZGRsZXdhcmVgIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBkaXNwb3NlclxuICAgKiBAcGFyYW0gc3VidHJlZVJvb3RcbiAgICogQHBhcmFtIFtzdG9yZV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzcG9zZXI6IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnRyZWVSb290OiBvYmplY3QsXG4gICAgc3RvcmU6IFVuZG9TdG9yZSB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFVuZG9NaWRkbGV3YXJlT3B0aW9uczx1bmtub3duPiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoZ2V0TW9ieFZlcnNpb24oKSA+PSA2KSB7XG4gICAgICBtb2J4Ni5tYWtlT2JzZXJ2YWJsZSh0aGlzKVxuICAgIH1cblxuICAgIHRoaXMuc3RvcmUgPSBzdG9yZSA/PyBuZXcgVW5kb1N0b3JlKHt9KVxuICB9XG59XG5cbi8qKlxuICogVW5kbyBtaWRkbGV3YXJlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5kb01pZGRsZXdhcmVPcHRpb25zPFM+IHtcbiAgYXR0YWNoZWRTdGF0ZT86IHtcbiAgICBzYXZlKCk6IFNcbiAgICByZXN0b3JlKHM6IFMpOiB2b2lkXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIHVuZG8gbWlkZGxld2FyZS5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gc3RvcmUgT3B0aW9uYWwgYFVuZG9TdG9yZWAgd2hlcmUgdG8gc3RvcmUgdGhlIHVuZG8vcmVkbyBxdWV1ZXMuIFVzZSB0aGlzIGlmIHlvdSB3YW50IHRvXG4gKiBzdG9yZSBzdWNoIHF1ZXVlcyBzb21ld2hlcmUgaW4geW91ciBtb2RlbHMuIElmIG5vbmUgaXMgcHJvdmlkZWQgaXQgd2lsbCByZXNpZGUgaW4gbWVtb3J5LlxuICogQHBhcmFtIG9wdGlvbnMgRXh0cmEgb3B0aW9ucywgc3VjaCBhcyBob3cgdG8gc2F2ZSAvIHJlc3RvcmUgY2VydGFpbiBzbmFwc2hvdCBvZiB0aGUgc3RhdGUgdG8gYmUgcmVzdG9yZWQgd2hlbiB1bmRvaW5nL3JlZG9pbmcuXG4gKiBAcmV0dXJucyBBbiBgVW5kb01hbmFnZXJgIHdoaWNoIGFsbG93cyB5b3UgdG8gZG8gdGhlIG1hbmFnZSB0aGUgdW5kby9yZWRvIG9wZXJhdGlvbnMgYW5kIGRpc3Bvc2Ugb2YgdGhlIG1pZGRsZXdhcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmRvTWlkZGxld2FyZTxTPihcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgc3RvcmU/OiBVbmRvU3RvcmUsXG4gIG9wdGlvbnM/OiBVbmRvTWlkZGxld2FyZU9wdGlvbnM8Uz5cbik6IFVuZG9NYW5hZ2VyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGxldCBtYW5hZ2VyOiBVbmRvTWFuYWdlclxuXG4gIGludGVyZmFjZSBQYXRjaFJlY29yZGVyRGF0YSB7XG4gICAgcmVjb3JkZXI6IFBhdGNoUmVjb3JkZXJcbiAgICByZWNvcmRlclN0YWNrOiBudW1iZXJcbiAgICB1bmRvUm9vdENvbnRleHQ6IFNpbXBsZUFjdGlvbkNvbnRleHRcbiAgICBncm91cDogVW5kb0V2ZW50R3JvdXAgfCB1bmRlZmluZWRcbiAgICBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQ6IFMgfCB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IHBhdGNoUmVjb3JkZXJTeW1ib2wgPSBTeW1ib2woXCJwYXRjaFJlY29yZGVyXCIpXG5cbiAgZnVuY3Rpb24gaW5pdFBhdGNoUmVjb3JkZXIoY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KSB7XG4gICAgY29uc3QgZ3JvdXAgPSBtYW5hZ2VyLnN0b3JlLl9jdXJyZW50R3JvdXBcblxuICAgIGNvbnN0IHBhdGNoUmVjb3JkZXJEYXRhOiBQYXRjaFJlY29yZGVyRGF0YSA9IHtcbiAgICAgIHJlY29yZGVyOiBwYXRjaFJlY29yZGVyKHN1YnRyZWVSb290LCB7XG4gICAgICAgIHJlY29yZGluZzogZmFsc2UsXG4gICAgICAgIGZpbHRlcjogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAhX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkICYmICFtYW5hZ2VyLmlzVW5kb1JlY29yZGluZ0Rpc2FibGVkXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHJlY29yZGVyU3RhY2s6IDAsXG4gICAgICB1bmRvUm9vdENvbnRleHQ6IGN0eCxcbiAgICAgIGdyb3VwLFxuXG4gICAgICBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQ6IG9wdGlvbnM/LmF0dGFjaGVkU3RhdGU/LnNhdmUoKSxcbiAgICB9XG5cbiAgICBjdHgucm9vdENvbnRleHQuZGF0YVtwYXRjaFJlY29yZGVyU3ltYm9sXSA9IHBhdGNoUmVjb3JkZXJEYXRhXG4gIH1cblxuICBmdW5jdGlvbiBnZXRQYXRjaFJlY29yZGVyRGF0YShjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiBQYXRjaFJlY29yZGVyRGF0YSB7XG4gICAgcmV0dXJuIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdXG4gIH1cblxuICBjb25zdCBtaWRkbGV3YXJlRGlzcG9zZXIgPSBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUoc3VidHJlZVJvb3QsIHtcbiAgICBvblN0YXJ0KGN0eCkge1xuICAgICAgaWYgKCFnZXRQYXRjaFJlY29yZGVyRGF0YShjdHgpKSB7XG4gICAgICAgIGluaXRQYXRjaFJlY29yZGVyKGN0eClcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uUmVzdW1lKGN0eCkge1xuICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlckRhdGEgPSBnZXRQYXRjaFJlY29yZGVyRGF0YShjdHgpXG4gICAgICBwYXRjaFJlY29yZGVyRGF0YS5yZWNvcmRlclN0YWNrKytcbiAgICAgIHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyLnJlY29yZGluZyA9IHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyU3RhY2sgPiAwXG4gICAgfSxcbiAgICBvblN1c3BlbmQoY3R4KSB7XG4gICAgICBjb25zdCBwYXRjaFJlY29yZGVyRGF0YSA9IGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eClcbiAgICAgIHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyU3RhY2stLVxuICAgICAgcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXIucmVjb3JkaW5nID0gcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJTdGFjayA+IDBcbiAgICB9LFxuICAgIG9uRmluaXNoKGN0eCkge1xuICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlckRhdGEgPSBnZXRQYXRjaFJlY29yZGVyRGF0YShjdHgpXG4gICAgICBpZiAocGF0Y2hSZWNvcmRlckRhdGEgJiYgcGF0Y2hSZWNvcmRlckRhdGEudW5kb1Jvb3RDb250ZXh0ID09PSBjdHgpIHtcbiAgICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyXG5cbiAgICAgICAgaWYgKHBhdGNoUmVjb3JkZXIuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICAgICAgICBjb25zdCBpbnZlcnNlUGF0Y2hlczogUGF0Y2hbXSA9IFtdXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHBhdGNoUmVjb3JkZXIuZXZlbnRzKSB7XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goLi4uZXZlbnQucGF0Y2hlcylcbiAgICAgICAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goLi4uZXZlbnQuaW52ZXJzZVBhdGNoZXMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICB0eXBlOiBVbmRvRXZlbnRUeXBlLlNpbmdsZSxcbiAgICAgICAgICAgIHRhcmdldFBhdGg6IGZhc3RHZXRSb290UGF0aChjdHgudGFyZ2V0KS5wYXRoLFxuICAgICAgICAgICAgYWN0aW9uTmFtZTogY3R4LmFjdGlvbk5hbWUsXG4gICAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgICAgaW52ZXJzZVBhdGNoZXMsXG4gICAgICAgICAgfSBhcyBjb25zdFxuXG4gICAgICAgICAgY29uc3QgcGFyZW50R3JvdXAgPSBwYXRjaFJlY29yZGVyRGF0YS5ncm91cFxuXG4gICAgICAgICAgaWYgKHBhcmVudEdyb3VwKSB7XG4gICAgICAgICAgICBtYW5hZ2VyLnN0b3JlLl9hZGRVbmRvVG9QYXJlbnRHcm91cChwYXJlbnRHcm91cCwgZXZlbnQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmUuX2FkZFVuZG8oe1xuICAgICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICAgICAgYXR0YWNoZWRTdGF0ZToge1xuICAgICAgICAgICAgICAgIGJlZm9yZUV2ZW50OiBwYXRjaFJlY29yZGVyRGF0YS5hdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICAgICAgYWZ0ZXJFdmVudDogb3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8uc2F2ZSgpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwYXRjaFJlY29yZGVyLmRpc3Bvc2UoKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG5cbiAgbWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihtaWRkbGV3YXJlRGlzcG9zZXIsIHN1YnRyZWVSb290LCBzdG9yZSwgb3B0aW9ucylcbiAgcmV0dXJuIG1hbmFnZXJcbn1cblxubGV0IF9pc0dsb2JhbFVuZG9SZWNvcmRpbmdEaXNhYmxlZCA9IGZhbHNlXG5cbi8qKlxuICogUmV0dXJucyBpZiB0aGUgdW5kbyByZWNvcmRpbmcgbWVjaGFuaXNtIGlzIGN1cnJlbnRseSBkaXNhYmxlZC5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgY3VycmVudGx5IGRpc2FibGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkKCkge1xuICByZXR1cm4gX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkXG59XG5cbi8qKlxuICogR2xvYmFsbHkgc2tpcHMgdGhlIHVuZG8gcmVjb3JkaW5nIG1lY2hhbmlzbSBmb3IgdGhlIGNvZGUgYmxvY2sgdGhhdCBnZXRzIHJ1biBzeW5jaHJvbm91c2x5IGluc2lkZS5cbiAqIENvbnNpZGVyIHVzaW5nIHRoZSBgd2l0aG91dFVuZG9gIG1ldGhvZCBvZiBhIHBhcnRpY3VsYXIgYFVuZG9NYW5hZ2VyYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBDb2RlIGJsb2NrIHJldHVybiB0eXBlLlxuICogQHBhcmFtIGZuIENvZGUgYmxvY2sgdG8gcnVuLlxuICogQHJldHVybnMgVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dFVuZG88VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgY29uc3Qgc2F2ZWRVbmRvRGlzYWJsZWQgPSBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWRcbiAgX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gdHJ1ZVxuICB0cnkge1xuICAgIHJldHVybiBmbigpXG4gIH0gZmluYWxseSB7XG4gICAgX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gc2F2ZWRVbmRvRGlzYWJsZWRcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgSUF0b20sIElDb21wdXRlZFZhbHVlLCBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0LCBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcblxuLyoqXG4gKiBBIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dDxUPiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZXh0IGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXREZWZhdWx0KCk6IFRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCBkZWZhdWx0IHZhbHVlLlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHNldERlZmF1bHQodmFsdWU6IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbnRleHQgZGVmYXVsdCB2YWx1ZSByZXNvbHZlci5cbiAgICogQHBhcmFtIHZhbHVlRm5cbiAgICovXG4gIHNldERlZmF1bHRDb21wdXRlZCh2YWx1ZUZuOiAoKSA9PiBUKTogdm9pZFxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZXh0IHZhbHVlIGZvciBhIGdpdmVuIG5vZGUuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICBnZXQobm9kZTogb2JqZWN0KTogVFxuXG4gIC8qKlxuICAgKiBHZXRzIG5vZGUgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUsIG9yIGB1bmRlZmluZWRgXG4gICAqIGlmIGl0IGNvbWVzIGZyb20gdGhlIGRlZmF1bHQuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICBnZXRQcm92aWRlck5vZGUobm9kZTogb2JqZWN0KTogb2JqZWN0IHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbnRleHQgdmFsdWUgZm9yIGEgZ2l2ZW4gbm9kZSwgZWZmZWN0aXZlbHkgbWFraW5nIGl0IGEgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc2V0KG5vZGU6IG9iamVjdCwgdmFsdWU6IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbnRleHQgdmFsdWUgcmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gbm9kZSwgZWZmZWN0aXZlbHkgbWFraW5nIGl0IGEgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqIEBwYXJhbSB2YWx1ZUZuXG4gICAqL1xuICBzZXRDb21wdXRlZChub2RlOiBvYmplY3QsIHZhbHVlRm46ICgpID0+IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIFVuc2V0cyB0aGUgY29udGV4dCB2YWx1ZSBmb3IgYSBnaXZlbiBub2RlLCB0aGVyZWZvcmUgaXQgd29uJ3QgYmUgYSBwcm92aWRlciBhbnltb3JlLlxuICAgKiBAcGFyYW0gbm9kZVxuICAgKi9cbiAgdW5zZXQobm9kZTogb2JqZWN0KTogdm9pZFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgdmFsdWUgb3ZlcnJpZGUgd2hpbGUgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIHJ1bm5pbmcgYW5kLCBpZiBhIG5vZGUgaXMgcmV0dXJuZWQsXG4gICAqIHNldHMgdGhlIG5vZGUgYXMgYSBwcm92aWRlciBvZiB0aGUgdmFsdWUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gUlxuICAgKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gcnVuLlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIGFwcGx5PFI+KGZuOiAoKSA9PiBSLCB2YWx1ZTogVCk6IFJcblxuICAvKipcbiAgICogQXBwbGllcyBhIGNvbXB1dGVkIHZhbHVlIG92ZXJyaWRlIHdoaWxlIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBydW5uaW5nIGFuZCwgaWYgYSBub2RlIGlzIHJldHVybmVkLFxuICAgKiBzZXRzIHRoZSBub2RlIGFzIGEgcHJvdmlkZXIgb2YgdGhlIGNvbXB1dGVkIHZhbHVlLlxuICAgKlxuICAgKiBAdHlwZXBhcmFtIFJcbiAgICogQHBhcmFtIGZuIEZ1bmN0aW9uIHRvIHJ1bi5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFwcGx5LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBhcHBseUNvbXB1dGVkPFI+KGZuOiAoKSA9PiBSLCB2YWx1ZUZuOiAoKSA9PiBUKTogUlxufVxuXG50eXBlIENvbnRleHRWYWx1ZTxUPiA9XG4gIHwge1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiXG4gICAgICB2YWx1ZTogVFxuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcImNvbXB1dGVkXCJcbiAgICAgIHZhbHVlOiBJQ29tcHV0ZWRWYWx1ZTxUPlxuICAgIH1cblxuZnVuY3Rpb24gcmVzb2x2ZUNvbnRleHRWYWx1ZTxUPihjb250ZXh0VmFsdWU6IENvbnRleHRWYWx1ZTxUPik6IFQge1xuICBpZiAoY29udGV4dFZhbHVlLnR5cGUgPT09IFwidmFsdWVcIikge1xuICAgIHJldHVybiBjb250ZXh0VmFsdWUudmFsdWVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGV4dFZhbHVlLnZhbHVlLmdldCgpXG4gIH1cbn1cblxuY2xhc3MgQ29udGV4dENsYXNzPFQ+IGltcGxlbWVudHMgQ29udGV4dDxUPiB7XG4gIHByaXZhdGUgZGVmYXVsdENvbnRleHRWYWx1ZSA9IG9ic2VydmFibGUuYm94PENvbnRleHRWYWx1ZTxUPj4odW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pXG5cbiAgcHJpdmF0ZSBvdmVycmlkZUNvbnRleHRWYWx1ZSA9IG9ic2VydmFibGUuYm94PENvbnRleHRWYWx1ZTxUPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7XG4gICAgZGVlcDogZmFsc2UsXG4gIH0pXG5cbiAgcHJpdmF0ZSByZWFkb25seSBub2RlQ29udGV4dFZhbHVlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBDb250ZXh0VmFsdWU8VD4+KClcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlQXRvbSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgSUF0b20+KClcblxuICBwcml2YXRlIGdldE5vZGVBdG9tKG5vZGU6IG9iamVjdCkge1xuICAgIHJldHVybiBnZXRPckNyZWF0ZSh0aGlzLm5vZGVBdG9tLCBub2RlLCAoKSA9PiBjcmVhdGVBdG9tKFwiY29udGV4dFZhbHVlXCIpKVxuICB9XG5cbiAgcHJpdmF0ZSBmYXN0R2V0KG5vZGU6IG9iamVjdCk6IFQge1xuICAgIHRoaXMuZ2V0Tm9kZUF0b20obm9kZSkucmVwb3J0T2JzZXJ2ZWQoKVxuXG4gICAgY29uc3Qgb2JzRm9yTm9kZSA9IHRoaXMubm9kZUNvbnRleHRWYWx1ZS5nZXQobm9kZSlcbiAgICBpZiAob2JzRm9yTm9kZSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVDb250ZXh0VmFsdWUob2JzRm9yTm9kZSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBmYXN0R2V0UGFyZW50KG5vZGUpXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlVmFsdWUgPSB0aGlzLm92ZXJyaWRlQ29udGV4dFZhbHVlLmdldCgpXG4gICAgICBpZiAob3ZlcnJpZGVWYWx1ZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUNvbnRleHRWYWx1ZShvdmVycmlkZVZhbHVlKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmFzdEdldChwYXJlbnQpXG4gIH1cblxuICBnZXQobm9kZTogb2JqZWN0KSB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHJldHVybiB0aGlzLmZhc3RHZXQobm9kZSlcbiAgfVxuXG4gIHByaXZhdGUgZmFzdEdldFByb3ZpZGVyTm9kZShub2RlOiBvYmplY3QpOiBvYmplY3QgfCB1bmRlZmluZWQge1xuICAgIHRoaXMuZ2V0Tm9kZUF0b20obm9kZSkucmVwb3J0T2JzZXJ2ZWQoKVxuXG4gICAgY29uc3Qgb2JzRm9yTm9kZSA9IHRoaXMubm9kZUNvbnRleHRWYWx1ZS5nZXQobm9kZSlcbiAgICBpZiAob2JzRm9yTm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBmYXN0R2V0UGFyZW50KG5vZGUpXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0R2V0UHJvdmlkZXJOb2RlKHBhcmVudClcbiAgfVxuXG4gIGdldFByb3ZpZGVyTm9kZShub2RlOiBvYmplY3QpOiBvYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICByZXR1cm4gdGhpcy5mYXN0R2V0UHJvdmlkZXJOb2RlKG5vZGUpXG4gIH1cblxuICBnZXREZWZhdWx0KCk6IFQge1xuICAgIHJldHVybiByZXNvbHZlQ29udGV4dFZhbHVlKHRoaXMuZGVmYXVsdENvbnRleHRWYWx1ZS5nZXQoKSEpXG4gIH1cblxuICBzZXREZWZhdWx0ID0gYWN0aW9uKCh2YWx1ZTogVCkgPT4ge1xuICAgIHRoaXMuZGVmYXVsdENvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiLFxuICAgICAgdmFsdWUsXG4gICAgfSlcbiAgfSlcblxuICBzZXREZWZhdWx0Q29tcHV0ZWQgPSBhY3Rpb24oKHZhbHVlRm46ICgpID0+IFQpID0+IHtcbiAgICB0aGlzLmRlZmF1bHRDb250ZXh0VmFsdWUuc2V0KHtcbiAgICAgIHR5cGU6IFwiY29tcHV0ZWRcIixcbiAgICAgIHZhbHVlOiBjb21wdXRlZCh2YWx1ZUZuKSxcbiAgICB9KVxuICB9KVxuXG4gIHNldCA9IGFjdGlvbigobm9kZTogb2JqZWN0LCB2YWx1ZTogVCkgPT4ge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICB0aGlzLm5vZGVDb250ZXh0VmFsdWUuc2V0KG5vZGUsIHtcbiAgICAgIHR5cGU6IFwidmFsdWVcIixcbiAgICAgIHZhbHVlLFxuICAgIH0pXG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbiAgfSlcblxuICBwcml2YXRlIF9zZXRDb21wdXRlZChub2RlOiBvYmplY3QsIGNvbXB1dGVkVmFsdWVGbjogSUNvbXB1dGVkVmFsdWU8VD4pIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gICAgdGhpcy5ub2RlQ29udGV4dFZhbHVlLnNldChub2RlLCB7IHR5cGU6IFwiY29tcHV0ZWRcIiwgdmFsdWU6IGNvbXB1dGVkVmFsdWVGbiB9KVxuICAgIHRoaXMuZ2V0Tm9kZUF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBzZXRDb21wdXRlZCA9IGFjdGlvbigobm9kZTogb2JqZWN0LCB2YWx1ZUZuOiAoKSA9PiBUKSA9PiB7XG4gICAgdGhpcy5fc2V0Q29tcHV0ZWQobm9kZSwgY29tcHV0ZWQodmFsdWVGbikpXG4gIH0pXG5cbiAgdW5zZXQgPSBhY3Rpb24oKG5vZGU6IG9iamVjdCkgPT4ge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICB0aGlzLm5vZGVDb250ZXh0VmFsdWUuZGVsZXRlKG5vZGUpXG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbiAgfSlcblxuICBhcHBseSA9IGFjdGlvbig8Uj4oZm46ICgpID0+IFIsIHZhbHVlOiBUKTogUiA9PiB7XG4gICAgY29uc3Qgb2xkID0gdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5nZXQoKVxuICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KHtcbiAgICAgIHR5cGU6IFwidmFsdWVcIixcbiAgICAgIHZhbHVlLFxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gZm4oKVxuICAgICAgaWYgKGlzVHdlYWtlZE9iamVjdChyZXQsIHRydWUpKSB7XG4gICAgICAgIHRoaXMuc2V0KHJldCwgdmFsdWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KG9sZClcbiAgICB9XG4gIH0pXG5cbiAgYXBwbHlDb21wdXRlZCA9IGFjdGlvbig8Uj4oZm46ICgpID0+IFIsIHZhbHVlRm46ICgpID0+IFQpOiBSID0+IHtcbiAgICBjb25zdCBjb21wdXRlZFZhbHVlRm4gPSBjb21wdXRlZCh2YWx1ZUZuKVxuXG4gICAgY29uc3Qgb2xkID0gdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5nZXQoKVxuICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KHtcbiAgICAgIHR5cGU6IFwiY29tcHV0ZWRcIixcbiAgICAgIHZhbHVlOiBjb21wdXRlZFZhbHVlRm4sXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBmbigpXG4gICAgICBpZiAoaXNUd2Vha2VkT2JqZWN0KHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy5fc2V0Q29tcHV0ZWQocmV0LCBjb21wdXRlZFZhbHVlRm4pXG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KG9sZClcbiAgICB9XG4gIH0pXG5cbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlPzogVCkge1xuICAgIHRoaXMuc2V0RGVmYXVsdChkZWZhdWx0VmFsdWUgYXMgVClcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIG5vIGRlZmF1bHQgdmFsdWUsIHRodXMgbWFraW5nIGl0cyBkZWZhdWx0IHZhbHVlIHVuZGVmaW5lZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgQ29udGV4dCB2YWx1ZSB0eXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VD4oKTogQ29udGV4dDxUIHwgdW5kZWZpbmVkPlxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIGEgZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgQ29udGV4dCB2YWx1ZSB0eXBlLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VD4oZGVmYXVsdFZhbHVlOiBUKTogQ29udGV4dDxUPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUPihkZWZhdWx0VmFsdWU/OiBUKTogQ29udGV4dDxUPiB7XG4gIHJldHVybiBuZXcgQ29udGV4dENsYXNzKGRlZmF1bHRWYWx1ZSlcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHJlYWRvbmx5TWlkZGxld2FyZSB9IGZyb20gXCIuLi9hY3Rpb25NaWRkbGV3YXJlcy9yZWFkb25seU1pZGRsZXdhcmVcIlxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L2NvbnRleHRcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGlzVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IHRyeVVudHdlYWssIHR3ZWFrIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24sIGZhaWx1cmUsIHJ1bkJlZm9yZU9uSW5pdFN5bWJvbCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5cbmNvbnN0IGNvbXB1dGVkVHJlZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0KGZhbHNlKVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBub2RlIGlzIGEgY29tcHV0ZWQgdHJlZSBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBjb21wdXRlZCB0cmVlIG5vZGUsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wdXRlZFRyZWVOb2RlKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tcHV0ZWRUcmVlQ29udGV4dC5nZXQobm9kZSlcbn1cblxuY29uc3QgdHdlYWtlZENvbXB1dGVkVHJlZU5vZGVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpXG5cbmZ1bmN0aW9uIHR3ZWFrQ29tcHV0ZWRUcmVlTm9kZTxUPihuZXdWYWx1ZTogVCwgcGFyZW50OiB1bmtub3duLCBwYXRoOiBzdHJpbmcpOiBUIHtcbiAgY29uc3QgdHdlYWtlZFZhbHVlID0gdHdlYWsobmV3VmFsdWUsIHsgcGFyZW50LCBwYXRoIH0pXG4gIGlmIChpc1RyZWVOb2RlKHR3ZWFrZWRWYWx1ZSkgJiYgIXR3ZWFrZWRDb21wdXRlZFRyZWVOb2Rlcy5oYXModHdlYWtlZFZhbHVlKSkge1xuICAgIHR3ZWFrZWRDb21wdXRlZFRyZWVOb2Rlcy5hZGQodHdlYWtlZFZhbHVlKVxuICAgIHJlYWRvbmx5TWlkZGxld2FyZSh0d2Vha2VkVmFsdWUpXG4gICAgY29tcHV0ZWRUcmVlQ29udGV4dC5zZXQodHdlYWtlZFZhbHVlLCB0cnVlKVxuICB9XG4gIHJldHVybiB0d2Vha2VkVmFsdWVcbn1cblxuY29uc3QgY29tcHV0ZWRUcmVlTm9kZUluZm8gPSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBNYXA8c3RyaW5nLCB7IGNvbXB1dGVkOiBJQ29tcHV0ZWRWYWx1ZTx1bmtub3duPjsgdmFsdWU6IHVua25vd247IHR3ZWFrZWRWYWx1ZTogdW5rbm93biB9PlxuPigpXG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlQ29tcHV0ZWRUcmVlTm9kZUluZm8oaW5zdGFuY2U6IG9iamVjdCkge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUoY29tcHV0ZWRUcmVlTm9kZUluZm8sIGluc3RhbmNlLCAoKSA9PiBuZXcgTWFwKCkpXG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciB0dXJuaW5nIGEgY29tcHV0ZWQgcHJvcGVydHkgaW50byBhIGNvbXB1dGVkIHRyZWUgd2hpY2ggc3VwcG9ydHMgdHJlZSB0cmF2ZXJzYWxcbiAqIGZ1bmN0aW9ucywgY29udGV4dHMsIHJlZmVyZW5jZXMsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFByb3RvdHlwZSBvZiB0aGUgY2xhc3MuXG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgTmFtZSBvZiB0aGUgbWVtYmVyLlxuICogQHBhcmFtIGRlc2NyaXB0b3IgUHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIG1lbWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVkVHJlZShcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuKTogdm9pZCB7XG4gIGlmICghZGVzY3JpcHRvci5nZXQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiQGNvbXB1dGVkVHJlZSByZXF1aXJlcyBhICdnZXQnIGFjY2Vzc29yXCIpXG4gIH1cblxuICBjb25zdCB0YXJnZXRDbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvclxuICBpZiAoIWlzTW9kZWxDbGFzcyh0YXJnZXRDbGFzcykgJiYgIWlzRGF0YU1vZGVsQ2xhc3ModGFyZ2V0Q2xhc3MpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIkBjb21wdXRlZFRyZWUgY2FuIG9ubHkgZGVjb3JhdGUgJ2dldCcgYWNjZXNzb3JzIG9mIGNsYXNzIG9yIGRhdGEgbW9kZWxzXCIpXG4gIH1cblxuICBjb25zdCBvcmlnaW5hbCA9IGRlc2NyaXB0b3IuZ2V0XG5cbiAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZW50cnkgPSBnZXRPckNyZWF0ZUNvbXB1dGVkVHJlZU5vZGVJbmZvKHRoaXMpLmdldChwcm9wZXJ0eUtleSkhXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IGVudHJ5LnZhbHVlXG4gICAgY29uc3QgbmV3VmFsdWUgPSBlbnRyeS5jb21wdXRlZC5nZXQoKVxuXG4gICAgaWYgKG9sZFZhbHVlID09PSBuZXdWYWx1ZSkge1xuICAgICAgcmV0dXJuIGVudHJ5LnR3ZWFrZWRWYWx1ZVxuICAgIH1cblxuICAgIHR3ZWFrKG9sZFZhbHVlLCB1bmRlZmluZWQpXG4gICAgdHJ5VW50d2VhayhvbGRWYWx1ZSlcblxuICAgIGNvbnN0IHR3ZWFrZWRWYWx1ZSA9IHR3ZWFrQ29tcHV0ZWRUcmVlTm9kZShuZXdWYWx1ZSwgdGhpcywgcHJvcGVydHlLZXkpXG4gICAgZW50cnkudmFsdWUgPSBuZXdWYWx1ZVxuICAgIGVudHJ5LnR3ZWFrZWRWYWx1ZSA9IHR3ZWFrZWRWYWx1ZVxuICAgIHJldHVybiB0d2Vha2VkVmFsdWVcbiAgfVxuXG4gIGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uKHRhcmdldCwgcnVuQmVmb3JlT25Jbml0U3ltYm9sLCAoaW5zdGFuY2UpID0+IHtcbiAgICBjb25zdCBjID0gY29tcHV0ZWQoKCkgPT4gb3JpZ2luYWwuY2FsbChpbnN0YW5jZSksIHsga2VlcEFsaXZlOiB0cnVlIH0pXG4gICAgY29uc3QgbmV3VmFsdWUgPSBjLmdldCgpXG4gICAgY29uc3QgdHdlYWtlZFZhbHVlID0gdHdlYWtDb21wdXRlZFRyZWVOb2RlKG5ld1ZhbHVlLCBpbnN0YW5jZSwgcHJvcGVydHlLZXkpXG5cbiAgICBnZXRPckNyZWF0ZUNvbXB1dGVkVHJlZU5vZGVJbmZvKGluc3RhbmNlKS5zZXQocHJvcGVydHlLZXksIHtcbiAgICAgIGNvbXB1dGVkOiBjLFxuICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgdHdlYWtlZFZhbHVlLFxuICAgIH0pXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFic3RyYWN0TW9kZWxDbGFzcyxcbiAgTW9kZWxDbGFzcyxcbiAgTW9kZWxDcmVhdGlvbkRhdGEsXG4gIE1vZGVsVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHR5cGUge1xuICBNb2RlbFByb3BzLFxuICBNb2RlbFByb3BzVG9DcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1NldHRlcixcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgc2hhcmVkSW50ZXJuYWxNb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9zaGFyZWRJbnRlcm5hbE1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsLCBCYXNlRGF0YU1vZGVsLCBCYXNlRGF0YU1vZGVsS2V5cyB9IGZyb20gXCIuL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0SXNEYXRhTW9kZWxDbGFzcywgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IHR5cGUgX0NvbXBvc2VkRGF0YTxTdXBlck1vZGVsLCBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IFN1cGVyTW9kZWwgZXh0ZW5kcyBBbnlEYXRhTW9kZWxcbiAgP1xuICAgICAgfCAoTW9kZWxQcm9wc1RvQ3JlYXRpb25EYXRhPFRQcm9wcz4gJiBNb2RlbENyZWF0aW9uRGF0YTxTdXBlck1vZGVsPilcbiAgICAgIHwgKE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFRQcm9wcz4gJiBNb2RlbFRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWw+KVxuICA6IE1vZGVsUHJvcHNUb0NyZWF0aW9uRGF0YTxUUHJvcHM+IHwgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPlxuXG5leHBvcnQgaW50ZXJmYWNlIF9EYXRhTW9kZWw8U3VwZXJNb2RlbCwgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4ge1xuICBuZXcgKGRhdGE6IF9Db21wb3NlZERhdGE8U3VwZXJNb2RlbCwgVFByb3BzPik6IFN1cGVyTW9kZWwgJlxuICAgIEJhc2VEYXRhTW9kZWw8VFByb3BzPiAmXG4gICAgT21pdDxNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGE8VFByb3BzPiwgQmFzZURhdGFNb2RlbEtleXM+ICZcbiAgICBNb2RlbFByb3BzVG9TZXR0ZXI8VFByb3BzPlxufVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGEgbW9kZWxzIHRoYXQgZXh0ZW5kcyBhbm90aGVyIG1vZGVsLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE5ldyBtb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAdHlwZXBhcmFtIFRNb2RlbCBNb2RlbCB0eXBlLlxuICogQHBhcmFtIGdlbkZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYmFzZSBtb2RlbCBhbmQgbW9kZWwgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFeHRlbmRlZERhdGFNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsLFxuICBBIGV4dGVuZHMgW11cbj4oXG4gIGdlbkZuOiAoLi4uYXJnczogQSkgPT4ge1xuICAgIGJhc2VNb2RlbDogQWJzdHJhY3RNb2RlbENsYXNzPFRNb2RlbD5cbiAgICBwcm9wczogVFByb3BzXG4gIH1cbik6IF9EYXRhTW9kZWw8VE1vZGVsLCBUUHJvcHM+XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0YSBtb2RlbHMgdGhhdCBleHRlbmRzIGFub3RoZXIgbW9kZWwuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTmV3IG1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEB0eXBlcGFyYW0gVE1vZGVsIE1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gYmFzZU1vZGVsIEJhc2UgbW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFByb3BzIE1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWREYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgVE1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgYmFzZU1vZGVsOiBBYnN0cmFjdE1vZGVsQ2xhc3M8VE1vZGVsPixcbiAgbW9kZWxQcm9wczogVFByb3BzXG4pOiBfRGF0YU1vZGVsPFRNb2RlbCwgVFByb3BzPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWREYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgVE1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgLi4uYXJnczogYW55W11cbik6IF9EYXRhTW9kZWw8VE1vZGVsLCBUUHJvcHM+IHtcbiAgbGV0IGJhc2VNb2RlbFxuICBsZXQgbW9kZWxQcm9wc1xuICBpZiAoaXNEYXRhTW9kZWxDbGFzcyhhcmdzWzBdKSkge1xuICAgIGJhc2VNb2RlbCA9IGFyZ3NbMF1cbiAgICBtb2RlbFByb3BzID0gYXJnc1sxXVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGdlbiA9IGFyZ3NbMF0oKVxuXG4gICAgYmFzZU1vZGVsID0gZ2VuLmJhc2VNb2RlbFxuICAgIG1vZGVsUHJvcHMgPSBnZW4ucHJvcHNcbiAgfVxuXG4gIGFzc2VydElzRGF0YU1vZGVsQ2xhc3MoYmFzZU1vZGVsLCBcImJhc2VNb2RlbFwiKVxuXG4gIHJldHVybiBpbnRlcm5hbERhdGFNb2RlbChtb2RlbFByb3BzLCBiYXNlTW9kZWwgYXMgYW55KVxufVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGEgbW9kZWxzLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkxhenlJbml0YCBvciBgb25MYXp5QXR0YWNoZWRUb1Jvb3RTdG9yZWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAcGFyYW0gZm5Nb2RlbFByb3BzIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIG1vZGVsIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgQSBleHRlbmRzIFtdPihcbiAgZm5Nb2RlbFByb3BzOiAoLi4uYXJnczogQSkgPT4gVFByb3BzXG4pOiBfRGF0YU1vZGVsPHVua25vd24sIFRQcm9wcz5cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBkYXRhIG1vZGVscy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25MYXp5SW5pdGAgb3IgYG9uTGF6eUF0dGFjaGVkVG9Sb290U3RvcmVgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHBhcmFtIG1vZGVsUHJvcHMgTW9kZWwgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPihcbiAgbW9kZWxQcm9wczogVFByb3BzXG4pOiBfRGF0YU1vZGVsPHVua25vd24sIFRQcm9wcz5cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPihcbiAgZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzOiAoKCkgPT4gVFByb3BzKSB8IFRQcm9wc1xuKTogX0RhdGFNb2RlbDx1bmtub3duLCBUUHJvcHM+IHtcbiAgY29uc3QgbW9kZWxQcm9wcyA9XG4gICAgdHlwZW9mIGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wcygpXG4gICAgICA6IGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wc1xuICByZXR1cm4gaW50ZXJuYWxEYXRhTW9kZWwobW9kZWxQcm9wcywgdW5kZWZpbmVkKVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLCBUQmFzZU1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgbW9kZWxQcm9wczogVFByb3BzLFxuICBiYXNlTW9kZWw6IE1vZGVsQ2xhc3M8VEJhc2VNb2RlbD4gfCB1bmRlZmluZWRcbik6IF9EYXRhTW9kZWw8VEJhc2VNb2RlbCwgVFByb3BzPiB7XG4gIHJldHVybiBzaGFyZWRJbnRlcm5hbE1vZGVsKHtcbiAgICBtb2RlbFByb3BzLFxuICAgIGJhc2VNb2RlbCxcbiAgICB0eXBlOiBcImRhdGFcIixcbiAgICB2YWx1ZVR5cGU6IGZhbHNlLFxuICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvcjogdW5kZWZpbmVkLFxuICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IHVuZGVmaW5lZCxcbiAgfSlcbn1cbiIsImltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvblwiXG5pbXBvcnQge1xuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUsXG4gIEFjdGlvblRyYWNraW5nUmVzdWx0LFxuICBTaW1wbGVBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi4vYWN0aW9uTWlkZGxld2FyZXNcIlxuaW1wb3J0IHsgZmFzdEdldFJvb3RQYXRoLCBSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhcHBseVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2FwcGx5U25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuXG4vKipcbiAqIENvbm5lY3RzIGEgdHJlZSBub2RlIHRvIGEgcmVkdXggZGV2IHRvb2xzIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSByZW1vdGVkZXZQYWNrYWdlIFRoZSByZW1vdGVkZXYgcGFja2FnZSAodXN1YWxseSB0aGUgcmVzdWx0IG9mIGByZXF1aXJlKFwicmVtb3RlRGV2XCIpYCkgKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JlbW90ZWRldikuXG4gKiBAcGFyYW0gcmVtb3RlZGV2Q29ubmVjdGlvbiBUaGUgcmVzdWx0IG9mIGEgY29ubmVjdCBtZXRob2QgZnJvbSB0aGUgcmVtb3RlZGV2IHBhY2thZ2UgKHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBgcmVtb3RlRGV2LmNvbm5lY3RWaWFFeHRlbnNpb24oLi4uKWApLlxuICogQHBhcmFtIHRhcmdldCBPYmplY3QgdG8gdXNlIGFzIHJvb3QuXG4gKiBAcGFyYW0gc3RvcmVOYW1lIE5hbWUgdG8gYmUgc2hvd24gaW4gdGhlIHJlZHV4IGRldiB0b29scy5cbiAqIEBwYXJhbSBbb3B0aW9uc10gT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QuIGBsb2dBcmdzTmVhck5hbWVgIGlmIGl0IHNob3VsZCBzaG93IHRoZSBhcmd1bWVudHMgbmVhciB0aGUgYWN0aW9uIG5hbWUgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RSZWR1eERldlRvb2xzKFxuICByZW1vdGVkZXZQYWNrYWdlOiBhbnksXG4gIHJlbW90ZWRldkNvbm5lY3Rpb246IGFueSxcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIG9wdGlvbnM/OiB7XG4gICAgbG9nQXJnc05lYXJOYW1lPzogYm9vbGVhblxuICB9XG4pIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0YXJnZXQsIFwidGFyZ2V0XCIpXG5cbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBsb2dBcmdzTmVhck5hbWU6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxuXG4gIGxldCBoYW5kbGluZ01vbml0b3JBY3Rpb24gPSAwXG5cbiAgLy8gc3Vic2NyaWJlIHRvIGNoYW5nZSBzdGF0ZSAoaWYgbmVlZCBtb3JlIHRoYW4ganVzdCBsb2dnaW5nKVxuICByZW1vdGVkZXZDb25uZWN0aW9uLnN1YnNjcmliZSgobWVzc2FnZTogYW55KSA9PiB7XG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJESVNQQVRDSFwiKSB7XG4gICAgICBoYW5kbGVNb25pdG9yQWN0aW9ucyhyZW1vdGVkZXZDb25uZWN0aW9uLCB0YXJnZXQsIG1lc3NhZ2UpXG4gICAgfVxuICB9KVxuXG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGdldFNuYXBzaG90KHRhcmdldClcbiAgcmVtb3RlZGV2Q29ubmVjdGlvbi5pbml0KGluaXRpYWxTdGF0ZSlcblxuICBsZXQgY3VycmVudEFjdGlvbklkID0gMFxuICBjb25zdCBhY3Rpb25JZFN5bWJvbCA9IFN5bWJvbChcImFjdGlvbklkXCIpXG5cbiAgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlKHRhcmdldCwge1xuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICBjdHguZGF0YVthY3Rpb25JZFN5bWJvbF0gPSBjdXJyZW50QWN0aW9uSWQrK1xuICAgIH0sXG4gICAgb25SZXN1bWUoY3R4KSB7XG4gICAgICAvLyBnaXZlIGEgY2hhbmNlIHRvIHRoZSBwYXJlbnQgdG8gbG9nIGl0cyBvd24gY2hhbmdlcyBiZWZvcmUgdGhlIGNoaWxkIHN0YXJ0c1xuICAgICAgaWYgKGN0eC5wYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIGxvZyhjdHgucGFyZW50Q29udGV4dCwgdW5kZWZpbmVkKVxuICAgICAgfVxuICAgICAgbG9nKGN0eCwgdW5kZWZpbmVkKVxuICAgIH0sXG4gICAgb25TdXNwZW5kKGN0eCkge1xuICAgICAgbG9nKGN0eCwgdW5kZWZpbmVkKVxuICAgIH0sXG4gICAgb25GaW5pc2goY3R4LCByZXQpIHtcbiAgICAgIGxvZyhjdHgsIHJldC5yZXN1bHQpXG4gICAgfSxcbiAgfSlcblxuICBmdW5jdGlvbiBoYW5kbGVNb25pdG9yQWN0aW9ucyhyZW1vdGVkZXYyOiBhbnksIHRhcmdldDI6IGFueSwgbWVzc2FnZTogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsaW5nTW9uaXRvckFjdGlvbisrXG5cbiAgICAgIHN3aXRjaCAobWVzc2FnZS5wYXlsb2FkLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlJFU0VUXCI6XG4gICAgICAgICAgYXBwbHlTbmFwc2hvdCh0YXJnZXQyLCBpbml0aWFsU3RhdGUpXG4gICAgICAgICAgcmV0dXJuIHJlbW90ZWRldjIuaW5pdChpbml0aWFsU3RhdGUpXG4gICAgICAgIGNhc2UgXCJDT01NSVRcIjpcbiAgICAgICAgICByZXR1cm4gcmVtb3RlZGV2Mi5pbml0KGdldFNuYXBzaG90KHRhcmdldDIpKVxuICAgICAgICBjYXNlIFwiUk9MTEJBQ0tcIjpcbiAgICAgICAgICByZXR1cm4gcmVtb3RlZGV2Mi5pbml0KHJlbW90ZWRldlBhY2thZ2UuZXh0cmFjdFN0YXRlKG1lc3NhZ2UpKVxuICAgICAgICBjYXNlIFwiSlVNUF9UT19TVEFURVwiOlxuICAgICAgICBjYXNlIFwiSlVNUF9UT19BQ1RJT05cIjpcbiAgICAgICAgICBhcHBseVNuYXBzaG90KHRhcmdldDIsIHJlbW90ZWRldlBhY2thZ2UuZXh0cmFjdFN0YXRlKG1lc3NhZ2UpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICBjYXNlIFwiSU1QT1JUX1NUQVRFXCI6XG4gICAgICAgICAgY29uc3QgbmV4dExpZnRlZFN0YXRlID0gbWVzc2FnZS5wYXlsb2FkLm5leHRMaWZ0ZWRTdGF0ZVxuICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3RhdGVzID0gbmV4dExpZnRlZFN0YXRlLmNvbXB1dGVkU3RhdGVzXG4gICAgICAgICAgYXBwbHlTbmFwc2hvdCh0YXJnZXQyLCBjb21wdXRlZFN0YXRlc1tjb21wdXRlZFN0YXRlcy5sZW5ndGggLSAxXS5zdGF0ZSlcbiAgICAgICAgICByZW1vdGVkZXYyLnNlbmQobnVsbCwgbmV4dExpZnRlZFN0YXRlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBoYW5kbGluZ01vbml0b3JBY3Rpb24tLVxuICAgIH1cbiAgfVxuXG4gIGxldCBsYXN0TG9nZ2VkU25hcHNob3QgPSBpbml0aWFsU3RhdGVcblxuICBmdW5jdGlvbiBsb2coY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LCByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGhhbmRsaW5nTW9uaXRvckFjdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc24gPSBnZXRTbmFwc2hvdCh0YXJnZXQpXG5cbiAgICAvLyBpZ25vcmUgYWN0aW9ucyB0aGF0IGRvbid0IGNoYW5nZSBhbnl0aGluZyAodW5sZXNzIGl0IGlzIGEgdGhyb3cpXG4gICAgaWYgKHNuID09PSBsYXN0TG9nZ2VkU25hcHNob3QgJiYgcmVzdWx0ICE9PSBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxhc3RMb2dnZWRTbmFwc2hvdCA9IHNuXG5cbiAgICBjb25zdCByb290UGF0aCA9IGZhc3RHZXRSb290UGF0aChjdHgudGFyZ2V0KVxuICAgIGNvbnN0IG5hbWUgPSBnZXRBY3Rpb25Db250ZXh0TmFtZUFuZFR5cGVQYXRoKGN0eCwgcm9vdFBhdGgsIHJlc3VsdClcblxuICAgIGNvbnN0IGNvcHkgPSB7XG4gICAgICB0eXBlOiBuYW1lLFxuICAgICAgcGF0aDogcm9vdFBhdGgucGF0aCxcbiAgICAgIGFyZ3M6IGN0eC5hcmdzLFxuICAgIH1cblxuICAgIHJlbW90ZWRldkNvbm5lY3Rpb24uc2VuZChjb3B5LCBzbilcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFjdGlvbkNvbnRleHROYW1lQW5kVHlwZVBhdGgoXG4gICAgY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LFxuICAgIHJvb3RQYXRoOiBSb290UGF0aDxhbnk+LFxuICAgIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgY29uc3QgcGF0aFN0ciA9IFwiWy9cIiArIHJvb3RQYXRoLnBhdGguam9pbihcIi9cIikgKyBcIl0gXCJcbiAgICBsZXQgbmFtZSA9IHBhdGhTdHIgKyBjdHguYWN0aW9uTmFtZVxuXG4gICAgaWYgKG9wdHMubG9nQXJnc05lYXJOYW1lKSB7XG4gICAgICBsZXQgYXJncyA9IGN0eC5hcmdzXG4gICAgICAgIC5tYXAoKGEpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gXCIqKnVuc2VyaWFsaXphYmxlKipcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPiA2NCkge1xuICAgICAgICBhcmdzID0gYXJncy5zbGljZSgwLCA2NCkgKyBcIi4uLlwiXG4gICAgICB9XG5cbiAgICAgIG5hbWUgKz0gYCgke2FyZ3N9KWBcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25JZCA9IGN0eC5kYXRhW2FjdGlvbklkU3ltYm9sXVxuXG4gICAgbmFtZSArPSBgIChpZCAke2FjdGlvbklkICE9PSB1bmRlZmluZWQgPyBhY3Rpb25JZCA6IFwiP1wifWBcbiAgICBpZiAoY3R4LnR5cGUgPT09IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jKSB7XG4gICAgICBuYW1lICs9IFwiLCBhc3luY1wiXG4gICAgfVxuICAgIG5hbWUgKz0gXCIpXCJcblxuICAgIGlmIChyZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93KSB7XG4gICAgICBuYW1lICs9IFwiIC1lcnJvciB0aHJvd24tXCJcbiAgICB9XG5cbiAgICBpZiAoY3R4LnBhcmVudENvbnRleHQpIHtcbiAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBnZXRBY3Rpb25Db250ZXh0TmFtZUFuZFR5cGVQYXRoKFxuICAgICAgICBjdHgucGFyZW50Q29udGV4dCxcbiAgICAgICAgZmFzdEdldFJvb3RQYXRoKGN0eC5wYXJlbnRDb250ZXh0LnRhcmdldCksXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgICAgbmFtZSA9IGAke3BhcmVudE5hbWV9ID4+PiAke25hbWV9YFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gIH1cbn1cbiIsImltcG9ydCB7IEFjdGlvbkNhbGwsIGFwcGx5QWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvblwiXHJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcclxuaW1wb3J0IHsgb25TbmFwc2hvdCwgT25TbmFwc2hvdERpc3Bvc2VyLCBPblNuYXBzaG90TGlzdGVuZXIgfSBmcm9tIFwiLi4vc25hcHNob3Qvb25TbmFwc2hvdFwiXHJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuLi9zbmFwc2hvdC9TbmFwc2hvdE9mXCJcclxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjb25zdCByZWR1eEFjdGlvblR5cGUgPSBcImFwcGx5QWN0aW9uXCJcclxuXHJcbi8qKlxyXG4gKiBBIHJlZHV4IGFjdGlvbiBmb3IgbW9ieC1rZXlzdG9uZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVkdXhBY3Rpb24ge1xyXG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiByZWR1eEFjdGlvblR5cGVcclxuICByZWFkb25seSBwYXlsb2FkOiBBY3Rpb25DYWxsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIGFuIGFjdGlvbiBjYWxsIGludG8gYSByZWR1eCBhY3Rpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSBhY3Rpb25DYWxsIEFjdGlvbiBjYWxsLlxyXG4gKiBAcmV0dXJucyBBIHJlZHV4IGFjdGlvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhY3Rpb25DYWxsVG9SZWR1eEFjdGlvbihhY3Rpb25DYWxsOiBBY3Rpb25DYWxsKTogUmVkdXhBY3Rpb24ge1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiByZWR1eEFjdGlvblR5cGUsXHJcbiAgICBwYXlsb2FkOiBhY3Rpb25DYWxsLFxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcmVkdXggc3RvcmUgZm9yIG1vYngta2V5c3RvbmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4U3RvcmU8VD4ge1xyXG4gIGdldFN0YXRlKCk6IFNuYXBzaG90T3V0T2Y8VD5cclxuICBkaXNwYXRjaChhY3Rpb246IFJlZHV4QWN0aW9uKTogUmVkdXhBY3Rpb25cclxuICBzdWJzY3JpYmUobGlzdGVuZXI6IE9uU25hcHNob3RMaXN0ZW5lcjxUPik6IE9uU25hcHNob3REaXNwb3NlclxyXG59XHJcblxyXG4vKipcclxuICogQSByZWR1eCBydW5uZXIgZm9yIG1vYngta2V5c3RvbmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4UnVubmVyPFQ+IHtcclxuICAobmV4dDogUmVkdXhTdG9yZTxUPltcImRpc3BhdGNoXCJdKTogKGFjdGlvbjogUmVkdXhBY3Rpb24pID0+IFJlZHV4QWN0aW9uXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHJlZHV4IG1pZGRsZXdhcmUgZm9yIG1vYngta2V5c3RvbmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4TWlkZGxld2FyZTxUPiB7XHJcbiAgKHN0b3JlOiBSZWR1eFN0b3JlPFQ+KTogUmVkdXhSdW5uZXI8VD5cclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJlZHV4IGNvbXBhdGlibGUgc3RvcmUgb3V0IG9mIGEgbW9ieC1rZXlzdG9uZSBvYmplY3QuXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cclxuICogQHBhcmFtIHRhcmdldCBSb290IG9iamVjdC5cclxuICogQHBhcmFtIG1pZGRsZXdhcmVzIE9wdGlvbmFsIGxpc3Qgb2YgcmVkdXggbWlkZGxld2FyZXMuXHJcbiAqIEByZXR1cm5zIEEgcmVkdXggY29tcGF0aWJsZSBzdG9yZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhc1JlZHV4U3RvcmU8VCBleHRlbmRzIG9iamVjdD4oXHJcbiAgdGFyZ2V0OiBULFxyXG4gIC4uLm1pZGRsZXdhcmVzOiBSZWR1eE1pZGRsZXdhcmU8VD5bXVxyXG4pOiBSZWR1eFN0b3JlPFQ+IHtcclxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcclxuXHJcbiAgY29uc3QgZGVmYXVsdERpc3BhdGNoID0gKGFjdGlvbjogUmVkdXhBY3Rpb24pID0+IHtcclxuICAgIGlmIChhY3Rpb24udHlwZSAhPT0gcmVkdXhBY3Rpb25UeXBlKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGFjdGlvbiB0eXBlIHdhcyBleHBlY3RlZCB0byBiZSAnJHtyZWR1eEFjdGlvblR5cGV9JywgYnV0IGl0IHdhcyAnJHthY3Rpb24udHlwZX0nYFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlBY3Rpb24odGFyZ2V0LCBhY3Rpb24ucGF5bG9hZClcclxuICAgIHJldHVybiBhY3Rpb25cclxuICB9XHJcblxyXG4gIGxldCBzdG9yZTogUmVkdXhTdG9yZTxUPiA9IHtcclxuICAgIGdldFN0YXRlKCkge1xyXG4gICAgICByZXR1cm4gZ2V0U25hcHNob3QodGFyZ2V0KVxyXG4gICAgfSxcclxuICAgIGRpc3BhdGNoKGFjdGlvbikge1xyXG4gICAgICByZXR1cm4gcnVuTWlkZGxld2FyZXMoYWN0aW9uLCBydW5uZXJzLCBkZWZhdWx0RGlzcGF0Y2gpXHJcbiAgICB9LFxyXG4gICAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XHJcbiAgICAgIHJldHVybiBvblNuYXBzaG90KHRhcmdldCwgbGlzdGVuZXIpXHJcbiAgICB9LFxyXG4gIH1cclxuXHJcbiAgY29uc3QgcnVubmVycyA9IG1pZGRsZXdhcmVzLm1hcCgobXcpID0+IG13KHN0b3JlKSlcclxuXHJcbiAgcmV0dXJuIHN0b3JlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJ1bk1pZGRsZXdhcmVzPFQ+KFxyXG4gIGluaXRpYWxBY3Rpb246IFJlZHV4QWN0aW9uLFxyXG4gIHJ1bm5lcnM6IFJlYWRvbmx5QXJyYXk8UmVkdXhSdW5uZXI8VD4+LFxyXG4gIG5leHQ6IFJlZHV4U3RvcmU8VD5bXCJkaXNwYXRjaFwiXVxyXG4pOiBSZWR1eEFjdGlvbiB7XHJcbiAgbGV0IGkgPSAwXHJcblxyXG4gIGZ1bmN0aW9uIHJ1bk5leHRNaWRkbGV3YXJlKGFjdGlvbjogUmVkdXhBY3Rpb24pOiBSZWR1eEFjdGlvbiB7XHJcbiAgICBjb25zdCBydW5uZXIgPSBydW5uZXJzW2ldXHJcbiAgICBpKytcclxuICAgIGlmIChydW5uZXIpIHtcclxuICAgICAgcmV0dXJuIHJ1bm5lcihydW5OZXh0TWlkZGxld2FyZSkoYWN0aW9uKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJ1bk5leHRNaWRkbGV3YXJlKGluaXRpYWxBY3Rpb24pXHJcbn1cclxuIiwiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyB0eXBlc1N0cmluZyB9IGZyb20gXCIuLi90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBBIHJlZmVyZW5jZSBtb2RlbCBiYXNlIHR5cGUuXG4gKiBVc2UgYGN1c3RvbVJlZmAgdG8gY3JlYXRlIGEgY3VzdG9tIHJlZiBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlZjxUIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE1vZGVsKHtcbiAgLyoqXG4gICAqIFJlZmVyZW5jZSBpZC5cbiAgICovXG4gIGlkOiB0UHJvcCh0eXBlc1N0cmluZyksXG59KSB7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZXNvbHZlKCk6IFQgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0aGlzIHJlZmVyZW5jZSBwb2ludHMgdG8sIG9yIGB1bmRlZmluZWRgIGlmIHRoZSByZWZlcmVuY2UgaXMgY3VycmVudGx5IGludmFsaWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IG1heWJlQ3VycmVudCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcmVmZXJlbmNlIGlzIGN1cnJlbnRseSB2YWxpZC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm1heWJlQ3VycmVudFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdGhpcyByZWZlcmVuY2UgcG9pbnRzIHRvLCBvciB0aHJvd3MgaWYgaW52YWxpZC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgY3VycmVudCgpOiBUIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5tYXliZUN1cnJlbnRcblxuICAgIGlmICghY3VycmVudCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGEgcmVmZXJlbmNlIG9mIHR5cGUgJyR7dGhpc1ttb2RlbFR5cGVLZXldfScgY291bGQgbm90IHJlc29sdmUgYW4gb2JqZWN0IHdpdGggaWQgJyR7dGhpcy5pZH0nYFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBiYWNrIHJlZmVyZW5jZXMgZm9yIHRoaXMgcmVmIGFyZSB1cCB0byBkYXRlLlxuICAgKiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgbW9zdCB1cCB0byBkYXRlXG4gICAqIGJhY2sgcmVmZXJlbmNlcyB3aGlsZSBib3RoIHN0aWxsIGluc2lkZSBhbiBhY3Rpb24gYW5kIHdoaWxlIHRoZSByZWZlcmVuY2VcbiAgICogaXMgbm90IGEgY2hpbGQgb2YgdGhlIHNhbWUgcm9vdCB0aGFuIHRoZSB0YXJnZXQuXG4gICAqL1xuICBhYnN0cmFjdCBmb3JjZVVwZGF0ZUJhY2tSZWZzKCk6IHZvaWRcbn1cblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGN1c3RvbVJlZlR5cGVTeW1ib2w6IHVuaXF1ZSBzeW1ib2xcblxuLyoqIEEgcmVmIGNvbnN0cnVjdG9yIGZvciBjdXN0b20gcmVmcyAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWZDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIDxURSBleHRlbmRzIFQ+KHZhbHVlT3JJRDogVEUgfCBzdHJpbmcpOiBSZWY8VEU+XG5cbiAgcmVmQ2xhc3M6IE1vZGVsQ2xhc3M8UmVmPFQ+PlxuXG4gIFtjdXN0b21SZWZUeXBlU3ltYm9sXTogVCAvLyBqdXN0IGZvciB0eXBpbmdzXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcmVmIG9iamVjdCBpcyBvZiBhIGdpdmVuIHJlZiB0eXBlLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZWZlcmVuY2VkIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHJlZiBSZWZlcmVuY2Ugb2JqZWN0LlxuICogQHBhcmFtIHJlZlR5cGUgUmVmZXJlbmNlIHR5cGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgb2YgdGhlIGdpdmVuIHR5cGUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmT2ZUeXBlPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICByZWY6IFJlZjxvYmplY3Q+LFxuICByZWZUeXBlOiBSZWZDb25zdHJ1Y3RvcjxUPlxuKTogcmVmIGlzIFJlZjxUPiB7XG4gIHJldHVybiByZWYgaW5zdGFuY2VvZiByZWZUeXBlLnJlZkNsYXNzXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIG9ic2VydmFibGUsIE9ic2VydmFibGVTZXQsIHJlYWN0aW9uLCB3aGVuIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsRGVjb3JhdG9yXCJcbmltcG9ydCB7XG4gIGdldERlZXBPYmplY3RDaGlsZHJlbixcbiAgcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb24sXG59IGZyb20gXCIuLi9wYXJlbnQvY29yZU9iamVjdENoaWxkcmVuXCJcbmltcG9ydCB7IGdldFJvb3QgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgQ29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZSwgY29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZSB9IGZyb20gXCIuLi9wYXJlbnQvd2Fsa1RyZWVcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHsgUmVmLCBSZWZDb25zdHJ1Y3RvciB9IGZyb20gXCIuL1JlZlwiXG5cbmludGVyZmFjZSBCYWNrUmVmczxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGFsbDogT2JzZXJ2YWJsZVNldDxSZWY8VD4+XG4gIGJ5VHlwZTogV2Vha01hcDxSZWZDb25zdHJ1Y3RvcjxUPiwgT2JzZXJ2YWJsZVNldDxSZWY8VD4+PlxufVxuXG4vKipcbiAqIEJhY2stcmVmZXJlbmNlcyBmcm9tIG9iamVjdCB0byB0aGUgcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIGl0LlxuICovXG5jb25zdCBvYmplY3RCYWNrUmVmcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQmFja1JlZnM8YW55Pj4oKVxuXG4vKipcbiAqIFJlZmVyZW5jZSByZXNvbHZlciB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBSZWZSZXNvbHZlcjxUIGV4dGVuZHMgb2JqZWN0PiA9IChyZWY6IFJlZjxUPikgPT4gVCB8IHVuZGVmaW5lZFxuXG4vKipcbiAqIFJlZmVyZW5jZSBJRCByZXNvbHZlciB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBSZWZJZFJlc29sdmVyID0gKHRhcmdldDogb2JqZWN0KSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcblxuLyoqXG4gKiBUeXBlIGZvciB0aGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gYSByZWZlcmVuY2UgcmVzb2x2ZWQgdmFsdWUgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlPFQgZXh0ZW5kcyBvYmplY3Q+ID0gKFxuICByZWY6IFJlZjxUPixcbiAgbmV3VmFsdWU6IFQgfCB1bmRlZmluZWQsXG4gIG9sZFZhbHVlOiBUIHwgdW5kZWZpbmVkXG4pID0+IHZvaWRcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQ3VzdG9tUmVmPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBtb2RlbFR5cGVJZDogc3RyaW5nLFxuICByZXNvbHZlckdlbjogKHJlZjogUmVmPFQ+KSA9PiBSZWZSZXNvbHZlcjxUPixcbiAgZ2V0SWQ6IFJlZklkUmVzb2x2ZXIsXG4gIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZTogUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlPFQ+IHwgdW5kZWZpbmVkXG4pOiBSZWZDb25zdHJ1Y3RvcjxUPiB7XG4gIEBtb2RlbChtb2RlbFR5cGVJZClcbiAgY2xhc3MgQ3VzdG9tUmVmIGV4dGVuZHMgUmVmPFQ+IHtcbiAgICBwcml2YXRlIHJlc29sdmVyPzogUmVmUmVzb2x2ZXI8VD5cblxuICAgIHJlc29sdmUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoIXRoaXMucmVzb2x2ZXIpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyR2VuKHRoaXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyKHRoaXMpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlZE9sZFRhcmdldDogVCB8IHVuZGVmaW5lZFxuXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEZvcmNlVXBkYXRlQmFja1JlZnMobmV3VGFyZ2V0OiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBvbGRUYXJnZXQgPSB0aGlzLnNhdmVkT2xkVGFyZ2V0XG4gICAgICAvLyB1cGRhdGUgZWFybHkgaW4gY2FzZSBvZiB0aHJvd24gZXhjZXB0aW9uc1xuICAgICAgdGhpcy5zYXZlZE9sZFRhcmdldCA9IG5ld1RhcmdldFxuXG4gICAgICB1cGRhdGVCYWNrUmVmcyh0aGlzLCB0aGlzUmVmQ29uc3RydWN0b3IsIG5ld1RhcmdldCwgb2xkVGFyZ2V0KVxuICAgIH1cblxuICAgIEBhY3Rpb25cbiAgICBmb3JjZVVwZGF0ZUJhY2tSZWZzKCkge1xuICAgICAgdGhpcy5pbnRlcm5hbEZvcmNlVXBkYXRlQmFja1JlZnModGhpcy5tYXliZUN1cnJlbnQpXG4gICAgfVxuXG4gICAgb25Jbml0KCkge1xuICAgICAgLy8gbGlzdGVuIHRvIGNoYW5nZXNcblxuICAgICAgbGV0IHNhdmVkT2xkVGFyZ2V0OiBUIHwgdW5kZWZpbmVkXG4gICAgICBsZXQgc2F2ZWRGaXJzdFRpbWUgPSB0cnVlXG5cbiAgICAgIC8vIGFjY29yZGluZyB0byBtd2VzdHJhdGUgdGhpcyB3b24ndCBsZWFrIGFzIGxvbmcgYXMgd2UgZG9uJ3Qga2VlcCB0aGUgZGlzcG9zZXIgYXJvdW5kXG4gICAgICByZWFjdGlvbihcbiAgICAgICAgKCkgPT4gdGhpcy5tYXliZUN1cnJlbnQsXG4gICAgICAgIChuZXdUYXJnZXQpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVybmFsRm9yY2VVcGRhdGVCYWNrUmVmcyhuZXdUYXJnZXQpXG5cbiAgICAgICAgICBjb25zdCBvbGRUYXJnZXQgPSBzYXZlZE9sZFRhcmdldFxuICAgICAgICAgIGNvbnN0IGZpcnN0VGltZSA9IHNhdmVkRmlyc3RUaW1lXG4gICAgICAgICAgLy8gdXBkYXRlIGVhcmx5IGluIGNhc2Ugb2YgdGhyb3duIGV4Y2VwdGlvbnNcbiAgICAgICAgICBzYXZlZE9sZFRhcmdldCA9IG5ld1RhcmdldFxuICAgICAgICAgIHNhdmVkRmlyc3RUaW1lID0gZmFsc2VcblxuICAgICAgICAgIGlmICghZmlyc3RUaW1lICYmIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSAmJiBuZXdUYXJnZXQgIT09IG9sZFRhcmdldCkge1xuICAgICAgICAgICAgb25SZXNvbHZlZFZhbHVlQ2hhbmdlKHRoaXMsIG5ld1RhcmdldCwgb2xkVGFyZ2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZuID0gKHRhcmdldDogVCkgPT4ge1xuICAgIGxldCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlkID0gdGFyZ2V0XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydElzT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcbiAgICAgIGlkID0gZ2V0SWQodGFyZ2V0KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJyZWYgdGFyZ2V0IG9iamVjdCBtdXN0IGhhdmUgYW4gaWQgb2Ygc3RyaW5nIHR5cGVcIilcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBuZXcgQ3VzdG9tUmVmKHtcbiAgICAgIGlkLFxuICAgIH0pXG5cbiAgICByZXR1cm4gcmVmXG4gIH1cbiAgZm4ucmVmQ2xhc3MgPSBDdXN0b21SZWZcblxuICBjb25zdCB0aGlzUmVmQ29uc3RydWN0b3IgPSBmbiBhcyBhbnkgYXMgUmVmQ29uc3RydWN0b3I8VD5cblxuICByZXR1cm4gdGhpc1JlZkNvbnN0cnVjdG9yXG59XG5cbi8qKlxuICogVXNlcyBhIG1vZGVsIGBnZXRSZWZJZCgpYCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUgdG8gZ2V0IGEgcmVmZXJlbmNlIElELlxuICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhhdCBtZXRob2QgaXQgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqIElmIHRoZSBtb2RlbCBoYXMgYW4gaW1wbGVtZW50YXRpb24sIGJ1dCB0aGF0IGltcGxlbWVudGF0aW9uIHJldHVybnMgYW55dGhpbmcgb3RoZXIgdGhhblxuICogYSBgc3RyaW5nYCBpdCB3aWxsIHRocm93LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBnZXQgdGhlIElEIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIElEIG9yIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxSZWZJZCh0YXJnZXQ6IG9iamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01vZGVsKHRhcmdldCkgJiYgdGFyZ2V0LmdldFJlZklkKSB7XG4gICAgY29uc3QgaWQgPSB0YXJnZXQuZ2V0UmVmSWQoKVxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIidnZXRSZWZJZCgpJyBtdXN0IHJldHVybiBhIHN0cmluZyBvciB1bmRlZmluZWQgd2hlbiBwcmVzZW50XCIpXG4gICAgfVxuICAgIHJldHVybiBpZFxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLy8gb25lIGNvbXB1dGVkIGlkIHRyZWUgcGVyIGlkIGZ1bmN0aW9uXG5jb25zdCBjb21wdXRlZElkVHJlZXMgPSBuZXcgV2Vha01hcDxcbiAgKG5vZGU6IG9iamVjdCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBDb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPHN0cmluZz5cbj4oKVxuXG4vKipcbiAqIFJlc29sdmVzIGEgbm9kZSBnaXZlbiBpdHMgSUQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSByb290IE5vZGUgd2hlcmUgdG8gc3RhcnQgdGhlIHNlYXJjaC4gVGhlIHNlYXJjaCB3aWxsIGJlIGRvbmUgb24gaXQgYW5kIGFsbCBpdHMgY2hpbGRyZW4uXG4gKiBAcGFyYW0gaWQgSUQgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSBnZXRJZCBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIElEIGZyb20gYW4gb2JqZWN0IChgZ2V0TW9kZWxSZWZJZGAgYnkgZGVmYXVsdCkuXG4gKiBAcmV0dXJucyBUaGUgbm9kZSBmb3VuZCBvciBgdW5kZWZpbmVkYCBpZiBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUlkPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICByb290OiBvYmplY3QsXG4gIGlkOiBzdHJpbmcsXG4gIGdldElkOiBSZWZJZFJlc29sdmVyID0gZ2V0TW9kZWxSZWZJZFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIC8vIGNhY2hlL3JldXNlIGNvbXB1dGVkSWRUcmVlcyBmb3Igc2FtZSBnZXRJZCBmdW5jdGlvblxuICBjb25zdCBjb21wdXRlZElkVHJlZSA9IGdldE9yQ3JlYXRlKGNvbXB1dGVkSWRUcmVlcywgZ2V0SWQsICgpID0+XG4gICAgY29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZTxzdHJpbmc+KChub2RlKSA9PiBnZXRJZChub2RlKSlcbiAgKVxuXG4gIGNvbnN0IGlkTWFwID0gY29tcHV0ZWRJZFRyZWUud2Fsayhyb290KVxuICByZXR1cm4gaWRNYXAgPyAoaWRNYXAuZ2V0KGlkKSBhcyBUIHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBnZXRCYWNrUmVmczxUIGV4dGVuZHMgb2JqZWN0PihcbiAgdGFyZ2V0OiBULFxuICByZWZUeXBlPzogUmVmQ29uc3RydWN0b3I8VD5cbik6IE9ic2VydmFibGVTZXQ8UmVmPFQ+PiB7XG4gIGxldCBiYWNrUmVmcyA9IG9iamVjdEJhY2tSZWZzLmdldCh0YXJnZXQpXG4gIGlmICghYmFja1JlZnMpIHtcbiAgICBiYWNrUmVmcyA9IHtcbiAgICAgIGFsbDogb2JzZXJ2YWJsZS5zZXQodW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pLFxuICAgICAgYnlUeXBlOiBuZXcgV2Vha01hcCgpLFxuICAgIH1cbiAgICBvYmplY3RCYWNrUmVmcy5zZXQodGFyZ2V0LCBiYWNrUmVmcylcbiAgfVxuXG4gIGlmICghcmVmVHlwZSkge1xuICAgIHJldHVybiBiYWNrUmVmcy5hbGxcbiAgfSBlbHNlIHtcbiAgICBsZXQgYnlUeXBlID0gYmFja1JlZnMuYnlUeXBlLmdldChyZWZUeXBlKVxuICAgIGlmICghYnlUeXBlKSB7XG4gICAgICBieVR5cGUgPSBvYnNlcnZhYmxlLnNldCh1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSlcbiAgICAgIGJhY2tSZWZzLmJ5VHlwZS5zZXQocmVmVHlwZSwgYnlUeXBlKVxuICAgIH1cbiAgICByZXR1cm4gYnlUeXBlXG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGFsbCByZWZlcmVuY2VzIHRoYXQgcmVzb2x2ZSB0byBhIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmVmZXJlbmNlZCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgTm9kZSB0aGUgcmVmZXJlbmNlcyBwb2ludCB0by5cbiAqIEBwYXJhbSByZWZUeXBlIFBhc3MgaXQgdG8gZmlsdGVyIGJ5IG9ubHkgcmVmZXJlbmNlcyBvZiBhIGdpdmVuIHR5cGUsIG9yIG9taXQgLyBwYXNzIGB1bmRlZmluZWRgIHRvIGdldCByZWZlcmVuY2VzIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucy5cbiAqIEByZXR1cm5zIEFuIG9ic2VydmFibGUgc2V0IHdpdGggYWxsIHJlZmVyZW5jZSBvYmplY3RzIHRoYXQgcG9pbnQgdG8gdGhlIGdpdmVuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZnNSZXNvbHZpbmdUbzxUIGV4dGVuZHMgb2JqZWN0PihcbiAgdGFyZ2V0OiBULFxuICByZWZUeXBlPzogUmVmQ29uc3RydWN0b3I8VD4sXG4gIG9wdGlvbnM/OiB7XG4gICAgdXBkYXRlQWxsUmVmc0lmTmVlZGVkPzogYm9vbGVhblxuICB9XG4pOiBPYnNlcnZhYmxlU2V0PFJlZjxUPj4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcblxuICBpZiAob3B0aW9ucz8udXBkYXRlQWxsUmVmc0lmTmVlZGVkICYmIGlzUmVhY3Rpb25EZWxheWVkKCkpIHtcbiAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIHJlZmVyZW5jZSB1cGRhdGUgbWlnaHQgaGF2ZSBiZWVuIGRlbGF5ZWRcbiAgICAvLyBzbyB3ZSB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1cGRhdGUgdGhlbVxuICAgIGNvbnN0IHJlZnNDaGVja2VkID0gbmV3IFNldDxSZWY8b2JqZWN0Pj4oKVxuICAgIGNvbnN0IHVwZGF0ZVJlZiA9IChyZWY6IFJlZjxhbnk+KSA9PiB7XG4gICAgICBpZiAoIXJlZnNDaGVja2VkLmhhcyhyZWYpKSB7XG4gICAgICAgIGlmICghcmVmVHlwZSB8fCByZWYgaW5zdGFuY2VvZiByZWZUeXBlLnJlZkNsYXNzKSB7XG4gICAgICAgICAgcmVmLmZvcmNlVXBkYXRlQmFja1JlZnMoKVxuICAgICAgICB9XG4gICAgICAgIHJlZnNDaGVja2VkLmFkZChyZWYpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQmFja1JlZnMgPSBnZXRCYWNrUmVmcyh0YXJnZXQsIHJlZlR5cGUpXG4gICAgb2xkQmFja1JlZnMuZm9yRWFjaCh1cGRhdGVSZWYpXG5cbiAgICBjb25zdCByZWZzQ2hpbGRyZW5PZlJvb3QgPSBnZXREZWVwQ2hpbGRyZW5SZWZzKGdldERlZXBPYmplY3RDaGlsZHJlbihnZXRSb290KHRhcmdldCkpKVxuICAgIGxldCByZWZzOiBTZXQ8UmVmPG9iamVjdD4+IHwgdW5kZWZpbmVkXG4gICAgaWYgKHJlZlR5cGUpIHtcbiAgICAgIHJlZnMgPSByZWZzQ2hpbGRyZW5PZlJvb3QuYnlUeXBlLmdldChyZWZUeXBlLnJlZkNsYXNzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZWZzID0gcmVmc0NoaWxkcmVuT2ZSb290LmFsbFxuICAgIH1cbiAgICByZWZzPy5mb3JFYWNoKHVwZGF0ZVJlZilcbiAgfVxuXG4gIHJldHVybiBnZXRCYWNrUmVmcyh0YXJnZXQsIHJlZlR5cGUpXG59XG5cbmNvbnN0IHVwZGF0ZUJhY2tSZWZzID0gYWN0aW9uKFxuICBcInVwZGF0ZUJhY2tSZWZzXCIsXG4gIDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICByZWY6IFJlZjxUPixcbiAgICByZWZDbGFzczogUmVmQ29uc3RydWN0b3I8VD4sXG4gICAgbmV3VGFyZ2V0OiBUIHwgdW5kZWZpbmVkLFxuICAgIG9sZFRhcmdldDogVCB8IHVuZGVmaW5lZFxuICApID0+IHtcbiAgICBpZiAobmV3VGFyZ2V0ID09PSBvbGRUYXJnZXQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChvbGRUYXJnZXQpIHtcbiAgICAgIGdldEJhY2tSZWZzKG9sZFRhcmdldCkuZGVsZXRlKHJlZilcbiAgICAgIGdldEJhY2tSZWZzKG9sZFRhcmdldCwgcmVmQ2xhc3MgYXMgUmVmQ29uc3RydWN0b3I8YW55PikuZGVsZXRlKHJlZilcbiAgICB9XG4gICAgaWYgKG5ld1RhcmdldCkge1xuICAgICAgZ2V0QmFja1JlZnMobmV3VGFyZ2V0KS5hZGQocmVmKVxuICAgICAgZ2V0QmFja1JlZnMobmV3VGFyZ2V0LCByZWZDbGFzcyBhcyBSZWZDb25zdHJ1Y3Rvcjxhbnk+KS5hZGQocmVmKVxuICAgIH1cbiAgfVxuKVxuXG5mdW5jdGlvbiBpc1JlYWN0aW9uRGVsYXllZCgpIHtcbiAgbGV0IHJlYWN0aW9uRGVsYXllZCA9IHRydWVcbiAgY29uc3QgZGlzcG9zZSA9IHdoZW4oXG4gICAgKCkgPT4gdHJ1ZSxcbiAgICAoKSA9PiB7XG4gICAgICByZWFjdGlvbkRlbGF5ZWQgPSBmYWxzZVxuICAgIH1cbiAgKVxuICBkaXNwb3NlKClcbiAgcmV0dXJuIHJlYWN0aW9uRGVsYXllZFxufVxuXG5pbnRlcmZhY2UgRGVlcENoaWxkcmVuUmVmcyB7XG4gIGFsbDogU2V0PFJlZjxhbnk+PlxuICBieVR5cGU6IFdlYWtNYXA8TW9kZWxDbGFzczxSZWY8YW55Pj4sIFNldDxSZWY8YW55Pj4+XG59XG5cbmNvbnN0IGdldERlZXBDaGlsZHJlblJlZnMgPSByZWdpc3RlckRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbjxEZWVwQ2hpbGRyZW5SZWZzPih7XG4gIGluaXREYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbGw6IG5ldyBTZXQoKSxcbiAgICAgIGJ5VHlwZTogbmV3IFdlYWtNYXAoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkTm9kZShub2RlLCBkYXRhKSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgIGRhdGEuYWxsLmFkZChub2RlKVxuICAgICAgY29uc3QgcmVmc0J5VGhpc1R5cGUgPSBnZXRPckNyZWF0ZShkYXRhLmJ5VHlwZSwgbm9kZS5jb25zdHJ1Y3RvciwgKCkgPT4gbmV3IFNldCgpKVxuICAgICAgcmVmc0J5VGhpc1R5cGUuYWRkKG5vZGUpXG4gICAgfVxuICB9LFxufSlcbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIGdldE1vZGVsUmVmSWQsXG4gIGludGVybmFsQ3VzdG9tUmVmLFxuICBSZWZJZFJlc29sdmVyLFxuICBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2UsXG4gIFJlZlJlc29sdmVyLFxufSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUmVmQ29uc3RydWN0b3IgfSBmcm9tIFwiLi9SZWZcIlxuXG4vKipcbiAqIEN1c3RvbSByZWZlcmVuY2Ugb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SZWZPcHRpb25zPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIE11c3QgcmV0dXJuIHRoZSByZXNvbHV0aW9uIGZvciB0aGUgZ2l2ZW4gcmVmZXJlbmNlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHJlZiBSZWZlcmVuY2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZXNvbHZlOiBSZWZSZXNvbHZlcjxUPlxuXG4gIC8qKlxuICAgKiBNdXN0IHJldHVybiB0aGUgSUQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdCwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgaGFzIG5vIElELlxuICAgKiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCB0cnkgdG8gZ2V0IHRoZSByZWZlcmVuY2UgaWQgZnJvbSB0aGUgbW9kZWwgYGdldFJlZklkKClgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCBUYXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgZ2V0SWQ/OiBSZWZJZFJlc29sdmVyXG5cbiAgLyoqXG4gICAqIFdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIHRoZSByZXNvbHZlZCB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVmIFJlZmVyZW5jZSBvYmplY3QuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBOZXcgcmVzb2x2ZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSBPbGQgcmVzb2x2ZWQgdmFsdWUuXG4gICAqL1xuICBvblJlc29sdmVkVmFsdWVDaGFuZ2U/OiBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2U8VD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIHJlZiB0byBhbiBvYmplY3QsIHdoaWNoIGluIGl0cyBzbmFwc2hvdCBmb3JtIGhhcyBhbiBpZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgVGFyZ2V0IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIG1vZGVsVHlwZUlkIFVuaXF1ZSBtb2RlbCB0eXBlIGlkLlxuICogQHBhcmFtIG9wdGlvbnMgQ3VzdG9tIHJlZmVyZW5jZSBvcHRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGFsbG93cyB5b3UgdG8gY29uc3RydWN0IHRoYXQgdHlwZSBvZiBjdXN0b20gcmVmZXJlbmNlLlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9tUmVmOiA8VCBleHRlbmRzIG9iamVjdD4oXG4gIG1vZGVsVHlwZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEN1c3RvbVJlZk9wdGlvbnM8VD5cbikgPT4gUmVmQ29uc3RydWN0b3I8VD4gPSBhY3Rpb24oXCJjdXN0b21SZWZcIiwgKG1vZGVsVHlwZUlkLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGdldElkID0gb3B0aW9ucy5nZXRJZCA/PyBnZXRNb2RlbFJlZklkXG5cbiAgcmV0dXJuIGludGVybmFsQ3VzdG9tUmVmKG1vZGVsVHlwZUlkLCAoKSA9PiBvcHRpb25zLnJlc29sdmUsIGdldElkLCBvcHRpb25zLm9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSlcbn0pXG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQge1xuICBnZXRNb2RlbFJlZklkLFxuICBpbnRlcm5hbEN1c3RvbVJlZixcbiAgUmVmSWRSZXNvbHZlcixcbiAgUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlLFxuICBSZWZSZXNvbHZlcixcbiAgcmVzb2x2ZUlkLFxufSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUmVmLCBSZWZDb25zdHJ1Y3RvciB9IGZyb20gXCIuL1JlZlwiXG5cbi8qKlxuICogQ3VzdG9tIHJlZmVyZW5jZSBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RSZWZPcHRpb25zPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIE11c3QgcmV0dXJuIHRoZSBJRCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiB0YXJnZXQgb2JqZWN0LCBvciBgdW5kZWZpbmVkYCBpZiBpdCBoYXMgbm8gSUQuXG4gICAqIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIHRyeSB0byBnZXQgdGhlIHJlZmVyZW5jZSBpZCBmcm9tIHRoZSBtb2RlbCBgZ2V0UmVmSWQoKWAgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBvYmplY3QuXG4gICAqL1xuICBnZXRJZD86IFJlZklkUmVzb2x2ZXJcblxuICAvKipcbiAgICogV2hhdCBzaG91bGQgaGFwcGVuIHdoZW4gdGhlIHJlc29sdmVkIHZhbHVlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSByZWYgUmVmZXJlbmNlIG9iamVjdC5cbiAgICogQHBhcmFtIG5ld1ZhbHVlIE5ldyByZXNvbHZlZCB2YWx1ZS5cbiAgICogQHBhcmFtIG9sZFZhbHVlIE9sZCByZXNvbHZlZCB2YWx1ZS5cbiAgICovXG4gIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZT86IFJlZk9uUmVzb2x2ZWRWYWx1ZUNoYW5nZTxUPlxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByb290IHJlZiB0byBhbiBvYmplY3QsIHdoaWNoIGluIGl0cyBzbmFwc2hvdCBmb3JtIGhhcyBhbiBpZC5cbiAqIEEgcm9vdCByZWYgd2lsbCBvbmx5IGJlIGFibGUgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIGFzIGxvbmcgYXMgYm90aCB0aGUgUmVmXG4gKiBhbmQgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IHNoYXJlIGEgY29tbW9uIHJvb3QuXG4gKlxuICogQHR5cGVwYXJhbSBUIFRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFR5cGVJZCBVbmlxdWUgbW9kZWwgdHlwZSBpZC5cbiAqIEBwYXJhbSBbb3B0aW9uc10gUm9vdCByZWZlcmVuY2Ugb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgeW91IHRvIGNvbnN0cnVjdCB0aGF0IHR5cGUgb2Ygcm9vdCByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCByb290UmVmOiA8VCBleHRlbmRzIG9iamVjdD4oXG4gIG1vZGVsVHlwZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBSb290UmVmT3B0aW9uczxUPiB8IHVuZGVmaW5lZFxuKSA9PiBSZWZDb25zdHJ1Y3RvcjxUPiA9IGFjdGlvbihcbiAgXCJyb290UmVmXCIsXG4gIDxUIGV4dGVuZHMgb2JqZWN0Pihtb2RlbFR5cGVJZDogc3RyaW5nLCBvcHRpb25zPzogUm9vdFJlZk9wdGlvbnM8VD4pOiBSZWZDb25zdHJ1Y3RvcjxUPiA9PiB7XG4gICAgY29uc3QgZ2V0SWQgPSBvcHRpb25zPy5nZXRJZCA/PyBnZXRNb2RlbFJlZklkXG4gICAgY29uc3Qgb25SZXNvbHZlZFZhbHVlQ2hhbmdlID0gb3B0aW9ucz8ub25SZXNvbHZlZFZhbHVlQ2hhbmdlXG5cbiAgICBjb25zdCByZXNvbHZlckdlbiA9IChyZWY6IFJlZjxUPik6IFJlZlJlc29sdmVyPFQ+ID0+IHtcbiAgICAgIGxldCBjYWNoZWRUYXJnZXQ6IFQgfCB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVmUm9vdCA9IGZhc3RHZXRSb290KHJlZilcblxuICAgICAgICBpZiAoaXNSZWZSb290Q2FjaGVkVGFyZ2V0T2socmVmLCByZWZSb290LCBjYWNoZWRUYXJnZXQsIGdldElkKSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZWRUYXJnZXRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gbm90IGZvdW5kLCBldmVyeXRpbWUgYSBjaGlsZCBpcyBhZGRlZC9yZW1vdmVkIG9yIGl0cyBpZCBjaGFuZ2VzIHdlIHdpbGwgcGVyZm9ybSBhbm90aGVyIHNlYXJjaFxuICAgICAgICAvLyB0aGlzIHNlYXJjaCBpcyBvbmx5IGRvbmUgb25jZSBmb3IgZXZlcnkgZGlzdGluY3QgZ2V0SWQgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gcmVzb2x2ZUlkPFQ+KHJlZlJvb3QsIHJlZi5pZCwgZ2V0SWQpXG4gICAgICAgIGlmIChuZXdUYXJnZXQpIHtcbiAgICAgICAgICBjYWNoZWRUYXJnZXQgPSBuZXdUYXJnZXRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VGFyZ2V0XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVybmFsQ3VzdG9tUmVmKG1vZGVsVHlwZUlkLCByZXNvbHZlckdlbiwgZ2V0SWQsIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSlcbiAgfVxuKVxuXG5mdW5jdGlvbiBpc1JlZlJvb3RDYWNoZWRUYXJnZXRPazxUIGV4dGVuZHMgb2JqZWN0PihcbiAgcmVmOiBSZWY8VD4sXG4gIHJlZlJvb3Q6IG9iamVjdCxcbiAgY2FjaGVkVGFyZ2V0OiBUIHwgdW5kZWZpbmVkLFxuICBnZXRJZDogUmVmSWRSZXNvbHZlclxuKTogY2FjaGVkVGFyZ2V0IGlzIFQge1xuICBpZiAoIWNhY2hlZFRhcmdldCkgcmV0dXJuIGZhbHNlXG4gIGlmIChyZWYuaWQgIT09IGdldElkKGNhY2hlZFRhcmdldCkpIHJldHVybiBmYWxzZVxuICBpZiAocmVmUm9vdCAhPT0gZmFzdEdldFJvb3QoY2FjaGVkVGFyZ2V0KSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQgeyBhZGRTdGFuZGFsb25lQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uc1wiXG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YW5kYWxvbmUgYWN0aW9uLiBBIHN0YW5kYWxvbmUgYWN0aW9uIG11c3QgYWx3YXlzIHRha2UgYW4gZXhpc3RpbmcgdHJlZSBub2RlIGFzIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBhY3Rpb25OYW1lIFVuaXF1ZSBhY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSBmbiBGdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmdW5jdGlvbiBhcyBhbiBzdGFuZGFsb25lIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW5kYWxvbmVBY3Rpb248Rk4gZXh0ZW5kcyAodGFyZ2V0OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gIGZuOiBGTlxuKTogRk4ge1xuICByZXR1cm4gYWRkU3RhbmRhbG9uZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgZmFsc2UpIGFzIHVua25vd24gYXMgRk5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhbmRhbG9uZSBmbG93LiBBIHN0YW5kYWxvbmUgZmxvdyBtdXN0IGFsd2F5cyB0YWtlIGFuIGV4aXN0aW5nIHRyZWUgbm9kZSBhcyBmaXJzdCBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBVbmlxdWUgYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0gZm4gRnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZnVuY3Rpb24gYXMgYW4gc3RhbmRhbG9uZSBmbG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhbG9uZUZsb3c8XG4gIEZOIGV4dGVuZHMgKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gR2VuZXJhdG9yPGFueSwgYW55LCBhbnk+XG4+KGFjdGlvbk5hbWU6IHN0cmluZywgZm46IEZOKTogRk4ge1xuICByZXR1cm4gYWRkU3RhbmRhbG9uZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgdHJ1ZSkgYXMgdW5rbm93biBhcyBGTlxufVxuIiwiaW1wb3J0IHsgcmVtb3ZlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyB0b1RyZWVOb2RlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIGFzIG5zIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHN0YW5kYWxvbmVBY3Rpb24gfSBmcm9tIFwiLi9zdGFuZGFsb25lQWN0aW9uc1wiXG5cbmZ1bmN0aW9uIF9zcGxpY2UoYXJyYXk6IGFueVtdLCBzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudD86IG51bWJlcik6IGFueVtdXG5mdW5jdGlvbiBfc3BsaWNlKGFycmF5OiBhbnlbXSwgc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IGFueVtdKTogYW55W11cbmZ1bmN0aW9uIF9zcGxpY2UoYXJyYXk6IGFueVtdLCAuLi5hcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgcmV0dXJuIChhcnJheS5zcGxpY2UgYXMgYW55KSguLi5hcmdzKVxufVxuXG5jb25zdCBuYW1lc3BhY2UgPSBgJHtuc30vYXJyYXlBY3Rpb25zYFxuXG5leHBvcnQgY29uc3QgYXJyYXlBY3Rpb25zID0ge1xuICBzZXQ6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6c2V0YCwgPFQ+KGFycmF5OiBUW10sIGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkID0+IHtcbiAgICBzZXQoYXJyYXksIGluZGV4LCB2YWx1ZSlcbiAgfSksXG5cbiAgZGVsZXRlOiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OmRlbGV0ZWAsIDxUPihhcnJheTogVFtdLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIHJlbW92ZShhcnJheSwgXCJcIiArIGluZGV4KVxuICB9KSxcblxuICBzZXRMZW5ndGg6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6c2V0TGVuZ3RoYCwgPFQ+KGFycmF5OiBUW10sIGxlbmd0aDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgYXJyYXkubGVuZ3RoID0gbGVuZ3RoXG4gIH0pLFxuXG4gIGNvbmNhdDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9Ojpjb25jYXRgLFxuICAgIDxUPihhcnJheTogVFtdLCAuLi5pdGVtczogQ29uY2F0QXJyYXk8VD5bXSk6IFRbXSA9PiB7XG4gICAgICByZXR1cm4gYXJyYXkuY29uY2F0KC4uLml0ZW1zKVxuICAgIH1cbiAgKSxcblxuICBjb3B5V2l0aGluOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmNvcHlXaXRoaW5gLFxuICAgIDxUPihhcnJheTogVFtdLCB0YXJnZXQ6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogVFtdID0+IHtcbiAgICAgIHJldHVybiBhcnJheS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZClcbiAgICB9XG4gICksXG5cbiAgZmlsbDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpmaWxsYCxcbiAgICA8VD4oYXJyYXk6IFRbXSwgdmFsdWU6IFQsIHN0YXJ0PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBlbmQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBUW10gPT4ge1xuICAgICAgcmV0dXJuIGFycmF5LmZpbGwodmFsdWUsIHN0YXJ0LCBlbmQpXG4gICAgfVxuICApLFxuXG4gIHBvcDogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9Ojpwb3BgLCA8VD4oYXJyYXk6IFRbXSk6IFQgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiBhcnJheS5wb3AoKVxuICB9KSxcblxuICBwdXNoOiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnB1c2hgLCA8VD4oYXJyYXk6IFRbXSwgLi4uaXRlbXM6IFRbXSk6IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIGFycmF5LnB1c2goLi4uaXRlbXMpXG4gIH0pLFxuXG4gIHJldmVyc2U6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6cmV2ZXJzZWAsIDxUPihhcnJheTogVFtdKTogVFtdID0+IHtcbiAgICByZXR1cm4gYXJyYXkucmV2ZXJzZSgpXG4gIH0pLFxuXG4gIHNoaWZ0OiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnNoaWZ0YCwgPFQ+KGFycmF5OiBUW10pOiBUIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gYXJyYXkuc2hpZnQoKVxuICB9KSxcblxuICBzbGljZTogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpzbGljZWAsXG4gICAgPFQ+KGFycmF5OiBUW10sIHN0YXJ0PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBlbmQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBUW10gPT4ge1xuICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgfVxuICApLFxuXG4gIHNvcnQ6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6c29ydGAsXG4gICAgPFQ+KGFycmF5OiBUW10sIGNvbXBhcmVGbj86ICgoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZCk6IFRbXSA9PiB7XG4gICAgICByZXR1cm4gYXJyYXkuc29ydChjb21wYXJlRm4pXG4gICAgfVxuICApLFxuXG4gIHNwbGljZTogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpzcGxpY2VgLFxuICAgIF9zcGxpY2UgYXNcbiAgICAgIHwgKDxUPihhcnJheTogVFtdLCBzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudD86IG51bWJlcikgPT4gVFtdKVxuICAgICAgfCAoPFQ+KGFycmF5OiBUW10sIHN0YXJ0OiBudW1iZXIsIGRlbGV0ZUNvdW50OiBudW1iZXIsIC4uLml0ZW1zOiBUW10pID0+IFRbXSlcbiAgKSxcblxuICB1bnNoaWZ0OiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnVuc2hpZnRgLCA8VD4oYXJyYXk6IFRbXSwgLi4uaXRlbXM6IFRbXSk6IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpXG4gIH0pLFxuXG4gIHN3YXA6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6c3dhcGAsXG4gICAgPFQ+KGFycmF5OiBUW10sIGluZGV4MTogbnVtYmVyLCBpbmRleDI6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKGluZGV4MSA8IDAgfHwgaW5kZXgyIDwgMCB8fCBpbmRleDEgPj0gYXJyYXkubGVuZ3RoIHx8IGluZGV4MiA+PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoaW5kZXgyIDwgaW5kZXgxKSB7XG4gICAgICAgIDtbaW5kZXgxLCBpbmRleDJdID0gW2luZGV4MiwgaW5kZXgxXVxuICAgICAgfVxuICAgICAgLy8gc2luY2UgYSBzYW1lIG5vZGUgY2Fubm90IGJlIGluIHR3byBwbGFjZXMgYXQgb25jZSB3ZSB3aWxsIHJlbW92ZVxuICAgICAgLy8gYm90aCB0aGVuIHJlaW5zZXJ0IHRoZW1cbiAgICAgIGNvbnN0IFt2MV0gPSBhcnJheS5zcGxpY2UoaW5kZXgxLCAxKVxuICAgICAgY29uc3QgW3YyXSA9IGFycmF5LnNwbGljZShpbmRleDIgLSAxLCAxKVxuICAgICAgYXJyYXkuc3BsaWNlKGluZGV4MSwgMCwgdjIpXG4gICAgICBhcnJheS5zcGxpY2UoaW5kZXgyLCAwLCB2MSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICApLFxuXG4gIGNyZWF0ZTogPFQ+KGRhdGE6IFRbXSk6IFRbXSA9PiB0b1RyZWVOb2RlKGRhdGEpLFxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCByZW1vdmUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHRvVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyBhc3NlcnRJc09iamVjdCwgbmFtZXNwYWNlIGFzIG5zIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHN0YW5kYWxvbmVBY3Rpb24gfSBmcm9tIFwiLi9zdGFuZGFsb25lQWN0aW9uc1wiXG5cbmNvbnN0IG5hbWVzcGFjZSA9IGAke25zfS9vYmplY3RBY3Rpb25zYFxuXG5leHBvcnQgY29uc3Qgb2JqZWN0QWN0aW9ucyA9IHtcbiAgc2V0OiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OnNldGAsXG4gICAgPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPih0YXJnZXQ6IFQsIGtleTogSywgdmFsdWU6IFRbS10pOiB2b2lkID0+IHtcbiAgICAgIGlmIChpc09ic2VydmFibGUodGFyZ2V0KSkge1xuICAgICAgICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgKSxcblxuICBhc3NpZ246IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6YXNzaWduYCxcbiAgICA8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBULCBwYXJ0aWFsT2JqZWN0OiBQYXJ0aWFsPFQ+KTogdm9pZCA9PiB7XG4gICAgICBhc3NlcnRJc09iamVjdChwYXJ0aWFsT2JqZWN0LCBcInBhcnRpYWxPYmplY3RcIilcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwYXJ0aWFsT2JqZWN0KVxuXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgIHNldCh0YXJnZXQsIGtleSwgKHBhcnRpYWxPYmplY3QgYXMgYW55KVtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgOyh0YXJnZXQgYXMgYW55KVtrZXldID0gKHBhcnRpYWxPYmplY3QgYXMgYW55KVtrZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICksXG5cbiAgZGVsZXRlOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmRlbGV0ZWAsXG4gICAgPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPih0YXJnZXQ6IFQsIGtleTogSyk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIHJlbW92ZSh0YXJnZXQsIGtleSBhcyBhbnkpXG4gICAgfVxuICApLFxuXG4gIGNhbGw6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6Y2FsbGAsXG4gICAgPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIHRhcmdldDogVCxcbiAgICAgIG1ldGhvZE5hbWU6IEssXG4gICAgICAuLi5hcmdzOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBQYXJhbWV0ZXJzPFRbS10+IDogbmV2ZXJcbiAgICApOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBSZXR1cm5UeXBlPFRbS10+IDogbmV2ZXIgPT4ge1xuICAgICAgcmV0dXJuICh0YXJnZXQgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgIH1cbiAgKSxcblxuICBjcmVhdGU6IDxUIGV4dGVuZHMgb2JqZWN0PihkYXRhOiBUKTogVCA9PiB0b1RyZWVOb2RlKGRhdGEpLFxufVxuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdGFnIGRhdGEgYWNjZXNzb3IgZm9yIGEgdGFyZ2V0IG9iamVjdCBvZiBhIGNlcnRhaW4gdHlwZS5cbiAqIFRhZyBkYXRhIHdpbGwgYmUgbGF6eSBjcmVhdGVkIG9uIGFjY2VzcyBhbmQgcmV1c2VkIGZvciB0aGUgc2FtZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVGFyZ2V0IFRhcmdldCB0eXBlLlxuICogQHR5cGVwYXJhbSBUYWdEYXRhIFRhZyBkYXRhIHR5cGUuXG4gKiBAcGFyYW0gdGFnRGF0YUNvbnN0cnVjdG9yIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgdGhlIHRhZ1xuICogZm9yIGEgZ2l2ZW4gb2JqZWN0IGlzIHJlcXVlc3RlZC5cbiAqIEByZXR1cm5zIFRoZSB0YWcgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWc8VGFyZ2V0IGV4dGVuZHMgb2JqZWN0LCBUYWdEYXRhPihcbiAgdGFnRGF0YUNvbnN0cnVjdG9yOiAodGFyZ2V0OiBUYXJnZXQpID0+IFRhZ0RhdGFcbik6IHtcbiAgZm9yKHRhcmdldDogVGFyZ2V0KTogVGFnRGF0YVxufSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBXZWFrTWFwPFRhcmdldCwgVGFnRGF0YT4oKVxuXG4gIHJldHVybiB7XG4gICAgZm9yKHRhcmdldCk6IFRhZ0RhdGEge1xuICAgICAgaWYgKCFtYXAuaGFzKHRhcmdldCkpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRhZ0RhdGFDb25zdHJ1Y3Rvcih0YXJnZXQpXG4gICAgICAgIG1hcC5zZXQodGFyZ2V0LCBkYXRhKVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQodGFyZ2V0KSFcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQge1xuICBhY3Rpb24sXG4gIElNYXBXaWxsQ2hhbmdlLFxuICBpbnRlcmNlcHQsXG4gIElPYmplY3REaWRDaGFuZ2UsXG4gIElPYnNlcnZhYmxlQXJyYXksXG4gIGlzT2JzZXJ2YWJsZUFycmF5LFxuICBpc09ic2VydmFibGVPYmplY3QsXG4gIG9ic2VydmFibGUsXG4gIE9ic2VydmFibGVNYXAsXG4gIG9ic2VydmUsXG4gIHJlbW92ZSxcbiAgc2V0LFxufSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBhc3NlcnRJc01hcCxcbiAgYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXksXG4gIGFzc2VydElzT2JzZXJ2YWJsZU9iamVjdCxcbiAgZmFpbHVyZSxcbiAgZ2V0TW9ieFZlcnNpb24sXG4gIGluRGV2TW9kZSxcbiAgaXNBcnJheSxcbn0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHRhZyB9IGZyb20gXCIuLi91dGlscy90YWdcIlxuXG5jb25zdCBvYnNlcnZhYmxlTWFwQmFja2VkQnlPYnNlcnZhYmxlT2JqZWN0ID0gYWN0aW9uKFxuICA8VD4oXG4gICAgb2JqOiBvYmplY3RcbiAgKTogT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFQ+ICYge1xuICAgIGRhdGFPYmplY3Q6IHR5cGVvZiBvYmpcbiAgfSA9PiB7XG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoIWlzT2JzZXJ2YWJsZU9iamVjdChvYmopKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiBleHBlY3RlZCBhbiBvYnNlcnZhYmxlIG9iamVjdFwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG9ic2VydmFibGUubWFwKClcbiAgICA7KG1hcCBhcyBhbnkpLmRhdGFPYmplY3QgPSBvYmpcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgbWFwLnNldChrLCAob2JqIGFzIGFueSlba10pXG4gICAgfVxuXG4gICAgbGV0IG1hcEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgb2JqZWN0QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuXG4gICAgLy8gd2hlbiB0aGUgb2JqZWN0IGNoYW5nZXMgdGhlIG1hcCBjaGFuZ2VzXG4gICAgb2JzZXJ2ZShcbiAgICAgIG9iaixcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBJT2JqZWN0RGlkQ2hhbmdlKSA9PiB7XG4gICAgICAgIGlmIChtYXBBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgb2JqZWN0QWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgbWFwLnNldChjaGFuZ2UubmFtZSwgY2hhbmdlLm5ld1ZhbHVlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgICAgbWFwLmRlbGV0ZShjaGFuZ2UubmFtZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgb2JqZWN0QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIC8vIHdoZW4gdGhlIG1hcCBjaGFuZ2VzIGFsc28gY2hhbmdlIHRoZSBvYmplY3RcbiAgICBpbnRlcmNlcHQoXG4gICAgICBtYXAsXG4gICAgICBhY3Rpb24oKGNoYW5nZTogSU1hcFdpbGxDaGFuZ2U8c3RyaW5nLCBUPikgPT4ge1xuICAgICAgICBpZiAobWFwQWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iamVjdEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwQWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgc2V0KG9iaiwgY2hhbmdlLm5hbWUsIGNoYW5nZS5uZXdWYWx1ZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVwiOiB7XG4gICAgICAgICAgICAgIHJlbW92ZShvYmosIGNoYW5nZS5uYW1lKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBtYXBBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgcmV0dXJuIG1hcCBhcyBhbnlcbiAgfVxuKVxuXG5jb25zdCBvYnNlcnZhYmxlTWFwQmFja2VkQnlPYnNlcnZhYmxlQXJyYXkgPSBhY3Rpb24oXG4gIDxUPihcbiAgICBhcnJheTogSU9ic2VydmFibGVBcnJheTxbc3RyaW5nLCBUXT5cbiAgKTogT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFQ+ICYgeyBkYXRhT2JqZWN0OiB0eXBlb2YgYXJyYXkgfSA9PiB7XG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoIWlzT2JzZXJ2YWJsZUFycmF5KGFycmF5KSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwiYXNzZXJ0aW9uIGZhaWxlZDogZXhwZWN0ZWQgYW4gb2JzZXJ2YWJsZSBhcnJheVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtYXA6IE9ic2VydmFibGVNYXA8c3RyaW5nLCBUPlxuICAgIGlmIChnZXRNb2J4VmVyc2lvbigpID49IDYpIHtcbiAgICAgIG1hcCA9IG9ic2VydmFibGUubWFwKGFycmF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXAgPSBvYnNlcnZhYmxlLm1hcCgpXG4gICAgICBhcnJheS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgbWFwLnNldChrLCB2KVxuICAgICAgfSlcbiAgICB9XG4gICAgOyhtYXAgYXMgYW55KS5kYXRhT2JqZWN0ID0gYXJyYXlcblxuICAgIGlmIChtYXAuc2l6ZSAhPT0gYXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYXJyYXlzIGJhY2tpbmcgYSBtYXAgY2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGtleXNcIilcbiAgICB9XG5cbiAgICBsZXQgbWFwQWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBhcnJheUFscmVhZHlDaGFuZ2VkID0gZmFsc2VcblxuICAgIC8vIGZvciBzcGVlZCByZWFzb25zIHdlIHdpbGwganVzdCBhc3N1bWUgZGlzdGluY3QgdmFsdWVzIGFyZSBvbmx5IG9uY2UgaW4gdGhlIGFycmF5XG4gICAgLy8gYWxzbyB3ZSBhc3N1bWUgdHVwbGVzIHRoZW1zZWx2ZXMgYXJlIGltbXV0YWJsZVxuXG4gICAgLy8gd2hlbiB0aGUgYXJyYXkgY2hhbmdlcyB0aGUgbWFwIGNoYW5nZXNcbiAgICBvYnNlcnZlKFxuICAgICAgYXJyYXksXG4gICAgICBhY3Rpb24oKGNoYW5nZTogYW55IC8qSUFycmF5RGlkQ2hhbmdlPFtzdHJpbmcsIFRdPiovKSA9PiB7XG4gICAgICAgIGlmIChtYXBBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IHRydWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3BsaWNlXCI6IHtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjaGFuZ2UucmVtb3ZlZFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgbWFwLmRlbGV0ZShyZW1vdmVkW2ldWzBdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRlZCA9IGNoYW5nZS5hZGRlZFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIG1hcC5zZXQoYWRkZWRbaV1bMF0sIGFkZGVkW2ldWzFdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgICBtYXAuZGVsZXRlKGNoYW5nZS5vbGRWYWx1ZVswXSlcbiAgICAgICAgICAgICAgbWFwLnNldChjaGFuZ2UubmV3VmFsdWVbMF0sIGNoYW5nZS5uZXdWYWx1ZVsxXSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgLy8gd2hlbiB0aGUgbWFwIGNoYW5nZXMgYWxzbyBjaGFuZ2UgdGhlIGFycmF5XG4gICAgaW50ZXJjZXB0KFxuICAgICAgbWFwLFxuICAgICAgYWN0aW9uKChjaGFuZ2U6IElNYXBXaWxsQ2hhbmdlPHN0cmluZywgVD4pID0+IHtcbiAgICAgICAgaWYgKG1hcEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJheUFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwQWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgd2hvbGUgdHVwbGUgdG8ga2VlcCB0dXBsZSBpbW11dGFiaWxpdHlcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGFycmF5LmZpbmRJbmRleCgoaSkgPT4gaVswXSA9PT0gY2hhbmdlLm5hbWUpXG4gICAgICAgICAgICAgIGFycmF5W2ldID0gW2NoYW5nZS5uYW1lLCBjaGFuZ2UubmV3VmFsdWUhXVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgICAgICAgYXJyYXkucHVzaChbY2hhbmdlLm5hbWUsIGNoYW5nZS5uZXdWYWx1ZSFdKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwiZGVsZXRlXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGFycmF5LmZpbmRJbmRleCgoaSkgPT4gaVswXSA9PT0gY2hhbmdlLm5hbWUpXG4gICAgICAgICAgICAgIGlmIChpID49IDApIHtcbiAgICAgICAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBtYXBBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgcmV0dXJuIG1hcCBhcyBhbnlcbiAgfVxuKVxuXG5jb25zdCBhc01hcFRhZyA9IHRhZygob2JqT3JBcnJheTogUmVjb3JkPHN0cmluZywgYW55PiB8IEFycmF5PFtzdHJpbmcsIGFueV0+KSA9PiB7XG4gIGlmIChpc0FycmF5KG9iak9yQXJyYXkpKSB7XG4gICAgYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXkob2JqT3JBcnJheSwgXCJvYmpPckFycmF5XCIpXG4gICAgcmV0dXJuIG9ic2VydmFibGVNYXBCYWNrZWRCeU9ic2VydmFibGVBcnJheShvYmpPckFycmF5KVxuICB9IGVsc2Uge1xuICAgIGFzc2VydElzT2JzZXJ2YWJsZU9iamVjdChvYmpPckFycmF5LCBcIm9iak9yQXJyYXlcIilcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU1hcEJhY2tlZEJ5T2JzZXJ2YWJsZU9iamVjdChvYmpPckFycmF5KVxuICB9XG59KVxuXG4vKipcbiAqIFdyYXBzIGFuIG9ic2VydmFibGUgb2JqZWN0IG9yIGEgdHVwbGUgYXJyYXkgdG8gb2ZmZXIgYSBtYXAgbGlrZSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIGFycmF5IEFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNNYXA8SywgVj4oXG4gIGFycmF5OiBBcnJheTxbSywgVl0+XG4pOiBPYnNlcnZhYmxlTWFwPEssIFY+ICYgeyBkYXRhT2JqZWN0OiBBcnJheTxbSywgVl0+IH1cblxuLyoqXG4gKiBXcmFwcyBhbiBvYnNlcnZhYmxlIG9iamVjdCBvciBhIHR1cGxlIGFycmF5IHRvIG9mZmVyIGEgbWFwIGxpa2UgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmplY3QgT2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNNYXA8VD4oXG4gIG9iamVjdDogUmVjb3JkPHN0cmluZywgVD5cbik6IE9ic2VydmFibGVNYXA8c3RyaW5nLCBUPiAmIHsgZGF0YU9iamVjdDogUmVjb3JkPHN0cmluZywgVD4gfVxuXG4vKipcbiAqIFdyYXBzIGFuIG9ic2VydmFibGUgb2JqZWN0IG9yIGEgdHVwbGUgYXJyYXkgdG8gb2ZmZXIgYSBtYXAgbGlrZSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIG9iak9yQXJyYXkgT2JqZWN0IG9yIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNNYXAoXG4gIG9iak9yQXJyYXk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgQXJyYXk8W3Vua25vd24sIHVua25vd25dPlxuKTogT2JzZXJ2YWJsZU1hcDx1bmtub3duLCB1bmtub3duPiAmIHsgZGF0YU9iamVjdDogdHlwZW9mIG9iak9yQXJyYXkgfSB7XG4gIHJldHVybiBhc01hcFRhZy5mb3Iob2JqT3JBcnJheSkgYXMgYW55XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBtYXAgdG8gYW4gb2JqZWN0LiBJZiB0aGUgbWFwIGlzIGEgY29sbGVjdGlvbiB3cmFwcGVyIGl0IHdpbGwgcmV0dXJuIHRoZSBiYWNrZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBtYXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvT2JqZWN0PFQ+KG1hcDogTWFwPHN0cmluZywgVD4pOiBSZWNvcmQ8c3RyaW5nLCBUPiB7XG4gIGFzc2VydElzTWFwKG1hcCwgXCJtYXBcIilcblxuICBjb25zdCBkYXRhT2JqZWN0ID0gKG1hcCBhcyBhbnkpLmRhdGFPYmplY3RcbiAgaWYgKGRhdGFPYmplY3QgJiYgIWlzQXJyYXkoZGF0YU9iamVjdCkpIHtcbiAgICByZXR1cm4gZGF0YU9iamVjdFxuICB9XG5cbiAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBUPiA9IHt9XG4gIGZvciAoY29uc3QgayBvZiBtYXAua2V5cygpKSB7XG4gICAgb2JqW2tdID0gbWFwLmdldChrKSFcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG1hcCB0byBhbiBhcnJheS4gSWYgdGhlIG1hcCBpcyBhIGNvbGxlY3Rpb24gd3JhcHBlciBpdCB3aWxsIHJldHVybiB0aGUgYmFja2VkIGFycmF5LlxuICpcbiAqIEBwYXJhbSBtYXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvQXJyYXk8SywgVj4obWFwOiBNYXA8SywgVj4pOiBBcnJheTxbSywgVl0+IHtcbiAgYXNzZXJ0SXNNYXAobWFwLCBcIm1hcFwiKVxuXG4gIGNvbnN0IGRhdGFPYmplY3QgPSAobWFwIGFzIGFueSkuZGF0YU9iamVjdFxuICBpZiAoZGF0YU9iamVjdCAmJiBpc0FycmF5KGRhdGFPYmplY3QpKSB7XG4gICAgcmV0dXJuIGRhdGFPYmplY3RcbiAgfVxuXG4gIGNvbnN0IGFycjogW0ssIFZdW10gPSBbXVxuICBmb3IgKGNvbnN0IGsgb2YgbWFwLmtleXMoKSkge1xuICAgIGFyci5wdXNoKFtrLCBtYXAuZ2V0KGspIV0pXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsUHJvcFRyYW5zZm9ybSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGFzTWFwIH0gZnJvbSBcIi4uL3dyYXBwZXJzL2FzTWFwXCJcblxuY29uc3QgX29iamVjdFRvTWFwVHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08UmVjb3JkPHN0cmluZywgdW5rbm93bj4sIE1hcDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZTogb2JqLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiBjYWNoZWRNYXAgfSkge1xuICAgIHJldHVybiBjYWNoZWRNYXAgPz8gYXNNYXAob2JqKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZTogbWFwIH0pIHtcbiAgICAvLyBkbyBub3QgY2FjaGUgbWFwIDwtPiBvYmogcmVsYXRpb25zaGlwXG5cbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IGsgb2YgbWFwLmtleXMoKSkge1xuICAgICAgb2JqW2tdID0gbWFwLmdldChrKSFcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBvYmplY3RUb01hcFRyYW5zZm9ybSA9IDxUPigpID0+XG4gIF9vYmplY3RUb01hcFRyYW5zZm9ybSBhcyBNb2RlbFByb3BUcmFuc2Zvcm08UmVjb3JkPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIFQ+PlxuXG5jb25zdCBfYXJyYXlUb01hcFRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPEFycmF5PFt1bmtub3duLCB1bmtub3duXT4sIE1hcDx1bmtub3duLCB1bmtub3duPj4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWU6IGFyciwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogY2FjaGVkTWFwIH0pIHtcbiAgICByZXR1cm4gY2FjaGVkTWFwID8/IGFzTWFwKGFycilcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWU6IG1hcCB9KSB7XG4gICAgLy8gZG8gbm90IGNhY2hlIG1hcCA8LT4gYXJyIHJlbGF0aW9uc2hpcFxuXG4gICAgY29uc3QgYXJyOiBBcnJheTxbdW5rbm93biwgdW5rbm93bl0+ID0gW11cbiAgICBmb3IgKGNvbnN0IGsgb2YgbWFwLmtleXMoKSkge1xuICAgICAgYXJyLnB1c2goW2ssIG1hcC5nZXQoaykhXSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwVHJhbnNmb3JtID0gPEssIFY+KCkgPT5cbiAgX2FycmF5VG9NYXBUcmFuc2Zvcm0gYXMgTW9kZWxQcm9wVHJhbnNmb3JtPEFycmF5PFtLLCBWXT4sIE1hcDxLLCBWPj5cbiIsImltcG9ydCB7XG4gIGFjdGlvbixcbiAgaW50ZXJjZXB0LFxuICBJT2JzZXJ2YWJsZUFycmF5LFxuICBJU2V0V2lsbENoYW5nZSxcbiAgaXNPYnNlcnZhYmxlQXJyYXksXG4gIG9ic2VydmFibGUsXG4gIE9ic2VydmFibGVTZXQsXG4gIG9ic2VydmUsXG59IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydElzT2JzZXJ2YWJsZUFycmF5LCBhc3NlcnRJc1NldCwgZmFpbHVyZSwgZ2V0TW9ieFZlcnNpb24sIGluRGV2TW9kZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyB0YWcgfSBmcm9tIFwiLi4vdXRpbHMvdGFnXCJcblxuY29uc3Qgb2JzZXJ2YWJsZVNldEJhY2tlZEJ5T2JzZXJ2YWJsZUFycmF5ID0gYWN0aW9uKFxuICA8VD4oYXJyYXk6IElPYnNlcnZhYmxlQXJyYXk8VD4pOiBPYnNlcnZhYmxlU2V0PFQ+ICYgeyBkYXRhT2JqZWN0OiB0eXBlb2YgYXJyYXkgfSA9PiB7XG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoIWlzT2JzZXJ2YWJsZUFycmF5KGFycmF5KSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwiYXNzZXJ0aW9uIGZhaWxlZDogZXhwZWN0ZWQgYW4gb2JzZXJ2YWJsZSBhcnJheVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzZXQ6IE9ic2VydmFibGVTZXQ8VD5cbiAgICBpZiAoZ2V0TW9ieFZlcnNpb24oKSA+PSA2KSB7XG4gICAgICBzZXQgPSBvYnNlcnZhYmxlLnNldChhcnJheSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0ID0gb2JzZXJ2YWJsZS5zZXQoKVxuICAgICAgYXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBzZXQuYWRkKGl0ZW0pXG4gICAgICB9KVxuICAgIH1cbiAgICA7KHNldCBhcyBhbnkpLmRhdGFPYmplY3QgPSBhcnJheVxuXG4gICAgaWYgKHNldC5zaXplICE9PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhcnJheXMgYmFja2luZyBhIHNldCBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgdmFsdWVzXCIpXG4gICAgfVxuXG4gICAgbGV0IHNldEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG5cbiAgICAvLyBmb3Igc3BlZWQgcmVhc29ucyB3ZSB3aWxsIGp1c3QgYXNzdW1lIGRpc3RpbmN0IHZhbHVlcyBhcmUgb25seSBvbmNlIGluIHRoZSBhcnJheVxuXG4gICAgLy8gd2hlbiB0aGUgYXJyYXkgY2hhbmdlcyB0aGUgc2V0IGNoYW5nZXNcbiAgICBvYnNlcnZlKFxuICAgICAgYXJyYXksXG4gICAgICBhY3Rpb24oKGNoYW5nZTogYW55IC8qSUFycmF5RGlkQ2hhbmdlPFQ+Ki8pID0+IHtcbiAgICAgICAgaWYgKHNldEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUFscmVhZHlDaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInNwbGljZVwiOiB7XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkID0gY2hhbmdlLnJlbW92ZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW92ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUocmVtb3ZlZFtpXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBjaGFuZ2UuYWRkZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBzZXQuYWRkKGFkZGVkW2ldKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgICBzZXQuZGVsZXRlKGNoYW5nZS5vbGRWYWx1ZSlcbiAgICAgICAgICAgICAgc2V0LmFkZChjaGFuZ2UubmV3VmFsdWUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGFycmF5QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIC8vIHdoZW4gdGhlIHNldCBjaGFuZ2VzIGFsc28gY2hhbmdlIHRoZSBhcnJheVxuICAgIGludGVyY2VwdChcbiAgICAgIHNldCxcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBJU2V0V2lsbENoYW5nZTxUPikgPT4ge1xuICAgICAgICBpZiAoc2V0QWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycmF5QWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gY2hhbmdlXG4gICAgICAgIH1cblxuICAgICAgICBzZXRBbHJlYWR5Q2hhbmdlZCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgICAgICBhcnJheS5wdXNoKGNoYW5nZS5uZXdWYWx1ZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBhcnJheS5pbmRleE9mKGNoYW5nZS5vbGRWYWx1ZSlcbiAgICAgICAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gc2V0IGFzIGFueVxuICB9XG4pXG5cbmNvbnN0IGFzU2V0VGFnID0gdGFnKChhcnJheTogQXJyYXk8YW55PikgPT4ge1xuICBhc3NlcnRJc09ic2VydmFibGVBcnJheShhcnJheSwgXCJhcnJheVwiKVxuICByZXR1cm4gb2JzZXJ2YWJsZVNldEJhY2tlZEJ5T2JzZXJ2YWJsZUFycmF5KGFycmF5KVxufSlcblxuLyoqXG4gKiBXcmFwcyBhbiBvYnNlcnZhYmxlIGFycmF5IHRvIG9mZmVyIGEgc2V0IGxpa2UgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNTZXQ8VD4oYXJyYXk6IEFycmF5PFQ+KTogT2JzZXJ2YWJsZVNldDxUPiAmIHsgZGF0YU9iamVjdDogdHlwZW9mIGFycmF5IH0ge1xuICByZXR1cm4gYXNTZXRUYWcuZm9yKGFycmF5KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNldCB0byBhbiBhcnJheS4gSWYgdGhlIHNldCBpcyBhIGNvbGxlY3Rpb24gd3JhcHBlciBpdCB3aWxsIHJldHVybiB0aGUgYmFja2VkIGFycmF5LlxuICpcbiAqIEBwYXJhbSBzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRvQXJyYXk8VD4oc2V0OiBTZXQ8VD4pOiBBcnJheTxUPiB7XG4gIGFzc2VydElzU2V0KHNldCwgXCJzZXRcIilcblxuICBjb25zdCBkYXRhT2JqZWN0ID0gKHNldCBhcyBhbnkpLmRhdGFPYmplY3RcbiAgaWYgKGRhdGFPYmplY3QpIHtcbiAgICByZXR1cm4gZGF0YU9iamVjdFxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oc2V0LnZhbHVlcygpKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBhc1NldCB9IGZyb20gXCIuLi93cmFwcGVycy9hc1NldFwiXG5cbmNvbnN0IF9hcnJheVRvU2V0VHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08QXJyYXk8dW5rbm93bj4sIFNldDx1bmtub3duPj4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWU6IGFyciwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogY2FjaGVkU2V0IH0pIHtcbiAgICByZXR1cm4gY2FjaGVkU2V0ID8/IGFzU2V0KGFycilcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWU6IHNldCB9KSB7XG4gICAgLy8gZG8gbm90IGNhY2hlIHNldCA8LT4gYXJyIHJlbGF0aW9uc2hpcFxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2V0LnZhbHVlcygpKVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgYXJyYXlUb1NldFRyYW5zZm9ybSA9IDxUPigpID0+XG4gIF9hcnJheVRvU2V0VHJhbnNmb3JtIGFzIE1vZGVsUHJvcFRyYW5zZm9ybTxBcnJheTxUPiwgU2V0PFQ+PlxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5cbmNvbnN0IF9zdHJpbmdUb0JpZ0ludFRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPHN0cmluZywgYmlnaW50PiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZSwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSB9KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgPz8gQmlnSW50KG9yaWdpbmFsVmFsdWUpXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlLCBjYWNoZVRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKClcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkVmFsdWUudG9TdHJpbmcoKVxuICB9LFxufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9CaWdJbnRUcmFuc2Zvcm0gPSAoKSA9PiBfc3RyaW5nVG9CaWdJbnRUcmFuc2Zvcm1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltbXV0YWJsZURhdGVcbiAgZXh0ZW5kcyBPbWl0PFxuICAgIERhdGUsXG4gICAgfCBcInNldFRpbWVcIlxuICAgIHwgXCJzZXRNaWxsaXNlY29uZHNcIlxuICAgIHwgXCJzZXRVVENNaWxsaXNlY29uZHNcIlxuICAgIHwgXCJzZXRTZWNvbmRzXCJcbiAgICB8IFwic2V0VVRDU2Vjb25kc1wiXG4gICAgfCBcInNldE1pbnV0ZXNcIlxuICAgIHwgXCJzZXRVVENNaW51dGVzXCJcbiAgICB8IFwic2V0SG91cnNcIlxuICAgIHwgXCJzZXRVVENIb3Vyc1wiXG4gICAgfCBcInNldERhdGVcIlxuICAgIHwgXCJzZXRVVENEYXRlXCJcbiAgICB8IFwic2V0TW9udGhcIlxuICAgIHwgXCJzZXRVVENNb250aFwiXG4gICAgfCBcInNldEZ1bGxZZWFyXCJcbiAgICB8IFwic2V0VVRDRnVsbFllYXJcIlxuICA+IHt9XG5cbmNvbnN0IGVyck1lc3NhZ2UgPSBcInRoaXMgRGF0ZSBvYmplY3QgaXMgaW1tdXRhYmxlXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEltbXV0YWJsZURhdGUgZXh0ZW5kcyBEYXRlIHtcbiAgLy8gZGlzYWJsZSBtdXRhYmxlIG1ldGhvZHNcblxuICBzZXRUaW1lKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0TWlsbGlzZWNvbmRzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDTWlsbGlzZWNvbmRzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0U2Vjb25kcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ1NlY29uZHMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRNaW51dGVzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDTWludXRlcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldEhvdXJzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDSG91cnMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXREYXRlKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDRGF0ZSgpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldE1vbnRoKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDTW9udGgoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRGdWxsWWVhcigpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ0Z1bGxZZWFyKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsUHJvcFRyYW5zZm9ybSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IEltbXV0YWJsZURhdGUgfSBmcm9tIFwiLi9JbW11dGFibGVEYXRlXCJcblxuY29uc3QgX3RpbWVzdGFtcFRvRGF0ZVRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPG51bWJlciwgRGF0ZT4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWUsIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlID8/IG5ldyBJbW11dGFibGVEYXRlKG9yaWdpbmFsVmFsdWUpXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlLCBjYWNoZVRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIGlmICh0cmFuc2Zvcm1lZFZhbHVlIGluc3RhbmNlb2YgSW1tdXRhYmxlRGF0ZSkge1xuICAgICAgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKClcbiAgICB9XG4gICAgcmV0dXJuICt0cmFuc2Zvcm1lZFZhbHVlXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCB0aW1lc3RhbXBUb0RhdGVUcmFuc2Zvcm0gPSAoKSA9PiBfdGltZXN0YW1wVG9EYXRlVHJhbnNmb3JtXG5cbmNvbnN0IF9pc29TdHJpbmdUb0RhdGVUcmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxzdHJpbmcsIERhdGU+ID0ge1xuICB0cmFuc2Zvcm0oeyBvcmlnaW5hbFZhbHVlLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSA/PyBuZXcgSW1tdXRhYmxlRGF0ZShvcmlnaW5hbFZhbHVlKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZSwgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICBpZiAodHJhbnNmb3JtZWRWYWx1ZSBpbnN0YW5jZW9mIEltbXV0YWJsZURhdGUpIHtcbiAgICAgIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSgpXG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lZFZhbHVlLnRvSVNPU3RyaW5nKClcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IGlzb1N0cmluZ1RvRGF0ZVRyYW5zZm9ybSA9ICgpID0+IF9pc29TdHJpbmdUb0RhdGVUcmFuc2Zvcm1cbiIsImltcG9ydCB7IGFjdGlvbiwgY29tcHV0ZWQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBwYXRoVG9UYXJnZXRQYXRoSWRzIH0gZnJvbSBcIi4uL2FjdGlvbk1pZGRsZXdhcmVzL3V0aWxzXCJcbmltcG9ydCB7IHJlc29sdmVQYXRoLCByZXNvbHZlUGF0aENoZWNraW5nSWRzLCBza2lwSWRDaGVja2luZyB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IGFwcGx5U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvYXBwbHlTbmFwc2hvdFwiXG5pbXBvcnQgeyBmcm9tU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZGVlcEVxdWFscyB9IGZyb20gXCIuL2RlZXBFcXVhbHNcIlxuXG4vKipcbiAqIEEgY2xhc3Mgd2l0aCB0aGUgaW1wbGVtZW50YXRpb25tIG9mIGRyYWZ0LlxuICogVXNlIGBkcmFmdGAgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gKlxuICogQHR5cGVwYXJhbSBUIERhdGEgdHlwZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERyYWZ0PFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIERyYWZ0IGRhdGEgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogVFxuXG4gIC8qKlxuICAgKiBDb21taXRzIGN1cnJlbnQgZHJhZnQgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgKi9cbiAgQGFjdGlvblxuICBjb21taXQoKTogdm9pZCB7XG4gICAgYXBwbHlTbmFwc2hvdCh0aGlzLm9yaWdpbmFsRGF0YSwgZ2V0U25hcHNob3QodGhpcy5kYXRhKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJ0aWFsbHkgY29tbWl0cyBjdXJyZW50IGRyYWZ0IGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICogSWYgdGhlIHBhdGggY2Fubm90IGJlIHJlc29sdmVkIGluIGVpdGhlciB0aGUgZHJhZnQgb3IgdGhlIG9yaWdpbmFsIG9iamVjdCBpdCB3aWxsIHRocm93LlxuICAgKiBOb3RlIHRoYXQgbW9kZWwgSURzIGFyZSBjaGVja2VkIHRvIGJlIHRoZSBzYW1lIHdoZW4gcmVzb2x2aW5nIHRoZSBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byBjb21taXQuXG4gICAqL1xuICBAYWN0aW9uXG4gIGNvbW1pdEJ5UGF0aChwYXRoOiBQYXRoKTogdm9pZCB7XG4gICAgY29uc3QgZHJhZnRUYXJnZXQgPSByZXNvbHZlUGF0aCh0aGlzLmRhdGEsIHBhdGgpXG4gICAgaWYgKCFkcmFmdFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW4gZHJhZnQgb2JqZWN0YClcbiAgICB9XG5cbiAgICBjb25zdCBkcmFmdFBhdGhJZHMgPSBwYXRoVG9UYXJnZXRQYXRoSWRzSWdub3JpbmdMYXN0KHRoaXMuZGF0YSwgcGF0aClcblxuICAgIGNvbnN0IG9yaWdpbmFsVGFyZ2V0ID0gcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyh0aGlzLm9yaWdpbmFsRGF0YSwgcGF0aCwgZHJhZnRQYXRoSWRzKVxuICAgIGlmICghb3JpZ2luYWxUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gY291bGQgbm90IGJlIHJlc29sdmVkIGluIG9yaWdpbmFsIG9iamVjdGApXG4gICAgfVxuXG4gICAgYXBwbHlQYXRjaGVzKHRoaXMub3JpZ2luYWxEYXRhLCBbXG4gICAgICB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgdmFsdWU6IGdldFNuYXBzaG90KGRyYWZ0VGFyZ2V0LnZhbHVlKSxcbiAgICAgIH0sXG4gICAgXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGRyYWZ0IHRvIGJlIGFuIGV4YWN0IGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICovXG4gIEBhY3Rpb25cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgYXBwbHlTbmFwc2hvdCh0aGlzLmRhdGEsIHRoaXMub3JpZ2luYWxTbmFwc2hvdClcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJ0aWFsbHkgcmVzZXRzIGN1cnJlbnQgZHJhZnQgY2hhbmdlcyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgKiBJZiB0aGUgcGF0aCBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gZWl0aGVyIHRoZSBkcmFmdCBvciB0aGUgb3JpZ2luYWwgb2JqZWN0IGl0IHdpbGwgdGhyb3cuXG4gICAqIE5vdGUgdGhhdCBtb2RlbCBJRHMgYXJlIGNoZWNrZWQgdG8gYmUgdGhlIHNhbWUgd2hlbiByZXNvbHZpbmcgdGhlIHBhdGhzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHJlc2V0LlxuICAgKi9cbiAgQGFjdGlvblxuICByZXNldEJ5UGF0aChwYXRoOiBQYXRoKTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luYWxUYXJnZXQgPSByZXNvbHZlUGF0aCh0aGlzLm9yaWdpbmFsRGF0YSwgcGF0aClcbiAgICBpZiAoIW9yaWdpbmFsVGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbiBvcmlnaW5hbCBvYmplY3RgKVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsUGF0aElkcyA9IHBhdGhUb1RhcmdldFBhdGhJZHNJZ25vcmluZ0xhc3QodGhpcy5vcmlnaW5hbERhdGEsIHBhdGgpXG5cbiAgICBjb25zdCBkcmFmdFRhcmdldCA9IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHModGhpcy5kYXRhLCBwYXRoLCBvcmlnaW5hbFBhdGhJZHMpXG4gICAgaWYgKCFkcmFmdFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW4gZHJhZnQgb2JqZWN0YClcbiAgICB9XG5cbiAgICBhcHBseVBhdGNoZXModGhpcy5kYXRhLCBbXG4gICAgICB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgdmFsdWU6IGdldFNuYXBzaG90KG9yaWdpbmFsVGFyZ2V0LnZhbHVlKSxcbiAgICAgIH0sXG4gICAgXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZHJhZnQgaGFzIGNoYW5nZWQgY29tcGFyZWQgdG8gdGhlIG9yaWdpbmFsIG9iamVjdCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IGlzRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFkZWVwRXF1YWxzKGdldFNuYXBzaG90KHRoaXMuZGF0YSksIHRoaXMub3JpZ2luYWxTbmFwc2hvdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGggb2YgdGhlIGRyYWZ0IGhhcyBjaGFuZ2VkIGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAqIElmIHRoZSBwYXRoIGNhbm5vdCBiZSByZXNvbHZlZCBpbiB0aGUgZHJhZnQgaXQgd2lsbCB0aHJvdy5cbiAgICogSWYgdGhlIHBhdGggY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBvcmlnaW5hbCBvYmplY3QgaXQgd2lsbCByZXR1cm4gYHRydWVgLlxuICAgKiBOb3RlIHRoYXQgbW9kZWwgSURzIGFyZSBjaGVja2VkIHRvIGJlIHRoZSBzYW1lIHdoZW4gcmVzb2x2aW5nIHRoZSBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byBjaGVjay5cbiAgICovXG4gIGlzRGlydHlCeVBhdGgocGF0aDogUGF0aCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRyYWZ0VGFyZ2V0ID0gcmVzb2x2ZVBhdGgodGhpcy5kYXRhLCBwYXRoKVxuICAgIGlmICghZHJhZnRUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gY291bGQgbm90IGJlIHJlc29sdmVkIGluIGRyYWZ0IG9iamVjdGApXG4gICAgfVxuXG4gICAgY29uc3QgZHJhZnRQYXRoSWRzID0gcGF0aFRvVGFyZ2V0UGF0aElkc0lnbm9yaW5nTGFzdCh0aGlzLmRhdGEsIHBhdGgpXG5cbiAgICBjb25zdCBvcmlnaW5hbFRhcmdldCA9IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHModGhpcy5vcmlnaW5hbERhdGEsIHBhdGgsIGRyYWZ0UGF0aElkcylcbiAgICBpZiAoIW9yaWdpbmFsVGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiAhZGVlcEVxdWFscyhkcmFmdFRhcmdldC52YWx1ZSwgb3JpZ2luYWxUYXJnZXQudmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogT3JpZ2luYWwgZGF0YSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbERhdGE6IFRcblxuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgb3JpZ2luYWxTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gZ2V0U25hcHNob3QodGhpcy5vcmlnaW5hbERhdGEpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEcmFmdC5cbiAgICogRG8gbm90IHVzZSBkaXJlY3RseSwgdXNlIGBkcmFmdGAgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcmlnaW5hbDogVCkge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qob3JpZ2luYWwsIFwib3JpZ2luYWxcIilcblxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gb3JpZ2luYWxcbiAgICB0aGlzLmRhdGEgPSBmcm9tU25hcHNob3QodGhpcy5vcmlnaW5hbFNuYXBzaG90LCB7IGdlbmVyYXRlTmV3SWRzOiBmYWxzZSB9KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGNvcHkgb2YgYSB0cmVlIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uXG4gKlxuICogQHR5cGVwYXJhbSBUIERhdGEgdHlwZS5cbiAqIEBwYXJhbSBvcmlnaW5hbCBPcmlnaW5hbCBub2RlLlxuICogQHJldHVybnMgVGhlIGRyYWZ0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0PFQgZXh0ZW5kcyBvYmplY3Q+KG9yaWdpbmFsOiBUKTogRHJhZnQ8VD4ge1xuICByZXR1cm4gbmV3IERyYWZ0KG9yaWdpbmFsKVxufVxuXG5mdW5jdGlvbiBwYXRoVG9UYXJnZXRQYXRoSWRzSWdub3JpbmdMYXN0KHJvb3Q6IGFueSwgcGF0aDogUGF0aCkge1xuICBjb25zdCBwYXRoSWRzOiAoc3RyaW5nIHwgbnVsbCB8IHR5cGVvZiBza2lwSWRDaGVja2luZylbXSA9IHBhdGhUb1RhcmdldFBhdGhJZHMocm9vdCwgcGF0aClcbiAgaWYgKHBhdGhJZHMubGVuZ3RoID49IDEpIHtcbiAgICAvLyBuZXZlciBjaGVjayB0aGUgbGFzdCBvYmplY3QgaWRcbiAgICBwYXRoSWRzW3BhdGhJZHMubGVuZ3RoIC0gMV0gPSBza2lwSWRDaGVja2luZ1xuICB9XG5cbiAgcmV0dXJuIHBhdGhJZHNcbn1cbiIsImltcG9ydCB7IHJlYWN0aW9uLCBydW5JbkFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIHJlYWRvbmx5TWlkZGxld2FyZSxcbiAgUmVhZG9ubHlNaWRkbGV3YXJlUmV0dXJuLFxufSBmcm9tIFwiLi4vYWN0aW9uTWlkZGxld2FyZXMvcmVhZG9ubHlNaWRkbGV3YXJlXCJcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwiLi4vY29udGV4dFwiXG5pbXBvcnQgeyBnZXRQYXJlbnRUb0NoaWxkUGF0aCwgcmVzb2x2ZVBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzIH0gZnJvbSBcIi4uL3BhdGNoL2FwcGx5UGF0Y2hlc1wiXG5pbXBvcnQgeyBvblBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvZW1pdFBhdGNoXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi4vcGF0Y2gvUGF0Y2hcIlxuaW1wb3J0IHsgUGF0Y2hSZWNvcmRlciwgcGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaC9wYXRjaFJlY29yZGVyXCJcbmltcG9ydCB7IGlzUm9vdFN0b3JlLCByZWdpc3RlclJvb3RTdG9yZSwgdW5yZWdpc3RlclJvb3RTdG9yZSB9IGZyb20gXCIuLi9yb290U3RvcmUvcm9vdFN0b3JlXCJcbmltcG9ydCB7IGNsb25lIH0gZnJvbSBcIi4uL3NuYXBzaG90L2Nsb25lXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzRnVuY3Rpb24sIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIENvbnRleHQgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzYW5kYm94IG1hbmFnZXIgdGhpcyBub2RlIHJ1bnMgdW5kZXIgKGlmIGFueSkuXG4gKi9cbmNvbnN0IHNhbmRib3hNYW5hZ2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8U2FuZGJveE1hbmFnZXI+KClcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzYW5kYm94IG1hbmFnZXIgb2YgYSBub2RlLCBvciBgdW5kZWZpbmVkYCBpZiBub25lLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgc2FuZGJveCBtYW5hZ2VyIG9mIGEgbm9kZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVTYW5kYm94TWFuYWdlcihub2RlOiBvYmplY3QpOiBTYW5kYm94TWFuYWdlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzYW5kYm94TWFuYWdlckNvbnRleHQuZ2V0KG5vZGUpXG59XG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIG5vZGUgaXMgYSBzYW5kYm94ZWQgbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIGl0IGlzIHNhbmRib3hlZCwgYGZhbHNlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYW5kYm94ZWROb2RlKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXROb2RlU2FuZGJveE1hbmFnZXIobm9kZSlcbn1cblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgYFNhbmRib3hNYW5hZ2VyLndpdGhTYW5kYm94YC5cbiAqL1xuZXhwb3J0IHR5cGUgV2l0aFNhbmRib3hDYWxsYmFjazxUIGV4dGVuZHMgcmVhZG9ubHkgW29iamVjdCwgLi4ub2JqZWN0W11dLCBSPiA9IChcbiAgLi4ubm9kZXM6IFRcbikgPT4gYm9vbGVhbiB8IHsgY29tbWl0OiBib29sZWFuOyByZXR1cm46IFIgfVxuXG4vKipcbiAqIE1hbmFnZXIgY2xhc3MgcmV0dXJuZWQgYnkgYHNhbmRib3hgIHRoYXQgYWxsb3dzIHlvdSB0byBtYWtlIGNoYW5nZXMgdG8gYSBzYW5kYm94IGNvcHkgb2YgdGhlXG4gKiBvcmlnaW5hbCBzdWJ0cmVlIGFuZCBhcHBseSB0aGVtIHRvIHRoZSBvcmlnaW5hbCBzdWJ0cmVlIG9yIHJlamVjdCB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgU2FuZGJveE1hbmFnZXIge1xuICAvKipcbiAgICogVGhlIHNhbmRib3ggY29weSBvZiB0aGUgb3JpZ2luYWwgc3VidHJlZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VidHJlZVJvb3RDbG9uZTogb2JqZWN0XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBkaXNwb3Nlci5cbiAgICovXG4gIHByaXZhdGUgZGlzcG9zZXI6ICgpID0+IHZvaWRcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGB3aXRoU2FuZGJveGAgcGF0Y2ggcmVjb3JkZXIuIElmIGB1bmRlZmluZWRgLCBubyBgd2l0aFNhbmRib3hgIGNhbGwgaXMgYmVpbmdcbiAgICogZXhlY3V0ZWQuXG4gICAqL1xuICBwcml2YXRlIHdpdGhTYW5kYm94UGF0Y2hSZWNvcmRlcjogUGF0Y2hSZWNvcmRlciB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBmcm9tIGByZWFkb25seU1pZGRsZXdhcmVgIHRoYXQgd2lsbCBhbGxvdyBhY3Rpb25zIHRvIGJlIHN0YXJ0ZWQgaW5zaWRlIHRoZSBwcm92aWRlZFxuICAgKiBjb2RlIGJsb2NrIG9uIGEgcmVhZG9ubHkgbm9kZS5cbiAgICovXG4gIHByaXZhdGUgYWxsb3dXcml0ZTogUmVhZG9ubHlNaWRkbGV3YXJlUmV0dXJuW1wiYWxsb3dXcml0ZVwiXVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNoYW5nZXMgbWFkZSBpbiB0aGUgc2FuZGJveCBhcmUgY3VycmVudGx5IGJlaW5nIGNvbW1pdHRlZCB0byB0aGUgb3JpZ2luYWwgc3VidHJlZS5cbiAgICovXG4gIHByaXZhdGUgaXNDb21taXR0aW5nOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBgU2FuZGJveE1hbmFnZXJgLlxuICAgKiBEbyBub3QgdXNlIGRpcmVjdGx5LCB1c2UgYHNhbmRib3hgIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc3VidHJlZVJvb3Q6IG9iamVjdCkge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICAgIC8vIHdlIHRlbXBvcmFyaWx5IHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udGV4dCBtYW5hZ2VyIHNvIHRoYXRcbiAgICAvLyBjbG9uZWQgbm9kZXMgY2FuIGFjY2VzcyBpdCB3aGlsZSBpbiB0aGVpciBvbkluaXQgcGhhc2VcblxuICAgIGxldCBwcmV2aW91c0NvbnRleHREZWZhdWx0ID0gc2FuZGJveE1hbmFnZXJDb250ZXh0LmdldERlZmF1bHQoKVxuICAgIHNhbmRib3hNYW5hZ2VyQ29udGV4dC5zZXREZWZhdWx0KHRoaXMpXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3VidHJlZVJvb3RDbG9uZSA9IGNsb25lKHN1YnRyZWVSb290LCB7IGdlbmVyYXRlTmV3SWRzOiBmYWxzZSB9KVxuICAgICAgc2FuZGJveE1hbmFnZXJDb250ZXh0LnNldCh0aGlzLnN1YnRyZWVSb290Q2xvbmUsIHRoaXMpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2FuZGJveE1hbmFnZXJDb250ZXh0LnNldERlZmF1bHQocHJldmlvdXNDb250ZXh0RGVmYXVsdClcbiAgICB9XG5cbiAgICBsZXQgd2FzUlMgPSBmYWxzZVxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblJTID0gcmVhY3Rpb24oXG4gICAgICAoKSA9PiBpc1Jvb3RTdG9yZShzdWJ0cmVlUm9vdCksXG4gICAgICAoaXNSUykgPT4ge1xuICAgICAgICBpZiAoaXNSUyAhPT0gd2FzUlMpIHtcbiAgICAgICAgICB3YXNSUyA9IGlzUlNcbiAgICAgICAgICBpZiAoaXNSUykge1xuICAgICAgICAgICAgcmVnaXN0ZXJSb290U3RvcmUodGhpcy5zdWJ0cmVlUm9vdENsb25lKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bnJlZ2lzdGVyUm9vdFN0b3JlKHRoaXMuc3VidHJlZVJvb3RDbG9uZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhzdWJ0cmVlUm9vdCwgKHBhdGNoZXMpID0+IHtcbiAgICAgIGlmICh0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlcikge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwib3JpZ2luYWwgc3VidHJlZSBtdXN0IG5vdCBjaGFuZ2Ugd2hpbGUgJ3dpdGhTYW5kYm94JyBleGVjdXRlc1wiKVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ29tbWl0dGluZykge1xuICAgICAgICB0aGlzLmFsbG93V3JpdGUoKCkgPT4ge1xuICAgICAgICAgIGFwcGx5UGF0Y2hlcyh0aGlzLnN1YnRyZWVSb290Q2xvbmUsIHBhdGNoZXMpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHsgYWxsb3dXcml0ZSwgZGlzcG9zZTogZGlzcG9zZVJlYWRvbmx5TVcgfSA9IHJlYWRvbmx5TWlkZGxld2FyZSh0aGlzLnN1YnRyZWVSb290Q2xvbmUpXG4gICAgdGhpcy5hbGxvd1dyaXRlID0gYWxsb3dXcml0ZVxuXG4gICAgdGhpcy5kaXNwb3NlciA9ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblJTKClcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZVJlYWRvbmx5TVcoKVxuICAgICAgaWYgKGlzUm9vdFN0b3JlKHRoaXMuc3VidHJlZVJvb3RDbG9uZSkpIHtcbiAgICAgICAgdW5yZWdpc3RlclJvb3RTdG9yZSh0aGlzLnN1YnRyZWVSb290Q2xvbmUpXG4gICAgICB9XG4gICAgICB0aGlzLmRpc3Bvc2VyID0gKCkgPT4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYGZuYCB3aXRoIHNhbmRib3ggY29waWVzIG9mIHRoZSBlbGVtZW50cyBvZiBgbm9kZXNgLiBUaGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBzYW5kYm94XG4gICAqIGluIGBmbmAgY2FuIGJlIGFjY2VwdGVkLCBpLmUuIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHN1YnRyZWUsIG9yIHJlamVjdGVkLlxuICAgKlxuICAgKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gICAqIEB0eXBlcGFyYW0gUiBSZXR1cm4gdHlwZS5cbiAgICogQHBhcmFtIG5vZGVzIFR1cGxlIG9mIG9iamVjdHMgZm9yIHdoaWNoIHRvIG9idGFpbiBzYW5kYm94IGNvcGllcy5cbiAgICogQHBhcmFtIGZuIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdpdGggc2FuZGJveCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIG9mIGBub2Rlc2AuIEFueSBjaGFuZ2VzXG4gICAqIG1hZGUgdG8gdGhlIHNhbmRib3ggYXJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHN1YnRyZWUgd2hlbiBgZm5gIHJldHVybnMgYHRydWVgIG9yXG4gICAqIGB7IGNvbW1pdDogdHJ1ZSwgLi4uIH1gLiBXaGVuIGBmbmAgcmV0dXJucyBgZmFsc2VgIG9yIGB7IGNvbW1pdDogZmFsc2UsIC4uLiB9YCB0aGUgY2hhbmdlcyBtYWRlXG4gICAqIHRvIHRoZSBzYW5kYm94IGFyZSByZWplY3RlZC5cbiAgICogQHJldHVybnMgVmFsdWUgb2YgdHlwZSBgUmAgd2hlbiBgZm5gIHJldHVybnMgYW4gb2JqZWN0IG9mIHR5cGUgYHsgY29tbWl0OiBib29sZWFuOyByZXR1cm46IFIgfWBcbiAgICogb3IgYHZvaWRgIHdoZW4gYGZuYCByZXR1cm5zIGEgYm9vbGVhbi5cbiAgICovXG4gIHdpdGhTYW5kYm94PFQgZXh0ZW5kcyByZWFkb25seSBbb2JqZWN0LCAuLi5vYmplY3RbXV0sIFIgPSB2b2lkPihcbiAgICBub2RlczogVCxcbiAgICBmbjogV2l0aFNhbmRib3hDYWxsYmFjazxULCBSPlxuICApOiBSIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGVzW2ldLCBgbm9kZXNbJHtpfV1gKVxuICAgIH1cbiAgICBhc3NlcnRJc0Z1bmN0aW9uKGZuLCBcImZuXCIpXG5cbiAgICBjb25zdCB7IHNhbmRib3hOb2RlcywgYXBwbHlSZWNvcmRlckNoYW5nZXMgfSA9IHRoaXMucHJlcGFyZVNhbmRib3hDaGFuZ2VzKG5vZGVzKVxuXG4gICAgbGV0IGNvbW1pdCA9IGZhbHNlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gdGhpcy5hbGxvd1dyaXRlKCgpID0+IGZuKC4uLnNhbmRib3hOb2RlcykpXG4gICAgICBpZiAodHlwZW9mIHJldHVyblZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBjb21taXQgPSByZXR1cm5WYWx1ZVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWl0ID0gcmV0dXJuVmFsdWUuY29tbWl0XG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZS5yZXR1cm5cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXBwbHlSZWNvcmRlckNoYW5nZXMoY29tbWl0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0aGUgc2FuZGJveC5cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlcigpXG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVTYW5kYm94Q2hhbmdlczxUIGV4dGVuZHMgcmVhZG9ubHkgW29iamVjdCwgLi4ub2JqZWN0W11dPihcbiAgICBub2RlczogVFxuICApOiB7IHNhbmRib3hOb2RlczogVDsgYXBwbHlSZWNvcmRlckNoYW5nZXM6IChjb21taXQ6IGJvb2xlYW4pID0+IHZvaWQgfSB7XG4gICAgY29uc3QgaXNOZXN0ZWRXaXRoU2FuZGJveENhbGwgPSAhIXRoaXMud2l0aFNhbmRib3hQYXRjaFJlY29yZGVyXG5cbiAgICBjb25zdCBzYW5kYm94Tm9kZXMgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChcbiAgICAgICAgaXNOZXN0ZWRXaXRoU2FuZGJveENhbGwgPyB0aGlzLnN1YnRyZWVSb290Q2xvbmUgOiB0aGlzLnN1YnRyZWVSb290LFxuICAgICAgICBub2RlXG4gICAgICApXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgbm9kZSBpcyBub3QgYSBjaGlsZCBvZiBzdWJ0cmVlUm9vdCR7aXNOZXN0ZWRXaXRoU2FuZGJveENhbGwgPyBcIkNsb25lXCIgOiBcIlwifWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbmRib3hOb2RlID0gcmVzb2x2ZVBhdGg8dHlwZW9mIG5vZGU+KHRoaXMuc3VidHJlZVJvb3RDbG9uZSwgcGF0aCkudmFsdWVcbiAgICAgIGlmICghc2FuZGJveE5vZGUpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcInBhdGggY291bGQgbm90IGJlIHJlc29sdmVkIC0gc2FuZGJveCBtYXkgYmUgb3V0IG9mIHN5bmMgd2l0aCBvcmlnaW5hbCB0cmVlXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzYW5kYm94Tm9kZVxuICAgIH0pIGFzIHVua25vd24gYXMgVFxuXG4gICAgaWYgKCF0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlcikge1xuICAgICAgdGhpcy53aXRoU2FuZGJveFBhdGNoUmVjb3JkZXIgPSBwYXRjaFJlY29yZGVyKHRoaXMuc3VidHJlZVJvb3RDbG9uZSlcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlclxuICAgIGNvbnN0IG51bVJlY29yZGVyRXZlbnRzID0gcmVjb3JkZXIuZXZlbnRzLmxlbmd0aFxuXG4gICAgY29uc3QgYXBwbHlSZWNvcmRlckNoYW5nZXMgPSAoY29tbWl0OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzTmVzdGVkV2l0aFNhbmRib3hDYWxsKSB7XG4gICAgICAgIHJlY29yZGVyLmRpc3Bvc2UoKVxuICAgICAgICB0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlciA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdCkge1xuICAgICAgICBpZiAoIWlzTmVzdGVkV2l0aFNhbmRib3hDYWxsKSB7XG4gICAgICAgICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gICAgICAgICAgY29uc3QgbGVuID0gcmVjb3JkZXIuZXZlbnRzLmxlbmd0aFxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHBhdGNoZXMucHVzaCguLi5yZWNvcmRlci5ldmVudHNbaV0ucGF0Y2hlcylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NvbW1pdHRpbmcgPSB0aGlzLmlzQ29tbWl0dGluZ1xuICAgICAgICAgIHRoaXMuaXNDb21taXR0aW5nID0gdHJ1ZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdCwgcGF0Y2hlcylcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5pc0NvbW1pdHRpbmcgPSBpc0NvbW1pdHRpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsb3dXcml0ZSgoKSA9PiB7XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSByZWNvcmRlci5ldmVudHMubGVuZ3RoXG4gICAgICAgICAgICB3aGlsZSAoaS0tID4gbnVtUmVjb3JkZXJFdmVudHMpIHtcbiAgICAgICAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3RDbG9uZSwgcmVjb3JkZXIuZXZlbnRzW2ldLmludmVyc2VQYXRjaGVzLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2FuZGJveE5vZGVzLCBhcHBseVJlY29yZGVyQ2hhbmdlcyB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2FuZGJveC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJucyBBIGBTYW5kYm94TWFuYWdlcmAgd2hpY2ggYWxsb3dzIHlvdSB0byBtYW5hZ2UgdGhlIHNhbmRib3ggb3BlcmF0aW9ucyBhbmQgZGlzcG9zZSBvZiB0aGVcbiAqIHNhbmRib3guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5kYm94KHN1YnRyZWVSb290OiBvYmplY3QpOiBTYW5kYm94TWFuYWdlciB7XG4gIHJldHVybiBuZXcgU2FuZGJveE1hbmFnZXIoc3VidHJlZVJvb3QpXG59XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIEFycmF5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFuIHR1cGxlIG9mIHZhbHVlcyBvZiBhIGdpdmVuIHR5cGUuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBzdHJpbmdOdW1iZXJUdXBsZVR5cGUgPSB0eXBlcy50dXBsZSh0eXBlcy5zdHJpbmcsIHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBJdGVtIHR5cGVzLlxuICogQHBhcmFtIGl0ZW1UeXBlIFR5cGUgb2YgaW5uZXIgaXRlbXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNUdXBsZTxUIGV4dGVuZHMgQW55VHlwZVtdPiguLi5pdGVtVHlwZXM6IFQpOiBBcnJheVR5cGU8VD4ge1xuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IFR1cGxlVHlwZUluZm8odCwgaXRlbVR5cGVzLm1hcChyZXNvbHZlU3RhbmRhcmRUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBjaGVja2VycyA9IGl0ZW1UeXBlcy5tYXAocmVzb2x2ZVR5cGVDaGVja2VyKVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlTmFtZXMgPSBjaGVja2Vycy5tYXAoKHRjKSA9PiB7XG4gICAgICAgIGlmIChyZWN1cnNpdmVUeXBlQ2hlY2tlcnMuaW5jbHVkZXModGMpKSB7XG4gICAgICAgICAgcmV0dXJuIFwiLi4uXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGMuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB0YylcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBcIltcIiArIHR5cGVOYW1lcy5qb2luKFwiLCBcIikgKyBcIl1cIlxuICAgIH1cblxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLkFycmF5LFxuXG4gICAgICAoYXJyYXksIHBhdGgpID0+IHtcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggIT09IGl0ZW1UeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIGFycmF5KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGl0ZW1FcnJvciA9IGNoZWNrZXJzW2ldLmNoZWNrKGFycmF5W2ldLCBbLi4ucGF0aCwgaV0pXG4gICAgICAgICAgaWYgKGl0ZW1FcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1FcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAoYXJyYXkpID0+IHtcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggIT09IGl0ZW1UeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGl0ZW1BY3R1YWxDaGVja2VyID0gY2hlY2tlcnNbaV0uc25hcHNob3RUeXBlKGFycmF5W2ldKVxuICAgICAgICAgIGlmICghaXRlbUFjdHVhbENoZWNrZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNUY1xuICAgICAgfSxcblxuICAgICAgKGFycmF5OiB1bmtub3duW10pID0+IHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGVja2Vyc1tpXS5mcm9tU25hcHNob3RQcm9jZXNzb3IoaXRlbSlcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIChhcnJheTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tlcnNbaV0udG9TbmFwc2hvdFByb2Nlc3NvcihpdGVtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiB0aGlzVGNcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy50dXBsZWAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgVHVwbGVUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgLy8gbWVtb2l6ZSB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFycmF5IG9uIHRoZSBnZXR0ZXJcbiAgcHJpdmF0ZSBfaXRlbVR5cGVJbmZvcyA9IGxhenkoKCkgPT4gdGhpcy5pdGVtVHlwZXMubWFwKGdldFR5cGVJbmZvKSlcblxuICBnZXQgaXRlbVR5cGVJbmZvcygpOiBSZWFkb25seUFycmF5PFR5cGVJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1UeXBlSW5mb3MoKVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgaXRlbVR5cGVzOiBSZWFkb25seUFycmF5PEFueVN0YW5kYXJkVHlwZT4pIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsQWN0aW9uXCJcbmltcG9ydCB7IG1vZGVsSWRLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxEZWNvcmF0b3JcIlxuaW1wb3J0IHsgaWRQcm9wIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgdHlwZXNBcnJheSB9IGZyb20gXCIuLi90eXBlcy9hcnJheUJhc2VkL3R5cGVzQXJyYXlcIlxuaW1wb3J0IHsgdFByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdFByb3BcIlxuaW1wb3J0IHsgdHlwZXNVbmNoZWNrZWQgfSBmcm9tIFwiLi4vdHlwZXMvdXRpbGl0eS90eXBlc1VuY2hlY2tlZFwiXG5pbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgc2V0IHRoYXQgaXMgYmFja2VkIGJ5IGFuIGFycmF5LlxuICogVXNlIGBhcnJheVNldGAgdG8gY3JlYXRlIGl0LlxuICovXG5AbW9kZWwoYCR7bmFtZXNwYWNlfS9BcnJheVNldGApXG5leHBvcnQgY2xhc3MgQXJyYXlTZXQ8Vj5cbiAgZXh0ZW5kcyBNb2RlbCh7XG4gICAgW21vZGVsSWRLZXldOiBpZFByb3AsXG4gICAgaXRlbXM6IHRQcm9wKHR5cGVzQXJyYXkodHlwZXNVbmNoZWNrZWQ8YW55PigpKSwgKCkgPT4gW10pLCAvLyB3aWxsIGJlIHByb3Blcmx5IGNoZWNrZWQgYnkgdHlwZXMuYXJyYXlTZXQoc3ViVHlwZSlcbiAgfSlcbiAgaW1wbGVtZW50cyBTZXQ8Vj5cbntcbiAgQG1vZGVsQWN0aW9uXG4gIGFkZCh2YWx1ZTogVik6IHRoaXMge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgaWYgKCFpdGVtcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgIGl0ZW1zLnB1c2godmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBAbW9kZWxBY3Rpb25cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtcy5sZW5ndGggPSAwXG4gIH1cblxuICBAbW9kZWxBY3Rpb25cbiAgZGVsZXRlKHZhbHVlOiBWKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgodCkgPT4gdCA9PT0gdmFsdWUpXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBWLCB2YWx1ZTI6IFYsIHNldDogU2V0PFY+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XG4gICAgLy8gd2UgY2Fubm90IHVzZSB0aGUgc2V0IGltcGxlbWVudGF0aW9uIHNpbmNlIHdlIG5lZWQgdG8gcGFzcyB0aGlzIGFzIHNldFxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuICAgIGNvbnN0IGxlbiA9IGl0ZW1zLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBpdGVtc1tpXVxuICAgICAgY2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIGssIGssIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgaGFzKHZhbHVlOiBWKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuaW5jbHVkZXModmFsdWUpXG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLmxlbmd0aFxuICB9XG5cbiAga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMoKSAvLyB5ZXMsIHZhbHVlc1xuICB9XG5cbiAgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgcmV0dXJuIHZhbHVlcyhpdGVtcylbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIH1cblxuICBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W1YsIFZdPiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiBpdGVtcy5tYXAoKHYpID0+IFt2LCB2XSBhcyBbViwgVl0pLnZhbHVlcygpXG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMoKVxuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiQXJyYXlTZXRcIlxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBBcnJheVNldCBtb2RlbCBpbnN0YW5jZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFYgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBbZW50cmllc10gT3B0aW9uYWwgaW5pdGlhbCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVNldDxWPih2YWx1ZXM/OiBSZWFkb25seUFycmF5PFY+IHwgbnVsbCk6IEFycmF5U2V0PFY+IHtcbiAgY29uc3QgaW5pdGlhbEFycjogVltdID0gdmFsdWVzID8gdmFsdWVzLnNsaWNlKCkgOiBbXVxuXG4gIHJldHVybiBuZXcgQXJyYXlTZXQoeyBpdGVtczogaW5pdGlhbEFyciB9KVxufVxuIiwiaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uLy4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFycmF5U2V0IH0gZnJvbSBcIi4uLy4uL3dyYXBwZXJzL0FycmF5U2V0XCJcbmltcG9ydCB7IHR5cGVzQXJyYXkgfSBmcm9tIFwiLi4vYXJyYXlCYXNlZC90eXBlc0FycmF5XCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIE1vZGVsVHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IHR5cGVzT2JqZWN0IH0gZnJvbSBcIi4vdHlwZXNPYmplY3RcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gYXJyYXkgYmFja2VkIHNldCBBcnJheVNldC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IG51bWJlclNldFR5cGUgPSB0eXBlcy5hcnJheVNldCh0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZVR5cGUgVmFsdWUgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0FycmF5U2V0PFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpOiBNb2RlbFR5cGU8QXJyYXlTZXQ8VHlwZVRvRGF0YTxUPj4+IHtcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBBcnJheVNldFR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUodmFsdWVUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChBcnJheVNldCkhXG5cbiAgICBjb25zdCB2YWx1ZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodmFsdWVUeXBlKVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PlxuICAgICAgYEFycmF5U2V0PCR7dmFsdWVDaGVja2VyLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdmFsdWVDaGVja2VyKX0+YFxuXG4gICAgY29uc3QgZGF0YVR5cGVDaGVja2VyID0gdHlwZXNPYmplY3QoKCkgPT4gKHtcbiAgICAgIGl0ZW1zOiB0eXBlc0FycmF5KHZhbHVlQ2hlY2tlciBhcyBhbnkpLFxuICAgIH0pKVxuXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LCAvLyBiZWNhdXNlIGl0IGlzIHJlYWxseSBhIG1vZGVsXG5cbiAgICAgIChvYmosIHBhdGgpID0+IHtcbiAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQXJyYXlTZXQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBvYmopXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZFRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkVGMuY2hlY2sob2JqLiQsIHBhdGgpXG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAob2JqKSA9PiB7XG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqW21vZGVsVHlwZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZhc3QgY2hlY2tcbiAgICAgICAgICByZXR1cm4gb2JqW21vZGVsVHlwZUtleV0gPT09IG1vZGVsSW5mby5uYW1lID8gdGhpc1RjIDogbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRUYyA9IHJlc29sdmVUeXBlQ2hlY2tlcihkYXRhVHlwZUNoZWNrZXIpXG4gICAgICAgIHJldHVybiByZXNvbHZlZFRjLnNuYXBzaG90VHlwZShvYmopID8gdGhpc1RjIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiB1bmtub3duW10gfSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgICAgICAgICBpdGVtczogc24uaXRlbXMubWFwKCh2KSA9PiB2YWx1ZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHYpKSxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiB1bmtub3duW107IFttb2RlbFR5cGVLZXldPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc25Db3B5ID0ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIGl0ZW1zOiBzbi5pdGVtcy5tYXAoKHYpID0+IHZhbHVlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHYpKSxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzbkNvcHlcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMuYXJyYXlTZXRgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIEFycmF5U2V0VHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIGdldCB2YWx1ZVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy52YWx1ZVR5cGUpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcmlnaW5hbFR5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgdmFsdWVUeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHtcbiAgICBzdXBlcihvcmlnaW5hbFR5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIFJlY29yZFR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiBvYmplY3QtbGlrZSBtYXAsIGFuIG9iamVjdCB3aXRoIHN0cmluZyBrZXlzIGFuZCB2YWx1ZXMgYWxsIG9mIGEgc2FtZSBnaXZlbiB0eXBlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogLy8geyBbazogc3RyaW5nXTogbnVtYmVyIH1cbiAqIGNvbnN0IG51bWJlck1hcFR5cGUgPSB0eXBlcy5yZWNvcmQodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0LWxpa2UgbWFwLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzUmVjb3JkPFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpOiBSZWNvcmRUeXBlPFQ+IHtcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHRjKSA9PiBuZXcgUmVjb3JkVHlwZUluZm8odGMsIHJlc29sdmVTdGFuZGFyZFR5cGUodmFsdWVUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCB2YWx1ZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodmFsdWVUeXBlKVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PlxuICAgICAgYFJlY29yZDwke3ZhbHVlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIHZhbHVlQ2hlY2tlcil9PmBcblxuICAgIGNvbnN0IGFwcGx5U25hcHNob3RQcm9jZXNzb3IgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbW9kZTogXCJmcm9tXCIgfCBcInRvXCIpID0+IHtcbiAgICAgIGlmICh2YWx1ZUNoZWNrZXIudW5jaGVja2VkKSB7XG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3T2JqOiB0eXBlb2Ygb2JqID0ge31cblxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgICBjb25zdCB2ID1cbiAgICAgICAgICBtb2RlID09PSBcImZyb21cIlxuICAgICAgICAgICAgPyB2YWx1ZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKG9ialtrXSlcbiAgICAgICAgICAgIDogdmFsdWVDaGVja2VyLnRvU25hcHNob3RQcm9jZXNzb3Iob2JqW2tdKVxuICAgICAgICBuZXdPYmpba10gPSB2XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmpcbiAgICB9XG5cbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAgIChvYmosIHBhdGgpID0+IHtcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBvYmopXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlQ2hlY2tlci51bmNoZWNrZWQpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgICAgICAgIGNvbnN0IHYgPSBvYmpba11cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlRXJyb3IgPSB2YWx1ZUNoZWNrZXIuY2hlY2sodiwgWy4uLnBhdGgsIGtdKVxuICAgICAgICAgICAgaWYgKHZhbHVlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSxcblxuICAgICAgZ2V0VHlwZU5hbWUsXG4gICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgKG9iaikgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKCF2YWx1ZUNoZWNrZXIudW5jaGVja2VkKSB7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICAgICAgICBjb25zdCB2ID0gb2JqW2tdXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFjdHVhbENoZWNrZXIgPSB2YWx1ZUNoZWNrZXIuc25hcHNob3RUeXBlKHYpXG4gICAgICAgICAgICBpZiAoIXZhbHVlQWN0dWFsQ2hlY2tlcikge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzVGNcbiAgICAgIH0sXG5cbiAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIHJldHVybiBhcHBseVNuYXBzaG90UHJvY2Vzc29yKG9iaiwgXCJmcm9tXCIpXG4gICAgICB9LFxuXG4gICAgICAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICByZXR1cm4gYXBwbHlTbmFwc2hvdFByb2Nlc3NvcihvYmosIFwidG9cIilcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMucmVjb3JkYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgZ2V0IHZhbHVlVHlwZUluZm8oKTogVHlwZUluZm8ge1xuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLnZhbHVlVHlwZSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IHZhbHVlVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGVudHJpZXMsIGdldCwgaGFzLCBrZXlzLCByZW1vdmUsIHNldCwgdmFsdWVzIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsQWN0aW9uXCJcbmltcG9ydCB7IG1vZGVsSWRLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxEZWNvcmF0b3JcIlxuaW1wb3J0IHsgaWRQcm9wIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgdHlwZXNSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNSZWNvcmRcIlxuaW1wb3J0IHsgdFByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdFByb3BcIlxuaW1wb3J0IHsgdHlwZXNVbmNoZWNrZWQgfSBmcm9tIFwiLi4vdHlwZXMvdXRpbGl0eS90eXBlc1VuY2hlY2tlZFwiXG5pbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgbWFwIHRoYXQgaXMgYmFja2VkIGJ5IGFuIG9iamVjdC1saWtlIG1hcC5cbiAqIFVzZSBgb2JqZWN0TWFwYCB0byBjcmVhdGUgaXQuXG4gKi9cbkBtb2RlbChgJHtuYW1lc3BhY2V9L09iamVjdE1hcGApXG5leHBvcnQgY2xhc3MgT2JqZWN0TWFwPFY+XG4gIGV4dGVuZHMgTW9kZWwoe1xuICAgIFttb2RlbElkS2V5XTogaWRQcm9wLFxuICAgIGl0ZW1zOiB0UHJvcCh0eXBlc1JlY29yZCh0eXBlc1VuY2hlY2tlZDxhbnk+KCkpLCAoKSA9PiAoe30pKSwgLy8gd2lsbCBiZSBwcm9wZXJseSBjaGVja2VkIGJ5IHR5cGVzLm9iamVjdE1hcChzdWJUeXBlKVxuICB9KVxuICBpbXBsZW1lbnRzIE1hcDxzdHJpbmcsIFY+XG57XG4gIEBtb2RlbEFjdGlvblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtcylcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICByZW1vdmUoaXRlbXMsIGspXG4gICAgfVxuICB9XG5cbiAgQG1vZGVsQWN0aW9uXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc0tleSA9IHRoaXMuaGFzKGtleSlcbiAgICBpZiAoaGFzS2V5KSB7XG4gICAgICByZW1vdmUodGhpcy5pdGVtcywga2V5KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFYsIGtleTogc3RyaW5nLCBtYXA6IE1hcDxzdHJpbmcsIFY+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XG4gICAgLy8gd2UgY2Fubm90IHVzZSB0aGUgbWFwIGltcGxlbWVudGF0aW9uIHNpbmNlIHdlIG5lZWQgdG8gcGFzcyB0aGlzIGFzIG1hcFxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW1zKVxuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgIGNhbGxiYWNrZm4uY2FsbCh0aGlzQXJnLCBpdGVtc1trXSwgaywgdGhpcylcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBWIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMuaXRlbXMsIGtleSlcbiAgfVxuXG4gIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoYXModGhpcy5pdGVtcywga2V5KVxuICB9XG5cbiAgQG1vZGVsQWN0aW9uXG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFYpOiB0aGlzIHtcbiAgICBzZXQodGhpcy5pdGVtcywga2V5LCB2YWx1ZSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4ga2V5cyh0aGlzLml0ZW1zKS5sZW5ndGhcbiAgfVxuXG4gIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiBrZXlzKHRoaXMuaXRlbXMpW1N5bWJvbC5pdGVyYXRvcl0oKSBhcyBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz5cbiAgfVxuXG4gIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiB2YWx1ZXModGhpcy5pdGVtcylbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIH1cblxuICBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgVl0+IHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiBlbnRyaWVzKHRoaXMuaXRlbXMpW1N5bWJvbC5pdGVyYXRvcl0oKVxuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBWXT4ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMoKVxuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiT2JqZWN0TWFwXCJcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgT2JqZWN0TWFwIG1vZGVsIGluc3RhbmNlLlxuICpcbiAqIEB0eXBlcGFyYW0gViBWYWx1ZSB0eXBlLlxuICogQHBhcmFtIFtlbnRyaWVzXSBPcHRpb25hbCBpbml0aWFsIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdE1hcDxWPihlbnRyaWVzPzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBWXT4gfCBudWxsKTogT2JqZWN0TWFwPFY+IHtcbiAgY29uc3QgaW5pdGlhbE9iajogeyBbazogc3RyaW5nXTogViB9ID0ge31cblxuICBpZiAoZW50cmllcykge1xuICAgIGxldCBsZW4gPSBlbnRyaWVzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgaW5pdGlhbE9ialtlbnRyeVswXV0gPSBlbnRyeVsxXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgT2JqZWN0TWFwKHsgaXRlbXM6IGluaXRpYWxPYmogfSlcbn1cbiIsImltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi8uLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBPYmplY3RNYXAgfSBmcm9tIFwiLi4vLi4vd3JhcHBlcnMvT2JqZWN0TWFwXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIE1vZGVsVHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IHR5cGVzT2JqZWN0IH0gZnJvbSBcIi4vdHlwZXNPYmplY3RcIlxuaW1wb3J0IHsgdHlwZXNSZWNvcmQgfSBmcm9tIFwiLi90eXBlc1JlY29yZFwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiBvYmplY3QtbGlrZSBtYXAgT2JqZWN0TWFwLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgbnVtYmVyTWFwVHlwZSA9IHR5cGVzLm9iamVjdE1hcCh0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZVR5cGUgVmFsdWUgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc09iamVjdE1hcDxUIGV4dGVuZHMgQW55VHlwZT4oXG4gIHZhbHVlVHlwZTogVFxuKTogTW9kZWxUeXBlPE9iamVjdE1hcDxUeXBlVG9EYXRhPFQ+Pj4ge1xuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IE9iamVjdE1hcFR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUodmFsdWVUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChPYmplY3RNYXApIVxuXG4gICAgY29uc3QgdmFsdWVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKHZhbHVlVHlwZSlcblxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT5cbiAgICAgIGBPYmplY3RNYXA8JHt2YWx1ZUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB2YWx1ZUNoZWNrZXIpfT5gXG5cbiAgICBjb25zdCBkYXRhVHlwZUNoZWNrZXIgPSB0eXBlc09iamVjdCgoKSA9PiAoe1xuICAgICAgaXRlbXM6IHR5cGVzUmVjb3JkKHZhbHVlQ2hlY2tlciBhcyBhbnkpLFxuICAgIH0pKVxuICAgIGNvbnN0IHJlc29sdmVkRGF0YVR5cGVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcblxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcblxuICAgICAgKG9iaiwgcGF0aCkgPT4ge1xuICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBPYmplY3RNYXApKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBvYmopXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuY2hlY2sob2JqLiQsIHBhdGgpXG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAob2JqKSA9PiB7XG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqW21vZGVsVHlwZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZhc3QgY2hlY2tcbiAgICAgICAgICByZXR1cm4gb2JqW21vZGVsVHlwZUtleV0gPT09IG1vZGVsSW5mby5uYW1lID8gdGhpc1RjIDogbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLnNuYXBzaG90VHlwZShvYmopID8gdGhpc1RjIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zOiB0eXBlb2Ygc25bXCJpdGVtc1wiXSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNuLml0ZW1zKSkge1xuICAgICAgICAgIG5ld0l0ZW1zW2tdID0gdmFsdWVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3Nvcihzbi5pdGVtc1trXSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc24sXG4gICAgICAgICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgW21vZGVsVHlwZUtleV0/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJdGVtczogdHlwZW9mIHNuW1wiaXRlbXNcIl0gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzbi5pdGVtcykpIHtcbiAgICAgICAgICBuZXdJdGVtc1trXSA9IHZhbHVlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHNuLml0ZW1zW2tdKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc25Db3B5ID0ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzbkNvcHlcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMub2JqZWN0TWFwYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBPYmplY3RNYXBUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgZ2V0IHZhbHVlVHlwZUluZm8oKTogVHlwZUluZm8ge1xuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLnZhbHVlVHlwZSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IHZhbHVlVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi8uLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBSZWYsIFJlZkNvbnN0cnVjdG9yIH0gZnJvbSBcIi4uLy4uL3JlZi9SZWZcIlxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgdHlwZXNTdHJpbmcgfSBmcm9tIFwiLi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsVHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7IFR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlckJhc2VUeXBlLCBUeXBlSW5mbyB9IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyB0eXBlc09iamVjdCB9IGZyb20gXCIuL3R5cGVzT2JqZWN0XCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvciBtb2RlbC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IHJlZlRvU29tZU9iamVjdCA9IHR5cGVzLnJlZihTb21lT2JqZWN0KVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBPIE9iamVjdCBvciBtb2RlbCB0eXBlLlxuICogQHBhcmFtIHJlZkNvbnN0cnVjdG9yIFJlZiBvYmplY3QgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc1JlZjxPIGV4dGVuZHMgb2JqZWN0PihyZWZDb25zdHJ1Y3RvcjogUmVmQ29uc3RydWN0b3I8Tz4pOiBNb2RlbFR5cGU8UmVmPE8+PiB7XG4gIGNvbnN0IHR5cGVOYW1lID0gXCJSZWZcIlxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KHJlZkNvbnN0cnVjdG9yLnJlZkNsYXNzKSFcblxuICBjb25zdCByZWZEYXRhVHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoXG4gICAgdHlwZXNPYmplY3QoKCkgPT4gKHtcbiAgICAgIGlkOiB0eXBlc1N0cmluZyxcbiAgICB9KSlcbiAgKVxuXG4gIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAodmFsdWUsIHBhdGgpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUmVmKSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIHR5cGVOYW1lLCB2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZkRhdGFUeXBlQ2hlY2tlci5jaGVjayh2YWx1ZS4kLCBwYXRoKVxuICAgIH0sXG5cbiAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICAodCkgPT4gbmV3IFJlZlR5cGVJbmZvKHQpLFxuXG4gICAgKG9iaikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGlmIChvYmpbbW9kZWxUeXBlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGZhc3QgY2hlY2tcbiAgICAgICAgcmV0dXJuIG9ialttb2RlbFR5cGVLZXldID09PSBtb2RlbEluZm8ubmFtZSA/IHRoaXNUYyA6IG51bGxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZkRhdGFUeXBlQ2hlY2tlci5zbmFwc2hvdFR5cGUob2JqKSA/IHRoaXNUYyA6IG51bGxcbiAgICB9LFxuXG4gICAgKHNuOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgaWYgKHNuW21vZGVsVHlwZUtleV0pIHtcbiAgICAgICAgcmV0dXJuIHNuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAoc24pID0+IHNuXG4gIClcblxuICByZXR1cm4gdGhpc1RjIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5yZWZgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZlR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cbiIsImltcG9ydCB7IGFzc2VydElzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgSWRlbnRpdHlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHsgdHlwZXNPciB9IGZyb20gXCIuLi91dGlsaXR5L3R5cGVzT3JcIlxuaW1wb3J0IHsgdHlwZXNMaXRlcmFsIH0gZnJvbSBcIi4vdHlwZXNQcmltaXRpdmVcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqIEVudW0gbGlrZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW51bUxpa2Uge1xuICBbazogc3RyaW5nXTogbnVtYmVyIHwgc3RyaW5nXG4gIFt2OiBudW1iZXJdOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudW1WYWx1ZXMoZTogRW51bUxpa2UpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgY29uc3QgdmFsczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdXG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhlKSkge1xuICAgIGNvbnN0IHYgPSBlW2tdXG4gICAgLy8gd2UgaGF2ZSB0byBkbyB0aGlzIHNpbmNlIFRTIGRvZXMgc29tZXRoaW5nIHdlaXJkXG4gICAgLy8gdG8gbnVtYmVyIHZhbHVlc1xuICAgIC8vIEhpID0gMCAtPiB7IEhpOiAwLCAwOiBcIkhpXCIgfVxuICAgIC8vIGFuZCBTV0MgY3VycmVudGx5IGdlbmVyYXRlcyBlbnVtIGNvZGUgaW5jb25zaXN0ZW50IHdpdGggVFMvQmFiZWxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3djLXByb2plY3Qvc3djL2lzc3Vlcy8zNzExXG4gICAgaWYgKCF2YWxzLmluY2x1ZGVzKHYpICYmICgodHlwZW9mIHYgIT09IFwic3RyaW5nXCIgJiYgdiAhPT0gK2spIHx8IGVbdl0gIT09ICtrKSkge1xuICAgICAgdmFscy5wdXNoKHYpXG4gICAgfVxuICB9XG4gIHJldHVybiB2YWxzXG59XG5cbi8qKlxuICogQGlnbm9yZVxuICogRXh0cmFjdCBlbnVtIHZhbHVlcyBvdXQgb2YgYSBlbnVtIG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgRW51bVZhbHVlczxFIGV4dGVuZHMgRW51bUxpa2U+ID0gRSBleHRlbmRzIFJlY29yZDxcbiAgaW5mZXIgX0ssIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGluZmVyIFZcbj5cbiAgPyBWXG4gIDogbmV2ZXJcblxuLyoqXG4gKiBBbiBlbnVtIHR5cGUsIGJhc2VkIG9uIGEgVHlwZVNjcmlwdCBhbGlrZSBlbnVtIG9iamVjdC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLm9yKC4uLmVudW1fdmFsdWVzLm1hcCh0eXBlcy5saXRlcmFsKSlgXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBlbnVtIENvbG9yIHtcbiAqICAgUmVkID0gXCJyZWRcIixcbiAqICAgR3JlZW4gPSBcImdyZWVuXCJcbiAqIH1cbiAqXG4gKiBjb25zdCBjb2xvclR5cGUgPSB0eXBlcy5lbnVtKENvbG9yKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBFIEVudW0gdHlwZS5cbiAqIEBwYXJhbSBlbnVtT2JqZWN0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNFbnVtPEUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bU9iamVjdDogRSk6IElkZW50aXR5VHlwZTxFbnVtVmFsdWVzPEU+PiB7XG4gIGFzc2VydElzT2JqZWN0KGVudW1PYmplY3QsIFwiZW51bU9iamVjdFwiKVxuXG4gIGNvbnN0IGxpdGVyYWxzID0gZW51bVZhbHVlcyhlbnVtT2JqZWN0KS5tYXAoKGUpID0+IHR5cGVzTGl0ZXJhbChlKSlcbiAgcmV0dXJuIHR5cGVzT3IoLi4ubGl0ZXJhbHMpIGFzIGFueVxufVxuIiwiaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxyXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7IGxhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIsIFR5cGVJbmZvLCBUeXBlSW5mb0dlbiB9IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcclxuXHJcbi8qKlxyXG4gKiBBIHJlZmluZW1lbnQgb3ZlciBhIGdpdmVuIHR5cGUuIFRoaXMgYWxsb3dzIHlvdSB0byBkbyBleHRyYSBjaGVja3NcclxuICogb3ZlciBtb2RlbHMsIGVuc3VyZSBudW1iZXJzIGFyZSBpbnRlZ2VycywgZXRjLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCBpbnRlZ2VyVHlwZSA9IHR5cGVzLnJlZmluZW1lbnQodHlwZXMubnVtYmVyLCAobikgPT4ge1xyXG4gKiAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pXHJcbiAqIH0sIFwiaW50ZWdlclwiKVxyXG4gKlxyXG4gKiBjb25zdCBzdW1Nb2RlbFR5cGUgPSB0eXBlcy5yZWZpbmVtZW50KHR5cGVzLm1vZGVsKFN1bSksIChzdW0pID0+IHtcclxuICogICAvLyBpbWFnaW5lIHRoYXQgZm9yIHNvbWUgcmVhc29uIHN1bSBpbmNsdWRlcyBhIG51bWJlciAnYScsIGEgbnVtYmVyICdiJ1xyXG4gKiAgIC8vIGFuZCB0aGUgcmVzdWx0XHJcbiAqXHJcbiAqICAgY29uc3QgcmlnaHRSZXN1bHQgPSBzdW0uYSArIHN1bS5iID09PSBzdW0ucmVzdWx0XHJcbiAqXHJcbiAqICAgLy8gc2ltcGxlIG1vZGUgdGhhdCB3aWxsIGp1c3QgcmV0dXJuIHRoYXQgdGhlIHdob2xlIG1vZGVsIGlzIGluY29ycmVjdFxyXG4gKiAgIHJldHVybiByaWdodFJlc3VsdFxyXG4gKlxyXG4gKiAgIC8vIHRoaXMgd2lsbCByZXR1cm4gdGhhdCB0aGUgcmVzdWx0IGZpZWxkIGlzIHdyb25nXHJcbiAqICAgcmV0dXJuIHJpZ2h0UmVzdWx0ID8gbnVsbCA6IG5ldyBUeXBlQ2hlY2tFcnJvcihbXCJyZXN1bHRcIl0sIFwiYStiXCIsIHN1bS5yZXN1bHQpXHJcbiAqIH0pXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgQmFzZSB0eXBlLlxyXG4gKiBAcGFyYW0gYmFzZVR5cGUgQmFzZSB0eXBlLlxyXG4gKiBAcGFyYW0gY2hlY2tGbiBGdW5jdGlvbiB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZGF0YSAoaWYgaXQgcGFzc2VzIHRoZSBiYXNlIHR5cGVcclxuICogY2hlY2spIGFuZCByZXR1cm4gbnVsbCBvciBmYWxzZSBpZiB0aGVyZSB3ZXJlIG5vIGVycm9ycyBvciBlaXRoZXIgYSBUeXBlQ2hlY2tFcnJvciBpbnN0YW5jZSBvclxyXG4gKiB0cnVlIGlmIHRoZXJlIHdlcmUuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNSZWZpbmVtZW50PFQgZXh0ZW5kcyBBbnlUeXBlPihcclxuICBiYXNlVHlwZTogVCxcclxuICBjaGVja0ZuOiAoZGF0YTogVHlwZVRvRGF0YTxUPikgPT4gVHlwZUNoZWNrRXJyb3IgfCBudWxsIHwgYm9vbGVhbixcclxuICB0eXBlTmFtZT86IHN0cmluZ1xyXG4pOiBUIHtcclxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT5cclxuICAgIG5ldyBSZWZpbmVtZW50VHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZShiYXNlVHlwZSksIGNoZWNrRm4sIHR5cGVOYW1lKVxyXG5cclxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcclxuICAgIGNvbnN0IGJhc2VDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGJhc2VUeXBlKVxyXG5cclxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xyXG4gICAgICBjb25zdCBiYXNlVHlwZU5hbWUgPSBiYXNlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIGJhc2VDaGVja2VyKVxyXG4gICAgICBjb25zdCByZWZpbmVtZW50TmFtZSA9IHR5cGVOYW1lIHx8IFwicmVmaW5lbWVudE9mXCJcclxuICAgICAgcmV0dXJuIGAke3JlZmluZW1lbnROYW1lfTwke2Jhc2VUeXBlTmFtZX0+YFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgICAgIGJhc2VDaGVja2VyLmJhc2VUeXBlLFxyXG5cclxuICAgICAgKGRhdGEsIHBhdGgpID0+IHtcclxuICAgICAgICBjb25zdCBiYXNlRXJyID0gYmFzZUNoZWNrZXIuY2hlY2soZGF0YSwgcGF0aClcclxuICAgICAgICBpZiAoYmFzZUVycikge1xyXG4gICAgICAgICAgcmV0dXJuIGJhc2VFcnJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZmluZW1lbnRFcnIgPSBjaGVja0ZuKGRhdGEpXHJcblxyXG4gICAgICAgIGlmIChyZWZpbmVtZW50RXJyID09PSB0cnVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH0gZWxzZSBpZiAocmVmaW5lbWVudEVyciA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgZGF0YSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlZmluZW1lbnRFcnIgPz8gbnVsbFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuXHJcbiAgICAgIGdldFR5cGVOYW1lLFxyXG4gICAgICB0eXBlSW5mb0dlbixcclxuXHJcbiAgICAgIC8vIHdlIGNhbm5vdCBjaGVjayByZWZpbmVtZW50IGhlcmUgc2luY2UgaXQgY2hlY2tzIGRhdGEgaW5zdGFuY2VzLCBub3Qgc25hcHNob3RzXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIuc25hcHNob3RUeXBlKHNuKSxcclxuXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKSxcclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiB0aGlzVGNcclxuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMucmVmaW5lbWVudGAgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlZmluZW1lbnRUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcclxuICBnZXQgYmFzZVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcclxuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLmJhc2VUeXBlKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLFxyXG4gICAgcmVhZG9ubHkgYmFzZVR5cGU6IEFueVN0YW5kYXJkVHlwZSxcclxuICAgIHJlYWRvbmx5IGNoZWNrRnVuY3Rpb246IChkYXRhOiBhbnkpID0+IFR5cGVDaGVja0Vycm9yIHwgbnVsbCB8IGJvb2xlYW4sXHJcbiAgICByZWFkb25seSB0eXBlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICBzdXBlcih0aGlzVHlwZSlcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZXNSZWZpbmVtZW50IH0gZnJvbSBcIi4uL3V0aWxpdHkvdHlwZXNSZWZpbmVtZW50XCJcbmltcG9ydCB7IHR5cGVzTnVtYmVyLCB0eXBlc1N0cmluZyB9IGZyb20gXCIuL3R5cGVzUHJpbWl0aXZlXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBpbnRlZ2VyIG51bWJlciB2YWx1ZS5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLnJlZmluZW1lbnQodHlwZXMubnVtYmVyLCBuID0+IE51bWJlci5pc0ludGVnZXIobiksIFwiaW50ZWdlclwiKWBcbiAqXG4gKiBgYGB0c1xuICogdHlwZXMuaW50ZWdlclxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc0ludGVnZXIgPSB0eXBlc1JlZmluZW1lbnQodHlwZXNOdW1iZXIsIChuKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKG4pLCBcImludGVnZXJcIilcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBzdHJpbmcgdmFsdWUgb3RoZXIgdGhhbiBcIlwiLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMucmVmaW5lbWVudCh0eXBlcy5zdHJpbmcsIHMgPT4gcyAhPT0gXCJcIiwgXCJub25FbXB0eVwiKWBcbiAqXG4gKiBgYGB0c1xuICogdHlwZXMubm9uRW1wdHlTdHJpbmdcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNOb25FbXB0eVN0cmluZyA9IHR5cGVzUmVmaW5lbWVudCh0eXBlc1N0cmluZywgKHMpID0+IHMgIT09IFwiXCIsIFwibm9uRW1wdHlcIilcbiIsImltcG9ydCB7IHR5cGVzTnVsbCwgdHlwZXNVbmRlZmluZWQgfSBmcm9tIFwiLi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlLCBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQgeyB0eXBlc09yIH0gZnJvbSBcIi4vdHlwZXNPclwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBlaXRoZXIgYSB0eXBlIG9yIHVuZGVmaW5lZC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLm9yKGJhc2VUeXBlLCB0eXBlcy51bmRlZmluZWQpYFxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgbnVtYmVyT3JVbmRlZmluZWRUeXBlID0gdHlwZXMubWF5YmUodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gYmFzZVR5cGUgVHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc01heWJlPFQgZXh0ZW5kcyBBbnlUeXBlPihiYXNlVHlwZTogVCk6IFQgfCBJZGVudGl0eVR5cGU8dW5kZWZpbmVkPiB7XG4gIHJldHVybiB0eXBlc09yKGJhc2VUeXBlLCB0eXBlc1VuZGVmaW5lZClcbn1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGVpdGhlciBhIHR5cGUgb3IgbnVsbC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLm9yKGJhc2VUeXBlLCB0eXBlcy5udWxsKWBcbiAqXG4gKiAgKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IG51bWJlck9yTnVsbFR5cGUgPSB0eXBlcy5tYXliZU51bGwodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gdHlwZSBUeXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzTWF5YmVOdWxsPFQgZXh0ZW5kcyBBbnlUeXBlPih0eXBlOiBUKTogVCB8IElkZW50aXR5VHlwZTxudWxsPiB7XG4gIHJldHVybiB0eXBlc09yKHR5cGUsIHR5cGVzTnVsbClcbn1cbiIsImltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcclxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxyXG5pbXBvcnQgeyBsYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyLCBUeXBlSW5mbywgVHlwZUluZm9HZW4gfSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxyXG5cclxuLyoqXHJcbiAqIFdyYXAgYSBnaXZlbiB0eXBlIHdpdGggdGFnIGluZm9ybWF0aW9uLlxyXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGggdGhlIHR5cGUgb2YgYSBwcm9wIHRoYXRcclxuICogeW91IGNhbiB1c2UgYXQgcnVudGltZS5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3Qgd2lkdGhUeXBlID0gdHlwZXMudGFnKHR5cGVzLm51bWJlciwgeyBkaXNwbGF5TmFtZTogXCJXaWR0aCBpbiBJbmNoZXNcIiwgcmVxdWlyZWQ6IHRydWUgfSwgXCJkaW1lbnNpb25cIilcclxuICogY29uc3QgaGVpZ2h0VHlwZSA9IHR5cGVzLnRhZyh0eXBlcy5udW1iZXIsIHsgZGlzcGxheU5hbWU6IFwiSGVpZ2h0IGluIEluY2hlc1wiLCByZXF1aXJlZDogdHJ1ZSB9LCBcImRpbWVuc2lvblwiKVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlc2UgY2FuIHRoZW4gYmUgYWNjZXNzZWQgYXQgcnVudGltZSB0aHJvdWdoIGluc3BlY3Rpb24gQVBJcywgZS5nLlxyXG4gKiBgYGBcclxuICogQG1vZGVsKCdNeU1vZGVsJylcclxuICogY2xhc3MgTXlNb2RlbCBleHRlbmRzIE1vZGVsKHtcclxuICogICB3aWR0aDogdFByb3Aod2lkdGhUeXBlLCAxMCksXHJcbiAqICAgaGVpZ2h0OiB0UHJvcChoZWlnaHRUeXBlLCAxMClcclxuICogfSkge31cclxuICpcclxuICogY29uc3QgbSA9IG5ldyBNeU1vZGVsKHt9KVxyXG4gKiBjb25zdCB0eXBlID0gdHlwZXMubW9kZWw8dHlwZW9mIE1vZGVsPihtLmNvbnN0cnVjdG9yKVxyXG4gKiBjb25zdCBtb2RlbFR5cGVJbmZvID0gZ2V0VHlwZUluZm8odHlwZSkgYXMgTW9kZWxUeXBlSW5mb1xyXG4gKiBjb25zdCBwcm9wVHlwZUluZm8gPSBtb2RlbFR5cGVJbmZvLnByb3BzLndpZHRoLnR5cGVJbmZvIGFzIFRhZ1R5cGVJbmZvXHJcbiAqIGNvbnN0IGRpc3BsYXlOYW1lID0gcHJvcFR5cGVJbmZvLmRpc3BsYXlOYW1lXHJcbiAqIGBgYFxyXG4gKiBAdHlwZXBhcmFtIFQgQmFzZSB0eXBlLlxyXG4gKiBAcGFyYW0gYmFzZVR5cGUgQmFzZSB0eXBlLlxyXG4gKiBAdHlwZXBhcmFtIEEgVGFnIG9iamVjdC5cclxuICogQHBhcmFtIHRhZyBBYml0cmFyeSBvYmplY3QgdGhhdCBjYW4gYmUgcXVlcmllZCBhdCBydW50aW1lLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzVGFnPFQgZXh0ZW5kcyBBbnlUeXBlLCBBPihiYXNlVHlwZTogVCwgdGFnOiBBLCB0eXBlTmFtZT86IHN0cmluZyk6IFQge1xyXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PlxyXG4gICAgbmV3IFRhZ1R5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUoYmFzZVR5cGUpLCB0YWcsIHR5cGVOYW1lKVxyXG5cclxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcclxuICAgIGNvbnN0IGJhc2VDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGJhc2VUeXBlKVxyXG5cclxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xyXG4gICAgICBjb25zdCBiYXNlVHlwZU5hbWUgPSBiYXNlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIGJhc2VDaGVja2VyKVxyXG4gICAgICBjb25zdCB0YWdnZWROYW1lID0gdHlwZU5hbWUgfHwgXCJ0YWdnZWRcIlxyXG4gICAgICByZXR1cm4gYCR7dGFnZ2VkTmFtZX08JHtiYXNlVHlwZU5hbWV9PmBcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gICAgICBiYXNlQ2hlY2tlci5iYXNlVHlwZSxcclxuICAgICAgYmFzZUNoZWNrZXIuY2hlY2ssXHJcbiAgICAgIGdldFR5cGVOYW1lLFxyXG4gICAgICB0eXBlSW5mb0dlbixcclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci5zbmFwc2hvdFR5cGUoc24pLFxyXG4gICAgICAoc24pID0+IGJhc2VDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbiksXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3NvcihzbilcclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gdGhpc1RjXHJcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxyXG59XHJcblxyXG4vKipcclxuICogYHR5cGVzLnRhZ2AgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRhZ1R5cGVJbmZvPEE+IGV4dGVuZHMgVHlwZUluZm8ge1xyXG4gIGdldCBiYXNlVHlwZUluZm8oKTogVHlwZUluZm8ge1xyXG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMuYmFzZVR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgICByZWFkb25seSBiYXNlVHlwZTogQW55U3RhbmRhcmRUeXBlLFxyXG4gICAgcmVhZG9ubHkgdGFnOiBBLFxyXG4gICAgcmVhZG9ubHkgdHlwZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgc3VwZXIodGhpc1R5cGUpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEFycmF5VHlwZUluZm8sIHR5cGVzQXJyYXkgfSBmcm9tIFwiLi9hcnJheUJhc2VkL3R5cGVzQXJyYXlcIlxuaW1wb3J0IHsgVHVwbGVUeXBlSW5mbywgdHlwZXNUdXBsZSB9IGZyb20gXCIuL2FycmF5QmFzZWQvdHlwZXNUdXBsZVwiXG5pbXBvcnQgeyBBcnJheVNldFR5cGVJbmZvLCB0eXBlc0FycmF5U2V0IH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNBcnJheVNldFwiXG5pbXBvcnQgeyB0eXBlc0RhdGFNb2RlbERhdGEgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc0RhdGFNb2RlbERhdGFcIlxuaW1wb3J0IHsgTW9kZWxUeXBlSW5mbywgTW9kZWxUeXBlSW5mb1Byb3BzLCB0eXBlc01vZGVsIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNNb2RlbFwiXG5pbXBvcnQge1xuICBGcm96ZW5UeXBlSW5mbyxcbiAgT2JqZWN0VHlwZUluZm8sXG4gIE9iamVjdFR5cGVJbmZvUHJvcHMsXG4gIHR5cGVzRnJvemVuLFxuICB0eXBlc09iamVjdCxcbn0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNPYmplY3RcIlxuaW1wb3J0IHsgT2JqZWN0TWFwVHlwZUluZm8sIHR5cGVzT2JqZWN0TWFwIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNPYmplY3RNYXBcIlxuaW1wb3J0IHsgUmVjb3JkVHlwZUluZm8sIHR5cGVzUmVjb3JkIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNSZWNvcmRcIlxuaW1wb3J0IHsgUmVmVHlwZUluZm8sIHR5cGVzUmVmIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNSZWZcIlxuaW1wb3J0IHsgdHlwZXNFbnVtIH0gZnJvbSBcIi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNFbnVtXCJcbmltcG9ydCB7XG4gIEJvb2xlYW5UeXBlSW5mbyxcbiAgTGl0ZXJhbFR5cGVJbmZvLFxuICBOdW1iZXJUeXBlSW5mbyxcbiAgU3RyaW5nVHlwZUluZm8sXG4gIHR5cGVzQm9vbGVhbixcbiAgdHlwZXNMaXRlcmFsLFxuICB0eXBlc051bGwsXG4gIHR5cGVzTnVtYmVyLFxuICB0eXBlc1N0cmluZyxcbiAgdHlwZXNVbmRlZmluZWQsXG59IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB7IHR5cGVzSW50ZWdlciwgdHlwZXNOb25FbXB0eVN0cmluZyB9IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUmVmaW5lZFByaW1pdGl2ZVwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB7IHR5cGVzTWF5YmUsIHR5cGVzTWF5YmVOdWxsIH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc01heWJlXCJcbmltcG9ydCB7IE9yVHlwZUluZm8sIHR5cGVzT3IgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzT3JcIlxuaW1wb3J0IHsgUmVmaW5lbWVudFR5cGVJbmZvLCB0eXBlc1JlZmluZW1lbnQgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzUmVmaW5lbWVudFwiXG5pbXBvcnQgeyBUYWdUeXBlSW5mbywgdHlwZXNUYWcgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzVGFnXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkLCBVbmNoZWNrZWRUeXBlSW5mbyB9IGZyb20gXCIuL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWRcIlxuZXhwb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi9nZXRUeXBlSW5mb1wiXG5leHBvcnQgeyBUeXBlSW5mbyB9IGZyb20gXCIuL1R5cGVDaGVja2VyXCJcbmV4cG9ydCB0eXBlIHsgT2JqZWN0VHlwZUluZm9Qcm9wcywgTW9kZWxUeXBlSW5mb1Byb3BzIH1cbmV4cG9ydCB7XG4gIEJvb2xlYW5UeXBlSW5mbyxcbiAgTGl0ZXJhbFR5cGVJbmZvLFxuICBOdW1iZXJUeXBlSW5mbyxcbiAgU3RyaW5nVHlwZUluZm8sXG4gIEZyb3plblR5cGVJbmZvLFxuICBPYmplY3RNYXBUeXBlSW5mbyxcbiAgVGFnVHlwZUluZm8sXG4gIFJlZmluZW1lbnRUeXBlSW5mbyxcbiAgUmVjb3JkVHlwZUluZm8sXG4gIFJlZlR5cGVJbmZvLFxuICBVbmNoZWNrZWRUeXBlSW5mbyxcbiAgT2JqZWN0VHlwZUluZm8sXG4gIEFycmF5U2V0VHlwZUluZm8sXG4gIEFycmF5VHlwZUluZm8sXG4gIE1vZGVsVHlwZUluZm8sXG4gIE9yVHlwZUluZm8sXG4gIFR1cGxlVHlwZUluZm8sXG59XG5cbmV4cG9ydCBjb25zdCB0eXBlcyA9IHtcbiAgbGl0ZXJhbDogdHlwZXNMaXRlcmFsLFxuICB1bmRlZmluZWQ6IHR5cGVzVW5kZWZpbmVkLFxuICBudWxsOiB0eXBlc051bGwsXG4gIGJvb2xlYW46IHR5cGVzQm9vbGVhbixcbiAgbnVtYmVyOiB0eXBlc051bWJlcixcbiAgc3RyaW5nOiB0eXBlc1N0cmluZyxcbiAgb3I6IHR5cGVzT3IsXG4gIG1heWJlOiB0eXBlc01heWJlLFxuICBtYXliZU51bGw6IHR5cGVzTWF5YmVOdWxsLFxuICBhcnJheTogdHlwZXNBcnJheSxcbiAgcmVjb3JkOiB0eXBlc1JlY29yZCxcbiAgdW5jaGVja2VkOiB0eXBlc1VuY2hlY2tlZCxcbiAgbW9kZWw6IHR5cGVzTW9kZWwsXG4gIGRhdGFNb2RlbERhdGE6IHR5cGVzRGF0YU1vZGVsRGF0YSxcbiAgb2JqZWN0OiB0eXBlc09iamVjdCxcbiAgcmVmOiB0eXBlc1JlZixcbiAgZnJvemVuOiB0eXBlc0Zyb3plbixcbiAgZW51bTogdHlwZXNFbnVtLFxuICB0YWc6IHR5cGVzVGFnLFxuICByZWZpbmVtZW50OiB0eXBlc1JlZmluZW1lbnQsXG4gIGludGVnZXI6IHR5cGVzSW50ZWdlcixcbiAgbm9uRW1wdHlTdHJpbmc6IHR5cGVzTm9uRW1wdHlTdHJpbmcsXG4gIG9iamVjdE1hcDogdHlwZXNPYmplY3RNYXAsXG4gIGFycmF5U2V0OiB0eXBlc0FycmF5U2V0LFxuICB0dXBsZTogdHlwZXNUdXBsZSxcblxuICBtYXBBcnJheTxUIGV4dGVuZHMgQW55VHlwZT4odmFsdWVUeXBlOiBUKSB7XG4gICAgcmV0dXJuIHR5cGVzQXJyYXkodHlwZXNUdXBsZSh0eXBlc1N0cmluZywgdmFsdWVUeXBlKSlcbiAgfSxcbiAgc2V0QXJyYXk8VCBleHRlbmRzIEFueVR5cGU+KHZhbHVlVHlwZTogVCkge1xuICAgIHJldHVybiB0eXBlc0FycmF5KHZhbHVlVHlwZSlcbiAgfSxcbiAgbWFwT2JqZWN0PFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpIHtcbiAgICByZXR1cm4gdHlwZXNSZWNvcmQodmFsdWVUeXBlKVxuICB9LFxuICBkYXRlU3RyaW5nOiB0eXBlc05vbkVtcHR5U3RyaW5nLFxuICBkYXRlVGltZXN0YW1wOiB0eXBlc0ludGVnZXIsXG59XG4iXSwibmFtZXMiOlsibmFtZXNwYWNlIiwic3RhbmRhcmRUeXBlUmVzb2x2ZXJzIiwiZmFzdERlZXBFcXVhbCIsIm9ic2VydmFibGVPcHRpb25zIiwiaW50ZXJuYWxNb2RlbCIsIm5zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLE1BQU0sOENBQThCOzRCQVdEO1NBQzFCLHdCQUF3QixJQUFJLGNBQWM7QUFDbkQ7NEJBTUUsZ0JBQ0EsYUFDQTswQkFFd0IsSUFBSSxnQkFBZ0I7QUFBQSxJQUMxQztBQUFBLElBQ0E7QUFBQSxHQUNEO0FBQ0g7SUMzQlk7VUFBQTs7Ozs7OztBQXlCWixHQXpCWTtBQTJCWixNQUFNLHNCQUEyQyxJQUFJLElBQUksT0FBTyxPQUFPLGFBQWEsQ0FBQzt5QkFXckQ7U0FDdkIsb0JBQW9CLElBQUksVUFBVTtBQUMzQztJQ1NZO1VBQUE7OztBQUdaLEdBSFk7SUFRQTtVQUFBOzs7Ozs7QUFxQlosR0FyQlk7QUF1QlosSUFBSTs7U0FRSztBQUNUO2lDQVN3Qzt5QkFDZjtBQUN6QjtNQ3BHYSxvQkFBb0IsT0FBTyxhQUFhO3VCQVF2QjtTQUNyQixPQUFPLE9BQU8sY0FBYyxxQkFBcUI7QUFDMUQ7TUNWYSxlQUFlO01BS2YsYUFBYTs0QkFTUztTQUcxQixRQUFRO0FBQ2pCO01DTmEsMEJBQTBCO0VBQ3JDLFlBQVk7VUFDSixHQUFHO1dBR0YsZUFBZSxNQUFNLGtCQUFrQixTQUFTO0FBQUE7O2lCQU9uQztTQUNmLElBQUksa0JBQWtCLEdBQUc7QUFDbEM7QUFFQSxNQUFNLCtCQUFtRDtBQUFBLEVBQ3ZELFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFBQSxFQUNWLGNBQWM7QUFBQSxFQUNkLE9BQU87O3VCQU1xQixRQUFhLFVBQXVCLE9BQVksV0FBVztNQUNuRixVQUFVO1dBQ0wsZUFBZSxRQUFRLFVBQVUsNEJBQTRCO1dBQzdELFlBQVk7QUFBQSxTQUNkO1dBQ0UsZUFBZSxRQUFRLFVBQVU7QUFBQSxNQUN0QyxZQUFZO0FBQUEsTUFDWjtBQUFBLE1BQ0EsY0FB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
7984
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS5lc20ubWpzIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YU1vZGVsL2FjdGlvbnMudHMiLCIuLi9zcmMvYWN0aW9uL2J1aWx0SW5BY3Rpb25zLnRzIiwiLi4vc3JjL2FjdGlvbi9jb250ZXh0LnRzIiwiLi4vc3JjL2FjdGlvbi9pc01vZGVsQWN0aW9uLnRzIiwiLi4vc3JjL21vZGVsL21ldGFkYXRhLnRzIiwiLi4vc3JjL3V0aWxzL2luZGV4LnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZC50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9tb2RlbEluZm8udHMiLCIuLi9zcmMvdXRpbHMvbWFwVXRpbHMudHMiLCIuLi9zcmMvcGFyZW50L2NvcmUudHMiLCIuLi9zcmMvdHdlYWtlci9jb3JlLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsU3ltYm9scy50cyIsIi4uL3NyYy9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsUHJvcHNJbmZvLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL3Byb3AudHMiLCIuLi9zcmMvdHlwZXMvZ2V0VHlwZUluZm8udHMiLCIuLi9zcmMvdHlwZXMvVHlwZUNoZWNrRXJyb3IudHMiLCIuLi9zcmMvdHlwZXMvVHlwZUNoZWNrZXIudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNNb2RlbC50cyIsIi4uL3NyYy90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZS50cyIsIi4uL3NyYy90eXBlcy9yZWdpc3RlckRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnMudHMiLCIuLi9zcmMvdHlwZXMvcmVzb2x2ZVR5cGVDaGVja2VyLnRzIiwiLi4vc3JjL3NuYXBzaG90L2ludGVybmFsLnRzIiwiLi4vc3JjL3NuYXBzaG90L2dldFNuYXBzaG90LnRzIiwiLi4vc3JjL3R5cGVzL3R5cGVDaGVjay50cyIsIi4uL25vZGVfbW9kdWxlcy9uYW5vaWQvbm9uLXNlY3VyZS9pbmRleC5qcyIsIi4uL3NyYy9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsQ2xhc3NJbml0aWFsaXplci50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9uZXdNb2RlbC50cyIsIi4uL3NyYy9hY3Rpb24vcHJvdGVjdGlvbi50cyIsIi4uL3NyYy9hY3Rpb24vcGVuZGluZ0FjdGlvbnMudHMiLCIuLi9zcmMvYWN0aW9uL2hvb2tBY3Rpb25zLnRzIiwiLi4vc3JjL3BhcmVudC9jb3JlT2JqZWN0Q2hpbGRyZW4udHMiLCIuLi9zcmMvcGFyZW50L3dhbGtUcmVlLnRzIiwiLi4vc3JjL3Jvb3RTdG9yZS9hdHRhY2hEZXRhY2gudHMiLCIuLi9zcmMvcm9vdFN0b3JlL3Jvb3RTdG9yZS50cyIsIi4uL3NyYy9wYXRjaC9lbWl0UGF0Y2gudHMiLCIuLi9zcmMvZGF0YU1vZGVsL2dldERhdGFNb2RlbE1ldGFkYXRhLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzRGF0YU1vZGVsRGF0YS50cyIsIi4uL3NyYy9kYXRhTW9kZWwvbmV3RGF0YU1vZGVsLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC91dGlscy50cyIsIi4uL3NyYy9mcm96ZW4vRnJvemVuLnRzIiwiLi4vc3JjL3R3ZWFrZXIvVHdlYWtlclByaW9yaXR5LnRzIiwiLi4vc3JjL3R3ZWFrZXIvdHdlYWtGcm96ZW4udHMiLCIuLi9zcmMvcGFyZW50L2ZpbmRQYXJlbnQudHMiLCIuLi9zcmMvcGFyZW50L2dldENoaWxkcmVuT2JqZWN0cy50cyIsIi4uL3NyYy9wYXJlbnQvZmluZENoaWxkcmVuLnRzIiwiLi4vc3JjL3BhcmVudC9vbkNoaWxkQXR0YWNoZWRUby50cyIsIi4uL3NyYy9wYXJlbnQvcGF0aDIudHMiLCIuLi9zcmMvdHdlYWtlci93aXRob3V0VHlwZUNoZWNraW5nLnRzIiwiLi4vc3JjL3NuYXBzaG90L1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlY29uY2lsZUFycmF5U25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlRnJvemVuU25hcHNob3QudHMiLCIuLi9ub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsL2VzNi9pbmRleC5qcyIsIi4uL3NyYy91dGlscy9Nb2RlbFBvb2wudHMiLCIuLi9zcmMvc25hcHNob3QvYXBwbHlTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9vblNuYXBzaG90LnRzIiwiLi4vc3JjL3RyZWVVdGlscy9kZWVwRXF1YWxzLnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlY29uY2lsZU1vZGVsU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWdpc3RlckRlZmF1bHRSZWNvbmNpbGVycy50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWNvbmNpbGVTbmFwc2hvdC50cyIsIi4uL3NyYy9wYXRjaC9hcHBseVBhdGNoZXMudHMiLCIuLi9zcmMvdHdlYWtlci90eXBlQ2hlY2tpbmcudHMiLCIuLi9zcmMvdHdlYWtlci90d2Vha1BsYWluT2JqZWN0LnRzIiwiLi4vc3JjL3R3ZWFrZXIvcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnMudHMiLCIuLi9zcmMvdHdlYWtlci90d2Vhay50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrQXJyYXkudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbUFycmF5U25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbUZyb3plblNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L2Zyb21Nb2RlbFNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L2Zyb21QbGFpbk9iamVjdFNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVycy50cyIsIi4uL3NyYy9zbmFwc2hvdC9mcm9tU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvY2xvbmUudHMiLCIuLi9zcmMvcGFyZW50L3NldFBhcmVudC50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrTW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvbmV3TW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvQmFzZU1vZGVsLnRzIiwiLi4vc3JjL21vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL3BhcmVudC9wYXRoLnRzIiwiLi4vc3JjL2FjdGlvbi9taWRkbGV3YXJlLnRzIiwiLi4vc3JjL2FjdGlvbi93cmFwSW5BY3Rpb24udHMiLCIuLi9zcmMvcGFyZW50L2RldGFjaC50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9jaGVja01vZGVsRGVjb3JhdG9yQXJncy50cyIsIi4uL3NyYy9hY3Rpb24vYWN0aW9uRGVjb3JhdG9yVXRpbHMudHMiLCIuLi9zcmMvYWN0aW9uL21vZGVsRmxvdy50cyIsIi4uL3NyYy9zdGFuZGFyZEFjdGlvbnMvYWN0aW9ucy50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlEZWxldGUudHMiLCIuLi9zcmMvYWN0aW9uL2FwcGx5TWV0aG9kQ2FsbC50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlTZXQudHMiLCIuLi9zcmMvYWN0aW9uL2FwcGx5QWN0aW9uLnRzIiwiLi4vc3JjL2FjdGlvbi9tb2RlbEFjdGlvbi50cyIsIi4uL3NyYy9hY3Rpb24vcnVuVW5wcm90ZWN0ZWQudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9jb3JlLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vYXJyYXlTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vZGF0ZVNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9tYXBTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL3V0aWxzLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vb2JqZWN0UGF0aFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9vYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9wbGFpbk9iamVjdFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9wcmltaXRpdmVTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vc2V0U2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL2FjdGlvblNlcmlhbGl6YXRpb24udHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9hcHBseVNlcmlhbGl6ZWRBY3Rpb24udHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL29uQWN0aW9uTWlkZGxld2FyZS50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9yZWFkb25seU1pZGRsZXdhcmUudHMiLCIuLi9zcmMvcGF0Y2gvanNvblBhdGNoLnRzIiwiLi4vc3JjL3BhdGNoL3BhdGNoUmVjb3JkZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvdHJhbnNhY3Rpb25NaWRkbGV3YXJlLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzT2JqZWN0LnRzIiwiLi4vc3JjL3R5cGVzL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWQudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc09yLnRzIiwiLi4vc3JjL3R5cGVzL3RQcm9wLnRzIiwiLi4vc3JjL3V0aWxzL2NoYWluRm5zLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL3V0aWxzLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL3NoYXJlZEludGVybmFsTW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxEZWNvcmF0b3IudHMiLCIuLi9zcmMvdHlwZXMvYXJyYXlCYXNlZC90eXBlc0FycmF5LnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL3VuZG9NaWRkbGV3YXJlLnRzIiwiLi4vc3JjL2NvbnRleHQvY29udGV4dC50cyIsIi4uL3NyYy9jb21wdXRlZFRyZWUvY29tcHV0ZWRUcmVlLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC9EYXRhTW9kZWwudHMiLCIuLi9zcmMvcmVkdXgvY29ubmVjdFJlZHV4RGV2VG9vbHMudHMiLCIuLi9zcmMvcmVkdXgvcmVkdXgudHMiLCIuLi9zcmMvcmVmL1JlZi50cyIsIi4uL3NyYy9yZWYvY29yZS50cyIsIi4uL3NyYy9yZWYvY3VzdG9tUmVmLnRzIiwiLi4vc3JjL3JlZi9yb290UmVmLnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9zdGFuZGFsb25lQWN0aW9ucy50cyIsIi4uL3NyYy9zdGFuZGFyZEFjdGlvbnMvYXJyYXlBY3Rpb25zLnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9vYmplY3RBY3Rpb25zLnRzIiwiLi4vc3JjL3V0aWxzL3RhZy50cyIsIi4uL3NyYy93cmFwcGVycy9hc01hcC50cyIsIi4uL3NyYy90cmFuc2Zvcm1zL2FzTWFwLnRzIiwiLi4vc3JjL3dyYXBwZXJzL2FzU2V0LnRzIiwiLi4vc3JjL3RyYW5zZm9ybXMvYXNTZXQudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9iaWdpbnQudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9JbW11dGFibGVEYXRlLnRzIiwiLi4vc3JjL3RyYW5zZm9ybXMvZGF0ZS50cyIsIi4uL3NyYy90cmVlVXRpbHMvZHJhZnQudHMiLCIuLi9zcmMvdHJlZVV0aWxzL3NhbmRib3gudHMiLCIuLi9zcmMvdHlwZXMvYXJyYXlCYXNlZC90eXBlc1R1cGxlLnRzIiwiLi4vc3JjL3dyYXBwZXJzL0FycmF5U2V0LnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzQXJyYXlTZXQudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNSZWNvcmQudHMiLCIuLi9zcmMvd3JhcHBlcnMvT2JqZWN0TWFwLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzT2JqZWN0TWFwLnRzIiwiLi4vc3JjL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzUmVmLnRzIiwiLi4vc3JjL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzRW51bS50cyIsIi4uL3NyYy90eXBlcy91dGlsaXR5L3R5cGVzUmVmaW5lbWVudC50cyIsIi4uL3NyYy90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1JlZmluZWRQcmltaXRpdmUudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc01heWJlLnRzIiwiLi4vc3JjL3R5cGVzL3V0aWxpdHkvdHlwZXNUYWcudHMiLCIuLi9zcmMvdHlwZXMvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcblxuY29uc3QgZGF0YU1vZGVsQWN0aW9uUmVnaXN0cnkgPSBuZXcgTWFwPFxuICBzdHJpbmcsXG4gIHtcbiAgICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbiAgICBmbk5hbWU6IHN0cmluZ1xuICB9XG4+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFNb2RlbEFjdGlvbihmdWxsQWN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBkYXRhTW9kZWxBY3Rpb25SZWdpc3RyeS5nZXQoZnVsbEFjdGlvbk5hbWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREYXRhTW9kZWxBY3Rpb24oXG4gIGZ1bGxBY3Rpb25OYW1lOiBzdHJpbmcsXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbiAgZm5OYW1lOiBzdHJpbmdcbikge1xuICBkYXRhTW9kZWxBY3Rpb25SZWdpc3RyeS5zZXQoZnVsbEFjdGlvbk5hbWUsIHtcbiAgICBtb2RlbENsYXNzLFxuICAgIGZuTmFtZSxcbiAgfSlcbn1cbiIsIi8qKlxuICogQSBidWlsdC1pbiBhY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIEJ1aWx0SW5BY3Rpb24ge1xuICAvKipcbiAgICogYXBwbHlQYXRjaGVzXG4gICAqL1xuICBBcHBseVBhdGNoZXMgPSBcIiQkYXBwbHlQYXRjaGVzXCIsXG4gIC8qKlxuICAgKiBhcHBseVNuYXBzaG90XG4gICAqL1xuICBBcHBseVNuYXBzaG90ID0gXCIkJGFwcGx5U25hcHNob3RcIixcbiAgLyoqXG4gICAqIGRldGFjaFxuICAgKi9cbiAgRGV0YWNoID0gXCIkJGRldGFjaFwiLFxuICAvKipcbiAgICogYXBwbHlTZXRcbiAgICovXG4gIEFwcGx5U2V0ID0gXCIkJGFwcGx5U2V0XCIsXG4gIC8qKlxuICAgKiBhcHBseURlbGV0ZVxuICAgKi9cbiAgQXBwbHlEZWxldGUgPSBcIiQkYXBwbHlEZWxldGVcIixcbiAgLyoqXG4gICAqIGFwcGx5TWV0aG9kQ2FsbFxuICAgKi9cbiAgQXBwbHlNZXRob2RDYWxsID0gXCIkJGFwcGx5TWV0aG9kQ2FsbFwiLFxufVxuXG5jb25zdCBidWlsdEluQWN0aW9uVmFsdWVzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChPYmplY3QudmFsdWVzKEJ1aWx0SW5BY3Rpb24pKVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBhY3Rpb24gbmFtZSBpcyBhIGJ1aWx0LWluIGFjdGlvbiwgdGhpcyBpcywgb25lIG9mOlxuICogLSBhcHBseVBhdGNoZXMoKVxuICogLSBhcHBseVNuYXBzaG90KClcbiAqIC0gZGV0YWNoKClcbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBBY3Rpb24gbmFtZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBidWlsdC1pbiBhY3Rpb24sIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbHRJbkFjdGlvbihhY3Rpb25OYW1lOiBzdHJpbmcpOiBhY3Rpb25OYW1lIGlzIEJ1aWx0SW5BY3Rpb24ge1xuICByZXR1cm4gYnVpbHRJbkFjdGlvblZhbHVlcy5oYXMoYWN0aW9uTmFtZSlcbn1cbiIsImltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcblxuLyoqXG4gKiBMb3cgbGV2ZWwgYWN0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBBY3Rpb24gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBBY3Rpb24gdHlwZSwgc3luYyBvciBhc3luYy5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlXG4gIC8qKlxuICAgKiBBY3Rpb24gdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldDogQW55TW9kZWxcbiAgLyoqXG4gICAqIEFycmF5IG9mIGFjdGlvbiBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBhcmdzOiBSZWFkb25seUFycmF5PGFueT5cbiAgLyoqXG4gICAqIFBhcmVudCBhY3Rpb24gY29udGV4dCwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50Q29udGV4dD86IEFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIFJvb3QgYWN0aW9uIGNvbnRleHQsIG9yIGl0c2VsZiBpZiB0aGUgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RDb250ZXh0OiBBY3Rpb25Db250ZXh0XG4gIC8qKlxuICAgKiBQcmV2aW91cyBhc3luYyBzdGVwIGNvbnRleHQsIHVuZGVmaW5lZCBmb3Igc3luYyBhY3Rpb25zIG9yIHRoZSBmaXJzdCBhY3Rpb24gb2YgYSBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0PzogQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogU3Bhd24gYXN5bmMgc3RlcCBjb250ZXh0LCB1bmRlZmluZWQgZm9yIHN5bmMgYWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHNwYXduQXN5bmNTdGVwQ29udGV4dD86IEFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIEFzeW5jIHN0ZXAgdHlwZSwgb3IgdW5kZWZpbmVkIGZvciBzeW5jIGFjdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBhc3luY1N0ZXBUeXBlPzogQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGVcbiAgLyoqXG4gICAqIEN1c3RvbSBkYXRhIGZvciB0aGUgYWN0aW9uIGNvbnRleHQgdG8gYmUgc2V0IGJ5IG1pZGRsZXdhcmVzLCBhbiBvYmplY3QuXG4gICAqIFN5bWJvbHMgbXVzdCBiZSB1c2VkIGFzIGtleXMgdG8gYXZvaWQgbmFtZSBjbGFzaGluZyBiZXR3ZWVuIG1pZGRsZXdhcmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogUmVjb3JkPHN5bWJvbCwgYW55PlxufVxuXG4vKipcbiAqIEFjdGlvbiB0eXBlLCBzeW5jIG9yIGFzeW5jLlxuICovXG5leHBvcnQgZW51bSBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB7XG4gIFN5bmMgPSBcInN5bmNcIixcbiAgQXN5bmMgPSBcImFzeW5jXCIsXG59XG5cbi8qKlxuICogQW4gYXN5bmMgc3RlcCB0eXBlLlxuICovXG5leHBvcnQgZW51bSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZSB7XG4gIC8qKlxuICAgKiBUaGUgZmxvdyBpcyBhYm91dCB0byBzdGFydC5cbiAgICovXG4gIFNwYXduID0gXCJzcGF3blwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgaXMgYWJvdXQgdG8gcmV0dXJuIChmaW5pc2gpLlxuICAgKi9cbiAgUmV0dXJuID0gXCJyZXR1cm5cIixcbiAgLyoqXG4gICAqIFRoZSBmbG93IGlzIGFib3V0IHRvIGNvbnRpbnVlLlxuICAgKi9cbiAgUmVzdW1lID0gXCJyZXN1bWVcIixcbiAgLyoqXG4gICAqIFRoZSBmbG93IHlpZWxkIGp1c3QgdGhyZXcsIHdoaWNoIG1pZ2h0IGJlIHJlY292ZXJlZCAoY2F1Z2h0KSBvciBub3QuXG4gICAqL1xuICBSZXN1bWVFcnJvciA9IFwicmVzdW1lRXJyb3JcIixcbiAgLyoqXG4gICAqIFRoZSBmbG93IGlzIGFib3V0IHRvIHRocm93IGFuIGVycm9yIHRvIHRoZSBmbG93IGNhbGxlci5cbiAgICovXG4gIFRocm93ID0gXCJ0aHJvd1wiLFxufVxuXG5sZXQgY3VycmVudEFjdGlvbkNvbnRleHQ6IEFjdGlvbkNvbnRleHQgfCB1bmRlZmluZWRcblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50bHkgcnVubmluZyBhY3Rpb24gY29udGV4dCwgb3IgdW5kZWZpbmVkIGlmIG5vbmUuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRBY3Rpb25Db250ZXh0KCk6IEFjdGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY3VycmVudEFjdGlvbkNvbnRleHRcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBTZXRzIHRoZSBjdXJyZW50IGFjdGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBjdHggQ3VycmVudCBhY3Rpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEN1cnJlbnRBY3Rpb25Db250ZXh0KGN0eDogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBjdXJyZW50QWN0aW9uQ29udGV4dCA9IGN0eFxufVxuIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsQWN0aW9uU3ltYm9sID0gU3ltYm9sKFwibW9kZWxBY3Rpb25cIilcblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIG1vZGVsIGFjdGlvbiBvciBub3QuXG4gKlxuICogQHBhcmFtIGZuIEZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxBY3Rpb24oZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiAmJiBtb2RlbEFjdGlvblN5bWJvbCBpbiBmblxufVxuIiwiLyoqXG4gKiBLZXkgd2hlcmUgbW9kZWwgc25hcHNob3RzIHdpbGwgc3RvcmUgbW9kZWwgdHlwZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsVHlwZUtleSA9IFwiJG1vZGVsVHlwZVwiXG5cbi8qKlxuICogS2V5IHRoYXQgc2VydmVzIGFzIHByb3h5IHRvIHRoZSBtb2RlbCBwcm9wZXJ0eSBkZXNpZ25lZCBhcyAnaWRQcm9wJyAoaWYgYW55KS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSWRLZXkgPSBcIiRtb2RlbElkXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBrZXkgaXMgYSByZXNlcnZlZCBrZXkgaW4gbW9kZWwgc25hcHNob3RzLlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc2VydmVkTW9kZWxLZXkoa2V5OiBzdHJpbmcpIHtcbiAgLy8gbm90ZSAkbW9kZWxJZCBpcyBOT1QgYSByZXNlcnZlZCBrZXksIHNpbmNlIGl0IHdpbGwgZXZlbnR1YWxseSBlbmQgdXAgaW4gdGhlIGRhdGFcbiAgLy8gYW5kIGNhbiBhY3R1YWxseSBiZSBjaGFuZ2VkXG4gIHJldHVybiBrZXkgPT09IG1vZGVsVHlwZUtleVxufVxuIiwiaW1wb3J0ICogYXMgbW9ieCBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBJT2JzZXJ2YWJsZUFycmF5LFxuICBpc09ic2VydmFibGVBcnJheSxcbiAgaXNPYnNlcnZhYmxlTWFwLFxuICBpc09ic2VydmFibGVPYmplY3QsXG4gIGlzT2JzZXJ2YWJsZVNldCxcbiAgT2JzZXJ2YWJsZU1hcCxcbiAgT2JzZXJ2YWJsZVNldCxcbn0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgSlNPTlByaW1pdGl2ZVZhbHVlLCBQcmltaXRpdmVWYWx1ZSB9IGZyb20gXCIuL3R5cGVzXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtc2cpXG5cbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVFcnJvcihtc2cpXG59XG5cbmNvbnN0IHdyaXRhYmxlSGlkZGVuUHJvcERlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IHtcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB2YWx1ZTogdW5kZWZpbmVkLFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSGlkZGVuUHJvcChvYmplY3Q6IGFueSwgcHJvcE5hbWU6IFByb3BlcnR5S2V5LCB2YWx1ZTogYW55LCB3cml0YWJsZSA9IHRydWUpIHtcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUsIHdyaXRhYmxlSGlkZGVuUHJvcERlc2NyaXB0b3IpXG4gICAgb2JqZWN0W3Byb3BOYW1lXSA9IHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZSxcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUHJvcFJlYWRvbmx5PFQ+KG9iamVjdDogVCwgcHJvcE5hbWU6IGtleW9mIFQsIGVudW1lcmFibGU6IGJvb2xlYW4pIHtcbiAgY29uc3QgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcE5hbWUpXG4gIGlmIChwcm9wRGVzYykge1xuICAgIHByb3BEZXNjLmVudW1lcmFibGUgPSBlbnVtZXJhYmxlXG4gICAgaWYgKHByb3BEZXNjLmdldCkge1xuICAgICAgZGVsZXRlIHByb3BEZXNjLnNldFxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wRGVzYy53cml0YWJsZSA9IGZhbHNlXG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BOYW1lLCBwcm9wRGVzYylcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlVmFsdWUge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSlNPTlByaW1pdGl2ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpTT05QcmltaXRpdmVWYWx1ZSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKVxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUZyb21BcnJheTxUPihhcnJheTogVFtdLCB2YWx1ZTogVCk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKHZhbHVlKVxuICBpZiAoaW5kZXggPj0gMCkge1xuICAgIGFycmF5LnNwbGljZShpbmRleCwgMSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXAodmFsOiB1bmtub3duKTogdmFsIGlzIE1hcDxhbnksIGFueT4gfCBPYnNlcnZhYmxlTWFwIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIE1hcCB8fCBpc09ic2VydmFibGVNYXAodmFsKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXQodmFsOiB1bmtub3duKTogdmFsIGlzIFNldDxhbnk+IHwgT2JzZXJ2YWJsZVNldCB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBTZXQgfHwgaXNPYnNlcnZhYmxlU2V0KHZhbClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsOiB1bmtub3duKTogdmFsIGlzIGFueVtdIHwgSU9ic2VydmFibGVBcnJheSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgfHwgaXNPYnNlcnZhYmxlQXJyYXkodmFsKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5EZXZNb2RlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc09iamVjdCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBvYmplY3Qge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhbiBvYmplY3RgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIG9iamVjdCB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBwbGFpbiBvYmplY3RgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc09ic2VydmFibGVPYmplY3QodmFsdWU6IHVua25vd24sIGFyZ05hbWU6IHN0cmluZyk6IGFzc2VydHMgdmFsdWUgaXMgb2JqZWN0IHtcbiAgaWYgKCFpc09ic2VydmFibGVPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGFuIG9ic2VydmFibGUgb2JqZWN0YClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXkoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmdcbik6IGFzc2VydHMgdmFsdWUgaXMgSU9ic2VydmFibGVBcnJheSB7XG4gIGlmICghaXNPYnNlcnZhYmxlQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGFuIG9ic2VydmFibGUgYXJyYXlgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc01hcCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBNYXA8YW55LCBhbnk+IHtcbiAgaWYgKCFpc01hcCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBtYXBgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc1NldCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBTZXQ8YW55PiB7XG4gIGlmICghaXNTZXQodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgc2V0YClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNGdW5jdGlvbih2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBGdW5jdGlvbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIGZ1bmN0aW9uYClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNQcmltaXRpdmUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmdcbik6IGFzc2VydHMgdmFsdWUgaXMgUHJpbWl0aXZlVmFsdWUge1xuICBpZiAoIWlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHByaW1pdGl2ZWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzU3RyaW5nKHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBzdHJpbmdgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGVNZXRob2RPckZpZWxkRGF0YSB7XG4gIHRhcmdldDogYW55XG4gIHByb3BlcnR5S2V5OiBzdHJpbmdcbiAgYmFzZURlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IgJiB7IGluaXRpYWxpemVyPzogKCkgPT4gYW55IH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bkFmdGVyTmV3U3ltYm9sID0gU3ltYm9sKFwicnVuQWZ0ZXJOZXdcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bkJlZm9yZU9uSW5pdFN5bWJvbCA9IFN5bWJvbChcInJ1bkJlZm9yZU9uSW5pdFwiKVxuXG50eXBlIFdyYXBGdW5jdGlvbiA9IChkYXRhOiBEZWNvcmF0ZU1ldGhvZE9yRmllbGREYXRhLCBmbjogYW55KSA9PiBhbnlcbnR5cGUgTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zQXJyYXkgPSAoKGluc3RhbmNlOiBhbnkpID0+IHZvaWQpW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uKFxuICB0YXJnZXQ6IGFueSxcbiAgc3ltYm9sOiBzeW1ib2wsXG4gIGZuOiAoaW5zdGFuY2U6IGFueSkgPT4gdm9pZFxuKSB7XG4gIGxldCBhcnJheTogTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zQXJyYXkgPSB0YXJnZXRbc3ltYm9sXVxuICBpZiAoIWFycmF5IHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBzeW1ib2wpKSB7XG4gICAgLy8gbGVhdmUgYmFzZSBhcnJheSB1bm1vZGlmaWVkLCBjcmVhdGUgbmV3IGFycmF5IGluIHRoZSBkZXJpdmVkIGNsYXNzXG4gICAgYXJyYXkgPSBhcnJheSA/IGFycmF5LnNsaWNlKCkgOiBbXVxuICAgIGFkZEhpZGRlblByb3AodGFyZ2V0LCBzeW1ib2wsIGFycmF5KVxuICB9XG4gIGFycmF5LnB1c2goZm4pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZVdyYXBNZXRob2RPckZpZWxkKFxuICBkZWNvcmF0b3JOYW1lOiBzdHJpbmcsXG4gIGRhdGE6IERlY29yYXRlTWV0aG9kT3JGaWVsZERhdGEsXG4gIHdyYXA6IFdyYXBGdW5jdGlvblxuKTogYW55IHtcbiAgY29uc3QgeyB0YXJnZXQsIHByb3BlcnR5S2V5LCBiYXNlRGVzY3JpcHRvciB9ID0gZGF0YVxuXG4gIGNvbnN0IGFkZEZpZWxkRGVjb3JhdG9yID0gKCkgPT4ge1xuICAgIGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uKHRhcmdldCwgcnVuQWZ0ZXJOZXdTeW1ib2wsIChpbnN0YW5jZSkgPT4ge1xuICAgICAgaW5zdGFuY2VbcHJvcGVydHlLZXldID0gd3JhcChkYXRhLCBpbnN0YW5jZVtwcm9wZXJ0eUtleV0pXG4gICAgfSlcbiAgfVxuXG4gIGlmIChiYXNlRGVzY3JpcHRvcikge1xuICAgIGlmIChiYXNlRGVzY3JpcHRvci5nZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgQCR7ZGVjb3JhdG9yTmFtZX0gY2Fubm90IGJlIHVzZWQgd2l0aCBnZXR0ZXJzYClcbiAgICB9XG5cbiAgICBpZiAoYmFzZURlc2NyaXB0b3IudmFsdWUpIHtcbiAgICAgIC8vIGJhYmVsIC8gdHlwZXNjcmlwdCAtIG1ldGhvZCBkZWNvcmF0b3JcbiAgICAgIC8vIEBhY3Rpb24gbWV0aG9kKCkgeyB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHdyYXAoZGF0YSwgYmFzZURlc2NyaXB0b3IudmFsdWUpLFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBiYWJlbCAtIGZpZWxkIGRlY29yYXRvcjogQGFjdGlvbiBtZXRob2QgPSAoKSA9PiB7fVxuICAgICAgYWRkRmllbGREZWNvcmF0b3IoKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB0eXBlc2NyaXB0IC0gZmllbGQgZGVjb3JhdG9yXG4gICAgYWRkRmllbGREZWNvcmF0b3IoKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnModGFyZ2V0OiBhbnksIHN5bWJvbDogc3ltYm9sKTogdm9pZCB7XG4gIGNvbnN0IGZuczogTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zQXJyYXkgfCB1bmRlZmluZWQgPSB0YXJnZXRbc3ltYm9sXVxuICBpZiAoZm5zKSB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmbnMpIHtcbiAgICAgIGZuKHRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgd2FybmluZ3NBbHJlYWR5RGlzcGxheWVkID0gbmV3IFNldDxzdHJpbmc+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ1dhcm5pbmcodHlwZTogXCJ3YXJuXCIgfCBcImVycm9yXCIsIG1zZzogc3RyaW5nLCB1bmlxdWVLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHVuaXF1ZUtleSkge1xuICAgIGlmICh3YXJuaW5nc0FscmVhZHlEaXNwbGF5ZWQuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB3YXJuaW5nc0FscmVhZHlEaXNwbGF5ZWQuYWRkKHVuaXF1ZUtleSlcbiAgfVxuXG4gIG1zZyA9IFwiW21vYngta2V5c3RvbmVdIFwiICsgbXNnXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICBjb25zb2xlLndhcm4obXNnKVxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgZmFpbHVyZShgdW5rbm93biBsb2cgdHlwZSAtICR7dHlwZX1gKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXp5PEEgZXh0ZW5kcyB1bmtub3duW10sIFI+KGdldHRlcjogKC4uLmFyZ3M6IEEpID0+IFIpOiB0eXBlb2YgZ2V0dGVyIHtcbiAgbGV0IG1lbW9pemVkVmFsdWU6IFJcbiAgbGV0IG1lbW9pemVkID0gZmFsc2VcblxuICByZXR1cm4gKC4uLmFyZ3M6IEEpOiBSID0+IHtcbiAgICBpZiAoIW1lbW9pemVkKSB7XG4gICAgICBtZW1vaXplZFZhbHVlID0gZ2V0dGVyKC4uLmFyZ3MpXG4gICAgICBtZW1vaXplZCA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIG1lbW9pemVkVmFsdWVcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaWRlbnRpdHlGbiA9IDxUPih4OiBUKTogVCA9PiB4XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBtb2J4NiA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY29uY2F0XG4gIG1ha2VPYnNlcnZhYmxlOiAobW9ieCBhcyBhbnkpW1xuICAgIC8vIGp1c3QgdG8gZW5zdXJlIGltcG9ydCAqIGlzIGtlcHQgcHJvcGVybHlcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKFwibFwiLmNoYXJDb2RlQXQoMCkgKyAxKSArIFwiYWtlT2JzZXJ2YWJsZVwiXG4gIF0sXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTmFtZVRvU2V0dGVyTmFtZShwcm9wTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBzZXQke3Byb3BOYW1lWzBdLnRvVXBwZXJDYXNlKCl9JHtwcm9wTmFtZS5zbGljZSgxKX1gXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2J4VmVyc2lvbigpOiBudW1iZXIge1xuICBpZiAobW9ieDYubWFrZU9ic2VydmFibGUhKSB7XG4gICAgcmV0dXJuIDZcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gNVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBuYW1lc3BhY2UgPSBcIm1vYngta2V5c3RvbmVcIlxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBGbGF0dGVuLCBJc05ldmVyVHlwZSB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90Q3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGEsXG4gIE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG59IGZyb20gXCIuL3Byb3BcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3BzVHlwZVN5bWJvbCA9IFN5bWJvbChcInByb3BzVHlwZVwiKVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IGZyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbCA9IFN5bWJvbChcImZyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVwiKVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IHRvU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2wgPSBTeW1ib2woXCJ0b1NuYXBzaG90T3ZlcnJpZGVUeXBlXCIpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBtb2RlbEluaXRpYWxpemVkU3ltYm9sID0gU3ltYm9sKFwibW9kZWxJbml0aWFsaXplZFwiKVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBpbnN0YW5jZSB0eXBlIG9mIGEgbW9kZWwgY2xhc3MuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsQ2xhc3M8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IHtcbiAgbmV3IChpbml0aWFsRGF0YTogYW55KTogTVxuXG4gIGZyb21TbmFwc2hvdFByb2Nlc3Nvcj8oc246IGFueSk6IGFueVxuICB0b1NuYXBzaG90UHJvY2Vzc29yPyhzbjogYW55LCBtb2RlbEluc3RhbmNlOiBhbnkpOiBhbnlcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgaW5zdGFuY2UgdHlwZSBvZiBhbiBhYnN0cmFjdCBtb2RlbCBjbGFzcy5cbiAqL1xuZXhwb3J0IHR5cGUgQWJzdHJhY3RNb2RlbENsYXNzPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPSBhYnN0cmFjdCBuZXcgKFxuICBpbml0aWFsRGF0YTogYW55XG4pID0+IE1cblxuLyoqXG4gKiBUaGUgcHJvcHMgb2YgYSBtb2RlbC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc09mPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPSBNW3R5cGVvZiBwcm9wc1R5cGVTeW1ib2xdXG5cbi8qKlxuICogVGhlIGRhdGEgdHlwZSBvZiBhIG1vZGVsLCB3aXRob3V0IHRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbFVudHJhbnNmb3JtZWREYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPSBGbGF0dGVuPE1bXCIkXCJdPlxuXG4vKipcbiAqIFRoZSBjcmVhdGlvbiBkYXRhIHR5cGUgb2YgYSBtb2RlbCwgd2l0aG91dCB0cmFuc2Zvcm1hdGlvbnMgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxVbnRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPVxuICBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE1vZGVsUHJvcHNPZjxNPj5cblxuLyoqXG4gKiBUaGUgZGF0YSB0eXBlIG9mIGEgbW9kZWwsIHdpdGggdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsRGF0YTxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+ID0gTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhPFxuICBNb2RlbFByb3BzT2Y8TT5cbj5cblxuLyoqXG4gKiBUaGUgY3JlYXRpb24gZGF0YSB0eXBlIG9mIGEgbW9kZWwsIHdpdGggdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsQ3JlYXRpb25EYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPVxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxNb2RlbFByb3BzT2Y8TT4+XG5cbi8qKlxuICogVGhlIGZyb20gc25hcHNob3QgdHlwZSBvZiBhIG1vZGVsLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTbmFwc2hvdEluT2Y8TW9kZWw+IGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsRnJvbVNuYXBzaG90PE0gZXh0ZW5kcyBBbnlNb2RlbD4gPSBJc05ldmVyVHlwZTxcbiAgTVt0eXBlb2YgZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXSxcbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGE8TW9kZWxQcm9wc09mPE0+PixcbiAgTVt0eXBlb2YgZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXVxuPiAmIHsgW21vZGVsVHlwZUtleV0/OiBzdHJpbmcgfVxuXG4vKipcbiAqIFRoZSB0byBzbmFwc2hvdCB0eXBlIG9mIGEgbW9kZWwuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFNuYXBzaG90T3V0T2Y8TW9kZWw+IGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsVG9TbmFwc2hvdDxNIGV4dGVuZHMgQW55TW9kZWw+ID0gSXNOZXZlclR5cGU8XG4gIE1bdHlwZW9mIHRvU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGE8TW9kZWxQcm9wc09mPE0+PixcbiAgTVt0eXBlb2YgdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF1cbj4gJiB7IFttb2RlbFR5cGVLZXldPzogc3RyaW5nIH1cblxuLyoqXG4gKiBUcmlja3MgVHlwZVNjcmlwdCBpbnRvIGFjY2VwdGluZyBhIHBhcnRpY3VsYXIga2luZCBvZiBnZW5lcmljIGNsYXNzIGFzIGEgcGFyYW1ldGVyIGZvciBgRXh0ZW5kZWRNb2RlbGAuXG4gKiBEb2VzIG5vdGhpbmcgaW4gcnVudGltZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgR2VuZXJpYyBtb2RlbCBjbGFzcyB0eXBlLlxuICogQHBhcmFtIHR5cGUgR2VuZXJpYyBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbENsYXNzPFQgZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4odHlwZToge1xuICBwcm90b3R5cGU6IFRcbn0pOiBNb2RlbENsYXNzPFQ+IHtcbiAgcmV0dXJuIHR5cGUgYXMgYW55XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi9CYXNlTW9kZWxTaGFyZWRcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsSW5mbyB7XG4gIG5hbWU6IHN0cmluZ1xuICBjbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSW5mb0J5TmFtZToge1xuICBbbmFtZTogc3RyaW5nXTogTW9kZWxJbmZvXG59ID0ge31cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSW5mb0J5Q2xhc3MgPSBuZXcgTWFwPE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+LCBNb2RlbEluZm8+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSW5mb0Zvck5hbWUobmFtZTogc3RyaW5nKTogTW9kZWxJbmZvIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG1vZGVsSW5mb0J5TmFtZVtuYW1lXVxufVxuIiwidHlwZSBBbnlNYXA8ViA9IGFueT4gPSBNYXA8YW55LCBWPiB8IFdlYWtNYXA8YW55LCBWPlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JDcmVhdGU8SywgViwgQyA9IFY+KG1hcDogTWFwPEssIFY+LCBrZXk6IEssIGNyZWF0ZTogKCkgPT4gQyk6IFZcbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZTxLIGV4dGVuZHMgb2JqZWN0LCBWLCBDID0gVj4oXG4gIG1hcDogV2Vha01hcDxLLCBWPixcbiAga2V5OiBLLFxuICBjcmVhdGU6ICgpID0+IENcbik6IFZcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yQ3JlYXRlPFY+KG1hcDogQW55TWFwPFY+LCBrZXk6IGFueSwgY3JlYXRlOiAoKSA9PiBWKSB7XG4gIGxldCB2YWx1ZSA9IG1hcC5nZXQoa2V5KVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gY3JlYXRlKClcbiAgICBtYXAuc2V0KGtleSwgdmFsdWUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG4iLCJpbXBvcnQgeyBjcmVhdGVBdG9tLCBJQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQYXJlbnRQYXRoIH0gZnJvbSBcIi4vcGF0aFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBvYmplY3RQYXJlbnRzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBQYXJlbnRQYXRoPG9iamVjdD4gfCB1bmRlZmluZWQ+KClcblxuY29uc3Qgb2JqZWN0UGFyZW50c0F0b21zID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyZW50UGF0aEVxdWFscyhcbiAgcGFyZW50UGF0aDE6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcbiAgcGFyZW50UGF0aDI6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcbiAgY29tcGFyZVBhdGggPSB0cnVlXG4pIHtcbiAgaWYgKCFwYXJlbnRQYXRoMSAmJiAhcGFyZW50UGF0aDIpIHJldHVybiB0cnVlXG4gIGlmICghcGFyZW50UGF0aDEgfHwgIXBhcmVudFBhdGgyKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgcGFyZW50RXF1YWxzID0gcGFyZW50UGF0aDEucGFyZW50ID09PSBwYXJlbnRQYXRoMi5wYXJlbnRcbiAgaWYgKCFwYXJlbnRFcXVhbHMpIHJldHVybiBmYWxzZVxuICByZXR1cm4gY29tcGFyZVBhdGggPyBwYXJlbnRQYXRoMS5wYXRoID09PSBwYXJlbnRQYXRoMi5wYXRoIDogdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXJlbnRQYXRoQXRvbShvYmo6IG9iamVjdCkge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUob2JqZWN0UGFyZW50c0F0b21zLCBvYmosICgpID0+IGNyZWF0ZUF0b20oXCJwYXJlbnRBdG9tXCIpKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0UGFyZW50UGF0aE9ic2VydmVkKG5vZGU6IG9iamVjdCkge1xuICBjcmVhdGVQYXJlbnRQYXRoQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRQYXJlbnRQYXRoQ2hhbmdlZChub2RlOiBvYmplY3QpIHtcbiAgY3JlYXRlUGFyZW50UGF0aEF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkYXRhT2JqZWN0UGFyZW50ID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3Q+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFUb01vZGVsTm9kZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBUKTogVCB7XG4gIGNvbnN0IG1vZGVsTm9kZSA9IGRhdGFPYmplY3RQYXJlbnQuZ2V0KG5vZGUpXG4gIHJldHVybiAobW9kZWxOb2RlIGFzIFQpID8/IG5vZGVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsVG9EYXRhTm9kZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBUKTogVCB7XG4gIHJldHVybiBpc01vZGVsKG5vZGUpID8gbm9kZS4kIDogbm9kZVxufVxuIiwiaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBkYXRhT2JqZWN0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHR3ZWFrZWRPYmplY3RzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCB1bmRlZmluZWQgfCAoKCkgPT4gdm9pZCk+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHdlYWtlZE9iamVjdCh2YWx1ZTogdW5rbm93biwgY2FuQmVEYXRhT2JqZWN0OiBib29sZWFuKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgaWYgKCFjYW5CZURhdGFPYmplY3QgJiYgZGF0YU9iamVjdFBhcmVudC5oYXModmFsdWUgYXMgb2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0d2Vha2VkT2JqZWN0cy5oYXModmFsdWUgYXMgb2JqZWN0KVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIG9iamVjdCBpcyBub3cgYSB0cmVlIG5vZGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIHRyZWUgbm9kZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmVlTm9kZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhaXNQcmltaXRpdmUodmFsdWUpICYmIGlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgZmFsc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUd2Vha2VkT2JqZWN0KFxuICB0cmVlTm9kZTogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nLFxuICBjYW5CZURhdGFPYmplY3QgPSBmYWxzZVxuKTogYXNzZXJ0cyB0cmVlTm9kZSBpcyBvYmplY3Qge1xuICBpZiAoIWNhbkJlRGF0YU9iamVjdCAmJiBkYXRhT2JqZWN0UGFyZW50Lmhhcyh0cmVlTm9kZSBhcyBvYmplY3QpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIHRoZSBtb2RlbCBvYmplY3QgaW5zdGFuY2UgaW5zdGVhZCBvZiB0aGUgJyQnIHN1Yi1vYmplY3RgKVxuICB9XG4gIGlmIChpc1ByaW1pdGl2ZSh0cmVlTm9kZSkgfHwgIWlzVHdlYWtlZE9iamVjdCh0cmVlTm9kZSwgdHJ1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHRyZWUgbm9kZSAodXN1YWxseSBhIG1vZGVsIG9yIGEgc2hhbGxvdyAvIGRlZXAgY2hpbGQgcGFydCBvZiBhIG1vZGVsICdkYXRhJyBvYmplY3QpYFxuICAgIClcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgYSBnaXZlbiBvYmplY3QgaXMgbm93IGEgdHJlZSBub2RlLCBvciB0aHJvd3Mgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSBhcmdOYW1lIEFyZ3VtZW50IG5hbWUsIHBhcnQgb2YgdGhlIHRocm93biBlcnJvciBkZXNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzVHJlZU5vZGUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcgPSBcImFyZ3VtZW50XCJcbik6IGFzc2VydHMgdmFsdWUgaXMgb2JqZWN0IHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgYXJnTmFtZSwgZmFsc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBsZXQgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyA9IGZhbHNlXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRob3V0U25hcHNob3RPclBhdGNoZXMoZm46ICgpID0+IHZvaWQpIHtcbiAgY29uc3Qgb2xkID0gcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlc1xuICBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzID0gdHJ1ZVxuICB0cnkge1xuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgIGZuKClcbiAgICB9KVxuICB9IGZpbmFsbHkge1xuICAgIHJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgPSBvbGRcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IG1vZGVsTWV0YWRhdGFTeW1ib2wgPSBTeW1ib2woXCJtb2RlbE1ldGFkYXRhXCIpXG5leHBvcnQgY29uc3QgbW9kZWxVbndyYXBwZWRDbGFzc1N5bWJvbCA9IFN5bWJvbChcIm1vZGVsVW53cmFwcGVkQ2xhc3NcIilcbmV4cG9ydCBjb25zdCBydW5BZnRlck1vZGVsRGVjb3JhdG9yU3ltYm9sID0gU3ltYm9sKFwicnVuQWZ0ZXJNb2RlbERlY29yYXRvclwiKVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbE1ldGFkYXRhU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgaXNNb2RlbCwgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEFzc29jaWF0ZWQgbW9kZWwgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBBc3NvY2lhdGVkIGRhdGEgdHlwZSBmb3IgcnVudGltZSBjaGVja2luZyAoaWYgYW55KS5cbiAgICovXG4gIGRhdGFUeXBlPzogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSB1c2VkIGFzIG1vZGVsIGlkLlxuICAgKi9cbiAgbW9kZWxJZFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogQSB2YWx1ZSB0eXBlIHdpbGwgYmUgY2xvbmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBiZWluZyBhdHRhY2hlZCB0byBhIG5ldyB0cmVlLlxuICAgKi9cbiAgdmFsdWVUeXBlOiBib29sZWFuXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBmb3IgYSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gbW9kZWxDbGFzc09ySW5zdGFuY2UgTW9kZWwgY2xhc3Mgb3IgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsTWV0YWRhdGEoXG4gIG1vZGVsQ2xhc3NPckluc3RhbmNlOiBBbnlNb2RlbCB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+XG4pOiBNb2RlbE1ldGFkYXRhIHtcbiAgaWYgKGlzTW9kZWwobW9kZWxDbGFzc09ySW5zdGFuY2UpKSB7XG4gICAgcmV0dXJuIChtb2RlbENsYXNzT3JJbnN0YW5jZSBhcyBhbnkpLmNvbnN0cnVjdG9yW21vZGVsTWV0YWRhdGFTeW1ib2xdXG4gIH0gZWxzZSBpZiAoaXNNb2RlbENsYXNzKG1vZGVsQ2xhc3NPckluc3RhbmNlKSkge1xuICAgIHJldHVybiAobW9kZWxDbGFzc09ySW5zdGFuY2UgYXMgYW55KVttb2RlbE1ldGFkYXRhU3ltYm9sXVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoYG1vZGVsQ2xhc3NPckluc3RhbmNlIG11c3QgYmUgYSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZWApXG4gIH1cbn1cblxuY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZUNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUobW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUoXG4gICAgbW9kZWxJZFByb3BlcnR5TmFtZUNhY2hlLFxuICAgIG1vZGVsQ2xhc3MsXG4gICAgKCkgPT4gZ2V0TW9kZWxNZXRhZGF0YShtb2RlbENsYXNzKS5tb2RlbElkUHJvcGVydHlcbiAgKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4vQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxQcm9wcyB9IGZyb20gXCIuL3Byb3BcIlxuXG5jb25zdCBtb2RlbFByb3BlcnRpZXNTeW1ib2wgPSBTeW1ib2woXCJtb2RlbFByb3BlcnRpZXNcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBHZXRzIHRoZSBpbmZvIHJlbGF0ZWQgdG8gYSBtb2RlbCBjbGFzcyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBtb2RlbENsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8oXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+XG4pOiBNb2RlbFByb3BzIHtcbiAgcmV0dXJuIChtb2RlbENsYXNzIGFzIGFueSlbbW9kZWxQcm9wZXJ0aWVzU3ltYm9sXVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFNldHMgdGhlIGluZm8gcmVsYXRlZCB0byBhIG1vZGVsIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIG1vZGVsQ2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4sXG4gIHByb3BzOiBNb2RlbFByb3BzXG4pOiB2b2lkIHtcbiAgOyhtb2RlbENsYXNzIGFzIGFueSlbbW9kZWxQcm9wZXJ0aWVzU3ltYm9sXSA9IHByb3BzXG59XG4iLCJpbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZiwgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuLi9zbmFwc2hvdC9TbmFwc2hvdE9mXCJcbmltcG9ydCB0eXBlIHsgTGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgdHlwZSB7IEZsYXR0ZW4sIElzTmV2ZXJUeXBlLCBJc09wdGlvbmFsVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvdHlwZXNcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IG5vRGVmYXVsdFZhbHVlID0gU3ltYm9sKFwibm9EZWZhdWx0VmFsdWVcIilcblxuLyoqXG4gKiBBIG1vZGVsIHByb3BlcnR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJvcDxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BDcmVhdGlvblZhbHVlLFxuICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZSxcbiAgVElzUmVxdWlyZWQsXG4gIFRJc0lkIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBUSGFzU2V0dGVyID0gbmV2ZXIsXG4gIFRGcm9tU25hcHNob3RPdmVycmlkZSA9IG5ldmVyLFxuICBUVG9TbmFwc2hvdE92ZXJyaWRlID0gbmV2ZXJcbj4ge1xuICBfaW50ZXJuYWw6IHtcbiAgICAkdmFsdWVUeXBlOiBUUHJvcFZhbHVlXG4gICAgJGNyZWF0aW9uVmFsdWVUeXBlOiBUUHJvcENyZWF0aW9uVmFsdWVcbiAgICAkdHJhbnNmb3JtZWRWYWx1ZVR5cGU6IFRUcmFuc2Zvcm1lZFZhbHVlXG4gICAgJHRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVR5cGU6IFRUcmFuc2Zvcm1lZENyZWF0aW9uVmFsdWVcbiAgICAkaXNSZXF1aXJlZDogVElzUmVxdWlyZWRcbiAgICAkaXNJZDogVElzSWRcbiAgICAkaGFzU2V0dGVyOiBUSGFzU2V0dGVyXG4gICAgJGZyb21TbmFwc2hvdE92ZXJyaWRlOiBURnJvbVNuYXBzaG90T3ZlcnJpZGVcbiAgICAkdG9TbmFwc2hvdE92ZXJyaWRlOiBUVG9TbmFwc2hvdE92ZXJyaWRlXG5cbiAgICBkZWZhdWx0Rm46ICgoKSA9PiBUUHJvcFZhbHVlKSB8IHR5cGVvZiBub0RlZmF1bHRWYWx1ZVxuICAgIGRlZmF1bHRWYWx1ZTogVFByb3BWYWx1ZSB8IHR5cGVvZiBub0RlZmF1bHRWYWx1ZVxuICAgIHR5cGVDaGVja2VyOiBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlciB8IHVuZGVmaW5lZFxuICAgIHNldHRlcjogYm9vbGVhbiB8IFwiYXNzaWduXCJcbiAgICBpc0lkOiBib29sZWFuXG4gICAgdHJhbnNmb3JtOlxuICAgICAgfCB7XG4gICAgICAgICAgdHJhbnNmb3JtKFxuICAgICAgICAgICAgb3JpZ2luYWw6IHVua25vd24sXG4gICAgICAgICAgICBtb2RlbDogb2JqZWN0LFxuICAgICAgICAgICAgcHJvcE5hbWU6IFByb3BlcnR5S2V5LFxuICAgICAgICAgICAgc2V0T3JpZ2luYWxWYWx1ZTogKG5ld09yaWdpbmFsVmFsdWU6IHVua25vd24pID0+IHZvaWRcbiAgICAgICAgICApOiB1bmtub3duXG4gICAgICAgICAgdW50cmFuc2Zvcm0odHJhbnNmb3JtZWQ6IHVua25vd24sIG1vZGVsOiBvYmplY3QsIHByb3BOYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd25cbiAgICAgICAgfVxuICAgICAgfCB1bmRlZmluZWRcbiAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I/KHNuOiB1bmtub3duKTogdW5rbm93blxuICAgIHRvU25hcHNob3RQcm9jZXNzb3I/KHNuOiB1bmtub3duKTogdW5rbm93blxuICB9XG5cbiAgd2l0aFNldHRlcigpOiBNb2RlbFByb3A8XG4gICAgVFByb3BWYWx1ZSxcbiAgICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZSxcbiAgICBUSXNSZXF1aXJlZCxcbiAgICBUSXNJZCxcbiAgICBzdHJpbmcsXG4gICAgVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRUb1NuYXBzaG90T3ZlcnJpZGVcbiAgPlxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2V0dGVyIG1ldGhvZHMgYXJlIHByZWZlcnJlZC5cbiAgICovXG4gIHdpdGhTZXR0ZXIoXG4gICAgbW9kZTogXCJhc3NpZ25cIlxuICApOiBNb2RlbFByb3A8XG4gICAgVFByb3BWYWx1ZSxcbiAgICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkVmFsdWUsXG4gICAgVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZSxcbiAgICBUSXNSZXF1aXJlZCxcbiAgICBUSXNJZCxcbiAgICBzdHJpbmcsXG4gICAgVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRUb1NuYXBzaG90T3ZlcnJpZGVcbiAgPlxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdHJhbnNmb3JtIGZvciB0aGUgcHJvcGVydHkgaW5zdGFuY2UgdmFsdWUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gVFRWIFRyYW5zZm9ybWVkIHZhbHVlIHR5cGUuXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm0gVHJhbnNmb3JtIHRvIGJlIHVzZWQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB3aXRoVHJhbnNmb3JtPFRUVj4oXG4gICAgdHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08Tm9uTnVsbGFibGU8VFByb3BWYWx1ZT4sIFRUVj5cbiAgKTogTW9kZWxQcm9wPFxuICAgIFRQcm9wVmFsdWUsXG4gICAgVFByb3BDcmVhdGlvblZhbHVlLFxuICAgIFRUViB8IEV4dHJhY3Q8VFByb3BWYWx1ZSwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gICAgVFRWIHwgRXh0cmFjdDxUUHJvcENyZWF0aW9uVmFsdWUsIG51bGwgfCB1bmRlZmluZWQ+LFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIFRIYXNTZXR0ZXIsXG4gICAgVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRUb1NuYXBzaG90T3ZlcnJpZGVcbiAgPlxuXG4gIHdpdGhTbmFwc2hvdFByb2Nlc3NvcjxcbiAgICBGUyA9IFRGcm9tU25hcHNob3RPdmVycmlkZSxcbiAgICBUUyA9IFRUb1NuYXBzaG90T3ZlcnJpZGUsXG4gICAgVGhpcyBleHRlbmRzIEFueU1vZGVsUHJvcCA9IHRoaXNcbiAgPihwcm9jZXNzb3I6IHtcbiAgICBmcm9tU25hcHNob3Q/KHNuOiBGUyk6IE1vZGVsUHJvcEZyb21TbmFwc2hvdDxUaGlzPlxuICAgIHRvU25hcHNob3Q/KHNuOiBNb2RlbFByb3BUb1NuYXBzaG90PFRoaXM+KTogVFNcbiAgfSk6IE1vZGVsUHJvcDxcbiAgICBUUHJvcFZhbHVlLFxuICAgIFRQcm9wQ3JlYXRpb25WYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIFRIYXNTZXR0ZXIsXG4gICAgRlMsXG4gICAgVFNcbiAgPlxufVxuXG4vKipcbiAqIFRoZSBzbmFwc2hvdCBpbiB0eXBlIG9mIGEgbW9kZWwgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcEZyb21TbmFwc2hvdDxNUCBleHRlbmRzIEFueU1vZGVsUHJvcD4gPSBJc05ldmVyVHlwZTxcbiAgTVBbXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl0sXG4gIFNuYXBzaG90SW5PZjxNUFtcIl9pbnRlcm5hbFwiXVtcIiRjcmVhdGlvblZhbHVlVHlwZVwiXT4sXG4gIE1QW1wiX2ludGVybmFsXCJdW1wiJGZyb21TbmFwc2hvdE92ZXJyaWRlXCJdXG4+XG5cbi8qKlxuICogVGhlIHNuYXBzaG90IG91dCB0eXBlIG9mIGEgbW9kZWwgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcFRvU25hcHNob3Q8TVAgZXh0ZW5kcyBBbnlNb2RlbFByb3A+ID0gSXNOZXZlclR5cGU8XG4gIE1QW1wiX2ludGVybmFsXCJdW1wiJHRvU25hcHNob3RPdmVycmlkZVwiXSxcbiAgU25hcHNob3RPdXRPZjxNUFtcIl9pbnRlcm5hbFwiXVtcIiR2YWx1ZVR5cGVcIl0+LFxuICBNUFtcIl9pbnRlcm5hbFwiXVtcIiR0b1NuYXBzaG90T3ZlcnJpZGVcIl1cbj5cblxuLyoqXG4gKiBBIG1vZGVsIHByb3AgdHJhbnNmb3JtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJvcFRyYW5zZm9ybTxUT3JpZ2luYWwsIFRUcmFuc2Zvcm1lZD4ge1xuICB0cmFuc2Zvcm0ocGFyYW1zOiB7XG4gICAgb3JpZ2luYWxWYWx1ZTogVE9yaWdpbmFsXG4gICAgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogVFRyYW5zZm9ybWVkIHwgdW5kZWZpbmVkXG4gICAgc2V0T3JpZ2luYWxWYWx1ZSh2YWx1ZTogVE9yaWdpbmFsKTogdm9pZFxuICB9KTogVFRyYW5zZm9ybWVkXG5cbiAgdW50cmFuc2Zvcm0ocGFyYW1zOiB7IHRyYW5zZm9ybWVkVmFsdWU6IFRUcmFuc2Zvcm1lZDsgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKCk6IHZvaWQgfSk6IFRPcmlnaW5hbFxufVxuXG4vKipcbiAqIEFueSBtb2RlbCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IHR5cGUgQW55TW9kZWxQcm9wID0gTW9kZWxQcm9wPGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnk+XG5cbi8qKlxuICogTW9kZWwgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFByb3BzIHtcbiAgW2s6IHN0cmluZ106IEFueU1vZGVsUHJvcFxufVxuXG5leHBvcnQgdHlwZSBSZXF1aXJlZE1vZGVsUHJvcHM8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IHtcbiAgW0sgaW4ga2V5b2YgTVBdOiBNUFtLXVtcIl9pbnRlcm5hbFwiXVtcIiRpc1JlcXVpcmVkXCJdICYgS1xufVtrZXlvZiBNUF1cblxuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZERhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IEZsYXR0ZW48e1xuICBbayBpbiBrZXlvZiBNUF06IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJHZhbHVlVHlwZVwiXVxufT5cblxuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvU25hcHNob3REYXRhPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBGbGF0dGVuPHtcbiAgW2sgaW4ga2V5b2YgTVBdOiBNb2RlbFByb3BUb1NuYXBzaG90PE1QW2tdPiBleHRlbmRzIGluZmVyIFIgPyBSIDogbmV2ZXJcbn0+XG5cbi8vIHdlIGRvbid0IHVzZSBPLk9wdGlvbmFsIGFueW1vcmUgc2luY2UgaXQgZ2VuZXJhdGVzIHVuaW9ucyB0b28gaGVhdnlcbi8vIGFsc28gaWYgd2UgdXNlIHBpY2sgb3ZlciB0aGUgb3B0aW9uYWwgcHJvcHMgd2Ugd2lsbCBsb29zZSB0aGUgYWJpbGl0eVxuLy8gdG8gaW5mZXIgZ2VuZXJpY3Ncbi8vIHdlIGFsc28gZG9uJ3QgdXNlIEZsYXR0ZW4gYmVjYXVzZSBpZiB3ZSBkbyBzb21lIGdlbmVyaWNzIHdvbid0IHdvcmtcbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IHtcbiAgW2sgaW4ga2V5b2YgTVBdPzogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkY3JlYXRpb25WYWx1ZVR5cGVcIl1cbn0gJiB7XG4gIFtrIGluIFJlcXVpcmVkTW9kZWxQcm9wczxNUD5dOiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiRjcmVhdGlvblZhbHVlVHlwZVwiXVxufVxuXG4vLyB3ZSBkb24ndCB1c2UgTy5PcHRpb25hbCBhbnltb3JlIHNpbmNlIGl0IGdlbmVyYXRlcyB1bmlvbnMgdG9vIGhlYXZ5XG4vLyBhbHNvIGlmIHdlIHVzZSBwaWNrIG92ZXIgdGhlIG9wdGlvbmFsIHByb3BzIHdlIHdpbGwgbG9vc2UgdGhlIGFiaWxpdHlcbi8vIHRvIGluZmVyIGdlbmVyaWNzXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjxcbiAge1xuICAgIFtrIGluIGtleW9mIE1QXT86IE1vZGVsUHJvcEZyb21TbmFwc2hvdDxNUFtrXT4gZXh0ZW5kcyBpbmZlciBSID8gUiA6IG5ldmVyXG4gIH0gJiB7XG4gICAgW2sgaW4ge1xuICAgICAgW0sgaW4ga2V5b2YgTVBdOiBJc05ldmVyVHlwZTxcbiAgICAgICAgTVBbS11bXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl0sXG4gICAgICAgIE1QW0tdW1wiX2ludGVybmFsXCJdW1wiJGlzUmVxdWlyZWRcIl0gJiBLLCAvLyBubyBvdmVycmlkZVxuICAgICAgICBJc09wdGlvbmFsVmFsdWU8TVBbS11bXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl0sIG5ldmVyLCBLPiAvLyB3aXRoIG92ZXJyaWRlXG4gICAgICA+XG4gICAgfVtrZXlvZiBNUF1dOiBNb2RlbFByb3BGcm9tU25hcHNob3Q8TVBba10+IGV4dGVuZHMgaW5mZXIgUiA/IFIgOiBuZXZlclxuICB9XG4+XG5cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjx7XG4gIFtrIGluIGtleW9mIE1QXTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdHJhbnNmb3JtZWRWYWx1ZVR5cGVcIl1cbn0+XG5cbi8vIHdlIGRvbid0IHVzZSBPLk9wdGlvbmFsIGFueW1vcmUgc2luY2UgaXQgZ2VuZXJhdGVzIHVuaW9ucyB0b28gaGVhdnlcbi8vIGFsc28gaWYgd2UgdXNlIHBpY2sgb3ZlciB0aGUgb3B0aW9uYWwgcHJvcHMgd2Ugd2lsbCBsb29zZSB0aGUgYWJpbGl0eVxuLy8gdG8gaW5mZXIgZ2VuZXJpY3Ncbi8vIHdlIGFsc28gZG9uJ3QgdXNlIEZsYXR0ZW4gYmVjYXVzZSBpZiB3ZSBkbyBzb21lIGdlbmVyaWNzIHdvbid0IHdvcmtcbi8vIHdlIGFsc28gZG9uJ3QgdXNlIE9taXQgYmVjYXVzZSBpZiB3ZSBkbyBzb21lIGdlbmVyaWNzIHdvbid0IHdvcmtcbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSB7XG4gIFtrIGluIGtleW9mIE1QXT86IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJHRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVR5cGVcIl1cbn0gJiB7XG4gIFtrIGluIFJlcXVpcmVkTW9kZWxQcm9wczxNUD5dOiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiR0cmFuc2Zvcm1lZENyZWF0aW9uVmFsdWVUeXBlXCJdXG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1NldHRlcjxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjx7XG4gIFtrIGluIGtleW9mIE1QIGFzIE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJGhhc1NldHRlclwiXSAmIGBzZXQke0NhcGl0YWxpemU8ayAmIHN0cmluZz59YF06IChcbiAgICB2YWx1ZTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdHJhbnNmb3JtZWRWYWx1ZVR5cGVcIl1cbiAgKSA9PiB2b2lkXG59PlxuXG5leHBvcnQgdHlwZSBNb2RlbElkUHJvcCA9IE1vZGVsUHJvcDxcbiAgc3RyaW5nLFxuICBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHN0cmluZyxcbiAgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBuZXZlciwgLy8gbm90IHJlcXVpcmVkXG4gIHRydWVcbj5cblxuLyoqXG4gKiBBIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGFzIG1vZGVsIGlkLCBhY2Nlc3NpYmxlIHRocm91Z2ggJG1vZGVsSWQuXG4gKiBDYW4gb25seSBiZSB1c2VkIGluIG1vZGVscyBhbmQgdGhlcmUgY2FuIGJlIG9ubHkgb25lIHBlciBtb2RlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlkUHJvcCA9IHtcbiAgX2ludGVybmFsOiB7XG4gICAgc2V0dGVyOiBmYWxzZSxcbiAgICBpc0lkOiB0cnVlLFxuICB9LFxuXG4gIHdpdGhTZXR0ZXIobW9kZT86IGJvb2xlYW4gfCBcImFzc2lnblwiKSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcywgX2ludGVybmFsOiB7IC4uLnRoaXMuX2ludGVybmFsLCBzZXR0ZXI6IG1vZGUgPz8gdHJ1ZSB9IH1cbiAgfSxcbn0gYXMgYW55IGFzIE1vZGVsSWRQcm9wXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgdHlwZSBPbmx5UHJpbWl0aXZlczxUPiA9IEV4Y2x1ZGU8VCwgb2JqZWN0PlxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcCB0aGF0IG1heWJlIC8gbWF5YmUgbm90IGlzIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gaWYgdGhlIHZhbHVlIGNhbiB0YWtlIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWF5YmVPcHRpb25hbE1vZGVsUHJvcDxUUHJvcFZhbHVlPiA9IE1vZGVsUHJvcDxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSxcbiAgSXNPcHRpb25hbFZhbHVlPFRQcm9wVmFsdWUsIG5ldmVyLCBzdHJpbmc+IC8vIGNhbGN1bGF0ZSBpZiByZXF1aXJlZFxuPlxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcCB0aGF0IGlzIGRlZmluaXRlbHkgb3B0aW9uYWwuXG4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvbmFsTW9kZWxQcm9wPFRQcm9wVmFsdWU+ID0gTW9kZWxQcm9wPFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG5ldmVyIC8vIG5vdCByZXF1aXJlZFxuPlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSwgd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgdmFsdWVcbiAqIGlmIHRoZSBpbnB1dCBzbmFwc2hvdCAvIG1vZGVsIGNyZWF0aW9uIGRhdGEgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogcHJvcCgoKSA9PiAxMCkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiAxMFxuICogeDogcHJvcDxudW1iZXJbXT4oKCkgPT4gW10pIC8vIGFuIG9wdGlvbmFsIG51bWJlciBhcnJheSwgd2l0aCBhIGRlZmF1bHQgZW1wdHkgYXJyYXlcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFZhbHVlIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gZGVmYXVsdEZuIERlZmF1bHQgdmFsdWUgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3A8VFZhbHVlPihkZWZhdWx0Rm46ICgpID0+IFRWYWx1ZSk6IE9wdGlvbmFsTW9kZWxQcm9wPFRWYWx1ZT5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbW9kZWwgcHJvcGVydHksIHdpdGggYW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZVxuICogaWYgdGhlIGlucHV0IHNuYXBzaG90IC8gbW9kZWwgY3JlYXRpb24gZGF0YSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKiBZb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgd2l0aCBwcmltaXRpdmUgdmFsdWVzIGFuZCBuZXZlciB3aXRoIG9iamVjdCB2YWx1ZXNcbiAqIChhcnJheSwgbW9kZWwsIG9iamVjdCwgZXRjKS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHByb3AoMTApIC8vIGFuIG9wdGlvbmFsIG51bWJlciwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgMTBcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFZhbHVlIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgcHJpbWl0aXZlIHZhbHVlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3A8VFZhbHVlPihkZWZhdWx0VmFsdWU6IE9ubHlQcmltaXRpdmVzPFRWYWx1ZT4pOiBPcHRpb25hbE1vZGVsUHJvcDxUVmFsdWU+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5IHdpdGggbm8gZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHByb3A8bnVtYmVyPigpIC8vIGEgcmVxdWlyZWQgbnVtYmVyXG4gKiB4OiBwcm9wPG51bWJlciB8IHVuZGVmaW5lZD4oKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdoaWNoIGRlZmF1bHRzIHRvIHVuZGVmaW5lZFxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUVmFsdWUgVmFsdWUgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wPFRWYWx1ZT4oKTogTWF5YmVPcHRpb25hbE1vZGVsUHJvcDxUVmFsdWU+XG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBwcm9wKGRlZj86IGFueSk6IEFueU1vZGVsUHJvcCB7XG4gIGxldCBoYXNEZWZhdWx0VmFsdWUgPSBmYWxzZVxuXG4gIC8vIGRlZmF1bHRcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMSkge1xuICAgIGhhc0RlZmF1bHRWYWx1ZSA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IGlzRGVmRm4gPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCJcblxuICBjb25zdCBvYmo6IEFueU1vZGVsUHJvcCA9IHtcbiAgICBfaW50ZXJuYWw6IHtcbiAgICAgICR2YWx1ZVR5cGU6IG51bGwgYXMgYW55LFxuICAgICAgJGNyZWF0aW9uVmFsdWVUeXBlOiBudWxsIGFzIGFueSxcbiAgICAgICR0cmFuc2Zvcm1lZFZhbHVlVHlwZTogbnVsbCBhcyBhbnksXG4gICAgICAkdHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlVHlwZTogbnVsbCBhcyBhbnksXG4gICAgICAkaXNSZXF1aXJlZDogbnVsbCBhcyBuZXZlcixcbiAgICAgICRpc0lkOiBudWxsIGFzIG5ldmVyLFxuICAgICAgJGhhc1NldHRlcjogbnVsbCBhcyBuZXZlcixcbiAgICAgICRmcm9tU25hcHNob3RPdmVycmlkZTogbnVsbCBhcyBuZXZlcixcbiAgICAgICR0b1NuYXBzaG90T3ZlcnJpZGU6IG51bGwgYXMgbmV2ZXIsXG5cbiAgICAgIGRlZmF1bHRGbjogaGFzRGVmYXVsdFZhbHVlICYmIGlzRGVmRm4gPyBkZWYgOiBub0RlZmF1bHRWYWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogaGFzRGVmYXVsdFZhbHVlICYmICFpc0RlZkZuID8gZGVmIDogbm9EZWZhdWx0VmFsdWUsXG4gICAgICB0eXBlQ2hlY2tlcjogdW5kZWZpbmVkLFxuICAgICAgc2V0dGVyOiBmYWxzZSxcbiAgICAgIGlzSWQ6IGZhbHNlLFxuICAgICAgdHJhbnNmb3JtOiB1bmRlZmluZWQsXG4gICAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IHVuZGVmaW5lZCxcbiAgICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IHVuZGVmaW5lZCxcbiAgICB9LFxuXG4gICAgd2l0aFNldHRlcihtb2RlPzogYm9vbGVhbiB8IFwiYXNzaWduXCIpIHtcbiAgICAgIHJldHVybiB7IC4uLnRoaXMsIF9pbnRlcm5hbDogeyAuLi50aGlzLl9pbnRlcm5hbCwgc2V0dGVyOiBtb2RlID8/IHRydWUgfSB9XG4gICAgfSxcblxuICAgIHdpdGhUcmFuc2Zvcm0odHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICAgIHJldHVybiB7IC4uLnRoaXMsIF9pbnRlcm5hbDogeyAuLi50aGlzLl9pbnRlcm5hbCwgdHJhbnNmb3JtOiB0b0Z1bGxUcmFuc2Zvcm0odHJhbnNmb3JtKSB9IH1cbiAgICB9LFxuXG4gICAgd2l0aFNuYXBzaG90UHJvY2Vzc29yKHsgZnJvbVNuYXBzaG90LCB0b1NuYXBzaG90IH0pIHtcbiAgICAgIGxldCBuZXdGcm9tU25hcHNob3RcblxuICAgICAgaWYgKHRoaXMuX2ludGVybmFsLmZyb21TbmFwc2hvdFByb2Nlc3NvciAmJiBmcm9tU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgb2xkRm4gPSB0aGlzLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgICAgICAgY29uc3QgbmV3Rm4gPSBmcm9tU25hcHNob3RcbiAgICAgICAgbmV3RnJvbVNuYXBzaG90ID0gKHNuOiBhbnkpID0+IG9sZEZuKG5ld0ZuKHNuKSlcbiAgICAgIH0gZWxzZSBpZiAoZnJvbVNuYXBzaG90KSB7XG4gICAgICAgIG5ld0Zyb21TbmFwc2hvdCA9IGZyb21TbmFwc2hvdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RnJvbVNuYXBzaG90ID0gdGhpcy5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdUb1NuYXBzaG90XG5cbiAgICAgIGlmICh0aGlzLl9pbnRlcm5hbC50b1NuYXBzaG90UHJvY2Vzc29yICYmIHRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgb2xkRm46IGFueSA9IHRoaXMuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgICAgICAgY29uc3QgbmV3Rm4gPSB0b1NuYXBzaG90XG4gICAgICAgIG5ld1RvU25hcHNob3QgPSAoc246IGFueSkgPT4gbmV3Rm4ob2xkRm4oc24pKVxuICAgICAgfSBlbHNlIGlmICh0b1NuYXBzaG90KSB7XG4gICAgICAgIG5ld1RvU25hcHNob3QgPSB0b1NuYXBzaG90XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdUb1NuYXBzaG90ID0gdGhpcy5faW50ZXJuYWwudG9TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLFxuICAgICAgICBfaW50ZXJuYWw6IHtcbiAgICAgICAgICAuLi50aGlzLl9pbnRlcm5hbCxcbiAgICAgICAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IG5ld0Zyb21TbmFwc2hvdCxcbiAgICAgICAgICB0b1NuYXBzaG90UHJvY2Vzc29yOiBuZXdUb1NuYXBzaG90LFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmxldCBjYWNoZVRyYW5zZm9ybVJlc3VsdCA9IGZhbHNlXG5jb25zdCBjYWNoZVRyYW5zZm9ybWVkVmFsdWVGbiA9ICgpID0+IHtcbiAgY2FjaGVUcmFuc2Zvcm1SZXN1bHQgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIHRvRnVsbFRyYW5zZm9ybSh0cmFuc2Zvcm1PYmplY3Q6IE1vZGVsUHJvcFRyYW5zZm9ybTx1bmtub3duLCB1bmtub3duPikge1xuICBjb25zdCBjYWNoZSA9IG5ldyBXZWFrTWFwPFxuICAgIG9iamVjdCxcbiAgICBNYXA8UHJvcGVydHlLZXksIHsgb3JpZ2luYWxWYWx1ZTogdW5rbm93bjsgdHJhbnNmb3JtZWRWYWx1ZTogdW5rbm93biB9PlxuICA+KClcblxuICBjb25zdCB0cmFuc2Zvcm0gPSAocGFyYW1zOiB7XG4gICAgb3JpZ2luYWxWYWx1ZTogdW5rbm93blxuICAgIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWU6IHVua25vd25cbiAgICBzZXRPcmlnaW5hbFZhbHVlKG5ld09yaWdpbmFsVmFsdWU6IHVua25vd24pOiB2b2lkXG4gIH0pID0+IChwYXJhbXMub3JpZ2luYWxWYWx1ZSA9PSBudWxsID8gcGFyYW1zLm9yaWdpbmFsVmFsdWUgOiB0cmFuc2Zvcm1PYmplY3QudHJhbnNmb3JtKHBhcmFtcykpXG5cbiAgY29uc3QgdW50cmFuc2Zvcm0gPSAocGFyYW1zOiB7IHRyYW5zZm9ybWVkVmFsdWU6IHVua25vd247IGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSgpOiB2b2lkIH0pID0+XG4gICAgcGFyYW1zLnRyYW5zZm9ybWVkVmFsdWUgPT0gbnVsbCA/IHBhcmFtcy50cmFuc2Zvcm1lZFZhbHVlIDogdHJhbnNmb3JtT2JqZWN0LnVudHJhbnNmb3JtKHBhcmFtcylcblxuICByZXR1cm4ge1xuICAgIHRyYW5zZm9ybShcbiAgICAgIG9yaWdpbmFsVmFsdWU6IHVua25vd24sXG4gICAgICBtb2RlbDogb2JqZWN0LFxuICAgICAgcHJvcE5hbWU6IFByb3BlcnR5S2V5LFxuICAgICAgc2V0T3JpZ2luYWxWYWx1ZTogKG5ld09yaWdpbmFsVmFsdWU6IHVua25vd24pID0+IHZvaWRcbiAgICApIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2FjaGUgPSBnZXRPckNyZWF0ZShjYWNoZSwgbW9kZWwsICgpID0+IG5ldyBNYXAoKSlcblxuICAgICAgbGV0IHByb3BDYWNoZSA9IG1vZGVsQ2FjaGUuZ2V0KHByb3BOYW1lKVxuICAgICAgaWYgKHByb3BDYWNoZT8ub3JpZ2luYWxWYWx1ZSAhPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAvLyBvcmlnaW5hbCBjaGFuZ2VkLCBpbnZhbGlkYXRlIGNhY2hlXG4gICAgICAgIG1vZGVsQ2FjaGUuZGVsZXRlKHByb3BOYW1lKVxuICAgICAgICBwcm9wQ2FjaGUgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybSh7XG4gICAgICAgIG9yaWdpbmFsVmFsdWUsXG4gICAgICAgIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWU6IHByb3BDYWNoZT8udHJhbnNmb3JtZWRWYWx1ZSxcbiAgICAgICAgc2V0T3JpZ2luYWxWYWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIG1vZGVsQ2FjaGUuc2V0KHByb3BOYW1lLCB7XG4gICAgICAgIG9yaWdpbmFsVmFsdWUsXG4gICAgICAgIHRyYW5zZm9ybWVkVmFsdWUsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gdHJhbnNmb3JtZWRWYWx1ZVxuICAgIH0sXG5cbiAgICB1bnRyYW5zZm9ybSh0cmFuc2Zvcm1lZFZhbHVlOiB1bmtub3duLCBtb2RlbDogb2JqZWN0LCBwcm9wTmFtZTogUHJvcGVydHlLZXkpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2FjaGUgPSBnZXRPckNyZWF0ZShjYWNoZSwgbW9kZWwsICgpID0+IG5ldyBNYXAoKSlcblxuICAgICAgY2FjaGVUcmFuc2Zvcm1SZXN1bHQgPSBmYWxzZVxuICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHVudHJhbnNmb3JtKHtcbiAgICAgICAgdHJhbnNmb3JtZWRWYWx1ZSxcbiAgICAgICAgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlOiBjYWNoZVRyYW5zZm9ybWVkVmFsdWVGbixcbiAgICAgIH0pXG4gICAgICBpZiAoY2FjaGVUcmFuc2Zvcm1SZXN1bHQpIHtcbiAgICAgICAgbW9kZWxDYWNoZS5zZXQocHJvcE5hbWUsIHsgb3JpZ2luYWxWYWx1ZSwgdHJhbnNmb3JtZWRWYWx1ZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kZWxDYWNoZS5kZWxldGUocHJvcE5hbWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbFZhbHVlXG4gICAgfSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlIH0gZnJvbSBcIi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuL3NjaGVtYXNcIlxuaW1wb3J0IHR5cGUgeyBMYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyLCBUeXBlSW5mbyB9IGZyb20gXCIuL1R5cGVDaGVja2VyXCJcblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIGluZm8gb2YgYSBnaXZlbiB0eXBlLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgdG8gZ2V0IHRoZSBpbmZvIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUluZm8odHlwZTogQW55VHlwZSk6IFR5cGVJbmZvIHtcbiAgY29uc3Qgc3RkVHlwZSA9IHJlc29sdmVTdGFuZGFyZFR5cGUodHlwZSlcbiAgY29uc3QgdHlwZUluZm8gPSAoc3RkVHlwZSBhcyBhbnkgYXMgVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXIpLnR5cGVJbmZvXG4gIGlmICghdHlwZUluZm8pIHtcbiAgICB0aHJvdyBmYWlsdXJlKGB0eXBlIGluZm8gbm90IGZvdW5kIGZvciAke3R5cGV9YClcbiAgfVxuICByZXR1cm4gdHlwZUluZm9cbn1cbiIsImltcG9ydCB7IGdldFJvb3RQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgdHlwZSBjaGVja2luZyBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVDaGVja0Vycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVHlwZUVycm9yLlxuICAgKiBAcGFyYW0gcGF0aCBTdWItcGF0aCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC5cbiAgICogQHBhcmFtIGV4cGVjdGVkVHlwZU5hbWUgTmFtZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZS5cbiAgICogQHBhcmFtIGFjdHVhbFZhbHVlIEFjdHVhbCB2YWx1ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHBhdGg6IFBhdGgsIHJlYWRvbmx5IGV4cGVjdGVkVHlwZU5hbWU6IHN0cmluZywgcmVhZG9ubHkgYWN0dWFsVmFsdWU6IGFueSkge31cblxuICAvKipcbiAgICogVGhyb3dzIHRoZSB0eXBlIGNoZWNrIGVycm9yIGFzIGFuIGFjdHVhbCBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHR5cGVDaGVja2VkVmFsdWUgVXN1YWxseSB0aGUgdmFsdWUgd2hlcmUgdGhlIHR5cGUgY2hlY2sgd2FzIGludm9rZWQuXG4gICAqL1xuICB0aHJvdyh0eXBlQ2hlY2tlZFZhbHVlOiBhbnkpOiBuZXZlciB7XG4gICAgbGV0IG1zZyA9IFwiVHlwZUNoZWNrRXJyb3I6IFwiXG4gICAgbGV0IHJvb3RQYXRoOiBQYXRoID0gW11cbiAgICBpZiAoaXNUd2Vha2VkT2JqZWN0KHR5cGVDaGVja2VkVmFsdWUsIHRydWUpKSB7XG4gICAgICByb290UGF0aCA9IGdldFJvb3RQYXRoKHR5cGVDaGVja2VkVmFsdWUpLnBhdGhcbiAgICB9XG5cbiAgICBtc2cgKz0gXCJbL1wiICsgWy4uLnJvb3RQYXRoLCAuLi50aGlzLnBhdGhdLmpvaW4oXCIvXCIpICsgXCJdIFwiXG5cbiAgICBtc2cgKz0gXCJFeHBlY3RlZDogXCIgKyB0aGlzLmV4cGVjdGVkVHlwZU5hbWVcblxuICAgIHRocm93IGZhaWx1cmUobXNnKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmYXN0R2V0UGFyZW50SW5jbHVkaW5nRGF0YU9iamVjdHMgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBpc0FycmF5LCBpc09iamVjdCwgaXNQcmltaXRpdmUsIGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4vVHlwZUNoZWNrRXJyb3JcIlxuXG50eXBlIENoZWNrRnVuY3Rpb24gPSAodmFsdWU6IGFueSwgcGF0aDogUGF0aCkgPT4gVHlwZUNoZWNrRXJyb3IgfCBudWxsXG5cbmNvbnN0IGVtcHR5UGF0aDogUGF0aCA9IFtdXG5cbnR5cGUgQ2hlY2tSZXN1bHQgPSBUeXBlQ2hlY2tFcnJvciB8IG51bGxcbnR5cGUgQ2hlY2tSZXN1bHRDYWNoZSA9IFdlYWtNYXA8b2JqZWN0LCBDaGVja1Jlc3VsdD5cblxuY29uc3QgdHlwZUNoZWNrZXJzV2l0aENhY2hlZFJlc3VsdHNPZk9iamVjdCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU2V0PFR5cGVDaGVja2VyPj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZW51bSBUeXBlQ2hlY2tlckJhc2VUeXBlIHtcbiAgT2JqZWN0ID0gXCJvYmplY3RcIixcbiAgQXJyYXkgPSBcImFycmF5XCIsXG4gIFByaW1pdGl2ZSA9IFwicHJpbWl0aXZlXCIsXG4gIEFueSA9IFwiYW55XCIsXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ2hlY2tlckJhc2VUeXBlRnJvbVZhbHVlKHZhbHVlOiBhbnkpOiBUeXBlQ2hlY2tlckJhc2VUeXBlIHtcbiAgLy8gYXJyYXkgbXVzdCBiZSBiZWZvcmUgb2JqZWN0IHNpbmNlIGFycmF5cyBhcmUgYWxzbyBvYmplY3RzXG4gIGlmIChpc0FycmF5KHZhbHVlKSkgcmV0dXJuIFR5cGVDaGVja2VyQmFzZVR5cGUuQXJyYXlcbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0XG4gIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHJldHVybiBUeXBlQ2hlY2tlckJhc2VUeXBlLlByaW1pdGl2ZVxuICByZXR1cm4gVHlwZUNoZWNrZXJCYXNlVHlwZS5Bbnlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRhdGVDYWNoZWRUeXBlQ2hlY2tlclJlc3VsdChvYmo6IG9iamVjdCkge1xuICAvLyB3ZSBuZWVkIHRvIGludmFsaWRhdGUgaXQgZm9yIHRoZSBvYmplY3QgYW5kIGFsbCBpdHMgcGFyZW50c1xuICBsZXQgY3VycmVudDogYW55ID0gb2JqXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgY29uc3Qgc2V0ID0gdHlwZUNoZWNrZXJzV2l0aENhY2hlZFJlc3VsdHNPZk9iamVjdC5nZXQoY3VycmVudClcbiAgICBpZiAoc2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHR5cGVDaGVja2VyIG9mIHNldCkge1xuICAgICAgICB0eXBlQ2hlY2tlci5pbnZhbGlkYXRlQ2FjaGVkUmVzdWx0KGN1cnJlbnQpXG4gICAgICB9XG4gICAgICB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkUmVzdWx0c09mT2JqZWN0LmRlbGV0ZShjdXJyZW50KVxuICAgIH1cblxuICAgIGN1cnJlbnQgPSBmYXN0R2V0UGFyZW50SW5jbHVkaW5nRGF0YU9iamVjdHMoY3VycmVudClcbiAgfVxufVxuXG5jb25zdCB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkU25hcHNob3RQcm9jZXNzb3JSZXN1bHRzT2ZPYmplY3QgPSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBTZXQ8VHlwZUNoZWNrZXI+XG4+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRhdGVDYWNoZWRUb1NuYXBzaG90UHJvY2Vzc29yUmVzdWx0KG9iajogb2JqZWN0KSB7XG4gIGNvbnN0IHNldCA9IHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRTbmFwc2hvdFByb2Nlc3NvclJlc3VsdHNPZk9iamVjdC5nZXQob2JqKVxuXG4gIGlmIChzZXQpIHtcbiAgICBzZXQuZm9yRWFjaCgodHlwZUNoZWNrZXIpID0+IHR5cGVDaGVja2VyLmludmFsaWRhdGVTbmFwc2hvdFByb2Nlc3NvckNhY2hlZFJlc3VsdChvYmopKVxuICAgIHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRTbmFwc2hvdFByb2Nlc3NvclJlc3VsdHNPZk9iamVjdC5kZWxldGUob2JqKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlQ2hlY2tlciB7XG4gIHByaXZhdGUgY2hlY2tSZXN1bHRDYWNoZT86IENoZWNrUmVzdWx0Q2FjaGVcblxuICB1bmNoZWNrZWQ6IGJvb2xlYW5cblxuICBwcml2YXRlIGNyZWF0ZUNhY2hlSWZOZWVkZWQoKTogQ2hlY2tSZXN1bHRDYWNoZSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrUmVzdWx0Q2FjaGUpIHtcbiAgICAgIHRoaXMuY2hlY2tSZXN1bHRDYWNoZSA9IG5ldyBXZWFrTWFwKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXN1bHRDYWNoZVxuICB9XG5cbiAgc2V0Q2FjaGVkUmVzdWx0KG9iajogb2JqZWN0LCBuZXdDYWNoZVZhbHVlOiBDaGVja1Jlc3VsdCkge1xuICAgIHRoaXMuY3JlYXRlQ2FjaGVJZk5lZWRlZCgpLnNldChvYmosIG5ld0NhY2hlVmFsdWUpXG5cbiAgICAvLyByZWdpc3RlciB0aGlzIHR5cGUgY2hlY2tlciBhcyBsaXN0ZW5lciBvZiB0aGF0IG9iamVjdCBjaGFuZ2VzXG4gICAgY29uc3QgdHlwZUNoZWNrZXJTZXQgPSBnZXRPckNyZWF0ZSh0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkUmVzdWx0c09mT2JqZWN0LCBvYmosICgpID0+IG5ldyBTZXQoKSlcblxuICAgIHR5cGVDaGVja2VyU2V0LmFkZCh0aGlzKVxuICB9XG5cbiAgaW52YWxpZGF0ZUNhY2hlZFJlc3VsdChvYmo6IG9iamVjdCkge1xuICAgIHRoaXMuY2hlY2tSZXN1bHRDYWNoZT8uZGVsZXRlKG9iailcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FjaGVkUmVzdWx0KG9iajogb2JqZWN0KTogQ2hlY2tSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzdWx0Q2FjaGU/LmdldChvYmopXG4gIH1cblxuICBjaGVjayh2YWx1ZTogYW55LCBwYXRoOiBQYXRoKTogVHlwZUNoZWNrRXJyb3IgfCBudWxsIHtcbiAgICBpZiAodGhpcy51bmNoZWNrZWQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKCFpc1R3ZWFrZWRPYmplY3QodmFsdWUsIHRydWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2shKHZhbHVlLCBwYXRoKVxuICAgIH1cblxuICAgIC8vIG9wdGltaXplZCBjaGVja2luZyB3aXRoIGNhY2hlZCB2YWx1ZXNcblxuICAgIGxldCBjYWNoZWRSZXN1bHQgPSB0aGlzLmdldENhY2hlZFJlc3VsdCh2YWx1ZSlcblxuICAgIGlmIChjYWNoZWRSZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gd2Ugc2V0IHRoZSBwYXRoIGVtcHR5IHNpbmNlIHRoZSByZXN1bHQgY291bGQgYmUgdXNlZCBmb3IgcGF0aHMgb3RoZXIgdGhhbiB0aGlzIGJhc2VcbiAgICAgIGNhY2hlZFJlc3VsdCA9IHRoaXMuX2NoZWNrISh2YWx1ZSwgZW1wdHlQYXRoKVxuICAgICAgdGhpcy5zZXRDYWNoZWRSZXN1bHQodmFsdWUsIGNhY2hlZFJlc3VsdClcbiAgICB9XG5cbiAgICBpZiAoY2FjaGVkUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKFxuICAgICAgICBbLi4ucGF0aCwgLi4uY2FjaGVkUmVzdWx0LnBhdGhdLFxuICAgICAgICBjYWNoZWRSZXN1bHQuZXhwZWN0ZWRUeXBlTmFtZSxcbiAgICAgICAgY2FjaGVkUmVzdWx0LmFjdHVhbFZhbHVlXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGVkVHlwZUluZm9HZW46IFR5cGVJbmZvR2VuXG5cbiAgZ2V0IHR5cGVJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWRUeXBlSW5mb0dlbih0aGlzIGFzIGFueSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGJhc2VUeXBlOiBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoZWNrOiBDaGVja0Z1bmN0aW9uIHwgbnVsbCxcbiAgICByZWFkb25seSBnZXRUeXBlTmFtZTogKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4gc3RyaW5nLFxuICAgIHJlYWRvbmx5IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbixcbiAgICByZWFkb25seSBzbmFwc2hvdFR5cGU6IChzbjogdW5rbm93bikgPT4gVHlwZUNoZWNrZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Zyb21TbmFwc2hvdFByb2Nlc3NvcjogKHNuOiBhbnkpID0+IHVua25vd24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdG9TbmFwc2hvdFByb2Nlc3NvcjogKHNuOiBhbnkpID0+IHVua25vd25cbiAgKSB7XG4gICAgdGhpcy51bmNoZWNrZWQgPSAhX2NoZWNrXG4gICAgdGhpcy5fY2FjaGVkVHlwZUluZm9HZW4gPSBsYXp5KHR5cGVJbmZvR2VuKVxuICB9XG5cbiAgZnJvbVNuYXBzaG90UHJvY2Vzc29yID0gKHNuOiBhbnkpOiB1bmtub3duID0+IHtcbiAgICAvLyB3ZSBjYW5ub3QgY2FjaGUgZnJvbVNuYXBzaG90UHJvY2Vzc29yIHNpbmNlIG5vYm9keSBlbnN1cmVzIHVzXG4gICAgLy8gdGhlIG9yaWdpbmFsIHNuYXBzaG90IHdvbid0IGJlIHR3ZWFrZWQgYWZ0ZXIgdXNlXG4gICAgcmV0dXJuIHRoaXMuX2Zyb21TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgdW5rbm93bj4oKVxuXG4gIGludmFsaWRhdGVTbmFwc2hvdFByb2Nlc3NvckNhY2hlZFJlc3VsdChvYmo6IG9iamVjdCkge1xuICAgIHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZS5kZWxldGUob2JqKVxuICB9XG5cbiAgdG9TbmFwc2hvdFByb2Nlc3NvciA9IChzbjogYW55KTogdW5rbm93biA9PiB7XG4gICAgaWYgKHR5cGVvZiBzbiAhPT0gXCJvYmplY3RcIiB8fCBzbiA9PT0gbnVsbCkge1xuICAgICAgLy8gbm90IGNhY2hlYWJsZVxuICAgICAgcmV0dXJuIHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZS5oYXMoc24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdG9TbmFwc2hvdFByb2Nlc3NvckNhY2hlLmdldChzbilcbiAgICB9XG5cbiAgICBjb25zdCB2YWwgPSB0aGlzLl90b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgIHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZS5zZXQoc24sIHZhbClcblxuICAgIC8vIHJlZ2lzdGVyIHRoaXMgdHlwZSBjaGVja2VyIGFzIGxpc3RlbmVyIG9mIHRoYXQgc24gY2hhbmdlc1xuICAgIGNvbnN0IHR5cGVDaGVja2VyU2V0ID0gZ2V0T3JDcmVhdGUoXG4gICAgICB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkU25hcHNob3RQcm9jZXNzb3JSZXN1bHRzT2ZPYmplY3QsXG4gICAgICBzbixcbiAgICAgICgpID0+IG5ldyBTZXQoKVxuICAgIClcblxuICAgIHR5cGVDaGVja2VyU2V0LmFkZCh0aGlzKVxuXG4gICAgcmV0dXJuIHZhbFxuICB9XG59XG5cbmNvbnN0IGxhdGVUeXBlQ2hlY2tlclN5bWJvbCA9IFN5bWJvbChcImxhdGVUeXBlQ2hla2VyXCIpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZVR5cGVDaGVja2VyIHtcbiAgW2xhdGVUeXBlQ2hlY2tlclN5bWJvbF06IHRydWVcbiAgKCk6IFR5cGVDaGVja2VyXG4gIHR5cGVJbmZvOiBUeXBlSW5mb1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF0ZVR5cGVDaGVja2VyKGZuOiAoKSA9PiBUeXBlQ2hlY2tlciwgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuKTogTGF0ZVR5cGVDaGVja2VyIHtcbiAgbGV0IGNhY2hlZDogVHlwZUNoZWNrZXIgfCB1bmRlZmluZWRcbiAgY29uc3QgbHRjID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRcbiAgICB9XG5cbiAgICBjYWNoZWQgPSBmbigpXG4gICAgcmV0dXJuIGNhY2hlZFxuICB9XG4gIDsobHRjIGFzIExhdGVUeXBlQ2hlY2tlcilbbGF0ZVR5cGVDaGVja2VyU3ltYm9sXSA9IHRydWVcblxuICBjb25zdCBjYWNoZWRUeXBlSW5mb0dlbiA9IGxhenkodHlwZUluZm9HZW4pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGx0YywgXCJ0eXBlSW5mb1wiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFR5cGVJbmZvR2VuKGx0YyBhcyBhbnkpXG4gICAgfSxcbiAgfSlcblxuICByZXR1cm4gbHRjIGFzIExhdGVUeXBlQ2hlY2tlclxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYXRlVHlwZUNoZWNrZXIobHRjOiB1bmtub3duKTogbHRjIGlzIExhdGVUeXBlQ2hlY2tlciB7XG4gIHJldHVybiB0eXBlb2YgbHRjID09PSBcImZ1bmN0aW9uXCIgJiYgbGF0ZVR5cGVDaGVja2VyU3ltYm9sIGluIGx0Y1xufVxuXG4vKipcbiAqIFR5cGUgaW5mbyBiYXNlIGNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZUluZm8ge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSB0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7fVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBUeXBlSW5mb0dlbiA9ICh0OiBBbnlTdGFuZGFyZFR5cGUpID0+IFR5cGVJbmZvXG4iLCJpbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi8uLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi8uLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi8uLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8gfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHsgbm9EZWZhdWx0VmFsdWUgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBpc09iamVjdCwgbGF6eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQgeyByZWdpc3RlclN0YW5kYXJkVHlwZVJlc29sdmVyLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBNb2RlbFR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5cbmNvbnN0IGNhY2hlZE1vZGVsVHlwZUNoZWNrZXIgPSBuZXcgV2Vha01hcDxNb2RlbENsYXNzPEFueU1vZGVsPiwgVHlwZUNoZWNrZXI+KClcblxudHlwZSBfQ2xhc3M8VD4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG50eXBlIF9DbGFzc09yT2JqZWN0PE0sIEs+ID0gSyBleHRlbmRzIE0gPyBvYmplY3QgOiBfQ2xhc3M8Sz4gfCAoKCkgPT4gX0NsYXNzPEs+KVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBtb2RlbC4gVGhlIHR5cGUgcmVmZXJlbmNlZCBpbiB0aGUgbW9kZWwgZGVjb3JhdG9yIHdpbGwgYmUgdXNlZCBmb3IgdHlwZSBjaGVja2luZy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IHNvbWVNb2RlbFR5cGUgPSB0eXBlcy5tb2RlbChTb21lTW9kZWwpXG4gKiAvLyBvciBmb3IgcmVjdXJzaXZlIG1vZGVsc1xuICogY29uc3Qgc29tZU1vZGVsVHlwZSA9IHR5cGVzLm1vZGVsPFNvbWVNb2RlbD4oKCkgPT4gU29tZU1vZGVsKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBNIE1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxDbGFzcyBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc01vZGVsPE0gPSBuZXZlciwgSyA9IE0+KG1vZGVsQ2xhc3M6IF9DbGFzc09yT2JqZWN0PE0sIEs+KTogTW9kZWxUeXBlPEs+IHtcbiAgLy8gaWYgd2UgdHlwZSBpdCBhbnkgc3Ryb25nZXIgdGhlbiByZWN1cnNpdmUgZGVmcyBhbmQgc28gb24gc3RvcCB3b3JraW5nXG5cbiAgaWYgKCFpc01vZGVsQ2xhc3MobW9kZWxDbGFzcykgJiYgdHlwZW9mIG1vZGVsQ2xhc3MgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIHJlc29sdmUgbGF0ZXJcbiAgICBjb25zdCBtb2RlbENsYXNzRm4gPSBtb2RlbENsYXNzIGFzICgpID0+IE1vZGVsQ2xhc3M8QW55TW9kZWw+XG4gICAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBNb2RlbFR5cGVJbmZvKHQsIG1vZGVsQ2xhc3NGbigpKVxuICAgIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4gdHlwZXNNb2RlbChtb2RlbENsYXNzRm4oKSkgYXMgYW55LCB0eXBlSW5mb0dlbikgYXMgYW55XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbW9kZWxDbGF6ejogTW9kZWxDbGFzczxBbnlNb2RlbD4gPSBtb2RlbENsYXNzIGFzIGFueVxuXG4gICAgY29uc3QgY2FjaGVkVHlwZUNoZWNrZXIgPSBjYWNoZWRNb2RlbFR5cGVDaGVja2VyLmdldChtb2RlbENsYXp6KVxuICAgIGlmIChjYWNoZWRUeXBlQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIGNhY2hlZFR5cGVDaGVja2VyIGFzIGFueVxuICAgIH1cblxuICAgIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgTW9kZWxUeXBlSW5mbyh0LCBtb2RlbENsYXp6KVxuXG4gICAgY29uc3QgdGMgPSBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGF6eikhXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGBNb2RlbCgke21vZGVsSW5mby5uYW1lfSlgXG5cbiAgICAgIGNvbnN0IGRhdGFUeXBlQ2hlY2tlciA9IGdldE1vZGVsTWV0YWRhdGEobW9kZWxDbGF6eikuZGF0YVR5cGVcbiAgICAgIGNvbnN0IHJlc29sdmVkRGF0YVR5cGVDaGVja2VyID0gZGF0YVR5cGVDaGVja2VyXG4gICAgICAgID8gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAgICAgKHZhbHVlLCBwYXRoKSA9PiB7XG4gICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBtb2RlbENsYXp6KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCB0eXBlTmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmVkRGF0YVR5cGVDaGVja2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuY2hlY2sodmFsdWUuJCwgcGF0aClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlW21vZGVsVHlwZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gZmFzdCBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlW21vZGVsVHlwZUtleV0gPT09IG1vZGVsSW5mby5uYW1lID8gdGhpc1RjIDogbnVsbFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZlZERhdGFUeXBlQ2hlY2tlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLnNuYXBzaG90VHlwZSh2YWx1ZSkgPyB0aGlzVGMgOiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbm90IGVub3VnaCBpbmZvIHRvIGJlIGFibGUgdG8gdGVsbFxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG5cbiAgICAgICAgKHNuKSA9PiB7XG4gICAgICAgICAgaWYgKHNuW21vZGVsVHlwZUtleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5zbixcbiAgICAgICAgICAgICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAoc24pID0+IHNuXG4gICAgICApXG5cbiAgICAgIHJldHVybiB0aGlzVGNcbiAgICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG5cbiAgICBjYWNoZWRNb2RlbFR5cGVDaGVja2VyLnNldChtb2RlbENsYXp6LCB0YylcblxuICAgIHJldHVybiB0YyBhcyBhbnlcbiAgfVxufVxuXG4vKipcbiAqIGB0eXBlcy5tb2RlbGAgdHlwZSBpbmZvIGZvciBhIG1vZGVsIHByb3BzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsVHlwZUluZm9Qcm9wcyB7XG4gIHJlYWRvbmx5IFtwcm9wTmFtZTogc3RyaW5nXTogUmVhZG9ubHk8e1xuICAgIHR5cGU6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZFxuICAgIHR5cGVJbmZvOiBUeXBlSW5mbyB8IHVuZGVmaW5lZFxuICAgIGhhc0RlZmF1bHQ6IGJvb2xlYW5cbiAgICBkZWZhdWx0OiBhbnlcbiAgfT5cbn1cblxuLyoqXG4gKiBgdHlwZXMubW9kZWxgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIHByaXZhdGUgX3Byb3BzID0gbGF6eSgoKSA9PiB7XG4gICAgY29uc3Qgb2JqU2NoZW1hID0gZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKHRoaXMubW9kZWxDbGFzcylcblxuICAgIGNvbnN0IHByb3BUeXBlczogTy5Xcml0YWJsZTxNb2RlbFR5cGVJbmZvUHJvcHM+ID0ge31cbiAgICBPYmplY3Qua2V5cyhvYmpTY2hlbWEpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG4gICAgICBjb25zdCBwcm9wRGF0YSA9IG9ialNjaGVtYVtwcm9wTmFtZV1cblxuICAgICAgY29uc3QgdHlwZSA9IHByb3BEYXRhLl9pbnRlcm5hbC50eXBlQ2hlY2tlciBhcyBhbnkgYXMgQW55U3RhbmRhcmRUeXBlXG5cbiAgICAgIGxldCB0eXBlSW5mbzogVHlwZUluZm8gfCB1bmRlZmluZWRcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIHR5cGVJbmZvID0gZ2V0VHlwZUluZm8odHlwZSlcbiAgICAgIH1cblxuICAgICAgbGV0IGhhc0RlZmF1bHQgPSBmYWxzZVxuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55XG4gICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGblxuICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlXG4gICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHByb3BUeXBlc1twcm9wTmFtZV0gPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHR5cGVJbmZvLFxuICAgICAgICBoYXNEZWZhdWx0LFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcHJvcFR5cGVzXG4gIH0pXG5cbiAgZ2V0IHByb3BzKCk6IE1vZGVsVHlwZUluZm9Qcm9wcyB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzKClcbiAgfVxuXG4gIGdldCBtb2RlbFR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldCh0aGlzLm1vZGVsQ2xhc3MpIVxuICAgIHJldHVybiBtb2RlbEluZm8ubmFtZVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbD4pIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2RlbFN0YW5kYXJkVHlwZVJlc29sdmVyKCkge1xuICByZWdpc3RlclN0YW5kYXJkVHlwZVJlc29sdmVyKCh2KSA9PiAoaXNNb2RlbENsYXNzKHYpID8gdHlwZXNNb2RlbCh2KSA6IHVuZGVmaW5lZCkpXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRJc1ByaW1pdGl2ZSwgaWRlbnRpdHlGbiB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFByaW1pdGl2ZVZhbHVlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3R5cGVzXCJcbmltcG9ydCB7IHJlZ2lzdGVyU3RhbmRhcmRUeXBlUmVzb2x2ZXIsIFN0YW5kYXJkVHlwZVJlc29sdmVyRm4gfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQgeyBUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXJCYXNlVHlwZSwgVHlwZUluZm8sIFR5cGVJbmZvR2VuIH0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcblxuY29uc3Qgc3RhbmRhcmRUeXBlUmVzb2x2ZXJzOiBTdGFuZGFyZFR5cGVSZXNvbHZlckZuW10gPSBbXVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBjZXJ0YWluIHZhbHVlIG9mIGEgcHJpbWl0aXZlIChmb3IgZXhhbXBsZSBhbiAqZXhhY3QqIG51bWJlciBvciBzdHJpbmcpLlxuICpcbiAqIEV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBoaVR5cGUgPSB0eXBlcy5saXRlcmFsKFwiaGlcIikgLy8gdGhlIHN0cmluZyB3aXRoIHZhbHVlIFwiaGlcIlxuICogY29uc3QgbnVtYmVyNVR5cGUgPSB0eXBlcy5saXRlcmFsKDUpIC8vIHRoZSBudW1iZXIgd2l0aCB2YWx1ZSA1XG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgTGl0ZXJhbCB2YWx1ZSB0eXBlLlxuICogQHBhcmFtIGxpdGVyYWwgTGl0ZXJhbCB2YWx1ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0xpdGVyYWw8VCBleHRlbmRzIFByaW1pdGl2ZVZhbHVlPihsaXRlcmFsOiBUKTogSWRlbnRpdHlUeXBlPFQ+IHtcbiAgYXNzZXJ0SXNQcmltaXRpdmUobGl0ZXJhbCwgXCJsaXRlcmFsXCIpXG4gIGxldCB0eXBlTmFtZTogc3RyaW5nXG4gIHN3aXRjaCAobGl0ZXJhbCkge1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgdHlwZU5hbWUgPSBcInVuZGVmaW5lZFwiXG4gICAgICBicmVha1xuICAgIGNhc2UgbnVsbDpcbiAgICAgIHR5cGVOYW1lID0gXCJudWxsXCJcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHR5cGVOYW1lID0gSlNPTi5zdHJpbmdpZnkobGl0ZXJhbClcbiAgICAgIGJyZWFrXG4gIH1cblxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IExpdGVyYWxUeXBlSW5mbyh0LCBsaXRlcmFsKVxuXG4gIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5QcmltaXRpdmUsXG5cbiAgICAodmFsdWUsIHBhdGgpID0+ICh2YWx1ZSA9PT0gbGl0ZXJhbCA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgdHlwZU5hbWUsIHZhbHVlKSksXG5cbiAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICB0eXBlSW5mb0dlbixcblxuICAgICh2YWx1ZSkgPT4gKHZhbHVlID09PSBsaXRlcmFsID8gdGhpc1RjIDogbnVsbCksXG4gICAgaWRlbnRpdHlGbixcbiAgICBpZGVudGl0eUZuXG4gIClcblxuICByZXR1cm4gdGhpc1RjIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5saXRlcmFsYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBMaXRlcmFsVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IGxpdGVyYWw6IFByaW1pdGl2ZVZhbHVlKSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB1bmRlZmluZWQuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5saXRlcmFsKHVuZGVmaW5lZClgLlxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy51bmRlZmluZWRcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNVbmRlZmluZWQgPSB0eXBlc0xpdGVyYWwodW5kZWZpbmVkKVxuXG5zdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaCgodikgPT4gKHYgPT09IHVuZGVmaW5lZCA/IHR5cGVzVW5kZWZpbmVkIDogdW5kZWZpbmVkKSlcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBudWxsLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMubGl0ZXJhbChudWxsKWAuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLm51bGxcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNOdWxsID0gdHlwZXNMaXRlcmFsKG51bGwpXG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gbnVsbCA/IHR5cGVzTnVsbCA6IHVuZGVmaW5lZCkpXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbnkgYm9vbGVhbiB2YWx1ZS5cbiAqXG4gKiBgYGB0c1xuICogdHlwZXMuYm9vbGVhblxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc0Jvb2xlYW46IElkZW50aXR5VHlwZTxib29sZWFuPiA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZS5QcmltaXRpdmUsXG5cbiAgKHZhbHVlLCBwYXRoKSA9PiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgXCJib29sZWFuXCIsIHZhbHVlKSksXG5cbiAgKCkgPT4gXCJib29sZWFuXCIsXG4gICh0KSA9PiBuZXcgQm9vbGVhblR5cGVJbmZvKHQpLFxuXG4gICh2YWx1ZSkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgPyAodHlwZXNCb29sZWFuIGFzIGFueSkgOiBudWxsKSxcbiAgaWRlbnRpdHlGbixcbiAgaWRlbnRpdHlGblxuKSBhcyBhbnlcblxuc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLnB1c2goKHYpID0+ICh2ID09PSBCb29sZWFuID8gdHlwZXNCb29sZWFuIDogdW5kZWZpbmVkKSlcblxuLyoqXG4gKiBgdHlwZXMuYm9vbGVhbmAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgQm9vbGVhblR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBudW1iZXIgdmFsdWUuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLm51bWJlclxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc051bWJlcjogSWRlbnRpdHlUeXBlPG51bWJlcj4gPSBuZXcgVHlwZUNoZWNrZXIoXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUuUHJpbWl0aXZlLFxuXG4gICh2YWx1ZSwgcGF0aCkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgXCJudW1iZXJcIiwgdmFsdWUpKSxcblxuICAoKSA9PiBcIm51bWJlclwiLFxuICAodCkgPT4gbmV3IE51bWJlclR5cGVJbmZvKHQpLFxuXG4gICh2YWx1ZSkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/ICh0eXBlc051bWJlciBhcyBhbnkpIDogbnVsbCksXG4gIGlkZW50aXR5Rm4sXG4gIGlkZW50aXR5Rm5cbikgYXMgYW55XG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gTnVtYmVyID8gdHlwZXNOdW1iZXIgOiB1bmRlZmluZWQpKVxuXG4vKipcbiAqIGB0eXBlcy5udW1iZXJgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bWJlclR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBzdHJpbmcgdmFsdWUuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLnN0cmluZ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc1N0cmluZzogSWRlbnRpdHlUeXBlPHN0cmluZz4gPSBuZXcgVHlwZUNoZWNrZXIoXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUuUHJpbWl0aXZlLFxuXG4gICh2YWx1ZSwgcGF0aCkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgXCJzdHJpbmdcIiwgdmFsdWUpKSxcblxuICAoKSA9PiBcInN0cmluZ1wiLFxuICAodCkgPT4gbmV3IFN0cmluZ1R5cGVJbmZvKHQpLFxuXG4gICh2YWx1ZSkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/ICh0eXBlc1N0cmluZyBhcyBhbnkpIDogbnVsbCksXG4gIGlkZW50aXR5Rm4sXG4gIGlkZW50aXR5Rm5cbikgYXMgYW55XG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gU3RyaW5nID8gdHlwZXNTdHJpbmcgOiB1bmRlZmluZWQpKVxuXG4vKipcbiAqIGB0eXBlcy5zdHJpbmdgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1R5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUHJpbWl0aXZlU3RhbmRhcmRUeXBlUmVzb2x2ZXJzKCkge1xuICBzdGFuZGFyZFR5cGVSZXNvbHZlcnMuZm9yRWFjaCgoc3RyKSA9PiB7XG4gICAgcmVnaXN0ZXJTdGFuZGFyZFR5cGVSZXNvbHZlcihzdHIpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3Rlck1vZGVsU3RhbmRhcmRUeXBlUmVzb2x2ZXIgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc01vZGVsXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHJpbWl0aXZlU3RhbmRhcmRUeXBlUmVzb2x2ZXJzIH0gZnJvbSBcIi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuXG5sZXQgZGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzKCkge1xuICBpZiAoZGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVyc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzUmVnaXN0ZXJlZCA9IHRydWVcblxuICByZWdpc3Rlck1vZGVsU3RhbmRhcmRUeXBlUmVzb2x2ZXIoKVxuICByZWdpc3RlclByaW1pdGl2ZVN0YW5kYXJkVHlwZVJlc29sdmVycygpXG59XG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVycyB9IGZyb20gXCIuL3JlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVyc1wiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSB9IGZyb20gXCIuL3NjaGVtYXNcIlxuaW1wb3J0IHsgaXNMYXRlVHlwZUNoZWNrZXIsIExhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi9UeXBlQ2hlY2tlclwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFN0YW5kYXJkVHlwZVJlc29sdmVyRm4gPSAodmFsdWU6IGFueSkgPT4gQW55U3RhbmRhcmRUeXBlIHwgdW5kZWZpbmVkXG5cbmNvbnN0IHN0YW5kYXJkVHlwZVJlc29sdmVyczogU3RhbmRhcmRUeXBlUmVzb2x2ZXJGbltdID0gW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU3RhbmRhcmRUeXBlUmVzb2x2ZXIocmVzb2x2ZXJGbjogU3RhbmRhcmRUeXBlUmVzb2x2ZXJGbikge1xuICBzdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaChyZXNvbHZlckZuKVxufVxuXG5mdW5jdGlvbiBmaW5kU3RhbmRhcmRUeXBlKHZhbHVlOiBhbnkpOiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWQge1xuICByZWdpc3RlckRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnMoKVxuXG4gIGZvciAoY29uc3QgcmVzb2x2ZXJGbiBvZiBzdGFuZGFyZFR5cGVSZXNvbHZlcnMpIHtcbiAgICBjb25zdCB0YyA9IHJlc29sdmVyRm4odmFsdWUpXG4gICAgaWYgKHRjKSByZXR1cm4gdGNcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHlwZUNoZWNrZXIodjogQW55VHlwZSB8IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyKTogVHlwZUNoZWNrZXIge1xuICBsZXQgbmV4dDogVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXIgPSB2IGFzIGFueVxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVHlwZUNoZWNrZXIpIHtcbiAgICAgIHJldHVybiBuZXh0XG4gICAgfSBlbHNlIGlmIChpc0xhdGVUeXBlQ2hlY2tlcihuZXh0KSkge1xuICAgICAgbmV4dCA9IG5leHQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YyA9IGZpbmRTdGFuZGFyZFR5cGUodilcbiAgICAgIGlmICh0Yykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVR5cGVDaGVja2VyKHRjKVxuICAgICAgfVxuICAgICAgdGhyb3cgZmFpbHVyZShcInR5cGUgY2hlY2tlciBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTdGFuZGFyZFR5cGVOb1Rocm93KFxuICB2OiBBbnlUeXBlIHwgVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXJcbik6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2IGluc3RhbmNlb2YgVHlwZUNoZWNrZXIgfHwgaXNMYXRlVHlwZUNoZWNrZXIodikpIHtcbiAgICByZXR1cm4gdiBhcyBhbnlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0YyA9IGZpbmRTdGFuZGFyZFR5cGUodilcbiAgICBpZiAodGMpIHtcbiAgICAgIHJldHVybiB0Y1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTdGFuZGFyZFR5cGUodjogQW55VHlwZSB8IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyKTogQW55U3RhbmRhcmRUeXBlIHtcbiAgY29uc3QgdGMgPSByZXNvbHZlU3RhbmRhcmRUeXBlTm9UaHJvdyh2KVxuICBpZiAodGMpIHtcbiAgICByZXR1cm4gdGNcbiAgfVxuICB0aHJvdyBmYWlsdXJlKFwic3RhbmRhcmQgdHlwZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIilcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgY3JlYXRlQXRvbSwgSUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aCwgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBpbnZhbGlkYXRlQ2FjaGVkVG9TbmFwc2hvdFByb2Nlc3NvclJlc3VsdCB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBQcmltaXRpdmVWYWx1ZSB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFNuYXBzaG90VHJhbnNmb3JtRm4gPSAoc246IHVua25vd24pID0+IHVua25vd25cblxuaW50ZXJmYWNlIFNuYXBzaG90RGF0YSB7XG4gIHVudHJhbnNmb3JtZWQ6IGFueVxuICByZWFkb25seSB0cmFuc2Zvcm1GbjogU25hcHNob3RUcmFuc2Zvcm1GbiB8IHVuZGVmaW5lZFxuICB0cmFuc2Zvcm1lZDogYW55XG4gIHJlYWRvbmx5IGF0b206IElBdG9tXG59XG5cbmNvbnN0IHNuYXBzaG90cyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU25hcHNob3REYXRhPigpXG5cbi8vIHRydWUgaWYgaXQgaGFzIGJlZW4gYWNjZXNzZWQgcHVibGljbHkgYW5kIHRoZXJlZm9yZSBzaG91bGQgYmUgY2xvbmVkXG4vLyByYXRoZXIgdGhhbiBtb2RpZmllZCBpbiBwbGFjZVxuY29uc3QgZnJvemVuU3RhdGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIGJvb2xlYW4+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsU25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4oXG4gIHZhbHVlOiBUXG4pOiBSZWFkb25seTxTbmFwc2hvdERhdGE+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNuYXBzaG90cy5nZXQodmFsdWUpXG59XG5cbmludGVyZmFjZSBJbnRlcm5hbFNuYXBzaG90UGFyZW50IHtcbiAgcGFyZW50U25hcHNob3Q6IFNuYXBzaG90RGF0YSB8IHVuZGVmaW5lZFxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT5cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxTbmFwc2hvdFBhcmVudChcbiAgc246IFJlYWRvbmx5PFNuYXBzaG90RGF0YT4gfCB1bmRlZmluZWQsXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuKTogSW50ZXJuYWxTbmFwc2hvdFBhcmVudCB8IHVuZGVmaW5lZCB7XG4gIGlmICghcGFyZW50UGF0aCB8fCAhc24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBwYXJlbnRTbiA9IGdldEludGVybmFsU25hcHNob3QocGFyZW50UGF0aC5wYXJlbnQpXG4gIGlmICghcGFyZW50U24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcmVudFNuYXBzaG90OiBwYXJlbnRTbixcbiAgICBwYXJlbnRQYXRoOiBwYXJlbnRQYXRoLFxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNldEludGVybmFsU25hcHNob3QgPSBhY3Rpb24oXCJ1bnNldEludGVybmFsU25hcHNob3RcIiwgKHZhbHVlOiBhbnkpID0+IHtcbiAgY29uc3Qgb2xkU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbHVlKVxuXG4gIGlmIChvbGRTbikge1xuICAgIHNuYXBzaG90cy5kZWxldGUodmFsdWUpXG4gICAgb2xkU24uYXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxufSlcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE5ld0ludGVybmFsU25hcHNob3QgPSBhY3Rpb24oXG4gIFwic2V0TmV3SW50ZXJuYWxTbmFwc2hvdFwiLFxuICA8VCBleHRlbmRzIG9iamVjdD4oXG4gICAgdmFsdWU6IGFueSxcbiAgICB1bnRyYW5zZm9ybWVkOiBULFxuICAgIHRyYW5zZm9ybUZuOiBTbmFwc2hvdFRyYW5zZm9ybUZuIHwgdW5kZWZpbmVkLFxuICAgIG1hcmtBc0Zyb3plbiA9IGZhbHNlXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHNuOiBTbmFwc2hvdERhdGEgPSB7XG4gICAgICB1bnRyYW5zZm9ybWVkLFxuICAgICAgdHJhbnNmb3JtRm4sXG4gICAgICB0cmFuc2Zvcm1lZDogdHJhbnNmb3JtRm4gPyB0cmFuc2Zvcm1Gbih1bnRyYW5zZm9ybWVkKSA6IHVudHJhbnNmb3JtZWQsXG4gICAgICBhdG9tOiBjcmVhdGVBdG9tKFwic25hcHNob3RcIiksXG4gICAgfVxuICAgIGZyb3plblN0YXRlLnNldChzbi51bnRyYW5zZm9ybWVkLCBtYXJrQXNGcm96ZW4pXG4gICAgZnJvemVuU3RhdGUuc2V0KHNuLnRyYW5zZm9ybWVkLCBtYXJrQXNGcm96ZW4pXG5cbiAgICBzbmFwc2hvdHMuc2V0KHZhbHVlLCBzbilcblxuICAgIHNuLmF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cbilcblxudHlwZSBNdXRhdGVJbnRlcm5hbFNuYXBzaG90Rm48VD4gPSAocHJldlNuOiBUKSA9PiB2b2lkXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVJbnRlcm5hbFNuYXBzaG90ID0gYWN0aW9uKFxuICBcInVwZGF0ZUludGVybmFsU25hcHNob3RcIixcbiAgPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBhbnksIG11dGF0ZTogTXV0YXRlSW50ZXJuYWxTbmFwc2hvdEZuPFQ+KTogdm9pZCA9PiB7XG4gICAgY29uc3Qgc24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbHVlKSEgYXMgU25hcHNob3REYXRhXG5cbiAgICBsZXQgdW50cmFuc2Zvcm1lZCA9IHNuLnVudHJhbnNmb3JtZWRcbiAgICBjb25zdCBzbkZyb3plbiA9IGZyb3plblN0YXRlLmdldCh1bnRyYW5zZm9ybWVkKSFcbiAgICBpZiAoc25Gcm96ZW4pIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVudHJhbnNmb3JtZWQpKSB7XG4gICAgICAgIHVudHJhbnNmb3JtZWQgPSB1bnRyYW5zZm9ybWVkLnNsaWNlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVudHJhbnNmb3JtZWQgPSBPYmplY3QuYXNzaWduKHt9LCB1bnRyYW5zZm9ybWVkKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGUgcHJvY2Vzc29yIGNhY2hlZCByZXN1bHQgaXMgbm8gbG9uZ2VyIHZhbGlkIHNpbmNlIHdlIHdpbGxcbiAgICAgIC8vIG11dGF0ZSB0aGUgb2JqZWN0XG4gICAgICBpbnZhbGlkYXRlQ2FjaGVkVG9TbmFwc2hvdFByb2Nlc3NvclJlc3VsdCh1bnRyYW5zZm9ybWVkKVxuICAgIH1cblxuICAgIG11dGF0ZSh1bnRyYW5zZm9ybWVkKVxuXG4gICAgc24udW50cmFuc2Zvcm1lZCA9IHVudHJhbnNmb3JtZWRcbiAgICBzbi50cmFuc2Zvcm1lZCA9IHNuLnRyYW5zZm9ybUZuID8gc24udHJhbnNmb3JtRm4odW50cmFuc2Zvcm1lZCkgOiB1bnRyYW5zZm9ybWVkXG5cbiAgICBmcm96ZW5TdGF0ZS5zZXQoc24udW50cmFuc2Zvcm1lZCwgZmFsc2UpXG4gICAgZnJvemVuU3RhdGUuc2V0KHNuLnRyYW5zZm9ybWVkLCBmYWxzZSlcblxuICAgIHNuLmF0b20ucmVwb3J0Q2hhbmdlZCgpXG5cbiAgICAvLyBhbHNvIHVwZGF0ZSBwYXJlbnQocykgc25hcHNob3QocykgaWYgbmVlZGVkXG4gICAgY29uc3QgcGFyZW50ID0gZ2V0SW50ZXJuYWxTbmFwc2hvdFBhcmVudChzbiwgZmFzdEdldFBhcmVudFBhdGgodmFsdWUpKVxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGNvbnN0IHsgcGFyZW50U25hcHNob3QsIHBhcmVudFBhdGggfSA9IHBhcmVudFxuICAgICAgLy8gbWlnaHQgYmUgZmFsc2UgaW4gdGhlIGNhc2VzIHdoZXJlIHRoZSBwYXJlbnQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkXG4gICAgICBpZiAocGFyZW50U25hcHNob3QpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcmVudFBhdGgucGF0aFxuXG4gICAgICAgIC8vIHBhdGNoZXMgZm9yIHBhcmVudCBjaGFuZ2VzIHNob3VsZCBub3QgYmUgZW1pdHRlZFxuICAgICAgICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90KHBhcmVudFBhdGgucGFyZW50LCAob2JqT3JBcnJheTogYW55KSA9PiB7XG4gICAgICAgICAgb2JqT3JBcnJheVtwYXRoXSA9IHNuLnRyYW5zZm9ybWVkXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG4pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRJbnRlcm5hbFNuYXBzaG90T2JzZXJ2ZWQoc246IFNuYXBzaG90RGF0YSkge1xuICBzbi5hdG9tLnJlcG9ydE9ic2VydmVkKClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyZWV6ZUludGVybmFsU25hcHNob3Q8VCBleHRlbmRzIFByaW1pdGl2ZVZhbHVlIHwgb2JqZWN0PihkYXRhOiBUKTogVCB7XG4gIGlmIChpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvLyB0aGlzIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZGF0YSBjb21lcyBmcm9tIGV4YW1wbGUgZnJvbSB0cmFuc2Zvcm1zXG4gIGNvbnN0IGlzRnJvemVuID0gZnJvemVuU3RhdGUuZ2V0KGRhdGEpXG5cbiAgaWYgKGlzRnJvemVuID09PSB1bmRlZmluZWQgfHwgaXNGcm96ZW4gPT09IHRydWUpIHtcbiAgICAvLyBhbHJlYWR5IGZyb3plbiBvciBhbiBleHRlcm5hbCBkYXRhIChlLmcuIGZyb20gYSB0cmFuc2Zvcm0pXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmcmVlemVJbnRlcm5hbFNuYXBzaG90KGRhdGFbaV0pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdCgoZGF0YSBhcyBhbnkpW2tleXNbaV1dKVxuICAgIH1cbiAgfVxuXG4gIGZyb3plblN0YXRlLnNldChkYXRhLCB0cnVlKVxuXG4gIHJldHVybiBkYXRhXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXHJcbmltcG9ydCB7IHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9yZXNvbHZlVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgeyBBbnlUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4uL3R5cGVzL3NjaGVtYXNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlLCBpZGVudGl0eUZuLCBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXHJcbmltcG9ydCB7XHJcbiAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdCxcclxuICBnZXRJbnRlcm5hbFNuYXBzaG90LFxyXG4gIHJlcG9ydEludGVybmFsU25hcHNob3RPYnNlcnZlZCxcclxufSBmcm9tIFwiLi9pbnRlcm5hbFwiXHJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbiBpbW11dGFibGUgc25hcHNob3QgZm9yIGEgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqIFNpbmNlIHJldHVybmVkIHNuYXBzaG90cyBhcmUgaW1tdXRhYmxlIHRoZXkgd2lsbCByZXNwZWN0IHNoYWxsb3cgZXF1YWxpdHksIHRoaXMgaXMsXHJcbiAqIGlmIG5vIGNoYW5nZXMgYXJlIG1hZGUgdGhlbiB0aGUgc25hcHNob3Qgd2lsbCBiZSBrZXB0IHRoZSBzYW1lLlxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXHJcbiAqIEBwYXJhbSBub2RlT3JQcmltaXRpdmUgRGF0YSBzdHJ1Y3R1cmUsIGluY2x1ZGluZyBwcmltdGl2ZXMuXHJcbiAqIEByZXR1cm5zIFRoZSBzbmFwc2hvdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTbmFwc2hvdDxUIGV4dGVuZHMgQW55VHlwZT4oXHJcbiAgdHlwZTogVCxcclxuICBub2RlT3JQcmltaXRpdmU6IFR5cGVUb0RhdGE8VD5cclxuKTogU25hcHNob3RPdXRPZjxUeXBlVG9EYXRhPFQ+PlxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbiBpbW11dGFibGUgc25hcHNob3QgZm9yIGEgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqIFNpbmNlIHJldHVybmVkIHNuYXBzaG90cyBhcmUgaW1tdXRhYmxlIHRoZXkgd2lsbCByZXNwZWN0IHNoYWxsb3cgZXF1YWxpdHksIHRoaXMgaXMsXHJcbiAqIGlmIG5vIGNoYW5nZXMgYXJlIG1hZGUgdGhlbiB0aGUgc25hcHNob3Qgd2lsbCBiZSBrZXB0IHRoZSBzYW1lLlxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXHJcbiAqIEBwYXJhbSBub2RlT3JQcmltaXRpdmUgRGF0YSBzdHJ1Y3R1cmUsIGluY2x1ZGluZyBwcmltdGl2ZXMuXHJcbiAqIEByZXR1cm5zIFRoZSBzbmFwc2hvdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTbmFwc2hvdDxUPihub2RlT3JQcmltaXRpdmU6IFQpOiBTbmFwc2hvdE91dE9mPFQ+XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U25hcHNob3QoYXJnMTogYW55LCBhcmcyPzogYW55KTogYW55IHtcclxuICBsZXQgdG9TbmFwc2hvdFByb2Nlc3NvciA9IGlkZW50aXR5Rm4gYXMgKHNuOiBhbnkpID0+IHVua25vd25cclxuICBsZXQgbm9kZU9yUHJpbWl0aXZlOiBhbnlcclxuXHJcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xyXG4gICAgdG9TbmFwc2hvdFByb2Nlc3NvciA9IHJlc29sdmVUeXBlQ2hlY2tlcihhcmcxKS50b1NuYXBzaG90UHJvY2Vzc29yXHJcbiAgICBub2RlT3JQcmltaXRpdmUgPSBhcmcyXHJcbiAgfSBlbHNlIHtcclxuICAgIG5vZGVPclByaW1pdGl2ZSA9IGFyZzFcclxuICB9XHJcblxyXG4gIGlmIChpc1ByaW1pdGl2ZShub2RlT3JQcmltaXRpdmUpKSB7XHJcbiAgICByZXR1cm4gdG9TbmFwc2hvdFByb2Nlc3Nvcihub2RlT3JQcmltaXRpdmUpXHJcbiAgfVxyXG5cclxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGVPclByaW1pdGl2ZSwgXCJub2RlT3JQcmltaXRpdmVcIilcclxuXHJcbiAgY29uc3Qgc25hcHNob3QgPSBnZXRJbnRlcm5hbFNuYXBzaG90KG5vZGVPclByaW1pdGl2ZSlcclxuICBpZiAoIXNuYXBzaG90KSB7XHJcbiAgICB0aHJvdyBmYWlsdXJlKFwiZ2V0U25hcHNob3QgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBraW5kIG9mIG9iamVjdFwiKVxyXG4gIH1cclxuXHJcbiAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdChzbmFwc2hvdC50cmFuc2Zvcm1lZClcclxuICByZXBvcnRJbnRlcm5hbFNuYXBzaG90T2JzZXJ2ZWQoc25hcHNob3QpXHJcbiAgcmV0dXJuIHRvU25hcHNob3RQcm9jZXNzb3Ioc25hcHNob3QudHJhbnNmb3JtZWQpXHJcbn1cclxuIiwiaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4vc2NoZW1hc1wiXHJcbmltcG9ydCB0eXBlIHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi9UeXBlQ2hlY2tFcnJvclwiXHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgdmFsdWUgY29uZm9ybXMgdG8gYSBnaXZlbiB0eXBlLlxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cclxuICogQHBhcmFtIHR5cGUgVHlwZSB0byBjaGVjayBmb3IuXHJcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBjaGVjay5cclxuICogQHJldHVybnMgQSBUeXBlRXJyb3IgaWYgdGhlIGNoZWNrIGZhaWxzIG9yIG51bGwgaWYgbm8gZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZUNoZWNrPFQgZXh0ZW5kcyBBbnlUeXBlPih0eXBlOiBULCB2YWx1ZTogVHlwZVRvRGF0YTxUPik6IFR5cGVDaGVja0Vycm9yIHwgbnVsbCB7XHJcbiAgY29uc3QgdHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodHlwZSlcclxuXHJcbiAgaWYgKHR5cGVDaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgcmV0dXJuIG51bGxcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHR5cGVDaGVja2VyLmNoZWNrKHZhbHVlLCBbXSlcclxuICB9XHJcbn1cclxuIiwibGV0IHVybEFscGhhYmV0ID1cbiAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5sZXQgY3VzdG9tQWxwaGFiZXQgPSAoYWxwaGFiZXQsIGRlZmF1bHRTaXplID0gMjEpID0+IHtcbiAgcmV0dXJuIChzaXplID0gZGVmYXVsdFNpemUpID0+IHtcbiAgICBsZXQgaWQgPSAnJ1xuICAgIGxldCBpID0gc2l6ZVxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlkICs9IGFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogYWxwaGFiZXQubGVuZ3RoKSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxuICB9XG59XG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSAnJ1xuICBsZXQgaSA9IHNpemVcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgfVxuICByZXR1cm4gaWRcbn1cbmV4cG9ydCB7IG5hbm9pZCwgY3VzdG9tQWxwaGFiZXQgfVxuIiwiaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZC9ub24tc2VjdXJlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogTW9kZWwgYXV0byB0eXBlLWNoZWNraW5nIG1vZGUuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGUge1xuICAvKipcbiAgICogQXV0byB0eXBlIGNoZWNrIG1vZGVscyBvbmx5IGluIGRldiBtb2RlXG4gICAqL1xuICBEZXZNb2RlT25seSA9IFwiZGV2TW9kZU9ubHlcIixcbiAgLyoqXG4gICAqIEF1dG8gdHlwZSBjaGVjayBtb2RlbHMgbm8gbWF0dGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50XG4gICAqL1xuICBBbHdheXNPbiA9IFwiYWx3YXlzT25cIixcbiAgLyoqXG4gICAqIERvIG5vdCBhdXRvIHR5cGUgY2hlY2sgbW9kZWxzIG5vIG1hdHRlciB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICAgKi9cbiAgQWx3YXlzT2ZmID0gXCJhbHdheXNPZmZcIixcbn1cblxuLyoqXG4gKiBHbG9iYWwgY29uZmlnIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxDb25maWcge1xuICAvKipcbiAgICogTW9kZWwgYXV0byB0eXBlLWNoZWNraW5nIG1vZGUuXG4gICAqL1xuICBtb2RlbEF1dG9UeXBlQ2hlY2tpbmc6IE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGVcblxuICAvKipcbiAgICogSUQgZ2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBtb2RlbCBpZHMuXG4gICAqL1xuICBtb2RlbElkR2VuZXJhdG9yKCk6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBbGxvdyBhcnJheSBlbGVtZW50cyB0byBiZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGFsbG93VW5kZWZpbmVkQXJyYXlFbGVtZW50czogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIHdhcm5pbmdzIHJlbGF0ZWQgdG8gZHVwbGljYXRlZCBtb2RlbCBuYW1lcyAoZGVmYXVsdHMgdG8gYHRydWVgKS5cbiAgICogVXN1YWxseSBzZXQgdG8gZmFsc2UgaW4gdGVzdCBlbnZpcm9ubWVudHMgKGUuZy4gamVzdCkuXG4gICAqL1xuICBzaG93RHVwbGljYXRlTW9kZWxOYW1lV2FybmluZ3M6IGJvb2xlYW5cbn1cblxubGV0IGxvY2FsSWQgPSAwXG5jb25zdCBsb2NhbEJhc2VJZCA9IG5hbm9pZCgpXG5cbmZ1bmN0aW9uIGRlZmF1bHRNb2RlbElkR2VuZXJhdG9yKCk6IHN0cmluZyB7XG4gIC8vIHdlIHVzZSBiYXNlIDM2IGZvciBsb2NhbCBpZCBzaW5jZSBpdCBpcyBzaG9ydCBhbmQgZmFzdFxuICBjb25zdCBpZCA9IGxvY2FsSWQudG9TdHJpbmcoMzYpICsgXCItXCIgKyBsb2NhbEJhc2VJZFxuICBsb2NhbElkKytcbiAgcmV0dXJuIGlkXG59XG5cbi8vIGRlZmF1bHRzXG5sZXQgZ2xvYmFsQ29uZmlnOiBHbG9iYWxDb25maWcgPSB7XG4gIG1vZGVsQXV0b1R5cGVDaGVja2luZzogTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZS5EZXZNb2RlT25seSxcbiAgbW9kZWxJZEdlbmVyYXRvcjogZGVmYXVsdE1vZGVsSWRHZW5lcmF0b3IsXG4gIGFsbG93VW5kZWZpbmVkQXJyYXlFbGVtZW50czogZmFsc2UsXG4gIHNob3dEdXBsaWNhdGVNb2RlbE5hbWVXYXJuaW5nczogdHJ1ZSxcbn1cblxuLyoqXG4gKiBQYXJ0aWFsbHkgc2V0cyB0aGUgY3VycmVudCBnbG9iYWwgY29uZmlnLlxuICpcbiAqIEBwYXJhbSBjb25maWcgUGFydGlhbCBvYmplY3Qgd2l0aCB0aGUgbmV3IGNvbmZpZ3VyYXRpb25zLiBPcHRpb25zIG5vdCBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0IHdvbid0IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRHbG9iYWxDb25maWcoY29uZmlnOiBQYXJ0aWFsPEdsb2JhbENvbmZpZz4pIHtcbiAgZ2xvYmFsQ29uZmlnID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4uZ2xvYmFsQ29uZmlnLFxuICAgIC4uLmNvbmZpZyxcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGdsb2JhbCBjb25maWcgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxDb25maWcoKTogUmVhZG9ubHk8R2xvYmFsQ29uZmlnPiB7XG4gIHJldHVybiBnbG9iYWxDb25maWdcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBSZXR1cm5zIGlmIHRoZSBhdXRvIHR5cGUgY2hlY2tpbmcgZm9yIG1vZGVscyBpcyBlbmFibGVkLlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSB7XG4gIHN3aXRjaCAoZ2V0R2xvYmFsQ29uZmlnKCkubW9kZWxBdXRvVHlwZUNoZWNraW5nKSB7XG4gICAgY2FzZSBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlLkRldk1vZGVPbmx5OlxuICAgICAgcmV0dXJuIGluRGV2TW9kZSgpXG4gICAgY2FzZSBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlLkFsd2F5c09mZjpcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIGNhc2UgTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZS5BbHdheXNPbjpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkICdtb2RlbEF1dG9UeXBlQ2hlY2tpbmcnIGNvbmZpZyB2YWx1ZSAtICR7Z2xvYmFsQ29uZmlnLm1vZGVsQXV0b1R5cGVDaGVja2luZ31gXG4gICAgICApXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuL0Jhc2VNb2RlbFNoYXJlZFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBtb2RlbEluaXRpYWxpemVyc1N5bWJvbCA9IFN5bWJvbChcIm1vZGVsSW5pdGlhbGl6ZXJzXCIpXG5cbnR5cGUgTW9kZWxDbGFzc0luaXRpYWxpemVyID0gKG1vZGVsSW5zdGFuY2U6IEFueU1vZGVsIHwgQW55RGF0YU1vZGVsKSA9PiB2b2lkXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRNb2RlbENsYXNzSW5pdGlhbGl6ZXIoXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+LFxuICBpbml0OiBNb2RlbENsYXNzSW5pdGlhbGl6ZXJcbikge1xuICBsZXQgaW5pdGlhbGl6ZXJzID0gKG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbEluaXRpYWxpemVyc1N5bWJvbF1cbiAgaWYgKCFpbml0aWFsaXplcnMpIHtcbiAgICBpbml0aWFsaXplcnMgPSBbXVxuICAgIDsobW9kZWxDbGFzcyBhcyBhbnkpW21vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sXSA9IGluaXRpYWxpemVyc1xuICB9XG4gIGluaXRpYWxpemVycy5wdXNoKGluaXQpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbENsYXNzSW5pdGlhbGl6ZXJzKFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPlxuKTogTW9kZWxDbGFzc0luaXRpYWxpemVyW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gKG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbEluaXRpYWxpemVyc1N5bWJvbF1cbn1cbiIsImltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgZ2V0TW9kZWxDbGFzc0luaXRpYWxpemVycyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbENsYXNzSW5pdGlhbGl6ZXJcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2RlbEluaXRpYWxpemVycyhcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4sXG4gIG1vZGVsT2JqOiBhbnlcbikge1xuICBjb25zdCBpbml0aWFsaXplcnMgPSBnZXRNb2RlbENsYXNzSW5pdGlhbGl6ZXJzKG1vZGVsQ2xhc3MpXG4gIGlmIChpbml0aWFsaXplcnMpIHtcbiAgICBjb25zdCBsZW4gPSBpbml0aWFsaXplcnMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgaW5pdCA9IGluaXRpYWxpemVyc1tpXVxuICAgICAgaW5pdChtb2RlbE9iailcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcblxuZnVuY3Rpb24gY2FuV3JpdGUoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZ2V0QWN0aW9uUHJvdGVjdGlvbigpIHx8ICEhZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2FuV3JpdGUoKSB7XG4gIGlmICghY2FuV3JpdGUoKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJkYXRhIGNoYW5nZXMgbXVzdCBiZSBwZXJmb3JtZWQgaW5zaWRlIG1vZGVsIGFjdGlvbnNcIilcbiAgfVxufVxuXG5sZXQgYWN0aW9uUHJvdGVjdGlvbiA9IHRydWVcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBHZXRzIGlmIHRoZSBhY3Rpb24gcHJvdGVjdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZCBvciBub3QuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvblByb3RlY3Rpb24oKSB7XG4gIHJldHVybiBhY3Rpb25Qcm90ZWN0aW9uXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogU2V0cyBpZiB0aGUgYWN0aW9uIHByb3RlY3Rpb24gaXMgY3VycmVudGx5IGVuYWJsZWQgb3Igbm90LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aW9uUHJvdGVjdGlvbihwcm90ZWN0aW9uOiBib29sZWFuKSB7XG4gIGFjdGlvblByb3RlY3Rpb24gPSBwcm90ZWN0aW9uXG59XG4iLCJpbXBvcnQgeyBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgZ2V0QWN0aW9uUHJvdGVjdGlvbiB9IGZyb20gXCIuL3Byb3RlY3Rpb25cIlxuXG5jb25zdCBwZW5kaW5nQWN0aW9uczogKCgpID0+IHZvaWQpW10gPSBbXVxuXG5mdW5jdGlvbiBpc0FjdGlvblJ1bm5pbmcoKSB7XG4gIHJldHVybiAhZ2V0QWN0aW9uUHJvdGVjdGlvbigpIHx8IGdldEN1cnJlbnRBY3Rpb25Db250ZXh0KClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVucXVldWVQZW5kaW5nQWN0aW9uKGFjdGlvbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAvLyBkZWxheSBhY3Rpb24gdW50aWwgYWxsIGN1cnJlbnQgYWN0aW9ucyBhcmUgZmluaXNoZWRcbiAgaWYgKGlzQWN0aW9uUnVubmluZygpKSB7XG4gICAgcGVuZGluZ0FjdGlvbnMucHVzaChhY3Rpb24pXG4gIH0gZWxzZSB7XG4gICAgYWN0aW9uKClcbiAgfVxufVxuXG5sZXQgcGVuZGluZ0FjdGlvbnNSdW5uaW5nID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJ1blBlbmRpbmdBY3Rpb25zKCk6IHZvaWQge1xuICBpZiAoaXNBY3Rpb25SdW5uaW5nKCkgfHwgcGVuZGluZ0FjdGlvbnNSdW5uaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBwZW5kaW5nQWN0aW9uc1J1bm5pbmcgPSB0cnVlXG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAocGVuZGluZ0FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV4dEFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLnNoaWZ0KCkhXG4gICAgICBuZXh0QWN0aW9uKClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcGVuZGluZ0FjdGlvbnNSdW5uaW5nID0gZmFsc2VcbiAgfVxufVxuIiwiLyoqXG4gKiBBIGhvb2sgYWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBIb29rQWN0aW9uIHtcbiAgLyoqXG4gICAqIG9uSW5pdCBob29rXG4gICAqL1xuICBPbkluaXQgPSBcIiQkb25Jbml0XCIsXG4gIC8qKlxuICAgKiBvbkxhenlJbml0IGhvb2tcbiAgICovXG4gIE9uTGF6eUluaXQgPSBcIiQkb25MYXp5SW5pdFwiLFxuICAvKipcbiAgICogb25BdHRhY2hlZFRvUm9vdFN0b3JlIGhvb2tcbiAgICovXG4gIE9uQXR0YWNoZWRUb1Jvb3RTdG9yZSA9IFwiJCRvbkF0dGFjaGVkVG9Sb290U3RvcmVcIixcbiAgLyoqXG4gICAqIGRpc3Bvc2VyIGZvciBvbkF0dGFjaGVkVG9Sb290U3RvcmUgaG9va1xuICAgKi9cbiAgT25BdHRhY2hlZFRvUm9vdFN0b3JlRGlzcG9zZXIgPSBcIiQkb25BdHRhY2hlZFRvUm9vdFN0b3JlRGlzcG9zZXJcIixcbn1cblxuY29uc3QgaG9va0FjdGlvblZhbHVlczogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoT2JqZWN0LnZhbHVlcyhIb29rQWN0aW9uKSlcblxuLyoqXG4gKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gYWN0aW9uIG5hbWUgY29ycmVzcG9uZHMgdG8gYSBob29rLCB0aGlzIGlzLCBvbmUgb2Y6XG4gKiAtIG9uSW5pdCgpIGhvb2tcbiAqIC0gb25MYXp5SW5pdCgpIGhvb2tcbiAqIC0gb25BdHRhY2hlZFRvUm9vdFN0b3JlKCkgaG9va1xuICogLSBkaXNwb3NlciByZXR1cm5lZCBieSBhIG9uQXR0YWNoZWRUb1Jvb3RTdG9yZSgpIGhvb2tcbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBBY3Rpb24gbmFtZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBob29rLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hvb2tBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nKTogYWN0aW9uTmFtZSBpcyBIb29rQWN0aW9uIHtcbiAgcmV0dXJuIGhvb2tBY3Rpb25WYWx1ZXMuaGFzKGFjdGlvbk5hbWUpXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNyZWF0ZUF0b20sIElBdG9tLCBvYnNlcnZhYmxlLCBPYnNlcnZhYmxlU2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudCB9IGZyb20gXCIuL3BhdGhcIlxuXG5jb25zdCBkZWZhdWx0T2JzZXJ2YWJsZVNldE9wdGlvbnMgPSB7IGRlZXA6IGZhbHNlIH1cblxuaW50ZXJmYWNlIERlZXBPYmplY3RDaGlsZHJlbiB7XG4gIGRlZXA6IFNldDxvYmplY3Q+XG5cbiAgZXh0ZW5zaW9uc0RhdGE6IFdlYWtNYXA8U3ltYm9sLCBhbnk+XG59XG5cbmludGVyZmFjZSBPYmplY3RDaGlsZHJlbkRhdGEgZXh0ZW5kcyBEZWVwT2JqZWN0Q2hpbGRyZW4ge1xuICBzaGFsbG93OiBPYnNlcnZhYmxlU2V0PG9iamVjdD5cblxuICBkZWVwRGlydHk6IGJvb2xlYW5cbiAgZGVlcEF0b206IElBdG9tXG59XG5cbmNvbnN0IG9iamVjdENoaWxkcmVuID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBPYmplY3RDaGlsZHJlbkRhdGE+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVPYmplY3RDaGlsZHJlbihub2RlOiBvYmplY3QpIHtcbiAgaWYgKG9iamVjdENoaWxkcmVuLmhhcyhub2RlKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgb2JqZWN0Q2hpbGRyZW4uc2V0KG5vZGUsIHtcbiAgICBzaGFsbG93OiBvYnNlcnZhYmxlLnNldCh1bmRlZmluZWQsIGRlZmF1bHRPYnNlcnZhYmxlU2V0T3B0aW9ucyksXG5cbiAgICBkZWVwOiBuZXcgU2V0KCksXG4gICAgZXh0ZW5zaW9uc0RhdGE6IGluaXRFeHRlbnNpb25zRGF0YSgpLFxuXG4gICAgZGVlcERpcnR5OiB0cnVlLFxuICAgIGRlZXBBdG9tOiBjcmVhdGVBdG9tKFwiZGVlcENoaWxkcmVuQXRvbVwiKSxcbiAgfSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdENoaWxkcmVuKG5vZGU6IG9iamVjdCk6IE9iamVjdENoaWxkcmVuRGF0YVtcInNoYWxsb3dcIl0ge1xuICByZXR1cm4gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIS5zaGFsbG93XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWVwT2JqZWN0Q2hpbGRyZW4obm9kZTogb2JqZWN0KTogRGVlcE9iamVjdENoaWxkcmVuIHtcbiAgY29uc3Qgb2JqID0gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIVxuXG4gIGlmIChvYmouZGVlcERpcnR5KSB7XG4gICAgdXBkYXRlRGVlcE9iamVjdENoaWxkcmVuKG5vZGUpXG4gIH1cblxuICBvYmouZGVlcEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gYWRkTm9kZVRvRGVlcExpc3RzKG5vZGU6IGFueSwgZGF0YTogRGVlcE9iamVjdENoaWxkcmVuKSB7XG4gIGRhdGEuZGVlcC5hZGQobm9kZSlcbiAgZXh0ZW5zaW9ucy5mb3JFYWNoKChleHRlbnNpb24sIGRhdGFTeW1ib2wpID0+IHtcbiAgICBleHRlbnNpb24uYWRkTm9kZShub2RlLCBkYXRhLmV4dGVuc2lvbnNEYXRhLmdldChkYXRhU3ltYm9sKSlcbiAgfSlcbn1cblxuY29uc3QgdXBkYXRlRGVlcE9iamVjdENoaWxkcmVuID0gYWN0aW9uKChub2RlOiBvYmplY3QpOiBEZWVwT2JqZWN0Q2hpbGRyZW4gPT4ge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG4gIGlmICghb2JqLmRlZXBEaXJ0eSkge1xuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGNvbnN0IGRhdGE6IERlZXBPYmplY3RDaGlsZHJlbiA9IHtcbiAgICBkZWVwOiBuZXcgU2V0KCksXG4gICAgZXh0ZW5zaW9uc0RhdGE6IGluaXRFeHRlbnNpb25zRGF0YSgpLFxuICB9XG5cbiAgY29uc3QgY2hpbGRyZW5JdGVyID0gZ2V0T2JqZWN0Q2hpbGRyZW4obm9kZSkhLnZhbHVlcygpXG4gIGxldCBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgd2hpbGUgKCFjaC5kb25lKSB7XG4gICAgYWRkTm9kZVRvRGVlcExpc3RzKGNoLnZhbHVlLCBkYXRhKVxuXG4gICAgY29uc3QgcmV0ID0gdXBkYXRlRGVlcE9iamVjdENoaWxkcmVuKGNoLnZhbHVlKS5kZWVwXG4gICAgY29uc3QgcmV0SXRlciA9IHJldC52YWx1ZXMoKVxuICAgIGxldCByZXRDdXIgPSByZXRJdGVyLm5leHQoKVxuICAgIHdoaWxlICghcmV0Q3VyLmRvbmUpIHtcbiAgICAgIGFkZE5vZGVUb0RlZXBMaXN0cyhyZXRDdXIudmFsdWUsIGRhdGEpXG4gICAgICByZXRDdXIgPSByZXRJdGVyLm5leHQoKVxuICAgIH1cblxuICAgIGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB9XG5cbiAgT2JqZWN0LmFzc2lnbihvYmosIGRhdGEpXG5cbiAgb2JqLmRlZXBEaXJ0eSA9IGZhbHNlXG4gIG9iai5kZWVwQXRvbS5yZXBvcnRDaGFuZ2VkKClcblxuICByZXR1cm4gb2JqXG59KVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYWRkT2JqZWN0Q2hpbGQgPSBhY3Rpb24oKG5vZGU6IG9iamVjdCwgY2hpbGQ6IG9iamVjdCkgPT4ge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG4gIG9iai5zaGFsbG93LmFkZChjaGlsZClcblxuICBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKG5vZGUpXG59KVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlT2JqZWN0Q2hpbGQgPSBhY3Rpb24oKG5vZGU6IG9iamVjdCwgY2hpbGQ6IG9iamVjdCkgPT4ge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG4gIG9iai5zaGFsbG93LmRlbGV0ZShjaGlsZClcblxuICBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKG5vZGUpXG59KVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKG5vZGU6IG9iamVjdCkge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG5cbiAgaWYgKCFvYmouZGVlcERpcnR5KSB7XG4gICAgb2JqLmRlZXBEaXJ0eSA9IHRydWVcbiAgICBvYmouZGVlcEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBjb25zdCBwYXJlbnQgPSBmYXN0R2V0UGFyZW50KG5vZGUpXG4gIGlmIChwYXJlbnQpIHtcbiAgICBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKHBhcmVudClcbiAgfVxufVxuXG5jb25zdCBleHRlbnNpb25zID0gbmV3IE1hcDxTeW1ib2wsIERlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbjxhbnk+PigpXG5cbmludGVyZmFjZSBEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248RD4ge1xuICBpbml0RGF0YSgpOiBEXG4gIGFkZE5vZGUobm9kZTogYW55LCBkYXRhOiBEKTogdm9pZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248RD4oZXh0ZW5zaW9uOiBEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248RD4pIHtcbiAgY29uc3QgZGF0YVN5bWJvbCA9IFN5bWJvbChcImRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvblwiKVxuICBleHRlbnNpb25zLnNldChkYXRhU3ltYm9sLCBleHRlbnNpb24pXG5cbiAgcmV0dXJuIChkYXRhOiBEZWVwT2JqZWN0Q2hpbGRyZW4pOiBEID0+IHtcbiAgICByZXR1cm4gZGF0YS5leHRlbnNpb25zRGF0YS5nZXQoZGF0YVN5bWJvbCkgYXMgRFxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRFeHRlbnNpb25zRGF0YSgpIHtcbiAgY29uc3QgZXh0ZW5zaW9uc0RhdGEgPSBuZXcgTWFwPFN5bWJvbCwgYW55PigpXG5cbiAgZXh0ZW5zaW9ucy5mb3JFYWNoKChleHRlbnNpb24sIGRhdGFTeW1ib2wpID0+IHtcbiAgICBleHRlbnNpb25zRGF0YS5zZXQoZGF0YVN5bWJvbCwgZXh0ZW5zaW9uLmluaXREYXRhKCkpXG4gIH0pXG5cbiAgcmV0dXJuIGV4dGVuc2lvbnNEYXRhXG59XG4iLCJpbXBvcnQgeyBjb21wdXRlZCwgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBnZXRPYmplY3RDaGlsZHJlbiB9IGZyb20gXCIuL2NvcmVPYmplY3RDaGlsZHJlblwiXG5cbi8qKlxuICogTW9kZSBmb3IgdGhlIGB3YWxrVHJlZWAgbWV0aG9kLlxuICovXG5leHBvcnQgZW51bSBXYWxrVHJlZU1vZGUge1xuICAvKipcbiAgICogVGhlIHdhbGsgd2lsbCBiZSBkb25lIHBhcmVudCAocm9vdHMpIGZpcnN0LCB0aGVuIGNoaWxkcmVuLlxuICAgKi9cbiAgUGFyZW50Rmlyc3QgPSBcInBhcmVudEZpcnN0XCIsXG4gIC8qKlxuICAgKiBUaGUgd2FsayB3aWxsIGJlIGRvbmUgY2hpbGRyZW4gKGxlYWZzKSBmaXJzdCwgdGhlbiBwYXJlbnRzLlxuICAgKi9cbiAgQ2hpbGRyZW5GaXJzdCA9IFwiY2hpbGRyZW5GaXJzdFwiLFxufVxuXG4vKipcbiAqIFdhbGtzIGEgdHJlZSwgcnVubmluZyB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIHJldHVybnMgc29tZXRoaW5nIG90aGVyIHRoYW4gdW5kZWZpbmVkLFxuICogdGhlbiB0aGUgd2FsayB3aWxsIGJlIHN0b3BwZWQgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgcmV0dXJuZWQgdmFsdWUuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybmVkIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byB2b2lkLlxuICogQHBhcmFtIHJvb3QgU3VidHJlZSByb290IG9iamVjdC5cbiAqIEBwYXJhbSB2aXNpdCBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgcnVuIGZvciBlYWNoIG5vZGUgb2YgdGhlIHRyZWUuXG4gKiBAcGFyYW0gbW9kZSBNb2RlIHRvIHdhbGsgdGhlIHRyZWUsIGFzIGRlZmluZWQgaW4gYFdhbGtUcmVlTW9kZWAuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd2Fsa1RyZWU8VCA9IHZvaWQ+KFxuICByb290OiBvYmplY3QsXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBUIHwgdW5kZWZpbmVkLFxuICBtb2RlOiBXYWxrVHJlZU1vZGVcbik6IFQgfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHJvb3QsIFwicm9vdFwiKVxuXG4gIGlmIChtb2RlID09PSBXYWxrVHJlZU1vZGUuUGFyZW50Rmlyc3QpIHtcbiAgICByZXR1cm4gd2Fsa1RyZWVQYXJlbnRGaXJzdChyb290LCB2aXNpdClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gd2Fsa1RyZWVDaGlsZHJlbkZpcnN0KHJvb3QsIHZpc2l0KVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhbGtUcmVlUGFyZW50Rmlyc3Q8VCA9IHZvaWQ+KFxuICByb290OiBvYmplY3QsXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhY2s6IG9iamVjdFtdID0gW3Jvb3RdXG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhXG5cbiAgICBjb25zdCByZXQgPSB2aXNpdChub2RlKVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0T2JqZWN0Q2hpbGRyZW4obm9kZSkhXG5cbiAgICBzdGFjay5sZW5ndGggKz0gY2hpbGRyZW4uc2l6ZVxuICAgIGxldCBpID0gc3RhY2subGVuZ3RoIC0gMVxuXG4gICAgY29uc3QgY2hpbGRyZW5JdGVyID0gY2hpbGRyZW4hLnZhbHVlcygpXG4gICAgbGV0IGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICAgIHdoaWxlICghY2guZG9uZSkge1xuICAgICAgc3RhY2tbaS0tXSA9IGNoLnZhbHVlXG4gICAgICBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHdhbGtUcmVlQ2hpbGRyZW5GaXJzdDxUID0gdm9pZD4oXG4gIHJvb3Q6IG9iamVjdCxcbiAgdmlzaXQ6IChub2RlOiBvYmplY3QpID0+IFQgfCB1bmRlZmluZWRcbik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaGlsZHJlbkl0ZXIgPSBnZXRPYmplY3RDaGlsZHJlbihyb290KSEudmFsdWVzKClcbiAgbGV0IGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB3aGlsZSAoIWNoLmRvbmUpIHtcbiAgICBjb25zdCByZXQgPSB3YWxrVHJlZUNoaWxkcmVuRmlyc3QoY2gudmFsdWUsIHZpc2l0KVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgICBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgfVxuXG4gIGNvbnN0IHJldCA9IHZpc2l0KHJvb3QpXG4gIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPFI+IHtcbiAgd2Fsayh0YXJnZXQ6IG9iamVjdCk6IE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGdldENvbXB1dGVkVHJlZVJlc3VsdDxSPihcbiAgY29tcHV0ZWRGbnM6IFdlYWtNYXA8b2JqZWN0LCBJQ29tcHV0ZWRWYWx1ZTxNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZD4+LFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gUiB8IHVuZGVmaW5lZCxcbiAgdHJlZTogb2JqZWN0XG4pOiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjbXB0ZWQgPSBjb21wdXRlZEZucy5nZXQodHJlZSlcbiAgaWYgKCFjbXB0ZWQpIHtcbiAgICBjbXB0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gd2Fsa1RyZWVBZ2dyZWdhdGUodHJlZSwgdmlzaXQsIChjaCkgPT4gZ2V0Q29tcHV0ZWRUcmVlUmVzdWx0KGNvbXB1dGVkRm5zLCB2aXNpdCwgY2gpKVxuICAgIH0pXG4gICAgY29tcHV0ZWRGbnMuc2V0KHRyZWUsIGNtcHRlZClcbiAgfVxuICByZXR1cm4gY21wdGVkLmdldCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPFI+KFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gUiB8IHVuZGVmaW5lZFxuKTogQ29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZTxSPiB7XG4gIGNvbnN0IGNvbXB1dGVkRm5zID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQ29tcHV0ZWRWYWx1ZTxNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZD4+KClcblxuICByZXR1cm4ge1xuICAgIHdhbGs6IChuKSA9PiBnZXRDb21wdXRlZFRyZWVSZXN1bHQoY29tcHV0ZWRGbnMsIHZpc2l0LCBuKSxcbiAgfVxufVxuXG5mdW5jdGlvbiB3YWxrVHJlZUFnZ3JlZ2F0ZTxSPihcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBSIHwgdW5kZWZpbmVkLFxuICByZWN1cnNlOiAobm9kZTogb2JqZWN0KSA9PiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZFxuKTogTWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWQge1xuICBsZXQgbWFwOiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZFxuICBjb25zdCByb290VmFsID0gdmlzaXQodGFyZ2V0KVxuXG4gIGNvbnN0IGNoaWxkcmVuTWFwID0gZ2V0T2JqZWN0Q2hpbGRyZW4odGFyZ2V0KSFcbiAgY29uc3QgY2hpbGRyZW5JdGVyID0gY2hpbGRyZW5NYXAhLnZhbHVlcygpXG4gIGxldCBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcblxuICAvLyBzbWFsbCBvcHRpbWl6YXRpb24sIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNoaWxkIGFuZCB0aGlzXG4gIC8vIG9iamVjdCBwcm92aWRlcyBubyB2YWx1ZSB3ZSBjYW4ganVzdCByZXVzZSB0aGUgY2hpbGQgb25lc1xuICBpZiAocm9vdFZhbCA9PT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuTWFwLnNpemUgPT09IDEpIHtcbiAgICByZXR1cm4gcmVjdXJzZShjaC52YWx1ZSlcbiAgfVxuXG4gIHdoaWxlICghY2guZG9uZSkge1xuICAgIGNvbnN0IGNoaWxkTWFwID0gcmVjdXJzZShjaC52YWx1ZSlcblxuICAgIGlmIChjaGlsZE1hcCkge1xuICAgICAgaWYgKCFtYXApIHtcbiAgICAgICAgbWFwID0gbmV3IE1hcCgpXG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBjaGlsZCBtYXAga2V5cy92YWx1ZXMgdG8gb3duIG1hcFxuICAgICAgY29uc3QgbWFwSXRlciA9IGNoaWxkTWFwLmtleXMoKVxuXG4gICAgICBsZXQgbWFwQ3VyID0gbWFwSXRlci5uZXh0KClcbiAgICAgIHdoaWxlICghbWFwQ3VyLmRvbmUpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWFwQ3VyLnZhbHVlXG4gICAgICAgIGNvbnN0IHZhbCA9IGNoaWxkTWFwLmdldChrZXkpIVxuICAgICAgICBtYXAuc2V0KGtleSwgdmFsKVxuICAgICAgICBtYXBDdXIgPSBtYXBJdGVyLm5leHQoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB9XG5cbiAgLy8gYWRkIGl0IGF0IHRoZSBlbmQgc28gcGFyZW50IHJlc29sdXRpb25zIGhhdmUgaGlnaGVyXG4gIC8vIHByaW9yaXR5IHRoYW4gY2hpbGQgb25lc1xuICBpZiAocm9vdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFtYXApIHtcbiAgICAgIG1hcCA9IG5ldyBNYXAoKVxuICAgIH1cbiAgICBtYXAuc2V0KHJvb3RWYWwsIHRhcmdldClcbiAgfVxuXG4gIHJldHVybiBtYXBcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IEhvb2tBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2hvb2tBY3Rpb25zXCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiwgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZCB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB7IEFueU1vZGVsLCBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IHdhbGtUcmVlLCBXYWxrVHJlZU1vZGUgfSBmcm9tIFwiLi4vcGFyZW50L3dhbGtUcmVlXCJcblxuY29uc3Qgb25BdHRhY2hlZERpc3Bvc2VycyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgKCkgPT4gdm9pZD4oKVxuY29uc3QgYXR0YWNoZWRUb1Jvb3RTdG9yZSA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYXR0YWNoVG9Sb290U3RvcmUgPSBhY3Rpb24oXG4gIFwiYXR0YWNoVG9Sb290U3RvcmVcIixcbiAgKHJvb3RTdG9yZTogb2JqZWN0LCBjaGlsZDogb2JqZWN0KTogdm9pZCA9PiB7XG4gICAgLy8gd2UgdXNlIGFuIGFycmF5IHRvIGVuc3VyZSB0aGV5IHdpbGwgZ2V0IGNhbGxlZCBldmVuIGlmIHRoZSBhY3R1YWwgaG9vayBtb2RpZmllcyB0aGUgdHJlZVxuICAgIGNvbnN0IGNoaWxkcmVuVG9DYWxsOiBBbnlNb2RlbFtdID0gW11cblxuICAgIHdhbGtUcmVlKFxuICAgICAgY2hpbGQsXG4gICAgICAoY2gpID0+IHtcbiAgICAgICAgLy8gd2UgdXNlIHRoaXMgdG8gYXZvaWQgY2FsbGluZyBvbkF0dGFjaGVkVG9Sb290U3RvcmVcbiAgICAgICAgLy8gdHdpY2VcbiAgICAgICAgaWYgKGF0dGFjaGVkVG9Sb290U3RvcmUuaGFzKGNoKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGF0dGFjaGVkVG9Sb290U3RvcmUuYWRkKGNoKVxuXG4gICAgICAgIGlmIChjaCBpbnN0YW5jZW9mIEJhc2VNb2RlbCAmJiAoY2ggYXMgYW55KS5vbkF0dGFjaGVkVG9Sb290U3RvcmUpIHtcbiAgICAgICAgICB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkKFxuICAgICAgICAgICAgY2ggYXMgYW55LFxuICAgICAgICAgICAgXCJvbkF0dGFjaGVkVG9Sb290U3RvcmVcIixcbiAgICAgICAgICAgIEhvb2tBY3Rpb24uT25BdHRhY2hlZFRvUm9vdFN0b3JlXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY2hpbGRyZW5Ub0NhbGwucHVzaChjaCBhcyBBbnlNb2RlbClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFdhbGtUcmVlTW9kZS5QYXJlbnRGaXJzdFxuICAgIClcblxuICAgIGNvbnN0IGNoaWxkcmVuVG9DYWxsTGVuID0gY2hpbGRyZW5Ub0NhbGwubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlblRvQ2FsbExlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjaCA9IGNoaWxkcmVuVG9DYWxsW2ldXG5cbiAgICAgIGNvbnN0IGRpc3Bvc2VyID0gKGNoIGFzIGFueSkub25BdHRhY2hlZFRvUm9vdFN0b3JlIShyb290U3RvcmUpXG4gICAgICBpZiAoZGlzcG9zZXIpIHtcbiAgICAgICAgb25BdHRhY2hlZERpc3Bvc2Vycy5zZXQoY2gsIGRpc3Bvc2VyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGV0YWNoRnJvbVJvb3RTdG9yZSA9IGFjdGlvbihcImRldGFjaEZyb21Sb290U3RvcmVcIiwgKGNoaWxkOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgLy8gd2UgdXNlIGFuIGFycmF5IHRvIGVuc3VyZSB0aGV5IHdpbGwgZ2V0IGNhbGxlZCBldmVuIGlmIHRoZSBhY3R1YWwgaG9vayBtb2RpZmllcyB0aGUgdHJlZVxuICBjb25zdCBkaXNwb3NlcnNUb0NhbGw6ICgoKSA9PiB2b2lkKVtdID0gW11cblxuICB3YWxrVHJlZShcbiAgICBjaGlsZCxcbiAgICAoY2gpID0+IHtcbiAgICAgIGlmICghYXR0YWNoZWRUb1Jvb3RTdG9yZS5kZWxldGUoY2gpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXNwb3NlciA9IG9uQXR0YWNoZWREaXNwb3NlcnMuZ2V0KGNoKVxuICAgICAgaWYgKGRpc3Bvc2VyKSB7XG4gICAgICAgIC8vIHdyYXAgZGlzcG9zZXIgaW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IGRpc3Bvc2VyQWN0aW9uID0gd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICBuYW1lT3JOYW1lRm46IEhvb2tBY3Rpb24uT25BdHRhY2hlZFRvUm9vdFN0b3JlRGlzcG9zZXIsXG4gICAgICAgICAgZm46IGRpc3Bvc2VyLFxuICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gICAgICAgIH0pLmJpbmQoY2gpXG4gICAgICAgIG9uQXR0YWNoZWREaXNwb3NlcnMuZGVsZXRlKGNoKVxuXG4gICAgICAgIGRpc3Bvc2Vyc1RvQ2FsbC5wdXNoKGRpc3Bvc2VyQWN0aW9uKVxuICAgICAgfVxuICAgIH0sXG4gICAgV2Fsa1RyZWVNb2RlLkNoaWxkcmVuRmlyc3RcbiAgKVxuXG4gIGNvbnN0IGRpc3Bvc2Vyc1RvQ2FsbExlbiA9IGRpc3Bvc2Vyc1RvQ2FsbC5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwb3NlcnNUb0NhbGxMZW47IGkrKykge1xuICAgIGRpc3Bvc2Vyc1RvQ2FsbFtpXSgpXG4gIH1cbn0pXG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNyZWF0ZUF0b20sIElBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFJvb3QsIGlzUm9vdCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB7IGF0dGFjaFRvUm9vdFN0b3JlLCBkZXRhY2hGcm9tUm9vdFN0b3JlIH0gZnJvbSBcIi4vYXR0YWNoRGV0YWNoXCJcblxuY29uc3Qgcm9vdFN0b3JlcyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuY29uc3Qgcm9vdFN0b3JlQXRvbXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIElBdG9tPigpXG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgbW9kZWwgLyB0cmVlIG5vZGUgb2JqZWN0IGFzIGEgcm9vdCBzdG9yZSB0cmVlLlxuICogTWFya2luZyBhIG1vZGVsIG9iamVjdCBhcyBhIHJvb3Qgc3RvcmUgdHJlZSBzZXJ2ZXMgc2V2ZXJhbCBwdXJwb3NlczpcbiAqIC0gSXQgYWxsb3dzIHRoZSBgb25BdHRhY2hlZFRvUm9vdFN0b3JlYCBob29rIChwbHVzIGRpc3Bvc2VyKSB0byBiZSBpbnZva2VkIG9uIG1vZGVscyBvbmNlIHRoZXkgYmVjb21lIHBhcnQgb2YgdGhpcyB0cmVlLlxuICogICBUaGVzZSBob29rcyBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBhdHRhY2ggZWZmZWN0cyBhbmQgc2VydmUgYXMgc29tZSBzb3J0IG9mIGluaXRpYWxpemF0aW9uLlxuICogLSBJdCBhbGxvd3MgYXV0byBkZXRhY2hhYmxlIHJlZmVyZW5jZXMgdG8gd29yayBwcm9wZXJseS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBOb2RlIG9iamVjdCB0byByZWdpc3RlciBhcyByb290IHN0b3JlLlxuICogQHJldHVybnMgVGhlIHNhbWUgbW9kZWwgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyUm9vdFN0b3JlOiA8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCkgPT4gVCA9IGFjdGlvbihcbiAgXCJyZWdpc3RlclJvb3RTdG9yZVwiLFxuICAobm9kZSkgPT4ge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICBpZiAocm9vdFN0b3Jlcy5oYXMobm9kZSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJvYmplY3QgYWxyZWFkeSByZWdpc3RlcmVkIGFzIHJvb3Qgc3RvcmVcIilcbiAgICB9XG5cbiAgICBpZiAoIWlzUm9vdChub2RlKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcm9vdCBzdG9yZSBtdXN0IG5vdCBoYXZlIGEgcGFyZW50XCIpXG4gICAgfVxuXG4gICAgcm9vdFN0b3Jlcy5hZGQobm9kZSlcblxuICAgIGF0dGFjaFRvUm9vdFN0b3JlKG5vZGUsIG5vZGUpXG5cbiAgICBnZXRPckNyZWF0ZVJvb3RTdG9yZUF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG4gICAgcmV0dXJuIG5vZGVcbiAgfVxuKVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIGFuIG9iamVjdCB0byBtYXJrIGl0IGFzIG5vIGxvbmdlciBhIHJvb3Qgc3RvcmUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSBvYmplY3QgdG8gdW5yZWdpc3RlciBhcyByb290IHN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgdW5yZWdpc3RlclJvb3RTdG9yZTogKG5vZGU6IG9iamVjdCkgPT4gdm9pZCA9IGFjdGlvbihcInVucmVnaXN0ZXJSb290U3RvcmVcIiwgKG5vZGUpID0+IHtcbiAgaWYgKCFpc1Jvb3RTdG9yZShub2RlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJub3QgYSByb290IHN0b3JlXCIpXG4gIH1cblxuICByb290U3RvcmVzLmRlbGV0ZShub2RlKVxuXG4gIGRldGFjaEZyb21Sb290U3RvcmUobm9kZSlcblxuICBnZXRPckNyZWF0ZVJvb3RTdG9yZUF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG59KVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIG9iamVjdCBpcyBtYXJrZWQgYXMgYSByb290IHN0b3JlLlxuICpcbiAqIEBwYXJhbSBub2RlIE9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jvb3RTdG9yZShub2RlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICByZXR1cm4gZmFzdElzUm9vdFN0b3JlKG5vZGUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0SXNSb290U3RvcmUobm9kZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGdldE9yQ3JlYXRlUm9vdFN0b3JlQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG4gIHJldHVybiByb290U3RvcmVzLmhhcyhub2RlKVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHJvb3Qgc3RvcmUgb2YgYSBnaXZlbiB0cmVlIGNoaWxkLCBvciB1bmRlZmluZWQgaWYgbm9uZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUm9vdCBzdG9yZSB0eXBlLlxuICogQHBhcmFtIG5vZGUgVGFyZ2V0IHRvIGZpbmQgdGhlIHJvb3Qgc3RvcmUgZm9yLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3RTdG9yZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBvYmplY3QpOiBUIHwgdW5kZWZpbmVkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICByZXR1cm4gZmFzdEdldFJvb3RTdG9yZShub2RlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFJvb3RTdG9yZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBvYmplY3QpOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IGZhc3RHZXRSb290KG5vZGUpXG4gIHJldHVybiBmYXN0SXNSb290U3RvcmUocm9vdCkgPyByb290IDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlUm9vdFN0b3JlQXRvbShub2RlOiBvYmplY3QpOiBJQXRvbSB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShyb290U3RvcmVBdG9tcywgbm9kZSwgKCkgPT4gY3JlYXRlQXRvbShcInJvb3RTdG9yZVwiKSlcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgaXNBY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGhFbGVtZW50IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiwgZGVsZXRlRnJvbUFycmF5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi9QYXRjaFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIge1xuICBwYXRjaGVzITogUGF0Y2hbXVxuICBpbnZQYXRjaGVzITogUGF0Y2hbXVxuXG4gIHJlY29yZChwYXRjaGVzOiBQYXRjaFtdLCBpbnZQYXRjaGVzOiBQYXRjaFtdKSB7XG4gICAgdGhpcy5wYXRjaGVzID0gcGF0Y2hlc1xuICAgIHRoaXMuaW52UGF0Y2hlcyA9IGludlBhdGNoZXNcbiAgfVxuXG4gIGVtaXQob2JqOiBvYmplY3QpIHtcbiAgICBlbWl0UGF0Y2gob2JqLCB0aGlzLnBhdGNoZXMsIHRoaXMuaW52UGF0Y2hlcywgdHJ1ZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuIGEgcGF0Y2ggaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgT25QYXRjaGVzTGlzdGVuZXIgPSAocGF0Y2hlczogUGF0Y2hbXSwgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW10pID0+IHZvaWRcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiBhIGdsb2JhbCBwYXRjaCBpcyBlbWl0dGVkLlxuICovXG5leHBvcnQgdHlwZSBPbkdsb2JhbFBhdGNoZXNMaXN0ZW5lciA9IChcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIHBhdGNoZXM6IFBhdGNoW10sXG4gIGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG4pID0+IHZvaWRcblxuLyoqXG4gKiBEaXNwb3NlciBmdW5jdGlvbiB0byBzdG9wIGxpc3RlbmluZyB0byBwYXRjaGVzLlxuICovXG5leHBvcnQgdHlwZSBPblBhdGNoZXNEaXNwb3NlciA9ICgpID0+IHZvaWRcblxuY29uc3QgcGF0Y2hMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcDxvYmplY3QsIE9uUGF0Y2hlc0xpc3RlbmVyW10+KClcbmNvbnN0IGdsb2JhbFBhdGNoTGlzdGVuZXJzOiBPbkdsb2JhbFBhdGNoZXNMaXN0ZW5lcltdID0gW11cblxuLyoqXG4gKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgcGF0Y2ggaXMgZ2VuZXJhdGVkIGZvciB0aGUgdHJlZSBvZiB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IG9iamVjdCBvZiB0aGUgcGF0Y2ggbGlzdGVuZXIuXG4gKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgZXZlcnl0aW1lIGEgcGF0Y2ggaXMgZ2VuZXJhdGVkIGZvciB0aGUgb2JqZWN0IG9yIGl0cyBjaGlsZHJlbi5cbiAqIEByZXR1cm5zIEEgZGlzcG9zZXIgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gcGF0Y2hlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uUGF0Y2hlcyhzdWJ0cmVlUm9vdDogb2JqZWN0LCBsaXN0ZW5lcjogT25QYXRjaGVzTGlzdGVuZXIpOiBPblBhdGNoZXNEaXNwb3NlciB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcbiAgYXNzZXJ0SXNGdW5jdGlvbihsaXN0ZW5lciwgXCJsaXN0ZW5lclwiKVxuXG4gIGlmICghaXNBY3Rpb24obGlzdGVuZXIpKSB7XG4gICAgbGlzdGVuZXIgPSBhY3Rpb24obGlzdGVuZXIubmFtZSB8fCBcIm9uUGF0Y2hlc0xpc3RlbmVyXCIsIGxpc3RlbmVyKVxuICB9XG5cbiAgbGV0IGxpc3RlbmVyc0Zvck9iamVjdCA9IHBhdGNoTGlzdGVuZXJzLmdldChzdWJ0cmVlUm9vdClcbiAgaWYgKCFsaXN0ZW5lcnNGb3JPYmplY3QpIHtcbiAgICBsaXN0ZW5lcnNGb3JPYmplY3QgPSBbXVxuICAgIHBhdGNoTGlzdGVuZXJzLnNldChzdWJ0cmVlUm9vdCwgbGlzdGVuZXJzRm9yT2JqZWN0KVxuICB9XG5cbiAgbGlzdGVuZXJzRm9yT2JqZWN0LnB1c2gobGlzdGVuZXIpXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZGVsZXRlRnJvbUFycmF5KGxpc3RlbmVyc0Zvck9iamVjdCEsIGxpc3RlbmVyKVxuICB9XG59XG5cbi8qKlxuICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIHBhdGNoIGlzIGdlbmVyYXRlZCBhbnl3aGVyZS5cbiAqIFVzdWFsbHkgcHJlZmVyIHVzaW5nIGBvblBhdGNoZXNgLlxuICpcbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBldmVyeXRpbWUgYSBwYXRjaCBpcyBnZW5lcmF0ZWQgYW55d2hlcmUuXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHBhdGNoZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkdsb2JhbFBhdGNoZXMobGlzdGVuZXI6IE9uR2xvYmFsUGF0Y2hlc0xpc3RlbmVyKTogT25QYXRjaGVzRGlzcG9zZXIge1xuICBhc3NlcnRJc0Z1bmN0aW9uKGxpc3RlbmVyLCBcImxpc3RlbmVyXCIpXG5cbiAgaWYgKCFpc0FjdGlvbihsaXN0ZW5lcikpIHtcbiAgICBsaXN0ZW5lciA9IGFjdGlvbihsaXN0ZW5lci5uYW1lIHx8IFwib25HbG9iYWxQYXRjaGVzTGlzdGVuZXJcIiwgbGlzdGVuZXIpXG4gIH1cblxuICBnbG9iYWxQYXRjaExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKVxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRlbGV0ZUZyb21BcnJheShnbG9iYWxQYXRjaExpc3RlbmVycywgbGlzdGVuZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFBhdGNoKFxuICBvYmo6IG9iamVjdCxcbiAgcGF0Y2hlczogUGF0Y2hbXSxcbiAgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW10sXG4gIGVtaXRHbG9iYWxseTogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChwYXRjaGVzLmxlbmd0aCA8PSAwICYmIGludmVyc2VQYXRjaGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBmaXJzdCBlbWl0IGdsb2JhbCBsaXN0ZW5lcnNcbiAgaWYgKGVtaXRHbG9iYWxseSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2xvYmFsUGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gZ2xvYmFsUGF0Y2hMaXN0ZW5lcnNbaV1cbiAgICAgIGxpc3RlbmVyKG9iaiwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpXG4gICAgfVxuICB9XG5cbiAgLy8gdGhlbiBwZXIgc3VidHJlZSBsaXN0ZW5lcnNcbiAgY29uc3QgbGlzdGVuZXJzRm9yT2JqZWN0ID0gcGF0Y2hMaXN0ZW5lcnMuZ2V0KG9iailcbiAgaWYgKGxpc3RlbmVyc0Zvck9iamVjdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzRm9yT2JqZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGxpc3RlbmVyc0Zvck9iamVjdFtpXVxuICAgICAgbGlzdGVuZXIocGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpXG4gICAgfVxuICB9XG5cbiAgLy8gYW5kIGFsc28gZW1pdCBzdWJ0cmVlIGxpc3RlbmVycyBhbGwgdGhlIHdheSB0byB0aGUgcm9vdFxuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgob2JqKVxuICBpZiAocGFyZW50UGF0aCkge1xuICAgIC8vIHR3ZWFrIHBhdGNoZXMgc28gdGhleSBpbmNsdWRlIHRoZSBjaGlsZCBwYXRoXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcGFyZW50UGF0aC5wYXRoXG4gICAgY29uc3QgbmV3UGF0Y2hlcyA9IHBhdGNoZXMubWFwKChwKSA9PiBhZGRQYXRoVG9QYXRjaChwLCBjaGlsZFBhdGgpKVxuICAgIGNvbnN0IG5ld0ludmVyc2VQYXRjaGVzID0gaW52ZXJzZVBhdGNoZXMubWFwKChwKSA9PiBhZGRQYXRoVG9QYXRjaChwLCBjaGlsZFBhdGgpKVxuXG4gICAgLy8gZmFsc2UgdG8gYXZvaWQgZW1pdHRpbmcgZ2xvYmFsIHBhdGNoZXMgYWdhaW4gZm9yIHRoZSBzYW1lIGNoYW5nZVxuICAgIGVtaXRQYXRjaChwYXJlbnRQYXRoLnBhcmVudCwgbmV3UGF0Y2hlcywgbmV3SW52ZXJzZVBhdGNoZXMsIGZhbHNlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBhdGhUb1BhdGNoKHBhdGNoOiBQYXRjaCwgcGF0aDogUGF0aEVsZW1lbnQpOiBQYXRjaCB7XG4gIHJldHVybiB7XG4gICAgLi4ucGF0Y2gsXG4gICAgcGF0aDogW3BhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsTWV0YWRhdGFTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsLCBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEFzc29jaWF0ZWQgZGF0YSBtb2RlbCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhTW9kZWxNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBBc3NvY2lhdGVkIGRhdGEgdHlwZSBmb3IgcnVudGltZSBjaGVja2luZyAoaWYgYW55KS5cbiAgICovXG4gIGRhdGFUeXBlPzogQW55VHlwZVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgZm9yIGEgZGF0YSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gbW9kZWxDbGFzc09ySW5zdGFuY2UgRGF0YSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YU1vZGVsTWV0YWRhdGEoXG4gIG1vZGVsQ2xhc3NPckluc3RhbmNlOiBBbnlEYXRhTW9kZWwgfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbik6IERhdGFNb2RlbE1ldGFkYXRhIHtcbiAgaWYgKGlzRGF0YU1vZGVsKG1vZGVsQ2xhc3NPckluc3RhbmNlKSkge1xuICAgIHJldHVybiAobW9kZWxDbGFzc09ySW5zdGFuY2UgYXMgYW55KS5jb25zdHJ1Y3Rvclttb2RlbE1ldGFkYXRhU3ltYm9sXVxuICB9IGVsc2UgaWYgKGlzRGF0YU1vZGVsQ2xhc3MobW9kZWxDbGFzc09ySW5zdGFuY2UpKSB7XG4gICAgcmV0dXJuIChtb2RlbENsYXNzT3JJbnN0YW5jZSBhcyBhbnkpW21vZGVsTWV0YWRhdGFTeW1ib2xdXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgbW9kZWxDbGFzc09ySW5zdGFuY2UgbXVzdCBiZSBhIG1vZGVsIGNsYXNzIG9yIGluc3RhbmNlYClcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uLy4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IGdldERhdGFNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL2RhdGFNb2RlbC9nZXREYXRhTW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4uLy4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsRGF0YSxcbiAgTW9kZWxVbnRyYW5zZm9ybWVkRGF0YSxcbn0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8gfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHsgbm9EZWZhdWx0VmFsdWUgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcblxuY29uc3QgY2FjaGVkRGF0YU1vZGVsVHlwZUNoZWNrZXIgPSBuZXcgV2Vha01hcDxNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sIFR5cGVDaGVja2VyPigpXG5cbnR5cGUgX0NsYXNzPFQ+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxudHlwZSBfQ2xhc3NPck9iamVjdDxNLCBLPiA9IEsgZXh0ZW5kcyBNID8gb2JqZWN0IDogX0NsYXNzPEs+IHwgKCgpID0+IF9DbGFzczxLPilcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgZGF0YSBtb2RlbCBkYXRhLlxuICogVGhlIHR5cGUgcmVmZXJlbmNlZCBpbiB0aGUgbW9kZWwgZGVjb3JhdG9yIHdpbGwgYmUgdXNlZCBmb3IgdHlwZSBjaGVja2luZy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IHNvbWVEYXRhTW9kZWxEYXRhVHlwZSA9IHR5cGVzLmRhdGFNb2RlbERhdGEoU29tZU1vZGVsKVxuICogLy8gb3IgZm9yIHJlY3Vyc2l2ZSBtb2RlbHNcbiAqIGNvbnN0IHNvbWVEYXRhTW9kZWxEYXRhVHlwZSA9IHR5cGVzLmRhdGFNb2RlbERhdGE8U29tZU1vZGVsPigoKSA9PiBTb21lTW9kZWwpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIE0gRGF0YSBtb2RlbCB0eXBlLlxuICogQHBhcmFtIG1vZGVsQ2xhc3MgTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNEYXRhTW9kZWxEYXRhPE0gPSBuZXZlciwgSyA9IE0+KFxuICBtb2RlbENsYXNzOiBfQ2xhc3NPck9iamVjdDxNLCBLPlxuKTogSWRlbnRpdHlUeXBlPFxuICB8IE1vZGVsVW50cmFuc2Zvcm1lZERhdGE8XG4gICAgICBLIGV4dGVuZHMgTSA/IChNIGV4dGVuZHMgQW55RGF0YU1vZGVsID8gTSA6IG5ldmVyKSA6IEsgZXh0ZW5kcyBBbnlEYXRhTW9kZWwgPyBLIDogbmV2ZXJcbiAgICA+XG4gIHwgTW9kZWxEYXRhPFxuICAgICAgSyBleHRlbmRzIE0gPyAoTSBleHRlbmRzIEFueURhdGFNb2RlbCA/IE0gOiBuZXZlcikgOiBLIGV4dGVuZHMgQW55RGF0YU1vZGVsID8gSyA6IG5ldmVyXG4gICAgPlxuPiB7XG4gIC8vIGlmIHdlIHR5cGUgaXQgYW55IHN0cm9uZ2VyIHRoZW4gcmVjdXJzaXZlIGRlZnMgYW5kIHNvIG9uIHN0b3Agd29ya2luZ1xuXG4gIGlmICghaXNEYXRhTW9kZWxDbGFzcyhtb2RlbENsYXNzKSAmJiB0eXBlb2YgbW9kZWxDbGFzcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLy8gcmVzb2x2ZSBsYXRlclxuICAgIGNvbnN0IG1vZGVsQ2xhc3NGbiA9IG1vZGVsQ2xhc3MgYXMgKCkgPT4gTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+XG4gICAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBEYXRhTW9kZWxEYXRhVHlwZUluZm8odCwgbW9kZWxDbGFzc0ZuKCkpXG4gICAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB0eXBlc0RhdGFNb2RlbERhdGEobW9kZWxDbGFzc0ZuKCkpIGFzIGFueSwgdHlwZUluZm9HZW4pIGFzIGFueVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1vZGVsQ2xheno6IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiA9IG1vZGVsQ2xhc3MgYXMgYW55XG5cbiAgICBjb25zdCBjYWNoZWRUeXBlQ2hlY2tlciA9IGNhY2hlZERhdGFNb2RlbFR5cGVDaGVja2VyLmdldChtb2RlbENsYXp6KVxuICAgIGlmIChjYWNoZWRUeXBlQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIGNhY2hlZFR5cGVDaGVja2VyIGFzIGFueVxuICAgIH1cblxuICAgIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgRGF0YU1vZGVsRGF0YVR5cGVJbmZvKHQsIG1vZGVsQ2xhenopXG5cbiAgICBjb25zdCB0YyA9IGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChtb2RlbENsYXp6KSFcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gYERhdGFNb2RlbERhdGEoJHttb2RlbEluZm8ubmFtZX0pYFxuXG4gICAgICBjb25zdCBkYXRhVHlwZUNoZWNrZXIgPSBnZXREYXRhTW9kZWxNZXRhZGF0YShtb2RlbENsYXp6KS5kYXRhVHlwZVxuICAgICAgaWYgKCFkYXRhVHlwZUNoZWNrZXIpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgdHlwZSBjaGVja2luZyBjYW5ub3QgYmUgcGVyZm9ybWVkIG92ZXIgZGF0YSBtb2RlbCBkYXRhIG9mIHR5cGUgJyR7bW9kZWxJbmZvLm5hbWV9JyBzaW5jZSB0aGF0IG1vZGVsIHR5cGUgaGFzIG5vIGRhdGEgdHlwZSBkZWNsYXJlZCwgY29uc2lkZXIgYWRkaW5nIGEgZGF0YSB0eXBlIG9yIHVzaW5nIHR5cGVzLnVuY2hlY2tlZCgpIGluc3RlYWRgXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoZGF0YVR5cGVDaGVja2VyKVxuXG4gICAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcblxuICAgICAgICAodmFsdWUsIHBhdGgpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuY2hlY2sodmFsdWUsIHBhdGgpXG4gICAgICAgIH0sXG5cbiAgICAgICAgKCkgPT4gdHlwZU5hbWUsXG4gICAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5zbmFwc2hvdFR5cGUodmFsdWUpID8gdGhpc1RjIDogbnVsbFxuICAgICAgICB9LFxuXG4gICAgICAgIChzbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgICAgICB9LFxuXG4gICAgICAgIChzbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICAgICAgfVxuICAgICAgKVxuXG4gICAgICByZXR1cm4gdGhpc1RjXG4gICAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxuXG4gICAgY2FjaGVkRGF0YU1vZGVsVHlwZUNoZWNrZXIuc2V0KG1vZGVsQ2xhenosIHRjKVxuXG4gICAgcmV0dXJuIHRjIGFzIGFueVxuICB9XG59XG5cbi8qKlxuICogYHR5cGVzLmRhdGFNb2RlbERhdGFgIHR5cGUgaW5mbyBmb3IgYSBtb2RlbCBwcm9wcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhTW9kZWxEYXRhVHlwZUluZm9Qcm9wcyB7XG4gIHJlYWRvbmx5IFtwcm9wTmFtZTogc3RyaW5nXTogUmVhZG9ubHk8e1xuICAgIHR5cGU6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZFxuICAgIHR5cGVJbmZvOiBUeXBlSW5mbyB8IHVuZGVmaW5lZFxuICAgIGhhc0RlZmF1bHQ6IGJvb2xlYW5cbiAgICBkZWZhdWx0OiBhbnlcbiAgfT5cbn1cblxuLyoqXG4gKiBgdHlwZXMuZGF0YU1vZGVsRGF0YWAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YU1vZGVsRGF0YVR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICBwcml2YXRlIF9wcm9wcyA9IGxhenkoKCkgPT4ge1xuICAgIGNvbnN0IG9ialNjaGVtYSA9IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyh0aGlzLm1vZGVsQ2xhc3MpXG5cbiAgICBjb25zdCBwcm9wVHlwZXM6IE8uV3JpdGFibGU8RGF0YU1vZGVsRGF0YVR5cGVJbmZvUHJvcHM+ID0ge31cbiAgICBPYmplY3Qua2V5cyhvYmpTY2hlbWEpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG4gICAgICBjb25zdCBwcm9wRGF0YSA9IG9ialNjaGVtYVtwcm9wTmFtZV1cblxuICAgICAgY29uc3QgdHlwZSA9IHByb3BEYXRhLl9pbnRlcm5hbC50eXBlQ2hlY2tlciBhcyBhbnkgYXMgQW55U3RhbmRhcmRUeXBlXG5cbiAgICAgIGxldCB0eXBlSW5mbzogVHlwZUluZm8gfCB1bmRlZmluZWRcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIHR5cGVJbmZvID0gZ2V0VHlwZUluZm8odHlwZSlcbiAgICAgIH1cblxuICAgICAgbGV0IGhhc0RlZmF1bHQgPSBmYWxzZVxuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55XG4gICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGblxuICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlXG4gICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHByb3BUeXBlc1twcm9wTmFtZV0gPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHR5cGVJbmZvLFxuICAgICAgICBoYXNEZWZhdWx0LFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcHJvcFR5cGVzXG4gIH0pXG5cbiAgZ2V0IHByb3BzKCk6IERhdGFNb2RlbERhdGFUeXBlSW5mb1Byb3BzIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcHMoKVxuICB9XG5cbiAgZ2V0IG1vZGVsVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KHRoaXMubW9kZWxDbGFzcykhXG4gICAgcmV0dXJuIG1vZGVsSW5mby5uYW1lXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4pIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB7IGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCB9IGZyb20gXCIuLi9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxVbnRyYW5zZm9ybWVkRGF0YSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgYXBwbHlNb2RlbEluaXRpYWxpemVycyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9uZXdNb2RlbFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIG1ha2VQcm9wUmVhZG9ubHkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4vRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGdldERhdGFNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4vZ2V0RGF0YU1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgYXNzZXJ0SXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGludGVybmFsTmV3RGF0YU1vZGVsID0gYWN0aW9uKFxuICBcIm5ld01vZGVsXCIsXG4gIDxNIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgICBvcmlnTW9kZWxPYmo6IE0sXG4gICAgdHdlYWtlZERhdGE6IE1vZGVsVW50cmFuc2Zvcm1lZERhdGE8TT4sXG4gICAgb3B0aW9uczogUGljazxEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMsIFwibW9kZWxDbGFzc1wiPlxuICApOiBNID0+IHtcbiAgICBjb25zdCB7IG1vZGVsQ2xhc3M6IF9tb2RlbENsYXNzIH0gPSBvcHRpb25zXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IF9tb2RlbENsYXNzIVxuXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBhc3NlcnRJc0RhdGFNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIFwibW9kZWxDbGFzc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsT2JqID0gb3JpZ01vZGVsT2JqIGFzIE8uV3JpdGFibGU8TT5cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpXG4gICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBubyBtb2RlbCBpbmZvIGZvciBjbGFzcyAke21vZGVsQ2xhc3MubmFtZX0gY291bGQgYmUgZm91bmQgLSBkaWQgeW91IGZvcmdldCB0byBhZGQgdGhlIEBtb2RlbCBkZWNvcmF0b3I/YFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIGxpbmsgaXQsIGFuZCBtYWtlIGl0IHJlYWRvbmx5XG4gICAgbW9kZWxPYmouJCA9IHR3ZWFrZWREYXRhXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBtYWtlUHJvcFJlYWRvbmx5KG1vZGVsT2JqLCBcIiRcIiwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyB0eXBlIGNoZWNrIGl0IGlmIG5lZWRlZFxuICAgIGlmIChpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSAmJiBnZXREYXRhTW9kZWxNZXRhZGF0YShtb2RlbENsYXNzKS5kYXRhVHlwZSkge1xuICAgICAgY29uc3QgZXJyID0gbW9kZWxPYmoudHlwZUNoZWNrKClcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZXJyLnRocm93KG1vZGVsT2JqKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJ1biBhbnkgZXh0cmEgaW5pdGlhbGl6ZXJzIGZvciB0aGUgY2xhc3MgYXMgbmVlZGVkXG4gICAgYXBwbHlNb2RlbEluaXRpYWxpemVycyhtb2RlbENsYXNzLCBtb2RlbE9iailcblxuICAgIHJldHVybiBtb2RlbE9iaiBhcyBNXG4gIH1cbilcbiIsImltcG9ydCB7IE1vZGVsQ2xhc3MsIHByb3BzVHlwZVN5bWJvbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsUHJvcHNJbmZvXCJcbmltcG9ydCB7XG4gIE1vZGVsUHJvcHMsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkRGF0YSxcbiAgbm9EZWZhdWx0VmFsdWUsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGlzVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IHRvVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyB0eXBlc0RhdGFNb2RlbERhdGEgfSBmcm9tIFwiLi4vdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNEYXRhTW9kZWxEYXRhXCJcbmltcG9ydCB7IHR5cGVDaGVjayB9IGZyb20gXCIuLi90eXBlcy90eXBlQ2hlY2tcIlxuaW1wb3J0IHR5cGUgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuL0RhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyBpbnRlcm5hbE5ld0RhdGFNb2RlbCB9IGZyb20gXCIuL25ld0RhdGFNb2RlbFwiXG5cbmNvbnN0IGRhdGFNb2RlbEluc3RhbmNlQ2FjaGUgPSBuZXcgV2Vha01hcDxNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sIFdlYWtNYXA8YW55LCBBbnlEYXRhTW9kZWw+PigpXG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0YSBtb2RlbHMuIFVzZSBgRGF0YU1vZGVsYCBpbnN0ZWFkIHdoZW4gZXh0ZW5kaW5nLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkxhenlJbml0YCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gRGF0YSBQcm9wcyBkYXRhIHR5cGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+IHtcbiAgLy8ganVzdCB0byBtYWtlIHR5cGluZyB3b3JrIHByb3Blcmx5XG4gIFtwcm9wc1R5cGVTeW1ib2xdITogVFByb3BzXG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZCB3aGVuIHRoZXJlJ3MgdGhlIGZpcnN0IGNhbGwgdG8gYGZuKE0sIGRhdGEpYC5cbiAgICovXG4gIHByb3RlY3RlZCBvbkxhenlJbml0PygpOiB2b2lkXG5cbiAgLyoqXG4gICAqIERhdGEgcGFydCBvZiB0aGUgbW9kZWwsIHdoaWNoIGlzIG9ic2VydmFibGUgYW5kIHdpbGwgYmUgc2VyaWFsaXplZCBpbiBzbmFwc2hvdHMuXG4gICAqIFVzZSBpdCBpZiBvbmUgb2YgdGhlIGRhdGEgcHJvcGVydGllcyBtYXRjaGVzIG9uZSBvZiB0aGUgbW9kZWwgcHJvcGVydGllcy9mdW5jdGlvbnMuXG4gICAqIFRoaXMgYWxzbyBhbGxvd3MgYWNjZXNzIHRvIHRoZSBiYWNrZWQgdmFsdWVzIG9mIHRyYW5zZm9ybWVkIHByb3BlcnRpZXMuXG4gICAqL1xuICByZWFkb25seSAkITogTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZERhdGE8VFByb3BzPlxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHR5cGUgY2hlY2sgb3ZlciB0aGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEZvciB0aGlzIHRvIHdvcmsgYSBkYXRhIHR5cGUgaGFzIHRvIGJlIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1vZGVsIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYFR5cGVDaGVja0Vycm9yYCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gZXJyb3IuXG4gICAqL1xuICB0eXBlQ2hlY2soKTogVHlwZUNoZWNrRXJyb3IgfCBudWxsIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZXNEYXRhTW9kZWxEYXRhPHRoaXM+KHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuICAgIHJldHVybiB0eXBlQ2hlY2sodHlwZSwgdGhpcy4kIGFzIGFueSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgZGF0YSBtb2RlbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGE6XG4gICAgICB8IE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPlxuICAgICAgfCBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+XG4gICkge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJkYXRhIG1vZGVscyBjYW4gb25seSB3b3JrIG92ZXIgZGF0YSBvYmplY3RzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgeyBtb2RlbENsYXNzOiBfbW9kZWxDbGFzcyB9OiBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgPSBhcmd1bWVudHNbMV0gYXMgYW55XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IF9tb2RlbENsYXNzIVxuXG4gICAgdHlwZSBEYXRhID0gTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZERhdGE8VFByb3BzPlxuICAgIGxldCB0d2Vha2VkRGF0YTogRGF0YVxuICAgIGlmIChpc1RyZWVOb2RlKGRhdGEpKSB7XG4gICAgICAvLyBpbiB0aGVvcnkgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgdHdlYWtlZERhdGEgPSBkYXRhIGFzIGFueSBhcyBEYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpXG4gICAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBubyBtb2RlbCBpbmZvIGZvciBjbGFzcyAke21vZGVsQ2xhc3MubmFtZX0gY291bGQgYmUgZm91bmQgLSBkaWQgeW91IGZvcmdldCB0byBhZGQgdGhlIEBtb2RlbCBkZWNvcmF0b3I/YFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZGVsUHJvcHMgPSBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8obW9kZWxDbGFzcylcblxuICAgICAgY29uc3QgaW5pdGlhbERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKVxuXG4gICAgICBjb25zdCBtb2RlbFByb3BzS2V5cyA9IE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGVsUHJvcHNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBtb2RlbFByb3BzS2V5c1tpXVxuICAgICAgICBjb25zdCBwcm9wRGF0YSA9IG1vZGVsUHJvcHNba11cblxuICAgICAgICBsZXQgbmV3VmFsdWUgPSBpbml0aWFsRGF0YSFba11cbiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgICAgIC8vIGFwcGx5IHVudHJhbnNmb3JtIChpZiBhbnkpXG4gICAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwudHJhbnNmb3JtKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC50cmFuc2Zvcm0udW50cmFuc2Zvcm0obmV3VmFsdWUsIHRoaXMsIGspXG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlIChpZiBuZWVkZWQpXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuKClcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWUgIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICBpbml0aWFsRGF0YVtrXSA9IG5ld1ZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHdlYWtlZERhdGEgPSB0b1RyZWVOb2RlKGluaXRpYWxEYXRhIGFzIERhdGEpXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VzRm9yTW9kZWxDbGFzcyA9IGdldE9yQ3JlYXRlKFxuICAgICAgZGF0YU1vZGVsSW5zdGFuY2VDYWNoZSxcbiAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAoKSA9PiBuZXcgV2Vha01hcCgpXG4gICAgKVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNGb3JNb2RlbENsYXNzLmdldCh0d2Vha2VkRGF0YSlcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgIH1cblxuICAgIGluc3RhbmNlc0Zvck1vZGVsQ2xhc3Muc2V0KHR3ZWFrZWREYXRhLCB0aGlzKVxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG1vZGVsQ2xhc3MucHJvdG90eXBlKVxuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55XG5cbiAgICAvLyBkZWxldGUgdW5uZWNlc3NhcnkgcHJvcHNcbiAgICBkZWxldGUgc2VsZltwcm9wc1R5cGVTeW1ib2xdXG5cbiAgICBpbnRlcm5hbE5ld0RhdGFNb2RlbCh0aGlzLCB0d2Vha2VkRGF0YSBhcyBhbnksIHtcbiAgICAgIG1vZGVsQ2xhc3MsXG4gICAgfSlcbiAgfVxuXG4gIHRvU3RyaW5nKG9wdGlvbnM/OiB7IHdpdGhEYXRhPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0ge1xuICAgICAgd2l0aERhdGE6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuXG4gICAgY29uc3QgZmlyc3RQYXJ0ID0gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke21vZGVsSW5mbyEubmFtZX1gXG5cbiAgICByZXR1cm4gZmluYWxPcHRpb25zLndpdGhEYXRhXG4gICAgICA/IGBbJHtmaXJzdFBhcnR9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U25hcHNob3QodGhpcykpfV1gXG4gICAgICA6IGBbJHtmaXJzdFBhcnR9XWBcbiAgfVxufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IHR5cGUgQmFzZURhdGFNb2RlbEtleXMgPSBrZXlvZiBBbnlEYXRhTW9kZWwgfCBcIm9uTGF6eUluaXRcIlxuXG4vLyB0aGVzZSBwcm9wcyB3aWxsIG5ldmVyIGJlIGhvaXN0ZWQgdG8gdGhpc1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2VEYXRhTW9kZWxQcm9wTmFtZXMgPSBuZXcgU2V0PEJhc2VEYXRhTW9kZWxLZXlzPihbXCJvbkxhenlJbml0XCIsIFwiJFwiLCBcInR5cGVDaGVja1wiXSlcblxuLyoqXG4gKiBBbnkga2luZCBvZiBkYXRhIG1vZGVsIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFueURhdGFNb2RlbCBleHRlbmRzIEJhc2VEYXRhTW9kZWw8YW55PiB7fVxuXG4vKipcbiAqIEEgZGF0YSBtb2RlbCBjbGFzcyBkZWNsYXJhdGlvbiwgbWFkZSBvZiBhIGJhc2UgbW9kZWwgYW5kIHRoZSBtb2RlbCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCB0eXBlIERhdGFNb2RlbENsYXNzRGVjbGFyYXRpb248QmFzZU1vZGVsQ2xhc3MsIE1vZGVsSW50ZXJmYWNlPiA9IEJhc2VNb2RlbENsYXNzICYge1xuICAoLi4uYXJnczogYW55W10pOiBNb2RlbEludGVyZmFjZVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBCYXNlRGF0YU1vZGVsIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIGRhdGEgbW9kZWwgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhTW9kZWwobW9kZWw6IHVua25vd24pOiBtb2RlbCBpcyBBbnlEYXRhTW9kZWwge1xuICByZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBCYXNlRGF0YU1vZGVsXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogQXNzZXJ0cyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgYSBkYXRhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBtb2RlbFxuICogQHBhcmFtIGFyZ05hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzRGF0YU1vZGVsKFxuICBtb2RlbDogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nLFxuICBjdXN0b21FcnJNc2cgPSBcIm11c3QgYmUgYSBkYXRhIG1vZGVsIGluc3RhbmNlXCJcbik6IGFzc2VydHMgbW9kZWwgaXMgQW55RGF0YU1vZGVsIHtcbiAgaWYgKCFpc0RhdGFNb2RlbChtb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9ICR7Y3VzdG9tRXJyTXNnfWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU1vZGVsQ2xhc3MobW9kZWxDbGFzczogdW5rbm93bik6IG1vZGVsQ2xhc3MgaXMgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+IHtcbiAgaWYgKHR5cGVvZiBtb2RlbENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChtb2RlbENsYXNzICE9PSBCYXNlRGF0YU1vZGVsICYmICEobW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlRGF0YU1vZGVsKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzRGF0YU1vZGVsQ2xhc3MoXG4gIG1vZGVsQ2xhc3M6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZ1xuKTogYXNzZXJ0cyBtb2RlbENsYXNzIGlzIE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiB7XG4gIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgY2xhc3NgKVxuICB9XG5cbiAgaWYgKG1vZGVsQ2xhc3MgIT09IEJhc2VEYXRhTW9kZWwgJiYgIShtb2RlbENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWwpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGV4dGVuZCBEYXRhTW9kZWxgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBnZXRHbG9iYWxDb25maWcgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mRnJvemVuIH0gZnJvbSBcIi4uL3NuYXBzaG90XCJcbmltcG9ydCB7IHR3ZWFrIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogU2hvdWxkIGZyZWV6ZSBhbmQgcGxhaW4ganNvbiBjaGVja3MgYmUgZG9uZSB3aGVuIGNyZWF0aW5nIHRoZSBmcm96ZW4gb2JqZWN0P1xuICovXG5leHBvcnQgZW51bSBGcm96ZW5DaGVja01vZGUge1xuICAvKiogT25seSB3aGVuIGluIGRldiBtb2RlICovXG4gIERldk1vZGVPbmx5ID0gXCJkZXZNb2RlT25seVwiLFxuICAvKiogQWx3YXlzICovXG4gIE9uID0gXCJvblwiLFxuICAvKiogTmV2ZXIgKi9cbiAgT2ZmID0gXCJvZmZcIixcbn1cblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBjb25zdCBmcm96ZW5LZXkgPSBcIiRmcm96ZW5cIlxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBjb250YWlucyBmcm96ZW4gZGF0YS5cbiAqIFVzZSBgZnJvemVuYCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgRGF0YSB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgRnJvemVuPFQ+IHtcbiAgLyoqXG4gICAqIEZyb3plbiBkYXRhLCBkZWVwbHkgaW1tdXRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogVFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEZyb3plbi5cbiAgICogRG8gbm90IHVzZSBkaXJlY3RseSwgdXNlIGBmcm96ZW5gIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhVG9GcmVlemVcbiAgICogQHBhcmFtIGNoZWNrTW9kZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YVRvRnJlZXplOiBULCBjaGVja01vZGU6IEZyb3plbkNoZWNrTW9kZSA9IEZyb3plbkNoZWNrTW9kZS5EZXZNb2RlT25seSkge1xuICAgIGNvbnN0IGNoZWNrID1cbiAgICAgIGNoZWNrTW9kZSA9PT0gRnJvemVuQ2hlY2tNb2RlLk9uIHx8IChjaGVja01vZGUgPT09IEZyb3plbkNoZWNrTW9kZS5EZXZNb2RlT25seSAmJiBpbkRldk1vZGUoKSlcbiAgICBpZiAoY2hlY2spIHtcbiAgICAgIGNoZWNrRGF0YUlzU2VyaWFsaXphYmxlQW5kRnJlZXplKGRhdGFUb0ZyZWV6ZSlcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhVG9GcmVlemVcblxuICAgIGlmIChjaGVjaykge1xuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLmRhdGEpXG4gICAgfVxuXG4gICAgdHdlYWsodGhpcywgdW5kZWZpbmVkKVxuICB9XG59XG5cbi8qKlxuICogTWFya3Mgc29tZSBkYXRhIGFzIGZyb3plbi4gRnJvemVuIGRhdGEgYmVjb21lcyBpbW11dGFibGUgKGF0IGxlYXN0IGluIGRldiBtb2RlKSwgYW5kIGlzIG5vdCBlbmhhbmNlZFxuICogd2l0aCBjYXBhYmlsaXRpZXMgc3VjaCBhcyBnZXR0aW5nIHRoZSBwYXJlbnQgb2YgdGhlIG9iamVjdHMgKGV4Y2VwdCBmb3IgdGhlIHJvb3Qgb2JqZWN0KSwgaXQgaXMgbm90XG4gKiBtYWRlIGRlZXBseSBvYnNlcnZhYmxlICh0aG91Z2ggdGhlIHJvb3Qgb2JqZWN0IGlzIG9ic2VydmFibGUgYnkgcmVmZXJlbmNlKSwgZXRjLlxuICogT24gdGhlIG90aGVyIGhhbmQsIHRoaXMgbWVhbnMgaXQgd2lsbCBiZSBtdWNoIGZhc3RlciB0byBjcmVhdGUvYWNjZXNzLiBVc2UgdGhpcyBmb3IgYmlnIGRhdGEgcGllY2VzXG4gKiB0aGF0IGFyZSB1bmxpa2VseSB0byBjaGFuZ2UgdW5sZXNzIGFsbCBvZiB0aGVtIGNoYW5nZSAoZm9yIGV4YW1wbGUgbGlzdHMgb2YgcG9pbnRzIGZvciBhIHBvbHlnb24sIGV0YykuXG4gKlxuICogTm90ZSB0aGF0IGRhdGEgcGFzc2VkIHRvIGZyb3plbiBtdXN0IGJlIHNlcmlhbGl6YWJsZSB0byBKU09OLCB0aGlzIGlzOlxuICogLSBwcmltaXRpdmUsIHBsYWluIG9iamVjdCwgb3IgYXJyYXlcbiAqIC0gd2l0aG91dCBjeWNsZXNcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHBhcmFtIGNoZWNrTW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvemVuPFQ+KFxuICBkYXRhOiBULFxuICBjaGVja01vZGU6IEZyb3plbkNoZWNrTW9kZSA9IEZyb3plbkNoZWNrTW9kZS5EZXZNb2RlT25seVxuKTogRnJvemVuPFQ+IHtcbiAgcmV0dXJuIG5ldyBGcm96ZW48VD4oZGF0YSwgY2hlY2tNb2RlKVxufVxuXG5mdW5jdGlvbiBjaGVja0RhdGFJc1NlcmlhbGl6YWJsZUFuZEZyZWV6ZShkYXRhOiBhbnkpIHtcbiAgLy8gVE9ETzogZGV0ZWN0IGN5Y2xlcyBhbmQgdGhyb3cgaWYgcHJlc2VudD9cblxuICAvLyBwcmltaXRpdmVzIGFyZSBva1xuICBpZiAoaXNQcmltaXRpdmUoZGF0YSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgY29uc3QgYXJyTGVuID0gZGF0YS5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyckxlbjsgaSsrKSB7XG4gICAgICBjb25zdCB2ID0gZGF0YVtpXVxuICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCAmJiAhZ2V0R2xvYmFsQ29uZmlnKCkuYWxsb3dVbmRlZmluZWRBcnJheUVsZW1lbnRzKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgXCJ1bmRlZmluZWQgaXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXJyYXlzIHNpbmNlIGl0IGlzIG5vdCBzZXJpYWxpemFibGUgaW4gSlNPTiwgY29uc2lkZXIgdXNpbmcgbnVsbCBpbnN0ZWFkXCJcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUodilcbiAgICB9XG4gICAgT2JqZWN0LmZyZWV6ZShkYXRhKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoZGF0YSkpIHtcbiAgICBjb25zdCBkYXRhS2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpXG4gICAgY29uc3QgZGF0YUtleXNMZW4gPSBkYXRhS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFLZXlzTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBkYXRhS2V5c1tpXVxuICAgICAgY29uc3QgdiA9IGRhdGFba11cblxuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUoaylcbiAgICAgIGNoZWNrRGF0YUlzU2VyaWFsaXphYmxlQW5kRnJlZXplKHYpXG4gICAgfVxuICAgIE9iamVjdC5mcmVlemUoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYGZyb3plbiBkYXRhIG11c3QgYmUgcGxhaW5seSBzZXJpYWxpemFibGUgdG8gSlNPTiwgYnV0ICR7ZGF0YX0gaXMgbm90YClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBDaGVja3MgaWYgYW4gc25hcHNob3QgaXMgYW4gc25hcHNob3QgZm9yIGEgZnJvemVuIGRhdGEuXG4gKlxuICogQHBhcmFtIHNuYXBzaG90XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGcm96ZW5TbmFwc2hvdChzbmFwc2hvdDogdW5rbm93bik6IHNuYXBzaG90IGlzIFNuYXBzaG90SW5PZkZyb3plbjxGcm96ZW48YW55Pj4ge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChzbmFwc2hvdCkgJiYgZnJvemVuS2V5IGluIHNuYXBzaG90XG59XG4iLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZW51bSBUd2Vha2VyUHJpb3JpdHkge1xuICBNb2RlbCxcbiAgQXJyYXksXG4gIFBsYWluT2JqZWN0LFxuICBGcm96ZW4sXG59XG4iLCJpbXBvcnQgeyBGcm96ZW4sIGZyb3plbktleSB9IGZyb20gXCIuLi9mcm96ZW4vRnJvemVuXCJcbmltcG9ydCB0eXBlIHsgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyBzZXROZXdJbnRlcm5hbFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2ludGVybmFsXCJcbmltcG9ydCB7IHR3ZWFrZWRPYmplY3RzIH0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgeyByZWdpc3RlclR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha1wiXG5pbXBvcnQgeyBUd2Vha2VyUHJpb3JpdHkgfSBmcm9tIFwiLi9Ud2Vha2VyUHJpb3JpdHlcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHdlYWtGcm96ZW48VCBleHRlbmRzIEZyb3plbjxhbnk+PihcbiAgZnJvemVuT2JqOiBULFxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWRcbik6IFQge1xuICB0d2Vha2VkT2JqZWN0cy5zZXQoZnJvemVuT2JqLCB1bmRlZmluZWQpXG4gIHNldFBhcmVudCh7XG4gICAgdmFsdWU6IGZyb3plbk9iaixcbiAgICBwYXJlbnRQYXRoLFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXG4gICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICAvLyBhIGZyb3plbiBpcyBub3QgYSB2YWx1ZS10eXBlXG4gICAgY2xvbmVJZkFwcGxpY2FibGU6IGZhbHNlLFxuICB9KVxuXG4gIC8vIHdlIERPTidUIHdhbnQgZGF0YSBwcm94aWZpZWQsIGJ1dCB0aGUgc25hcHNob3QgaXMgdGhlIGRhdGEgaXRzZWxmXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QoZnJvemVuT2JqLCB7IFtmcm96ZW5LZXldOiB0cnVlLCBkYXRhOiBmcm96ZW5PYmouZGF0YSB9LCB1bmRlZmluZWQsIHRydWUpXG5cbiAgcmV0dXJuIGZyb3plbk9ialxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm96ZW5Ud2Vha2VyKCkge1xuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5LkZyb3plbiwgKHZhbHVlLCBwYXJlbnRQYXRoKSA9PiB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnJvemVuKSB7XG4gICAgICByZXR1cm4gdHdlYWtGcm96ZW4odmFsdWUsIHBhcmVudFBhdGgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnRQYXRoLCBQYXJlbnRQYXRoIH0gZnJvbSBcIi4vcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGgsIFdyaXRhYmxlUGF0aCB9IGZyb20gXCIuL3BhdGhUeXBlc1wiXG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIHBhcmVudHMgKGZyb20gdGhlIG5lYXJlc3QgdW50aWwgdGhlIHJvb3QpXG4gKiB1bnRpbCBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBnaXZlbiBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzIG1hdGNoZWQgaXQgd2lsbCByZXR1cm4gdGhlIGZvdW5kIG5vZGUuXG4gKiBJZiBub25lIGlzIGZvdW5kIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIGNoaWxkIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gZm9yIGV2ZXJ5IHBhcmVudCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgZnJvbSBpbW1lZGlhdGUgcGFyZW50IHRvIHRoZSByb290LlxuICogQHBhcmFtIG1heERlcHRoIE1heCBkZXB0aCwgb3IgMCBmb3IgaW5maW5pdGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgY2hpbGQ6IG9iamVjdCxcbiAgcHJlZGljYXRlOiAocGFyZW50Tm9kZTogb2JqZWN0KSA9PiBib29sZWFuLFxuICBtYXhEZXB0aCA9IDBcbik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBmb3VuZFBhcmVudFBhdGggPSBmaW5kUGFyZW50UGF0aChjaGlsZCwgcHJlZGljYXRlLCBtYXhEZXB0aClcbiAgcmV0dXJuIGZvdW5kUGFyZW50UGF0aCA/IGZvdW5kUGFyZW50UGF0aC5wYXJlbnQgOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYGZpbmRQYXJlbnRQYXRoYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3VuZFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogRm91bmQgcGFyZW50IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudDogVFxuXG4gIC8qKlxuICAgKiBQYXRoIGZyb20gdGhlIGZvdW5kIHBhcmVudCB0byB0aGUgY2hpbGQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBQYXRoXG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIHBhcmVudHMgKGZyb20gdGhlIG5lYXJlc3QgdW50aWwgdGhlIHJvb3QpXG4gKiB1bnRpbCBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBnaXZlbiBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzIG1hdGNoZWQgaXQgd2lsbCByZXR1cm4gdGhlIGZvdW5kIG5vZGUgcGx1cyB0aGVcbiAqIHBhdGggdG8gZ2V0IGZyb20gdGhlIHBhcmVudCB0byB0aGUgY2hpbGQuXG4gKiBJZiBub25lIGlzIGZvdW5kIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIGNoaWxkIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gZm9yIGV2ZXJ5IHBhcmVudCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgZnJvbSBpbW1lZGlhdGUgcGFyZW50IHRvIHRoZSByb290LlxuICogQHBhcmFtIG1heERlcHRoIE1heCBkZXB0aCwgb3IgMCBmb3IgaW5maW5pdGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4oXG4gIGNoaWxkOiBvYmplY3QsXG4gIHByZWRpY2F0ZTogKHBhcmVudE5vZGU6IG9iamVjdCkgPT4gYm9vbGVhbixcbiAgbWF4RGVwdGggPSAwXG4pOiBGb3VuZFBhcmVudFBhdGg8VD4gfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KGNoaWxkLCBcImNoaWxkXCIpXG5cbiAgY29uc3QgcGF0aDogV3JpdGFibGVQYXRoID0gW11cblxuICBsZXQgY3VycmVudDogYW55ID0gY2hpbGRcbiAgbGV0IGRlcHRoID0gMFxuXG4gIGxldCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWRcbiAgd2hpbGUgKChwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgoY3VycmVudCkpKSB7XG4gICAgcGF0aC51bnNoaWZ0KHBhcmVudFBhdGgucGF0aClcbiAgICBjdXJyZW50ID0gcGFyZW50UGF0aC5wYXJlbnRcbiAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJlbnQ6IGN1cnJlbnQsXG4gICAgICAgIHBhdGgsXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVwdGgrK1xuICAgIGlmIChtYXhEZXB0aCA+IDAgJiYgZGVwdGggPT09IG1heERlcHRoKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBnZXREZWVwT2JqZWN0Q2hpbGRyZW4sIGdldE9iamVjdENoaWxkcmVuIH0gZnJvbSBcIi4vY29yZU9iamVjdENoaWxkcmVuXCJcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCB0aGUgY2hpbGRyZW4gb2JqZWN0cyAodGhpcyBpcywgZXhjbHVkaW5nIHByaW1pdGl2ZXMpIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbm9kZSBPYmplY3QgdG8gZ2V0IHRoZSBsaXN0IG9mIGNoaWxkcmVuIGZyb20uXG4gKiBAcGFyYW0gW29wdGlvbnNdIEFuIG9wdGlvbmFsIG9iamVjdCB3aXRoIHRoZSBgZGVlcGAgb3B0aW9uIChkZWZhdWx0cyB0byBmYWxzZSkgdG8gdHJ1ZSB0byBnZXRcbiAqIHRoZSBjaGlsZHJlbiBkZWVwbHkgb3IgZmFsc2UgdG8gZ2V0IHRoZW0gc2hhbGxvd2x5LlxuICogQHJldHVybnMgQSByZWFkb25seSBvYnNlcnZhYmxlIHNldCB3aXRoIHRoZSBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoaWxkcmVuT2JqZWN0cyhcbiAgbm9kZTogb2JqZWN0LFxuICBvcHRpb25zPzoge1xuICAgIGRlZXA/OiBib29sZWFuXG4gIH1cbik6IFJlYWRvbmx5U2V0PG9iamVjdD4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5kZWVwKSB7XG4gICAgcmV0dXJuIGdldE9iamVjdENoaWxkcmVuKG5vZGUpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldERlZXBPYmplY3RDaGlsZHJlbihub2RlKS5kZWVwXG4gIH1cbn1cbiIsImltcG9ydCB7IGdldENoaWxkcmVuT2JqZWN0cyB9IGZyb20gXCIuL2dldENoaWxkcmVuT2JqZWN0c1wiXG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgY2hpbGRyZW4gYW5kIGNvbGxlY3RzIHRoZW0gaW4gYSBzZXQgaWYgdGhlXG4gKiBnaXZlbiBwcmVkaWNhdGUgbWF0Y2hlcy5cbiAqXG4gKiBAcGFyYW0gcm9vdCBSb290IG9iamVjdCB0byBnZXQgdGhlIG1hdGNoaW5nIGNoaWxkcmVuIGZyb20uXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gZm9yIGV2ZXJ5IGNoaWxkIG9mIHRoZSByb290IG9iamVjdC5cbiAqIEBwYXJhbSBbb3B0aW9uc10gQW4gb3B0aW9uYWwgb2JqZWN0IHdpdGggdGhlIGBkZWVwYCBvcHRpb24gKGRlZmF1bHRzIHRvIGBmYWxzZWApIHNldCB0byBgdHJ1ZWAgdG9cbiAqIGdldCB0aGUgY2hpbGRyZW4gZGVlcGx5IG9yIGBmYWxzZWAgdG8gZ2V0IHRoZW0gc2hhbGxvd2x5LlxuICogQHJldHVybnMgQSByZWFkb25seSBvYnNlcnZhYmxlIHNldCB3aXRoIHRoZSBtYXRjaGluZyBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDaGlsZHJlbjxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgcm9vdDogb2JqZWN0LFxuICBwcmVkaWNhdGU6IChub2RlOiBvYmplY3QpID0+IGJvb2xlYW4sXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVlcD86IGJvb2xlYW5cbiAgfVxuKTogUmVhZG9ubHlTZXQ8VD4ge1xuICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuT2JqZWN0cyhyb290LCBvcHRpb25zKVxuXG4gIGNvbnN0IHNldCA9IG5ldyBTZXQ8YW55PigpXG5cbiAgY29uc3QgaXRlciA9IGNoaWxkcmVuLnZhbHVlcygpXG4gIGxldCBjdXIgPSBpdGVyLm5leHQoKVxuICB3aGlsZSAoIWN1ci5kb25lKSB7XG4gICAgaWYgKHByZWRpY2F0ZShjdXIudmFsdWUpKSB7XG4gICAgICBzZXQuYWRkKGN1ci52YWx1ZSlcbiAgICB9XG4gICAgY3VyID0gaXRlci5uZXh0KClcbiAgfVxuXG4gIHJldHVybiBzZXRcbn1cbiIsImltcG9ydCB7IHJlYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRDaGlsZHJlbk9iamVjdHMgfSBmcm9tIFwiLi9nZXRDaGlsZHJlbk9iamVjdHNcIlxuXG4vKipcbiAqIFJ1bnMgYSBjYWxsYmFjayBldmVyeXRpbWUgYSBuZXcgb2JqZWN0IGlzIGF0dGFjaGVkIHRvIGEgZ2l2ZW4gbm9kZS5cbiAqIFRoZSBjYWxsYmFjayBjYW4gb3B0aW9uYWxseSByZXR1cm4gYSBkaXNwb3NlciB3aGljaCB3aWxsIGJlIHJ1biB3aGVuIHRoZSBjaGlsZCBpcyBkZXRhY2hlZC5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgb3B0aW9ucyBwYXJhbWV0ZXIgYWNjZXB0cyBhbmQgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICogLSBgZGVlcDogYm9vbGVhbmAgKGRlZmF1bHQ6IGBmYWxzZWApIC0gdHJ1ZSBpZiB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHJ1biBmb3IgYWxsIGNoaWxkcmVuIGRlZXBseVxuICogb3IgZmFsc2UgaWYgaXQgaXQgc2hvdWxkIG9ubHkgcnVuIGZvciBzaGFsbG93IGNoaWxkcmVuLlxuICogLSBgZmlyZUZvckN1cnJlbnRDaGlsZHJlbjogYm9vbGVhbmAgKGRlZmF1bHQ6IGB0cnVlYCkgLSB0cnVlIGlmIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW1tZWRpYXRlbHlcbiAqIGNhbGxlZCBmb3IgY3VycmVudGx5IGF0dGFjaGVkIGNoaWxkcmVuLCBmYWxzZSBpZiBvbmx5IGZvciBmdXR1cmUgYXR0YWNobWVudHMuXG4gKlxuICogUmV0dXJucyBhIGRpc3Bvc2VyLCB3aGljaCBoYXMgYSBib29sZWFuIHBhcmFtZXRlciB3aGljaCBzaG91bGQgYmUgdHJ1ZSBpZiBwZW5kaW5nIGRldGFjaG1lbnRcbiAqIGNhbGxiYWNrcyBzaG91bGQgYmUgcnVuIG9yIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgb2JqZWN0IHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkLlxuICogQHBhcmFtIGZuIENhbGxiYWNrIGNhbGxlZCB3aGVuIGEgY2hpbGQgaXMgYXR0YWNoZWQgdG8gdGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gW29wdGlvbnNdXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DaGlsZEF0dGFjaGVkVG8oXG4gIHRhcmdldDogKCkgPT4gb2JqZWN0LFxuICBmbjogKGNoaWxkOiBvYmplY3QpID0+ICgoKSA9PiB2b2lkKSB8IHZvaWQsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVlcD86IGJvb2xlYW5cbiAgICBmaXJlRm9yQ3VycmVudENoaWxkcmVuPzogYm9vbGVhblxuICB9XG4pOiAocnVuRGV0YWNoRGlzcG9zZXJzOiBib29sZWFuKSA9PiB2b2lkIHtcbiAgYXNzZXJ0SXNGdW5jdGlvbih0YXJnZXQsIFwidGFyZ2V0XCIpXG4gIGFzc2VydElzRnVuY3Rpb24oZm4sIFwiZm5cIilcblxuICBjb25zdCBvcHRzID0ge1xuICAgIGRlZXA6IGZhbHNlLFxuICAgIHJ1bkZvckN1cnJlbnRDaGlsZHJlbjogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgY29uc3QgZGV0YWNoRGlzcG9zZXJzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCAoKSA9PiB2b2lkPigpXG5cbiAgY29uc3QgcnVuRGV0YWNoRGlzcG9zZXIgPSAobjogb2JqZWN0KSA9PiB7XG4gICAgY29uc3QgZGV0YWNoRGlzcG9zZXIgPSBkZXRhY2hEaXNwb3NlcnMuZ2V0KG4pXG4gICAgaWYgKGRldGFjaERpc3Bvc2VyKSB7XG4gICAgICBkZXRhY2hEaXNwb3NlcnMuZGVsZXRlKG4pXG4gICAgICBkZXRhY2hEaXNwb3NlcigpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWRkRGV0YWNoRGlzcG9zZXIgPSAobjogb2JqZWN0LCBkaXNwb3NlcjogKCgpID0+IHZvaWQpIHwgdm9pZCkgPT4ge1xuICAgIGlmIChkaXNwb3Nlcikge1xuICAgICAgZGV0YWNoRGlzcG9zZXJzLnNldChuLCBkaXNwb3NlcilcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRDaGlsZHJlbk9iamVjdE9wdHMgPSB7IGRlZXA6IG9wdHMuZGVlcCB9XG4gIGNvbnN0IGdldEN1cnJlbnRDaGlsZHJlbiA9ICgpID0+IHtcbiAgICBsZXQgdCA9IHRhcmdldCgpXG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0LCBcInRhcmdldCgpXCIpXG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuT2JqZWN0cyh0LCBnZXRDaGlsZHJlbk9iamVjdE9wdHMpXG5cbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0PG9iamVjdD4oKVxuXG4gICAgY29uc3QgaXRlciA9IGNoaWxkcmVuLnZhbHVlcygpXG4gICAgbGV0IGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFjdXIuZG9uZSkge1xuICAgICAgc2V0LmFkZChjdXIudmFsdWUpXG4gICAgICBjdXIgPSBpdGVyLm5leHQoKVxuICAgIH1cblxuICAgIHJldHVybiBzZXRcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRDaGlsZHJlbiA9IG9wdHMucnVuRm9yQ3VycmVudENoaWxkcmVuID8gbmV3IFNldDxvYmplY3Q+KCkgOiBnZXRDdXJyZW50Q2hpbGRyZW4oKVxuXG4gIGNvbnN0IGRpc3Bvc2VyID0gcmVhY3Rpb24oXG4gICAgKCkgPT4gZ2V0Q3VycmVudENoaWxkcmVuKCksXG4gICAgKG5ld0NoaWxkcmVuKSA9PiB7XG4gICAgICBjb25zdCBkaXNwb3NlcnNUb1J1bjogb2JqZWN0W10gPSBbXVxuXG4gICAgICAvLyBmaW5kIGRlYWRcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGlsZHJlbkl0ZXIgPSBjdXJyZW50Q2hpbGRyZW4udmFsdWVzKClcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRyZW5DdXIgPSBjdXJyZW50Q2hpbGRyZW5JdGVyLm5leHQoKVxuICAgICAgd2hpbGUgKCFjdXJyZW50Q2hpbGRyZW5DdXIuZG9uZSkge1xuICAgICAgICBjb25zdCBuID0gY3VycmVudENoaWxkcmVuQ3VyLnZhbHVlXG4gICAgICAgIGlmICghbmV3Q2hpbGRyZW4uaGFzKG4pKSB7XG4gICAgICAgICAgY3VycmVudENoaWxkcmVuLmRlbGV0ZShuKVxuXG4gICAgICAgICAgLy8gd2Ugc2hvdWxkIHJ1biBpdCBpbiBpbnZlcnNlIG9yZGVyXG4gICAgICAgICAgZGlzcG9zZXJzVG9SdW4ucHVzaChuKVxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudENoaWxkcmVuQ3VyID0gY3VycmVudENoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc3Bvc2Vyc1RvUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRpc3Bvc2Vyc1RvUnVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgcnVuRGV0YWNoRGlzcG9zZXIoZGlzcG9zZXJzVG9SdW5baV0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZmluZCBuZXdcbiAgICAgIGNvbnN0IG5ld0NoaWxkcmVuSXRlciA9IG5ld0NoaWxkcmVuLnZhbHVlcygpXG4gICAgICBsZXQgbmV3Q2hpbGRyZW5DdXIgPSBuZXdDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB3aGlsZSAoIW5ld0NoaWxkcmVuQ3VyLmRvbmUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ld0NoaWxkcmVuQ3VyLnZhbHVlXG4gICAgICAgIGlmICghY3VycmVudENoaWxkcmVuLmhhcyhuKSkge1xuICAgICAgICAgIGN1cnJlbnRDaGlsZHJlbi5hZGQobilcblxuICAgICAgICAgIGFkZERldGFjaERpc3Bvc2VyKG4sIGZuKG4pKVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3Q2hpbGRyZW5DdXIgPSBuZXdDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuIChydW5EZXRhY2hEaXNwb3NlcnM6IGJvb2xlYW4pID0+IHtcbiAgICBkaXNwb3NlcigpXG5cbiAgICBpZiAocnVuRGV0YWNoRGlzcG9zZXJzKSB7XG4gICAgICBjb25zdCBjdXJyZW50Q2hpbGRyZW5JdGVyID0gY3VycmVudENoaWxkcmVuLnZhbHVlcygpXG4gICAgICBsZXQgY3VycmVudENoaWxkcmVuQ3VyID0gY3VycmVudENoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIHdoaWxlICghY3VycmVudENoaWxkcmVuQ3VyLmRvbmUpIHtcbiAgICAgICAgY29uc3QgbiA9IGN1cnJlbnRDaGlsZHJlbkN1ci52YWx1ZVxuICAgICAgICBydW5EZXRhY2hEaXNwb3NlcihuKVxuXG4gICAgICAgIGN1cnJlbnRDaGlsZHJlbkN1ciA9IGN1cnJlbnRDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB9XG4gICAgfVxuICAgIGN1cnJlbnRDaGlsZHJlbi5jbGVhcigpXG4gIH1cbn1cbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldERlZXBPYmplY3RDaGlsZHJlbiB9IGZyb20gXCIuL2NvcmVPYmplY3RDaGlsZHJlblwiXG5cbi8qKlxuICogUmV0dXJucyBpZiB0aGUgdGFyZ2V0IGlzIGEgXCJjaGlsZFwiIG9mIHRoZSB0cmVlIG9mIHRoZSBnaXZlbiBcInBhcmVudFwiIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NoaWxkT2ZQYXJlbnQoY2hpbGQ6IG9iamVjdCwgcGFyZW50OiBvYmplY3QpOiBib29sZWFuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChjaGlsZCwgXCJjaGlsZFwiKVxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHBhcmVudCwgXCJwYXJlbnRcIilcblxuICByZXR1cm4gZ2V0RGVlcE9iamVjdENoaWxkcmVuKHBhcmVudCkuZGVlcC5oYXMoY2hpbGQpXG59XG5cbi8qKlxuICogUmV0dXJucyBpZiB0aGUgdGFyZ2V0IGlzIGEgXCJwYXJlbnRcIiB0aGF0IGhhcyBpbiBpdHMgdHJlZSB0aGUgZ2l2ZW4gXCJjaGlsZFwiIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gcGFyZW50IFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gY2hpbGQgQ2hpbGQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyZW50T2ZDaGlsZChwYXJlbnQ6IG9iamVjdCwgY2hpbGQ6IG9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNDaGlsZE9mUGFyZW50KGNoaWxkLCBwYXJlbnQpXG59XG4iLCJsZXQgdHlwZUNoZWNraW5nQWxsb3dlZCA9IHRydWVcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRUeXBlQ2hlY2tpbmcoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgbGV0IG9sZFR5cGVDaGVja2luZ0FsbG93ZWQgPSB0eXBlQ2hlY2tpbmdBbGxvd2VkXG4gIHR5cGVDaGVja2luZ0FsbG93ZWQgPSBmYWxzZVxuXG4gIHRyeSB7XG4gICAgZm4oKVxuICB9IGZpbmFsbHkge1xuICAgIHR5cGVDaGVja2luZ0FsbG93ZWQgPSBvbGRUeXBlQ2hlY2tpbmdBbGxvd2VkXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZUNoZWNraW5nQWxsb3dlZCgpIHtcbiAgcmV0dXJuIHR5cGVDaGVja2luZ0FsbG93ZWRcbn1cbiIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBlbnVtIFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IHtcbiAgQXJyYXksXG4gIEZyb3plbixcbiAgTW9kZWwsXG4gIFBsYWluT2JqZWN0LFxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi4vdHdlYWtlci90eXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgd2l0aG91dFR5cGVDaGVja2luZyB9IGZyb20gXCIuLi90d2Vha2VyL3dpdGhvdXRUeXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGRldGFjaElmTmVlZGVkLCByZWNvbmNpbGVTbmFwc2hvdCwgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZPYmplY3QgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiByZWNvbmNpbGVBcnJheVNuYXBzaG90KFxuICB2YWx1ZTogYW55LFxuICBzbjogU25hcHNob3RJbk9mT2JqZWN0PGFueVtdPixcbiAgbW9kZWxQb29sOiBNb2RlbFBvb2xcbik6IGFueVtdIHtcbiAgaWYgKCFpc0FycmF5KHZhbHVlKSkge1xuICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgcmV0dXJuIGZyb21TbmFwc2hvdChzbilcbiAgfVxuXG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlQ2hhbmdlcyA9IGdldFNuYXBzaG90KHZhbHVlKVxuXG4gIHdpdGhvdXRUeXBlQ2hlY2tpbmcoKCkgPT4ge1xuICAgIC8vIHJlbW92ZSBleGNlc3MgaXRlbXNcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gc24ubGVuZ3RoKSB7XG4gICAgICB2YWx1ZS5zcGxpY2Uoc24ubGVuZ3RoLCB2YWx1ZS5sZW5ndGggLSBzbi5sZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gcmVjb25jaWxlIHByZXNlbnQgaXRlbXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHZhbHVlW2ldXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KG9sZFZhbHVlLCBzbltpXSwgbW9kZWxQb29sLCB2YWx1ZSlcblxuICAgICAgZGV0YWNoSWZOZWVkZWQobmV3VmFsdWUsIG9sZFZhbHVlLCBtb2RlbFBvb2wpXG5cbiAgICAgIHNldCh2YWx1ZSwgaSwgbmV3VmFsdWUpXG4gICAgfVxuXG4gICAgLy8gYWRkIGV4Y2VzcyBpdGVtc1xuICAgIGZvciAobGV0IGkgPSB2YWx1ZS5sZW5ndGg7IGkgPCBzbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUucHVzaChyZWNvbmNpbGVTbmFwc2hvdCh1bmRlZmluZWQsIHNuW2ldLCBtb2RlbFBvb2wsIHZhbHVlKSlcbiAgICB9XG4gIH0pXG5cbiAgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UodmFsdWUsIHVuZGVmaW5lZCwgc25hcHNob3RCZWZvcmVDaGFuZ2VzKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBcnJheVNuYXBzaG90UmVjb25jaWxlcigpIHtcbiAgcmVnaXN0ZXJSZWNvbmNpbGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LkFycmF5LCAodmFsdWUsIHNuLCBtb2RlbFBvb2wpID0+IHtcbiAgICBpZiAoaXNBcnJheShzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVBcnJheVNuYXBzaG90KHZhbHVlLCBzbiwgbW9kZWxQb29sKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBGcm96ZW4sIGZyb3plbiwgaXNGcm96ZW5TbmFwc2hvdCB9IGZyb20gXCIuLi9mcm96ZW4vRnJvemVuXCJcbmltcG9ydCB7IHJlZ2lzdGVyUmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mRnJvemVuIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gcmVjb25jaWxlRnJvemVuU25hcHNob3QodmFsdWU6IGFueSwgc246IFNuYXBzaG90SW5PZkZyb3plbjxGcm96ZW48YW55Pj4pOiBGcm96ZW48YW55PiB7XG4gIC8vIHJlY29uY2lsaWF0aW9uIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHRhcmdldCBpcyBhIEZyb3plbiBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIGRhdGEgKGJ5IHJlZilcbiAgLy8gaW4gdGhlb3J5IHdlIGNvdWxkIGNvbXBhcmUgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYm90aCBkYXRhcyBvciBkbyBhIGRlZXAgY29tcGFyaXNvbiwgYnV0IHRoYXQnZCBiZSB0b28gc2xvd1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGcm96ZW4gJiYgdmFsdWUuZGF0YSA9PT0gc24uZGF0YSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIHJldHVybiBmcm96ZW4oc24uZGF0YSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvemVuU25hcHNob3RSZWNvbmNpbGVyKCkge1xuICByZWdpc3RlclJlY29uY2lsZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuRnJvemVuLCAodmFsdWUsIHNuKSA9PiB7XG4gICAgaWYgKGlzRnJvemVuU25hcHNob3Qoc24pKSB7XG4gICAgICByZXR1cm4gcmVjb25jaWxlRnJvemVuU25hcHNob3QodmFsdWUsIHNuKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGRvIG5vdCBlZGl0IC5qcyBmaWxlcyBkaXJlY3RseSAtIGVkaXQgc3JjL2luZGV4LmpzdFxuXG5cbiAgdmFyIGVudkhhc0JpZ0ludDY0QXJyYXkgPSB0eXBlb2YgQmlnSW50NjRBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW5ndGgsIGksIGtleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoIWVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGlmICgoYSBpbnN0YW5jZW9mIE1hcCkgJiYgKGIgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSBvZiBhLmVudHJpZXMoKSlcbiAgICAgICAgaWYgKCFiLmhhcyhpWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICBpZiAoIWVxdWFsKGlbMV0sIGIuZ2V0KGlbMF0pKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKChhIGluc3RhbmNlb2YgU2V0KSAmJiAoYiBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGEpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIWVxdWFsKGFba2V5XSwgYltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gdHJ1ZSBpZiBib3RoIE5hTiwgZmFsc2Ugb3RoZXJ3aXNlXG4gIHJldHVybiBhIT09YSAmJiBiIT09Yjtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwsIGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBnZXRNb2RlbEluZm9Gb3JOYW1lIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBkYXRhT2JqZWN0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB7XG4gIGdldERlZXBPYmplY3RDaGlsZHJlbixcbiAgcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb24sXG59IGZyb20gXCIuLi9wYXJlbnQvY29yZU9iamVjdENoaWxkcmVuXCJcblxuZnVuY3Rpb24gYnlNb2RlbFR5cGVBbmRJZEtleShtb2RlbFR5cGU6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nKSB7XG4gIHJldHVybiBtb2RlbFR5cGUgKyBcIiBcIiArIG1vZGVsSWRcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsUG9vbCB7XG4gIHByaXZhdGUgcG9vbDogUmVhZG9ubHlNYXA8c3RyaW5nLCBBbnlNb2RlbD5cblxuICBjb25zdHJ1Y3Rvcihyb290OiBvYmplY3QpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgdXNlIHRoZSBzdWItZGF0YSAkIG9iamVjdFxuICAgIHJvb3QgPSBkYXRhT2JqZWN0UGFyZW50LmdldChyb290KSA/PyByb290XG5cbiAgICB0aGlzLnBvb2wgPSBnZXREZWVwQ2hpbGRyZW5Nb2RlbHMoZ2V0RGVlcE9iamVjdENoaWxkcmVuKHJvb3QpKVxuICB9XG5cbiAgZmluZE1vZGVsQnlUeXBlQW5kSWQobW9kZWxUeXBlOiBzdHJpbmcsIG1vZGVsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEFueU1vZGVsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbW9kZWxJZCA/IHRoaXMucG9vbC5nZXQoYnlNb2RlbFR5cGVBbmRJZEtleShtb2RlbFR5cGUsIG1vZGVsSWQpKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZmluZE1vZGVsRm9yU25hcHNob3Qoc246IGFueSk6IEFueU1vZGVsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbFR5cGUgPSBzblttb2RlbFR5cGVLZXldXG4gICAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZShtb2RlbFR5cGUpIVxuICAgIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPilcblxuICAgIHJldHVybiBtb2RlbElkUHJvcGVydHlOYW1lXG4gICAgICA/IHRoaXMuZmluZE1vZGVsQnlUeXBlQW5kSWQoc25bbW9kZWxUeXBlS2V5XSwgKHNuIGFzIGFueSlbbW9kZWxJZFByb3BlcnR5TmFtZV0pXG4gICAgICA6IHVuZGVmaW5lZFxuICB9XG59XG5cbmNvbnN0IGdldERlZXBDaGlsZHJlbk1vZGVscyA9IHJlZ2lzdGVyRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uPE1hcDxzdHJpbmcsIEFueU1vZGVsPj4oe1xuICBpbml0RGF0YSgpIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpXG4gIH0sXG5cbiAgYWRkTm9kZShub2RlLCBkYXRhKSB7XG4gICAgaWYgKGlzTW9kZWwobm9kZSkpIHtcbiAgICAgIGNvbnN0IGlkID0gbm9kZVttb2RlbElkS2V5XVxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGRhdGEuc2V0KGJ5TW9kZWxUeXBlQW5kSWRLZXkobm9kZVttb2RlbFR5cGVLZXldLCBpZCksIG5vZGUpXG4gICAgICB9XG4gICAgfVxuICB9LFxufSlcbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZU9iamVjdCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB7IGlzRnJvemVuU25hcHNob3QgfSBmcm9tIFwiLi4vZnJvemVuL0Zyb3plblwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwsIGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUsIG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlLCBpbkRldk1vZGUsIGlzQXJyYXksIGlzUGxhaW5PYmplY3QsIGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgTW9kZWxQb29sIH0gZnJvbSBcIi4uL3V0aWxzL01vZGVsUG9vbFwiXG5pbXBvcnQgeyByZWNvbmNpbGVTbmFwc2hvdCB9IGZyb20gXCIuL3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mLCBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bGwgc25hcHNob3Qgb3ZlciBhbiBvYmplY3QsIHJlY29uY2lsaW5nIGl0IHdpdGggdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBUYXJnZXQgb2JqZWN0IChtb2RlbCBvYmplY3QsIG9iamVjdCBvciBhcnJheSkuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QgdG8gYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNuYXBzaG90PFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQsIHNuYXBzaG90OiBTbmFwc2hvdEluT2Y8VD4pOiB2b2lkXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bGwgc25hcHNob3Qgb3ZlciBhbiBvYmplY3QsIHJlY29uY2lsaW5nIGl0IHdpdGggdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBUYXJnZXQgb2JqZWN0IChtb2RlbCBvYmplY3QsIG9iamVjdCBvciBhcnJheSkuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QgdG8gYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNuYXBzaG90PFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQsIHNuYXBzaG90OiBTbmFwc2hvdE91dE9mPFQ+KTogdm9pZFxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTbmFwc2hvdChub2RlOiBvYmplY3QsIHNuYXBzaG90OiB1bmtub3duKTogdm9pZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG4gIGFzc2VydElzT2JqZWN0KHNuYXBzaG90LCBcInNuYXBzaG90XCIpXG5cbiAgd3JhcHBlZEludGVybmFsQXBwbHlTbmFwc2hvdCgpLmNhbGwobm9kZSwgc25hcHNob3QpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEFwcGx5U25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4oXG4gIHRoaXM6IFQsXG4gIHNuOiBTbmFwc2hvdEluT2Y8VD4gfCBTbmFwc2hvdE91dE9mPFQ+XG4pOiB2b2lkIHtcbiAgY29uc3Qgb2JqID0gdGhpc1xuXG4gIGNvbnN0IHJlY29uY2lsZSA9ICgpID0+IHtcbiAgICBjb25zdCBtb2RlbFBvb2wgPSBuZXcgTW9kZWxQb29sKG9iailcbiAgICBjb25zdCByZXQgPSByZWNvbmNpbGVTbmFwc2hvdChvYmosIHNuLCBtb2RlbFBvb2wsIHVuZGVmaW5lZClcblxuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgaWYgKHJldCAhPT0gb2JqKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiByZWNvbmNpbGVkIG9iamVjdCBoYXMgdG8gYmUgdGhlIHNhbWVcIilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaXNBcnJheShzbikpIHtcbiAgICBpZiAoIWlzQXJyYXkob2JqKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImlmIHRoZSBzbmFwc2hvdCBpcyBhbiBhcnJheSB0aGUgdGFyZ2V0IG11c3QgYmUgYW4gYXJyYXkgdG9vXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgpXG4gIH1cblxuICBpZiAoaXNGcm96ZW5TbmFwc2hvdChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYXBwbHlTbmFwc2hvdCBjYW5ub3QgYmUgdXNlZCBvdmVyIGZyb3plbiBvYmplY3RzXCIpXG4gIH1cblxuICAvLyBhZGFwdCBzbmFwc2hvdCB0byB0YXJnZXQgbW9kZWwgaWYgcG9zc2libGVcbiAgaWYgKGlzUGxhaW5PYmplY3Qoc24pICYmIChzbiBhcyBhbnkpW21vZGVsVHlwZUtleV0gPT09IHVuZGVmaW5lZCAmJiBpc01vZGVsKG9iaikpIHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldCgob2JqIGFzIGFueSkuY29uc3RydWN0b3IpIVxuICAgIHNuID0geyAuLi5zbiwgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lIH1cbiAgfVxuXG4gIGlmIChpc01vZGVsU25hcHNob3Qoc24pKSB7XG4gICAgY29uc3QgdHlwZSA9IHNuW21vZGVsVHlwZUtleV1cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUodHlwZSlcbiAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShgbW9kZWwgd2l0aCBuYW1lIFwiJHt0eXBlfVwiIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnlgKVxuICAgIH1cblxuICAgIC8vIHdlIGRvbid0IGNoZWNrIGJ5IGFjdHVhbCBpbnN0YW5jZSBzaW5jZSB0aGUgY2xhc3MgbWlnaHQgYmUgYSBkaWZmZXJlbnQgb25lIGR1ZSB0byBob3QgcmVsb2FkaW5nXG4gICAgaWYgKCFpc01vZGVsKG9iaikpIHtcbiAgICAgIC8vIG5vdCBhIG1vZGVsIGluc3RhbmNlLCBubyByZWNvbmNpbGlhdGlvbiBwb3NzaWJsZVxuICAgICAgdGhyb3cgZmFpbHVyZShgdGhlIHRhcmdldCBmb3IgYSBtb2RlbCBzbmFwc2hvdCBtdXN0IGJlIGEgbW9kZWwgaW5zdGFuY2VgKVxuICAgIH1cblxuICAgIGlmIChvYmpbbW9kZWxUeXBlS2V5XSAhPT0gdHlwZSkge1xuICAgICAgLy8gZGlmZmVyZW50IGtpbmQgb2YgbW9kZWwsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgc25hcHNob3QgbW9kZWwgdHlwZSAnJHt0eXBlfScgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IG1vZGVsIHR5cGUgJyR7XG4gICAgICAgICAgKG9iaiBhcyBhbnkpW21vZGVsVHlwZUtleV1cbiAgICAgICAgfSdgXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZSA9IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUobW9kZWxJbmZvLmNsYXNzIGFzIE1vZGVsQ2xhc3M8QW55TW9kZWw+KVxuICAgIGlmIChtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICBjb25zdCBpZCA9IChzbiBhcyBhbnkpW21vZGVsSWRQcm9wZXJ0eU5hbWVdXG4gICAgICBpZiAob2JqW21vZGVsSWRLZXldICE9PSBpZCkge1xuICAgICAgICAvLyBkaWZmZXJlbnQgaWQsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYHNuYXBzaG90IG1vZGVsIGlkICcke2lkfScgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IG1vZGVsIGlkICcke29ialttb2RlbElkS2V5XX0nYFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgpXG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdChzbikpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qob2JqKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KG9iaikpIHtcbiAgICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICB0aHJvdyBmYWlsdXJlKFwiaWYgdGhlIHNuYXBzaG90IGlzIGFuIG9iamVjdCB0aGUgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0IHRvb1wiKVxuICAgIH1cblxuICAgIHJldHVybiByZWNvbmNpbGUoKVxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgc25hcHNob3QgLSAke3NufWApXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5U25hcHNob3QgPSBsYXp5KCgpID0+XG4gIHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBCdWlsdEluQWN0aW9uLkFwcGx5U25hcHNob3QsXG4gICAgZm46IGludGVybmFsQXBwbHlTbmFwc2hvdCxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuIiwiaW1wb3J0IHsgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuXG4vKipcbiAqIExpc3RlbmVyIGZ1bmN0aW9uIGZvciBvblNuYXBzaG90LlxuICovXG5leHBvcnQgdHlwZSBPblNuYXBzaG90TGlzdGVuZXI8VD4gPSAoc246IFNuYXBzaG90T3V0T2Y8VD4sIHByZXZTbjogU25hcHNob3RPdXRPZjxUPikgPT4gdm9pZFxuXG4vKipcbiAqIERpc3Bvc2VyIGZ1bmN0aW9uIGZvciBvblNuYXBzaG90LlxuICovXG5leHBvcnQgdHlwZSBPblNuYXBzaG90RGlzcG9zZXIgPSAoKSA9PiB2b2lkXG5cbi8qKlxuICogQWRkcyBhIHJlYWN0aW9uIHRoYXQgd2lsbCB0cmlnZ2VyIGV2ZXJ5IHRpbWUgYW4gc25hcHNob3QgY2hhbmdlcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZU9yRm4gT2JqZWN0IHRvIGdldCB0aGUgc25hcHNob3QgZnJvbSBvciBhIGZ1bmN0aW9uIHRvIGdldCBpdC5cbiAqIEBwYXJhbSBsaXN0ZW5lciBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHNuYXBzaG90IGNoYW5nZXMuXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25TbmFwc2hvdDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgbm9kZU9yRm46IFQgfCAoKCkgPT4gVCksXG4gIGxpc3RlbmVyOiBPblNuYXBzaG90TGlzdGVuZXI8VD5cbik6IE9uU25hcHNob3REaXNwb3NlciB7XG4gIGNvbnN0IG5vZGVGbiA9IHR5cGVvZiBub2RlT3JGbiA9PT0gXCJmdW5jdGlvblwiID8gKG5vZGVPckZuIGFzICgpID0+IFQpIDogKCkgPT4gbm9kZU9yRm5cblxuICBjb25zdCBub2RlID0gbm9kZUZuKClcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICBsZXQgY3VycmVudFNuYXBzaG90ID0gZ2V0U25hcHNob3Qobm9kZSlcblxuICByZXR1cm4gcmVhY3Rpb24oXG4gICAgKCkgPT4gZ2V0U25hcHNob3Qobm9kZUZuKCkpLFxuICAgIChuZXdTbmFwc2hvdCkgPT4ge1xuICAgICAgY29uc3QgcHJldlNuID0gY3VycmVudFNuYXBzaG90XG4gICAgICBjdXJyZW50U25hcHNob3QgPSBuZXdTbmFwc2hvdFxuICAgICAgbGlzdGVuZXIobmV3U25hcHNob3QsIHByZXZTbilcbiAgICB9XG4gIClcbn1cbiIsImltcG9ydCBmYXN0RGVlcEVxdWFsIGZyb20gXCJmYXN0LWRlZXAtZXF1YWwvZXM2XCJcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgdG9KUyB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90XCJcbmltcG9ydCB7IGlzVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlclwiXG5pbXBvcnQgeyBnZXRNb2J4VmVyc2lvbiB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogRGVlcGx5IGNvbXBhcmVzIHR3byB2YWx1ZXMuXG4gKlxuICogU3VwcG9ydGVkIHZhbHVlcyBhcmU6XG4gKiAtIFByaW1pdGl2ZXNcbiAqIC0gQm94ZWQgb2JzZXJ2YWJsZXNcbiAqIC0gT2JqZWN0cywgb2JzZXJ2YWJsZSBvYmplY3RzXG4gKiAtIEFycmF5cywgb2JzZXJ2YWJsZSBhcnJheXNcbiAqIC0gVHlwZWQgYXJyYXlzXG4gKiAtIE1hcHMsIG9ic2VydmFibGUgbWFwc1xuICogLSBTZXRzLCBvYnNlcnZhYmxlIHNldHNcbiAqIC0gVHJlZSBub2RlcyAob3B0aW1pemVkIGJ5IHVzaW5nIHNuYXBzaG90IGNvbXBhcmlzb24gaW50ZXJuYWxseSlcbiAqXG4gKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgbW9kZWxzIHRoZSByZXN1bHQgd2lsbCBiZSBmYWxzZSBpZiB0aGVpciBtb2RlbCBJRHMgYXJlIGRpZmZlcmVudC5cbiAqXG4gKiBAcGFyYW0gYSBGaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhleSBhcmUgdGhlIGVxdWl2YWxlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFscyhhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICAvLyBxdWljayBjaGVjayBmb3IgcmVmZXJlbmNlXG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIHVzZSBzbmFwc2hvdHMgdG8gY29tcGFyZSBpZiBwb3NzaWJsZVxuICAvLyBzaW5jZSBzbmFwc2hvdHMgdXNlIHN0cnVjdHVyYWwgc2hhcmluZyBpdCBpcyBtb3JlIGxpa2VseVxuICAvLyB0byBzcGVlZCB1cCBjb21wYXJpc29uc1xuICBpZiAoaXNUcmVlTm9kZShhKSkge1xuICAgIGEgPSBnZXRTbmFwc2hvdChhKVxuICB9IGVsc2UgaWYgKGlzT2JzZXJ2YWJsZShhKSkge1xuICAgIGEgPSB0b0pTKGEsIHRvSlNPcHRpb25zKVxuICB9XG4gIGlmIChpc1RyZWVOb2RlKGIpKSB7XG4gICAgYiA9IGdldFNuYXBzaG90KGIpXG4gIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKGIpKSB7XG4gICAgYiA9IHRvSlMoYiwgdG9KU09wdGlvbnMpXG4gIH1cblxuICByZXR1cm4gZmFzdERlZXBFcXVhbChhLCBiKVxufVxuXG5jb25zdCB0b0pTT3B0aW9ucyA9XG4gIGdldE1vYnhWZXJzaW9uKCkgPj0gNlxuICAgID8gdW5kZWZpbmVkXG4gICAgOiB7XG4gICAgICAgIGV4cG9ydE1hcHNBc09iamVjdHM6IGZhbHNlLFxuICAgICAgICByZWN1cnNlRXZlcnl0aGluZzogZmFsc2UsXG4gICAgICB9XG4iLCJpbXBvcnQgeyByZW1vdmUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBpc1Jlc2VydmVkTW9kZWxLZXksIG1vZGVsSWRLZXksIG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsLCBpc01vZGVsU25hcHNob3QgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBnZXRNb2RlbEluZm9Gb3JOYW1lIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBkZWVwRXF1YWxzIH0gZnJvbSBcIi4uL3RyZWVVdGlscy9kZWVwRXF1YWxzXCJcbmltcG9ydCB7IHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IHdpdGhvdXRUeXBlQ2hlY2tpbmcgfSBmcm9tIFwiLi4vdHdlYWtlci93aXRob3V0VHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGRldGFjaElmTmVlZGVkLCByZWNvbmNpbGVTbmFwc2hvdCwgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZNb2RlbCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIHJlY29uY2lsZU1vZGVsU25hcHNob3QoXG4gIHZhbHVlOiBhbnksXG4gIHNuOiBTbmFwc2hvdEluT2ZNb2RlbDxBbnlNb2RlbD4sXG4gIG1vZGVsUG9vbDogTW9kZWxQb29sLFxuICBwYXJlbnQ6IGFueVxuKTogQW55TW9kZWwge1xuICBjb25zdCB0eXBlID0gc25bbW9kZWxUeXBlS2V5XSFcblxuICBjb25zdCBtb2RlbEluZm8gPSBnZXRNb2RlbEluZm9Gb3JOYW1lKHR5cGUpXG4gIGlmICghbW9kZWxJbmZvKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgbW9kZWwgd2l0aCBuYW1lIFwiJHt0eXBlfVwiIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnlgKVxuICB9XG5cbiAgLy8gdHJ5IHRvIHVzZSBtb2RlbCBmcm9tIHBvb2wgaWYgcG9zc2libGVcbiAgY29uc3QgbW9kZWxJblBvb2wgPSBtb2RlbFBvb2wuZmluZE1vZGVsRm9yU25hcHNob3Qoc24pXG4gIGlmIChtb2RlbEluUG9vbCkge1xuICAgIHZhbHVlID0gbW9kZWxJblBvb2xcbiAgfVxuXG4gIC8vIHdlIGRvbid0IGNoZWNrIGJ5IGFjdHVhbCBpbnN0YW5jZSBzaW5jZSB0aGUgY2xhc3MgbWlnaHQgYmUgYSBkaWZmZXJlbnQgb25lIGR1ZSB0byBob3QgcmVsb2FkaW5nXG4gIGlmICghaXNNb2RlbCh2YWx1ZSkgfHwgdmFsdWVbbW9kZWxUeXBlS2V5XSAhPT0gdHlwZSkge1xuICAgIC8vIGRpZmZlcmVudCBraW5kIG9mIG1vZGVsIHR5cGUsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgcmV0dXJuIGZyb21TbmFwc2hvdDxBbnlNb2RlbD4oc24pXG4gIH1cblxuICBjb25zdCBtb2RlbElkUHJvcGVydHlOYW1lID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pXG4gIGlmIChtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgY29uc3QgaWQgPSBzblttb2RlbElkUHJvcGVydHlOYW1lXVxuXG4gICAgaWYgKHZhbHVlW21vZGVsSWRLZXldICE9PSBpZCkge1xuICAgICAgLy8gZGlmZmVyZW50IGlkLCBubyByZWNvbmNpbGlhdGlvbiBwb3NzaWJsZVxuICAgICAgcmV0dXJuIGZyb21TbmFwc2hvdDxBbnlNb2RlbD4oc24pXG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQXJyYXkocGFyZW50KSkge1xuICAgIC8vIG5vIGlkIGFuZCBpbnNpZGUgYW4gYXJyYXk/IG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlLFxuICAgIC8vIHVubGVzcyB0aGUgc25hcHNob3RzIGFyZSBlcXVpdmFsZW50IChub3RlIGRlZXAgZXF1YWxzIHdpbGwgdXNlIHRoZSBzbmFwc2hvdCBvZiB2YWx1ZSBhdXRvKVxuICAgIGlmICghZGVlcEVxdWFscyh2YWx1ZSwgc24pKSB7XG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90PEFueU1vZGVsPihzbilcbiAgICB9XG4gIH1cblxuICBjb25zdCBtb2RlbE9iajogQW55TW9kZWwgPSB2YWx1ZVxuICBjb25zdCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMgPSBnZXRTbmFwc2hvdChtb2RlbE9iailcblxuICB3aXRob3V0VHlwZUNoZWNraW5nKCgpID0+IHtcbiAgICBsZXQgcHJvY2Vzc2VkU246IGFueSA9IHNuXG4gICAgY29uc3QgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbD4gPSAobW9kZWxPYmogYXMgYW55KS5jb25zdHJ1Y3RvclxuICAgIGlmIChtb2RlbENsYXNzLmZyb21TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgICAgcHJvY2Vzc2VkU24gPSBtb2RlbENsYXNzLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gbW9kZWxPYmouJFxuXG4gICAgLy8gcmVtb3ZlIGV4Y2VzcyBwcm9wc1xuICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgICBjb25zdCBkYXRhS2V5c0xlbiA9IGRhdGFLZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUtleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGRhdGFLZXlzW2ldXG4gICAgICBpZiAoIShrIGluIHByb2Nlc3NlZFNuKSkge1xuICAgICAgICByZW1vdmUoZGF0YSwgaylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZWNvbmNpbGUgdGhlIHJlc3RcbiAgICBjb25zdCBwcm9jZXNzZWRTbktleXMgPSBPYmplY3Qua2V5cyhwcm9jZXNzZWRTbilcbiAgICBjb25zdCBwcm9jZXNzZWRTbktleXNMZW4gPSBwcm9jZXNzZWRTbktleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWRTbktleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IHByb2Nlc3NlZFNuS2V5c1tpXVxuICAgICAgaWYgKCFpc1Jlc2VydmVkTW9kZWxLZXkoaykpIHtcbiAgICAgICAgY29uc3QgdiA9IHByb2Nlc3NlZFNuW2tdXG5cbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBkYXRhW2tdXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3Qob2xkVmFsdWUsIHYsIG1vZGVsUG9vbCwgbW9kZWxPYmopXG5cbiAgICAgICAgZGV0YWNoSWZOZWVkZWQobmV3VmFsdWUsIG9sZFZhbHVlLCBtb2RlbFBvb2wpXG5cbiAgICAgICAgc2V0KGRhdGEsIGssIG5ld1ZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShtb2RlbE9iaiwgdW5kZWZpbmVkLCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMpXG5cbiAgcmV0dXJuIG1vZGVsT2JqXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vZGVsU25hcHNob3RSZWNvbmNpbGVyKCkge1xuICByZWdpc3RlclJlY29uY2lsZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuTW9kZWwsICh2YWx1ZSwgc24sIG1vZGVsUG9vbCwgcGFyZW50KSA9PiB7XG4gICAgaWYgKGlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVNb2RlbFNuYXBzaG90KHZhbHVlLCBzbiwgbW9kZWxQb29sLCBwYXJlbnQpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZU9iamVjdCwgcmVtb3ZlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuLi90d2Vha2VyL3R5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyB3aXRob3V0VHlwZUNoZWNraW5nIH0gZnJvbSBcIi4uL3R3ZWFrZXIvd2l0aG91dFR5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxQb29sIH0gZnJvbSBcIi4uL3V0aWxzL01vZGVsUG9vbFwiXG5pbXBvcnQgeyBmcm9tU25hcHNob3QgfSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyBkZXRhY2hJZk5lZWRlZCwgcmVjb25jaWxlU25hcHNob3QsIHJlZ2lzdGVyUmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mT2JqZWN0IH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdChcbiAgdmFsdWU6IGFueSxcbiAgc246IFNuYXBzaG90SW5PZk9iamVjdDxhbnk+LFxuICBtb2RlbFBvb2w6IE1vZGVsUG9vbFxuKTogb2JqZWN0IHtcbiAgLy8gcGxhaW4gb2JqXG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgIWlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkpIHtcbiAgICAvLyBubyByZWNvbmNpbGlhdGlvbiBwb3NzaWJsZVxuICAgIHJldHVybiBmcm9tU25hcHNob3Qoc24pXG4gIH1cblxuICBjb25zdCBwbGFpbk9iaiA9IHZhbHVlXG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlQ2hhbmdlcyA9IGdldFNuYXBzaG90KHBsYWluT2JqKVxuXG4gIHdpdGhvdXRUeXBlQ2hlY2tpbmcoKCkgPT4ge1xuICAgIC8vIHJlbW92ZSBleGNlc3MgcHJvcHNcbiAgICBjb25zdCBwbGFpbk9iaktleXMgPSBPYmplY3Qua2V5cyhwbGFpbk9iailcbiAgICBjb25zdCBwbGFpbk9iaktleXNMZW4gPSBwbGFpbk9iaktleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFpbk9iaktleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IHBsYWluT2JqS2V5c1tpXVxuICAgICAgaWYgKCEoayBpbiBzbikpIHtcbiAgICAgICAgcmVtb3ZlKHBsYWluT2JqLCBrKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY29uY2lsZSB0aGUgcmVzdFxuICAgIGNvbnN0IHNuS2V5cyA9IE9iamVjdC5rZXlzKHNuKVxuICAgIGNvbnN0IHNuS2V5c0xlbiA9IHNuS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNuS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gc25LZXlzW2ldXG4gICAgICBjb25zdCB2ID0gc25ba11cblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBwbGFpbk9ialtrXVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdChvbGRWYWx1ZSwgdiwgbW9kZWxQb29sLCBwbGFpbk9iailcblxuICAgICAgZGV0YWNoSWZOZWVkZWQobmV3VmFsdWUsIG9sZFZhbHVlLCBtb2RlbFBvb2wpXG5cbiAgICAgIHNldChwbGFpbk9iaiwgaywgbmV3VmFsdWUpXG4gICAgfVxuICB9KVxuXG4gIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKHBsYWluT2JqLCB1bmRlZmluZWQsIHNuYXBzaG90QmVmb3JlQ2hhbmdlcylcblxuICByZXR1cm4gcGxhaW5PYmpcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGxhaW5PYmplY3RTbmFwc2hvdFJlY29uY2lsZXIoKSB7XG4gIHJlZ2lzdGVyUmVjb25jaWxlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5QbGFpbk9iamVjdCwgKHZhbHVlLCBzbiwgbW9kZWxQb29sKSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3Qoc24pKSB7XG4gICAgICByZXR1cm4gcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdCh2YWx1ZSwgc24sIG1vZGVsUG9vbClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJBcnJheVNuYXBzaG90UmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZUFycmF5U25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm96ZW5TbmFwc2hvdFJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVGcm96ZW5TbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3Rlck1vZGVsU25hcHNob3RSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlTW9kZWxTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlclBsYWluT2JqZWN0U25hcHNob3RSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlUGxhaW5PYmplY3RTbmFwc2hvdFwiXG5cbmxldCBkZWZhdWx0UmVjb25jaWxlcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzKCkge1xuICBpZiAoZGVmYXVsdFJlY29uY2lsZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRSZWNvbmNpbGVyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgcmVnaXN0ZXJBcnJheVNuYXBzaG90UmVjb25jaWxlcigpXG4gIHJlZ2lzdGVyRnJvemVuU25hcHNob3RSZWNvbmNpbGVyKClcbiAgcmVnaXN0ZXJNb2RlbFNuYXBzaG90UmVjb25jaWxlcigpXG4gIHJlZ2lzdGVyUGxhaW5PYmplY3RTbmFwc2hvdFJlY29uY2lsZXIoKVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGhJbmNsdWRpbmdEYXRhT2JqZWN0cyB9IGZyb20gXCIuLi9wYXJlbnRcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNNYXAsIGlzUHJpbWl0aXZlLCBpc1NldCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckRlZmF1bHRSZWNvbmNpbGVycyB9IGZyb20gXCIuL3JlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzXCJcblxudHlwZSBSZWNvbmNpbGVyID0gKHZhbHVlOiBhbnksIHNuOiBhbnksIG1vZGVsUG9vbDogTW9kZWxQb29sLCBwYXJlbnQ6IGFueSkgPT4gYW55IHwgdW5kZWZpbmVkXG5cbmNvbnN0IHJlY29uY2lsZXJzOiB7IHByaW9yaXR5OiBudW1iZXI7IHJlY29uY2lsZXI6IFJlY29uY2lsZXIgfVtdID0gW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVjb25jaWxlcihwcmlvcml0eTogbnVtYmVyLCByZWNvbmNpbGVyOiBSZWNvbmNpbGVyKTogdm9pZCB7XG4gIHJlY29uY2lsZXJzLnB1c2goeyBwcmlvcml0eSwgcmVjb25jaWxlciB9KVxuICByZWNvbmNpbGVycy5zb3J0KChhLCBiKSA9PiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29uY2lsZVNuYXBzaG90KHZhbHVlOiBhbnksIHNuOiBhbnksIG1vZGVsUG9vbDogTW9kZWxQb29sLCBwYXJlbnQ6IGFueSk6IGFueSB7XG4gIGlmIChpc1ByaW1pdGl2ZShzbikpIHtcbiAgICByZXR1cm4gc25cbiAgfVxuXG4gIC8vIGlmIHRoZSBzbmFwc2hvdCBwYXNzZWQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmVcbiAgLy8gdGhlbiBpdCBpcyBhbHJlYWR5IHJlY29uY2lsZWRcbiAgaWYgKGdldFNuYXBzaG90KHZhbHVlKSA9PT0gc24pIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHJlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzKClcblxuICBjb25zdCByZWNvbmNpbGVyc0xlbiA9IHJlY29uY2lsZXJzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29uY2lsZXJzTGVuOyBpKyspIHtcbiAgICBjb25zdCB7IHJlY29uY2lsZXIgfSA9IHJlY29uY2lsZXJzW2ldXG4gICAgY29uc3QgcmV0ID0gcmVjb25jaWxlcih2YWx1ZSwgc24sIG1vZGVsUG9vbCwgcGFyZW50KVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgfVxuXG4gIGlmIChpc01hcChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIG1hcHNcIilcbiAgfVxuXG4gIGlmIChpc1NldChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIHNldHNcIilcbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIHNuYXBzaG90IC0gJHtzbn1gKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0YWNoSWZOZWVkZWQobmV3VmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSwgbW9kZWxQb29sOiBNb2RlbFBvb2wpIHtcbiAgLy8gZWRnZSBjYXNlIGZvciB3aGVuIHdlIGFyZSBzd2FwcGluZyBtb2RlbHMgYXJvdW5kIHRoZSB0cmVlXG5cbiAgaWYgKG5ld1ZhbHVlID09PSBvbGRWYWx1ZSkge1xuICAgIC8vIGFscmVhZHkgd2hlcmUgaXQgc2hvdWxkIGJlXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoXG4gICAgaXNNb2RlbChuZXdWYWx1ZSkgJiZcbiAgICBtb2RlbFBvb2wuZmluZE1vZGVsQnlUeXBlQW5kSWQobmV3VmFsdWVbbW9kZWxUeXBlS2V5XSwgbmV3VmFsdWVbbW9kZWxJZEtleV0pXG4gICkge1xuICAgIGNvbnN0IHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzKG5ld1ZhbHVlKVxuICAgIGlmIChwYXJlbnRQYXRoKSB7XG4gICAgICBzZXQocGFyZW50UGF0aC5wYXJlbnQsIHBhcmVudFBhdGgucGF0aCwgbnVsbClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlbW92ZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgbW9kZWxUb0RhdGFOb2RlIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUGF0aEVsZW1lbnQgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4uL3BhdGNoL1BhdGNoXCJcbmltcG9ydCB7IHJlY29uY2lsZVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L3JlY29uY2lsZVNuYXBzaG90XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNBcnJheSwgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBwYXRjaGVzIHRvIHRoZSBnaXZlbiB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBub2RlIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gcGF0Y2hlcyBMaXN0IG9mIHBhdGNoZXMgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcmV2ZXJzZSBXaGV0aGVyIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyhcbiAgbm9kZTogb2JqZWN0LFxuICBwYXRjaGVzOiBSZWFkb25seUFycmF5PFBhdGNoPiB8IFJlYWRvbmx5QXJyYXk8UmVhZG9ubHlBcnJheTxQYXRjaD4+LFxuICByZXZlcnNlOiBib29sZWFuID0gZmFsc2Vcbik6IHZvaWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGlmIChwYXRjaGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB3cmFwcGVkSW50ZXJuYWxBcHBseVBhdGNoZXMoKS5jYWxsKG5vZGUsIHBhdGNoZXMsIHJldmVyc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEFwcGx5UGF0Y2hlcyhcbiAgdGhpczogb2JqZWN0LFxuICBwYXRjaGVzOiBSZWFkb25seUFycmF5PFBhdGNoPiB8IFJlYWRvbmx5QXJyYXk8UmVhZG9ubHlBcnJheTxQYXRjaD4+LFxuICByZXZlcnNlOiBib29sZWFuID0gZmFsc2Vcbik6IHZvaWQge1xuICBjb25zdCBvYmogPSB0aGlzXG4gIGNvbnN0IG1vZGVsUG9vbCA9IG5ldyBNb2RlbFBvb2wob2JqKVxuXG4gIGlmIChyZXZlcnNlKSB7XG4gICAgbGV0IGkgPSBwYXRjaGVzLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRjaGVzW2ldXG4gICAgICBpZiAoIWlzQXJyYXkocCkpIHtcbiAgICAgICAgYXBwbHlTaW5nbGVQYXRjaChvYmosIHAgYXMgUGF0Y2gsIG1vZGVsUG9vbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBqID0gcC5sZW5ndGhcbiAgICAgICAgd2hpbGUgKGotLSkge1xuICAgICAgICAgIGFwcGx5U2luZ2xlUGF0Y2gob2JqLCBwW2pdLCBtb2RlbFBvb2wpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbGVuID0gcGF0Y2hlcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBwID0gcGF0Y2hlc1tpXVxuICAgICAgaWYgKCFpc0FycmF5KHApKSB7XG4gICAgICAgIGFwcGx5U2luZ2xlUGF0Y2gob2JqLCBwIGFzIFBhdGNoLCBtb2RlbFBvb2wpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsZW4yID0gcC5sZW5ndGhcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW4yOyBqKyspIHtcbiAgICAgICAgICBhcHBseVNpbmdsZVBhdGNoKG9iaiwgcFtqXSwgbW9kZWxQb29sKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5UGF0Y2hlcyA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlQYXRjaGVzLFxuICAgIGZuOiBpbnRlcm5hbEFwcGx5UGF0Y2hlcyxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuXG5mdW5jdGlvbiBhcHBseVNpbmdsZVBhdGNoKG9iajogb2JqZWN0LCBwYXRjaDogUGF0Y2gsIG1vZGVsUG9vbDogTW9kZWxQb29sKTogdm9pZCB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBwcm9wIH0gPSBwYXRoQXJyYXlUb09iamVjdEFuZFByb3Aob2JqLCBwYXRjaC5wYXRoKVxuXG4gIGlmIChpc0FycmF5KHRhcmdldCkpIHtcbiAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSArcHJvcCFcbiAgICAgICAgLy8gcmVjb25jaWxlIGZyb20gdGhlIHBvb2wgaWYgcG9zc2libGVcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdCh1bmRlZmluZWQsIHBhdGNoLnZhbHVlLCBtb2RlbFBvb2wsIHRhcmdldClcbiAgICAgICAgdGFyZ2V0LnNwbGljZShpbmRleCwgMCwgbmV3VmFsdWUpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICBjb25zdCBpbmRleCA9ICtwcm9wIVxuICAgICAgICAvLyBubyByZWNvbmNpbGlhdGlvbiwgcmVtb3ZpbmdcbiAgICAgICAgdGFyZ2V0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICBpZiAocHJvcCA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgIHRhcmdldC5sZW5ndGggPSBwYXRjaC52YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gK3Byb3AhXG4gICAgICAgICAgLy8gdHJ5IHRvIHJlY29uY2lsZVxuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3QodGFyZ2V0W2luZGV4XSwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICAgIHNldCh0YXJnZXQsIGluZGV4IGFzIGFueSwgbmV3VmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiAkeyhwYXRjaCBhcyBhbnkpLm9wfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAvLyByZWNvbmNpbGUgZnJvbSB0aGUgcG9vbCBpZiBwb3NzaWJsZVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KHVuZGVmaW5lZCwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wLCBuZXdWYWx1ZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uLCByZW1vdmluZ1xuICAgICAgICByZW1vdmUodGFyZ2V0LCBwcm9wKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgIC8vIHRyeSB0byByZWNvbmNpbGVcbiAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byB0d2VhayB0aGUgcG9vbCBzaW5jZSByZWNvbmNpbGVTbmFwc2hvdCB3aWxsIGRvIHRoYXQgZm9yIHVzXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3QodGFyZ2V0W3Byb3AhXSwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wLCBuZXdWYWx1ZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiAkeyhwYXRjaCBhcyBhbnkpLm9wfWApXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhdGhBcnJheVRvT2JqZWN0QW5kUHJvcChcbiAgb2JqOiBvYmplY3QsXG4gIHBhdGg6IFBhdGNoW1wicGF0aFwiXVxuKTogeyB0YXJnZXQ6IGFueTsgcHJvcD86IFBhdGhFbGVtZW50IH0ge1xuICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICBpZiAoIWlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0aDogJHtwYXRofWApXG4gICAgfVxuICB9XG5cbiAgbGV0IHRhcmdldDogYW55ID0gbW9kZWxUb0RhdGFOb2RlKG9iailcblxuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0LFxuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IHBhdGgubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgdGFyZ2V0ID0gbW9kZWxUb0RhdGFOb2RlKHRhcmdldFtwYXRoW2ldXSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFyZ2V0LFxuICAgIHByb3A6IHBhdGhbcGF0aC5sZW5ndGggLSAxXSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZGF0YVRvTW9kZWxOb2RlIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB7IGZpbmRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L2ZpbmRQYXJlbnRcIlxuaW1wb3J0IHsgaW50ZXJuYWxBcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IEludGVybmFsUGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaC9lbWl0UGF0Y2hcIlxuaW1wb3J0IHsgaW50ZXJuYWxBcHBseVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2FwcGx5U25hcHNob3RcIlxuaW1wb3J0IHsgaW52YWxpZGF0ZUNhY2hlZFR5cGVDaGVja2VyUmVzdWx0IH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IHJ1bldpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgaXNUeXBlQ2hlY2tpbmdBbGxvd2VkIH0gZnJvbSBcIi4vd2l0aG91dFR5cGVDaGVja2luZ1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShcbiAgb2JqOiBvYmplY3QsXG4gIHBhdGNoUmVjb3JkZXI6IEludGVybmFsUGF0Y2hSZWNvcmRlciB8IHVuZGVmaW5lZCxcbiAgc25hcHNob3RCZWZvcmVDaGFuZ2VzPzogb2JqZWN0XG4pIHtcbiAgaWYgKCFpc1R5cGVDaGVja2luZ0FsbG93ZWQoKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gaW52YWxpZGF0ZSB0eXBlIGNoZWNrIGNhY2hlZCByZXN1bHRcbiAgaW52YWxpZGF0ZUNhY2hlZFR5cGVDaGVja2VyUmVzdWx0KG9iailcblxuICBpZiAoaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkKCkpIHtcbiAgICBjb25zdCBwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlciA9IGZpbmROZWFyZXN0UGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIob2JqKVxuICAgIGlmIChwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlcikge1xuICAgICAgY29uc3QgZXJyID0gcGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIudHlwZUNoZWNrKClcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gcXVpZXRseSBhcHBseSBpbnZlcnNlIHBhdGNoZXMgKGRvIG5vdCBnZW5lcmF0ZSBwYXRjaGVzLCBzbmFwc2hvdHMsIGFjdGlvbnMsIGV0YylcbiAgICAgICAgcnVuV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzKCgpID0+IHtcbiAgICAgICAgICBpZiAocGF0Y2hSZWNvcmRlcikge1xuICAgICAgICAgICAgaW50ZXJuYWxBcHBseVBhdGNoZXMuY2FsbChvYmosIHBhdGNoUmVjb3JkZXIuaW52UGF0Y2hlcywgdHJ1ZSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHNuYXBzaG90QmVmb3JlQ2hhbmdlcykge1xuICAgICAgICAgICAgaW50ZXJuYWxBcHBseVNuYXBzaG90LmNhbGwob2JqLCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIGFwcGx5IHBhdGNoZXMgaXQgd2lsbCBiZSB0eXBlIGNoZWNrZWQgYWdhaW4gYW5kIGl0cyByZXN1bHQgY2FjaGVkIG9uY2UgbW9yZVxuICAgICAgICBlcnIudGhyb3cocGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogRmluZHMgdGhlIGNsb3Nlc3QgcGFyZW50IG1vZGVsIHRoYXQgaGFzIGEgdHlwZSBjaGVja2VyIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGNoaWxkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBmaW5kTmVhcmVzdFBhcmVudE1vZGVsV2l0aFR5cGVDaGVja2VyKGNoaWxkOiBvYmplY3QpOiBBbnlNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIC8vIGNoaWxkIG1pZ2h0IGJlIC4kLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBwYXJlbnQgbW9kZWwgaW4gdGhhdCBjYXNlXG4gIGNvbnN0IGFjdHVhbENoaWxkID0gZGF0YVRvTW9kZWxOb2RlKGNoaWxkKVxuXG4gIGlmIChjaGlsZCAhPT0gYWN0dWFsQ2hpbGQpIHtcbiAgICBjaGlsZCA9IGFjdHVhbENoaWxkXG4gICAgaWYgKGlzTW9kZWwoY2hpbGQpICYmICEhZ2V0TW9kZWxNZXRhZGF0YShjaGlsZCkuZGF0YVR5cGUpIHtcbiAgICAgIHJldHVybiBjaGlsZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kUGFyZW50KGNoaWxkLCAocGFyZW50KSA9PiB7XG4gICAgcmV0dXJuIGlzTW9kZWwocGFyZW50KSAmJiAhIWdldE1vZGVsTWV0YWRhdGEocGFyZW50KS5kYXRhVHlwZVxuICB9KVxufVxuIiwiaW1wb3J0IHtcbiAgaW50ZXJjZXB0LFxuICBJT2JqZWN0RGlkQ2hhbmdlLFxuICBJT2JqZWN0V2lsbENoYW5nZSxcbiAgaXNPYnNlcnZhYmxlT2JqZWN0LFxuICBvYnNlcnZhYmxlLFxuICBvYnNlcnZlLFxuICBzZXQsXG59IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydENhbldyaXRlIH0gZnJvbSBcIi4uL2FjdGlvbi9wcm90ZWN0aW9uXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGRhdGFUb01vZGVsTm9kZSB9IGZyb20gXCIuLi9wYXJlbnQvY29yZVwiXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxuaW1wb3J0IHsgSW50ZXJuYWxQYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoL2VtaXRQYXRjaFwiXG5pbXBvcnQge1xuICBmcmVlemVJbnRlcm5hbFNuYXBzaG90LFxuICBnZXRJbnRlcm5hbFNuYXBzaG90LFxuICBzZXROZXdJbnRlcm5hbFNuYXBzaG90LFxuICBTbmFwc2hvdFRyYW5zZm9ybUZuLFxuICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90LFxufSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNQbGFpbk9iamVjdCwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcywgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyVHdlYWtlciwgdHJ5VW50d2VhaywgdHdlYWsgfSBmcm9tIFwiLi90d2Vha1wiXG5pbXBvcnQgeyBUd2Vha2VyUHJpb3JpdHkgfSBmcm9tIFwiLi9Ud2Vha2VyUHJpb3JpdHlcIlxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi90eXBlQ2hlY2tpbmdcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHdlYWtQbGFpbk9iamVjdDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIHZhbHVlOiBULFxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQsXG4gIHNuYXBzaG90TW9kZWxUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRvTm90VHdlYWtDaGlsZHJlbjogYm9vbGVhbixcbiAgaXNEYXRhT2JqZWN0OiBib29sZWFuXG4pOiBUIHtcbiAgY29uc3Qgb3JpZ2luYWxPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB2YWx1ZVxuICBjb25zdCB0d2Vha2VkT2JqID0gaXNPYnNlcnZhYmxlT2JqZWN0KG9yaWdpbmFsT2JqKVxuICAgID8gb3JpZ2luYWxPYmpcbiAgICA6IG9ic2VydmFibGUub2JqZWN0KHt9LCB1bmRlZmluZWQsIG9ic2VydmFibGVPcHRpb25zKVxuXG4gIGxldCBpbnRlcmNlcHREaXNwb3NlcjogKCkgPT4gdm9pZFxuICBsZXQgb2JzZXJ2ZURpc3Bvc2VyOiAoKSA9PiB2b2lkXG5cbiAgY29uc3QgdW50d2VhayA9ICgpID0+IHtcbiAgICBpbnRlcmNlcHREaXNwb3NlcigpXG4gICAgb2JzZXJ2ZURpc3Bvc2VyKClcbiAgfVxuXG4gIHR3ZWFrZWRPYmplY3RzLnNldCh0d2Vha2VkT2JqLCB1bnR3ZWFrKVxuICBzZXRQYXJlbnQoe1xuICAgIHZhbHVlOiB0d2Vha2VkT2JqLFxuICAgIHBhcmVudFBhdGgsXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICBpc0RhdGFPYmplY3QsXG4gICAgLy8gYW4gb2JqZWN0IHNob3VsZG4ndCBiZSBjbG9uZWRcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXG4gIH0pXG5cbiAgbGV0IHVudHJhbnNmb3JtZWRTbjogYW55ID0ge31cblxuICAvLyBzdWJzdGl0dXRlIGluaXRpYWwgdmFsdWVzIGJ5IHR3ZWFrZWQgdmFsdWVzXG4gIGNvbnN0IG9yaWdpbmFsT2JqS2V5cyA9IE9iamVjdC5rZXlzKG9yaWdpbmFsT2JqKVxuICBjb25zdCBvcmlnaW5hbE9iaktleXNMZW4gPSBvcmlnaW5hbE9iaktleXMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZ2luYWxPYmpLZXlzTGVuOyBpKyspIHtcbiAgICBjb25zdCBrID0gb3JpZ2luYWxPYmpLZXlzW2ldXG4gICAgY29uc3QgdiA9IG9yaWdpbmFsT2JqW2tdXG5cbiAgICBpZiAoaXNQcmltaXRpdmUodikpIHtcbiAgICAgIGlmICghZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XG4gICAgICAgIHNldCh0d2Vha2VkT2JqLCBrLCB2KVxuICAgICAgfVxuICAgICAgdW50cmFuc2Zvcm1lZFNuW2tdID0gdlxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXRoID0geyBwYXJlbnQ6IHR3ZWFrZWRPYmosIHBhdGg6IGsgfVxuXG4gICAgICBsZXQgdHdlYWtlZFZhbHVlXG4gICAgICBpZiAoZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XG4gICAgICAgIHR3ZWFrZWRWYWx1ZSA9IHZcbiAgICAgICAgc2V0UGFyZW50KHtcbiAgICAgICAgICB2YWx1ZTogdHdlYWtlZFZhbHVlLFxuICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxuICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGEgbmV3IHZhbHVlICh0aGUgcmVzdWx0IG9mIGEgZnJvbVNuYXBzaG90KVxuICAgICAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR3ZWFrZWRWYWx1ZSA9IHR3ZWFrKHYsIHBhdGgpXG4gICAgICAgIHNldCh0d2Vha2VkT2JqLCBrLCB0d2Vha2VkVmFsdWUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHR3ZWFrZWRWYWx1ZSkhXG4gICAgICB1bnRyYW5zZm9ybWVkU25ba10gPSB2YWx1ZVNuLnRyYW5zZm9ybWVkXG4gICAgfVxuICB9XG5cbiAgbGV0IHRyYW5zZm9ybUZuOiBTbmFwc2hvdFRyYW5zZm9ybUZuIHwgdW5kZWZpbmVkXG4gIGlmIChzbmFwc2hvdE1vZGVsVHlwZSkge1xuICAgIHVudHJhbnNmb3JtZWRTblttb2RlbFR5cGVLZXldID0gc25hcHNob3RNb2RlbFR5cGVcblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUoc25hcHNob3RNb2RlbFR5cGUpXG4gICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYG1vZGVsIHdpdGggbmFtZSBcIiR7c25hcHNob3RNb2RlbFR5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxUcmFuc2Zvcm1GbiA9IChtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgICBpZiAob3JpZ2luYWxUcmFuc2Zvcm1Gbikge1xuICAgICAgdHJhbnNmb3JtRm4gPSAoc24pID0+IG9yaWdpbmFsVHJhbnNmb3JtRm4oc24sIGRhdGFUb01vZGVsTm9kZSh0d2Vha2VkT2JqKSlcbiAgICB9XG4gIH1cblxuICBzZXROZXdJbnRlcm5hbFNuYXBzaG90KFxuICAgIGlzRGF0YU9iamVjdCA/IGRhdGFUb01vZGVsTm9kZSh0d2Vha2VkT2JqKSA6IHR3ZWFrZWRPYmosXG4gICAgdW50cmFuc2Zvcm1lZFNuLFxuICAgIHRyYW5zZm9ybUZuXG4gIClcblxuICBpbnRlcmNlcHREaXNwb3NlciA9IGludGVyY2VwdCh0d2Vha2VkT2JqLCBpbnRlcmNlcHRPYmplY3RNdXRhdGlvbilcbiAgb2JzZXJ2ZURpc3Bvc2VyID0gb2JzZXJ2ZSh0d2Vha2VkT2JqLCBvYmplY3REaWRDaGFuZ2UpXG5cbiAgcmV0dXJuIHR3ZWFrZWRPYmogYXMgYW55XG59XG5cbmNvbnN0IG9ic2VydmFibGVPcHRpb25zID0ge1xuICBkZWVwOiBmYWxzZSxcbn1cblxuZnVuY3Rpb24gb2JqZWN0RGlkQ2hhbmdlKGNoYW5nZTogSU9iamVjdERpZENoYW5nZSk6IHZvaWQge1xuICBjb25zdCBvYmogPSBjaGFuZ2Uub2JqZWN0XG4gIGNvbnN0IGFjdHVhbE5vZGUgPSBkYXRhVG9Nb2RlbE5vZGUob2JqKVxuICBsZXQgeyB1bnRyYW5zZm9ybWVkOiBvbGRVbnRyYW5zZm9ybWVkU24gfSA9IGdldEludGVybmFsU25hcHNob3QoYWN0dWFsTm9kZSkhXG5cbiAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IG5ldyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIoKVxuXG4gIGxldCBtdXRhdGU6ICgoc246IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgY2FzZSBcImFkZFwiOlxuICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgayA9IGNoYW5nZS5uYW1lXG4gICAgICAgIGNvbnN0IHZhbCA9IGNoYW5nZS5uZXdWYWx1ZVxuXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFVudHJhbnNmb3JtZWRTbltrXVxuXG4gICAgICAgIGxldCBuZXdWYWw6IGFueVxuICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xuICAgICAgICAgIG5ld1ZhbCA9IHZhbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbCkhXG4gICAgICAgICAgbmV3VmFsID0gdmFsdWVTbi50cmFuc2Zvcm1lZFxuICAgICAgICB9XG5cbiAgICAgICAgbXV0YXRlID0gKHNuKSA9PiB7XG4gICAgICAgICAgc25ba10gPSBuZXdWYWxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBbayBhcyBzdHJpbmddXG4gICAgICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gXCJhZGRcIikge1xuICAgICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3QobmV3VmFsKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJyZW1vdmVcIjpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgayA9IGNoYW5nZS5uYW1lXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFVudHJhbnNmb3JtZWRTbltrXVxuICAgICAgICBtdXRhdGUgPSAoc24pID0+IHtcbiAgICAgICAgICBkZWxldGUgc25ba11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBbayBhcyBzdHJpbmddXG5cbiAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGJyZWFrXG4gIH1cblxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShvYmosIHBhdGNoUmVjb3JkZXIpXG5cbiAgaWYgKCFydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzICYmIG11dGF0ZSEpIHtcbiAgICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90KGFjdHVhbE5vZGUsIG11dGF0ZSlcbiAgICBwYXRjaFJlY29yZGVyLmVtaXQoYWN0dWFsTm9kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnRlcmNlcHRPYmplY3RNdXRhdGlvbihjaGFuZ2U6IElPYmplY3RXaWxsQ2hhbmdlKSB7XG4gIGFzc2VydENhbldyaXRlKClcblxuICBpZiAodHlwZW9mIGNoYW5nZS5uYW1lID09PSBcInN5bWJvbFwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcInN5bWJvbCBwcm9wZXJ0aWVzIGFyZSBub3Qgc3VwcG9ydGVkXCIpXG4gIH1cblxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgY2FzZSBcImFkZFwiOlxuICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHdlYWsoY2hhbmdlLm5ld1ZhbHVlLCB7XG4gICAgICAgIHBhcmVudDogY2hhbmdlLm9iamVjdCxcbiAgICAgICAgcGF0aDogXCJcIiArIGNoYW5nZS5uYW1lLFxuICAgICAgfSlcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IGNoYW5nZS5vYmplY3RbY2hhbmdlLm5hbWVdXG4gICAgICB0d2VhayhvbGRWYWwsIHVuZGVmaW5lZClcbiAgICAgIHRyeVVudHdlYWsob2xkVmFsKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IGNoYW5nZS5vYmplY3RbY2hhbmdlLm5hbWVdXG4gICAgICB0d2VhayhvbGRWYWwsIHVuZGVmaW5lZClcbiAgICAgIHRyeVVudHdlYWsob2xkVmFsKVxuXG4gICAgICBjaGFuZ2UubmV3VmFsdWUgPSB0d2VhayhjaGFuZ2UubmV3VmFsdWUsIHtcbiAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxuICAgICAgICBwYXRoOiBcIlwiICsgY2hhbmdlLm5hbWUsXG4gICAgICB9KVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBsYWluT2JqZWN0VHdlYWtlcigpIHtcbiAgcmVnaXN0ZXJUd2Vha2VyKFR3ZWFrZXJQcmlvcml0eS5QbGFpbk9iamVjdCwgKHZhbHVlLCBwYXJlbnRQYXRoKSA9PiB7XG4gICAgLy8gcGxhaW4gb2JqZWN0XG4gICAgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0d2Vha1BsYWluT2JqZWN0KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sIHBhcmVudFBhdGgsIHVuZGVmaW5lZCwgZmFsc2UsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3RlckFycmF5VHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrQXJyYXlcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm96ZW5Ud2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtGcm96ZW5cIlxuaW1wb3J0IHsgcmVnaXN0ZXJNb2RlbFR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha01vZGVsXCJcbmltcG9ydCB7IHJlZ2lzdGVyUGxhaW5PYmplY3RUd2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtQbGFpbk9iamVjdFwiXG5cbmxldCBkZWZhdWx0VHdlYWtlcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdFR3ZWFrZXJzKCkge1xuICBpZiAoZGVmYXVsdFR3ZWFrZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRUd2Vha2Vyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgcmVnaXN0ZXJBcnJheVR3ZWFrZXIoKVxuICByZWdpc3RlckZyb3plblR3ZWFrZXIoKVxuICByZWdpc3Rlck1vZGVsVHdlYWtlcigpXG4gIHJlZ2lzdGVyUGxhaW5PYmplY3RUd2Vha2VyKClcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgeyBnZXRPYmplY3RDaGlsZHJlbiB9IGZyb20gXCIuLi9wYXJlbnQvY29yZU9iamVjdENoaWxkcmVuXCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnQsIFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxuaW1wb3J0IHsgdW5zZXRJbnRlcm5hbFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2ludGVybmFsXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4uL3R5cGVzL3NjaGVtYXNcIlxuaW1wb3J0IHsgdHlwZUNoZWNrIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVDaGVja1wiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzTWFwLCBpc09iamVjdCwgaXNQcmltaXRpdmUsIGlzU2V0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGlzVHdlYWtlZE9iamVjdCwgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFR3ZWFrZXJzIH0gZnJvbSBcIi4vcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnNcIlxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCAoYXJyYXksIHBsYWluIG9iamVjdCkgaW50byBhIHRyZWUgbm9kZSxcbiAqIHdoaWNoIHRoZW4gY2FuIGFjY2VwdCBjYWxscyB0byBgZ2V0UGFyZW50YCwgYGdldFNuYXBzaG90YCwgZXRjLlxuICogSWYgYSB0cmVlIG5vZGUgaXMgcGFzc2VkIGl0IHdpbGwgcmV0dXJuIHRoZSBwYXNzZWQgYXJndW1lbnQgZGlyZWN0bHkuXG4gKiBBZGRpdGlvbmFsbHkgdGhpcyBtZXRob2Qgd2lsbCB1c2UgdGhlIHR5cGUgcGFzc2VkIHRvIGNoZWNrIHRoZSB2YWx1ZVxuICogY29uZm9ybXMgdG8gdGhlIHR5cGUgd2hlbiBtb2RlbCBhdXRvIHR5cGUgY2hlY2tpbmcgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUeXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRvIHR1cm4gaW50byBhIHRyZWUgbm9kZS5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3QgYXMgYSB0cmVlIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1RyZWVOb2RlPFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlLCBWIGV4dGVuZHMgVHlwZVRvRGF0YTxUVHlwZT4+KFxuICB0eXBlOiBUVHlwZSxcbiAgdmFsdWU6IFZcbik6IFZcblxuLyoqXG4gKiBUdXJucyBhbiBvYmplY3QgKGFycmF5LCBwbGFpbiBvYmplY3QpIGludG8gYSB0cmVlIG5vZGUsXG4gKiB3aGljaCB0aGVuIGNhbiBhY2NlcHQgY2FsbHMgdG8gYGdldFBhcmVudGAsIGBnZXRTbmFwc2hvdGAsIGV0Yy5cbiAqIElmIGEgdHJlZSBub2RlIGlzIHBhc3NlZCBpdCB3aWxsIHJldHVybiB0aGUgcGFzc2VkIGFyZ3VtZW50IGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gdHVybiBpbnRvIGEgdHJlZSBub2RlLlxuICogQHJldHVybnMgVGhlIG9iamVjdCBhcyBhIHRyZWUgbm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVHJlZU5vZGU8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IFQpOiBUXG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiB0b1RyZWVOb2RlKGFyZzE6IGFueSwgYXJnMj86IGFueSk6IGFueSB7XG4gIGxldCB2YWx1ZTogb2JqZWN0LCB0eXBlOiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWRcbiAgbGV0IGhhc1R5cGVcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBoYXNUeXBlID0gZmFsc2VcbiAgICB2YWx1ZSA9IGFyZzFcbiAgfSBlbHNlIHtcbiAgICB0eXBlID0gYXJnMVxuICAgIGhhc1R5cGUgPSB0cnVlXG4gICAgdmFsdWUgPSBhcmcyXG4gIH1cblxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJvbmx5IG9iamVjdHMgY2FuIGJlIHR1cm5lZCBpbnRvIHRyZWUgbm9kZXNcIilcbiAgfVxuXG4gIGlmIChoYXNUeXBlICYmIGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCgpKSB7XG4gICAgY29uc3QgZXJyb3JzID0gdHlwZUNoZWNrKHR5cGUsIHZhbHVlKVxuICAgIGlmIChlcnJvcnMpIHtcbiAgICAgIGVycm9ycy50aHJvdyh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgdHJ1ZSkpIHtcbiAgICByZXR1cm4gdHdlYWsodmFsdWUsIHVuZGVmaW5lZClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgVHdlYWtlcjxUPiA9ICh2YWx1ZTogVCwgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkKSA9PiBUIHwgdW5kZWZpbmVkXG5cbmNvbnN0IHR3ZWFrZXJzOiB7IHByaW9yaXR5OiBudW1iZXI7IHR3ZWFrZXI6IFR3ZWFrZXI8YW55PiB9W10gPSBbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUd2Vha2VyPFQ+KHByaW9yaXR5OiBudW1iZXIsIHR3ZWFrZXI6IFR3ZWFrZXI8VD4pOiB2b2lkIHtcbiAgdHdlYWtlcnMucHVzaCh7IHByaW9yaXR5LCB0d2Vha2VyIH0pXG4gIHR3ZWFrZXJzLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbFR3ZWFrPFQ+KHZhbHVlOiBULCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQpOiBUIHtcbiAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gYWxyZWFkeSB0d2Vha2VkXG4gIGlmIChpc1R3ZWFrZWRPYmplY3QodmFsdWUsIHRydWUpKSB7XG4gICAgdmFsdWUgPSBzZXRQYXJlbnQoe1xuICAgICAgdmFsdWUsXG4gICAgICBwYXJlbnRQYXRoLFxuICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgICBjbG9uZUlmQXBwbGljYWJsZTogdHJ1ZSxcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gdW5zdXBwb3J0ZWQgKG11c3QgZ28gYmVmb3JlIHBsYWluIG9iamVjdCB0d2Vha2VyKVxuICBpZiAoaXNEYXRhTW9kZWwodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcbiAgICAgIFwiZGF0YSBtb2RlbHMgYXJlIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQuIHlvdSBtYXkgaW5zZXJ0IHRoZSBkYXRhIGluIHRoZSB0cmVlIGluc3RlYWQgKCckJyBwcm9wZXJ0eSkuXCJcbiAgICApXG4gIH1cblxuICByZWdpc3RlckRlZmF1bHRUd2Vha2VycygpXG5cbiAgY29uc3QgdHdlYWtlcnNMZW4gPSB0d2Vha2Vycy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0d2Vha2Vyc0xlbjsgaSsrKSB7XG4gICAgY29uc3QgeyB0d2Vha2VyIH0gPSB0d2Vha2Vyc1tpXVxuICAgIGNvbnN0IHR3ZWFrZWRWYWwgPSB0d2Vha2VyKHZhbHVlLCBwYXJlbnRQYXRoKVxuICAgIGlmICh0d2Vha2VkVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0d2Vha2VkVmFsXG4gICAgfVxuICB9XG5cbiAgLy8gdW5zdXBwb3J0ZWRcbiAgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJtYXBzIGFyZSBub3QgZGlyZWN0bHkgc3VwcG9ydGVkLiBjb25zaWRlciB1c2luZyAnT2JqZWN0TWFwJyAvICdhc01hcCcgaW5zdGVhZC5cIilcbiAgfVxuXG4gIC8vIHVuc3VwcG9ydGVkXG4gIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwic2V0cyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZC4gY29uc2lkZXIgdXNpbmcgJ0FycmF5U2V0JyAvICdhc1NldCcgaW5zdGVhZC5cIilcbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoXG4gICAgYHR3ZWFrIGNhbiBvbmx5IHdvcmsgb3ZlciBtb2RlbHMsIG9ic2VydmFibGUgb2JqZWN0cy9hcnJheXMsIG9yIHByaW1pdGl2ZXMsIGJ1dCBnb3QgJHt2YWx1ZX0gaW5zdGVhZGBcbiAgKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgdHdlYWsgPSBhY3Rpb24oXCJ0d2Vha1wiLCBpbnRlcm5hbFR3ZWFrKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW50d2Vhayh2YWx1ZTogYW55KSB7XG4gIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgaWYgKGZhc3RHZXRQYXJlbnQodmFsdWUpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYXNzZXJ0aW9uIGZhaWxlZDogb2JqZWN0IGNhbm5vdCBiZSB1bnR3ZWFrZWQgd2hpbGUgaXQgaGFzIGEgcGFyZW50XCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdW50d2Vha2VyID0gdHdlYWtlZE9iamVjdHMuZ2V0KHZhbHVlKVxuICBpZiAoIXVudHdlYWtlcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgaGF2ZSB0byBtYWtlIGEgY29weSBzaW5jZSBpdCB3aWxsIGJlIGNoYW5nZWRcbiAgLy8gd2UgaGF2ZSB0byBpdGVyYXRlIG91cnNlbHZlcyBzaW5jZSBpdCBzZWVtcyBsaWtlIGJhYmVsIGRvZXMgbm90IGRvIGRvd25sZXZlbCBpdGVyYXRpb25cbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBjb25zdCBjaGlsZHJlbkl0ZXIgPSBnZXRPYmplY3RDaGlsZHJlbih2YWx1ZSkhLnZhbHVlcygpXG4gIGxldCBjaGlsZHJlbkN1ciA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgd2hpbGUgKCFjaGlsZHJlbkN1ci5kb25lKSB7XG4gICAgY2hpbGRyZW4ucHVzaChjaGlsZHJlbkN1ci52YWx1ZSlcbiAgICBjaGlsZHJlbkN1ciA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBzZXRQYXJlbnQoe1xuICAgICAgdmFsdWU6IGNoaWxkcmVuW2ldLFxuICAgICAgcGFyZW50UGF0aDogdW5kZWZpbmVkLFxuICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgICAvLyBubyBuZWVkIHRvIGNsb25lIGlmIHVuc2V0dGluZyB0aGUgcGFyZW50XG4gICAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXG4gICAgfSlcbiAgfVxuXG4gIHVudHdlYWtlcigpXG5cbiAgdHdlYWtlZE9iamVjdHMuZGVsZXRlKHZhbHVlKVxuICB1bnNldEludGVybmFsU25hcHNob3QodmFsdWUpXG4gIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQge1xyXG4gIElBcnJheVdpbGxDaGFuZ2UsXHJcbiAgSUFycmF5V2lsbFNwbGljZSxcclxuICBpbnRlcmNlcHQsXHJcbiAgSU9ic2VydmFibGVBcnJheSxcclxuICBpc09ic2VydmFibGVBcnJheSxcclxuICBvYnNlcnZhYmxlLFxyXG4gIG9ic2VydmUsXHJcbiAgc2V0LFxyXG59IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHsgYXNzZXJ0Q2FuV3JpdGUgfSBmcm9tIFwiLi4vYWN0aW9uL3Byb3RlY3Rpb25cIlxyXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnXCJcclxuaW1wb3J0IHR5cGUgeyBQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcclxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxyXG5pbXBvcnQgeyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIgfSBmcm9tIFwiLi4vcGF0Y2gvZW1pdFBhdGNoXCJcclxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuLi9wYXRjaC9QYXRjaFwiXHJcbmltcG9ydCB7XHJcbiAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdCxcclxuICBnZXRJbnRlcm5hbFNuYXBzaG90LFxyXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QsXHJcbiAgdXBkYXRlSW50ZXJuYWxTbmFwc2hvdCxcclxufSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxyXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzQXJyYXksIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHsgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcywgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcclxuaW1wb3J0IHsgcmVnaXN0ZXJUd2Vha2VyLCB0cnlVbnR3ZWFrLCB0d2VhayB9IGZyb20gXCIuL3R3ZWFrXCJcclxuaW1wb3J0IHsgVHdlYWtlclByaW9yaXR5IH0gZnJvbSBcIi4vVHdlYWtlclByaW9yaXR5XCJcclxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi90eXBlQ2hlY2tpbmdcIlxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWFrQXJyYXk8VCBleHRlbmRzIGFueVtdPihcclxuICB2YWx1ZTogVCxcclxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQsXHJcbiAgZG9Ob3RUd2Vha0NoaWxkcmVuOiBib29sZWFuXHJcbik6IFQge1xyXG4gIGNvbnN0IG9yaWdpbmFsQXJyOiBSZWFkb25seUFycmF5PGFueT4gPSB2YWx1ZVxyXG4gIGNvbnN0IGFyckxuID0gb3JpZ2luYWxBcnIubGVuZ3RoXHJcbiAgY29uc3QgdHdlYWtlZEFyciA9IGlzT2JzZXJ2YWJsZUFycmF5KG9yaWdpbmFsQXJyKVxyXG4gICAgPyBvcmlnaW5hbEFyclxyXG4gICAgOiBvYnNlcnZhYmxlLmFycmF5KFtdLCBvYnNlcnZhYmxlT3B0aW9ucylcclxuICBpZiAodHdlYWtlZEFyciAhPT0gb3JpZ2luYWxBcnIpIHtcclxuICAgIHR3ZWFrZWRBcnIubGVuZ3RoID0gb3JpZ2luYWxBcnIubGVuZ3RoXHJcbiAgfVxyXG5cclxuICBsZXQgaW50ZXJjZXB0RGlzcG9zZXI6ICgpID0+IHZvaWRcclxuICBsZXQgb2JzZXJ2ZURpc3Bvc2VyOiAoKSA9PiB2b2lkXHJcblxyXG4gIGNvbnN0IHVudHdlYWsgPSAoKSA9PiB7XHJcbiAgICBpbnRlcmNlcHREaXNwb3NlcigpXHJcbiAgICBvYnNlcnZlRGlzcG9zZXIoKVxyXG4gIH1cclxuXHJcbiAgdHdlYWtlZE9iamVjdHMuc2V0KHR3ZWFrZWRBcnIsIHVudHdlYWspXHJcbiAgc2V0UGFyZW50KHtcclxuICAgIHZhbHVlOiB0d2Vha2VkQXJyLFxyXG4gICAgcGFyZW50UGF0aCxcclxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXHJcbiAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxyXG4gICAgLy8gYXJyYXlzIHNob3VsZG4ndCBiZSBjbG9uZWQgYW55d2F5XHJcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgdW50cmFuc2Zvcm1lZFNuOiBhbnlbXSA9IFtdXHJcbiAgdW50cmFuc2Zvcm1lZFNuLmxlbmd0aCA9IGFyckxuXHJcblxyXG4gIC8vIHN1YnN0aXR1dGUgaW5pdGlhbCB2YWx1ZXMgYnkgcHJveGllZCB2YWx1ZXNcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyckxuOyBpKyspIHtcclxuICAgIGNvbnN0IHYgPSBvcmlnaW5hbEFycltpXVxyXG5cclxuICAgIGlmIChpc1ByaW1pdGl2ZSh2KSkge1xyXG4gICAgICBpZiAoIWRvTm90VHdlYWtDaGlsZHJlbikge1xyXG4gICAgICAgIHNldCh0d2Vha2VkQXJyLCBpLCB2KVxyXG4gICAgICB9XHJcblxyXG4gICAgICB1bnRyYW5zZm9ybWVkU25baV0gPSB2XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwYXRoID0geyBwYXJlbnQ6IHR3ZWFrZWRBcnIsIHBhdGg6IGkgfVxyXG5cclxuICAgICAgbGV0IHR3ZWFrZWRWYWx1ZVxyXG4gICAgICBpZiAoZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XHJcbiAgICAgICAgdHdlYWtlZFZhbHVlID0gdlxyXG4gICAgICAgIHNldFBhcmVudCh7XHJcbiAgICAgICAgICB2YWx1ZTogdHdlYWtlZFZhbHVlLFxyXG4gICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcclxuICAgICAgICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gdGhlIHZhbHVlIGlzIGFscmVhZHkgYSBuZXcgdmFsdWUgKHRoZSByZXN1bHQgb2YgYSBmcm9tU25hcHNob3QpXHJcbiAgICAgICAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0d2Vha2VkVmFsdWUgPSB0d2Vhayh2LCBwYXRoKVxyXG4gICAgICAgIHNldCh0d2Vha2VkQXJyLCBpLCB0d2Vha2VkVmFsdWUpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHR3ZWFrZWRWYWx1ZSkhXHJcbiAgICAgIHVudHJhbnNmb3JtZWRTbltpXSA9IHZhbHVlU24udHJhbnNmb3JtZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QodHdlYWtlZEFyciwgdW50cmFuc2Zvcm1lZFNuLCB1bmRlZmluZWQpXHJcblxyXG4gIGludGVyY2VwdERpc3Bvc2VyID0gaW50ZXJjZXB0KHR3ZWFrZWRBcnIsIGludGVyY2VwdEFycmF5TXV0YXRpb24uYmluZCh1bmRlZmluZWQsIHR3ZWFrZWRBcnIpKVxyXG4gIG9ic2VydmVEaXNwb3NlciA9IG9ic2VydmUodHdlYWtlZEFyciwgYXJyYXlEaWRDaGFuZ2UpXHJcblxyXG4gIHJldHVybiB0d2Vha2VkQXJyIGFzIGFueVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheURpZENoYW5nZShjaGFuZ2U6IGFueSAvKklBcnJheURpZENoYW5nZSovKSB7XHJcbiAgY29uc3QgYXJyID0gY2hhbmdlLm9iamVjdFxyXG4gIGxldCB7IHVudHJhbnNmb3JtZWQ6IG9sZFNuYXBzaG90IH0gPSBnZXRJbnRlcm5hbFNuYXBzaG90KGFyciBhcyBBcnJheTxhbnk+KSFcclxuXHJcbiAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IG5ldyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIoKVxyXG5cclxuICBsZXQgbXV0YXRlOiAoKHNuOiBhbnlbXSkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xyXG4gICAgY2FzZSBcInNwbGljZVwiOlxyXG4gICAgICB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGFuZ2UuaW5kZXhcclxuICAgICAgICBjb25zdCBhZGRlZENvdW50ID0gY2hhbmdlLmFkZGVkQ291bnRcclxuICAgICAgICBjb25zdCByZW1vdmVkQ291bnQgPSBjaGFuZ2UucmVtb3ZlZENvdW50XHJcblxyXG4gICAgICAgIGxldCBhZGRlZEl0ZW1zOiBhbnlbXSA9IFtdXHJcbiAgICAgICAgYWRkZWRJdGVtcy5sZW5ndGggPSBhZGRlZENvdW50XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRlZENvdW50OyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHYgPSBjaGFuZ2UuYWRkZWRbaV1cclxuICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2KSkge1xyXG4gICAgICAgICAgICBhZGRlZEl0ZW1zW2ldID0gdlxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYWRkZWRJdGVtc1tpXSA9IGdldEludGVybmFsU25hcHNob3QodikhLnRyYW5zZm9ybWVkXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbGRMZW4gPSBvbGRTbmFwc2hvdC5sZW5ndGhcclxuICAgICAgICBtdXRhdGUgPSAobmV3U25hcHNob3QpID0+IHtcclxuICAgICAgICAgIG5ld1NuYXBzaG90LnNwbGljZShpbmRleCwgcmVtb3ZlZENvdW50LCAuLi5hZGRlZEl0ZW1zKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICAgICAgY29uc3QgaW52UGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcblxyXG4gICAgICAgIC8vIG9wdGltaXphdGlvbjogaWYgd2UgYWRkIGFzIG1hbnkgYXMgd2UgcmVtb3ZlIHRoZW4gcmVtb3ZlL3JlYWRkIGluc3RlYWRcclxuXHJcbiAgICAgICAgLy8gd2UgY2Fubm90IHJlcGxhY2Ugc2luY2Ugd2UgbWlnaHQgZW5kIHVwIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBzYW1lIG5vZGVcclxuICAgICAgICAvLyBtaWdodCBhdHRlbXB0IHRvIGJlIHRlbXBvcmFyaWx5IHR3aWNlIGluc2lkZSB0aGUgc2FtZSB0cmVlIChlLmcuIHNvcnRpbmcpXHJcblxyXG4gICAgICAgIC8vIGl0IHdvdWxkIGJlIGZhc3RlciB0byBrZWVwIGhvbGVzIHJhdGhlciB0aGFuIHJlbW92ZS9yZWFkZCwgYnV0IGlmIHdlIGRvIHRoYXQgdGhlblxyXG4gICAgICAgIC8vIHZhbGlkYXRpb24gbWlnaHQgZmFpbFxyXG5cclxuICAgICAgICBpZiAoYWRkZWRDb3VudCA9PT0gcmVtb3ZlZENvdW50KSB7XHJcbiAgICAgICAgICBjb25zdCByZWFkZFBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gICAgICAgICAgY29uc3QgcmVhZGRJbnZQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgICAgICAgIGxldCByZW1vdmVkID0gMFxyXG5cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkZWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYWxJbmRleCA9IGluZGV4ICsgaVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gZ2V0VmFsdWVBZnRlclNwbGljZShcclxuICAgICAgICAgICAgICBvbGRTbmFwc2hvdCxcclxuICAgICAgICAgICAgICByZWFsSW5kZXgsXHJcbiAgICAgICAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgICAgICAgcmVtb3ZlZENvdW50LFxyXG4gICAgICAgICAgICAgIGFkZGVkSXRlbXNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBjb25zdCBvbGRWYWwgPSBvbGRTbmFwc2hvdFtyZWFsSW5kZXhdXHJcblxyXG4gICAgICAgICAgICBpZiAobmV3VmFsICE9PSBvbGRWYWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCByZW1vdmVQYXRoID0gW3JlYWxJbmRleCAtIHJlbW92ZWRdXHJcbiAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogcmVtb3ZlUGF0aCxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IHJlbW92ZVBhdGgsXHJcbiAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgcmVtb3ZlZCsrXHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHJlYWRkUGF0aCA9IFtyZWFsSW5kZXhdXHJcbiAgICAgICAgICAgICAgcmVhZGRQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiByZWFkZFBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxyXG4gICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgIHJlYWRkSW52UGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogcmVhZGRQYXRoLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3Qob2xkVmFsKSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLnJlYWRkUGF0Y2hlcylcclxuICAgICAgICAgIGludlBhdGNoZXMucHVzaCguLi5yZWFkZEludlBhdGNoZXMpXHJcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJldmVyc2Ugc2luY2UgaW52ZXJzZSBwYXRjaGVzIGFyZSBhcHBsaWVkIGluIHJldmVyc2VcclxuICAgICAgICAgIGludlBhdGNoZXMucmV2ZXJzZSgpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGludGVyaW1MZW4gPSBvbGRMZW4gLSByZW1vdmVkQ291bnRcclxuXHJcbiAgICAgICAgICAvLyBmaXJzdCByZW1vdmUgaXRlbXNcclxuICAgICAgICAgIGlmIChyZW1vdmVkQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwgd2hlbiByZW1vdmluZyBmcm9tIHRoZSBlbmQgc2V0IHRoZSBsZW5ndGggaW5zdGVhZFxyXG4gICAgICAgICAgICBjb25zdCByZW1vdmVVc2luZ1NldExlbmd0aCA9IGluZGV4ID49IGludGVyaW1MZW5cclxuICAgICAgICAgICAgaWYgKHJlbW92ZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IFtcImxlbmd0aFwiXSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBpbnRlcmltTGVuLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSByZW1vdmVkQ291bnQgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxJbmRleCA9IGluZGV4ICsgaVxyXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBbcmVhbEluZGV4XVxyXG5cclxuICAgICAgICAgICAgICBpZiAoIXJlbW92ZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgLi4uMiwgMSwgMFxyXG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gYWRkIDAsIDEsIDIuLi4gc2luY2UgaW52ZXJzZSBwYXRjaGVzIGFyZSBhcHBsaWVkIGluIHJldmVyc2VcclxuICAgICAgICAgICAgICBpbnZQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3Qob2xkU25hcHNob3RbcmVhbEluZGV4XSksXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoZW4gYWRkIGl0ZW1zXHJcbiAgICAgICAgICBpZiAoYWRkZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBmb3IgaW52ZXJzZSBwYXRjaGVzLCB3aGVuIGFkZGluZyBmcm9tIHRoZSBlbmQgc2V0IHRoZSBsZW5ndGggdG8gcmVzdG9yZSBpbnN0ZWFkXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3RvcmVVc2luZ1NldExlbmd0aCA9IGluZGV4ID49IGludGVyaW1MZW5cclxuICAgICAgICAgICAgaWYgKHJlc3RvcmVVc2luZ1NldExlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBbXCJsZW5ndGhcIl0sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW50ZXJpbUxlbixcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGVkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxJbmRleCA9IGluZGV4ICsgaVxyXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBbcmVhbEluZGV4XVxyXG5cclxuICAgICAgICAgICAgICAvLyBhZGQgMCwgMSwgMi4uLlxyXG4gICAgICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChcclxuICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVBZnRlclNwbGljZShvbGRTbmFwc2hvdCwgcmVhbEluZGV4LCBpbmRleCwgcmVtb3ZlZENvdW50LCBhZGRlZEl0ZW1zKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAvLyByZW1vdmUgLi4uMiwgMSwgMCBzaW5jZSBpbnZlcnNlIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZVxyXG4gICAgICAgICAgICAgIGlmICghcmVzdG9yZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpbnZQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXRjaFJlY29yZGVyLnJlY29yZChwYXRjaGVzLCBpbnZQYXRjaGVzKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcblxyXG4gICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICB7XHJcbiAgICAgICAgY29uc3QgayA9IGNoYW5nZS5pbmRleFxyXG4gICAgICAgIGNvbnN0IHZhbCA9IGNoYW5nZS5uZXdWYWx1ZVxyXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFNuYXBzaG90W2tdXHJcbiAgICAgICAgbGV0IG5ld1ZhbDogYW55XHJcbiAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcclxuICAgICAgICAgIG5ld1ZhbCA9IHZhbFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZVNuID0gZ2V0SW50ZXJuYWxTbmFwc2hvdCh2YWwpIVxyXG4gICAgICAgICAgbmV3VmFsID0gdmFsdWVTbi50cmFuc2Zvcm1lZFxyXG4gICAgICAgIH1cclxuICAgICAgICBtdXRhdGUgPSAobmV3U25hcHNob3QpID0+IHtcclxuICAgICAgICAgIG5ld1NuYXBzaG90W2tdID0gbmV3VmFsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXRoID0gW2tdXHJcblxyXG4gICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGZyZWV6ZUludGVybmFsU25hcHNob3QobmV3VmFsKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UoYXJyLCBwYXRjaFJlY29yZGVyKVxyXG5cclxuICBpZiAoIXJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgJiYgbXV0YXRlKSB7XHJcbiAgICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90KGFyciwgbXV0YXRlKVxyXG4gICAgcGF0Y2hSZWNvcmRlci5lbWl0KGFycilcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHVuZGVmaW5lZEluc2lkZUFycmF5RXJyb3JNc2cgPVxyXG4gIFwidW5kZWZpbmVkIGlzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGFycmF5cyBzaW5jZSBpdCBpcyBub3Qgc2VyaWFsaXphYmxlIGluIEpTT04sIGNvbnNpZGVyIHVzaW5nIG51bGwgaW5zdGVhZFwiXHJcblxyXG4vLyBUT0RPOiByZW1vdmUgYXJyYXkgcGFyYW1ldGVyIGFuZCBqdXN0IHVzZSBjaGFuZ2Uub2JqZWN0IG9uY2UgbW9ieCB1cGRhdGUgZXZlbnQgaXMgZml4ZWRcclxuZnVuY3Rpb24gaW50ZXJjZXB0QXJyYXlNdXRhdGlvbihcclxuICBhcnJheTogSU9ic2VydmFibGVBcnJheSxcclxuICBjaGFuZ2U6IElBcnJheVdpbGxDaGFuZ2UgfCBJQXJyYXlXaWxsU3BsaWNlXHJcbikge1xyXG4gIGFzc2VydENhbldyaXRlKClcclxuXHJcbiAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xyXG4gICAgY2FzZSBcInNwbGljZVwiOlxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGluRGV2TW9kZSgpICYmICFnZXRHbG9iYWxDb25maWcoKS5hbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHMpIHtcclxuICAgICAgICAgIGNvbnN0IGxlbiA9IGNoYW5nZS5hZGRlZC5sZW5ndGhcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdiA9IGNoYW5nZS5hZGRlZFtpXVxyXG4gICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZmFpbHVyZSh1bmRlZmluZWRJbnNpZGVBcnJheUVycm9yTXNnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5yZW1vdmVkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZFZhbHVlID0gY2hhbmdlLm9iamVjdFtjaGFuZ2UuaW5kZXggKyBpXVxyXG4gICAgICAgICAgdHdlYWsocmVtb3ZlZFZhbHVlLCB1bmRlZmluZWQpXHJcbiAgICAgICAgICB0cnlVbnR3ZWFrKHJlbW92ZWRWYWx1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmFkZGVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjaGFuZ2UuYWRkZWRbaV0gPSB0d2VhayhjaGFuZ2UuYWRkZWRbaV0sIHtcclxuICAgICAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxyXG4gICAgICAgICAgICBwYXRoOiBjaGFuZ2UuaW5kZXggKyBpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHdlIG1pZ2h0IGFsc28gbmVlZCB0byB1cGRhdGUgdGhlIHBhcmVudCBvZiB0aGUgbmV4dCBpbmRleGVzXHJcbiAgICAgICAgY29uc3Qgb2xkTmV4dEluZGV4ID0gY2hhbmdlLmluZGV4ICsgY2hhbmdlLnJlbW92ZWRDb3VudFxyXG4gICAgICAgIGNvbnN0IG5ld05leHRJbmRleCA9IGNoYW5nZS5pbmRleCArIGNoYW5nZS5hZGRlZC5sZW5ndGhcclxuXHJcbiAgICAgICAgaWYgKG9sZE5leHRJbmRleCAhPT0gbmV3TmV4dEluZGV4KSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gb2xkTmV4dEluZGV4LCBqID0gbmV3TmV4dEluZGV4OyBpIDwgY2hhbmdlLm9iamVjdC5sZW5ndGg7IGkrKywgaisrKSB7XHJcbiAgICAgICAgICAgIHNldFBhcmVudCh7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNoYW5nZS5vYmplY3RbaV0sXHJcbiAgICAgICAgICAgICAgcGFyZW50UGF0aDoge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgcGF0aDogaixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIC8vIGp1c3QgcmUtaW5kZXhpbmdcclxuICAgICAgICAgICAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcblxyXG4gICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgaW5EZXZNb2RlKCkgJiZcclxuICAgICAgICAhZ2V0R2xvYmFsQ29uZmlnKCkuYWxsb3dVbmRlZmluZWRBcnJheUVsZW1lbnRzICYmXHJcbiAgICAgICAgY2hhbmdlLm5ld1ZhbHVlID09PSB1bmRlZmluZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZSh1bmRlZmluZWRJbnNpZGVBcnJheUVycm9yTXNnKVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUT0RPOiBzaG91bGQgYmUgY2hhbmdlLm9iamVjdCwgYnV0IG1vYnggaXMgYnVnZ2VkIGFuZCBkb2Vzbid0IHNlbmQgdGhlIHByb3h5XHJcbiAgICAgIGNvbnN0IG9sZFZhbCA9IGFycmF5W2NoYW5nZS5pbmRleF1cclxuICAgICAgdHdlYWsob2xkVmFsLCB1bmRlZmluZWQpIC8vIHNldCBvbGQgcHJvcCBvYmogcGFyZW50IHRvIHVuZGVmaW5lZFxyXG4gICAgICB0cnlVbnR3ZWFrKG9sZFZhbClcclxuXHJcbiAgICAgIGNoYW5nZS5uZXdWYWx1ZSA9IHR3ZWFrKGNoYW5nZS5uZXdWYWx1ZSwgeyBwYXJlbnQ6IGFycmF5LCBwYXRoOiBjaGFuZ2UuaW5kZXggfSlcclxuICAgICAgYnJlYWtcclxuICB9XHJcbiAgcmV0dXJuIGNoYW5nZVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBcnJheVR3ZWFrZXIoKSB7XHJcbiAgcmVnaXN0ZXJUd2Vha2VyKFR3ZWFrZXJQcmlvcml0eS5BcnJheSwgKHZhbHVlLCBwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHR3ZWFrQXJyYXkodmFsdWUsIHBhcmVudFBhdGgsIGZhbHNlKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IG9ic2VydmFibGVPcHRpb25zID0ge1xyXG4gIGRlZXA6IGZhbHNlLFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRWYWx1ZUFmdGVyU3BsaWNlPFQ+KFxyXG4gIGFycmF5OiByZWFkb25seSBUW10sXHJcbiAgaTogbnVtYmVyLFxyXG4gIGluZGV4OiBudW1iZXIsXHJcbiAgcmVtb3ZlOiBudW1iZXIsXHJcbiAgYWRkZWRJdGVtczogcmVhZG9ubHkgVFtdXHJcbikge1xyXG4gIGNvbnN0IGJhc2UgPSBpIC0gaW5kZXhcclxuICBpZiAoYmFzZSA8IDApIHtcclxuICAgIHJldHVybiBhcnJheVtpXVxyXG4gIH1cclxuXHJcbiAgaWYgKGJhc2UgPCBhZGRlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGFkZGVkSXRlbXNbYmFzZV1cclxuICB9XHJcblxyXG4gIHJldHVybiBhcnJheVtpIC0gYWRkZWRJdGVtcy5sZW5ndGggKyByZW1vdmVdXHJcbn1cclxuIiwiaW1wb3J0IHsgb2JzZXJ2YWJsZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHR3ZWFrQXJyYXkgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha0FycmF5XCJcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgRnJvbVNuYXBzaG90Q29udGV4dCxcbiAgaW50ZXJuYWxGcm9tU25hcHNob3QsXG4gIG9ic2VydmFibGVPcHRpb25zLFxuICByZWdpc3RlclNuYXBzaG90dGVyLFxufSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgU25hcHNob3RJbk9mT2JqZWN0IH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gZnJvbUFycmF5U25hcHNob3Qoc246IFNuYXBzaG90SW5PZk9iamVjdDxhbnk+LCBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQpOiBhbnlbXSB7XG4gIGNvbnN0IGFyciA9IG9ic2VydmFibGUuYXJyYXkoW10gYXMgYW55W10sIG9ic2VydmFibGVPcHRpb25zKVxuICBjb25zdCBsbiA9IHNuLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxuOyBpKyspIHtcbiAgICBhcnIucHVzaChpbnRlcm5hbEZyb21TbmFwc2hvdChzbltpXSwgY3R4KSlcbiAgfVxuICByZXR1cm4gdHdlYWtBcnJheShhcnIsIHVuZGVmaW5lZCwgdHJ1ZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvbUFycmF5U25hcHNob3R0ZXIoKSB7XG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuQXJyYXksIChzbiwgY3R4KSA9PiB7XG4gICAgaWYgKGlzQXJyYXkoc24pKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5U25hcHNob3Qoc24sIGN0eClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgZnJvemVuLCBpc0Zyb3plblNuYXBzaG90IH0gZnJvbSBcIi4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHsgcmVnaXN0ZXJTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvbUZyb3plblNuYXBzaG90dGVyKCkge1xuICByZWdpc3RlclNuYXBzaG90dGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LkZyb3plbiwgKHNuKSA9PiB7XG4gICAgaWYgKGlzRnJvemVuU25hcHNob3Qoc24pKSB7XG4gICAgICByZXR1cm4gZnJvemVuKHNuLmRhdGEpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBnZXRNb2RlbEluZm9Gb3JOYW1lIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEZyb21TbmFwc2hvdENvbnRleHQsIHJlZ2lzdGVyU25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgU25hcHNob3RJbk9mTW9kZWwgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiBmcm9tTW9kZWxTbmFwc2hvdChzbjogU25hcHNob3RJbk9mTW9kZWw8QW55TW9kZWw+LCBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQpOiBBbnlNb2RlbCB7XG4gIGNvbnN0IHR5cGUgPSBzblttb2RlbFR5cGVLZXldXG5cbiAgaWYgKCF0eXBlKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgYSBtb2RlbCBzbmFwc2hvdCBtdXN0IGNvbnRhaW4gYSB0eXBlIGtleSAoJHttb2RlbFR5cGVLZXl9KSwgYnV0IG5vbmUgd2FzIGZvdW5kYClcbiAgfVxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUodHlwZSlcbiAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBtb2RlbCB3aXRoIG5hbWUgXCIke3R5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gIH1cblxuICBjb25zdCBtb2RlbElkUHJvcGVydHlOYW1lID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pXG4gIGlmIChtb2RlbElkUHJvcGVydHlOYW1lICYmIChzbiBhcyBhbnkpW21vZGVsSWRQcm9wZXJ0eU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgYGEgbW9kZWwgc25hcHNob3Qgb2YgdHlwZSAnJHt0eXBlfScgbXVzdCBjb250YWluIGFuIGlkIGtleSAoJHttb2RlbElkUHJvcGVydHlOYW1lfSksIGJ1dCBub25lIHdhcyBmb3VuZGBcbiAgICApXG4gIH1cblxuICByZXR1cm4gbmV3IChtb2RlbEluZm8uY2xhc3MgYXMgYW55KSh1bmRlZmluZWQsIHtcbiAgICBzbmFwc2hvdEluaXRpYWxEYXRhOiB7XG4gICAgICB1bnByb2Nlc3NlZFNuYXBzaG90OiBzbixcbiAgICAgIHNuYXBzaG90VG9Jbml0aWFsRGF0YTogY3R4LnNuYXBzaG90VG9Jbml0aWFsRGF0YSxcbiAgICB9LFxuICAgIGdlbmVyYXRlTmV3SWRzOiBjdHgub3B0aW9ucy5nZW5lcmF0ZU5ld0lkcyxcbiAgfSBhcyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucylcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRnJvbU1vZGVsU25hcHNob3R0ZXIoKSB7XG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuTW9kZWwsIChzbiwgY3R4KSA9PiB7XG4gICAgaWYgKGlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiBmcm9tTW9kZWxTbmFwc2hvdChzbiwgY3R4KVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBvYnNlcnZhYmxlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyB0d2Vha1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtQbGFpbk9iamVjdFwiXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIEZyb21TbmFwc2hvdENvbnRleHQsXG4gIGludGVybmFsRnJvbVNuYXBzaG90LFxuICBvYnNlcnZhYmxlT3B0aW9ucyxcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcixcbn0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IFNuYXBzaG90SW5PZk9iamVjdCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIGZyb21QbGFpbk9iamVjdFNuYXBzaG90KHNuOiBTbmFwc2hvdEluT2ZPYmplY3Q8YW55PiwgY3R4OiBGcm9tU25hcHNob3RDb250ZXh0KTogb2JqZWN0IHtcbiAgY29uc3QgcGxhaW5PYmogPSBvYnNlcnZhYmxlLm9iamVjdCh7fSwgdW5kZWZpbmVkLCBvYnNlcnZhYmxlT3B0aW9ucylcblxuICBjb25zdCBzbktleXMgPSBPYmplY3Qua2V5cyhzbilcbiAgY29uc3Qgc25LZXlzTGVuID0gc25LZXlzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNuS2V5c0xlbjsgaSsrKSB7XG4gICAgY29uc3QgayA9IHNuS2V5c1tpXVxuICAgIGNvbnN0IHYgPSBzbltrXVxuICAgIHNldChwbGFpbk9iaiwgaywgaW50ZXJuYWxGcm9tU25hcHNob3QodiwgY3R4KSlcbiAgfVxuICByZXR1cm4gdHdlYWtQbGFpbk9iamVjdChwbGFpbk9iaiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIGZhbHNlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tUGxhaW5PYmplY3RTbmFwc2hvdHRlcigpIHtcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5QbGFpbk9iamVjdCwgKHNuLCBjdHgpID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChzbikpIHtcbiAgICAgIHJldHVybiBmcm9tUGxhaW5PYmplY3RTbmFwc2hvdChzbiwgY3R4KVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3RlckZyb21BcnJheVNuYXBzaG90dGVyIH0gZnJvbSBcIi4vZnJvbUFycmF5U25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm9tRnJvemVuU25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tRnJvemVuU25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm9tTW9kZWxTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21Nb2RlbFNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyRnJvbVBsYWluT2JqZWN0U25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tUGxhaW5PYmplY3RTbmFwc2hvdFwiXG5cbmxldCBkZWZhdWx0U25hcHNob3R0ZXJzUmVnaXN0ZXJlZCA9IGZhbHNlXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnMoKSB7XG4gIGlmIChkZWZhdWx0U25hcHNob3R0ZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRTbmFwc2hvdHRlcnNSZWdpc3RlcmVkID0gdHJ1ZVxuXG4gIHJlZ2lzdGVyRnJvbUFycmF5U25hcHNob3R0ZXIoKVxuICByZWdpc3RlckZyb21Gcm96ZW5TbmFwc2hvdHRlcigpXG4gIHJlZ2lzdGVyRnJvbU1vZGVsU25hcHNob3R0ZXIoKVxuICByZWdpc3RlckZyb21QbGFpbk9iamVjdFNuYXBzaG90dGVyKClcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgb2JzZXJ2YWJsZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgaXNSZXNlcnZlZE1vZGVsS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyBpc0xhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNNYXAsIGlzUHJpbWl0aXZlLCBpc1NldCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyByZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnMgfSBmcm9tIFwiLi9yZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnNcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2YsIFNuYXBzaG90SW5PZk1vZGVsLCBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFNuYXBzaG90dGVyID0gKHNuOiBhbnksIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCkgPT4gYW55IHwgdW5kZWZpbmVkXG5cbmNvbnN0IHNuYXBzaG90dGVyczogeyBwcmlvcml0eTogbnVtYmVyOyBzbmFwc2hvdHRlcjogU25hcHNob3R0ZXIgfVtdID0gW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU25hcHNob3R0ZXIocHJpb3JpdHk6IG51bWJlciwgc25hcHNob3R0ZXI6IFNuYXBzaG90dGVyKTogdm9pZCB7XG4gIHNuYXBzaG90dGVycy5wdXNoKHsgcHJpb3JpdHksIHNuYXBzaG90dGVyIH0pXG4gIHNuYXBzaG90dGVycy5zb3J0KChhLCBiKSA9PiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSlcbn1cblxuLyoqXG4gKiBGcm9tIHNuYXBzaG90IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVNuYXBzaG90T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYXNzIGB0cnVlYCB0byBnZW5lcmF0ZSBuZXcgaW50ZXJuYWwgaWRzIGZvciBtb2RlbHMgcmF0aGVyIHRoYW4gcmV1c2luZyB0aGVtLiAoRGVmYXVsdCBpcyBgZmFsc2VgKVxuICAgKi9cbiAgZ2VuZXJhdGVOZXdJZHM6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcm9tU25hcHNob3RDb250ZXh0IHtcbiAgb3B0aW9uczogRnJvbVNuYXBzaG90T3B0aW9uc1xuICBzbmFwc2hvdFRvSW5pdGlhbERhdGEocHJvY2Vzc2VkU246IFNuYXBzaG90SW5PZk1vZGVsPEFueU1vZGVsPik6IGFueVxufVxuXG4vKipcbiAqIEdpdmVuIGEgdHlwZSBkZXNlcmlhbGl6ZXMgYSBkYXRhIHN0cnVjdHVyZSBmcm9tIGl0cyBzbmFwc2hvdCBmb3JtLlxuICpcbiAqIEB0eXBlcGFyYW0gVFR5cGUgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBUeXBlLlxuICogQHBhcmFtIHNuYXBzaG90IFNuYXBzaG90LCBldmVuIGlmIGEgcHJpbWl0aXZlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNuYXBzaG90PFxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+XG4+KFxuICB0eXBlOiBUVHlwZSxcbiAgc25hcHNob3Q6IFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4sXG4gIG9wdGlvbnM/OiBQYXJ0aWFsPEZyb21TbmFwc2hvdE9wdGlvbnM+XG4pOiBUeXBlVG9EYXRhPFRUeXBlPlxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBhIGRhdGEgc3RydWN0dXJlIGZyb20gaXRzIHNuYXBzaG90IGZvcm0uXG4gKlxuICogQHR5cGVwYXJhbSBUIE9iamVjdCB0eXBlLlxuICogQHBhcmFtIHNuYXBzaG90IFNuYXBzaG90LCBldmVuIGlmIGEgcHJpbWl0aXZlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNuYXBzaG90PFQ+KFxuICBzbmFwc2hvdDogU25hcHNob3RJbk9mPFQ+IHwgU25hcHNob3RPdXRPZjxUPixcbiAgb3B0aW9ucz86IFBhcnRpYWw8RnJvbVNuYXBzaG90T3B0aW9ucz5cbik6IFRcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TbmFwc2hvdDxUPihhcmcxOiBhbnksIGFyZzI6IGFueSwgYXJnMz86IGFueSk6IFQge1xuICBsZXQgc25hcHNob3Q6IGFueVxuICBsZXQgb3B0aW9uczogUGFydGlhbDxGcm9tU25hcHNob3RPcHRpb25zPiB8IHVuZGVmaW5lZFxuXG4gIGlmIChpc0xhdGVUeXBlQ2hlY2tlcihhcmcxKSB8fCBhcmcxIGluc3RhbmNlb2YgVHlwZUNoZWNrZXIgfHwgaXNNb2RlbENsYXNzKGFyZzEpKSB7XG4gICAgY29uc3QgdHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoYXJnMSlcbiAgICBzbmFwc2hvdCA9IHR5cGVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvciA/IHR5cGVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihhcmcyKSA6IGFyZzJcbiAgICBvcHRpb25zID0gYXJnM1xuICB9IGVsc2Uge1xuICAgIHNuYXBzaG90ID0gYXJnMVxuICAgIG9wdGlvbnMgPSBhcmcyXG4gIH1cblxuICByZXR1cm4gZnJvbVNuYXBzaG90QWN0aW9uKHNuYXBzaG90LCBvcHRpb25zKVxufVxuXG5jb25zdCBmcm9tU25hcHNob3RBY3Rpb24gPSBhY3Rpb24oXG4gIFwiZnJvbVNuYXBzaG90XCIsXG4gIDxUPihzbmFwc2hvdDogU25hcHNob3RJbk9mPFQ+LCBvcHRpb25zPzogUGFydGlhbDxGcm9tU25hcHNob3RPcHRpb25zPik6IFQgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBnZW5lcmF0ZU5ld0lkczogZmFsc2UsXG4gICAgICBvdmVycmlkZVJvb3RNb2RlbElkOiB1bmRlZmluZWQsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cblxuICAgIGNvbnN0IGN0eDogUGFydGlhbDxGcm9tU25hcHNob3RDb250ZXh0PiA9IHtcbiAgICAgIG9wdGlvbnM6IG9wdHMsXG4gICAgfVxuICAgIGN0eC5zbmFwc2hvdFRvSW5pdGlhbERhdGEgPSBzbmFwc2hvdFRvSW5pdGlhbERhdGEuYmluZCh1bmRlZmluZWQsIGN0eCBhcyBGcm9tU25hcHNob3RDb250ZXh0KVxuXG4gICAgcmV0dXJuIGludGVybmFsRnJvbVNuYXBzaG90PFQ+KHNuYXBzaG90LCBjdHggYXMgRnJvbVNuYXBzaG90Q29udGV4dClcbiAgfVxuKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxGcm9tU25hcHNob3Q8VD4oXG4gIHNuOiBTbmFwc2hvdEluT2Y8VD4gfCBTbmFwc2hvdE91dE9mPFQ+LFxuICBjdHg6IEZyb21TbmFwc2hvdENvbnRleHRcbik6IFQge1xuICBpZiAoaXNQcmltaXRpdmUoc24pKSB7XG4gICAgcmV0dXJuIHNuIGFzIGFueVxuICB9XG5cbiAgcmVnaXN0ZXJEZWZhdWx0U25hcHNob3R0ZXJzKClcblxuICBjb25zdCBzbmFwc2hvdHRlckxlbiA9IHNuYXBzaG90dGVycy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbmFwc2hvdHRlckxlbjsgaSsrKSB7XG4gICAgY29uc3QgeyBzbmFwc2hvdHRlciB9ID0gc25hcHNob3R0ZXJzW2ldXG4gICAgY29uc3QgcmV0ID0gc25hcHNob3R0ZXIoc24sIGN0eClcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gIH1cblxuICBpZiAoaXNNYXAoc24pKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImEgc25hcHNob3QgbXVzdCBub3QgY29udGFpbiBtYXBzXCIpXG4gIH1cblxuICBpZiAoaXNTZXQoc24pKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImEgc25hcHNob3QgbXVzdCBub3QgY29udGFpbiBzZXRzXCIpXG4gIH1cblxuICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBzbmFwc2hvdCAtICR7c259YClcbn1cblxuZnVuY3Rpb24gc25hcHNob3RUb0luaXRpYWxEYXRhKFxuICBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQsXG4gIHByb2Nlc3NlZFNuOiBTbmFwc2hvdEluT2ZNb2RlbDxBbnlNb2RlbD5cbik6IGFueSB7XG4gIGNvbnN0IGluaXRpYWxEYXRhID0gb2JzZXJ2YWJsZS5vYmplY3Qoe30sIHVuZGVmaW5lZCwgb2JzZXJ2YWJsZU9wdGlvbnMpXG5cbiAgY29uc3QgcHJvY2Vzc2VkU25LZXlzID0gT2JqZWN0LmtleXMocHJvY2Vzc2VkU24pXG4gIGNvbnN0IHByb2Nlc3NlZFNuS2V5c0xlbiA9IHByb2Nlc3NlZFNuS2V5cy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWRTbktleXNMZW47IGkrKykge1xuICAgIGNvbnN0IGsgPSBwcm9jZXNzZWRTbktleXNbaV1cbiAgICBpZiAoIWlzUmVzZXJ2ZWRNb2RlbEtleShrKSkge1xuICAgICAgY29uc3QgdiA9IHByb2Nlc3NlZFNuW2tdXG4gICAgICBzZXQoaW5pdGlhbERhdGEsIGssIGludGVybmFsRnJvbVNuYXBzaG90KHYsIGN0eCkpXG4gICAgfVxuICB9XG4gIHJldHVybiBpbml0aWFsRGF0YVxufVxuXG5leHBvcnQgY29uc3Qgb2JzZXJ2YWJsZU9wdGlvbnMgPSB7XG4gIGRlZXA6IGZhbHNlLFxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuXG4vKipcbiAqIENsb25lIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvbmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhc3MgYHRydWVgIHRvIGdlbmVyYXRlIG5ldyBpbnRlcm5hbCBpZHMgZm9yIG1vZGVscyByYXRoZXIgdGhhbiByZXVzaW5nIHRoZW0uIChEZWZhdWx0IGlzIGB0cnVlYClcbiAgICovXG4gIGdlbmVyYXRlTmV3SWRzOiBib29sZWFuXG59XG5cbi8qKlxuICogQ2xvbmVzIGFuIG9iamVjdCBieSBkb2luZyBhIGBmcm9tU25hcHNob3QoZ2V0U25hcHNob3QodmFsdWUpLCB7IGdlbmVyYXRlTmV3SWRzOiB0cnVlIH0pYC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBPYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0gW29wdGlvbnNdIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgY2xvbmVkIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQsIG9wdGlvbnM/OiBQYXJ0aWFsPENsb25lT3B0aW9ucz4pOiBUIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICBjb25zdCBvcHRzID0ge1xuICAgIGdlbmVyYXRlTmV3SWRzOiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cblxuICBjb25zdCBzbiA9IGdldFNuYXBzaG90KG5vZGUpXG4gIHJldHVybiBmcm9tU25hcHNob3Qoc24sIG9wdHMpXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBlbnF1ZXVlUGVuZGluZ0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vcGVuZGluZ0FjdGlvbnNcIlxuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBhdHRhY2hUb1Jvb3RTdG9yZSwgZGV0YWNoRnJvbVJvb3RTdG9yZSB9IGZyb20gXCIuLi9yb290U3RvcmUvYXR0YWNoRGV0YWNoXCJcbmltcG9ydCB7IGlzUm9vdFN0b3JlIH0gZnJvbSBcIi4uL3Jvb3RTdG9yZS9yb290U3RvcmVcIlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi4vc25hcHNob3QvY2xvbmVcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIGRhdGFPYmplY3RQYXJlbnQsXG4gIGRhdGFUb01vZGVsTm9kZSxcbiAgb2JqZWN0UGFyZW50cyxcbiAgcGFyZW50UGF0aEVxdWFscyxcbiAgcmVwb3J0UGFyZW50UGF0aENoYW5nZWQsXG59IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgYWRkT2JqZWN0Q2hpbGQsIGluaXRpYWxpemVPYmplY3RDaGlsZHJlbiwgcmVtb3ZlT2JqZWN0Q2hpbGQgfSBmcm9tIFwiLi9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGgsIGZhc3RHZXRSb290LCBQYXJlbnRQYXRoIH0gZnJvbSBcIi4vcGF0aFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRQYXJlbnQgPSBhY3Rpb24oXG4gIFwic2V0UGFyZW50XCIsXG4gICh7XG4gICAgdmFsdWUsXG4gICAgcGFyZW50UGF0aCxcbiAgICBpbmRleENoYW5nZUFsbG93ZWQsXG4gICAgaXNEYXRhT2JqZWN0LFxuICAgIGNsb25lSWZBcHBsaWNhYmxlLFxuICB9OiB7XG4gICAgdmFsdWU6IGFueVxuICAgIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogYm9vbGVhblxuICAgIGlzRGF0YU9iamVjdDogYm9vbGVhblxuICAgIGNsb25lSWZBcHBsaWNhYmxlOiBib29sZWFuXG4gIH0pOiBhbnkgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgaWYgKGluZGV4Q2hhbmdlQWxsb3dlZCAmJiBjbG9uZUlmQXBwbGljYWJsZSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIFwiYXNzZXJ0aW9uIGZhaWxlZDogJ2luZGV4Q2hhbmdlQWxsb3dlZCcgYW5kICdjbG9uZUlmQXBwbGljYWJsZScgY2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lXCJcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBhc3NlcnRpb24gZmFpbGVkOiB2YWx1ZSBjYW5ub3QgYmUgYSBmdW5jdGlvbiBvciBhIHN5bWJvbGApXG4gICAgICB9XG4gICAgICBpZiAoIWlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgYXNzZXJ0aW9uIGZhaWxlZDogdmFsdWUgaXMgbm90IHJlYWR5IHRvIHRha2UgYSBwYXJlbnRgKVxuICAgICAgfVxuICAgICAgaWYgKHBhcmVudFBhdGggJiYgIWlzVHdlYWtlZE9iamVjdChwYXJlbnRQYXRoLnBhcmVudCwgdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgYXNzZXJ0aW9uIGZhaWxlZDogcGFyZW50IGlzIG5vdCByZWFkeSB0byB0YWtlIGNoaWxkcmVuYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNEYXRhT2JqZWN0KSB7XG4gICAgICBkYXRhT2JqZWN0UGFyZW50LnNldCh2YWx1ZSwgcGFyZW50UGF0aCEucGFyZW50KVxuICAgICAgLy8gZGF0YSBvYmplY3Qgd2lsbCBwcm94eSB0byB1c2UgdGhlIGFjdHVhbCBwYXJlbnQgbW9kZWwgZm9yIGNoaWxkL3BhcmVudCBzdHVmZlxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZU9iamVjdENoaWxkcmVuKHZhbHVlKVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBuZXcgcGFyZW50IGFjdHVhbGx5IHBvaW50cyB0byBtb2RlbHMgd2hlbiB3ZSBnaXZlIG1vZGVsIGRhdGEgb2Jqc1xuICAgIGlmIChwYXJlbnRQYXRoKSB7XG4gICAgICBjb25zdCBhY3R1YWxQYXJlbnQgPSBkYXRhVG9Nb2RlbE5vZGUocGFyZW50UGF0aC5wYXJlbnQpXG4gICAgICBpZiAocGFyZW50UGF0aC5wYXJlbnQgIT09IGFjdHVhbFBhcmVudCkge1xuICAgICAgICBwYXJlbnRQYXRoID0ge1xuICAgICAgICAgIHBhcmVudDogYWN0dWFsUGFyZW50LFxuICAgICAgICAgIHBhdGg6IHBhcmVudFBhdGgucGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBvbGRQYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG4gICAgaWYgKHBhcmVudFBhdGhFcXVhbHMob2xkUGFyZW50UGF0aCwgcGFyZW50UGF0aCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChpc1Jvb3RTdG9yZSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJyb290IHN0b3JlcyBjYW5ub3QgYmUgYXR0YWNoZWQgdG8gYW55IHBhcmVudHNcIilcbiAgICB9XG5cbiAgICAvLyB2YWx1ZSB0eXBlIG1vZGVscyBzaG91bGQgYmUgY2xvbmVkIHdoZW4gdGhleSBhcmUgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgcGFyZW50XG4gICAgLy8gYW5kIHRoZXkgaGFkIG9uZSBwcmV2aW91c2x5XG4gICAgaWYgKFxuICAgICAgY2xvbmVJZkFwcGxpY2FibGUgJiZcbiAgICAgIHBhcmVudFBhdGg/LnBhcmVudCAmJlxuICAgICAgb2xkUGFyZW50UGF0aD8ucGFyZW50ICYmXG4gICAgICBpc01vZGVsKHZhbHVlKSAmJlxuICAgICAgZ2V0TW9kZWxNZXRhZGF0YSh2YWx1ZSkudmFsdWVUeXBlXG4gICAgKSB7XG4gICAgICB2YWx1ZSA9IGNsb25lKHZhbHVlLCB7IGdlbmVyYXRlTmV3SWRzOiB0cnVlIH0pXG4gICAgICBvbGRQYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKG9sZFBhcmVudFBhdGggJiYgcGFyZW50UGF0aCkge1xuICAgICAgaWYgKG9sZFBhcmVudFBhdGgucGFyZW50ID09PSBwYXJlbnRQYXRoLnBhcmVudCAmJiBpbmRleENoYW5nZUFsbG93ZWQpIHtcbiAgICAgICAgLy8ganVzdCBjaGFuZ2luZyB0aGUgaW5kZXhcbiAgICAgICAgb2JqZWN0UGFyZW50cy5zZXQodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgICAgIHJlcG9ydFBhcmVudFBhdGhDaGFuZ2VkKHZhbHVlKVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhbiBvYmplY3QgY2Fubm90IGJlIGFzc2lnbmVkIGEgbmV3IHBhcmVudCB3aGVuIGl0IGFscmVhZHkgaGFzIG9uZVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaFRvTmV3UGFyZW50ID0gKCkgPT4ge1xuICAgICAgLy8gZGV0YWNoIGZyb20gb2xkXG4gICAgICBpZiAob2xkUGFyZW50UGF0aD8ucGFyZW50KSB7XG4gICAgICAgIHJlbW92ZU9iamVjdENoaWxkKG9sZFBhcmVudFBhdGgucGFyZW50LCB2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gYXR0YWNoIHRvIG5ld1xuICAgICAgb2JqZWN0UGFyZW50cy5zZXQodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgICBpZiAocGFyZW50UGF0aD8ucGFyZW50KSB7XG4gICAgICAgIGFkZE9iamVjdENoaWxkKHBhcmVudFBhdGgucGFyZW50LCB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJlcG9ydFBhcmVudFBhdGhDaGFuZ2VkKHZhbHVlKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJhc2VNb2RlbCkge1xuICAgICAgY29uc3Qgb2xkUm9vdCA9IGZhc3RHZXRSb290KHZhbHVlKVxuICAgICAgY29uc3Qgb2xkUm9vdFN0b3JlID0gaXNSb290U3RvcmUob2xkUm9vdCkgPyBvbGRSb290IDogdW5kZWZpbmVkXG5cbiAgICAgIGF0dGFjaFRvTmV3UGFyZW50KClcblxuICAgICAgY29uc3QgbmV3Um9vdCA9IGZhc3RHZXRSb290KHZhbHVlKVxuICAgICAgY29uc3QgbmV3Um9vdFN0b3JlID0gaXNSb290U3RvcmUobmV3Um9vdCkgPyBuZXdSb290IDogdW5kZWZpbmVkXG5cbiAgICAgIC8vIGludm9rZSBtb2RlbCByb290IHN0b3JlIGV2ZW50c1xuICAgICAgaWYgKG9sZFJvb3RTdG9yZSAhPT0gbmV3Um9vdFN0b3JlICYmIChvbGRSb290U3RvcmUgfHwgbmV3Um9vdFN0b3JlKSkge1xuICAgICAgICBlbnF1ZXVlUGVuZGluZ0FjdGlvbigoKSA9PiB7XG4gICAgICAgICAgaWYgKG9sZFJvb3RTdG9yZSkge1xuICAgICAgICAgICAgZGV0YWNoRnJvbVJvb3RTdG9yZSh2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5ld1Jvb3RTdG9yZSkge1xuICAgICAgICAgICAgYXR0YWNoVG9Sb290U3RvcmUobmV3Um9vdFN0b3JlLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dGFjaFRvTmV3UGFyZW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuKVxuIiwiaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgc2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9zZXRQYXJlbnRcIlxuaW1wb3J0IHsgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyVHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrXCJcbmltcG9ydCB7IFR3ZWFrZXJQcmlvcml0eSB9IGZyb20gXCIuL1R3ZWFrZXJQcmlvcml0eVwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d2Vha01vZGVsPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBULCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQpOiBUIHtcbiAgdHdlYWtlZE9iamVjdHMuc2V0KHZhbHVlLCB1bmRlZmluZWQpXG4gIHNldFBhcmVudCh7XG4gICAgdmFsdWUsXG4gICAgcGFyZW50UGF0aCxcbiAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgY2xvbmVJZkFwcGxpY2FibGU6IHRydWUsXG4gIH0pXG5cbiAgLy8gbm90aGluZyB0byBkbyBmb3IgbW9kZWxzLCBkYXRhIGlzIGFscmVhZHkgcHJveGlmaWVkIGFuZCBpdHMgcGFyZW50IGlzIHNldFxuICAvLyBmb3Igc25hcHNob3RzIHdlIHdpbGwgdXNlIGl0cyBcIiRcIiBvYmplY3Qgc25hcHNob3QgZGlyZWN0bHlcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kZWxUd2Vha2VyKCkge1xuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5Lk1vZGVsLCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcbiAgICBpZiAoaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0d2Vha01vZGVsKHZhbHVlLCBwYXJlbnRQYXRoKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgeyBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ3JlYXRpb25EYXRhIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHsgYXBwbHlNb2RlbEluaXRpYWxpemVycyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9uZXdNb2RlbFwiXG5pbXBvcnQgeyBub0RlZmF1bHRWYWx1ZSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IHR3ZWFrTW9kZWwgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha01vZGVsXCJcbmltcG9ydCB7IHR3ZWFrUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1BsYWluT2JqZWN0XCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgbWFrZVByb3BSZWFkb25seSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4vQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUsIGdldE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi9Nb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyBhc3NlcnRJc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcm5hbE5ld01vZGVsID0gYWN0aW9uKFxuICBcIm5ld01vZGVsXCIsXG4gIDxNIGV4dGVuZHMgQW55TW9kZWw+KFxuICAgIG9yaWdNb2RlbE9iajogTSxcbiAgICBpbml0aWFsRGF0YTogTW9kZWxDcmVhdGlvbkRhdGE8TT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogUGljazxNb2RlbENvbnN0cnVjdG9yT3B0aW9ucywgXCJtb2RlbENsYXNzXCIgfCBcInNuYXBzaG90SW5pdGlhbERhdGFcIiB8IFwiZ2VuZXJhdGVOZXdJZHNcIj5cbiAgKTogTSA9PiB7XG4gICAgY29uc3QgbW9kZSA9IGluaXRpYWxEYXRhID8gXCJuZXdcIiA6IFwiZnJvbVNuYXBzaG90XCJcbiAgICBjb25zdCB7IG1vZGVsQ2xhc3M6IF9tb2RlbENsYXNzLCBzbmFwc2hvdEluaXRpYWxEYXRhLCBnZW5lcmF0ZU5ld0lkcyB9ID0gb3B0aW9uc1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBfbW9kZWxDbGFzcyFcblxuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgYXNzZXJ0SXNNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIFwibW9kZWxDbGFzc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsT2JqID0gb3JpZ01vZGVsT2JqIGFzIE8uV3JpdGFibGU8TT5cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpXG4gICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBubyBtb2RlbCBpbmZvIGZvciBjbGFzcyAke21vZGVsQ2xhc3MubmFtZX0gY291bGQgYmUgZm91bmQgLSBkaWQgeW91IGZvcmdldCB0byBhZGQgdGhlIEBtb2RlbCBkZWNvcmF0b3I/YFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsQ2xhc3MpXG4gICAgY29uc3QgbW9kZWxQcm9wcyA9IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhtb2RlbENsYXNzKVxuICAgIGNvbnN0IG1vZGVsSWRQcm9wRGF0YSA9IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPyBtb2RlbFByb3BzW21vZGVsSWRQcm9wZXJ0eU5hbWVdISA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGlkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBpZiAoc25hcHNob3RJbml0aWFsRGF0YSkge1xuICAgICAgbGV0IHNuID0gc25hcHNob3RJbml0aWFsRGF0YS51bnByb2Nlc3NlZFNuYXBzaG90XG5cbiAgICAgIGlmIChtb2RlbElkUHJvcERhdGEgJiYgbW9kZWxJZFByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoZ2VuZXJhdGVOZXdJZHMpIHtcbiAgICAgICAgICBpZCA9IChtb2RlbElkUHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiBhcyAoKSA9PiBzdHJpbmcpKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZCA9IHNuW21vZGVsSWRQcm9wZXJ0eU5hbWVdXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGVsQ2xhc3MuZnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICAgIHNuID0gbW9kZWxDbGFzcy5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICB9XG5cbiAgICAgIGluaXRpYWxEYXRhID0gc25hcHNob3RJbml0aWFsRGF0YS5zbmFwc2hvdFRvSW5pdGlhbERhdGEoc24pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBzeW1ib2wgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChtb2RlbElkUHJvcERhdGEgJiYgbW9kZWxJZFByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoaW5pdGlhbERhdGEhW21vZGVsSWRQcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgaWQgPSBpbml0aWFsRGF0YSFbbW9kZWxJZFByb3BlcnR5TmFtZV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZCA9IChtb2RlbElkUHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiBhcyAoKSA9PiBzdHJpbmcpKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG1vZGVsT2JqW21vZGVsVHlwZUtleV0gPSBtb2RlbEluZm8ubmFtZVxuXG4gICAgLy8gZmlsbCBpbiBkZWZhdWx0cyBpbiBpbml0aWFsIGRhdGFcbiAgICBjb25zdCBtb2RlbFByb3BzS2V5cyA9IE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RlbFByb3BzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IG1vZGVsUHJvcHNLZXlzW2ldXG5cbiAgICAgIC8vIGlkIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgYWJvdmVcbiAgICAgIGlmIChrID09PSBtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb3BEYXRhID0gbW9kZWxQcm9wc1trXVxuXG4gICAgICBsZXQgbmV3VmFsdWUgPSBpbml0aWFsRGF0YSFba11cbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcblxuICAgICAgLy8gYXBwbHkgdW50cmFuc2Zvcm0gKGlmIGFueSlcbiAgICAgIGlmIChtb2RlID09PSBcIm5ld1wiICYmIHByb3BEYXRhLl9pbnRlcm5hbC50cmFuc2Zvcm0pIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwudHJhbnNmb3JtLnVudHJhbnNmb3JtKG5ld1ZhbHVlLCBtb2RlbE9iaiwgaylcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgZGVmYXVsdCB2YWx1ZSAoaWYgbmVlZGVkKVxuICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpIHtcbiAgICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4oKVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWUgIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWVcbiAgICAgICAgfSBlbHNlIGlmICghKFwia1wiIGluIGluaXRpYWxEYXRhISkpIHtcbiAgICAgICAgICAvLyBmb3IgbW9ieDQsIHdlIG5lZWQgdG8gc2V0IHVwIHByb3BlcnRpZXMgZXZlbiBpZiB0aGV5IGFyZSB1bmRlZmluZWRcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHNldChpbml0aWFsRGF0YSBhcyBhbnksIGssIG5ld1ZhbHVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICBzZXQoaW5pdGlhbERhdGEgYXMgYW55LCBtb2RlbElkUHJvcGVydHlOYW1lLCBpZClcbiAgICB9XG5cbiAgICB0d2Vha01vZGVsKG1vZGVsT2JqLCB1bmRlZmluZWQpXG5cbiAgICAvLyBjcmVhdGUgb2JzZXJ2YWJsZSBkYXRhIG9iamVjdCB3aXRoIGluaXRpYWwgZGF0YVxuICAgIGxldCBvYnNEYXRhID0gdHdlYWtQbGFpbk9iamVjdChcbiAgICAgIGluaXRpYWxEYXRhISxcbiAgICAgIHsgcGFyZW50OiBtb2RlbE9iaiwgcGF0aDogXCIkXCIgfSxcbiAgICAgIG1vZGVsT2JqW21vZGVsVHlwZUtleV0sXG4gICAgICBmYWxzZSxcbiAgICAgIHRydWVcbiAgICApXG5cbiAgICAvLyBsaW5rIGl0LCBhbmQgbWFrZSBpdCByZWFkb25seVxuICAgIG1vZGVsT2JqLiQgPSBvYnNEYXRhXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBtYWtlUHJvcFJlYWRvbmx5KG1vZGVsT2JqLCBcIiRcIiwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyB0eXBlIGNoZWNrIGl0IGlmIG5lZWRlZFxuICAgIGlmIChpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSAmJiBnZXRNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhc3MpLmRhdGFUeXBlKSB7XG4gICAgICBjb25zdCBlcnIgPSBtb2RlbE9iai50eXBlQ2hlY2soKVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBlcnIudGhyb3cobW9kZWxPYmopXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcnVuIGFueSBleHRyYSBpbml0aWFsaXplcnMgZm9yIHRoZSBjbGFzcyBhcyBuZWVkZWRcbiAgICBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzKG1vZGVsQ2xhc3MsIG1vZGVsT2JqKVxuXG4gICAgcmV0dXJuIG1vZGVsT2JqIGFzIE1cbiAgfVxuKVxuIiwiaW1wb3J0IHsgb2JzZXJ2YWJsZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIGZyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbCxcbiAgTW9kZWxDbGFzcyxcbiAgcHJvcHNUeXBlU3ltYm9sLFxuICB0b1NuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxQcm9wcyxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWREYXRhLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZk1vZGVsLCBTbmFwc2hvdE91dE9mTW9kZWwgfSBmcm9tIFwiLi4vc25hcHNob3QvU25hcHNob3RPZlwiXG5pbXBvcnQgeyB0eXBlc01vZGVsIH0gZnJvbSBcIi4uL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzTW9kZWxcIlxuaW1wb3J0IHsgdHlwZUNoZWNrIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVDaGVja1wiXG5pbXBvcnQgdHlwZSB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsSWRLZXksIG1vZGVsVHlwZUtleSB9IGZyb20gXCIuL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi9Nb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyBpbnRlcm5hbE5ld01vZGVsIH0gZnJvbSBcIi4vbmV3TW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0SXNNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWVTeW1ib2wgPSBTeW1ib2woXCJtb2RlbElkUHJvcGVydHlOYW1lXCIpXG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgbW9kZWxzLiBVc2UgYE1vZGVsYCBpbnN0ZWFkIHdoZW4gZXh0ZW5kaW5nLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkluaXRgIG9yIGBvbkF0dGFjaGVkVG9Sb290U3RvcmVgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBEYXRhIERhdGEgdHlwZS5cbiAqIEB0eXBlcGFyYW0gQ3JlYXRpb25EYXRhIENyZWF0aW9uIGRhdGEgdHlwZS5cbiAqIEB0eXBlcGFyYW0gTW9kZWxJZFByb3BlcnR5TmFtZSBNb2RlbCBpZCBwcm9wZXJ0eSBuYW1lLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBGcm9tU25hcHNob3RPdmVycmlkZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRvU25hcHNob3RPdmVycmlkZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIE1vZGVsSWRQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlclxuPiB7XG4gIC8vIGp1c3QgdG8gbWFrZSB0eXBpbmcgd29yayBwcm9wZXJseVxuICBbcHJvcHNUeXBlU3ltYm9sXSE6IFRQcm9wcztcbiAgW2Zyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF0hOiBGcm9tU25hcHNob3RPdmVycmlkZTtcbiAgW3RvU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdITogVG9TbmFwc2hvdE92ZXJyaWRlO1xuICBbbW9kZWxJZFByb3BlcnR5TmFtZVN5bWJvbF0hOiBNb2RlbElkUHJvcGVydHlOYW1lO1xuXG4gIC8qKlxuICAgKiBNb2RlbCB0eXBlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBbbW9kZWxUeXBlS2V5XSE6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBNb2RlbCBpbnRlcm5hbCBpZC4gQ2FuIGJlIG1vZGlmaWVkIGluc2lkZSBhIG1vZGVsIGFjdGlvbi5cbiAgICogSXQgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgaWYgdGhlcmUncyBubyBpZCBwcm9wIHNldC5cbiAgICovXG4gIGdldCBbbW9kZWxJZEtleV0oKTogW01vZGVsSWRQcm9wZXJ0eU5hbWVdIGV4dGVuZHMgW25ldmVyXSA/IG5ldmVyIDogc3RyaW5nIHtcbiAgICBjb25zdCBpZFByb3AgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuICAgIHJldHVybiBpZFByb3AgPyB0aGlzLiRbaWRQcm9wXSA6ICh1bmRlZmluZWQgYXMgYW55KVxuICB9XG5cbiAgc2V0IFttb2RlbElkS2V5XShuZXdJZDogW01vZGVsSWRQcm9wZXJ0eU5hbWVdIGV4dGVuZHMgW25ldmVyXSA/IG5ldmVyIDogc3RyaW5nKSB7XG4gICAgY29uc3QgaWRQcm9wID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSlcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIiRtb2RlbElkIGNhbm5vdCBiZSBzZXQgd2hlbiB0aGVyZSBpcyBubyBpZFByb3Agc2V0IGluIHRoZSBtb2RlbFwiKVxuICAgIH1cbiAgICA7KHRoaXMuJCBhcyBhbnkpW2lkUHJvcF0gPSBuZXdJZFxuICB9XG5cbiAgLyoqXG4gICAqIENhbiBiZSBvdmVycmlkZGVuIHRvIG9mZmVyIGEgcmVmZXJlbmNlIGlkIHRvIGJlIHVzZWQgaW4gcmVmZXJlbmNlIHJlc29sdXRpb24uXG4gICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCB1c2UgdGhlIGBpZFByb3BgIGlmIGF2YWlsYWJsZSBvciByZXR1cm4gYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0UmVmSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpc1ttb2RlbElkS2V5XVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciB0aGUgbW9kZWwgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBvbkluaXQ/KCk6IHZvaWRcblxuICAvKipcbiAgICogRGF0YSBwYXJ0IG9mIHRoZSBtb2RlbCwgd2hpY2ggaXMgb2JzZXJ2YWJsZSBhbmQgd2lsbCBiZSBzZXJpYWxpemVkIGluIHNuYXBzaG90cy5cbiAgICogVXNlIGl0IGlmIG9uZSBvZiB0aGUgZGF0YSBwcm9wZXJ0aWVzIG1hdGNoZXMgb25lIG9mIHRoZSBtb2RlbCBwcm9wZXJ0aWVzL2Z1bmN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5ICQhOiBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkRGF0YTxUUHJvcHM+XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGhvb2sgdGhhdCB3aWxsIHJ1biBvbmNlIHRoaXMgbW9kZWwgaW5zdGFuY2UgaXMgYXR0YWNoZWQgdG8gdGhlIHRyZWUgb2YgYSBtb2RlbCBtYXJrZWQgYXNcbiAgICogcm9vdCBzdG9yZSB2aWEgYHJlZ2lzdGVyUm9vdFN0b3JlYC5cbiAgICogQmFzaWNhbGx5IHRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHlvdSBrbm93IHRoZSBmdWxsIHJvb3Qgc3RvcmUgaXMgY29tcGxldGUgYW5kIHdoZXJlIHRoaW5ncyBzdWNoIGFzXG4gICAqIG1pZGRsZXdhcmVzLCBlZmZlY3RzIChyZWFjdGlvbnMsIGV0YyksIGFuZCBvdGhlciBzaWRlIGVmZmVjdHMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQsIHNpbmNlIGl0IG1lYW5zXG4gICAqIHRoYXQgdGhlIG1vZGVsIGlzIG5vdyBwYXJ0IG9mIHRoZSBhY3RpdmUgYXBwbGljYXRpb24gc3RhdGUuXG4gICAqXG4gICAqIEl0IGNhbiByZXR1cm4gYSBkaXNwb3NlciB0aGF0IHdpbGwgYmUgcnVuIG9uY2UgdGhpcyBtb2RlbCBpbnN0YW5jZSBpcyBkZXRhY2hlZCBmcm9tIHN1Y2ggcm9vdCBzdG9yZSB0cmVlLlxuICAgKlxuICAgKiBAcGFyYW0gcm9vdFN0b3JlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcm90ZWN0ZWQgb25BdHRhY2hlZFRvUm9vdFN0b3JlPyhyb290U3RvcmU6IG9iamVjdCk6ICgoKSA9PiB2b2lkKSB8IHZvaWRcblxuICAvKipcbiAgICogUGVyZm9ybXMgYSB0eXBlIGNoZWNrIG92ZXIgdGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBGb3IgdGhpcyB0byB3b3JrIGEgZGF0YSB0eXBlIGhhcyB0byBiZSBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtb2RlbCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBUeXBlQ2hlY2tFcnJvcmAgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGVycm9yLlxuICAgKi9cbiAgdHlwZUNoZWNrKCk6IFR5cGVDaGVja0Vycm9yIHwgbnVsbCB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVzTW9kZWw8dGhpcz4odGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpXG4gICAgcmV0dXJuIHR5cGVDaGVjayh0eXBlLCB0aGlzIGFzIGFueSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgbW9kZWwuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhOiBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+KSB7XG4gICAgbGV0IGluaXRpYWxEYXRhID0gZGF0YSBhcyBhbnlcbiAgICBjb25zdCB7IHNuYXBzaG90SW5pdGlhbERhdGEsIG1vZGVsQ2xhc3MsIGdlbmVyYXRlTmV3SWRzIH06IE1vZGVsQ29uc3RydWN0b3JPcHRpb25zID1cbiAgICAgIGFyZ3VtZW50c1sxXSBhcyBhbnlcblxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBtb2RlbENsYXNzIS5wcm90b3R5cGUpXG5cbiAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBhbnlcblxuICAgIC8vIGRlbGV0ZSB1bm5lY2Vzc2FyeSBwcm9wc1xuICAgIGRlbGV0ZSBzZWxmW3Byb3BzVHlwZVN5bWJvbF1cbiAgICBkZWxldGUgc2VsZltmcm9tU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdXG4gICAgZGVsZXRlIHNlbGZbdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF1cbiAgICBkZWxldGUgc2VsZlttb2RlbElkUHJvcGVydHlOYW1lU3ltYm9sXVxuXG4gICAgaWYgKCFzbmFwc2hvdEluaXRpYWxEYXRhKSB7XG4gICAgICAvLyBwbGFpbiBuZXdcbiAgICAgIGFzc2VydElzT2JqZWN0KGluaXRpYWxEYXRhLCBcImluaXRpYWxEYXRhXCIpXG5cbiAgICAgIGludGVybmFsTmV3TW9kZWwodGhpcywgb2JzZXJ2YWJsZS5vYmplY3QoaW5pdGlhbERhdGEgYXMgYW55LCB1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSksIHtcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgZ2VuZXJhdGVOZXdJZHM6IHRydWUsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmcm9tIHNuYXBzaG90XG4gICAgICBpbnRlcm5hbE5ld01vZGVsKHRoaXMsIHVuZGVmaW5lZCwgeyBtb2RlbENsYXNzLCBzbmFwc2hvdEluaXRpYWxEYXRhLCBnZW5lcmF0ZU5ld0lkcyB9KVxuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nKG9wdGlvbnM/OiB7IHdpdGhEYXRhPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0ge1xuICAgICAgd2l0aERhdGE6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0UGFydCA9IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzW21vZGVsVHlwZUtleV19YFxuXG4gICAgcmV0dXJuIGZpbmFsT3B0aW9ucy53aXRoRGF0YVxuICAgICAgPyBgWyR7Zmlyc3RQYXJ0fSAke0pTT04uc3RyaW5naWZ5KGdldFNuYXBzaG90KHRoaXMpKX1dYFxuICAgICAgOiBgWyR7Zmlyc3RQYXJ0fV1gXG4gIH1cbn1cblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCB0eXBlIEJhc2VNb2RlbEtleXMgPSBrZXlvZiBBbnlNb2RlbCB8IFwib25Jbml0XCIgfCBcIm9uQXR0YWNoZWRUb1Jvb3RTdG9yZVwiXG5cbi8vIHRoZXNlIHByb3BzIHdpbGwgbmV2ZXIgYmUgaG9pc3RlZCB0byB0aGlzIChleGNlcHQgZm9yIG1vZGVsIGlkKVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2VNb2RlbFByb3BOYW1lcyA9IG5ldyBTZXQ8QmFzZU1vZGVsS2V5cz4oW1xuICBtb2RlbFR5cGVLZXksXG4gIG1vZGVsSWRLZXksXG4gIFwib25Jbml0XCIsXG4gIFwiJFwiLFxuICBcImdldFJlZklkXCIsXG4gIFwib25BdHRhY2hlZFRvUm9vdFN0b3JlXCIsXG4gIFwidHlwZUNoZWNrXCIsXG5dKVxuXG4vKipcbiAqIEFueSBraW5kIG9mIG1vZGVsIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFueU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsPGFueSwgYW55LCBhbnksIGFueT4ge31cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTaG91bGQgbm90IGJlIG5lZWRlZCBhbnltb3JlLlxuICpcbiAqIFRyaWNrcyBUeXBlU2NyaXB0IGludG8gYWNjZXB0aW5nIGFic3RyYWN0IGNsYXNzZXMgYXMgYSBwYXJhbWV0ZXIgZm9yIGBFeHRlbmRlZE1vZGVsYC5cbiAqIERvZXMgbm90aGluZyBpbiBydW50aW1lLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBBYnN0cmFjdCBtb2RlbCBjbGFzcyB0eXBlLlxuICogQHBhcmFtIHR5cGUgQWJzdHJhY3QgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWJzdHJhY3RNb2RlbENsYXNzPFQ+KHR5cGU6IFQpOiBUICYgT2JqZWN0IHtcbiAgcmV0dXJuIHR5cGUgYXMgYW55XG59XG5cbi8qKlxuICogVGhlIG1vZGVsIGlkIHByb3BlcnR5IG5hbWUuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsSWRQcm9wZXJ0eU5hbWU8TSBleHRlbmRzIEFueU1vZGVsPiA9IE1bdHlwZW9mIG1vZGVsSWRQcm9wZXJ0eU5hbWVTeW1ib2xdXG5cbi8qKlxuICogQWRkIG1pc3NpbmcgbW9kZWwgbWV0YWRhdGEgdG8gYSBtb2RlbCBjcmVhdGlvbiBzbmFwc2hvdCB0byBnZW5lcmF0ZSBhIHByb3BlciBtb2RlbCBzbmFwc2hvdC5cbiAqIFVzdWFsbHkgdXNlZCBhbG9uZ3NpZGUgYGZyb21TbmFwc2hvdGAuXG4gKlxuICogQHR5cGVwYXJhbSBNIE1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxDbGFzcyBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSBzbmFwc2hvdCBNb2RlbCBjcmVhdGlvbiBzbmFwc2hvdCB3aXRob3V0IG1ldGFkYXRhLlxuICogQHJldHVybnMgVGhlIG1vZGVsIHNuYXBzaG90IChpbmNsdWRpbmcgbWV0YWRhdGEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTbmFwc2hvdEluV2l0aE1ldGFkYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbD4oXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8TT4sXG4gIHNuYXBzaG90OiBPbWl0PFNuYXBzaG90SW5PZk1vZGVsPE0+LCB0eXBlb2YgbW9kZWxUeXBlS2V5PlxuKTogU25hcHNob3RJbk9mTW9kZWw8TT4ge1xuICBhc3NlcnRJc01vZGVsQ2xhc3MobW9kZWxDbGFzcywgXCJtb2RlbENsYXNzXCIpXG4gIGFzc2VydElzT2JqZWN0KHNuYXBzaG90LCBcImluaXRpYWxEYXRhXCIpXG5cbiAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGFzcykhXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zbmFwc2hvdCxcbiAgICBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUsXG4gIH0gYXMgYW55XG59XG5cbi8qKlxuICogQWRkIG1pc3NpbmcgbW9kZWwgbWV0YWRhdGEgdG8gYSBtb2RlbCBvdXRwdXQgc25hcHNob3QgdG8gZ2VuZXJhdGUgYSBwcm9wZXIgbW9kZWwgc25hcHNob3QuXG4gKiBVc3VhbGx5IHVzZWQgYWxvbmdzaWRlIGBhcHBseVNuYXBzaG90YC5cbiAqXG4gKiBAdHlwZXBhcmFtIE0gTW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbENsYXNzIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHNuYXBzaG90IE1vZGVsIG91dHB1dCBzbmFwc2hvdCB3aXRob3V0IG1ldGFkYXRhLlxuICogQHJldHVybnMgVGhlIG1vZGVsIHNuYXBzaG90IChpbmNsdWRpbmcgbWV0YWRhdGEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YTxNIGV4dGVuZHMgQW55TW9kZWw+KFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPE0+LFxuICBzbmFwc2hvdDogT21pdDxTbmFwc2hvdE91dE9mTW9kZWw8TT4sIHR5cGVvZiBtb2RlbFR5cGVLZXk+XG4pOiBTbmFwc2hvdE91dE9mTW9kZWw8TT4ge1xuICBhc3NlcnRJc01vZGVsQ2xhc3MobW9kZWxDbGFzcywgXCJtb2RlbENsYXNzXCIpXG4gIGFzc2VydElzT2JqZWN0KHNuYXBzaG90LCBcImluaXRpYWxEYXRhXCIpXG5cbiAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGFzcykhXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zbmFwc2hvdCxcbiAgICBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUsXG4gIH0gYXMgYW55XG59XG5cbi8qKlxuICogQSBtb2RlbCBjbGFzcyBkZWNsYXJhdGlvbiwgbWFkZSBvZiBhIGJhc2UgbW9kZWwgYW5kIHRoZSBtb2RlbCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsQ2xhc3NEZWNsYXJhdGlvbjxCYXNlTW9kZWxDbGFzcywgTW9kZWxJbnRlcmZhY2U+ID0gQmFzZU1vZGVsQ2xhc3MgJiB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBNb2RlbEludGVyZmFjZVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEFueU1vZGVsLCBCYXNlTW9kZWwgfSBmcm9tIFwiLi9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4vbWV0YWRhdGFcIlxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBvYmplY3QgaXMgYSBtb2RlbCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gbW9kZWxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsKG1vZGVsOiB1bmtub3duKTogbW9kZWwgaXMgQW55TW9kZWwge1xuICByZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBCYXNlTW9kZWxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBhY3R1YWxseSBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBtb2RlbFxuICogQHBhcmFtIGFyZ05hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzTW9kZWwoXG4gIG1vZGVsOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcsXG4gIGN1c3RvbUVyck1zZyA9IFwibXVzdCBiZSBhIG1vZGVsIGluc3RhbmNlXCJcbik6IGFzc2VydHMgbW9kZWwgaXMgQW55TW9kZWwge1xuICBpZiAoIWlzTW9kZWwobW9kZWwpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSAke2N1c3RvbUVyck1zZ31gKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsQ2xhc3MobW9kZWxDbGFzczogdW5rbm93bik6IG1vZGVsQ2xhc3MgaXMgTW9kZWxDbGFzczxBbnlNb2RlbD4ge1xuICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKG1vZGVsQ2xhc3MgIT09IEJhc2VNb2RlbCAmJiAhKG1vZGVsQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgQmFzZU1vZGVsKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzTW9kZWxDbGFzcyhcbiAgbW9kZWxDbGFzczogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nXG4pOiBhc3NlcnRzIG1vZGVsQ2xhc3MgaXMgTW9kZWxDbGFzczxBbnlNb2RlbD4ge1xuICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIGNsYXNzYClcbiAgfVxuXG4gIGlmIChtb2RlbENsYXNzICE9PSBCYXNlTW9kZWwgJiYgIShtb2RlbENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VNb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgZXh0ZW5kIE1vZGVsYClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbFNuYXBzaG90KHNuOiB1bmtub3duKTogc24gaXMgeyBbbW9kZWxUeXBlS2V5XTogc3RyaW5nIH0ge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChzbikgJiYgbW9kZWxUeXBlS2V5IGluIHNuXG59XG4iLCJpbXBvcnQgeyBjb21wdXRlZCwgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbElkS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgaXNBcnJheSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHtcbiAgZGF0YU9iamVjdFBhcmVudCxcbiAgZGF0YVRvTW9kZWxOb2RlLFxuICBtb2RlbFRvRGF0YU5vZGUsXG4gIG9iamVjdFBhcmVudHMsXG4gIHJlcG9ydFBhcmVudFBhdGhPYnNlcnZlZCxcbn0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgdHlwZSB7IFBhdGgsIFBhdGhFbGVtZW50LCBXcml0YWJsZVBhdGggfSBmcm9tIFwiLi9wYXRoVHlwZXNcIlxuXG4vKipcbiAqIFBhdGggZnJvbSBhbiBvYmplY3QgdG8gaXRzIGltbWVkaWF0ZSBwYXJlbnQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFBhcmVudCBvYmplY3QgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRQYXRoPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFBhcmVudCBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ6IFRcbiAgLyoqXG4gICAqIFByb3BlcnR5IG5hbWUgKGlmIHRoZSBwYXJlbnQgaXMgYW4gb2JqZWN0KSBvciBpbmRleCBudW1iZXIgKGlmIHRoZSBwYXJlbnQgaXMgYW4gYXJyYXkpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogUGF0aEVsZW1lbnRcbn1cblxuLyoqXG4gKiBQYXRoIGZyb20gYW4gb2JqZWN0IHRvIGl0cyByb290LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSb290IG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RQYXRoPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFJvb3Qgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdDogVFxuICAvKipcbiAgICogUGF0aCBmcm9tIHRoZSByb290IHRvIHRoZSBnaXZlbiB0YXJnZXQsIGFzIGEgc3RyaW5nIGFycmF5LlxuICAgKiBJZiB0aGUgdGFyZ2V0IGlzIGEgcm9vdCBpdHNlbGYgdGhlbiB0aGUgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IFBhdGhcblxuICAvKipcbiAgICogT2JqZWN0cyBpbiB0aGUgcGF0aCwgZnJvbSByb290IChpbmNsdWRlZCkgdW50aWwgdGFyZ2V0IChpbmNsdWRlZCkuXG4gICAqIElmIHRoZSB0YXJnZXQgaXMgYSByb290IHRoZW4gb25seSB0aGUgdGFyZ2V0IHdpbGwgYmUgaW5jbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoT2JqZWN0czogUmVhZG9ubHlBcnJheTx1bmtub3duPlxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgdGFyZ2V0IHBsdXMgdGhlIHBhdGggZnJvbSB0aGUgcGFyZW50IHRvIHRoZSB0YXJnZXQsIG9yIHVuZGVmaW5lZCBpZiBpdCBoYXMgbm8gcGFyZW50LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQYXJlbnQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdmFsdWUgVGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRQYXRoPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBQYXJlbnRQYXRoPFQ+IHwgdW5kZWZpbmVkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgXCJ2YWx1ZVwiKVxuXG4gIHJldHVybiBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRQYXJlbnRQYXRoPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICB2YWx1ZTogb2JqZWN0XG4pOiBQYXJlbnRQYXRoPFQ+IHwgdW5kZWZpbmVkIHtcbiAgcmVwb3J0UGFyZW50UGF0aE9ic2VydmVkKHZhbHVlKVxuICByZXR1cm4gb2JqZWN0UGFyZW50cy5nZXQodmFsdWUpIGFzIGFueVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFBhcmVudFBhdGhJbmNsdWRpbmdEYXRhT2JqZWN0czxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgdmFsdWU6IG9iamVjdFxuKTogUGFyZW50UGF0aDxUPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcmVudE1vZGVsID0gZGF0YU9iamVjdFBhcmVudC5nZXQodmFsdWUpXG4gIGlmIChwYXJlbnRNb2RlbCkge1xuICAgIHJldHVybiB7IHBhcmVudDogcGFyZW50TW9kZWwgYXMgVCwgcGF0aDogXCIkXCIgfVxuICB9XG5cbiAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoKHZhbHVlKVxuICBpZiAocGFyZW50UGF0aCAmJiBpc01vZGVsKHBhcmVudFBhdGgucGFyZW50KSkge1xuICAgIHJldHVybiB7IHBhcmVudDogcGFyZW50UGF0aC5wYXJlbnQuJCBhcyBULCBwYXRoOiBwYXJlbnRQYXRoLnBhdGggfVxuICB9XG4gIHJldHVybiBwYXJlbnRQYXRoXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm8gcGFyZW50LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQYXJlbnQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdmFsdWUgVGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnQ8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFQgfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIpXG5cbiAgcmV0dXJuIGZhc3RHZXRQYXJlbnQodmFsdWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0UGFyZW50PFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoKHZhbHVlKVxuXG4gIHJldHVybiBwYXJlbnRQYXRoID8gcGFyZW50UGF0aC5wYXJlbnQgOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRQYXJlbnRJbmNsdWRpbmdEYXRhT2JqZWN0czxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgdmFsdWU6IG9iamVjdFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzKHZhbHVlKVxuXG4gIHJldHVybiBwYXJlbnRQYXRoID8gcGFyZW50UGF0aC5wYXJlbnQgOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gb2JqZWN0IGlzIGEgbW9kZWwgaW50ZXJpbSBkYXRhIG9iamVjdCAoYCRgKS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRvIGNoZWNrLlxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBpcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbERhdGFPYmplY3QodmFsdWU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIsIHRydWUpXG5cbiAgcmV0dXJuIGZhc3RJc01vZGVsRGF0YU9iamVjdCh2YWx1ZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RJc01vZGVsRGF0YU9iamVjdCh2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBkYXRhT2JqZWN0UGFyZW50Lmhhcyh2YWx1ZSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSB0YXJnZXQgcGx1cyB0aGUgcGF0aCBmcm9tIHRoZSByb290IHRvIGdldCB0byB0aGUgdGFyZ2V0LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSb290IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHZhbHVlIFRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vdFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFJvb3RQYXRoPFQ+IHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgXCJ2YWx1ZVwiKVxuXG4gIHJldHVybiBmYXN0R2V0Um9vdFBhdGgodmFsdWUpXG59XG5cbi8vIHdlIHVzZSBjb21wdXRlZHMgc28gdGhleSBhcmUgY2FjaGVkIHdoZW5ldmVyIHBvc3NpYmxlXG5jb25zdCBjb21wdXRlZHNHZXRSb290UGF0aCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgSUNvbXB1dGVkVmFsdWU8Um9vdFBhdGg8YW55Pj4+KClcblxuZnVuY3Rpb24gaW50ZXJuYWxHZXRSb290UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogUm9vdFBhdGg8VD4ge1xuICBjb25zdCByb290UGF0aCA9IHtcbiAgICByb290OiB2YWx1ZSxcbiAgICBwYXRoOiBbXSBhcyBXcml0YWJsZVBhdGgsXG4gICAgcGF0aE9iamVjdHM6IFt2YWx1ZV0gYXMgdW5rbm93bltdLFxuICB9XG5cbiAgbGV0IHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuICB3aGlsZSAoKHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aChyb290UGF0aC5yb290KSkpIHtcbiAgICByb290UGF0aC5yb290ID0gcGFyZW50UGF0aC5wYXJlbnRcbiAgICByb290UGF0aC5wYXRoLnVuc2hpZnQocGFyZW50UGF0aC5wYXRoKVxuICAgIHJvb3RQYXRoLnBhdGhPYmplY3RzLnVuc2hpZnQocGFyZW50UGF0aC5wYXJlbnQpXG4gIH1cblxuICByZXR1cm4gcm9vdFBhdGggYXMgUm9vdFBhdGg8YW55PlxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFJvb3RQYXRoPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBSb290UGF0aDxUPiB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShjb21wdXRlZHNHZXRSb290UGF0aCwgdmFsdWUsICgpID0+XG4gICAgY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIGludGVybmFsR2V0Um9vdFBhdGgodmFsdWUpXG4gICAgfSlcbiAgKS5nZXQoKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIHRhcmdldCBvYmplY3QsIG9yIGl0c2VsZiBpZiB0aGUgdGFyZ2V0IGlzIGEgcm9vdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUm9vdCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3Q8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIpXG5cbiAgcmV0dXJuIGZhc3RHZXRSb290KHZhbHVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFJvb3Q8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFQge1xuICByZXR1cm4gZmFzdEdldFJvb3RQYXRoKHZhbHVlKS5yb290XG59XG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIG9iamVjdCBpcyBhIHJvb3Qgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdCh2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIilcblxuICByZXR1cm4gIWZhc3RHZXRQYXJlbnQodmFsdWUpXG59XG5cbmNvbnN0IHVucmVzb2x2ZWQgPSB7IHJlc29sdmVkOiBmYWxzZSB9IGFzIGNvbnN0XG5cbi8qKlxuICogVHJpZXMgdG8gcmVzb2x2ZSBhIHBhdGggZnJvbSBhbiBvYmplY3QuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybmVkIHZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gcGF0aFJvb3RPYmplY3QgT2JqZWN0IHRoYXQgc2VydmVzIGFzIHBhdGggcm9vdC5cbiAqIEBwYXJhbSBwYXRoIFBhdGggYXMgYW4gc3RyaW5nIG9yIG51bWJlciBhcnJheS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGB7IHJlc29sdmVkOiB0cnVlLCB2YWx1ZTogVCB9YCBvciBgeyByZXNvbHZlZDogZmFsc2UgfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aDxUID0gYW55PihcbiAgcGF0aFJvb3RPYmplY3Q6IG9iamVjdCxcbiAgcGF0aDogUGF0aFxuKTpcbiAgfCB7XG4gICAgICByZXNvbHZlZDogdHJ1ZVxuICAgICAgdmFsdWU6IFRcbiAgICB9XG4gIHwge1xuICAgICAgcmVzb2x2ZWQ6IGZhbHNlXG4gICAgICB2YWx1ZT86IHVuZGVmaW5lZFxuICAgIH0ge1xuICAvLyB1bml0IHRlc3RzIHJlbHkgb24gdGhpcyB0byB3b3JrIHdpdGggYW55IG9iamVjdFxuICAvLyBhc3NlcnRUd2Vha2VkT2JqZWN0KHBhdGhSb290T2JqZWN0LCBcInBhdGhSb290T2JqZWN0XCIpXG5cbiAgbGV0IGN1cnJlbnQ6IGFueSA9IHBhdGhSb290T2JqZWN0XG5cbiAgbGV0IGxlbiA9IHBhdGgubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIWlzT2JqZWN0KGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gdW5yZXNvbHZlZFxuICAgIH1cblxuICAgIGNvbnN0IHAgPSBwYXRoW2ldXG5cbiAgICAvLyBjaGVjayBqdXN0IHRvIGF2b2lkIG1vYnggd2FybmluZ3MgYWJvdXQgdHJ5aW5nIHRvIGFjY2VzcyBvdXQgb2YgYm91bmRzIGluZGV4XG4gICAgaWYgKGlzQXJyYXkoY3VycmVudCkgJiYgK3AgPj0gY3VycmVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bnJlc29sdmVkXG4gICAgfVxuXG4gICAgaWYgKGlzTW9kZWwoY3VycmVudCkpIHtcbiAgICAgIGNvbnN0IGRhdGFOb2RlID0gbW9kZWxUb0RhdGFOb2RlKGN1cnJlbnQpXG4gICAgICBpZiAocCBpbiBkYXRhTm9kZSkge1xuICAgICAgICBjdXJyZW50ID0gZGF0YU5vZGVcbiAgICAgIH0gZWxzZSBpZiAoIShwIGluIGN1cnJlbnQpKSB7XG4gICAgICAgIHJldHVybiB1bnJlc29sdmVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudCA9IGN1cnJlbnRbcF1cbiAgfVxuXG4gIHJldHVybiB7IHJlc29sdmVkOiB0cnVlLCB2YWx1ZTogY3VycmVudCB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBza2lwSWRDaGVja2luZyA9IFN5bWJvbChcInNraXBJZENoZWNraW5nXCIpXG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogVHJpZXMgdG8gcmVzb2x2ZSBhIHBhdGggZnJvbSBhbiBvYmplY3Qgd2hpbGUgY2hlY2tpbmcgaWRzLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZXR1cm5lZCB2YWx1ZSB0eXBlLlxuICogQHBhcmFtIHBhdGhSb290T2JqZWN0IE9iamVjdCB0aGF0IHNlcnZlcyBhcyBwYXRoIHJvb3QuXG4gKiBAcGFyYW0gcGF0aCBQYXRoIGFzIGFuIHN0cmluZyBvciBudW1iZXIgYXJyYXkuXG4gKiBAcGFyYW0gcGF0aElkcyBBbiBhcnJheSBvZiBpZHMgb2YgdGhlIG1vZGVscyB0aGF0IG11c3QgYmUgY2hlY2tlZCwgbnVsbCBpZiBub3QgYSBtb2RlbCBvciBgc2tpcElkQ2hlY2tpbmdgIHRvIHNraXAgaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBgeyByZXNvbHZlZDogdHJ1ZSwgdmFsdWU6IFQgfWAgb3IgYHsgcmVzb2x2ZWQ6IGZhbHNlIH1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGhDaGVja2luZ0lkczxUID0gYW55PihcbiAgcGF0aFJvb3RPYmplY3Q6IG9iamVjdCxcbiAgcGF0aDogUGF0aCxcbiAgcGF0aElkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudWxsIHwgdHlwZW9mIHNraXBJZENoZWNraW5nPlxuKTpcbiAgfCB7XG4gICAgICByZXNvbHZlZDogdHJ1ZVxuICAgICAgdmFsdWU6IFRcbiAgICB9XG4gIHwge1xuICAgICAgcmVzb2x2ZWQ6IGZhbHNlXG4gICAgICB2YWx1ZT86IHVuZGVmaW5lZFxuICAgIH0ge1xuICAvLyB1bml0IHRlc3RzIHJlbHkgb24gdGhpcyB0byB3b3JrIHdpdGggYW55IG9iamVjdFxuICAvLyBhc3NlcnRUd2Vha2VkT2JqZWN0KHBhdGhSb290T2JqZWN0LCBcInBhdGhSb290T2JqZWN0XCIpXG5cbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsVG9EYXRhTm9kZShwYXRoUm9vdE9iamVjdClcbiAgLy8gcm9vdCBpZCBpcyBuZXZlciBjaGVja2VkXG5cbiAgbGV0IGxlbiA9IHBhdGgubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIWlzT2JqZWN0KGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4geyByZXNvbHZlZDogZmFsc2UgfVxuICAgIH1cblxuICAgIGNvbnN0IHAgPSBwYXRoW2ldXG5cbiAgICAvLyBjaGVjayBqdXN0IHRvIGF2b2lkIG1vYnggd2FybmluZ3MgYWJvdXQgdHJ5aW5nIHRvIGFjY2VzcyBvdXQgb2YgYm91bmRzIGluZGV4XG4gICAgaWYgKGlzQXJyYXkoY3VycmVudCkgJiYgK3AgPj0gY3VycmVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IHJlc29sdmVkOiBmYWxzZSB9XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudE1heWJlTW9kZWwgPSBjdXJyZW50W3BdXG4gICAgY3VycmVudCA9IG1vZGVsVG9EYXRhTm9kZShjdXJyZW50TWF5YmVNb2RlbCBhcyBvYmplY3QpXG5cbiAgICBjb25zdCBleHBlY3RlZElkID0gcGF0aElkc1tpXVxuICAgIGlmIChleHBlY3RlZElkICE9PSBza2lwSWRDaGVja2luZykge1xuICAgICAgY29uc3QgY3VycmVudElkID0gaXNNb2RlbChjdXJyZW50TWF5YmVNb2RlbCkgPyBjdXJyZW50TWF5YmVNb2RlbFttb2RlbElkS2V5XSA/PyBudWxsIDogbnVsbFxuICAgICAgaWYgKGV4cGVjdGVkSWQgIT09IGN1cnJlbnRJZCkge1xuICAgICAgICByZXR1cm4geyByZXNvbHZlZDogZmFsc2UgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHJlc29sdmVkOiB0cnVlLCB2YWx1ZTogZGF0YVRvTW9kZWxOb2RlKGN1cnJlbnQpIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYXRoIHRvIGdldCBmcm9tIGEgcGFyZW50IHRvIGEgZ2l2ZW4gY2hpbGQuXG4gKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBjaGlsZCBpcyBhY3R1YWxseSB0aGUgZ2l2ZW4gcGFyZW50IG9yIHVuZGVmaW5lZCBpZiB0aGUgY2hpbGQgaXMgbm90IGEgY2hpbGQgb2YgdGhlIHBhcmVudC5cbiAqXG4gKiBAcGFyYW0gZnJvbVBhcmVudFxuICogQHBhcmFtIHRvQ2hpbGRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRUb0NoaWxkUGF0aChmcm9tUGFyZW50OiBvYmplY3QsIHRvQ2hpbGQ6IG9iamVjdCk6IFBhdGggfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KGZyb21QYXJlbnQsIFwiZnJvbVBhcmVudFwiKVxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRvQ2hpbGQsIFwidG9DaGlsZFwiKVxuXG4gIGlmIChmcm9tUGFyZW50ID09PSB0b0NoaWxkKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBwYXRoOiBXcml0YWJsZVBhdGggPSBbXVxuXG4gIGxldCBjdXJyZW50ID0gdG9DaGlsZFxuICBsZXQgcGFyZW50UGF0aFxuICB3aGlsZSAoKHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aChjdXJyZW50KSkpIHtcbiAgICBwYXRoLnVuc2hpZnQocGFyZW50UGF0aC5wYXRoKVxuXG4gICAgY3VycmVudCA9IHBhcmVudFBhdGgucGFyZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IGZyb21QYXJlbnQpIHtcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cbiIsImltcG9ydCB7IGZhc3RHZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgaXNDaGlsZE9mUGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoMlwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uLCBhc3NlcnRJc09iamVjdCwgZGVsZXRlRnJvbUFycmF5LCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIlxuXG4vKipcbiAqIEFuIGFjdGlvbiBtaWRkbGV3YXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbk1pZGRsZXdhcmUge1xuICAvKipcbiAgICogU3VidHJlZSByb290IG9iamVjdCAob2JqZWN0IGFuZCBjaGlsZCBvYmplY3RzKSB0aGlzIG1pZGRsZXdhcmUgd2lsbCBydW4gZm9yLlxuICAgKiBUaGlzIHRhcmdldCBcImZpbHRlclwiIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgY3VzdG9tIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnRyZWVSb290OiBvYmplY3RcblxuICAvKipcbiAgICogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gZGVjaWRlIGlmIGFuIGFjdGlvbiBtaWRkbGV3YXJlIGZ1bmN0aW9uIHNob3VsZCBiZSBydW4gb3Igbm90LlxuICAgKi9cbiAgZmlsdGVyPyhjdHg6IEFjdGlvbkNvbnRleHQpOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEFuIGFjdGlvbiBtaWRkbGV3YXJlIGZ1bmN0aW9uLlxuICAgKiBSZW1iZXIgdG8gYHJldHVybiBuZXh0KClgIGlmIHlvdSB3YW50IHRvIGNvbnRpbnVlIHRoZSBhY3Rpb24gb3IgdGhyb3cgaWYgeW91IHdhbnQgdG8gY2FuY2VsIGl0LlxuICAgKi9cbiAgbWlkZGxld2FyZShjdHg6IEFjdGlvbkNvbnRleHQsIG5leHQ6ICgpID0+IGFueSk6IGFueVxufVxuXG4vKipcbiAqIFRoZSBkaXNwb3NlciBvZiBhbiBhY3Rpb24gbWlkZGxld2FyZS5cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyID0gKCkgPT4gdm9pZFxuXG50eXBlIFBhcnRpYWxBY3Rpb25NaWRkbGV3YXJlID0gUGljazxBY3Rpb25NaWRkbGV3YXJlLCBcImZpbHRlclwiIHwgXCJtaWRkbGV3YXJlXCI+XG5cbmNvbnN0IHBlck9iamVjdEFjdGlvbk1pZGRsZXdhcmVzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBQYXJ0aWFsQWN0aW9uTWlkZGxld2FyZVtdPigpXG5cbmludGVyZmFjZSBBY3Rpb25NaWRkbGV3YXJlc0l0ZXJhdG9yIGV4dGVuZHMgSXRlcmFibGU8UGFydGlhbEFjdGlvbk1pZGRsZXdhcmU+IHt9XG5cbmNvbnN0IHBlck9iamVjdEFjdGlvbk1pZGRsZXdhcmVzSXRlcmF0b3IgPSBuZXcgV2Vha01hcDxvYmplY3QsIEFjdGlvbk1pZGRsZXdhcmVzSXRlcmF0b3I+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGlvbiBtaWRkbGV3YXJlcyB0byBiZSBydW4gb3ZlciBhIGdpdmVuIG9iamVjdCBhcyBhbiBpdGVyYWJsZSBvYmplY3QuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvbk1pZGRsZXdhcmVzKG9iajogb2JqZWN0KTogQWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvciB7XG4gIC8vIHdoZW4gd2UgY2FsbCBhIG1pZGRsZXdhcmUgd2Ugd2lsbCBjYWxsIHRoZSBtaWRkbGV3YXJlcyBvZiB0aGF0IG9iamVjdCBwbHVzIGFsbCBwYXJlbnQgb2JqZWN0c1xuICAvLyB0aGUgcGFyZW50IG9iamVjdCBtaWRkbGV3YXJlcyBhcmUgcnVuIGxhc3RcblxuICAvLyBzaW5jZSBhbiBhcnJheSBsaWtlIFthLCBiLCBjXSB3aWxsIGJlIGNhbGxlZCBsaWtlIGMoYihhKCkpKSB0aGlzIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBwdXRcbiAgLy8gdGhlIHBhcmVudCBvYmplY3Qgb25lcyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheVxuXG4gIGxldCBpdGVyYWJsZSA9IHBlck9iamVjdEFjdGlvbk1pZGRsZXdhcmVzSXRlcmF0b3IuZ2V0KG9iailcbiAgaWYgKCFpdGVyYWJsZSkge1xuICAgIGl0ZXJhYmxlID0ge1xuICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSBvYmpcblxuICAgICAgICBmdW5jdGlvbiBnZXRDdXJyZW50SXRlcmF0b3IoKSB7XG4gICAgICAgICAgY29uc3Qgb2JqTXdhcmVzID0gY3VycmVudCA/IHBlck9iamVjdEFjdGlvbk1pZGRsZXdhcmVzLmdldChjdXJyZW50KSA6IHVuZGVmaW5lZFxuICAgICAgICAgIGlmICghb2JqTXdhcmVzIHx8IG9iak13YXJlcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqTXdhcmVzW1N5bWJvbC5pdGVyYXRvcl0oKVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZmluZE5leHRJdGVyYXRvcigpIHtcbiAgICAgICAgICBsZXQgbmV4dEl0ZXJcbiAgICAgICAgICB3aGlsZSAoY3VycmVudCAmJiAhbmV4dEl0ZXIpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBmYXN0R2V0UGFyZW50KGN1cnJlbnQpXG4gICAgICAgICAgICBuZXh0SXRlciA9IGdldEN1cnJlbnRJdGVyYXRvcigpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXh0SXRlclxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ZXIgPSBnZXRDdXJyZW50SXRlcmF0b3IoKVxuICAgICAgICBpZiAoIWl0ZXIpIHtcbiAgICAgICAgICBpdGVyID0gZmluZE5leHRJdGVyYXRvcigpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVyYXRvcjogSXRlcmF0b3I8UGFydGlhbEFjdGlvbk1pZGRsZXdhcmU+ID0ge1xuICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICBpZiAoIWl0ZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBpdGVyLm5leHQoKVxuICAgICAgICAgICAgaWYgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZXIgPSBmaW5kTmV4dEl0ZXJhdG9yKClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICAgIH0sXG4gICAgfVxuICAgIHBlck9iamVjdEFjdGlvbk1pZGRsZXdhcmVzSXRlcmF0b3Iuc2V0KG9iaiwgaXRlcmFibGUpXG4gIH1cbiAgcmV0dXJuIGl0ZXJhYmxlXG59XG5cbi8qKlxuICogQWRkcyBhIGdsb2JhbCBhY3Rpb24gbWlkZGxld2FyZSB0byBiZSBydW4gd2hlbiBhbiBhY3Rpb24gaXMgcGVyZm9ybWVkLlxuICogSXQgaXMgdXN1YWxseSBwcmVmZXJhYmxlIHRvIHVzZSBgb25BY3Rpb25NaWRkbGV3YXJlYCBpbnN0ZWFkIHRvIGxpbWl0IGl0IHRvIGEgZ2l2ZW4gdHJlZSBhbmQgb25seSB0byB0b3Btb3N0IGxldmVsIGFjdGlvbnNcbiAqIG9yIGBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmVgIGZvciBhIHNpbXBsaWZpZWQgbWlkZGxld2FyZS5cbiAqXG4gKiBAcGFyYW0gbXdhcmUgQWN0aW9uIG1pZGRsZXdhcmUgdG8gYmUgcnVuLlxuICogQHJldHVybnMgQSBkaXNwb3NlciB0byBjYW5jZWwgdGhlIG1pZGRsZXdhcmUuIE5vdGUgdGhhdCBpZiB5b3UgZG9uJ3QgcGxhbiB0byBkbyBhbiBlYXJseSBkaXNwb3NhbCBvZiB0aGUgbWlkZGxld2FyZVxuICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGJlY29tZXMgb3B0aW9uYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRBY3Rpb25NaWRkbGV3YXJlKG13YXJlOiBBY3Rpb25NaWRkbGV3YXJlKTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIHtcbiAgYXNzZXJ0SXNPYmplY3QobXdhcmUsIFwibWlkZGxld2FyZVwiKVxuXG4gIGxldCB7IG1pZGRsZXdhcmUsIGZpbHRlciwgc3VidHJlZVJvb3QgfSA9IG13YXJlXG5cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJtaWRkbGV3YXJlLnN1YnRyZWVSb290XCIpXG4gIGFzc2VydElzRnVuY3Rpb24obWlkZGxld2FyZSwgXCJtaWRkbGV3YXJlLm1pZGRsZXdhcmVcIilcbiAgaWYgKGZpbHRlciAmJiB0eXBlb2YgZmlsdGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwibWlkZGxld2FyZS5maWx0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZFwiKVxuICB9XG5cbiAgLy8gcmVtaW5kZXI6IG5ldmVyIHR1cm4gbWlkZGxld2FyZXMgaW50byBhY3Rpb25zIG9yIGVsc2VcbiAgLy8gcmVhY3Rpb25zIHdpbGwgbm90IGJlIHBpY2tlZCB1cCBieSB0aGUgdW5kbyBtYW5hZ2VyXG5cbiAgaWYgKHN1YnRyZWVSb290KSB7XG4gICAgY29uc3QgdGFyZ2V0RmlsdGVyID0gKGN0eDogQWN0aW9uQ29udGV4dCkgPT5cbiAgICAgIGN0eC50YXJnZXQgPT09IHN1YnRyZWVSb290IHx8IGlzQ2hpbGRPZlBhcmVudChjdHgudGFyZ2V0LCBzdWJ0cmVlUm9vdCEpXG5cbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgZmlsdGVyID0gdGFyZ2V0RmlsdGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1c3RvbUZpbHRlciA9IGZpbHRlclxuICAgICAgZmlsdGVyID0gKGN0eCkgPT4ge1xuICAgICAgICByZXR1cm4gdGFyZ2V0RmlsdGVyKGN0eCkgJiYgY3VzdG9tRmlsdGVyKGN0eClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBhY3R1YWxNd2FyZSA9IHsgbWlkZGxld2FyZSwgZmlsdGVyIH1cblxuICBsZXQgb2JqTXdhcmVzID0gcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXMuZ2V0KHN1YnRyZWVSb290KSFcbiAgaWYgKCFvYmpNd2FyZXMpIHtcbiAgICBvYmpNd2FyZXMgPSBbYWN0dWFsTXdhcmVdXG4gICAgcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXMuc2V0KHN1YnRyZWVSb290LCBvYmpNd2FyZXMpXG4gIH0gZWxzZSB7XG4gICAgb2JqTXdhcmVzLnB1c2goYWN0dWFsTXdhcmUpXG4gIH1cblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRlbGV0ZUZyb21BcnJheShvYmpNd2FyZXMsIGFjdHVhbE13YXJlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHtcbiAgQWN0aW9uQ29udGV4dCxcbiAgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUsXG4gIGdldEN1cnJlbnRBY3Rpb25Db250ZXh0LFxuICBzZXRDdXJyZW50QWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyBpc01vZGVsQWN0aW9uLCBtb2RlbEFjdGlvblN5bWJvbCB9IGZyb20gXCIuL2lzTW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgZ2V0QWN0aW9uTWlkZGxld2FyZXMgfSBmcm9tIFwiLi9taWRkbGV3YXJlXCJcbmltcG9ydCB0eXBlIHsgRmxvd0ZpbmlzaGVyIH0gZnJvbSBcIi4vbW9kZWxGbG93XCJcbmltcG9ydCB7IHRyeVJ1blBlbmRpbmdBY3Rpb25zIH0gZnJvbSBcIi4vcGVuZGluZ0FjdGlvbnNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGbiA9IChjdHg6IE8uV3JpdGFibGU8QWN0aW9uQ29udGV4dD4sIHNlbGY6IGFueSkgPT4gdm9pZFxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEluQWN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbj4oe1xuICBuYW1lT3JOYW1lRm4sXG4gIGZuLFxuICBhY3Rpb25UeXBlLFxuICBvdmVycmlkZUNvbnRleHQsXG4gIGlzRmxvd0ZpbmlzaGVyID0gZmFsc2UsXG59OiB7XG4gIG5hbWVPck5hbWVGbjogc3RyaW5nIHwgKCgpID0+IHN0cmluZylcbiAgZm46IFRcbiAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGVcbiAgb3ZlcnJpZGVDb250ZXh0PzogV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm5cbiAgaXNGbG93RmluaXNoZXI/OiBib29sZWFuXG59KTogVCB7XG4gIGxldCBmbkluQWN0aW9uID0gZmFsc2VcblxuICBjb25zdCB3cmFwcGVkQWN0aW9uID0gZnVuY3Rpb24gKHRoaXM6IGFueSkge1xuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgbmFtZU9yTmFtZUZuID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lT3JOYW1lRm4oKSA6IG5hbWVPck5hbWVGblxuXG4gICAgaWYgKCFmbkluQWN0aW9uKSB7XG4gICAgICBmbkluQWN0aW9uID0gdHJ1ZVxuXG4gICAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugb25seSBpbm5lciBhY3Rpb25zIGFjdHVhbCBtb2J4IGFjdGlvbnNcbiAgICAgIC8vIHNvIHJlYWN0aW9ucyAoZS5nLiByZWZlcmVuY2UgZGV0YWNoaW5nKSBhcmUgcGlja2VkIHVwIGluIHRoZVxuICAgICAgLy8gcmlnaHQgY29udGV4dFxuICAgICAgZm4gPSBhY3Rpb24obmFtZSwgZm4pXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpc1xuXG4gICAgY29uc3QgcGFyZW50Q29udGV4dCA9IGdldEN1cnJlbnRBY3Rpb25Db250ZXh0KClcblxuICAgIGNvbnN0IGNvbnRleHQ6IE8uV3JpdGFibGU8QWN0aW9uQ29udGV4dD4gPSB7XG4gICAgICBhY3Rpb25OYW1lOiBuYW1lLFxuICAgICAgdHlwZTogYWN0aW9uVHlwZSxcbiAgICAgIHRhcmdldCxcbiAgICAgIGFyZ3M6IEFycmF5LmZyb20oYXJndW1lbnRzKSxcbiAgICAgIHBhcmVudENvbnRleHQsXG4gICAgICBkYXRhOiB7fSxcbiAgICAgIHJvb3RDb250ZXh0OiB1bmRlZmluZWQgYXMgYW55LCAvLyB3aWxsIGJlIHNldCBhZnRlciB0aGUgb3ZlcnJpZGVcbiAgICB9XG4gICAgaWYgKG92ZXJyaWRlQ29udGV4dCkge1xuICAgICAgb3ZlcnJpZGVDb250ZXh0KGNvbnRleHQsIHRoaXMpXG4gICAgfVxuICAgIGlmICghY29udGV4dC5yb290Q29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQucm9vdENvbnRleHQgPSBjb250ZXh0LnByZXZpb3VzQXN5bmNTdGVwQ29udGV4dC5yb290Q29udGV4dFxuICAgICAgfSBlbHNlIGlmIChjb250ZXh0LnBhcmVudENvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC5yb290Q29udGV4dCA9IGNvbnRleHQucGFyZW50Q29udGV4dC5yb290Q29udGV4dFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5yb290Q29udGV4dCA9IGNvbnRleHRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDdXJyZW50QWN0aW9uQ29udGV4dChjb250ZXh0KVxuXG4gICAgbGV0IG13YXJlRm46ICgpID0+IGFueSA9IGZuLmJpbmQodGFyZ2V0LCAuLi5hcmd1bWVudHMpXG4gICAgY29uc3QgbXdhcmVJdGVyID0gZ2V0QWN0aW9uTWlkZGxld2FyZXMoY29udGV4dC50YXJnZXQpW1N5bWJvbC5pdGVyYXRvcl0oKVxuICAgIGxldCBtd2FyZUN1ciA9IG13YXJlSXRlci5uZXh0KClcbiAgICB3aGlsZSAoIW13YXJlQ3VyLmRvbmUpIHtcbiAgICAgIGNvbnN0IG13YXJlID0gbXdhcmVDdXIudmFsdWVcblxuICAgICAgY29uc3QgZmlsdGVyUGFzc2VkID0gbXdhcmUuZmlsdGVyID8gbXdhcmUuZmlsdGVyKGNvbnRleHQpIDogdHJ1ZVxuICAgICAgaWYgKGZpbHRlclBhc3NlZCkge1xuICAgICAgICBtd2FyZUZuID0gbXdhcmUubWlkZGxld2FyZS5iaW5kKHVuZGVmaW5lZCwgY29udGV4dCwgbXdhcmVGbilcbiAgICAgIH1cblxuICAgICAgbXdhcmVDdXIgPSBtd2FyZUl0ZXIubmV4dCgpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IG13YXJlRm4oKVxuXG4gICAgICBpZiAoaXNGbG93RmluaXNoZXIpIHtcbiAgICAgICAgY29uc3QgZmxvd0ZpbmlzaGVyID0gcmV0IGFzIEZsb3dGaW5pc2hlclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZsb3dGaW5pc2hlci52YWx1ZVxuICAgICAgICBpZiAoZmxvd0ZpbmlzaGVyLnJlc29sdXRpb24gPT09IFwiYWNjZXB0XCIpIHtcbiAgICAgICAgICBmbG93RmluaXNoZXIuYWNjZXB0ZXIodmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLnJlamVjdGVyKHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSAvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIGV2ZW4gbmVlZGVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmV0XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRBY3Rpb25Db250ZXh0KGNvbnRleHQucGFyZW50Q29udGV4dClcblxuICAgICAgdHJ5UnVuUGVuZGluZ0FjdGlvbnMoKVxuICAgIH1cbiAgfVxuICA7KHdyYXBwZWRBY3Rpb24gYXMgYW55KVttb2RlbEFjdGlvblN5bWJvbF0gPSB0cnVlXG5cbiAgcmV0dXJuIHdyYXBwZWRBY3Rpb24gYXMgYW55XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBwcm9wZXJ0eUtleToga2V5b2YgTSxcbiAgbmFtZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3QgZm4gPSBtb2RlbFtwcm9wZXJ0eUtleV0gYXMgYW55XG4gIGlmIChpc01vZGVsQWN0aW9uKGZuKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgd3JhcHBlZEZuID0gd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgZm4sXG4gICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgfSlcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpXG4gIGNvbnN0IHByb3RvRm4gPSBwcm90b1twcm9wZXJ0eUtleV1cbiAgaWYgKHByb3RvRm4gPT09IGZuKSB7XG4gICAgcHJvdG9bcHJvcGVydHlLZXldID0gd3JhcHBlZEZuXG4gIH0gZWxzZSB7XG4gICAgbW9kZWxbcHJvcGVydHlLZXldID0gd3JhcHBlZEZuXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZUFycmF5LCBpc09ic2VydmFibGVPYmplY3QsIHJlbW92ZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGhJbmNsdWRpbmdEYXRhT2JqZWN0cyB9IGZyb20gXCIuL3BhdGhcIlxuXG4vKipcbiAqIERldGFjaGVzIGEgZ2l2ZW4gb2JqZWN0IGZyb20gYSB0cmVlLlxuICogSWYgdGhlIHBhcmVudCBpcyBhbiBvYmplY3QgLyBtb2RlbCwgZGV0YWNoaW5nIHdpbGwgZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAqIElmIHRoZSBwYXJlbnQgaXMgYW4gYXJyYXkgZGV0YWNoaW5nIHdpbGwgcmVtb3ZlIHRoZSBub2RlIGJ5IHNwbGljaW5nIGl0LlxuICogSWYgdGhlcmUncyBubyBwYXJlbnQgaXQgd2lsbCB0aHJvdy5cbiAqXG4gKiBAcGFyYW0gbm9kZSBPYmplY3QgdG8gYmUgZGV0YWNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRhY2gobm9kZTogb2JqZWN0KTogdm9pZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgd3JhcHBlZEludGVybmFsRGV0YWNoKCkuY2FsbChub2RlKVxufVxuXG5jb25zdCB3cmFwcGVkSW50ZXJuYWxEZXRhY2ggPSBsYXp5KCgpID0+XG4gIHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBCdWlsdEluQWN0aW9uLkRldGFjaCxcbiAgICBmbjogaW50ZXJuYWxEZXRhY2gsXG4gICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgfSlcbilcblxuZnVuY3Rpb24gaW50ZXJuYWxEZXRhY2godGhpczogb2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IG5vZGUgPSB0aGlzXG5cbiAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoSW5jbHVkaW5nRGF0YU9iamVjdHMobm9kZSlcbiAgaWYgKCFwYXJlbnRQYXRoKSByZXR1cm5cblxuICBjb25zdCB7IHBhcmVudCwgcGF0aCB9ID0gcGFyZW50UGF0aFxuICBpZiAoaXNPYnNlcnZhYmxlQXJyYXkocGFyZW50KSkge1xuICAgIHBhcmVudC5zcGxpY2UoK3BhdGgsIDEpXG4gIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHBhcmVudCkpIHtcbiAgICByZW1vdmUocGFyZW50LCBcIlwiICsgcGF0aClcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwicGFyZW50IG11c3QgYmUgYW4gb2JzZXJ2YWJsZSBvYmplY3Qgb3IgYW4gb2JzZXJ2YWJsZSBhcnJheVwiKVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja01vZGVsRGVjb3JhdG9yQXJncyhmbk5hbWU6IHN0cmluZywgdGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eUtleSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IGZhaWx1cmUoYCR7Zm5OYW1lfSBjYW5ub3QgYmUgdXNlZCBvdmVyIHN5bWJvbCBwcm9wZXJ0aWVzYClcbiAgfVxuXG4gIGNvbnN0IGVyck1lc3NhZ2UgPSBgJHtmbk5hbWV9IG11c3QgYmUgdXNlZCBvdmVyIG1vZGVsIGNsYXNzZXMgb3IgaW5zdGFuY2VzYFxuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgLy8gY2hlY2sgdGFyZ2V0IGlzIGEgbW9kZWwgb2JqZWN0IG9yIGV4dGVuZGVkIGNsYXNzXG4gIGNvbnN0IGlzTW9kZWwgPVxuICAgIHRhcmdldCBpbnN0YW5jZW9mIEJhc2VNb2RlbCB8fCB0YXJnZXQgPT09IEJhc2VNb2RlbCB8fCB0YXJnZXQucHJvdG90eXBlIGluc3RhbmNlb2YgQmFzZU1vZGVsXG4gIGlmIChpc01vZGVsKSByZXR1cm5cblxuICBjb25zdCBpc0RhdGFNb2RlbCA9XG4gICAgdGFyZ2V0IGluc3RhbmNlb2YgQmFzZURhdGFNb2RlbCB8fFxuICAgIHRhcmdldCA9PT0gQmFzZURhdGFNb2RlbCB8fFxuICAgIHRhcmdldC5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlRGF0YU1vZGVsXG4gIGlmIChpc0RhdGFNb2RlbCkgcmV0dXJuXG5cbiAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxufVxuIiwiaW1wb3J0IHsgc2V0RGF0YU1vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9hY3Rpb25zXCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsLCBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBydW5BZnRlck1vZGVsRGVjb3JhdG9yU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQgeyBhZGRMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbiB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGbiB9IGZyb20gXCIuL3dyYXBJbkFjdGlvblwiXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25OYW1lQW5kQ29udGV4dE92ZXJyaWRlKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZ1xuKToge1xuICBhY3Rpb25OYW1lOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKVxuICBvdmVycmlkZUNvbnRleHQ6IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuIHwgdW5kZWZpbmVkXG59IHtcbiAgbGV0IGFjdGlvbk5hbWU6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpID0gcHJvcGVydHlLZXlcbiAgbGV0IG92ZXJyaWRlQ29udGV4dDogV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gfCB1bmRlZmluZWRcblxuICBpZiAoaXNEYXRhTW9kZWxDbGFzcyh0YXJnZXQpIHx8IGlzRGF0YU1vZGVsKHRhcmdldCkpIHtcbiAgICBvdmVycmlkZUNvbnRleHQgPSAoY3R4LCBzZWxmKSA9PiB7XG4gICAgICBjdHgudGFyZ2V0ID0gc2VsZi4kXG4gICAgfVxuXG4gICAgbGV0IGZ1bGxBY3Rpb25OYW1lOiBzdHJpbmdcbiAgICBhY3Rpb25OYW1lID0gKCkgPT4gZnVsbEFjdGlvbk5hbWVcblxuICAgIGNvbnN0IG1vZGVsQ2xhc3M6IGFueSA9IGlzRGF0YU1vZGVsQ2xhc3ModGFyZ2V0KSA/IHRhcmdldCA6IHRhcmdldC5jb25zdHJ1Y3RvclxuXG4gICAgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24obW9kZWxDbGFzcywgcnVuQWZ0ZXJNb2RlbERlY29yYXRvclN5bWJvbCwgKGZpbmFsQ2xhc3MpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KGZpbmFsQ2xhc3MpIVxuICAgICAgZnVsbEFjdGlvbk5hbWUgPSBgZm46OiR7bW9kZWxJbmZvLm5hbWV9Ojoke3Byb3BlcnR5S2V5fWBcbiAgICAgIHNldERhdGFNb2RlbEFjdGlvbihmdWxsQWN0aW9uTmFtZSwgbW9kZWxJbmZvLmNsYXNzLCBwcm9wZXJ0eUtleSlcbiAgICB9KVxuICB9XG4gIHJldHVybiB7IGFjdGlvbk5hbWUsIG92ZXJyaWRlQ29udGV4dCB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHsgY2hlY2tNb2RlbERlY29yYXRvckFyZ3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvY2hlY2tNb2RlbERlY29yYXRvckFyZ3NcIlxuaW1wb3J0IHsgZGVjb3JhdGVXcmFwTWV0aG9kT3JGaWVsZCwgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRBY3Rpb25OYW1lQW5kQ29udGV4dE92ZXJyaWRlIH0gZnJvbSBcIi4vYWN0aW9uRGVjb3JhdG9yVXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dCwgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUsIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlIH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24sIFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxuY29uc3QgbW9kZWxGbG93U3ltYm9sID0gU3ltYm9sKFwibW9kZWxGbG93XCIpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG93PFIsIEFyZ3MgZXh0ZW5kcyBhbnlbXT4oe1xuICBuYW1lT3JOYW1lRm4sXG4gIGdlbmVyYXRvcixcbiAgb3ZlcnJpZGVDb250ZXh0LFxufToge1xuICBuYW1lT3JOYW1lRm46IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpXG4gIGdlbmVyYXRvcjogKC4uLmFyZ3M6IEFyZ3MpID0+IEl0ZXJhYmxlSXRlcmF0b3I8YW55PlxuICBvdmVycmlkZUNvbnRleHQ/OiBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGblxufSk6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPGFueT4ge1xuICAvLyBJbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vdGovY28vYmxvYi9tYXN0ZXIvaW5kZXguanNcbiAgY29uc3QgZmxvd0ZuID0gZnVuY3Rpb24gKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVPck5hbWVGbiA9PT0gXCJmdW5jdGlvblwiID8gbmFtZU9yTmFtZUZuKCkgOiBuYW1lT3JOYW1lRm5cblxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXNcblxuICAgIGxldCBwcmV2aW91c0FzeW5jU3RlcENvbnRleHQ6IEFjdGlvbkNvbnRleHQgfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IGN0eE92ZXJyaWRlID0gKHN0ZXBUeXBlOiBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZSk6IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuID0+IHtcbiAgICAgIHJldHVybiAoY3R4OiBPLldyaXRhYmxlPEFjdGlvbkNvbnRleHQ+LCBzZWxmKSA9PiB7XG4gICAgICAgIGlmIChvdmVycmlkZUNvbnRleHQpIHtcbiAgICAgICAgICBvdmVycmlkZUNvbnRleHQoY3R4LCBzZWxmKVxuICAgICAgICB9XG5cbiAgICAgICAgY3R4LnByZXZpb3VzQXN5bmNTdGVwQ29udGV4dCA9IHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dFxuICAgICAgICBjdHguc3Bhd25Bc3luY1N0ZXBDb250ZXh0ID0gcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0XG4gICAgICAgICAgPyBwcmV2aW91c0FzeW5jU3RlcENvbnRleHQuc3Bhd25Bc3luY1N0ZXBDb250ZXh0XG4gICAgICAgICAgOiBjdHhcbiAgICAgICAgY3R4LmFzeW5jU3RlcFR5cGUgPSBzdGVwVHlwZVxuICAgICAgICBjdHguYXJncyA9IGFyZ3NcblxuICAgICAgICBwcmV2aW91c0FzeW5jU3RlcENvbnRleHQgPSBjdHhcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdG9yUnVuID0gZmFsc2VcbiAgICBjb25zdCBnZW4gPSB3cmFwSW5BY3Rpb24oe1xuICAgICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgICAgZm46ICgpID0+IHtcbiAgICAgICAgZ2VuZXJhdG9yUnVuID0gdHJ1ZVxuICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmFwcGx5KHRhcmdldCwgYXJncyBhcyBBcmdzKVxuICAgICAgfSxcbiAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jLFxuICAgICAgb3ZlcnJpZGVDb250ZXh0OiBjdHhPdmVycmlkZShBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5TcGF3biksXG4gICAgfSkuYXBwbHkodGFyZ2V0KVxuXG4gICAgaWYgKCFnZW5lcmF0b3JSdW4pIHtcbiAgICAgIC8vIG1heWJlIGl0IGdvdCBvdmVycmlkZGVuIGludG8gYSBzeW5jIGFjdGlvblxuXG4gICAgICByZXR1cm4gZ2VuIGluc3RhbmNlb2YgUHJvbWlzZSA/IGdlbiA6IFByb21pc2UucmVzb2x2ZShnZW4pXG4gICAgfVxuXG4gICAgLy8gdXNlIGJvdW5kIGZ1bmN0aW9ucyB0byBmaXggZXM2IGNvbXBpbGF0aW9uXG4gICAgY29uc3QgZ2VuTmV4dCA9IGdlbi5uZXh0LmJpbmQoZ2VuKVxuICAgIGNvbnN0IGdlblRocm93ID0gZ2VuLnRocm93IS5iaW5kKGdlbilcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxSPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxlZChyZXM6IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgcmV0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgICAgICAgIGZuOiBnZW5OZXh0LFxuICAgICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICAgICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJlc3VtZSksXG4gICAgICAgICAgfSkuY2FsbCh0YXJnZXQsIHJlcylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICAgICAgICBmbjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIC8vIHdlIHVzZSBhIGZsb3cgZmluaXNoZXIgdG8gYWxsb3cgbWlkZGxld2FyZXMgdG8gdHdlYWsgdGhlIHJldHVybiB2YWx1ZSBiZWZvcmUgcmVzb2x1dGlvblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBlcnIsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogXCJyZWplY3RcIixcblxuICAgICAgICAgICAgICAgIGFjY2VwdGVyOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdGVyOiByZWplY3QsXG4gICAgICAgICAgICAgIH0gYXMgRmxvd0ZpbmlzaGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICAgICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlRocm93KSxcbiAgICAgICAgICAgIGlzRmxvd0ZpbmlzaGVyOiB0cnVlLFxuICAgICAgICAgIH0pLmNhbGwodGFyZ2V0LCBlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dChyZXQpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0ZWQoZXJyOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJldFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldCA9IHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICAgICAgICBmbjogZ2VuVGhyb3csXG4gICAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgICAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lRXJyb3IpLFxuICAgICAgICAgIH0pLmNhbGwodGFyZ2V0LCBlcnIpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgICAgICAgICAgZm46IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSBmbG93IGZpbmlzaGVyIHRvIGFsbG93IG1pZGRsZXdhcmVzIHRvIHR3ZWFrIHRoZSByZXR1cm4gdmFsdWUgYmVmb3JlIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXJyLFxuICAgICAgICAgICAgICAgIHJlc29sdXRpb246IFwicmVqZWN0XCIsXG5cbiAgICAgICAgICAgICAgICBhY2NlcHRlcjogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3RlcjogcmVqZWN0LFxuICAgICAgICAgICAgICB9IGFzIEZsb3dGaW5pc2hlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jLFxuICAgICAgICAgICAgb3ZlcnJpZGVDb250ZXh0OiBjdHhPdmVycmlkZShBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5UaHJvdyksXG4gICAgICAgICAgICBpc0Zsb3dGaW5pc2hlcjogdHJ1ZSxcbiAgICAgICAgICB9KS5jYWxsKHRhcmdldCwgZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHQocmV0KVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBuZXh0KHJldDogYW55KTogdm9pZCB7XG4gICAgICAgIGlmIChyZXQgJiYgdHlwZW9mIHJldC50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBhbiBhc3luYyBpdGVyYXRvclxuICAgICAgICAgIHJldC50aGVuKG5leHQsIHJlamVjdClcbiAgICAgICAgfSBlbHNlIGlmIChyZXQuZG9uZSkge1xuICAgICAgICAgIC8vIGRvbmVcbiAgICAgICAgICB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgICAgICAgICAgZm46ICh2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSBmbG93IGZpbmlzaGVyIHRvIGFsbG93IG1pZGRsZXdhcmVzIHRvIHR3ZWFrIHRoZSByZXR1cm4gdmFsdWUgYmVmb3JlIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgICAgICAgICAgIHJlc29sdXRpb246IFwiYWNjZXB0XCIsXG5cbiAgICAgICAgICAgICAgICBhY2NlcHRlcjogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3RlcjogcmVqZWN0LFxuICAgICAgICAgICAgICB9IGFzIEZsb3dGaW5pc2hlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jLFxuICAgICAgICAgICAgb3ZlcnJpZGVDb250ZXh0OiBjdHhPdmVycmlkZShBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXR1cm4pLFxuICAgICAgICAgICAgaXNGbG93RmluaXNoZXI6IHRydWUsXG4gICAgICAgICAgfSkuY2FsbCh0YXJnZXQsIHJldC52YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb250aW51ZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXQudmFsdWUpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb25GdWxmaWxsZWQodW5kZWZpbmVkKSAvLyBraWNrIG9mZiB0aGUgcHJvY2Vzc1xuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG4gIDsoZmxvd0ZuIGFzIGFueSlbbW9kZWxGbG93U3ltYm9sXSA9IHRydWVcblxuICByZXR1cm4gZmxvd0ZuXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0ZpbmlzaGVyIHtcbiAgdmFsdWU6IGFueVxuICByZXNvbHV0aW9uOiBcImFjY2VwdFwiIHwgXCJyZWplY3RcIlxuXG4gIGFjY2VwdGVyKHZhbHVlOiBhbnkpOiB2b2lkXG4gIHJlamVjdGVyKHZhbHVlOiBhbnkpOiB2b2lkXG59XG5cbi8qKlxuICogUmV0dXJucyBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYSBtb2RlbCBmbG93IG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbEZsb3coZm46IHVua25vd24pIHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiICYmIG1vZGVsRmxvd1N5bWJvbCBpbiBmblxufVxuXG4vKipcbiAqIERlY29yYXRvciB0aGF0IHR1cm5zIGEgZnVuY3Rpb24gZ2VuZXJhdG9yIGludG8gYSBtb2RlbCBmbG93LlxuICpcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleVxuICogQHBhcmFtIFtiYXNlRGVzY3JpcHRvcl1cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEZsb3coXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICBiYXNlRGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuKTogdm9pZCB7XG4gIGNvbnN0IHsgYWN0aW9uTmFtZSwgb3ZlcnJpZGVDb250ZXh0IH0gPSBnZXRBY3Rpb25OYW1lQW5kQ29udGV4dE92ZXJyaWRlKHRhcmdldCwgcHJvcGVydHlLZXkpXG5cbiAgcmV0dXJuIGRlY29yYXRlV3JhcE1ldGhvZE9yRmllbGQoXG4gICAgXCJtb2RlbEZsb3dcIixcbiAgICB7XG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleSxcbiAgICAgIGJhc2VEZXNjcmlwdG9yLFxuICAgIH0sXG4gICAgKGRhdGEsIGZuKSA9PiB7XG4gICAgICBpZiAoaXNNb2RlbEZsb3coZm4pKSB7XG4gICAgICAgIHJldHVybiBmblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tNb2RlbEZsb3dBcmdzKGRhdGEudGFyZ2V0LCBkYXRhLnByb3BlcnR5S2V5LCBmbilcblxuICAgICAgICByZXR1cm4gZmxvdyh7IG5hbWVPck5hbWVGbjogYWN0aW9uTmFtZSwgZ2VuZXJhdG9yOiBmbiwgb3ZlcnJpZGVDb250ZXh0IH0pXG4gICAgICB9XG4gICAgfVxuICApXG59XG5cbmZ1bmN0aW9uIGNoZWNrTW9kZWxGbG93QXJncyh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwibW9kZWxGbG93IGhhcyB0byBiZSB1c2VkIG92ZXIgZnVuY3Rpb25zXCIpXG4gIH1cbiAgY2hlY2tNb2RlbERlY29yYXRvckFyZ3MoXCJtb2RlbEZsb3dcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSlcbn1cblxuLyoqXG4gKiBUcmlja3MgdGhlIFRTIGNvbXBpbGVyIGludG8gdGhpbmtpbmcgdGhhdCBhIG1vZGVsIGZsb3cgZ2VuZXJhdG9yIGZ1bmN0aW9uIGNhbiBiZSBhd2FpdGVkXG4gKiAoaXMgYSBwcm9taXNlKS5cbiAqXG4gKiBAdHlwZXBhcmFtIEEgRnVuY3Rpb24gYXJndW1lbnRzLlxuICogQHR5cGVwYXJhbSBSIFJldHVybiB2YWx1ZS5cbiAqIEBwYXJhbSBmbiBGbG93IGZ1bmN0aW9uLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hc3luYzxBIGV4dGVuZHMgYW55W10sIFI+KFxuICBmbjogKC4uLmFyZ3M6IEEpID0+IEdlbmVyYXRvcjxhbnksIFIsIGFueT5cbik6ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IHtcbiAgcmV0dXJuIGZuIGFzIGFueVxufVxuXG4vKipcbiAqIE1ha2VzIGEgcHJvbWlzZSBhIGZsb3csIHNvIGl0IGNhbiBiZSBhd2FpdGVkIHdpdGggeWllbGQqLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQcm9taXNlIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHByb21pc2UgUHJvbWlzZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYXdhaXQ8VD4ocHJvbWlzZTogUHJvbWlzZTxUPik6IEdlbmVyYXRvcjxQcm9taXNlPFQ+LCBULCB1bmtub3duPiB7XG4gIHJldHVybiBwcm9taXNlR2VuZXJhdG9yLmNhbGwocHJvbWlzZSlcbn1cblxuLypcbmZ1bmN0aW9uKiBwcm9taXNlR2VuZXJhdG9yPFQ+KFxuICB0aGlzOiBQcm9taXNlPFQ+XG4pIHtcbiAgY29uc3QgcmV0OiBUID0geWllbGQgdGhpc1xuICByZXR1cm4gcmV0XG59XG4qL1xuXG4vLyBhYm92ZSBjb2RlIGJ1dCBjb21waWxlZCBieSBUUyBmb3IgRVM1XG4vLyBzbyB3ZSBkb24ndCBpbmNsdWRlIGEgZGVwZW5kZW5jeSB0byByZWdlbmVyYXRvciBydW50aW1lXG5cbmNvbnN0IF9fZ2VuZXJhdG9yID0gZnVuY3Rpb24gKHRoaXNBcmc6IGFueSwgYm9keTogYW55KSB7XG4gIGxldCBfOiBhbnkgPSB7XG4gICAgICBsYWJlbDogMCxcbiAgICAgIHNlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdXG4gICAgICAgIHJldHVybiB0WzFdXG4gICAgICB9LFxuICAgICAgdHJ5czogW10sXG4gICAgICBvcHM6IFtdLFxuICAgIH0sXG4gICAgZjogYW55LFxuICAgIHk6IGFueSxcbiAgICB0OiBhbnksXG4gICAgZzogYW55XG4gIHJldHVybiAoXG4gICAgKGcgPSB7IG5leHQ6IHZlcmIoMCksIHRocm93OiB2ZXJiKDEpLCByZXR1cm46IHZlcmIoMikgfSksXG4gICAgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSksXG4gICAgZ1xuICApXG4gIGZ1bmN0aW9uIHZlcmIobjogYW55KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2OiBhbnkpIHtcbiAgICAgIHJldHVybiBzdGVwKFtuLCB2XSlcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc3RlcChvcDogYW55KSB7XG4gICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpXG4gICAgd2hpbGUgKF8pXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKChmID0gMSksXG4gICAgICAgICAgeSAmJlxuICAgICAgICAgICAgKHQgPVxuICAgICAgICAgICAgICBvcFswXSAmIDJcbiAgICAgICAgICAgICAgICA/IHlbXCJyZXR1cm5cIl1cbiAgICAgICAgICAgICAgICA6IG9wWzBdXG4gICAgICAgICAgICAgICAgPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKVxuICAgICAgICAgICAgICAgIDogeS5uZXh0KSAmJlxuICAgICAgICAgICAgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiB0XG4gICAgICAgIGlmICgoKHkgPSAwKSwgdCkpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV1cbiAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB0ID0gb3BcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgXy5sYWJlbCsrXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH1cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBfLmxhYmVsKytcbiAgICAgICAgICAgIHkgPSBvcFsxXVxuICAgICAgICAgICAgb3AgPSBbMF1cbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKVxuICAgICAgICAgICAgXy50cnlzLnBvcCgpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICEoKHQgPSBfLnRyeXMpLCAodCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pKSAmJlxuICAgICAgICAgICAgICAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgXyA9IDBcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXVxuICAgICAgICAgICAgICB0ID0gb3BcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdXG4gICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKClcbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvcCA9IFs2LCBlXVxuICAgICAgICB5ID0gMFxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZiA9IHQgPSAwXG4gICAgICB9XG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV1cbiAgICByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvbWlzZUdlbmVyYXRvcih0aGlzOiBQcm9taXNlPGFueT4pIHtcbiAgbGV0IHJldFxuICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKHRoaXM6IGFueSwgX2E6IGFueSkge1xuICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc11cbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0ID0gX2Euc2VudCgpXG4gICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXRdXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm5cbiAgICB9XG4gIH0pXG59XG4iLCJpbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQgeyBpc01vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9pc01vZGVsQWN0aW9uXCJcbmltcG9ydCB7IGZsb3csIGlzTW9kZWxGbG93IH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEZsb3dcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgYXNzZXJ0SXNUcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiwgZmFpbHVyZSwgbG9nV2FybmluZyB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aXRoIGFuIG9iamVjdCBhcyB0YXJnZXQuXG4gKi9cbnR5cGUgVGFyZ2V0ZWRBY3Rpb24gPSAodGFyZ2V0OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcblxuY29uc3Qgc3RhbmRhbG9uZUFjdGlvblJlZ2lzdHJ5ID0gbmV3IE1hcDxzdHJpbmcsIFRhcmdldGVkQWN0aW9uPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFsb25lQWN0aW9uKGFjdGlvbk5hbWU6IHN0cmluZykge1xuICByZXR1cm4gc3RhbmRhbG9uZUFjdGlvblJlZ2lzdHJ5LmdldChhY3Rpb25OYW1lKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkU3RhbmRhbG9uZUFjdGlvbihmdWxsQWN0aW9uTmFtZTogc3RyaW5nLCBmbjogVGFyZ2V0ZWRBY3Rpb24sIGlzRmxvdzogYm9vbGVhbikge1xuICBhc3NlcnRJc0Z1bmN0aW9uKGZuLCBmdWxsQWN0aW9uTmFtZSlcblxuICBpZiAoc3RhbmRhbG9uZUFjdGlvblJlZ2lzdHJ5LmhhcyhmdWxsQWN0aW9uTmFtZSkpIHtcbiAgICBsb2dXYXJuaW5nKFxuICAgICAgXCJ3YXJuXCIsXG4gICAgICBgYW4gc3RhbmRhbG9uZSBhY3Rpb24gd2l0aCBuYW1lIFwiJHtmdWxsQWN0aW9uTmFtZX1cIiBhbHJlYWR5IGV4aXN0cyAoaWYgeW91IGFyZSB1c2luZyBob3QtcmVsb2FkaW5nIHlvdSBtYXkgc2FmZWx5IGlnbm9yZSB0aGlzIHdhcm5pbmcpYCxcbiAgICAgIGBkdXBsaWNhdGVBY3Rpb25OYW1lIC0gJHtmdWxsQWN0aW9uTmFtZX1gXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzTW9kZWxBY3Rpb24oZm4pKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcInRoZSBzdGFuZGFsb25lIGFjdGlvbiBtdXN0IG5vdCBiZSBwcmV2aW91c2x5IG1hcmtlZCBhcyBhbiBhY3Rpb25cIilcbiAgfVxuICBpZiAoaXNNb2RlbEZsb3coZm4pKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcInRoZSBzdGFuZGFsb25lIGFjdGlvbiBtdXN0IG5vdCBiZSBwcmV2aW91c2x5IG1hcmtlZCBhcyBhIGZsb3cgYWN0aW9uXCIpXG4gIH1cblxuICBjb25zdCB3cmFwcGVkQWN0aW9uID0gaXNGbG93XG4gICAgPyBmbG93KHsgbmFtZU9yTmFtZUZuOiBmdWxsQWN0aW9uTmFtZSwgZ2VuZXJhdG9yOiBmbiB9KVxuICAgIDogd3JhcEluQWN0aW9uKHtcbiAgICAgICAgbmFtZU9yTmFtZUZuOiBmdWxsQWN0aW9uTmFtZSxcbiAgICAgICAgZm4sXG4gICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gICAgICB9KVxuXG4gIGNvbnN0IGZpbmFsQWN0aW9uID0gKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGFzc2VydElzVHJlZU5vZGUodGFyZ2V0LCBcInRhcmdldFwiKVxuXG4gICAgLy8gd2UgbmVlZCB0byBwdXQgdGhlIHRhcmdldCBpbnRvIHRoaXNcbiAgICByZXR1cm4gd3JhcHBlZEFjdGlvbi5jYWxsKHRhcmdldCwgdGFyZ2V0LCAuLi5hcmdzKVxuICB9XG5cbiAgc3RhbmRhbG9uZUFjdGlvblJlZ2lzdHJ5LnNldChmdWxsQWN0aW9uTmFtZSwgZmluYWxBY3Rpb24pXG4gIHJldHVybiBmaW5hbEFjdGlvblxufVxuIiwiaW1wb3J0IHsgcmVtb3ZlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuL3dyYXBJbkFjdGlvblwiXG5cbi8qKlxuICogRGVsZXRlcyBhbiBvYmplY3QgZmllbGQgd3JhcHBlZCBpbiBhbiBhY3Rpb24uXG4gKlxuICogQHBhcmFtIG5vZGUgIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gZmllbGROYW1lIEZpZWxkIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlbGV0ZTxPIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgTz4obm9kZTogTywgZmllbGROYW1lOiBLKTogdm9pZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIsIHRydWUpXG5cbiAgd3JhcHBlZEludGVybmFsQXBwbHlEZWxldGUoKS5jYWxsKG5vZGUsIGZpZWxkTmFtZSBhcyBzdHJpbmcgfCBudW1iZXIpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEFwcGx5RGVsZXRlPE8gZXh0ZW5kcyBvYmplY3Q+KHRoaXM6IE8sIGZpZWxkTmFtZTogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gIHJlbW92ZSh0aGlzLCBcIlwiICsgZmllbGROYW1lKVxufVxuXG5jb25zdCB3cmFwcGVkSW50ZXJuYWxBcHBseURlbGV0ZSA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlEZWxldGUsXG4gICAgZm46IGludGVybmFsQXBwbHlEZWxldGUsXG4gICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgfSlcbilcbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG50eXBlIEFueUZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcblxuLyoqXG4gKiBDYWxscyBhbiBvYmplY3QgbWV0aG9kIHdyYXBwZWQgaW4gYW4gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSBub2RlICBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1ldGhvZENhbGw8TyBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIE8sIEZOIGV4dGVuZHMgT1tLXT4oXG4gIG5vZGU6IE8sXG4gIG1ldGhvZE5hbWU6IEssXG4gIC4uLmFyZ3M6IEZOIGV4dGVuZHMgQW55RnVuY3Rpb24gPyBQYXJhbWV0ZXJzPEZOPiA6IG5ldmVyXG4pOiBGTiBleHRlbmRzIEFueUZ1bmN0aW9uID8gUmV0dXJuVHlwZTxGTj4gOiBuZXZlciB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgcmV0dXJuIHdyYXBwZWRJbnRlcm5hbEFwcGx5TWV0aG9kQ2FsbCgpLmNhbGwobm9kZSwgbWV0aG9kTmFtZSBhcyBzdHJpbmcgfCBudW1iZXIsIGFyZ3MpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEFwcGx5TWV0aG9kQ2FsbCh0aGlzOiBhbnksIG1ldGhvZE5hbWU6IHN0cmluZyB8IG51bWJlciwgYXJnczogYW55W10pOiBhbnkge1xuICByZXR1cm4gdGhpc1ttZXRob2ROYW1lXSguLi5hcmdzKVxufVxuXG5jb25zdCB3cmFwcGVkSW50ZXJuYWxBcHBseU1ldGhvZENhbGwgPSBsYXp5KCgpID0+XG4gIHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBCdWlsdEluQWN0aW9uLkFwcGx5TWV0aG9kQ2FsbCxcbiAgICBmbjogaW50ZXJuYWxBcHBseU1ldGhvZENhbGwsXG4gICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgfSlcbilcbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxuLyoqXG4gKiBTZXRzIGFuIG9iamVjdCBmaWVsZCB3cmFwcGVkIGluIGFuIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBmaWVsZE5hbWUgRmllbGQgbmFtZS5cbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNldDxPIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgTywgViBleHRlbmRzIE9bS10+KFxuICBub2RlOiBPLFxuICBmaWVsZE5hbWU6IEssXG4gIHZhbHVlOiBWXG4pOiB2b2lkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIiwgdHJ1ZSlcblxuICB3cmFwcGVkSW50ZXJuYWxBcHBseVNldCgpLmNhbGwobm9kZSwgZmllbGROYW1lIGFzIHN0cmluZyB8IG51bWJlciwgdmFsdWUpXG59XG5cbmZ1bmN0aW9uIGludGVybmFsQXBwbHlTZXQ8TyBleHRlbmRzIG9iamVjdD4odGhpczogTywgZmllbGROYW1lOiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBhIG1vZGVsIHNpbmNlIG1vZGVscyBjYW4gYmVjb21lIG9ic2VydmFibGUgb2JqZWN0c1xuICAvLyAoZS5nLiBieSBoYXZpbmcgYSBjb21wdXRlZCB2YWx1ZSlcbiAgaWYgKCFpc01vZGVsKHRoaXMpICYmIGlzT2JzZXJ2YWJsZSh0aGlzKSkge1xuICAgIHNldCh0aGlzLCBmaWVsZE5hbWUsIHZhbHVlKVxuICB9IGVsc2Uge1xuICAgIDsodGhpcyBhcyBhbnkpW2ZpZWxkTmFtZV0gPSB2YWx1ZVxuICB9XG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5U2V0ID0gbGF6eSgoKSA9PlxuICB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogQnVpbHRJbkFjdGlvbi5BcHBseVNldCxcbiAgICBmbjogaW50ZXJuYWxBcHBseVNldCxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuIiwiaW1wb3J0IHsgZ2V0RGF0YU1vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9hY3Rpb25zXCJcbmltcG9ydCB7IGRldGFjaCB9IGZyb20gXCIuLi9wYXJlbnQvZGV0YWNoXCJcbmltcG9ydCB7IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHMgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgUGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaC9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgYXBwbHlTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9hcHBseVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFN0YW5kYWxvbmVBY3Rpb24gfSBmcm9tIFwiLi4vc3RhbmRhcmRBY3Rpb25zL2FjdGlvbnNcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBhcHBseURlbGV0ZSB9IGZyb20gXCIuL2FwcGx5RGVsZXRlXCJcbmltcG9ydCB7IGFwcGx5TWV0aG9kQ2FsbCB9IGZyb20gXCIuL2FwcGx5TWV0aG9kQ2FsbFwiXG5pbXBvcnQgeyBhcHBseVNldCB9IGZyb20gXCIuL2FwcGx5U2V0XCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24sIGlzQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IGlzSG9va0FjdGlvbiB9IGZyb20gXCIuL2hvb2tBY3Rpb25zXCJcblxuLyoqXG4gKiBBbiBhY3Rpb24gY2FsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25DYWxsIHtcbiAgLyoqXG4gICAqIEFjdGlvbiBuYW1lIChuYW1lIG9mIHRoZSBmdW5jdGlvbikuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25OYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogQWN0aW9uIGFyZ3VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M6IFJlYWRvbmx5QXJyYXk8YW55PlxuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBtb2RlbCB3aGVyZSB0aGUgYWN0aW9uIHdpbGwgYmUgcnVuLCBhcyBhbiBhcnJheSBvZiBzdHJpbmcgfCBudW1iZXIuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoOiBQYXRoXG5cbiAgLyoqXG4gICAqIElkcyBvZiBtb2RlbHMgYWxvbmcgdGhlIHBhdGggdG8gdGhlIHRhcmdldCwgbnVsbCBpZiBpdCBpcyBub3QgYSBtb2RlbC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVsbD5cblxuICAvKipcbiAgICogTWFya3MgdGhpcyBhY3Rpb24gY2FsbCBhcyBub24tc2VyaWFsaXplZC5cbiAgICovXG4gIHJlYWRvbmx5IHNlcmlhbGl6ZWQ/OiB1bmRlZmluZWRcbn1cblxuY29uc3QgYnVpbHRJbkFjdGlvblRvRnVuY3Rpb24gPSB7XG4gIFtCdWlsdEluQWN0aW9uLkFwcGx5U25hcHNob3RdOiBhcHBseVNuYXBzaG90LFxuICBbQnVpbHRJbkFjdGlvbi5BcHBseVBhdGNoZXNdOiBhcHBseVBhdGNoZXMsXG4gIFtCdWlsdEluQWN0aW9uLkRldGFjaF06IGRldGFjaCxcbiAgW0J1aWx0SW5BY3Rpb24uQXBwbHlTZXRdOiBhcHBseVNldCxcbiAgW0J1aWx0SW5BY3Rpb24uQXBwbHlEZWxldGVdOiBhcHBseURlbGV0ZSxcbiAgW0J1aWx0SW5BY3Rpb24uQXBwbHlNZXRob2RDYWxsXTogYXBwbHlNZXRob2RDYWxsLFxufVxuXG4vKipcbiAqIEFwcGxpZXMgKHJ1bnMpIGFuIGFjdGlvbiBvdmVyIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBJZiB5b3UgaW50ZW5kIHRvIGFwcGx5IHNlcmlhbGl6ZWQgYWN0aW9ucyBjaGVjayBvbmUgb2YgdGhlIGBhcHBseVNlcmlhbGl6ZWRBY3Rpb25gIG1ldGhvZHMgaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QgdG8gcnVuIHRoZSBhY3Rpb24gb3Zlci5cbiAqIEBwYXJhbSBjYWxsIFRoZSBhY3Rpb24sIHVzdWFsbHkgYXMgY29taW5nIGZyb20gYG9uQWN0aW9uTWlkZGxld2FyZWAuXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24sIGlmIGFueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWN0aW9uPFRSZXQgPSBhbnk+KHN1YnRyZWVSb290OiBvYmplY3QsIGNhbGw6IEFjdGlvbkNhbGwpOiBUUmV0IHtcbiAgaWYgKGNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBcImNhbm5vdCBhcHBseSBhIHNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwsIHVzZSBvbmUgb2YgdGhlICdhcHBseVNlcmlhbGl6ZWRBY3Rpb24nIG1ldGhvZHMgaW5zdGVhZFwiXG4gICAgKVxuICB9XG5cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIC8vIHJlc29sdmUgcGF0aCB3aGlsZSBjaGVja2luZyBpZHNcbiAgY29uc3QgeyB2YWx1ZTogY3VycmVudCwgcmVzb2x2ZWQgfSA9IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHMoXG4gICAgc3VidHJlZVJvb3QsXG4gICAgY2FsbC50YXJnZXRQYXRoLFxuICAgIGNhbGwudGFyZ2V0UGF0aElkc1xuICApXG4gIGlmICghcmVzb2x2ZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgYG9iamVjdCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoY2FsbC50YXJnZXRQYXRoKX0gd2l0aCBpZHMgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgY2FsbC50YXJnZXRQYXRoSWRzXG4gICAgICApfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWRgXG4gICAgKVxuICB9XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QoY3VycmVudCwgYHJlc29sdmVkICR7Y3VycmVudH1gLCB0cnVlKVxuXG4gIGlmIChpc0J1aWx0SW5BY3Rpb24oY2FsbC5hY3Rpb25OYW1lKSkge1xuICAgIGNvbnN0IGZuVG9DYWxsOiAoLi4uYXJnczogYW55W10pID0+IGFueSA9IGJ1aWx0SW5BY3Rpb25Ub0Z1bmN0aW9uW2NhbGwuYWN0aW9uTmFtZV1cbiAgICBpZiAoIWZuVG9DYWxsKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBhc3NlcnRpb24gZmFpbGVkOiB1bmtub3duIGJ1aWx0LWluIGFjdGlvbiAtICR7Y2FsbC5hY3Rpb25OYW1lfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGZuVG9DYWxsLmFwcGx5KGN1cnJlbnQsIFtjdXJyZW50LCAuLi5jYWxsLmFyZ3NdKVxuICB9XG5cbiAgaWYgKGlzSG9va0FjdGlvbihjYWxsLmFjdGlvbk5hbWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgY2FsbHMgdG8gaG9va3MgKCR7Y2FsbC5hY3Rpb25OYW1lfSkgY2Fubm90IGJlIGFwcGxpZWRgKVxuICB9XG5cbiAgY29uc3QgZGF0YU1vZGVsQWN0aW9uID0gZ2V0RGF0YU1vZGVsQWN0aW9uKGNhbGwuYWN0aW9uTmFtZSlcbiAgaWYgKGRhdGFNb2RlbEFjdGlvbikge1xuICAgIGNvbnN0IGluc3RhbmNlOiBhbnkgPSBuZXcgZGF0YU1vZGVsQWN0aW9uLm1vZGVsQ2xhc3MoY3VycmVudClcbiAgICByZXR1cm4gaW5zdGFuY2VbZGF0YU1vZGVsQWN0aW9uLmZuTmFtZV0uYXBwbHkoaW5zdGFuY2UsIGNhbGwuYXJncylcbiAgfVxuXG4gIGNvbnN0IHN0YW5kYWxvbmVBY3Rpb24gPSBnZXRTdGFuZGFsb25lQWN0aW9uKGNhbGwuYWN0aW9uTmFtZSlcbiAgaWYgKHN0YW5kYWxvbmVBY3Rpb24pIHtcbiAgICByZXR1cm4gc3RhbmRhbG9uZUFjdGlvbi5hcHBseShjdXJyZW50LCBjYWxsLmFyZ3MgYXMgYW55KVxuICB9XG5cbiAgcmV0dXJuIChjdXJyZW50IGFzIGFueSlbY2FsbC5hY3Rpb25OYW1lXS5hcHBseShjdXJyZW50LCBjYWxsLmFyZ3MpXG59XG4iLCJpbXBvcnQgeyBjaGVja01vZGVsRGVjb3JhdG9yQXJncyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9jaGVja01vZGVsRGVjb3JhdG9yQXJnc1wiXG5pbXBvcnQgeyBkZWNvcmF0ZVdyYXBNZXRob2RPckZpZWxkLCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUgfSBmcm9tIFwiLi9hY3Rpb25EZWNvcmF0b3JVdGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgaXNNb2RlbEFjdGlvbiB9IGZyb20gXCIuL2lzTW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxuZnVuY3Rpb24gY2hlY2tNb2RlbEFjdGlvbkFyZ3ModGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm1vZGVsQWN0aW9uIGhhcyB0byBiZSB1c2VkIG92ZXIgZnVuY3Rpb25zXCIpXG4gIH1cbiAgY2hlY2tNb2RlbERlY29yYXRvckFyZ3MoXCJtb2RlbEFjdGlvblwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KVxufVxuXG4vKipcbiAqIERlY29yYXRvciB0aGF0IHR1cm5zIGEgZnVuY3Rpb24gaW50byBhIG1vZGVsIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcHJvcGVydHlLZXlcbiAqIEBwYXJhbSBbYmFzZURlc2NyaXB0b3JdXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxBY3Rpb24oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICBiYXNlRGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuKTogdm9pZCB7XG4gIGNvbnN0IHsgYWN0aW9uTmFtZSwgb3ZlcnJpZGVDb250ZXh0IH0gPSBnZXRBY3Rpb25OYW1lQW5kQ29udGV4dE92ZXJyaWRlKHRhcmdldCwgcHJvcGVydHlLZXkpXG5cbiAgcmV0dXJuIGRlY29yYXRlV3JhcE1ldGhvZE9yRmllbGQoXG4gICAgXCJtb2RlbEFjdGlvblwiLFxuICAgIHtcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgYmFzZURlc2NyaXB0b3IsXG4gICAgfSxcbiAgICAoZGF0YSwgZm4pID0+IHtcbiAgICAgIGlmIChpc01vZGVsQWN0aW9uKGZuKSkge1xuICAgICAgICByZXR1cm4gZm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrTW9kZWxBY3Rpb25BcmdzKGRhdGEudGFyZ2V0LCBkYXRhLnByb3BlcnR5S2V5LCBmbilcblxuICAgICAgICByZXR1cm4gd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICBuYW1lT3JOYW1lRm46IGFjdGlvbk5hbWUsXG4gICAgICAgICAgZm4sXG4gICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgICAgICAgICBvdmVycmlkZUNvbnRleHQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICApXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyB0cnlSdW5QZW5kaW5nQWN0aW9ucyB9IGZyb20gXCIuL3BlbmRpbmdBY3Rpb25zXCJcbmltcG9ydCB7IGdldEFjdGlvblByb3RlY3Rpb24sIHNldEFjdGlvblByb3RlY3Rpb24gfSBmcm9tIFwiLi9wcm90ZWN0aW9uXCJcblxuLyoqXG4gKiBSdW5zIGEgYmxvY2sgaW4gdW5wcm9jdGVkIG1vZGUsIGFzIGlmIGl0IHdlcmUgcnVuIGluc2lkZSBhIG1vZGVsIGFjdGlvbi5cbiAqIENvbnNpZGVyIHVzaW5nIGEgcHJvcGVyIG1vZGVsIGFjdGlvbiBpbnN0ZWFkIHNpbmNlIHRoZXNlIGtpbmQgb2YgYWN0aW9ucyBhcmUgbm90IHJlY29yZGVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSBuYW1lIE1vYnggYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0gZm4gQWN0aW9uIGJsb2NrLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blVucHJvdGVjdGVkPFQ+KG5hbWU6IHN0cmluZywgZm46ICgpID0+IFQpOiBUXG5cbi8qKlxuICogUnVucyBhIGJsb2NrIGluIHVucHJvY3RlZCBtb2RlLCBhcyBpZiBpdCB3ZXJlIHJ1biBpbnNpZGUgYSBtb2RlbCBhY3Rpb24uXG4gKiBDb25zaWRlciB1c2luZyBhIHByb3BlciBtb2RlbCBhY3Rpb24gaW5zdGVhZCBzaW5jZSB0aGVzZSBraW5kIG9mIGFjdGlvbnMgYXJlIG5vdCByZWNvcmRlZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0gZm4gQWN0aW9uIGJsb2NrLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blVucHJvdGVjdGVkPFQ+KGZuOiAoKSA9PiBUKTogVFxuXG4vLyBiYXNlIGNhc2VcbmV4cG9ydCBmdW5jdGlvbiBydW5VbnByb3RlY3RlZDxUPihhcmcxOiBhbnksIGFyZzI/OiBhbnkpOiBUIHtcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBhcmcxID09PSBcInN0cmluZ1wiID8gYXJnMSA6IHVuZGVmaW5lZFxuICBjb25zdCBmbjogKCkgPT4gVCA9IHR5cGVvZiBhcmcxID09PSBcInN0cmluZ1wiID8gYXJnMiA6IGFyZzFcblxuICBjb25zdCBpbm5lckFjdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCBvbGRBY3Rpb25Qcm90ZWN0aW9uID0gZ2V0QWN0aW9uUHJvdGVjdGlvbigpXG4gICAgc2V0QWN0aW9uUHJvdGVjdGlvbihmYWxzZSlcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRBY3Rpb25Qcm90ZWN0aW9uKG9sZEFjdGlvblByb3RlY3Rpb24pXG5cbiAgICAgIHRyeVJ1blBlbmRpbmdBY3Rpb25zKClcbiAgICB9XG4gIH1cblxuICBpZiAobmFtZSkge1xuICAgIHJldHVybiBhY3Rpb24obmFtZSwgaW5uZXJBY3Rpb24pKClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYWN0aW9uKGlubmVyQWN0aW9uKSgpXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBjYW5ub3RTZXJpYWxpemUgPSBTeW1ib2woXCJjYW5ub3RTZXJpYWxpemVcIilcblxuLyoqXG4gKiBTZXJpYWxpemVyIG9mIGFjdGlvbiBjYWxsIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPFRPcmlnaW5hbCwgVFNlcmlhbGl6ZWQ+IHtcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXIgSUQsIG11c3QgYmUgdW5pcXVlLlxuICAgKi9cbiAgaWQ6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFuIGFjdGlvbiBjYWxsIGFyZ3VtZW50LCByZXR1cm5pbmcgYGNhbm5vdFNlcmlhbGl6ZWAgaWYgbm90IHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2VyaWFsaXplLlxuICAgKiBAcGFyYW0gdGFyZ2V0Um9vdCBUYXJnZXQgcm9vdCwgaWYgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSBzZXJpYWxpemVDaGlsZCBTZXJpYWxpemUgYSBjaGlsZC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHNlcmlhbGl6ZShcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzZXJpYWxpemVDaGlsZDogKHY6IHVua25vd24pID0+IHVua25vd24sXG4gICAgdGFyZ2V0Um9vdDogb2JqZWN0IHwgdW5kZWZpbmVkXG4gICk6IFRTZXJpYWxpemVkIHwgdHlwZW9mIGNhbm5vdFNlcmlhbGl6ZVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgYW4gYWN0aW9uIGNhbGwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBkZXNlcmlhbGl6ZS5cbiAgICogQHBhcmFtIHRhcmdldFJvb3QgVGFyZ2V0IHJvb3QsIGlmIHByb3ZpZGVkLlxuICAgKiBAcGFyYW0gZGVzZXJpYWxpemVDaGlsZCBEZXNlcmlhbGl6ZSBhIGNoaWxkLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZGVzZXJpYWxpemUoXG4gICAgdmFsdWU6IFRTZXJpYWxpemVkLFxuICAgIGRlc2VyaWFsaXplQ2hpbGQ6ICh2OiB1bmtub3duKSA9PiB1bmtub3duLFxuICAgIHRhcmdldFJvb3Q6IG9iamVjdCB8IHVuZGVmaW5lZFxuICApOiBUT3JpZ2luYWxcbn1cbiIsImltcG9ydCB0eXBlIHsgSU9ic2VydmFibGVBcnJheSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzQXJyYXksIG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IGFycmF5U2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxhbnlbXSB8IElPYnNlcnZhYmxlQXJyYXk8YW55PiwgYW55W10+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9hcnJheWAsXG5cbiAgc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemUpIHtcbiAgICBpZiAoIWlzQXJyYXkodmFsdWUpKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICAvLyB0aGlzIHdpbGwgYWxzbyB0cmFuc2Zvcm0gb2JzZXJ2YWJsZSBhcnJheXMgaW50byBub24tb2JzZXJ2YWJsZSBvbmVzXG4gICAgcmV0dXJuIHZhbHVlLm1hcChzZXJpYWxpemUpXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUoYXJyLCBkZXNlcmlhbGl6ZSkge1xuICAgIHJldHVybiBhcnIubWFwKGRlc2VyaWFsaXplKVxuICB9LFxufVxuIiwiaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3QgZGF0ZVNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8RGF0ZSwgbnVtYmVyPiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vZGF0ZUFzVGltZXN0YW1wYCxcblxuICBzZXJpYWxpemUoZGF0ZSkge1xuICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuICAgIHJldHVybiArZGF0ZVxuICB9LFxuXG4gIGRlc2VyaWFsaXplKHRpbWVzdGFtcCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBpc09ic2VydmFibGVNYXAsIE9ic2VydmFibGVNYXAgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBtYXBTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPFxuICBNYXA8YW55LCBhbnk+IHwgT2JzZXJ2YWJsZU1hcDxhbnksIGFueT4sXG4gIFthbnksIGFueV1bXVxuPiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vbWFwQXNBcnJheWAsXG5cbiAgc2VyaWFsaXplKG1hcCwgc2VyaWFsaXplKSB7XG4gICAgaWYgKCEobWFwIGluc3RhbmNlb2YgTWFwKSAmJiAhaXNPYnNlcnZhYmxlTWFwKG1hcCkpIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIGNvbnN0IGFycjogW2FueSwgYW55XVtdID0gW11cblxuICAgIGNvbnN0IGl0ZXIgPSBtYXAua2V5cygpXG4gICAgbGV0IGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFjdXIuZG9uZSkge1xuICAgICAgY29uc3QgayA9IGN1ci52YWx1ZVxuICAgICAgY29uc3QgdiA9IG1hcC5nZXQoaylcbiAgICAgIGFyci5wdXNoKFtzZXJpYWxpemUoayksIHNlcmlhbGl6ZSh2KV0pXG4gICAgICBjdXIgPSBpdGVyLm5leHQoKVxuICAgIH1cblxuICAgIHJldHVybiBhcnJcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShhcnIsIGRlc2VyaWFsaXplKSB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcCgpXG5cbiAgICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGFycltpXVswXVxuICAgICAgY29uc3QgdiA9IGFycltpXVsxXVxuICAgICAgbWFwLnNldChkZXNlcmlhbGl6ZShrKSwgZGVzZXJpYWxpemUodikpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcFxuICB9LFxufVxuIiwiaW1wb3J0IHsgbW9kZWxJZEtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUm9vdFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm9vdFBhdGhUb1RhcmdldFBhdGhJZHMocm9vdFBhdGg6IFJvb3RQYXRoPGFueT4pOiAoc3RyaW5nIHwgbnVsbClbXSB7XG4gIGNvbnN0IHRhcmdldFBhdGhJZHM6IChzdHJpbmcgfCBudWxsKVtdID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvb3RQYXRoLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0YXJnZXRPYmogPSByb290UGF0aC5wYXRoT2JqZWN0c1tpICsgMV0gLy8gZmlyc3QgaXMgcm9vdCwgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdHMgSURcbiAgICBjb25zdCB0YXJnZXRPYmpJZCA9IGlzTW9kZWwodGFyZ2V0T2JqKSA/IHRhcmdldE9ialttb2RlbElkS2V5XSA/PyBudWxsIDogbnVsbFxuICAgIHRhcmdldFBhdGhJZHMucHVzaCh0YXJnZXRPYmpJZClcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRQYXRoSWRzXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoVG9UYXJnZXRQYXRoSWRzKHJvb3Q6IGFueSwgcGF0aDogUGF0aCk6IChzdHJpbmcgfCBudWxsKVtdIHtcbiAgY29uc3QgdGFyZ2V0UGF0aElkczogKHN0cmluZyB8IG51bGwpW10gPSBbXVxuICBsZXQgY3VycmVudCA9IHJvb3QgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcm9vdCBJRFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhdGhbaV1dXG4gICAgY29uc3QgdGFyZ2V0T2JqSWQgPSBpc01vZGVsKGN1cnJlbnQpID8gY3VycmVudFttb2RlbElkS2V5XSA/PyBudWxsIDogbnVsbFxuICAgIHRhcmdldFBhdGhJZHMucHVzaCh0YXJnZXRPYmpJZClcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRQYXRoSWRzXG59XG4iLCJpbXBvcnQgeyBmYXN0R2V0Um9vdFBhdGgsIHJlc29sdmVQYXRoQ2hlY2tpbmdJZHMgfSBmcm9tIFwiLi4vLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgUGF0aCB9IGZyb20gXCIuLi8uLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGlzVHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi8uLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IHJvb3RQYXRoVG9UYXJnZXRQYXRoSWRzIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5pbnRlcmZhY2UgT2JqZWN0UGF0aCB7XG4gIHRhcmdldFBhdGg6IFBhdGhcbiAgdGFyZ2V0UGF0aElkczogKHN0cmluZyB8IG51bGwpW11cbn1cblxuZXhwb3J0IGNvbnN0IG9iamVjdFBhdGhTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPG9iamVjdCwgT2JqZWN0UGF0aD4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L29iamVjdFBhdGhgLFxuXG4gIHNlcmlhbGl6ZSh2YWx1ZSwgXywgdGFyZ2V0Um9vdCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwgfHwgIWlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgZmFsc2UpKVxuICAgICAgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuXG4gICAgLy8gdHJ5IHRvIHNlcmlhbGl6ZSBhIHJlZiB0byBpdHMgcGF0aCBpZiBwb3NzaWJsZSBpbnN0ZWFkXG4gICAgaWYgKHRhcmdldFJvb3QpIHtcbiAgICAgIGNvbnN0IHJvb3RQYXRoID0gZmFzdEdldFJvb3RQYXRoKHZhbHVlKVxuICAgICAgaWYgKHJvb3RQYXRoLnJvb3QgPT09IHRhcmdldFJvb3QpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0YXJnZXRQYXRoOiByb290UGF0aC5wYXRoLFxuICAgICAgICAgIHRhcmdldFBhdGhJZHM6IHJvb3RQYXRoVG9UYXJnZXRQYXRoSWRzKHJvb3RQYXRoKSxcbiAgICAgICAgfSBhcyBPYmplY3RQYXRoXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuICB9LFxuXG4gIGRlc2VyaWFsaXplKHJlZiwgXywgdGFyZ2V0Um9vdCkge1xuICAgIC8vIHRyeSB0byByZXNvbHZlIHRoZSBub2RlIGJhY2tcbiAgICBpZiAodGFyZ2V0Um9vdCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyh0YXJnZXRSb290LCByZWYudGFyZ2V0UGF0aCwgcmVmLnRhcmdldFBhdGhJZHMpXG4gICAgICBpZiAocmVzdWx0LnJlc29sdmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgYG9iamVjdCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkocmVmLnRhcmdldFBhdGgpfSB3aXRoIGlkcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICByZWYudGFyZ2V0UGF0aElkc1xuICAgICAgKX0gY291bGQgbm90IGJlIHJlc29sdmVkYFxuICAgIClcbiAgfSxcbn1cbiIsImltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuLi8uLi9zbmFwc2hvdC9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vLi4vc25hcHNob3QvZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBvYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8b2JqZWN0LCBvYmplY3Q+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9vYmplY3RTbmFwc2hvdGAsXG5cbiAgc2VyaWFsaXplKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCB8fCAhaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCBmYWxzZSkpXG4gICAgICByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICByZXR1cm4gZ2V0U25hcHNob3QodmFsdWUpXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUoc25hcHNob3QpIHtcbiAgICByZXR1cm4gZnJvbVNuYXBzaG90KHNuYXBzaG90KVxuICB9LFxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlT2JqZWN0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3QgcGxhaW5PYmplY3RTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPG9iamVjdCwgb2JqZWN0PiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vcGxhaW5PYmplY3RgLFxuXG4gIHNlcmlhbGl6ZSh2YWx1ZSwgc2VyaWFsaXplKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHZhbHVlKSkgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuXG4gICAgLy8gdGhpcyB3aWxsIG1ha2Ugb2JzZXJ2YWJsZSBvYmplY3RzIG5vbi1vYnNlcnZhYmxlIG9uZXNcbiAgICByZXR1cm4gbWFwT2JqZWN0RmllbGRzKHZhbHVlLCBzZXJpYWxpemUpXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUob2JqLCBzZXJpYWxpemUpIHtcbiAgICByZXR1cm4gbWFwT2JqZWN0RmllbGRzKG9iaiwgc2VyaWFsaXplKVxuICB9LFxufVxuXG5mdW5jdGlvbiBtYXBPYmplY3RGaWVsZHMob3JpZ2luYWxPYmo6IGFueSwgbWFwRm46ICh4OiBhbnkpID0+IGFueSk6IGFueSB7XG4gIGNvbnN0IG9iajogYW55ID0ge31cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9yaWdpbmFsT2JqKVxuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgayA9IGtleXNbaV1cbiAgICBjb25zdCB2ID0gb3JpZ2luYWxPYmpba11cbiAgICBvYmpba10gPSBtYXBGbih2KVxuICB9XG4gIHJldHVybiBvYmpcbn1cbiIsImltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IHByaW1pdGl2ZVNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8XG4gIG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZCxcbiAgc3RyaW5nXG4+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9wcmltaXRpdmVBc1N0cmluZ2AsXG5cbiAgc2VyaWFsaXplKHZhbHVlKSB7XG4gICAgLy8gbnVtYmVyXG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBcIm5hblwiXG4gICAgfVxuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgK0luZmluaXR5OlxuICAgICAgICByZXR1cm4gXCIraW5mXCJcbiAgICAgIGNhc2UgLUluZmluaXR5OlxuICAgICAgICByZXR1cm4gXCItaW5mXCJcbiAgICB9XG5cbiAgICAvLyBiaWdpbnRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIC8vIHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIlxuICAgIH1cblxuICAgIHJldHVybiBjYW5ub3RTZXJpYWxpemVcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShzdHIpIHtcbiAgICBzd2l0Y2ggKHN0cikge1xuICAgICAgY2FzZSBcIm5hblwiOlxuICAgICAgICByZXR1cm4gTmFOXG4gICAgICBjYXNlIFwiK2luZlwiOlxuICAgICAgICByZXR1cm4gK0luZmluaXR5XG4gICAgICBjYXNlIFwiLWluZlwiOlxuICAgICAgICByZXR1cm4gLUluZmluaXR5XG4gICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBCaWdJbnQoc3RyKVxuICAgIH1cbiAgfSxcbn1cbiIsImltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZVNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IHNldFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8U2V0PGFueT4gfCBPYnNlcnZhYmxlU2V0PGFueT4sIGFueVtdPiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vc2V0QXNBcnJheWAsXG5cbiAgc2VyaWFsaXplKHNldCwgc2VyaWFsaXplKSB7XG4gICAgaWYgKCEoc2V0IGluc3RhbmNlb2YgU2V0KSkgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuXG4gICAgY29uc3QgYXJyOiBhbnlbXSA9IFtdXG5cbiAgICBjb25zdCBpdGVyID0gc2V0LmtleXMoKVxuICAgIGxldCBjdXIgPSBpdGVyLm5leHQoKVxuICAgIHdoaWxlICghY3VyLmRvbmUpIHtcbiAgICAgIGNvbnN0IGsgPSBjdXIudmFsdWVcbiAgICAgIGFyci5wdXNoKHNlcmlhbGl6ZShrKSlcbiAgICAgIGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFyclxuICB9LFxuXG4gIGRlc2VyaWFsaXplKGFyciwgZGVzZXJpYWxpemUpIHtcbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0KClcblxuICAgIGNvbnN0IGxlbiA9IGFyci5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gYXJyW2ldXG4gICAgICBzZXQuYWRkKGRlc2VyaWFsaXplKGspKVxuICAgIH1cblxuICAgIHJldHVybiBzZXRcbiAgfSxcbn1cbiIsImltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgdHlwZSB7IEFjdGlvbkNhbGwgfSBmcm9tIFwiLi4vLi4vYWN0aW9uL2FwcGx5QWN0aW9uXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzSlNPTlByaW1pdGl2ZSwgaXNQbGFpbk9iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IEpTT05QcmltaXRpdmVWYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy90eXBlc1wiXG5pbXBvcnQgeyBhcnJheVNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9hcnJheVNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgeyBkYXRlU2VyaWFsaXplciB9IGZyb20gXCIuL2RhdGVTZXJpYWxpemVyXCJcbmltcG9ydCB7IG1hcFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9tYXBTZXJpYWxpemVyXCJcbmltcG9ydCB7IG9iamVjdFBhdGhTZXJpYWxpemVyIH0gZnJvbSBcIi4vb2JqZWN0UGF0aFNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgb2JqZWN0U25hcHNob3RTZXJpYWxpemVyIH0gZnJvbSBcIi4vb2JqZWN0U25hcHNob3RTZXJpYWxpemVyXCJcbmltcG9ydCB7IHBsYWluT2JqZWN0U2VyaWFsaXplciB9IGZyb20gXCIuL3BsYWluT2JqZWN0U2VyaWFsaXplclwiXG5pbXBvcnQgeyBwcmltaXRpdmVTZXJpYWxpemVyIH0gZnJvbSBcIi4vcHJpbWl0aXZlU2VyaWFsaXplclwiXG5pbXBvcnQgeyBzZXRTZXJpYWxpemVyIH0gZnJvbSBcIi4vc2V0U2VyaWFsaXplclwiXG5cbmNvbnN0IHNlcmlhbGl6ZXJzQXJyYXk6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8YW55LCBhbnk+W10gPSBbXVxuY29uc3Qgc2VyaWFsaXplcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxhbnksIGFueT4+KClcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBuZXcgYWN0aW9uIGNhbGwgYXJndW1lbnQgc2VyaWFsaXplcnMuXG4gKiBTZXJpYWxpemVycyBhcmUgY2FsbGVkIGluIHRoZSBpbnZlcnNlIG9yZGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQsIG1lYW5pbmcgdGhlXG4gKiBsYXRlc3Qgb25lIHJlZ2lzdGVyZWQgd2lsbCBiZSBjYWxsZWQgZmlyc3QuXG4gKlxuICogQHBhcmFtIHNlcmlhbGl6ZXIgU2VyaWFsaXplciB0byByZWdpc3Rlci5cbiAqIEByZXR1cm5zIEEgZGlzcG9zZXIgdG8gdW5yZWdpc3RlciB0aGUgc2VyaWFsaXplci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihcbiAgc2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxhbnksIGFueT5cbik6ICgpID0+IHZvaWQge1xuICByZWdpc3RlckRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVycygpXG5cbiAgaWYgKHNlcmlhbGl6ZXJzQXJyYXkuaW5jbHVkZXMoc2VyaWFsaXplcikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYWN0aW9uIGNhbGwgYXJndW1lbnQgc2VyaWFsaXplciBhbHJlYWR5IHJlZ2lzdGVyZWRcIilcbiAgfVxuICBpZiAoc2VyaWFsaXplcnNNYXAuaGFzKHNlcmlhbGl6ZXIuaWQpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgYWN0aW9uIGNhbGwgYXJndW1lbnQgc2VyaWFsaXplciB3aXRoIGlkICcke3NlcmlhbGl6ZXIuaWR9JyBhbHJlYWR5IHJlZ2lzdGVyZWRgKVxuICB9XG5cbiAgc2VyaWFsaXplcnNBcnJheS51bnNoaWZ0KHNlcmlhbGl6ZXIpXG4gIHNlcmlhbGl6ZXJzTWFwLnNldChzZXJpYWxpemVyLmlkLCBzZXJpYWxpemVyKVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBzZXJpYWxpemVyc0FycmF5LmluZGV4T2Yoc2VyaWFsaXplcilcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgc2VyaWFsaXplcnNBcnJheS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICAgIHNlcmlhbGl6ZXJzTWFwLmRlbGV0ZShzZXJpYWxpemVyLmlkKVxuICB9XG59XG5cbi8qKlxuICogU2VyaWFsaXplZCBhY3Rpb24gY2FsbCBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50IHtcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXIgaWQuXG4gICAqL1xuICByZWFkb25seSAkbW9ieEtleXN0b25lU2VyaWFsaXplcjogc3RyaW5nXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IGFueVxufVxuXG4vKipcbiAqIEEgc2VyaWFsaXplZCBhY3Rpb24gY2FsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkQWN0aW9uQ2FsbCBleHRlbmRzIE9taXQ8QWN0aW9uQ2FsbCwgXCJzZXJpYWxpemVkXCI+IHtcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgYWN0aW9uIGFyZ3VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M6IFJlYWRvbmx5QXJyYXk8U2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudCB8IEpTT05QcmltaXRpdmVWYWx1ZT5cblxuICAvKipcbiAgICogTWFya3MgdGhpcyBhY3Rpb24gY2FsbCBhcyBzZXJpYWxpemVkLlxuICAgKi9cbiAgc2VyaWFsaXplZDogdHJ1ZVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gYWN0aW9uIGNhbGwgYXJndW1lbnQgYnkgcmV0dXJuaW5nIGEgYFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnRgLlxuICogVGhlIGZvbGxvd2luZyBhcmUgc3VwcG9ydGVkIG91dCBvZiB0aGUgYm94OlxuICogLSBQcmltaXRpdmVzLlxuICogLSBOb2RlcyB0aGF0IGFyZSB1bmRlciB0aGUgc2FtZSByb290IG5vZGUgYXMgdGhlIHRhcmdldCByb290ICh3aGVuIHByb3ZpZGVkKSB3aWxsIGJlIHNlcmlhbGl6ZWRcbiAqICAgYXMgYSBwYXRoLlxuICogLSBOb2RlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlIHNhbWUgcm9vdCBub2RlIGFzIHRoZSB0YXJnZXQgcm9vdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgdGhlaXIgc25hcHNob3QuXG4gKiAtIEFycmF5cyAob2JzZXJ2YWJsZSBvciBub3QpLlxuICogLSBEYXRlcy5cbiAqIC0gTWFwcyAob2JzZXJ2YWJsZSBvciBub3QpLlxuICogLSBTZXRzIChvYnNlcnZhYmxlIG9yIG5vdCkuXG4gKiAtIFBsYWluIG9iamVjdHMgKG9ic2VydmFibGUgb3Igbm90KS5cbiAqXG4gKiBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHNlcmlhbGl6ZWQgaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKlxuICogQHBhcmFtIGFyZ1ZhbHVlIEFyZ3VtZW50IHZhbHVlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gaXRzIHNlcmlhbGl6YWJsZSBmb3JtLlxuICogQHBhcmFtIFt0YXJnZXRSb290XSBUYXJnZXQgcm9vdCBub2RlIG9mIHRoZSBtb2RlbCB3aGVyZSB0aGlzIGFjdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQuXG4gKiBAcmV0dXJucyBUaGUgc2VyaWFsaXphYmxlIGZvcm0gb2YgdGhlIHBhc3NlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudChcbiAgYXJnVmFsdWU6IGFueSxcbiAgdGFyZ2V0Um9vdD86IG9iamVjdFxuKTogU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudCB8IEpTT05QcmltaXRpdmVWYWx1ZSB7XG4gIHJlZ2lzdGVyRGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzKClcblxuICBpZiAoaXNKU09OUHJpbWl0aXZlKGFyZ1ZhbHVlKSkge1xuICAgIHJldHVybiBhcmdWYWx1ZVxuICB9XG5cbiAgY29uc3Qgb3JpZ1ZhbHVlID0gYXJnVmFsdWVcblxuICBjb25zdCBzZXJpYWxpemUgPSAodjogYW55KSA9PiBzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQodiwgdGFyZ2V0Um9vdClcblxuICAvLyB0cnkgc2VyaWFsaXplcnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXJpYWxpemVyc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJzQXJyYXlbaV1cbiAgICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShhcmdWYWx1ZSwgc2VyaWFsaXplLCB0YXJnZXRSb290KVxuICAgIGlmIChzZXJpYWxpemVkVmFsdWUgIT09IGNhbm5vdFNlcmlhbGl6ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJG1vYnhLZXlzdG9uZVNlcmlhbGl6ZXI6IHNlcmlhbGl6ZXIuaWQsXG4gICAgICAgIHZhbHVlOiBzZXJpYWxpemVkVmFsdWUsXG4gICAgICB9IGFzIFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnRcbiAgICB9XG4gIH1cblxuICB0aHJvdyBmYWlsdXJlKGBzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQgY291bGQgbm90IHNlcmlhbGl6ZSB0aGUgZ2l2ZW4gdmFsdWU6ICR7b3JpZ1ZhbHVlfWApXG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IGFuIGFjdGlvbiBjYWxsIGlzIHNlcmlhbGl6YWJsZSBieSBtYXBwaW5nIHRoZSBhY3Rpb24gYXJndW1lbnRzIGludG8gaXRzXG4gKiBzZXJpYWxpemFibGUgdmVyc2lvbiBieSB1c2luZyBgc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50YC5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uQ2FsbCBBY3Rpb24gY2FsbCB0byBjb252ZXJ0LlxuICogQHBhcmFtIFt0YXJnZXRSb290XSBUYXJnZXQgcm9vdCBub2RlIG9mIHRoZSBtb2RlbCB3aGVyZSB0aGlzIGFjdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQuXG4gKiBAcmV0dXJucyBUaGUgc2VyaWFsaXphYmxlIGFjdGlvbiBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQWN0aW9uQ2FsbChcbiAgYWN0aW9uQ2FsbDogQWN0aW9uQ2FsbCxcbiAgdGFyZ2V0Um9vdD86IG9iamVjdFxuKTogU2VyaWFsaXplZEFjdGlvbkNhbGwge1xuICBpZiAoYWN0aW9uQ2FsbC5zZXJpYWxpemVkKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBzZXJpYWxpemUgYW4gYWxyZWFkeSBzZXJpYWxpemVkIGFjdGlvbiBjYWxsXCIpXG4gIH1cblxuICBpZiAodGFyZ2V0Um9vdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0YXJnZXRSb290LCBcInRhcmdldFJvb3RcIilcbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZSA9ICh2OiBhbnkpID0+IHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudCh2LCB0YXJnZXRSb290KVxuXG4gIHJldHVybiB7XG4gICAgLi4uYWN0aW9uQ2FsbCxcbiAgICBzZXJpYWxpemVkOiB0cnVlLFxuICAgIGFyZ3M6IGFjdGlvbkNhbGwuYXJncy5tYXAoc2VyaWFsaXplKSxcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gYWN0aW9uIGNhbGwgYXJndW1lbnQgYnkgcmV0dXJuaW5nIGl0cyBkZXNlcmlhbGl6ZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gYXJnVmFsdWUgQXJndW1lbnQgdmFsdWUgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBpdHMgZGVzZXJpYWxpemVkIGZvcm0uXG4gKiBAcGFyYW0gW3RhcmdldFJvb3RdIFRhcmdldCByb290IG5vZGUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoaXMgYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC5cbiAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgZm9ybSBvZiB0aGUgcGFzc2VkIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQoXG4gIGFyZ1ZhbHVlOiBTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50IHwgSlNPTlByaW1pdGl2ZVZhbHVlLFxuICB0YXJnZXRSb290Pzogb2JqZWN0XG4pOiBhbnkge1xuICByZWdpc3RlckRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVycygpXG5cbiAgaWYgKGlzSlNPTlByaW1pdGl2ZShhcmdWYWx1ZSkpIHtcbiAgICByZXR1cm4gYXJnVmFsdWVcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChhcmdWYWx1ZSkgfHwgdHlwZW9mIGFyZ1ZhbHVlLiRtb2J4S2V5c3RvbmVTZXJpYWxpemVyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImludmFsaWQgc2VyaWFsaXplZCBhY3Rpb24gY2FsbCBhcmd1bWVudFwiKVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplcklkID0gYXJnVmFsdWUuJG1vYnhLZXlzdG9uZVNlcmlhbGl6ZXJcbiAgY29uc3Qgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJzTWFwLmdldChzZXJpYWxpemVySWQpXG5cbiAgaWYgKCFzZXJpYWxpemVyKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgYSBzZXJpYWxpemVyIHdpdGggaWQgJyR7c2VyaWFsaXplcklkfScgY291bGQgbm90IGJlIGZvdW5kYClcbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZSA9IGFyZ1ZhbHVlIGFzIFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnRcblxuICBjb25zdCBkZXNlcmlhbGl6ZSA9ICh2OiBhbnkpID0+IGRlc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KHYsIHRhcmdldFJvb3QpXG4gIHJldHVybiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRWYWx1ZS52YWx1ZSwgZGVzZXJpYWxpemUsIHRhcmdldFJvb3QpXG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IGFuIGFjdGlvbiBjYWxsIGlzIGRlc2VyaWFsaXplZCBieSBtYXBwaW5nIHRoZSBhY3Rpb24gYXJndW1lbnRzIGludG8gaXRzXG4gKiBkZXNlcmlhbGl6ZWQgdmVyc2lvbiBieSB1c2luZyBgZGVzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnRgLlxuICpcbiAqIEBwYXJhbSBhY3Rpb25DYWxsIEFjdGlvbiBjYWxsIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gW3RhcmdldFJvb3RdIFRhcmdldCByb290IG5vZGUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoaXMgYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC5cbiAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUFjdGlvbkNhbGwoXG4gIGFjdGlvbkNhbGw6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsLFxuICB0YXJnZXRSb290Pzogb2JqZWN0XG4pOiBBY3Rpb25DYWxsIHtcbiAgaWYgKCFhY3Rpb25DYWxsLnNlcmlhbGl6ZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IGRlc2VyaWFsaXplIGEgbm9uLXNlcmlhbGl6ZWQgYWN0aW9uIGNhbGxcIilcbiAgfVxuXG4gIGlmICh0YXJnZXRSb290ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldFJvb3QsIFwidGFyZ2V0Um9vdFwiKVxuICB9XG5cbiAgY29uc3QgZGVzZXJpYWxpemUgPSAodjogYW55KSA9PiBkZXNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudCh2LCB0YXJnZXRSb290KVxuICBjb25zdCBkZXNlcmlhbGl6ZWRBY3Rpb25DYWxsOiBBY3Rpb25DYWxsID0ge1xuICAgIC4uLmFjdGlvbkNhbGwsXG4gICAgc2VyaWFsaXplZDogdW5kZWZpbmVkLFxuICAgIGFyZ3M6IGFjdGlvbkNhbGwuYXJncy5tYXAoZGVzZXJpYWxpemUpLFxuICB9XG4gIGRlbGV0ZSAoZGVzZXJpYWxpemVkQWN0aW9uQ2FsbCBhcyBPLldyaXRhYmxlPEFjdGlvbkNhbGw+KS5zZXJpYWxpemVkXG4gIHJldHVybiBkZXNlcmlhbGl6ZWRBY3Rpb25DYWxsXG59XG5cbmxldCBkZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnMoKSB7XG4gIGlmIChkZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzUmVnaXN0ZXJlZCA9IHRydWVcblxuICAvLyBzZXJpYWxpemVyIHJlZ2lzdHJhdGlvbiAoZnJvbSBsb3cgcHJpb3JpdHkgdG8gaGlnaCBwcmlvcml0eSlcblxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIocHJpbWl0aXZlU2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKHBsYWluT2JqZWN0U2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKHNldFNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihtYXBTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIoZGF0ZVNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihhcnJheVNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihvYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihvYmplY3RQYXRoU2VyaWFsaXplcilcbn1cbiIsImltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXBwbHlBY3Rpb24gfSBmcm9tIFwiLi4vLi4vYWN0aW9uL2FwcGx5QWN0aW9uXCJcbmltcG9ydCB7IGZyb3plbktleSB9IGZyb20gXCIuLi8uLi9mcm96ZW4vRnJvemVuXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IHJlc29sdmVQYXRoIH0gZnJvbSBcIi4uLy4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB0eXBlIHsgV3JpdGFibGVQYXRoIH0gZnJvbSBcIi4uLy4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzIH0gZnJvbSBcIi4uLy4uL3BhdGNoL2FwcGx5UGF0Y2hlc1wiXG5pbXBvcnQgeyBvblBhdGNoZXMgfSBmcm9tIFwiLi4vLi4vcGF0Y2gvZW1pdFBhdGNoXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi4vLi4vcGF0Y2gvUGF0Y2hcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi8uLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgZGVzZXJpYWxpemVBY3Rpb25DYWxsLCBTZXJpYWxpemVkQWN0aW9uQ2FsbCB9IGZyb20gXCIuL2FjdGlvblNlcmlhbGl6YXRpb25cIlxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwgd2l0aCBtb2RlbCBJRCBvdmVycmlkZXMuXG4gKiBDYW4gYmUgZ2VuZXJhdGVkIHdpdGggYGFwcGx5U2VyaWFsaXplZEFjdGlvbkFuZFRyYWNrTmV3TW9kZWxJZHNgLlxuICogVG8gYmUgYXBwbGllZCB3aXRoIGBhcHBseVNlcmlhbGl6ZWRBY3Rpb25BbmRTeW5jTmV3TW9kZWxJZHNgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRBY3Rpb25DYWxsV2l0aE1vZGVsSWRPdmVycmlkZXMgZXh0ZW5kcyBTZXJpYWxpemVkQWN0aW9uQ2FsbCB7XG4gIC8qKlxuICAgKiBNb2RlbCBJZCBvdmVycmlkZXMgdG8gYmUgYXBwbGllZCBhdCB0aGUgZW5kIG9mIGFwcGx5aW5nIHRoZSBhY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBtb2RlbElkT3ZlcnJpZGVzOiBSZWFkb25seUFycmF5PFBhdGNoPlxufVxuXG4vKipcbiAqIEFwcGxpZXMgKHJ1bnMpIGEgc2VyaWFsaXplZCBhY3Rpb24gb3ZlciBhIHRhcmdldCBvYmplY3QuXG4gKiBJbiB0aGlzIG1vZGUgbmV3bHkgZ2VuZXJhdGVkIC8gbW9kaWZpZWQgbW9kZWwgSURzIHdpbGwgYmUgdHJhY2tlZFxuICogc28gdGhleSBjYW4gYmUgbGF0ZXIgc3luY2hyb25pemVkIHdoZW4gYXBwbHlpbmcgaXQgb24gYW5vdGhlciBtYWNoaW5lXG4gKiB2aWEgYGFwcGx5U2VyaWFsaXplZEFjdGlvbkFuZFN5bmNOZXdNb2RlbElkc2AuXG4gKiBUaGlzIG1lYW5zIHRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUuXG4gKlxuICogSWYgeW91IGludGVuZCB0byBhcHBseSBub24tc2VyaWFsaXplZCBhY3Rpb25zIGNoZWNrIGBhcHBseUFjdGlvbmAgaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QgdG8gcnVuIHRoZSBhY3Rpb24gb3Zlci5cbiAqIEBwYXJhbSBjYWxsIFRoZSBzZXJpYWxpemVkIGFjdGlvbiwgdXN1YWxseSBhcyBjb21pbmcgZnJvbSB0aGUgc2VydmVyL2NsaWVudC5cbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGlvbiwgaWYgYW55LCBwbHVzIGEgbmV3IHNlcmlhbGl6ZWQgYWN0aW9uXG4gKiB3aXRoIG1vZGVsIG92ZXJyaWRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2VyaWFsaXplZEFjdGlvbkFuZFRyYWNrTmV3TW9kZWxJZHM8VFJldCA9IGFueT4oXG4gIHN1YnRyZWVSb290OiBvYmplY3QsXG4gIGNhbGw6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsXG4pOiB7XG4gIHJldHVyblZhbHVlOiBUUmV0XG4gIHNlcmlhbGl6ZWRBY3Rpb25DYWxsOiBTZXJpYWxpemVkQWN0aW9uQ2FsbFdpdGhNb2RlbElkT3ZlcnJpZGVzXG59IHtcbiAgaWYgKCFjYWxsLnNlcmlhbGl6ZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IGFwcGx5IGEgbm9uLXNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwsIHVzZSAnYXBwbHlBY3Rpb24nIGluc3RlYWRcIilcbiAgfVxuXG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICBjb25zdCBkZXNlcmlhbGl6ZWRDYWxsID0gZGVzZXJpYWxpemVBY3Rpb25DYWxsKGNhbGwsIHN1YnRyZWVSb290KVxuXG4gIGNvbnN0IG1vZGVsSWRPdmVycmlkZXM6IFBhdGNoW10gPSBbXVxuXG4gIC8vIHNldCBhIHBhdGNoIGxpc3RlbmVyIHRvIHRyYWNrIGNoYW5nZXMgdG8gbW9kZWwgaWRzXG4gIGNvbnN0IHBhdGNoRGlzcG9zZXIgPSBvblBhdGNoZXMoc3VidHJlZVJvb3QsIChwYXRjaGVzKSA9PiB7XG4gICAgc2NhblBhdGNoZXNGb3JNb2RlbElkQ2hhbmdlcyhzdWJ0cmVlUm9vdCwgbW9kZWxJZE92ZXJyaWRlcywgcGF0Y2hlcylcbiAgfSlcblxuICB0cnkge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gYXBwbHlBY3Rpb24oc3VidHJlZVJvb3QsIGRlc2VyaWFsaXplZENhbGwpXG5cbiAgICByZXR1cm4ge1xuICAgICAgcmV0dXJuVmFsdWUsXG4gICAgICBzZXJpYWxpemVkQWN0aW9uQ2FsbDoge1xuICAgICAgICAuLi5jYWxsLFxuICAgICAgICBtb2RlbElkT3ZlcnJpZGVzLFxuICAgICAgfSxcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcGF0Y2hEaXNwb3NlcigpXG4gIH1cbn1cblxuZnVuY3Rpb24gc2NhblBhdGNoZXNGb3JNb2RlbElkQ2hhbmdlcyhyb290OiBvYmplY3QsIG1vZGVsSWRPdmVycmlkZXM6IFBhdGNoW10sIHBhdGNoZXM6IFBhdGNoW10pIHtcbiAgY29uc3QgbGVuID0gcGF0Y2hlcy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hlc1tpXVxuICAgIGlmIChwYXRjaC5vcCA9PT0gXCJyZXBsYWNlXCIgfHwgcGF0Y2gub3AgPT09IFwiYWRkXCIpIHtcbiAgICAgIGRlZXBTY2FuVmFsdWVGb3JNb2RlbElkQ2hhbmdlcyhcbiAgICAgICAgcm9vdCxcbiAgICAgICAgbW9kZWxJZE92ZXJyaWRlcyxcbiAgICAgICAgcGF0Y2gudmFsdWUsXG4gICAgICAgIHBhdGNoLnBhdGggYXMgV3JpdGFibGVQYXRoXG4gICAgICApXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZXBTY2FuVmFsdWVGb3JNb2RlbElkQ2hhbmdlcyhcbiAgcm9vdDogb2JqZWN0LFxuICBtb2RlbElkT3ZlcnJpZGVzOiBQYXRjaFtdLFxuICB2YWx1ZTogYW55LFxuICBwYXRoOiBXcml0YWJsZVBhdGhcbikge1xuICBpZiAocGF0aC5sZW5ndGggPj0gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBlbnN1cmUgdGhlIHBhcmVudCBpcyBhbiBhY3R1YWwgbW9kZWxcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlUGF0aChyb290LCBwYXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoIC0gMSkpLnZhbHVlXG5cbiAgICBpZiAoaXNNb2RlbChwYXJlbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV1cbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT09IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUocGFyZW50LmNvbnN0cnVjdG9yIGFzIGFueSkpIHtcbiAgICAgICAgLy8gZm91bmQgb25lXG4gICAgICAgIG1vZGVsSWRPdmVycmlkZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgIHBhdGg6IHBhdGguc2xpY2UoKSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgbGVuID0gdmFsdWUubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgcGF0aC5wdXNoKGkpXG4gICAgICBkZWVwU2NhblZhbHVlRm9yTW9kZWxJZENoYW5nZXMocm9vdCwgbW9kZWxJZE92ZXJyaWRlcywgdmFsdWVbaV0sIHBhdGgpXG4gICAgICBwYXRoLnBvcCgpXG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIC8vIHNraXAgZnJvemVuIHZhbHVlc1xuICAgIGlmICghdmFsdWVbZnJvemVuS2V5XSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKVxuICAgICAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGhcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBrZXlzW2ldXG4gICAgICAgIGNvbnN0IHByb3BWYWx1ZSA9IHZhbHVlW3Byb3BOYW1lXVxuXG4gICAgICAgIHBhdGgucHVzaChwcm9wTmFtZSlcbiAgICAgICAgZGVlcFNjYW5WYWx1ZUZvck1vZGVsSWRDaGFuZ2VzKHJvb3QsIG1vZGVsSWRPdmVycmlkZXMsIHByb3BWYWx1ZSwgcGF0aClcbiAgICAgICAgcGF0aC5wb3AoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgKHJ1bnMpIGEgc2VyaWFsaXplZCBhY3Rpb24gb3ZlciBhIHRhcmdldCBvYmplY3QuXG4gKiBJbiB0aGlzIG1vZGUgbmV3bHkgZ2VuZXJhdGVkIC8gbW9kaWZpZWQgbW9kZWwgSURzIHByZXZpb3VzbHkgdHJhY2tlZFxuICogYnkgYGFwcGx5U2VyaWFsaXplZEFjdGlvbkFuZFRyYWNrTmV3TW9kZWxJZHNgIHdpbGwgYmUgc3luY2hyb25pemVkIGFmdGVyXG4gKiB0aGUgYWN0aW9uIGlzIGFwcGxpZWQuXG4gKiBUaGlzIG1lYW5zIHRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUuXG4gKlxuICogSWYgeW91IGludGVuZCB0byBhcHBseSBub24tc2VyaWFsaXplZCBhY3Rpb25zIGNoZWNrIGBhcHBseUFjdGlvbmAgaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QgdG8gcnVuIHRoZSBhY3Rpb24gb3Zlci5cbiAqIEBwYXJhbSBjYWxsIFRoZSBzZXJpYWxpemVkIGFjdGlvbiwgdXN1YWxseSBhcyBjb21pbmcgZnJvbSB0aGUgc2VydmVyL2NsaWVudC5cbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGlvbiwgaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kU3luY05ld01vZGVsSWRzPFRSZXQgPSBhbnk+KFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0LFxuICBjYWxsOiBTZXJpYWxpemVkQWN0aW9uQ2FsbFdpdGhNb2RlbElkT3ZlcnJpZGVzXG4pOiBUUmV0IHtcbiAgaWYgKCFjYWxsLnNlcmlhbGl6ZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IGFwcGx5IGEgbm9uLXNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwsIHVzZSAnYXBwbHlBY3Rpb24nIGluc3RlYWRcIilcbiAgfVxuXG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICBjb25zdCBkZXNlcmlhbGl6ZWRDYWxsID0gZGVzZXJpYWxpemVBY3Rpb25DYWxsKGNhbGwsIHN1YnRyZWVSb290KVxuXG4gIGxldCByZXR1cm5WYWx1ZTogYW55XG4gIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICByZXR1cm5WYWx1ZSA9IGFwcGx5QWN0aW9uKHN1YnRyZWVSb290LCBkZXNlcmlhbGl6ZWRDYWxsKVxuXG4gICAgLy8gYXBwbHkgbW9kZWwgaWQgb3ZlcnJpZGVzXG4gICAgYXBwbHlQYXRjaGVzKHN1YnRyZWVSb290LCBjYWxsLm1vZGVsSWRPdmVycmlkZXMpXG4gIH0pXG5cbiAgcmV0dXJuIHJldHVyblZhbHVlXG59XG4iLCJpbXBvcnQge1xuICBBY3Rpb25Db250ZXh0LFxuICBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSxcbiAgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUsXG59IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQge1xuICBBY3Rpb25NaWRkbGV3YXJlLFxuICBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIsXG4gIGFkZEFjdGlvbk1pZGRsZXdhcmUsXG59IGZyb20gXCIuLi9hY3Rpb24vbWlkZGxld2FyZVwiXG5pbXBvcnQgdHlwZSB7IEZsb3dGaW5pc2hlciB9IGZyb20gXCIuLi9hY3Rpb24vbW9kZWxGbG93XCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBhY3Rpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVBY3Rpb25Db250ZXh0IHtcbiAgLyoqXG4gICAqIEFjdGlvbiBuYW1lXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25OYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIEFjdGlvbiB0eXBlLCBzeW5jIG9yIGFzeW5jLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGVcbiAgLyoqXG4gICAqIEFjdGlvbiB0YXJnZXQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ6IEFueU1vZGVsXG4gIC8qKlxuICAgKiBBcnJheSBvZiBhY3Rpb24gYXJndW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJnczogUmVhZG9ubHlBcnJheTxhbnk+XG4gIC8qKlxuICAgKiBQYXJlbnQgYWN0aW9uIGNvbnRleHQsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudENvbnRleHQ/OiBTaW1wbGVBY3Rpb25Db250ZXh0XG4gIC8qKlxuICAgKiBSb290IGFjdGlvbiBjb250ZXh0LCBvciBpdHNlbGYgaWYgdGhlIHJvb3QuXG4gICAqL1xuICByZWFkb25seSByb290Q29udGV4dDogU2ltcGxlQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogQ3VzdG9tIGRhdGEgZm9yIHRoZSBhY3Rpb24gY29udGV4dCB0byBiZSBzZXQgYnkgbWlkZGxld2FyZXMsIGFuIG9iamVjdC5cbiAgICogU3ltYm9scyBtdXN0IGJlIHVzZWQgYXMga2V5cyB0byBhdm9pZCBuYW1lIGNsYXNoaW5nIGJldHdlZW4gbWlkZGxld2FyZXMuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBSZWNvcmQ8c3ltYm9sLCBhbnk+XG59XG5cbi8qKlxuICogQWN0aW9uIHRyYWNraW5nIG1pZGRsZXdhcmUgZmluaXNoIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGVudW0gQWN0aW9uVHJhY2tpbmdSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGFjdGlvbiByZXR1cm5lZCBub3JtYWxseSAod2l0aG91dCB0aHJvd2luZykuXG4gICAqL1xuICBSZXR1cm4gPSBcInJldHVyblwiLFxuICAvKipcbiAgICogVGhlIGFjdGlvbiB0aHJldyBhbiBlcnJvci5cbiAgICovXG4gIFRocm93ID0gXCJ0aHJvd1wiLFxufVxuXG4vKipcbiAqIEFjdGlvbiB0cmFja2luZyBtaWRkbGV3YXJlIGhvb2tzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvblRyYWNraW5nTWlkZGxld2FyZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgZnVuY3Rpb24gY2FsbGVkIHdoZW5ldmVyIGVhY2ggYWN0aW9uIHN0YXJ0cywgYW5kIG9ubHkgdGhlbi5cbiAgICpcbiAgICogSWYgdGhlIGFjdGlvbiBpcyBhY2NlcHRlZCB0aGVuIGBvblN0YXJ0YCwgYG9uUmVzdW1lYCwgYG9uU3VzcGVuZGAgYW5kIGBvbkZpbmlzaGBcbiAgICogZm9yIHRoYXQgcGFydGljdWxhciBhY3Rpb24gd2lsbCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEFsbCBhY3Rpb25zIGFyZSBhY2NlcHRlZCBieSBkZWZhdWx0IGlmIG5vIGZpbHRlciBmdW5jdGlvbiBpcyBwcmVzZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHRydWUgdG8gYWNjZXB0IHRoZSBhY3Rpb24sIGZhbHNlIHRvIHNraXAgaXQuXG4gICAqL1xuICBmaWx0ZXI/KGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IGJvb2xlYW5cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIGp1c3Qgc3RhcnRlZC5cbiAgICpcbiAgICogQHBhcmFtIGN0eCBTaW1wbGlmaWVkIGFjdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBDYW4gb3B0aW9uYWxseSByZXR1cm4gYSByZXN1bHQgdGhhdCB3aWxsIGNhbmNlbCB0aGUgb3JpZ2luYWwgYWN0aW9uIGFuZCBmaW5pc2ggaXRcbiAgICogd2l0aCB0aGUgcmV0dXJuZWQgdmFsdWUgLyBlcnJvciB0byBiZSB0aHJvd24uIEluIGVpdGhlciBjYXNlIGNhc2UgcmVzdW1lIC8gc3VzcGVuZCAvIGZpbmlzaCB3aWxsXG4gICAqIHN0aWxsIGJlIGNhbGxlZCBub3JtYWxseS5cbiAgICovXG4gIG9uU3RhcnQ/KGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IHZvaWQgfCBBY3Rpb25UcmFja2luZ1JldHVyblxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24ganVzdCByZXN1bWVkIGEgc3luY2hyb25vdXMgcGllY2Ugb2YgY29kZSBleGVjdXRpb24uXG4gICAqIEdldHMgY2FsbGVkIG9uY2UgZm9yIHN5bmMgYWN0aW9ucyBhbmQgbXVsdGlwbGUgdGltZXMgZm9yIGZsb3dzLlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gICAqL1xuICBvblJlc3VtZT8oY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogdm9pZFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24ganVzdCBmaW5pc2hlZCBhIHN5bmNocm9ub3VzIHBpY2Ugb2YgY29kZSBleGVjdXRpb24uXG4gICAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiB0aGUgYWN0aW9uIGlzIGZpbmlzaGVkLlxuICAgKiBHZXRzIGNhbGxlZCBvbmNlIGZvciBzeW5jIGFjdGlvbnMgYW5kIG11bHRpcGxlIHRpbWVzIGZvciBmbG93cy5cbiAgICpcbiAgICogQHBhcmFtIGN0eCBTaW1wbGlmaWVkIGFjdGlvbiBjb250ZXh0LlxuICAgKi9cbiAgb25TdXNwZW5kPyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBqdXN0IGZpbmlzaGVkLCBlaXRoZXIgYnkgcmV0dXJuaW5nIG5vcm1hbGx5IG9yIGJ5IHRocm93aW5nIGFuIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gICAqIEBwYXJhbSByZXQgQWN0aW9uIHJldHVybiByZXN1bHQuXG4gICAqIEByZXR1cm5zIENhbiBvcHRpb25hbGx5IHJldHVybiBhIG5ldyByZXN1bHQgdGhhdCB3aWxsIG92ZXJyaWRlIHRoZSBvcmlnaW5hbCBvbmUuXG4gICAqL1xuICBvbkZpbmlzaD8oY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LCByZXQ6IEFjdGlvblRyYWNraW5nUmV0dXJuKTogdm9pZCB8IEFjdGlvblRyYWNraW5nUmV0dXJuXG59XG5cbi8qKlxuICogUmV0dXJuIHJlc3VsdCBvZiBhbiBhY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVHJhY2tpbmdSZXR1cm4ge1xuICByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0XG4gIHZhbHVlOiBhbnlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGlvbiB0cmFja2luZyBtaWRkbGV3YXJlLCB3aGljaCBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvblxuICogb2YgdGhlIHN0YW5kYXJkIGFjdGlvbiBtaWRkbGV3YXJlLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBob29rcyBNaWRkbGV3YXJlIGhvb2tzLlxuICogQHJldHVybnMgVGhlIG1pZGRsZXdhcmUgZGlzcG9zZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUoXG4gIHN1YnRyZWVSb290OiBvYmplY3QsXG4gIGhvb2tzOiBBY3Rpb25UcmFja2luZ01pZGRsZXdhcmVcbik6IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICBjb25zdCBkYXRhU3ltYm9sID0gU3ltYm9sKFwiYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlRGF0YVwiKVxuXG4gIGVudW0gU3RhdGUge1xuICAgIElkbGUgPSBcImlkbGVcIixcbiAgICBTdGFydGVkID0gXCJzdGFydGVkXCIsXG4gICAgUmVhbFJlc3VtZWQgPSBcInJlYWxSZXN1bWVkXCIsXG4gICAgRmFrZVJlc3VtZWQgPSBcImZha2VSZXN1bWVkXCIsXG4gICAgU3VzcGVuZGVkID0gXCJzdXNwZW5kZWRcIixcbiAgICBGaW5pc2hlZCA9IFwiZmluaXNoZWRcIixcbiAgfVxuXG4gIGludGVyZmFjZSBEYXRhIHtcbiAgICBzdGFydEFjY2VwdGVkOiBib29sZWFuXG4gICAgc3RhdGU6IFN0YXRlXG4gIH1cblxuICBmdW5jdGlvbiBnZXRDdHhEYXRhKGN0eDogQWN0aW9uQ29udGV4dCB8IFNpbXBsZUFjdGlvbkNvbnRleHQpOiBEYXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY3R4LmRhdGFbZGF0YVN5bWJvbF1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEN0eERhdGEoY3R4OiBBY3Rpb25Db250ZXh0IHwgU2ltcGxlQWN0aW9uQ29udGV4dCwgcGFydGlhbERhdGE6IFBhcnRpYWw8RGF0YT4pIHtcbiAgICBsZXQgY3VycmVudERhdGEgPSBjdHguZGF0YVtkYXRhU3ltYm9sXVxuICAgIGlmICghY3VycmVudERhdGEpIHtcbiAgICAgIGN0eC5kYXRhW2RhdGFTeW1ib2xdID0gcGFydGlhbERhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmFzc2lnbihjdXJyZW50RGF0YSwgcGFydGlhbERhdGEpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdXNlckZpbHRlcjogQWN0aW9uTWlkZGxld2FyZVtcImZpbHRlclwiXSA9IChjdHgpID0+IHtcbiAgICBpZiAoaG9va3MuZmlsdGVyKSB7XG4gICAgICByZXR1cm4gaG9va3MuZmlsdGVyKHNpbXBsaWZ5QWN0aW9uQ29udGV4dChjdHgpKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCByZXN1bWVTdXNwZW5kU3VwcG9ydCA9ICEhaG9va3Mub25SZXN1bWUgfHwgISFob29rcy5vblN1c3BlbmRcblxuICBjb25zdCBmaWx0ZXI6IEFjdGlvbk1pZGRsZXdhcmVbXCJmaWx0ZXJcIl0gPSAoY3R4KSA9PiB7XG4gICAgaWYgKGN0eC50eXBlID09PSBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jKSB7XG4gICAgICAvLyBzdGFydCBhbmQgZmluaXNoIGlzIG9uIHRoZSBzYW1lIGNvbnRleHRcbiAgICAgIGNvbnN0IGFjY2VwdGVkID0gdXNlckZpbHRlcihjdHgpXG4gICAgICBpZiAoYWNjZXB0ZWQpIHtcbiAgICAgICAgc2V0Q3R4RGF0YShjdHgsIHtcbiAgICAgICAgICBzdGFydEFjY2VwdGVkOiB0cnVlLFxuICAgICAgICAgIHN0YXRlOiBTdGF0ZS5JZGxlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY2VwdGVkXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoY3R4LmFzeW5jU3RlcFR5cGUpIHtcbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5TcGF3bjpcbiAgICAgICAgICBjb25zdCBhY2NlcHRlZCA9IHVzZXJGaWx0ZXIoY3R4KVxuICAgICAgICAgIGlmIChhY2NlcHRlZCkge1xuICAgICAgICAgICAgc2V0Q3R4RGF0YShjdHgsIHtcbiAgICAgICAgICAgICAgc3RhcnRBY2NlcHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgc3RhdGU6IFN0YXRlLklkbGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjZXB0ZWRcblxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJldHVybjpcbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5UaHJvdzpcbiAgICAgICAgICAvLyBkZXBlbmRzIGlmIHRoZSBzcGF3biBvbmUgd2FzIGFjY2VwdGVkIG9yIG5vdFxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBnZXRDdHhEYXRhKGN0eC5zcGF3bkFzeW5jU3RlcENvbnRleHQhKVxuICAgICAgICAgIHJldHVybiBkYXRhID8gZGF0YS5zdGFydEFjY2VwdGVkIDogZmFsc2VcblxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJlc3VtZTpcbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWVFcnJvcjpcbiAgICAgICAgICBpZiAoIXJlc3VtZVN1c3BlbmRTdXBwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVwZW5kcyBpZiB0aGUgc3Bhd24gb25lIHdhcyBhY2NlcHRlZCBvciBub3RcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBnZXRDdHhEYXRhKGN0eC5zcGF3bkFzeW5jU3RlcENvbnRleHQhKVxuICAgICAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhLnN0YXJ0QWNjZXB0ZWQgOiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gKHNpbXBsZUN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IEFjdGlvblRyYWNraW5nUmV0dXJuIHwgdW5kZWZpbmVkID0+IHtcbiAgICBzZXRDdHhEYXRhKHNpbXBsZUN0eCwge1xuICAgICAgc3RhdGU6IFN0YXRlLlN0YXJ0ZWQsXG4gICAgfSlcbiAgICBpZiAoaG9va3Mub25TdGFydCkge1xuICAgICAgcmV0dXJuIGhvb2tzLm9uU3RhcnQoc2ltcGxlQ3R4KSB8fCB1bmRlZmluZWRcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgZmluaXNoID0gKFxuICAgIHNpbXBsZUN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCxcbiAgICByZXQ6IEFjdGlvblRyYWNraW5nUmV0dXJuXG4gICk6IEFjdGlvblRyYWNraW5nUmV0dXJuID0+IHtcbiAgICAvLyBmYWtlbHkgcmVzdW1lIGFuZCBzdXNwZW5kIHRoZSBwYXJlbnQgaWYgbmVlZGVkXG4gICAgY29uc3QgcGFyZW50Q3R4ID0gc2ltcGxlQ3R4LnBhcmVudENvbnRleHRcbiAgICBsZXQgcGFyZW50UmVzdW1lZCA9IGZhbHNlXG4gICAgaWYgKHBhcmVudEN0eCkge1xuICAgICAgY29uc3QgcGFyZW50RGF0YSA9IGdldEN0eERhdGEocGFyZW50Q3R4KVxuICAgICAgaWYgKHBhcmVudERhdGEgJiYgcGFyZW50RGF0YS5zdGFydEFjY2VwdGVkICYmIHBhcmVudERhdGEuc3RhdGUgPT09IFN0YXRlLlN1c3BlbmRlZCkge1xuICAgICAgICBwYXJlbnRSZXN1bWVkID0gdHJ1ZVxuICAgICAgICByZXN1bWUocGFyZW50Q3R4LCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDdHhEYXRhKHNpbXBsZUN0eCwge1xuICAgICAgc3RhdGU6IFN0YXRlLkZpbmlzaGVkLFxuICAgIH0pXG5cbiAgICBpZiAoaG9va3Mub25GaW5pc2gpIHtcbiAgICAgIHJldCA9IGhvb2tzLm9uRmluaXNoKHNpbXBsZUN0eCwgcmV0KSB8fCByZXRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50UmVzdW1lZCkge1xuICAgICAgc3VzcGVuZChwYXJlbnRDdHghKVxuICAgIH1cblxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGNvbnN0IHJlc3VtZSA9IChzaW1wbGVDdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQsIHJlYWw6IGJvb2xlYW4pID0+IHtcbiAgICAvLyBlbnN1cmUgcGFyZW50cyBhcmUgcmVzdW1lZFxuICAgIGNvbnN0IHBhcmVudEN0eCA9IHNpbXBsZUN0eC5wYXJlbnRDb250ZXh0XG4gICAgaWYgKHBhcmVudEN0eCkge1xuICAgICAgY29uc3QgcGFyZW50RGF0YSA9IGdldEN0eERhdGEocGFyZW50Q3R4KVxuICAgICAgaWYgKHBhcmVudERhdGEgJiYgcGFyZW50RGF0YS5zdGFydEFjY2VwdGVkICYmIHBhcmVudERhdGEuc3RhdGUgPT09IFN0YXRlLlN1c3BlbmRlZCkge1xuICAgICAgICByZXN1bWUocGFyZW50Q3R4LCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDdHhEYXRhKHNpbXBsZUN0eCwge1xuICAgICAgc3RhdGU6IHJlYWwgPyBTdGF0ZS5SZWFsUmVzdW1lZCA6IFN0YXRlLkZha2VSZXN1bWVkLFxuICAgIH0pXG4gICAgaWYgKGhvb2tzLm9uUmVzdW1lKSB7XG4gICAgICBob29rcy5vblJlc3VtZShzaW1wbGVDdHgpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3VzcGVuZCA9IChzaW1wbGVDdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpID0+IHtcbiAgICBzZXRDdHhEYXRhKHNpbXBsZUN0eCwge1xuICAgICAgc3RhdGU6IFN0YXRlLlN1c3BlbmRlZCxcbiAgICB9KVxuICAgIGlmIChob29rcy5vblN1c3BlbmQpIHtcbiAgICAgIGhvb2tzLm9uU3VzcGVuZChzaW1wbGVDdHgpXG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIHBhcmVudHMgYXJlIHN1c3BlbmRlZCBpZiB0aGV5IHdlcmUgZmFrZWx5IHJlc3VtZWRcbiAgICBjb25zdCBwYXJlbnRDdHggPSBzaW1wbGVDdHgucGFyZW50Q29udGV4dFxuICAgIGlmIChwYXJlbnRDdHgpIHtcbiAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBnZXRDdHhEYXRhKHBhcmVudEN0eClcbiAgICAgIGlmIChwYXJlbnREYXRhICYmIHBhcmVudERhdGEuc3RhcnRBY2NlcHRlZCAmJiBwYXJlbnREYXRhLnN0YXRlID09PSBTdGF0ZS5GYWtlUmVzdW1lZCkge1xuICAgICAgICBzdXNwZW5kKHBhcmVudEN0eClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBtd2FyZTogQWN0aW9uTWlkZGxld2FyZVtcIm1pZGRsZXdhcmVcIl0gPSAoY3R4LCBuZXh0KSA9PiB7XG4gICAgY29uc3Qgc2ltcGxlQ3R4ID0gc2ltcGxpZnlBY3Rpb25Db250ZXh0KGN0eClcblxuICAgIGNvbnN0IG9yaWdOZXh0ID0gbmV4dFxuICAgIG5leHQgPSAoKSA9PiB7XG4gICAgICByZXN1bWUoc2ltcGxlQ3R4LCB0cnVlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWdOZXh0KClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHN1c3BlbmQoc2ltcGxlQ3R4KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdHgudHlwZSA9PT0gQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYykge1xuICAgICAgbGV0IHJldE9iaiA9IHN0YXJ0KHNpbXBsZUN0eClcblxuICAgICAgaWYgKHJldE9iaikge1xuICAgICAgICAvLyBhY3Rpb24gY2FuY2VsZWQgLyBvdmVycmlkZGVuIGJ5IG9uU3RhcnRcbiAgICAgICAgcmVzdW1lKHNpbXBsZUN0eCwgdHJ1ZSlcbiAgICAgICAgc3VzcGVuZChzaW1wbGVDdHgpXG4gICAgICAgIHJldE9iaiA9IGZpbmlzaChzaW1wbGVDdHgsIHJldE9iailcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwgeyByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0LlJldHVybiwgdmFsdWU6IG5leHQoKSB9KVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCB7IHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQuVGhyb3csIHZhbHVlOiBlcnIgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0dXJuT3JUaHJvd0FjdGlvblRyYWNraW5nUmV0dXJuKHJldE9iailcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXN5bmNcblxuICAgICAgc3dpdGNoIChjdHguYXN5bmNTdGVwVHlwZSkge1xuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlNwYXduOiB7XG4gICAgICAgICAgbGV0IHJldE9iaiA9IHN0YXJ0KHNpbXBsZUN0eClcbiAgICAgICAgICBpZiAocmV0T2JqKSB7XG4gICAgICAgICAgICAvLyBhY3Rpb24gY2FuY2VsZWQgLyBvdmVycmlkZGVuIGJ5IG9uU3RhcnRcbiAgICAgICAgICAgIHJlc3VtZShzaW1wbGVDdHgsIHRydWUpXG4gICAgICAgICAgICBzdXNwZW5kKHNpbXBsZUN0eClcbiAgICAgICAgICAgIHJldE9iaiA9IGZpbmlzaChzaW1wbGVDdHgsIHJldE9iailcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5PclRocm93QWN0aW9uVHJhY2tpbmdSZXR1cm4ocmV0T2JqKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXR1cm46IHtcbiAgICAgICAgICBjb25zdCBmbG93RmluaXNoZXI6IEZsb3dGaW5pc2hlciA9IG5leHQoKVxuICAgICAgICAgIGNvbnN0IHJldE9iaiA9IGZpbmlzaChzaW1wbGVDdHgsIHtcbiAgICAgICAgICAgIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuLFxuICAgICAgICAgICAgdmFsdWU6IGZsb3dGaW5pc2hlci52YWx1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGZsb3dGaW5pc2hlci5yZXNvbHV0aW9uID1cbiAgICAgICAgICAgIHJldE9iai5yZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlJldHVybiA/IFwiYWNjZXB0XCIgOiBcInJlamVjdFwiXG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLnZhbHVlID0gcmV0T2JqLnZhbHVlXG4gICAgICAgICAgcmV0dXJuIGZsb3dGaW5pc2hlclxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5UaHJvdzoge1xuICAgICAgICAgIGNvbnN0IGZsb3dGaW5pc2hlcjogRmxvd0ZpbmlzaGVyID0gbmV4dCgpXG4gICAgICAgICAgY29uc3QgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwge1xuICAgICAgICAgICAgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdyxcbiAgICAgICAgICAgIHZhbHVlOiBmbG93RmluaXNoZXIudmFsdWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBmbG93RmluaXNoZXIucmVzb2x1dGlvbiA9XG4gICAgICAgICAgICByZXRPYmoucmVzdWx0ID09PSBBY3Rpb25UcmFja2luZ1Jlc3VsdC5SZXR1cm4gPyBcImFjY2VwdFwiIDogXCJyZWplY3RcIlxuICAgICAgICAgIGZsb3dGaW5pc2hlci52YWx1ZSA9IHJldE9iai52YWx1ZVxuICAgICAgICAgIHJldHVybiBmbG93RmluaXNoZXJcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lOlxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJlc3VtZUVycm9yOlxuICAgICAgICAgIGlmIChyZXN1bWVTdXNwZW5kU3VwcG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgICAgICBgYXNzZXJ0aW9uIGVycm9yOiBhc3luYyBzdGVwIHNob3VsZCBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0IC0gJHtjdHguYXN5bmNTdGVwVHlwZX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICAgIGBhc3NlcnRpb24gZXJyb3I6IGFzeW5jIHN0ZXAgc2hvdWxkIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQgLSAke2N0eC5hc3luY1N0ZXBUeXBlfWBcbiAgICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFkZEFjdGlvbk1pZGRsZXdhcmUoeyBtaWRkbGV3YXJlOiBtd2FyZSwgZmlsdGVyLCBzdWJ0cmVlUm9vdDogc3VidHJlZVJvb3QgfSlcbn1cblxuZnVuY3Rpb24gcmV0dXJuT3JUaHJvd0FjdGlvblRyYWNraW5nUmV0dXJuKHJldE9iajogQWN0aW9uVHJhY2tpbmdSZXR1cm4pIHtcbiAgaWYgKHJldE9iai5yZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlJldHVybikge1xuICAgIHJldHVybiByZXRPYmoudmFsdWVcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyByZXRPYmoudmFsdWVcbiAgfVxufVxuXG5jb25zdCBzaW1wbGVEYXRhQ29udGV4dFN5bWJvbCA9IFN5bWJvbChcInNpbXBsZURhdGFDb250ZXh0XCIpXG5cbi8qKlxuICogU2ltcGxpZmllcyBhbiBhY3Rpb24gY29udGV4dCBieSBjb252ZXJ0aW5nIGFuIGFzeW5jIGNhbGwgaGllcmFyY2h5IGludG8gYSBzaW1wbGVyIG9uZS5cbiAqXG4gKiBAcGFyYW0gY3R4IEFjdGlvbiBjb250ZXh0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBTaW1wbGlmaWVkIGFjdGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2ltcGxpZnlBY3Rpb25Db250ZXh0KGN0eDogQWN0aW9uQ29udGV4dCk6IFNpbXBsZUFjdGlvbkNvbnRleHQge1xuICB3aGlsZSAoY3R4LnByZXZpb3VzQXN5bmNTdGVwQ29udGV4dCkge1xuICAgIGN0eCA9IGN0eC5wcmV2aW91c0FzeW5jU3RlcENvbnRleHRcbiAgfVxuXG4gIGxldCBzaW1wbGVDdHggPSBjdHguZGF0YVtzaW1wbGVEYXRhQ29udGV4dFN5bWJvbF1cbiAgaWYgKCFzaW1wbGVDdHgpIHtcbiAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gY3R4LnBhcmVudENvbnRleHQgPyBzaW1wbGlmeUFjdGlvbkNvbnRleHQoY3R4LnBhcmVudENvbnRleHQpIDogdW5kZWZpbmVkXG5cbiAgICBzaW1wbGVDdHggPSB7XG4gICAgICBhY3Rpb25OYW1lOiBjdHguYWN0aW9uTmFtZSxcbiAgICAgIHR5cGU6IGN0eC50eXBlLFxuICAgICAgdGFyZ2V0OiBjdHgudGFyZ2V0LFxuICAgICAgYXJnczogY3R4LmFyZ3MsXG4gICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgIHBhcmVudENvbnRleHQsXG4gICAgfVxuICAgIHNpbXBsZUN0eC5yb290Q29udGV4dCA9IHBhcmVudENvbnRleHQgPyBwYXJlbnRDb250ZXh0LnJvb3RDb250ZXh0IDogc2ltcGxlQ3R4XG5cbiAgICBjdHguZGF0YVtzaW1wbGVEYXRhQ29udGV4dFN5bWJvbF0gPSBzaW1wbGVDdHhcbiAgfVxuICByZXR1cm4gc2ltcGxlQ3R4XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFjdGlvbkNhbGwgfSBmcm9tIFwiLi4vYWN0aW9uL2FwcGx5QWN0aW9uXCJcbmltcG9ydCB7IGlzSG9va0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vaG9va0FjdGlvbnNcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHsgZmFzdEdldFJvb3RQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZSxcbiAgQWN0aW9uVHJhY2tpbmdSZXR1cm4sXG4gIFNpbXBsZUFjdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL2FjdGlvblRyYWNraW5nTWlkZGxld2FyZVwiXG5pbXBvcnQgeyByb290UGF0aFRvVGFyZ2V0UGF0aElkcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBBdHRhY2hlcyBhbiBhY3Rpb24gbWlkZGxld2FyZSB0aGF0IGludm9rZXMgYSBsaXN0ZW5lciBmb3IgYWxsIGFjdGlvbnMgb2YgYSBnaXZlbiB0cmVlLlxuICogTm90ZSB0aGF0IHRoZSBsaXN0ZW5lciB3aWxsIG9ubHkgYmUgaW52b2tlZCBmb3IgdGhlIHRvcG1vc3QgbGV2ZWwgYWN0aW9ucywgc28gaXQgd29uJ3QgcnVuIGZvciBjaGlsZCBhY3Rpb25zIG9yIGludGVybWVkaWFyeSBmbG93IHN0ZXBzLlxuICogQWxzbyBpdCB3b24ndCB0cmlnZ2VyIHRoZSBsaXN0ZW5lciBmb3IgY2FsbHMgdG8gaG9va3Mgc3VjaCBhcyBgb25BdHRhY2hlZFRvUm9vdFN0b3JlYCBvciBpdHMgcmV0dXJuZWQgZGlzcG9zZXIuXG4gKlxuICogSXRzIG1haW4gdXNlIGlzIHRvIGtlZXAgdHJhY2sgb2YgdG9wIGxldmVsIGFjdGlvbnMgdGhhdCBjYW4gYmUgbGF0ZXIgcmVwbGljYXRlZCB2aWEgYGFwcGx5QWN0aW9uYCBzb21ld2hlcmUgZWxzZSAoYW5vdGhlciBtYWNoaW5lLCBldGMuKS5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIGtpbmQgb2YgcG9zc2libGUgbGlzdGVuZXJzLCBgb25TdGFydGAgYW5kIGBvbkZpbmlzaGAgbGlzdGVuZXJzLlxuICogYG9uU3RhcnRgIGxpc3RlbmVycyBhcmUgY2FsbGVkIGJlZm9yZSB0aGUgYWN0aW9uIGV4ZWN1dGVzIGFuZCBhbGxvdyBjYW5jZWxsYXRpb24gYnkgcmV0dXJuaW5nIGEgbmV3IHJldHVybiB2YWx1ZSAod2hpY2ggbWlnaHQgYmUgYSByZXR1cm4gb3IgYSB0aHJvdykuXG4gKiBgb25GaW5pc2hgIGxpc3RlbmVycyBhcmUgY2FsbGVkIGFmdGVyIHRoZSBhY3Rpb24gZXhlY3V0ZXMsIGhhdmUgYWNjZXNzIHRvIHRoZSBhY3Rpb24gYWN0dWFsIHJldHVybiB2YWx1ZSBhbmQgYWxsb3cgb3ZlcnJpZGluZyBieSByZXR1cm5pbmcgYVxuICogbmV3IHJldHVybiB2YWx1ZSAod2hpY2ggbWlnaHQgYmUgYSByZXR1cm4gb3IgYSB0aHJvdykuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBhY3Rpb24gY2FsbHMgYXJlIHNlcmlhbGl6YWJsZSB5b3Ugc2hvdWxkIHVzZSBlaXRoZXIgYHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudGAgb3ZlciB0aGUgYXJndW1lbnRzXG4gKiBvciBgc2VyaWFsaXplQWN0aW9uQ2FsbGAgb3ZlciB0aGUgd2hvbGUgYWN0aW9uIGJlZm9yZSBzZW5kaW5nIHRoZSBhY3Rpb24gY2FsbCBvdmVyIHRoZSB3aXJlIC8gc3RvcmluZyB0aGVtIC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gbGlzdGVuZXJzIExpc3RlbmVyIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgaW52b2tlZCBldmVyeXRpbWUgYSB0b3Btb3N0IGFjdGlvbiBpcyBpbnZva2VkIG9uIHRoZSBtb2RlbCBvciBhbnkgY2hpbGRyZW4uXG4gKiBAcmV0dXJucyBUaGUgbWlkZGxld2FyZSBkaXNwb3Nlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQWN0aW9uTWlkZGxld2FyZShcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgb25TdGFydD86IChcbiAgICAgIGFjdGlvbkNhbGw6IEFjdGlvbkNhbGwsXG4gICAgICBhY3Rpb25Db250ZXh0OiBTaW1wbGVBY3Rpb25Db250ZXh0XG4gICAgKSA9PiB2b2lkIHwgQWN0aW9uVHJhY2tpbmdSZXR1cm5cbiAgICBvbkZpbmlzaD86IChcbiAgICAgIGFjdGlvbkNhbGw6IEFjdGlvbkNhbGwsXG4gICAgICBhY3Rpb25Db250ZXh0OiBTaW1wbGVBY3Rpb25Db250ZXh0LFxuICAgICAgcmV0OiBBY3Rpb25UcmFja2luZ1JldHVyblxuICAgICkgPT4gdm9pZCB8IEFjdGlvblRyYWNraW5nUmV0dXJuXG4gIH1cbik6IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcbiAgYXNzZXJ0SXNPYmplY3QobGlzdGVuZXJzLCBcImxpc3RlbmVyc1wiKVxuXG4gIHJldHVybiBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUoc3VidHJlZVJvb3QsIHtcbiAgICBmaWx0ZXIoY3R4KSB7XG4gICAgICBpZiAoY3R4LnBhcmVudENvbnRleHQpIHtcbiAgICAgICAgLy8gc3ViLWFjdGlvbiwgZG8gbm90aGluZ1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gc2tpcCBob29rc1xuICAgICAgaWYgKGlzSG9va0FjdGlvbihjdHguYWN0aW9uTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICBpZiAobGlzdGVuZXJzLm9uU3RhcnQpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uQ2FsbCA9IGFjdGlvbkNvbnRleHRUb0FjdGlvbkNhbGwoY3R4KVxuICAgICAgICByZXR1cm4gbGlzdGVuZXJzLm9uU3RhcnQoYWN0aW9uQ2FsbCwgY3R4KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkZpbmlzaChjdHgsIHJldCkge1xuICAgICAgaWYgKGxpc3RlbmVycy5vbkZpbmlzaCkge1xuICAgICAgICBjb25zdCBhY3Rpb25DYWxsID0gYWN0aW9uQ29udGV4dFRvQWN0aW9uQ2FsbChjdHgpXG4gICAgICAgIHJldHVybiBsaXN0ZW5lcnMub25GaW5pc2goYWN0aW9uQ2FsbCwgY3R4LCByZXQpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gYWN0aW9uQ29udGV4dFRvQWN0aW9uQ2FsbChjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiBBY3Rpb25DYWxsIHtcbiAgY29uc3Qgcm9vdFBhdGggPSBmYXN0R2V0Um9vdFBhdGgoY3R4LnRhcmdldClcblxuICByZXR1cm4ge1xuICAgIGFjdGlvbk5hbWU6IGN0eC5hY3Rpb25OYW1lLFxuICAgIGFyZ3M6IGN0eC5hcmdzLFxuICAgIHRhcmdldFBhdGg6IHJvb3RQYXRoLnBhdGgsXG4gICAgdGFyZ2V0UGF0aElkczogcm9vdFBhdGhUb1RhcmdldFBhdGhJZHMocm9vdFBhdGgpLFxuICB9XG59XG4iLCJpbXBvcnQgeyBpc0hvb2tBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2hvb2tBY3Rpb25zXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIH0gZnJvbSBcIi4uL2FjdGlvbi9taWRkbGV3YXJlXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLFxuICBBY3Rpb25UcmFja2luZ1Jlc3VsdCxcbiAgU2ltcGxlQWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4vYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlXCJcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgcmVhZG9ubHkgbWlkZGxld2FyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFkb25seU1pZGRsZXdhcmVSZXR1cm4ge1xuICBhbGxvd1dyaXRlPFI+KGZuOiAoKSA9PiBSKTogUlxuXG4gIGRpc3Bvc2U6IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlclxufVxuXG4vKipcbiAqIEF0dGFjaGVzIGFuIGFjdGlvbiBtaWRkbGV3YXJlIHRoYXQgd2lsbCB0aHJvdyB3aGVuIGFueSBhY3Rpb24gaXMgc3RhcnRlZFxuICogb3ZlciB0aGUgbm9kZSBvciBhbnkgb2YgdGhlIGNoaWxkIG5vZGVzLCB0aHVzIGVmZmVjdGl2ZWx5IG1ha2luZyB0aGUgc3VidHJlZVxuICogcmVhZG9ubHkuXG4gKlxuICogSXQgd2lsbCByZXR1cm4gYW4gb2JqZWN0IHdpdGggYSBgZGlzcG9zZWAgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBtaWRkbGV3YXJlIGFuZCBhIGBhbGxvd1dyaXRlYCBmdW5jdGlvblxuICogdGhhdCB3aWxsIGFsbG93IGFjdGlvbnMgdG8gYmUgc3RhcnRlZCBpbnNpZGUgdGhlIHByb3ZpZGVkIGNvZGUgYmxvY2suXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiAvLyBnaXZlbiBhIG1vZGVsIGluc3RhbmNlIG5hbWVkIHRvZG9cbiAqIGNvbnN0IHsgZGlzcG9zZSwgYWxsb3dXcml0ZSB9ID0gcmVhZG9ubHlNaWRkbGV3YXJlKHRvZG8pXG4gKlxuICogLy8gdGhpcyB3aWxsIHRocm93XG4gKiB0b2RvLnNldERvbmUoZmFsc2UpXG4gKiBhd2FpdCB0b2RvLnNldERvbmVBc3luYyhmYWxzZSlcbiAqXG4gKiAvLyB0aGlzIHdpbGwgd29ya1xuICogYWxsb3dXcml0ZSgoKSA9PiB0b2RvLnNldERvbmUoZmFsc2UpKVxuICogLy8gbm90ZTogZm9yIGFzeW5jIGFsd2F5cyB1c2Ugb25lIGFjdGlvbiBpbnZvY2F0aW9uIHBlciBhbGxvd1dyaXRlIVxuICogYXdhaXQgYWxsb3dXcml0ZSgoKSA9PiB0b2RvLnNldERvbmVBc3luYyhmYWxzZSkpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgbWlkZGxld2FyZSBkaXNwb3NlciAoYGRpc3Bvc2VgKSBhbmQgYSBgYWxsb3dXcml0ZWAgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkb25seU1pZGRsZXdhcmUoc3VidHJlZVJvb3Q6IG9iamVjdCk6IFJlYWRvbmx5TWlkZGxld2FyZVJldHVybiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICBsZXQgd3JpdGFibGUgPSBmYWxzZVxuICBjb25zdCB3cml0YWJsZVN5bWJvbCA9IFN5bWJvbChcIndyaXRhYmxlXCIpXG5cbiAgY29uc3QgZGlzcG9zZXIgPSBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUoc3VidHJlZVJvb3QsIHtcbiAgICBmaWx0ZXIoY3R4KSB7XG4gICAgICAvLyBza2lwIGhvb2tzXG4gICAgICBpZiAoaXNIb29rQWN0aW9uKGN0eC5hY3Rpb25OYW1lKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIGluc2lkZSBhbGxvd1dyaXRlIGl0IGlzIHdyaXRhYmxlXG4gICAgICBsZXQgY3VycmVudGx5V3JpdGFibGUgPSB3cml0YWJsZVxuXG4gICAgICBpZiAoIWN1cnJlbnRseVdyaXRhYmxlKSB7XG4gICAgICAgIC8vIGlmIGEgcGFyZW50IGNvbnRleHQgd2FzIHdyaXRhYmxlIHRoZW4gdGhlIGNoaWxkIHNob3VsZCBiZSBhcyB3ZWxsXG4gICAgICAgIGxldCBjdXJyZW50Q3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0IHwgdW5kZWZpbmVkID0gY3R4XG4gICAgICAgIHdoaWxlIChjdXJyZW50Q3R4ICYmICFjdXJyZW50bHlXcml0YWJsZSkge1xuICAgICAgICAgIGN1cnJlbnRseVdyaXRhYmxlID0gISFjdXJyZW50Q3R4LmRhdGFbd3JpdGFibGVTeW1ib2xdXG4gICAgICAgICAgY3VycmVudEN0eCA9IGN1cnJlbnRDdHgucGFyZW50Q29udGV4dFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50bHlXcml0YWJsZSkge1xuICAgICAgICBjdHguZGF0YVt3cml0YWJsZVN5bWJvbF0gPSB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBvblN0YXJ0KGN0eCkge1xuICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUgKHdhc24ndCBmaWx0ZXJlZCBvdXQpIGl0IGlzIG5vdCB3cml0YWJsZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdyxcbiAgICAgICAgdmFsdWU6IGZhaWx1cmUoYHRyaWVkIHRvIGludm9rZSBhY3Rpb24gJyR7Y3R4LmFjdGlvbk5hbWV9JyBvdmVyIGEgcmVhZG9ubHkgbm9kZWApLFxuICAgICAgfVxuICAgIH0sXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwb3NlOiBkaXNwb3NlcixcbiAgICBhbGxvd1dyaXRlKGZuKSB7XG4gICAgICBjb25zdCBvbGRXcml0YWJsZSA9IHdyaXRhYmxlXG4gICAgICB3cml0YWJsZSA9IHRydWVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbigpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cml0YWJsZSA9IG9sZFdyaXRhYmxlXG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4vUGF0Y2hcIlxuXG5leHBvcnQgdHlwZSBKc29uUGF0Y2ggPVxuICB8IEpzb25QYXRjaEFkZE9wZXJhdGlvbjxhbnk+XG4gIHwgSnNvblBhdGNoUmVtb3ZlT3BlcmF0aW9uXG4gIHwgSnNvblBhdGNoUmVwbGFjZU9wZXJhdGlvbjxhbnk+XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGNoQmFzZU9wZXJhdGlvbiB7XG4gIHBhdGg6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25QYXRjaEFkZE9wZXJhdGlvbjxUPiBleHRlbmRzIEpzb25QYXRjaEJhc2VPcGVyYXRpb24ge1xuICBvcDogXCJhZGRcIlxuICB2YWx1ZTogVFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25QYXRjaFJlbW92ZU9wZXJhdGlvbiBleHRlbmRzIEpzb25QYXRjaEJhc2VPcGVyYXRpb24ge1xuICBvcDogXCJyZW1vdmVcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25QYXRjaFJlcGxhY2VPcGVyYXRpb248VD4gZXh0ZW5kcyBKc29uUGF0Y2hCYXNlT3BlcmF0aW9uIHtcbiAgb3A6IFwicmVwbGFjZVwiXG4gIHZhbHVlOiBUXG59XG5cbi8qKlxuICogRXNjYXBlcyBhIGpzb24gcG9pbnRlciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSByYXcgcG9pbnRlclxuICogQHJldHVybiB0aGUgRXNjYXBlZCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVBhdGhDb21wb25lbnQocGF0aDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIFwiXCIgKyBwYXRoXG4gIH1cbiAgaWYgKHBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xICYmIHBhdGguaW5kZXhPZihcIn5cIikgPT09IC0xKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9+L2csIFwifjBcIikucmVwbGFjZSgvXFwvL2csIFwifjFcIilcbn1cblxuLyoqXG4gKiBVbmVzY2FwZXMgYSBqc29uIHBvaW50ZXIgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgZXNjYXBlZCBwb2ludGVyXG4gKiBAcmV0dXJuIFRoZSB1bmVzY2FwZWQgcGF0aFxuICovXG5mdW5jdGlvbiB1bmVzY2FwZVBhdGhDb21wb25lbnQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVwbGFjZSgvfjEvZywgXCIvXCIpLnJlcGxhY2UoL34wL2csIFwiflwiKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcGF0aCBpbnRvIGEgSlNPTiBwb2ludGVyLlxuICpcbiAqIEBwYXJhbSBwYXRoIFBhdGggdG8gY29udmVydC5cbiAqIEByZXR1cm5zIENvbnZlcnRlZCBKU09OIHBvaW50ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoVG9Kc29uUG9pbnRlcihwYXRoOiBQYXRoKTogc3RyaW5nIHtcbiAgaWYgKHBhdGgubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG4gIHJldHVybiBcIi9cIiArIHBhdGgubWFwKGVzY2FwZVBhdGhDb21wb25lbnQpLmpvaW4oXCIvXCIpXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHBvaW50ZXIgaW50byBhIHBhdGguXG4gKlxuICogQHBhcmFtIGpzb25Qb2ludGVyIEpTT04gcG9pbnRlciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQ29udmVydGVkIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUG9pbnRlclRvUGF0aChqc29uUG9pbnRlcjogc3RyaW5nKTogUGF0aCB7XG4gIGlmIChqc29uUG9pbnRlciA9PT0gXCJcIikge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGlmICghanNvblBvaW50ZXIuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBKU09OIHBvaW50ZXIgbXVzdCBzdGFydCB3aXRoICcvJyBvciBiZSBlbXB0eVwiKVxuICB9XG4gIGpzb25Qb2ludGVyID0ganNvblBvaW50ZXIuc2xpY2UoMSlcbiAgcmV0dXJuIGpzb25Qb2ludGVyLnNwbGl0KFwiL1wiKS5tYXAodW5lc2NhcGVQYXRoQ29tcG9uZW50KVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBwYXRjaCBpbnRvIGEgSlNPTiBwYXRjaC5cbiAqXG4gKiBAcGFyYW0gcGF0Y2ggQSBwYXRjaC5cbiAqIEByZXR1cm5zIEEgSlNPTiBwYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoVG9Kc29uUGF0Y2gocGF0Y2g6IFBhdGNoKTogSnNvblBhdGNoIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wYXRjaCxcbiAgICBwYXRoOiBwYXRoVG9Kc29uUG9pbnRlcihwYXRjaC5wYXRoKSxcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgSlNPTiBwYXRjaCBpbnRvIGEgcGF0Y2guXG4gKlxuICogQHBhcmFtIGpzb25QYXRjaCBBIEpTT04gcGF0Y2guXG4gKiBAcmV0dXJucyBBIHBhdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblBhdGNoVG9QYXRjaChqc29uUGF0Y2g6IEpzb25QYXRjaCk6IFBhdGNoIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5qc29uUGF0Y2gsXG4gICAgcGF0aDoganNvblBvaW50ZXJUb1BhdGgoanNvblBhdGNoLnBhdGgpLFxuICB9XG59XG4iLCJpbXBvcnQgeyBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgb25HbG9iYWxQYXRjaGVzLCBvblBhdGNoZXMsIE9uUGF0Y2hlc0Rpc3Bvc2VyLCBPblBhdGNoZXNMaXN0ZW5lciB9IGZyb20gXCIuL2VtaXRQYXRjaFwiXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4vUGF0Y2hcIlxuXG4vKipcbiAqIFBhdGNoIHJlY29yZGVyIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoUmVjb3JkZXJFdmVudCB7XG4gIC8qKlxuICAgKiBUYXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBvYmplY3RcbiAgLyoqXG4gICAqIFJlY29yZGVkIHBhdGNoZXMuXG4gICAqL1xuICByZWFkb25seSBwYXRjaGVzOiBQYXRjaFtdXG4gIC8qKlxuICAgKiBSZWNvcmRlZCBpbnZlcnNlIHBhdGNoZXMuXG4gICAqL1xuICByZWFkb25seSBpbnZlcnNlUGF0Y2hlczogUGF0Y2hbXVxufVxuXG4vKipcbiAqIFBhdGNoIHJlY29yZGVyIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRjaFJlY29yZGVyIHtcbiAgLyoqXG4gICAqIEdldHMvc2V0cyBpZiB0aGUgcGF0Y2ggcmVjb3JkZXIgaXMgY3VycmVudGx5IHJlY29yZGluZy5cbiAgICovXG4gIHJlY29yZGluZzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIGFycmF5IG9mIHBhdGNoaW5nIGV2ZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50czogUGF0Y2hSZWNvcmRlckV2ZW50W11cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiB0aGUgcGF0Y2ggcmVjb3JkZXIuXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWRcbn1cblxuLyoqXG4gKiBQYXRjaCByZWNvcmRlciBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoUmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRoZSBwYXRjaCByZWNvcmRlciBpcyBpbml0aWFsbHkgcmVjb3JkaW5nIHdoZW4gY3JlYXRlZC5cbiAgICovXG4gIHJlY29yZGluZz86IGJvb2xlYW5cblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgY2FsbGJhY2sgZmlsdGVyIHRvIHNlbGVjdCB3aWNoIHBhdGNoZXMgdG8gcmVjb3JkL3NraXAuXG4gICAqIEl0IHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBldmVudCBpcyBhZGRlZCB0byB0aGUgZXZlbnRzIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRjaGVzIFBhdGNoZXMgYWJvdXQgdG8gYmUgcmVjb3JkZWQuXG4gICAqIEBwYXJhbSBpbnZlcnNlUGF0Y2hlcyBJbnZlcnNlIHBhdGNoZXMgYWJvdXQgdG8gYmUgcmVjb3JkZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB0byByZWNvcmQgdGhlIHBhdGNoLCBgZmFsc2VgIHRvIHNraXAgaXQuXG4gICAqL1xuICBmaWx0ZXI/KHBhdGNoZXM6IFBhdGNoW10sIGludmVyc2VQYXRjaGVzOiBQYXRjaFtdKTogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBjYWxsYmFjayBydW4gb25jZSBhIHBhdGNoIGlzIHJlY29yZGVkLlxuICAgKiBJdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBldmVudCBpcyBhZGRlZCB0byB0aGUgZXZlbnRzIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRjaGVzIFBhdGNoZXMganVzdCByZWNvcmRlZC5cbiAgICogQHBhcmFtIGludmVyc2VQYXRjaGVzIEludmVyc2UgcGF0Y2hlcyBqdXN0IHJlY29yZGVkLlxuICAgKi9cbiAgb25QYXRjaGVzPzogT25QYXRjaGVzTGlzdGVuZXJcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcGF0Y2ggcmVjb3JkZXIuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290XG4gKiBAcGFyYW0gW29wdHNdXG4gKiBAcmV0dXJucyBUaGUgcGF0Y2ggcmVjb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFJlY29yZGVyKHN1YnRyZWVSb290OiBvYmplY3QsIG9wdHM/OiBQYXRjaFJlY29yZGVyT3B0aW9ucyk6IFBhdGNoUmVjb3JkZXIge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgcmV0dXJuIGludGVybmFsUGF0Y2hSZWNvcmRlcihzdWJ0cmVlUm9vdCwgb3B0cylcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBDcmVhdGVzIGEgZ2xvYmFsIG9yIGxvY2FsIHBhdGNoIHJlY29yZGVyLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdFxuICogQHBhcmFtIFtvcHRzXVxuICogQHJldHVybnMgVGhlIHBhdGNoIHJlY29yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxQYXRjaFJlY29yZGVyKFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0IHwgdW5kZWZpbmVkLFxuICBvcHRzPzogUGF0Y2hSZWNvcmRlck9wdGlvbnNcbik6IFBhdGNoUmVjb3JkZXIge1xuICBsZXQgeyByZWNvcmRpbmcsIGZpbHRlciB9ID0ge1xuICAgIHJlY29yZGluZzogdHJ1ZSxcbiAgICBmaWx0ZXI6IGFsd2F5c0FjY2VwdEZpbHRlcixcbiAgICAuLi5vcHRzLFxuICB9XG5cbiAgY29uc3QgZXZlbnRzID0gb2JzZXJ2YWJsZS5hcnJheTxQYXRjaFJlY29yZGVyRXZlbnQ+KFtdLCB7XG4gICAgZGVlcDogZmFsc2UsXG4gIH0pXG5cbiAgbGV0IG9uUGF0Y2hlc0Rpc3Bvc2VyOiBPblBhdGNoZXNEaXNwb3NlclxuXG4gIGlmIChzdWJ0cmVlUm9vdCkge1xuICAgIG9uUGF0Y2hlc0Rpc3Bvc2VyID0gb25QYXRjaGVzKHN1YnRyZWVSb290LCAocCwgaW52UCkgPT4ge1xuICAgICAgaWYgKHJlY29yZGluZyAmJiBmaWx0ZXIocCwgaW52UCkpIHtcbiAgICAgICAgZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogc3VidHJlZVJvb3QsXG4gICAgICAgICAgcGF0Y2hlczogcCxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlczogaW52UCxcbiAgICAgICAgfSlcbiAgICAgICAgb3B0cz8ub25QYXRjaGVzPy4ocCwgaW52UClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIG9uUGF0Y2hlc0Rpc3Bvc2VyID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHAsIGludlApID0+IHtcbiAgICAgIGlmIChyZWNvcmRpbmcgJiYgZmlsdGVyKHAsIGludlApKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcGF0Y2hlczogcCxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlczogaW52UCxcbiAgICAgICAgfSlcbiAgICAgICAgb3B0cz8ub25QYXRjaGVzPy4ocCwgaW52UClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQgcmVjb3JkaW5nKCkge1xuICAgICAgcmV0dXJuIHJlY29yZGluZ1xuICAgIH0sXG4gICAgc2V0IHJlY29yZGluZyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICByZWNvcmRpbmcgPSBlbmFibGVkXG4gICAgfSxcbiAgICBnZXQgZXZlbnRzKCkge1xuICAgICAgcmV0dXJuIGV2ZW50c1xuICAgIH0sXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIG9uUGF0Y2hlc0Rpc3Bvc2VyKClcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IGFsd2F5c0FjY2VwdEZpbHRlciA9ICgpID0+IHRydWVcbiIsImltcG9ydCB0eXBlIHsgQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIH0gZnJvbSBcIi4uL2FjdGlvbi9taWRkbGV3YXJlXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGFzc2VydElzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgY2hlY2tNb2RlbERlY29yYXRvckFyZ3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvY2hlY2tNb2RlbERlY29yYXRvckFyZ3NcIlxuaW1wb3J0IHsgYWRkTW9kZWxDbGFzc0luaXRpYWxpemVyIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsQ2xhc3NJbml0aWFsaXplclwiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2hcIlxuaW1wb3J0IHsgaW50ZXJuYWxQYXRjaFJlY29yZGVyLCBQYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoL3BhdGNoUmVjb3JkZXJcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLFxuICBBY3Rpb25UcmFja2luZ1Jlc3VsdCxcbiAgU2ltcGxlQWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4vYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlXCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgdHJhbnNhY3Rpb24gbWlkZGxld2FyZSwgd2hpY2ggcmV2ZXJ0cyBjaGFuZ2VzIG1hZGUgYnkgYW4gYWN0aW9uIC8gY2hpbGRcbiAqIGFjdGlvbnMgd2hlbiB0aGUgcm9vdCBhY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBieSBhcHBseWluZyBpbnZlcnNlIHBhdGNoZXMuXG4gKlxuICogQHR5cGVwYXJhbSBNIE1vZGVsXG4gKiBAcGFyYW0gdGFyZ2V0IE9iamVjdCB3aXRoIHRoZSByb290IHRhcmdldCBtb2RlbCBvYmplY3QgKGBtb2RlbGApIGFuZCByb290IGFjdGlvbiBuYW1lIChgYWN0aW9uTmFtZWApLlxuICogQHJldHVybnMgVGhlIG1pZGRsZXdhcmUgZGlzcG9zZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbk1pZGRsZXdhcmU8TSBleHRlbmRzIEFueU1vZGVsPih0YXJnZXQ6IHtcbiAgbW9kZWw6IE1cbiAgYWN0aW9uTmFtZToga2V5b2YgTVxufSk6IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB7XG4gIGFzc2VydElzT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcblxuICBjb25zdCB7IG1vZGVsLCBhY3Rpb25OYW1lIH0gPSB0YXJnZXRcblxuICBhc3NlcnRJc01vZGVsKG1vZGVsLCBcInRhcmdldC5tb2RlbFwiKVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uTmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IGZhaWx1cmUoXCJ0YXJnZXQuYWN0aW9uTmFtZSBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gIH1cblxuICBjb25zdCBwYXRjaFJlY29yZGVyU3ltYm9sID0gU3ltYm9sKFwicGF0Y2hSZWNvcmRlclwiKVxuICBmdW5jdGlvbiBpbml0UGF0Y2hSZWNvcmRlcihjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpIHtcbiAgICBjdHgucm9vdENvbnRleHQuZGF0YVtwYXRjaFJlY29yZGVyU3ltYm9sXSA9IGludGVybmFsUGF0Y2hSZWNvcmRlcih1bmRlZmluZWQsIHtcbiAgICAgIHJlY29yZGluZzogZmFsc2UsXG4gICAgfSlcbiAgfVxuICBmdW5jdGlvbiBnZXRQYXRjaFJlY29yZGVyKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IFBhdGNoUmVjb3JkZXIge1xuICAgIHJldHVybiBjdHgucm9vdENvbnRleHQuZGF0YVtwYXRjaFJlY29yZGVyU3ltYm9sXVxuICB9XG5cbiAgcmV0dXJuIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShtb2RlbCwge1xuICAgIGZpbHRlcihjdHgpIHtcbiAgICAgIC8vIHRoZSBwcmltYXJ5IGFjdGlvbiBtdXN0IGJlIG9uIHRoZSByb290IG9iamVjdFxuICAgICAgY29uc3Qgcm9vdENvbnRleHQgPSBjdHgucm9vdENvbnRleHRcbiAgICAgIHJldHVybiByb290Q29udGV4dC50YXJnZXQgPT09IG1vZGVsICYmIHJvb3RDb250ZXh0LmFjdGlvbk5hbWUgPT09IGFjdGlvbk5hbWVcbiAgICB9LFxuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICBpZiAoY3R4ID09PSBjdHgucm9vdENvbnRleHQpIHtcbiAgICAgICAgaW5pdFBhdGNoUmVjb3JkZXIoY3R4KVxuICAgICAgfVxuICAgIH0sXG4gICAgb25SZXN1bWUoY3R4KSB7XG4gICAgICBnZXRQYXRjaFJlY29yZGVyKGN0eCkucmVjb3JkaW5nID0gdHJ1ZVxuICAgIH0sXG4gICAgb25TdXNwZW5kKGN0eCkge1xuICAgICAgZ2V0UGF0Y2hSZWNvcmRlcihjdHgpLnJlY29yZGluZyA9IGZhbHNlXG4gICAgfSxcbiAgICBvbkZpbmlzaChjdHgsIHJldCkge1xuICAgICAgaWYgKGN0eCA9PT0gY3R4LnJvb3RDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHBhdGNoUmVjb3JkZXIgPSBnZXRQYXRjaFJlY29yZGVyKGN0eClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChyZXQucmVzdWx0ID09PSBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdykge1xuICAgICAgICAgICAgLy8gdW5kbyBjaGFuZ2VzIChiYWNrd2FyZHMgZm9yIGludmVyc2UgcGF0Y2hlcylcbiAgICAgICAgICAgIGNvbnN0IHsgZXZlbnRzIH0gPSBwYXRjaFJlY29yZGVyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZXZlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW2ldXG4gICAgICAgICAgICAgIGFwcGx5UGF0Y2hlcyhldmVudC50YXJnZXQsIGV2ZW50LmludmVyc2VQYXRjaGVzLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBwYXRjaFJlY29yZGVyLmRpc3Bvc2UoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBtaWRkbGV3YXJlIGFzIGEgZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgY2hlY2tNb2RlbERlY29yYXRvckFyZ3MoXCJ0cmFuc2FjdGlvblwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KVxuXG4gIGFkZE1vZGVsQ2xhc3NJbml0aWFsaXplcih0YXJnZXQuY29uc3RydWN0b3IsIChtb2RlbEluc3RhbmNlKSA9PiB7XG4gICAgdHJhbnNhY3Rpb25NaWRkbGV3YXJlKHtcbiAgICAgIG1vZGVsOiBtb2RlbEluc3RhbmNlIGFzIEFueU1vZGVsLFxuICAgICAgYWN0aW9uTmFtZTogcHJvcGVydHlLZXkgYXMgYW55LFxuICAgIH0pXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxyXG5pbXBvcnQgeyBGcm96ZW4gfSBmcm9tIFwiLi4vLi4vZnJvemVuL0Zyb3plblwiXHJcbmltcG9ydCB7IGFzc2VydElzRnVuY3Rpb24sIGFzc2VydElzT2JqZWN0LCBpc09iamVjdCwgbGF6eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXHJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcclxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB0eXBlIHtcclxuICBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgQW55VHlwZSxcclxuICBNb2RlbFR5cGUsXHJcbiAgT2JqZWN0VHlwZUZ1bmN0aW9uLFxyXG4gIFR5cGVUb0RhdGEsXHJcbn0gZnJvbSBcIi4uL3NjaGVtYXNcIlxyXG5pbXBvcnQge1xyXG4gIGxhdGVUeXBlQ2hlY2tlcixcclxuICBMYXRlVHlwZUNoZWNrZXIsXHJcbiAgVHlwZUNoZWNrZXIsXHJcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcclxuICBUeXBlSW5mbyxcclxuICBUeXBlSW5mb0dlbixcclxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXHJcblxyXG5mdW5jdGlvbiB0eXBlc09iamVjdEhlbHBlcjxTPihvYmpGbjogUywgZnJvemVuOiBib29sZWFuLCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4pOiBTIHtcclxuICBhc3NlcnRJc0Z1bmN0aW9uKG9iakZuLCBcIm9iakZuXCIpXHJcblxyXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xyXG4gICAgY29uc3Qgb2JqZWN0U2NoZW1hOiB7XHJcbiAgICAgIFtrOiBzdHJpbmddOiBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlclxyXG4gICAgfSA9IChvYmpGbiBhcyBhbnkpKClcclxuICAgIGFzc2VydElzT2JqZWN0KG9iamVjdFNjaGVtYSwgXCJvYmplY3RTY2hlbWFcIilcclxuXHJcbiAgICBjb25zdCBzY2hlbWFFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqZWN0U2NoZW1hKVxyXG5cclxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xyXG4gICAgICBjb25zdCBwcm9wc01zZzogc3RyaW5nW10gPSBbXVxyXG4gICAgICBmb3IgKGNvbnN0IFtrLCB1bnJlc29sdmVkVGNdIG9mIHNjaGVtYUVudHJpZXMpIHtcclxuICAgICAgICBjb25zdCB0YyA9IHJlc29sdmVUeXBlQ2hlY2tlcih1bnJlc29sdmVkVGMpXHJcbiAgICAgICAgbGV0IHByb3BUeXBlbmFtZSA9IFwiLi4uXCJcclxuICAgICAgICBpZiAoIXJlY3Vyc2l2ZVR5cGVDaGVja2Vycy5pbmNsdWRlcyh0YykpIHtcclxuICAgICAgICAgIHByb3BUeXBlbmFtZSA9IHRjLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdGMpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3BzTXNnLnB1c2goYCR7a306ICR7cHJvcFR5cGVuYW1lfTtgKVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYHsgJHtwcm9wc01zZy5qb2luKFwiIFwiKX0gfWBcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcHBseVNuYXBzaG90UHJvY2Vzc29yID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1vZGU6IFwiZnJvbVwiIHwgXCJ0b1wiKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld09iajogdHlwZW9mIG9iaiA9IHt9XHJcblxyXG4gICAgICAvLyBub3RlOiB3ZSBhbGxvdyBleGNlc3MgcHJvcGVydGllcyB3aGVuIGNoZWNraW5nIG9iamVjdHNcclxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgayA9IGtleXNbaV1cclxuICAgICAgICBjb25zdCB1bnJlc29sdmVkVGMgPSBvYmplY3RTY2hlbWFba11cclxuICAgICAgICBpZiAodW5yZXNvbHZlZFRjKSB7XHJcbiAgICAgICAgICBjb25zdCB0YyA9IHJlc29sdmVUeXBlQ2hlY2tlcih1bnJlc29sdmVkVGMpXHJcbiAgICAgICAgICBuZXdPYmpba10gPVxyXG4gICAgICAgICAgICBtb2RlID09PSBcImZyb21cIiA/IHRjLmZyb21TbmFwc2hvdFByb2Nlc3NvcihvYmpba10pIDogdGMudG9TbmFwc2hvdFByb2Nlc3NvcihvYmpba10pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHVua25vd24gcHJvcCwgY29weSBhcyBpc1xyXG4gICAgICAgICAgbmV3T2JqW2tdID0gb2JqW2tdXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbmV3T2JqXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcclxuICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXHJcblxyXG4gICAgICAob2JqLCBwYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopIHx8IChmcm96ZW4gJiYgIShvYmogaW5zdGFuY2VvZiBGcm96ZW4pKSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBvYmopXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub3RlOiB3ZSBhbGxvdyBleGNlc3MgcHJvcGVydGllcyB3aGVuIGNoZWNraW5nIG9iamVjdHNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB1bnJlc29sdmVkVGNdIG9mIHNjaGVtYUVudHJpZXMpIHtcclxuICAgICAgICAgIGNvbnN0IHRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKHVucmVzb2x2ZWRUYylcclxuICAgICAgICAgIGNvbnN0IG9ialZhbCA9IG9ialtrXVxyXG5cclxuICAgICAgICAgIGNvbnN0IHZhbHVlRXJyb3IgPSB0Yy5jaGVjayhvYmpWYWwsIFsuLi5wYXRoLCBrXSlcclxuICAgICAgICAgIGlmICh2YWx1ZUVycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZUVycm9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgZ2V0VHlwZU5hbWUsXHJcbiAgICAgIHR5cGVJbmZvR2VuLFxyXG5cclxuICAgICAgKG9iaikgPT4ge1xyXG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG5vdGU6IHdlIGFsbG93IGV4Y2VzcyBwcm9wZXJ0aWVzIHdoZW4gY2hlY2tpbmcgb2JqZWN0c1xyXG4gICAgICAgIGZvciAoY29uc3QgW2ssIHVucmVzb2x2ZWRUY10gb2Ygc2NoZW1hRW50cmllcykge1xyXG4gICAgICAgICAgY29uc3QgdGMgPSByZXNvbHZlVHlwZUNoZWNrZXIodW5yZXNvbHZlZFRjKVxyXG4gICAgICAgICAgY29uc3Qgb2JqVmFsID0gb2JqW2tdXHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWVBY3R1YWxDaGVja2VyID0gdGMuc25hcHNob3RUeXBlKG9ialZhbClcclxuICAgICAgICAgIGlmICghdmFsdWVBY3R1YWxDaGVja2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1RjXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xyXG4gICAgICAgIHJldHVybiBhcHBseVNuYXBzaG90UHJvY2Vzc29yKG9iaiwgXCJmcm9tXCIpXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xyXG4gICAgICAgIHJldHVybiBhcHBseVNuYXBzaG90UHJvY2Vzc29yKG9iaiwgXCJ0b1wiKVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuIHRoaXNUY1xyXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBwbGFpbiBvYmplY3QuXHJcbiAqIE5vdGUgdGhhdCB0aGUgcGFyYW1ldGVyIG11c3QgYmUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gb2JqZWN0LiBUaGlzIGlzIGRvbmUgc28gb2JqZWN0cyBjYW4gc3VwcG9ydCBzZWxmIC8gY3Jvc3MgdHlwZXMuXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGBgYHRzXHJcbiAqIC8vIG5vdGljZSB0aGUgKHsgLi4uIH0pLCBub3QganVzdCB7IC4uLiB9XHJcbiAqIGNvbnN0IHBvaW50VHlwZSA9IHR5cGVzLm9iamVjdCgoKSA9PiAoe1xyXG4gKiAgIHg6IHR5cGVzLm51bWJlcixcclxuICogICB5OiB0eXBlcy5udW1iZXJcclxuICogfSkpXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cclxuICogQHBhcmFtIG9iamVjdEZ1bmN0aW9uIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIGFuIG9iamVjdCB3aXRoIHR5cGVzLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzT2JqZWN0PFQ+KG9iamVjdEZ1bmN0aW9uOiBUKTogVCB7XHJcbiAgLy8gd2UgY2FuJ3QgdHlwZSB0aGlzIGZ1bmN0aW9uIG9yIGVsc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byBtYWtlIGl0IHdvcmsgcmVjdXJzaXZlbHlcclxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IE9iamVjdFR5cGVJbmZvKHQsIG9iamVjdEZ1bmN0aW9uIGFzIGFueSlcclxuXHJcbiAgcmV0dXJuIHR5cGVzT2JqZWN0SGVscGVyKG9iamVjdEZ1bmN0aW9uLCBmYWxzZSwgdHlwZUluZm9HZW4pIGFzIGFueVxyXG59XHJcblxyXG4vKipcclxuICogYHR5cGVzLm9iamVjdGAgdHlwZSBpbmZvIGZvciBhbiBvYmplY3QgcHJvcHMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFR5cGVJbmZvUHJvcHMge1xyXG4gIHJlYWRvbmx5IFtwcm9wTmFtZTogc3RyaW5nXTogUmVhZG9ubHk8e1xyXG4gICAgdHlwZTogQW55U3RhbmRhcmRUeXBlXHJcbiAgICB0eXBlSW5mbzogVHlwZUluZm9cclxuICB9PlxyXG59XHJcblxyXG4vKipcclxuICogYHR5cGVzLm9iamVjdGAgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE9iamVjdFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xyXG4gIC8vIG1lbW9pemUgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBvYmplY3RcclxuICBwcml2YXRlIF9wcm9wcyA9IGxhenkoKCkgPT4ge1xyXG4gICAgY29uc3Qgb2JqU2NoZW1hID0gdGhpcy5fb2JqVHlwZUZuKClcclxuXHJcbiAgICBjb25zdCBwcm9wVHlwZXM6IE8uV3JpdGFibGU8T2JqZWN0VHlwZUluZm9Qcm9wcz4gPSB7fVxyXG4gICAgT2JqZWN0LmtleXMob2JqU2NoZW1hKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xyXG4gICAgICBjb25zdCB0eXBlID0gcmVzb2x2ZVN0YW5kYXJkVHlwZShvYmpTY2hlbWFbcHJvcE5hbWVdKVxyXG4gICAgICBwcm9wVHlwZXNbcHJvcE5hbWVdID0geyB0eXBlLCB0eXBlSW5mbzogZ2V0VHlwZUluZm8odHlwZSkgfVxyXG4gICAgfSlcclxuICAgIHJldHVybiBwcm9wVHlwZXNcclxuICB9KVxyXG5cclxuICBnZXQgcHJvcHMoKTogT2JqZWN0VHlwZUluZm9Qcm9wcyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvcHMoKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcHJpdmF0ZSBfb2JqVHlwZUZuOiBPYmplY3RUeXBlRnVuY3Rpb24pIHtcclxuICAgIHN1cGVyKHRoaXNUeXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgZnJvemVuIGRhdGEuXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IGZyb3plbk51bWJlclR5cGUgPSB0eXBlcy5mcm96ZW4odHlwZXMubnVtYmVyKVxyXG4gKiBjb25zdCBmcm96ZW5BbnlUeXBlID0gdHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDxhbnk+KCkpXHJcbiAqIGNvbnN0IGZyb3plbk51bWJlckFycmF5VHlwZSA9IHR5cGVzLmZyb3plbih0eXBlcy5hcnJheSh0eXBlcy5udW1iZXIpKVxyXG4gKiBjb25zdCBmcm96ZW5VbmNoZWNrZWROdW1iZXJBcnJheVR5cGUgPSB0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPG51bWJlcltdPigpKVxyXG4gKiBgYGBcclxuICpcclxuICogQHR5cGVwYXJhbSBUIFR5cGUuXHJcbiAqIEBwYXJhbSBkYXRhVHlwZSBUeXBlIG9mIHRoZSBmcm96ZW4gZGF0YS5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0Zyb3plbjxUIGV4dGVuZHMgQW55VHlwZT4oZGF0YVR5cGU6IFQpOiBNb2RlbFR5cGU8RnJvemVuPFR5cGVUb0RhdGE8VD4+PiB7XHJcbiAgcmV0dXJuIHR5cGVzT2JqZWN0SGVscGVyKFxyXG4gICAgKCkgPT4gKHtcclxuICAgICAgZGF0YTogZGF0YVR5cGUsXHJcbiAgICB9KSxcclxuICAgIHRydWUsXHJcbiAgICAodCkgPT4gbmV3IEZyb3plblR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUoZGF0YVR5cGUpKVxyXG4gICkgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMuZnJvemVuYCB0eXBlIGluZm8uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRnJvemVuVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XHJcbiAgZ2V0IGRhdGFUeXBlSW5mbygpOiBUeXBlSW5mbyB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy5kYXRhVHlwZSlcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IGRhdGFUeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHtcclxuICAgIHN1cGVyKHRoaXNUeXBlKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBpZGVudGl0eUZuIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcclxuaW1wb3J0IHR5cGUgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7IFR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlckJhc2VUeXBlLCBUeXBlSW5mbyB9IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXHJcblxyXG5jb25zdCB1bmNoZWNrZWQ6IElkZW50aXR5VHlwZTxhbnk+ID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUuQW55LFxyXG4gIG51bGwsXHJcbiAgKCkgPT4gXCJhbnlcIixcclxuICAodCkgPT4gbmV3IFVuY2hlY2tlZFR5cGVJbmZvKHQpLFxyXG5cclxuICAoKSA9PiB1bmNoZWNrZWQgYXMgYW55LFxyXG5cclxuICBpZGVudGl0eUZuLFxyXG4gIGlkZW50aXR5Rm5cclxuKSBhcyBhbnlcclxuXHJcbi8qKlxyXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgZ2l2ZW4gdmFsdWUgdGhhdCB3b24ndCBiZSB0eXBlIGNoZWNrZWQuXHJcbiAqIFRoaXMgaXMgYmFzaWNhbGx5IGEgd2F5IHRvIGJhaWwgb3V0IG9mIHRoZSBydW50aW1lIHR5cGUgY2hlY2tpbmcgc3lzdGVtLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCB1bmNoZWNrZWRTb21lTW9kZWwgPSB0eXBlcy51bmNoZWNrZWQ8U29tZU1vZGVsPigpXHJcbiAqIGNvbnN0IGFueVR5cGUgPSB0eXBlcy51bmNoZWNrZWQ8YW55PigpXHJcbiAqIGNvbnN0IGN1c3RvbVVuY2hlY2tlZFR5cGUgPSB0eXBlcy51bmNoZWNrZWQ8KEEgJiBCKSB8IEM+KClcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBUeXBlIG9mIHRoZSB2YWx1ZSwgb3IgdW5rb3duIGlmIG5vdCBnaXZlbi5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlc1VuY2hlY2tlZDxUID0gbmV2ZXI+KCk6IElkZW50aXR5VHlwZTxUPiB7XHJcbiAgcmV0dXJuIHVuY2hlY2tlZFxyXG59XHJcblxyXG4vKipcclxuICogYHR5cGVzLnVuY2hlY2tlZGAgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFVuY2hlY2tlZFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cclxuIiwiaW1wb3J0IHsgZmFpbHVyZSwgbGF6eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQge1xuICByZXNvbHZlU3RhbmRhcmRUeXBlLFxuICByZXNvbHZlU3RhbmRhcmRUeXBlTm9UaHJvdyxcbiAgcmVzb2x2ZVR5cGVDaGVja2VyLFxufSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgZ2V0VHlwZUNoZWNrZXJCYXNlVHlwZUZyb21WYWx1ZSxcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuaW1wb3J0IHsgdHlwZXNVbmNoZWNrZWQgfSBmcm9tIFwiLi90eXBlc1VuY2hlY2tlZFwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pb24gb2Ygc2V2ZXJhbCBvdGhlciB0eXBlcyAoYSB8IGIgfCBjIHwgLi4uKS5cbiAqIEFjY2VwdHMgYSBkaXNwYXRjaGVyIHRoYXQsIGdpdmVuIGEgc25hcHNob3QsIHJldHVybnMgdGhlIHR5cGVcbiAqIHRoYXQgc25hcHNob3QgaXMuXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gZGlzcGF0Y2hlciBGdW5jdGlvbiB0aGF0IGdpdmVuIGEgc25hcHNob3QgcmV0dXJucyB0aGUgdHlwZS5cbiAqIEBwYXJhbSBvclR5cGVzIFBvc3NpYmxlIHR5cGVzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzT3I8VCBleHRlbmRzIEFueVR5cGVbXT4oXG4gIGRpc3BhdGNoZXI6IChzbjogYW55KSA9PiBUW251bWJlcl0sXG4gIC4uLm9yVHlwZXM6IFRcbik6IFRbbnVtYmVyXVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHVuaW9uIG9mIHNldmVyYWwgb3RoZXIgdHlwZXMgKGEgfCBiIHwgYyB8IC4uLikuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBib29sZWFuT3JOdW1iZXJUeXBlID0gdHlwZXMub3IodHlwZXMuYm9vbGVhbiwgdHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gb3JUeXBlcyBQb3NzaWJsZSB0eXBlcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc09yPFQgZXh0ZW5kcyBBbnlUeXBlW10+KC4uLm9yVHlwZXM6IFQpOiBUW251bWJlcl1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzT3IoXG4gIGRpc3BhdGNoZXJPclR5cGU6ICgoc246IGFueSkgPT4gQW55VHlwZSkgfCBBbnlUeXBlLFxuICAuLi5tb3JlT3JUeXBlczogQW55VHlwZVtdXG4pOiBBbnlUeXBlIHtcbiAgY29uc3Qgb3JUeXBlcyA9IG1vcmVPclR5cGVzLnNsaWNlKClcbiAgbGV0IGZpbmFsRGlzcGF0Y2hlcjogKChzbjogYW55KSA9PiBUeXBlQ2hlY2tlcikgfCB1bmRlZmluZWRcblxuICBjb25zdCBmaXJzdFR5cGVDaGVja2VyID0gcmVzb2x2ZVN0YW5kYXJkVHlwZU5vVGhyb3coZGlzcGF0Y2hlck9yVHlwZSBhcyBBbnlUeXBlKVxuXG4gIGlmIChmaXJzdFR5cGVDaGVja2VyKSB7XG4gICAgb3JUeXBlcy51bnNoaWZ0KGZpcnN0VHlwZUNoZWNrZXIpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJPclR5cGUgYXMgKHNuOiBhbnkpID0+IEFueVR5cGVcbiAgICBmaW5hbERpc3BhdGNoZXIgPSAoc246IGFueSkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGRpc3BhdGNoZXIoc24pXG4gICAgICBjb25zdCB0eXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcih0eXBlKVxuICAgICAgcmV0dXJuIHR5cGVDaGVja2VyXG4gICAgfVxuICB9XG5cbiAgaWYgKG9yVHlwZXMubGVuZ3RoIDw9IDApIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwib3IgdHlwZSBtdXN0IGhhdmUgYXQgbGVhc3QgMSBwb3NzaWJsZSB0eXBlXCIpXG4gIH1cblxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IE9yVHlwZUluZm8odCwgb3JUeXBlcy5tYXAocmVzb2x2ZVN0YW5kYXJkVHlwZSkpXG5cbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XG4gICAgY29uc3QgY2hlY2tlcnMgPSBvclR5cGVzLm1hcChyZXNvbHZlVHlwZUNoZWNrZXIpXG5cbiAgICAvLyBpZiB0aGUgb3IgaW5jbHVkZXMgdW5jaGVja2VkIHRoZW4gaXQgaXMgdW5jaGVja2VkXG4gICAgaWYgKGNoZWNrZXJzLnNvbWUoKHRjKSA9PiB0Yy51bmNoZWNrZWQpKSB7XG4gICAgICByZXR1cm4gdHlwZXNVbmNoZWNrZWQoKSBhcyBhbnlcbiAgICB9XG5cbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+IHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lcyA9IGNoZWNrZXJzLm1hcCgodGMpID0+IHtcbiAgICAgICAgaWYgKHJlY3Vyc2l2ZVR5cGVDaGVja2Vycy5pbmNsdWRlcyh0YykpIHtcbiAgICAgICAgICByZXR1cm4gXCIuLi5cIlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0Yy5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIHRjKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHR5cGVOYW1lcy5qb2luKFwiIHwgXCIpXG4gICAgfVxuXG4gICAgbGV0IHRoaXNUY0Jhc2VUeXBlOiBUeXBlQ2hlY2tlckJhc2VUeXBlXG4gICAgaWYgKGNoZWNrZXJzLnNvbWUoKGMpID0+IGMuYmFzZVR5cGUgIT09IGNoZWNrZXJzWzBdLmJhc2VUeXBlKSkge1xuICAgICAgdGhpc1RjQmFzZVR5cGUgPSBUeXBlQ2hlY2tlckJhc2VUeXBlLkFueVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzVGNCYXNlVHlwZSA9IGNoZWNrZXJzWzBdLmJhc2VUeXBlXG4gICAgfVxuXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgIHRoaXNUY0Jhc2VUeXBlLFxuXG4gICAgICAodmFsdWUsIHBhdGgpID0+IHtcbiAgICAgICAgY29uc3Qgc29tZU1hdGNoaW5nVHlwZSA9IGNoZWNrZXJzLnNvbWUoKHRjKSA9PiAhdGMuY2hlY2sodmFsdWUsIHBhdGgpKVxuICAgICAgICBpZiAoc29tZU1hdGNoaW5nVHlwZSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZ2V0VHlwZU5hbWUsXG4gICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQmFzZVR5cGUgPSBnZXRUeXBlQ2hlY2tlckJhc2VUeXBlRnJvbVZhbHVlKHZhbHVlKVxuXG4gICAgICAgIGNvbnN0IGNoZWNrZXJGb3JCYXNlVHlwZSA9IGNoZWNrZXJzLmZpbHRlcihcbiAgICAgICAgICAoYykgPT4gYy5iYXNlVHlwZSA9PT0gdmFsdWVCYXNlVHlwZSB8fCBjLmJhc2VUeXBlID09PSBUeXBlQ2hlY2tlckJhc2VUeXBlLkFueVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGNoZWNrZXJGb3JCYXNlVHlwZS5sZW5ndGggPT09IDEgJiYgY2hlY2tlckZvckJhc2VUeXBlWzBdLmJhc2VUeXBlID09PSB2YWx1ZUJhc2VUeXBlKSB7XG4gICAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSB2YWxpZCBvcHRpb24gYWNjZXB0IGl0IHdpdGhvdXQgYXNraW5nXG4gICAgICAgICAgLy8gdGhpcyBpcyBkb25lIGJlY2F1c2U6XG4gICAgICAgICAgLy8gMSkgcGVyZm9ybWFuY2UgKGF2b2lkIGNoZWNraW5nIHN0cnVjdHVyZSBpZiBub3QgbmVlZGVkKVxuICAgICAgICAgIC8vIDIpIHNvIHdlIGNhbiBhY2NlcHQgdW50eXBlZCBtb2RlbHMgd2hlbiBwYWlyZWQgd2l0aCB1bmRlZmluZWQgfCBudWxsXG4gICAgICAgICAgcmV0dXJuIGNoZWNrZXJGb3JCYXNlVHlwZVswXVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja2VyRm9yQmFzZVR5cGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1R5cGUgPSBjaGVja2VyRm9yQmFzZVR5cGVbaV0uc25hcHNob3RUeXBlKHZhbHVlKVxuICAgICAgICAgIGlmIChtYXRjaGluZ1R5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGluZ1R5cGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSxcblxuICAgICAgKHNuKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmaW5hbERpc3BhdGNoZXIgPyBmaW5hbERpc3BhdGNoZXIoc24pIDogdGhpc1RjLnNuYXBzaG90VHlwZShzbilcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICAgIGBzbmFwc2hvdCAnJHtKU09OLnN0cmluZ2lmeShzbil9JyBkb2VzIG5vdCBtYXRjaCB0aGUgZm9sbG93aW5nIHR5cGU6ICR7Z2V0VHlwZU5hbWUoXG4gICAgICAgICAgICAgIHRoaXNUY1xuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHR5cGUuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgICAgfSxcblxuICAgICAgKHNuKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmaW5hbERpc3BhdGNoZXIgPyBmaW5hbERpc3BhdGNoZXIoc24pIDogdGhpc1RjLnNuYXBzaG90VHlwZShzbilcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICAgIGBzbmFwc2hvdCAnJHtKU09OLnN0cmluZ2lmeShzbil9JyBkb2VzIG5vdCBtYXRjaCB0aGUgZm9sbG93aW5nIHR5cGU6ICR7Z2V0VHlwZU5hbWUoXG4gICAgICAgICAgICAgIHRoaXNUY1xuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHR5cGUudG9TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMub3JgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIE9yVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIC8vIG1lbW9pemUgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhcnJheSBvbiB0aGUgZ2V0dGVyXG4gIHByaXZhdGUgX29yVHlwZUluZm9zID0gbGF6eSgoKSA9PiB0aGlzLm9yVHlwZXMubWFwKGdldFR5cGVJbmZvKSlcblxuICBnZXQgb3JUeXBlSW5mb3MoKTogUmVhZG9ubHlBcnJheTxUeXBlSW5mbz4ge1xuICAgIHJldHVybiB0aGlzLl9vclR5cGVJbmZvcygpXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBvclR5cGVzOiBSZWFkb25seUFycmF5PEFueVN0YW5kYXJkVHlwZT4pIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgQW55TW9kZWxQcm9wLCBNYXliZU9wdGlvbmFsTW9kZWxQcm9wLCBPcHRpb25hbE1vZGVsUHJvcCwgcHJvcCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7XG4gIHR5cGVzQm9vbGVhbixcbiAgdHlwZXNOdWxsLFxuICB0eXBlc051bWJlcixcbiAgdHlwZXNTdHJpbmcsXG4gIHR5cGVzVW5kZWZpbmVkLFxufSBmcm9tIFwiLi9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4vc2NoZW1hc1wiXG5pbXBvcnQgeyBMYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyIH0gZnJvbSBcIi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgdHlwZXNPciB9IGZyb20gXCIuL3V0aWxpdHkvdHlwZXNPclwiXG5cbi8qKlxuICogRGVmaW5lcyBhIHN0cmluZyBtb2RlbCBwcm9wZXJ0eSB3aXRoIGEgZGVmYXVsdCB2YWx1ZS5cbiAqIEVxdWl2YWxlbnQgdG8gYHRQcm9wKHR5cGVzLnN0cmluZywgZGVmYXVsdFZhbHVlKWAuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiB0UHJvcChcImZvb1wiKSAvLyBhbiBvcHRpb25hbCBzdHJpbmcgdGhhdCB3aWxsIHRha2UgdGhlIHZhbHVlIGBcImZvb1wiYCB3aGVuIHVuZGVmaW5lZC5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcChkZWZhdWx0VmFsdWU6IHN0cmluZyk6IE9wdGlvbmFsTW9kZWxQcm9wPHN0cmluZz5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbnVtYmVyIG1vZGVsIHByb3BlcnR5IHdpdGggYSBkZWZhdWx0IHZhbHVlLlxuICogRXF1aXZhbGVudCB0byBgdFByb3AodHlwZXMubnVtYmVyLCBkZWZhdWx0VmFsdWUpYC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHRQcm9wKDQyKSAvLyBhbiBvcHRpb25hbCBudW1iZXIgdGhhdCB3aWxsIHRha2UgdGhlIHZhbHVlIGA0MmAgd2hlbiB1bmRlZmluZWQuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdFByb3AoZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBPcHRpb25hbE1vZGVsUHJvcDxudW1iZXI+XG5cbi8qKlxuICogRGVmaW5lcyBhIGJvb2xlYW4gbW9kZWwgcHJvcGVydHkgd2l0aCBhIGRlZmF1bHQgdmFsdWUuXG4gKiBFcXVpdmFsZW50IHRvIGB0UHJvcCh0eXBlcy5ib29sZWFuLCBkZWZhdWx0VmFsdWUpYC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHRQcm9wKHRydWUpIC8vIGFuIG9wdGlvbmFsIGJvb2xlYW4gdGhhdCB3aWxsIHRha2UgdGhlIHZhbHVlIGB0cnVlYCB3aGVuIHVuZGVmaW5lZC5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSBvcHRpb25zIE1vZGVsIHByb3BlcnR5IG9wdGlvbnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdFByb3AoZGVmYXVsdFZhbHVlOiBib29sZWFuKTogT3B0aW9uYWxNb2RlbFByb3A8Ym9vbGVhbj5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbW9kZWwgcHJvcGVydHksIHdpdGggYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IHZhbHVlXG4gKiBpZiB0aGUgaW5wdXQgc25hcHNob3QgLyBtb2RlbCBjcmVhdGlvbiBkYXRhIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhbmQgd2l0aCBhbiBhc3NvY2lhdGVkIHR5cGUgY2hlY2tlci5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHRQcm9wKHR5cGVzLm51bWJlciwgKCkgPT4gMTApIC8vIGFuIG9wdGlvbmFsIG51bWJlciwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgMTBcbiAqIHg6IHRQcm9wKHR5cGVzLmFycmF5KHR5cGVzLm51bWJlciksICgpID0+IFtdKSAvLyBhbiBvcHRpb25hbCBudW1iZXIgYXJyYXksIHdpdGggYSBkZWZhdWx0IGVtcHR5IGFycmF5XG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFRUeXBlIFR5cGUgY2hlY2tlciB0eXBlLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSBkZWZhdWx0Rm4gRGVmYXVsdCB2YWx1ZSBnZW5lcmF0b3IgZnVuY3Rpb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdFByb3A8VFR5cGUgZXh0ZW5kcyBBbnlUeXBlPihcbiAgdHlwZTogVFR5cGUsXG4gIGRlZmF1bHRGbjogKCkgPT4gVHlwZVRvRGF0YTxUVHlwZT5cbik6IE9wdGlvbmFsTW9kZWxQcm9wPFR5cGVUb0RhdGE8VFR5cGU+PlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSwgd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlXG4gKiBpZiB0aGUgaW5wdXQgc25hcHNob3QgLyBtb2RlbCBjcmVhdGlvbiBkYXRhIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhbmQgd2l0aCBhbiBhc3NvY2lhdGVkIHR5cGUgY2hlY2tlci5cbiAqIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyB3aXRoIHByaW1pdGl2ZSB2YWx1ZXMgYW5kIG5ldmVyIHdpdGggb2JqZWN0IHZhbHVlc1xuICogKGFycmF5LCBtb2RlbCwgb2JqZWN0LCBldGMpLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AodHlwZXMubnVtYmVyLCAxMCkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiAxMFxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUVHlwZSBUeXBlIGNoZWNrZXIgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUeXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wPFRUeXBlIGV4dGVuZHMgQW55VHlwZT4oXG4gIHR5cGU6IFRUeXBlLFxuICBkZWZhdWx0VmFsdWU6IFR5cGVUb0RhdGE8VFR5cGU+XG4pOiBPcHRpb25hbE1vZGVsUHJvcDxUeXBlVG9EYXRhPFRUeXBlPj5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbW9kZWwgcHJvcGVydHkgd2l0aCBubyBkZWZhdWx0IHZhbHVlIGFuZCBhbiBhc3NvY2lhdGVkIHR5cGUgY2hlY2tlci5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHRQcm9wKHR5cGVzLm51bWJlcikgLy8gYSByZXF1aXJlZCBudW1iZXJcbiAqIHg6IHRQcm9wKHR5cGVzLm1heWJlKHR5cGVzLm51bWJlcikpIC8vIGFuIG9wdGlvbmFsIG51bWJlciwgd2hpY2ggZGVmYXVsdHMgdG8gdW5kZWZpbmVkXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFRUeXBlIFR5cGUgY2hlY2tlciB0eXBlLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgY2hlY2tlci5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcDxUVHlwZSBleHRlbmRzIEFueVR5cGU+KHR5cGU6IFRUeXBlKTogTWF5YmVPcHRpb25hbE1vZGVsUHJvcDxUeXBlVG9EYXRhPFRUeXBlPj5cblxuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wKHR5cGVPckRlZmF1bHRWYWx1ZTogYW55LCBkZWY/OiBhbnkpOiBBbnlNb2RlbFByb3Age1xuICBsZXQgaGFzRGVmYXVsdFZhbHVlID0gZmFsc2VcblxuICBzd2l0Y2ggKHR5cGVvZiB0eXBlT3JEZWZhdWx0VmFsdWUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gdFByb3AodHlwZXNTdHJpbmcsIHR5cGVPckRlZmF1bHRWYWx1ZSlcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gdFByb3AodHlwZXNOdW1iZXIsIHR5cGVPckRlZmF1bHRWYWx1ZSlcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIHRQcm9wKHR5cGVzQm9vbGVhbiwgdHlwZU9yRGVmYXVsdFZhbHVlKVxuICB9XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xuICAgIC8vIHR5cGUsIGRlZmF1bHRcbiAgICBoYXNEZWZhdWx0VmFsdWUgPSB0cnVlXG4gIH1cblxuICBjb25zdCBuZXdQcm9wID0gaGFzRGVmYXVsdFZhbHVlID8gcHJvcChkZWYpIDogcHJvcCgpXG5cbiAgY29uc3QgdHlwZUNoZWNrZXIgPSByZXNvbHZlU3RhbmRhcmRUeXBlKHR5cGVPckRlZmF1bHRWYWx1ZSkgYXMgdW5rbm93biBhc1xuICAgIHwgVHlwZUNoZWNrZXJcbiAgICB8IExhdGVUeXBlQ2hlY2tlclxuXG4gIGNvbnN0IGZyb21TbmFwc2hvdFR5cGVDaGVja2VyID0gaGFzRGVmYXVsdFZhbHVlXG4gICAgPyB0eXBlc09yKHR5cGVDaGVja2VyIGFzIHVua25vd24gYXMgQW55VHlwZSwgdHlwZXNVbmRlZmluZWQsIHR5cGVzTnVsbClcbiAgICA6IHR5cGVDaGVja2VyXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5uZXdQcm9wLFxuICAgIF9pbnRlcm5hbDoge1xuICAgICAgLi4ubmV3UHJvcC5faW50ZXJuYWwsXG5cbiAgICAgIHR5cGVDaGVja2VyLFxuXG4gICAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IChzbikgPT4ge1xuICAgICAgICBjb25zdCBmc25wID0gcmVzb2x2ZVR5cGVDaGVja2VyKGZyb21TbmFwc2hvdFR5cGVDaGVja2VyKS5mcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgICAgICAgcmV0dXJuIGZzbnAgPyBmc25wKHNuKSA6IHNuXG4gICAgICB9LFxuXG4gICAgICB0b1NuYXBzaG90UHJvY2Vzc29yOiAoc24pID0+IHtcbiAgICAgICAgY29uc3QgdHNucCA9IHJlc29sdmVUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikudG9TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgICByZXR1cm4gdHNucCA/IHRzbnAoc24pIDogc25cbiAgICAgIH0sXG4gICAgfSxcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNoYWluRm5zPEYgZXh0ZW5kcyBGdW5jdGlvbj4oLi4uZm5zOiAoRiB8IHVuZGVmaW5lZClbXSk6IEYgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWZpbmVkRm5zID0gZm5zLmZpbHRlcigoZm4pID0+ICEhZm4pXG4gIGlmIChkZWZpbmVkRm5zLmxlbmd0aCA8PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgY2hhaW5lZEZuID0gKHY6IGFueSwgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBsZXQgcmV0ID0gdlxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWZpbmVkRm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXQgPSBkZWZpbmVkRm5zW2ldIShyZXQsIC4uLmFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgcmV0dXJuIGNoYWluZWRGbiBhcyB1bmtub3duIGFzIEZcbn1cbiIsImltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuL0Jhc2VNb2RlbFNoYXJlZFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogQXNzZXJ0cyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgYSBjbGFzcyBvciBkYXRhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBtb2RlbFxuICogQHBhcmFtIGFyZ05hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzQ2xhc3NPckRhdGFNb2RlbENsYXNzKFxuICBtb2RlbDogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nLFxuICBjdXN0b21FcnJNc2cgPSBcIm11c3QgYmUgYSBjbGFzcyBvciBkYXRhIG1vZGVsIGNsYXNzXCJcbik6IGFzc2VydHMgbW9kZWwgaXMgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4ge1xuICBpZiAoIWlzTW9kZWxDbGFzcyhtb2RlbCkgJiYgIWlzRGF0YU1vZGVsQ2xhc3MobW9kZWwpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSAke2N1c3RvbUVyck1zZ31gKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseVNldCB9IGZyb20gXCIuLi9hY3Rpb24vYXBwbHlTZXRcIlxuaW1wb3J0IHsgZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgbW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsQWN0aW9uXCJcbmltcG9ydCB7IEFueURhdGFNb2RlbCwgQmFzZURhdGFNb2RlbCwgYmFzZURhdGFNb2RlbFByb3BOYW1lcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL2dldERhdGFNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGdldEdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB7IEFueU1vZGVsLCBCYXNlTW9kZWwsIGJhc2VNb2RlbFByb3BOYW1lcyB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHsgdHlwZXNPYmplY3QgfSBmcm9tIFwiLi4vdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNPYmplY3RcIlxuaW1wb3J0IHsgdHlwZXNTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3NjaGVtYXNcIlxuaW1wb3J0IHsgdFByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdFByb3BcIlxuaW1wb3J0IHR5cGUgeyBMYXRlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgdHlwZXNVbmNoZWNrZWQgfSBmcm9tIFwiLi4vdHlwZXMvdXRpbGl0eS90eXBlc1VuY2hlY2tlZFwiXG5pbXBvcnQgeyBhc3NlcnRJc09iamVjdCwgZmFpbHVyZSwgcHJvcE5hbWVUb1NldHRlck5hbWUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgY2hhaW5GbnMgfSBmcm9tIFwiLi4vdXRpbHMvY2hhaW5GbnNcIlxuaW1wb3J0IHsgTW9kZWxDbGFzcywgbW9kZWxJbml0aWFsaXplZFN5bWJvbCB9IGZyb20gXCIuL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluaXRpYWxpemVyc1N5bWJvbCB9IGZyb20gXCIuL21vZGVsQ2xhc3NJbml0aWFsaXplclwiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8sIHNldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyB9IGZyb20gXCIuL21vZGVsUHJvcHNJbmZvXCJcbmltcG9ydCB7IG1vZGVsTWV0YWRhdGFTeW1ib2wsIG1vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2wgfSBmcm9tIFwiLi9tb2RlbFN5bWJvbHNcIlxuaW1wb3J0IHsgQW55TW9kZWxQcm9wLCBNb2RlbFByb3BzLCBwcm9wIH0gZnJvbSBcIi4vcHJvcFwiXG5pbXBvcnQgeyBhc3NlcnRJc0NsYXNzT3JEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuZnVuY3Rpb24gX19leHRlbmRzKHN1YkNsYXNzOiBhbnksIHN1cGVyQ2xhc3M6IGFueSkge1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpXG4gIGZ1bmN0aW9uIF9fKHRoaXM6IGFueSkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSBzdWJDbGFzc1xuICB9XG4gIF9fLnByb3RvdHlwZSA9IHN1cGVyQ2xhc3MucHJvdG90eXBlXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IG5ldyAoX18gYXMgYW55KSgpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1vZGVsUHJvcERlc2NyaXB0b3IoXG4gIG1vZGVsUHJvcE5hbWU6IHN0cmluZyxcbiAgbW9kZWxQcm9wOiBBbnlNb2RlbFByb3AgfCB1bmRlZmluZWQsXG4gIGVudW1lcmFibGU6IGJvb2xlYW5cbik6IFByb3BlcnR5RGVzY3JpcHRvciB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0KHRoaXM6IEFueU1vZGVsIHwgQW55RGF0YU1vZGVsKSB7XG4gICAgICByZXR1cm4gZ2V0TW9kZWxJbnN0YW5jZURhdGFGaWVsZCh0aGlzLCBtb2RlbFByb3AsIG1vZGVsUHJvcE5hbWUpXG4gICAgfSxcbiAgICBzZXQodGhpczogQW55TW9kZWwgfCBBbnlEYXRhTW9kZWwsIHY/OiBhbnkpIHtcbiAgICAgIC8vIGhhY2sgdG8gb25seSBwZXJtaXQgc2V0dGluZyB0aGVzZSB2YWx1ZXMgb25jZSBmdWxseSBjb25zdHJ1Y3RlZFxuICAgICAgLy8gdGhpcyBpcyB0byBpZ25vcmUgYWJzdHJhY3QgcHJvcGVydGllcyBiZWluZyBzZXQgYnkgYmFiZWxcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20veGF2aWVyZ29uei9tb2J4LWtleXN0b25lL2lzc3Vlcy8xOFxuICAgICAgaWYgKCEobW9kZWxJbml0aWFsaXplZFN5bWJvbCBpbiB0aGlzKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHNldE1vZGVsSW5zdGFuY2VEYXRhRmllbGQodGhpcywgbW9kZWxQcm9wLCBtb2RlbFByb3BOYW1lLCB2KVxuICAgIH0sXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TW9kZWxJbnN0YW5jZURhdGFGaWVsZDxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgbW9kZWxQcm9wOiBBbnlNb2RlbFByb3AgfCB1bmRlZmluZWQsXG4gIG1vZGVsUHJvcE5hbWU6IHN0cmluZ1xuKTogYW55IHtcbiAgLy8gbm8gbmVlZCB0byB1c2UgZ2V0IHNpbmNlIHRoZXNlIHZhcnMgYWx3YXlzIGdldCBvbiB0aGUgaW5pdGlhbCAkXG4gIGNvbnN0IHZhbHVlID0gbW9kZWwuJFttb2RlbFByb3BOYW1lXVxuXG4gIGlmIChtb2RlbFByb3A/Ll9pbnRlcm5hbC50cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gbW9kZWxQcm9wLl9pbnRlcm5hbC50cmFuc2Zvcm0udHJhbnNmb3JtKHZhbHVlLCBtb2RlbCwgbW9kZWxQcm9wTmFtZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAvLyB1c2UgYXBwbHkgc2V0IGluc3RlYWQgdG8gd3JhcCBpdCBpbiBhbiBhY3Rpb25cbiAgICAgIC8vIHNldCB0aGUgJCBvYmplY3QgdG8gc2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBkaXJlY3RseVxuICAgICAgYXBwbHlTZXQobW9kZWwuJCwgbW9kZWxQcm9wTmFtZSwgbmV3VmFsdWUpXG4gICAgfSkgYXMgYW55XG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuZnVuY3Rpb24gc2V0TW9kZWxJbnN0YW5jZURhdGFGaWVsZDxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgbW9kZWxQcm9wOiBBbnlNb2RlbFByb3AgfCB1bmRlZmluZWQsXG4gIG1vZGVsUHJvcE5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IGFueVxuKTogdm9pZCB7XG4gIGlmIChtb2RlbFByb3A/Ll9pbnRlcm5hbC5zZXR0ZXIgPT09IFwiYXNzaWduXCIgJiYgIWdldEN1cnJlbnRBY3Rpb25Db250ZXh0KCkpIHtcbiAgICAvLyB1c2UgYXBwbHkgc2V0IGluc3RlYWQgdG8gd3JhcCBpdCBpbiBhbiBhY3Rpb25cbiAgICBhcHBseVNldChtb2RlbCwgbW9kZWxQcm9wTmFtZSBhcyBhbnksIHZhbHVlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IG1vZGVsUHJvcD8uX2ludGVybmFsLnRyYW5zZm9ybVxuICAgID8gbW9kZWxQcm9wLl9pbnRlcm5hbC50cmFuc2Zvcm0udW50cmFuc2Zvcm0odmFsdWUsIG1vZGVsLCBtb2RlbFByb3BOYW1lKVxuICAgIDogdmFsdWVcbiAgLy8gbm8gbmVlZCB0byB1c2Ugc2V0IHNpbmNlIHRoZXNlIHZhcnMgYWx3YXlzIGdldCBvbiB0aGUgaW5pdGlhbCAkXG4gIG1vZGVsLiRbbW9kZWxQcm9wTmFtZV0gPSB0cmFuc2Zvcm1lZFZhbHVlXG59XG5cbmNvbnN0IGlkR2VuZXJhdG9yID0gKCkgPT4gZ2V0R2xvYmFsQ29uZmlnKCkubW9kZWxJZEdlbmVyYXRvcigpXG5jb25zdCB0UHJvcEZvcklkID0gdFByb3AodHlwZXNTdHJpbmcsIGlkR2VuZXJhdG9yKVxudFByb3BGb3JJZC5faW50ZXJuYWwuaXNJZCA9IHRydWVcbmNvbnN0IHByb3BGb3JJZCA9IHByb3AoaWRHZW5lcmF0b3IpXG5wcm9wRm9ySWQuX2ludGVybmFsLmlzSWQgPSB0cnVlXG5cbnR5cGUgRnJvbVNuYXBzaG90UHJvY2Vzc29yRm4gPSAoc246IGFueSkgPT4gYW55XG50eXBlIFRvU25hcHNob3RQcm9jZXNzb3JGbiA9IChzbjogYW55LCBpbnN0YW5jZTogYW55KSA9PiBhbnlcblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZEludGVybmFsTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRCYXNlTW9kZWwgZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbFxuPih7XG4gIG1vZGVsUHJvcHMsXG4gIGJhc2VNb2RlbCxcbiAgdHlwZSxcbiAgdmFsdWVUeXBlLFxuICBmcm9tU25hcHNob3RQcm9jZXNzb3IsXG4gIHRvU25hcHNob3RQcm9jZXNzb3IsXG59OiB7XG4gIG1vZGVsUHJvcHM6IFRQcm9wc1xuICBiYXNlTW9kZWw6IE1vZGVsQ2xhc3M8VEJhc2VNb2RlbD4gfCB1bmRlZmluZWRcbiAgdHlwZTogXCJjbGFzc1wiIHwgXCJkYXRhXCJcbiAgdmFsdWVUeXBlOiBib29sZWFuXG4gIGZyb21TbmFwc2hvdFByb2Nlc3NvcjogRnJvbVNuYXBzaG90UHJvY2Vzc29yRm4gfCB1bmRlZmluZWRcbiAgdG9TbmFwc2hvdFByb2Nlc3NvcjogVG9TbmFwc2hvdFByb2Nlc3NvckZuIHwgdW5kZWZpbmVkXG59KTogYW55IHtcbiAgYXNzZXJ0SXNPYmplY3QobW9kZWxQcm9wcywgXCJtb2RlbFByb3BzXCIpXG4gIGlmIChiYXNlTW9kZWwpIHtcbiAgICBhc3NlcnRJc0NsYXNzT3JEYXRhTW9kZWxDbGFzcyhiYXNlTW9kZWwsIFwiYmFzZU1vZGVsXCIpXG5cbiAgICAvLyBpZiB0aGUgYmFzZU1vZGVsIGlzIHdyYXBwZWQgd2l0aCB0aGUgbW9kZWwgZGVjb3JhdG9yIGdldCB0aGUgb3JpZ2luYWwgb25lXG4gICAgY29uc3QgdW53cmFwcGVkQ2xhc3MgPSAoYmFzZU1vZGVsIGFzIGFueSlbbW9kZWxVbndyYXBwZWRDbGFzc1N5bWJvbF1cbiAgICBpZiAodW53cmFwcGVkQ2xhc3MpIHtcbiAgICAgIGJhc2VNb2RlbCA9IHVud3JhcHBlZENsYXNzXG4gICAgICBhc3NlcnRJc0NsYXNzT3JEYXRhTW9kZWxDbGFzcyhiYXNlTW9kZWwsIFwiYmFzZU1vZGVsXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0cmFEZXNjcmlwdG9yczogUHJvcGVydHlEZXNjcmlwdG9yTWFwID0ge31cblxuICBjb25zdCBjb21wb3NlZE1vZGVsUHJvcHM6IE1vZGVsUHJvcHMgPSBtb2RlbFByb3BzXG4gIGlmIChiYXNlTW9kZWwpIHtcbiAgICBjb25zdCBvbGRNb2RlbFByb3BzID0gZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKGJhc2VNb2RlbClcbiAgICBmb3IgKGNvbnN0IG9sZE1vZGVsUHJvcEtleSBvZiBPYmplY3Qua2V5cyhvbGRNb2RlbFByb3BzKSkge1xuICAgICAgaWYgKG1vZGVsUHJvcHNbb2xkTW9kZWxQcm9wS2V5XSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBleHRlbmRlZCBtb2RlbCBjYW5ub3QgcmVkZWNsYXJlIGJhc2UgbW9kZWwgcHJvcGVydHkgbmFtZWQgJyR7b2xkTW9kZWxQcm9wS2V5fSdgXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNvbXBvc2VkTW9kZWxQcm9wc1tvbGRNb2RlbFByb3BLZXldID0gb2xkTW9kZWxQcm9wc1tvbGRNb2RlbFByb3BLZXldXG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgaWQga2V5c1xuICBjb25zdCBpZEtleXMgPSBPYmplY3Qua2V5cyhjb21wb3NlZE1vZGVsUHJvcHMpLmZpbHRlcigoaykgPT4ge1xuICAgIGNvbnN0IHAgPSBjb21wb3NlZE1vZGVsUHJvcHNba11cbiAgICByZXR1cm4gcC5faW50ZXJuYWwuaXNJZFxuICB9KVxuICBpZiAodHlwZSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgaWYgKGlkS2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBleHBlY3RlZCBhdCBtb3N0IG9uZSBpZFByb3AgYnV0IGdvdCBtYW55OiAke0pTT04uc3RyaW5naWZ5KGlkS2V5cyl9YClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlkS2V5cy5sZW5ndGggPj0gMSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgZXhwZWN0ZWQgbm8gaWRQcm9wIGJ1dCBnb3Qgc29tZTogJHtKU09OLnN0cmluZ2lmeShpZEtleXMpfWApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmVlZHNUeXBlQ2hlY2tlciA9IE9iamVjdC52YWx1ZXMoY29tcG9zZWRNb2RlbFByb3BzKS5zb21lKFxuICAgIChtcCkgPT4gISFtcC5faW50ZXJuYWwudHlwZUNoZWNrZXJcbiAgKVxuXG4gIC8vIHRyYW5zZm9ybSBpZCBrZXlzIChvbmx5IG9uZSByZWFsbHkpXG4gIGxldCBpZEtleTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGlmIChpZEtleXMubGVuZ3RoID49IDEpIHtcbiAgICBpZEtleSA9IGlkS2V5c1swXVxuICAgIGNvbnN0IGlkUHJvcCA9IGNvbXBvc2VkTW9kZWxQcm9wc1tpZEtleV1cbiAgICBsZXQgYmFzZVByb3A6IEFueU1vZGVsUHJvcCA9IG5lZWRzVHlwZUNoZWNrZXIgPyB0UHJvcEZvcklkIDogcHJvcEZvcklkXG4gICAgc3dpdGNoIChpZFByb3A/Ll9pbnRlcm5hbC5zZXR0ZXIpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgYmFzZVByb3AgPSBiYXNlUHJvcC53aXRoU2V0dGVyKClcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJhc3NpZ25cIjpcbiAgICAgICAgYmFzZVByb3AgPSBiYXNlUHJvcC53aXRoU2V0dGVyKFwiYXNzaWduXCIpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cbiAgICBjb21wb3NlZE1vZGVsUHJvcHNbaWRLZXldID0gYmFzZVByb3BcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0eXBlIGNoZWNrZXIgaWYgbmVlZGVkXG4gIGxldCBkYXRhVHlwZUNoZWNrZXI6IExhdGVUeXBlQ2hlY2tlciB8IHVuZGVmaW5lZFxuICBpZiAobmVlZHNUeXBlQ2hlY2tlcikge1xuICAgIGNvbnN0IHR5cGVDaGVja2VyT2JqOiB7XG4gICAgICBbazogc3RyaW5nXTogYW55XG4gICAgfSA9IHt9XG4gICAgZm9yIChjb25zdCBbaywgbXBdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBvc2VkTW9kZWxQcm9wcykpIHtcbiAgICAgIHR5cGVDaGVja2VyT2JqW2tdID0gIW1wLl9pbnRlcm5hbC50eXBlQ2hlY2tlciA/IHR5cGVzVW5jaGVja2VkKCkgOiBtcC5faW50ZXJuYWwudHlwZUNoZWNrZXJcbiAgICB9XG4gICAgZGF0YVR5cGVDaGVja2VyID0gdHlwZXNPYmplY3QoKCkgPT4gdHlwZUNoZWNrZXJPYmopIGFzIGFueVxuICB9XG5cbiAgY29uc3QgYmFzZVByb3BOYW1lcyA9IHR5cGUgPT09IFwiY2xhc3NcIiA/IGJhc2VNb2RlbFByb3BOYW1lcyA6IGJhc2VEYXRhTW9kZWxQcm9wTmFtZXNcblxuICAvLyBza2lwIHByb3BzIHRoYXQgYXJlIG9uIGJhc2UgbW9kZWwsIHRoZXNlIGhhdmUgdG8gYmUgYWNjZXNzZWQgdGhyb3VnaCAkXG4gIC8vIHdlIG9ubHkgbmVlZCB0byBwcm94eSBuZXcgcHJvcHMsIG5vdCBvbGQgb25lc1xuICBmb3IgKGNvbnN0IG1vZGVsUHJvcE5hbWUgb2YgT2JqZWN0LmtleXMobW9kZWxQcm9wcykuZmlsdGVyKFxuICAgIChtcCkgPT4gIWJhc2VQcm9wTmFtZXMuaGFzKG1wIGFzIGFueSlcbiAgKSkge1xuICAgIGV4dHJhRGVzY3JpcHRvcnNbbW9kZWxQcm9wTmFtZV0gPSBjcmVhdGVNb2RlbFByb3BEZXNjcmlwdG9yKFxuICAgICAgbW9kZWxQcm9wTmFtZSxcbiAgICAgIG1vZGVsUHJvcHNbbW9kZWxQcm9wTmFtZV0sXG4gICAgICBmYWxzZVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGV4dHJhUHJvcE5hbWVzID0gT2JqZWN0LmtleXMoZXh0cmFEZXNjcmlwdG9ycylcbiAgY29uc3QgZXh0cmFQcm9wTmFtZXNMZW4gPSBleHRyYVByb3BOYW1lcy5sZW5ndGhcblxuICBjb25zdCBiYXNlOiBhbnkgPSBiYXNlTW9kZWwgPz8gKHR5cGUgPT09IFwiY2xhc3NcIiA/IEJhc2VNb2RlbCA6IEJhc2VEYXRhTW9kZWwpXG5cbiAgLy8gd2UgdXNlIHRoaXMgd2VpcmQgaGFjayByYXRoZXIgdGhhbiBqdXN0IGNsYXNzIEN1c3RvbUJhc2VNb2RlbCBleHRlbmRzIGJhc2Uge31cbiAgLy8gaW4gb3JkZXIgdG8gd29yayBhcm91bmQgcHJvYmxlbXMgd2l0aCBFUzUgY2xhc3NlcyBleHRlbmRpbmcgRVM2IGNsYXNzZXNcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94YXZpZXJnb256L21vYngta2V5c3RvbmUvaXNzdWVzLzE1XG4gIGNvbnN0IEN1c3RvbUJhc2VNb2RlbDogYW55ID0gKGZ1bmN0aW9uIChfYmFzZSkge1xuICAgIF9fZXh0ZW5kcyhDdXN0b21CYXNlTW9kZWwsIF9iYXNlKVxuXG4gICAgZnVuY3Rpb24gQ3VzdG9tQmFzZU1vZGVsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgaW5pdGlhbERhdGE6IGFueSxcbiAgICAgIGNvbnN0cnVjdG9yT3B0aW9ucz86IE1vZGVsQ29uc3RydWN0b3JPcHRpb25zIHwgRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gY29uc3RydWN0b3JPcHRpb25zPy5tb2RlbENsYXNzID8/IHRoaXMuY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJhc2VNb2RlbCA9IG5ldyBfYmFzZShpbml0aWFsRGF0YSwge1xuICAgICAgICAuLi5jb25zdHJ1Y3Rvck9wdGlvbnMsXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICB9IGFzIE1vZGVsQ29uc3RydWN0b3JPcHRpb25zICYgRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zKVxuXG4gICAgICAvLyBtYWtlIHN1cmUgYWJzdHJhY3QgY2xhc3NlcyBkbyBub3Qgb3ZlcnJpZGUgcHJvdG90eXBlIHByb3BzXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dHJhUHJvcE5hbWVzTGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXh0cmFQcm9wTmFtZSA9IGV4dHJhUHJvcE5hbWVzW2ldXG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2VNb2RlbCwgZXh0cmFQcm9wTmFtZSkpIHtcbiAgICAgICAgICBkZWxldGUgYmFzZU1vZGVsW2V4dHJhUHJvcE5hbWVdXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJhc2VNb2RlbFxuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21CYXNlTW9kZWxcbiAgfSkoYmFzZSlcblxuICBjb25zdCBpbml0aWFsaXplcnMgPSBiYXNlW21vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sXVxuICBpZiAoaW5pdGlhbGl6ZXJzKSB7XG4gICAgQ3VzdG9tQmFzZU1vZGVsW21vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sXSA9IGluaXRpYWxpemVycy5zbGljZSgpXG4gIH1cblxuICBzZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8oQ3VzdG9tQmFzZU1vZGVsLCBjb21wb3NlZE1vZGVsUHJvcHMpXG5cbiAgaWYgKHR5cGUgPT09IFwiY2xhc3NcIikge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBNb2RlbE1ldGFkYXRhID0ge1xuICAgICAgZGF0YVR5cGU6IGRhdGFUeXBlQ2hlY2tlciBhcyB1bmtub3duIGFzIEFueVR5cGUgfCB1bmRlZmluZWQsXG4gICAgICBtb2RlbElkUHJvcGVydHk6IGlkS2V5LFxuICAgICAgdmFsdWVUeXBlLFxuICAgIH1cbiAgICBDdXN0b21CYXNlTW9kZWxbbW9kZWxNZXRhZGF0YVN5bWJvbF0gPSBtZXRhZGF0YVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBEYXRhTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIGRhdGFUeXBlOiBkYXRhVHlwZUNoZWNrZXIgYXMgdW5rbm93biBhcyBBbnlUeXBlIHwgdW5kZWZpbmVkLFxuICAgIH1cbiAgICBDdXN0b21CYXNlTW9kZWxbbW9kZWxNZXRhZGF0YVN5bWJvbF0gPSBtZXRhZGF0YVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ3VzdG9tQmFzZU1vZGVsLnByb3RvdHlwZSwgZXh0cmFEZXNjcmlwdG9ycylcblxuICAvLyBhZGQgc2V0dGVyIGFjdGlvbnMgdG8gcHJvdG90eXBlXG4gIGZvciAoY29uc3QgW3Byb3BOYW1lLCBwcm9wRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMobW9kZWxQcm9wcykpIHtcbiAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLnNldHRlciA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc2V0dGVyTmFtZSA9IHByb3BOYW1lVG9TZXR0ZXJOYW1lKHByb3BOYW1lKVxuXG4gICAgICBDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlW3NldHRlck5hbWVdID0gZnVuY3Rpb24gKHRoaXM6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IHZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1Byb3BEZXNjcmlwdG9yOiBhbnkgPSBtb2RlbEFjdGlvbihcbiAgICAgICAgQ3VzdG9tQmFzZU1vZGVsLnByb3RvdHlwZSxcbiAgICAgICAgc2V0dGVyTmFtZSxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlLCBzZXR0ZXJOYW1lKVxuICAgICAgKVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ3VzdG9tQmFzZU1vZGVsLnByb3RvdHlwZSwgc2V0dGVyTmFtZSwgbmV3UHJvcERlc2NyaXB0b3IpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbW9kZWxQcm9wc0Zyb21TbmFwc2hvdFByb2Nlc3NvciA9IGdldE1vZGVsUHJvcHNGcm9tU25hcHNob3RQcm9jZXNzb3IoY29tcG9zZWRNb2RlbFByb3BzKVxuXG4gIGNvbnN0IG1vZGVsUHJvcHNUb1NuYXBzaG90UHJvY2Vzc29yID0gZ2V0TW9kZWxQcm9wc1RvU25hcHNob3RQcm9jZXNzb3IoY29tcG9zZWRNb2RlbFByb3BzKVxuXG4gIGlmIChmcm9tU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICBjb25zdCBmbiA9IGZyb21TbmFwc2hvdFByb2Nlc3NvclxuICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvciA9IChzbikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZm4oc24pLFxuICAgICAgICBbbW9kZWxUeXBlS2V5XTogc25bbW9kZWxUeXBlS2V5XSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodG9TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgIGNvbnN0IGZuID0gdG9TbmFwc2hvdFByb2Nlc3NvclxuICAgIHRvU25hcHNob3RQcm9jZXNzb3IgPSAoc24sIG1vZGVsSW5zdGFuY2UpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmZuKHNuLCBtb2RlbEluc3RhbmNlKSxcbiAgICAgICAgW21vZGVsVHlwZUtleV06IHNuW21vZGVsVHlwZUtleV0sXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQ3VzdG9tQmFzZU1vZGVsLmZyb21TbmFwc2hvdFByb2Nlc3NvciA9IGNoYWluRm5zKFxuICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvcixcbiAgICBtb2RlbFByb3BzRnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gIClcbiAgQ3VzdG9tQmFzZU1vZGVsLnRvU25hcHNob3RQcm9jZXNzb3IgPSBjaGFpbkZucyhtb2RlbFByb3BzVG9TbmFwc2hvdFByb2Nlc3NvciwgdG9TbmFwc2hvdFByb2Nlc3NvcilcblxuICByZXR1cm4gQ3VzdG9tQmFzZU1vZGVsXG59XG5cbmZ1bmN0aW9uIGdldE1vZGVsUHJvcHNGcm9tU25hcHNob3RQcm9jZXNzb3IoXG4gIGNvbXBvc2VkTW9kZWxQcm9wczogTW9kZWxQcm9wc1xuKTogRnJvbVNuYXBzaG90UHJvY2Vzc29yRm4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9wc1dpdGhGcm9tU25hcHNob3RQcm9jZXNzb3IgPSBPYmplY3QuZW50cmllcyhjb21wb3NlZE1vZGVsUHJvcHMpLmZpbHRlcihcbiAgICAoW19wcm9wTmFtZSwgcHJvcERhdGFdKSA9PiBwcm9wRGF0YS5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gIClcbiAgaWYgKHByb3BzV2l0aEZyb21TbmFwc2hvdFByb2Nlc3Nvci5sZW5ndGggPD0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiAoc24pID0+IHtcbiAgICBjb25zdCBuZXdTbiA9IHsgLi4uc24gfVxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBwcm9wRGF0YV0gb2YgcHJvcHNXaXRoRnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLmZyb21TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgICAgICBuZXdTbltwcm9wTmFtZV0gPSBwcm9wRGF0YS5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuW3Byb3BOYW1lXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1NuXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TW9kZWxQcm9wc1RvU25hcHNob3RQcm9jZXNzb3IoXG4gIGNvbXBvc2VkTW9kZWxQcm9wczogTW9kZWxQcm9wc1xuKTogVG9TbmFwc2hvdFByb2Nlc3NvckZuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvcHNXaXRoVG9TbmFwc2hvdFByb2Nlc3NvciA9IE9iamVjdC5lbnRyaWVzKGNvbXBvc2VkTW9kZWxQcm9wcykuZmlsdGVyKFxuICAgIChbX3Byb3BOYW1lLCBwcm9wRGF0YV0pID0+IHByb3BEYXRhLl9pbnRlcm5hbC50b1NuYXBzaG90UHJvY2Vzc29yXG4gIClcblxuICBpZiAocHJvcHNXaXRoVG9TbmFwc2hvdFByb2Nlc3Nvci5sZW5ndGggPD0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiAoc24pID0+IHtcbiAgICBjb25zdCBuZXdTbiA9IHsgLi4uc24gfVxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBwcm9wRGF0YV0gb2YgcHJvcHNXaXRoVG9TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC50b1NuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICAgIG5ld1NuW3Byb3BOYW1lXSA9IHByb3BEYXRhLl9pbnRlcm5hbC50b1NuYXBzaG90UHJvY2Vzc29yKHNuW3Byb3BOYW1lXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1NuXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQWJzdHJhY3RNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzLFxuICBNb2RlbENyZWF0aW9uRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUHJvcHMsXG4gIE1vZGVsUHJvcHNUb1NldHRlcixcbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90RGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgc2hhcmVkSW50ZXJuYWxNb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9zaGFyZWRJbnRlcm5hbE1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwsIEJhc2VNb2RlbCwgQmFzZU1vZGVsS2V5cywgTW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRJc01vZGVsQ2xhc3MsIGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IHR5cGUgX0NvbXBvc2VkQ3JlYXRpb25EYXRhPFxuICBTdXBlck1vZGVsLFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzXG4+ID0gU3VwZXJNb2RlbCBleHRlbmRzIEFueU1vZGVsXG4gID8gTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPiAmIE1vZGVsQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWw+XG4gIDogTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPlxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHR5cGUgdXNlZCBieSBmcm9tU25hcHNob3QgYmVmb3JlIHByb2Nlc3NvcnMgYXJlIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEZyb21TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID1cbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGE8VFByb3BzPlxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHR5cGUgdXNlZCBieSBnZXRTbmFwc2hvdCBiZWZvcmUgcHJvY2Vzc29ycyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID0gTW9kZWxQcm9wc1RvU25hcHNob3REYXRhPFRQcm9wcz5cblxuZXhwb3J0IHR5cGUgX01vZGVsSWQ8U3VwZXJNb2RlbCwgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBTdXBlck1vZGVsIGV4dGVuZHMgQW55TW9kZWxcbiAgPyBNb2RlbElkUHJvcGVydHlOYW1lPFN1cGVyTW9kZWw+XG4gIDogRXh0cmFjdE1vZGVsSWRQcm9wPFRQcm9wcz4gJiBzdHJpbmdcblxuZXhwb3J0IGludGVyZmFjZSBfTW9kZWw8XG4gIFN1cGVyTW9kZWwsXG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIEZyb21TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVG9TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PlxuPiB7XG4gIG5ldyAoZGF0YTogX0NvbXBvc2VkQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWwsIFRQcm9wcz4pOiBTdXBlck1vZGVsICZcbiAgICBCYXNlTW9kZWw8VFByb3BzLCBGcm9tU25hcHNob3RPdmVycmlkZSwgVG9TbmFwc2hvdE92ZXJyaWRlLCBfTW9kZWxJZDxTdXBlck1vZGVsLCBUUHJvcHM+PiAmXG4gICAgT21pdDxNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGE8VFByb3BzPiwgQmFzZU1vZGVsS2V5cz4gJlxuICAgIE1vZGVsUHJvcHNUb1NldHRlcjxUUHJvcHM+XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgbW9kZWwgaWQgcHJvcGVydHkgZnJvbSB0aGUgbW9kZWwgcHJvcHMuXG4gKi9cbmV4cG9ydCB0eXBlIEV4dHJhY3RNb2RlbElkUHJvcDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFByb3BzXTogVFByb3BzW0tdW1wiX2ludGVybmFsXCJdW1wiJGlzSWRcIl0gZXh0ZW5kcyB0cnVlID8gSyA6IG5ldmVyXG59W2tleW9mIFRQcm9wc11cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBtb2RlbHMgdGhhdCBleHRlbmRzIGFub3RoZXIgbW9kZWwuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTmV3IG1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEB0eXBlcGFyYW0gVE1vZGVsQ2xhc3MgTW9kZWwgY2xhc3MgdHlwZS5cbiAqIEBwYXJhbSBnZW5GbiBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGJhc2UgbW9kZWwgYW5kIG1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWRNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ2xhc3M8QW55TW9kZWw+LFxuICBBIGV4dGVuZHMgW10sXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgZ2VuRm46ICguLi5hcmdzOiBBKSA9PiB7XG4gICAgYmFzZU1vZGVsOiBUTW9kZWxDbGFzc1xuICAgIHByb3BzOiBUUHJvcHNcbiAgfSxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPEluc3RhbmNlVHlwZTxUTW9kZWxDbGFzcz4sIFRQcm9wcywgRlMsIFRTPlxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscyB0aGF0IGV4dGVuZHMgYW5vdGhlciBtb2RlbC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBOZXcgbW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHR5cGVwYXJhbSBUTW9kZWxDbGFzcyBNb2RlbCBjbGFzcyB0eXBlLlxuICogQHBhcmFtIGJhc2VNb2RlbCBCYXNlIG1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIG1vZGVsT3B0aW9ucyBNb2RlbCBvcHRpb25zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV4dGVuZGVkTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRNb2RlbENsYXNzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENsYXNzPEFueU1vZGVsPixcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KFxuICBiYXNlTW9kZWw6IFRNb2RlbENsYXNzLFxuICBtb2RlbFByb3BzOiBUUHJvcHMsXG4gIG1vZGVsT3B0aW9ucz86IE1vZGVsT3B0aW9uczxUUHJvcHMsIEZTLCBUUz5cbik6IF9Nb2RlbDxJbnN0YW5jZVR5cGU8VE1vZGVsQ2xhc3M+LCBUUHJvcHMsIEZTLCBUUz4gJiB7XG4gIFtQIGluIEV4Y2x1ZGU8a2V5b2YgVE1vZGVsQ2xhc3MsIFwicHJvdG90eXBlXCI+XTogVE1vZGVsQ2xhc3NbUF1cbn1cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIEV4dGVuZGVkTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRNb2RlbENsYXNzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENsYXNzPEFueU1vZGVsPixcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KC4uLmFyZ3M6IGFueVtdKTogX01vZGVsPEluc3RhbmNlVHlwZTxUTW9kZWxDbGFzcz4sIFRQcm9wcywgRlMsIFRTPiB7XG4gIGxldCBiYXNlTW9kZWxcbiAgbGV0IG1vZGVsUHJvcHNcbiAgbGV0IG1vZGVsT3B0aW9uc1xuICBpZiAoaXNNb2RlbENsYXNzKGFyZ3NbMF0pKSB7XG4gICAgYmFzZU1vZGVsID0gYXJnc1swXVxuICAgIG1vZGVsUHJvcHMgPSBhcmdzWzFdXG4gICAgbW9kZWxPcHRpb25zID0gYXJnc1syXVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGdlbiA9IGFyZ3NbMF0oKVxuXG4gICAgYmFzZU1vZGVsID0gZ2VuLmJhc2VNb2RlbFxuICAgIG1vZGVsUHJvcHMgPSBnZW4ucHJvcHNcbiAgICBtb2RlbE9wdGlvbnMgPSBhcmdzWzFdXG4gIH1cblxuICBhc3NlcnRJc01vZGVsQ2xhc3MoYmFzZU1vZGVsLCBcImJhc2VNb2RlbFwiKVxuXG4gIHJldHVybiBpbnRlcm5hbE1vZGVsKG1vZGVsUHJvcHMsIGJhc2VNb2RlbCBhcyBhbnksIG1vZGVsT3B0aW9ucylcbn1cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBtb2RlbHMuXG4gKlxuICogTmV2ZXIgb3ZlcnJpZGUgdGhlIGNvbnN0cnVjdG9yLCB1c2UgYG9uSW5pdGAgb3IgYG9uQXR0YWNoZWRUb1Jvb3RTdG9yZWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAcGFyYW0gZm5Nb2RlbFByb3BzIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIG1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgQSBleHRlbmRzIFtdLFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oXG4gIGZuTW9kZWxQcm9wczogKC4uLmFyZ3M6IEEpID0+IFRQcm9wcyxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPHVua25vd24sIFRQcm9wcywgRlMsIFRTPlxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25Jbml0YCBvciBgb25BdHRhY2hlZFRvUm9vdFN0b3JlYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFByb3BzIE1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KG1vZGVsUHJvcHM6IFRQcm9wcywgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPik6IF9Nb2RlbDx1bmtub3duLCBUUHJvcHMsIEZTLCBUUz5cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oXG4gIGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wczogKCgpID0+IFRQcm9wcykgfCBUUHJvcHMsXG4gIG1vZGVsT3B0aW9ucz86IE1vZGVsT3B0aW9uczxUUHJvcHMsIEZTLCBUUz5cbik6IF9Nb2RlbDx1bmtub3duLCBUUHJvcHMsIEZTLCBUUz4ge1xuICBjb25zdCBtb2RlbFByb3BzID1cbiAgICB0eXBlb2YgZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzKClcbiAgICAgIDogZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzXG4gIHJldHVybiBpbnRlcm5hbE1vZGVsKG1vZGVsUHJvcHMsIHVuZGVmaW5lZCwgbW9kZWxPcHRpb25zKVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBUQmFzZU1vZGVsIGV4dGVuZHMgQW55TW9kZWwsXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgbW9kZWxQcm9wczogVFByb3BzLFxuICBiYXNlTW9kZWw6IE1vZGVsQ2xhc3M8VEJhc2VNb2RlbD4gfCB1bmRlZmluZWQsXG4gIG1vZGVsT3B0aW9ucz86IE1vZGVsT3B0aW9uczxUUHJvcHMsIEZTLCBUUz5cbik6IF9Nb2RlbDxUQmFzZU1vZGVsLCBUUHJvcHMsIEZTLCBUUz4ge1xuICByZXR1cm4gc2hhcmVkSW50ZXJuYWxNb2RlbCh7XG4gICAgbW9kZWxQcm9wcyxcbiAgICBiYXNlTW9kZWwsXG4gICAgdHlwZTogXCJjbGFzc1wiLFxuICAgIHZhbHVlVHlwZTogbW9kZWxPcHRpb25zPy52YWx1ZVR5cGUgPz8gZmFsc2UsXG4gICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiBtb2RlbE9wdGlvbnM/LmZyb21TbmFwc2hvdFByb2Nlc3NvcixcbiAgICB0b1NuYXBzaG90UHJvY2Vzc29yOiBtb2RlbE9wdGlvbnM/LnRvU25hcHNob3RQcm9jZXNzb3IsXG4gIH0pXG59XG5cbi8qKlxuICogTW9kZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbE9wdGlvbnM8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgRlMsIFRTPiB7XG4gIC8qKlxuICAgKiBBIHZhbHVlIHR5cGUgd2lsbCBiZSBjbG9uZWQgYXV0b21hdGljYWxseSB3aGVuIGJlaW5nIGF0dGFjaGVkIHRvIGEgbmV3IHRyZWUuXG4gICAqIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICB2YWx1ZVR5cGU/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSBydW4gd2hlbiBjb252ZXJ0aW5nIGZyb20gYSBzbmFwc2hvdCB0byB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBtb2RlbC5cbiAgICogVXNlZnVsIGZvciBleGFtcGxlIHRvIGRvIHZlcnNpb25pbmcgYW5kIGtlZXAgdGhlIGRhdGEgcGFydCB1cCB0byBkYXRlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHNuIFRoZSBjdXN0b20gaW5wdXQgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIEFuIGlucHV0IHNuYXBzaG90IHRoYXQgbXVzdCBtYXRjaCB0aGUgZXhwZWN0ZWQgbW9kZWwgaW5wdXQgc25hcHNob3QuXG4gICAqL1xuICBmcm9tU25hcHNob3RQcm9jZXNzb3I/KHNuOiBGUyk6IEZyb21TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcz5cblxuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gdGhhdCB3aWxsIGJlIHJ1biB3aGVuIGNvbnZlcnRpbmcgdGhlIGRhdGEgcGFydCBvZiB0aGUgbW9kZWwgaW50byBhIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gc24gVGhlIG91dHB1dCBzbmFwc2hvdC5cbiAgICogQHBhcmFtIG1vZGVsSW5zdGFuY2UgVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyAgYSBjdXN0b20gb3V0cHV0IHNuYXBzaG90LlxuICAgKi9cbiAgdG9TbmFwc2hvdFByb2Nlc3Nvcj8oc246IFRvU25hcHNob3REZWZhdWx0VHlwZTxUUHJvcHM+LCBtb2RlbEluc3RhbmNlOiBhbnkpOiBUU1xufVxuIiwiaW1wb3J0IHsgSG9va0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vaG9va0FjdGlvbnNcIlxuaW1wb3J0IHsgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZCB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGdldEdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzLCBtb2RlbEluaXRpYWxpemVkU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzLCBtb2RlbEluZm9CeU5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7XG4gIG1vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2wsXG4gIHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbFN5bWJvbHNcIlxuaW1wb3J0IHtcbiAgYWRkSGlkZGVuUHJvcCxcbiAgZmFpbHVyZSxcbiAgZ2V0TW9ieFZlcnNpb24sXG4gIGxvZ1dhcm5pbmcsXG4gIG1vYng2LFxuICBydW5BZnRlck5ld1N5bWJvbCxcbiAgcnVuQmVmb3JlT25Jbml0U3ltYm9sLFxuICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMsXG59IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgbWFya3MgdGhpcyBjbGFzcyAod2hpY2ggTVVTVCBpbmhlcml0IGZyb20gdGhlIGBNb2RlbGAgb3IgYERhdGFNb2RlbGAgYWJzdHJhY3QgY2xhc3NlcylcbiAqIGFzIGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG5hbWUgVW5pcXVlIG5hbWUgZm9yIHRoZSBtb2RlbCB0eXBlLiBOb3RlIHRoYXQgdGhpcyBuYW1lIG11c3QgYmUgdW5pcXVlIGZvciB5b3VyIHdob2xlXG4gKiBhcHBsaWNhdGlvbiwgc28gaXQgaXMgdXN1YWxseSBhIGdvb2QgaWRlYSB0byB1c2Ugc29tZSBwcmVmaXggdW5pcXVlIHRvIHlvdXIgYXBwbGljYXRpb24gZG9tYWluLlxuICovXG5leHBvcnQgY29uc3QgbW9kZWwgPVxuICAobmFtZTogc3RyaW5nKSA9PlxuICA8TUMgZXh0ZW5kcyBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPj4oY2xheno6IE1DKTogTUMgPT4ge1xuICAgIHJldHVybiBpbnRlcm5hbE1vZGVsKG5hbWUpKGNsYXp6KVxuICB9XG5cbmNvbnN0IGludGVybmFsTW9kZWwgPVxuICAobmFtZTogc3RyaW5nKSA9PlxuICA8TUMgZXh0ZW5kcyBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPj4oY2xheno6IE1DKTogTUMgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBpc01vZGVsQ2xhc3MoY2xhenopID8gXCJjbGFzc1wiIDogaXNEYXRhTW9kZWxDbGFzcyhjbGF6eikgPyBcImRhdGFcIiA6IHVuZGVmaW5lZFxuICAgIGlmICghdHlwZSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgY2xhenogbXVzdCBiZSBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBmcm9tIE1vZGVsL0RhdGFNb2RlbGApXG4gICAgfVxuXG4gICAgaWYgKG1vZGVsSW5mb0J5TmFtZVtuYW1lXSkge1xuICAgICAgaWYgKGdldEdsb2JhbENvbmZpZygpLnNob3dEdXBsaWNhdGVNb2RlbE5hbWVXYXJuaW5ncykge1xuICAgICAgICBsb2dXYXJuaW5nKFxuICAgICAgICAgIFwid2FyblwiLFxuICAgICAgICAgIGBhIG1vZGVsIHdpdGggbmFtZSBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0cyAoaWYgeW91IGFyZSB1c2luZyBob3QtcmVsb2FkaW5nIHlvdSBtYXkgc2FmZWx5IGlnbm9yZSB0aGlzIHdhcm5pbmcpYCxcbiAgICAgICAgICBgZHVwbGljYXRlTW9kZWxOYW1lIC0gJHtuYW1lfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sIGluIGNsYXp6KSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYSBjbGFzcyBhbHJlYWR5IGRlY29yYXRlZCB3aXRoIGBAbW9kZWxgIGNhbm5vdCBiZSByZS1kZWNvcmF0ZWRcIilcbiAgICB9XG5cbiAgICAvLyB0cmFjayBpZiB3ZSBmYWlsIHNvIHdlIG9ubHkgdHJ5IGl0IG9uY2UgcGVyIGNsYXNzXG4gICAgbGV0IG1ha2VPYnNlcnZhYmxlRmFpbGVkID0gZmFsc2VcblxuICAgIC8vIHRyaWNrIHNvIHBsYWluIG5ldyB3b3Jrc1xuICAgIGNvbnN0IG5ld0NsYXp6OiBhbnkgPSBmdW5jdGlvbiAodGhpczogYW55LCBpbml0aWFsRGF0YTogYW55LCBtb2RlbENvbnN0cnVjdG9yT3B0aW9uczogYW55KSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyAoY2xhenogYXMgYW55KShpbml0aWFsRGF0YSwgbW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMpXG5cbiAgICAgIC8vIHNldCBvciBlbHNlIGl0IHBvaW50cyB0byB0aGUgdW5kZWNvcmF0ZWQgY2xhc3NcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbmV3Q2xhenosXG4gICAgICB9KVxuXG4gICAgICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMoaW5zdGFuY2UsIHJ1bkFmdGVyTmV3U3ltYm9sKVxuXG4gICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggbW9ieCA2XG4gICAgICBpZiAoIW1ha2VPYnNlcnZhYmxlRmFpbGVkICYmIGdldE1vYnhWZXJzaW9uKCkgPj0gNikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vYng2Lm1ha2VPYnNlcnZhYmxlKGluc3RhbmNlKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gc2FkbHkgd2UgbmVlZCB0byB1c2UgdGhpcyBoYWNrIHNpbmNlIHRoZSBQUiB0byBkbyB0aGlzIHRoZSBwcm9wZXIgd2F5XG4gICAgICAgICAgLy8gd2FzIHJlamVjdGVkIG9uIHRoZSBtb2J4IHNpZGVcbiAgICAgICAgICBtYWtlT2JzZXJ2YWJsZUZhaWxlZCA9IHRydWVcblxuICAgICAgICAgIGNvbnN0IGVyciA9IGUgYXMgRXJyb3JcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlcnIubWVzc2FnZSAhPT1cbiAgICAgICAgICAgICAgXCJbTW9iWF0gTm8gYW5ub3RhdGlvbnMgd2VyZSBwYXNzZWQgdG8gbWFrZU9ic2VydmFibGUsIGJ1dCBubyBkZWNvcmF0b3IgbWVtYmVycyBoYXZlIGJlZW4gZm91bmQgZWl0aGVyXCIgJiZcbiAgICAgICAgICAgIGVyci5tZXNzYWdlICE9PVxuICAgICAgICAgICAgICBcIltNb2JYXSBObyBhbm5vdGF0aW9ucyB3ZXJlIHBhc3NlZCB0byBtYWtlT2JzZXJ2YWJsZSwgYnV0IG5vIGRlY29yYXRlZCBtZW1iZXJzIGhhdmUgYmVlbiBmb3VuZCBlaXRoZXJcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgZXJyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHRoZSBvYmplY3QgaXMgcmVhZHlcbiAgICAgIGFkZEhpZGRlblByb3AoaW5zdGFuY2UsIG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wsIHRydWUsIGZhbHNlKVxuXG4gICAgICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMoaW5zdGFuY2UsIHJ1bkJlZm9yZU9uSW5pdFN5bWJvbClcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY2xhc3NcIiAmJiBpbnN0YW5jZS5vbkluaXQpIHtcbiAgICAgICAgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZChpbnN0YW5jZSwgXCJvbkluaXRcIiwgSG9va0FjdGlvbi5PbkluaXQpXG5cbiAgICAgICAgaW5zdGFuY2Uub25Jbml0KClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09IFwiZGF0YVwiICYmIGluc3RhbmNlLm9uTGF6eUluaXQpIHtcbiAgICAgICAgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZChpbnN0YW5jZSwgXCJvbkxhenlJbml0XCIsIEhvb2tBY3Rpb24uT25MYXp5SW5pdClcblxuICAgICAgICBpbnN0YW5jZS5vbkxhenlJbml0KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuXG4gICAgY2xhenoudG9TdHJpbmcgPSAoKSA9PiBgY2xhc3MgJHtjbGF6ei5uYW1lfSMke25hbWV9YFxuICAgIGlmICh0eXBlID09PSBcImNsYXNzXCIpIHtcbiAgICAgIDsoY2xhenogYXMgYW55KVttb2RlbFR5cGVLZXldID0gbmFtZVxuICAgIH1cblxuICAgIC8vIHRoaXMgYWxzbyBnaXZlcyBhY2Nlc3MgdG8gbW9kZWxJbml0aWFsaXplcnNTeW1ib2wsIG1vZGVsUHJvcGVydGllc1N5bWJvbCwgbW9kZWxEYXRhVHlwZUNoZWNrZXJTeW1ib2xcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3Q2xhenosIGNsYXp6KVxuICAgIG5ld0NsYXp6LnByb3RvdHlwZSA9IGNsYXp6LnByb3RvdHlwZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NsYXp6LCBcIm5hbWVcIiwge1xuICAgICAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXdDbGF6eiwgXCJuYW1lXCIpLFxuICAgICAgdmFsdWU6IGNsYXp6Lm5hbWUsXG4gICAgfSlcbiAgICBuZXdDbGF6elttb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sXSA9IGNsYXp6XG5cbiAgICBjb25zdCBtb2RlbEluZm8gPSB7XG4gICAgICBuYW1lLFxuICAgICAgY2xhc3M6IG5ld0NsYXp6LFxuICAgIH1cblxuICAgIG1vZGVsSW5mb0J5TmFtZVtuYW1lXSA9IG1vZGVsSW5mb1xuXG4gICAgbW9kZWxJbmZvQnlDbGFzcy5zZXQobmV3Q2xhenosIG1vZGVsSW5mbylcbiAgICBtb2RlbEluZm9CeUNsYXNzLnNldChjbGF6eiwgbW9kZWxJbmZvKVxuXG4gICAgcnVuTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb25zKGNsYXp6LCBydW5BZnRlck1vZGVsRGVjb3JhdG9yU3ltYm9sKVxuXG4gICAgcmV0dXJuIG5ld0NsYXp6XG4gIH1cblxuLy8gYmFzaWNhbGx5IHRha2VuIGZyb20gVFNcbmZ1bmN0aW9uIHRzRGVjb3JhdGUoZGVjb3JhdG9yczogYW55LCB0YXJnZXQ6IGFueSwga2V5OiBhbnksIGRlc2M6IGFueSkge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyAoZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpKSA6IGRlc2MsXG4gICAgZFxuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIChSZWZsZWN0IGFzIGFueSkuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIilcbiAgICByID0gKFJlZmxlY3QgYXMgYW55KS5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYylcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZXF1ZW5jZXNcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgclxufVxuXG4vKipcbiAqIE1hcmtzIGEgY2xhc3MgKHdoaWNoIE1VU1QgaW5oZXJpdCBmcm9tIHRoZSBgTW9kZWxgIGFic3RyYWN0IGNsYXNzKVxuICogYXMgYSBtb2RlbCBhbmQgZGVjb3JhdGVzIHNvbWUgb2YgaXRzIG1ldGhvZHMvcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gbmFtZSBVbmlxdWUgbmFtZSBmb3IgdGhlIG1vZGVsIHR5cGUuIE5vdGUgdGhhdCB0aGlzIG5hbWUgbXVzdCBiZSB1bmlxdWUgZm9yIHlvdXIgd2hvbGVcbiAqIGFwcGxpY2F0aW9uLCBzbyBpdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvIHVzZSBzb21lIHByZWZpeCB1bmlxdWUgdG8geW91ciBhcHBsaWNhdGlvbiBkb21haW4uXG4gKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhc3NpZ24gYSBuYW1lIHlldCAoZS5nLiBmb3IgYSBiYXNlIG1vZGVsKSBwYXNzIGB1bmRlZmluZWRgLlxuICogQHBhcmFtIGNsYXp6IE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIGRlY29yYXRvcnMgRGVjb3JhdG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlZE1vZGVsPE0sIE1DIGV4dGVuZHMgYWJzdHJhY3QgbmV3ICguLi5hZ3M6IGFueSkgPT4gTT4oXG4gIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY2xheno6IE1DLFxuICBkZWNvcmF0b3JzOiB7XG4gICAgW2sgaW4ga2V5b2YgTV0/OiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgUmVhZG9ubHlBcnJheTwoLi4uYXJnczogYW55W10pID0+IGFueT5cbiAgfVxuKTogTUMge1xuICAvLyBkZWNvcmF0ZSBjbGFzcyBtZW1iZXJzXG4gIGZvciAoY29uc3QgW2ssIGRlY29yYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9ycykpIHtcbiAgICBjb25zdCBwcm90b3R5cGVWYWx1ZURlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNsYXp6LnByb3RvdHlwZSwgaylcbiAgICAvLyBUUyBzZWVtcyB0byBzZW5kIG51bGwgZm9yIG1ldGhvZHMgaW4gdGhlIHByb3RvdHlwZVxuICAgIC8vICh3aGljaCB3ZSBzdWJzdGl0dXRlIGZvciB0aGUgZGVzY3JpcHRvciB0byBhdm9pZCBhIGRvdWJsZSBsb29rLXVwKSBhbmQgdm9pZCAwICh1bmRlZmluZWQpIGZvciBwcm9wc1xuICAgIHRzRGVjb3JhdGUoXG4gICAgICBBcnJheS5pc0FycmF5KGRlY29yYXRvcikgPyBkZWNvcmF0b3IgOiBbZGVjb3JhdG9yXSxcbiAgICAgIGNsYXp6LnByb3RvdHlwZSxcbiAgICAgIGssXG4gICAgICBwcm90b3R5cGVWYWx1ZURlc2MgPyBwcm90b3R5cGVWYWx1ZURlc2MgOiB2b2lkIDBcbiAgICApXG4gIH1cblxuICByZXR1cm4gKG5hbWUgPyBtb2RlbChuYW1lKShjbGF6eiBhcyB1bmtub3duIGFzIE1vZGVsQ2xhc3M8QW55TW9kZWw+KSA6IGNsYXp6KSBhcyBNQ1xufVxuIiwiaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXHJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcclxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlLCBBcnJheVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7XHJcbiAgbGF0ZVR5cGVDaGVja2VyLFxyXG4gIFR5cGVDaGVja2VyLFxyXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXHJcbiAgVHlwZUluZm8sXHJcbiAgVHlwZUluZm9HZW4sXHJcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcclxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxyXG5cclxuLyoqXHJcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdmFsdWVzIG9mIGEgZ2l2ZW4gdHlwZS5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3QgbnVtYmVyQXJyYXlUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMubnVtYmVyKVxyXG4gKiBgYGBcclxuICpcclxuICogQHR5cGVwYXJhbSBUIEl0ZW0gdHlwZS5cclxuICogQHBhcmFtIGl0ZW1UeXBlIFR5cGUgb2YgaW5uZXIgaXRlbXMuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNBcnJheTxUIGV4dGVuZHMgQW55VHlwZT4oaXRlbVR5cGU6IFQpOiBBcnJheVR5cGU8VFtdPiB7XHJcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBBcnJheVR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUoaXRlbVR5cGUpKVxyXG5cclxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcclxuICAgIGNvbnN0IGl0ZW1DaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGl0ZW1UeXBlKVxyXG5cclxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT5cclxuICAgICAgYEFycmF5PCR7aXRlbUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCBpdGVtQ2hlY2tlcil9PmBcclxuXHJcbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLkFycmF5LFxyXG5cclxuICAgICAgKGFycmF5LCBwYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBhcnJheSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXRlbUNoZWNrZXIudW5jaGVja2VkKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1FcnJvciA9IGl0ZW1DaGVja2VyLmNoZWNrKGFycmF5W2ldLCBbLi4ucGF0aCwgaV0pXHJcbiAgICAgICAgICAgIGlmIChpdGVtRXJyb3IpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gaXRlbUVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldFR5cGVOYW1lLFxyXG4gICAgICB0eXBlSW5mb0dlbixcclxuXHJcbiAgICAgIChhcnJheSkgPT4ge1xyXG4gICAgICAgIGlmICghaXNBcnJheShhcnJheSkpIHtcclxuICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWl0ZW1DaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQWN0dWFsQ2hlY2tlciA9IGl0ZW1DaGVja2VyLnNuYXBzaG90VHlwZShhcnJheVtpXSlcclxuICAgICAgICAgICAgaWYgKCFpdGVtQWN0dWFsQ2hlY2tlcikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzVGNcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChzbjogdW5rbm93bltdKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW1DaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc24ubWFwKChpdGVtKSA9PiBpdGVtQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3IoaXRlbSkpXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICAoc246IHVua25vd25bXSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtQ2hlY2tlci51bmNoZWNrZWQpIHtcclxuICAgICAgICAgIHJldHVybiBzblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNuLm1hcCgoaXRlbSkgPT4gaXRlbUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3NvcihpdGVtKSlcclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiB0aGlzVGNcclxuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMuYXJyYXlgIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBBcnJheVR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xyXG4gIGdldCBpdGVtVHlwZUluZm8oKTogVHlwZUluZm8ge1xyXG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMuaXRlbVR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBpdGVtVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XHJcbiAgICBzdXBlcih0aGlzVHlwZSlcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjb21wdXRlZCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIH0gZnJvbSBcIi4uL2FjdGlvbi9taWRkbGV3YXJlXCJcbmltcG9ydCB7IG1vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiXG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbERlY29yYXRvclwiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzLCBQYXRjaCwgcGF0Y2hSZWNvcmRlciwgUGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyB0eXBlc0FycmF5IH0gZnJvbSBcIi4uL3R5cGVzL2FycmF5QmFzZWQvdHlwZXNBcnJheVwiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuLi90eXBlcy91dGlsaXR5L3R5cGVzVW5jaGVja2VkXCJcbmltcG9ydCB7IGZhaWx1cmUsIGdldE1vYnhWZXJzaW9uLCBtb2J4NiwgbmFtZXNwYWNlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGFjdGlvblRyYWNraW5nTWlkZGxld2FyZSwgU2ltcGxlQWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL2FjdGlvblRyYWNraW5nTWlkZGxld2FyZVwiXG5cbi8qKlxuICogQW4gdW5kby9yZWRvIGV2ZW50IHdpdGhvdXQgYXR0YWNoZWQgc3RhdGUuXG4gKi9cbmV4cG9ydCB0eXBlIFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlID0gVW5kb1NpbmdsZUV2ZW50IHwgVW5kb0V2ZW50R3JvdXBcblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gZXZlbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFVuZG9FdmVudCA9IFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlICYge1xuICAvKipcbiAgICogVGhlIHN0YXRlIHNhdmVkIGJlZm9yZSB0aGUgZXZlbnQgYWN0aW9ucyBzdGFydGVkIC8gYWZ0ZXIgdGhlIGV2ZW50IGFjdGlvbnMgZmluaXNoZWQuXG4gICAqL1xuICBhdHRhY2hlZFN0YXRlOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIHNhdmVkIGJlZm9yZSB0aGUgZXZlbnQgYWN0aW9ucyBzdGFydGVkLlxuICAgICAqL1xuICAgIGJlZm9yZUV2ZW50PzogdW5rbm93blxuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBzYXZlZCBhZnRlciB0aGUgZXZlbnQgYWN0aW9ucyBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBhZnRlckV2ZW50PzogdW5rbm93blxuICB9XG59XG5cbi8qKlxuICogVW5kbyBldmVudCB0eXBlLlxuICovXG5leHBvcnQgZW51bSBVbmRvRXZlbnRUeXBlIHtcbiAgU2luZ2xlID0gXCJzaW5nbGVcIixcbiAgR3JvdXAgPSBcImdyb3VwXCIsXG59XG5cbi8qKlxuICogQW4gdW5kby9yZWRvIHNpbmdsZSBldmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmRvU2luZ2xlRXZlbnQge1xuICAvKipcbiAgICogRXhwcmVzc2VzIHRoaXMgaXMgYSBzaW5nbGUgZXZlbnQuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBVbmRvRXZlbnRUeXBlLlNpbmdsZVxuICAvKipcbiAgICogUGF0aCB0byB0aGUgb2JqZWN0IHRoYXQgaW52b2tlZCB0aGUgYWN0aW9uIGZyb20gaXRzIHJvb3QuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoOiBQYXRoXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCB3YXMgaW52b2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZ1xuICAvKipcbiAgICogUGF0Y2hlcyB3aXRoIGNoYW5nZXMgZG9uZSBpbnNpZGUgdGhlIGFjdGlvbi5cbiAgICogVXNlIGByZWRvKClgIGluIHRoZSBgVW5kb01hbmFnZXJgIHRvIGFwcGx5IHRoZW0uXG4gICAqL1xuICByZWFkb25seSBwYXRjaGVzOiBSZWFkb25seUFycmF5PFBhdGNoPlxuICAvKipcbiAgICogUGF0Y2hlcyB0byB1bmRvIHRoZSBjaGFuZ2VzIGRvbmUgaW5zaWRlIHRoZSBhY3Rpb24uXG4gICAqIFVzZSBgdW5kbygpYCBpbiB0aGUgYFVuZG9NYW5hZ2VyYCB0byBhcHBseSB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52ZXJzZVBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+XG59XG5cbi8qKlxuICogQW4gdW5kby9yZWRvIGV2ZW50IGdyb3VwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuZG9FdmVudEdyb3VwIHtcbiAgLyoqXG4gICAqIEV4cHJlc3NlcyB0aGlzIGlzIGFuIGV2ZW50IGdyb3VwLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVW5kb0V2ZW50VHlwZS5Hcm91cFxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgZ3JvdXAgKGlmIGFueSkuXG4gICAqL1xuICByZWFkb25seSBncm91cE5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEV2ZW50cyB0aGF0IGNvbmZvcm0gdGhpcyBncm91cCAobWlnaHQgYmUgc2luZ2xlIGV2ZW50cyBvciBvdGhlciBuZXN0ZWQgZ3JvdXBzKS5cbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50czogUmVhZG9ubHlBcnJheTxVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZT5cbn1cblxuZnVuY3Rpb24gdG9TaW5nbGVFdmVudHMoXG4gIGV2ZW50OiBVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZSxcbiAgcmV2ZXJzZTogYm9vbGVhblxuKTogUmVhZG9ubHlBcnJheTxVbmRvU2luZ2xlRXZlbnQ+IHtcbiAgaWYgKGV2ZW50LnR5cGUgPT09IFVuZG9FdmVudFR5cGUuU2luZ2xlKSByZXR1cm4gW2V2ZW50XVxuICBlbHNlIHtcbiAgICBjb25zdCBhcnJheTogVW5kb1NpbmdsZUV2ZW50W10gPSBbXVxuICAgIGZvciAoY29uc3QgZSBvZiBldmVudC5ldmVudHMpIHtcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIGFycmF5LnVuc2hpZnQoLi4udG9TaW5nbGVFdmVudHMoZSwgdHJ1ZSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheS5wdXNoKC4uLnRvU2luZ2xlRXZlbnRzKGUsIGZhbHNlKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5XG4gIH1cbn1cblxuLyoqXG4gKiBTdG9yZSBtb2RlbCBpbnN0YW5jZSBmb3IgdW5kby9yZWRvIGFjdGlvbnMuXG4gKiBEbyBub3QgbWFuaXB1bGF0ZSBkaXJlY3RseSwgb3RoZXIgdGhhdCBjcmVhdGluZyBpdC5cbiAqL1xuQG1vZGVsKGAke25hbWVzcGFjZX0vVW5kb1N0b3JlYClcbmV4cG9ydCBjbGFzcyBVbmRvU3RvcmUgZXh0ZW5kcyBNb2RlbCh7XG4gIC8vIFRPRE86IGFkZCBwcm9wZXIgdHlwZSBjaGVja2luZyB0byB1bmRvIHN0b3JlXG4gIHVuZG9FdmVudHM6IHRQcm9wKHR5cGVzQXJyYXkodHlwZXNVbmNoZWNrZWQ8VW5kb0V2ZW50PigpKSwgKCkgPT4gW10pLFxuICByZWRvRXZlbnRzOiB0UHJvcCh0eXBlc0FycmF5KHR5cGVzVW5jaGVja2VkPFVuZG9FdmVudD4oKSksICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfY2xlYXJVbmRvKCkge1xuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIHRoaXMudW5kb0V2ZW50cy5sZW5ndGggPSAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAbW9kZWxBY3Rpb25cbiAgX2NsZWFyUmVkbygpIHtcbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0aGlzLnJlZG9FdmVudHMubGVuZ3RoID0gMFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQG1vZGVsQWN0aW9uXG4gIF91bmRvKCkge1xuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy51bmRvRXZlbnRzLnBvcCgpIVxuICAgICAgdGhpcy5yZWRvRXZlbnRzLnB1c2goZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAbW9kZWxBY3Rpb25cbiAgX3JlZG8oKSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnJlZG9FdmVudHMucG9wKCkhXG4gICAgICB0aGlzLnVuZG9FdmVudHMucHVzaChldmVudClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfYWRkVW5kbyhldmVudDogVW5kb0V2ZW50KSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgdGhpcy51bmRvRXZlbnRzLnB1c2goZXZlbnQpXG4gICAgICAvLyBvbmNlIGFuIHVuZG8gZXZlbnQgaXMgYWRkZWQgcmVkbyBxdWV1ZSBpcyBubyBsb25nZXIgdmFsaWRcbiAgICAgIHRoaXMucmVkb0V2ZW50cy5sZW5ndGggPSAwXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2dyb3VwU3RhY2s6IFVuZG9FdmVudEdyb3VwW10gPSBbXVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBfYWRkVW5kb1RvUGFyZW50R3JvdXAocGFyZW50R3JvdXA6IFVuZG9FdmVudEdyb3VwLCBldmVudDogVW5kb0V2ZW50V2l0aG91dEF0dGFjaGVkU3RhdGUpIHtcbiAgICA7KHBhcmVudEdyb3VwLmV2ZW50cyBhcyBVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZVtdKS5wdXNoKGV2ZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldCBfY3VycmVudEdyb3VwKCk6IFVuZG9FdmVudEdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBTdGFja1t0aGlzLl9ncm91cFN0YWNrLmxlbmd0aCAtIDFdXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgX3N0YXJ0R3JvdXAoXG4gICAgZ3JvdXBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3RhcnRSdW5uaW5nOiBib29sZWFuLFxuICAgIG9wdGlvbnM6IFVuZG9NaWRkbGV3YXJlT3B0aW9uczx1bmtub3duPiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlXG4gICAgbGV0IGVuZGVkID0gZmFsc2VcbiAgICBjb25zdCBwYXJlbnRHcm91cCA9IHRoaXMuX2N1cnJlbnRHcm91cFxuXG4gICAgY29uc3QgZ3JvdXA6IFVuZG9FdmVudEdyb3VwID0ge1xuICAgICAgdHlwZTogVW5kb0V2ZW50VHlwZS5Hcm91cCxcbiAgICAgIGdyb3VwTmFtZSxcbiAgICAgIGV2ZW50czogW10sXG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNoZWRTdGF0ZUJlZm9yZUV2ZW50ID0gcGFyZW50R3JvdXAgPyB1bmRlZmluZWQgOiBvcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5zYXZlKClcblxuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIHBhdXNlOiAoKSA9PiB7XG4gICAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcGF1c2UgYSBncm91cCB3aGVuIGl0IGlzIGFscmVhZHkgZW5kZWRcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHBhdXNlIGEgZ3JvdXAgd2hlbiBpdCBpcyBub3QgcnVubmluZ1wiKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50R3JvdXAgIT09IGdyb3VwKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcImdyb3VwIG91dCBvZiBvcmRlclwiKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2dyb3VwU3RhY2sucG9wKClcbiAgICAgICAgcnVubmluZyA9IGZhbHNlXG4gICAgICB9LFxuICAgICAgcmVzdW1lOiAoKSA9PiB7XG4gICAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVzdW1lIGEgZ3JvdXAgd2hlbiBpdCBpcyBhbHJlYWR5IGVuZGVkXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHJlc3VtZSBhIGdyb3VwIHdoZW4gaXQgaXMgYWxyZWFkeSBydW5uaW5nXCIpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ3JvdXBTdGFjay5wdXNoKGdyb3VwKVxuICAgICAgICBydW5uaW5nID0gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIGFwaS5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIGlmIChwYXJlbnRHcm91cCkge1xuICAgICAgICAgIHRoaXMuX2FkZFVuZG9Ub1BhcmVudEdyb3VwKHBhcmVudEdyb3VwLCBncm91cClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9hZGRVbmRvKHtcbiAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgYXR0YWNoZWRTdGF0ZToge1xuICAgICAgICAgICAgICBiZWZvcmVFdmVudDogYXR0YWNoZWRTdGF0ZUJlZm9yZUV2ZW50LFxuICAgICAgICAgICAgICBhZnRlckV2ZW50OiBvcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5zYXZlKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0UnVubmluZykge1xuICAgICAgYXBpLnJlc3VtZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFwaVxuICB9XG59XG5cbi8qKlxuICogTWFuYWdlciBjbGFzcyByZXR1cm5lZCBieSBgdW5kb01pZGRsZXdhcmVgIHRoYXQgYWxsb3dzIHlvdSB0byBwZXJmb3JtIHVuZG8vcmVkbyBhY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVW5kb01hbmFnZXIge1xuICAvKipcbiAgICogVGhlIHN0b3JlIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvIHN0b3JlIHVuZG8vcmVkbyBhY3Rpb24gZXZlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmU6IFVuZG9TdG9yZVxuXG4gIC8qKlxuICAgKiBUaGUgdW5kbyBzdGFjaywgd2hlcmUgdGhlIGZpcnN0IG9wZXJhdGlvbiB0byB1bmRvIHdpbGwgYmUgdGhlIGxhc3Qgb2YgdGhlIGFycmF5LlxuICAgKiBEbyBub3QgbWFuaXB1bGF0ZSB0aGlzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB1bmRvUXVldWUoKTogUmVhZG9ubHlBcnJheTxVbmRvRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS51bmRvRXZlbnRzXG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZG8gc3RhY2ssIHdoZXJlIHRoZSBmaXJzdCBvcGVyYXRpb24gdG8gcmVkbyB3aWxsIGJlIHRoZSBsYXN0IG9mIHRoZSBhcnJheS5cbiAgICogRG8gbm90IG1hbmlwdWxhdGUgdGhpcyBhcnJheSBkaXJlY3RseS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgcmVkb1F1ZXVlKCk6IFJlYWRvbmx5QXJyYXk8VW5kb0V2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUucmVkb0V2ZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgdW5kbyBhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgdW5kb0xldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvUXVldWUubGVuZ3RoXG4gIH1cblxuICAvKipcbiAgICogSWYgdW5kbyBjYW4gYmUgcGVyZm9ybWVkIChpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdW5kbyBhY3Rpb24gYXZhaWxhYmxlKS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgY2FuVW5kbygpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvTGV2ZWxzID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgdW5kbyBxdWV1ZS5cbiAgICovXG4gIEBhY3Rpb25cbiAgY2xlYXJVbmRvKCkge1xuICAgIHRoaXMuc3RvcmUuX2NsZWFyVW5kbygpXG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZWRvIGFjdGlvbnMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCByZWRvTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlZG9RdWV1ZS5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiByZWRvIGNhbiBiZSBwZXJmb3JtZWQgKGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZWRvIGFjdGlvbiBhdmFpbGFibGUpXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IGNhblJlZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMucmVkb0xldmVscyA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHJlZG8gcXVldWUuXG4gICAqL1xuICBAYWN0aW9uXG4gIGNsZWFyUmVkbygpIHtcbiAgICB0aGlzLnN0b3JlLl9jbGVhclJlZG8oKVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZG9lcyB0aGUgbGFzdCBhY3Rpb24uXG4gICAqIFdpbGwgdGhyb3cgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIHRvIHVuZG8uXG4gICAqL1xuICBAYWN0aW9uXG4gIHVuZG8oKSB7XG4gICAgaWYgKCF0aGlzLmNhblVuZG8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJub3RoaW5nIHRvIHVuZG9cIilcbiAgICB9XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLnVuZG9RdWV1ZVt0aGlzLnVuZG9RdWV1ZS5sZW5ndGggLSAxXVxuXG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgdG9TaW5nbGVFdmVudHMoZXZlbnQsIHRydWUpLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3QsIGUuaW52ZXJzZVBhdGNoZXMsIHRydWUpXG4gICAgICB9KVxuXG4gICAgICAvLyByZXN0b3JlIHRoZSBhdHRhY2hlZCBzdGF0ZSBiZWZvcmUgdGhlIG9wZXJhdGlvbiB3YXMgbWFkZVxuICAgICAgaWYgKGV2ZW50LmF0dGFjaGVkU3RhdGU/LmJlZm9yZUV2ZW50KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8ucmVzdG9yZShldmVudC5hdHRhY2hlZFN0YXRlLmJlZm9yZUV2ZW50KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnN0b3JlLl91bmRvKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRvZXMgdGhlIHByZXZpb3VzIGFjdGlvbi5cbiAgICogV2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBubyBhY3Rpb24gdG8gcmVkby5cbiAgICovXG4gIEBhY3Rpb25cbiAgcmVkbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVkbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIm5vdGhpbmcgdG8gcmVkb1wiKVxuICAgIH1cbiAgICBjb25zdCBldmVudCA9IHRoaXMucmVkb1F1ZXVlW3RoaXMucmVkb1F1ZXVlLmxlbmd0aCAtIDFdXG5cbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0b1NpbmdsZUV2ZW50cyhldmVudCwgZmFsc2UpLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3QsIGUucGF0Y2hlcylcbiAgICAgIH0pXG5cbiAgICAgIC8vIHJlc3RvcmUgdGhlIGF0dGFjaGVkIHN0YXRlIGFmdGVyIHRoZSBvcGVyYXRpb24gd2FzIG1hZGVcbiAgICAgIGlmIChldmVudC5hdHRhY2hlZFN0YXRlPy5hZnRlckV2ZW50KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8ucmVzdG9yZShldmVudC5hdHRhY2hlZFN0YXRlLmFmdGVyRXZlbnQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuc3RvcmUuX3JlZG8oKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSB1bmRvIG1pZGRsZXdhcmUuXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuZGlzcG9zZXIoKVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGlmIHVuZG8gcmVjb3JkaW5nIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBvciBub3QgZm9yIHRoaXMgcGFydGljdWxhciBgVW5kb01hbmFnZXJgLlxuICAgKi9cbiAgZ2V0IGlzVW5kb1JlY29yZGluZ0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZFxuICB9XG5cbiAgLyoqXG4gICAqIFNraXBzIHRoZSB1bmRvIHJlY29yZGluZyBtZWNoYW5pc20gZm9yIHRoZSBjb2RlIGJsb2NrIHRoYXQgZ2V0cyBydW4gc3luY2hyb25vdXNseSBpbnNpZGUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gVCBDb2RlIGJsb2NrIHJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0gZm4gQ29kZSBibG9jayB0byBydW4uXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHdpdGhvdXRVbmRvPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3Qgc2F2ZWRVbmRvRGlzYWJsZWQgPSB0aGlzLl9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZFxuICAgIHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gdHJ1ZVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZCA9IHNhdmVkVW5kb0Rpc2FibGVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gZ3JvdXAgdGhhdCBjYW4gYmUgY29udGludWVkIG11bHRpcGxlIHRpbWVzIGFuZCB0aGVuIGVuZGVkLlxuICAgKiBAcGFyYW0gZ3JvdXBOYW1lIE9wdGlvbmFsIGdyb3VwIG5hbWUuXG4gICAqIEByZXR1cm5zIEFuIEFQSSB0byBjb250aW51ZS9lbmQgdGhlIGdyb3VwLlxuICAgKi9cbiAgY3JlYXRlR3JvdXAoZ3JvdXBOYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLnN0b3JlLl9zdGFydEdyb3VwKGdyb3VwTmFtZSwgZmFsc2UsIHRoaXMub3B0aW9ucylcblxuICAgIHJldHVybiB7XG4gICAgICBjb250aW51ZTxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgICAgICBncm91cC5yZXN1bWUoKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbigpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZ3JvdXAucGF1c2UoKVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBlbmQoKSB7XG4gICAgICAgIGdyb3VwLmVuZCgpXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwTmFtZSBHcm91cCBuYW1lLlxuICAgKiBAcGFyYW0gZm4gQ29kZSBibG9jay5cbiAgICogQHJldHVybnMgQ29kZSBibG9jayByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB3aXRoR3JvdXA8VD4oZ3JvdXBOYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBUKTogVFxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGZuIENvZGUgYmxvY2suXG4gICAqIEByZXR1cm5zIENvZGUgYmxvY2sgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgd2l0aEdyb3VwPFQ+KGZuOiAoKSA9PiBUKTogVFxuXG4gIHdpdGhHcm91cDxUPihhcmcxOiBhbnksIGFyZzI/OiBhbnkpOiBUIHtcbiAgICBsZXQgZ3JvdXBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBsZXQgZm46ICgpID0+IFRcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGdyb3VwTmFtZSA9IGFyZzFcbiAgICAgIGZuID0gYXJnMlxuICAgIH0gZWxzZSB7XG4gICAgICBmbiA9IGFyZzFcbiAgICB9XG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuc3RvcmUuX3N0YXJ0R3JvdXAoZ3JvdXBOYW1lLCB0cnVlLCB0aGlzLm9wdGlvbnMpXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdyb3VwLmVuZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gYXN5bmNocm9ub3VzIGNvZGUgYmxvY2sgYXMgYW4gdW5kbyBncm91cC5cbiAgICogTm90ZSB0aGF0IG5lc3RlZCBncm91cHMgYXJlIGFsbG93ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBncm91cE5hbWUgR3JvdXAgbmFtZS5cbiAgICogQHBhcmFtIGZuIEZsb3cgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIEZsb3cgZnVuY3Rpb24gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgd2l0aEdyb3VwRmxvdzxSPihncm91cE5hbWU6IHN0cmluZywgZm46ICgpID0+IEdlbmVyYXRvcjxhbnksIFIsIGFueT4pOiBQcm9taXNlPFI+XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gYXN5bmNocm9ub3VzIGNvZGUgYmxvY2sgYXMgYW4gdW5kbyBncm91cC5cbiAgICogTm90ZSB0aGF0IG5lc3RlZCBncm91cHMgYXJlIGFsbG93ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmbiBGbG93IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBGbG93IGZ1bmN0aW9uIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHdpdGhHcm91cEZsb3c8Uj4oZm46ICgpID0+IEdlbmVyYXRvcjxhbnksIFIsIGFueT4pOiBQcm9taXNlPFI+XG5cbiAgd2l0aEdyb3VwRmxvdzxSPihhcmcxOiBhbnksIGFyZzI/OiBhbnkpOiBQcm9taXNlPFI+IHtcbiAgICBsZXQgZ3JvdXBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBsZXQgZm46ICgpID0+IEdlbmVyYXRvcjxhbnksIFIsIGFueT5cbiAgICBpZiAodHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGdyb3VwTmFtZSA9IGFyZzFcbiAgICAgIGZuID0gYXJnMlxuICAgIH0gZWxzZSB7XG4gICAgICBmbiA9IGFyZzFcbiAgICB9XG5cbiAgICBjb25zdCBnZW4gPSBmbigpXG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuc3RvcmUuX3N0YXJ0R3JvdXAoZ3JvdXBOYW1lLCBmYWxzZSwgdGhpcy5vcHRpb25zKVxuXG4gICAgLy8gdXNlIGJvdW5kIGZ1bmN0aW9ucyB0byBmaXggZXM2IGNvbXBpbGF0aW9uXG4gICAgY29uc3QgZ2VuTmV4dCA9IGdlbi5uZXh0LmJpbmQoZ2VuKVxuICAgIGNvbnN0IGdlblRocm93ID0gZ2VuLnRocm93IS5iaW5kKGdlbilcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxSPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxlZChyZXM6IGFueSk6IHZvaWQge1xuICAgICAgICBncm91cC5yZXN1bWUoKVxuICAgICAgICBsZXQgcmV0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gZ2VuTmV4dChyZXMpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBncm91cC5lbmQoKVxuICAgICAgICAgIHJlamVjdChlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXAucGF1c2UoKVxuICAgICAgICBuZXh0KHJldClcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25SZWplY3RlZChlcnI6IGFueSk6IHZvaWQge1xuICAgICAgICBncm91cC5yZXN1bWUoKVxuICAgICAgICBsZXQgcmV0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gZ2VuVGhyb3coZXJyKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZ3JvdXAuZW5kKClcbiAgICAgICAgICByZWplY3QoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGdyb3VwLnBhdXNlKClcbiAgICAgICAgbmV4dChyZXQpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG5leHQocmV0OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHJldCAmJiB0eXBlb2YgcmV0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIGFuIGFzeW5jIGl0ZXJhdG9yXG4gICAgICAgICAgcmV0LnRoZW4obmV4dCwgcmVqZWN0KVxuICAgICAgICB9IGVsc2UgaWYgKHJldC5kb25lKSB7XG4gICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgIGdyb3VwLmVuZCgpXG4gICAgICAgICAgcmVzb2x2ZShyZXQudmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29udGludWVcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmV0LnZhbHVlKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9uRnVsZmlsbGVkKHVuZGVmaW5lZCkgLy8ga2ljayBvZmYgdGhlIHByb2Nlc3NcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBVbmRvTWFuYWdlcmAuXG4gICAqIERvIG5vdCB1c2UgZGlyZWN0bHksIHVzZSBgdW5kb01pZGRsZXdhcmVgIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBkaXNwb3NlclxuICAgKiBAcGFyYW0gc3VidHJlZVJvb3RcbiAgICogQHBhcmFtIFtzdG9yZV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzcG9zZXI6IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnRyZWVSb290OiBvYmplY3QsXG4gICAgc3RvcmU6IFVuZG9TdG9yZSB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFVuZG9NaWRkbGV3YXJlT3B0aW9uczx1bmtub3duPiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoZ2V0TW9ieFZlcnNpb24oKSA+PSA2KSB7XG4gICAgICBtb2J4Ni5tYWtlT2JzZXJ2YWJsZSh0aGlzKVxuICAgIH1cblxuICAgIHRoaXMuc3RvcmUgPSBzdG9yZSA/PyBuZXcgVW5kb1N0b3JlKHt9KVxuICB9XG59XG5cbi8qKlxuICogVW5kbyBtaWRkbGV3YXJlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5kb01pZGRsZXdhcmVPcHRpb25zPFM+IHtcbiAgYXR0YWNoZWRTdGF0ZT86IHtcbiAgICBzYXZlKCk6IFNcbiAgICByZXN0b3JlKHM6IFMpOiB2b2lkXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIHVuZG8gbWlkZGxld2FyZS5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gc3RvcmUgT3B0aW9uYWwgYFVuZG9TdG9yZWAgd2hlcmUgdG8gc3RvcmUgdGhlIHVuZG8vcmVkbyBxdWV1ZXMuIFVzZSB0aGlzIGlmIHlvdSB3YW50IHRvXG4gKiBzdG9yZSBzdWNoIHF1ZXVlcyBzb21ld2hlcmUgaW4geW91ciBtb2RlbHMuIElmIG5vbmUgaXMgcHJvdmlkZWQgaXQgd2lsbCByZXNpZGUgaW4gbWVtb3J5LlxuICogQHBhcmFtIG9wdGlvbnMgRXh0cmEgb3B0aW9ucywgc3VjaCBhcyBob3cgdG8gc2F2ZSAvIHJlc3RvcmUgY2VydGFpbiBzbmFwc2hvdCBvZiB0aGUgc3RhdGUgdG8gYmUgcmVzdG9yZWQgd2hlbiB1bmRvaW5nL3JlZG9pbmcuXG4gKiBAcmV0dXJucyBBbiBgVW5kb01hbmFnZXJgIHdoaWNoIGFsbG93cyB5b3UgdG8gZG8gdGhlIG1hbmFnZSB0aGUgdW5kby9yZWRvIG9wZXJhdGlvbnMgYW5kIGRpc3Bvc2Ugb2YgdGhlIG1pZGRsZXdhcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmRvTWlkZGxld2FyZTxTPihcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgc3RvcmU/OiBVbmRvU3RvcmUsXG4gIG9wdGlvbnM/OiBVbmRvTWlkZGxld2FyZU9wdGlvbnM8Uz5cbik6IFVuZG9NYW5hZ2VyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGxldCBtYW5hZ2VyOiBVbmRvTWFuYWdlclxuXG4gIGludGVyZmFjZSBQYXRjaFJlY29yZGVyRGF0YSB7XG4gICAgcmVjb3JkZXI6IFBhdGNoUmVjb3JkZXJcbiAgICByZWNvcmRlclN0YWNrOiBudW1iZXJcbiAgICB1bmRvUm9vdENvbnRleHQ6IFNpbXBsZUFjdGlvbkNvbnRleHRcbiAgICBncm91cDogVW5kb0V2ZW50R3JvdXAgfCB1bmRlZmluZWRcbiAgICBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQ6IFMgfCB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IHBhdGNoUmVjb3JkZXJTeW1ib2wgPSBTeW1ib2woXCJwYXRjaFJlY29yZGVyXCIpXG5cbiAgZnVuY3Rpb24gaW5pdFBhdGNoUmVjb3JkZXIoY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KSB7XG4gICAgY29uc3QgZ3JvdXAgPSBtYW5hZ2VyLnN0b3JlLl9jdXJyZW50R3JvdXBcblxuICAgIGNvbnN0IHBhdGNoUmVjb3JkZXJEYXRhOiBQYXRjaFJlY29yZGVyRGF0YSA9IHtcbiAgICAgIHJlY29yZGVyOiBwYXRjaFJlY29yZGVyKHN1YnRyZWVSb290LCB7XG4gICAgICAgIHJlY29yZGluZzogZmFsc2UsXG4gICAgICAgIGZpbHRlcjogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAhX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkICYmICFtYW5hZ2VyLmlzVW5kb1JlY29yZGluZ0Rpc2FibGVkXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHJlY29yZGVyU3RhY2s6IDAsXG4gICAgICB1bmRvUm9vdENvbnRleHQ6IGN0eCxcbiAgICAgIGdyb3VwLFxuXG4gICAgICBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQ6IG9wdGlvbnM/LmF0dGFjaGVkU3RhdGU/LnNhdmUoKSxcbiAgICB9XG5cbiAgICBjdHgucm9vdENvbnRleHQuZGF0YVtwYXRjaFJlY29yZGVyU3ltYm9sXSA9IHBhdGNoUmVjb3JkZXJEYXRhXG4gIH1cblxuICBmdW5jdGlvbiBnZXRQYXRjaFJlY29yZGVyRGF0YShjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiBQYXRjaFJlY29yZGVyRGF0YSB7XG4gICAgcmV0dXJuIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdXG4gIH1cblxuICBjb25zdCBtaWRkbGV3YXJlRGlzcG9zZXIgPSBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUoc3VidHJlZVJvb3QsIHtcbiAgICBvblN0YXJ0KGN0eCkge1xuICAgICAgaWYgKCFnZXRQYXRjaFJlY29yZGVyRGF0YShjdHgpKSB7XG4gICAgICAgIGluaXRQYXRjaFJlY29yZGVyKGN0eClcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uUmVzdW1lKGN0eCkge1xuICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlckRhdGEgPSBnZXRQYXRjaFJlY29yZGVyRGF0YShjdHgpXG4gICAgICBwYXRjaFJlY29yZGVyRGF0YS5yZWNvcmRlclN0YWNrKytcbiAgICAgIHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyLnJlY29yZGluZyA9IHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyU3RhY2sgPiAwXG4gICAgfSxcbiAgICBvblN1c3BlbmQoY3R4KSB7XG4gICAgICBjb25zdCBwYXRjaFJlY29yZGVyRGF0YSA9IGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eClcbiAgICAgIHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyU3RhY2stLVxuICAgICAgcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXIucmVjb3JkaW5nID0gcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJTdGFjayA+IDBcbiAgICB9LFxuICAgIG9uRmluaXNoKGN0eCkge1xuICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlckRhdGEgPSBnZXRQYXRjaFJlY29yZGVyRGF0YShjdHgpXG4gICAgICBpZiAocGF0Y2hSZWNvcmRlckRhdGEgJiYgcGF0Y2hSZWNvcmRlckRhdGEudW5kb1Jvb3RDb250ZXh0ID09PSBjdHgpIHtcbiAgICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyXG5cbiAgICAgICAgaWYgKHBhdGNoUmVjb3JkZXIuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICAgICAgICBjb25zdCBpbnZlcnNlUGF0Y2hlczogUGF0Y2hbXSA9IFtdXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHBhdGNoUmVjb3JkZXIuZXZlbnRzKSB7XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goLi4uZXZlbnQucGF0Y2hlcylcbiAgICAgICAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goLi4uZXZlbnQuaW52ZXJzZVBhdGNoZXMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICB0eXBlOiBVbmRvRXZlbnRUeXBlLlNpbmdsZSxcbiAgICAgICAgICAgIHRhcmdldFBhdGg6IGZhc3RHZXRSb290UGF0aChjdHgudGFyZ2V0KS5wYXRoLFxuICAgICAgICAgICAgYWN0aW9uTmFtZTogY3R4LmFjdGlvbk5hbWUsXG4gICAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgICAgaW52ZXJzZVBhdGNoZXMsXG4gICAgICAgICAgfSBhcyBjb25zdFxuXG4gICAgICAgICAgY29uc3QgcGFyZW50R3JvdXAgPSBwYXRjaFJlY29yZGVyRGF0YS5ncm91cFxuXG4gICAgICAgICAgaWYgKHBhcmVudEdyb3VwKSB7XG4gICAgICAgICAgICBtYW5hZ2VyLnN0b3JlLl9hZGRVbmRvVG9QYXJlbnRHcm91cChwYXJlbnRHcm91cCwgZXZlbnQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmUuX2FkZFVuZG8oe1xuICAgICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICAgICAgYXR0YWNoZWRTdGF0ZToge1xuICAgICAgICAgICAgICAgIGJlZm9yZUV2ZW50OiBwYXRjaFJlY29yZGVyRGF0YS5hdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICAgICAgYWZ0ZXJFdmVudDogb3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8uc2F2ZSgpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwYXRjaFJlY29yZGVyLmRpc3Bvc2UoKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG5cbiAgbWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihtaWRkbGV3YXJlRGlzcG9zZXIsIHN1YnRyZWVSb290LCBzdG9yZSwgb3B0aW9ucylcbiAgcmV0dXJuIG1hbmFnZXJcbn1cblxubGV0IF9pc0dsb2JhbFVuZG9SZWNvcmRpbmdEaXNhYmxlZCA9IGZhbHNlXG5cbi8qKlxuICogUmV0dXJucyBpZiB0aGUgdW5kbyByZWNvcmRpbmcgbWVjaGFuaXNtIGlzIGN1cnJlbnRseSBkaXNhYmxlZC5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgY3VycmVudGx5IGRpc2FibGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkKCkge1xuICByZXR1cm4gX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkXG59XG5cbi8qKlxuICogR2xvYmFsbHkgc2tpcHMgdGhlIHVuZG8gcmVjb3JkaW5nIG1lY2hhbmlzbSBmb3IgdGhlIGNvZGUgYmxvY2sgdGhhdCBnZXRzIHJ1biBzeW5jaHJvbm91c2x5IGluc2lkZS5cbiAqIENvbnNpZGVyIHVzaW5nIHRoZSBgd2l0aG91dFVuZG9gIG1ldGhvZCBvZiBhIHBhcnRpY3VsYXIgYFVuZG9NYW5hZ2VyYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBDb2RlIGJsb2NrIHJldHVybiB0eXBlLlxuICogQHBhcmFtIGZuIENvZGUgYmxvY2sgdG8gcnVuLlxuICogQHJldHVybnMgVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dFVuZG88VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgY29uc3Qgc2F2ZWRVbmRvRGlzYWJsZWQgPSBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWRcbiAgX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gdHJ1ZVxuICB0cnkge1xuICAgIHJldHVybiBmbigpXG4gIH0gZmluYWxseSB7XG4gICAgX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gc2F2ZWRVbmRvRGlzYWJsZWRcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgSUF0b20sIElDb21wdXRlZFZhbHVlLCBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0LCBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcblxuLyoqXG4gKiBBIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dDxUPiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZXh0IGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXREZWZhdWx0KCk6IFRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCBkZWZhdWx0IHZhbHVlLlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHNldERlZmF1bHQodmFsdWU6IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbnRleHQgZGVmYXVsdCB2YWx1ZSByZXNvbHZlci5cbiAgICogQHBhcmFtIHZhbHVlRm5cbiAgICovXG4gIHNldERlZmF1bHRDb21wdXRlZCh2YWx1ZUZuOiAoKSA9PiBUKTogdm9pZFxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZXh0IHZhbHVlIGZvciBhIGdpdmVuIG5vZGUuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICBnZXQobm9kZTogb2JqZWN0KTogVFxuXG4gIC8qKlxuICAgKiBHZXRzIG5vZGUgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUsIG9yIGB1bmRlZmluZWRgXG4gICAqIGlmIGl0IGNvbWVzIGZyb20gdGhlIGRlZmF1bHQuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICBnZXRQcm92aWRlck5vZGUobm9kZTogb2JqZWN0KTogb2JqZWN0IHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbnRleHQgdmFsdWUgZm9yIGEgZ2l2ZW4gbm9kZSwgZWZmZWN0aXZlbHkgbWFraW5nIGl0IGEgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc2V0KG5vZGU6IG9iamVjdCwgdmFsdWU6IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbnRleHQgdmFsdWUgcmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gbm9kZSwgZWZmZWN0aXZlbHkgbWFraW5nIGl0IGEgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqIEBwYXJhbSB2YWx1ZUZuXG4gICAqL1xuICBzZXRDb21wdXRlZChub2RlOiBvYmplY3QsIHZhbHVlRm46ICgpID0+IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIFVuc2V0cyB0aGUgY29udGV4dCB2YWx1ZSBmb3IgYSBnaXZlbiBub2RlLCB0aGVyZWZvcmUgaXQgd29uJ3QgYmUgYSBwcm92aWRlciBhbnltb3JlLlxuICAgKiBAcGFyYW0gbm9kZVxuICAgKi9cbiAgdW5zZXQobm9kZTogb2JqZWN0KTogdm9pZFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgdmFsdWUgb3ZlcnJpZGUgd2hpbGUgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIHJ1bm5pbmcgYW5kLCBpZiBhIG5vZGUgaXMgcmV0dXJuZWQsXG4gICAqIHNldHMgdGhlIG5vZGUgYXMgYSBwcm92aWRlciBvZiB0aGUgdmFsdWUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gUlxuICAgKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gcnVuLlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIGFwcGx5PFI+KGZuOiAoKSA9PiBSLCB2YWx1ZTogVCk6IFJcblxuICAvKipcbiAgICogQXBwbGllcyBhIGNvbXB1dGVkIHZhbHVlIG92ZXJyaWRlIHdoaWxlIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBydW5uaW5nIGFuZCwgaWYgYSBub2RlIGlzIHJldHVybmVkLFxuICAgKiBzZXRzIHRoZSBub2RlIGFzIGEgcHJvdmlkZXIgb2YgdGhlIGNvbXB1dGVkIHZhbHVlLlxuICAgKlxuICAgKiBAdHlwZXBhcmFtIFJcbiAgICogQHBhcmFtIGZuIEZ1bmN0aW9uIHRvIHJ1bi5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFwcGx5LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBhcHBseUNvbXB1dGVkPFI+KGZuOiAoKSA9PiBSLCB2YWx1ZUZuOiAoKSA9PiBUKTogUlxufVxuXG50eXBlIENvbnRleHRWYWx1ZTxUPiA9XG4gIHwge1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiXG4gICAgICB2YWx1ZTogVFxuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcImNvbXB1dGVkXCJcbiAgICAgIHZhbHVlOiBJQ29tcHV0ZWRWYWx1ZTxUPlxuICAgIH1cblxuZnVuY3Rpb24gcmVzb2x2ZUNvbnRleHRWYWx1ZTxUPihjb250ZXh0VmFsdWU6IENvbnRleHRWYWx1ZTxUPik6IFQge1xuICBpZiAoY29udGV4dFZhbHVlLnR5cGUgPT09IFwidmFsdWVcIikge1xuICAgIHJldHVybiBjb250ZXh0VmFsdWUudmFsdWVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGV4dFZhbHVlLnZhbHVlLmdldCgpXG4gIH1cbn1cblxuY2xhc3MgQ29udGV4dENsYXNzPFQ+IGltcGxlbWVudHMgQ29udGV4dDxUPiB7XG4gIHByaXZhdGUgZGVmYXVsdENvbnRleHRWYWx1ZSA9IG9ic2VydmFibGUuYm94PENvbnRleHRWYWx1ZTxUPj4odW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pXG5cbiAgcHJpdmF0ZSBvdmVycmlkZUNvbnRleHRWYWx1ZSA9IG9ic2VydmFibGUuYm94PENvbnRleHRWYWx1ZTxUPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7XG4gICAgZGVlcDogZmFsc2UsXG4gIH0pXG5cbiAgcHJpdmF0ZSByZWFkb25seSBub2RlQ29udGV4dFZhbHVlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBDb250ZXh0VmFsdWU8VD4+KClcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlQXRvbSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgSUF0b20+KClcblxuICBwcml2YXRlIGdldE5vZGVBdG9tKG5vZGU6IG9iamVjdCkge1xuICAgIHJldHVybiBnZXRPckNyZWF0ZSh0aGlzLm5vZGVBdG9tLCBub2RlLCAoKSA9PiBjcmVhdGVBdG9tKFwiY29udGV4dFZhbHVlXCIpKVxuICB9XG5cbiAgcHJpdmF0ZSBmYXN0R2V0KG5vZGU6IG9iamVjdCk6IFQge1xuICAgIHRoaXMuZ2V0Tm9kZUF0b20obm9kZSkucmVwb3J0T2JzZXJ2ZWQoKVxuXG4gICAgY29uc3Qgb2JzRm9yTm9kZSA9IHRoaXMubm9kZUNvbnRleHRWYWx1ZS5nZXQobm9kZSlcbiAgICBpZiAob2JzRm9yTm9kZSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVDb250ZXh0VmFsdWUob2JzRm9yTm9kZSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBmYXN0R2V0UGFyZW50KG5vZGUpXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlVmFsdWUgPSB0aGlzLm92ZXJyaWRlQ29udGV4dFZhbHVlLmdldCgpXG4gICAgICBpZiAob3ZlcnJpZGVWYWx1ZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUNvbnRleHRWYWx1ZShvdmVycmlkZVZhbHVlKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmFzdEdldChwYXJlbnQpXG4gIH1cblxuICBnZXQobm9kZTogb2JqZWN0KSB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHJldHVybiB0aGlzLmZhc3RHZXQobm9kZSlcbiAgfVxuXG4gIHByaXZhdGUgZmFzdEdldFByb3ZpZGVyTm9kZShub2RlOiBvYmplY3QpOiBvYmplY3QgfCB1bmRlZmluZWQge1xuICAgIHRoaXMuZ2V0Tm9kZUF0b20obm9kZSkucmVwb3J0T2JzZXJ2ZWQoKVxuXG4gICAgY29uc3Qgb2JzRm9yTm9kZSA9IHRoaXMubm9kZUNvbnRleHRWYWx1ZS5nZXQobm9kZSlcbiAgICBpZiAob2JzRm9yTm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBmYXN0R2V0UGFyZW50KG5vZGUpXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0R2V0UHJvdmlkZXJOb2RlKHBhcmVudClcbiAgfVxuXG4gIGdldFByb3ZpZGVyTm9kZShub2RlOiBvYmplY3QpOiBvYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICByZXR1cm4gdGhpcy5mYXN0R2V0UHJvdmlkZXJOb2RlKG5vZGUpXG4gIH1cblxuICBnZXREZWZhdWx0KCk6IFQge1xuICAgIHJldHVybiByZXNvbHZlQ29udGV4dFZhbHVlKHRoaXMuZGVmYXVsdENvbnRleHRWYWx1ZS5nZXQoKSEpXG4gIH1cblxuICBzZXREZWZhdWx0ID0gYWN0aW9uKCh2YWx1ZTogVCkgPT4ge1xuICAgIHRoaXMuZGVmYXVsdENvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiLFxuICAgICAgdmFsdWUsXG4gICAgfSlcbiAgfSlcblxuICBzZXREZWZhdWx0Q29tcHV0ZWQgPSBhY3Rpb24oKHZhbHVlRm46ICgpID0+IFQpID0+IHtcbiAgICB0aGlzLmRlZmF1bHRDb250ZXh0VmFsdWUuc2V0KHtcbiAgICAgIHR5cGU6IFwiY29tcHV0ZWRcIixcbiAgICAgIHZhbHVlOiBjb21wdXRlZCh2YWx1ZUZuKSxcbiAgICB9KVxuICB9KVxuXG4gIHNldCA9IGFjdGlvbigobm9kZTogb2JqZWN0LCB2YWx1ZTogVCkgPT4ge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICB0aGlzLm5vZGVDb250ZXh0VmFsdWUuc2V0KG5vZGUsIHtcbiAgICAgIHR5cGU6IFwidmFsdWVcIixcbiAgICAgIHZhbHVlLFxuICAgIH0pXG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbiAgfSlcblxuICBwcml2YXRlIF9zZXRDb21wdXRlZChub2RlOiBvYmplY3QsIGNvbXB1dGVkVmFsdWVGbjogSUNvbXB1dGVkVmFsdWU8VD4pIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gICAgdGhpcy5ub2RlQ29udGV4dFZhbHVlLnNldChub2RlLCB7IHR5cGU6IFwiY29tcHV0ZWRcIiwgdmFsdWU6IGNvbXB1dGVkVmFsdWVGbiB9KVxuICAgIHRoaXMuZ2V0Tm9kZUF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBzZXRDb21wdXRlZCA9IGFjdGlvbigobm9kZTogb2JqZWN0LCB2YWx1ZUZuOiAoKSA9PiBUKSA9PiB7XG4gICAgdGhpcy5fc2V0Q29tcHV0ZWQobm9kZSwgY29tcHV0ZWQodmFsdWVGbikpXG4gIH0pXG5cbiAgdW5zZXQgPSBhY3Rpb24oKG5vZGU6IG9iamVjdCkgPT4ge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICB0aGlzLm5vZGVDb250ZXh0VmFsdWUuZGVsZXRlKG5vZGUpXG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbiAgfSlcblxuICBhcHBseSA9IGFjdGlvbig8Uj4oZm46ICgpID0+IFIsIHZhbHVlOiBUKTogUiA9PiB7XG4gICAgY29uc3Qgb2xkID0gdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5nZXQoKVxuICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KHtcbiAgICAgIHR5cGU6IFwidmFsdWVcIixcbiAgICAgIHZhbHVlLFxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gZm4oKVxuICAgICAgaWYgKGlzVHdlYWtlZE9iamVjdChyZXQsIHRydWUpKSB7XG4gICAgICAgIHRoaXMuc2V0KHJldCwgdmFsdWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KG9sZClcbiAgICB9XG4gIH0pXG5cbiAgYXBwbHlDb21wdXRlZCA9IGFjdGlvbig8Uj4oZm46ICgpID0+IFIsIHZhbHVlRm46ICgpID0+IFQpOiBSID0+IHtcbiAgICBjb25zdCBjb21wdXRlZFZhbHVlRm4gPSBjb21wdXRlZCh2YWx1ZUZuKVxuXG4gICAgY29uc3Qgb2xkID0gdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5nZXQoKVxuICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KHtcbiAgICAgIHR5cGU6IFwiY29tcHV0ZWRcIixcbiAgICAgIHZhbHVlOiBjb21wdXRlZFZhbHVlRm4sXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBmbigpXG4gICAgICBpZiAoaXNUd2Vha2VkT2JqZWN0KHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy5fc2V0Q29tcHV0ZWQocmV0LCBjb21wdXRlZFZhbHVlRm4pXG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuc2V0KG9sZClcbiAgICB9XG4gIH0pXG5cbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlPzogVCkge1xuICAgIHRoaXMuc2V0RGVmYXVsdChkZWZhdWx0VmFsdWUgYXMgVClcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIG5vIGRlZmF1bHQgdmFsdWUsIHRodXMgbWFraW5nIGl0cyBkZWZhdWx0IHZhbHVlIHVuZGVmaW5lZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgQ29udGV4dCB2YWx1ZSB0eXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VD4oKTogQ29udGV4dDxUIHwgdW5kZWZpbmVkPlxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIGEgZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgQ29udGV4dCB2YWx1ZSB0eXBlLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VD4oZGVmYXVsdFZhbHVlOiBUKTogQ29udGV4dDxUPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUPihkZWZhdWx0VmFsdWU/OiBUKTogQ29udGV4dDxUPiB7XG4gIHJldHVybiBuZXcgQ29udGV4dENsYXNzKGRlZmF1bHRWYWx1ZSlcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHJlYWRvbmx5TWlkZGxld2FyZSB9IGZyb20gXCIuLi9hY3Rpb25NaWRkbGV3YXJlcy9yZWFkb25seU1pZGRsZXdhcmVcIlxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L2NvbnRleHRcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGlzVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IHRyeVVudHdlYWssIHR3ZWFrIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24sIGZhaWx1cmUsIHJ1bkJlZm9yZU9uSW5pdFN5bWJvbCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5cbmNvbnN0IGNvbXB1dGVkVHJlZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0KGZhbHNlKVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBub2RlIGlzIGEgY29tcHV0ZWQgdHJlZSBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBjb21wdXRlZCB0cmVlIG5vZGUsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wdXRlZFRyZWVOb2RlKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tcHV0ZWRUcmVlQ29udGV4dC5nZXQobm9kZSlcbn1cblxuY29uc3QgdHdlYWtlZENvbXB1dGVkVHJlZU5vZGVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpXG5cbmZ1bmN0aW9uIHR3ZWFrQ29tcHV0ZWRUcmVlTm9kZTxUPihuZXdWYWx1ZTogVCwgcGFyZW50OiB1bmtub3duLCBwYXRoOiBzdHJpbmcpOiBUIHtcbiAgY29uc3QgdHdlYWtlZFZhbHVlID0gdHdlYWsobmV3VmFsdWUsIHsgcGFyZW50LCBwYXRoIH0pXG4gIGlmIChpc1RyZWVOb2RlKHR3ZWFrZWRWYWx1ZSkgJiYgIXR3ZWFrZWRDb21wdXRlZFRyZWVOb2Rlcy5oYXModHdlYWtlZFZhbHVlKSkge1xuICAgIHR3ZWFrZWRDb21wdXRlZFRyZWVOb2Rlcy5hZGQodHdlYWtlZFZhbHVlKVxuICAgIHJlYWRvbmx5TWlkZGxld2FyZSh0d2Vha2VkVmFsdWUpXG4gICAgY29tcHV0ZWRUcmVlQ29udGV4dC5zZXQodHdlYWtlZFZhbHVlLCB0cnVlKVxuICB9XG4gIHJldHVybiB0d2Vha2VkVmFsdWVcbn1cblxuY29uc3QgY29tcHV0ZWRUcmVlTm9kZUluZm8gPSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBNYXA8c3RyaW5nLCB7IGNvbXB1dGVkOiBJQ29tcHV0ZWRWYWx1ZTx1bmtub3duPjsgdmFsdWU6IHVua25vd247IHR3ZWFrZWRWYWx1ZTogdW5rbm93biB9PlxuPigpXG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlQ29tcHV0ZWRUcmVlTm9kZUluZm8oaW5zdGFuY2U6IG9iamVjdCkge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUoY29tcHV0ZWRUcmVlTm9kZUluZm8sIGluc3RhbmNlLCAoKSA9PiBuZXcgTWFwKCkpXG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciB0dXJuaW5nIGEgY29tcHV0ZWQgcHJvcGVydHkgaW50byBhIGNvbXB1dGVkIHRyZWUgd2hpY2ggc3VwcG9ydHMgdHJlZSB0cmF2ZXJzYWxcbiAqIGZ1bmN0aW9ucywgY29udGV4dHMsIHJlZmVyZW5jZXMsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFByb3RvdHlwZSBvZiB0aGUgY2xhc3MuXG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgTmFtZSBvZiB0aGUgbWVtYmVyLlxuICogQHBhcmFtIGRlc2NyaXB0b3IgUHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIG1lbWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVkVHJlZShcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuKTogdm9pZCB7XG4gIGlmICghZGVzY3JpcHRvci5nZXQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiQGNvbXB1dGVkVHJlZSByZXF1aXJlcyBhICdnZXQnIGFjY2Vzc29yXCIpXG4gIH1cblxuICBjb25zdCB0YXJnZXRDbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvclxuICBpZiAoIWlzTW9kZWxDbGFzcyh0YXJnZXRDbGFzcykgJiYgIWlzRGF0YU1vZGVsQ2xhc3ModGFyZ2V0Q2xhc3MpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIkBjb21wdXRlZFRyZWUgY2FuIG9ubHkgZGVjb3JhdGUgJ2dldCcgYWNjZXNzb3JzIG9mIGNsYXNzIG9yIGRhdGEgbW9kZWxzXCIpXG4gIH1cblxuICBjb25zdCBvcmlnaW5hbCA9IGRlc2NyaXB0b3IuZ2V0XG5cbiAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZW50cnkgPSBnZXRPckNyZWF0ZUNvbXB1dGVkVHJlZU5vZGVJbmZvKHRoaXMpLmdldChwcm9wZXJ0eUtleSkhXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IGVudHJ5LnZhbHVlXG4gICAgY29uc3QgbmV3VmFsdWUgPSBlbnRyeS5jb21wdXRlZC5nZXQoKVxuXG4gICAgaWYgKG9sZFZhbHVlID09PSBuZXdWYWx1ZSkge1xuICAgICAgcmV0dXJuIGVudHJ5LnR3ZWFrZWRWYWx1ZVxuICAgIH1cblxuICAgIHR3ZWFrKG9sZFZhbHVlLCB1bmRlZmluZWQpXG4gICAgdHJ5VW50d2VhayhvbGRWYWx1ZSlcblxuICAgIGNvbnN0IHR3ZWFrZWRWYWx1ZSA9IHR3ZWFrQ29tcHV0ZWRUcmVlTm9kZShuZXdWYWx1ZSwgdGhpcywgcHJvcGVydHlLZXkpXG4gICAgZW50cnkudmFsdWUgPSBuZXdWYWx1ZVxuICAgIGVudHJ5LnR3ZWFrZWRWYWx1ZSA9IHR3ZWFrZWRWYWx1ZVxuICAgIHJldHVybiB0d2Vha2VkVmFsdWVcbiAgfVxuXG4gIGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uKHRhcmdldCwgcnVuQmVmb3JlT25Jbml0U3ltYm9sLCAoaW5zdGFuY2UpID0+IHtcbiAgICBjb25zdCBjID0gY29tcHV0ZWQoKCkgPT4gb3JpZ2luYWwuY2FsbChpbnN0YW5jZSksIHsga2VlcEFsaXZlOiB0cnVlIH0pXG4gICAgY29uc3QgbmV3VmFsdWUgPSBjLmdldCgpXG4gICAgY29uc3QgdHdlYWtlZFZhbHVlID0gdHdlYWtDb21wdXRlZFRyZWVOb2RlKG5ld1ZhbHVlLCBpbnN0YW5jZSwgcHJvcGVydHlLZXkpXG5cbiAgICBnZXRPckNyZWF0ZUNvbXB1dGVkVHJlZU5vZGVJbmZvKGluc3RhbmNlKS5zZXQocHJvcGVydHlLZXksIHtcbiAgICAgIGNvbXB1dGVkOiBjLFxuICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgdHdlYWtlZFZhbHVlLFxuICAgIH0pXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFic3RyYWN0TW9kZWxDbGFzcyxcbiAgTW9kZWxDbGFzcyxcbiAgTW9kZWxDcmVhdGlvbkRhdGEsXG4gIE1vZGVsVW50cmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUHJvcHMsXG4gIE1vZGVsUHJvcHNUb1NldHRlcixcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YSxcbiAgTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgc2hhcmVkSW50ZXJuYWxNb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9zaGFyZWRJbnRlcm5hbE1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsLCBCYXNlRGF0YU1vZGVsLCBCYXNlRGF0YU1vZGVsS2V5cyB9IGZyb20gXCIuL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0SXNEYXRhTW9kZWxDbGFzcywgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IHR5cGUgX0NvbXBvc2VkRGF0YTxTdXBlck1vZGVsLCBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IFN1cGVyTW9kZWwgZXh0ZW5kcyBBbnlEYXRhTW9kZWxcbiAgP1xuICAgICAgfCAoTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+ICYgTW9kZWxVbnRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWw+KVxuICAgICAgfCAoTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPiAmIE1vZGVsQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWw+KVxuICA6IE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPiB8IE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFRQcm9wcz5cblxuZXhwb3J0IGludGVyZmFjZSBfRGF0YU1vZGVsPFN1cGVyTW9kZWwsIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+IHtcbiAgbmV3IChkYXRhOiBfQ29tcG9zZWREYXRhPFN1cGVyTW9kZWwsIFRQcm9wcz4pOiBTdXBlck1vZGVsICZcbiAgICBCYXNlRGF0YU1vZGVsPFRQcm9wcz4gJlxuICAgIE9taXQ8TW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhPFRQcm9wcz4sIEJhc2VEYXRhTW9kZWxLZXlzPiAmXG4gICAgTW9kZWxQcm9wc1RvU2V0dGVyPFRQcm9wcz5cbn1cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBkYXRhIG1vZGVscyB0aGF0IGV4dGVuZHMgYW5vdGhlciBtb2RlbC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBOZXcgbW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHR5cGVwYXJhbSBUTW9kZWwgTW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBnZW5GbiBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGJhc2UgbW9kZWwgYW5kIG1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWREYXRhTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRNb2RlbCBleHRlbmRzIEFueURhdGFNb2RlbCxcbiAgQSBleHRlbmRzIFtdXG4+KFxuICBnZW5GbjogKC4uLmFyZ3M6IEEpID0+IHtcbiAgICBiYXNlTW9kZWw6IEFic3RyYWN0TW9kZWxDbGFzczxUTW9kZWw+XG4gICAgcHJvcHM6IFRQcm9wc1xuICB9XG4pOiBfRGF0YU1vZGVsPFRNb2RlbCwgVFByb3BzPlxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGEgbW9kZWxzIHRoYXQgZXh0ZW5kcyBhbm90aGVyIG1vZGVsLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE5ldyBtb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAdHlwZXBhcmFtIFRNb2RlbCBNb2RlbCB0eXBlLlxuICogQHBhcmFtIGJhc2VNb2RlbCBCYXNlIG1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV4dGVuZGVkRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsIFRNb2RlbCBleHRlbmRzIEFueURhdGFNb2RlbD4oXG4gIGJhc2VNb2RlbDogQWJzdHJhY3RNb2RlbENsYXNzPFRNb2RlbD4sXG4gIG1vZGVsUHJvcHM6IFRQcm9wc1xuKTogX0RhdGFNb2RlbDxUTW9kZWwsIFRQcm9wcz5cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIEV4dGVuZGVkRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsIFRNb2RlbCBleHRlbmRzIEFueURhdGFNb2RlbD4oXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBfRGF0YU1vZGVsPFRNb2RlbCwgVFByb3BzPiB7XG4gIGxldCBiYXNlTW9kZWxcbiAgbGV0IG1vZGVsUHJvcHNcbiAgaWYgKGlzRGF0YU1vZGVsQ2xhc3MoYXJnc1swXSkpIHtcbiAgICBiYXNlTW9kZWwgPSBhcmdzWzBdXG4gICAgbW9kZWxQcm9wcyA9IGFyZ3NbMV1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBnZW4gPSBhcmdzWzBdKClcblxuICAgIGJhc2VNb2RlbCA9IGdlbi5iYXNlTW9kZWxcbiAgICBtb2RlbFByb3BzID0gZ2VuLnByb3BzXG4gIH1cblxuICBhc3NlcnRJc0RhdGFNb2RlbENsYXNzKGJhc2VNb2RlbCwgXCJiYXNlTW9kZWxcIilcblxuICByZXR1cm4gaW50ZXJuYWxEYXRhTW9kZWwobW9kZWxQcm9wcywgYmFzZU1vZGVsIGFzIGFueSlcbn1cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBkYXRhIG1vZGVscy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25MYXp5SW5pdGAgb3IgYG9uTGF6eUF0dGFjaGVkVG9Sb290U3RvcmVgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHBhcmFtIGZuTW9kZWxQcm9wcyBGdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBtb2RlbCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsIEEgZXh0ZW5kcyBbXT4oXG4gIGZuTW9kZWxQcm9wczogKC4uLmFyZ3M6IEEpID0+IFRQcm9wc1xuKTogX0RhdGFNb2RlbDx1bmtub3duLCBUUHJvcHM+XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0YSBtb2RlbHMuXG4gKlxuICogTmV2ZXIgb3ZlcnJpZGUgdGhlIGNvbnN0cnVjdG9yLCB1c2UgYG9uTGF6eUluaXRgIG9yIGBvbkxhenlBdHRhY2hlZFRvUm9vdFN0b3JlYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFByb3BzIE1vZGVsIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4oXG4gIG1vZGVsUHJvcHM6IFRQcm9wc1xuKTogX0RhdGFNb2RlbDx1bmtub3duLCBUUHJvcHM+XG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBEYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4oXG4gIGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wczogKCgpID0+IFRQcm9wcykgfCBUUHJvcHNcbik6IF9EYXRhTW9kZWw8dW5rbm93biwgVFByb3BzPiB7XG4gIGNvbnN0IG1vZGVsUHJvcHMgPVxuICAgIHR5cGVvZiBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHMoKVxuICAgICAgOiBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHNcbiAgcmV0dXJuIGludGVybmFsRGF0YU1vZGVsKG1vZGVsUHJvcHMsIHVuZGVmaW5lZClcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxEYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgVEJhc2VNb2RlbCBleHRlbmRzIEFueURhdGFNb2RlbD4oXG4gIG1vZGVsUHJvcHM6IFRQcm9wcyxcbiAgYmFzZU1vZGVsOiBNb2RlbENsYXNzPFRCYXNlTW9kZWw+IHwgdW5kZWZpbmVkXG4pOiBfRGF0YU1vZGVsPFRCYXNlTW9kZWwsIFRQcm9wcz4ge1xuICByZXR1cm4gc2hhcmVkSW50ZXJuYWxNb2RlbCh7XG4gICAgbW9kZWxQcm9wcyxcbiAgICBiYXNlTW9kZWwsXG4gICAgdHlwZTogXCJkYXRhXCIsXG4gICAgdmFsdWVUeXBlOiBmYWxzZSxcbiAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IHVuZGVmaW5lZCxcbiAgICB0b1NuYXBzaG90UHJvY2Vzc29yOiB1bmRlZmluZWQsXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuLi9hY3Rpb25cIlxuaW1wb3J0IHtcbiAgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLFxuICBBY3Rpb25UcmFja2luZ1Jlc3VsdCxcbiAgU2ltcGxlQWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4uL2FjdGlvbk1pZGRsZXdhcmVzXCJcbmltcG9ydCB7IGZhc3RHZXRSb290UGF0aCwgUm9vdFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgYXBwbHlTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9hcHBseVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcblxuLyoqXG4gKiBDb25uZWN0cyBhIHRyZWUgbm9kZSB0byBhIHJlZHV4IGRldiB0b29scyBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gcmVtb3RlZGV2UGFja2FnZSBUaGUgcmVtb3RlZGV2IHBhY2thZ2UgKHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBgcmVxdWlyZShcInJlbW90ZURldlwiKWApIChodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZW1vdGVkZXYpLlxuICogQHBhcmFtIHJlbW90ZWRldkNvbm5lY3Rpb24gVGhlIHJlc3VsdCBvZiBhIGNvbm5lY3QgbWV0aG9kIGZyb20gdGhlIHJlbW90ZWRldiBwYWNrYWdlICh1c3VhbGx5IHRoZSByZXN1bHQgb2YgYHJlbW90ZURldi5jb25uZWN0VmlhRXh0ZW5zaW9uKC4uLilgKS5cbiAqIEBwYXJhbSB0YXJnZXQgT2JqZWN0IHRvIHVzZSBhcyByb290LlxuICogQHBhcmFtIHN0b3JlTmFtZSBOYW1lIHRvIGJlIHNob3duIGluIHRoZSByZWR1eCBkZXYgdG9vbHMuXG4gKiBAcGFyYW0gW29wdGlvbnNdIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0LiBgbG9nQXJnc05lYXJOYW1lYCBpZiBpdCBzaG91bGQgc2hvdyB0aGUgYXJndW1lbnRzIG5lYXIgdGhlIGFjdGlvbiBuYW1lIChkZWZhdWx0IGlzIGB0cnVlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0UmVkdXhEZXZUb29scyhcbiAgcmVtb3RlZGV2UGFja2FnZTogYW55LFxuICByZW1vdGVkZXZDb25uZWN0aW9uOiBhbnksXG4gIHRhcmdldDogb2JqZWN0LFxuICBvcHRpb25zPzoge1xuICAgIGxvZ0FyZ3NOZWFyTmFtZT86IGJvb2xlYW5cbiAgfVxuKSB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodGFyZ2V0LCBcInRhcmdldFwiKVxuXG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgbG9nQXJnc05lYXJOYW1lOiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cblxuICBsZXQgaGFuZGxpbmdNb25pdG9yQWN0aW9uID0gMFxuXG4gIC8vIHN1YnNjcmliZSB0byBjaGFuZ2Ugc3RhdGUgKGlmIG5lZWQgbW9yZSB0aGFuIGp1c3QgbG9nZ2luZylcbiAgcmVtb3RlZGV2Q29ubmVjdGlvbi5zdWJzY3JpYmUoKG1lc3NhZ2U6IGFueSkgPT4ge1xuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiRElTUEFUQ0hcIikge1xuICAgICAgaGFuZGxlTW9uaXRvckFjdGlvbnMocmVtb3RlZGV2Q29ubmVjdGlvbiwgdGFyZ2V0LCBtZXNzYWdlKVxuICAgIH1cbiAgfSlcblxuICBjb25zdCBpbml0aWFsU3RhdGUgPSBnZXRTbmFwc2hvdCh0YXJnZXQpXG4gIHJlbW90ZWRldkNvbm5lY3Rpb24uaW5pdChpbml0aWFsU3RhdGUpXG5cbiAgbGV0IGN1cnJlbnRBY3Rpb25JZCA9IDBcbiAgY29uc3QgYWN0aW9uSWRTeW1ib2wgPSBTeW1ib2woXCJhY3Rpb25JZFwiKVxuXG4gIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZSh0YXJnZXQsIHtcbiAgICBvblN0YXJ0KGN0eCkge1xuICAgICAgY3R4LmRhdGFbYWN0aW9uSWRTeW1ib2xdID0gY3VycmVudEFjdGlvbklkKytcbiAgICB9LFxuICAgIG9uUmVzdW1lKGN0eCkge1xuICAgICAgLy8gZ2l2ZSBhIGNoYW5jZSB0byB0aGUgcGFyZW50IHRvIGxvZyBpdHMgb3duIGNoYW5nZXMgYmVmb3JlIHRoZSBjaGlsZCBzdGFydHNcbiAgICAgIGlmIChjdHgucGFyZW50Q29udGV4dCkge1xuICAgICAgICBsb2coY3R4LnBhcmVudENvbnRleHQsIHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICAgIGxvZyhjdHgsIHVuZGVmaW5lZClcbiAgICB9LFxuICAgIG9uU3VzcGVuZChjdHgpIHtcbiAgICAgIGxvZyhjdHgsIHVuZGVmaW5lZClcbiAgICB9LFxuICAgIG9uRmluaXNoKGN0eCwgcmV0KSB7XG4gICAgICBsb2coY3R4LCByZXQucmVzdWx0KVxuICAgIH0sXG4gIH0pXG5cbiAgZnVuY3Rpb24gaGFuZGxlTW9uaXRvckFjdGlvbnMocmVtb3RlZGV2MjogYW55LCB0YXJnZXQyOiBhbnksIG1lc3NhZ2U6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICBoYW5kbGluZ01vbml0b3JBY3Rpb24rK1xuXG4gICAgICBzd2l0Y2ggKG1lc3NhZ2UucGF5bG9hZC50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJSRVNFVFwiOlxuICAgICAgICAgIGFwcGx5U25hcHNob3QodGFyZ2V0MiwgaW5pdGlhbFN0YXRlKVxuICAgICAgICAgIHJldHVybiByZW1vdGVkZXYyLmluaXQoaW5pdGlhbFN0YXRlKVxuICAgICAgICBjYXNlIFwiQ09NTUlUXCI6XG4gICAgICAgICAgcmV0dXJuIHJlbW90ZWRldjIuaW5pdChnZXRTbmFwc2hvdCh0YXJnZXQyKSlcbiAgICAgICAgY2FzZSBcIlJPTExCQUNLXCI6XG4gICAgICAgICAgcmV0dXJuIHJlbW90ZWRldjIuaW5pdChyZW1vdGVkZXZQYWNrYWdlLmV4dHJhY3RTdGF0ZShtZXNzYWdlKSlcbiAgICAgICAgY2FzZSBcIkpVTVBfVE9fU1RBVEVcIjpcbiAgICAgICAgY2FzZSBcIkpVTVBfVE9fQUNUSU9OXCI6XG4gICAgICAgICAgYXBwbHlTbmFwc2hvdCh0YXJnZXQyLCByZW1vdGVkZXZQYWNrYWdlLmV4dHJhY3RTdGF0ZShtZXNzYWdlKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgY2FzZSBcIklNUE9SVF9TVEFURVwiOlxuICAgICAgICAgIGNvbnN0IG5leHRMaWZ0ZWRTdGF0ZSA9IG1lc3NhZ2UucGF5bG9hZC5uZXh0TGlmdGVkU3RhdGVcbiAgICAgICAgICBjb25zdCBjb21wdXRlZFN0YXRlcyA9IG5leHRMaWZ0ZWRTdGF0ZS5jb21wdXRlZFN0YXRlc1xuICAgICAgICAgIGFwcGx5U25hcHNob3QodGFyZ2V0MiwgY29tcHV0ZWRTdGF0ZXNbY29tcHV0ZWRTdGF0ZXMubGVuZ3RoIC0gMV0uc3RhdGUpXG4gICAgICAgICAgcmVtb3RlZGV2Mi5zZW5kKG51bGwsIG5leHRMaWZ0ZWRTdGF0ZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGFuZGxpbmdNb25pdG9yQWN0aW9uLS1cbiAgICB9XG4gIH1cblxuICBsZXQgbGFzdExvZ2dlZFNuYXBzaG90ID0gaW5pdGlhbFN0YXRlXG5cbiAgZnVuY3Rpb24gbG9nKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCwgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChoYW5kbGluZ01vbml0b3JBY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNuID0gZ2V0U25hcHNob3QodGFyZ2V0KVxuXG4gICAgLy8gaWdub3JlIGFjdGlvbnMgdGhhdCBkb24ndCBjaGFuZ2UgYW55dGhpbmcgKHVubGVzcyBpdCBpcyBhIHRocm93KVxuICAgIGlmIChzbiA9PT0gbGFzdExvZ2dlZFNuYXBzaG90ICYmIHJlc3VsdCAhPT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuVGhyb3cpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsYXN0TG9nZ2VkU25hcHNob3QgPSBzblxuXG4gICAgY29uc3Qgcm9vdFBhdGggPSBmYXN0R2V0Um9vdFBhdGgoY3R4LnRhcmdldClcbiAgICBjb25zdCBuYW1lID0gZ2V0QWN0aW9uQ29udGV4dE5hbWVBbmRUeXBlUGF0aChjdHgsIHJvb3RQYXRoLCByZXN1bHQpXG5cbiAgICBjb25zdCBjb3B5ID0ge1xuICAgICAgdHlwZTogbmFtZSxcbiAgICAgIHBhdGg6IHJvb3RQYXRoLnBhdGgsXG4gICAgICBhcmdzOiBjdHguYXJncyxcbiAgICB9XG5cbiAgICByZW1vdGVkZXZDb25uZWN0aW9uLnNlbmQoY29weSwgc24pXG4gIH1cblxuICBmdW5jdGlvbiBnZXRBY3Rpb25Db250ZXh0TmFtZUFuZFR5cGVQYXRoKFxuICAgIGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCxcbiAgICByb290UGF0aDogUm9vdFBhdGg8YW55PixcbiAgICByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGNvbnN0IHBhdGhTdHIgPSBcIlsvXCIgKyByb290UGF0aC5wYXRoLmpvaW4oXCIvXCIpICsgXCJdIFwiXG4gICAgbGV0IG5hbWUgPSBwYXRoU3RyICsgY3R4LmFjdGlvbk5hbWVcblxuICAgIGlmIChvcHRzLmxvZ0FyZ3NOZWFyTmFtZSkge1xuICAgICAgbGV0IGFyZ3MgPSBjdHguYXJnc1xuICAgICAgICAubWFwKChhKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIFwiKip1bnNlcmlhbGl6YWJsZSoqXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiLCBcIilcblxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgYXJncyA9IGFyZ3Muc2xpY2UoMCwgNjQpICsgXCIuLi5cIlxuICAgICAgfVxuXG4gICAgICBuYW1lICs9IGAoJHthcmdzfSlgXG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uSWQgPSBjdHguZGF0YVthY3Rpb25JZFN5bWJvbF1cblxuICAgIG5hbWUgKz0gYCAoaWQgJHthY3Rpb25JZCAhPT0gdW5kZWZpbmVkID8gYWN0aW9uSWQgOiBcIj9cIn1gXG4gICAgaWYgKGN0eC50eXBlID09PSBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYykge1xuICAgICAgbmFtZSArPSBcIiwgYXN5bmNcIlxuICAgIH1cbiAgICBuYW1lICs9IFwiKVwiXG5cbiAgICBpZiAocmVzdWx0ID09PSBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdykge1xuICAgICAgbmFtZSArPSBcIiAtZXJyb3IgdGhyb3duLVwiXG4gICAgfVxuXG4gICAgaWYgKGN0eC5wYXJlbnRDb250ZXh0KSB7XG4gICAgICBjb25zdCBwYXJlbnROYW1lID0gZ2V0QWN0aW9uQ29udGV4dE5hbWVBbmRUeXBlUGF0aChcbiAgICAgICAgY3R4LnBhcmVudENvbnRleHQsXG4gICAgICAgIGZhc3RHZXRSb290UGF0aChjdHgucGFyZW50Q29udGV4dC50YXJnZXQpLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgIClcbiAgICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICAgIG5hbWUgPSBgJHtwYXJlbnROYW1lfSA+Pj4gJHtuYW1lfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZVxuICB9XG59XG4iLCJpbXBvcnQgeyBBY3Rpb25DYWxsLCBhcHBseUFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25cIlxyXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXHJcbmltcG9ydCB7IG9uU25hcHNob3QsIE9uU25hcHNob3REaXNwb3NlciwgT25TbmFwc2hvdExpc3RlbmVyIH0gZnJvbSBcIi4uL3NuYXBzaG90L29uU25hcHNob3RcIlxyXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwiLi4vc25hcHNob3QvU25hcHNob3RPZlwiXHJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY29uc3QgcmVkdXhBY3Rpb25UeXBlID0gXCJhcHBseUFjdGlvblwiXHJcblxyXG4vKipcclxuICogQSByZWR1eCBhY3Rpb24gZm9yIG1vYngta2V5c3RvbmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4QWN0aW9uIHtcclxuICByZWFkb25seSB0eXBlOiB0eXBlb2YgcmVkdXhBY3Rpb25UeXBlXHJcbiAgcmVhZG9ubHkgcGF5bG9hZDogQWN0aW9uQ2FsbFxyXG59XHJcblxyXG4vKipcclxuICogVHJhbnNmb3JtcyBhbiBhY3Rpb24gY2FsbCBpbnRvIGEgcmVkdXggYWN0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0gYWN0aW9uQ2FsbCBBY3Rpb24gY2FsbC5cclxuICogQHJldHVybnMgQSByZWR1eCBhY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWN0aW9uQ2FsbFRvUmVkdXhBY3Rpb24oYWN0aW9uQ2FsbDogQWN0aW9uQ2FsbCk6IFJlZHV4QWN0aW9uIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogcmVkdXhBY3Rpb25UeXBlLFxyXG4gICAgcGF5bG9hZDogYWN0aW9uQ2FsbCxcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHJlZHV4IHN0b3JlIGZvciBtb2J4LWtleXN0b25lLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZWR1eFN0b3JlPFQ+IHtcclxuICBnZXRTdGF0ZSgpOiBTbmFwc2hvdE91dE9mPFQ+XHJcbiAgZGlzcGF0Y2goYWN0aW9uOiBSZWR1eEFjdGlvbik6IFJlZHV4QWN0aW9uXHJcbiAgc3Vic2NyaWJlKGxpc3RlbmVyOiBPblNuYXBzaG90TGlzdGVuZXI8VD4pOiBPblNuYXBzaG90RGlzcG9zZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcmVkdXggcnVubmVyIGZvciBtb2J4LWtleXN0b25lLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZWR1eFJ1bm5lcjxUPiB7XHJcbiAgKG5leHQ6IFJlZHV4U3RvcmU8VD5bXCJkaXNwYXRjaFwiXSk6IChhY3Rpb246IFJlZHV4QWN0aW9uKSA9PiBSZWR1eEFjdGlvblxyXG59XHJcblxyXG4vKipcclxuICogQSByZWR1eCBtaWRkbGV3YXJlIGZvciBtb2J4LWtleXN0b25lLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZWR1eE1pZGRsZXdhcmU8VD4ge1xyXG4gIChzdG9yZTogUmVkdXhTdG9yZTxUPik6IFJlZHV4UnVubmVyPFQ+XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByZWR1eCBjb21wYXRpYmxlIHN0b3JlIG91dCBvZiBhIG1vYngta2V5c3RvbmUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXHJcbiAqIEBwYXJhbSB0YXJnZXQgUm9vdCBvYmplY3QuXHJcbiAqIEBwYXJhbSBtaWRkbGV3YXJlcyBPcHRpb25hbCBsaXN0IG9mIHJlZHV4IG1pZGRsZXdhcmVzLlxyXG4gKiBAcmV0dXJucyBBIHJlZHV4IGNvbXBhdGlibGUgc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXNSZWR1eFN0b3JlPFQgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gIHRhcmdldDogVCxcclxuICAuLi5taWRkbGV3YXJlczogUmVkdXhNaWRkbGV3YXJlPFQ+W11cclxuKTogUmVkdXhTdG9yZTxUPiB7XHJcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0YXJnZXQsIFwidGFyZ2V0XCIpXHJcblxyXG4gIGNvbnN0IGRlZmF1bHREaXNwYXRjaCA9IChhY3Rpb246IFJlZHV4QWN0aW9uKSA9PiB7XHJcbiAgICBpZiAoYWN0aW9uLnR5cGUgIT09IHJlZHV4QWN0aW9uVHlwZSkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBhY3Rpb24gdHlwZSB3YXMgZXhwZWN0ZWQgdG8gYmUgJyR7cmVkdXhBY3Rpb25UeXBlfScsIGJ1dCBpdCB3YXMgJyR7YWN0aW9uLnR5cGV9J2BcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5QWN0aW9uKHRhcmdldCwgYWN0aW9uLnBheWxvYWQpXHJcbiAgICByZXR1cm4gYWN0aW9uXHJcbiAgfVxyXG5cclxuICBsZXQgc3RvcmU6IFJlZHV4U3RvcmU8VD4gPSB7XHJcbiAgICBnZXRTdGF0ZSgpIHtcclxuICAgICAgcmV0dXJuIGdldFNuYXBzaG90KHRhcmdldClcclxuICAgIH0sXHJcbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIHJ1bk1pZGRsZXdhcmVzKGFjdGlvbiwgcnVubmVycywgZGVmYXVsdERpc3BhdGNoKVxyXG4gICAgfSxcclxuICAgIHN1YnNjcmliZShsaXN0ZW5lcikge1xyXG4gICAgICByZXR1cm4gb25TbmFwc2hvdCh0YXJnZXQsIGxpc3RlbmVyKVxyXG4gICAgfSxcclxuICB9XHJcblxyXG4gIGNvbnN0IHJ1bm5lcnMgPSBtaWRkbGV3YXJlcy5tYXAoKG13KSA9PiBtdyhzdG9yZSkpXHJcblxyXG4gIHJldHVybiBzdG9yZVxyXG59XHJcblxyXG5mdW5jdGlvbiBydW5NaWRkbGV3YXJlczxUPihcclxuICBpbml0aWFsQWN0aW9uOiBSZWR1eEFjdGlvbixcclxuICBydW5uZXJzOiBSZWFkb25seUFycmF5PFJlZHV4UnVubmVyPFQ+PixcclxuICBuZXh0OiBSZWR1eFN0b3JlPFQ+W1wiZGlzcGF0Y2hcIl1cclxuKTogUmVkdXhBY3Rpb24ge1xyXG4gIGxldCBpID0gMFxyXG5cclxuICBmdW5jdGlvbiBydW5OZXh0TWlkZGxld2FyZShhY3Rpb246IFJlZHV4QWN0aW9uKTogUmVkdXhBY3Rpb24ge1xyXG4gICAgY29uc3QgcnVubmVyID0gcnVubmVyc1tpXVxyXG4gICAgaSsrXHJcbiAgICBpZiAocnVubmVyKSB7XHJcbiAgICAgIHJldHVybiBydW5uZXIocnVuTmV4dE1pZGRsZXdhcmUpKGFjdGlvbilcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXh0KGFjdGlvbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBydW5OZXh0TWlkZGxld2FyZShpbml0aWFsQWN0aW9uKVxyXG59XHJcbiIsImltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgdHlwZXNTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHsgdFByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdFByb3BcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQSByZWZlcmVuY2UgbW9kZWwgYmFzZSB0eXBlLlxuICogVXNlIGBjdXN0b21SZWZgIHRvIGNyZWF0ZSBhIGN1c3RvbSByZWYgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWY8VCBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBNb2RlbCh7XG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgaWQuXG4gICAqL1xuICBpZDogdFByb3AodHlwZXNTdHJpbmcpLFxufSkge1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVzb2x2ZSgpOiBUIHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdGhpcyByZWZlcmVuY2UgcG9pbnRzIHRvLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcmVmZXJlbmNlIGlzIGN1cnJlbnRseSBpbnZhbGlkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCBtYXliZUN1cnJlbnQoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZSgpXG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHJlZmVyZW5jZSBpcyBjdXJyZW50bHkgdmFsaWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5tYXliZUN1cnJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHRoaXMgcmVmZXJlbmNlIHBvaW50cyB0bywgb3IgdGhyb3dzIGlmIGludmFsaWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IGN1cnJlbnQoKTogVCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubWF5YmVDdXJyZW50XG5cbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBhIHJlZmVyZW5jZSBvZiB0eXBlICcke3RoaXNbbW9kZWxUeXBlS2V5XX0nIGNvdWxkIG5vdCByZXNvbHZlIGFuIG9iamVjdCB3aXRoIGlkICcke3RoaXMuaWR9J2BcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYmFjayByZWZlcmVuY2VzIGZvciB0aGlzIHJlZiBhcmUgdXAgdG8gZGF0ZS5cbiAgICogVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBpZiB5b3UgbmVlZCB0byBnZXQgdGhlIG1vc3QgdXAgdG8gZGF0ZVxuICAgKiBiYWNrIHJlZmVyZW5jZXMgd2hpbGUgYm90aCBzdGlsbCBpbnNpZGUgYW4gYWN0aW9uIGFuZCB3aGlsZSB0aGUgcmVmZXJlbmNlXG4gICAqIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBzYW1lIHJvb3QgdGhhbiB0aGUgdGFyZ2V0LlxuICAgKi9cbiAgYWJzdHJhY3QgZm9yY2VVcGRhdGVCYWNrUmVmcygpOiB2b2lkXG59XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZGVjbGFyZSBjb25zdCBjdXN0b21SZWZUeXBlU3ltYm9sOiB1bmlxdWUgc3ltYm9sXG5cbi8qKiBBIHJlZiBjb25zdHJ1Y3RvciBmb3IgY3VzdG9tIHJlZnMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVmQ29uc3RydWN0b3I8VCBleHRlbmRzIG9iamVjdD4ge1xuICA8VEUgZXh0ZW5kcyBUPih2YWx1ZU9ySUQ6IFRFIHwgc3RyaW5nKTogUmVmPFRFPlxuXG4gIHJlZkNsYXNzOiBNb2RlbENsYXNzPFJlZjxUPj5cblxuICBbY3VzdG9tUmVmVHlwZVN5bWJvbF06IFQgLy8ganVzdCBmb3IgdHlwaW5nc1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHJlZiBvYmplY3QgaXMgb2YgYSBnaXZlbiByZWYgdHlwZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmVmZXJlbmNlZCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSByZWYgUmVmZXJlbmNlIG9iamVjdC5cbiAqIEBwYXJhbSByZWZUeXBlIFJlZmVyZW5jZSB0eXBlLlxuICogQHJldHVybnMgYHRydWVgIGlmIGl0IGlzIG9mIHRoZSBnaXZlbiB0eXBlLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZk9mVHlwZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgcmVmOiBSZWY8b2JqZWN0PixcbiAgcmVmVHlwZTogUmVmQ29uc3RydWN0b3I8VD5cbik6IHJlZiBpcyBSZWY8VD4ge1xuICByZXR1cm4gcmVmIGluc3RhbmNlb2YgcmVmVHlwZS5yZWZDbGFzc1xufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBvYnNlcnZhYmxlLCBPYnNlcnZhYmxlU2V0LCByZWFjdGlvbiwgd2hlbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbERlY29yYXRvclwiXG5pbXBvcnQge1xuICBnZXREZWVwT2JqZWN0Q2hpbGRyZW4sXG4gIHJlZ2lzdGVyRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uLFxufSBmcm9tIFwiLi4vcGFyZW50L2NvcmVPYmplY3RDaGlsZHJlblwiXG5pbXBvcnQgeyBnZXRSb290IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IENvbXB1dGVkV2Fsa1RyZWVBZ2dyZWdhdGUsIGNvbXB1dGVkV2Fsa1RyZWVBZ2dyZWdhdGUgfSBmcm9tIFwiLi4vcGFyZW50L3dhbGtUcmVlXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB7IFJlZiwgUmVmQ29uc3RydWN0b3IgfSBmcm9tIFwiLi9SZWZcIlxuXG5pbnRlcmZhY2UgQmFja1JlZnM8VCBleHRlbmRzIG9iamVjdD4ge1xuICBhbGw6IE9ic2VydmFibGVTZXQ8UmVmPFQ+PlxuICBieVR5cGU6IFdlYWtNYXA8UmVmQ29uc3RydWN0b3I8VD4sIE9ic2VydmFibGVTZXQ8UmVmPFQ+Pj5cbn1cblxuLyoqXG4gKiBCYWNrLXJlZmVyZW5jZXMgZnJvbSBvYmplY3QgdG8gdGhlIHJlZmVyZW5jZXMgdGhhdCBwb2ludCB0byBpdC5cbiAqL1xuY29uc3Qgb2JqZWN0QmFja1JlZnMgPSBuZXcgV2Vha01hcDxvYmplY3QsIEJhY2tSZWZzPGFueT4+KClcblxuLyoqXG4gKiBSZWZlcmVuY2UgcmVzb2x2ZXIgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVmUmVzb2x2ZXI8VCBleHRlbmRzIG9iamVjdD4gPSAocmVmOiBSZWY8VD4pID0+IFQgfCB1bmRlZmluZWRcblxuLyoqXG4gKiBSZWZlcmVuY2UgSUQgcmVzb2x2ZXIgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVmSWRSZXNvbHZlciA9ICh0YXJnZXQ6IG9iamVjdCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkXG5cbi8qKlxuICogVHlwZSBmb3IgdGhlIGNhbGxiYWNrIGNhbGxlZCB3aGVuIGEgcmVmZXJlbmNlIHJlc29sdmVkIHZhbHVlIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZk9uUmVzb2x2ZWRWYWx1ZUNoYW5nZTxUIGV4dGVuZHMgb2JqZWN0PiA9IChcbiAgcmVmOiBSZWY8VD4sXG4gIG5ld1ZhbHVlOiBUIHwgdW5kZWZpbmVkLFxuICBvbGRWYWx1ZTogVCB8IHVuZGVmaW5lZFxuKSA9PiB2b2lkXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEN1c3RvbVJlZjxUIGV4dGVuZHMgb2JqZWN0PihcbiAgbW9kZWxUeXBlSWQ6IHN0cmluZyxcbiAgcmVzb2x2ZXJHZW46IChyZWY6IFJlZjxUPikgPT4gUmVmUmVzb2x2ZXI8VD4sXG4gIGdldElkOiBSZWZJZFJlc29sdmVyLFxuICBvblJlc29sdmVkVmFsdWVDaGFuZ2U6IFJlZk9uUmVzb2x2ZWRWYWx1ZUNoYW5nZTxUPiB8IHVuZGVmaW5lZFxuKTogUmVmQ29uc3RydWN0b3I8VD4ge1xuICBAbW9kZWwobW9kZWxUeXBlSWQpXG4gIGNsYXNzIEN1c3RvbVJlZiBleHRlbmRzIFJlZjxUPiB7XG4gICAgcHJpdmF0ZSByZXNvbHZlcj86IFJlZlJlc29sdmVyPFQ+XG5cbiAgICByZXNvbHZlKCk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKCF0aGlzLnJlc29sdmVyKSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlckdlbih0aGlzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlcih0aGlzKVxuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZWRPbGRUYXJnZXQ6IFQgfCB1bmRlZmluZWRcblxuICAgIHByaXZhdGUgaW50ZXJuYWxGb3JjZVVwZGF0ZUJhY2tSZWZzKG5ld1RhcmdldDogVCB8IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgb2xkVGFyZ2V0ID0gdGhpcy5zYXZlZE9sZFRhcmdldFxuICAgICAgLy8gdXBkYXRlIGVhcmx5IGluIGNhc2Ugb2YgdGhyb3duIGV4Y2VwdGlvbnNcbiAgICAgIHRoaXMuc2F2ZWRPbGRUYXJnZXQgPSBuZXdUYXJnZXRcblxuICAgICAgdXBkYXRlQmFja1JlZnModGhpcywgdGhpc1JlZkNvbnN0cnVjdG9yLCBuZXdUYXJnZXQsIG9sZFRhcmdldClcbiAgICB9XG5cbiAgICBAYWN0aW9uXG4gICAgZm9yY2VVcGRhdGVCYWNrUmVmcygpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxGb3JjZVVwZGF0ZUJhY2tSZWZzKHRoaXMubWF5YmVDdXJyZW50KVxuICAgIH1cblxuICAgIG9uSW5pdCgpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBjaGFuZ2VzXG5cbiAgICAgIGxldCBzYXZlZE9sZFRhcmdldDogVCB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHNhdmVkRmlyc3RUaW1lID0gdHJ1ZVxuXG4gICAgICAvLyBhY2NvcmRpbmcgdG8gbXdlc3RyYXRlIHRoaXMgd29uJ3QgbGVhayBhcyBsb25nIGFzIHdlIGRvbid0IGtlZXAgdGhlIGRpc3Bvc2VyIGFyb3VuZFxuICAgICAgcmVhY3Rpb24oXG4gICAgICAgICgpID0+IHRoaXMubWF5YmVDdXJyZW50LFxuICAgICAgICAobmV3VGFyZ2V0KSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnRlcm5hbEZvcmNlVXBkYXRlQmFja1JlZnMobmV3VGFyZ2V0KVxuXG4gICAgICAgICAgY29uc3Qgb2xkVGFyZ2V0ID0gc2F2ZWRPbGRUYXJnZXRcbiAgICAgICAgICBjb25zdCBmaXJzdFRpbWUgPSBzYXZlZEZpcnN0VGltZVxuICAgICAgICAgIC8vIHVwZGF0ZSBlYXJseSBpbiBjYXNlIG9mIHRocm93biBleGNlcHRpb25zXG4gICAgICAgICAgc2F2ZWRPbGRUYXJnZXQgPSBuZXdUYXJnZXRcbiAgICAgICAgICBzYXZlZEZpcnN0VGltZSA9IGZhbHNlXG5cbiAgICAgICAgICBpZiAoIWZpcnN0VGltZSAmJiBvblJlc29sdmVkVmFsdWVDaGFuZ2UgJiYgbmV3VGFyZ2V0ICE9PSBvbGRUYXJnZXQpIHtcbiAgICAgICAgICAgIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSh0aGlzLCBuZXdUYXJnZXQsIG9sZFRhcmdldClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgZmlyZUltbWVkaWF0ZWx5OiB0cnVlIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCBmbiA9ICh0YXJnZXQ6IFQpID0+IHtcbiAgICBsZXQgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZCA9IHRhcmdldFxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnRJc09iamVjdCh0YXJnZXQsIFwidGFyZ2V0XCIpXG4gICAgICBpZCA9IGdldElkKHRhcmdldClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwicmVmIHRhcmdldCBvYmplY3QgbXVzdCBoYXZlIGFuIGlkIG9mIHN0cmluZyB0eXBlXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gbmV3IEN1c3RvbVJlZih7XG4gICAgICBpZCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlZlxuICB9XG4gIGZuLnJlZkNsYXNzID0gQ3VzdG9tUmVmXG5cbiAgY29uc3QgdGhpc1JlZkNvbnN0cnVjdG9yID0gZm4gYXMgYW55IGFzIFJlZkNvbnN0cnVjdG9yPFQ+XG5cbiAgcmV0dXJuIHRoaXNSZWZDb25zdHJ1Y3RvclxufVxuXG4vKipcbiAqIFVzZXMgYSBtb2RlbCBgZ2V0UmVmSWQoKWAgbWV0aG9kIHdoZW5ldmVyIHBvc3NpYmxlIHRvIGdldCBhIHJlZmVyZW5jZSBJRC5cbiAqIElmIHRoZSBtb2RlbCBkb2VzIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoYXQgbWV0aG9kIGl0IHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKiBJZiB0aGUgbW9kZWwgaGFzIGFuIGltcGxlbWVudGF0aW9uLCBidXQgdGhhdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFueXRoaW5nIG90aGVyIHRoYW5cbiAqIGEgYHN0cmluZ2AgaXQgd2lsbCB0aHJvdy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBvYmplY3QgdG8gZ2V0IHRoZSBJRCBmcm9tLlxuICogQHJldHVybnMgVGhlIHN0cmluZyBJRCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsUmVmSWQodGFyZ2V0OiBvYmplY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNNb2RlbCh0YXJnZXQpICYmIHRhcmdldC5nZXRSZWZJZCkge1xuICAgIGNvbnN0IGlkID0gdGFyZ2V0LmdldFJlZklkKClcbiAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCInZ2V0UmVmSWQoKScgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgdW5kZWZpbmVkIHdoZW4gcHJlc2VudFwiKVxuICAgIH1cbiAgICByZXR1cm4gaWRcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8vIG9uZSBjb21wdXRlZCBpZCB0cmVlIHBlciBpZCBmdW5jdGlvblxuY29uc3QgY29tcHV0ZWRJZFRyZWVzID0gbmV3IFdlYWtNYXA8XG4gIChub2RlOiBvYmplY3QpID0+IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgQ29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZTxzdHJpbmc+XG4+KClcblxuLyoqXG4gKiBSZXNvbHZlcyBhIG5vZGUgZ2l2ZW4gaXRzIElELlxuICpcbiAqIEB0eXBlcGFyYW0gVCBUYXJnZXQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gcm9vdCBOb2RlIHdoZXJlIHRvIHN0YXJ0IHRoZSBzZWFyY2guIFRoZSBzZWFyY2ggd2lsbCBiZSBkb25lIG9uIGl0IGFuZCBhbGwgaXRzIGNoaWxkcmVuLlxuICogQHBhcmFtIGlkIElEIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0gZ2V0SWQgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2V0IHRoZSBJRCBmcm9tIGFuIG9iamVjdCAoYGdldE1vZGVsUmVmSWRgIGJ5IGRlZmF1bHQpLlxuICogQHJldHVybnMgVGhlIG5vZGUgZm91bmQgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgcm9vdDogb2JqZWN0LFxuICBpZDogc3RyaW5nLFxuICBnZXRJZDogUmVmSWRSZXNvbHZlciA9IGdldE1vZGVsUmVmSWRcbik6IFQgfCB1bmRlZmluZWQge1xuICAvLyBjYWNoZS9yZXVzZSBjb21wdXRlZElkVHJlZXMgZm9yIHNhbWUgZ2V0SWQgZnVuY3Rpb25cbiAgY29uc3QgY29tcHV0ZWRJZFRyZWUgPSBnZXRPckNyZWF0ZShjb21wdXRlZElkVHJlZXMsIGdldElkLCAoKSA9PlxuICAgIGNvbXB1dGVkV2Fsa1RyZWVBZ2dyZWdhdGU8c3RyaW5nPigobm9kZSkgPT4gZ2V0SWQobm9kZSkpXG4gIClcblxuICBjb25zdCBpZE1hcCA9IGNvbXB1dGVkSWRUcmVlLndhbGsocm9vdClcbiAgcmV0dXJuIGlkTWFwID8gKGlkTWFwLmdldChpZCkgYXMgVCB8IHVuZGVmaW5lZCkgOiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gZ2V0QmFja1JlZnM8VCBleHRlbmRzIG9iamVjdD4oXG4gIHRhcmdldDogVCxcbiAgcmVmVHlwZT86IFJlZkNvbnN0cnVjdG9yPFQ+XG4pOiBPYnNlcnZhYmxlU2V0PFJlZjxUPj4ge1xuICBsZXQgYmFja1JlZnMgPSBvYmplY3RCYWNrUmVmcy5nZXQodGFyZ2V0KVxuICBpZiAoIWJhY2tSZWZzKSB7XG4gICAgYmFja1JlZnMgPSB7XG4gICAgICBhbGw6IG9ic2VydmFibGUuc2V0KHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KSxcbiAgICAgIGJ5VHlwZTogbmV3IFdlYWtNYXAoKSxcbiAgICB9XG4gICAgb2JqZWN0QmFja1JlZnMuc2V0KHRhcmdldCwgYmFja1JlZnMpXG4gIH1cblxuICBpZiAoIXJlZlR5cGUpIHtcbiAgICByZXR1cm4gYmFja1JlZnMuYWxsXG4gIH0gZWxzZSB7XG4gICAgbGV0IGJ5VHlwZSA9IGJhY2tSZWZzLmJ5VHlwZS5nZXQocmVmVHlwZSlcbiAgICBpZiAoIWJ5VHlwZSkge1xuICAgICAgYnlUeXBlID0gb2JzZXJ2YWJsZS5zZXQodW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pXG4gICAgICBiYWNrUmVmcy5ieVR5cGUuc2V0KHJlZlR5cGUsIGJ5VHlwZSlcbiAgICB9XG4gICAgcmV0dXJuIGJ5VHlwZVxuICB9XG59XG5cbi8qKlxuICogR2V0cyBhbGwgcmVmZXJlbmNlcyB0aGF0IHJlc29sdmUgdG8gYSBnaXZlbiBvYmplY3QuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJlZmVyZW5jZWQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdGFyZ2V0IE5vZGUgdGhlIHJlZmVyZW5jZXMgcG9pbnQgdG8uXG4gKiBAcGFyYW0gcmVmVHlwZSBQYXNzIGl0IHRvIGZpbHRlciBieSBvbmx5IHJlZmVyZW5jZXMgb2YgYSBnaXZlbiB0eXBlLCBvciBvbWl0IC8gcGFzcyBgdW5kZWZpbmVkYCB0byBnZXQgcmVmZXJlbmNlcyBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIHNldCB3aXRoIGFsbCByZWZlcmVuY2Ugb2JqZWN0cyB0aGF0IHBvaW50IHRvIHRoZSBnaXZlbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWZzUmVzb2x2aW5nVG88VCBleHRlbmRzIG9iamVjdD4oXG4gIHRhcmdldDogVCxcbiAgcmVmVHlwZT86IFJlZkNvbnN0cnVjdG9yPFQ+LFxuICBvcHRpb25zPzoge1xuICAgIHVwZGF0ZUFsbFJlZnNJZk5lZWRlZD86IGJvb2xlYW5cbiAgfVxuKTogT2JzZXJ2YWJsZVNldDxSZWY8VD4+IHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0YXJnZXQsIFwidGFyZ2V0XCIpXG5cbiAgaWYgKG9wdGlvbnM/LnVwZGF0ZUFsbFJlZnNJZk5lZWRlZCAmJiBpc1JlYWN0aW9uRGVsYXllZCgpKSB7XG4gICAgLy8gaW4gdGhpcyBjYXNlIHRoZSByZWZlcmVuY2UgdXBkYXRlIG1pZ2h0IGhhdmUgYmVlbiBkZWxheWVkXG4gICAgLy8gc28gd2Ugd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXBkYXRlIHRoZW1cbiAgICBjb25zdCByZWZzQ2hlY2tlZCA9IG5ldyBTZXQ8UmVmPG9iamVjdD4+KClcbiAgICBjb25zdCB1cGRhdGVSZWYgPSAocmVmOiBSZWY8YW55PikgPT4ge1xuICAgICAgaWYgKCFyZWZzQ2hlY2tlZC5oYXMocmVmKSkge1xuICAgICAgICBpZiAoIXJlZlR5cGUgfHwgcmVmIGluc3RhbmNlb2YgcmVmVHlwZS5yZWZDbGFzcykge1xuICAgICAgICAgIHJlZi5mb3JjZVVwZGF0ZUJhY2tSZWZzKClcbiAgICAgICAgfVxuICAgICAgICByZWZzQ2hlY2tlZC5hZGQocmVmKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9sZEJhY2tSZWZzID0gZ2V0QmFja1JlZnModGFyZ2V0LCByZWZUeXBlKVxuICAgIG9sZEJhY2tSZWZzLmZvckVhY2godXBkYXRlUmVmKVxuXG4gICAgY29uc3QgcmVmc0NoaWxkcmVuT2ZSb290ID0gZ2V0RGVlcENoaWxkcmVuUmVmcyhnZXREZWVwT2JqZWN0Q2hpbGRyZW4oZ2V0Um9vdCh0YXJnZXQpKSlcbiAgICBsZXQgcmVmczogU2V0PFJlZjxvYmplY3Q+PiB8IHVuZGVmaW5lZFxuICAgIGlmIChyZWZUeXBlKSB7XG4gICAgICByZWZzID0gcmVmc0NoaWxkcmVuT2ZSb290LmJ5VHlwZS5nZXQocmVmVHlwZS5yZWZDbGFzcylcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmcyA9IHJlZnNDaGlsZHJlbk9mUm9vdC5hbGxcbiAgICB9XG4gICAgcmVmcz8uZm9yRWFjaCh1cGRhdGVSZWYpXG4gIH1cblxuICByZXR1cm4gZ2V0QmFja1JlZnModGFyZ2V0LCByZWZUeXBlKVxufVxuXG5jb25zdCB1cGRhdGVCYWNrUmVmcyA9IGFjdGlvbihcbiAgXCJ1cGRhdGVCYWNrUmVmc1wiLFxuICA8VCBleHRlbmRzIG9iamVjdD4oXG4gICAgcmVmOiBSZWY8VD4sXG4gICAgcmVmQ2xhc3M6IFJlZkNvbnN0cnVjdG9yPFQ+LFxuICAgIG5ld1RhcmdldDogVCB8IHVuZGVmaW5lZCxcbiAgICBvbGRUYXJnZXQ6IFQgfCB1bmRlZmluZWRcbiAgKSA9PiB7XG4gICAgaWYgKG5ld1RhcmdldCA9PT0gb2xkVGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAob2xkVGFyZ2V0KSB7XG4gICAgICBnZXRCYWNrUmVmcyhvbGRUYXJnZXQpLmRlbGV0ZShyZWYpXG4gICAgICBnZXRCYWNrUmVmcyhvbGRUYXJnZXQsIHJlZkNsYXNzIGFzIFJlZkNvbnN0cnVjdG9yPGFueT4pLmRlbGV0ZShyZWYpXG4gICAgfVxuICAgIGlmIChuZXdUYXJnZXQpIHtcbiAgICAgIGdldEJhY2tSZWZzKG5ld1RhcmdldCkuYWRkKHJlZilcbiAgICAgIGdldEJhY2tSZWZzKG5ld1RhcmdldCwgcmVmQ2xhc3MgYXMgUmVmQ29uc3RydWN0b3I8YW55PikuYWRkKHJlZilcbiAgICB9XG4gIH1cbilcblxuZnVuY3Rpb24gaXNSZWFjdGlvbkRlbGF5ZWQoKSB7XG4gIGxldCByZWFjdGlvbkRlbGF5ZWQgPSB0cnVlXG4gIGNvbnN0IGRpc3Bvc2UgPSB3aGVuKFxuICAgICgpID0+IHRydWUsXG4gICAgKCkgPT4ge1xuICAgICAgcmVhY3Rpb25EZWxheWVkID0gZmFsc2VcbiAgICB9XG4gIClcbiAgZGlzcG9zZSgpXG4gIHJldHVybiByZWFjdGlvbkRlbGF5ZWRcbn1cblxuaW50ZXJmYWNlIERlZXBDaGlsZHJlblJlZnMge1xuICBhbGw6IFNldDxSZWY8YW55Pj5cbiAgYnlUeXBlOiBXZWFrTWFwPE1vZGVsQ2xhc3M8UmVmPGFueT4+LCBTZXQ8UmVmPGFueT4+PlxufVxuXG5jb25zdCBnZXREZWVwQ2hpbGRyZW5SZWZzID0gcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248RGVlcENoaWxkcmVuUmVmcz4oe1xuICBpbml0RGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWxsOiBuZXcgU2V0KCksXG4gICAgICBieVR5cGU6IG5ldyBXZWFrTWFwKCksXG4gICAgfVxuICB9LFxuXG4gIGFkZE5vZGUobm9kZSwgZGF0YSkge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICBkYXRhLmFsbC5hZGQobm9kZSlcbiAgICAgIGNvbnN0IHJlZnNCeVRoaXNUeXBlID0gZ2V0T3JDcmVhdGUoZGF0YS5ieVR5cGUsIG5vZGUuY29uc3RydWN0b3IsICgpID0+IG5ldyBTZXQoKSlcbiAgICAgIHJlZnNCeVRoaXNUeXBlLmFkZChub2RlKVxuICAgIH1cbiAgfSxcbn0pXG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBnZXRNb2RlbFJlZklkLFxuICBpbnRlcm5hbEN1c3RvbVJlZixcbiAgUmVmSWRSZXNvbHZlcixcbiAgUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlLFxuICBSZWZSZXNvbHZlcixcbn0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgdHlwZSB7IFJlZkNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vUmVmXCJcblxuLyoqXG4gKiBDdXN0b20gcmVmZXJlbmNlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVmT3B0aW9uczxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBNdXN0IHJldHVybiB0aGUgcmVzb2x1dGlvbiBmb3IgdGhlIGdpdmVuIHJlZmVyZW5jZSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSByZWYgUmVmZXJlbmNlIG9iamVjdC5cbiAgICogQHJldHVybnMgVGhlIHJlc29sdmVkIG9iamVjdCBvciB1bmRlZmluZWQgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkLlxuICAgKi9cbiAgcmVzb2x2ZTogUmVmUmVzb2x2ZXI8VD5cblxuICAvKipcbiAgICogTXVzdCByZXR1cm4gdGhlIElEIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHRhcmdldCBvYmplY3QsIG9yIGB1bmRlZmluZWRgIGlmIGl0IGhhcyBubyBJRC5cbiAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgdHJ5IHRvIGdldCB0aGUgcmVmZXJlbmNlIGlkIGZyb20gdGhlIG1vZGVsIGBnZXRSZWZJZCgpYCBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIGdldElkPzogUmVmSWRSZXNvbHZlclxuXG4gIC8qKlxuICAgKiBXaGF0IHNob3VsZCBoYXBwZW4gd2hlbiB0aGUgcmVzb2x2ZWQgdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHJlZiBSZWZlcmVuY2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHJlc29sdmVkIHZhbHVlLlxuICAgKiBAcGFyYW0gb2xkVmFsdWUgT2xkIHJlc29sdmVkIHZhbHVlLlxuICAgKi9cbiAgb25SZXNvbHZlZFZhbHVlQ2hhbmdlPzogUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlPFQ+XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSByZWYgdG8gYW4gb2JqZWN0LCB3aGljaCBpbiBpdHMgc25hcHNob3QgZm9ybSBoYXMgYW4gaWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFR5cGVJZCBVbmlxdWUgbW9kZWwgdHlwZSBpZC5cbiAqIEBwYXJhbSBvcHRpb25zIEN1c3RvbSByZWZlcmVuY2Ugb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgeW91IHRvIGNvbnN0cnVjdCB0aGF0IHR5cGUgb2YgY3VzdG9tIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGN1c3RvbVJlZjogPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBtb2RlbFR5cGVJZDogc3RyaW5nLFxuICBvcHRpb25zOiBDdXN0b21SZWZPcHRpb25zPFQ+XG4pID0+IFJlZkNvbnN0cnVjdG9yPFQ+ID0gYWN0aW9uKFwiY3VzdG9tUmVmXCIsIChtb2RlbFR5cGVJZCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBnZXRJZCA9IG9wdGlvbnMuZ2V0SWQgPz8gZ2V0TW9kZWxSZWZJZFxuXG4gIHJldHVybiBpbnRlcm5hbEN1c3RvbVJlZihtb2RlbFR5cGVJZCwgKCkgPT4gb3B0aW9ucy5yZXNvbHZlLCBnZXRJZCwgb3B0aW9ucy5vblJlc29sdmVkVmFsdWVDaGFuZ2UpXG59KVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFJvb3QgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHtcbiAgZ2V0TW9kZWxSZWZJZCxcbiAgaW50ZXJuYWxDdXN0b21SZWYsXG4gIFJlZklkUmVzb2x2ZXIsXG4gIFJlZk9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSxcbiAgUmVmUmVzb2x2ZXIsXG4gIHJlc29sdmVJZCxcbn0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgdHlwZSB7IFJlZiwgUmVmQ29uc3RydWN0b3IgfSBmcm9tIFwiLi9SZWZcIlxuXG4vKipcbiAqIEN1c3RvbSByZWZlcmVuY2Ugb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb290UmVmT3B0aW9uczxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBNdXN0IHJldHVybiB0aGUgSUQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdCwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgaGFzIG5vIElELlxuICAgKiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCB0cnkgdG8gZ2V0IHRoZSByZWZlcmVuY2UgaWQgZnJvbSB0aGUgbW9kZWwgYGdldFJlZklkKClgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCBUYXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgZ2V0SWQ/OiBSZWZJZFJlc29sdmVyXG5cbiAgLyoqXG4gICAqIFdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIHRoZSByZXNvbHZlZCB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVmIFJlZmVyZW5jZSBvYmplY3QuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBOZXcgcmVzb2x2ZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSBPbGQgcmVzb2x2ZWQgdmFsdWUuXG4gICAqL1xuICBvblJlc29sdmVkVmFsdWVDaGFuZ2U/OiBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2U8VD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm9vdCByZWYgdG8gYW4gb2JqZWN0LCB3aGljaCBpbiBpdHMgc25hcHNob3QgZm9ybSBoYXMgYW4gaWQuXG4gKiBBIHJvb3QgcmVmIHdpbGwgb25seSBiZSBhYmxlIHRvIHJlc29sdmUgcmVmZXJlbmNlcyBhcyBsb25nIGFzIGJvdGggdGhlIFJlZlxuICogYW5kIHRoZSByZWZlcmVuY2VkIG9iamVjdCBzaGFyZSBhIGNvbW1vbiByb290LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBUYXJnZXQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxUeXBlSWQgVW5pcXVlIG1vZGVsIHR5cGUgaWQuXG4gKiBAcGFyYW0gW29wdGlvbnNdIFJvb3QgcmVmZXJlbmNlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byBjb25zdHJ1Y3QgdGhhdCB0eXBlIG9mIHJvb3QgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgY29uc3Qgcm9vdFJlZjogPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBtb2RlbFR5cGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogUm9vdFJlZk9wdGlvbnM8VD4gfCB1bmRlZmluZWRcbikgPT4gUmVmQ29uc3RydWN0b3I8VD4gPSBhY3Rpb24oXG4gIFwicm9vdFJlZlwiLFxuICA8VCBleHRlbmRzIG9iamVjdD4obW9kZWxUeXBlSWQ6IHN0cmluZywgb3B0aW9ucz86IFJvb3RSZWZPcHRpb25zPFQ+KTogUmVmQ29uc3RydWN0b3I8VD4gPT4ge1xuICAgIGNvbnN0IGdldElkID0gb3B0aW9ucz8uZ2V0SWQgPz8gZ2V0TW9kZWxSZWZJZFxuICAgIGNvbnN0IG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSA9IG9wdGlvbnM/Lm9uUmVzb2x2ZWRWYWx1ZUNoYW5nZVxuXG4gICAgY29uc3QgcmVzb2x2ZXJHZW4gPSAocmVmOiBSZWY8VD4pOiBSZWZSZXNvbHZlcjxUPiA9PiB7XG4gICAgICBsZXQgY2FjaGVkVGFyZ2V0OiBUIHwgdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZlJvb3QgPSBmYXN0R2V0Um9vdChyZWYpXG5cbiAgICAgICAgaWYgKGlzUmVmUm9vdENhY2hlZFRhcmdldE9rKHJlZiwgcmVmUm9vdCwgY2FjaGVkVGFyZ2V0LCBnZXRJZCkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGVkVGFyZ2V0XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIG5vdCBmb3VuZCwgZXZlcnl0aW1lIGEgY2hpbGQgaXMgYWRkZWQvcmVtb3ZlZCBvciBpdHMgaWQgY2hhbmdlcyB3ZSB3aWxsIHBlcmZvcm0gYW5vdGhlciBzZWFyY2hcbiAgICAgICAgLy8gdGhpcyBzZWFyY2ggaXMgb25seSBkb25lIG9uY2UgZm9yIGV2ZXJ5IGRpc3RpbmN0IGdldElkIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IG5ld1RhcmdldCA9IHJlc29sdmVJZDxUPihyZWZSb290LCByZWYuaWQsIGdldElkKVxuICAgICAgICBpZiAobmV3VGFyZ2V0KSB7XG4gICAgICAgICAgY2FjaGVkVGFyZ2V0ID0gbmV3VGFyZ2V0XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1RhcmdldFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlcm5hbEN1c3RvbVJlZihtb2RlbFR5cGVJZCwgcmVzb2x2ZXJHZW4sIGdldElkLCBvblJlc29sdmVkVmFsdWVDaGFuZ2UpXG4gIH1cbilcblxuZnVuY3Rpb24gaXNSZWZSb290Q2FjaGVkVGFyZ2V0T2s8VCBleHRlbmRzIG9iamVjdD4oXG4gIHJlZjogUmVmPFQ+LFxuICByZWZSb290OiBvYmplY3QsXG4gIGNhY2hlZFRhcmdldDogVCB8IHVuZGVmaW5lZCxcbiAgZ2V0SWQ6IFJlZklkUmVzb2x2ZXJcbik6IGNhY2hlZFRhcmdldCBpcyBUIHtcbiAgaWYgKCFjYWNoZWRUYXJnZXQpIHJldHVybiBmYWxzZVxuICBpZiAocmVmLmlkICE9PSBnZXRJZChjYWNoZWRUYXJnZXQpKSByZXR1cm4gZmFsc2VcbiAgaWYgKHJlZlJvb3QgIT09IGZhc3RHZXRSb290KGNhY2hlZFRhcmdldCkpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiaW1wb3J0IHsgYWRkU3RhbmRhbG9uZUFjdGlvbiB9IGZyb20gXCIuL2FjdGlvbnNcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFuZGFsb25lIGFjdGlvbi4gQSBzdGFuZGFsb25lIGFjdGlvbiBtdXN0IGFsd2F5cyB0YWtlIGFuIGV4aXN0aW5nIHRyZWUgbm9kZSBhcyBmaXJzdCBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBVbmlxdWUgYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0gZm4gRnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZnVuY3Rpb24gYXMgYW4gc3RhbmRhbG9uZSBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFsb25lQWN0aW9uPEZOIGV4dGVuZHMgKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55PihcbiAgYWN0aW9uTmFtZTogc3RyaW5nLFxuICBmbjogRk5cbik6IEZOIHtcbiAgcmV0dXJuIGFkZFN0YW5kYWxvbmVBY3Rpb24oYWN0aW9uTmFtZSwgZm4sIGZhbHNlKSBhcyB1bmtub3duIGFzIEZOXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YW5kYWxvbmUgZmxvdy4gQSBzdGFuZGFsb25lIGZsb3cgbXVzdCBhbHdheXMgdGFrZSBhbiBleGlzdGluZyB0cmVlIG5vZGUgYXMgZmlyc3QgYXJndW1lbnQuXG4gKlxuICogQHBhcmFtIGFjdGlvbk5hbWUgVW5pcXVlIGFjdGlvbiBuYW1lLlxuICogQHBhcmFtIGZuIEZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGZ1bmN0aW9uIGFzIGFuIHN0YW5kYWxvbmUgZmxvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW5kYWxvbmVGbG93PFxuICBGTiBleHRlbmRzICh0YXJnZXQ6IGFueSwgLi4uYXJnczogYW55W10pID0+IEdlbmVyYXRvcjxhbnksIGFueSwgYW55PlxuPihhY3Rpb25OYW1lOiBzdHJpbmcsIGZuOiBGTik6IEZOIHtcbiAgcmV0dXJuIGFkZFN0YW5kYWxvbmVBY3Rpb24oYWN0aW9uTmFtZSwgZm4sIHRydWUpIGFzIHVua25vd24gYXMgRk5cbn1cbiIsImltcG9ydCB7IHJlbW92ZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgdG9UcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrXCJcbmltcG9ydCB7IG5hbWVzcGFjZSBhcyBucyB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBzdGFuZGFsb25lQWN0aW9uIH0gZnJvbSBcIi4vc3RhbmRhbG9uZUFjdGlvbnNcIlxuXG5mdW5jdGlvbiBfc3BsaWNlKGFycmF5OiBhbnlbXSwgc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ/OiBudW1iZXIpOiBhbnlbXVxuZnVuY3Rpb24gX3NwbGljZShhcnJheTogYW55W10sIHN0YXJ0OiBudW1iZXIsIGRlbGV0ZUNvdW50OiBudW1iZXIsIC4uLml0ZW1zOiBhbnlbXSk6IGFueVtdXG5mdW5jdGlvbiBfc3BsaWNlKGFycmF5OiBhbnlbXSwgLi4uYXJnczogYW55W10pOiBhbnlbXSB7XG4gIHJldHVybiAoYXJyYXkuc3BsaWNlIGFzIGFueSkoLi4uYXJncylcbn1cblxuY29uc3QgbmFtZXNwYWNlID0gYCR7bnN9L2FycmF5QWN0aW9uc2BcblxuZXhwb3J0IGNvbnN0IGFycmF5QWN0aW9ucyA9IHtcbiAgc2V0OiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnNldGAsIDxUPihhcnJheTogVFtdLCBpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCA9PiB7XG4gICAgc2V0KGFycmF5LCBpbmRleCwgdmFsdWUpXG4gIH0pLFxuXG4gIGRlbGV0ZTogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9OjpkZWxldGVgLCA8VD4oYXJyYXk6IFRbXSwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiByZW1vdmUoYXJyYXksIFwiXCIgKyBpbmRleClcbiAgfSksXG5cbiAgc2V0TGVuZ3RoOiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnNldExlbmd0aGAsIDxUPihhcnJheTogVFtdLCBsZW5ndGg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGFycmF5Lmxlbmd0aCA9IGxlbmd0aFxuICB9KSxcblxuICBjb25jYXQ6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6Y29uY2F0YCxcbiAgICA8VD4oYXJyYXk6IFRbXSwgLi4uaXRlbXM6IENvbmNhdEFycmF5PFQ+W10pOiBUW10gPT4ge1xuICAgICAgcmV0dXJuIGFycmF5LmNvbmNhdCguLi5pdGVtcylcbiAgICB9XG4gICksXG5cbiAgY29weVdpdGhpbjogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9Ojpjb3B5V2l0aGluYCxcbiAgICA8VD4oYXJyYXk6IFRbXSwgdGFyZ2V0OiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IFRbXSA9PiB7XG4gICAgICByZXR1cm4gYXJyYXkuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQpXG4gICAgfVxuICApLFxuXG4gIGZpbGw6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6ZmlsbGAsXG4gICAgPFQ+KGFycmF5OiBUW10sIHZhbHVlOiBULCBzdGFydD86IG51bWJlciB8IHVuZGVmaW5lZCwgZW5kPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogVFtdID0+IHtcbiAgICAgIHJldHVybiBhcnJheS5maWxsKHZhbHVlLCBzdGFydCwgZW5kKVxuICAgIH1cbiAgKSxcblxuICBwb3A6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6cG9wYCwgPFQ+KGFycmF5OiBUW10pOiBUIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gYXJyYXkucG9wKClcbiAgfSksXG5cbiAgcHVzaDogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9OjpwdXNoYCwgPFQ+KGFycmF5OiBUW10sIC4uLml0ZW1zOiBUW10pOiBudW1iZXIgPT4ge1xuICAgIHJldHVybiBhcnJheS5wdXNoKC4uLml0ZW1zKVxuICB9KSxcblxuICByZXZlcnNlOiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnJldmVyc2VgLCA8VD4oYXJyYXk6IFRbXSk6IFRbXSA9PiB7XG4gICAgcmV0dXJuIGFycmF5LnJldmVyc2UoKVxuICB9KSxcblxuICBzaGlmdDogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9OjpzaGlmdGAsIDxUPihhcnJheTogVFtdKTogVCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgcmV0dXJuIGFycmF5LnNoaWZ0KClcbiAgfSksXG5cbiAgc2xpY2U6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6c2xpY2VgLFxuICAgIDxUPihhcnJheTogVFtdLCBzdGFydD86IG51bWJlciB8IHVuZGVmaW5lZCwgZW5kPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogVFtdID0+IHtcbiAgICAgIHJldHVybiBhcnJheS5zbGljZShzdGFydCwgZW5kKVxuICAgIH1cbiAgKSxcblxuICBzb3J0OiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OnNvcnRgLFxuICAgIDxUPihhcnJheTogVFtdLCBjb21wYXJlRm4/OiAoKGE6IFQsIGI6IFQpID0+IG51bWJlcikgfCB1bmRlZmluZWQpOiBUW10gPT4ge1xuICAgICAgcmV0dXJuIGFycmF5LnNvcnQoY29tcGFyZUZuKVxuICAgIH1cbiAgKSxcblxuICBzcGxpY2U6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6c3BsaWNlYCxcbiAgICBfc3BsaWNlIGFzXG4gICAgICB8ICg8VD4oYXJyYXk6IFRbXSwgc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ/OiBudW1iZXIpID0+IFRbXSlcbiAgICAgIHwgKDxUPihhcnJheTogVFtdLCBzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudDogbnVtYmVyLCAuLi5pdGVtczogVFtdKSA9PiBUW10pXG4gICksXG5cbiAgdW5zaGlmdDogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9Ojp1bnNoaWZ0YCwgPFQ+KGFycmF5OiBUW10sIC4uLml0ZW1zOiBUW10pOiBudW1iZXIgPT4ge1xuICAgIHJldHVybiBhcnJheS51bnNoaWZ0KC4uLml0ZW1zKVxuICB9KSxcblxuICBzd2FwOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OnN3YXBgLFxuICAgIDxUPihhcnJheTogVFtdLCBpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgIGlmIChpbmRleDEgPCAwIHx8IGluZGV4MiA8IDAgfHwgaW5kZXgxID49IGFycmF5Lmxlbmd0aCB8fCBpbmRleDIgPj0gYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4MiA8IGluZGV4MSkge1xuICAgICAgICA7W2luZGV4MSwgaW5kZXgyXSA9IFtpbmRleDIsIGluZGV4MV1cbiAgICAgIH1cbiAgICAgIC8vIHNpbmNlIGEgc2FtZSBub2RlIGNhbm5vdCBiZSBpbiB0d28gcGxhY2VzIGF0IG9uY2Ugd2Ugd2lsbCByZW1vdmVcbiAgICAgIC8vIGJvdGggdGhlbiByZWluc2VydCB0aGVtXG4gICAgICBjb25zdCBbdjFdID0gYXJyYXkuc3BsaWNlKGluZGV4MSwgMSlcbiAgICAgIGNvbnN0IFt2Ml0gPSBhcnJheS5zcGxpY2UoaW5kZXgyIC0gMSwgMSlcbiAgICAgIGFycmF5LnNwbGljZShpbmRleDEsIDAsIHYyKVxuICAgICAgYXJyYXkuc3BsaWNlKGluZGV4MiwgMCwgdjEpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgKSxcblxuICBjcmVhdGU6IDxUPihkYXRhOiBUW10pOiBUW10gPT4gdG9UcmVlTm9kZShkYXRhKSxcbn1cbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgcmVtb3ZlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyB0b1RyZWVOb2RlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIG5hbWVzcGFjZSBhcyBucyB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBzdGFuZGFsb25lQWN0aW9uIH0gZnJvbSBcIi4vc3RhbmRhbG9uZUFjdGlvbnNcIlxuXG5jb25zdCBuYW1lc3BhY2UgPSBgJHtuc30vb2JqZWN0QWN0aW9uc2BcblxuZXhwb3J0IGNvbnN0IG9iamVjdEFjdGlvbnMgPSB7XG4gIHNldDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpzZXRgLFxuICAgIDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4odGFyZ2V0OiBULCBrZXk6IEssIHZhbHVlOiBUW0tdKTogdm9pZCA9PiB7XG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKHRhcmdldCkpIHtcbiAgICAgICAgc2V0KHRhcmdldCwga2V5LCB2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICksXG5cbiAgYXNzaWduOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmFzc2lnbmAsXG4gICAgPFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogVCwgcGFydGlhbE9iamVjdDogUGFydGlhbDxUPik6IHZvaWQgPT4ge1xuICAgICAgYXNzZXJ0SXNPYmplY3QocGFydGlhbE9iamVjdCwgXCJwYXJ0aWFsT2JqZWN0XCIpXG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFydGlhbE9iamVjdClcblxuICAgICAgaWYgKGlzT2JzZXJ2YWJsZSh0YXJnZXQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICBzZXQodGFyZ2V0LCBrZXksIChwYXJ0aWFsT2JqZWN0IGFzIGFueSlba2V5XSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgIDsodGFyZ2V0IGFzIGFueSlba2V5XSA9IChwYXJ0aWFsT2JqZWN0IGFzIGFueSlba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICApLFxuXG4gIGRlbGV0ZTogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpkZWxldGVgLFxuICAgIDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4odGFyZ2V0OiBULCBrZXk6IEspOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiByZW1vdmUodGFyZ2V0LCBrZXkgYXMgYW55KVxuICAgIH1cbiAgKSxcblxuICBjYWxsOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmNhbGxgLFxuICAgIDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgICB0YXJnZXQ6IFQsXG4gICAgICBtZXRob2ROYW1lOiBLLFxuICAgICAgLi4uYXJnczogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gUGFyYW1ldGVyczxUW0tdPiA6IG5ldmVyXG4gICAgKTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gUmV0dXJuVHlwZTxUW0tdPiA6IG5ldmVyID0+IHtcbiAgICAgIHJldHVybiAodGFyZ2V0IGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICB9XG4gICksXG5cbiAgY3JlYXRlOiA8VCBleHRlbmRzIG9iamVjdD4oZGF0YTogVCk6IFQgPT4gdG9UcmVlTm9kZShkYXRhKSxcbn1cbiIsIi8qKlxuICogQ3JlYXRlcyBhIHRhZyBkYXRhIGFjY2Vzc29yIGZvciBhIHRhcmdldCBvYmplY3Qgb2YgYSBjZXJ0YWluIHR5cGUuXG4gKiBUYWcgZGF0YSB3aWxsIGJlIGxhenkgY3JlYXRlZCBvbiBhY2Nlc3MgYW5kIHJldXNlZCBmb3IgdGhlIHNhbWUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRhcmdldCBUYXJnZXQgdHlwZS5cbiAqIEB0eXBlcGFyYW0gVGFnRGF0YSBUYWcgZGF0YSB0eXBlLlxuICogQHBhcmFtIHRhZ0RhdGFDb25zdHJ1Y3RvciBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHRoZSB0YWdcbiAqIGZvciBhIGdpdmVuIG9iamVjdCBpcyByZXF1ZXN0ZWQuXG4gKiBAcmV0dXJucyBUaGUgdGFnIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXJnZXQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnPFRhcmdldCBleHRlbmRzIG9iamVjdCwgVGFnRGF0YT4oXG4gIHRhZ0RhdGFDb25zdHJ1Y3RvcjogKHRhcmdldDogVGFyZ2V0KSA9PiBUYWdEYXRhXG4pOiB7XG4gIGZvcih0YXJnZXQ6IFRhcmdldCk6IFRhZ0RhdGFcbn0ge1xuICBjb25zdCBtYXAgPSBuZXcgV2Vha01hcDxUYXJnZXQsIFRhZ0RhdGE+KClcblxuICByZXR1cm4ge1xuICAgIGZvcih0YXJnZXQpOiBUYWdEYXRhIHtcbiAgICAgIGlmICghbWFwLmhhcyh0YXJnZXQpKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0YWdEYXRhQ29uc3RydWN0b3IodGFyZ2V0KVxuICAgICAgICBtYXAuc2V0KHRhcmdldCwgZGF0YSlcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBtYXAuZ2V0KHRhcmdldCkhXG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgYWN0aW9uLFxuICBJTWFwV2lsbENoYW5nZSxcbiAgaW50ZXJjZXB0LFxuICBJT2JqZWN0RGlkQ2hhbmdlLFxuICBJT2JzZXJ2YWJsZUFycmF5LFxuICBpc09ic2VydmFibGVBcnJheSxcbiAgaXNPYnNlcnZhYmxlT2JqZWN0LFxuICBvYnNlcnZhYmxlLFxuICBPYnNlcnZhYmxlTWFwLFxuICBvYnNlcnZlLFxuICByZW1vdmUsXG4gIHNldCxcbn0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgYXNzZXJ0SXNNYXAsXG4gIGFzc2VydElzT2JzZXJ2YWJsZUFycmF5LFxuICBhc3NlcnRJc09ic2VydmFibGVPYmplY3QsXG4gIGZhaWx1cmUsXG4gIGdldE1vYnhWZXJzaW9uLFxuICBpbkRldk1vZGUsXG4gIGlzQXJyYXksXG59IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyB0YWcgfSBmcm9tIFwiLi4vdXRpbHMvdGFnXCJcblxuY29uc3Qgb2JzZXJ2YWJsZU1hcEJhY2tlZEJ5T2JzZXJ2YWJsZU9iamVjdCA9IGFjdGlvbihcbiAgPFQ+KFxuICAgIG9iajogb2JqZWN0XG4gICk6IE9ic2VydmFibGVNYXA8c3RyaW5nLCBUPiAmIHtcbiAgICBkYXRhT2JqZWN0OiB0eXBlb2Ygb2JqXG4gIH0gPT4ge1xuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgaWYgKCFpc09ic2VydmFibGVPYmplY3Qob2JqKSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwiYXNzZXJ0aW9uIGZhaWxlZDogZXhwZWN0ZWQgYW4gb2JzZXJ2YWJsZSBvYmplY3RcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSBvYnNlcnZhYmxlLm1hcCgpXG4gICAgOyhtYXAgYXMgYW55KS5kYXRhT2JqZWN0ID0gb2JqXG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgIG1hcC5zZXQoaywgKG9iaiBhcyBhbnkpW2tdKVxuICAgIH1cblxuICAgIGxldCBtYXBBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgbGV0IG9iamVjdEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcblxuICAgIC8vIHdoZW4gdGhlIG9iamVjdCBjaGFuZ2VzIHRoZSBtYXAgY2hhbmdlc1xuICAgIG9ic2VydmUoXG4gICAgICBvYmosXG4gICAgICBhY3Rpb24oKGNoYW5nZTogSU9iamVjdERpZENoYW5nZSkgPT4ge1xuICAgICAgICBpZiAobWFwQWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG9iamVjdEFscmVhZHlDaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICAgIG1hcC5zZXQoY2hhbmdlLm5hbWUsIGNoYW5nZS5uZXdWYWx1ZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICAgIG1hcC5kZWxldGUoY2hhbmdlLm5hbWUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIG9iamVjdEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICAvLyB3aGVuIHRoZSBtYXAgY2hhbmdlcyBhbHNvIGNoYW5nZSB0aGUgb2JqZWN0XG4gICAgaW50ZXJjZXB0KFxuICAgICAgbWFwLFxuICAgICAgYWN0aW9uKChjaGFuZ2U6IElNYXBXaWxsQ2hhbmdlPHN0cmluZywgVD4pID0+IHtcbiAgICAgICAgaWYgKG1hcEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmplY3RBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcEFscmVhZHlDaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICAgIHNldChvYmosIGNoYW5nZS5uYW1lLCBjaGFuZ2UubmV3VmFsdWUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJkZWxldGVcIjoge1xuICAgICAgICAgICAgICByZW1vdmUob2JqLCBjaGFuZ2UubmFtZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2hhbmdlXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgbWFwQWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIHJldHVybiBtYXAgYXMgYW55XG4gIH1cbilcblxuY29uc3Qgb2JzZXJ2YWJsZU1hcEJhY2tlZEJ5T2JzZXJ2YWJsZUFycmF5ID0gYWN0aW9uKFxuICA8VD4oXG4gICAgYXJyYXk6IElPYnNlcnZhYmxlQXJyYXk8W3N0cmluZywgVF0+XG4gICk6IE9ic2VydmFibGVNYXA8c3RyaW5nLCBUPiAmIHsgZGF0YU9iamVjdDogdHlwZW9mIGFycmF5IH0gPT4ge1xuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgaWYgKCFpc09ic2VydmFibGVBcnJheShhcnJheSkpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcImFzc2VydGlvbiBmYWlsZWQ6IGV4cGVjdGVkIGFuIG9ic2VydmFibGUgYXJyYXlcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbWFwOiBPYnNlcnZhYmxlTWFwPHN0cmluZywgVD5cbiAgICBpZiAoZ2V0TW9ieFZlcnNpb24oKSA+PSA2KSB7XG4gICAgICBtYXAgPSBvYnNlcnZhYmxlLm1hcChhcnJheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwID0gb2JzZXJ2YWJsZS5tYXAoKVxuICAgICAgYXJyYXkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgIG1hcC5zZXQoaywgdilcbiAgICAgIH0pXG4gICAgfVxuICAgIDsobWFwIGFzIGFueSkuZGF0YU9iamVjdCA9IGFycmF5XG5cbiAgICBpZiAobWFwLnNpemUgIT09IGFycmF5Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImFycmF5cyBiYWNraW5nIGEgbWFwIGNhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBrZXlzXCIpXG4gICAgfVxuXG4gICAgbGV0IG1hcEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG5cbiAgICAvLyBmb3Igc3BlZWQgcmVhc29ucyB3ZSB3aWxsIGp1c3QgYXNzdW1lIGRpc3RpbmN0IHZhbHVlcyBhcmUgb25seSBvbmNlIGluIHRoZSBhcnJheVxuICAgIC8vIGFsc28gd2UgYXNzdW1lIHR1cGxlcyB0aGVtc2VsdmVzIGFyZSBpbW11dGFibGVcblxuICAgIC8vIHdoZW4gdGhlIGFycmF5IGNoYW5nZXMgdGhlIG1hcCBjaGFuZ2VzXG4gICAgb2JzZXJ2ZShcbiAgICAgIGFycmF5LFxuICAgICAgYWN0aW9uKChjaGFuZ2U6IGFueSAvKklBcnJheURpZENoYW5nZTxbc3RyaW5nLCBUXT4qLykgPT4ge1xuICAgICAgICBpZiAobWFwQWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGFycmF5QWxyZWFkeUNoYW5nZWQgPSB0cnVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInNwbGljZVwiOiB7XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkID0gY2hhbmdlLnJlbW92ZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW92ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIG1hcC5kZWxldGUocmVtb3ZlZFtpXVswXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBjaGFuZ2UuYWRkZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBtYXAuc2V0KGFkZGVkW2ldWzBdLCBhZGRlZFtpXVsxXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgbWFwLmRlbGV0ZShjaGFuZ2Uub2xkVmFsdWVbMF0pXG4gICAgICAgICAgICAgIG1hcC5zZXQoY2hhbmdlLm5ld1ZhbHVlWzBdLCBjaGFuZ2UubmV3VmFsdWVbMV0pXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGFycmF5QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIC8vIHdoZW4gdGhlIG1hcCBjaGFuZ2VzIGFsc28gY2hhbmdlIHRoZSBhcnJheVxuICAgIGludGVyY2VwdChcbiAgICAgIG1hcCxcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBJTWFwV2lsbENoYW5nZTxzdHJpbmcsIFQ+KSA9PiB7XG4gICAgICAgIGlmIChtYXBBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyYXlBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcEFscmVhZHlDaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIHdob2xlIHR1cGxlIHRvIGtlZXAgdHVwbGUgaW1tdXRhYmlsaXR5XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBhcnJheS5maW5kSW5kZXgoKGkpID0+IGlbMF0gPT09IGNoYW5nZS5uYW1lKVxuICAgICAgICAgICAgICBhcnJheVtpXSA9IFtjaGFuZ2UubmFtZSwgY2hhbmdlLm5ld1ZhbHVlIV1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgICAgIGFycmF5LnB1c2goW2NoYW5nZS5uYW1lLCBjaGFuZ2UubmV3VmFsdWUhXSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBhcnJheS5maW5kSW5kZXgoKGkpID0+IGlbMF0gPT09IGNoYW5nZS5uYW1lKVxuICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2hhbmdlXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgbWFwQWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIHJldHVybiBtYXAgYXMgYW55XG4gIH1cbilcblxuY29uc3QgYXNNYXBUYWcgPSB0YWcoKG9iak9yQXJyYXk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxbc3RyaW5nLCBhbnldPikgPT4ge1xuICBpZiAoaXNBcnJheShvYmpPckFycmF5KSkge1xuICAgIGFzc2VydElzT2JzZXJ2YWJsZUFycmF5KG9iak9yQXJyYXksIFwib2JqT3JBcnJheVwiKVxuICAgIHJldHVybiBvYnNlcnZhYmxlTWFwQmFja2VkQnlPYnNlcnZhYmxlQXJyYXkob2JqT3JBcnJheSlcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnRJc09ic2VydmFibGVPYmplY3Qob2JqT3JBcnJheSwgXCJvYmpPckFycmF5XCIpXG4gICAgcmV0dXJuIG9ic2VydmFibGVNYXBCYWNrZWRCeU9ic2VydmFibGVPYmplY3Qob2JqT3JBcnJheSlcbiAgfVxufSlcblxuLyoqXG4gKiBXcmFwcyBhbiBvYnNlcnZhYmxlIG9iamVjdCBvciBhIHR1cGxlIGFycmF5IHRvIG9mZmVyIGEgbWFwIGxpa2UgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBhcnJheSBBcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzTWFwPEssIFY+KFxuICBhcnJheTogQXJyYXk8W0ssIFZdPlxuKTogT2JzZXJ2YWJsZU1hcDxLLCBWPiAmIHsgZGF0YU9iamVjdDogQXJyYXk8W0ssIFZdPiB9XG5cbi8qKlxuICogV3JhcHMgYW4gb2JzZXJ2YWJsZSBvYmplY3Qgb3IgYSB0dXBsZSBhcnJheSB0byBvZmZlciBhIG1hcCBsaWtlIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0IE9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzTWFwPFQ+KFxuICBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIFQ+XG4pOiBPYnNlcnZhYmxlTWFwPHN0cmluZywgVD4gJiB7IGRhdGFPYmplY3Q6IFJlY29yZDxzdHJpbmcsIFQ+IH1cblxuLyoqXG4gKiBXcmFwcyBhbiBvYnNlcnZhYmxlIG9iamVjdCBvciBhIHR1cGxlIGFycmF5IHRvIG9mZmVyIGEgbWFwIGxpa2UgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmpPckFycmF5IE9iamVjdCBvciBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzTWFwKFxuICBvYmpPckFycmF5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IEFycmF5PFt1bmtub3duLCB1bmtub3duXT5cbik6IE9ic2VydmFibGVNYXA8dW5rbm93biwgdW5rbm93bj4gJiB7IGRhdGFPYmplY3Q6IHR5cGVvZiBvYmpPckFycmF5IH0ge1xuICByZXR1cm4gYXNNYXBUYWcuZm9yKG9iak9yQXJyYXkpIGFzIGFueVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbWFwIHRvIGFuIG9iamVjdC4gSWYgdGhlIG1hcCBpcyBhIGNvbGxlY3Rpb24gd3JhcHBlciBpdCB3aWxsIHJldHVybiB0aGUgYmFja2VkIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbWFwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb09iamVjdDxUPihtYXA6IE1hcDxzdHJpbmcsIFQ+KTogUmVjb3JkPHN0cmluZywgVD4ge1xuICBhc3NlcnRJc01hcChtYXAsIFwibWFwXCIpXG5cbiAgY29uc3QgZGF0YU9iamVjdCA9IChtYXAgYXMgYW55KS5kYXRhT2JqZWN0XG4gIGlmIChkYXRhT2JqZWN0ICYmICFpc0FycmF5KGRhdGFPYmplY3QpKSB7XG4gICAgcmV0dXJuIGRhdGFPYmplY3RcbiAgfVxuXG4gIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgVD4gPSB7fVxuICBmb3IgKGNvbnN0IGsgb2YgbWFwLmtleXMoKSkge1xuICAgIG9ialtrXSA9IG1hcC5nZXQoaykhXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBtYXAgdG8gYW4gYXJyYXkuIElmIHRoZSBtYXAgaXMgYSBjb2xsZWN0aW9uIHdyYXBwZXIgaXQgd2lsbCByZXR1cm4gdGhlIGJhY2tlZCBhcnJheS5cbiAqXG4gKiBAcGFyYW0gbWFwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb0FycmF5PEssIFY+KG1hcDogTWFwPEssIFY+KTogQXJyYXk8W0ssIFZdPiB7XG4gIGFzc2VydElzTWFwKG1hcCwgXCJtYXBcIilcblxuICBjb25zdCBkYXRhT2JqZWN0ID0gKG1hcCBhcyBhbnkpLmRhdGFPYmplY3RcbiAgaWYgKGRhdGFPYmplY3QgJiYgaXNBcnJheShkYXRhT2JqZWN0KSkge1xuICAgIHJldHVybiBkYXRhT2JqZWN0XG4gIH1cblxuICBjb25zdCBhcnI6IFtLLCBWXVtdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIG1hcC5rZXlzKCkpIHtcbiAgICBhcnIucHVzaChbaywgbWFwLmdldChrKSFdKVxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBhc01hcCB9IGZyb20gXCIuLi93cmFwcGVycy9hc01hcFwiXG5cbmNvbnN0IF9vYmplY3RUb01hcFRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBNYXA8c3RyaW5nLCB1bmtub3duPj4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWU6IG9iaiwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogY2FjaGVkTWFwIH0pIHtcbiAgICByZXR1cm4gY2FjaGVkTWFwID8/IGFzTWFwKG9iailcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWU6IG1hcCB9KSB7XG4gICAgLy8gZG8gbm90IGNhY2hlIG1hcCA8LT4gb2JqIHJlbGF0aW9uc2hpcFxuXG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgZm9yIChjb25zdCBrIG9mIG1hcC5rZXlzKCkpIHtcbiAgICAgIG9ialtrXSA9IG1hcC5nZXQoaykhXG4gICAgfVxuXG4gICAgcmV0dXJuIG9ialxuICB9LFxufVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0VG9NYXBUcmFuc2Zvcm0gPSA8VD4oKSA9PlxuICBfb2JqZWN0VG9NYXBUcmFuc2Zvcm0gYXMgTW9kZWxQcm9wVHJhbnNmb3JtPFJlY29yZDxzdHJpbmcsIFQ+LCBNYXA8c3RyaW5nLCBUPj5cblxuY29uc3QgX2FycmF5VG9NYXBUcmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxBcnJheTxbdW5rbm93biwgdW5rbm93bl0+LCBNYXA8dW5rbm93biwgdW5rbm93bj4+ID0ge1xuICB0cmFuc2Zvcm0oeyBvcmlnaW5hbFZhbHVlOiBhcnIsIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWU6IGNhY2hlZE1hcCB9KSB7XG4gICAgcmV0dXJuIGNhY2hlZE1hcCA/PyBhc01hcChhcnIpXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlOiBtYXAgfSkge1xuICAgIC8vIGRvIG5vdCBjYWNoZSBtYXAgPC0+IGFyciByZWxhdGlvbnNoaXBcblxuICAgIGNvbnN0IGFycjogQXJyYXk8W3Vua25vd24sIHVua25vd25dPiA9IFtdXG4gICAgZm9yIChjb25zdCBrIG9mIG1hcC5rZXlzKCkpIHtcbiAgICAgIGFyci5wdXNoKFtrLCBtYXAuZ2V0KGspIV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGFyclxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcFRyYW5zZm9ybSA9IDxLLCBWPigpID0+XG4gIF9hcnJheVRvTWFwVHJhbnNmb3JtIGFzIE1vZGVsUHJvcFRyYW5zZm9ybTxBcnJheTxbSywgVl0+LCBNYXA8SywgVj4+XG4iLCJpbXBvcnQge1xuICBhY3Rpb24sXG4gIGludGVyY2VwdCxcbiAgSU9ic2VydmFibGVBcnJheSxcbiAgSVNldFdpbGxDaGFuZ2UsXG4gIGlzT2JzZXJ2YWJsZUFycmF5LFxuICBvYnNlcnZhYmxlLFxuICBPYnNlcnZhYmxlU2V0LFxuICBvYnNlcnZlLFxufSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRJc09ic2VydmFibGVBcnJheSwgYXNzZXJ0SXNTZXQsIGZhaWx1cmUsIGdldE1vYnhWZXJzaW9uLCBpbkRldk1vZGUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgdGFnIH0gZnJvbSBcIi4uL3V0aWxzL3RhZ1wiXG5cbmNvbnN0IG9ic2VydmFibGVTZXRCYWNrZWRCeU9ic2VydmFibGVBcnJheSA9IGFjdGlvbihcbiAgPFQ+KGFycmF5OiBJT2JzZXJ2YWJsZUFycmF5PFQ+KTogT2JzZXJ2YWJsZVNldDxUPiAmIHsgZGF0YU9iamVjdDogdHlwZW9mIGFycmF5IH0gPT4ge1xuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgaWYgKCFpc09ic2VydmFibGVBcnJheShhcnJheSkpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcImFzc2VydGlvbiBmYWlsZWQ6IGV4cGVjdGVkIGFuIG9ic2VydmFibGUgYXJyYXlcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc2V0OiBPYnNlcnZhYmxlU2V0PFQ+XG4gICAgaWYgKGdldE1vYnhWZXJzaW9uKCkgPj0gNikge1xuICAgICAgc2V0ID0gb2JzZXJ2YWJsZS5zZXQoYXJyYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldCA9IG9ic2VydmFibGUuc2V0KClcbiAgICAgIGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgc2V0LmFkZChpdGVtKVxuICAgICAgfSlcbiAgICB9XG4gICAgOyhzZXQgYXMgYW55KS5kYXRhT2JqZWN0ID0gYXJyYXlcblxuICAgIGlmIChzZXQuc2l6ZSAhPT0gYXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYXJyYXlzIGJhY2tpbmcgYSBzZXQgY2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIHZhbHVlc1wiKVxuICAgIH1cblxuICAgIGxldCBzZXRBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgbGV0IGFycmF5QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuXG4gICAgLy8gZm9yIHNwZWVkIHJlYXNvbnMgd2Ugd2lsbCBqdXN0IGFzc3VtZSBkaXN0aW5jdCB2YWx1ZXMgYXJlIG9ubHkgb25jZSBpbiB0aGUgYXJyYXlcblxuICAgIC8vIHdoZW4gdGhlIGFycmF5IGNoYW5nZXMgdGhlIHNldCBjaGFuZ2VzXG4gICAgb2JzZXJ2ZShcbiAgICAgIGFycmF5LFxuICAgICAgYWN0aW9uKChjaGFuZ2U6IGFueSAvKklBcnJheURpZENoYW5nZTxUPiovKSA9PiB7XG4gICAgICAgIGlmIChzZXRBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzcGxpY2VcIjoge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNoYW5nZS5yZW1vdmVkXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKHJlbW92ZWRbaV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gY2hhbmdlLmFkZGVkXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgc2V0LmFkZChhZGRlZFtpXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjaGFuZ2Uub2xkVmFsdWUpXG4gICAgICAgICAgICAgIHNldC5hZGQoY2hhbmdlLm5ld1ZhbHVlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhcnJheUFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICAvLyB3aGVuIHRoZSBzZXQgY2hhbmdlcyBhbHNvIGNoYW5nZSB0aGUgYXJyYXlcbiAgICBpbnRlcmNlcHQoXG4gICAgICBzZXQsXG4gICAgICBhY3Rpb24oKGNoYW5nZTogSVNldFdpbGxDaGFuZ2U8VD4pID0+IHtcbiAgICAgICAgaWYgKHNldEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJheUFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0QWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgICAgICAgYXJyYXkucHVzaChjaGFuZ2UubmV3VmFsdWUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJkZWxldGVcIjoge1xuICAgICAgICAgICAgICBjb25zdCBpID0gYXJyYXkuaW5kZXhPZihjaGFuZ2Uub2xkVmFsdWUpXG4gICAgICAgICAgICAgIGlmIChpID49IDApIHtcbiAgICAgICAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgcmV0dXJuIHNldCBhcyBhbnlcbiAgfVxuKVxuXG5jb25zdCBhc1NldFRhZyA9IHRhZygoYXJyYXk6IEFycmF5PGFueT4pID0+IHtcbiAgYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXkoYXJyYXksIFwiYXJyYXlcIilcbiAgcmV0dXJuIG9ic2VydmFibGVTZXRCYWNrZWRCeU9ic2VydmFibGVBcnJheShhcnJheSlcbn0pXG5cbi8qKlxuICogV3JhcHMgYW4gb2JzZXJ2YWJsZSBhcnJheSB0byBvZmZlciBhIHNldCBsaWtlIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzU2V0PFQ+KGFycmF5OiBBcnJheTxUPik6IE9ic2VydmFibGVTZXQ8VD4gJiB7IGRhdGFPYmplY3Q6IHR5cGVvZiBhcnJheSB9IHtcbiAgcmV0dXJuIGFzU2V0VGFnLmZvcihhcnJheSkgYXMgYW55XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzZXQgdG8gYW4gYXJyYXkuIElmIHRoZSBzZXQgaXMgYSBjb2xsZWN0aW9uIHdyYXBwZXIgaXQgd2lsbCByZXR1cm4gdGhlIGJhY2tlZCBhcnJheS5cbiAqXG4gKiBAcGFyYW0gc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUb0FycmF5PFQ+KHNldDogU2V0PFQ+KTogQXJyYXk8VD4ge1xuICBhc3NlcnRJc1NldChzZXQsIFwic2V0XCIpXG5cbiAgY29uc3QgZGF0YU9iamVjdCA9IChzZXQgYXMgYW55KS5kYXRhT2JqZWN0XG4gIGlmIChkYXRhT2JqZWN0KSB7XG4gICAgcmV0dXJuIGRhdGFPYmplY3RcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKHNldC52YWx1ZXMoKSlcbn1cbiIsImltcG9ydCB0eXBlIHsgTW9kZWxQcm9wVHJhbnNmb3JtIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgYXNTZXQgfSBmcm9tIFwiLi4vd3JhcHBlcnMvYXNTZXRcIlxuXG5jb25zdCBfYXJyYXlUb1NldFRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPEFycmF5PHVua25vd24+LCBTZXQ8dW5rbm93bj4+ID0ge1xuICB0cmFuc2Zvcm0oeyBvcmlnaW5hbFZhbHVlOiBhcnIsIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWU6IGNhY2hlZFNldCB9KSB7XG4gICAgcmV0dXJuIGNhY2hlZFNldCA/PyBhc1NldChhcnIpXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlOiBzZXQgfSkge1xuICAgIC8vIGRvIG5vdCBjYWNoZSBzZXQgPC0+IGFyciByZWxhdGlvbnNoaXBcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHNldC52YWx1ZXMoKSlcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IGFycmF5VG9TZXRUcmFuc2Zvcm0gPSA8VD4oKSA9PlxuICBfYXJyYXlUb1NldFRyYW5zZm9ybSBhcyBNb2RlbFByb3BUcmFuc2Zvcm08QXJyYXk8VD4sIFNldDxUPj5cbiIsImltcG9ydCB0eXBlIHsgTW9kZWxQcm9wVHJhbnNmb3JtIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuXG5jb25zdCBfc3RyaW5nVG9CaWdJbnRUcmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxzdHJpbmcsIGJpZ2ludD4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWUsIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlID8/IEJpZ0ludChvcmlnaW5hbFZhbHVlKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZSwgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVkVmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSgpXG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lZFZhbHVlLnRvU3RyaW5nKClcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvQmlnSW50VHJhbnNmb3JtID0gKCkgPT4gX3N0cmluZ1RvQmlnSW50VHJhbnNmb3JtXG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbW11dGFibGVEYXRlXG4gIGV4dGVuZHMgT21pdDxcbiAgICBEYXRlLFxuICAgIHwgXCJzZXRUaW1lXCJcbiAgICB8IFwic2V0TWlsbGlzZWNvbmRzXCJcbiAgICB8IFwic2V0VVRDTWlsbGlzZWNvbmRzXCJcbiAgICB8IFwic2V0U2Vjb25kc1wiXG4gICAgfCBcInNldFVUQ1NlY29uZHNcIlxuICAgIHwgXCJzZXRNaW51dGVzXCJcbiAgICB8IFwic2V0VVRDTWludXRlc1wiXG4gICAgfCBcInNldEhvdXJzXCJcbiAgICB8IFwic2V0VVRDSG91cnNcIlxuICAgIHwgXCJzZXREYXRlXCJcbiAgICB8IFwic2V0VVRDRGF0ZVwiXG4gICAgfCBcInNldE1vbnRoXCJcbiAgICB8IFwic2V0VVRDTW9udGhcIlxuICAgIHwgXCJzZXRGdWxsWWVhclwiXG4gICAgfCBcInNldFVUQ0Z1bGxZZWFyXCJcbiAgPiB7fVxuXG5jb25zdCBlcnJNZXNzYWdlID0gXCJ0aGlzIERhdGUgb2JqZWN0IGlzIGltbXV0YWJsZVwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJbW11dGFibGVEYXRlIGV4dGVuZHMgRGF0ZSB7XG4gIC8vIGRpc2FibGUgbXV0YWJsZSBtZXRob2RzXG5cbiAgc2V0VGltZSgpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldE1pbGxpc2Vjb25kcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ01pbGxpc2Vjb25kcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFNlY29uZHMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRVVENTZWNvbmRzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0TWludXRlcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ01pbnV0ZXMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRIb3VycygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ0hvdXJzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0RGF0ZSgpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ0RhdGUoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRNb250aCgpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ01vbnRoKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0RnVsbFllYXIoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRVVENGdWxsWWVhcigpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBJbW11dGFibGVEYXRlIH0gZnJvbSBcIi4vSW1tdXRhYmxlRGF0ZVwiXG5cbmNvbnN0IF90aW1lc3RhbXBUb0RhdGVUcmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxudW1iZXIsIERhdGU+ID0ge1xuICB0cmFuc2Zvcm0oeyBvcmlnaW5hbFZhbHVlLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSA/PyBuZXcgSW1tdXRhYmxlRGF0ZShvcmlnaW5hbFZhbHVlKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZSwgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICBpZiAodHJhbnNmb3JtZWRWYWx1ZSBpbnN0YW5jZW9mIEltbXV0YWJsZURhdGUpIHtcbiAgICAgIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSgpXG4gICAgfVxuICAgIHJldHVybiArdHJhbnNmb3JtZWRWYWx1ZVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgdGltZXN0YW1wVG9EYXRlVHJhbnNmb3JtID0gKCkgPT4gX3RpbWVzdGFtcFRvRGF0ZVRyYW5zZm9ybVxuXG5jb25zdCBfaXNvU3RyaW5nVG9EYXRlVHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08c3RyaW5nLCBEYXRlPiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZSwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSB9KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgPz8gbmV3IEltbXV0YWJsZURhdGUob3JpZ2luYWxWYWx1ZSlcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWUsIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSB9KSB7XG4gICAgaWYgKHRyYW5zZm9ybWVkVmFsdWUgaW5zdGFuY2VvZiBJbW11dGFibGVEYXRlKSB7XG4gICAgICBjYWNoZVRyYW5zZm9ybWVkVmFsdWUoKVxuICAgIH1cbiAgICByZXR1cm4gdHJhbnNmb3JtZWRWYWx1ZS50b0lTT1N0cmluZygpXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBpc29TdHJpbmdUb0RhdGVUcmFuc2Zvcm0gPSAoKSA9PiBfaXNvU3RyaW5nVG9EYXRlVHJhbnNmb3JtXG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNvbXB1dGVkIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgcGF0aFRvVGFyZ2V0UGF0aElkcyB9IGZyb20gXCIuLi9hY3Rpb25NaWRkbGV3YXJlcy91dGlsc1wiXG5pbXBvcnQgeyByZXNvbHZlUGF0aCwgcmVzb2x2ZVBhdGhDaGVja2luZ0lkcywgc2tpcElkQ2hlY2tpbmcgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzIH0gZnJvbSBcIi4uL3BhdGNoL2FwcGx5UGF0Y2hlc1wiXG5pbXBvcnQgeyBhcHBseVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2FwcGx5U25hcHNob3RcIlxuaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGRlZXBFcXVhbHMgfSBmcm9tIFwiLi9kZWVwRXF1YWxzXCJcblxuLyoqXG4gKiBBIGNsYXNzIHdpdGggdGhlIGltcGxlbWVudGF0aW9ubSBvZiBkcmFmdC5cbiAqIFVzZSBgZHJhZnRgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBEYXRhIHR5cGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmFmdDxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBEcmFmdCBkYXRhIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE6IFRcblxuICAvKipcbiAgICogQ29tbWl0cyBjdXJyZW50IGRyYWZ0IGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICovXG4gIEBhY3Rpb25cbiAgY29tbWl0KCk6IHZvaWQge1xuICAgIGFwcGx5U25hcHNob3QodGhpcy5vcmlnaW5hbERhdGEsIGdldFNuYXBzaG90KHRoaXMuZGF0YSkpXG4gIH1cblxuICAvKipcbiAgICogUGFydGlhbGx5IGNvbW1pdHMgY3VycmVudCBkcmFmdCBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAqIElmIHRoZSBwYXRoIGNhbm5vdCBiZSByZXNvbHZlZCBpbiBlaXRoZXIgdGhlIGRyYWZ0IG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgaXQgd2lsbCB0aHJvdy5cbiAgICogTm90ZSB0aGF0IG1vZGVsIElEcyBhcmUgY2hlY2tlZCB0byBiZSB0aGUgc2FtZSB3aGVuIHJlc29sdmluZyB0aGUgcGF0aHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gY29tbWl0LlxuICAgKi9cbiAgQGFjdGlvblxuICBjb21taXRCeVBhdGgocGF0aDogUGF0aCk6IHZvaWQge1xuICAgIGNvbnN0IGRyYWZ0VGFyZ2V0ID0gcmVzb2x2ZVBhdGgodGhpcy5kYXRhLCBwYXRoKVxuICAgIGlmICghZHJhZnRUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gY291bGQgbm90IGJlIHJlc29sdmVkIGluIGRyYWZ0IG9iamVjdGApXG4gICAgfVxuXG4gICAgY29uc3QgZHJhZnRQYXRoSWRzID0gcGF0aFRvVGFyZ2V0UGF0aElkc0lnbm9yaW5nTGFzdCh0aGlzLmRhdGEsIHBhdGgpXG5cbiAgICBjb25zdCBvcmlnaW5hbFRhcmdldCA9IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHModGhpcy5vcmlnaW5hbERhdGEsIHBhdGgsIGRyYWZ0UGF0aElkcylcbiAgICBpZiAoIW9yaWdpbmFsVGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbiBvcmlnaW5hbCBvYmplY3RgKVxuICAgIH1cblxuICAgIGFwcGx5UGF0Y2hlcyh0aGlzLm9yaWdpbmFsRGF0YSwgW1xuICAgICAge1xuICAgICAgICBwYXRoLFxuICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgIHZhbHVlOiBnZXRTbmFwc2hvdChkcmFmdFRhcmdldC52YWx1ZSksXG4gICAgICB9LFxuICAgIF0pXG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBkcmFmdCB0byBiZSBhbiBleGFjdCBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAqL1xuICBAYWN0aW9uXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIGFwcGx5U25hcHNob3QodGhpcy5kYXRhLCB0aGlzLm9yaWdpbmFsU25hcHNob3QpXG4gIH1cblxuICAvKipcbiAgICogUGFydGlhbGx5IHJlc2V0cyBjdXJyZW50IGRyYWZ0IGNoYW5nZXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICogSWYgdGhlIHBhdGggY2Fubm90IGJlIHJlc29sdmVkIGluIGVpdGhlciB0aGUgZHJhZnQgb3IgdGhlIG9yaWdpbmFsIG9iamVjdCBpdCB3aWxsIHRocm93LlxuICAgKiBOb3RlIHRoYXQgbW9kZWwgSURzIGFyZSBjaGVja2VkIHRvIGJlIHRoZSBzYW1lIHdoZW4gcmVzb2x2aW5nIHRoZSBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byByZXNldC5cbiAgICovXG4gIEBhY3Rpb25cbiAgcmVzZXRCeVBhdGgocGF0aDogUGF0aCk6IHZvaWQge1xuICAgIGNvbnN0IG9yaWdpbmFsVGFyZ2V0ID0gcmVzb2x2ZVBhdGgodGhpcy5vcmlnaW5hbERhdGEsIHBhdGgpXG4gICAgaWYgKCFvcmlnaW5hbFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW4gb3JpZ2luYWwgb2JqZWN0YClcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFBhdGhJZHMgPSBwYXRoVG9UYXJnZXRQYXRoSWRzSWdub3JpbmdMYXN0KHRoaXMub3JpZ2luYWxEYXRhLCBwYXRoKVxuXG4gICAgY29uc3QgZHJhZnRUYXJnZXQgPSByZXNvbHZlUGF0aENoZWNraW5nSWRzKHRoaXMuZGF0YSwgcGF0aCwgb3JpZ2luYWxQYXRoSWRzKVxuICAgIGlmICghZHJhZnRUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gY291bGQgbm90IGJlIHJlc29sdmVkIGluIGRyYWZ0IG9iamVjdGApXG4gICAgfVxuXG4gICAgYXBwbHlQYXRjaGVzKHRoaXMuZGF0YSwgW1xuICAgICAge1xuICAgICAgICBwYXRoLFxuICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgIHZhbHVlOiBnZXRTbmFwc2hvdChvcmlnaW5hbFRhcmdldC52YWx1ZSksXG4gICAgICB9LFxuICAgIF0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGRyYWZ0IGhhcyBjaGFuZ2VkIGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCBpc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGVlcEVxdWFscyhnZXRTbmFwc2hvdCh0aGlzLmRhdGEpLCB0aGlzLm9yaWdpbmFsU25hcHNob3QpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBwYXRoIG9mIHRoZSBkcmFmdCBoYXMgY2hhbmdlZCBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgKiBJZiB0aGUgcGF0aCBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gdGhlIGRyYWZ0IGl0IHdpbGwgdGhyb3cuXG4gICAqIElmIHRoZSBwYXRoIGNhbm5vdCBiZSByZXNvbHZlZCBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0IGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAgICogTm90ZSB0aGF0IG1vZGVsIElEcyBhcmUgY2hlY2tlZCB0byBiZSB0aGUgc2FtZSB3aGVuIHJlc29sdmluZyB0aGUgcGF0aHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gY2hlY2suXG4gICAqL1xuICBpc0RpcnR5QnlQYXRoKHBhdGg6IFBhdGgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkcmFmdFRhcmdldCA9IHJlc29sdmVQYXRoKHRoaXMuZGF0YSwgcGF0aClcbiAgICBpZiAoIWRyYWZ0VGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbiBkcmFmdCBvYmplY3RgKVxuICAgIH1cblxuICAgIGNvbnN0IGRyYWZ0UGF0aElkcyA9IHBhdGhUb1RhcmdldFBhdGhJZHNJZ25vcmluZ0xhc3QodGhpcy5kYXRhLCBwYXRoKVxuXG4gICAgY29uc3Qgb3JpZ2luYWxUYXJnZXQgPSByZXNvbHZlUGF0aENoZWNraW5nSWRzKHRoaXMub3JpZ2luYWxEYXRhLCBwYXRoLCBkcmFmdFBhdGhJZHMpXG4gICAgaWYgKCFvcmlnaW5hbFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gIWRlZXBFcXVhbHMoZHJhZnRUYXJnZXQudmFsdWUsIG9yaWdpbmFsVGFyZ2V0LnZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIE9yaWdpbmFsIGRhdGEgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxEYXRhOiBUXG5cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IG9yaWdpbmFsU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIGdldFNuYXBzaG90KHRoaXMub3JpZ2luYWxEYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRHJhZnQuXG4gICAqIERvIG5vdCB1c2UgZGlyZWN0bHksIHVzZSBgZHJhZnRgIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBvcmlnaW5hbFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3JpZ2luYWw6IFQpIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG9yaWdpbmFsLCBcIm9yaWdpbmFsXCIpXG5cbiAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IG9yaWdpbmFsXG4gICAgdGhpcy5kYXRhID0gZnJvbVNuYXBzaG90KHRoaXMub3JpZ2luYWxTbmFwc2hvdCwgeyBnZW5lcmF0ZU5ld0lkczogZmFsc2UgfSlcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBjb3B5IG9mIGEgdHJlZSBub2RlIGFuZCBhbGwgaXRzIGNoaWxkcmVuLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBEYXRhIHR5cGUuXG4gKiBAcGFyYW0gb3JpZ2luYWwgT3JpZ2luYWwgbm9kZS5cbiAqIEByZXR1cm5zIFRoZSBkcmFmdCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmFmdDxUIGV4dGVuZHMgb2JqZWN0PihvcmlnaW5hbDogVCk6IERyYWZ0PFQ+IHtcbiAgcmV0dXJuIG5ldyBEcmFmdChvcmlnaW5hbClcbn1cblxuZnVuY3Rpb24gcGF0aFRvVGFyZ2V0UGF0aElkc0lnbm9yaW5nTGFzdChyb290OiBhbnksIHBhdGg6IFBhdGgpIHtcbiAgY29uc3QgcGF0aElkczogKHN0cmluZyB8IG51bGwgfCB0eXBlb2Ygc2tpcElkQ2hlY2tpbmcpW10gPSBwYXRoVG9UYXJnZXRQYXRoSWRzKHJvb3QsIHBhdGgpXG4gIGlmIChwYXRoSWRzLmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gbmV2ZXIgY2hlY2sgdGhlIGxhc3Qgb2JqZWN0IGlkXG4gICAgcGF0aElkc1twYXRoSWRzLmxlbmd0aCAtIDFdID0gc2tpcElkQ2hlY2tpbmdcbiAgfVxuXG4gIHJldHVybiBwYXRoSWRzXG59XG4iLCJpbXBvcnQgeyByZWFjdGlvbiwgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICByZWFkb25seU1pZGRsZXdhcmUsXG4gIFJlYWRvbmx5TWlkZGxld2FyZVJldHVybixcbn0gZnJvbSBcIi4uL2FjdGlvbk1pZGRsZXdhcmVzL3JlYWRvbmx5TWlkZGxld2FyZVwiXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHRcIlxuaW1wb3J0IHsgZ2V0UGFyZW50VG9DaGlsZFBhdGgsIHJlc29sdmVQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaC9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgb25QYXRjaGVzIH0gZnJvbSBcIi4uL3BhdGNoL2VtaXRQYXRjaFwiXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4uL3BhdGNoL1BhdGNoXCJcbmltcG9ydCB7IFBhdGNoUmVjb3JkZXIsIHBhdGNoUmVjb3JkZXIgfSBmcm9tIFwiLi4vcGF0Y2gvcGF0Y2hSZWNvcmRlclwiXG5pbXBvcnQgeyBpc1Jvb3RTdG9yZSwgcmVnaXN0ZXJSb290U3RvcmUsIHVucmVnaXN0ZXJSb290U3RvcmUgfSBmcm9tIFwiLi4vcm9vdFN0b3JlL3Jvb3RTdG9yZVwiXG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gXCIuLi9zbmFwc2hvdC9jbG9uZVwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uLCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBDb250ZXh0IHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc2FuZGJveCBtYW5hZ2VyIHRoaXMgbm9kZSBydW5zIHVuZGVyIChpZiBhbnkpLlxuICovXG5jb25zdCBzYW5kYm94TWFuYWdlckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFNhbmRib3hNYW5hZ2VyPigpXG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2FuZGJveCBtYW5hZ2VyIG9mIGEgbm9kZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgVGhlIHNhbmRib3ggbWFuYWdlciBvZiBhIG5vZGUsIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlU2FuZGJveE1hbmFnZXIobm9kZTogb2JqZWN0KTogU2FuZGJveE1hbmFnZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2FuZGJveE1hbmFnZXJDb250ZXh0LmdldChub2RlKVxufVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBub2RlIGlzIGEgc2FuZGJveGVkIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBzYW5kYm94ZWQsIGBmYWxzZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FuZGJveGVkTm9kZShub2RlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0Tm9kZVNhbmRib3hNYW5hZ2VyKG5vZGUpXG59XG5cbi8qKlxuICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGBTYW5kYm94TWFuYWdlci53aXRoU2FuZGJveGAuXG4gKi9cbmV4cG9ydCB0eXBlIFdpdGhTYW5kYm94Q2FsbGJhY2s8VCBleHRlbmRzIHJlYWRvbmx5IFtvYmplY3QsIC4uLm9iamVjdFtdXSwgUj4gPSAoXG4gIC4uLm5vZGVzOiBUXG4pID0+IGJvb2xlYW4gfCB7IGNvbW1pdDogYm9vbGVhbjsgcmV0dXJuOiBSIH1cblxuLyoqXG4gKiBNYW5hZ2VyIGNsYXNzIHJldHVybmVkIGJ5IGBzYW5kYm94YCB0aGF0IGFsbG93cyB5b3UgdG8gbWFrZSBjaGFuZ2VzIHRvIGEgc2FuZGJveCBjb3B5IG9mIHRoZVxuICogb3JpZ2luYWwgc3VidHJlZSBhbmQgYXBwbHkgdGhlbSB0byB0aGUgb3JpZ2luYWwgc3VidHJlZSBvciByZWplY3QgdGhlbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNhbmRib3hNYW5hZ2VyIHtcbiAgLyoqXG4gICAqIFRoZSBzYW5kYm94IGNvcHkgb2YgdGhlIG9yaWdpbmFsIHN1YnRyZWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnRyZWVSb290Q2xvbmU6IG9iamVjdFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgZGlzcG9zZXIuXG4gICAqL1xuICBwcml2YXRlIGRpc3Bvc2VyOiAoKSA9PiB2b2lkXG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBgd2l0aFNhbmRib3hgIHBhdGNoIHJlY29yZGVyLiBJZiBgdW5kZWZpbmVkYCwgbm8gYHdpdGhTYW5kYm94YCBjYWxsIGlzIGJlaW5nXG4gICAqIGV4ZWN1dGVkLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXRoU2FuZGJveFBhdGNoUmVjb3JkZXI6IFBhdGNoUmVjb3JkZXIgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogRnVuY3Rpb24gZnJvbSBgcmVhZG9ubHlNaWRkbGV3YXJlYCB0aGF0IHdpbGwgYWxsb3cgYWN0aW9ucyB0byBiZSBzdGFydGVkIGluc2lkZSB0aGUgcHJvdmlkZWRcbiAgICogY29kZSBibG9jayBvbiBhIHJlYWRvbmx5IG5vZGUuXG4gICAqL1xuICBwcml2YXRlIGFsbG93V3JpdGU6IFJlYWRvbmx5TWlkZGxld2FyZVJldHVybltcImFsbG93V3JpdGVcIl1cblxuICAvKipcbiAgICogV2hldGhlciBjaGFuZ2VzIG1hZGUgaW4gdGhlIHNhbmRib3ggYXJlIGN1cnJlbnRseSBiZWluZyBjb21taXR0ZWQgdG8gdGhlIG9yaWdpbmFsIHN1YnRyZWUuXG4gICAqL1xuICBwcml2YXRlIGlzQ29tbWl0dGluZzogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFNhbmRib3hNYW5hZ2VyYC5cbiAgICogRG8gbm90IHVzZSBkaXJlY3RseSwgdXNlIGBzYW5kYm94YCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN1YnRyZWVSb290OiBvYmplY3QpIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgICAvLyB3ZSB0ZW1wb3JhcmlseSBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbnRleHQgbWFuYWdlciBzbyB0aGF0XG4gICAgLy8gY2xvbmVkIG5vZGVzIGNhbiBhY2Nlc3MgaXQgd2hpbGUgaW4gdGhlaXIgb25Jbml0IHBoYXNlXG5cbiAgICBsZXQgcHJldmlvdXNDb250ZXh0RGVmYXVsdCA9IHNhbmRib3hNYW5hZ2VyQ29udGV4dC5nZXREZWZhdWx0KClcbiAgICBzYW5kYm94TWFuYWdlckNvbnRleHQuc2V0RGVmYXVsdCh0aGlzKVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN1YnRyZWVSb290Q2xvbmUgPSBjbG9uZShzdWJ0cmVlUm9vdCwgeyBnZW5lcmF0ZU5ld0lkczogZmFsc2UgfSlcbiAgICAgIHNhbmRib3hNYW5hZ2VyQ29udGV4dC5zZXQodGhpcy5zdWJ0cmVlUm9vdENsb25lLCB0aGlzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNhbmRib3hNYW5hZ2VyQ29udGV4dC5zZXREZWZhdWx0KHByZXZpb3VzQ29udGV4dERlZmF1bHQpXG4gICAgfVxuXG4gICAgbGV0IHdhc1JTID0gZmFsc2VcbiAgICBjb25zdCBkaXNwb3NlUmVhY3Rpb25SUyA9IHJlYWN0aW9uKFxuICAgICAgKCkgPT4gaXNSb290U3RvcmUoc3VidHJlZVJvb3QpLFxuICAgICAgKGlzUlMpID0+IHtcbiAgICAgICAgaWYgKGlzUlMgIT09IHdhc1JTKSB7XG4gICAgICAgICAgd2FzUlMgPSBpc1JTXG4gICAgICAgICAgaWYgKGlzUlMpIHtcbiAgICAgICAgICAgIHJlZ2lzdGVyUm9vdFN0b3JlKHRoaXMuc3VidHJlZVJvb3RDbG9uZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5yZWdpc3RlclJvb3RTdG9yZSh0aGlzLnN1YnRyZWVSb290Q2xvbmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxuICAgIClcblxuICAgIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoc3VidHJlZVJvb3QsIChwYXRjaGVzKSA9PiB7XG4gICAgICBpZiAodGhpcy53aXRoU2FuZGJveFBhdGNoUmVjb3JkZXIpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcIm9yaWdpbmFsIHN1YnRyZWUgbXVzdCBub3QgY2hhbmdlIHdoaWxlICd3aXRoU2FuZGJveCcgZXhlY3V0ZXNcIilcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0NvbW1pdHRpbmcpIHtcbiAgICAgICAgdGhpcy5hbGxvd1dyaXRlKCgpID0+IHtcbiAgICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdENsb25lLCBwYXRjaGVzKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB7IGFsbG93V3JpdGUsIGRpc3Bvc2U6IGRpc3Bvc2VSZWFkb25seU1XIH0gPSByZWFkb25seU1pZGRsZXdhcmUodGhpcy5zdWJ0cmVlUm9vdENsb25lKVxuICAgIHRoaXMuYWxsb3dXcml0ZSA9IGFsbG93V3JpdGVcblxuICAgIHRoaXMuZGlzcG9zZXIgPSAoKSA9PiB7XG4gICAgICBkaXNwb3NlUmVhY3Rpb25SUygpXG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VSZWFkb25seU1XKClcbiAgICAgIGlmIChpc1Jvb3RTdG9yZSh0aGlzLnN1YnRyZWVSb290Q2xvbmUpKSB7XG4gICAgICAgIHVucmVnaXN0ZXJSb290U3RvcmUodGhpcy5zdWJ0cmVlUm9vdENsb25lKVxuICAgICAgfVxuICAgICAgdGhpcy5kaXNwb3NlciA9ICgpID0+IHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGBmbmAgd2l0aCBzYW5kYm94IGNvcGllcyBvZiB0aGUgZWxlbWVudHMgb2YgYG5vZGVzYC4gVGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgc2FuZGJveFxuICAgKiBpbiBgZm5gIGNhbiBiZSBhY2NlcHRlZCwgaS5lLiBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCBzdWJ0cmVlLCBvciByZWplY3RlZC5cbiAgICpcbiAgICogQHR5cGVwYXJhbSBUIE9iamVjdCB0eXBlLlxuICAgKiBAdHlwZXBhcmFtIFIgUmV0dXJuIHR5cGUuXG4gICAqIEBwYXJhbSBub2RlcyBUdXBsZSBvZiBvYmplY3RzIGZvciB3aGljaCB0byBvYnRhaW4gc2FuZGJveCBjb3BpZXMuXG4gICAqIEBwYXJhbSBmbiBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIHNhbmRib3ggY29waWVzIG9mIHRoZSBlbGVtZW50cyBvZiBgbm9kZXNgLiBBbnkgY2hhbmdlc1xuICAgKiBtYWRlIHRvIHRoZSBzYW5kYm94IGFyZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCBzdWJ0cmVlIHdoZW4gYGZuYCByZXR1cm5zIGB0cnVlYCBvclxuICAgKiBgeyBjb21taXQ6IHRydWUsIC4uLiB9YC4gV2hlbiBgZm5gIHJldHVybnMgYGZhbHNlYCBvciBgeyBjb21taXQ6IGZhbHNlLCAuLi4gfWAgdGhlIGNoYW5nZXMgbWFkZVxuICAgKiB0byB0aGUgc2FuZGJveCBhcmUgcmVqZWN0ZWQuXG4gICAqIEByZXR1cm5zIFZhbHVlIG9mIHR5cGUgYFJgIHdoZW4gYGZuYCByZXR1cm5zIGFuIG9iamVjdCBvZiB0eXBlIGB7IGNvbW1pdDogYm9vbGVhbjsgcmV0dXJuOiBSIH1gXG4gICAqIG9yIGB2b2lkYCB3aGVuIGBmbmAgcmV0dXJucyBhIGJvb2xlYW4uXG4gICAqL1xuICB3aXRoU2FuZGJveDxUIGV4dGVuZHMgcmVhZG9ubHkgW29iamVjdCwgLi4ub2JqZWN0W11dLCBSID0gdm9pZD4oXG4gICAgbm9kZXM6IFQsXG4gICAgZm46IFdpdGhTYW5kYm94Q2FsbGJhY2s8VCwgUj5cbiAgKTogUiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2Rlc1tpXSwgYG5vZGVzWyR7aX1dYClcbiAgICB9XG4gICAgYXNzZXJ0SXNGdW5jdGlvbihmbiwgXCJmblwiKVxuXG4gICAgY29uc3QgeyBzYW5kYm94Tm9kZXMsIGFwcGx5UmVjb3JkZXJDaGFuZ2VzIH0gPSB0aGlzLnByZXBhcmVTYW5kYm94Q2hhbmdlcyhub2RlcylcblxuICAgIGxldCBjb21taXQgPSBmYWxzZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHRoaXMuYWxsb3dXcml0ZSgoKSA9PiBmbiguLi5zYW5kYm94Tm9kZXMpKVxuICAgICAgaWYgKHR5cGVvZiByZXR1cm5WYWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgY29tbWl0ID0gcmV0dXJuVmFsdWVcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbW1pdCA9IHJldHVyblZhbHVlLmNvbW1pdFxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWUucmV0dXJuXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFwcGx5UmVjb3JkZXJDaGFuZ2VzKGNvbW1pdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdGhlIHNhbmRib3guXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZXIoKVxuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlU2FuZGJveENoYW5nZXM8VCBleHRlbmRzIHJlYWRvbmx5IFtvYmplY3QsIC4uLm9iamVjdFtdXT4oXG4gICAgbm9kZXM6IFRcbiAgKTogeyBzYW5kYm94Tm9kZXM6IFQ7IGFwcGx5UmVjb3JkZXJDaGFuZ2VzOiAoY29tbWl0OiBib29sZWFuKSA9PiB2b2lkIH0ge1xuICAgIGNvbnN0IGlzTmVzdGVkV2l0aFNhbmRib3hDYWxsID0gISF0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlclxuXG4gICAgY29uc3Qgc2FuZGJveE5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoXG4gICAgICAgIGlzTmVzdGVkV2l0aFNhbmRib3hDYWxsID8gdGhpcy5zdWJ0cmVlUm9vdENsb25lIDogdGhpcy5zdWJ0cmVlUm9vdCxcbiAgICAgICAgbm9kZVxuICAgICAgKVxuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoYG5vZGUgaXMgbm90IGEgY2hpbGQgb2Ygc3VidHJlZVJvb3Qke2lzTmVzdGVkV2l0aFNhbmRib3hDYWxsID8gXCJDbG9uZVwiIDogXCJcIn1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzYW5kYm94Tm9kZSA9IHJlc29sdmVQYXRoPHR5cGVvZiBub2RlPih0aGlzLnN1YnRyZWVSb290Q2xvbmUsIHBhdGgpLnZhbHVlXG4gICAgICBpZiAoIXNhbmRib3hOb2RlKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJwYXRoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCAtIHNhbmRib3ggbWF5IGJlIG91dCBvZiBzeW5jIHdpdGggb3JpZ2luYWwgdHJlZVwiKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2FuZGJveE5vZGVcbiAgICB9KSBhcyB1bmtub3duIGFzIFRcblxuICAgIGlmICghdGhpcy53aXRoU2FuZGJveFBhdGNoUmVjb3JkZXIpIHtcbiAgICAgIHRoaXMud2l0aFNhbmRib3hQYXRjaFJlY29yZGVyID0gcGF0Y2hSZWNvcmRlcih0aGlzLnN1YnRyZWVSb290Q2xvbmUpXG4gICAgfVxuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy53aXRoU2FuZGJveFBhdGNoUmVjb3JkZXJcbiAgICBjb25zdCBudW1SZWNvcmRlckV2ZW50cyA9IHJlY29yZGVyLmV2ZW50cy5sZW5ndGhcblxuICAgIGNvbnN0IGFwcGx5UmVjb3JkZXJDaGFuZ2VzID0gKGNvbW1pdDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc05lc3RlZFdpdGhTYW5kYm94Q2FsbCkge1xuICAgICAgICByZWNvcmRlci5kaXNwb3NlKClcbiAgICAgICAgdGhpcy53aXRoU2FuZGJveFBhdGNoUmVjb3JkZXIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXQpIHtcbiAgICAgICAgaWYgKCFpc05lc3RlZFdpdGhTYW5kYm94Q2FsbCkge1xuICAgICAgICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgICAgICAgIGNvbnN0IGxlbiA9IHJlY29yZGVyLmV2ZW50cy5sZW5ndGhcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goLi4ucmVjb3JkZXIuZXZlbnRzW2ldLnBhdGNoZXMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNDb21taXR0aW5nID0gdGhpcy5pc0NvbW1pdHRpbmdcbiAgICAgICAgICB0aGlzLmlzQ29tbWl0dGluZyA9IHRydWVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3QsIHBhdGNoZXMpXG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuaXNDb21taXR0aW5nID0gaXNDb21taXR0aW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFsbG93V3JpdGUoKCkgPT4ge1xuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gcmVjb3JkZXIuZXZlbnRzLmxlbmd0aFxuICAgICAgICAgICAgd2hpbGUgKGktLSA+IG51bVJlY29yZGVyRXZlbnRzKSB7XG4gICAgICAgICAgICAgIGFwcGx5UGF0Y2hlcyh0aGlzLnN1YnRyZWVSb290Q2xvbmUsIHJlY29yZGVyLmV2ZW50c1tpXS5pbnZlcnNlUGF0Y2hlcywgdHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHNhbmRib3hOb2RlcywgYXBwbHlSZWNvcmRlckNoYW5nZXMgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNhbmRib3guXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0LlxuICogQHJldHVybnMgQSBgU2FuZGJveE1hbmFnZXJgIHdoaWNoIGFsbG93cyB5b3UgdG8gbWFuYWdlIHRoZSBzYW5kYm94IG9wZXJhdGlvbnMgYW5kIGRpc3Bvc2Ugb2YgdGhlXG4gKiBzYW5kYm94LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuZGJveChzdWJ0cmVlUm9vdDogb2JqZWN0KTogU2FuZGJveE1hbmFnZXIge1xuICByZXR1cm4gbmV3IFNhbmRib3hNYW5hZ2VyKHN1YnRyZWVSb290KVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgbGF6eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlLCBBcnJheVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiB0dXBsZSBvZiB2YWx1ZXMgb2YgYSBnaXZlbiB0eXBlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3Qgc3RyaW5nTnVtYmVyVHVwbGVUeXBlID0gdHlwZXMudHVwbGUodHlwZXMuc3RyaW5nLCB0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgSXRlbSB0eXBlcy5cbiAqIEBwYXJhbSBpdGVtVHlwZSBUeXBlIG9mIGlubmVyIGl0ZW1zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzVHVwbGU8VCBleHRlbmRzIEFueVR5cGVbXT4oLi4uaXRlbVR5cGVzOiBUKTogQXJyYXlUeXBlPFQ+IHtcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBUdXBsZVR5cGVJbmZvKHQsIGl0ZW1UeXBlcy5tYXAocmVzb2x2ZVN0YW5kYXJkVHlwZSkpXG5cbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XG4gICAgY29uc3QgY2hlY2tlcnMgPSBpdGVtVHlwZXMubWFwKHJlc29sdmVUeXBlQ2hlY2tlcilcblxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZU5hbWVzID0gY2hlY2tlcnMubWFwKCh0YykgPT4ge1xuICAgICAgICBpZiAocmVjdXJzaXZlVHlwZUNoZWNrZXJzLmluY2x1ZGVzKHRjKSkge1xuICAgICAgICAgIHJldHVybiBcIi4uLlwiXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRjLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdGMpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gXCJbXCIgKyB0eXBlTmFtZXMuam9pbihcIiwgXCIpICsgXCJdXCJcbiAgICB9XG5cbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5BcnJheSxcblxuICAgICAgKGFycmF5LCBwYXRoKSA9PiB7XG4gICAgICAgIGlmICghaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoICE9PSBpdGVtVHlwZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBhcnJheSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpdGVtRXJyb3IgPSBjaGVja2Vyc1tpXS5jaGVjayhhcnJheVtpXSwgWy4uLnBhdGgsIGldKVxuICAgICAgICAgIGlmIChpdGVtRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtRXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSxcblxuICAgICAgZ2V0VHlwZU5hbWUsXG4gICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgKGFycmF5KSA9PiB7XG4gICAgICAgIGlmICghaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoICE9PSBpdGVtVHlwZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpdGVtQWN0dWFsQ2hlY2tlciA9IGNoZWNrZXJzW2ldLnNuYXBzaG90VHlwZShhcnJheVtpXSlcbiAgICAgICAgICBpZiAoIWl0ZW1BY3R1YWxDaGVja2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzVGNcbiAgICAgIH0sXG5cbiAgICAgIChhcnJheTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tlcnNbaV0uZnJvbVNuYXBzaG90UHJvY2Vzc29yKGl0ZW0pXG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICAoYXJyYXk6IHVua25vd25bXSkgPT4ge1xuICAgICAgICByZXR1cm4gYXJyYXkubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrZXJzW2ldLnRvU25hcHNob3RQcm9jZXNzb3IoaXRlbSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMudHVwbGVgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIC8vIG1lbW9pemUgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhcnJheSBvbiB0aGUgZ2V0dGVyXG4gIHByaXZhdGUgX2l0ZW1UeXBlSW5mb3MgPSBsYXp5KCgpID0+IHRoaXMuaXRlbVR5cGVzLm1hcChnZXRUeXBlSW5mbykpXG5cbiAgZ2V0IGl0ZW1UeXBlSW5mb3MoKTogUmVhZG9ubHlBcnJheTxUeXBlSW5mbz4ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtVHlwZUluZm9zKClcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IGl0ZW1UeXBlczogUmVhZG9ubHlBcnJheTxBbnlTdGFuZGFyZFR5cGU+KSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IHZhbHVlcyB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG1vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBtb2RlbElkS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCJcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsRGVjb3JhdG9yXCJcbmltcG9ydCB7IGlkUHJvcCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IHR5cGVzQXJyYXkgfSBmcm9tIFwiLi4vdHlwZXMvYXJyYXlCYXNlZC90eXBlc0FycmF5XCJcbmltcG9ydCB7IHRQcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3RQcm9wXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkIH0gZnJvbSBcIi4uL3R5cGVzL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWRcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBBIHNldCB0aGF0IGlzIGJhY2tlZCBieSBhbiBhcnJheS5cbiAqIFVzZSBgYXJyYXlTZXRgIHRvIGNyZWF0ZSBpdC5cbiAqL1xuQG1vZGVsKGAke25hbWVzcGFjZX0vQXJyYXlTZXRgKVxuZXhwb3J0IGNsYXNzIEFycmF5U2V0PFY+XG4gIGV4dGVuZHMgTW9kZWwoe1xuICAgIFttb2RlbElkS2V5XTogaWRQcm9wLFxuICAgIGl0ZW1zOiB0UHJvcCh0eXBlc0FycmF5KHR5cGVzVW5jaGVja2VkPGFueT4oKSksICgpID0+IFtdKSwgLy8gd2lsbCBiZSBwcm9wZXJseSBjaGVja2VkIGJ5IHR5cGVzLmFycmF5U2V0KHN1YlR5cGUpXG4gIH0pXG4gIGltcGxlbWVudHMgU2V0PFY+XG57XG4gIEBtb2RlbEFjdGlvblxuICBhZGQodmFsdWU6IFYpOiB0aGlzIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcblxuICAgIGlmICghaXRlbXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICBpdGVtcy5wdXNoKHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgQG1vZGVsQWN0aW9uXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXMubGVuZ3RoID0gMFxuICB9XG5cbiAgQG1vZGVsQWN0aW9uXG4gIGRlbGV0ZSh2YWx1ZTogVik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKHQpID0+IHQgPT09IHZhbHVlKVxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoKGNhbGxiYWNrZm46ICh2YWx1ZTogViwgdmFsdWUyOiBWLCBzZXQ6IFNldDxWPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xuICAgIC8vIHdlIGNhbm5vdCB1c2UgdGhlIHNldCBpbXBsZW1lbnRhdGlvbiBzaW5jZSB3ZSBuZWVkIHRvIHBhc3MgdGhpcyBhcyBzZXRcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcbiAgICBjb25zdCBsZW4gPSBpdGVtcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gaXRlbXNbaV1cbiAgICAgIGNhbGxiYWNrZm4uY2FsbCh0aGlzQXJnLCBrLCBrLCB0aGlzKVxuICAgIH1cbiAgfVxuXG4gIGhhcyh2YWx1ZTogVik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLmluY2x1ZGVzKHZhbHVlKVxuICB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGhcbiAgfVxuXG4gIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxWPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzKCkgLy8geWVzLCB2YWx1ZXNcbiAgfVxuXG4gIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcblxuICAgIHJldHVybiB2YWx1ZXMoaXRlbXMpW1N5bWJvbC5pdGVyYXRvcl0oKVxuICB9XG5cbiAgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtWLCBWXT4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgLy8gVE9ETzogc2hvdWxkIHVzZSBhbiBhY3R1YWwgaXRlcmF0b3JcbiAgICByZXR1cm4gaXRlbXMubWFwKCh2KSA9PiBbdiwgdl0gYXMgW1YsIFZdKS52YWx1ZXMoKVxuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxWPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzKClcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIkFycmF5U2V0XCJcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQXJyYXlTZXQgbW9kZWwgaW5zdGFuY2UuXG4gKlxuICogQHR5cGVwYXJhbSBWIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gW2VudHJpZXNdIE9wdGlvbmFsIGluaXRpYWwgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlTZXQ8Vj4odmFsdWVzPzogUmVhZG9ubHlBcnJheTxWPiB8IG51bGwpOiBBcnJheVNldDxWPiB7XG4gIGNvbnN0IGluaXRpYWxBcnI6IFZbXSA9IHZhbHVlcyA/IHZhbHVlcy5zbGljZSgpIDogW11cblxuICByZXR1cm4gbmV3IEFycmF5U2V0KHsgaXRlbXM6IGluaXRpYWxBcnIgfSlcbn1cbiIsImltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi8uLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBcnJheVNldCB9IGZyb20gXCIuLi8uLi93cmFwcGVycy9BcnJheVNldFwiXG5pbXBvcnQgeyB0eXBlc0FycmF5IH0gZnJvbSBcIi4uL2FycmF5QmFzZWQvdHlwZXNBcnJheVwiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlLCBNb2RlbFR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyB0eXBlc09iamVjdCB9IGZyb20gXCIuL3R5cGVzT2JqZWN0XCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFuIGFycmF5IGJhY2tlZCBzZXQgQXJyYXlTZXQuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBudW1iZXJTZXRUeXBlID0gdHlwZXMuYXJyYXlTZXQodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gdmFsdWVUeXBlIFZhbHVlIHR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNBcnJheVNldDxUIGV4dGVuZHMgQW55VHlwZT4odmFsdWVUeXBlOiBUKTogTW9kZWxUeXBlPEFycmF5U2V0PFR5cGVUb0RhdGE8VD4+PiB7XG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgQXJyYXlTZXRUeXBlSW5mbyh0LCByZXNvbHZlU3RhbmRhcmRUeXBlKHZhbHVlVHlwZSkpXG5cbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQoQXJyYXlTZXQpIVxuXG4gICAgY29uc3QgdmFsdWVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKHZhbHVlVHlwZSlcblxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT5cbiAgICAgIGBBcnJheVNldDwke3ZhbHVlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIHZhbHVlQ2hlY2tlcil9PmBcblxuICAgIGNvbnN0IGRhdGFUeXBlQ2hlY2tlciA9IHR5cGVzT2JqZWN0KCgpID0+ICh7XG4gICAgICBpdGVtczogdHlwZXNBcnJheSh2YWx1ZUNoZWNrZXIgYXMgYW55KSxcbiAgICB9KSlcblxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCwgLy8gYmVjYXVzZSBpdCBpcyByZWFsbHkgYSBtb2RlbFxuXG4gICAgICAob2JqLCBwYXRoKSA9PiB7XG4gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEFycmF5U2V0KSkge1xuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgb2JqKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRUYyA9IHJlc29sdmVUeXBlQ2hlY2tlcihkYXRhVHlwZUNoZWNrZXIpXG4gICAgICAgIHJldHVybiByZXNvbHZlZFRjLmNoZWNrKG9iai4kLCBwYXRoKVxuICAgICAgfSxcblxuICAgICAgZ2V0VHlwZU5hbWUsXG4gICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgKG9iaikgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9ialttb2RlbFR5cGVLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmYXN0IGNoZWNrXG4gICAgICAgICAgcmV0dXJuIG9ialttb2RlbFR5cGVLZXldID09PSBtb2RlbEluZm8ubmFtZSA/IHRoaXNUYyA6IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkVGMgPSByZXNvbHZlVHlwZUNoZWNrZXIoZGF0YVR5cGVDaGVja2VyKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRUYy5zbmFwc2hvdFR5cGUob2JqKSA/IHRoaXNUYyA6IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIChzbjogeyBpdGVtczogdW5rbm93bltdIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zbixcbiAgICAgICAgICBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUsXG4gICAgICAgICAgaXRlbXM6IHNuLml0ZW1zLm1hcCgodikgPT4gdmFsdWVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3Nvcih2KSksXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIChzbjogeyBpdGVtczogdW5rbm93bltdOyBbbW9kZWxUeXBlS2V5XT86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNuQ29weSA9IHtcbiAgICAgICAgICAuLi5zbixcbiAgICAgICAgICBpdGVtczogc24uaXRlbXMubWFwKCh2KSA9PiB2YWx1ZUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3Nvcih2KSksXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc25Db3B5XG4gICAgICB9XG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXNUY1xuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG59XG5cbi8qKlxuICogYHR5cGVzLmFycmF5U2V0YCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBBcnJheVNldFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICBnZXQgdmFsdWVUeXBlSW5mbygpOiBUeXBlSW5mbyB7XG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMudmFsdWVUeXBlKVxuICB9XG5cbiAgY29uc3RydWN0b3Iob3JpZ2luYWxUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IHZhbHVlVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XG4gICAgc3VwZXIob3JpZ2luYWxUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlLCBSZWNvcmRUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0LWxpa2UgbWFwLCBhbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cyBhbmQgdmFsdWVzIGFsbCBvZiBhIHNhbWUgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIC8vIHsgW2s6IHN0cmluZ106IG51bWJlciB9XG4gKiBjb25zdCBudW1iZXJNYXBUeXBlID0gdHlwZXMucmVjb3JkKHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxuICogQHBhcmFtIHZhbHVlVHlwZSBUeXBlIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIG9iamVjdC1saWtlIG1hcC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc1JlY29yZDxUIGV4dGVuZHMgQW55VHlwZT4odmFsdWVUeXBlOiBUKTogUmVjb3JkVHlwZTxUPiB7XG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0YykgPT4gbmV3IFJlY29yZFR5cGVJbmZvKHRjLCByZXNvbHZlU3RhbmRhcmRUeXBlKHZhbHVlVHlwZSkpXG5cbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XG4gICAgY29uc3QgdmFsdWVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKHZhbHVlVHlwZSlcblxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT5cbiAgICAgIGBSZWNvcmQ8JHt2YWx1ZUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB2YWx1ZUNoZWNrZXIpfT5gXG5cbiAgICBjb25zdCBhcHBseVNuYXBzaG90UHJvY2Vzc29yID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1vZGU6IFwiZnJvbVwiIHwgXCJ0b1wiKSA9PiB7XG4gICAgICBpZiAodmFsdWVDaGVja2VyLnVuY2hlY2tlZCkge1xuICAgICAgICByZXR1cm4gb2JqXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld09iajogdHlwZW9mIG9iaiA9IHt9XG5cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgICAgY29uc3QgdiA9XG4gICAgICAgICAgbW9kZSA9PT0gXCJmcm9tXCJcbiAgICAgICAgICAgID8gdmFsdWVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihvYmpba10pXG4gICAgICAgICAgICA6IHZhbHVlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKG9ialtrXSlcbiAgICAgICAgbmV3T2JqW2tdID0gdlxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3T2JqXG4gICAgfVxuXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LFxuXG4gICAgICAob2JqLCBwYXRoKSA9PiB7XG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgb2JqKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWx1ZUNoZWNrZXIudW5jaGVja2VkKSB7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICAgICAgICBjb25zdCB2ID0gb2JqW2tdXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUVycm9yID0gdmFsdWVDaGVja2VyLmNoZWNrKHYsIFsuLi5wYXRoLCBrXSlcbiAgICAgICAgICAgIGlmICh2YWx1ZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0sXG5cbiAgICAgIGdldFR5cGVOYW1lLFxuICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgIChvYmopID0+IHtcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopKSByZXR1cm4gbnVsbFxuXG4gICAgICAgIGlmICghdmFsdWVDaGVja2VyLnVuY2hlY2tlZCkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgICAgICAgY29uc3QgdiA9IG9ialtrXVxuICAgICAgICAgICAgY29uc3QgdmFsdWVBY3R1YWxDaGVja2VyID0gdmFsdWVDaGVja2VyLnNuYXBzaG90VHlwZSh2KVxuICAgICAgICAgICAgaWYgKCF2YWx1ZUFjdHVhbENoZWNrZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1RjXG4gICAgICB9LFxuXG4gICAgICAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICByZXR1cm4gYXBwbHlTbmFwc2hvdFByb2Nlc3NvcihvYmosIFwiZnJvbVwiKVxuICAgICAgfSxcblxuICAgICAgKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5U25hcHNob3RQcm9jZXNzb3Iob2JqLCBcInRvXCIpXG4gICAgICB9XG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXNUY1xuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG59XG5cbi8qKlxuICogYHR5cGVzLnJlY29yZGAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIGdldCB2YWx1ZVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy52YWx1ZVR5cGUpXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSB2YWx1ZVR5cGU6IEFueVN0YW5kYXJkVHlwZSkge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBlbnRyaWVzLCBnZXQsIGhhcywga2V5cywgcmVtb3ZlLCBzZXQsIHZhbHVlcyB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG1vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBtb2RlbElkS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCJcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsRGVjb3JhdG9yXCJcbmltcG9ydCB7IGlkUHJvcCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IHR5cGVzUmVjb3JkIH0gZnJvbSBcIi4uL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzUmVjb3JkXCJcbmltcG9ydCB7IHRQcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3RQcm9wXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkIH0gZnJvbSBcIi4uL3R5cGVzL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWRcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBBIG1hcCB0aGF0IGlzIGJhY2tlZCBieSBhbiBvYmplY3QtbGlrZSBtYXAuXG4gKiBVc2UgYG9iamVjdE1hcGAgdG8gY3JlYXRlIGl0LlxuICovXG5AbW9kZWwoYCR7bmFtZXNwYWNlfS9PYmplY3RNYXBgKVxuZXhwb3J0IGNsYXNzIE9iamVjdE1hcDxWPlxuICBleHRlbmRzIE1vZGVsKHtcbiAgICBbbW9kZWxJZEtleV06IGlkUHJvcCxcbiAgICBpdGVtczogdFByb3AodHlwZXNSZWNvcmQodHlwZXNVbmNoZWNrZWQ8YW55PigpKSwgKCkgPT4gKHt9KSksIC8vIHdpbGwgYmUgcHJvcGVybHkgY2hlY2tlZCBieSB0eXBlcy5vYmplY3RNYXAoc3ViVHlwZSlcbiAgfSlcbiAgaW1wbGVtZW50cyBNYXA8c3RyaW5nLCBWPlxue1xuICBAbW9kZWxBY3Rpb25cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbXMpXG4gICAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgcmVtb3ZlKGl0ZW1zLCBrKVxuICAgIH1cbiAgfVxuXG4gIEBtb2RlbEFjdGlvblxuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNLZXkgPSB0aGlzLmhhcyhrZXkpXG4gICAgaWYgKGhhc0tleSkge1xuICAgICAgcmVtb3ZlKHRoaXMuaXRlbXMsIGtleSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBWLCBrZXk6IHN0cmluZywgbWFwOiBNYXA8c3RyaW5nLCBWPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xuICAgIC8vIHdlIGNhbm5vdCB1c2UgdGhlIG1hcCBpbXBsZW1lbnRhdGlvbiBzaW5jZSB3ZSBuZWVkIHRvIHBhc3MgdGhpcyBhcyBtYXBcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtcylcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICBjYWxsYmFja2ZuLmNhbGwodGhpc0FyZywgaXRlbXNba10sIGssIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogViB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGdldCh0aGlzLml0ZW1zLCBrZXkpXG4gIH1cblxuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzKHRoaXMuaXRlbXMsIGtleSlcbiAgfVxuXG4gIEBtb2RlbEFjdGlvblxuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBWKTogdGhpcyB7XG4gICAgc2V0KHRoaXMuaXRlbXMsIGtleSwgdmFsdWUpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGtleXModGhpcy5pdGVtcykubGVuZ3RoXG4gIH1cblxuICBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gICAgLy8gVE9ETzogc2hvdWxkIHVzZSBhbiBhY3R1YWwgaXRlcmF0b3JcbiAgICByZXR1cm4ga2V5cyh0aGlzLml0ZW1zKVtTeW1ib2wuaXRlcmF0b3JdKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+XG4gIH1cblxuICB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxWPiB7XG4gICAgLy8gVE9ETzogc2hvdWxkIHVzZSBhbiBhY3R1YWwgaXRlcmF0b3JcbiAgICByZXR1cm4gdmFsdWVzKHRoaXMuaXRlbXMpW1N5bWJvbC5pdGVyYXRvcl0oKVxuICB9XG5cbiAgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIFZdPiB7XG4gICAgLy8gVE9ETzogc2hvdWxkIHVzZSBhbiBhY3R1YWwgaXRlcmF0b3JcbiAgICByZXR1cm4gZW50cmllcyh0aGlzLml0ZW1zKVtTeW1ib2wuaXRlcmF0b3JdKClcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgVl0+IHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzKClcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIk9iamVjdE1hcFwiXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IE9iamVjdE1hcCBtb2RlbCBpbnN0YW5jZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFYgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBbZW50cmllc10gT3B0aW9uYWwgaW5pdGlhbCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RNYXA8Vj4oZW50cmllcz86IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgVl0+IHwgbnVsbCk6IE9iamVjdE1hcDxWPiB7XG4gIGNvbnN0IGluaXRpYWxPYmo6IHsgW2s6IHN0cmluZ106IFYgfSA9IHt9XG5cbiAgaWYgKGVudHJpZXMpIHtcbiAgICBsZXQgbGVuID0gZW50cmllcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgIGluaXRpYWxPYmpbZW50cnlbMF1dID0gZW50cnlbMV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IE9iamVjdE1hcCh7IGl0ZW1zOiBpbml0aWFsT2JqIH0pXG59XG4iLCJpbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgT2JqZWN0TWFwIH0gZnJvbSBcIi4uLy4uL3dyYXBwZXJzL09iamVjdE1hcFwiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlLCBNb2RlbFR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyB0eXBlc09iamVjdCB9IGZyb20gXCIuL3R5cGVzT2JqZWN0XCJcbmltcG9ydCB7IHR5cGVzUmVjb3JkIH0gZnJvbSBcIi4vdHlwZXNSZWNvcmRcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0LWxpa2UgbWFwIE9iamVjdE1hcC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IG51bWJlck1hcFR5cGUgPSB0eXBlcy5vYmplY3RNYXAodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gdmFsdWVUeXBlIFZhbHVlIHR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPYmplY3RNYXA8VCBleHRlbmRzIEFueVR5cGU+KFxuICB2YWx1ZVR5cGU6IFRcbik6IE1vZGVsVHlwZTxPYmplY3RNYXA8VHlwZVRvRGF0YTxUPj4+IHtcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBPYmplY3RNYXBUeXBlSW5mbyh0LCByZXNvbHZlU3RhbmRhcmRUeXBlKHZhbHVlVHlwZSkpXG5cbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQoT2JqZWN0TWFwKSFcblxuICAgIGNvbnN0IHZhbHVlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcih2YWx1ZVR5cGUpXG5cbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+XG4gICAgICBgT2JqZWN0TWFwPCR7dmFsdWVDaGVja2VyLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdmFsdWVDaGVja2VyKX0+YFxuXG4gICAgY29uc3QgZGF0YVR5cGVDaGVja2VyID0gdHlwZXNPYmplY3QoKCkgPT4gKHtcbiAgICAgIGl0ZW1zOiB0eXBlc1JlY29yZCh2YWx1ZUNoZWNrZXIgYXMgYW55KSxcbiAgICB9KSlcbiAgICBjb25zdCByZXNvbHZlZERhdGFUeXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihkYXRhVHlwZUNoZWNrZXIpXG5cbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAgIChvYmosIHBhdGgpID0+IHtcbiAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT2JqZWN0TWFwKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgb2JqKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLmNoZWNrKG9iai4kLCBwYXRoKVxuICAgICAgfSxcblxuICAgICAgZ2V0VHlwZU5hbWUsXG4gICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgKG9iaikgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9ialttb2RlbFR5cGVLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmYXN0IGNoZWNrXG4gICAgICAgICAgcmV0dXJuIG9ialttb2RlbFR5cGVLZXldID09PSBtb2RlbEluZm8ubmFtZSA/IHRoaXNUYyA6IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5zbmFwc2hvdFR5cGUob2JqKSA/IHRoaXNUYyA6IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIChzbjogeyBpdGVtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJdGVtczogdHlwZW9mIHNuW1wiaXRlbXNcIl0gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzbi5pdGVtcykpIHtcbiAgICAgICAgICBuZXdJdGVtc1trXSA9IHZhbHVlQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24uaXRlbXNba10pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIChzbjogeyBpdGVtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IFttb2RlbFR5cGVLZXldPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3QgbmV3SXRlbXM6IHR5cGVvZiBzbltcIml0ZW1zXCJdID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoc24uaXRlbXMpKSB7XG4gICAgICAgICAgbmV3SXRlbXNba10gPSB2YWx1ZUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3Nvcihzbi5pdGVtc1trXSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNuQ29weSA9IHtcbiAgICAgICAgICAuLi5zbixcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc25Db3B5XG4gICAgICB9XG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXNUY1xuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG59XG5cbi8qKlxuICogYHR5cGVzLm9iamVjdE1hcGAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0TWFwVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIGdldCB2YWx1ZVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy52YWx1ZVR5cGUpXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSB2YWx1ZVR5cGU6IEFueVN0YW5kYXJkVHlwZSkge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgUmVmLCBSZWZDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi8uLi9yZWYvUmVmXCJcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IHR5cGVzU3RyaW5nIH0gZnJvbSBcIi4uL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB7IHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQgeyBUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXJCYXNlVHlwZSwgVHlwZUluZm8gfSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuaW1wb3J0IHsgdHlwZXNPYmplY3QgfSBmcm9tIFwiLi90eXBlc09iamVjdFwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb3IgbW9kZWwuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCByZWZUb1NvbWVPYmplY3QgPSB0eXBlcy5yZWYoU29tZU9iamVjdClcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gTyBPYmplY3Qgb3IgbW9kZWwgdHlwZS5cbiAqIEBwYXJhbSByZWZDb25zdHJ1Y3RvciBSZWYgb2JqZWN0IHR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNSZWY8TyBleHRlbmRzIG9iamVjdD4ocmVmQ29uc3RydWN0b3I6IFJlZkNvbnN0cnVjdG9yPE8+KTogTW9kZWxUeXBlPFJlZjxPPj4ge1xuICBjb25zdCB0eXBlTmFtZSA9IFwiUmVmXCJcblxuICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChyZWZDb25zdHJ1Y3Rvci5yZWZDbGFzcykhXG5cbiAgY29uc3QgcmVmRGF0YVR5cGVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKFxuICAgIHR5cGVzT2JqZWN0KCgpID0+ICh7XG4gICAgICBpZDogdHlwZXNTdHJpbmcsXG4gICAgfSkpXG4gIClcblxuICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LFxuXG4gICAgKHZhbHVlLCBwYXRoKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFJlZikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCB0eXBlTmFtZSwgdmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWZEYXRhVHlwZUNoZWNrZXIuY2hlY2sodmFsdWUuJCwgcGF0aClcbiAgICB9LFxuXG4gICAgKCkgPT4gdHlwZU5hbWUsXG4gICAgKHQpID0+IG5ldyBSZWZUeXBlSW5mbyh0KSxcblxuICAgIChvYmopID0+IHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBpZiAob2JqW21vZGVsVHlwZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBmYXN0IGNoZWNrXG4gICAgICAgIHJldHVybiBvYmpbbW9kZWxUeXBlS2V5XSA9PT0gbW9kZWxJbmZvLm5hbWUgPyB0aGlzVGMgOiBudWxsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWZEYXRhVHlwZUNoZWNrZXIuc25hcHNob3RUeXBlKG9iaikgPyB0aGlzVGMgOiBudWxsXG4gICAgfSxcblxuICAgIChzbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIGlmIChzblttb2RlbFR5cGVLZXldKSB7XG4gICAgICAgIHJldHVybiBzblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zbixcbiAgICAgICAgICBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgKHNuKSA9PiBzblxuICApXG5cbiAgcmV0dXJuIHRoaXNUYyBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMucmVmYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHt9XG4iLCJpbXBvcnQgeyBhc3NlcnRJc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7IHR5cGVzT3IgfSBmcm9tIFwiLi4vdXRpbGl0eS90eXBlc09yXCJcbmltcG9ydCB7IHR5cGVzTGl0ZXJhbCB9IGZyb20gXCIuL3R5cGVzUHJpbWl0aXZlXCJcblxuLyoqXG4gKiBAaWdub3JlXG4gKiBFbnVtIGxpa2Ugb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgW2s6IHN0cmluZ106IG51bWJlciB8IHN0cmluZ1xuICBbdjogbnVtYmVyXTogc3RyaW5nXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnVtVmFsdWVzKGU6IEVudW1MaWtlKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIGNvbnN0IHZhbHM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXVxuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoZSkpIHtcbiAgICBjb25zdCB2ID0gZVtrXVxuICAgIC8vIHdlIGhhdmUgdG8gZG8gdGhpcyBzaW5jZSBUUyBkb2VzIHNvbWV0aGluZyB3ZWlyZFxuICAgIC8vIHRvIG51bWJlciB2YWx1ZXNcbiAgICAvLyBIaSA9IDAgLT4geyBIaTogMCwgMDogXCJIaVwiIH1cbiAgICAvLyBhbmQgU1dDIGN1cnJlbnRseSBnZW5lcmF0ZXMgZW51bSBjb2RlIGluY29uc2lzdGVudCB3aXRoIFRTL0JhYmVsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N3Yy1wcm9qZWN0L3N3Yy9pc3N1ZXMvMzcxMVxuICAgIGlmICghdmFscy5pbmNsdWRlcyh2KSAmJiAoKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiICYmIHYgIT09ICtrKSB8fCBlW3ZdICE9PSAraykpIHtcbiAgICAgIHZhbHMucHVzaCh2KVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsc1xufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqIEV4dHJhY3QgZW51bSB2YWx1ZXMgb3V0IG9mIGEgZW51bSBvYmplY3QuXG4gKi9cbmV4cG9ydCB0eXBlIEVudW1WYWx1ZXM8RSBleHRlbmRzIEVudW1MaWtlPiA9IEUgZXh0ZW5kcyBSZWNvcmQ8XG4gIGluZmVyIF9LLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBpbmZlciBWXG4+XG4gID8gVlxuICA6IG5ldmVyXG5cbi8qKlxuICogQW4gZW51bSB0eXBlLCBiYXNlZCBvbiBhIFR5cGVTY3JpcHQgYWxpa2UgZW51bSBvYmplY3QuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5vciguLi5lbnVtX3ZhbHVlcy5tYXAodHlwZXMubGl0ZXJhbCkpYFxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogZW51bSBDb2xvciB7XG4gKiAgIFJlZCA9IFwicmVkXCIsXG4gKiAgIEdyZWVuID0gXCJncmVlblwiXG4gKiB9XG4gKlxuICogY29uc3QgY29sb3JUeXBlID0gdHlwZXMuZW51bShDb2xvcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gRSBFbnVtIHR5cGUuXG4gKiBAcGFyYW0gZW51bU9iamVjdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzRW51bTxFIGV4dGVuZHMgRW51bUxpa2U+KGVudW1PYmplY3Q6IEUpOiBJZGVudGl0eVR5cGU8RW51bVZhbHVlczxFPj4ge1xuICBhc3NlcnRJc09iamVjdChlbnVtT2JqZWN0LCBcImVudW1PYmplY3RcIilcblxuICBjb25zdCBsaXRlcmFscyA9IGVudW1WYWx1ZXMoZW51bU9iamVjdCkubWFwKChlKSA9PiB0eXBlc0xpdGVyYWwoZSkpXG4gIHJldHVybiB0eXBlc09yKC4uLmxpdGVyYWxzKSBhcyBhbnlcbn1cbiIsImltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcclxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxyXG5pbXBvcnQgeyBsYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyLCBUeXBlSW5mbywgVHlwZUluZm9HZW4gfSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXHJcblxyXG4vKipcclxuICogQSByZWZpbmVtZW50IG92ZXIgYSBnaXZlbiB0eXBlLiBUaGlzIGFsbG93cyB5b3UgdG8gZG8gZXh0cmEgY2hlY2tzXHJcbiAqIG92ZXIgbW9kZWxzLCBlbnN1cmUgbnVtYmVycyBhcmUgaW50ZWdlcnMsIGV0Yy5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3QgaW50ZWdlclR5cGUgPSB0eXBlcy5yZWZpbmVtZW50KHR5cGVzLm51bWJlciwgKG4pID0+IHtcclxuICogICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKVxyXG4gKiB9LCBcImludGVnZXJcIilcclxuICpcclxuICogY29uc3Qgc3VtTW9kZWxUeXBlID0gdHlwZXMucmVmaW5lbWVudCh0eXBlcy5tb2RlbChTdW0pLCAoc3VtKSA9PiB7XHJcbiAqICAgLy8gaW1hZ2luZSB0aGF0IGZvciBzb21lIHJlYXNvbiBzdW0gaW5jbHVkZXMgYSBudW1iZXIgJ2EnLCBhIG51bWJlciAnYidcclxuICogICAvLyBhbmQgdGhlIHJlc3VsdFxyXG4gKlxyXG4gKiAgIGNvbnN0IHJpZ2h0UmVzdWx0ID0gc3VtLmEgKyBzdW0uYiA9PT0gc3VtLnJlc3VsdFxyXG4gKlxyXG4gKiAgIC8vIHNpbXBsZSBtb2RlIHRoYXQgd2lsbCBqdXN0IHJldHVybiB0aGF0IHRoZSB3aG9sZSBtb2RlbCBpcyBpbmNvcnJlY3RcclxuICogICByZXR1cm4gcmlnaHRSZXN1bHRcclxuICpcclxuICogICAvLyB0aGlzIHdpbGwgcmV0dXJuIHRoYXQgdGhlIHJlc3VsdCBmaWVsZCBpcyB3cm9uZ1xyXG4gKiAgIHJldHVybiByaWdodFJlc3VsdCA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IoW1wicmVzdWx0XCJdLCBcImErYlwiLCBzdW0ucmVzdWx0KVxyXG4gKiB9KVxyXG4gKiBgYGBcclxuICpcclxuICogQHR5cGVwYXJhbSBUIEJhc2UgdHlwZS5cclxuICogQHBhcmFtIGJhc2VUeXBlIEJhc2UgdHlwZS5cclxuICogQHBhcmFtIGNoZWNrRm4gRnVuY3Rpb24gdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGRhdGEgKGlmIGl0IHBhc3NlcyB0aGUgYmFzZSB0eXBlXHJcbiAqIGNoZWNrKSBhbmQgcmV0dXJuIG51bGwgb3IgZmFsc2UgaWYgdGhlcmUgd2VyZSBubyBlcnJvcnMgb3IgZWl0aGVyIGEgVHlwZUNoZWNrRXJyb3IgaW5zdGFuY2Ugb3JcclxuICogdHJ1ZSBpZiB0aGVyZSB3ZXJlLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzUmVmaW5lbWVudDxUIGV4dGVuZHMgQW55VHlwZT4oXHJcbiAgYmFzZVR5cGU6IFQsXHJcbiAgY2hlY2tGbjogKGRhdGE6IFR5cGVUb0RhdGE8VD4pID0+IFR5cGVDaGVja0Vycm9yIHwgbnVsbCB8IGJvb2xlYW4sXHJcbiAgdHlwZU5hbWU/OiBzdHJpbmdcclxuKTogVCB7XHJcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+XHJcbiAgICBuZXcgUmVmaW5lbWVudFR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUoYmFzZVR5cGUpLCBjaGVja0ZuLCB0eXBlTmFtZSlcclxuXHJcbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XHJcbiAgICBjb25zdCBiYXNlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihiYXNlVHlwZSlcclxuXHJcbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+IHtcclxuICAgICAgY29uc3QgYmFzZVR5cGVOYW1lID0gYmFzZUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCBiYXNlQ2hlY2tlcilcclxuICAgICAgY29uc3QgcmVmaW5lbWVudE5hbWUgPSB0eXBlTmFtZSB8fCBcInJlZmluZW1lbnRPZlwiXHJcbiAgICAgIHJldHVybiBgJHtyZWZpbmVtZW50TmFtZX08JHtiYXNlVHlwZU5hbWV9PmBcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gICAgICBiYXNlQ2hlY2tlci5iYXNlVHlwZSxcclxuXHJcbiAgICAgIChkYXRhLCBwYXRoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYmFzZUVyciA9IGJhc2VDaGVja2VyLmNoZWNrKGRhdGEsIHBhdGgpXHJcbiAgICAgICAgaWYgKGJhc2VFcnIpIHtcclxuICAgICAgICAgIHJldHVybiBiYXNlRXJyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZWZpbmVtZW50RXJyID0gY2hlY2tGbihkYXRhKVxyXG5cclxuICAgICAgICBpZiAocmVmaW5lbWVudEVyciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9IGVsc2UgaWYgKHJlZmluZW1lbnRFcnIgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIGRhdGEpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZWZpbmVtZW50RXJyID8/IG51bGxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBnZXRUeXBlTmFtZSxcclxuICAgICAgdHlwZUluZm9HZW4sXHJcblxyXG4gICAgICAvLyB3ZSBjYW5ub3QgY2hlY2sgcmVmaW5lbWVudCBoZXJlIHNpbmNlIGl0IGNoZWNrcyBkYXRhIGluc3RhbmNlcywgbm90IHNuYXBzaG90c1xyXG4gICAgICAoc24pID0+IGJhc2VDaGVja2VyLnNuYXBzaG90VHlwZShzbiksXHJcblxyXG4gICAgICAoc24pID0+IGJhc2VDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbiksXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3NvcihzbilcclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gdGhpc1RjXHJcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxyXG59XHJcblxyXG4vKipcclxuICogYHR5cGVzLnJlZmluZW1lbnRgIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZWZpbmVtZW50VHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XHJcbiAgZ2V0IGJhc2VUeXBlSW5mbygpOiBUeXBlSW5mbyB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy5iYXNlVHlwZSlcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgdGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSxcclxuICAgIHJlYWRvbmx5IGJhc2VUeXBlOiBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgICByZWFkb25seSBjaGVja0Z1bmN0aW9uOiAoZGF0YTogYW55KSA9PiBUeXBlQ2hlY2tFcnJvciB8IG51bGwgfCBib29sZWFuLFxyXG4gICAgcmVhZG9ubHkgdHlwZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgc3VwZXIodGhpc1R5cGUpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGVzUmVmaW5lbWVudCB9IGZyb20gXCIuLi91dGlsaXR5L3R5cGVzUmVmaW5lbWVudFwiXG5pbXBvcnQgeyB0eXBlc051bWJlciwgdHlwZXNTdHJpbmcgfSBmcm9tIFwiLi90eXBlc1ByaW1pdGl2ZVwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbnkgaW50ZWdlciBudW1iZXIgdmFsdWUuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5yZWZpbmVtZW50KHR5cGVzLm51bWJlciwgbiA9PiBOdW1iZXIuaXNJbnRlZ2VyKG4pLCBcImludGVnZXJcIilgXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLmludGVnZXJcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNJbnRlZ2VyID0gdHlwZXNSZWZpbmVtZW50KHR5cGVzTnVtYmVyLCAobikgPT4gTnVtYmVyLmlzSW50ZWdlcihuKSwgXCJpbnRlZ2VyXCIpXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbnkgc3RyaW5nIHZhbHVlIG90aGVyIHRoYW4gXCJcIi5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLnJlZmluZW1lbnQodHlwZXMuc3RyaW5nLCBzID0+IHMgIT09IFwiXCIsIFwibm9uRW1wdHlcIilgXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLm5vbkVtcHR5U3RyaW5nXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVzTm9uRW1wdHlTdHJpbmcgPSB0eXBlc1JlZmluZW1lbnQodHlwZXNTdHJpbmcsIChzKSA9PiBzICE9PSBcIlwiLCBcIm5vbkVtcHR5XCIpXG4iLCJpbXBvcnQgeyB0eXBlc051bGwsIHR5cGVzVW5kZWZpbmVkIH0gZnJvbSBcIi4uL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSwgSWRlbnRpdHlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHsgdHlwZXNPciB9IGZyb20gXCIuL3R5cGVzT3JcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgZWl0aGVyIGEgdHlwZSBvciB1bmRlZmluZWQuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5vcihiYXNlVHlwZSwgdHlwZXMudW5kZWZpbmVkKWBcbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IG51bWJlck9yVW5kZWZpbmVkVHlwZSA9IHR5cGVzLm1heWJlKHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxuICogQHBhcmFtIGJhc2VUeXBlIFR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNNYXliZTxUIGV4dGVuZHMgQW55VHlwZT4oYmFzZVR5cGU6IFQpOiBUIHwgSWRlbnRpdHlUeXBlPHVuZGVmaW5lZD4ge1xuICByZXR1cm4gdHlwZXNPcihiYXNlVHlwZSwgdHlwZXNVbmRlZmluZWQpXG59XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBlaXRoZXIgYSB0eXBlIG9yIG51bGwuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5vcihiYXNlVHlwZSwgdHlwZXMubnVsbClgXG4gKlxuICogICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBudW1iZXJPck51bGxUeXBlID0gdHlwZXMubWF5YmVOdWxsKHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxuICogQHBhcmFtIHR5cGUgVHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc01heWJlTnVsbDxUIGV4dGVuZHMgQW55VHlwZT4odHlwZTogVCk6IFQgfCBJZGVudGl0eVR5cGU8bnVsbD4ge1xuICByZXR1cm4gdHlwZXNPcih0eXBlLCB0eXBlc051bGwpXG59XG4iLCJpbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXHJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcclxuaW1wb3J0IHsgbGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciwgVHlwZUluZm8sIFR5cGVJbmZvR2VuIH0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcclxuXHJcbi8qKlxyXG4gKiBXcmFwIGEgZ2l2ZW4gdHlwZSB3aXRoIHRhZyBpbmZvcm1hdGlvbi5cclxuICogVGhpcyBhbGxvd3MgeW91IHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoIHRoZSB0eXBlIG9mIGEgcHJvcCB0aGF0XHJcbiAqIHlvdSBjYW4gdXNlIGF0IHJ1bnRpbWUuXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IHdpZHRoVHlwZSA9IHR5cGVzLnRhZyh0eXBlcy5udW1iZXIsIHsgZGlzcGxheU5hbWU6IFwiV2lkdGggaW4gSW5jaGVzXCIsIHJlcXVpcmVkOiB0cnVlIH0sIFwiZGltZW5zaW9uXCIpXHJcbiAqIGNvbnN0IGhlaWdodFR5cGUgPSB0eXBlcy50YWcodHlwZXMubnVtYmVyLCB7IGRpc3BsYXlOYW1lOiBcIkhlaWdodCBpbiBJbmNoZXNcIiwgcmVxdWlyZWQ6IHRydWUgfSwgXCJkaW1lbnNpb25cIilcclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZXNlIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIGF0IHJ1bnRpbWUgdGhyb3VnaCBpbnNwZWN0aW9uIEFQSXMsIGUuZy5cclxuICogYGBgXHJcbiAqIEBtb2RlbCgnTXlNb2RlbCcpXHJcbiAqIGNsYXNzIE15TW9kZWwgZXh0ZW5kcyBNb2RlbCh7XHJcbiAqICAgd2lkdGg6IHRQcm9wKHdpZHRoVHlwZSwgMTApLFxyXG4gKiAgIGhlaWdodDogdFByb3AoaGVpZ2h0VHlwZSwgMTApXHJcbiAqIH0pIHt9XHJcbiAqXHJcbiAqIGNvbnN0IG0gPSBuZXcgTXlNb2RlbCh7fSlcclxuICogY29uc3QgdHlwZSA9IHR5cGVzLm1vZGVsPHR5cGVvZiBNb2RlbD4obS5jb25zdHJ1Y3RvcilcclxuICogY29uc3QgbW9kZWxUeXBlSW5mbyA9IGdldFR5cGVJbmZvKHR5cGUpIGFzIE1vZGVsVHlwZUluZm9cclxuICogY29uc3QgcHJvcFR5cGVJbmZvID0gbW9kZWxUeXBlSW5mby5wcm9wcy53aWR0aC50eXBlSW5mbyBhcyBUYWdUeXBlSW5mb1xyXG4gKiBjb25zdCBkaXNwbGF5TmFtZSA9IHByb3BUeXBlSW5mby5kaXNwbGF5TmFtZVxyXG4gKiBgYGBcclxuICogQHR5cGVwYXJhbSBUIEJhc2UgdHlwZS5cclxuICogQHBhcmFtIGJhc2VUeXBlIEJhc2UgdHlwZS5cclxuICogQHR5cGVwYXJhbSBBIFRhZyBvYmplY3QuXHJcbiAqIEBwYXJhbSB0YWcgQWJpdHJhcnkgb2JqZWN0IHRoYXQgY2FuIGJlIHF1ZXJpZWQgYXQgcnVudGltZS5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlc1RhZzxUIGV4dGVuZHMgQW55VHlwZSwgQT4oYmFzZVR5cGU6IFQsIHRhZzogQSwgdHlwZU5hbWU/OiBzdHJpbmcpOiBUIHtcclxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT5cclxuICAgIG5ldyBUYWdUeXBlSW5mbyh0LCByZXNvbHZlU3RhbmRhcmRUeXBlKGJhc2VUeXBlKSwgdGFnLCB0eXBlTmFtZSlcclxuXHJcbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XHJcbiAgICBjb25zdCBiYXNlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihiYXNlVHlwZSlcclxuXHJcbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+IHtcclxuICAgICAgY29uc3QgYmFzZVR5cGVOYW1lID0gYmFzZUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCBiYXNlQ2hlY2tlcilcclxuICAgICAgY29uc3QgdGFnZ2VkTmFtZSA9IHR5cGVOYW1lIHx8IFwidGFnZ2VkXCJcclxuICAgICAgcmV0dXJuIGAke3RhZ2dlZE5hbWV9PCR7YmFzZVR5cGVOYW1lfT5gXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcclxuICAgICAgYmFzZUNoZWNrZXIuYmFzZVR5cGUsXHJcbiAgICAgIGJhc2VDaGVja2VyLmNoZWNrLFxyXG4gICAgICBnZXRUeXBlTmFtZSxcclxuICAgICAgdHlwZUluZm9HZW4sXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIuc25hcHNob3RUeXBlKHNuKSxcclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pLFxyXG4gICAgICAoc24pID0+IGJhc2VDaGVja2VyLnRvU25hcHNob3RQcm9jZXNzb3Ioc24pXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuIHRoaXNUY1xyXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy50YWdgIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYWdUeXBlSW5mbzxBPiBleHRlbmRzIFR5cGVJbmZvIHtcclxuICBnZXQgYmFzZVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcclxuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLmJhc2VUeXBlKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLFxyXG4gICAgcmVhZG9ubHkgYmFzZVR5cGU6IEFueVN0YW5kYXJkVHlwZSxcclxuICAgIHJlYWRvbmx5IHRhZzogQSxcclxuICAgIHJlYWRvbmx5IHR5cGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIHN1cGVyKHRoaXNUeXBlKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBBcnJheVR5cGVJbmZvLCB0eXBlc0FycmF5IH0gZnJvbSBcIi4vYXJyYXlCYXNlZC90eXBlc0FycmF5XCJcbmltcG9ydCB7IFR1cGxlVHlwZUluZm8sIHR5cGVzVHVwbGUgfSBmcm9tIFwiLi9hcnJheUJhc2VkL3R5cGVzVHVwbGVcIlxuaW1wb3J0IHsgQXJyYXlTZXRUeXBlSW5mbywgdHlwZXNBcnJheVNldCB9IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzQXJyYXlTZXRcIlxuaW1wb3J0IHsgdHlwZXNEYXRhTW9kZWxEYXRhIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNEYXRhTW9kZWxEYXRhXCJcbmltcG9ydCB7IE1vZGVsVHlwZUluZm8sIE1vZGVsVHlwZUluZm9Qcm9wcywgdHlwZXNNb2RlbCB9IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzTW9kZWxcIlxuaW1wb3J0IHtcbiAgRnJvemVuVHlwZUluZm8sXG4gIE9iamVjdFR5cGVJbmZvLFxuICBPYmplY3RUeXBlSW5mb1Byb3BzLFxuICB0eXBlc0Zyb3plbixcbiAgdHlwZXNPYmplY3QsXG59IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzT2JqZWN0XCJcbmltcG9ydCB7IE9iamVjdE1hcFR5cGVJbmZvLCB0eXBlc09iamVjdE1hcCB9IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzT2JqZWN0TWFwXCJcbmltcG9ydCB7IFJlY29yZFR5cGVJbmZvLCB0eXBlc1JlY29yZCB9IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzUmVjb3JkXCJcbmltcG9ydCB7IFJlZlR5cGVJbmZvLCB0eXBlc1JlZiB9IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzUmVmXCJcbmltcG9ydCB7IHR5cGVzRW51bSB9IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzRW51bVwiXG5pbXBvcnQge1xuICBCb29sZWFuVHlwZUluZm8sXG4gIExpdGVyYWxUeXBlSW5mbyxcbiAgTnVtYmVyVHlwZUluZm8sXG4gIFN0cmluZ1R5cGVJbmZvLFxuICB0eXBlc0Jvb2xlYW4sXG4gIHR5cGVzTGl0ZXJhbCxcbiAgdHlwZXNOdWxsLFxuICB0eXBlc051bWJlcixcbiAgdHlwZXNTdHJpbmcsXG4gIHR5cGVzVW5kZWZpbmVkLFxufSBmcm9tIFwiLi9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgeyB0eXBlc0ludGVnZXIsIHR5cGVzTm9uRW1wdHlTdHJpbmcgfSBmcm9tIFwiLi9wcmltaXRpdmVCYXNlZC90eXBlc1JlZmluZWRQcmltaXRpdmVcIlxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlIH0gZnJvbSBcIi4vc2NoZW1hc1wiXG5pbXBvcnQgeyB0eXBlc01heWJlLCB0eXBlc01heWJlTnVsbCB9IGZyb20gXCIuL3V0aWxpdHkvdHlwZXNNYXliZVwiXG5pbXBvcnQgeyBPclR5cGVJbmZvLCB0eXBlc09yIH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc09yXCJcbmltcG9ydCB7IFJlZmluZW1lbnRUeXBlSW5mbywgdHlwZXNSZWZpbmVtZW50IH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc1JlZmluZW1lbnRcIlxuaW1wb3J0IHsgVGFnVHlwZUluZm8sIHR5cGVzVGFnIH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc1RhZ1wiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCwgVW5jaGVja2VkVHlwZUluZm8gfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzVW5jaGVja2VkXCJcbmV4cG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4vZ2V0VHlwZUluZm9cIlxuZXhwb3J0IHsgVHlwZUluZm8gfSBmcm9tIFwiLi9UeXBlQ2hlY2tlclwiXG5leHBvcnQgdHlwZSB7IE9iamVjdFR5cGVJbmZvUHJvcHMsIE1vZGVsVHlwZUluZm9Qcm9wcyB9XG5leHBvcnQge1xuICBCb29sZWFuVHlwZUluZm8sXG4gIExpdGVyYWxUeXBlSW5mbyxcbiAgTnVtYmVyVHlwZUluZm8sXG4gIFN0cmluZ1R5cGVJbmZvLFxuICBGcm96ZW5UeXBlSW5mbyxcbiAgT2JqZWN0TWFwVHlwZUluZm8sXG4gIFRhZ1R5cGVJbmZvLFxuICBSZWZpbmVtZW50VHlwZUluZm8sXG4gIFJlY29yZFR5cGVJbmZvLFxuICBSZWZUeXBlSW5mbyxcbiAgVW5jaGVja2VkVHlwZUluZm8sXG4gIE9iamVjdFR5cGVJbmZvLFxuICBBcnJheVNldFR5cGVJbmZvLFxuICBBcnJheVR5cGVJbmZvLFxuICBNb2RlbFR5cGVJbmZvLFxuICBPclR5cGVJbmZvLFxuICBUdXBsZVR5cGVJbmZvLFxufVxuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIGxpdGVyYWw6IHR5cGVzTGl0ZXJhbCxcbiAgdW5kZWZpbmVkOiB0eXBlc1VuZGVmaW5lZCxcbiAgbnVsbDogdHlwZXNOdWxsLFxuICBib29sZWFuOiB0eXBlc0Jvb2xlYW4sXG4gIG51bWJlcjogdHlwZXNOdW1iZXIsXG4gIHN0cmluZzogdHlwZXNTdHJpbmcsXG4gIG9yOiB0eXBlc09yLFxuICBtYXliZTogdHlwZXNNYXliZSxcbiAgbWF5YmVOdWxsOiB0eXBlc01heWJlTnVsbCxcbiAgYXJyYXk6IHR5cGVzQXJyYXksXG4gIHJlY29yZDogdHlwZXNSZWNvcmQsXG4gIHVuY2hlY2tlZDogdHlwZXNVbmNoZWNrZWQsXG4gIG1vZGVsOiB0eXBlc01vZGVsLFxuICBkYXRhTW9kZWxEYXRhOiB0eXBlc0RhdGFNb2RlbERhdGEsXG4gIG9iamVjdDogdHlwZXNPYmplY3QsXG4gIHJlZjogdHlwZXNSZWYsXG4gIGZyb3plbjogdHlwZXNGcm96ZW4sXG4gIGVudW06IHR5cGVzRW51bSxcbiAgdGFnOiB0eXBlc1RhZyxcbiAgcmVmaW5lbWVudDogdHlwZXNSZWZpbmVtZW50LFxuICBpbnRlZ2VyOiB0eXBlc0ludGVnZXIsXG4gIG5vbkVtcHR5U3RyaW5nOiB0eXBlc05vbkVtcHR5U3RyaW5nLFxuICBvYmplY3RNYXA6IHR5cGVzT2JqZWN0TWFwLFxuICBhcnJheVNldDogdHlwZXNBcnJheVNldCxcbiAgdHVwbGU6IHR5cGVzVHVwbGUsXG5cbiAgbWFwQXJyYXk8VCBleHRlbmRzIEFueVR5cGU+KHZhbHVlVHlwZTogVCkge1xuICAgIHJldHVybiB0eXBlc0FycmF5KHR5cGVzVHVwbGUodHlwZXNTdHJpbmcsIHZhbHVlVHlwZSkpXG4gIH0sXG4gIHNldEFycmF5PFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpIHtcbiAgICByZXR1cm4gdHlwZXNBcnJheSh2YWx1ZVR5cGUpXG4gIH0sXG4gIG1hcE9iamVjdDxUIGV4dGVuZHMgQW55VHlwZT4odmFsdWVUeXBlOiBUKSB7XG4gICAgcmV0dXJuIHR5cGVzUmVjb3JkKHZhbHVlVHlwZSlcbiAgfSxcbiAgZGF0ZVN0cmluZzogdHlwZXNOb25FbXB0eVN0cmluZyxcbiAgZGF0ZVRpbWVzdGFtcDogdHlwZXNJbnRlZ2VyLFxufVxuIl0sIm5hbWVzIjpbIm5hbWVzcGFjZSIsInN0YW5kYXJkVHlwZVJlc29sdmVycyIsImZhc3REZWVwRXF1YWwiLCJvYnNlcnZhYmxlT3B0aW9ucyIsImludGVybmFsTW9kZWwiLCJucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxNQUFNLDhDQUE4Qjs0QkFXRDtTQUMxQix3QkFBd0IsSUFBSSxjQUFjO0FBQ25EOzRCQU1FLGdCQUNBLGFBQ0E7MEJBRXdCLElBQUksZ0JBQWdCO0FBQUEsSUFDMUM7QUFBQSxJQUNBO0FBQUEsR0FDRDtBQUNIO0lDM0JZO1VBQUE7Ozs7Ozs7QUF5QlosR0F6Qlk7QUEyQlosTUFBTSxzQkFBMkMsSUFBSSxJQUFJLE9BQU8sT0FBTyxhQUFhLENBQUM7eUJBV3JEO1NBQ3ZCLG9CQUFvQixJQUFJLFVBQVU7QUFDM0M7SUNTWTtVQUFBOzs7QUFHWixHQUhZO0lBUUE7VUFBQTs7Ozs7O0FBcUJaLEdBckJZO0FBdUJa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