@dbx-tools/model 0.9.167 → 0.9.173

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.
@@ -1,11 +1,13 @@
1
1
  {
2
- "generatedAt": 1791144427,
2
+ "generatedAt": 1793283170,
3
3
  "models": [
4
4
  "Anthropic Claude 3.7 Sonnet",
5
5
  "Anthropic Claude Sonnet 4",
6
6
  "DBRX",
7
7
  "DBRX Instruct",
8
+ "DeepSeek V4 Flash (0731)",
8
9
  "DeepSeek V4 Pro (0813)",
10
+ "DeepSeek V4.1 Flash",
9
11
  "Gemini 2.5 Flash",
10
12
  "Gemini 2.5 Pro",
11
13
  "Gemini 3 Pro",
@@ -11,6 +11,10 @@ export declare const WEB_SEARCH_MODELS_URL = "https://docs.databricks.com/aws/en
11
11
  export declare const MODEL_RATE_LIMITS_URL = "https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/limits";
12
12
  /** Databricks documentation URL for reasoning-effort model policy. */
13
13
  export declare const QUERY_REASON_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models";
14
+ /** models.dev provider catalogue URL. */
15
+ export declare const MODELS_DEV_API_URL = "https://models.dev/api.json";
16
+ /** modelparams.dev normalized model-parameter catalogue URL. */
17
+ export declare const MODELPARAMS_DEV_MODELS_URL = "https://modelparams.dev/api/v1/models.json";
14
18
  /** Build-generated retired-model snapshot. */
15
19
  export interface RetiredModelsSnapshot {
16
20
  readonly generatedAt: number;
@@ -46,3 +50,26 @@ export interface ReasoningModelsSnapshot {
46
50
  readonly generatedAt: number;
47
51
  readonly catalogue: ReasoningModelCatalogue;
48
52
  }
53
+ /** Portable capability sets normalized from models.dev. */
54
+ export interface ModelsDevCapabilityCatalogue {
55
+ readonly imageInput: readonly string[];
56
+ readonly reasoning: readonly string[];
57
+ readonly tools: readonly string[];
58
+ readonly structuredOutput: readonly string[];
59
+ readonly temperatureSupported: readonly string[];
60
+ readonly temperatureUnsupported: readonly string[];
61
+ }
62
+ /** Build-generated models.dev capability and reasoning snapshot. */
63
+ export interface ModelsDevSnapshot {
64
+ readonly generatedAt: number;
65
+ readonly capabilities: ModelsDevCapabilityCatalogue;
66
+ }
67
+ /** Reasoning support and discrete effort levels normalized from modelparams.dev. */
68
+ export interface ModelParamsCatalogue extends ReasoningModelCatalogue {
69
+ readonly reasoning: readonly string[];
70
+ }
71
+ /** Build-generated modelparams.dev reasoning snapshot. */
72
+ export interface ModelParamsSnapshot {
73
+ readonly generatedAt: number;
74
+ readonly catalogue: ModelParamsCatalogue;
75
+ }
@@ -10,4 +10,8 @@ export const WEB_SEARCH_MODELS_URL = "https://docs.databricks.com/aws/en/machine
10
10
  export const MODEL_RATE_LIMITS_URL = "https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/limits";
11
11
  /** Databricks documentation URL for reasoning-effort model policy. */
12
12
  export const QUERY_REASON_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models";
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY29udHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV6RCxrRUFBa0U7QUFDbEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQzdCLDJFQUEyRSxDQUFDO0FBRTlFLHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FDdEMsMEZBQTBGLENBQUM7QUFFN0Ysd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUNoQyw4RUFBOEUsQ0FBQztBQUVqRixvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQ2hDLGtGQUFrRixDQUFDO0FBRXJGLHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FDbEMsdUZBQXVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1vZGVsUmF0ZUxpbWl0cyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG4vKiogT25lIGRheSwgbWF0Y2hpbmcgdGhlIHJlZnJlc2ggY2FkZW5jZSBvZiBEYXRhYnJpY2tzIG1vZGVsIGRvY3VtZW50YXRpb24uICovXG5leHBvcnQgY29uc3QgTU9ERUxfTUVUQURBVEFfVFRMX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIHJldGlyZWQgZm91bmRhdGlvbiBtb2RlbHMuICovXG5leHBvcnQgY29uc3QgUkVUSVJFRF9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvcmV0aXJlZC1tb2RlbHMtcG9saWN5XCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBPcGVuQUkgUmVzcG9uc2VzIG1vZGVsIHN1cHBvcnQuICovXG5leHBvcnQgY29uc3QgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy9xdWVyeS1vcGVuYWktcmVzcG9uc2VzXCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbCBzdXBwb3J0LiAqL1xuZXhwb3J0IGNvbnN0IFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCA9XG4gIFwiaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2F3cy9lbi9tYWNoaW5lLWxlYXJuaW5nL21vZGVsLXNlcnZpbmcvd2ViLXNlYXJjaFwiO1xuXG4vKiogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIFVSTCBmb3IgRm91bmRhdGlvbiBNb2RlbCBBUEkgbGltaXRzLiAqL1xuZXhwb3J0IGNvbnN0IE1PREVMX1JBVEVfTElNSVRTX1VSTCA9XG4gIFwiaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2F3cy9lbi9tYWNoaW5lLWxlYXJuaW5nL2ZvdW5kYXRpb24tbW9kZWwtYXBpcy9saW1pdHNcIjtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIHJlYXNvbmluZy1lZmZvcnQgbW9kZWwgcG9saWN5LiAqL1xuZXhwb3J0IGNvbnN0IFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy9xdWVyeS1yZWFzb24tbW9kZWxzXCI7XG5cbi8qKiBCdWlsZC1nZW5lcmF0ZWQgcmV0aXJlZC1tb2RlbCBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0aXJlZE1vZGVsc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgbW9kZWxzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIE5vcm1hbGl6ZWQgbW9kZWwgaWRlbnRpdGllcyBncm91cGVkIGJ5IGRvY3VtZW50ZWQgY2FwYWJpbGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgcmVzcG9uc2VzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaW1hZ2VJbnB1dDogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGFwcGx5UGF0Y2g6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSB3ZWJTZWFyY2g6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogQnVpbGQtZ2VuZXJhdGVkIG1vZGVsLWNhcGFiaWxpdHkgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3Qge1xuICByZWFkb25seSBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcbn1cblxuLyoqIE1vZGVsIGxpbWl0cyBrZXllZCBieSBub3JtYWxpemVkIERhdGFicmlja3MgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pjtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbC1yYXRlLWxpbWl0IHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNhdGFsb2d1ZTogTW9kZWxSYXRlTGltaXRDYXRhbG9ndWU7XG59XG5cbi8qKiBEb2N1bWVudGVkIGdlbmVyaWMgcmVhc29uaW5nIGxldmVscyBrZXllZCBieSBub3JtYWxpemVkIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pjtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCByZWFzb25pbmctZWZmb3J0IGRvY3VtZW50YXRpb24gc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2F0YWxvZ3VlOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cbiJdfQ==
13
+ /** models.dev provider catalogue URL. */
14
+ export const MODELS_DEV_API_URL = "https://models.dev/api.json";
15
+ /** modelparams.dev normalized model-parameter catalogue URL. */
16
+ export const MODELPARAMS_DEV_MODELS_URL = "https://modelparams.dev/api/v1/models.json";
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY29udHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV6RCxrRUFBa0U7QUFDbEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQzdCLDJFQUEyRSxDQUFDO0FBRTlFLHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FDdEMsMEZBQTBGLENBQUM7QUFFN0Ysd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUNoQyw4RUFBOEUsQ0FBQztBQUVqRixvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQ2hDLGtGQUFrRixDQUFDO0FBRXJGLHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FDbEMsdUZBQXVGLENBQUM7QUFFMUYseUNBQXlDO0FBQ3pDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLDZCQUE2QixDQUFDO0FBRWhFLGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0Q0FBNEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTW9kZWxSYXRlTGltaXRzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbi8qKiBPbmUgZGF5LCBtYXRjaGluZyB0aGUgcmVmcmVzaCBjYWRlbmNlIG9mIERhdGFicmlja3MgbW9kZWwgZG9jdW1lbnRhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9NRVRBREFUQV9UVExfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIFVSTCBmb3IgcmV0aXJlZCBmb3VuZGF0aW9uIG1vZGVscy4gKi9cbmV4cG9ydCBjb25zdCBSRVRJUkVEX01PREVMU19VUkwgPVxuICBcImh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hd3MvZW4vbWFjaGluZS1sZWFybmluZy9yZXRpcmVkLW1vZGVscy1wb2xpY3lcIjtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIE9wZW5BSSBSZXNwb25zZXMgbW9kZWwgc3VwcG9ydC4gKi9cbmV4cG9ydCBjb25zdCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwgPVxuICBcImh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hd3MvZW4vbWFjaGluZS1sZWFybmluZy9tb2RlbC1zZXJ2aW5nL3F1ZXJ5LW9wZW5haS1yZXNwb25zZXNcIjtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIG5hdGl2ZSB3ZWItc2VhcmNoIG1vZGVsIHN1cHBvcnQuICovXG5leHBvcnQgY29uc3QgV0VCX1NFQVJDSF9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy93ZWItc2VhcmNoXCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBGb3VuZGF0aW9uIE1vZGVsIEFQSSBsaW1pdHMuICovXG5leHBvcnQgY29uc3QgTU9ERUxfUkFURV9MSU1JVFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvZm91bmRhdGlvbi1tb2RlbC1hcGlzL2xpbWl0c1wiO1xuXG4vKiogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIFVSTCBmb3IgcmVhc29uaW5nLWVmZm9ydCBtb2RlbCBwb2xpY3kuICovXG5leHBvcnQgY29uc3QgUVVFUllfUkVBU09OX01PREVMU19VUkwgPVxuICBcImh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hd3MvZW4vbWFjaGluZS1sZWFybmluZy9tb2RlbC1zZXJ2aW5nL3F1ZXJ5LXJlYXNvbi1tb2RlbHNcIjtcblxuLyoqIG1vZGVscy5kZXYgcHJvdmlkZXIgY2F0YWxvZ3VlIFVSTC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTFNfREVWX0FQSV9VUkwgPSBcImh0dHBzOi8vbW9kZWxzLmRldi9hcGkuanNvblwiO1xuXG4vKiogbW9kZWxwYXJhbXMuZGV2IG5vcm1hbGl6ZWQgbW9kZWwtcGFyYW1ldGVyIGNhdGFsb2d1ZSBVUkwuICovXG5leHBvcnQgY29uc3QgTU9ERUxQQVJBTVNfREVWX01PREVMU19VUkwgPSBcImh0dHBzOi8vbW9kZWxwYXJhbXMuZGV2L2FwaS92MS9tb2RlbHMuanNvblwiO1xuXG4vKiogQnVpbGQtZ2VuZXJhdGVkIHJldGlyZWQtbW9kZWwgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldGlyZWRNb2RlbHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1vZGVsczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKiBOb3JtYWxpemVkIG1vZGVsIGlkZW50aXRpZXMgZ3JvdXBlZCBieSBkb2N1bWVudGVkIGNhcGFiaWxpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGltYWdlSW5wdXQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBhcHBseVBhdGNoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgd2ViU2VhcmNoOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbC1jYXBhYmlsaXR5IHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBNb2RlbENhcGFiaWxpdHlDYXRhbG9ndWU7XG59XG5cbi8qKiBNb2RlbCBsaW1pdHMga2V5ZWQgYnkgbm9ybWFsaXplZCBEYXRhYnJpY2tzIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJhdGVMaW1pdENhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgTW9kZWxSYXRlTGltaXRzPj47XG59XG5cbi8qKiBCdWlsZC1nZW5lcmF0ZWQgbW9kZWwtcmF0ZS1saW1pdCBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSYXRlTGltaXRzU25hcHNob3Qge1xuICByZWFkb25seSBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBjYXRhbG9ndWU6IE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlO1xufVxuXG4vKiogRG9jdW1lbnRlZCBnZW5lcmljIHJlYXNvbmluZyBsZXZlbHMga2V5ZWQgYnkgbm9ybWFsaXplZCBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZWFkb25seSBtb2RlbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKiBCdWlsZC1nZW5lcmF0ZWQgcmVhc29uaW5nLWVmZm9ydCBkb2N1bWVudGF0aW9uIHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFzb25pbmdNb2RlbHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNhdGFsb2d1ZTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWU7XG59XG5cbi8qKiBQb3J0YWJsZSBjYXBhYmlsaXR5IHNldHMgbm9ybWFsaXplZCBmcm9tIG1vZGVscy5kZXYuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWUge1xuICByZWFkb25seSBpbWFnZUlucHV0OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdG9vbHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBzdHJ1Y3R1cmVkT3V0cHV0OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdGVtcGVyYXR1cmVTdXBwb3J0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSB0ZW1wZXJhdHVyZVVuc3VwcG9ydGVkOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbHMuZGV2IGNhcGFiaWxpdHkgYW5kIHJlYXNvbmluZyBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxzRGV2U25hcHNob3Qge1xuICByZWFkb25seSBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWU7XG59XG5cbi8qKiBSZWFzb25pbmcgc3VwcG9ydCBhbmQgZGlzY3JldGUgZWZmb3J0IGxldmVscyBub3JtYWxpemVkIGZyb20gbW9kZWxwYXJhbXMuZGV2LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFBhcmFtc0NhdGFsb2d1ZSBleHRlbmRzIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbHBhcmFtcy5kZXYgcmVhc29uaW5nIHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFBhcmFtc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2F0YWxvZ3VlOiBNb2RlbFBhcmFtc0NhdGFsb2d1ZTtcbn1cbiJdfQ==
@@ -1,13 +1,15 @@
1
1
  import type { ModelCapabilities, ModelMetadata, ModelRateLimits, ServingEndpointSummary } from "@dbx-tools/shared-model";
2
- import { type ModelCapabilityCatalogue } from "./metadata-contract.ts";
3
2
  import { type ReasoningLevel, type ReasoningModelCatalogue } from "./reasoning-translation.ts";
4
3
  interface MetadataIndex {
5
4
  readonly capabilities: {
6
- readonly [Key in keyof ModelCapabilityCatalogue]: ReadonlySet<string>;
5
+ readonly [Key in keyof ModelCapabilities]: ReadonlySet<string>;
7
6
  };
8
7
  readonly rateLimits: ReadonlyMap<string, ModelRateLimits>;
9
8
  readonly reasoning: ReasoningModelCatalogue;
9
+ readonly reasoningDocs: ReasoningModelCatalogue;
10
+ readonly modelParamsReasoning: ReasoningModelCatalogue;
10
11
  readonly learnedReasoning: ReasoningModelCatalogue;
12
+ readonly temperatureUnsupported: ReadonlySet<string>;
11
13
  }
12
14
  /**
13
15
  * Hydrate or refresh documentation + learned caches into the process index.
@@ -32,20 +34,24 @@ export declare function rememberReasoningLevels(model: string, levels: readonly
32
34
  * Parse an upstream error body and persist the supported ladder for `model`.
33
35
  *
34
36
  * Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
35
- * Returns the levels that were stored (or the current lookup when parse yields
36
- * nothing). The raw error body is never cached.
37
+ * Returns a published ladder without parsing or storing error-derived levels
38
+ * when one exists. Otherwise returns the levels that were stored, or the
39
+ * current fallback when parsing yields nothing. The raw error body is never
40
+ * cached.
37
41
  */
38
42
  export declare function learnReasoningLevelsFromError(model: string, body: unknown): Promise<ReasoningLevel[]>;
39
- /** Resolve documented model capabilities from a name or endpoint summary. */
43
+ /** Resolve published model capabilities from a name or endpoint summary. */
40
44
  export declare function modelCapabilitiesFor(model: string | ServingEndpointSummary): ModelCapabilities;
45
+ /** Resolve explicit Databricks temperature support, or undefined when unpublished. */
46
+ export declare function modelTemperatureSupportFor(model: string | ServingEndpointSummary): boolean | undefined;
41
47
  /** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
42
48
  export declare function modelRateLimitsFor(model: string | ServingEndpointSummary): ModelRateLimits | undefined;
43
49
  /**
44
- * Resolve reasoning levels: learned from errors, then documentation, then
45
- * family defaults.
50
+ * Resolve reasoning levels: Databricks documentation, modelparams.dev,
51
+ * learned errors, then family defaults.
46
52
  *
47
- * Does not parse error bodies; callers should use {@link parseReasoningLevels}
48
- * and then {@link rememberReasoningLevels}.
53
+ * Does not parse error bodies; callers handling an upstream error should use
54
+ * {@link learnReasoningLevelsFromError} so published levels keep precedence.
49
55
  */
50
56
  export declare function modelReasoningLevelsFor(model: string | ServingEndpointSummary): ReasoningLevel[];
51
57
  /** Resolve retirement, capability, and rate-limit metadata together. */
@@ -54,6 +60,8 @@ export declare function modelMetadataFor(model: string | ServingEndpointSummary)
54
60
  export declare function modelMetadataGeneratedAt(): Readonly<{
55
61
  retiredModels: number;
56
62
  capabilities: number;
63
+ modelsDev: number;
64
+ modelParams: number;
57
65
  rateLimits: number;
58
66
  reasoning: number;
59
67
  }>;
@@ -1,27 +1,31 @@
1
1
  /**
2
- * Build-generated Databricks model retirement, capability, rate-limit, and
3
- * reasoning-effort metadata, plus a daily write-through cache for refreshed
4
- * docs and error-learned reasoning ladders.
2
+ * Build-generated Databricks and public model capability metadata, plus a
3
+ * daily write-through cache for refreshed sources and error-learned reasoning
4
+ * ladders.
5
5
  *
6
6
  * Committed snapshots seed every process. {@link refreshModelMetadata} pulls
7
- * documentation through the shared memory-first {@link createMetadataCache} and
8
- * rebuilds the in-memory index. Error-learned efforts use the same store via
9
- * {@link rememberReasoningLevels}. Known-good values are written behind to the
10
- * shared model project cache.
7
+ * Databricks documentation, models.dev, and modelparams.dev through the shared
8
+ * memory-first {@link createMetadataCache} and rebuilds the in-memory index.
9
+ * Error-learned efforts use the same store via {@link rememberReasoningLevels}.
10
+ * Known-good values are written behind to the shared model project cache.
11
11
  *
12
12
  * @module
13
13
  */
14
14
  import { memoize } from "@dbx-tools/shared-core";
15
- import { parseModelCapabilities, parseModelRateLimits, parseReasoningModels, parseRetiredModels, } from "./_metadata-generator.js";
15
+ import { parseModelParams, parseModelCapabilities, parseModelRateLimits, parseModelsDev, parseReasoningModels, parseRetiredModels, } from "./_metadata-generator.js";
16
16
  import capabilitiesSnapshotJson from "./generated/model-capabilities.json" with { type: "json" };
17
+ import modelParamsSnapshotJson from "./generated/modelparams-reasoning.json" with { type: "json" };
18
+ import modelsDevSnapshotJson from "./generated/models-dev-capabilities.json" with { type: "json" };
17
19
  import rateLimitsSnapshotJson from "./generated/model-rate-limits.json" with { type: "json" };
18
20
  import reasoningSnapshotJson from "./generated/model-reasoning.json" with { type: "json" };
19
21
  import { createMetadataCache, mergePreferFreshList, mergePreferFreshRecord, } from "./metadata-cache.js";
20
- import { MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "./metadata-contract.js";
21
- import { inheritsNativeWebSearch, isFoundationModelIdentity, modelSearchQuery } from "./policy.js";
22
+ import { MODELPARAMS_DEV_MODELS_URL, MODELS_DEV_API_URL, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "./metadata-contract.js";
23
+ import { inheritsNativeWebSearch, isFoundationModelIdentity, modelReasoningEfforts, modelSearchQuery, modelSupportsTools, } from "./policy.js";
22
24
  import { defaultReasoningLevels, documentedReasoningLevels, parseReasoning, parseReasoningLevels, uniqueReasoningLevels, } from "./reasoning-translation.js";
23
25
  import { COMMITTED_RETIRED_MODELS, modelStatusFor, replaceRetiredModelNames, RETIRED_MODELS_GENERATED_AT, } from "./retirement.js";
24
26
  const capabilitiesSnapshot = capabilitiesSnapshotJson;
27
+ const modelParamsSnapshot = modelParamsSnapshotJson;
28
+ const modelsDevSnapshot = modelsDevSnapshotJson;
25
29
  const rateLimitsSnapshot = rateLimitsSnapshotJson;
26
30
  const reasoningSnapshot = reasoningSnapshotJson;
27
31
  const USER_AGENT = "dbx-tools-model-metadata/1";
@@ -76,17 +80,48 @@ const reasoningDocsCache = createMetadataCache({
76
80
  load: async () => parseReasoningModels(await loadPage(QUERY_REASON_MODELS_URL), nowSeconds()).catalogue.models,
77
81
  merge: mergePreferFreshRecord,
78
82
  });
83
+ const modelsDevCache = createMetadataCache({
84
+ key: "models-dev-capabilities",
85
+ fallback: modelsDevSnapshot.capabilities,
86
+ load: async () => {
87
+ const snapshot = parseModelsDev(await loadJson(MODELS_DEV_API_URL), nowSeconds());
88
+ return snapshot.capabilities;
89
+ },
90
+ merge: mergeModelsDevData,
91
+ });
92
+ const modelParamsCache = createMetadataCache({
93
+ key: "modelparams-reasoning",
94
+ fallback: modelParamsSnapshot.catalogue,
95
+ load: async () => parseModelParams(await loadJson(MODELPARAMS_DEV_MODELS_URL), nowSeconds()).catalogue,
96
+ merge: (input) => ({
97
+ reasoning: mergePreferFreshList({
98
+ fresh: input.fresh?.reasoning,
99
+ previous: input.previous?.reasoning,
100
+ fallback: input.fallback.reasoning,
101
+ }),
102
+ models: mergePreferFreshRecord({
103
+ fresh: input.fresh?.models,
104
+ previous: input.previous?.models,
105
+ fallback: input.fallback.models,
106
+ }),
107
+ }),
108
+ });
79
109
  const learnedReasoningCache = createMetadataCache({
80
110
  key: "learned-reasoning",
81
111
  fallback: {},
82
112
  merge: mergePreferFreshRecord,
83
113
  });
84
114
  let liveIndex;
85
- const metadataIndex = memoize(() => liveIndex ?? buildIndexFromCommitted());
115
+ const committedMetadataIndex = memoize(buildIndexFromCommitted);
116
+ function metadataIndex() {
117
+ return liveIndex ?? committedMetadataIndex();
118
+ }
86
119
  function buildIndexFromCommitted() {
87
120
  return buildIndex({
88
121
  retiredNames: COMMITTED_RETIRED_MODELS,
89
122
  capabilities: capabilitiesSnapshot.capabilities,
123
+ modelsDev: modelsDevSnapshot.capabilities,
124
+ modelParams: modelParamsSnapshot.catalogue,
90
125
  rateLimits: rateLimitsSnapshot.catalogue.models,
91
126
  reasoning: reasoningSnapshot.catalogue.models,
92
127
  learnedReasoning: {},
@@ -94,16 +129,34 @@ function buildIndexFromCommitted() {
94
129
  }
95
130
  function buildIndex(input) {
96
131
  replaceRetiredModelNames(input.retiredNames);
132
+ const reasoningDocs = freezeReasoningCatalogue(input.reasoning);
133
+ const modelParamsReasoning = freezeReasoningCatalogue(input.modelParams.models);
97
134
  return {
98
135
  capabilities: {
99
136
  responses: new Set(input.capabilities.responses),
100
- imageInput: new Set(input.capabilities.imageInput),
137
+ imageInput: new Set([
138
+ ...input.capabilities.imageInput,
139
+ ...input.modelsDev.imageInput,
140
+ ]),
101
141
  applyPatch: new Set(input.capabilities.applyPatch),
102
142
  webSearch: new Set(input.capabilities.webSearch),
143
+ reasoning: new Set([
144
+ ...input.modelsDev.reasoning,
145
+ ...input.modelParams.reasoning,
146
+ ]),
147
+ tools: new Set(input.modelsDev.tools),
148
+ structuredOutput: new Set(input.modelsDev.structuredOutput),
149
+ temperature: new Set(input.modelsDev.temperatureSupported),
103
150
  },
104
151
  rateLimits: new Map(Object.entries(input.rateLimits)),
105
- reasoning: freezeReasoningCatalogue(input.reasoning),
152
+ reasoning: Object.freeze({
153
+ ...modelParamsReasoning,
154
+ ...reasoningDocs,
155
+ }),
156
+ reasoningDocs,
157
+ modelParamsReasoning,
106
158
  learnedReasoning: freezeLearnedCatalogue(input.learnedReasoning),
159
+ temperatureUnsupported: new Set(input.modelsDev.temperatureUnsupported),
107
160
  };
108
161
  }
109
162
  function freezeReasoningCatalogue(models) {
@@ -128,9 +181,11 @@ export async function refreshModelMetadata() {
128
181
  if (refreshInflight)
129
182
  return refreshInflight;
130
183
  refreshInflight = (async () => {
131
- const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
184
+ const [retiredNames, capabilities, modelsDev, modelParams, rateLimits, reasoning, learnedReasoning,] = await Promise.all([
132
185
  retiredCache.get(),
133
186
  capabilitiesCache.get(),
187
+ modelsDevCache.get(),
188
+ modelParamsCache.get(),
134
189
  rateLimitsCache.get(),
135
190
  reasoningDocsCache.get(),
136
191
  learnedReasoningCache.get(),
@@ -138,6 +193,8 @@ export async function refreshModelMetadata() {
138
193
  liveIndex = buildIndex({
139
194
  retiredNames,
140
195
  capabilities,
196
+ modelsDev,
197
+ modelParams,
141
198
  rateLimits,
142
199
  reasoning,
143
200
  learnedReasoning,
@@ -150,9 +207,11 @@ export async function refreshModelMetadata() {
150
207
  }
151
208
  /** Load shared cache entries without forcing a network refresh. */
152
209
  export async function hydrateModelMetadata() {
153
- const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
210
+ const [retiredNames, capabilities, modelsDev, modelParams, rateLimits, reasoning, learnedReasoning,] = await Promise.all([
154
211
  peekOrFallback(retiredCache, COMMITTED_RETIRED_MODELS),
155
212
  peekOrFallback(capabilitiesCache, capabilitiesSnapshot.capabilities),
213
+ peekOrFallback(modelsDevCache, modelsDevSnapshot.capabilities),
214
+ peekOrFallback(modelParamsCache, modelParamsSnapshot.catalogue),
156
215
  peekOrFallback(rateLimitsCache, rateLimitsSnapshot.catalogue.models),
157
216
  peekOrFallback(reasoningDocsCache, reasoningSnapshot.catalogue.models),
158
217
  peekOrFallback(learnedReasoningCache, {}),
@@ -160,6 +219,8 @@ export async function hydrateModelMetadata() {
160
219
  liveIndex = buildIndex({
161
220
  retiredNames,
162
221
  capabilities,
222
+ modelsDev,
223
+ modelParams,
163
224
  rateLimits,
164
225
  reasoning,
165
226
  learnedReasoning,
@@ -208,13 +269,18 @@ export async function rememberReasoningLevels(model, levels) {
208
269
  * Parse an upstream error body and persist the supported ladder for `model`.
209
270
  *
210
271
  * Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
211
- * Returns the levels that were stored (or the current lookup when parse yields
212
- * nothing). The raw error body is never cached.
272
+ * Returns a published ladder without parsing or storing error-derived levels
273
+ * when one exists. Otherwise returns the levels that were stored, or the
274
+ * current fallback when parsing yields nothing. The raw error body is never
275
+ * cached.
213
276
  */
214
277
  export async function learnReasoningLevelsFromError(model, body) {
278
+ const published = publishedReasoningLevelsFor(model, metadataIndex());
279
+ if (published)
280
+ return published;
215
281
  return rememberReasoningLevels(model, parseReasoningLevels(body));
216
282
  }
217
- /** Resolve documented model capabilities from a name or endpoint summary. */
283
+ /** Resolve published model capabilities from a name or endpoint summary. */
218
284
  export function modelCapabilitiesFor(model) {
219
285
  const capabilities = metadataIndex().capabilities;
220
286
  const identities = modelIdentities(model, false);
@@ -227,8 +293,23 @@ export function modelCapabilitiesFor(model) {
227
293
  webSearch: keys.some((key) => capabilities.webSearch.has(key)) ||
228
294
  identities.some((identity) => isFoundationModelIdentity(identity) &&
229
295
  inheritsNativeWebSearch(identity, capabilities.webSearch)),
296
+ reasoning: keys.some((key) => capabilities.reasoning.has(key)) ||
297
+ identities.some((identity) => modelReasoningEfforts(identity).length > 0),
298
+ tools: keys.some((key) => capabilities.tools.has(key)) || identities.some(modelSupportsTools),
299
+ structuredOutput: keys.some((key) => capabilities.structuredOutput.has(key)),
300
+ temperature: modelTemperatureSupportFor(model) === true,
230
301
  };
231
302
  }
303
+ /** Resolve explicit Databricks temperature support, or undefined when unpublished. */
304
+ export function modelTemperatureSupportFor(model) {
305
+ const index = metadataIndex();
306
+ const keys = modelIdentities(model).flatMap((identity) => modelKey(identity) ?? []);
307
+ if (keys.some((key) => index.temperatureUnsupported.has(key)))
308
+ return false;
309
+ if (keys.some((key) => index.capabilities.temperature.has(key)))
310
+ return true;
311
+ return undefined;
312
+ }
232
313
  /** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
233
314
  export function modelRateLimitsFor(model) {
234
315
  const limits = metadataIndex().rateLimits;
@@ -243,26 +324,38 @@ export function modelRateLimitsFor(model) {
243
324
  return undefined;
244
325
  }
245
326
  /**
246
- * Resolve reasoning levels: learned from errors, then documentation, then
247
- * family defaults.
327
+ * Resolve reasoning levels: Databricks documentation, modelparams.dev,
328
+ * learned errors, then family defaults.
248
329
  *
249
- * Does not parse error bodies; callers should use {@link parseReasoningLevels}
250
- * and then {@link rememberReasoningLevels}.
330
+ * Does not parse error bodies; callers handling an upstream error should use
331
+ * {@link learnReasoningLevelsFromError} so published levels keep precedence.
251
332
  */
252
333
  export function modelReasoningLevelsFor(model) {
253
334
  const index = metadataIndex();
335
+ const published = publishedReasoningLevelsFor(model, index);
336
+ if (published)
337
+ return published;
254
338
  for (const identity of modelIdentities(model)) {
255
339
  const learned = documentedReasoningLevels(identity, index.learnedReasoning);
256
340
  if (learned?.length)
257
341
  return learned;
258
342
  }
259
- for (const identity of modelIdentities(model)) {
260
- const documented = documentedReasoningLevels(identity, index.reasoning);
343
+ const primary = typeof model === "string" ? model : (model.modelServiceName ?? model.name);
344
+ return defaultReasoningLevels(primary);
345
+ }
346
+ function publishedReasoningLevelsFor(model, index) {
347
+ const identities = modelIdentities(model);
348
+ for (const identity of identities) {
349
+ const documented = documentedReasoningLevels(identity, index.reasoningDocs);
261
350
  if (documented?.length)
262
351
  return documented;
263
352
  }
264
- const primary = typeof model === "string" ? model : (model.modelServiceName ?? model.name);
265
- return defaultReasoningLevels(primary);
353
+ for (const identity of identities) {
354
+ const modelParams = documentedReasoningLevels(identity, index.modelParamsReasoning);
355
+ if (modelParams?.length)
356
+ return modelParams;
357
+ }
358
+ return undefined;
266
359
  }
267
360
  /** Resolve retirement, capability, and rate-limit metadata together. */
268
361
  export function modelMetadataFor(model) {
@@ -278,6 +371,8 @@ export function modelMetadataGeneratedAt() {
278
371
  return {
279
372
  retiredModels: RETIRED_MODELS_GENERATED_AT,
280
373
  capabilities: capabilitiesSnapshot.generatedAt,
374
+ modelsDev: modelsDevSnapshot.generatedAt,
375
+ modelParams: modelParamsSnapshot.generatedAt,
281
376
  rateLimits: rateLimitsSnapshot.generatedAt,
282
377
  reasoning: reasoningSnapshot.generatedAt,
283
378
  };
@@ -305,7 +400,32 @@ async function loadPage(url) {
305
400
  }
306
401
  return response.text();
307
402
  }
403
+ async function loadJson(url) {
404
+ const response = await fetch(url, {
405
+ headers: { "user-agent": USER_AGENT },
406
+ signal: AbortSignal.timeout(15_000),
407
+ });
408
+ if (!response.ok) {
409
+ throw new Error(`Model metadata source returned HTTP ${response.status}: ${url}`);
410
+ }
411
+ return response.json();
412
+ }
413
+ function mergeModelsDevData(input) {
414
+ const capability = (key) => mergePreferFreshList({
415
+ fresh: input.fresh?.[key],
416
+ previous: input.previous?.[key],
417
+ fallback: input.fallback[key],
418
+ });
419
+ return {
420
+ imageInput: capability("imageInput"),
421
+ reasoning: capability("reasoning"),
422
+ tools: capability("tools"),
423
+ structuredOutput: capability("structuredOutput"),
424
+ temperatureSupported: capability("temperatureSupported"),
425
+ temperatureUnsupported: capability("temperatureUnsupported"),
426
+ };
427
+ }
308
428
  function nowSeconds() {
309
429
  return Math.floor(Date.now() / 1000);
310
430
  }
311
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUWpELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLHdCQUF3QixNQUFNLHFDQUFxQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2pHLE9BQU8sc0JBQXNCLE1BQU0sb0NBQW9DLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDOUYsT0FBTyxxQkFBcUIsTUFBTSxrQ0FBa0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMzRixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsR0FFdkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUt0QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHlCQUF5QixFQUN6QixjQUFjLEVBQ2Qsb0JBQW9CLEVBR3BCLHFCQUFxQixHQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsY0FBYyxFQUNkLHdCQUF3QixFQUN4QiwyQkFBMkIsR0FDNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLG9CQUFvQixHQUFHLHdCQUFxRCxDQUFD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QUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsZC1nZW5lcmF0ZWQgRGF0YWJyaWNrcyBtb2RlbCByZXRpcmVtZW50LCBjYXBhYmlsaXR5LCByYXRlLWxpbWl0LCBhbmRcbiAqIHJlYXNvbmluZy1lZmZvcnQgbWV0YWRhdGEsIHBsdXMgYSBkYWlseSB3cml0ZS10aHJvdWdoIGNhY2hlIGZvciByZWZyZXNoZWRcbiAqIGRvY3MgYW5kIGVycm9yLWxlYXJuZWQgcmVhc29uaW5nIGxhZGRlcnMuXG4gKlxuICogQ29tbWl0dGVkIHNuYXBzaG90cyBzZWVkIGV2ZXJ5IHByb2Nlc3MuIHtAbGluayByZWZyZXNoTW9kZWxNZXRhZGF0YX0gcHVsbHNcbiAqIGRvY3VtZW50YXRpb24gdGhyb3VnaCB0aGUgc2hhcmVkIG1lbW9yeS1maXJzdCB7QGxpbmsgY3JlYXRlTWV0YWRhdGFDYWNoZX0gYW5kXG4gKiByZWJ1aWxkcyB0aGUgaW4tbWVtb3J5IGluZGV4LiBFcnJvci1sZWFybmVkIGVmZm9ydHMgdXNlIHRoZSBzYW1lIHN0b3JlIHZpYVxuICoge0BsaW5rIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzfS4gS25vd24tZ29vZCB2YWx1ZXMgYXJlIHdyaXR0ZW4gYmVoaW5kIHRvIHRoZVxuICogc2hhcmVkIG1vZGVsIHByb2plY3QgY2FjaGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxDYXBhYmlsaXRpZXMsXG4gIE1vZGVsTWV0YWRhdGEsXG4gIE1vZGVsUmF0ZUxpbWl0cyxcbiAgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgY2FwYWJpbGl0aWVzU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1jYXBhYmlsaXRpZXMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJhdGVMaW1pdHNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJhdGUtbGltaXRzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCByZWFzb25pbmdTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJlYXNvbmluZy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQge1xuICBjcmVhdGVNZXRhZGF0YUNhY2hlLFxuICBtZXJnZVByZWZlckZyZXNoTGlzdCxcbiAgbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbiAgdHlwZSBNZXRhZGF0YUNhY2hlLFxufSBmcm9tIFwiLi9tZXRhZGF0YS1jYWNoZS50c1wiO1xuaW1wb3J0IHtcbiAgTU9ERUxfUkFURV9MSU1JVFNfVVJMLFxuICBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsXG4gIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLFxuICBSRVRJUkVEX01PREVMU19VUkwsXG4gIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCxcbiAgdHlwZSBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90LFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZSxcbiAgdHlwZSBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCxcbiAgdHlwZSBSZWFzb25pbmdNb2RlbHNTbmFwc2hvdCxcbn0gZnJvbSBcIi4vbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7IGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoLCBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5LCBtb2RlbFNlYXJjaFF1ZXJ5IH0gZnJvbSBcIi4vcG9saWN5LnRzXCI7XG5pbXBvcnQge1xuICBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzLFxuICBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzLFxuICBwYXJzZVJlYXNvbmluZyxcbiAgcGFyc2VSZWFzb25pbmdMZXZlbHMsXG4gIHR5cGUgUmVhc29uaW5nTGV2ZWwsXG4gIHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4gIHVuaXF1ZVJlYXNvbmluZ0xldmVscyxcbn0gZnJvbSBcIi4vcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5pbXBvcnQge1xuICBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gIG1vZGVsU3RhdHVzRm9yLFxuICByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMsXG4gIFJFVElSRURfTU9ERUxTX0dFTkVSQVRFRF9BVCxcbn0gZnJvbSBcIi4vcmV0aXJlbWVudC50c1wiO1xuXG5jb25zdCBjYXBhYmlsaXRpZXNTbmFwc2hvdCA9IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBhcyBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90O1xuY29uc3QgcmF0ZUxpbWl0c1NuYXBzaG90ID0gcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBhcyBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdDtcbmNvbnN0IHJlYXNvbmluZ1NuYXBzaG90ID0gcmVhc29uaW5nU25hcHNob3RKc29uIGFzIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90O1xuXG5pbnRlcmZhY2UgTWV0YWRhdGFJbmRleCB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgbG9hZDogYXN5bmMgKCkgPT4gcGFyc2VSZXRpcmVkTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFJFVElSRURfTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaExpc3QsXG59KTtcblxuY29uc3QgY2FwYWJpbGl0aWVzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPENhcGFiaWxpdHlTZXRzPih7XG4gIGtleTogXCJtb2RlbC1jYXBhYmlsaXRpZXNcIixcbiAgZmFsbGJhY2s6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGxvYWRQYWdlKE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCksXG4gICAgICBsb2FkUGFnZShXRUJfU0VBUkNIX01PREVMU19VUkwpLFxuICAgIF0pO1xuICAgIHJldHVybiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKHJlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWwsIG5vd1NlY29uZHMoKSkuY2FwYWJpbGl0aWVzO1xuICB9LFxuICBtZXJnZTogKGlucHV0KSA9PiAoe1xuICAgIHJlc3BvbnNlczogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5yZXNwb25zZXMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LnJlc3BvbnNlcyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5yZXNwb25zZXMsXG4gICAgfSksXG4gICAgaW1hZ2VJbnB1dDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5pbWFnZUlucHV0LFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5pbWFnZUlucHV0LFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmltYWdlSW5wdXQsXG4gICAgfSksXG4gICAgYXBwbHlQYXRjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5hcHBseVBhdGNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5hcHBseVBhdGNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmFwcGx5UGF0Y2gsXG4gICAgfSksXG4gICAgd2ViU2VhcmNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LndlYlNlYXJjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ud2ViU2VhcmNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLndlYlNlYXJjaCxcbiAgICB9KSxcbiAgfSksXG59KTtcblxuY29uc3QgcmF0ZUxpbWl0c0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmF0ZS1saW1pdHNcIixcbiAgZmFsbGJhY2s6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlTW9kZWxSYXRlTGltaXRzKGF3YWl0IGxvYWRQYWdlKE1PREVMX1JBVEVfTElNSVRTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgcmVhc29uaW5nRG9jc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+Pih7XG4gIGtleTogXCJtb2RlbC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VSZWFzb25pbmdNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUVVFUllfUkVBU09OX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG1ldGFkYXRhSW5kZXggPSBtZW1vaXplPE1ldGFkYXRhSW5kZXg+KCgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgbGVhcm5lZFJlYXNvbmluZzoge30sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEluZGV4KGlucHV0OiB7XG4gIHJlYWRvbmx5IHJldGlyZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eVNldHM7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyksXG4gICAgICBpbWFnZUlucHV0OiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy5pbWFnZUlucHV0KSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKSxcbiAgICBsZWFybmVkUmVhc29uaW5nOiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKGlucHV0LmxlYXJuZWRSZWFzb25pbmcpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoXG4gIG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKFxuICAgICAgICAgIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMuZmxhdE1hcCgobGV2ZWwpID0+IHBhcnNlUmVhc29uaW5nKGxldmVsKSA/PyBbXSkpLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZnJlZXplTGVhcm5lZENhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj4sXG4pOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVscykubWFwKChba2V5LCBsZXZlbHNdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKSksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5sZXQgcmVmcmVzaEluZmxpZ2h0OiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEh5ZHJhdGUgb3IgcmVmcmVzaCBkb2N1bWVudGF0aW9uICsgbGVhcm5lZCBjYWNoZXMgaW50byB0aGUgcHJvY2VzcyBpbmRleC5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgb24gZ2F0ZXdheSBzdGFydHVwLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHJlZnJlc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgaWYgKHJlZnJlc2hJbmZsaWdodCkgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbiAgcmVmcmVzaEluZmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFtcbiAgICAgICAgcmV0aXJlZENhY2hlLmdldCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXNDYWNoZS5nZXQoKSxcbiAgICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgICByZWFzb25pbmdEb2NzQ2FjaGUuZ2V0KCksXG4gICAgICAgIGxlYXJuZWRSZWFzb25pbmdDYWNoZS5nZXQoKSxcbiAgICAgIF0sXG4gICAgKTtcbiAgICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIHJhdGVMaW1pdHMsXG4gICAgICByZWFzb25pbmcsXG4gICAgICBsZWFybmVkUmVhc29uaW5nLFxuICAgIH0pO1xuICAgIHJldHVybiBsaXZlSW5kZXg7XG4gIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgcmVmcmVzaEluZmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbn1cblxuLyoqIExvYWQgc2hhcmVkIGNhY2hlIGVudHJpZXMgd2l0aG91dCBmb3JjaW5nIGEgbmV0d29yayByZWZyZXNoLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcGVla09yRmFsbGJhY2socmV0aXJlZENhY2hlLCBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGNhcGFiaWxpdGllc0NhY2hlLCBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMpLFxuICAgIHBlZWtPckZhbGxiYWNrKHJhdGVMaW1pdHNDYWNoZSwgcmF0ZUxpbWl0c1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKHJlYXNvbmluZ0RvY3NDYWNoZSwgcmVhc29uaW5nU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyksXG4gICAgcGVla09yRmFsbGJhY2sobGVhcm5lZFJlYXNvbmluZ0NhY2hlLCB7fSksXG4gIF0pO1xuICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXMsXG4gICAgY2FwYWJpbGl0aWVzLFxuICAgIHJhdGVMaW1pdHMsXG4gICAgcmVhc29uaW5nLFxuICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gIH0pO1xuICByZXR1cm4gbGl2ZUluZGV4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwZWVrT3JGYWxsYmFjazxUPihjYWNoZTogTWV0YWRhdGFDYWNoZTxUPiwgZmFsbGJhY2s6IFQpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcGVla2VkID0gYXdhaXQgY2FjaGUucGVlaygpO1xuICBpZiAocGVla2VkICE9PSB1bmRlZmluZWQpIHJldHVybiBwZWVrZWQ7XG4gIHJldHVybiBjYWNoZS5nZXQoKS5jYXRjaCgoKSA9PiBmYWxsYmFjayk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGNvbW1pdHRlZCByZWFzb25pbmctZWZmb3J0IGNhdGFsb2d1ZS4gQ2FjaGVkIHBlciBwcm9jZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlKCk6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIG1ldGFkYXRhSW5kZXgoKS5yZWFzb25pbmc7XG59XG5cbi8qKiBSZXR1cm4gZXJyb3ItbGVhcm5lZCByZWFzb25pbmcgbGFkZGVycyBmcm9tIHRoZSBzaGFyZWQgbW9kZWwgY2FjaGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhcm5lZFJlYXNvbmluZ0NhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkubGVhcm5lZFJlYXNvbmluZztcbn1cblxuLyoqXG4gKiBTdG9yZSBsZXZlbHMgbGVhcm5lZCBmcm9tIGFuIHVwc3RyZWFtIGVycm9yIGFuZCBwZXJzaXN0IHRoZW0gd3JpdGUtdGhyb3VnaC5cbiAqXG4gKiBFbXB0eSBsaXN0cyBhcmUgaWdub3JlZCBzbyBhIGZhaWxlZCBwYXJzZSBjYW5ub3Qgd2lwZSBkZWZhdWx0cy4gRXJyb3IgYm9kaWVzXG4gKiB0aGVtc2VsdmVzIGFyZSBuZXZlciBzdG9yZWQgLSBvbmx5IHRoZSBwYXJzZWQgbGFkZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICBjb25zdCB1bmlxdWUgPSB1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKTtcbiAgaWYgKHVuaXF1ZS5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGtleSA9IG1vZGVsS2V5KG1vZGVsKTtcbiAgaWYgKCFrZXkpIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IGxlYXJuZWRSZWFzb25pbmdDYWNoZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7XG4gICAgLi4uY3VycmVudCxcbiAgICBba2V5XTogdW5pcXVlLFxuICB9KSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBtZXRhZGF0YUluZGV4KCk7XG4gIGxpdmVJbmRleCA9IHtcbiAgICAuLi5jdXJyZW50LFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoY2F0YWxvZ3VlKSxcbiAgfTtcbiAgcmV0dXJuIFsuLi51bmlxdWVdO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIHVwc3RyZWFtIGVycm9yIGJvZHkgYW5kIHBlcnNpc3QgdGhlIHN1cHBvcnRlZCBsYWRkZXIgZm9yIGBtb2RlbGAuXG4gKlxuICogQWNjZXB0cyB0aGUgc2FtZSBuZXN0ZWQgRGF0YWJyaWNrcyBlbnZlbG9wZXMgYXMge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfS5cbiAqIFJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkIChvciB0aGUgY3VycmVudCBsb29rdXAgd2hlbiBwYXJzZSB5aWVsZHNcbiAqIG5vdGhpbmcpLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXIgY2FjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGVhcm5SZWFzb25pbmdMZXZlbHNGcm9tRXJyb3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGJvZHk6IHVua25vd24sXG4pOiBQcm9taXNlPFJlYXNvbmluZ0xldmVsW10+IHtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIGRvY3VtZW50ZWQgbW9kZWwgY2FwYWJpbGl0aWVzIGZyb20gYSBuYW1lIG9yIGVuZHBvaW50IHN1bW1hcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1ldGFkYXRhSW5kZXgoKS5jYXBhYmlsaXRpZXM7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwsIGZhbHNlKTtcbiAgY29uc3Qga2V5cyA9IGlkZW50aXRpZXMuZmxhdE1hcCgoaWRlbnRpdHkpID0+IG1vZGVsS2V5KGlkZW50aXR5KSA/PyBbXSk7XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VzOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlc3BvbnNlcy5oYXMoa2V5KSksXG4gICAgaW1hZ2VJbnB1dDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5pbWFnZUlucHV0LmhhcyhrZXkpKSxcbiAgICBhcHBseVBhdGNoOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2guaGFzKGtleSkpLFxuICAgIC8vIFZlcnNpb24gaW5oZXJpdGFuY2Ugb25seSBhcHBsaWVzIHRvIGhvc3RlZCBmb3VuZGF0aW9uIGlkZW50aXRpZXMuXG4gICAgd2ViU2VhcmNoOlxuICAgICAga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy53ZWJTZWFyY2guaGFzKGtleSkpIHx8XG4gICAgICBpZGVudGl0aWVzLnNvbWUoXG4gICAgICAgIChpZGVudGl0eSkgPT5cbiAgICAgICAgICBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5KGlkZW50aXR5KSAmJlxuICAgICAgICAgIGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoKGlkZW50aXR5LCBjYXBhYmlsaXRpZXMud2ViU2VhcmNoKSxcbiAgICAgICksXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBJVFBNLCBPVFBNLCBhbmQgUVBIIGxpbWl0cyBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSYXRlTGltaXRzRm9yKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbik6IE1vZGVsUmF0ZUxpbWl0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbWl0cyA9IG1ldGFkYXRhSW5kZXgoKS5yYXRlTGltaXRzO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbEtleShpZGVudGl0eSk7XG4gICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZvdW5kID0gbGltaXRzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSByZWFzb25pbmcgbGV2ZWxzOiBsZWFybmVkIGZyb20gZXJyb3JzLCB0aGVuIGRvY3VtZW50YXRpb24sIHRoZW5cbiAqIGZhbWlseSBkZWZhdWx0cy5cbiAqXG4gKiBEb2VzIG5vdCBwYXJzZSBlcnJvciBib2RpZXM7IGNhbGxlcnMgc2hvdWxkIHVzZSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9XG4gKiBhbmQgdGhlbiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSZWFzb25pbmdMZXZlbHNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbi8qKiBSZXNvbHZlIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIGFuZCByYXRlLWxpbWl0IG1ldGFkYXRhIHRvZ2V0aGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgY29uc3QgcmF0ZUxpbWl0cyA9IG1vZGVsUmF0ZUxpbWl0c0Zvcihtb2RlbCk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBtb2RlbFN0YXR1c0Zvcihtb2RlbCksXG4gICAgY2FwYWJpbGl0aWVzOiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbCksXG4gICAgLi4uKHJhdGVMaW1pdHMgPyB7IHJhdGVMaW1pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiBnZW5lcmF0aW9uIHRpbWVzdGFtcHMgZm9yIHRoZSBjb21taXR0ZWQgbWV0YWRhdGEgc25hcHNob3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFHZW5lcmF0ZWRBdCgpOiBSZWFkb25seTx7XG4gIHJldGlyZWRNb2RlbHM6IG51bWJlcjtcbiAgY2FwYWJpbGl0aWVzOiBudW1iZXI7XG4gIHJhdGVMaW1pdHM6IG51bWJlcjtcbiAgcmVhc29uaW5nOiBudW1iZXI7XG59PiB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE1vZGVsczogUkVUSVJFRF9NT0RFTFNfR0VORVJBVEVEX0FULFxuICAgIGNhcGFiaWxpdGllczogY2FwYWJpbGl0aWVzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vZGVsSWRlbnRpdGllcyhcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluY2x1ZGVEaXNwbGF5TmFtZSA9IHRydWUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgLi4uKGluY2x1ZGVEaXNwbGF5TmFtZSA/IFttb2RlbC5kaXNwbGF5TmFtZV0gOiBbXSksXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeSh2YWx1ZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhZ2UodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHsgXCJ1c2VyLWFnZW50XCI6IFVTRVJfQUdFTlQgfSxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZnVuY3Rpb24gbm93U2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG59XG4iXX0=
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUWpELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sd0JBQXdCLE1BQU0scUNBQXFDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDakcsT0FBTyx1QkFBdUIsTUFBTSx3Q0FBd0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuRyxPQUFPLHFCQUFxQixNQUFNLDBDQUEwQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ25HLE9BQU8sc0JBQXNCLE1BQU0sb0NBQW9DLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDOUYsT0FBTyxxQkFBcUIsTUFBTSxrQ0FBa0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMzRixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsR0FFdkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIscUJBQXFCLEdBU3RCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixrQkFBa0IsR0FDbkIsTUFBTSxhQUFhLENBQUM7QUFD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O0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJ1aWxkLWdlbmVyYXRlZCBEYXRhYnJpY2tzIGFuZCBwdWJsaWMgbW9kZWwgY2FwYWJpbGl0eSBtZXRhZGF0YSwgcGx1cyBhXG4gKiBkYWlseSB3cml0ZS10aHJvdWdoIGNhY2hlIGZvciByZWZyZXNoZWQgc291cmNlcyBhbmQgZXJyb3ItbGVhcm5lZCByZWFzb25pbmdcbiAqIGxhZGRlcnMuXG4gKlxuICogQ29tbWl0dGVkIHNuYXBzaG90cyBzZWVkIGV2ZXJ5IHByb2Nlc3MuIHtAbGluayByZWZyZXNoTW9kZWxNZXRhZGF0YX0gcHVsbHNcbiAqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiwgbW9kZWxzLmRldiwgYW5kIG1vZGVscGFyYW1zLmRldiB0aHJvdWdoIHRoZSBzaGFyZWRcbiAqIG1lbW9yeS1maXJzdCB7QGxpbmsgY3JlYXRlTWV0YWRhdGFDYWNoZX0gYW5kIHJlYnVpbGRzIHRoZSBpbi1tZW1vcnkgaW5kZXguXG4gKiBFcnJvci1sZWFybmVkIGVmZm9ydHMgdXNlIHRoZSBzYW1lIHN0b3JlIHZpYSB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICogS25vd24tZ29vZCB2YWx1ZXMgYXJlIHdyaXR0ZW4gYmVoaW5kIHRvIHRoZSBzaGFyZWQgbW9kZWwgcHJvamVjdCBjYWNoZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxNZXRhZGF0YSxcbiAgTW9kZWxSYXRlTGltaXRzLFxuICBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxuaW1wb3J0IHtcbiAgcGFyc2VNb2RlbFBhcmFtcyxcbiAgcGFyc2VNb2RlbENhcGFiaWxpdGllcyxcbiAgcGFyc2VNb2RlbFJhdGVMaW1pdHMsXG4gIHBhcnNlTW9kZWxzRGV2LFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgY2FwYWJpbGl0aWVzU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1jYXBhYmlsaXRpZXMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IG1vZGVsUGFyYW1zU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbHBhcmFtcy1yZWFzb25pbmcuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IG1vZGVsc0RldlNuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWxzLWRldi1jYXBhYmlsaXRpZXMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJhdGVMaW1pdHNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJhdGUtbGltaXRzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCByZWFzb25pbmdTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJlYXNvbmluZy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQge1xuICBjcmVhdGVNZXRhZGF0YUNhY2hlLFxuICBtZXJnZVByZWZlckZyZXNoTGlzdCxcbiAgbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbiAgdHlwZSBNZXRhZGF0YUNhY2hlLFxufSBmcm9tIFwiLi9tZXRhZGF0YS1jYWNoZS50c1wiO1xuaW1wb3J0IHtcbiAgTU9ERUxQQVJBTVNfREVWX01PREVMU19VUkwsXG4gIE1PREVMU19ERVZfQVBJX1VSTCxcbiAgTU9ERUxfUkFURV9MSU1JVFNfVVJMLFxuICBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsXG4gIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLFxuICBSRVRJUkVEX01PREVMU19VUkwsXG4gIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCxcbiAgdHlwZSBNb2RlbFBhcmFtc0NhdGFsb2d1ZSxcbiAgdHlwZSBNb2RlbFBhcmFtc1NuYXBzaG90LFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlLFxuICB0eXBlIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90LFxuICB0eXBlIE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWUsXG4gIHR5cGUgTW9kZWxzRGV2U25hcHNob3QsXG4gIHR5cGUgUmVhc29uaW5nTW9kZWxzU25hcHNob3QsXG59IGZyb20gXCIuL21ldGFkYXRhLWNvbnRyYWN0LnRzXCI7XG5pbXBvcnQge1xuICBpbmhlcml0c05hdGl2ZVdlYlNlYXJjaCxcbiAgaXNGb3VuZGF0aW9uTW9kZWxJZGVudGl0eSxcbiAgbW9kZWxSZWFzb25pbmdFZmZvcnRzLFxuICBtb2RlbFNlYXJjaFF1ZXJ5LFxuICBtb2RlbFN1cHBvcnRzVG9vbHMsXG59IGZyb20gXCIuL3BvbGljeS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJlYXNvbmluZ0xldmVscyxcbiAgZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyxcbiAgcGFyc2VSZWFzb25pbmcsXG4gIHBhcnNlUmVhc29uaW5nTGV2ZWxzLFxuICB0eXBlIFJlYXNvbmluZ0xldmVsLFxuICB0eXBlIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlLFxuICB1bmlxdWVSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCIuL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHtcbiAgQ09NTUlUVEVEX1JFVElSRURfTU9ERUxTLFxuICBtb2RlbFN0YXR1c0ZvcixcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzLFxuICBSRVRJUkVEX01PREVMU19HRU5FUkFURURfQVQsXG59IGZyb20gXCIuL3JldGlyZW1lbnQudHNcIjtcblxuY29uc3QgY2FwYWJpbGl0aWVzU25hcHNob3QgPSBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gYXMgTW9kZWxDYXBhYmlsaXRpZXNTbmFwc2hvdDtcbmNvbnN0IG1vZGVsUGFyYW1zU25hcHNob3QgPSBtb2RlbFBhcmFtc1NuYXBzaG90SnNvbiBhcyBNb2RlbFBhcmFtc1NuYXBzaG90O1xuY29uc3QgbW9kZWxzRGV2U25hcHNob3QgPSBtb2RlbHNEZXZTbmFwc2hvdEpzb24gYXMgTW9kZWxzRGV2U25hcHNob3Q7XG5jb25zdCByYXRlTGltaXRzU25hcHNob3QgPSByYXRlTGltaXRzU25hcHNob3RKc29uIGFzIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90O1xuY29uc3QgcmVhc29uaW5nU25hcHNob3QgPSByZWFzb25pbmdTbmFwc2hvdEpzb24gYXMgUmVhc29uaW5nTW9kZWxzU25hcHNob3Q7XG5cbmludGVyZmFjZSBNZXRhZGF0YUluZGV4IHtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiB7XG4gICAgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBNb2RlbENhcGFiaWxpdGllc106IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIH07XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxSYXRlTGltaXRzPjtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbiAgcmVhZG9ubHkgcmVhc29uaW5nRG9jczogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWU7XG4gIHJlYWRvbmx5IG1vZGVsUGFyYW1zUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbiAgcmVhZG9ubHkgbGVhcm5lZFJlYXNvbmluZzogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWU7XG4gIHJlYWRvbmx5IHRlbXBlcmF0dXJlVW5zdXBwb3J0ZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz47XG59XG5cbnR5cGUgQ2FwYWJpbGl0eVNldHMgPSBNb2RlbENhcGFiaWxpdHlDYXRhbG9ndWU7XG50eXBlIE1vZGVsc0RldkRhdGEgPSBNb2RlbHNEZXZDYXBhYmlsaXR5Q2F0YWxvZ3VlO1xuXG5jb25zdCBVU0VSX0FHRU5UID0gXCJkYngtdG9vbHMtbW9kZWwtbWV0YWRhdGEvMVwiO1xuXG5jb25zdCByZXRpcmVkQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPHJlYWRvbmx5IHN0cmluZ1tdPih7XG4gIGtleTogXCJyZXRpcmVkLW1vZGVsc1wiLFxuICBmYWxsYmFjazogQ09NTUlUVEVEX1JFVElSRURfTU9ERUxTLFxuICBsb2FkOiBhc3luYyAoKSA9PiBwYXJzZVJldGlyZWRNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUkVUSVJFRF9NT0RFTFNfVVJMKSwgbm93U2Vjb25kcygpKS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoTGlzdCxcbn0pO1xuXG5jb25zdCBjYXBhYmlsaXRpZXNDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8Q2FwYWJpbGl0eVNldHM+KHtcbiAga2V5OiBcIm1vZGVsLWNhcGFiaWxpdGllc1wiLFxuICBmYWxsYmFjazogY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzLFxuICBsb2FkOiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3Jlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWxdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgbG9hZFBhZ2UoT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMKSxcbiAgICAgIGxvYWRQYWdlKFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMocmVzcG9uc2VzSHRtbCwgd2ViU2VhcmNoSHRtbCwgbm93U2Vjb25kcygpKS5jYXBhYmlsaXRpZXM7XG4gIH0sXG4gIG1lcmdlOiAoaW5wdXQpID0+ICh7XG4gICAgcmVzcG9uc2VzOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LnJlc3BvbnNlcyxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ucmVzcG9uc2VzLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLnJlc3BvbnNlcyxcbiAgICB9KSxcbiAgICBpbWFnZUlucHV0OiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LmltYWdlSW5wdXQsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LmltYWdlSW5wdXQsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2suaW1hZ2VJbnB1dCxcbiAgICB9KSxcbiAgICBhcHBseVBhdGNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LmFwcGx5UGF0Y2gsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LmFwcGx5UGF0Y2gsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2suYXBwbHlQYXRjaCxcbiAgICB9KSxcbiAgICB3ZWJTZWFyY2g6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8ud2ViU2VhcmNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy53ZWJTZWFyY2gsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2sud2ViU2VhcmNoLFxuICAgIH0pLFxuICB9KSxcbn0pO1xuXG5jb25zdCByYXRlTGltaXRzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+Pih7XG4gIGtleTogXCJtb2RlbC1yYXRlLWxpbWl0c1wiLFxuICBmYWxsYmFjazogcmF0ZUxpbWl0c1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VNb2RlbFJhdGVMaW1pdHMoYXdhaXQgbG9hZFBhZ2UoTU9ERUxfUkFURV9MSU1JVFNfVVJMKSwgbm93U2Vjb25kcygpKS5jYXRhbG9ndWUubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbn0pO1xuXG5jb25zdCByZWFzb25pbmdEb2NzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4+KHtcbiAga2V5OiBcIm1vZGVsLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazogcmVhc29uaW5nU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbG9hZDogYXN5bmMgKCkgPT5cbiAgICBwYXJzZVJlYXNvbmluZ01vZGVscyhhd2FpdCBsb2FkUGFnZShRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgbW9kZWxzRGV2Q2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPE1vZGVsc0RldkRhdGE+KHtcbiAga2V5OiBcIm1vZGVscy1kZXYtY2FwYWJpbGl0aWVzXCIsXG4gIGZhbGxiYWNrOiBtb2RlbHNEZXZTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHBhcnNlTW9kZWxzRGV2KGF3YWl0IGxvYWRKc29uKE1PREVMU19ERVZfQVBJX1VSTCksIG5vd1NlY29uZHMoKSk7XG4gICAgcmV0dXJuIHNuYXBzaG90LmNhcGFiaWxpdGllcztcbiAgfSxcbiAgbWVyZ2U6IG1lcmdlTW9kZWxzRGV2RGF0YSxcbn0pO1xuXG5jb25zdCBtb2RlbFBhcmFtc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxNb2RlbFBhcmFtc0NhdGFsb2d1ZT4oe1xuICBrZXk6IFwibW9kZWxwYXJhbXMtcmVhc29uaW5nXCIsXG4gIGZhbGxiYWNrOiBtb2RlbFBhcmFtc1NuYXBzaG90LmNhdGFsb2d1ZSxcbiAgbG9hZDogYXN5bmMgKCkgPT5cbiAgICBwYXJzZU1vZGVsUGFyYW1zKGF3YWl0IGxvYWRKc29uKE1PREVMUEFSQU1TX0RFVl9NT0RFTFNfVVJMKSwgbm93U2Vjb25kcygpKS5jYXRhbG9ndWUsXG4gIG1lcmdlOiAoaW5wdXQpID0+ICh7XG4gICAgcmVhc29uaW5nOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LnJlYXNvbmluZyxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ucmVhc29uaW5nLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLnJlYXNvbmluZyxcbiAgICB9KSxcbiAgICBtb2RlbHM6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5tb2RlbHMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/Lm1vZGVscyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5tb2RlbHMsXG4gICAgfSksXG4gIH0pLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IGNvbW1pdHRlZE1ldGFkYXRhSW5kZXggPSBtZW1vaXplPE1ldGFkYXRhSW5kZXg+KGJ1aWxkSW5kZXhGcm9tQ29tbWl0dGVkKTtcblxuZnVuY3Rpb24gbWV0YWRhdGFJbmRleCgpOiBNZXRhZGF0YUluZGV4IHtcbiAgcmV0dXJuIGxpdmVJbmRleCA/PyBjb21taXR0ZWRNZXRhZGF0YUluZGV4KCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5kZXhGcm9tQ29tbWl0dGVkKCk6IE1ldGFkYXRhSW5kZXgge1xuICByZXR1cm4gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzOiBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gICAgbW9kZWxzRGV2OiBtb2RlbHNEZXZTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gICAgbW9kZWxQYXJhbXM6IG1vZGVsUGFyYW1zU25hcHNob3QuY2F0YWxvZ3VlLFxuICAgIHJhdGVMaW1pdHM6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICBsZWFybmVkUmVhc29uaW5nOiB7fSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5kZXgoaW5wdXQ6IHtcbiAgcmVhZG9ubHkgcmV0aXJlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5U2V0cztcbiAgcmVhZG9ubHkgbW9kZWxzRGV2OiBNb2RlbHNEZXZEYXRhO1xuICByZWFkb25seSBtb2RlbFBhcmFtczogTW9kZWxQYXJhbXNDYXRhbG9ndWU7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIGNvbnN0IHJlYXNvbmluZ0RvY3MgPSBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKTtcbiAgY29uc3QgbW9kZWxQYXJhbXNSZWFzb25pbmcgPSBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQubW9kZWxQYXJhbXMubW9kZWxzKTtcbiAgcmV0dXJuIHtcbiAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgIHJlc3BvbnNlczogbmV3IFNldChpbnB1dC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzKSxcbiAgICAgIGltYWdlSW5wdXQ6IG5ldyBTZXQoW1xuICAgICAgICAuLi5pbnB1dC5jYXBhYmlsaXRpZXMuaW1hZ2VJbnB1dCxcbiAgICAgICAgLi4uaW5wdXQubW9kZWxzRGV2LmltYWdlSW5wdXQsXG4gICAgICBdKSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgICAgcmVhc29uaW5nOiBuZXcgU2V0KFtcbiAgICAgICAgLi4uaW5wdXQubW9kZWxzRGV2LnJlYXNvbmluZyxcbiAgICAgICAgLi4uaW5wdXQubW9kZWxQYXJhbXMucmVhc29uaW5nLFxuICAgICAgXSksXG4gICAgICB0b29sczogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYudG9vbHMpLFxuICAgICAgc3RydWN0dXJlZE91dHB1dDogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYuc3RydWN0dXJlZE91dHB1dCksXG4gICAgICB0ZW1wZXJhdHVyZTogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYudGVtcGVyYXR1cmVTdXBwb3J0ZWQpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBPYmplY3QuZnJlZXplKHtcbiAgICAgIC4uLm1vZGVsUGFyYW1zUmVhc29uaW5nLFxuICAgICAgLi4ucmVhc29uaW5nRG9jcyxcbiAgICB9KSxcbiAgICByZWFzb25pbmdEb2NzLFxuICAgIG1vZGVsUGFyYW1zUmVhc29uaW5nLFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoaW5wdXQubGVhcm5lZFJlYXNvbmluZyksXG4gICAgdGVtcGVyYXR1cmVVbnN1cHBvcnRlZDogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYudGVtcGVyYXR1cmVVbnN1cHBvcnRlZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZyZWV6ZVJlYXNvbmluZ0NhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+LFxuKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhtb2RlbHMpLm1hcCgoW2tleSwgbGV2ZWxzXSkgPT4gW1xuICAgICAgICBrZXksXG4gICAgICAgIE9iamVjdC5mcmVlemUoXG4gICAgICAgICAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVscy5mbGF0TWFwKChsZXZlbCkgPT4gcGFyc2VSZWFzb25pbmcobGV2ZWwpID8/IFtdKSksXG4gICAgICAgICksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKFxuICBtb2RlbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpKSxcbiAgICAgIF0pLFxuICAgICksXG4gICk7XG59XG5cbmxldCByZWZyZXNoSW5mbGlnaHQ6IFByb21pc2U8TWV0YWRhdGFJbmRleD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogSHlkcmF0ZSBvciByZWZyZXNoIGRvY3VtZW50YXRpb24gKyBsZWFybmVkIGNhY2hlcyBpbnRvIHRoZSBwcm9jZXNzIGluZGV4LlxuICpcbiAqIFNhZmUgdG8gY2FsbCBvbiBnYXRld2F5IHN0YXJ0dXAuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmUgcmVmcmVzaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBpZiAocmVmcmVzaEluZmxpZ2h0KSByZXR1cm4gcmVmcmVzaEluZmxpZ2h0O1xuICByZWZyZXNoSW5mbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIG1vZGVsc0RldixcbiAgICAgIG1vZGVsUGFyYW1zLFxuICAgICAgcmF0ZUxpbWl0cyxcbiAgICAgIHJlYXNvbmluZyxcbiAgICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gICAgXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJldGlyZWRDYWNoZS5nZXQoKSxcbiAgICAgIGNhcGFiaWxpdGllc0NhY2hlLmdldCgpLFxuICAgICAgbW9kZWxzRGV2Q2FjaGUuZ2V0KCksXG4gICAgICBtb2RlbFBhcmFtc0NhY2hlLmdldCgpLFxuICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgcmVhc29uaW5nRG9jc0NhY2hlLmdldCgpLFxuICAgICAgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLmdldCgpLFxuICAgIF0pO1xuICAgIGxpdmVJbmRleCA9IGJ1aWxkSW5kZXgoe1xuICAgICAgcmV0aXJlZE5hbWVzLFxuICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgbW9kZWxzRGV2LFxuICAgICAgbW9kZWxQYXJhbXMsXG4gICAgICByYXRlTGltaXRzLFxuICAgICAgcmVhc29uaW5nLFxuICAgICAgbGVhcm5lZFJlYXNvbmluZyxcbiAgICB9KTtcbiAgICByZXR1cm4gbGl2ZUluZGV4O1xuICB9KSgpLmZpbmFsbHkoKCkgPT4ge1xuICAgIHJlZnJlc2hJbmZsaWdodCA9IHVuZGVmaW5lZDtcbiAgfSk7XG4gIHJldHVybiByZWZyZXNoSW5mbGlnaHQ7XG59XG5cbi8qKiBMb2FkIHNoYXJlZCBjYWNoZSBlbnRyaWVzIHdpdGhvdXQgZm9yY2luZyBhIG5ldHdvcmsgcmVmcmVzaC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgY29uc3QgW1xuICAgIHJldGlyZWROYW1lcyxcbiAgICBjYXBhYmlsaXRpZXMsXG4gICAgbW9kZWxzRGV2LFxuICAgIG1vZGVsUGFyYW1zLFxuICAgIHJhdGVMaW1pdHMsXG4gICAgcmVhc29uaW5nLFxuICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gIF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcGVla09yRmFsbGJhY2socmV0aXJlZENhY2hlLCBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGNhcGFiaWxpdGllc0NhY2hlLCBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMpLFxuICAgIHBlZWtPckZhbGxiYWNrKG1vZGVsc0RldkNhY2hlLCBtb2RlbHNEZXZTbmFwc2hvdC5jYXBhYmlsaXRpZXMpLFxuICAgIHBlZWtPckZhbGxiYWNrKG1vZGVsUGFyYW1zQ2FjaGUsIG1vZGVsUGFyYW1zU25hcHNob3QuY2F0YWxvZ3VlKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyYXRlTGltaXRzQ2FjaGUsIHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyZWFzb25pbmdEb2NzQ2FjaGUsIHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGxlYXJuZWRSZWFzb25pbmdDYWNoZSwge30pLFxuICBdKTtcbiAgbGl2ZUluZGV4ID0gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzLFxuICAgIGNhcGFiaWxpdGllcyxcbiAgICBtb2RlbHNEZXYsXG4gICAgbW9kZWxQYXJhbXMsXG4gICAgcmF0ZUxpbWl0cyxcbiAgICByZWFzb25pbmcsXG4gICAgbGVhcm5lZFJlYXNvbmluZyxcbiAgfSk7XG4gIHJldHVybiBsaXZlSW5kZXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBlZWtPckZhbGxiYWNrPFQ+KGNhY2hlOiBNZXRhZGF0YUNhY2hlPFQ+LCBmYWxsYmFjazogVCk6IFByb21pc2U8VD4ge1xuICBjb25zdCBwZWVrZWQgPSBhd2FpdCBjYWNoZS5wZWVrKCk7XG4gIGlmIChwZWVrZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBlZWtlZDtcbiAgcmV0dXJuIGNhY2hlLmdldCgpLmNhdGNoKCgpID0+IGZhbGxiYWNrKTtcbn1cblxuLyoqIFJldHVybiB0aGUgY29tbWl0dGVkIHJlYXNvbmluZy1lZmZvcnQgY2F0YWxvZ3VlLiBDYWNoZWQgcGVyIHByb2Nlc3MuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTW9kZWxDYXRhbG9ndWUoKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gbWV0YWRhdGFJbmRleCgpLnJlYXNvbmluZztcbn1cblxuLyoqIFJldHVybiBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzIGZyb20gdGhlIHNoYXJlZCBtb2RlbCBjYWNoZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZWFybmVkUmVhc29uaW5nQ2F0YWxvZ3VlKCk6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIG1ldGFkYXRhSW5kZXgoKS5sZWFybmVkUmVhc29uaW5nO1xufVxuXG4vKipcbiAqIFN0b3JlIGxldmVscyBsZWFybmVkIGZyb20gYW4gdXBzdHJlYW0gZXJyb3IgYW5kIHBlcnNpc3QgdGhlbSB3cml0ZS10aHJvdWdoLlxuICpcbiAqIEVtcHR5IGxpc3RzIGFyZSBpZ25vcmVkIHNvIGEgZmFpbGVkIHBhcnNlIGNhbm5vdCB3aXBlIGRlZmF1bHRzLiBFcnJvciBib2RpZXNcbiAqIHRoZW1zZWx2ZXMgYXJlIG5ldmVyIHN0b3JlZCAtIG9ubHkgdGhlIHBhcnNlZCBsYWRkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1lbWJlclJlYXNvbmluZ0xldmVscyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUHJvbWlzZTxSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHVuaXF1ZSA9IHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpO1xuICBpZiAodW5pcXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3Qga2V5ID0gbW9kZWxLZXkobW9kZWwpO1xuICBpZiAoIWtleSkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3QgY2F0YWxvZ3VlID0gYXdhaXQgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHtcbiAgICAuLi5jdXJyZW50LFxuICAgIFtrZXldOiB1bmlxdWUsXG4gIH0pKTtcbiAgY29uc3QgY3VycmVudCA9IG1ldGFkYXRhSW5kZXgoKTtcbiAgbGl2ZUluZGV4ID0ge1xuICAgIC4uLmN1cnJlbnQsXG4gICAgbGVhcm5lZFJlYXNvbmluZzogZnJlZXplTGVhcm5lZENhdGFsb2d1ZShjYXRhbG9ndWUpLFxuICB9O1xuICByZXR1cm4gWy4uLnVuaXF1ZV07XG59XG5cbi8qKlxuICogUGFyc2UgYW4gdXBzdHJlYW0gZXJyb3IgYm9keSBhbmQgcGVyc2lzdCB0aGUgc3VwcG9ydGVkIGxhZGRlciBmb3IgYG1vZGVsYC5cbiAqXG4gKiBBY2NlcHRzIHRoZSBzYW1lIG5lc3RlZCBEYXRhYnJpY2tzIGVudmVsb3BlcyBhcyB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9LlxuICogUmV0dXJucyBhIHB1Ymxpc2hlZCBsYWRkZXIgd2l0aG91dCBwYXJzaW5nIG9yIHN0b3JpbmcgZXJyb3ItZGVyaXZlZCBsZXZlbHNcbiAqIHdoZW4gb25lIGV4aXN0cy4gT3RoZXJ3aXNlIHJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkLCBvciB0aGVcbiAqIGN1cnJlbnQgZmFsbGJhY2sgd2hlbiBwYXJzaW5nIHlpZWxkcyBub3RoaW5nLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXJcbiAqIGNhY2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxlYXJuUmVhc29uaW5nTGV2ZWxzRnJvbUVycm9yKFxuICBtb2RlbDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuKTogUHJvbWlzZTxSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHB1Ymxpc2hlZCA9IHB1Ymxpc2hlZFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCwgbWV0YWRhdGFJbmRleCgpKTtcbiAgaWYgKHB1Ymxpc2hlZCkgcmV0dXJuIHB1Ymxpc2hlZDtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBtb2RlbCBjYXBhYmlsaXRpZXMgZnJvbSBhIG5hbWUgb3IgZW5kcG9pbnQgc3VtbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsQ2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gbWV0YWRhdGFJbmRleCgpLmNhcGFiaWxpdGllcztcbiAgY29uc3QgaWRlbnRpdGllcyA9IG1vZGVsSWRlbnRpdGllcyhtb2RlbCwgZmFsc2UpO1xuICBjb25zdCBrZXlzID0gaWRlbnRpdGllcy5mbGF0TWFwKChpZGVudGl0eSkgPT4gbW9kZWxLZXkoaWRlbnRpdHkpID8/IFtdKTtcbiAgcmV0dXJuIHtcbiAgICByZXNwb25zZXM6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMucmVzcG9uc2VzLmhhcyhrZXkpKSxcbiAgICBpbWFnZUlucHV0OiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQuaGFzKGtleSkpLFxuICAgIGFwcGx5UGF0Y2g6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMuYXBwbHlQYXRjaC5oYXMoa2V5KSksXG4gICAgLy8gVmVyc2lvbiBpbmhlcml0YW5jZSBvbmx5IGFwcGxpZXMgdG8gaG9zdGVkIGZvdW5kYXRpb24gaWRlbnRpdGllcy5cbiAgICB3ZWJTZWFyY2g6XG4gICAgICBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLndlYlNlYXJjaC5oYXMoa2V5KSkgfHxcbiAgICAgIGlkZW50aXRpZXMuc29tZShcbiAgICAgICAgKGlkZW50aXR5KSA9PlxuICAgICAgICAgIGlzRm91bmRhdGlvbk1vZGVsSWRlbnRpdHkoaWRlbnRpdHkpICYmXG4gICAgICAgICAgaW5oZXJpdHNOYXRpdmVXZWJTZWFyY2goaWRlbnRpdHksIGNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgICAgKSxcbiAgICByZWFzb25pbmc6XG4gICAgICBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlYXNvbmluZy5oYXMoa2V5KSkgfHxcbiAgICAgIGlkZW50aXRpZXMuc29tZSgoaWRlbnRpdHkpID0+IG1vZGVsUmVhc29uaW5nRWZmb3J0cyhpZGVudGl0eSkubGVuZ3RoID4gMCksXG4gICAgdG9vbHM6XG4gICAgICBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnRvb2xzLmhhcyhrZXkpKSB8fCBpZGVudGl0aWVzLnNvbWUobW9kZWxTdXBwb3J0c1Rvb2xzKSxcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnN0cnVjdHVyZWRPdXRwdXQuaGFzKGtleSkpLFxuICAgIHRlbXBlcmF0dXJlOiBtb2RlbFRlbXBlcmF0dXJlU3VwcG9ydEZvcihtb2RlbCkgPT09IHRydWUsXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIGV4cGxpY2l0IERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCwgb3IgdW5kZWZpbmVkIHdoZW4gdW5wdWJsaXNoZWQuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluZGV4ID0gbWV0YWRhdGFJbmRleCgpO1xuICBjb25zdCBrZXlzID0gbW9kZWxJZGVudGl0aWVzKG1vZGVsKS5mbGF0TWFwKChpZGVudGl0eSkgPT4gbW9kZWxLZXkoaWRlbnRpdHkpID8/IFtdKTtcbiAgaWYgKGtleXMuc29tZSgoa2V5KSA9PiBpbmRleC50ZW1wZXJhdHVyZVVuc3VwcG9ydGVkLmhhcyhrZXkpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoa2V5cy5zb21lKChrZXkpID0+IGluZGV4LmNhcGFiaWxpdGllcy50ZW1wZXJhdHVyZS5oYXMoa2V5KSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogUmVzb2x2ZSBwdWJsaXNoZWQgSVRQTSwgT1RQTSwgYW5kIFFQSCBsaW1pdHMgZnJvbSBhIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsUmF0ZUxpbWl0c0ZvcihcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4pOiBNb2RlbFJhdGVMaW1pdHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBsaW1pdHMgPSBtZXRhZGF0YUluZGV4KCkucmF0ZUxpbWl0cztcbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBtb2RlbElkZW50aXRpZXMobW9kZWwpKSB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWxLZXkoaWRlbnRpdHkpO1xuICAgIGlmICgha2V5KSBjb250aW51ZTtcbiAgICBjb25zdCBmb3VuZCA9IGxpbWl0cy5nZXQoa2V5KTtcbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgcmVhc29uaW5nIGxldmVsczogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uLCBtb2RlbHBhcmFtcy5kZXYsXG4gKiBsZWFybmVkIGVycm9ycywgdGhlbiBmYW1pbHkgZGVmYXVsdHMuXG4gKlxuICogRG9lcyBub3QgcGFyc2UgZXJyb3IgYm9kaWVzOyBjYWxsZXJzIGhhbmRsaW5nIGFuIHVwc3RyZWFtIGVycm9yIHNob3VsZCB1c2VcbiAqIHtAbGluayBsZWFyblJlYXNvbmluZ0xldmVsc0Zyb21FcnJvcn0gc28gcHVibGlzaGVkIGxldmVscyBrZWVwIHByZWNlZGVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBpbmRleCA9IG1ldGFkYXRhSW5kZXgoKTtcbiAgY29uc3QgcHVibGlzaGVkID0gcHVibGlzaGVkUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsLCBpbmRleCk7XG4gIGlmIChwdWJsaXNoZWQpIHJldHVybiBwdWJsaXNoZWQ7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2hlZFJlYXNvbmluZ0xldmVsc0ZvcihcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluZGV4OiBNZXRhZGF0YUluZGV4LFxuKTogUmVhc29uaW5nTGV2ZWxbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwpO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIGlkZW50aXRpZXMpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nRG9jcyk7XG4gICAgaWYgKGRvY3VtZW50ZWQ/Lmxlbmd0aCkgcmV0dXJuIGRvY3VtZW50ZWQ7XG4gIH1cbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBpZGVudGl0aWVzKSB7XG4gICAgY29uc3QgbW9kZWxQYXJhbXMgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5tb2RlbFBhcmFtc1JlYXNvbmluZyk7XG4gICAgaWYgKG1vZGVsUGFyYW1zPy5sZW5ndGgpIHJldHVybiBtb2RlbFBhcmFtcztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogUmVzb2x2ZSByZXRpcmVtZW50LCBjYXBhYmlsaXR5LCBhbmQgcmF0ZS1saW1pdCBtZXRhZGF0YSB0b2dldGhlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhRm9yKG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxNZXRhZGF0YSB7XG4gIGNvbnN0IHJhdGVMaW1pdHMgPSBtb2RlbFJhdGVMaW1pdHNGb3IobW9kZWwpO1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogbW9kZWxTdGF0dXNGb3IobW9kZWwpLFxuICAgIGNhcGFiaWxpdGllczogbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWwpLFxuICAgIC4uLihyYXRlTGltaXRzID8geyByYXRlTGltaXRzIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBSZXR1cm4gZ2VuZXJhdGlvbiB0aW1lc3RhbXBzIGZvciB0aGUgY29tbWl0dGVkIG1ldGFkYXRhIHNuYXBzaG90cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhR2VuZXJhdGVkQXQoKTogUmVhZG9ubHk8e1xuICByZXRpcmVkTW9kZWxzOiBudW1iZXI7XG4gIGNhcGFiaWxpdGllczogbnVtYmVyO1xuICBtb2RlbHNEZXY6IG51bWJlcjtcbiAgbW9kZWxQYXJhbXM6IG51bWJlcjtcbiAgcmF0ZUxpbWl0czogbnVtYmVyO1xuICByZWFzb25pbmc6IG51bWJlcjtcbn0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXRpcmVkTW9kZWxzOiBSRVRJUkVEX01PREVMU19HRU5FUkFURURfQVQsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgICBtb2RlbHNEZXY6IG1vZGVsc0RldlNuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIG1vZGVsUGFyYW1zOiBtb2RlbFBhcmFtc1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJhdGVMaW1pdHM6IHJhdGVMaW1pdHNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBtb2RlbElkZW50aXRpZXMoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBpbmNsdWRlRGlzcGxheU5hbWUgPSB0cnVlLFxuKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiKSByZXR1cm4gW21vZGVsXTtcbiAgcmV0dXJuIFtcbiAgICBtb2RlbC5uYW1lLFxuICAgIC4uLihpbmNsdWRlRGlzcGxheU5hbWUgPyBbbW9kZWwuZGlzcGxheU5hbWVdIDogW10pLFxuICAgIG1vZGVsLm1vZGVsU2VydmljZU5hbWUsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhtb2RlbC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBtb2RlbEtleSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG1vZGVsU2VhcmNoUXVlcnkodmFsdWUpPy5yZXBsYWNlQWxsKFwiIFwiLCBcIi1cIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRQYWdlKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBoZWFkZXJzOiB7IFwidXNlci1hZ2VudFwiOiBVU0VSX0FHRU5UIH0sXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gcmV0dXJuZWQgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7dXJsfWApO1xuICB9XG4gIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRKc29uKHVybDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogeyBcInVzZXItYWdlbnRcIjogVVNFUl9BR0VOVCB9LFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgbWV0YWRhdGEgc291cmNlIHJldHVybmVkIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3VybH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5mdW5jdGlvbiBtZXJnZU1vZGVsc0RldkRhdGEoaW5wdXQ6IHtcbiAgcmVhZG9ubHkgZnJlc2g6IE1vZGVsc0RldkRhdGEgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHByZXZpb3VzOiBNb2RlbHNEZXZEYXRhIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmYWxsYmFjazogTW9kZWxzRGV2RGF0YTtcbn0pOiBNb2RlbHNEZXZEYXRhIHtcbiAgY29uc3QgY2FwYWJpbGl0eSA9IChrZXk6IGtleW9mIE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWUpID0+XG4gICAgbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5ba2V5XSxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8uW2tleV0sXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2tba2V5XSxcbiAgICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbWFnZUlucHV0OiBjYXBhYmlsaXR5KFwiaW1hZ2VJbnB1dFwiKSxcbiAgICByZWFzb25pbmc6IGNhcGFiaWxpdHkoXCJyZWFzb25pbmdcIiksXG4gICAgdG9vbHM6IGNhcGFiaWxpdHkoXCJ0b29sc1wiKSxcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBjYXBhYmlsaXR5KFwic3RydWN0dXJlZE91dHB1dFwiKSxcbiAgICB0ZW1wZXJhdHVyZVN1cHBvcnRlZDogY2FwYWJpbGl0eShcInRlbXBlcmF0dXJlU3VwcG9ydGVkXCIpLFxuICAgIHRlbXBlcmF0dXJlVW5zdXBwb3J0ZWQ6IGNhcGFiaWxpdHkoXCJ0ZW1wZXJhdHVyZVVuc3VwcG9ydGVkXCIpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3dTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbn1cbiJdfQ==