@fgv/ts-utils
Advanced tools
Comparing version 1.4.0 to 1.4.1
@@ -5,5 +5,5 @@ /** | ||
*/ | ||
export declare type Brand<T, B> = T & { | ||
export type Brand<T, B> = T & { | ||
__brand: B; | ||
}; | ||
//# sourceMappingURL=brand.d.ts.map |
import { Result } from './result'; | ||
import { Brand } from './brand'; | ||
declare type OnError = 'failOnError' | 'ignoreErrors'; | ||
type OnError = 'failOnError' | 'ignoreErrors'; | ||
/** | ||
@@ -164,3 +164,3 @@ * Converter traits. | ||
*/ | ||
declare type InnerInferredType<TCONV> = TCONV extends Converter<infer TTO> ? (TTO extends Array<infer TTOELEM> ? InnerInferredType<TTOELEM>[] : TTO) : (TCONV extends Array<infer TELEM> ? InnerInferredType<TELEM>[] : TCONV); | ||
type InnerInferredType<TCONV> = TCONV extends Converter<infer TTO> ? (TTO extends Array<infer TTOELEM> ? InnerInferredType<TTOELEM>[] : TTO) : (TCONV extends Array<infer TELEM> ? InnerInferredType<TELEM>[] : TCONV); | ||
/** | ||
@@ -172,3 +172,3 @@ * Infers the type that will be returned by an intstantiated converter. Works | ||
*/ | ||
export declare type Infer<TCONV> = TCONV extends Converter<infer TTO> ? InnerInferredType<TTO> : never; | ||
export type Infer<TCONV> = TCONV extends Converter<infer TTO> ? InnerInferredType<TTO> : never; | ||
/** | ||
@@ -179,3 +179,3 @@ * Deprecated name for Infer<T> retained for compatibility | ||
*/ | ||
export declare type ConvertedToType<TCONV> = Infer<TCONV>; | ||
export type ConvertedToType<TCONV> = Infer<TCONV>; | ||
/** | ||
@@ -182,0 +182,0 @@ * Base templated wrapper to simplify creation of new {@link Converter}s. |
@@ -5,3 +5,3 @@ import { BaseConverter, Converter, ConverterTraits } from './converter'; | ||
import { ExtendedArray } from './extendedArray'; | ||
declare type OnError = 'failOnError' | 'ignoreErrors'; | ||
type OnError = 'failOnError' | 'ignoreErrors'; | ||
/** | ||
@@ -424,3 +424,3 @@ * Options for {@link Converters.StringConverter | StringConverter} | ||
*/ | ||
export declare type FieldConverters<T, TC = unknown> = { | ||
export type FieldConverters<T, TC = unknown> = { | ||
[key in keyof T]: Converter<T[key], TC>; | ||
@@ -538,3 +538,3 @@ }; | ||
*/ | ||
export declare type StrictObjectConverterOptions<T> = Omit<ObjectConverterOptions<T>, 'strict'>; | ||
export type StrictObjectConverterOptions<T> = Omit<ObjectConverterOptions<T>, 'strict'>; | ||
/** | ||
@@ -584,3 +584,3 @@ * Helper function to create a {@link Converters.ObjectConverter | ObjectConverter} which converts an object | ||
*/ | ||
export declare type DiscriminatedObjectConverters<T, TD extends string = string, TC = unknown> = Record<TD, Converter<T, TC>>; | ||
export type DiscriminatedObjectConverters<T, TD extends string = string, TC = unknown> = Record<TD, Converter<T, TC>>; | ||
/** | ||
@@ -587,0 +587,0 @@ * Helper to create a {@link Converter} which converts a discriminated object without changing shape. |
@@ -46,5 +46,2 @@ "use strict"; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -55,3 +52,3 @@ exports.readCsvFileSync = void 0; | ||
const result_1 = require("./result"); | ||
const sync_1 = __importDefault(require("csv-parse/lib/sync")); | ||
const sync_1 = require("csv-parse/sync"); | ||
/** | ||
@@ -68,6 +65,6 @@ * Reads a CSV file from a supplied path. | ||
// eslint-disable-next-line | ||
return (0, sync_1.default)(body, { trim: true, from_line: 2 }); | ||
return (0, sync_1.parse)(body, { trim: true, from_line: 2 }); | ||
}); | ||
} | ||
exports.readCsvFileSync = readCsvFileSync; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2SGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jc3ZIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixxQ0FBaUQ7QUFDakQsOERBQXNDO0FBRXRDOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE9BQWU7SUFDM0MsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUQsMkJBQTJCO1FBQzNCLE9BQU8sSUFBQSxjQUFJLEVBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFQRCwwQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHN5bmMgZnJvbSAnY3N2LXBhcnNlL2xpYi9zeW5jJztcblxuLyoqXG4gKiBSZWFkcyBhIENTViBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUuXG4gKiBAYmV0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENzdkZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZyk6IFJlc3VsdDx1bmtub3duPiB7XG4gICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShzcmNQYXRoKTtcbiAgICAgICAgY29uc3QgYm9keSA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0ZjgnKS50b1N0cmluZygpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgcmV0dXJuIHN5bmMoYm9keSwgeyB0cmltOiB0cnVlLCBmcm9tX2xpbmU6IDJ9KTtcbiAgICB9KTtcbn1cbiJdfQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2SGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jc3ZIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixxQ0FBaUQ7QUFDakQseUNBQXVDO0FBRXZDOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE9BQWU7SUFDM0MsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUQsMkJBQTJCO1FBQzNCLE9BQU8sSUFBQSxZQUFLLEVBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFQRCwwQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdjc3YtcGFyc2Uvc3luYyc7XG5cbi8qKlxuICogUmVhZHMgYSBDU1YgZmlsZSBmcm9tIGEgc3VwcGxpZWQgcGF0aC5cbiAqIEBwYXJhbSBzcmNQYXRoIC0gU291cmNlIHBhdGggZnJvbSB3aGljaCB0aGUgZmlsZSBpcyByZWFkLlxuICogQHJldHVybnMgVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLlxuICogQGJldGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDc3ZGaWxlU3luYyhzcmNQYXRoOiBzdHJpbmcpOiBSZXN1bHQ8dW5rbm93bj4ge1xuICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoc3JjUGF0aCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGY4JykudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHJldHVybiBwYXJzZShib2R5LCB7IHRyaW06IHRydWUsIGZyb21fbGluZTogMn0pO1xuICAgIH0pO1xufVxuIl19 |
@@ -6,3 +6,3 @@ import { Result } from './result'; | ||
*/ | ||
export declare type FormatTargets = 'text' | 'markdown' | 'embed'; | ||
export type FormatTargets = 'text' | 'markdown' | 'embed'; | ||
/** | ||
@@ -44,3 +44,3 @@ * Interface for an object that can be formatted. | ||
*/ | ||
export declare type Formatter<T> = (format: string, item: T) => Result<string>; | ||
export type Formatter<T> = (format: string, item: T) => Result<string>; | ||
/** | ||
@@ -51,3 +51,3 @@ * A collection of {@link Formatter | formatters} indexed by target name, to enable | ||
*/ | ||
export declare type FormattersByExtendedTarget<TFT extends FormatTargets, T> = Record<TFT, Formatter<T>>; | ||
export type FormattersByExtendedTarget<TFT extends FormatTargets, T> = Record<TFT, Formatter<T>>; | ||
/** | ||
@@ -58,3 +58,3 @@ * A collection of {@link Formatter | formatters} indexed by the {@link FormatTargets | default supported | ||
*/ | ||
export declare type FormattersByTarget<T> = FormattersByExtendedTarget<FormatTargets, T>; | ||
export type FormattersByTarget<T> = FormattersByExtendedTarget<FormatTargets, T>; | ||
/** | ||
@@ -61,0 +61,0 @@ * Formats a list of items using the supplied template and formatter, one result |
import { Failure, Success } from './result'; | ||
export declare type LogLevel = 'detail' | 'info' | 'warning' | 'error' | 'silent'; | ||
export type LogLevel = 'detail' | 'info' | 'warning' | 'error' | 'silent'; | ||
export interface Logger { | ||
@@ -4,0 +4,0 @@ log(message?: unknown, ...parameters: unknown[]): Success<string | undefined>; |
import { Result } from './result'; | ||
export declare type Entry<T> = [string | number | symbol, T]; | ||
export declare type ResultEntry<T> = [string | number | symbol, Result<T>]; | ||
export type Entry<T> = [string | number | symbol, T]; | ||
export type ResultEntry<T> = [string | number | symbol, Result<T>]; | ||
/** | ||
@@ -5,0 +5,0 @@ * Normalizes an arbitrary JSON object |
{ | ||
"name": "@fgv/ts-utils", | ||
"version": "1.4.0", | ||
"version": "1.4.1", | ||
"description": "Assorted Typescript Utilities", | ||
@@ -34,8 +34,9 @@ "main": "index.js", | ||
"devDependencies": { | ||
"@jest/expect-utils": "^29.3.1", | ||
"@microsoft/api-documenter": "^7.16.0", | ||
"@microsoft/api-extractor": "^7.19.5", | ||
"@types/jest": "^27.0.2", | ||
"@types/luxon": "^2.0.4", | ||
"@types/jest": "^29.2.4", | ||
"@types/luxon": "^3.1.0", | ||
"@types/mustache": "^4.1.2", | ||
"@types/node": "^17.0.21", | ||
"@types/node": "^18.11.12", | ||
"@typescript-eslint/eslint-plugin": "^5.15.0", | ||
@@ -48,7 +49,7 @@ "@typescript-eslint/parser": "^5.15.0", | ||
"eslint-plugin-promise": "^6.0.0", | ||
"jest": "^27.2.4", | ||
"jest-extended": "^2.0.0", | ||
"jest-matcher-utils": "^27.2.4", | ||
"jest": "^29.3.1", | ||
"jest-extended": "^3.2.0", | ||
"jest-matcher-utils": "^29.3.1", | ||
"rimraf": "^3.0.2", | ||
"ts-jest": "^27.0.5", | ||
"ts-jest": "^29.0.3", | ||
"ts-node": "^10.2.1", | ||
@@ -58,6 +59,6 @@ "typescript": "^4.4.3" | ||
"dependencies": { | ||
"csv-parse": "^4.16.3", | ||
"luxon": "^2.0.2", | ||
"csv-parse": "^5.3.3", | ||
"luxon": "^3.1.1", | ||
"mustache": "^4.0.1" | ||
} | ||
} |
@@ -5,6 +5,6 @@ /** | ||
* {@link Success | Success<T>} and {@link Failure | Failure<T>} share the common | ||
* contract {@link IResult}, enabling comingled discriminated usage. | ||
* contract {@link IResult}, enabling commingled discriminated usage. | ||
* @public | ||
*/ | ||
export declare type Result<T> = Success<T> | Failure<T>; | ||
export type Result<T> = Success<T> | Failure<T>; | ||
/** | ||
@@ -15,3 +15,3 @@ * Continuation callback to be called in the event that an | ||
*/ | ||
export declare type SuccessContinuation<T, TN> = (value: T) => Result<TN>; | ||
export type SuccessContinuation<T, TN> = (value: T) => Result<TN>; | ||
/** | ||
@@ -22,3 +22,3 @@ * Continuation callback to be called in the event that an | ||
*/ | ||
export declare type FailureContinuation<T> = (message: string) => Result<T>; | ||
export type FailureContinuation<T> = (message: string) => Result<T>; | ||
/** | ||
@@ -28,3 +28,3 @@ * Type inference to determine the result type of an {@link Result}. | ||
*/ | ||
export declare type ResultValueType<T> = T extends Result<infer TV> ? TV : never; | ||
export type ResultValueType<T> = T extends Result<infer TV> ? TV : never; | ||
/** | ||
@@ -44,3 +44,3 @@ * Simple logger interface used by {@link IResult.getValueOrThrow}. | ||
* @remarks | ||
* This common contract enables comingled discriminated usage of {@link Success | Success<T>} | ||
* This common contract enables commingled discriminated usage of {@link Success | Success<T>} | ||
* and {@link Failure | Failure<T>}. | ||
@@ -124,3 +124,3 @@ * @public | ||
* the success result or the error message from this {@link IResult} and the | ||
* appopriate added detail. | ||
* appropriate added detail. | ||
*/ | ||
@@ -266,3 +266,3 @@ withDetail<TD>(detail: TD, successDetail?: TD): DetailedResult<T, TD>; | ||
*/ | ||
export declare type DetailedSuccessContinuation<T, TD, TN> = (value: T, detail?: TD) => DetailedResult<TN, TD>; | ||
export type DetailedSuccessContinuation<T, TD, TN> = (value: T, detail?: TD) => DetailedResult<TN, TD>; | ||
/** | ||
@@ -275,3 +275,3 @@ * Callback to be called when a {@link DetailedResult} encounters a failure. | ||
*/ | ||
export declare type DetailedFailureContinuation<T, TD> = (message: string, detail: TD) => DetailedResult<T, TD>; | ||
export type DetailedFailureContinuation<T, TD> = (message: string, detail: TD) => DetailedResult<T, TD>; | ||
/** | ||
@@ -381,3 +381,3 @@ * A {@link DetailedSuccess} extends {@link Success} to report optional success details in | ||
*/ | ||
export declare type DetailedResult<T, TD> = DetailedSuccess<T, TD> | DetailedFailure<T, TD>; | ||
export type DetailedResult<T, TD> = DetailedSuccess<T, TD> | DetailedFailure<T, TD>; | ||
/** | ||
@@ -387,3 +387,3 @@ * Type inference to determine the detail type `TD` of a {@link DetailedResult | DetailedResult<T, TD>}. | ||
*/ | ||
export declare type ResultDetailType<T> = T extends DetailedResult<unknown, infer TD> ? TD : never; | ||
export type ResultDetailType<T> = T extends DetailedResult<unknown, infer TD> ? TD : never; | ||
/** | ||
@@ -431,3 +431,3 @@ * Returns {@link DetailedSuccess | DetailedSuccess<T, TD>} with a supplied value and optional | ||
/** | ||
* Aggregates sucessful result values from a collection of {@link Result | Result<T>}. | ||
* Aggregates successful result values from a collection of {@link Result | Result<T>}. | ||
* @param results - The collection of {@link Result | Result<T>} to be mapped. | ||
@@ -441,3 +441,3 @@ * @returns If all {@link Result | results} are successful, returns {@link Success} with an | ||
/** | ||
* Aggregates sucessful results from a collection of {@link DetailedResult | DetailedResult<T, TD>}, | ||
* Aggregates successful results from a collection of {@link DetailedResult | DetailedResult<T, TD>}, | ||
* optionally ignoring certain error details. | ||
@@ -447,5 +447,5 @@ * @param results - The collection of {@link DetailedResult | DetailedResult<T, TD>} to be mapped. | ||
* @returns {@link Success} with an array containing all successful results if all results either | ||
* suceeded or returned error details listed in `ignore`. If any results failed with details | ||
* succeeded or returned error details listed in `ignore`. If any results failed with details | ||
* that cannot be ignored, returns {@link Failure} with an concatenated summary of all non-ignorable | ||
* error mesasges. | ||
* error messages. | ||
* @public | ||
@@ -466,3 +466,3 @@ */ | ||
* Aggregates error messages from a collection of {@link Result | Result<T>}. | ||
* @param results - An interable collection of {@link Result | Result<T>} for which | ||
* @param results - An iterable collection of {@link Result | Result<T>} for which | ||
* error messages are aggregated. | ||
@@ -488,3 +488,3 @@ * @returns An array of strings consisting of all error messages returned by | ||
*/ | ||
export declare type FieldInitializers<T> = { | ||
export type FieldInitializers<T> = { | ||
[key in keyof T]: (state: Partial<T>) => Result<T[key]>; | ||
@@ -491,0 +491,0 @@ }; |
@@ -378,3 +378,3 @@ "use strict"; | ||
/** | ||
* Aggregates sucessful result values from a collection of {@link Result | Result<T>}. | ||
* Aggregates successful result values from a collection of {@link Result | Result<T>}. | ||
* @param results - The collection of {@link Result | Result<T>} to be mapped. | ||
@@ -404,3 +404,3 @@ * @returns If all {@link Result | results} are successful, returns {@link Success} with an | ||
/** | ||
* Aggregates sucessful results from a collection of {@link DetailedResult | DetailedResult<T, TD>}, | ||
* Aggregates successful results from a collection of {@link DetailedResult | DetailedResult<T, TD>}, | ||
* optionally ignoring certain error details. | ||
@@ -410,5 +410,5 @@ * @param results - The collection of {@link DetailedResult | DetailedResult<T, TD>} to be mapped. | ||
* @returns {@link Success} with an array containing all successful results if all results either | ||
* suceeded or returned error details listed in `ignore`. If any results failed with details | ||
* succeeded or returned error details listed in `ignore`. If any results failed with details | ||
* that cannot be ignored, returns {@link Failure} with an concatenated summary of all non-ignorable | ||
* error mesasges. | ||
* error messages. | ||
* @public | ||
@@ -461,3 +461,3 @@ */ | ||
* Aggregates error messages from a collection of {@link Result | Result<T>}. | ||
* @param results - An interable collection of {@link Result | Result<T>} for which | ||
* @param results - An iterable collection of {@link Result | Result<T>} for which | ||
* error messages are aggregated. | ||
@@ -534,3 +534,3 @@ * @returns An array of strings consisting of all error messages returned by | ||
else { | ||
errors.push(`populateObject: Key ${key} is present but has no initializer`); | ||
errors.push(`populateObject: Key ${String(key)} is present but has no initializer`); | ||
} | ||
@@ -544,2 +544,2 @@ } | ||
exports.populateObject = populateObject; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUF3SUg7Ozs7R0FJRztBQUNILE1BQWEsT0FBTztJQVVoQjs7O09BR0c7SUFDSCxZQUFZLEtBQVE7UUFicEI7O1dBRUc7UUFDYSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBVzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNaLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUF1QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsSUFBUTs7UUFDN0IsT0FBTyxNQUFBLElBQUksQ0FBQyxNQUFNLG1DQUFJLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUssRUFBOEI7UUFDL0MsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxDQUF5QjtRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBSyxPQUFXO1FBQ3BDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBSyxNQUFVLEVBQUUsYUFBa0I7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Z2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9IG9mIHNvbWUgb3BlcmF0aW9uIG9yIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMuXG4gKiBAcmVtYXJrc1xuICoge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fSBhbmQge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fSBzaGFyZSB0aGUgY29tbW9uXG4gKiBjb250cmFjdCB7QGxpbmsgSVJlc3VsdH0sIGVuYWJsaW5nIGNvbWluZ2xlZCBkaXNjcmltaW5hdGVkIHVzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VD4gPSBTdWNjZXNzPFQ+IHwgRmFpbHVyZTxUPjtcbi8qKlxuICogQ29udGludWF0aW9uIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiB0aGUgZXZlbnQgdGhhdCBhblxuICoge0BsaW5rIFJlc3VsdH0gaXMgc3VjY2Vzc2Z1bC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4gPSAodmFsdWU6IFQpID0+IFJlc3VsdDxUTj47XG4vKipcbiAqIENvbnRpbnVhdGlvbiBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IHRoYXQgYW5cbiAqIHtAbGluayBSZXN1bHR9IGZhaWxzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGYWlsdXJlQ29udGludWF0aW9uPFQ+ID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gUmVzdWx0PFQ+O1xuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIG9mIGFuIHtAbGluayBSZXN1bHR9LlxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0VmFsdWVUeXBlPFQ+ID0gVCBleHRlbmRzIFJlc3VsdDxpbmZlciBUVj4gPyBUViA6IG5ldmVyO1xuXG4vKipcbiAqIFNpbXBsZSBsb2dnZXIgaW50ZXJmYWNlIHVzZWQgYnkge0BsaW5rIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVzdWx0TG9nZ2VyIHtcbiAgICAvKipcbiAgICAgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBzb21lIG9wZXJhdGlvbiBvZiBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zLlxuICogQHJlbWFya3NcbiAqIFRoaXMgY29tbW9uIGNvbnRyYWN0IGVuYWJsZXMgY29taW5nbGVkIGRpc2NyaW1pbmF0ZWQgdXNhZ2Ugb2Yge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fVxuICogYW5kIHtAbGluayBGYWlsdXJlIHwgRmFpbHVyZTxUPn0uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJlc3VsdDxUPiB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdWNjZXNzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuICBGdW5jdGlvbnNcbiAgICAgKiBhcyBhIHR5cGUgZ3VhcmQgZm9yIHtAbGluayBTdWNjZXNzIHwgU3VjY2VzczxUPn0uXG4gICAgICovXG4gICAgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPjtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGZhaWxlZC4gIEZ1bmN0aW9uc1xuICAgICAqIGFzIGEgdHlwZSBndWFyZCBmb3Ige0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fS5cbiAgICAgKi9cbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgc3VjY2Vzc2Z1bCB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0sXG4gICAgICogb3IgdGhyb3dzIHRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHBhcmFtIGxvZ2dlciAtIEFuIG9wdGlvbmFsIHtAbGluayBJUmVzdWx0TG9nZ2VyIHwgbG9nZ2VyfSB0byB3aGljaCB0aGVcbiAgICAgKiBlcnJvciB3aWxsIGFsc28gYmUgcmVwb3J0ZWQuXG4gICAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiBAdGhyb3dzIFRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqL1xuICAgIGdldFZhbHVlT3JUaHJvdyhsb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogVDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHN1Y2Nlc3NmdWwge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9LFxuICAgICAqIG9yIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEBwYXJhbSBkZmx0IC0gVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkIChkZWZhdWx0IGlzXG4gICAgICogYHVuZGVmaW5lZGApLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUsIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuICBSZXR1cm5zXG4gICAgICogdGhlIHN1cHBsaWVkIGRlZmF1bHQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZGVmYXVsdCBpcyBzdXBwbGllZC5cbiAgICAgKi9cbiAgICBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBzdXBwbGllZCB7QGxpbmsgU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY29udGludWF0aW9ufSBpZlxuICAgICAqIHRoZSBvcGVyYXRpb24gd2FzIGEgc3VjY2Vzcy5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSB7QGxpbmsgU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY29udGludWF0aW9ufSBtaWdodCByZXR1cm4gYVxuICAgICAqIGRpZmZlcmVudCByZXN1bHQgdHlwZSB0aGFuIHtAbGluayBJUmVzdWx0fSBvbiB3aGljaCBpdCBpcyBpbnZva2VkLiBUaGlzXG4gICAgICogZW5hYmxlcyBjaGFpbmluZyBvZiBvcGVyYXRpb25zIHdpdGggaGV0ZXJvZ2Vub3VzIHJldHVybiB0eXBlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYiAtIFRoZSB7QGxpbmsgU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY29udGludWF0aW9ufSB0b1xuICAgICAqIGJlIGNhbGxlZCBpbiB0aGUgZXZlbnQgb2Ygc3VjY2Vzcy5cbiAgICAgKiBAcmV0dXJucyBJZiB0aGlzIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgcmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWRcbiAgICAgKiBieSB0aGUge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0uICBJZiB0aGlzIHJlc3VsdFxuICAgICAqIGZhaWxlZCwgcHJvcGFnYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoaXMgZmFpbHVyZS5cbiAgICAgKi9cbiAgICBvblN1Y2Nlc3M8VE4+KGNiOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj47XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIHN1cHBsaWVkIHtAbGluayBGYWlsdXJlQ29udGludWF0aW9uIHwgZmFpbGVkIGNvbnRpbnVhdGlvbn0gaWZcbiAgICAgKiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gY2IgLSBUaGUge0BsaW5rIEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNvbnRpbnVhdGlvbn0gdG9cbiAgICAgKiBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IG9mIGZhaWx1cmUuXG4gICAgICogQHJldHVybnMgSWYgdGhpcyBvcGVyYXRpb24gZmFpbGVkLCByZXR1cm5zIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGVcbiAgICAgKiB7QGxpbmsgRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWx1cmUgY29udGludWF0aW9ufS4gIElmIHRoaXMgcmVzdWx0XG4gICAgICogd2FzIHN1Y2Nlc3NmdWwsIHByb3BhZ2F0ZXMgdGhlIHJlc3VsdCB2YWx1ZSBmcm9tIHRoZSBzdWNjZXNzZnVsIGV2ZW50LlxuICAgICAqL1xuICAgIG9uRmFpbHVyZShjYjogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPjtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEge0BsaW5rIElSZXN1bHQgfCBJUmVzdWx0PFQ+fSB0byBhIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0sXG4gICAgICogYWRkaW5nIGEgc3VwcGxpZWQgZGV0YWlsIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZGV0YWlsIHRvIGJlIGFkZGVkIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHdpdGggZWl0aGVyXG4gICAgICogdGhlIHN1Y2Nlc3MgcmVzdWx0IG9yIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhpcyB7QGxpbmsgSVJlc3VsdH0sIHdpdGhcbiAgICAgKiB0aGUgc3VwcGxpZWQgZGV0YWlsIChpZiB0aGlzIGV2ZW50IGZhaWxlZCkgb3IgZGV0YWlsIGB1bmRlZmluZWRgIChpZlxuICAgICAqIHRoaXMgcmVzdWx0IHN1Y2NlZWRlZCkuXG4gICAgICovXG4gICAgd2l0aEZhaWx1cmVEZXRhaWw8VEQ+KGRldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIHtAbGluayBJUmVzdWx0IHwgSVJlc3VsdDxUPn0gdG8gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LFxuICAgICAqIGFkZGluZyBzdXBwbGllZCBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZGVmYXVsdCBkZXRhaWwgdG8gYmUgYWRkZWQgdG8gdGhlIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9LlxuICAgICAqIEBwYXJhbSBzdWNjZXNzRGV0YWlsIC0gQW4gb3B0aW9uYWwgZGV0YWlsIHRvIGJlIGFkZGVkIGlmIHRoaXMgcmVzdWx0IHdhcyBzdWNjZXNzZnVsLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0gd2l0aCBlaXRoZXJcbiAgICAgKiB0aGUgc3VjY2VzcyByZXN1bHQgb3IgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGlzIHtAbGluayBJUmVzdWx0fSBhbmQgdGhlXG4gICAgICogYXBwb3ByaWF0ZSBhZGRlZCBkZXRhaWwuXG4gICAgICovXG4gICAgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+O1xufVxuXG4vKipcbiAqIFJlcG9ydHMgYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSBmcm9tIHNvbWUgb3BlcmF0aW9uIGFuZCB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgdmFsdWUuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWNjZXNzPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuc3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VjY2VzcyA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHQgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc1N1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIGlzU3VjY2VzcygpOiB0aGlzIGlzIFN1Y2Nlc3M8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc0ZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yVGhyb3coX2xvZ2dlcj86IElSZXN1bHRMb2dnZXIpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmdldFZhbHVlT3JEZWZhdWx0fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IGRmbHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25TdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KGNiOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25GYWlsdXJlfVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoXzogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhGYWlsdXJlRGV0YWlsfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmFpbHVyZURldGFpbDxURD4oX2RldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQud2l0aERldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKHRoaXMudmFsdWUsIHN1Y2Nlc3NEZXRhaWwgPz8gZGV0YWlsKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyBhIGZhaWxlZCB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0gZnJvbSBzb21lIG9wZXJhdGlvbiwgd2l0aCBhbiBlcnJvciBtZXNzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRmFpbHVyZTxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LnN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgRmFpbHVyZX0gd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzU3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc0ZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5nZXRWYWx1ZU9yVGhyb3d9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JUaHJvdyhsb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogbmV2ZXIge1xuICAgICAgICBpZiAobG9nZ2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcih0aGlzLl9tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5fbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPckRlZmF1bHR9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JEZWZhdWx0KGRmbHQ/OiBUKTogVHx1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gZGZsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vblN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oXzogU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4pOiBSZXN1bHQ8VE4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWlsdXJlKHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25GYWlsdXJlfVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoY2I6IEZhaWx1cmVDb250aW51YXRpb248VD4pOiBSZXN1bHQ8VD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC53aXRoRmFpbHVyZURldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZhaWx1cmVEZXRhaWw8VEQ+KGRldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwodGhpcy5tZXNzYWdlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhEZXRhaWx9XG4gICAgICovXG4gICAgcHVibGljIHdpdGhEZXRhaWw8VEQ+KGRldGFpbDogVEQsIF9zdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwodGhpcy5tZXNzYWdlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhICdmcmllbmRseScgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBGYWlsdXJlfSB2YWx1ZSBpcyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fSB3aXRoIHRoZSBzdXBwbGllZCByZXN1bHQgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3VjY2Vzc2Z1bCByZXN1bHQgdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2NlZWQ8VD4odmFsdWU6IFQpOiBTdWNjZXNzPFQ+IHtcbiAgICByZXR1cm4gbmV3IFN1Y2Nlc3M8VD4odmFsdWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fSB3aXRoIHRoZSBzdXBwbGllZCBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbDxUPihtZXNzYWdlOiBzdHJpbmcpOiBGYWlsdXJlPFQ+IHtcbiAgICByZXR1cm4gbmV3IEZhaWx1cmU8VD4obWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGVuY291bnRlcnMgc3VjY2Vzcy5cbiAqIEByZW1hcmtzXG4gKiBBIHN1Y2Nlc3MgY2FsbGJhY2sgY2FuIHJldHVybiBhIGRpZmZlcmVudCByZXN1bHQgdHlwZSB0aGFuIGl0IHJlY2VpdmVzLCBhbGxvd2luZ1xuICogc3VjY2VzcyByZXN1bHRzIHRvIGNoYWluIHRocm91Z2ggaW50ZXJtZWRpYXRlIHJlc3VsdCB0eXBlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4gPSAodmFsdWU6IFQsIGRldGFpbD86IFREKSA9PiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+O1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fSBlbmNvdW50ZXJzIGEgZmFpbHVyZS5cbiAqIEByZW1hcmtzXG4gKiBBIGZhaWx1cmUgY2FsbGJhY2sgY2FuIGNoYW5nZSB7QGxpbmsgRmFpbHVyZX0gdG8ge0BsaW5rIFN1Y2Nlc3N9IChlLmcuIGJ5IHJldHVybmluZyBhIGRlZmF1bHQgdmFsdWUpXG4gKiBvciBpdCBjYW4gY2hhbmdlIG9yIGVtYmVsbGlzaCB0aGUgZXJyb3IgbWVzc2FnZSwgYnV0IGl0IGNhbm5vdCBjaGFuZ2UgdGhlIHN1Y2Nlc3MgcmV0dXJuIHR5cGUuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4gPSAobWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKSA9PiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG5cbi8qKlxuICogQSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBleHRlbmRzIHtAbGluayBTdWNjZXNzfSB0byByZXBvcnQgb3B0aW9uYWwgc3VjY2VzcyBkZXRhaWxzIGluXG4gKiBhZGRpdGlvbiB0byB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldGFpbGVkU3VjY2VzczxULCBURD4gZXh0ZW5kcyBTdWNjZXNzPFQ+IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RldGFpbD86IFREO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzIHwgRGV0YWlsZWRTdWNjZXNzPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWRcbiAgICAgKiB2YWx1ZSBhbmQgZGV0YWlsLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gQW4gb3B0aW9uYWwgc3VjY2Vzc2Z1bCBkZXRhaWwgdG8gYmUgcmV0dXJuZWQuICBJZiBvbWl0dGVkLCBkZXRhaWxcbiAgICAgKiB3aWxsIGJlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgZGV0YWlsPzogVEQpIHtcbiAgICAgICAgc3VwZXIodmFsdWUpO1xuICAgICAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN1Y2Nlc3MgZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9LCBvciBgdW5kZWZpbmVkYCBpZlxuICAgICAqIG5vIGRldGFpbCB3YXMgc3VwcGxpZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkZXRhaWwoKTogVER8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHRoYXQgdGhpcyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBpcyBhIHN1Y2Nlc3MuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHdheXMgdHJ1ZSBmb3Ige0BsaW5rIERldGFpbGVkU3VjY2Vzc30gYnV0IGNhbiBiZSB1c2VkIGFzIHR5cGUgZ3VhcmRcbiAgICAgKiB0byBkaXNjcmltaW5hdGUge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gZnJvbSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpblxuICAgICAqIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgRGV0YWlsZWRTdWNjZXNzPFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHN1cHBsaWVkIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNhbGxiYWNrfSBhbmQgcHJvcGFnYXRlc1xuICAgICAqIGl0cyByZXR1cm5lZCB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+fS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBzdWNjZXNzIGNhbGxiYWNrIG11dGF0ZXMgdGhlIHJldHVybiB0eXBlIGZyb20gYDxUPmAgdG8gYDxUTj5gLlxuICAgICAqIEBwYXJhbSBjYiAtIFRoZSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjYWxsYmFja30gdG8gYmUgaW52b2tlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSByZXR1cm5lZCBieSB0aGUgc3VjY2VzcyBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25TdWNjZXNzPFROPihjYjogRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4pOiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudmFsdWUsIHRoaXMuX2RldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGFnYXRlcyB0aGlzIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRmFpbHVyZSBkb2VzIG5vdCBtdXRhdGUgcmV0dXJuIHR5cGUgc28gd2UgY2FuIHJldHVybiB0aGlzIGV2ZW50IGRpcmVjdGx5LlxuICAgICAqIEBwYXJhbSBfY2IgLSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uIHwgRmFpbHVyZSBjYWxsYmFja30gdG8gYmUgY2FsbGVkXG4gICAgICogb24gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGluIGNhc2Ugb2YgZmFpbHVyZSAoaWdub3JlZCkuXG4gICAgICogQHJldHVybnMgYHRoaXNgXG4gICAgICovXG4gICAgcHVibGljIG9uRmFpbHVyZShfY2I6IERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4pOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBleHRlbmRzIHtAbGluayBGYWlsdXJlfSB0byByZXBvcnQgb3B0aW9uYWwgZmFpbHVyZSBkZXRhaWxzIGluXG4gKiBhZGRpdGlvbiB0byB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldGFpbGVkRmFpbHVyZTxULCBURD4gZXh0ZW5kcyBGYWlsdXJlPFQ+IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RldGFpbDogVEQ7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBEZXRhaWxlZEZhaWx1cmUgfCBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZFxuICAgICAqIG1lc3NhZ2UgYW5kIGRldGFpbC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZXJyb3IgZGV0YWlsIHRvIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbDogVEQpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX2RldGFpbCA9IGRldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGV0YWlsKCk6IFREIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHRoYXQgdGhpcyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpcyBhIGZhaWx1cmUuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHdheXMgdHJ1ZSBmb3Ige0BsaW5rIERldGFpbGVkRmFpbHVyZX0gYnV0IGNhbiBiZSB1c2VkIGFzIHR5cGUgZ3VhcmRcbiAgICAgKiB0byBkaXNjcmltaW5hdGUge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gZnJvbSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpblxuICAgICAqIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRGV0YWlsZWRGYWlsdXJlPFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3BhZ2F0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGRldGFpbCBmcm9tIHRoaXMgcmVzdWx0LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTXV0YXRlcyB0aGUgc3VjY2VzcyB0eXBlIGFzIHRoZSBzdWNjZXNzIGNhbGxiYWNrIHdvdWxkIGhhdmUsIGJ1dCBkb2VzIG5vdFxuICAgICAqIGNhbGwgdGhlIHN1Y2Nlc3MgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIF9jYiAtIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb24gfCBTdWNjZXNzIGNhbGxiYWNrfSB0byBiZSBjYWxsZWRcbiAgICAgKiBvbiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0gaW4gY2FzZSBvZiBzdWNjZXNzIChpZ25vcmVkKS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFROLCBURD59IHdoaWNoIGNvbnRhaW5zXG4gICAgICogdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGRldGFpbCBmcm9tIHRoaXMgb25lLlxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KF9jYjogRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4pOiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZXRhaWxlZEZhaWx1cmU8VE4sIFREPih0aGlzLm1lc3NhZ2UsIHRoaXMuX2RldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgc3VwcGxpZWQge0BsaW5rIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWx1cmUgY2FsbGJhY2t9IGFuZCBwcm9wYWdhdGVzXG4gICAgICogaXRzIHJldHVybmVkIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0uXG4gICAgICogQHBhcmFtIGNiIC0gVGhlIHtAbGluayBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNhbGxiYWNrfSB0byBiZSBpbnZva2VkLlxuICAgICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHJldHVybmVkIGJ5IHRoZSBmYWlsdXJlIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoY2I6IERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4pOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy5tZXNzYWdlLCB0aGlzLl9kZXRhaWwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIGBUYCBvZiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0uXG4gKiBAYmV0YVxuICovXG5leHBvcnQgdHlwZSBEZXRhaWxlZFJlc3VsdDxULCBURD4gPSBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fERldGFpbGVkRmFpbHVyZTxULCBURD47XG5cbi8qKlxuICogVHlwZSBpbmZlcmVuY2UgdG8gZGV0ZXJtaW5lIHRoZSBkZXRhaWwgdHlwZSBgVERgIG9mIGEge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fS5cbiAqIEBiZXRhXG4gKi9cbmV4cG9ydCB0eXBlIFJlc3VsdERldGFpbFR5cGU8VD4gPSBUIGV4dGVuZHMgRGV0YWlsZWRSZXN1bHQ8dW5rbm93biwgaW5mZXIgVEQ+ID8gVEQgOiBuZXZlcjtcblxuLyoqXG4gKiBSZXR1cm5zIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3MgfCBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fSB3aXRoIGEgc3VwcGxpZWQgdmFsdWUgYW5kIG9wdGlvbmFsXG4gKiBkZXRhaWwuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdHlwZSBgPFQ+YCB0byBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBkZXRhaWwgLSBBbiBvcHRpb25hbCBkZXRhaWwgb2YgdHlwZSBgPFREPmAgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3MgfCBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZVxuICogYW5kIGRldGFpbCwgaWYgc3VwcGxpZWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZWVkV2l0aERldGFpbDxULCBURD4odmFsdWU6IFQsIGRldGFpbD86IFREKTogRGV0YWlsZWRTdWNjZXNzPFQsIFREPiB7XG4gICAgcmV0dXJuIG5ldyBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+KHZhbHVlLCBkZXRhaWwpO1xufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIERldGFpbGVkRmFpbHVyZSB8IERldGFpbGVkRmFpbHVyZTxULCBURD59IHdpdGggYSBzdXBwbGllZCBlcnJvciBtZXNzYWdlIGFuZCBkZXRhaWwuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGRldGFpbCAtIFRoZSBldmVudCBkZXRhaWwgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBbiB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWQgZXJyb3JcbiAqIG1lc3NhZ2UgYW5kIGRldGFpbC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWxXaXRoRGV0YWlsPFQsIFREPihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbDogVEQpOiBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+IHtcbiAgICByZXR1cm4gbmV3IERldGFpbGVkRmFpbHVyZTxULCBURD4obWVzc2FnZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBQcm9wYWdhdGVzIGEge0BsaW5rIFN1Y2Nlc3N9IG9yIHtAbGluayBGYWlsdXJlfSB7QGxpbmsgUmVzdWx0fSwgYWRkaW5nIHN1cHBsaWVkXG4gKiBldmVudCBkZXRhaWxzIGFzIGFwcHJvcHJpYXRlLlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSB7QGxpbmsgUmVzdWx0fSB0byBiZSBwcm9wYWdhdGVkLlxuICogQHBhcmFtIGRldGFpbCAtIFRoZSBldmVudCBkZXRhaWwgKHR5cGUgYDxURD5gKSB0byBiZSBhZGRlZCB0byB0aGUge0BsaW5rIFJlc3VsdCB8IHJlc3VsdH0uXG4gKiBAcGFyYW0gc3VjY2Vzc0RldGFpbCAtIEFuIG9wdGlvbmFsIGRpc3RpbmN0IGV2ZW50IGRldGFpbCB0byBiZSBhZGRlZCB0byB7QGxpbmsgU3VjY2Vzc30gcmVzdWx0cy4gIElmIGBzdWNjZXNzRGV0YWlsYFxuICogaXMgb21pdHRlZCBvciBgdW5kZWZpbmVkYCwgdGhlbiBgZGV0YWlsYCB3aWxsIGJlIGFwcGxpZWQgdG8ge0BsaW5rIFN1Y2Nlc3N9IHJlc3VsdHMuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHdpdGggdGhlIHN1Y2Nlc3MgdmFsdWUgb3IgZXJyb3JcbiAqIG1lc3NhZ2UgZnJvbSB0aGUgb3JpZ2luYWwgYHJlc3VsdGAgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgYWRkZWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wYWdhdGVXaXRoRGV0YWlsPFQsIFREPihyZXN1bHQ6IFJlc3VsdDxUPiwgZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICByZXR1cm4gcmVzdWx0LmlzU3VjY2VzcygpXG4gICAgICAgID8gc3VjY2VlZFdpdGhEZXRhaWwocmVzdWx0LnZhbHVlLCBzdWNjZXNzRGV0YWlsID8/IGRldGFpbClcbiAgICAgICAgOiBmYWlsV2l0aERldGFpbChyZXN1bHQubWVzc2FnZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIGZ1bmN0aW9uIHdoaWNoIG1pZ2h0IHRocm93IHRvIGNvbnZlcnQgZXhjZXB0aW9uIHJlc3VsdHNcbiAqIHRvIHtAbGluayBGYWlsdXJlfS5cbiAqIEBwYXJhbSBmdW5jIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhcHR1cmVkLlxuICogQHJldHVybnMgUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIHZhbHVlIG9mIHR5cGUgYDxUPmAgb25cbiAqIHN1Y2Nlc3MgLCBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCB0aGUgdGhyb3duIGVycm9yIG1lc3NhZ2UgaWZcbiAqIGBmdW5jYCB0aHJvd3MgYW4gYEVycm9yYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVSZXN1bHQ8VD4oZnVuYzogKCkgPT4gVCk6IFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnVuYygpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFpbCgoZXJyIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBzdWNlc3NmdWwgcmVzdWx0IHZhbHVlcyBmcm9tIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fS5cbiAqIEBwYXJhbSByZXN1bHRzIC0gVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gdG8gYmUgbWFwcGVkLlxuICogQHJldHVybnMgIElmIGFsbCB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gYXJlIHN1Y2Nlc3NmdWwsIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYW5cbiAqIGFycmF5IGNvbnRhaW5pbmcgYWxsIHJldHVybmVkIHZhbHVlcy4gIElmIGFueSB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gZmFpbGVkLCByZXR1cm5zXG4gKiB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIGNvbmNhdGVuYXRlZCBzdW1tYXJ5IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFJlc3VsdHM8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoZWxlbWVudHMpO1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgc3VjZXNzZnVsIHJlc3VsdHMgZnJvbSBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSxcbiAqIG9wdGlvbmFsbHkgaWdub3JpbmcgY2VydGFpbiBlcnJvciBkZXRhaWxzLlxuICogQHBhcmFtIHJlc3VsdHMgLSBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHRvIGJlIG1hcHBlZC5cbiAqIEBwYXJhbSBpZ25vcmUgLSBBbiBhcnJheSBvZiBlcnJvciBkZXRhaWwgdmFsdWVzIChvZiB0eXBlIGA8VEQ+YCkgdGhhdCBzaG91bGQgYmUgaWdub3JlZC5cbiAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHN1Y2Nlc3NmdWwgcmVzdWx0cyBpZiBhbGwgcmVzdWx0cyBlaXRoZXJcbiAqIHN1Y2VlZGVkIG9yIHJldHVybmVkIGVycm9yIGRldGFpbHMgbGlzdGVkIGluIGBpZ25vcmVgLiAgSWYgYW55IHJlc3VsdHMgZmFpbGVkIHdpdGggZGV0YWlsc1xuICogdGhhdCBjYW5ub3QgYmUgaWdub3JlZCwgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBjb25jYXRlbmF0ZWQgc3VtbWFyeSBvZiBhbGwgbm9uLWlnbm9yYWJsZVxuICogZXJyb3IgbWVzYXNnZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBEZXRhaWxlZFJlc3VsdHM8VCwgVEQ+KHJlc3VsdHM6IEl0ZXJhYmxlPERldGFpbGVkUmVzdWx0PFQsIFREPj4sIGlnbm9yZTogVERbXSk6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlnbm9yZS5pbmNsdWRlcyhyZXN1bHQuZGV0YWlsKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGVsZW1lbnRzKTtcbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIHN1Y2Nlc3NmdWwgcmVzdWx0cyBmcm9tIGEgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59LlxuICogQHBhcmFtIHJlc3VsdHMgLSBBbiBgSXRlcmFibGVgIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59IGZyb20gd2hpY2ggc3VjY2Vzc1xuICogcmVzdWx0cyBhcmUgdG8gYmUgYWdncmVnYXRlZC5cbiAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGFuIGFycmF5IG9mIGA8VD5gIGlmIGFueSByZXN1bHRzIHdlcmUgc3VjY2Vzc2Z1bC4gSWZcbiAqIGFsbCB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gZmFpbGVkLCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgY29uY2F0ZW5hdGVkXG4gKiBzdW1tYXJ5IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFN1Y2Nlc3M8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgJiYgKGVycm9ycy5sZW5ndGggPiAwKSkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChlbGVtZW50cyk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBlcnJvciBtZXNzYWdlcyBmcm9tIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fS5cbiAqIEBwYXJhbSByZXN1bHRzIC0gQW4gaW50ZXJhYmxlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gZm9yIHdoaWNoXG4gKiBlcnJvciBtZXNzYWdlcyBhcmUgYWdncmVnYXRlZC5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgY29uc2lzdGluZyBvZiBhbGwgZXJyb3IgbWVzc2FnZXMgcmV0dXJuZWQgYnlcbiAqIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBpbiB0aGUgc291cmNlIGNvbGxlY3Rpb24uIElnbm9yZXMge0BsaW5rIFN1Y2Nlc3N9XG4gKiByZXN1bHRzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIHdlcmUgbm8gZXJyb3JzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwRmFpbHVyZXM8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIGl0ZXJhYmxlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gd2VyZSBhbGwgc3VjY2Vzc2Z1bC5cbiAqIEBwYXJhbSByZXN1bHRzIC0gVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gdG8gYmUgdGVzdGVkLlxuICogQHJldHVybnMgUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBgdHJ1ZWAgaWYgYWxsIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBhcmUgc3VjY2Vzc2Z1bC5cbiAqIElmIGFueSBhcmUgdW5zdWNjZXNzZnVsLCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgY29uY2F0ZW5hdGVkIHN1bW1hcnkgdGhlIGVycm9yXG4gKiBtZXNzYWdlcyBmcm9tIGFsbCBmYWlsZWQgZWxlbWVudHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxTdWNjZWVkPFQ+KHJlc3VsdHM6IEl0ZXJhYmxlPFJlc3VsdDx1bmtub3duPj4sIHN1Y2Nlc3NWYWx1ZTogVCk6IFJlc3VsdDxUPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3VjY2Vzc1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBTdHJpbmcta2V5ZWQgcmVjb3JkIG9mIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyB0byBiZSBwYXNzZWQgdG8ge0BsaW5rIHBvcHVsYXRlT2JqZWN0fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmllbGRJbml0aWFsaXplcnM8VD4gPSB7IFsga2V5IGluIGtleW9mIFQgXTogKHN0YXRlOiBQYXJ0aWFsPFQ+KSA9PiBSZXN1bHQ8VFtrZXldPiB9O1xuXG4vKipcbiAqIFBvcHVsYXRlcyBhbiBhbiBvYmplY3QgYmFzZWQgb24gYSBwcm90b3R5cGUgZnVsbCBvZiBmaWVsZCBpbml0aWFsaXplcnMgdGhhdCByZXR1cm4ge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUW2tleV0+fS5cbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHBvcHVsYXRlZCBvYmplY3QgaWYgYWxsIGluaXRpYWxpemVycyBzdWNjZWVkLCBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhXG4gKiBjb25jYXRlbmF0ZWQgbGlzdCBvZiBhbGwgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gaW5pdGlhbGl6ZXJzIC0gQW4gb2JqZWN0IHdpdGggdGhlIHNoYXBlIG9mIHRoZSB0YXJnZXQgYnV0IHdpdGggaW5pdGlhbGl6ZXIgZnVuY3Rpb25zIGZvclxuICogZWFjaCBwcm9wZXJ0eS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcHVsYXRlT2JqZWN0PFQ+KGluaXRpYWxpemVyczogRmllbGRJbml0aWFsaXplcnM8VD4sIG9yZGVyPzogKGtleW9mIFQpW10pOiBSZXN1bHQ8VD4ge1xuICAgIGNvbnN0IHN0YXRlID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qga2V5czogKGtleW9mIFQpW10gPSBBcnJheS5mcm9tKG9yZGVyID8/IFtdKTtcbiAgICBjb25zdCBmb3VuZEtleXMgPSBuZXcgU2V0PGtleW9mIFQ+KG9yZGVyKTtcblxuICAgIC8vIHN0YXJ0IHdpdGggdGhlIHN1cHBsaWVkIG9yZGVyIHRoZW4gYXBwZW5kIGFueXRoaW5nIGVsc2Ugd2UgZmluZFxuICAgIGZvciAoY29uc3Qga2V5IGluIGluaXRpYWxpemVycykge1xuICAgICAgICBpZiAoIWZvdW5kS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICBmb3VuZEtleXMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChpbml0aWFsaXplcnNba2V5XSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5pdGlhbGl6ZXJzW2tleV0oc3RhdGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChgcG9wdWxhdGVPYmplY3Q6IEtleSAke2tleX0gaXMgcHJlc2VudCBidXQgaGFzIG5vIGluaXRpYWxpemVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUgYXMgVCk7XG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUF3SUg7Ozs7R0FJRztBQUNILE1BQWEsT0FBTztJQVVoQjs7O09BR0c7SUFDSCxZQUFZLEtBQVE7UUFicEI7O1dBRUc7UUFDYSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBVzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNaLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUF1QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsSUFBUTs7UUFDN0IsT0FBTyxNQUFBLElBQUksQ0FBQyxNQUFNLG1DQUFJLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUssRUFBOEI7UUFDL0MsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxDQUF5QjtRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBSyxPQUFXO1FBQ3BDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBSyxNQUFVLEVBQUUsYUFBa0I7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WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9IG9mIHNvbWUgb3BlcmF0aW9uIG9yIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMuXG4gKiBAcmVtYXJrc1xuICoge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fSBhbmQge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fSBzaGFyZSB0aGUgY29tbW9uXG4gKiBjb250cmFjdCB7QGxpbmsgSVJlc3VsdH0sIGVuYWJsaW5nIGNvbW1pbmdsZWQgZGlzY3JpbWluYXRlZCB1c2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0PFQ+ID0gU3VjY2VzczxUPiB8IEZhaWx1cmU8VD47XG4vKipcbiAqIENvbnRpbnVhdGlvbiBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IHRoYXQgYW5cbiAqIHtAbGluayBSZXN1bHR9IGlzIHN1Y2Nlc3NmdWwuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFN1Y2Nlc3NDb250aW51YXRpb248VCwgVE4+ID0gKHZhbHVlOiBUKSA9PiBSZXN1bHQ8VE4+O1xuLyoqXG4gKiBDb250aW51YXRpb24gY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGluIHRoZSBldmVudCB0aGF0IGFuXG4gKiB7QGxpbmsgUmVzdWx0fSBmYWlscy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmFpbHVyZUNvbnRpbnVhdGlvbjxUPiA9IChtZXNzYWdlOiBzdHJpbmcpID0+IFJlc3VsdDxUPjtcbi8qKlxuICogVHlwZSBpbmZlcmVuY2UgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQgdHlwZSBvZiBhbiB7QGxpbmsgUmVzdWx0fS5cbiAqIEBiZXRhXG4gKi9cbmV4cG9ydCB0eXBlIFJlc3VsdFZhbHVlVHlwZTxUPiA9IFQgZXh0ZW5kcyBSZXN1bHQ8aW5mZXIgVFY+ID8gVFYgOiBuZXZlcjtcblxuLyoqXG4gKiBTaW1wbGUgbG9nZ2VyIGludGVyZmFjZSB1c2VkIGJ5IHtAbGluayBJUmVzdWx0LmdldFZhbHVlT3JUaHJvd30uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJlc3VsdExvZ2dlciB7XG4gICAgLyoqXG4gICAgICogTG9nIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2Ygc29tZSBvcGVyYXRpb24gb2Ygc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucy5cbiAqIEByZW1hcmtzXG4gKiBUaGlzIGNvbW1vbiBjb250cmFjdCBlbmFibGVzIGNvbW1pbmdsZWQgZGlzY3JpbWluYXRlZCB1c2FnZSBvZiB7QGxpbmsgU3VjY2VzcyB8IFN1Y2Nlc3M8VD59XG4gKiBhbmQge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVzdWx0PFQ+IHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHN1Y2Nlc3M6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIEZ1bmN0aW9uc1xuICAgICAqIGFzIGEgdHlwZSBndWFyZCBmb3Ige0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fS5cbiAgICAgKi9cbiAgICBpc1N1Y2Nlc3MoKTogdGhpcyBpcyBTdWNjZXNzPFQ+O1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gZmFpbGVkLiAgRnVuY3Rpb25zXG4gICAgICogYXMgYSB0eXBlIGd1YXJkIGZvciB7QGxpbmsgRmFpbHVyZSB8IEZhaWx1cmU8VD59LlxuICAgICAqL1xuICAgIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSxcbiAgICAgKiBvciB0aHJvd3MgdGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gbG9nZ2VyIC0gQW4gb3B0aW9uYWwge0BsaW5rIElSZXN1bHRMb2dnZXIgfCBsb2dnZXJ9IHRvIHdoaWNoIHRoZVxuICAgICAqIGVycm9yIHdpbGwgYWxzbyBiZSByZXBvcnRlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlLCBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqIEB0aHJvd3MgVGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICovXG4gICAgZ2V0VmFsdWVPclRocm93KGxvZ2dlcj86IElSZXN1bHRMb2dnZXIpOiBUO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgc3VjY2Vzc2Z1bCB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0sXG4gICAgICogb3IgYSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHBhcmFtIGRmbHQgLSBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQgKGRlZmF1bHQgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCkuXG4gICAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIFJldHVybnNcbiAgICAgKiB0aGUgc3VwcGxpZWQgZGVmYXVsdCB2YWx1ZSBvciBgdW5kZWZpbmVkYCBpZiBubyBkZWZhdWx0IGlzIHN1cHBsaWVkLlxuICAgICAqL1xuICAgIGdldFZhbHVlT3JEZWZhdWx0KGRmbHQ/OiBUKTogVHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIHN1cHBsaWVkIHtAbGluayBTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjb250aW51YXRpb259IGlmXG4gICAgICogdGhlIG9wZXJhdGlvbiB3YXMgYSBzdWNjZXNzLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHtAbGluayBTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjb250aW51YXRpb259IG1pZ2h0IHJldHVybiBhXG4gICAgICogZGlmZmVyZW50IHJlc3VsdCB0eXBlIHRoYW4ge0BsaW5rIElSZXN1bHR9IG9uIHdoaWNoIGl0IGlzIGludm9rZWQuIFRoaXNcbiAgICAgKiBlbmFibGVzIGNoYWluaW5nIG9mIG9wZXJhdGlvbnMgd2l0aCBoZXRlcm9nZW5vdXMgcmV0dXJuIHR5cGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNiIC0gVGhlIHtAbGluayBTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjb250aW51YXRpb259IHRvXG4gICAgICogYmUgY2FsbGVkIGluIHRoZSBldmVudCBvZiBzdWNjZXNzLlxuICAgICAqIEByZXR1cm5zIElmIHRoaXMgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCByZXR1cm5zIHRoZSB2YWx1ZSByZXR1cm5lZFxuICAgICAqIGJ5IHRoZSB7QGxpbmsgU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY29udGludWF0aW9ufS4gIElmIHRoaXMgcmVzdWx0XG4gICAgICogZmFpbGVkLCBwcm9wYWdhdGVzIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhpcyBmYWlsdXJlLlxuICAgICAqL1xuICAgIG9uU3VjY2VzczxUTj4oY2I6IFN1Y2Nlc3NDb250aW51YXRpb248VCwgVE4+KTogUmVzdWx0PFROPjtcblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgc3VwcGxpZWQge0BsaW5rIEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsZWQgY29udGludWF0aW9ufSBpZlxuICAgICAqIHRoZSBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEBwYXJhbSBjYiAtIFRoZSB7QGxpbmsgRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWx1cmUgY29udGludWF0aW9ufSB0b1xuICAgICAqIGJlIGNhbGxlZCBpbiB0aGUgZXZlbnQgb2YgZmFpbHVyZS5cbiAgICAgKiBAcmV0dXJucyBJZiB0aGlzIG9wZXJhdGlvbiBmYWlsZWQsIHJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZVxuICAgICAqIHtAbGluayBGYWlsdXJlQ29udGludWF0aW9uIHwgZmFpbHVyZSBjb250aW51YXRpb259LiAgSWYgdGhpcyByZXN1bHRcbiAgICAgKiB3YXMgc3VjY2Vzc2Z1bCwgcHJvcGFnYXRlcyB0aGUgcmVzdWx0IHZhbHVlIGZyb20gdGhlIHN1Y2Nlc3NmdWwgZXZlbnQuXG4gICAgICovXG4gICAgb25GYWlsdXJlKGNiOiBGYWlsdXJlQ29udGludWF0aW9uPFQ+KTogUmVzdWx0PFQ+O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSB7QGxpbmsgSVJlc3VsdCB8IElSZXN1bHQ8VD59IHRvIGEge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSxcbiAgICAgKiBhZGRpbmcgYSBzdXBwbGllZCBkZXRhaWwgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHBhcmFtIGRldGFpbCAtIFRoZSBkZXRhaWwgdG8gYmUgYWRkZWQgaWYgdGhpcyBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0gd2l0aCBlaXRoZXJcbiAgICAgKiB0aGUgc3VjY2VzcyByZXN1bHQgb3IgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGlzIHtAbGluayBJUmVzdWx0fSwgd2l0aFxuICAgICAqIHRoZSBzdXBwbGllZCBkZXRhaWwgKGlmIHRoaXMgZXZlbnQgZmFpbGVkKSBvciBkZXRhaWwgYHVuZGVmaW5lZGAgKGlmXG4gICAgICogdGhpcyByZXN1bHQgc3VjY2VlZGVkKS5cbiAgICAgKi9cbiAgICB3aXRoRmFpbHVyZURldGFpbDxURD4oZGV0YWlsOiBURCk6IERldGFpbGVkUmVzdWx0PFQsIFREPjtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEge0BsaW5rIElSZXN1bHQgfCBJUmVzdWx0PFQ+fSB0byBhIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0sXG4gICAgICogYWRkaW5nIHN1cHBsaWVkIGRldGFpbHMuXG4gICAgICogQHBhcmFtIGRldGFpbCAtIFRoZSBkZWZhdWx0IGRldGFpbCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHtAbGluayBEZXRhaWxlZFJlc3VsdH0uXG4gICAgICogQHBhcmFtIHN1Y2Nlc3NEZXRhaWwgLSBBbiBvcHRpb25hbCBkZXRhaWwgdG8gYmUgYWRkZWQgaWYgdGhpcyByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSB3aXRoIGVpdGhlclxuICAgICAqIHRoZSBzdWNjZXNzIHJlc3VsdCBvciB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoaXMge0BsaW5rIElSZXN1bHR9IGFuZCB0aGVcbiAgICAgKiBhcHByb3ByaWF0ZSBhZGRlZCBkZXRhaWwuXG4gICAgICovXG4gICAgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+O1xufVxuXG4vKipcbiAqIFJlcG9ydHMgYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSBmcm9tIHNvbWUgb3BlcmF0aW9uIGFuZCB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgdmFsdWUuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWNjZXNzPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuc3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VjY2VzcyA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHQgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc1N1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIGlzU3VjY2VzcygpOiB0aGlzIGlzIFN1Y2Nlc3M8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc0ZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yVGhyb3coX2xvZ2dlcj86IElSZXN1bHRMb2dnZXIpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmdldFZhbHVlT3JEZWZhdWx0fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IGRmbHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25TdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KGNiOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25GYWlsdXJlfVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoXzogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhGYWlsdXJlRGV0YWlsfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmFpbHVyZURldGFpbDxURD4oX2RldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQud2l0aERldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKHRoaXMudmFsdWUsIHN1Y2Nlc3NEZXRhaWwgPz8gZGV0YWlsKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyBhIGZhaWxlZCB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0gZnJvbSBzb21lIG9wZXJhdGlvbiwgd2l0aCBhbiBlcnJvciBtZXNzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRmFpbHVyZTxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LnN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgRmFpbHVyZX0gd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzU3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc0ZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5nZXRWYWx1ZU9yVGhyb3d9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JUaHJvdyhsb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogbmV2ZXIge1xuICAgICAgICBpZiAobG9nZ2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcih0aGlzLl9tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5fbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPckRlZmF1bHR9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JEZWZhdWx0KGRmbHQ/OiBUKTogVHx1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gZGZsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vblN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oXzogU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4pOiBSZXN1bHQ8VE4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWlsdXJlKHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25GYWlsdXJlfVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoY2I6IEZhaWx1cmVDb250aW51YXRpb248VD4pOiBSZXN1bHQ8VD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC53aXRoRmFpbHVyZURldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZhaWx1cmVEZXRhaWw8VEQ+KGRldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwodGhpcy5tZXNzYWdlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhEZXRhaWx9XG4gICAgICovXG4gICAgcHVibGljIHdpdGhEZXRhaWw8VEQ+KGRldGFpbDogVEQsIF9zdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwodGhpcy5tZXNzYWdlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhICdmcmllbmRseScgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBGYWlsdXJlfSB2YWx1ZSBpcyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fSB3aXRoIHRoZSBzdXBwbGllZCByZXN1bHQgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3VjY2Vzc2Z1bCByZXN1bHQgdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2NlZWQ8VD4odmFsdWU6IFQpOiBTdWNjZXNzPFQ+IHtcbiAgICByZXR1cm4gbmV3IFN1Y2Nlc3M8VD4odmFsdWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fSB3aXRoIHRoZSBzdXBwbGllZCBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbDxUPihtZXNzYWdlOiBzdHJpbmcpOiBGYWlsdXJlPFQ+IHtcbiAgICByZXR1cm4gbmV3IEZhaWx1cmU8VD4obWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGVuY291bnRlcnMgc3VjY2Vzcy5cbiAqIEByZW1hcmtzXG4gKiBBIHN1Y2Nlc3MgY2FsbGJhY2sgY2FuIHJldHVybiBhIGRpZmZlcmVudCByZXN1bHQgdHlwZSB0aGFuIGl0IHJlY2VpdmVzLCBhbGxvd2luZ1xuICogc3VjY2VzcyByZXN1bHRzIHRvIGNoYWluIHRocm91Z2ggaW50ZXJtZWRpYXRlIHJlc3VsdCB0eXBlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4gPSAodmFsdWU6IFQsIGRldGFpbD86IFREKSA9PiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+O1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fSBlbmNvdW50ZXJzIGEgZmFpbHVyZS5cbiAqIEByZW1hcmtzXG4gKiBBIGZhaWx1cmUgY2FsbGJhY2sgY2FuIGNoYW5nZSB7QGxpbmsgRmFpbHVyZX0gdG8ge0BsaW5rIFN1Y2Nlc3N9IChlLmcuIGJ5IHJldHVybmluZyBhIGRlZmF1bHQgdmFsdWUpXG4gKiBvciBpdCBjYW4gY2hhbmdlIG9yIGVtYmVsbGlzaCB0aGUgZXJyb3IgbWVzc2FnZSwgYnV0IGl0IGNhbm5vdCBjaGFuZ2UgdGhlIHN1Y2Nlc3MgcmV0dXJuIHR5cGUuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4gPSAobWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKSA9PiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG5cbi8qKlxuICogQSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBleHRlbmRzIHtAbGluayBTdWNjZXNzfSB0byByZXBvcnQgb3B0aW9uYWwgc3VjY2VzcyBkZXRhaWxzIGluXG4gKiBhZGRpdGlvbiB0byB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldGFpbGVkU3VjY2VzczxULCBURD4gZXh0ZW5kcyBTdWNjZXNzPFQ+IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RldGFpbD86IFREO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzIHwgRGV0YWlsZWRTdWNjZXNzPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWRcbiAgICAgKiB2YWx1ZSBhbmQgZGV0YWlsLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gQW4gb3B0aW9uYWwgc3VjY2Vzc2Z1bCBkZXRhaWwgdG8gYmUgcmV0dXJuZWQuICBJZiBvbWl0dGVkLCBkZXRhaWxcbiAgICAgKiB3aWxsIGJlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgZGV0YWlsPzogVEQpIHtcbiAgICAgICAgc3VwZXIodmFsdWUpO1xuICAgICAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN1Y2Nlc3MgZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9LCBvciBgdW5kZWZpbmVkYCBpZlxuICAgICAqIG5vIGRldGFpbCB3YXMgc3VwcGxpZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkZXRhaWwoKTogVER8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHRoYXQgdGhpcyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBpcyBhIHN1Y2Nlc3MuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHdheXMgdHJ1ZSBmb3Ige0BsaW5rIERldGFpbGVkU3VjY2Vzc30gYnV0IGNhbiBiZSB1c2VkIGFzIHR5cGUgZ3VhcmRcbiAgICAgKiB0byBkaXNjcmltaW5hdGUge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gZnJvbSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpblxuICAgICAqIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgRGV0YWlsZWRTdWNjZXNzPFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHN1cHBsaWVkIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNhbGxiYWNrfSBhbmQgcHJvcGFnYXRlc1xuICAgICAqIGl0cyByZXR1cm5lZCB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+fS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBzdWNjZXNzIGNhbGxiYWNrIG11dGF0ZXMgdGhlIHJldHVybiB0eXBlIGZyb20gYDxUPmAgdG8gYDxUTj5gLlxuICAgICAqIEBwYXJhbSBjYiAtIFRoZSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjYWxsYmFja30gdG8gYmUgaW52b2tlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSByZXR1cm5lZCBieSB0aGUgc3VjY2VzcyBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25TdWNjZXNzPFROPihjYjogRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4pOiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudmFsdWUsIHRoaXMuX2RldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGFnYXRlcyB0aGlzIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRmFpbHVyZSBkb2VzIG5vdCBtdXRhdGUgcmV0dXJuIHR5cGUgc28gd2UgY2FuIHJldHVybiB0aGlzIGV2ZW50IGRpcmVjdGx5LlxuICAgICAqIEBwYXJhbSBfY2IgLSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uIHwgRmFpbHVyZSBjYWxsYmFja30gdG8gYmUgY2FsbGVkXG4gICAgICogb24gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGluIGNhc2Ugb2YgZmFpbHVyZSAoaWdub3JlZCkuXG4gICAgICogQHJldHVybnMgYHRoaXNgXG4gICAgICovXG4gICAgcHVibGljIG9uRmFpbHVyZShfY2I6IERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4pOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBleHRlbmRzIHtAbGluayBGYWlsdXJlfSB0byByZXBvcnQgb3B0aW9uYWwgZmFpbHVyZSBkZXRhaWxzIGluXG4gKiBhZGRpdGlvbiB0byB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldGFpbGVkRmFpbHVyZTxULCBURD4gZXh0ZW5kcyBGYWlsdXJlPFQ+IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RldGFpbDogVEQ7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBEZXRhaWxlZEZhaWx1cmUgfCBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZFxuICAgICAqIG1lc3NhZ2UgYW5kIGRldGFpbC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZXJyb3IgZGV0YWlsIHRvIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbDogVEQpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX2RldGFpbCA9IGRldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGV0YWlsKCk6IFREIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHRoYXQgdGhpcyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpcyBhIGZhaWx1cmUuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHdheXMgdHJ1ZSBmb3Ige0BsaW5rIERldGFpbGVkRmFpbHVyZX0gYnV0IGNhbiBiZSB1c2VkIGFzIHR5cGUgZ3VhcmRcbiAgICAgKiB0byBkaXNjcmltaW5hdGUge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gZnJvbSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpblxuICAgICAqIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRGV0YWlsZWRGYWlsdXJlPFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3BhZ2F0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGRldGFpbCBmcm9tIHRoaXMgcmVzdWx0LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTXV0YXRlcyB0aGUgc3VjY2VzcyB0eXBlIGFzIHRoZSBzdWNjZXNzIGNhbGxiYWNrIHdvdWxkIGhhdmUsIGJ1dCBkb2VzIG5vdFxuICAgICAqIGNhbGwgdGhlIHN1Y2Nlc3MgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIF9jYiAtIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb24gfCBTdWNjZXNzIGNhbGxiYWNrfSB0byBiZSBjYWxsZWRcbiAgICAgKiBvbiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0gaW4gY2FzZSBvZiBzdWNjZXNzIChpZ25vcmVkKS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFROLCBURD59IHdoaWNoIGNvbnRhaW5zXG4gICAgICogdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGRldGFpbCBmcm9tIHRoaXMgb25lLlxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KF9jYjogRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4pOiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZXRhaWxlZEZhaWx1cmU8VE4sIFREPih0aGlzLm1lc3NhZ2UsIHRoaXMuX2RldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgc3VwcGxpZWQge0BsaW5rIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWx1cmUgY2FsbGJhY2t9IGFuZCBwcm9wYWdhdGVzXG4gICAgICogaXRzIHJldHVybmVkIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0uXG4gICAgICogQHBhcmFtIGNiIC0gVGhlIHtAbGluayBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNhbGxiYWNrfSB0byBiZSBpbnZva2VkLlxuICAgICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHJldHVybmVkIGJ5IHRoZSBmYWlsdXJlIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoY2I6IERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4pOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy5tZXNzYWdlLCB0aGlzLl9kZXRhaWwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIGBUYCBvZiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0uXG4gKiBAYmV0YVxuICovXG5leHBvcnQgdHlwZSBEZXRhaWxlZFJlc3VsdDxULCBURD4gPSBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fERldGFpbGVkRmFpbHVyZTxULCBURD47XG5cbi8qKlxuICogVHlwZSBpbmZlcmVuY2UgdG8gZGV0ZXJtaW5lIHRoZSBkZXRhaWwgdHlwZSBgVERgIG9mIGEge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fS5cbiAqIEBiZXRhXG4gKi9cbmV4cG9ydCB0eXBlIFJlc3VsdERldGFpbFR5cGU8VD4gPSBUIGV4dGVuZHMgRGV0YWlsZWRSZXN1bHQ8dW5rbm93biwgaW5mZXIgVEQ+ID8gVEQgOiBuZXZlcjtcblxuLyoqXG4gKiBSZXR1cm5zIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3MgfCBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fSB3aXRoIGEgc3VwcGxpZWQgdmFsdWUgYW5kIG9wdGlvbmFsXG4gKiBkZXRhaWwuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdHlwZSBgPFQ+YCB0byBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBkZXRhaWwgLSBBbiBvcHRpb25hbCBkZXRhaWwgb2YgdHlwZSBgPFREPmAgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3MgfCBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZVxuICogYW5kIGRldGFpbCwgaWYgc3VwcGxpZWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZWVkV2l0aERldGFpbDxULCBURD4odmFsdWU6IFQsIGRldGFpbD86IFREKTogRGV0YWlsZWRTdWNjZXNzPFQsIFREPiB7XG4gICAgcmV0dXJuIG5ldyBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+KHZhbHVlLCBkZXRhaWwpO1xufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIERldGFpbGVkRmFpbHVyZSB8IERldGFpbGVkRmFpbHVyZTxULCBURD59IHdpdGggYSBzdXBwbGllZCBlcnJvciBtZXNzYWdlIGFuZCBkZXRhaWwuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGRldGFpbCAtIFRoZSBldmVudCBkZXRhaWwgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBbiB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWQgZXJyb3JcbiAqIG1lc3NhZ2UgYW5kIGRldGFpbC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWxXaXRoRGV0YWlsPFQsIFREPihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbDogVEQpOiBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+IHtcbiAgICByZXR1cm4gbmV3IERldGFpbGVkRmFpbHVyZTxULCBURD4obWVzc2FnZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBQcm9wYWdhdGVzIGEge0BsaW5rIFN1Y2Nlc3N9IG9yIHtAbGluayBGYWlsdXJlfSB7QGxpbmsgUmVzdWx0fSwgYWRkaW5nIHN1cHBsaWVkXG4gKiBldmVudCBkZXRhaWxzIGFzIGFwcHJvcHJpYXRlLlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSB7QGxpbmsgUmVzdWx0fSB0byBiZSBwcm9wYWdhdGVkLlxuICogQHBhcmFtIGRldGFpbCAtIFRoZSBldmVudCBkZXRhaWwgKHR5cGUgYDxURD5gKSB0byBiZSBhZGRlZCB0byB0aGUge0BsaW5rIFJlc3VsdCB8IHJlc3VsdH0uXG4gKiBAcGFyYW0gc3VjY2Vzc0RldGFpbCAtIEFuIG9wdGlvbmFsIGRpc3RpbmN0IGV2ZW50IGRldGFpbCB0byBiZSBhZGRlZCB0byB7QGxpbmsgU3VjY2Vzc30gcmVzdWx0cy4gIElmIGBzdWNjZXNzRGV0YWlsYFxuICogaXMgb21pdHRlZCBvciBgdW5kZWZpbmVkYCwgdGhlbiBgZGV0YWlsYCB3aWxsIGJlIGFwcGxpZWQgdG8ge0BsaW5rIFN1Y2Nlc3N9IHJlc3VsdHMuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHdpdGggdGhlIHN1Y2Nlc3MgdmFsdWUgb3IgZXJyb3JcbiAqIG1lc3NhZ2UgZnJvbSB0aGUgb3JpZ2luYWwgYHJlc3VsdGAgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgYWRkZWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wYWdhdGVXaXRoRGV0YWlsPFQsIFREPihyZXN1bHQ6IFJlc3VsdDxUPiwgZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICByZXR1cm4gcmVzdWx0LmlzU3VjY2VzcygpXG4gICAgICAgID8gc3VjY2VlZFdpdGhEZXRhaWwocmVzdWx0LnZhbHVlLCBzdWNjZXNzRGV0YWlsID8/IGRldGFpbClcbiAgICAgICAgOiBmYWlsV2l0aERldGFpbChyZXN1bHQubWVzc2FnZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIGZ1bmN0aW9uIHdoaWNoIG1pZ2h0IHRocm93IHRvIGNvbnZlcnQgZXhjZXB0aW9uIHJlc3VsdHNcbiAqIHRvIHtAbGluayBGYWlsdXJlfS5cbiAqIEBwYXJhbSBmdW5jIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhcHR1cmVkLlxuICogQHJldHVybnMgUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIHZhbHVlIG9mIHR5cGUgYDxUPmAgb25cbiAqIHN1Y2Nlc3MgLCBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCB0aGUgdGhyb3duIGVycm9yIG1lc3NhZ2UgaWZcbiAqIGBmdW5jYCB0aHJvd3MgYW4gYEVycm9yYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVSZXN1bHQ8VD4oZnVuYzogKCkgPT4gVCk6IFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnVuYygpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFpbCgoZXJyIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBzdWNjZXNzZnVsIHJlc3VsdCB2YWx1ZXMgZnJvbSBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0uXG4gKiBAcGFyYW0gcmVzdWx0cyAtIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59IHRvIGJlIG1hcHBlZC5cbiAqIEByZXR1cm5zICBJZiBhbGwge0BsaW5rIFJlc3VsdCB8IHJlc3VsdHN9IGFyZSBzdWNjZXNzZnVsLCByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGFuXG4gKiBhcnJheSBjb250YWluaW5nIGFsbCByZXR1cm5lZCB2YWx1ZXMuICBJZiBhbnkge0BsaW5rIFJlc3VsdCB8IHJlc3VsdHN9IGZhaWxlZCwgcmV0dXJuc1xuICoge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBjb25jYXRlbmF0ZWQgc3VtbWFyeSBvZiBhbGwgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBSZXN1bHRzPFQ+KHJlc3VsdHM6IEl0ZXJhYmxlPFJlc3VsdDxUPj4pOiBSZXN1bHQ8VFtdPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVsZW1lbnRzOiBUW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGVsZW1lbnRzKTtcbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIHN1Y2Nlc3NmdWwgcmVzdWx0cyBmcm9tIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LFxuICogb3B0aW9uYWxseSBpZ25vcmluZyBjZXJ0YWluIGVycm9yIGRldGFpbHMuXG4gKiBAcGFyYW0gcmVzdWx0cyAtIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0gdG8gYmUgbWFwcGVkLlxuICogQHBhcmFtIGlnbm9yZSAtIEFuIGFycmF5IG9mIGVycm9yIGRldGFpbCB2YWx1ZXMgKG9mIHR5cGUgYDxURD5gKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkLlxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYW4gYXJyYXkgY29udGFpbmluZyBhbGwgc3VjY2Vzc2Z1bCByZXN1bHRzIGlmIGFsbCByZXN1bHRzIGVpdGhlclxuICogc3VjY2VlZGVkIG9yIHJldHVybmVkIGVycm9yIGRldGFpbHMgbGlzdGVkIGluIGBpZ25vcmVgLiAgSWYgYW55IHJlc3VsdHMgZmFpbGVkIHdpdGggZGV0YWlsc1xuICogdGhhdCBjYW5ub3QgYmUgaWdub3JlZCwgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBjb25jYXRlbmF0ZWQgc3VtbWFyeSBvZiBhbGwgbm9uLWlnbm9yYWJsZVxuICogZXJyb3IgbWVzc2FnZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBEZXRhaWxlZFJlc3VsdHM8VCwgVEQ+KHJlc3VsdHM6IEl0ZXJhYmxlPERldGFpbGVkUmVzdWx0PFQsIFREPj4sIGlnbm9yZTogVERbXSk6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlnbm9yZS5pbmNsdWRlcyhyZXN1bHQuZGV0YWlsKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGVsZW1lbnRzKTtcbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIHN1Y2Nlc3NmdWwgcmVzdWx0cyBmcm9tIGEgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59LlxuICogQHBhcmFtIHJlc3VsdHMgLSBBbiBgSXRlcmFibGVgIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59IGZyb20gd2hpY2ggc3VjY2Vzc1xuICogcmVzdWx0cyBhcmUgdG8gYmUgYWdncmVnYXRlZC5cbiAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGFuIGFycmF5IG9mIGA8VD5gIGlmIGFueSByZXN1bHRzIHdlcmUgc3VjY2Vzc2Z1bC4gSWZcbiAqIGFsbCB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gZmFpbGVkLCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgY29uY2F0ZW5hdGVkXG4gKiBzdW1tYXJ5IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFN1Y2Nlc3M8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgJiYgKGVycm9ycy5sZW5ndGggPiAwKSkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChlbGVtZW50cyk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBlcnJvciBtZXNzYWdlcyBmcm9tIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fS5cbiAqIEBwYXJhbSByZXN1bHRzIC0gQW4gaXRlcmFibGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fSBmb3Igd2hpY2hcbiAqIGVycm9yIG1lc3NhZ2VzIGFyZSBhZ2dyZWdhdGVkLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncyBjb25zaXN0aW5nIG9mIGFsbCBlcnJvciBtZXNzYWdlcyByZXR1cm5lZCBieVxuICoge0BsaW5rIFJlc3VsdCB8IHJlc3VsdHN9IGluIHRoZSBzb3VyY2UgY29sbGVjdGlvbi4gSWdub3JlcyB7QGxpbmsgU3VjY2Vzc31cbiAqIHJlc3VsdHMgYW5kIHJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgd2VyZSBubyBlcnJvcnMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBGYWlsdXJlczxUPihyZXN1bHRzOiBJdGVyYWJsZTxSZXN1bHQ8VD4+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYW4gaXRlcmFibGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fSB3ZXJlIGFsbCBzdWNjZXNzZnVsLlxuICogQHBhcmFtIHJlc3VsdHMgLSBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fSB0byBiZSB0ZXN0ZWQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGB0cnVlYCBpZiBhbGwge0BsaW5rIFJlc3VsdCB8IHJlc3VsdHN9IGFyZSBzdWNjZXNzZnVsLlxuICogSWYgYW55IGFyZSB1bnN1Y2Nlc3NmdWwsIHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBjb25jYXRlbmF0ZWQgc3VtbWFyeSB0aGUgZXJyb3JcbiAqIG1lc3NhZ2VzIGZyb20gYWxsIGZhaWxlZCBlbGVtZW50cy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbFN1Y2NlZWQ8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PHVua25vd24+Piwgc3VjY2Vzc1ZhbHVlOiBUKTogUmVzdWx0PFQ+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgIGlmIChyZXN1bHRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChzdWNjZXNzVmFsdWUpO1xufVxuXG4vKipcbiAqIFN0cmluZy1rZXllZCByZWNvcmQgb2YgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIHRvIGJlIHBhc3NlZCB0byB7QGxpbmsgcG9wdWxhdGVPYmplY3R9LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGaWVsZEluaXRpYWxpemVyczxUPiA9IHsgWyBrZXkgaW4ga2V5b2YgVCBdOiAoc3RhdGU6IFBhcnRpYWw8VD4pID0+IFJlc3VsdDxUW2tleV0+IH07XG5cbi8qKlxuICogUG9wdWxhdGVzIGFuIGFuIG9iamVjdCBiYXNlZCBvbiBhIHByb3RvdHlwZSBmdWxsIG9mIGZpZWxkIGluaXRpYWxpemVycyB0aGF0IHJldHVybiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFRba2V5XT59LlxuICogUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcG9wdWxhdGVkIG9iamVjdCBpZiBhbGwgaW5pdGlhbGl6ZXJzIHN1Y2NlZWQsIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFcbiAqIGNvbmNhdGVuYXRlZCBsaXN0IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSBpbml0aWFsaXplcnMgLSBBbiBvYmplY3Qgd2l0aCB0aGUgc2hhcGUgb2YgdGhlIHRhcmdldCBidXQgd2l0aCBpbml0aWFsaXplciBmdW5jdGlvbnMgZm9yXG4gKiBlYWNoIHByb3BlcnR5LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVPYmplY3Q8VD4oaW5pdGlhbGl6ZXJzOiBGaWVsZEluaXRpYWxpemVyczxUPiwgb3JkZXI/OiAoa2V5b2YgVClbXSk6IFJlc3VsdDxUPiB7XG4gICAgY29uc3Qgc3RhdGUgPSB7fSBhcyB7IFtrZXkgaW4ga2V5b2YgVF06IFRba2V5XSB9O1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBrZXlzOiAoa2V5b2YgVClbXSA9IEFycmF5LmZyb20ob3JkZXIgPz8gW10pO1xuICAgIGNvbnN0IGZvdW5kS2V5cyA9IG5ldyBTZXQ8a2V5b2YgVD4ob3JkZXIpO1xuXG4gICAgLy8gc3RhcnQgd2l0aCB0aGUgc3VwcGxpZWQgb3JkZXIgdGhlbiBhcHBlbmQgYW55dGhpbmcgZWxzZSB3ZSBmaW5kXG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdGlhbGl6ZXJzKSB7XG4gICAgICAgIGlmICghZm91bmRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIGZvdW5kS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGluaXRpYWxpemVyc1trZXldKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpbml0aWFsaXplcnNba2V5XShzdGF0ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBwb3B1bGF0ZU9iamVjdDogS2V5ICR7U3RyaW5nKGtleSl9IGlzIHByZXNlbnQgYnV0IGhhcyBubyBpbml0aWFsaXplcmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKHN0YXRlIGFzIFQpO1xufVxuIl19 |
@@ -37,3 +37,3 @@ import { Result } from './result'; | ||
*/ | ||
declare type KeyedThingFactory<TS, TD, TK extends string = string> = (key: TK, thing: TS) => Result<TD>; | ||
type KeyedThingFactory<TS, TD, TK extends string = string> = (key: TK, thing: TS) => Result<TD>; | ||
/** | ||
@@ -40,0 +40,0 @@ * Applies a factory method to convert a `Record<TK, TS>` into a `Map<TK, TD>`. |
@@ -7,3 +7,3 @@ import { Failure } from '../result'; | ||
*/ | ||
export declare type BooleanValidatorConstructorParams<TC = unknown> = GenericValidatorConstructorParams<boolean, TC>; | ||
export type BooleanValidatorConstructorParams<TC = unknown> = GenericValidatorConstructorParams<boolean, TC>; | ||
/** | ||
@@ -10,0 +10,0 @@ * An in-place {@link Validation.Validator | Validator} for `boolean` values. |
@@ -11,3 +11,3 @@ import { Constraint, Validator, ValidatorOptions } from './validator'; | ||
*/ | ||
export declare type ValidatorFunc<T, TC> = (from: unknown, context?: TC) => boolean | Failure<T>; | ||
export type ValidatorFunc<T, TC> = (from: unknown, context?: TC) => boolean | Failure<T>; | ||
/** | ||
@@ -14,0 +14,0 @@ * Options used to initialize a {@link Validation.Base.GenericValidator | GenericValidator}. |
@@ -7,3 +7,3 @@ import { Failure } from '../result'; | ||
*/ | ||
export declare type NumberValidatorConstructorParams<T extends number = number, TC = unknown> = GenericValidatorConstructorParams<T, TC>; | ||
export type NumberValidatorConstructorParams<T extends number = number, TC = unknown> = GenericValidatorConstructorParams<T, TC>; | ||
/** | ||
@@ -10,0 +10,0 @@ * An in-place {@link Validation.Validator | Validator} for `number` values. |
@@ -8,3 +8,3 @@ import { Failure } from '../result'; | ||
*/ | ||
export declare type FieldValidators<T, TC = unknown> = { | ||
export type FieldValidators<T, TC = unknown> = { | ||
[key in keyof T]: Validator<T[key], TC>; | ||
@@ -11,0 +11,0 @@ }; |
@@ -7,3 +7,3 @@ import { Failure } from '../result'; | ||
*/ | ||
export declare type StringValidatorConstructorParams<T extends string = string, TC = unknown> = GenericValidatorConstructorParams<T, TC>; | ||
export type StringValidatorConstructorParams<T extends string = string, TC = unknown> = GenericValidatorConstructorParams<T, TC>; | ||
/** | ||
@@ -10,0 +10,0 @@ * An in-place {@link Validation.Validator | Validator} for `string` values. |
@@ -14,3 +14,3 @@ /** | ||
*/ | ||
export declare type ConstraintTrait = FunctionConstraintTrait; | ||
export type ConstraintTrait = FunctionConstraintTrait; | ||
/** | ||
@@ -17,0 +17,0 @@ * Interface describing the supported validator traits. |
@@ -18,3 +18,3 @@ import { ConstraintTrait, ValidatorTraits } from './traits'; | ||
*/ | ||
export declare type Constraint<T> = (val: T) => boolean | Failure<T>; | ||
export type Constraint<T> = (val: T) => boolean | Failure<T>; | ||
/** | ||
@@ -21,0 +21,0 @@ * In-place validation that a supplied unknown matches some |
import { GenericValidator, GenericValidatorConstructorParams } from './genericValidator'; | ||
import { Failure } from '../result'; | ||
export declare type ValidatorBaseConstructorParams<T, TC> = Omit<GenericValidatorConstructorParams<T, TC>, 'validator'>; | ||
export type ValidatorBaseConstructorParams<T, TC> = Omit<GenericValidatorConstructorParams<T, TC>, 'validator'>; | ||
/** | ||
@@ -5,0 +5,0 @@ * Abstract base helper class for specific validator implementations |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
642540
21
5869
+ Addedcsv-parse@5.6.0(transitive)
+ Addedluxon@3.5.0(transitive)
- Removedcsv-parse@4.16.3(transitive)
- Removedluxon@2.5.2(transitive)
Updatedcsv-parse@^5.3.3
Updatedluxon@^3.1.1