@dbx-tools/shared-core 0.6.8 → 0.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts CHANGED
@@ -15,26 +15,14 @@ export * as object from "./src/object.ts";
15
15
  export * as predicate from "./src/predicate.ts";
16
16
  export * as string from "./src/string.ts";
17
17
  export * as token from "./src/token.ts";
18
- export { poll, tieAbortSignal, combineAbortSignals, sleep } from "./src/async.ts";
19
18
  export type { PollContext, PollProducer, PollOptions } from "./src/async.ts";
20
- export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, parseBrandContext, defaultBrandContext, brandContextJsonSchema, brandContextPrompt } from "./src/brand.ts";
19
+ export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand.ts";
21
20
  export type { BrandContext, BrandContextInput, BrandAssetSet } from "./src/brand.ts";
22
- export { toError, errorMessage, errorMessages, errorNodes, errorContext } from "./src/error.ts";
23
21
  export type { ErrorContext } from "./src/error.ts";
24
- export { memoize } from "./src/function.ts";
25
22
  export type { MemoizeOptions } from "./src/function.ts";
26
- export { id, fnvHash, fnvHashWithOptions, toBase32 } from "./src/hash.ts";
27
- export { forEachHeaderValue, parseCookies, createFetchError } from "./src/http.ts";
28
23
  export type { HeaderLike } from "./src/http.ts";
29
- export { parse, parseRecord } from "./src/json.ts";
30
- export { isLevelEnabled, logger } from "./src/log.ts";
31
24
  export type { LogLevel, Logger } from "./src/log.ts";
32
- export { urlBuilder, pathMatch, parseEmails, isEmail, parseIp, parseCidr, ipInCidr, findContainingCidr, isLoopbackHost } from "./src/net.ts";
33
25
  export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
34
- export { isOneOrMany, isCollection, isEmpty, values, isContainer, map, filter, nonNull, flatMap, flat, distinct, concat, take, group, find, findLast, findIndex, findLastIndex, some, every, forEach, at, toOneOrMany, toArray, sequence, generator, isRecord, toBoolean, deepEqual } from "./src/object.ts";
35
26
  export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, DeepEqualComparator } from "./src/object.ts";
36
- export { create } from "./src/predicate.ts";
37
27
  export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.ts";
38
- export { tokenizeWithOptions, tokenize, toIdentifierWithOptions, toIdentifier, toSlugWithOptions, toSlug, trimToNull, parseList, trimToEmpty, firstNonEmpty, escapeHtml, toUniqueSlug, toDescription, pluralize, toLabel, capitalize } from "./src/string.ts";
39
28
  export type { TokenizeOptions, KeyOptions, IdentifierOptions, Description } from "./src/string.ts";
40
- export { getAccessTokenPayload, getAccessTokenScopes, includesAccessTokenScope } from "./src/token.ts";
package/lib/index.d.ts CHANGED
@@ -11,26 +11,14 @@ export * as object from "./src/object.ts";
11
11
  export * as predicate from "./src/predicate.ts";
12
12
  export * as string from "./src/string.ts";
13
13
  export * as token from "./src/token.ts";
14
- export { poll, tieAbortSignal, combineAbortSignals, sleep } from "./src/async.ts";
15
14
  export type { PollContext, PollProducer, PollOptions } from "./src/async.ts";
16
- export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, parseBrandContext, defaultBrandContext, brandContextJsonSchema, brandContextPrompt } from "./src/brand.ts";
15
+ export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand.ts";
17
16
  export type { BrandContext, BrandContextInput, BrandAssetSet } from "./src/brand.ts";
18
- export { toError, errorMessage, errorMessages, errorNodes, errorContext } from "./src/error.ts";
19
17
  export type { ErrorContext } from "./src/error.ts";
20
- export { memoize } from "./src/function.ts";
21
18
  export type { MemoizeOptions } from "./src/function.ts";
22
- export { id, fnvHash, fnvHashWithOptions, toBase32 } from "./src/hash.ts";
23
- export { forEachHeaderValue, parseCookies, createFetchError } from "./src/http.ts";
24
19
  export type { HeaderLike } from "./src/http.ts";
25
- export { parse, parseRecord } from "./src/json.ts";
26
- export { isLevelEnabled, logger } from "./src/log.ts";
27
20
  export type { LogLevel, Logger } from "./src/log.ts";
28
- export { urlBuilder, pathMatch, parseEmails, isEmail, parseIp, parseCidr, ipInCidr, findContainingCidr, isLoopbackHost } from "./src/net.ts";
29
21
  export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
30
- export { isOneOrMany, isCollection, isEmpty, values, isContainer, map, filter, nonNull, flatMap, flat, distinct, concat, take, group, find, findLast, findIndex, findLastIndex, some, every, forEach, at, toOneOrMany, toArray, sequence, generator, isRecord, toBoolean, deepEqual } from "./src/object.ts";
31
22
  export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, DeepEqualComparator } from "./src/object.ts";
32
- export { create } from "./src/predicate.ts";
33
23
  export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.ts";
34
- export { tokenizeWithOptions, tokenize, toIdentifierWithOptions, toIdentifier, toSlugWithOptions, toSlug, trimToNull, parseList, trimToEmpty, firstNonEmpty, escapeHtml, toUniqueSlug, toDescription, pluralize, toLabel, capitalize } from "./src/string.ts";
35
24
  export type { TokenizeOptions, KeyOptions, IdentifierOptions, Description } from "./src/string.ts";
36
- export { getAccessTokenPayload, getAccessTokenScopes, includesAccessTokenScope } from "./src/token.ts";
package/lib/index.js CHANGED
@@ -14,17 +14,5 @@ export * as object from "./src/object.js";
14
14
  export * as predicate from "./src/predicate.js";
15
15
  export * as string from "./src/string.js";
16
16
  export * as token from "./src/token.js";
17
- export { poll, tieAbortSignal, combineAbortSignals, sleep } from "./src/async.js";
18
- export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, parseBrandContext, defaultBrandContext, brandContextJsonSchema, brandContextPrompt } from "./src/brand.js";
19
- export { toError, errorMessage, errorMessages, errorNodes, errorContext } from "./src/error.js";
20
- export { memoize } from "./src/function.js";
21
- export { id, fnvHash, fnvHashWithOptions, toBase32 } from "./src/hash.js";
22
- export { forEachHeaderValue, parseCookies, createFetchError } from "./src/http.js";
23
- export { parse, parseRecord } from "./src/json.js";
24
- export { isLevelEnabled, logger } from "./src/log.js";
25
- export { urlBuilder, pathMatch, parseEmails, isEmail, parseIp, parseCidr, ipInCidr, findContainingCidr, isLoopbackHost } from "./src/net.js";
26
- export { isOneOrMany, isCollection, isEmpty, values, isContainer, map, filter, nonNull, flatMap, flat, distinct, concat, take, group, find, findLast, findIndex, findLastIndex, some, every, forEach, at, toOneOrMany, toArray, sequence, generator, isRecord, toBoolean, deepEqual } from "./src/object.js";
27
- export { create } from "./src/predicate.js";
28
- export { tokenizeWithOptions, tokenize, toIdentifierWithOptions, toIdentifier, toSlugWithOptions, toSlug, trimToNull, parseList, trimToEmpty, firstNonEmpty, escapeHtml, toUniqueSlug, toDescription, pluralize, toLabel, capitalize } from "./src/string.js";
29
- export { getAccessTokenPayload, getAccessTokenScopes, includesAccessTokenScope } from "./src/token.js";
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssY0FBYyxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeE4sT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkYsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0ksT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU3UyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlQLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgYXN5bmMgZnJvbSBcIi4vc3JjL2FzeW5jLnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZCBmcm9tIFwiLi9zcmMvYnJhbmQudHNcIjtcbmV4cG9ydCAqIGFzIGVycm9yIGZyb20gXCIuL3NyYy9lcnJvci50c1wiO1xuZXhwb3J0ICogYXMgZnVuY3Rpb25Nb2R1bGUgZnJvbSBcIi4vc3JjL2Z1bmN0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBoYXNoIGZyb20gXCIuL3NyYy9oYXNoLnRzXCI7XG5leHBvcnQgKiBhcyBodHRwIGZyb20gXCIuL3NyYy9odHRwLnRzXCI7XG5leHBvcnQgKiBhcyBqc29uIGZyb20gXCIuL3NyYy9qc29uLnRzXCI7XG5leHBvcnQgKiBhcyBsb2cgZnJvbSBcIi4vc3JjL2xvZy50c1wiO1xuZXhwb3J0ICogYXMgbmV0IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiLi9zcmMvb2JqZWN0LnRzXCI7XG5leHBvcnQgKiBhcyBwcmVkaWNhdGUgZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0ICogYXMgc3RyaW5nIGZyb20gXCIuL3NyYy9zdHJpbmcudHNcIjtcbmV4cG9ydCAqIGFzIHRva2VuIGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuZXhwb3J0IHsgcG9sbCwgdGllQWJvcnRTaWduYWwsIGNvbWJpbmVBYm9ydFNpZ25hbHMsIHNsZWVwIH0gZnJvbSBcIi4vc3JjL2FzeW5jLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBvbGxDb250ZXh0LCBQb2xsUHJvZHVjZXIsIFBvbGxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2FzeW5jLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JSQU5EX0FTU0VUUywgQnJhbmRBc3NldFNldFNjaGVtYSwgQnJhbmRDb2xvcnNTY2hlbWEsIEJyYW5kVm9pY2VTY2hlbWEsIEJyYW5kQ29udGV4dFNjaGVtYSwgcGFyc2VCcmFuZENvbnRleHQsIGRlZmF1bHRCcmFuZENvbnRleHQsIGJyYW5kQ29udGV4dEpzb25TY2hlbWEsIGJyYW5kQ29udGV4dFByb21wdCB9IGZyb20gXCIuL3NyYy9icmFuZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZENvbnRleHQsIEJyYW5kQ29udGV4dElucHV0LCBCcmFuZEFzc2V0U2V0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLnRzXCI7XG5leHBvcnQgeyB0b0Vycm9yLCBlcnJvck1lc3NhZ2UsIGVycm9yTWVzc2FnZXMsIGVycm9yTm9kZXMsIGVycm9yQ29udGV4dCB9IGZyb20gXCIuL3NyYy9lcnJvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBFcnJvckNvbnRleHQgfSBmcm9tIFwiLi9zcmMvZXJyb3IudHNcIjtcbmV4cG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiLi9zcmMvZnVuY3Rpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgTWVtb2l6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZnVuY3Rpb24udHNcIjtcbmV4cG9ydCB7IGlkLCBmbnZIYXNoLCBmbnZIYXNoV2l0aE9wdGlvbnMsIHRvQmFzZTMyIH0gZnJvbSBcIi4vc3JjL2hhc2gudHNcIjtcbmV4cG9ydCB7IGZvckVhY2hIZWFkZXJWYWx1ZSwgcGFyc2VDb29raWVzLCBjcmVhdGVGZXRjaEVycm9yIH0gZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCB0eXBlIHsgSGVhZGVyTGlrZSB9IGZyb20gXCIuL3NyYy9odHRwLnRzXCI7XG5leHBvcnQgeyBwYXJzZSwgcGFyc2VSZWNvcmQgfSBmcm9tIFwiLi9zcmMvanNvbi50c1wiO1xuZXhwb3J0IHsgaXNMZXZlbEVuYWJsZWQsIGxvZ2dlciB9IGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCB7IHVybEJ1aWxkZXIsIHBhdGhNYXRjaCwgcGFyc2VFbWFpbHMsIGlzRW1haWwsIHBhcnNlSXAsIHBhcnNlQ2lkciwgaXBJbkNpZHIsIGZpbmRDb250YWluaW5nQ2lkciwgaXNMb29wYmFja0hvc3QgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFVybExpa2UsIElwVmVyc2lvbiwgUGFyc2VkSXAsIENpZHIsIFVybEJ1aWxkZXIsIFBhcnNlRW1haWxzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCB7IGlzT25lT3JNYW55LCBpc0NvbGxlY3Rpb24sIGlzRW1wdHksIHZhbHVlcywgaXNDb250YWluZXIsIG1hcCwgZmlsdGVyLCBub25OdWxsLCBmbGF0TWFwLCBmbGF0LCBkaXN0aW5jdCwgY29uY2F0LCB0YWtlLCBncm91cCwgZmluZCwgZmluZExhc3QsIGZpbmRJbmRleCwgZmluZExhc3RJbmRleCwgc29tZSwgZXZlcnksIGZvckVhY2gsIGF0LCB0b09uZU9yTWFueSwgdG9BcnJheSwgc2VxdWVuY2UsIGdlbmVyYXRvciwgaXNSZWNvcmQsIHRvQm9vbGVhbiwgZGVlcEVxdWFsIH0gZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXF1ZW5jZSwgQ29udGFpbmVyLCBDb2xsZWN0aW9uLCBPbmVPck1hbnksIE5hbWVMaWtlLCBOb25GdW5jdGlvbktleXMsIERlZXBFcXVhbENvbXBhcmF0b3IgfSBmcm9tIFwiLi9zcmMvb2JqZWN0LnRzXCI7XG5leHBvcnQgeyBjcmVhdGUgfSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByZWRpY2F0ZUZ1bmN0aW9uLCBUeXBlUHJlZGljYXRlRnVuY3Rpb24sIFByZWRpY2F0ZUlucHV0LCBQcmVkaWNhdGUgfSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgeyB0b2tlbml6ZVdpdGhPcHRpb25zLCB0b2tlbml6ZSwgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMsIHRvSWRlbnRpZmllciwgdG9TbHVnV2l0aE9wdGlvbnMsIHRvU2x1ZywgdHJpbVRvTnVsbCwgcGFyc2VMaXN0LCB0cmltVG9FbXB0eSwgZmlyc3ROb25FbXB0eSwgZXNjYXBlSHRtbCwgdG9VbmlxdWVTbHVnLCB0b0Rlc2NyaXB0aW9uLCBwbHVyYWxpemUsIHRvTGFiZWwsIGNhcGl0YWxpemUgfSBmcm9tIFwiLi9zcmMvc3RyaW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRva2VuaXplT3B0aW9ucywgS2V5T3B0aW9ucywgSWRlbnRpZmllck9wdGlvbnMsIERlc2NyaXB0aW9uIH0gZnJvbSBcIi4vc3JjL3N0cmluZy50c1wiO1xuZXhwb3J0IHsgZ2V0QWNjZXNzVG9rZW5QYXlsb2FkLCBnZXRBY2Nlc3NUb2tlblNjb3BlcywgaW5jbHVkZXNBY2Nlc3NUb2tlblNjb3BlIH0gZnJvbSBcIi4vc3JjL3Rva2VuLnRzXCI7XG4iXX0=
17
+ export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand.js";
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssY0FBYyxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgKiBhcyBhc3luYyBmcm9tIFwiLi9zcmMvYXN5bmMudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kIGZyb20gXCIuL3NyYy9icmFuZC50c1wiO1xuZXhwb3J0ICogYXMgZXJyb3IgZnJvbSBcIi4vc3JjL2Vycm9yLnRzXCI7XG5leHBvcnQgKiBhcyBmdW5jdGlvbk1vZHVsZSBmcm9tIFwiLi9zcmMvZnVuY3Rpb24udHNcIjtcbmV4cG9ydCAqIGFzIGhhc2ggZnJvbSBcIi4vc3JjL2hhc2gudHNcIjtcbmV4cG9ydCAqIGFzIGh0dHAgZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCAqIGFzIGpzb24gZnJvbSBcIi4vc3JjL2pzb24udHNcIjtcbmV4cG9ydCAqIGFzIGxvZyBmcm9tIFwiLi9zcmMvbG9nLnRzXCI7XG5leHBvcnQgKiBhcyBuZXQgZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0ICogYXMgb2JqZWN0IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCAqIGFzIHByZWRpY2F0ZSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgKiBhcyBzdHJpbmcgZnJvbSBcIi4vc3JjL3N0cmluZy50c1wiO1xuZXhwb3J0ICogYXMgdG9rZW4gZnJvbSBcIi4vc3JjL3Rva2VuLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBvbGxDb250ZXh0LCBQb2xsUHJvZHVjZXIsIFBvbGxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2FzeW5jLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JSQU5EX0FTU0VUUywgQnJhbmRBc3NldFNldFNjaGVtYSwgQnJhbmRDb2xvcnNTY2hlbWEsIEJyYW5kVm9pY2VTY2hlbWEsIEJyYW5kQ29udGV4dFNjaGVtYSwgZGVmYXVsdEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL3NyYy9icmFuZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZENvbnRleHQsIEJyYW5kQ29udGV4dElucHV0LCBCcmFuZEFzc2V0U2V0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVycm9yQ29udGV4dCB9IGZyb20gXCIuL3NyYy9lcnJvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZW1vaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9mdW5jdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBIZWFkZXJMaWtlIH0gZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXJsTGlrZSwgSXBWZXJzaW9uLCBQYXJzZWRJcCwgQ2lkciwgVXJsQnVpbGRlciwgUGFyc2VFbWFpbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXF1ZW5jZSwgQ29udGFpbmVyLCBDb2xsZWN0aW9uLCBPbmVPck1hbnksIE5hbWVMaWtlLCBOb25GdW5jdGlvbktleXMsIERlZXBFcXVhbENvbXBhcmF0b3IgfSBmcm9tIFwiLi9zcmMvb2JqZWN0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFByZWRpY2F0ZUZ1bmN0aW9uLCBUeXBlUHJlZGljYXRlRnVuY3Rpb24sIFByZWRpY2F0ZUlucHV0LCBQcmVkaWNhdGUgfSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRva2VuaXplT3B0aW9ucywgS2V5T3B0aW9ucywgSWRlbnRpZmllck9wdGlvbnMsIERlc2NyaXB0aW9uIH0gZnJvbSBcIi4vc3JjL3N0cmluZy50c1wiO1xuIl19
@@ -5,7 +5,8 @@
5
5
  * - `distinct` - drop duplicate tokens (first occurrence wins).
6
6
  * - `lowerCase` - lowercase every token.
7
7
  * - `capitalize` - upper-case each token's first letter (then
8
- * {@link TOKENIZE_OVERRIDES} fix up `ai` -> `AI` and `v2` -> `V2`).
8
+ * {@link TOKENIZE_OVERRIDES} fix up `ai` -> `AI`, `fs` -> `FS`, and
9
+ * `v2` -> `V2`).
9
10
  * - `omitUriScheme` - strip a leading `scheme://` before tokenizing.
10
11
  * - `omitEmailDomain` - keep only the local part of an email.
11
12
  * - `camelCase` - split on camelCase boundaries / digit runs / acronyms
package/lib/src/string.js CHANGED
@@ -16,9 +16,13 @@ const TOKENIZE_CAMEL_CASE_REGEXP = /[vV][0-9]+|[A-Z]?[a-z]+|[0-9]+|[A-Z]+(?![a-z
16
16
  const TOKENIZE_NON_ALPHANUMERIC_REGEXP = /[a-zA-Z0-9]+/g;
17
17
  const TOKENIZE_OVERRIDES = [
18
18
  (token, options) => {
19
- if (options.capitalize && token.toLowerCase() === "ai") {
19
+ if (!options.capitalize)
20
+ return token;
21
+ const lower = token.toLowerCase();
22
+ if (lower === "ai")
20
23
  return "AI";
21
- }
24
+ if (lower === "fs")
25
+ return "FS";
22
26
  return token;
23
27
  },
24
28
  // Version marker `v2` -> `V2` when capitalizing (the leading `v` uppercases,
@@ -506,4 +510,4 @@ export function toLabel(value, options) {
506
510
  export function capitalize(value) {
507
511
  return value ? value.charAt(0).toUpperCase() + value.slice(1) : value;
508
512
  }
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlDL0MsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsaURBQWlELENBQUM7QUFDckYsTUFBTSxnQ0FBZ0MsR0FBRyxlQUFlLENBQUM7QUFDekQsTUFBTSxrQkFBa0IsR0FBNEQ7SUFDbEYsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDakIsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCw2RUFBNkU7SUFDN0UsK0RBQStEO0lBQy9ELENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ2pCLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YsQ0FBQztBQUNGLE1BQU0sVUFBVSxHQUFHLG9EQUFvRCxDQUFDO0FBQ3hFLE1BQU0sWUFBWSxHQUFHLDBFQUEwRSxDQUFDO0FBRWhHLE1BQU0saUJBQWlCLEdBQTRCO0lBQ2pELFFBQVEsRUFBRSxLQUFLO0lBQ2YsU0FBUyxFQUFFLEtBQUs7SUFDaEIsVUFBVSxFQUFFLEtBQUs7SUFDakIsYUFBYSxFQUFFLEtBQUs7SUFDcEIsZUFBZSxF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SyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDeEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sWUFBWSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFpQyxFQUFFLEdBQVc7SUFDL0QsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtZQUFFLFNBQVM7UUFDdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYSxFQUFFLElBQVk7SUFDbkQsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhLEVBQUUsT0FBeUI7SUFDOUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBzdHJpbmcgdG9vbGtpdDogdG9rZW5pemF0aW9uLCBpZGVudGlmaWVyIC8gc2x1Z1xuICogZ2VuZXJhdGlvbiAod2l0aCBoYXNoLXN1ZmZpeCBjb2xsaXNpb24gcmVzaXN0YW5jZSksIEhUTUwgZXNjYXBpbmcsXG4gKiBoZWFkZXItdmFsdWUgdHJpbW1pbmcsIGFuZCBhIG5lc3RlZCBkZXNjcmlwdGlvbi10cmVlIHJlbmRlcmVyIGZvclxuICogbG9uZy1mb3JtIExMTSBwcm9tcHQgLyB0b29sLWRlc2NyaXB0aW9uIHRleHQuIERlcGVuZHMgb25seSBvbiB0aGVcbiAqIGxvY2FsIHtAbGluayBmbnZIYXNoV2l0aE9wdGlvbnN9IGZvciBkZXRlcm1pbmlzdGljIGhhc2ggc3VmZml4ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBmbnZIYXNoV2l0aE9wdGlvbnMgfSBmcm9tIFwiLi9oYXNoLnRzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB7QGxpbmsgdG9rZW5pemVXaXRoT3B0aW9uc30uIEFsbCBkZWZhdWx0IG9mZiBleGNlcHRcbiAqIGBjYW1lbENhc2VgLlxuICpcbiAqIC0gYGRpc3RpbmN0YCAtIGRyb3AgZHVwbGljYXRlIHRva2VucyAoZmlyc3Qgb2NjdXJyZW5jZSB3aW5zKS5cbiAqIC0gYGxvd2VyQ2FzZWAgLSBsb3dlcmNhc2UgZXZlcnkgdG9rZW4uXG4gKiAtIGBjYXBpdGFsaXplYCAtIHVwcGVyLWNhc2UgZWFjaCB0b2tlbidzIGZpcnN0IGxldHRlciAodGhlblxuICogICB7QGxpbmsgVE9LRU5JWkVfT1ZFUlJJREVTfSBmaXggdXAgYGFpYCAtPiBgQUlgIGFuZCBgdjJgIC0+IGBWMmApLlxuICogLSBgb21pdFVyaVNjaGVtZWAgLSBzdHJpcCBhIGxlYWRpbmcgYHNjaGVtZTovL2AgYmVmb3JlIHRva2VuaXppbmcuXG4gKiAtIGBvbWl0RW1haWxEb21haW5gIC0ga2VlcCBvbmx5IHRoZSBsb2NhbCBwYXJ0IG9mIGFuIGVtYWlsLlxuICogLSBgY2FtZWxDYXNlYCAtIHNwbGl0IG9uIGNhbWVsQ2FzZSBib3VuZGFyaWVzIC8gZGlnaXQgcnVucyAvIGFjcm9ueW1zXG4gKiAgIChkZWZhdWx0IGB0cnVlYCk7IHdoZW4gYGZhbHNlYCwgc3BsaXQgb25seSBvbiBub24tYWxwaGFudW1lcmljcy5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW5pemVPcHRpb25zID0ge1xuICBkaXN0aW5jdD86IGJvb2xlYW47XG4gIGxvd2VyQ2FzZT86IGJvb2xlYW47XG4gIGNhcGl0YWxpemU/OiBib29sZWFuO1xuICBvbWl0VXJpU2NoZW1lPzogYm9vbGVhbjtcbiAgb21pdEVtYWlsRG9tYWluPzogYm9vbGVhbjtcbiAgY2FtZWxDYXNlPzogYm9vbGVhbjtcbn07XG5cbi8vIEtleXMvaWRlbnRpZmllcnMvc2x1Z3MgYXJlIGFsd2F5cyBsb3dlcmNhc2VkOyBgbG93ZXJDYXNlYCBpcyBub3QgYVxuLy8gY2FsbGVyLWNvbmZpZ3VyYWJsZSBvcHRpb24uXG5leHBvcnQgdHlwZSBLZXlPcHRpb25zID0gT21pdDxUb2tlbml6ZU9wdGlvbnMsIFwibG93ZXJDYXNlXCIgfCBcImNhcGl0YWxpemVcIj4gJiB7XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgdHJ1bmNhdGVTdHJhdGVneT86IFwiaGFzaFwiIHwgXCJ0cmltXCIgfCBcImVtcHR5XCI7XG4gIHRydW5jYXRlSGFzaExlbmd0aD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIElkZW50aWZpZXJPcHRpb25zID0gS2V5T3B0aW9ucyAmIHtcbiAgZGVsaW1pdGVyPzogc3RyaW5nO1xufTtcblxudHlwZSBSZXNvbHZlZFRva2VuaXplT3B0aW9ucyA9IFJlcXVpcmVkPFRva2VuaXplT3B0aW9ucz47XG50eXBlIFJlc29sdmVkSWRlbnRpZmllck9wdGlvbnMgPSBSZXF1aXJlZDxcbiAgSWRlbnRpZmllck9wdGlvbnMgJiBQaWNrPFRva2VuaXplT3B0aW9ucywgXCJsb3dlckNhc2VcIiB8IFwiY2FwaXRhbGl6ZVwiPlxuPjtcblxuLy8gQSBsZWFkaW5nIGB2YC9gVmAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgZGlnaXRzIChhIHZlcnNpb24gbWFya2VyIGxpa2Vcbi8vIGB2MmApIGlzIGtlcHQgYXMgT05FIHRva2VuIGluc3RlYWQgb2Ygc3BsaXR0aW5nIGludG8gYHZgICsgYDJgOyBpdCBsZWFkcyB0aGVcbi8vIGFsdGVybmF0aW9uIHNvIGl0IHdpbnMgb3ZlciB0aGUgZ2VuZXJpYyBsZXR0ZXIgLyBkaWdpdCBydW5zLiBFdmVyeXRoaW5nIGVsc2Vcbi8vIGlzIHRoZSB1c3VhbCBjYW1lbENhc2Ugd29yZCAvIG51bWJlciAvIGFsbC1jYXBzLWFjcm9ueW0gc3BsaXQuXG5jb25zdCBUT0tFTklaRV9DQU1FTF9DQVNFX1JFR0VYUCA9IC9bdlZdWzAtOV0rfFtBLVpdP1thLXpdK3xbMC05XSt8W0EtWl0rKD8hW2Etel0pL2c7XG5jb25zdCBUT0tFTklaRV9OT05fQUxQSEFOVU1FUklDX1JFR0VYUCA9IC9bYS16QS1aMC05XSsvZztcbmNvbnN0IFRPS0VOSVpFX09WRVJSSURFUzogKCh0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBUb2tlbml6ZU9wdGlvbnMpID0+IHN0cmluZylbXSA9IFtcbiAgKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuY2FwaXRhbGl6ZSAmJiB0b2tlbi50b0xvd2VyQ2FzZSgpID09PSBcImFpXCIpIHtcbiAgICAgIHJldHVybiBcIkFJXCI7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbjtcbiAgfSxcbiAgLy8gVmVyc2lvbiBtYXJrZXIgYHYyYCAtPiBgVjJgIHdoZW4gY2FwaXRhbGl6aW5nICh0aGUgbGVhZGluZyBgdmAgdXBwZXJjYXNlcyxcbiAgLy8gdGhlIGRpZ2l0cyBzdGF5KSwgc28gaXQgcmVhZHMgYXMgb25lIHVuaXQgcmF0aGVyIHRoYW4gXCJWIDJcIi5cbiAgKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuY2FwaXRhbGl6ZSAmJiAvXnZbMC05XSskLy50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIGBWJHt0b2tlbi5zbGljZSgxKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG4gIH0sXG5dO1xuY29uc3QgVVJJX1JFR0VYUCA9IC9eKFthLXpBLVpdW2EtekEtWjAtOSsuLV0qKT86XFwvXFwvKFteXFxzLz8jXVteXFxzXSopPyQvO1xuY29uc3QgRU1BSUxfUkVHRVhQID0gL14oW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSspQChbYS16QS1aMC05LV0rKD86XFwuW2EtekEtWjAtOS1dKykrKSQvO1xuXG5jb25zdCBUT0tFTklaRV9ERUZBVUxUUzogUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSB7XG4gIGRpc3RpbmN0OiBmYWxzZSxcbiAgbG93ZXJDYXNlOiBmYWxzZSxcbiAgY2FwaXRhbGl6ZTogZmFsc2UsXG4gIG9taXRVcmlTY2hlbWU6IGZhbHNlLFxuICBvbWl0RW1haWxEb21haW46IGZhbHNlLFxuICBjYW1lbENhc2U6IHRydWUsXG59O1xuXG5jb25zdCBJREVOVElGSUVSX0RFRkFVTFRTOiBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0ge1xuICAuLi5UT0tFTklaRV9ERUZBVUxUUyxcbiAgbG93ZXJDYXNlOiB0cnVlLFxuICBtYXhMZW5ndGg6IEluZmluaXR5LFxuICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgdHJ1bmNhdGVIYXNoTGVuZ3RoOiA2LFxuICBkZWxpbWl0ZXI6IFwiLVwiLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uKiB0b2tlbml6ZVdpdGhPcHRpb25zKFxuICBvcHRpb25zOiBUb2tlbml6ZU9wdGlvbnMsXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGNvbnN0IG9wdHM6IFJlc29sdmVkVG9rZW5pemVPcHRpb25zID0geyAuLi5UT0tFTklaRV9ERUZBVUxUUywgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBzZWVuID0gb3B0cy5kaXN0aW5jdCA/IG5ldyBTZXQ8c3RyaW5nPigpIDogdW5kZWZpbmVkO1xuICBjb25zdCByZWdleHAgPSBvcHRzLmNhbWVsQ2FzZSA/IFRPS0VOSVpFX0NBTUVMX0NBU0VfUkVHRVhQIDogVE9LRU5JWkVfTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFA7XG5cbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgbGV0IHN0cmluZ1ZhbHVlID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xuICAgIGlmICghc3RyaW5nVmFsdWUpIGNvbnRpbnVlO1xuICAgIGlmIChvcHRzLm9taXRVcmlTY2hlbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nVmFsdWUubWF0Y2goVVJJX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2gpIHN0cmluZ1ZhbHVlID0gbWF0Y2hbMl0gPz8gXCJcIjtcbiAgICB9XG4gICAgaWYgKG9wdHMub21pdEVtYWlsRG9tYWluKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHN0cmluZ1ZhbHVlLm1hdGNoKEVNQUlMX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2gpIHN0cmluZ1ZhbHVlID0gbWF0Y2hbMV0gPz8gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFzdHJpbmdWYWx1ZSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0b2tlbk1hdGNoIG9mIHN0cmluZ1ZhbHVlLm1hdGNoQWxsKHJlZ2V4cCkpIHtcbiAgICAgIGxldCB0b2tlbiA9IHRva2VuTWF0Y2hbMF0hO1xuICAgICAgaWYgKG9wdHMubG93ZXJDYXNlKSB0b2tlbiA9IHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAob3B0cy5jYXBpdGFsaXplKSB0b2tlbiA9IGNhcGl0YWxpemUodG9rZW4pO1xuICAgICAgaWYgKCF0b2tlbikgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IG92ZXJyaWRlIG9mIFRPS0VOSVpFX09WRVJSSURFUykge1xuICAgICAgICB0b2tlbiA9IG92ZXJyaWRlKHRva2VuLCBvcHRzKTtcbiAgICAgICAgaWYgKCF0b2tlbikgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoIXRva2VuIHx8IHNlZW4/Lmhhcyh0b2tlbikpIGNvbnRpbnVlO1xuICAgICAgc2Vlbj8uYWRkKHRva2VuKTtcbiAgICAgIHlpZWxkIHRva2VuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIHRva2VuaXplKC4uLnZhbHVlczogdW5rbm93bltdKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICB5aWVsZCogdG9rZW5pemVXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBKb2luIHRva2VuaXplZCB2YWx1ZXMgd2l0aCBgZGVsaW1pdGVyYC4gV2hlbiB0aGUgbmV4dCB0b2tlbiB3b3VsZCBwdXNoIHRoZVxuICogcmVzdWx0IG92ZXIgYG1heExlbmd0aGA6IGB0cmltYCBzdG9wcyBhZGRpbmc7IGBlbXB0eWAgcmV0dXJucyBgXCJcImA7IGBoYXNoYFxuICogYXBwZW5kcyBhIGRpZ2VzdCBvZiBhY2NlcHRlZCB0b2tlbnMgcGx1cyB0aGUgb3ZlcmZsb3cgdG9rZW4gaWYgdGhlIHJlc3VsdFxuICogc3RpbGwgZml0cywgb3RoZXJ3aXNlIGBcIlwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSWRlbnRpZmllcldpdGhPcHRpb25zKG9wdGlvbnM6IElkZW50aWZpZXJPcHRpb25zLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdHM6IFJlc29sdmVkSWRlbnRpZmllck9wdGlvbnMgPSB7XG4gICAgLi4uSURFTlRJRklFUl9ERUZBVUxUUyxcbiAgICAuLi5vcHRpb25zLFxuICAgIGxvd2VyQ2FzZTogdHJ1ZSxcbiAgfTtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbml6ZVdpdGhPcHRpb25zKG9wdHMsIC4uLnZhbHVlcykpIHtcbiAgICBjb25zdCBzZXBMZW5ndGggPSB0b2tlbnMubGVuZ3RoID4gMCA/IG9wdHMuZGVsaW1pdGVyLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IGN1cnJlbnRMZW5ndGggKyBzZXBMZW5ndGggKyB0b2tlbi5sZW5ndGg7XG5cbiAgICBpZiAobmV4dExlbmd0aCA+IG9wdHMubWF4TGVuZ3RoKSB7XG4gICAgICBpZiAob3B0cy50cnVuY2F0ZVN0cmF0ZWd5ID09PSBcImVtcHR5XCIpIHJldHVybiBcIlwiO1xuICAgICAgaWYgKG9wdHMudHJ1bmNhdGVTdHJhdGVneSA9PT0gXCJ0cmltXCIpIGJyZWFrO1xuXG4gICAgICBjb25zdCBoYXNoID0gZGlnZXN0VG9rZW5zKG9wdHMudHJ1bmNhdGVIYXNoTGVuZ3RoLCB0b2tlbnMsIHRva2VuKTtcbiAgICAgIGlmIChjdXJyZW50TGVuZ3RoICsgc2VwTGVuZ3RoICsgaGFzaC5sZW5ndGggPD0gb3B0cy5tYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRva2Vucy5sZW5ndGggPiAwID8gdG9rZW5zLmpvaW4ob3B0cy5kZWxpbWl0ZXIpICsgb3B0cy5kZWxpbWl0ZXIgKyBoYXNoIDogaGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICBjdXJyZW50TGVuZ3RoID0gbmV4dExlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnMuam9pbihvcHRzLmRlbGltaXRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0lkZW50aWZpZXIoLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoe30sIC4uLnZhbHVlcyk7XG59XG5cbi8qKlxuICogU2x1Z2lmaWVkIGlkZW50aWZpZXI6IHNhbWUgcnVsZXMgYXMge0BsaW5rIHRvSWRlbnRpZmllcldpdGhPcHRpb25zfSB3aXRoIHRoZVxuICogZGVsaW1pdGVyIGZvcmNlZCB0byBgLWAuIEFjY2VwdHMge0BsaW5rIEtleU9wdGlvbnN9IHNvIGNhbGxlcnMgY2Fubm90XG4gKiBvdmVycmlkZSB0aGUgZGVsaW1pdGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbHVnV2l0aE9wdGlvbnMob3B0aW9uczogS2V5T3B0aW9ucywgLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyAuLi5vcHRpb25zLCBkZWxpbWl0ZXI6IFwiLVwiIH0sIC4uLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NsdWcoLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9TbHVnV2l0aE9wdGlvbnMoe30sIC4uLnZhbHVlcyk7XG59XG5cbi8qKlxuICogVHJpbSBgdmFsdWVgIGFuZCByZXR1cm4gYG51bGxgIGZvciBub24tc3RyaW5ncywgYHVuZGVmaW5lZGAsIG9yXG4gKiBzdHJpbmdzIHRoYXQgYXJlIGVtcHR5IGFmdGVyIHRyaW1taW5nLiBMZXRzIGNhbGwgc2l0ZXMgY29sbGFwc2UgdGhlXG4gKiBjb21tb25cbiAqXG4gKiBgYGB0c1xuICogdHlwZW9mIHYgPT09IFwic3RyaW5nXCIgJiYgdi50cmltKCkgPyB2LnRyaW0oKSA6IG51bGxcbiAqIGBgYFxuICpcbiAqIGRhbmNlIGludG8gYSBzaW5nbGUgaGVscGVyLiBVc2VmdWwgZm9yIEhUVFAgaGVhZGVyIC8gcXVlcnkgLyBmb3JtXG4gKiBleHRyYWN0b3JzIHdoZXJlIGRvd25zdHJlYW0gY29kZSB3YW50cyBgc3RyaW5nIHwgbnVsbGAgdG8gZHJpdmUgYVxuICogY2hlYXAgYD8/YCAvIGBpZiAoeClgIGNhc2NhZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltVG9OdWxsKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBudWxsO1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZCA/IHRyaW1tZWQgOiBudWxsO1xufVxuXG4vLyBDb25maWcgbGlzdHMgYXJyaXZlIGVpdGhlciBhbHJlYWR5IHNwbGl0IChhbiBhcnJheSkgb3IgYXMgb25lIGVudi12YXIgc3RyaW5nXG4vLyB3aXRoIGVudHJpZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQvb3Igd2hpdGVzcGFjZS5cbmNvbnN0IExJU1RfU0VQQVJBVE9SX1JFR0VYUCA9IC9bXFxzLF0rLztcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBjb25maWcgbGlzdCB0aGF0IG1heSBhcnJpdmUgYXMgYW4gYXJyYXkgb3IgYXMgYSBzaW5nbGVcbiAqIGNvbW1hL3doaXRlc3BhY2Utc2VwYXJhdGVkIHN0cmluZzogc3BsaXQsIGFwcGx5IGB0cmFuc2Zvcm1gLCBkcm9wIGVtcHRpZXMsXG4gKiBhbmQgZGUtZHVwbGljYXRlIChmaXJzdCBvY2N1cnJlbmNlIHdpbnMpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNoYXBlIGV2ZXJ5IGFsbG93LWxpc3QgLyBmYWxsYmFjay1vcmRlciBzZXR0aW5nIGluIHRoaXMgcmVwb1xuICogdGFrZXMsIGJlY2F1c2UgdGhlIHNhbWUgdmFsdWUgY2FuIGNvbWUgZnJvbSB0eXBlZCBjb25maWcgKGBzdHJpbmdbXWApIG9yIGZyb21cbiAqIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIChgXCJhLCBiIGNcImApLiBQYXNzIGB0cmFuc2Zvcm1gIHRvIG5vcm1hbGl6ZSBlbnRyaWVzXG4gKiBhcyB0aGV5IGFyZSByZWFkOyBpdCBkZWZhdWx0cyB0byB0cmltbWluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VMaXN0KFwiZG9jcy5leGFtcGxlLmNvbSwgKi5kYXRhYnJpY2tzLmNvbVwiKTtcbiAqIHBhcnNlTGlzdChwcm9jZXNzLmVudi5NT0RFTF9GQUxMQkFDS1MpO1xuICogcGFyc2VMaXN0KHJhdywgbm9ybWFsaXplVXJsUGF0dGVybik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3QoXG4gIHJhdzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsLFxuICB0cmFuc2Zvcm06IChlbnRyeTogc3RyaW5nKSA9PiBzdHJpbmcgPSAoZW50cnkpID0+IGVudHJ5LnRyaW0oKSxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW50cmllcyA9XG4gICAgdHlwZW9mIHJhdyA9PT0gXCJzdHJpbmdcIiA/IHJhdy5zcGxpdChMSVNUX1NFUEFSQVRPUl9SRUdFWFApIDogQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogW107XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdHJhbnNmb3JtKGVudHJ5KTtcbiAgICBpZiAoIW5vcm1hbGl6ZWQgfHwgc2Vlbi5oYXMobm9ybWFsaXplZCkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKG5vcm1hbGl6ZWQpO1xuICAgIG91dC5wdXNoKG5vcm1hbGl6ZWQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICoge0BsaW5rIHRyaW1Ub051bGx9IHdpdGggYW4gZW1wdHktc3RyaW5nIG1pc3MgaW5zdGVhZCBvZiBgbnVsbGAsIGZvciBjYWxsZXJzXG4gKiB0aGF0IGJ1aWxkIGEgc3RyaW5nIHVuY29uZGl0aW9uYWxseSBhbmQgdHJlYXQgXCJhYnNlbnRcIiBhcyBcIlwiLlxuICpcbiAqIFJlYWRpbmcgbG9vc2VseS10eXBlZCBKU09OIGlzIHRoZSBtb3RpdmF0aW5nIGNhc2U6IGEgZmllbGQgdGhhdCBzaG91bGQgYmUgYVxuICogc3RyaW5nIG1heSBiZSBtaXNzaW5nIG9yIHRoZSB3cm9uZyB0eXBlLCBhbmQgdGhlIGNhbGxlciB3YW50cyBgXCJcImAgcmF0aGVyXG4gKiB0aGFuIGEgbnVsbCBjaGVjayBhdCBldmVyeSBhY2Nlc3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRpdGxlID0gdHJpbVRvRW1wdHkocmVjb3JkLnRpdGxlKTsgLy8gYWx3YXlzIGEgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltVG9FbXB0eSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiB0cmltVG9OdWxsKHZhbHVlKSA/PyBcIlwiO1xufVxuXG4vKipcbiAqIFRyaW0gdGhlIGZpcnN0IHVzYWJsZSBzdHJpbmcgb3V0IG9mIGB2YWx1ZWAuIFJldHVybnMgYG51bGxgIHdoZW5cbiAqIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGBudWxsYCwgYW4gZW1wdHkgc3RyaW5nLCBvciBhbiBhcnJheSB3aG9zZVxuICogZmlyc3Qgc3RyaW5nIG1lbWJlciBpcyBlbXB0eS4gTWlycm9ycyBob3cgRXhwcmVzcyAvIE5vZGUgaGVhZGVyXG4gKiBhY2Nlc3NvcnMgZXhwb3NlIHNpbmdsZSB2cy4gcmVwZWF0ZWQgaGVhZGVycyAtIHRoZSBmaXJzdFxuICogbm9uLWVtcHR5IGVudHJ5IHdpbnMsIGV2ZXJ5dGhpbmcgZWxzZSBpcyBpZ25vcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3ROb25FbXB0eSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB0cmltVG9OdWxsKGl0ZW0pO1xuICAgICAgaWYgKHRyaW1tZWQpIHJldHVybiB0cmltbWVkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gdHJpbVRvTnVsbCh2YWx1ZSk7XG59XG5cbi8qKlxuICogRXNjYXBlIHRoZSBmaXZlIGNoYXJhY3RlcnMgc2lnbmlmaWNhbnQgaW4gSFRNTCB0ZXh0IGFuZFxuICogZG91YmxlLXF1b3RlZCBhdHRyaWJ1dGUgdmFsdWVzIChgJmAsIGA8YCwgYD5gLCBgXCJgLCBgJ2ApIHNvIGFuXG4gKiB1bnRydXN0ZWQgc3RyaW5nIGNhbiBiZSBpbnRlcnBvbGF0ZWQgaW50byBtYXJrdXAgd2l0aG91dCBicmVha2luZ1xuICogb3V0IG9mIGl0cyBjb250ZXh0LiBgJmAgaXMgcmVwbGFjZWQgZmlyc3Qgc28gYW1wZXJzYW5kcyBpbnRyb2R1Y2VkXG4gKiBieSB0aGUgbGF0ZXIgcmVwbGFjZW1lbnRzIGFyZW4ndCBkb3VibGUtZXNjYXBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcbiAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcbiAgICAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcbiAgICAucmVwbGFjZSgvJy9nLCBcIiYjMzk7XCIpO1xufVxuXG4vKipcbiAqIFNsdWdpZnkgYHZhbHVlYCAodXNpbmcgdGhlIHN0YW5kYXJkIHtAbGluayB0b0lkZW50aWZpZXJXaXRoT3B0aW9uc31cbiAqIHRva2VuaXplciArIGRlbGltaXRlciBydWxlcykgYW5kICoqYWx3YXlzKiogc3VmZml4IGEgc2hvcnRcbiAqIGRldGVybWluaXN0aWMgaGFzaC4gVXNlIHdoZW4geW91IG5lZWQgYSBzdGFibGUsIHNsdWdpZmllZCBpZCB0aGF0XG4gKiBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgZGVzY3JpcHRpb25zIHNoYXJpbmcgdGhlIHNhbWVcbiAqIGxlYWRpbmcgdG9rZW5zICh0b29sIGlkcywgY2FjaGUga2V5cywgZXRjLikuXG4gKlxuICogQmVoYXZpb3VyIGRpZmZlcnMgZnJvbSBgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyBtYXhMZW5ndGgsXG4gKiB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIiB9KWA6IHRoYXQgaGVscGVyIG9ubHkgYXBwZW5kcyBhIGhhc2ggd2hlblxuICogdGhlIHNsdWcgKm92ZXJmbG93cyogYG1heExlbmd0aGAuIFRoaXMgaGVscGVyIGFwcGVuZHMgYSBoYXNoXG4gKiB1bmNvbmRpdGlvbmFsbHkgc28gdGhlIHJlc3VsdCBpcyBjb2xsaXNpb24tcmVzaXN0YW50IGV2ZW4gZm9yXG4gKiBzaG9ydCBpbnB1dHMuIFRoZSBoYXNoIGlzIGNvbXB1dGVkIG92ZXIgdGhlIHJhdyBgdmFsdWVgIHNvIHR3b1xuICogZGVzY3JpcHRpb25zIHByb2R1Y2luZyB0aGUgc2FtZSBzbHVnIHN0aWxsIGdldCBkaWZmZXJlbnQgaWRzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFNvdXJjZSBzdHJpbmcgKHR5cGljYWxseSBhIHRvb2wvYWdlbnQgZGVzY3JpcHRpb24pLlxuICogQHBhcmFtIG9wdGlvbnMuZGVsaW1pdGVyIC0gVG9rZW4gc2VwYXJhdG9yIChkZWZhdWx0IGBcIl9cImApLlxuICogQHBhcmFtIG9wdGlvbnMuc2x1Z01heExlbmd0aCAtIENhcCBvbiB0aGUgc2x1ZyBwb3J0aW9uICh0aGUgcGFydFxuICogICBiZWZvcmUgdGhlIGhhc2gpLiBEZWZhdWx0IDMyLlxuICogQHBhcmFtIG9wdGlvbnMuaGFzaExlbmd0aCAtIExlbmd0aCBvZiB0aGUgc3VmZml4IHByb2R1Y2VkIGJ5XG4gKiAgIHtAbGluayBmbnZIYXNoV2l0aE9wdGlvbnN9IChDcm9ja2ZvcmQtc3R5bGUgYmFzZS0zMiBhbHBoYWJldCwgbWF4IDdcbiAqICAgY2hhcnMpLiBEZWZhdWx0IDYuXG4gKiBAcGFyYW0gb3B0aW9ucy5mYWxsYmFja1ByZWZpeCAtIFByZWZpeCB1c2VkIHdoZW4gdGhlIHNsdWcgaXMgZW1wdHlcbiAqICAgKGUuZy4gcHVuY3R1YXRpb24tb25seSBpbnB1dCkuIERlZmF1bHQgYFwiaWRcImAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VuaXF1ZVNsdWcoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgc2x1Z01heExlbmd0aD86IG51bWJlcjtcbiAgICBoYXNoTGVuZ3RoPzogbnVtYmVyO1xuICAgIGZhbGxiYWNrUHJlZml4Pzogc3RyaW5nO1xuICB9ID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZWxpbWl0ZXIgPSBvcHRpb25zLmRlbGltaXRlciA/PyBcIl9cIjtcbiAgY29uc3Qgc2x1Z01heExlbmd0aCA9IG9wdGlvbnMuc2x1Z01heExlbmd0aCA/PyAzMjtcbiAgY29uc3QgaGFzaExlbmd0aCA9IG9wdGlvbnMuaGFzaExlbmd0aCA/PyA2O1xuICBjb25zdCBmYWxsYmFja1ByZWZpeCA9IG9wdGlvbnMuZmFsbGJhY2tQcmVmaXggPz8gXCJpZFwiO1xuICBjb25zdCBzbHVnID0gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoXG4gICAgeyBkZWxpbWl0ZXIsIG1heExlbmd0aDogc2x1Z01heExlbmd0aCwgdHJ1bmNhdGVTdHJhdGVneTogXCJ0cmltXCIgfSxcbiAgICB2YWx1ZSxcbiAgKTtcbiAgY29uc3Qgc3VmZml4ID0gZm52SGFzaFdpdGhPcHRpb25zKHsgbGVuZ3RoOiBoYXNoTGVuZ3RoIH0sIHZhbHVlKTtcbiAgcmV0dXJuIHNsdWcgPyBgJHtzbHVnfSR7ZGVsaW1pdGVyfSR7c3VmZml4fWAgOiBgJHtmYWxsYmFja1ByZWZpeH0ke2RlbGltaXRlcn0ke3N1ZmZpeH1gO1xufVxuXG5mdW5jdGlvbiBkaWdlc3RUb2tlbnMobGVuZ3RoOiBudW1iZXIsIHBhcnRzOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY29tYmluZWQgPSBcIlwiO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIGNvbWJpbmVkICs9IHBhcnQgKyBcIlxcMFwiO1xuICBpZiAoZXh0cmEgIT09IHVuZGVmaW5lZCkgY29tYmluZWQgKz0gZXh0cmEgKyBcIlxcMFwiO1xuICByZXR1cm4gZm52SGFzaFdpdGhPcHRpb25zKHsgbGVuZ3RoIH0sIGNvbWJpbmVkKTtcbn1cblxuLyoqXG4gKiBBIG5vZGUgaW4gdGhlIGRlc2NyaXB0aW9uIHRyZWUgY29uc3VtZWQgYnkge0BsaW5rIHRvRGVzY3JpcHRpb259LlxuICpcbiAqIC0gYHN0cmluZ2AgLSBhIHRleHQgcGFyYWdyYXBoLlxuICogLSBgRGVzY3JpcHRpb25bXWAgLSBhIHNlcXVlbmNlIG9mIHN0YWNrZWQgYmxvY2tzIGF0IHRoZSBzYW1lIGxldmVsXG4gKiAgIChubyBsaXN0IG1hcmtlcnMpLiBQbGFpbiB0ZXh0IGFkamFjZW50IHRvIGEgbGlzdCAoZWl0aGVyIGRpcmVjdGlvbilcbiAqICAgZmx1c2hlcyB0b2dldGhlciBzbyB0aGUgcHJvc2UgcmVhZHMgYXMgYSBsZWFkLWluIG9yIHRyYWlsaW5nXG4gKiAgIHN1bW1hcnkuIFR3byB0ZXh0IHBhcmFncmFwaHMsIHR3byBhZGphY2VudCBsaXN0cywgYW5kIGFueXRoaW5nXG4gKiAgIHRvdWNoaW5nIGEgbWFwIGdldCBhIGJsYW5rLWxpbmUgYnJlYWsuXG4gKiAtIGB7IGJ1bGxldHM6IFsuLi5dIH1gIC8gYHsgbnVtYmVyZWQ6IFsuLi5dIH1gIC0gZXhwbGljaXQgbGlzdC4gQVxuICogICBsaXN0IG9mIG9uZSBiYXJlIHN0cmluZyBkcm9wcyBpdHMgbWFya2VyIChgLWAgLyBgMS5gKTsgYSBsaXN0IG9mXG4gKiAgIG9uZSBpdGVtIHdpdGggbmVzdGVkIGNoaWxkcmVuIGtlZXBzIGl0cyBtYXJrZXIgYXMgdGhlIHZpc3VhbCBhbmNob3JcbiAqICAgZm9yIHRoZSBpbmRlbnRlZCBjaGlsZHJlbi5cbiAqIC0gYW55IG90aGVyIG9iamVjdCAtIGhlYWRlcnMgbWFwOiBlYWNoIGtleSBiZWNvbWVzIGEgYEhlYWRlcjpgIGxpbmVcbiAqICAgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIGFuZCB0aGUgcmVuZGVyZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIERlc2NyaXB0aW9uID0gc3RyaW5nIHwgcmVhZG9ubHkgRGVzY3JpcHRpb25bXSB8IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogRGVzY3JpcHRpb24gfTtcblxuY29uc3QgTElTVF9LRVlTID0gW1wiYnVsbGV0c1wiLCBcIm51bWJlcmVkXCJdIGFzIGNvbnN0O1xudHlwZSBMaXN0S2luZCA9ICh0eXBlb2YgTElTVF9LRVlTKVtudW1iZXJdO1xuXG4vKipcbiAqIEZvcm1hdCBhIG5lc3RlZCBkZXNjcmlwdGlvbiB0cmVlIGFzIGEgTWFya2Rvd24taXNoIHN0cmluZyBzdWl0YWJsZVxuICogZm9yIGFuIExMTSBzeXN0ZW0gcHJvbXB0LCBab2QgYC5kZXNjcmliZSgpYCBibG9jaywgTWFzdHJhIHRvb2xcbiAqIGRlc2NyaXB0aW9uLCBvciBhbnkgb3RoZXIgbG9uZy1mb3JtIHRleHQgZGVzdGluYXRpb24uXG4gKlxuICogRXZlcnkgc3RyaW5nIHNlY3Rpb24gaXMgZGVkZW50ZWQgKGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2Ugc3RyaXBwZWQpLFxuICogcmlnaHQtdHJpbW1lZCBsaW5lIGJ5IGxpbmUsIGFuZCBmcmVlZCBvZiBsZWFkaW5nIC8gdHJhaWxpbmcgYmxhbmtcbiAqIGxpbmVzLCBzbyBjYWxsZXJzIGNhbiB3cml0ZSBtdWx0aS1saW5lIHRlbXBsYXRlIGxpdGVyYWxzIGluZGVudGVkXG4gKiBuYXR1cmFsbHkgaW4gc291cmNlIHdpdGhvdXQgbGVha2luZyB0aGF0IGluZGVudGF0aW9uIGludG8gdGhlXG4gKiBjb25zdW1lci1mYWNpbmcgb3V0cHV0LiBQbGFpbi1zdHJpbmcgaW5wdXRzIGZsb3cgdGhyb3VnaCB1bmNoYW5nZWRcbiAqIGFwYXJ0IGZyb20gdGhlIHNhbWUgbm9ybWFsaXphdGlvbiBwYXNzLCBzbyBhIHNpbmdsZSBtdWx0aS1saW5lXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHdvcmtzIGRpcmVjdGx5OlxuICpcbiAqIGBgYHRzXG4gKiB0b0Rlc2NyaXB0aW9uKGBcbiAqICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIgYSBxdWVzdGlvbi5cbiAqICAgUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXMuXG4gKiBgKTtcbiAqIC8vIEFzayB0aGUgR2VuaWUgc3BhY2UgXCJkZWZhdWx0XCIgYSBxdWVzdGlvbi5cbiAqIC8vIFBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzLlxuICpcbiAqIHRvRGVzY3JpcHRpb24oW1xuICogICBgXG4gKiAgICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBhIHF1ZXN0aW9uLlxuICogICAgIFBocmFzZSBpdCBmcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUuXG4gKiAgIGAsXG4gKiAgIHsgYnVsbGV0czogW1xuICogICAgIFtcIlBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzXCIsIHsgbnVtYmVyZWQ6IFtcIml0ZW1cIiwgXCJpdGVtXCJdIH1dLFxuICogICBdfSxcbiAqICAgeyBJbnN0cnVjdGlvbnM6IFwiUmVwbHkgd2l0aCB0aGUgU1FMIG9ubHkuXCIgfSxcbiAqIF0pO1xuICogLy8gQXNrIHRoZSBHZW5pZSBzcGFjZSBhIHF1ZXN0aW9uLlxuICogLy8gUGhyYXNlIGl0IGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZS5cbiAqIC8vIC0gUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXNcbiAqIC8vICAgMS4gaXRlbVxuICogLy8gICAyLiBpdGVtXG4gKiAvL1xuICogLy8gSW5zdHJ1Y3Rpb25zOlxuICogLy9cbiAqIC8vIFJlcGx5IHdpdGggdGhlIFNRTCBvbmx5LlxuICogYGBgXG4gKlxuICogU2VlIHtAbGluayBEZXNjcmlwdGlvbn0gZm9yIHRoZSBub2RlIGdyYW1tYXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rlc2NyaXB0aW9uKG5vZGU6IERlc2NyaXB0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbmRlckJsb2NrKG5vZGUsIFwiXCIpXG4gICAgLnJlcGxhY2UoL1sgXFx0XSskL2dtLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9cXG4rJC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJCbG9jayhub2RlOiBEZXNjcmlwdGlvbiwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcHJlcGVuZFBhZChkZWRlbnRTZWN0aW9uKG5vZGUpLCBwYWQpO1xuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkgcmV0dXJuIHJlbmRlclNlcXVlbmNlKG5vZGUsIHBhZCk7XG4gIGNvbnN0IGtpbmQgPSBsaXN0S2luZChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGtpbmQpIHtcbiAgICByZXR1cm4gcmVuZGVyTGlzdCgobm9kZSBhcyBSZWNvcmQ8TGlzdEtpbmQsIHJlYWRvbmx5IERlc2NyaXB0aW9uW10+KVtraW5kXSwgcGFkLCBraW5kKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyTWFwKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgRGVzY3JpcHRpb24+LCBwYWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHN0cmluZyBzZWN0aW9uOiByaWdodC1zdHJpcCBldmVyeSBsaW5lLCBkcm9wIHRoZVxuICogY29tbW9uIGxlYWRpbmctd2hpdGVzcGFjZSBwcmVmaXggc2hhcmVkIGJ5IGFsbCBub24tYmxhbmsgbGluZXMsXG4gKiBhbmQgdHJpbSBsZWFkaW5nIC8gdHJhaWxpbmcgYmxhbmsgbGluZXMuIE1hdGNoZXMgUHl0aG9uJ3NcbiAqIGB0ZXh0d3JhcC5kZWRlbnRgIHNlbWFudGljcyBzbyBlbWJlZGRlZCBpbmRlbnRlZCB0ZW1wbGF0ZVxuICogbGl0ZXJhbHMgcm91bmQtdHJpcCBjbGVhbmx5LlxuICovXG5mdW5jdGlvbiBkZWRlbnRTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdGV4dCkgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+IGxpbmUucmVwbGFjZSgvWyBcXHRdKyQvLCBcIlwiKSk7XG4gIGxldCBtaW4gPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKCFsaW5lKSBjb250aW51ZTtcbiAgICBjb25zdCBtYXRjaCA9IC9eWyBcXHRdKi8uZXhlYyhsaW5lKTtcbiAgICBjb25zdCB3aWR0aCA9IG1hdGNoID8gbWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgICBpZiAod2lkdGggPCBtaW4pIG1pbiA9IHdpZHRoO1xuICB9XG4gIGNvbnN0IHN0cmlwcGVkID1cbiAgICBtaW4gPT09IEluZmluaXR5IHx8IG1pbiA9PT0gMCA/IGxpbmVzIDogbGluZXMubWFwKChsaW5lKSA9PiAobGluZSA/IGxpbmUuc2xpY2UobWluKSA6IFwiXCIpKTtcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGVuZCA9IHN0cmlwcGVkLmxlbmd0aDtcbiAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmICFzdHJpcHBlZFtzdGFydF0pIHN0YXJ0ICs9IDE7XG4gIHdoaWxlIChlbmQgPiBzdGFydCAmJiAhc3RyaXBwZWRbZW5kIC0gMV0pIGVuZCAtPSAxO1xuICByZXR1cm4gc3RyaXBwZWQuc2xpY2Uoc3RhcnQsIGVuZCkuam9pbihcIlxcblwiKTtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgaXMgdHJlYXRlZCBhcyBhIHR5cGVkIGxpc3Qgb25seSB3aGVuIGl0IGhhcyBleGFjdGx5IG9uZVxuICogb3duIGtleSwgdGhhdCBrZXkgaXMgYGJ1bGxldHNgIG9yIGBudW1iZXJlZGAsIGFuZCB0aGUgdmFsdWUgaXMgYW5cbiAqIGFycmF5LiBFdmVyeXRoaW5nIGVsc2UgaXMgYSBoZWFkZXJzIG1hcCAtIHNvIGNhbGxlcnMgd2FudGluZyBhXG4gKiBzaW5nbGUgaGVhZGVyIGxpdGVyYWxseSBuYW1lZCBgYnVsbGV0c2Agb3IgYG51bWJlcmVkYCBjYW4gdXNlIGFcbiAqIG11bHRpLWtleSBtYXAgb3IgcmVuYW1lLlxuICovXG5mdW5jdGlvbiBsaXN0S2luZChub2RlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IExpc3RLaW5kIHwgbnVsbCB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhub2RlKTtcbiAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qga2V5ID0ga2V5c1swXSE7XG4gIGlmICgoTElTVF9LRVlTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhrZXkpICYmIEFycmF5LmlzQXJyYXkobm9kZVtrZXldKSkge1xuICAgIHJldHVybiBrZXkgYXMgTGlzdEtpbmQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHByZXBlbmRQYWQodGV4dDogc3RyaW5nLCBwYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdGV4dCkgcmV0dXJuIFwiXCI7XG4gIGlmICghcGFkKSByZXR1cm4gdGV4dDtcbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAubWFwKChsaW5lKSA9PiAobGluZSA/IHBhZCArIGxpbmUgOiBcIlwiKSlcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2VxdWVuY2UoaXRlbXM6IHJlYWRvbmx5IERlc2NyaXB0aW9uW10sIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVuZGVyZWQ6IHsgdGV4dDogc3RyaW5nOyBub2RlOiBEZXNjcmlwdGlvbiB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgdGV4dCA9IHJlbmRlckJsb2NrKGl0ZW0sIHBhZCk7XG4gICAgaWYgKCF0ZXh0KSBjb250aW51ZTtcbiAgICByZW5kZXJlZC5wdXNoKHsgdGV4dCwgbm9kZTogaXRlbSB9KTtcbiAgfVxuICBpZiAocmVuZGVyZWQubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgbGV0IG91dCA9IHJlbmRlcmVkWzBdIS50ZXh0O1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHJlbmRlcmVkLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc2VwID0gbmVlZHNCbGFua0xpbmVCZXR3ZWVuKHJlbmRlcmVkW2kgLSAxXSEubm9kZSwgcmVuZGVyZWRbaV0hLm5vZGUpID8gXCJcXG5cXG5cIiA6IFwiXFxuXCI7XG4gICAgb3V0ICs9IHNlcCArIHJlbmRlcmVkW2ldIS50ZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTWFwcyBhbHdheXMgY3JlYXRlIHRoZWlyIG93biBzZWN0aW9uIGJvdW5kYXJ5IChhIGBIZWFkZXI6YCBsaW5lIHBsdXNcbiAqIGEgYmxhbmsgbGluZSBiZWZvcmUgdGhlIGJvZHkpLCBzbyBhbnl0aGluZyB0b3VjaGluZyBhIG1hcCBnZXRzIGFcbiAqIGJsYW5rLWxpbmUgYnJlYWsuIFBsYWluIHRleHQgYWRqYWNlbnQgdG8gYSB0eXBlZCBsaXN0IGZsdXNoZXNcbiAqIHRvZ2V0aGVyIGluIGVpdGhlciBkaXJlY3Rpb246IHRleHQtYmVmb3JlLWxpc3QgcmVhZHMgYXMgYSBsZWFkLWluLFxuICogdGV4dC1hZnRlci1saXN0IGFzIGEgdHJhaWxpbmcgc3VtbWFyeS4gVHdvIHRleHQgcGFyYWdyYXBocyBhbmQgdHdvXG4gKiBhZGphY2VudCBsaXN0cyBib3RoIGdldCBhIGJsYW5rLWxpbmUgYnJlYWsgZm9yIGxlZ2liaWxpdHkuXG4gKi9cbmZ1bmN0aW9uIG5lZWRzQmxhbmtMaW5lQmV0d2VlbihwcmV2OiBEZXNjcmlwdGlvbiwgY3VycjogRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgaWYgKGlzTWFwKHByZXYpIHx8IGlzTWFwKGN1cnIpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcHJldklzVGV4dCA9IHR5cGVvZiBwcmV2ID09PSBcInN0cmluZ1wiO1xuICBjb25zdCBjdXJySXNUZXh0ID0gdHlwZW9mIGN1cnIgPT09IFwic3RyaW5nXCI7XG4gIGlmIChwcmV2SXNUZXh0ICE9PSBjdXJySXNUZXh0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgbm9kZSBpcyBhIGhlYWRlcnMgbWFwIHdoZW4gaXQgaXMgYSBub24tYXJyYXksIG5vbi1saXN0IG9iamVjdC5cbiAqIGBidWxsZXRzYCAvIGBudW1iZXJlZGAgc2luZ2xlLWtleSBvYmplY3RzIGFyZSB0aGUgb25seSBzdHJ1Y3R1cmVkXG4gKiBvYmplY3RzIHRoYXQgYXJlbid0IG1hcHMuXG4gKi9cbmZ1bmN0aW9uIGlzTWFwKG5vZGU6IERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gIGlmIChub2RlID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBsaXN0S2luZChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGlzdChpdGVtczogcmVhZG9ubHkgRGVzY3JpcHRpb25bXSwgcGFkOiBzdHJpbmcsIGtpbmQ6IExpc3RLaW5kKTogc3RyaW5nIHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGl0ZW1zWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHByZXBlbmRQYWQoaXRlbXNbMF0sIHBhZCk7XG4gIH1cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV0hO1xuICAgIGNvbnN0IG1hcmtlciA9IGtpbmQgPT09IFwiYnVsbGV0c1wiID8gXCItIFwiIDogYCR7aSArIDF9LiBgO1xuICAgIGNvbnN0IGJvZHkgPSByZW5kZXJCbG9jayhpdGVtLCBcIlwiKTtcbiAgICBjb25zdCBib2R5TGluZXMgPSBib2R5LnNwbGl0KFwiXFxuXCIpO1xuICAgIGxpbmVzLnB1c2goYCR7cGFkfSR7bWFya2VyfSR7Ym9keUxpbmVzWzBdID8/IFwiXCJ9YCk7XG4gICAgY29uc3QgY29udGludWF0aW9uID0gcGFkICsgXCIgXCIucmVwZWF0KG1hcmtlci5sZW5ndGgpO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBib2R5TGluZXMuc2xpY2UoMSkpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSA/IGAke2NvbnRpbnVhdGlvbn0ke2xpbmV9YCA6IFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFwKG5vZGU6IFJlY29yZDxzdHJpbmcsIERlc2NyaXB0aW9uPiwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaGVhZGVyLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBib2R5ID0gcmVuZGVyQmxvY2sodmFsdWUsIHBhZCk7XG4gICAgaWYgKCFib2R5ICYmICFoZWFkZXIudHJpbSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBoZWFkZXJMaW5lID0gaGVhZGVyLnRyaW0oKSA/IGAke3BhZH0ke2hlYWRlcn06YCA6IFwiXCI7XG4gICAgcGFydHMucHVzaChib2R5ID8gYCR7aGVhZGVyTGluZX1cXG5cXG4ke2JvZHl9YCA6IGhlYWRlckxpbmUpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNvdW50IHdpdGggaXRzIG5vdW4sIHBsdXJhbGl6aW5nIChuYWl2ZSBgK3NgKSB1bmxlc3MgdGhlIGNvdW50IGlzIDE6XG4gKiBgcGx1cmFsaXplKDEsIFwiYmFycmVsXCIpYCAtPiBgXCIxIGJhcnJlbFwiYCwgYHBsdXJhbGl6ZSgzLCBcImJhcnJlbFwiKWAgLT5cbiAqIGBcIjMgYmFycmVsc1wiYC4gQ29sbGFwc2VzIHRoZSBgJHtufSBub3VuJHtuID09PSAxID8gXCJcIiA6IFwic1wifWAgaWRpb20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVyYWxpemUoY291bnQ6IG51bWJlciwgbm91bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvdW50fSAke25vdW59JHtjb3VudCA9PT0gMSA/IFwiXCIgOiBcInNcIn1gO1xufVxuXG4vKipcbiAqIFRpdGxlLWNhc2UgYSBzbmFrZSAvIGtlYmFiIC8gY2FtZWwgaWRlbnRpZmllciBpbnRvIGEgaHVtYW4tcmVhZGFibGUgbGFiZWw6XG4gKiB0b2tlbml6ZSAobG93ZXJjYXNlZCwgY2FwaXRhbGl6ZWQpLCB0aGVuIGpvaW4gd2l0aCBzcGFjZXMuIEZhbGxzIGJhY2sgdG9cbiAqIHRoZSByYXcgYHZhbHVlYCB3aGVuIGl0IHlpZWxkcyBubyB0b2tlbnMgKGUuZy4gcHVuY3R1YXRpb24tb25seSBpbnB1dCkuXG4gKiBgYmdlX2xhcmdlX2VuYCAtPiBgXCJCZ2UgTGFyZ2UgRW5cImAsIGBwcm9tcHRJZGAgLT4gYFwiUHJvbXB0IElkXCJgLlxuICpcbiAqIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgXCJodW1hbml6ZSBhIGNvbHVtbiAvIGZpZWxkIG5hbWVcIiBpZGlvbSAtXG4gKiByZXVzZWQgYnkgdGhlIGNoYXQgZGF0YS1ncmlkIGhlYWRlcnMgYW5kIHRoZSBleHBvcnQgcmVuZGVyZXIuIEV4dHJhXG4gKiB7QGxpbmsgVG9rZW5pemVPcHRpb25zfSAoZS5nLiBgY2FtZWxDYXNlOiBmYWxzZWApIG1lcmdlIG92ZXIgdGhlIGRlZmF1bHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9MYWJlbCh2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogVG9rZW5pemVPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gWy4uLnRva2VuaXplV2l0aE9wdGlvbnMoeyBsb3dlckNhc2U6IHRydWUsIGNhcGl0YWxpemU6IHRydWUsIC4uLm9wdGlvbnMgfSwgdmFsdWUpXTtcbiAgcmV0dXJuIHRva2Vucy5sZW5ndGggPiAwID8gdG9rZW5zLmpvaW4oXCIgXCIpIDogdmFsdWU7XG59XG5cbi8qKlxuICogVXBwZXItY2FzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGB2YWx1ZWAsIGxlYXZpbmcgdGhlIHJlc3QgdW50b3VjaGVkLlxuICogYFwid29ya2luZ1wiYCAtPiBgXCJXb3JraW5nXCJgLiBDb2xsYXBzZXMgdGhlXG4gKiBgcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSlgIGlkaW9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKSA6IHZhbHVlO1xufVxuIl19
513
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQTBDL0MsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsaURBQWlELENBQUM7QUFDckYsTUFBTSxnQ0FBZ0MsR0FBRyxlQUFlLENBQUM7QUFDekQsTUFBTSxrQkFBa0IsR0FBNEQ7SUFDbEYsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsNkVBQTZFO0lBQzdFLCtEQUErRDtJQUMvRCxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUM7QUFDRixNQUFNLFVBQVUsR0FBRyxvREFBb0QsQ0FBQztBQUN4RSxNQUFNLFlBQVksR0FBRywwRUFBMEUsQ0FBQztBQUVoRyxNQUFNLGlCQUFpQixHQUE0QjtJQUNqRCxR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LE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgc3RyaW5nIHRvb2xraXQ6IHRva2VuaXphdGlvbiwgaWRlbnRpZmllciAvIHNsdWdcbiAqIGdlbmVyYXRpb24gKHdpdGggaGFzaC1zdWZmaXggY29sbGlzaW9uIHJlc2lzdGFuY2UpLCBIVE1MIGVzY2FwaW5nLFxuICogaGVhZGVyLXZhbHVlIHRyaW1taW5nLCBhbmQgYSBuZXN0ZWQgZGVzY3JpcHRpb24tdHJlZSByZW5kZXJlciBmb3JcbiAqIGxvbmctZm9ybSBMTE0gcHJvbXB0IC8gdG9vbC1kZXNjcmlwdGlvbiB0ZXh0LiBEZXBlbmRzIG9ubHkgb24gdGhlXG4gKiBsb2NhbCB7QGxpbmsgZm52SGFzaFdpdGhPcHRpb25zfSBmb3IgZGV0ZXJtaW5pc3RpYyBoYXNoIHN1ZmZpeGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZm52SGFzaFdpdGhPcHRpb25zIH0gZnJvbSBcIi4vaGFzaC50c1wiO1xuXG4vKipcbiAqIE9wdGlvbnMgY29udHJvbGxpbmcge0BsaW5rIHRva2VuaXplV2l0aE9wdGlvbnN9LiBBbGwgZGVmYXVsdCBvZmYgZXhjZXB0XG4gKiBgY2FtZWxDYXNlYC5cbiAqXG4gKiAtIGBkaXN0aW5jdGAgLSBkcm9wIGR1cGxpY2F0ZSB0b2tlbnMgKGZpcnN0IG9jY3VycmVuY2Ugd2lucykuXG4gKiAtIGBsb3dlckNhc2VgIC0gbG93ZXJjYXNlIGV2ZXJ5IHRva2VuLlxuICogLSBgY2FwaXRhbGl6ZWAgLSB1cHBlci1jYXNlIGVhY2ggdG9rZW4ncyBmaXJzdCBsZXR0ZXIgKHRoZW5cbiAqICAge0BsaW5rIFRPS0VOSVpFX09WRVJSSURFU30gZml4IHVwIGBhaWAgLT4gYEFJYCwgYGZzYCAtPiBgRlNgLCBhbmRcbiAqICAgYHYyYCAtPiBgVjJgKS5cbiAqIC0gYG9taXRVcmlTY2hlbWVgIC0gc3RyaXAgYSBsZWFkaW5nIGBzY2hlbWU6Ly9gIGJlZm9yZSB0b2tlbml6aW5nLlxuICogLSBgb21pdEVtYWlsRG9tYWluYCAtIGtlZXAgb25seSB0aGUgbG9jYWwgcGFydCBvZiBhbiBlbWFpbC5cbiAqIC0gYGNhbWVsQ2FzZWAgLSBzcGxpdCBvbiBjYW1lbENhc2UgYm91bmRhcmllcyAvIGRpZ2l0IHJ1bnMgLyBhY3Jvbnltc1xuICogICAoZGVmYXVsdCBgdHJ1ZWApOyB3aGVuIGBmYWxzZWAsIHNwbGl0IG9ubHkgb24gbm9uLWFscGhhbnVtZXJpY3MuXG4gKi9cbmV4cG9ydCB0eXBlIFRva2VuaXplT3B0aW9ucyA9IHtcbiAgZGlzdGluY3Q/OiBib29sZWFuO1xuICBsb3dlckNhc2U/OiBib29sZWFuO1xuICBjYXBpdGFsaXplPzogYm9vbGVhbjtcbiAgb21pdFVyaVNjaGVtZT86IGJvb2xlYW47XG4gIG9taXRFbWFpbERvbWFpbj86IGJvb2xlYW47XG4gIGNhbWVsQ2FzZT86IGJvb2xlYW47XG59O1xuXG4vLyBLZXlzL2lkZW50aWZpZXJzL3NsdWdzIGFyZSBhbHdheXMgbG93ZXJjYXNlZDsgYGxvd2VyQ2FzZWAgaXMgbm90IGFcbi8vIGNhbGxlci1jb25maWd1cmFibGUgb3B0aW9uLlxuZXhwb3J0IHR5cGUgS2V5T3B0aW9ucyA9IE9taXQ8VG9rZW5pemVPcHRpb25zLCBcImxvd2VyQ2FzZVwiIHwgXCJjYXBpdGFsaXplXCI+ICYge1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIHRydW5jYXRlU3RyYXRlZ3k/OiBcImhhc2hcIiB8IFwidHJpbVwiIHwgXCJlbXB0eVwiO1xuICB0cnVuY2F0ZUhhc2hMZW5ndGg/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBJZGVudGlmaWVyT3B0aW9ucyA9IEtleU9wdGlvbnMgJiB7XG4gIGRlbGltaXRlcj86IHN0cmluZztcbn07XG5cbnR5cGUgUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSBSZXF1aXJlZDxUb2tlbml6ZU9wdGlvbnM+O1xudHlwZSBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0gUmVxdWlyZWQ8XG4gIElkZW50aWZpZXJPcHRpb25zICYgUGljazxUb2tlbml6ZU9wdGlvbnMsIFwibG93ZXJDYXNlXCIgfCBcImNhcGl0YWxpemVcIj5cbj47XG5cbi8vIEEgbGVhZGluZyBgdmAvYFZgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGRpZ2l0cyAoYSB2ZXJzaW9uIG1hcmtlciBsaWtlXG4vLyBgdjJgKSBpcyBrZXB0IGFzIE9ORSB0b2tlbiBpbnN0ZWFkIG9mIHNwbGl0dGluZyBpbnRvIGB2YCArIGAyYDsgaXQgbGVhZHMgdGhlXG4vLyBhbHRlcm5hdGlvbiBzbyBpdCB3aW5zIG92ZXIgdGhlIGdlbmVyaWMgbGV0dGVyIC8gZGlnaXQgcnVucy4gRXZlcnl0aGluZyBlbHNlXG4vLyBpcyB0aGUgdXN1YWwgY2FtZWxDYXNlIHdvcmQgLyBudW1iZXIgLyBhbGwtY2Fwcy1hY3JvbnltIHNwbGl0LlxuY29uc3QgVE9LRU5JWkVfQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvW3ZWXVswLTldK3xbQS1aXT9bYS16XSt8WzAtOV0rfFtBLVpdKyg/IVthLXpdKS9nO1xuY29uc3QgVE9LRU5JWkVfTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFAgPSAvW2EtekEtWjAtOV0rL2c7XG5jb25zdCBUT0tFTklaRV9PVkVSUklERVM6ICgodG9rZW46IHN0cmluZywgb3B0aW9uczogVG9rZW5pemVPcHRpb25zKSA9PiBzdHJpbmcpW10gPSBbXG4gICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgIGlmICghb3B0aW9ucy5jYXBpdGFsaXplKSByZXR1cm4gdG9rZW47XG4gICAgY29uc3QgbG93ZXIgPSB0b2tlbi50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlciA9PT0gXCJhaVwiKSByZXR1cm4gXCJBSVwiO1xuICAgIGlmIChsb3dlciA9PT0gXCJmc1wiKSByZXR1cm4gXCJGU1wiO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfSxcbiAgLy8gVmVyc2lvbiBtYXJrZXIgYHYyYCAtPiBgVjJgIHdoZW4gY2FwaXRhbGl6aW5nICh0aGUgbGVhZGluZyBgdmAgdXBwZXJjYXNlcyxcbiAgLy8gdGhlIGRpZ2l0cyBzdGF5KSwgc28gaXQgcmVhZHMgYXMgb25lIHVuaXQgcmF0aGVyIHRoYW4gXCJWIDJcIi5cbiAgKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuY2FwaXRhbGl6ZSAmJiAvXnZbMC05XSskLy50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIGBWJHt0b2tlbi5zbGljZSgxKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG4gIH0sXG5dO1xuY29uc3QgVVJJX1JFR0VYUCA9IC9eKFthLXpBLVpdW2EtekEtWjAtOSsuLV0qKT86XFwvXFwvKFteXFxzLz8jXVteXFxzXSopPyQvO1xuY29uc3QgRU1BSUxfUkVHRVhQID0gL14oW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSspQChbYS16QS1aMC05LV0rKD86XFwuW2EtekEtWjAtOS1dKykrKSQvO1xuXG5jb25zdCBUT0tFTklaRV9ERUZBVUxUUzogUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSB7XG4gIGRpc3RpbmN0OiBmYWxzZSxcbiAgbG93ZXJDYXNlOiBmYWxzZSxcbiAgY2FwaXRhbGl6ZTogZmFsc2UsXG4gIG9taXRVcmlTY2hlbWU6IGZhbHNlLFxuICBvbWl0RW1haWxEb21haW46IGZhbHNlLFxuICBjYW1lbENhc2U6IHRydWUsXG59O1xuXG5jb25zdCBJREVOVElGSUVSX0RFRkFVTFRTOiBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0ge1xuICAuLi5UT0tFTklaRV9ERUZBVUxUUyxcbiAgbG93ZXJDYXNlOiB0cnVlLFxuICBtYXhMZW5ndGg6IEluZmluaXR5LFxuICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgdHJ1bmNhdGVIYXNoTGVuZ3RoOiA2LFxuICBkZWxpbWl0ZXI6IFwiLVwiLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uKiB0b2tlbml6ZVdpdGhPcHRpb25zKFxuICBvcHRpb25zOiBUb2tlbml6ZU9wdGlvbnMsXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGNvbnN0IG9wdHM6IFJlc29sdmVkVG9rZW5pemVPcHRpb25zID0geyAuLi5UT0tFTklaRV9ERUZBVUxUUywgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBzZWVuID0gb3B0cy5kaXN0aW5jdCA/IG5ldyBTZXQ8c3RyaW5nPigpIDogdW5kZWZpbmVkO1xuICBjb25zdCByZWdleHAgPSBvcHRzLmNhbWVsQ2FzZSA/IFRPS0VOSVpFX0NBTUVMX0NBU0VfUkVHRVhQIDogVE9LRU5JWkVfTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFA7XG5cbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgbGV0IHN0cmluZ1ZhbHVlID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xuICAgIGlmICghc3RyaW5nVmFsdWUpIGNvbnRpbnVlO1xuICAgIGlmIChvcHRzLm9taXRVcmlTY2hlbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nVmFsdWUubWF0Y2goVVJJX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2gpIHN0cmluZ1ZhbHVlID0gbWF0Y2hbMl0gPz8gXCJcIjtcbiAgICB9XG4gICAgaWYgKG9wdHMub21pdEVtYWlsRG9tYWluKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHN0cmluZ1ZhbHVlLm1hdGNoKEVNQUlMX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2gpIHN0cmluZ1ZhbHVlID0gbWF0Y2hbMV0gPz8gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFzdHJpbmdWYWx1ZSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0b2tlbk1hdGNoIG9mIHN0cmluZ1ZhbHVlLm1hdGNoQWxsKHJlZ2V4cCkpIHtcbiAgICAgIGxldCB0b2tlbiA9IHRva2VuTWF0Y2hbMF0hO1xuICAgICAgaWYgKG9wdHMubG93ZXJDYXNlKSB0b2tlbiA9IHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAob3B0cy5jYXBpdGFsaXplKSB0b2tlbiA9IGNhcGl0YWxpemUodG9rZW4pO1xuICAgICAgaWYgKCF0b2tlbikgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IG92ZXJyaWRlIG9mIFRPS0VOSVpFX09WRVJSSURFUykge1xuICAgICAgICB0b2tlbiA9IG92ZXJyaWRlKHRva2VuLCBvcHRzKTtcbiAgICAgICAgaWYgKCF0b2tlbikgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoIXRva2VuIHx8IHNlZW4/Lmhhcyh0b2tlbikpIGNvbnRpbnVlO1xuICAgICAgc2Vlbj8uYWRkKHRva2VuKTtcbiAgICAgIHlpZWxkIHRva2VuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIHRva2VuaXplKC4uLnZhbHVlczogdW5rbm93bltdKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICB5aWVsZCogdG9rZW5pemVXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBKb2luIHRva2VuaXplZCB2YWx1ZXMgd2l0aCBgZGVsaW1pdGVyYC4gV2hlbiB0aGUgbmV4dCB0b2tlbiB3b3VsZCBwdXNoIHRoZVxuICogcmVzdWx0IG92ZXIgYG1heExlbmd0aGA6IGB0cmltYCBzdG9wcyBhZGRpbmc7IGBlbXB0eWAgcmV0dXJucyBgXCJcImA7IGBoYXNoYFxuICogYXBwZW5kcyBhIGRpZ2VzdCBvZiBhY2NlcHRlZCB0b2tlbnMgcGx1cyB0aGUgb3ZlcmZsb3cgdG9rZW4gaWYgdGhlIHJlc3VsdFxuICogc3RpbGwgZml0cywgb3RoZXJ3aXNlIGBcIlwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSWRlbnRpZmllcldpdGhPcHRpb25zKG9wdGlvbnM6IElkZW50aWZpZXJPcHRpb25zLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdHM6IFJlc29sdmVkSWRlbnRpZmllck9wdGlvbnMgPSB7XG4gICAgLi4uSURFTlRJRklFUl9ERUZBVUxUUyxcbiAgICAuLi5vcHRpb25zLFxuICAgIGxvd2VyQ2FzZTogdHJ1ZSxcbiAgfTtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbml6ZVdpdGhPcHRpb25zKG9wdHMsIC4uLnZhbHVlcykpIHtcbiAgICBjb25zdCBzZXBMZW5ndGggPSB0b2tlbnMubGVuZ3RoID4gMCA/IG9wdHMuZGVsaW1pdGVyLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IGN1cnJlbnRMZW5ndGggKyBzZXBMZW5ndGggKyB0b2tlbi5sZW5ndGg7XG5cbiAgICBpZiAobmV4dExlbmd0aCA+IG9wdHMubWF4TGVuZ3RoKSB7XG4gICAgICBpZiAob3B0cy50cnVuY2F0ZVN0cmF0ZWd5ID09PSBcImVtcHR5XCIpIHJldHVybiBcIlwiO1xuICAgICAgaWYgKG9wdHMudHJ1bmNhdGVTdHJhdGVneSA9PT0gXCJ0cmltXCIpIGJyZWFrO1xuXG4gICAgICBjb25zdCBoYXNoID0gZGlnZXN0VG9rZW5zKG9wdHMudHJ1bmNhdGVIYXNoTGVuZ3RoLCB0b2tlbnMsIHRva2VuKTtcbiAgICAgIGlmIChjdXJyZW50TGVuZ3RoICsgc2VwTGVuZ3RoICsgaGFzaC5sZW5ndGggPD0gb3B0cy5tYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRva2Vucy5sZW5ndGggPiAwID8gdG9rZW5zLmpvaW4ob3B0cy5kZWxpbWl0ZXIpICsgb3B0cy5kZWxpbWl0ZXIgKyBoYXNoIDogaGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICBjdXJyZW50TGVuZ3RoID0gbmV4dExlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnMuam9pbihvcHRzLmRlbGltaXRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0lkZW50aWZpZXIoLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoe30sIC4uLnZhbHVlcyk7XG59XG5cbi8qKlxuICogU2x1Z2lmaWVkIGlkZW50aWZpZXI6IHNhbWUgcnVsZXMgYXMge0BsaW5rIHRvSWRlbnRpZmllcldpdGhPcHRpb25zfSB3aXRoIHRoZVxuICogZGVsaW1pdGVyIGZvcmNlZCB0byBgLWAuIEFjY2VwdHMge0BsaW5rIEtleU9wdGlvbnN9IHNvIGNhbGxlcnMgY2Fubm90XG4gKiBvdmVycmlkZSB0aGUgZGVsaW1pdGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbHVnV2l0aE9wdGlvbnMob3B0aW9uczogS2V5T3B0aW9ucywgLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyAuLi5vcHRpb25zLCBkZWxpbWl0ZXI6IFwiLVwiIH0sIC4uLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NsdWcoLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9TbHVnV2l0aE9wdGlvbnMoe30sIC4uLnZhbHVlcyk7XG59XG5cbi8qKlxuICogVHJpbSBgdmFsdWVgIGFuZCByZXR1cm4gYG51bGxgIGZvciBub24tc3RyaW5ncywgYHVuZGVmaW5lZGAsIG9yXG4gKiBzdHJpbmdzIHRoYXQgYXJlIGVtcHR5IGFmdGVyIHRyaW1taW5nLiBMZXRzIGNhbGwgc2l0ZXMgY29sbGFwc2UgdGhlXG4gKiBjb21tb25cbiAqXG4gKiBgYGB0c1xuICogdHlwZW9mIHYgPT09IFwic3RyaW5nXCIgJiYgdi50cmltKCkgPyB2LnRyaW0oKSA6IG51bGxcbiAqIGBgYFxuICpcbiAqIGRhbmNlIGludG8gYSBzaW5nbGUgaGVscGVyLiBVc2VmdWwgZm9yIEhUVFAgaGVhZGVyIC8gcXVlcnkgLyBmb3JtXG4gKiBleHRyYWN0b3JzIHdoZXJlIGRvd25zdHJlYW0gY29kZSB3YW50cyBgc3RyaW5nIHwgbnVsbGAgdG8gZHJpdmUgYVxuICogY2hlYXAgYD8/YCAvIGBpZiAoeClgIGNhc2NhZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltVG9OdWxsKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBudWxsO1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZCA/IHRyaW1tZWQgOiBudWxsO1xufVxuXG4vLyBDb25maWcgbGlzdHMgYXJyaXZlIGVpdGhlciBhbHJlYWR5IHNwbGl0IChhbiBhcnJheSkgb3IgYXMgb25lIGVudi12YXIgc3RyaW5nXG4vLyB3aXRoIGVudHJpZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQvb3Igd2hpdGVzcGFjZS5cbmNvbnN0IExJU1RfU0VQQVJBVE9SX1JFR0VYUCA9IC9bXFxzLF0rLztcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBjb25maWcgbGlzdCB0aGF0IG1heSBhcnJpdmUgYXMgYW4gYXJyYXkgb3IgYXMgYSBzaW5nbGVcbiAqIGNvbW1hL3doaXRlc3BhY2Utc2VwYXJhdGVkIHN0cmluZzogc3BsaXQsIGFwcGx5IGB0cmFuc2Zvcm1gLCBkcm9wIGVtcHRpZXMsXG4gKiBhbmQgZGUtZHVwbGljYXRlIChmaXJzdCBvY2N1cnJlbmNlIHdpbnMpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNoYXBlIGV2ZXJ5IGFsbG93LWxpc3QgLyBmYWxsYmFjay1vcmRlciBzZXR0aW5nIGluIHRoaXMgcmVwb1xuICogdGFrZXMsIGJlY2F1c2UgdGhlIHNhbWUgdmFsdWUgY2FuIGNvbWUgZnJvbSB0eXBlZCBjb25maWcgKGBzdHJpbmdbXWApIG9yIGZyb21cbiAqIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIChgXCJhLCBiIGNcImApLiBQYXNzIGB0cmFuc2Zvcm1gIHRvIG5vcm1hbGl6ZSBlbnRyaWVzXG4gKiBhcyB0aGV5IGFyZSByZWFkOyBpdCBkZWZhdWx0cyB0byB0cmltbWluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VMaXN0KFwiZG9jcy5leGFtcGxlLmNvbSwgKi5kYXRhYnJpY2tzLmNvbVwiKTtcbiAqIHBhcnNlTGlzdChwcm9jZXNzLmVudi5NT0RFTF9GQUxMQkFDS1MpO1xuICogcGFyc2VMaXN0KHJhdywgbm9ybWFsaXplVXJsUGF0dGVybik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3QoXG4gIHJhdzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsLFxuICB0cmFuc2Zvcm06IChlbnRyeTogc3RyaW5nKSA9PiBzdHJpbmcgPSAoZW50cnkpID0+IGVudHJ5LnRyaW0oKSxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW50cmllcyA9XG4gICAgdHlwZW9mIHJhdyA9PT0gXCJzdHJpbmdcIiA/IHJhdy5zcGxpdChMSVNUX1NFUEFSQVRPUl9SRUdFWFApIDogQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogW107XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdHJhbnNmb3JtKGVudHJ5KTtcbiAgICBpZiAoIW5vcm1hbGl6ZWQgfHwgc2Vlbi5oYXMobm9ybWFsaXplZCkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKG5vcm1hbGl6ZWQpO1xuICAgIG91dC5wdXNoKG5vcm1hbGl6ZWQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICoge0BsaW5rIHRyaW1Ub051bGx9IHdpdGggYW4gZW1wdHktc3RyaW5nIG1pc3MgaW5zdGVhZCBvZiBgbnVsbGAsIGZvciBjYWxsZXJzXG4gKiB0aGF0IGJ1aWxkIGEgc3RyaW5nIHVuY29uZGl0aW9uYWxseSBhbmQgdHJlYXQgXCJhYnNlbnRcIiBhcyBcIlwiLlxuICpcbiAqIFJlYWRpbmcgbG9vc2VseS10eXBlZCBKU09OIGlzIHRoZSBtb3RpdmF0aW5nIGNhc2U6IGEgZmllbGQgdGhhdCBzaG91bGQgYmUgYVxuICogc3RyaW5nIG1heSBiZSBtaXNzaW5nIG9yIHRoZSB3cm9uZyB0eXBlLCBhbmQgdGhlIGNhbGxlciB3YW50cyBgXCJcImAgcmF0aGVyXG4gKiB0aGFuIGEgbnVsbCBjaGVjayBhdCBldmVyeSBhY2Nlc3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRpdGxlID0gdHJpbVRvRW1wdHkocmVjb3JkLnRpdGxlKTsgLy8gYWx3YXlzIGEgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltVG9FbXB0eSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiB0cmltVG9OdWxsKHZhbHVlKSA/PyBcIlwiO1xufVxuXG4vKipcbiAqIFRyaW0gdGhlIGZpcnN0IHVzYWJsZSBzdHJpbmcgb3V0IG9mIGB2YWx1ZWAuIFJldHVybnMgYG51bGxgIHdoZW5cbiAqIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGBudWxsYCwgYW4gZW1wdHkgc3RyaW5nLCBvciBhbiBhcnJheSB3aG9zZVxuICogZmlyc3Qgc3RyaW5nIG1lbWJlciBpcyBlbXB0eS4gTWlycm9ycyBob3cgRXhwcmVzcyAvIE5vZGUgaGVhZGVyXG4gKiBhY2Nlc3NvcnMgZXhwb3NlIHNpbmdsZSB2cy4gcmVwZWF0ZWQgaGVhZGVycyAtIHRoZSBmaXJzdFxuICogbm9uLWVtcHR5IGVudHJ5IHdpbnMsIGV2ZXJ5dGhpbmcgZWxzZSBpcyBpZ25vcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3ROb25FbXB0eSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB0cmltVG9OdWxsKGl0ZW0pO1xuICAgICAgaWYgKHRyaW1tZWQpIHJldHVybiB0cmltbWVkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gdHJpbVRvTnVsbCh2YWx1ZSk7XG59XG5cbi8qKlxuICogRXNjYXBlIHRoZSBmaXZlIGNoYXJhY3RlcnMgc2lnbmlmaWNhbnQgaW4gSFRNTCB0ZXh0IGFuZFxuICogZG91YmxlLXF1b3RlZCBhdHRyaWJ1dGUgdmFsdWVzIChgJmAsIGA8YCwgYD5gLCBgXCJgLCBgJ2ApIHNvIGFuXG4gKiB1bnRydXN0ZWQgc3RyaW5nIGNhbiBiZSBpbnRlcnBvbGF0ZWQgaW50byBtYXJrdXAgd2l0aG91dCBicmVha2luZ1xuICogb3V0IG9mIGl0cyBjb250ZXh0LiBgJmAgaXMgcmVwbGFjZWQgZmlyc3Qgc28gYW1wZXJzYW5kcyBpbnRyb2R1Y2VkXG4gKiBieSB0aGUgbGF0ZXIgcmVwbGFjZW1lbnRzIGFyZW4ndCBkb3VibGUtZXNjYXBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcbiAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcbiAgICAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcbiAgICAucmVwbGFjZSgvJy9nLCBcIiYjMzk7XCIpO1xufVxuXG4vKipcbiAqIFNsdWdpZnkgYHZhbHVlYCAodXNpbmcgdGhlIHN0YW5kYXJkIHtAbGluayB0b0lkZW50aWZpZXJXaXRoT3B0aW9uc31cbiAqIHRva2VuaXplciArIGRlbGltaXRlciBydWxlcykgYW5kICoqYWx3YXlzKiogc3VmZml4IGEgc2hvcnRcbiAqIGRldGVybWluaXN0aWMgaGFzaC4gVXNlIHdoZW4geW91IG5lZWQgYSBzdGFibGUsIHNsdWdpZmllZCBpZCB0aGF0XG4gKiBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgZGVzY3JpcHRpb25zIHNoYXJpbmcgdGhlIHNhbWVcbiAqIGxlYWRpbmcgdG9rZW5zICh0b29sIGlkcywgY2FjaGUga2V5cywgZXRjLikuXG4gKlxuICogQmVoYXZpb3VyIGRpZmZlcnMgZnJvbSBgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyBtYXhMZW5ndGgsXG4gKiB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIiB9KWA6IHRoYXQgaGVscGVyIG9ubHkgYXBwZW5kcyBhIGhhc2ggd2hlblxuICogdGhlIHNsdWcgKm92ZXJmbG93cyogYG1heExlbmd0aGAuIFRoaXMgaGVscGVyIGFwcGVuZHMgYSBoYXNoXG4gKiB1bmNvbmRpdGlvbmFsbHkgc28gdGhlIHJlc3VsdCBpcyBjb2xsaXNpb24tcmVzaXN0YW50IGV2ZW4gZm9yXG4gKiBzaG9ydCBpbnB1dHMuIFRoZSBoYXNoIGlzIGNvbXB1dGVkIG92ZXIgdGhlIHJhdyBgdmFsdWVgIHNvIHR3b1xuICogZGVzY3JpcHRpb25zIHByb2R1Y2luZyB0aGUgc2FtZSBzbHVnIHN0aWxsIGdldCBkaWZmZXJlbnQgaWRzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFNvdXJjZSBzdHJpbmcgKHR5cGljYWxseSBhIHRvb2wvYWdlbnQgZGVzY3JpcHRpb24pLlxuICogQHBhcmFtIG9wdGlvbnMuZGVsaW1pdGVyIC0gVG9rZW4gc2VwYXJhdG9yIChkZWZhdWx0IGBcIl9cImApLlxuICogQHBhcmFtIG9wdGlvbnMuc2x1Z01heExlbmd0aCAtIENhcCBvbiB0aGUgc2x1ZyBwb3J0aW9uICh0aGUgcGFydFxuICogICBiZWZvcmUgdGhlIGhhc2gpLiBEZWZhdWx0IDMyLlxuICogQHBhcmFtIG9wdGlvbnMuaGFzaExlbmd0aCAtIExlbmd0aCBvZiB0aGUgc3VmZml4IHByb2R1Y2VkIGJ5XG4gKiAgIHtAbGluayBmbnZIYXNoV2l0aE9wdGlvbnN9IChDcm9ja2ZvcmQtc3R5bGUgYmFzZS0zMiBhbHBoYWJldCwgbWF4IDdcbiAqICAgY2hhcnMpLiBEZWZhdWx0IDYuXG4gKiBAcGFyYW0gb3B0aW9ucy5mYWxsYmFja1ByZWZpeCAtIFByZWZpeCB1c2VkIHdoZW4gdGhlIHNsdWcgaXMgZW1wdHlcbiAqICAgKGUuZy4gcHVuY3R1YXRpb24tb25seSBpbnB1dCkuIERlZmF1bHQgYFwiaWRcImAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VuaXF1ZVNsdWcoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgc2x1Z01heExlbmd0aD86IG51bWJlcjtcbiAgICBoYXNoTGVuZ3RoPzogbnVtYmVyO1xuICAgIGZhbGxiYWNrUHJlZml4Pzogc3RyaW5nO1xuICB9ID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZWxpbWl0ZXIgPSBvcHRpb25zLmRlbGltaXRlciA/PyBcIl9cIjtcbiAgY29uc3Qgc2x1Z01heExlbmd0aCA9IG9wdGlvbnMuc2x1Z01heExlbmd0aCA/PyAzMjtcbiAgY29uc3QgaGFzaExlbmd0aCA9IG9wdGlvbnMuaGFzaExlbmd0aCA/PyA2O1xuICBjb25zdCBmYWxsYmFja1ByZWZpeCA9IG9wdGlvbnMuZmFsbGJhY2tQcmVmaXggPz8gXCJpZFwiO1xuICBjb25zdCBzbHVnID0gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoXG4gICAgeyBkZWxpbWl0ZXIsIG1heExlbmd0aDogc2x1Z01heExlbmd0aCwgdHJ1bmNhdGVTdHJhdGVneTogXCJ0cmltXCIgfSxcbiAgICB2YWx1ZSxcbiAgKTtcbiAgY29uc3Qgc3VmZml4ID0gZm52SGFzaFdpdGhPcHRpb25zKHsgbGVuZ3RoOiBoYXNoTGVuZ3RoIH0sIHZhbHVlKTtcbiAgcmV0dXJuIHNsdWcgPyBgJHtzbHVnfSR7ZGVsaW1pdGVyfSR7c3VmZml4fWAgOiBgJHtmYWxsYmFja1ByZWZpeH0ke2RlbGltaXRlcn0ke3N1ZmZpeH1gO1xufVxuXG5mdW5jdGlvbiBkaWdlc3RUb2tlbnMobGVuZ3RoOiBudW1iZXIsIHBhcnRzOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY29tYmluZWQgPSBcIlwiO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIGNvbWJpbmVkICs9IHBhcnQgKyBcIlxcMFwiO1xuICBpZiAoZXh0cmEgIT09IHVuZGVmaW5lZCkgY29tYmluZWQgKz0gZXh0cmEgKyBcIlxcMFwiO1xuICByZXR1cm4gZm52SGFzaFdpdGhPcHRpb25zKHsgbGVuZ3RoIH0sIGNvbWJpbmVkKTtcbn1cblxuLyoqXG4gKiBBIG5vZGUgaW4gdGhlIGRlc2NyaXB0aW9uIHRyZWUgY29uc3VtZWQgYnkge0BsaW5rIHRvRGVzY3JpcHRpb259LlxuICpcbiAqIC0gYHN0cmluZ2AgLSBhIHRleHQgcGFyYWdyYXBoLlxuICogLSBgRGVzY3JpcHRpb25bXWAgLSBhIHNlcXVlbmNlIG9mIHN0YWNrZWQgYmxvY2tzIGF0IHRoZSBzYW1lIGxldmVsXG4gKiAgIChubyBsaXN0IG1hcmtlcnMpLiBQbGFpbiB0ZXh0IGFkamFjZW50IHRvIGEgbGlzdCAoZWl0aGVyIGRpcmVjdGlvbilcbiAqICAgZmx1c2hlcyB0b2dldGhlciBzbyB0aGUgcHJvc2UgcmVhZHMgYXMgYSBsZWFkLWluIG9yIHRyYWlsaW5nXG4gKiAgIHN1bW1hcnkuIFR3byB0ZXh0IHBhcmFncmFwaHMsIHR3byBhZGphY2VudCBsaXN0cywgYW5kIGFueXRoaW5nXG4gKiAgIHRvdWNoaW5nIGEgbWFwIGdldCBhIGJsYW5rLWxpbmUgYnJlYWsuXG4gKiAtIGB7IGJ1bGxldHM6IFsuLi5dIH1gIC8gYHsgbnVtYmVyZWQ6IFsuLi5dIH1gIC0gZXhwbGljaXQgbGlzdC4gQVxuICogICBsaXN0IG9mIG9uZSBiYXJlIHN0cmluZyBkcm9wcyBpdHMgbWFya2VyIChgLWAgLyBgMS5gKTsgYSBsaXN0IG9mXG4gKiAgIG9uZSBpdGVtIHdpdGggbmVzdGVkIGNoaWxkcmVuIGtlZXBzIGl0cyBtYXJrZXIgYXMgdGhlIHZpc3VhbCBhbmNob3JcbiAqICAgZm9yIHRoZSBpbmRlbnRlZCBjaGlsZHJlbi5cbiAqIC0gYW55IG90aGVyIG9iamVjdCAtIGhlYWRlcnMgbWFwOiBlYWNoIGtleSBiZWNvbWVzIGEgYEhlYWRlcjpgIGxpbmVcbiAqICAgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIGFuZCB0aGUgcmVuZGVyZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIERlc2NyaXB0aW9uID0gc3RyaW5nIHwgcmVhZG9ubHkgRGVzY3JpcHRpb25bXSB8IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogRGVzY3JpcHRpb24gfTtcblxuY29uc3QgTElTVF9LRVlTID0gW1wiYnVsbGV0c1wiLCBcIm51bWJlcmVkXCJdIGFzIGNvbnN0O1xudHlwZSBMaXN0S2luZCA9ICh0eXBlb2YgTElTVF9LRVlTKVtudW1iZXJdO1xuXG4vKipcbiAqIEZvcm1hdCBhIG5lc3RlZCBkZXNjcmlwdGlvbiB0cmVlIGFzIGEgTWFya2Rvd24taXNoIHN0cmluZyBzdWl0YWJsZVxuICogZm9yIGFuIExMTSBzeXN0ZW0gcHJvbXB0LCBab2QgYC5kZXNjcmliZSgpYCBibG9jaywgTWFzdHJhIHRvb2xcbiAqIGRlc2NyaXB0aW9uLCBvciBhbnkgb3RoZXIgbG9uZy1mb3JtIHRleHQgZGVzdGluYXRpb24uXG4gKlxuICogRXZlcnkgc3RyaW5nIHNlY3Rpb24gaXMgZGVkZW50ZWQgKGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2Ugc3RyaXBwZWQpLFxuICogcmlnaHQtdHJpbW1lZCBsaW5lIGJ5IGxpbmUsIGFuZCBmcmVlZCBvZiBsZWFkaW5nIC8gdHJhaWxpbmcgYmxhbmtcbiAqIGxpbmVzLCBzbyBjYWxsZXJzIGNhbiB3cml0ZSBtdWx0aS1saW5lIHRlbXBsYXRlIGxpdGVyYWxzIGluZGVudGVkXG4gKiBuYXR1cmFsbHkgaW4gc291cmNlIHdpdGhvdXQgbGVha2luZyB0aGF0IGluZGVudGF0aW9uIGludG8gdGhlXG4gKiBjb25zdW1lci1mYWNpbmcgb3V0cHV0LiBQbGFpbi1zdHJpbmcgaW5wdXRzIGZsb3cgdGhyb3VnaCB1bmNoYW5nZWRcbiAqIGFwYXJ0IGZyb20gdGhlIHNhbWUgbm9ybWFsaXphdGlvbiBwYXNzLCBzbyBhIHNpbmdsZSBtdWx0aS1saW5lXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHdvcmtzIGRpcmVjdGx5OlxuICpcbiAqIGBgYHRzXG4gKiB0b0Rlc2NyaXB0aW9uKGBcbiAqICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIgYSBxdWVzdGlvbi5cbiAqICAgUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXMuXG4gKiBgKTtcbiAqIC8vIEFzayB0aGUgR2VuaWUgc3BhY2UgXCJkZWZhdWx0XCIgYSBxdWVzdGlvbi5cbiAqIC8vIFBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzLlxuICpcbiAqIHRvRGVzY3JpcHRpb24oW1xuICogICBgXG4gKiAgICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBhIHF1ZXN0aW9uLlxuICogICAgIFBocmFzZSBpdCBmcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUuXG4gKiAgIGAsXG4gKiAgIHsgYnVsbGV0czogW1xuICogICAgIFtcIlBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzXCIsIHsgbnVtYmVyZWQ6IFtcIml0ZW1cIiwgXCJpdGVtXCJdIH1dLFxuICogICBdfSxcbiAqICAgeyBJbnN0cnVjdGlvbnM6IFwiUmVwbHkgd2l0aCB0aGUgU1FMIG9ubHkuXCIgfSxcbiAqIF0pO1xuICogLy8gQXNrIHRoZSBHZW5pZSBzcGFjZSBhIHF1ZXN0aW9uLlxuICogLy8gUGhyYXNlIGl0IGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZS5cbiAqIC8vIC0gUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXNcbiAqIC8vICAgMS4gaXRlbVxuICogLy8gICAyLiBpdGVtXG4gKiAvL1xuICogLy8gSW5zdHJ1Y3Rpb25zOlxuICogLy9cbiAqIC8vIFJlcGx5IHdpdGggdGhlIFNRTCBvbmx5LlxuICogYGBgXG4gKlxuICogU2VlIHtAbGluayBEZXNjcmlwdGlvbn0gZm9yIHRoZSBub2RlIGdyYW1tYXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rlc2NyaXB0aW9uKG5vZGU6IERlc2NyaXB0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbmRlckJsb2NrKG5vZGUsIFwiXCIpXG4gICAgLnJlcGxhY2UoL1sgXFx0XSskL2dtLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9cXG4rJC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJCbG9jayhub2RlOiBEZXNjcmlwdGlvbiwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcHJlcGVuZFBhZChkZWRlbnRTZWN0aW9uKG5vZGUpLCBwYWQpO1xuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkgcmV0dXJuIHJlbmRlclNlcXVlbmNlKG5vZGUsIHBhZCk7XG4gIGNvbnN0IGtpbmQgPSBsaXN0S2luZChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGtpbmQpIHtcbiAgICByZXR1cm4gcmVuZGVyTGlzdCgobm9kZSBhcyBSZWNvcmQ8TGlzdEtpbmQsIHJlYWRvbmx5IERlc2NyaXB0aW9uW10+KVtraW5kXSwgcGFkLCBraW5kKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyTWFwKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgRGVzY3JpcHRpb24+LCBwYWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHN0cmluZyBzZWN0aW9uOiByaWdodC1zdHJpcCBldmVyeSBsaW5lLCBkcm9wIHRoZVxuICogY29tbW9uIGxlYWRpbmctd2hpdGVzcGFjZSBwcmVmaXggc2hhcmVkIGJ5IGFsbCBub24tYmxhbmsgbGluZXMsXG4gKiBhbmQgdHJpbSBsZWFkaW5nIC8gdHJhaWxpbmcgYmxhbmsgbGluZXMuIE1hdGNoZXMgUHl0aG9uJ3NcbiAqIGB0ZXh0d3JhcC5kZWRlbnRgIHNlbWFudGljcyBzbyBlbWJlZGRlZCBpbmRlbnRlZCB0ZW1wbGF0ZVxuICogbGl0ZXJhbHMgcm91bmQtdHJpcCBjbGVhbmx5LlxuICovXG5mdW5jdGlvbiBkZWRlbnRTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdGV4dCkgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+IGxpbmUucmVwbGFjZSgvWyBcXHRdKyQvLCBcIlwiKSk7XG4gIGxldCBtaW4gPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKCFsaW5lKSBjb250aW51ZTtcbiAgICBjb25zdCBtYXRjaCA9IC9eWyBcXHRdKi8uZXhlYyhsaW5lKTtcbiAgICBjb25zdCB3aWR0aCA9IG1hdGNoID8gbWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgICBpZiAod2lkdGggPCBtaW4pIG1pbiA9IHdpZHRoO1xuICB9XG4gIGNvbnN0IHN0cmlwcGVkID1cbiAgICBtaW4gPT09IEluZmluaXR5IHx8IG1pbiA9PT0gMCA/IGxpbmVzIDogbGluZXMubWFwKChsaW5lKSA9PiAobGluZSA/IGxpbmUuc2xpY2UobWluKSA6IFwiXCIpKTtcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGVuZCA9IHN0cmlwcGVkLmxlbmd0aDtcbiAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmICFzdHJpcHBlZFtzdGFydF0pIHN0YXJ0ICs9IDE7XG4gIHdoaWxlIChlbmQgPiBzdGFydCAmJiAhc3RyaXBwZWRbZW5kIC0gMV0pIGVuZCAtPSAxO1xuICByZXR1cm4gc3RyaXBwZWQuc2xpY2Uoc3RhcnQsIGVuZCkuam9pbihcIlxcblwiKTtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgaXMgdHJlYXRlZCBhcyBhIHR5cGVkIGxpc3Qgb25seSB3aGVuIGl0IGhhcyBleGFjdGx5IG9uZVxuICogb3duIGtleSwgdGhhdCBrZXkgaXMgYGJ1bGxldHNgIG9yIGBudW1iZXJlZGAsIGFuZCB0aGUgdmFsdWUgaXMgYW5cbiAqIGFycmF5LiBFdmVyeXRoaW5nIGVsc2UgaXMgYSBoZWFkZXJzIG1hcCAtIHNvIGNhbGxlcnMgd2FudGluZyBhXG4gKiBzaW5nbGUgaGVhZGVyIGxpdGVyYWxseSBuYW1lZCBgYnVsbGV0c2Agb3IgYG51bWJlcmVkYCBjYW4gdXNlIGFcbiAqIG11bHRpLWtleSBtYXAgb3IgcmVuYW1lLlxuICovXG5mdW5jdGlvbiBsaXN0S2luZChub2RlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IExpc3RLaW5kIHwgbnVsbCB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhub2RlKTtcbiAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qga2V5ID0ga2V5c1swXSE7XG4gIGlmICgoTElTVF9LRVlTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhrZXkpICYmIEFycmF5LmlzQXJyYXkobm9kZVtrZXldKSkge1xuICAgIHJldHVybiBrZXkgYXMgTGlzdEtpbmQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHByZXBlbmRQYWQodGV4dDogc3RyaW5nLCBwYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdGV4dCkgcmV0dXJuIFwiXCI7XG4gIGlmICghcGFkKSByZXR1cm4gdGV4dDtcbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAubWFwKChsaW5lKSA9PiAobGluZSA/IHBhZCArIGxpbmUgOiBcIlwiKSlcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2VxdWVuY2UoaXRlbXM6IHJlYWRvbmx5IERlc2NyaXB0aW9uW10sIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVuZGVyZWQ6IHsgdGV4dDogc3RyaW5nOyBub2RlOiBEZXNjcmlwdGlvbiB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgdGV4dCA9IHJlbmRlckJsb2NrKGl0ZW0sIHBhZCk7XG4gICAgaWYgKCF0ZXh0KSBjb250aW51ZTtcbiAgICByZW5kZXJlZC5wdXNoKHsgdGV4dCwgbm9kZTogaXRlbSB9KTtcbiAgfVxuICBpZiAocmVuZGVyZWQubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgbGV0IG91dCA9IHJlbmRlcmVkWzBdIS50ZXh0O1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHJlbmRlcmVkLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc2VwID0gbmVlZHNCbGFua0xpbmVCZXR3ZWVuKHJlbmRlcmVkW2kgLSAxXSEubm9kZSwgcmVuZGVyZWRbaV0hLm5vZGUpID8gXCJcXG5cXG5cIiA6IFwiXFxuXCI7XG4gICAgb3V0ICs9IHNlcCArIHJlbmRlcmVkW2ldIS50ZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTWFwcyBhbHdheXMgY3JlYXRlIHRoZWlyIG93biBzZWN0aW9uIGJvdW5kYXJ5IChhIGBIZWFkZXI6YCBsaW5lIHBsdXNcbiAqIGEgYmxhbmsgbGluZSBiZWZvcmUgdGhlIGJvZHkpLCBzbyBhbnl0aGluZyB0b3VjaGluZyBhIG1hcCBnZXRzIGFcbiAqIGJsYW5rLWxpbmUgYnJlYWsuIFBsYWluIHRleHQgYWRqYWNlbnQgdG8gYSB0eXBlZCBsaXN0IGZsdXNoZXNcbiAqIHRvZ2V0aGVyIGluIGVpdGhlciBkaXJlY3Rpb246IHRleHQtYmVmb3JlLWxpc3QgcmVhZHMgYXMgYSBsZWFkLWluLFxuICogdGV4dC1hZnRlci1saXN0IGFzIGEgdHJhaWxpbmcgc3VtbWFyeS4gVHdvIHRleHQgcGFyYWdyYXBocyBhbmQgdHdvXG4gKiBhZGphY2VudCBsaXN0cyBib3RoIGdldCBhIGJsYW5rLWxpbmUgYnJlYWsgZm9yIGxlZ2liaWxpdHkuXG4gKi9cbmZ1bmN0aW9uIG5lZWRzQmxhbmtMaW5lQmV0d2VlbihwcmV2OiBEZXNjcmlwdGlvbiwgY3VycjogRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgaWYgKGlzTWFwKHByZXYpIHx8IGlzTWFwKGN1cnIpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcHJldklzVGV4dCA9IHR5cGVvZiBwcmV2ID09PSBcInN0cmluZ1wiO1xuICBjb25zdCBjdXJySXNUZXh0ID0gdHlwZW9mIGN1cnIgPT09IFwic3RyaW5nXCI7XG4gIGlmIChwcmV2SXNUZXh0ICE9PSBjdXJySXNUZXh0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgbm9kZSBpcyBhIGhlYWRlcnMgbWFwIHdoZW4gaXQgaXMgYSBub24tYXJyYXksIG5vbi1saXN0IG9iamVjdC5cbiAqIGBidWxsZXRzYCAvIGBudW1iZXJlZGAgc2luZ2xlLWtleSBvYmplY3RzIGFyZSB0aGUgb25seSBzdHJ1Y3R1cmVkXG4gKiBvYmplY3RzIHRoYXQgYXJlbid0IG1hcHMuXG4gKi9cbmZ1bmN0aW9uIGlzTWFwKG5vZGU6IERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gIGlmIChub2RlID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBsaXN0S2luZChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGlzdChpdGVtczogcmVhZG9ubHkgRGVzY3JpcHRpb25bXSwgcGFkOiBzdHJpbmcsIGtpbmQ6IExpc3RLaW5kKTogc3RyaW5nIHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGl0ZW1zWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHByZXBlbmRQYWQoaXRlbXNbMF0sIHBhZCk7XG4gIH1cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV0hO1xuICAgIGNvbnN0IG1hcmtlciA9IGtpbmQgPT09IFwiYnVsbGV0c1wiID8gXCItIFwiIDogYCR7aSArIDF9LiBgO1xuICAgIGNvbnN0IGJvZHkgPSByZW5kZXJCbG9jayhpdGVtLCBcIlwiKTtcbiAgICBjb25zdCBib2R5TGluZXMgPSBib2R5LnNwbGl0KFwiXFxuXCIpO1xuICAgIGxpbmVzLnB1c2goYCR7cGFkfSR7bWFya2VyfSR7Ym9keUxpbmVzWzBdID8/IFwiXCJ9YCk7XG4gICAgY29uc3QgY29udGludWF0aW9uID0gcGFkICsgXCIgXCIucmVwZWF0KG1hcmtlci5sZW5ndGgpO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBib2R5TGluZXMuc2xpY2UoMSkpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSA/IGAke2NvbnRpbnVhdGlvbn0ke2xpbmV9YCA6IFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFwKG5vZGU6IFJlY29yZDxzdHJpbmcsIERlc2NyaXB0aW9uPiwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaGVhZGVyLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBib2R5ID0gcmVuZGVyQmxvY2sodmFsdWUsIHBhZCk7XG4gICAgaWYgKCFib2R5ICYmICFoZWFkZXIudHJpbSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBoZWFkZXJMaW5lID0gaGVhZGVyLnRyaW0oKSA/IGAke3BhZH0ke2hlYWRlcn06YCA6IFwiXCI7XG4gICAgcGFydHMucHVzaChib2R5ID8gYCR7aGVhZGVyTGluZX1cXG5cXG4ke2JvZHl9YCA6IGhlYWRlckxpbmUpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNvdW50IHdpdGggaXRzIG5vdW4sIHBsdXJhbGl6aW5nIChuYWl2ZSBgK3NgKSB1bmxlc3MgdGhlIGNvdW50IGlzIDE6XG4gKiBgcGx1cmFsaXplKDEsIFwiYmFycmVsXCIpYCAtPiBgXCIxIGJhcnJlbFwiYCwgYHBsdXJhbGl6ZSgzLCBcImJhcnJlbFwiKWAgLT5cbiAqIGBcIjMgYmFycmVsc1wiYC4gQ29sbGFwc2VzIHRoZSBgJHtufSBub3VuJHtuID09PSAxID8gXCJcIiA6IFwic1wifWAgaWRpb20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVyYWxpemUoY291bnQ6IG51bWJlciwgbm91bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvdW50fSAke25vdW59JHtjb3VudCA9PT0gMSA/IFwiXCIgOiBcInNcIn1gO1xufVxuXG4vKipcbiAqIFRpdGxlLWNhc2UgYSBzbmFrZSAvIGtlYmFiIC8gY2FtZWwgaWRlbnRpZmllciBpbnRvIGEgaHVtYW4tcmVhZGFibGUgbGFiZWw6XG4gKiB0b2tlbml6ZSAobG93ZXJjYXNlZCwgY2FwaXRhbGl6ZWQpLCB0aGVuIGpvaW4gd2l0aCBzcGFjZXMuIEZhbGxzIGJhY2sgdG9cbiAqIHRoZSByYXcgYHZhbHVlYCB3aGVuIGl0IHlpZWxkcyBubyB0b2tlbnMgKGUuZy4gcHVuY3R1YXRpb24tb25seSBpbnB1dCkuXG4gKiBgYmdlX2xhcmdlX2VuYCAtPiBgXCJCZ2UgTGFyZ2UgRW5cImAsIGBwcm9tcHRJZGAgLT4gYFwiUHJvbXB0IElkXCJgLlxuICpcbiAqIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgXCJodW1hbml6ZSBhIGNvbHVtbiAvIGZpZWxkIG5hbWVcIiBpZGlvbSAtXG4gKiByZXVzZWQgYnkgdGhlIGNoYXQgZGF0YS1ncmlkIGhlYWRlcnMgYW5kIHRoZSBleHBvcnQgcmVuZGVyZXIuIEV4dHJhXG4gKiB7QGxpbmsgVG9rZW5pemVPcHRpb25zfSAoZS5nLiBgY2FtZWxDYXNlOiBmYWxzZWApIG1lcmdlIG92ZXIgdGhlIGRlZmF1bHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9MYWJlbCh2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogVG9rZW5pemVPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gWy4uLnRva2VuaXplV2l0aE9wdGlvbnMoeyBsb3dlckNhc2U6IHRydWUsIGNhcGl0YWxpemU6IHRydWUsIC4uLm9wdGlvbnMgfSwgdmFsdWUpXTtcbiAgcmV0dXJuIHRva2Vucy5sZW5ndGggPiAwID8gdG9rZW5zLmpvaW4oXCIgXCIpIDogdmFsdWU7XG59XG5cbi8qKlxuICogVXBwZXItY2FzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGB2YWx1ZWAsIGxlYXZpbmcgdGhlIHJlc3QgdW50b3VjaGVkLlxuICogYFwid29ya2luZ1wiYCAtPiBgXCJXb3JraW5nXCJgLiBDb2xsYXBzZXMgdGhlXG4gKiBgcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSlgIGlkaW9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKSA6IHZhbHVlO1xufVxuIl19
package/package.json CHANGED
@@ -22,7 +22,7 @@
22
22
  "publishConfig": {
23
23
  "access": "public"
24
24
  },
25
- "version": "0.6.8",
25
+ "version": "0.6.10",
26
26
  "types": "./lib/index.d.ts",
27
27
  "type": "module",
28
28
  "exports": {
package/src/string.ts CHANGED
@@ -16,7 +16,8 @@ import { fnvHashWithOptions } from "./hash.ts";
16
16
  * - `distinct` - drop duplicate tokens (first occurrence wins).
17
17
  * - `lowerCase` - lowercase every token.
18
18
  * - `capitalize` - upper-case each token's first letter (then
19
- * {@link TOKENIZE_OVERRIDES} fix up `ai` -> `AI` and `v2` -> `V2`).
19
+ * {@link TOKENIZE_OVERRIDES} fix up `ai` -> `AI`, `fs` -> `FS`, and
20
+ * `v2` -> `V2`).
20
21
  * - `omitUriScheme` - strip a leading `scheme://` before tokenizing.
21
22
  * - `omitEmailDomain` - keep only the local part of an email.
22
23
  * - `camelCase` - split on camelCase boundaries / digit runs / acronyms
@@ -56,9 +57,10 @@ const TOKENIZE_CAMEL_CASE_REGEXP = /[vV][0-9]+|[A-Z]?[a-z]+|[0-9]+|[A-Z]+(?![a-z
56
57
  const TOKENIZE_NON_ALPHANUMERIC_REGEXP = /[a-zA-Z0-9]+/g;
57
58
  const TOKENIZE_OVERRIDES: ((token: string, options: TokenizeOptions) => string)[] = [
58
59
  (token, options) => {
59
- if (options.capitalize && token.toLowerCase() === "ai") {
60
- return "AI";
61
- }
60
+ if (!options.capitalize) return token;
61
+ const lower = token.toLowerCase();
62
+ if (lower === "ai") return "AI";
63
+ if (lower === "fs") return "FS";
62
64
  return token;
63
65
  },
64
66
  // Version marker `v2` -> `V2` when capitalizing (the leading `v` uppercases,