@decaf-ts/integrations 0.3.12 → 0.4.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.md +11 -3
  2. package/dist/integrations.cjs +445 -7
  3. package/dist/integrations.js +479 -8
  4. package/jest.config.cjs +1 -1
  5. package/lib/cjs/feature-flags/constants.cjs +16 -0
  6. package/lib/cjs/feature-flags/decorators.cjs +65 -0
  7. package/lib/cjs/feature-flags/environment.cjs +26 -0
  8. package/lib/cjs/feature-flags/index.cjs +31 -0
  9. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +81 -0
  10. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +78 -0
  11. package/lib/cjs/feature-flags/readers/FeatureFlagReader.cjs +25 -0
  12. package/lib/cjs/feature-flags/readers/index.cjs +19 -0
  13. package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs +259 -0
  14. package/lib/cjs/feature-flags/types.cjs +4 -0
  15. package/lib/cjs/feature-flags/utils.cjs +141 -0
  16. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +9 -9
  17. package/lib/cjs/graph/shared/nodes/flow-control.cjs +4 -3
  18. package/lib/cjs/graph/shared/types.cjs +2 -2
  19. package/lib/cjs/index.cjs +6 -5
  20. package/lib/cjs/kibana/builders/KibanaIndexBuilder.cjs +329 -0
  21. package/lib/cjs/kibana/builders/KibanaIndexBuilderCollection.cjs +37 -0
  22. package/lib/cjs/kibana/builders/index.cjs +20 -0
  23. package/lib/cjs/kibana/helpers.cjs +20 -16
  24. package/lib/cjs/kibana/index.cjs +3 -2
  25. package/lib/cjs/kibana/types.cjs +11 -2
  26. package/lib/cjs/loader/ObjectLoader.cjs +154 -0
  27. package/lib/cjs/loader/families.cjs +78 -0
  28. package/lib/cjs/loader/index.cjs +28 -0
  29. package/lib/cjs/loader/types.cjs +4 -0
  30. package/lib/cjs/nest/decorators.cjs +17 -0
  31. package/lib/cjs/nest/index.cjs +3 -3
  32. package/lib/cjs/nest/keycloakAuthHandler.cjs +74 -35
  33. package/lib/cjs/nest/keycloakModule.cjs +7 -10
  34. package/lib/cjs/nest/types.cjs +2 -2
  35. package/lib/cjs/nest/utils.cjs +58 -50
  36. package/lib/cjs/plugins/contract.cjs +76 -0
  37. package/lib/cjs/plugins/index.cjs +35 -0
  38. package/lib/cjs/plugins/kibana/host.cjs +24 -0
  39. package/lib/cjs/plugins/kibana/index.cjs +38 -0
  40. package/lib/cjs/plugins/kibana/installer.cjs +180 -0
  41. package/lib/cjs/plugins/kibana/manifest.cjs +33 -0
  42. package/lib/cjs/plugins/kibana/templates.cjs +503 -0
  43. package/lib/cjs/plugins/kibana/types.cjs +33 -0
  44. package/lib/cjs/plugins/superset/host.cjs +26 -0
  45. package/lib/cjs/plugins/superset/index.cjs +40 -0
  46. package/lib/cjs/plugins/superset/installer.cjs +232 -0
  47. package/lib/cjs/plugins/superset/manifest.cjs +35 -0
  48. package/lib/cjs/plugins/superset/templates.cjs +844 -0
  49. package/lib/cjs/plugins/superset/types.cjs +39 -0
  50. package/lib/esm/feature-flags/constants.js +12 -0
  51. package/lib/esm/feature-flags/decorators.js +49 -0
  52. package/lib/esm/feature-flags/environment.js +18 -0
  53. package/lib/esm/feature-flags/index.js +14 -0
  54. package/lib/esm/feature-flags/models/FeatureFlag.model.js +72 -0
  55. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +69 -0
  56. package/lib/esm/feature-flags/readers/FeatureFlagReader.js +19 -0
  57. package/lib/esm/feature-flags/readers/index.js +2 -0
  58. package/lib/esm/feature-flags/services/FeatureFlag.service.js +250 -0
  59. package/lib/esm/feature-flags/types.js +2 -0
  60. package/lib/esm/feature-flags/utils.js +126 -0
  61. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +8 -8
  62. package/lib/esm/graph/shared/nodes/flow-control.js +3 -2
  63. package/lib/esm/graph/shared/types.js +1 -1
  64. package/lib/esm/index.js +5 -4
  65. package/lib/esm/kibana/builders/KibanaIndexBuilder.js +319 -0
  66. package/lib/esm/kibana/builders/KibanaIndexBuilderCollection.js +32 -0
  67. package/lib/esm/kibana/builders/index.js +3 -0
  68. package/lib/esm/kibana/helpers.js +19 -15
  69. package/lib/esm/kibana/index.js +2 -1
  70. package/lib/esm/kibana/types.js +13 -2
  71. package/lib/esm/loader/ObjectLoader.js +115 -0
  72. package/lib/esm/loader/families.js +66 -0
  73. package/lib/esm/loader/index.js +11 -0
  74. package/lib/esm/loader/types.js +2 -0
  75. package/lib/esm/nest/decorators.js +12 -0
  76. package/lib/esm/nest/index.js +2 -2
  77. package/lib/esm/nest/keycloakAuthHandler.js +67 -35
  78. package/lib/esm/nest/keycloakModule.js +7 -10
  79. package/lib/esm/nest/types.js +1 -1
  80. package/lib/esm/nest/utils.js +55 -46
  81. package/lib/esm/plugins/contract.js +68 -0
  82. package/lib/esm/plugins/index.js +18 -0
  83. package/lib/esm/plugins/kibana/host.js +19 -0
  84. package/lib/esm/plugins/kibana/index.js +14 -0
  85. package/lib/esm/plugins/kibana/installer.js +140 -0
  86. package/lib/esm/plugins/kibana/manifest.js +32 -0
  87. package/lib/esm/plugins/kibana/templates.js +499 -0
  88. package/lib/esm/plugins/kibana/types.js +10 -0
  89. package/lib/esm/plugins/superset/host.js +21 -0
  90. package/lib/esm/plugins/superset/index.js +16 -0
  91. package/lib/esm/plugins/superset/installer.js +192 -0
  92. package/lib/esm/plugins/superset/manifest.js +30 -0
  93. package/lib/esm/plugins/superset/templates.js +840 -0
  94. package/lib/esm/plugins/superset/types.js +11 -0
  95. package/lib/types/feature-flags/constants.d.cts +11 -0
  96. package/lib/types/feature-flags/constants.d.mts +11 -0
  97. package/lib/types/feature-flags/decorators.d.cts +11 -0
  98. package/lib/types/feature-flags/decorators.d.mts +11 -0
  99. package/lib/types/feature-flags/environment.d.cts +11 -0
  100. package/lib/types/feature-flags/environment.d.mts +11 -0
  101. package/lib/types/feature-flags/index.d.cts +13 -0
  102. package/lib/types/feature-flags/index.d.mts +13 -0
  103. package/lib/types/feature-flags/models/FeatureFlag.model.d.cts +16 -0
  104. package/lib/types/feature-flags/models/FeatureFlag.model.d.mts +16 -0
  105. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.cts +15 -0
  106. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.mts +15 -0
  107. package/lib/types/feature-flags/readers/FeatureFlagReader.d.cts +10 -0
  108. package/lib/types/feature-flags/readers/FeatureFlagReader.d.mts +10 -0
  109. package/lib/types/feature-flags/readers/index.d.cts +1 -0
  110. package/lib/types/feature-flags/readers/index.d.mts +1 -0
  111. package/lib/types/feature-flags/services/FeatureFlag.service.d.cts +43 -0
  112. package/lib/types/feature-flags/services/FeatureFlag.service.d.mts +43 -0
  113. package/lib/types/feature-flags/types.d.cts +39 -0
  114. package/lib/types/feature-flags/types.d.mts +39 -0
  115. package/lib/types/feature-flags/utils.d.cts +13 -0
  116. package/lib/types/feature-flags/utils.d.mts +13 -0
  117. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.cts +2 -2
  118. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.mts +2 -2
  119. package/lib/types/graph/shared/types.d.cts +3 -3
  120. package/lib/types/graph/shared/types.d.mts +3 -3
  121. package/lib/types/index.d.cts +3 -2
  122. package/lib/types/index.d.mts +3 -2
  123. package/lib/types/kibana/builders/KibanaIndexBuilder.d.cts +67 -0
  124. package/lib/types/kibana/builders/KibanaIndexBuilder.d.mts +67 -0
  125. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.cts +17 -0
  126. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.mts +17 -0
  127. package/lib/types/kibana/builders/index.d.cts +2 -0
  128. package/lib/types/kibana/builders/index.d.mts +2 -0
  129. package/lib/types/kibana/index.d.cts +1 -0
  130. package/lib/types/kibana/index.d.mts +1 -0
  131. package/lib/types/kibana/types.d.cts +11 -0
  132. package/lib/types/kibana/types.d.mts +11 -0
  133. package/lib/types/loader/ObjectLoader.d.cts +27 -0
  134. package/lib/types/loader/ObjectLoader.d.mts +27 -0
  135. package/lib/types/loader/families.d.cts +34 -0
  136. package/lib/types/loader/families.d.mts +34 -0
  137. package/lib/types/loader/index.d.cts +10 -0
  138. package/lib/types/loader/index.d.mts +10 -0
  139. package/lib/types/loader/types.d.cts +24 -0
  140. package/lib/types/loader/types.d.mts +24 -0
  141. package/lib/types/nest/decorators.d.cts +8 -0
  142. package/lib/types/nest/decorators.d.mts +8 -0
  143. package/lib/types/nest/index.d.cts +1 -1
  144. package/lib/types/nest/index.d.mts +1 -1
  145. package/lib/types/nest/keycloakAuthHandler.d.cts +19 -42
  146. package/lib/types/nest/keycloakAuthHandler.d.mts +19 -42
  147. package/lib/types/nest/keycloakModule.d.cts +3 -5
  148. package/lib/types/nest/keycloakModule.d.mts +3 -5
  149. package/lib/types/nest/types.d.cts +2 -0
  150. package/lib/types/nest/types.d.mts +2 -0
  151. package/lib/types/nest/utils.d.cts +3 -4
  152. package/lib/types/nest/utils.d.mts +3 -4
  153. package/lib/types/plugins/contract.d.cts +180 -0
  154. package/lib/types/plugins/contract.d.mts +180 -0
  155. package/lib/types/plugins/index.d.cts +17 -0
  156. package/lib/types/plugins/index.d.mts +17 -0
  157. package/lib/types/plugins/kibana/host.d.cts +18 -0
  158. package/lib/types/plugins/kibana/host.d.mts +18 -0
  159. package/lib/types/plugins/kibana/index.d.cts +13 -0
  160. package/lib/types/plugins/kibana/index.d.mts +13 -0
  161. package/lib/types/plugins/kibana/installer.d.cts +45 -0
  162. package/lib/types/plugins/kibana/installer.d.mts +45 -0
  163. package/lib/types/plugins/kibana/manifest.d.cts +31 -0
  164. package/lib/types/plugins/kibana/manifest.d.mts +31 -0
  165. package/lib/types/plugins/kibana/templates.d.cts +12 -0
  166. package/lib/types/plugins/kibana/templates.d.mts +12 -0
  167. package/lib/types/plugins/kibana/types.d.cts +9 -0
  168. package/lib/types/plugins/kibana/types.d.mts +9 -0
  169. package/lib/types/plugins/superset/host.d.cts +20 -0
  170. package/lib/types/plugins/superset/host.d.mts +20 -0
  171. package/lib/types/plugins/superset/index.d.cts +15 -0
  172. package/lib/types/plugins/superset/index.d.mts +15 -0
  173. package/lib/types/plugins/superset/installer.d.cts +70 -0
  174. package/lib/types/plugins/superset/installer.d.mts +70 -0
  175. package/lib/types/plugins/superset/manifest.d.cts +28 -0
  176. package/lib/types/plugins/superset/manifest.d.mts +28 -0
  177. package/lib/types/plugins/superset/templates.d.cts +12 -0
  178. package/lib/types/plugins/superset/templates.d.mts +12 -0
  179. package/lib/types/plugins/superset/types.d.cts +10 -0
  180. package/lib/types/plugins/superset/types.d.mts +10 -0
  181. package/package.json +62 -3
  182. package/plugins/kibana/.gitignore +16 -0
  183. package/plugins/kibana/Dockerfile +19 -0
  184. package/plugins/kibana/docker-compose.yml +50 -0
  185. package/plugins/kibana/host/index.html +101 -0
  186. package/plugins/kibana/setup-dashboards.sh +84 -0
  187. package/plugins/superset/.gitignore +17 -0
  188. package/plugins/superset/Dockerfile +79 -0
  189. package/plugins/superset/docker-compose.yml +62 -0
  190. package/plugins/superset/host/index.html +168 -0
  191. package/plugins/superset/setup-dashboards.sh +106 -0
  192. package/plugins/superset/superset_config.py +49 -0
  193. package/lib/cjs/nest/authService.cjs +0 -91
  194. package/lib/esm/nest/authService.js +0 -86
  195. package/lib/types/nest/authService.d.cts +0 -63
  196. package/lib/types/nest/authService.d.mts +0 -63
@@ -1,10 +1,10 @@
1
1
  import { exec } from "child_process";
2
2
 
3
- import { LogLevel } from "@decaf-ts/logging";
3
+ import { LogLevel, LoggedEnvironment } from "@decaf-ts/logging";
4
4
 
5
- import { InternalError } from "@decaf-ts/db-decorators";
5
+ import { InternalError, NotFoundError } from "@decaf-ts/db-decorators";
6
6
 
7
- import { Cascade, ModelService, pk, uuid, manyToOne, column, createdAt, updatedAt, table, unique, oneToMany, transactional, AuthorizationError } from "@decaf-ts/core";
7
+ import { Cascade, ModelService, pk, uuid, manyToOne, column, createdAt, updatedAt, table, unique, oneToMany, transactional, AuthorizationError, BaseModel, Repository, Condition, repository, service } from "@decaf-ts/core";
8
8
 
9
9
  export { AuthorizationError, transactional } from "@decaf-ts/core";
10
10
 
@@ -12,6 +12,8 @@ import { Model, required, type, option, model } from "@decaf-ts/decorator-valida
12
12
 
13
13
  import { __decorate, __metadata } from "tslib";
14
14
 
15
+ import { Metadata, metadata, methodMetadata, propMetadata } from "@decaf-ts/decoration";
16
+
15
17
  async function execWithLogging(command, options, log, level = LogLevel.info) {
16
18
  log.debug(`Executing: ${command}`);
17
19
  return new Promise((resolve, reject) => {
@@ -1873,13 +1875,482 @@ class AuthzService {
1873
1875
  }
1874
1876
  }
1875
1877
 
1876
- const VERSION = "0.3.11";
1878
+ const FEATURE_FLAG_ENV_ROOT = "featureFlag";
1879
+
1880
+ const FEATURE_FLAG_ENV_PREFIX = "FEATURE_FLAG";
1881
+
1882
+ const FEATURE_FLAG_MODEL_KEY = "feature-flags:model";
1883
+
1884
+ const FEATURE_FLAG_AUTH_KEY = "feature-flags:auth";
1885
+
1886
+ const FEATURE_FLAG_BLOCK_KEY = "feature-flags:block";
1887
+
1888
+ const FEATURE_FLAG_RENDER_KEY = "feature-flags:render-if";
1889
+
1890
+ const FEATURE_FLAG_HIDE_KEY = "feature-flags:hide-on";
1891
+
1892
+ function normalizeFeatureName(name) {
1893
+ const trimmed = name.trim();
1894
+ if (!trimmed) return trimmed;
1895
+ if (/^[a-z][a-zA-Z0-9]*$/.test(trimmed)) return trimmed;
1896
+ const camelized = trimmed.toLowerCase().replace(/[_\-\s]+/g, " ").split(" ").filter(Boolean);
1897
+ if (camelized.length === 0) return trimmed;
1898
+ const [head, ...tail] = camelized;
1899
+ return [ head, ...tail.map(segment => segment ? segment.charAt(0).toUpperCase() + segment.slice(1) : segment) ].join("").replace(/[^a-zA-Z0-9]/g, "");
1900
+ }
1901
+
1902
+ function parseRuntimeValue(value) {
1903
+ if (typeof value !== "string") return value;
1904
+ const trimmed = value.trim();
1905
+ if (trimmed === "true") return true;
1906
+ if (trimmed === "false") return false;
1907
+ if (/^-?\d+(\.\d+)?$/.test(trimmed)) return Number(trimmed);
1908
+ if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
1909
+ try {
1910
+ return JSON.parse(trimmed);
1911
+ } catch {
1912
+ return value;
1913
+ }
1914
+ }
1915
+ return value;
1916
+ }
1917
+
1918
+ function normalizeObjectKey(key) {
1919
+ if (!key) return key;
1920
+ if (/^[a-z][a-zA-Z0-9]*$/.test(key)) return key;
1921
+ const normalized = key.replace(/[\s-]+/g, "_").split("_").filter(Boolean);
1922
+ if (normalized.length === 0) return key;
1923
+ const [head, ...tail] = normalized;
1924
+ return [ head.toLowerCase(), ...tail.map(segment => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()) ].join("");
1925
+ }
1926
+
1927
+ function normalizeFeatureConfig(value) {
1928
+ if (typeof value === "undefined") return undefined;
1929
+ if (value === true) return true;
1930
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
1931
+ return parseRuntimeValue(value);
1932
+ }
1933
+ const result = {};
1934
+ Object.entries(value).forEach(([key, raw]) => {
1935
+ const normalizedKey = normalizeObjectKey(key);
1936
+ if (typeof raw !== "undefined") {
1937
+ result[normalizedKey] = normalizeFeatureConfig(raw) ?? raw;
1938
+ }
1939
+ });
1940
+ return result;
1941
+ }
1942
+
1943
+ function normalizeFeatureRegistry(value) {
1944
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
1945
+ return Object.entries(value).reduce((acc, [key, raw]) => {
1946
+ const normalizedKey = normalizeFeatureName(key);
1947
+ const normalizedValue = normalizeFeatureConfig(raw);
1948
+ if (typeof normalizedValue !== "undefined") {
1949
+ acc[normalizedKey] = normalizedValue;
1950
+ }
1951
+ return acc;
1952
+ }, {});
1953
+ }
1954
+
1955
+ function isFeatureFlagEnabled(value) {
1956
+ if (value === true) return true;
1957
+ return !!value && typeof value === "object";
1958
+ }
1959
+
1960
+ function isFeatureFlagEnabledByName(registry, featureName) {
1961
+ return isFeatureFlagEnabled(registry?.[normalizeFeatureName(featureName)]);
1962
+ }
1963
+
1964
+ function normalizeFeatureRule(features, match = "any") {
1965
+ return {
1966
+ features: [ ...new Set(features.map(normalizeFeatureName).filter(Boolean)) ],
1967
+ match: match
1968
+ };
1969
+ }
1970
+
1971
+ function isFeatureRuleSatisfied(rule, registry) {
1972
+ if (!rule || rule.features.length === 0) return true;
1973
+ const enabled = rule.features.filter(feature => isFeatureFlagEnabledByName(registry, feature));
1974
+ if (rule.match === "all") return enabled.length === rule.features.length;
1975
+ return enabled.length > 0;
1976
+ }
1977
+
1978
+ function isFeatureRuleBlocked(rule, registry) {
1979
+ if (!rule || rule.features.length === 0) return false;
1980
+ return rule.features.some(feature => isFeatureFlagEnabledByName(registry, feature));
1981
+ }
1982
+
1983
+ function readMetadata(target, key) {
1984
+ return Metadata.get(target, key);
1985
+ }
1986
+
1987
+ function normalizeFeatureSubjectType(subjectType) {
1988
+ return subjectType.trim().toLowerCase();
1989
+ }
1990
+
1991
+ function normalizeFeatureSubjectKey(subjectKey) {
1992
+ return subjectKey.trim();
1993
+ }
1994
+
1995
+ const FeatureFlagEnvironment = LoggedEnvironment.accumulate({
1996
+ [FEATURE_FLAG_ENV_ROOT]: {}
1997
+ });
1998
+
1999
+ async function loadFeatureFlagsFromEnvironment(source = FeatureFlagEnvironment) {
2000
+ return normalizeFeatureRegistry(source.featureFlag);
2001
+ }
2002
+
2003
+ async function resolveFeatureFlagFromEnvironment(featureName, source = FeatureFlagEnvironment) {
2004
+ const registry = await loadFeatureFlagsFromEnvironment(source);
2005
+ return registry[normalizeFeatureName(featureName)];
2006
+ }
2007
+
2008
+ async function hasFeatureFlagInEnvironment(featureName, source = FeatureFlagEnvironment) {
2009
+ return !!await resolveFeatureFlagFromEnvironment(featureName, source);
2010
+ }
2011
+
2012
+ let FeatureFlag = class FeatureFlag extends BaseModel {
2013
+ constructor(data) {
2014
+ super(data);
2015
+ this.enabled = true;
2016
+ }
2017
+ };
2018
+
2019
+ __decorate([ pk(), uuid(), __metadata("design:type", String) ], FeatureFlag.prototype, "id", void 0);
2020
+
2021
+ __decorate([ unique(), required(), column(), __metadata("design:type", String) ], FeatureFlag.prototype, "key", void 0);
2022
+
2023
+ __decorate([ column(), __metadata("design:type", Boolean) ], FeatureFlag.prototype, "enabled", void 0);
2024
+
2025
+ __decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "description", void 0);
2026
+
2027
+ __decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "scope", void 0);
2028
+
2029
+ __decorate([ column(), __metadata("design:type", Object) ], FeatureFlag.prototype, "metadata", void 0);
2030
+
2031
+ __decorate([ column(), __metadata("design:type", Object) ], FeatureFlag.prototype, "config", void 0);
2032
+
2033
+ __decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "createdBy", void 0);
2034
+
2035
+ __decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "updatedBy", void 0);
2036
+
2037
+ __decorate([ createdAt(), __metadata("design:type", Date) ], FeatureFlag.prototype, "createdAt", void 0);
2038
+
2039
+ __decorate([ updatedAt(), __metadata("design:type", Date) ], FeatureFlag.prototype, "updatedAt", void 0);
2040
+
2041
+ FeatureFlag = __decorate([ table("feature_flags"), model(), __metadata("design:paramtypes", [ Object ]) ], FeatureFlag);
2042
+
2043
+ let FeatureFlagAccess = class FeatureFlagAccess extends BaseModel {
2044
+ constructor(data) {
2045
+ super(data);
2046
+ this.enabled = true;
2047
+ }
2048
+ };
2049
+
2050
+ __decorate([ pk(), uuid(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "id", void 0);
2051
+
2052
+ __decorate([ required(), column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "featureKey", void 0);
2053
+
2054
+ __decorate([ required(), column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "subjectType", void 0);
2055
+
2056
+ __decorate([ required(), column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "subjectKey", void 0);
2057
+
2058
+ __decorate([ column(), __metadata("design:type", Boolean) ], FeatureFlagAccess.prototype, "enabled", void 0);
2059
+
2060
+ __decorate([ column(), __metadata("design:type", Object) ], FeatureFlagAccess.prototype, "metadata", void 0);
2061
+
2062
+ __decorate([ column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "createdBy", void 0);
2063
+
2064
+ __decorate([ column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "updatedBy", void 0);
2065
+
2066
+ __decorate([ createdAt(), __metadata("design:type", Date) ], FeatureFlagAccess.prototype, "createdAt", void 0);
2067
+
2068
+ __decorate([ updatedAt(), __metadata("design:type", Date) ], FeatureFlagAccess.prototype, "updatedAt", void 0);
2069
+
2070
+ FeatureFlagAccess = __decorate([ table("feature_flag_access"), model(), __metadata("design:paramtypes", [ Object ]) ], FeatureFlagAccess);
2071
+
2072
+ class FeatureFlagReader {
2073
+ async readOne(featureName, input) {
2074
+ const registry = await this.read(input);
2075
+ return registry[normalizeFeatureName(featureName)];
2076
+ }
2077
+ }
2078
+
2079
+ class EnvironmeFlagReader extends FeatureFlagReader {
2080
+ async read(input = {}) {
2081
+ const environment = input.source ?? {
2082
+ [FEATURE_FLAG_ENV_ROOT]: {}
2083
+ };
2084
+ return loadFeatureFlagsFromEnvironment(environment);
2085
+ }
2086
+ }
2087
+
2088
+ let FeatureFlagService = class FeatureFlagService extends ModelService {
2089
+ constructor() {
2090
+ super(FeatureFlag);
2091
+ this.reader = new EnvironmeFlagReader;
2092
+ this.cachedRegistry = {};
2093
+ }
2094
+ async initialize(...args) {
2095
+ const config = args[0] ?? {};
2096
+ if (config.repository) {
2097
+ this._repository = config.repository;
2098
+ }
2099
+ this.reader = !config.reader ? new EnvironmeFlagReader : typeof config.reader === "function" ? new config.reader : config.reader;
2100
+ const readerConfig = {
2101
+ ...config.readerConfig ?? {},
2102
+ source: config.readerConfig?.source ?? FeatureFlagEnvironment
2103
+ };
2104
+ this.cachedRegistry = await this.refreshCachedRegistry(readerConfig, ...args);
2105
+ const effectiveConfig = {
2106
+ ...config,
2107
+ reader: this.reader,
2108
+ readerConfig: readerConfig
2109
+ };
2110
+ return {
2111
+ config: effectiveConfig,
2112
+ client: this.reader
2113
+ };
2114
+ }
2115
+ cloneRegistry(registry) {
2116
+ return Object.entries(registry).reduce((acc, [key, value]) => {
2117
+ acc[key] = value && typeof value === "object" && !Array.isArray(value) ? {
2118
+ ...value
2119
+ } : value;
2120
+ return acc;
2121
+ }, {});
2122
+ }
2123
+ async refreshCachedRegistry(options = {}, ...args) {
2124
+ const envRegistry = await this.reader.read({
2125
+ ...options,
2126
+ source: options.source ?? FeatureFlagEnvironment
2127
+ });
2128
+ let persisted = [];
2129
+ try {
2130
+ persisted = await this.repo.select().execute(...args);
2131
+ } catch {
2132
+ persisted = [];
2133
+ }
2134
+ const registry = this.cloneRegistry(envRegistry);
2135
+ for (const flag of persisted) {
2136
+ registry[flag.key] = flag.enabled ? flag.config ?? true : false;
2137
+ }
2138
+ return registry;
2139
+ }
2140
+ setCachedFlag(flag) {
2141
+ this.cachedRegistry[flag.key] = flag.enabled ? flag.config ?? true : false;
2142
+ }
2143
+ getAccessRepository() {
2144
+ return this.accessRepository ?? Repository.forModel(FeatureFlagAccess);
2145
+ }
2146
+ assertInitialized() {
2147
+ void this.reader;
2148
+ }
2149
+ normalizeFeatureAccessInput(input) {
2150
+ return {
2151
+ ...input,
2152
+ featureKey: normalizeFeatureName(input.featureKey),
2153
+ subjectType: normalizeFeatureSubjectType(input.subjectType),
2154
+ subjectKey: normalizeFeatureSubjectKey(input.subjectKey)
2155
+ };
2156
+ }
2157
+ buildAccessCondition(query) {
2158
+ let condition = Condition.attr("subjectType").eq(normalizeFeatureSubjectType(query.subjectType));
2159
+ condition = condition.and(Condition.attr("subjectKey").eq(normalizeFeatureSubjectKey(query.subjectKey)));
2160
+ if (typeof query.enabled !== "undefined") {
2161
+ condition = condition.and(Condition.attr("enabled").eq(query.enabled));
2162
+ }
2163
+ if (query.featureKeys && query.featureKeys.length > 0) {
2164
+ condition = condition.and(Condition.attr("featureKey").in(query.featureKeys.map(normalizeFeatureName)));
2165
+ }
2166
+ return condition;
2167
+ }
2168
+ async create(model, ...args) {
2169
+ model.key = normalizeFeatureName(model.key);
2170
+ model.enabled ??= true;
2171
+ const created = await super.create(model, ...args);
2172
+ this.setCachedFlag(created);
2173
+ return created;
2174
+ }
2175
+ async update(model, ...args) {
2176
+ model.key = normalizeFeatureName(model.key);
2177
+ model.enabled ??= true;
2178
+ const updated = await super.update(model, ...args);
2179
+ this.setCachedFlag(updated);
2180
+ return updated;
2181
+ }
2182
+ async findOneBy(key, value, ...args) {
2183
+ const normalizedValue = key === "key" && typeof value === "string" ? normalizeFeatureName(value) : value;
2184
+ return this.repo.findOneBy(key, normalizedValue, ...args);
2185
+ }
2186
+ async readAll(keys, ...args) {
2187
+ const result = await this.repo.readAll(keys, ...args);
2188
+ for (const flag of result) this.setCachedFlag(flag);
2189
+ return result;
2190
+ }
2191
+ async listEnabled(...args) {
2192
+ return this.repo.select().where(Condition.attr("enabled").eq(true)).execute(...args);
2193
+ }
2194
+ async grantFeatureAccess(input, ...args) {
2195
+ const normalized = this.normalizeFeatureAccessInput(input);
2196
+ const existing = await this.findFeatureAccess(normalized, ...args).catch(() => undefined);
2197
+ if (!existing) {
2198
+ return this.getAccessRepository().create(new FeatureFlagAccess(normalized), ...args);
2199
+ }
2200
+ return this.getAccessRepository().update(Object.assign(existing, normalized), ...args);
2201
+ }
2202
+ async revokeFeatureAccess(input, ...args) {
2203
+ const existing = await this.findFeatureAccess(input, ...args).catch(() => undefined);
2204
+ if (!existing) return undefined;
2205
+ return this.getAccessRepository().delete(existing.id, ...args);
2206
+ }
2207
+ async findFeatureAccess(query, ...args) {
2208
+ const condition = this.buildAccessCondition(query);
2209
+ const results = await this.getAccessRepository().select().where(condition).execute(...args);
2210
+ const existing = results[0];
2211
+ if (!existing) {
2212
+ throw new NotFoundError(`Feature access for ${normalizeFeatureSubjectType(query.subjectType)}:${normalizeFeatureSubjectKey(query.subjectKey)} not found`);
2213
+ }
2214
+ return existing;
2215
+ }
2216
+ async listFeatureAccess(query, ...args) {
2217
+ return this.getAccessRepository().select().where(this.buildAccessCondition(query)).execute(...args);
2218
+ }
2219
+ async resolveFeatureFlagsForSubject(subject, ...args) {
2220
+ this.assertInitialized();
2221
+ const access = await this.listFeatureAccess({
2222
+ ...subject,
2223
+ enabled: true
2224
+ }, ...args);
2225
+ const featureKeys = [ ...new Set(access.map(item => item.featureKey)) ];
2226
+ if (featureKeys.length === 0) return {};
2227
+ const condition = Condition.attr("enabled").eq(true).and(Condition.attr("key").in(featureKeys.map(normalizeFeatureName)));
2228
+ const enabledFlags = await this.repo.select().where(condition).execute(...args);
2229
+ return enabledFlags.reduce((registry, flag) => {
2230
+ registry[flag.key] = flag.config ?? true;
2231
+ return registry;
2232
+ }, {});
2233
+ }
2234
+ async isEnabledForSubject(key, subject, ...args) {
2235
+ const registry = await this.resolveFeatureFlagsForSubject(subject, ...args);
2236
+ return isFeatureFlagEnabledByName(registry, key);
2237
+ }
2238
+ isEnabled(key) {
2239
+ this.assertInitialized();
2240
+ const normalizedKey = normalizeFeatureName(key);
2241
+ return isFeatureFlagEnabledByName(this.cachedRegistry, normalizedKey);
2242
+ }
2243
+ async resolveFeatureFlags() {
2244
+ this.assertInitialized();
2245
+ return this.cloneRegistry(this.cachedRegistry);
2246
+ }
2247
+ async syncFromEnvironment(options = {}, ...args) {
2248
+ this.assertInitialized();
2249
+ const registry = await this.reader.read({
2250
+ ...options,
2251
+ source: options.source ?? FeatureFlagEnvironment
2252
+ });
2253
+ const results = [];
2254
+ for (const [key, value] of Object.entries(registry)) {
2255
+ const config = value && typeof value === "object" && !Array.isArray(value) ? value : {
2256
+ enabled: Boolean(value)
2257
+ };
2258
+ const {enabled: _ignoredEnabled, ...restConfig} = config;
2259
+ const normalizedKey = normalizeFeatureName(key);
2260
+ const existing = await this.findOneBy("key", normalizedKey, ...args).catch(() => undefined);
2261
+ const model = existing ? Object.assign(existing, {
2262
+ enabled: isFeatureFlagEnabled(value),
2263
+ description: restConfig.description ?? existing.description,
2264
+ scope: restConfig.scope ?? existing.scope,
2265
+ metadata: restConfig.metadata ?? existing.metadata,
2266
+ config: {
2267
+ ...restConfig,
2268
+ enabled: isFeatureFlagEnabled(value)
2269
+ }
2270
+ }) : new FeatureFlag({
2271
+ key: normalizedKey,
2272
+ enabled: isFeatureFlagEnabled(value),
2273
+ description: restConfig.description,
2274
+ scope: restConfig.scope,
2275
+ metadata: restConfig.metadata,
2276
+ config: {
2277
+ ...restConfig,
2278
+ enabled: isFeatureFlagEnabled(value)
2279
+ }
2280
+ });
2281
+ results.push(existing ? await this.update(model, ...args) : await this.create(model, ...args));
2282
+ }
2283
+ this.cachedRegistry = await this.refreshCachedRegistry({
2284
+ ...options,
2285
+ source: options.source ?? FeatureFlagEnvironment
2286
+ }, ...args);
2287
+ return results;
2288
+ }
2289
+ };
2290
+
2291
+ __decorate([ repository(FeatureFlagAccess), __metadata("design:type", Object) ], FeatureFlagService.prototype, "accessRepository", void 0);
2292
+
2293
+ FeatureFlagService = __decorate([ service(FeatureFlag), __metadata("design:paramtypes", []) ], FeatureFlagService);
2294
+
2295
+ function featureMetadataKey(key, propertyKey) {
2296
+ return typeof propertyKey === "undefined" ? key : Metadata.key(key, propertyKey.toString());
2297
+ }
2298
+
2299
+ function applyFeatureDecorator(key, features, match = "any") {
2300
+ const rule = normalizeFeatureRule(features, match);
2301
+ return function featureDecorator(target, propertyKey, descriptor) {
2302
+ if (typeof propertyKey === "undefined") {
2303
+ return metadata(key, rule)(target);
2304
+ }
2305
+ const scopedKey = featureMetadataKey(key, propertyKey);
2306
+ if (descriptor) {
2307
+ return methodMetadata(scopedKey, rule)(target, propertyKey, descriptor);
2308
+ }
2309
+ return propMetadata(scopedKey, rule)(target, propertyKey);
2310
+ };
2311
+ }
2312
+
2313
+ function featureFlags(...features) {
2314
+ return applyFeatureDecorator(FEATURE_FLAG_MODEL_KEY, features);
2315
+ }
2316
+
2317
+ function featureAuth(...features) {
2318
+ return applyFeatureDecorator(FEATURE_FLAG_AUTH_KEY, features);
2319
+ }
2320
+
2321
+ function blockFeatureOperations(...features) {
2322
+ return applyFeatureDecorator(FEATURE_FLAG_BLOCK_KEY, features);
2323
+ }
2324
+
2325
+ function renderIfFeature(...features) {
2326
+ return applyFeatureDecorator(FEATURE_FLAG_RENDER_KEY, features);
2327
+ }
2328
+
2329
+ function hideOnFeature(...features) {
2330
+ return applyFeatureDecorator(FEATURE_FLAG_HIDE_KEY, features);
2331
+ }
2332
+
2333
+ function getFeatureGateMetadata(target, key, propertyKey) {
2334
+ return readMetadata(target, featureMetadataKey(key, propertyKey));
2335
+ }
2336
+
2337
+ function shouldExposeForFeatures(target, enabledFeatures, key, propertyKey) {
2338
+ const rule = getFeatureGateMetadata(target, key, propertyKey);
2339
+ return isFeatureRuleSatisfied(rule, enabledFeatures);
2340
+ }
2341
+
2342
+ function shouldHideForFeatures(target, enabledFeatures, key, propertyKey) {
2343
+ const rule = getFeatureGateMetadata(target, key, propertyKey);
2344
+ return isFeatureRuleBlocked(rule, enabledFeatures);
2345
+ }
2346
+
2347
+ const VERSION = "0.4.0";
1877
2348
 
1878
- const COMMIT = "e2c4409";
2349
+ const COMMIT = "7e1a5ac";
1879
2350
 
1880
- const FULL_VERSION = "0.3.11-e2c4409";
2351
+ const FULL_VERSION = "0.4.0-7e1a5ac";
1881
2352
 
1882
2353
  const PACKAGE_NAME = "@decaf-ts/integrations";
1883
2354
 
1884
- export { AuthorizationModel, AuthzService, BaseModelService, BootstrapService, COMMIT, EffectivePermission, EffectivePermissionService, FULL_VERSION, Group, GroupMembership, GroupMembershipService, GroupService, InheritanceBlock, InheritanceBlockService, IsolationTier, IsolationTierOptions, MembershipStatus, MembershipStatusOptions, OrgUnit, OrgUnitClosure, OrgUnitClosureService, OrgUnitMembership, OrgUnitMembershipService, OrgUnitProfile, OrgUnitProfileService, OrgUnitService, PACKAGE_NAME, Permission, PermissionCategory, PermissionCategoryOptions, PermissionService, Principal, PrincipalKind, PrincipalKindOptions, PrincipalService, ProtectedResource, ProtectedResourceService, REL_CASCADE_DEPENDENT, REL_CASCADE_INSERT_UPDATE, REL_NULLIFY, REL_RESTRICT, ResourceGrant, ResourceGrantService, ResourceLifecycleService, ResourceVisibility, ResourceVisibilityOptions, Role, RoleAssignment, RoleAssignmentService, RolePermission, RolePermissionService, RoleService, ScopeKind, ScopeKindOptions, StorageBinding, StorageBindingKind, StorageBindingKindOptions, StorageBindingService, StorageKind, StorageKindOptions, SystemManagementService, Tenant, TenantMembership, TenantMembershipService, TenantProfile, TenantProfileService, TenantService, User, UserService, VERSION, asArray, buildAccessContext, buildArangoContext, buildQdrantFilter, execWithLogging, id, isTimeValid, lowerSlug, nowIso, relationId, relationMatch, sameTenant };
1885
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb25zLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy90eXBlcy50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3V0aWxzLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL2F1dGhvcml6YXRpb24tbW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdXNlci5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL29yZy11bml0LWNsb3N1cmUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcGVybWlzc2lvbi5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9yb2xlLXBlcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9yb2xlLWFzc2lnbm1lbnQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcmVzb3VyY2UtZ3JhbnQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcHJpbmNpcGFsLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9pbmhlcml0YW5jZS1ibG9jay5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9zdG9yYWdlLWJpbmRpbmcubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC1wcm9maWxlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL29yZy11bml0LXByb2ZpbGUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZ3JvdXAtbWVtYmVyc2hpcC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9ncm91cC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9lZmZlY3RpdmUtcGVybWlzc2lvbi5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3RlbmFudC1wcm9maWxlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC1wcm9maWxlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC1jbG9zdXJlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdGVuYW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdXNlci5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcHJpbmNpcGFsLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy90ZW5hbnQtbWVtYmVyc2hpcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtbWVtYmVyc2hpcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvZ3JvdXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2dyb3VwLW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Blcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcm9sZS1hc3NpZ25tZW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcHJvdGVjdGVkLXJlc291cmNlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcmVzb3VyY2UtbGlmZWN5Y2xlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9zdG9yYWdlLWJpbmRpbmcuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2Jvb3RzdHJhcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvc3lzdGVtLW1hbmFnZW1lbnQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2F1dGh6LnNlcnZpY2UudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy91dGlsc1xuICogQHN1bW1hcnkgU2hhcmVkIGludGVncmF0aW9uIHV0aWxpdGllcy5cbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGhlbHBlcnMgdXNlZCBhY3Jvc3MgdGhlIGludGVncmF0aW9ucyBwYWNrYWdlLlxuICovXG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWNXaXRoTG9nZ2luZyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nIH0sXG4gIGxvZzogTG9nZ2VyLFxuICBsZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5pbmZvXG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0+IHtcbiAgbG9nLmRlYnVnKGBFeGVjdXRpbmc6ICR7Y29tbWFuZH1gKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gZXhlYyhjb21tYW5kLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHN0ZG91dDogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdGRlcnI6IHN0cmluZ1tdID0gW107XG5cbiAgICBjaGlsZC5zdGRvdXQ/Lm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICBzdGRvdXQucHVzaChkYXRhKTtcbiAgICAgIGxvZ1tsZXZlbF0oZGF0YS50cmltKCkpO1xuICAgIH0pO1xuXG4gICAgY2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgc3RkZXJyLnB1c2goZGF0YSk7XG4gICAgICBsb2cuZGVidWcoZGF0YS50cmltKCkpO1xuICAgIH0pO1xuXG4gICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZTogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICBsb2cuc2lsbHkoYENvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseWApO1xuICAgICAgICByZXNvbHZlKHsgc3Rkb3V0OiBzdGRvdXQuam9pbihcIlxcblwiKSwgc3RkZXJyOiBzdGRlcnIuam9pbihcIlxcblwiKSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5jcml0aWNhbChcbiAgICAgICAgICBgQ29tbWFuZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX06XFxuICR7c3RkZXJyLmpvaW4oXCJcXG5cIil9YFxuICAgICAgICApO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgQ29tbWFuZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX06ICR7c3RkZXJyLmpvaW4oXCJcXG5cIil9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycjogRXJyb3IpID0+IHtcbiAgICAgIGxvZy5jcml0aWNhbChgQ29tbWFuZCBleGVjdXRpb24gZXJyb3JgLCBlcnIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGVudW0gSXNvbGF0aW9uVGllciB7XG4gIFBvb2xlZCA9IFwicG9vbGVkXCIsXG4gIEJyaWRnZSA9IFwiYnJpZGdlXCIsXG4gIFNpbG8gPSBcInNpbG9cIixcbn1cblxuZXhwb3J0IGVudW0gTWVtYmVyc2hpcFN0YXR1cyB7XG4gIEludml0ZWQgPSBcImludml0ZWRcIixcbiAgQWN0aXZlID0gXCJhY3RpdmVcIixcbiAgU3VzcGVuZGVkID0gXCJzdXNwZW5kZWRcIixcbiAgUmVtb3ZlZCA9IFwicmVtb3ZlZFwiLFxufVxuXG5leHBvcnQgZW51bSBQcmluY2lwYWxLaW5kIHtcbiAgVXNlciA9IFwidXNlclwiLFxuICBHcm91cCA9IFwiZ3JvdXBcIixcbiAgU2VydmljZUFjY291bnQgPSBcInNlcnZpY2VfYWNjb3VudFwiLFxuICBBZ2VudCA9IFwiYWdlbnRcIixcbiAgQXBpS2V5ID0gXCJhcGlfa2V5XCIsXG59XG5cbmV4cG9ydCBlbnVtIFNjb3BlS2luZCB7XG4gIFRlbmFudCA9IFwidGVuYW50XCIsXG4gIE9yZ1VuaXQgPSBcIm9yZ191bml0XCIsXG4gIFJlc291cmNlID0gXCJyZXNvdXJjZVwiLFxufVxuXG5leHBvcnQgZW51bSBQZXJtaXNzaW9uQ2F0ZWdvcnkge1xuICBBZG1pbiA9IFwiYWRtaW5cIixcbiAgQ29udGVudFJlYWQgPSBcImNvbnRlbnRfcmVhZFwiLFxuICBDb250ZW50V3JpdGUgPSBcImNvbnRlbnRfd3JpdGVcIixcbiAgTWVtb3J5ID0gXCJtZW1vcnlcIixcbiAgR3JhcGggPSBcImdyYXBoXCIsXG4gIFZlY3RvciA9IFwidmVjdG9yXCIsXG4gIEV4cG9ydCA9IFwiZXhwb3J0XCIsXG4gIEJpbGxpbmcgPSBcImJpbGxpbmdcIixcbiAgQXVkaXQgPSBcImF1ZGl0XCIsXG4gIFNlY3VyaXR5ID0gXCJzZWN1cml0eVwiLFxuICBEYXRhID0gXCJkYXRhXCIsXG4gIEF1dG9tYXRpb24gPSBcImF1dG9tYXRpb25cIixcbn1cblxuZXhwb3J0IGVudW0gUmVzb3VyY2VWaXNpYmlsaXR5IHtcbiAgUHJpdmF0ZSA9IFwicHJpdmF0ZVwiLFxuICBSZXNvdXJjZUFjbCA9IFwicmVzb3VyY2VfYWNsXCIsXG4gIE9yZ1VuaXQgPSBcIm9yZ191bml0XCIsXG4gIE9yZ1N1YnRyZWUgPSBcIm9yZ19zdWJ0cmVlXCIsXG4gIFRlbmFudCA9IFwidGVuYW50XCIsXG59XG5cbmV4cG9ydCBlbnVtIFN0b3JhZ2VLaW5kIHtcbiAgUG9zdGdyZXMgPSBcInBvc3RncmVzXCIsXG4gIEFyYW5nbyA9IFwiYXJhbmdvXCIsXG4gIFFkcmFudCA9IFwicWRyYW50XCIsXG4gIE9iamVjdFN0b3JhZ2UgPSBcIm9iamVjdF9zdG9yYWdlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFN0b3JhZ2VCaW5kaW5nS2luZCB7XG4gIFNoYXJlZCA9IFwic2hhcmVkXCIsXG4gIERlZGljYXRlZCA9IFwiZGVkaWNhdGVkXCIsXG59XG5cbmV4cG9ydCBjb25zdCBJc29sYXRpb25UaWVyT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoSXNvbGF0aW9uVGllcik7XG5leHBvcnQgY29uc3QgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgPSBPYmplY3QudmFsdWVzKE1lbWJlcnNoaXBTdGF0dXMpO1xuZXhwb3J0IGNvbnN0IFByaW5jaXBhbEtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhQcmluY2lwYWxLaW5kKTtcbmV4cG9ydCBjb25zdCBTY29wZUtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTY29wZUtpbmQpO1xuZXhwb3J0IGNvbnN0IFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFBlcm1pc3Npb25DYXRlZ29yeSk7XG5leHBvcnQgY29uc3QgUmVzb3VyY2VWaXNpYmlsaXR5T3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoUmVzb3VyY2VWaXNpYmlsaXR5KTtcbmV4cG9ydCBjb25zdCBTdG9yYWdlS2luZE9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFN0b3JhZ2VLaW5kKTtcbmV4cG9ydCBjb25zdCBTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdG9yYWdlQmluZGluZ0tpbmQpO1xuXG5leHBvcnQgdHlwZSBUeEFyZ3MgPSBhbnlbXTtcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVUZW5hbnRJbnB1dCB7XG4gIHNsdWc6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpc29sYXRpb25UaWVyPzogSXNvbGF0aW9uVGllcjtcbiAgcHJvZmlsZUtleT86IHN0cmluZztcbiAgcHJvZmlsZU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVXNlcklucHV0IHtcbiAgZW1haWw/OiBzdHJpbmc7XG4gIHBob25lPzogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9yZ1VuaXRJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHBhcmVudE9yZ1VuaXRJZD86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcm9maWxlS2V5Pzogc3RyaW5nO1xuICBwcm9maWxlTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSb2xlSW5wdXQge1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAga2V5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUGVybWlzc2lvbklucHV0IHtcbiAga2V5OiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnk7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lnblJvbGVJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHJvbGVJZDogc3RyaW5nO1xuICBzY29wZUtpbmQ6IFNjb3BlS2luZDtcbiAgc2NvcGVJZDogc3RyaW5nO1xuICBpbmhlcml0RG93bj86IGJvb2xlYW47XG4gIHN0YXJ0c0F0PzogRGF0ZTtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbiAgY29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIG9yZ1VuaXRJZDogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIHNlbnNpdGl2aXR5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50UmVzb3VyY2VJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY3JlYXRlZEJ5UHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuQWNjZXNzSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5OiBzdHJpbmc7XG4gIHJlc291cmNlUHJvdGVjdGVkSWQ/OiBzdHJpbmc7XG4gIHNjb3BlS2luZD86IFNjb3BlS2luZDtcbiAgc2NvcGVJZD86IHN0cmluZztcbiAgYXQ/OiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0NvbnRleHQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uc0J5U2NvcGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb246IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgcmVzb3VyY2VHcmFudHM6IEFycmF5PHsgcmVzb3VyY2VJZDogc3RyaW5nOyBwZXJtaXNzaW9uS2V5OiBzdHJpbmcgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJhbmdvQXV0aENvbnRleHQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5OiBzdHJpbmc7XG4gIGFsbG93ZWRPcmdVbml0SWRzOiBzdHJpbmdbXTtcbiAgYWxsb3dlZFJlc291cmNlSWRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRZHJhbnRBdXRoRmlsdGVyIHtcbiAgbXVzdDogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBtdXN0X25vdD86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdG9yYWdlQmluZGluZ0lucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgc3RvcmFnZUtpbmQ6IFN0b3JhZ2VLaW5kO1xuICBiaW5kaW5nS2luZDogU3RvcmFnZUJpbmRpbmdLaW5kO1xuICBiaW5kaW5nS2V5OiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBQZXJtaXNzaW9uIHtcbiAga2V5OiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnk7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFJvbGUge1xuICBrZXk6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcGVybWlzc2lvbktleXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcE9yZ1VuaXQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHByb2ZpbGVLZXk/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNoaWxkcmVuPzogQm9vdHN0cmFwT3JnVW5pdFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFRlbXBsYXRlIHtcbiAgdGVuYW50OiBDcmVhdGVUZW5hbnRJbnB1dDtcbiAgcm9vdE9yZ1VuaXQ6IEJvb3RzdHJhcE9yZ1VuaXQ7XG4gIHBlcm1pc3Npb25zOiBCb290c3RyYXBQZXJtaXNzaW9uW107XG4gIHJvbGVzOiBCb290c3RyYXBSb2xlW107XG4gIG93bmVyVXNlcjogQ3JlYXRlVXNlcklucHV0O1xuICBvd25lclJvbGVLZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVNuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgb3JnVW5pdElkOiBzdHJpbmc7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHZpc2liaWxpdHk6IFJlc291cmNlVmlzaWJpbGl0eTtcbiAgb3duZXJQcmluY2lwYWxJZD86IHN0cmluZztcbiAgc2Vuc2l0aXZpdHk/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhbnRTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY3JlYXRlZEJ5UHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBzY29wZUtpbmQ6IFNjb3BlS2luZDtcbiAgc2NvcGVJZDogc3RyaW5nO1xuICBzb3VyY2VLaW5kOiBzdHJpbmc7XG4gIHNvdXJjZUlkOiBzdHJpbmc7XG4gIHN0YXJ0c0F0PzogRGF0ZTtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoekRhdGFTb3VyY2VzIHtcbiAgbG9hZFJlc291cmNlPzogKHRlbmFudElkOiBzdHJpbmcsIHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxSZXNvdXJjZVNuYXBzaG90IHwgdW5kZWZpbmVkPjtcbiAgbGlzdFJlc291cmNlR3JhbnRzPzogKHRlbmFudElkOiBzdHJpbmcsIHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxHcmFudFNuYXBzaG90W10+O1xuICBsaXN0UHJpbmNpcGFsR3JhbnRzPzogKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcpID0+IFByb21pc2U8R3JhbnRTbmFwc2hvdFtdPjtcbiAgbGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zPzogKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZ1xuICApID0+IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W10+O1xuICBsaXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT86IChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLFxuICAgIHNjb3BlSWQ6IHN0cmluZ1xuICApID0+IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W10+O1xufVxuIiwiaW1wb3J0IHsgQ2FzY2FkZSwgTW9kZWxTZXJ2aWNlLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEFjY2Vzc0NvbnRleHQsXG4gIEFyYW5nb0F1dGhDb250ZXh0LFxuICBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3QsXG4gIEdyYW50U25hcHNob3QsXG4gIFFkcmFudEF1dGhGaWx0ZXIsXG4gIFNjb3BlS2luZCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IFJFTF9SRVNUUklDVCA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLk5PTkUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVMX05VTExJRlkgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5OT05FLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IHRydWUsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVMX0NBU0NBREVfREVQRU5ERU5UID0ge1xuICB1cGRhdGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIG51bGxhYmxlOiBmYWxzZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUxfQ0FTQ0FERV9JTlNFUlRfVVBEQVRFID0ge1xuICB1cGRhdGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiBmYWxzZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFyYW5nb0NvbnRleHQob3B0aW9uczoge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5OiBzdHJpbmc7XG4gIGFsbG93ZWRPcmdVbml0SWRzOiBzdHJpbmdbXTtcbiAgYWxsb3dlZFJlc291cmNlSWRzOiBzdHJpbmdbXTtcbn0pOiBBcmFuZ29BdXRoQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgcHJpbmNpcGFsSWQ6IG9wdGlvbnMucHJpbmNpcGFsSWQsXG4gICAgcGVybWlzc2lvbktleTogb3B0aW9ucy5wZXJtaXNzaW9uS2V5LFxuICAgIGFsbG93ZWRPcmdVbml0SWRzOiBbLi4ub3B0aW9ucy5hbGxvd2VkT3JnVW5pdElkc10sXG4gICAgYWxsb3dlZFJlc291cmNlSWRzOiBbLi4ub3B0aW9ucy5hbGxvd2VkUmVzb3VyY2VJZHNdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRRZHJhbnRGaWx0ZXIob3B0aW9uczoge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5OiBzdHJpbmc7XG4gIGFsbG93ZWRPcmdVbml0SWRzOiBzdHJpbmdbXTtcbiAgYWxsb3dlZFJlc291cmNlSWRzOiBzdHJpbmdbXTtcbn0pOiBRZHJhbnRBdXRoRmlsdGVyIHtcbiAgcmV0dXJuIHtcbiAgICBtdXN0OiBbXG4gICAgICB7XG4gICAgICAgIGtleTogXCJ0ZW5hbnRfaWRcIixcbiAgICAgICAgbWF0Y2g6IHsgdmFsdWU6IG9wdGlvbnMudGVuYW50SWQgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNob3VsZDogW1xuICAgICAgICAgIHsga2V5OiBcIm9yZ191bml0X2lkXCIsIG1hdGNoOiB7IGFueTogb3B0aW9ucy5hbGxvd2VkT3JnVW5pdElkcyB9IH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiBcInByb3RlY3RlZF9yZXNvdXJjZV9pZFwiLFxuICAgICAgICAgICAgbWF0Y2g6IHsgYW55OiBvcHRpb25zLmFsbG93ZWRSZXNvdXJjZUlkcyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBrZXk6IFwib3duZXJfcHJpbmNpcGFsX2lkXCIsIG1hdGNoOiB7IHZhbHVlOiBvcHRpb25zLnByaW5jaXBhbElkIH0gfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2NvcGVLZXkoc2NvcGVLaW5kOiBTY29wZUtpbmQsIHNjb3BlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzY29wZUtpbmR9OiR7c2NvcGVJZH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm93SXNvKCk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXk8VD4odmFsdWU6IFRbXSB8IHVuZGVmaW5lZCk6IFRbXSB7XG4gIHJldHVybiB2YWx1ZSA/PyBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVUZW5hbnQocm93VGVuYW50OiB1bmtub3duLCB0ZW5hbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWxhdGlvbklkKHJvd1RlbmFudCBhcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZykgPT09IHRlbmFudElkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpb25NYXRjaChcbiAgdmFsdWU6IHVua25vd24sXG4gIHRhcmdldDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gcmVsYXRpb25JZCh2YWx1ZSBhcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZykgPT09IHRhcmdldFxuICAgIDogZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb3dlclNsdWcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgdmFsdWVcbiAgICAgIC50cmltKClcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIi1cIilcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csIFwiXCIpIHx8IFwiaXRlbVwiXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RpbWVWYWxpZChcbiAgYXQ6IERhdGUgfCB1bmRlZmluZWQsXG4gIHN0YXJ0c0F0PzogRGF0ZSxcbiAgZXhwaXJlc0F0PzogRGF0ZVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGluc3RhbnQgPSBhdCA/PyBuZXcgRGF0ZSgpO1xuICBpZiAoc3RhcnRzQXQgJiYgaW5zdGFudCA8IHN0YXJ0c0F0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChleHBpcmVzQXQgJiYgaW5zdGFudCA+IGV4cGlyZXNBdCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQWNjZXNzQ29udGV4dChvcHRpb25zOiB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3RbXTtcbiAgZ3JhbnRzOiBHcmFudFNuYXBzaG90W107XG59KTogQWNjZXNzQ29udGV4dCB7XG4gIGNvbnN0IHBlcm1pc3Npb25zQnlTY29wZTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIGNvbnN0IGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2Ygb3B0aW9ucy5wZXJtaXNzaW9ucykge1xuICAgIGNvbnN0IGtleSA9IHNjb3BlS2V5KHBlcm1pc3Npb24uc2NvcGVLaW5kLCBwZXJtaXNzaW9uLnNjb3BlSWQpO1xuICAgIHBlcm1pc3Npb25zQnlTY29wZVtrZXldID0gcGVybWlzc2lvbnNCeVNjb3BlW2tleV0gPz8gW107XG4gICAgcGVybWlzc2lvbnNCeVNjb3BlW2tleV0ucHVzaChwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkpO1xuICAgIGlmIChwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQpIHtcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0gPVxuICAgICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldID8/IFtdO1xuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XS5wdXNoKFxuICAgICAgICBwZXJtaXNzaW9uLnNjb3BlSWRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0ZW5hbnRJZDogb3B0aW9ucy50ZW5hbnRJZCxcbiAgICBwcmluY2lwYWxJZDogb3B0aW9ucy5wcmluY2lwYWxJZCxcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGUsXG4gICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb24sXG4gICAgcmVzb3VyY2VHcmFudHM6IG9wdGlvbnMuZ3JhbnRzLm1hcCgoZ3JhbnQpID0+ICh7XG4gICAgICByZXNvdXJjZUlkOiBncmFudC5yZXNvdXJjZUlkLFxuICAgICAgcGVybWlzc2lvbktleTogZ3JhbnQucGVybWlzc2lvbktleSxcbiAgICB9KSksXG4gIH07XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTW9kZWxTZXJ2aWNlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4gJiB7IGlkOiBzdHJpbmcgfSxcbj4gZXh0ZW5kcyBNb2RlbFNlcnZpY2U8TSwgUmVwb3NpdG9yeTxNLCBhbnk+PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF6ejogbmV3ICgpID0+IE0pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3TW9kZWw8VD4oY2xheno6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IGNsYXp6KCkgYXMgb2JqZWN0LCBkYXRhIGFzIG9iamVjdCkgYXMgVDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8uY3JlYXRlKE9iamVjdC5hc3NpZ24oe30gYXMgTSwgZGF0YSBhcyBvYmplY3QpLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9uZShkYXRhOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShkYXRhLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5SWQoaWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnJlYWQoaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlT25lKGlkOiBzdHJpbmcsIHBhdGNoOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQoaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLnJlcG8udXBkYXRlKE9iamVjdC5hc3NpZ24oZXhpc3RpbmcsIHBhdGNoKSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVCeUlkKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZXBvLmRlbGV0ZShpZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kT25lQnk8SyBleHRlbmRzIGtleW9mIE0gJiBzdHJpbmc+KFxuICAgIGtleTogSyxcbiAgICB2YWx1ZTogTVtLXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmZpbmRPbmVCeShrZXksIHZhbHVlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRNYW55Qnk8SyBleHRlbmRzIGtleW9mIE0gJiBzdHJpbmc+KFxuICAgIGtleTogSyxcbiAgICB2YWx1ZTogTVtLXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9cbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLndoZXJlKHsgW2tleV06IHZhbHVlIH0gYXMgYW55KVxuICAgICAgLmV4ZWN1dGUoLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0QWxsKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnNlbGVjdCgpLmV4ZWN1dGUoLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkKCk6IHN0cmluZyB7XG4gIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpb25JZCh2YWx1ZTogc3RyaW5nIHwgeyBpZDogc3RyaW5nIH0pOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS5pZDtcbn1cblxuZXhwb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yLCB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF1dGhvcml6YXRpb25Nb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhIGFzIG5ldmVyKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMsIE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuL3VzZXIubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50X21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFRlbmFudE1lbWJlcnNoaXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfdGVuYW50X21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVXNlciwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9tZW1iZXJzaGlwc191c2VyXCIpXG4gIEByZXF1aXJlZCgpXG4gIHVzZXIhOiBVc2VyIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucykgQGNvbHVtbigpIHN0YXR1cyE6IE1lbWJlcnNoaXBTdGF0dXM7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7XG4gIGNvbHVtbixcbiAgY3JlYXRlZEF0LFxuICBvbmVUb01hbnksXG4gIHBrLFxuICB0YWJsZSxcbiAgdW5pcXVlLFxuICB1cGRhdGVkQXQsXG4gIHV1aWQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwIH0gZnJvbSBcIi4vb3JnLXVuaXQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuXG5AdGFibGUoXCJ1c2Vyc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBVc2VyIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pXG4gIEB1dWlkKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQHVuaXF1ZSgpXG4gIEB0eXBlKFN0cmluZylcbiAgQGNvbHVtbigpXG4gIGVtYWlsPzogc3RyaW5nO1xuXG4gIEB1bmlxdWUoKVxuICBAdHlwZShTdHJpbmcpXG4gIEBjb2x1bW4oKVxuICBwaG9uZT86IHN0cmluZztcblxuICBAcmVxdWlyZWQoKVxuICBAdHlwZShTdHJpbmcpXG4gIEBjb2x1bW4oKVxuICBkaXNwbGF5TmFtZSE6IHN0cmluZztcblxuICBAb25lVG9NYW55KCgpID0+IFRlbmFudE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpXG4gIHRlbmFudE1lbWJlcnNoaXBzPzogVGVuYW50TWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG5cbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0TWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSlcbiAgb3JnVW5pdE1lbWJlcnNoaXBzPzogT3JnVW5pdE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vdXNlci5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9tZW1iZXJzaGlwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0TWVtYmVyc2hpcCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfbWVtYmVyc2hpcHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFVzZXIsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfbWVtYmVyc2hpcHNfdXNlclwiKVxuICBAcmVxdWlyZWQoKVxuICB1c2VyITogVXNlciB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMpIEBjb2x1bW4oKSBzdGF0dXMhOiBNZW1iZXJzaGlwU3RhdHVzO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5cbkB0YWJsZShcIm9yZ191bml0X2Nsb3N1cmVcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdENsb3N1cmUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX2Nsb3N1cmVfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX2Nsb3N1cmVfYW5jZXN0b3JcIilcbiAgQHJlcXVpcmVkKClcbiAgYW5jZXN0b3IhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfY2xvc3VyZV9kZXNjZW5kYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIGRlc2NlbmRhbnQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKE51bWJlcikgQGNvbHVtbigpIGRlcHRoITogbnVtYmVyO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgb25lVG9NYW55LCBwaywgdGFibGUsIHVuaXF1ZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5LCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5cbkB0YWJsZShcInBlcm1pc3Npb25zXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb24gZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEB1bmlxdWUoKSBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGtleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucykgQGNvbHVtbigpIGNhdGVnb3J5ITogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVQZXJtaXNzaW9uLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByb2xlUGVybWlzc2lvbnM/OiBSb2xlUGVybWlzc2lvbltdIHwgc3RyaW5nW107XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9yb2xlLm1vZGVsXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5AdGFibGUoXCJyb2xlX3Blcm1pc3Npb25zXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJvbGVQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFJvbGUsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX3Blcm1pc3Npb25zX3JvbGVcIilcbiAgQHJlcXVpcmVkKClcbiAgcm9sZSE6IFJvbGUgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUGVybWlzc2lvbiwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVfcGVybWlzc2lvbnNfcGVybWlzc2lvblwiKVxuICBAcmVxdWlyZWQoKVxuICBwZXJtaXNzaW9uITogUGVybWlzc2lvbiB8IHN0cmluZztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX05VTExJRlksIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvbiB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUm9sZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVzX3RlbmFudFwiKVxuICB0ZW5hbnQ/OiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkga2V5ITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIG5hbWUhOiBzdHJpbmc7XG4gIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlUGVybWlzc2lvbiwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcm9sZVBlcm1pc3Npb25zPzogUm9sZVBlcm1pc3Npb25bXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVBc3NpZ25tZW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBhc3NpZ25tZW50cz86IFJvbGVBc3NpZ25tZW50W10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNjb3BlS2luZCwgU2NvcGVLaW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4vcm9sZS5tb2RlbFwiO1xuXG5AdGFibGUoXCJyb2xlX2Fzc2lnbm1lbnRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJvbGVBc3NpZ25tZW50IGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVfYXNzaWdubWVudHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3ByaW5jaXBhbFwiKVxuICBAcmVxdWlyZWQoKVxuICBwcmluY2lwYWwhOiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUm9sZSwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVfYXNzaWdubWVudHNfcm9sZVwiKVxuICBAcmVxdWlyZWQoKVxuICByb2xlITogUm9sZSB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU2NvcGVLaW5kT3B0aW9ucykgQGNvbHVtbigpIHNjb3BlS2luZCE6IFNjb3BlS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzY29wZUlkITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKEJvb2xlYW4pIEBjb2x1bW4oKSBpbmhlcml0RG93biE6IGJvb2xlYW47XG4gIEBjb2x1bW4oKSBzdGFydHNBdD86IERhdGU7XG4gIEBjb2x1bW4oKSBleHBpcmVzQXQ/OiBEYXRlO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcbmltcG9ydCB7IFByb3RlY3RlZFJlc291cmNlIH0gZnJvbSBcIi4vcHJvdGVjdGVkLXJlc291cmNlLm1vZGVsXCI7XG5cbkB0YWJsZShcInJlc291cmNlX2dyYW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUdyYW50IGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByb3RlY3RlZFJlc291cmNlLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcmVzb3VyY2VfZ3JhbnRzX3Jlc291cmNlXCIpXG4gIEByZXF1aXJlZCgpXG4gIHJlc291cmNlITogUHJvdGVjdGVkUmVzb3VyY2UgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcmVzb3VyY2VfZ3JhbnRzX3ByaW5jaXBhbFwiKVxuICBAcmVxdWlyZWQoKVxuICBwcmluY2lwYWwhOiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcGVybWlzc2lvbktleSE6IHN0cmluZztcbiAgQGNvbHVtbigpIHN0YXJ0c0F0PzogRGF0ZTtcbiAgQGNvbHVtbigpIGV4cGlyZXNBdD86IERhdGU7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgY29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19jcmVhdGVkX2J5XCIpXG4gIGNyZWF0ZWRCeT86IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsS2luZCwgUHJpbmNpcGFsS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudCB9IGZyb20gXCIuL3JvbGUtYXNzaWdubWVudC5tb2RlbFwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudCB9IGZyb20gXCIuL3Jlc291cmNlLWdyYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInByaW5jaXBhbHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUHJpbmNpcGFsIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3ByaW5jaXBhbHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oUHJpbmNpcGFsS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBraW5kITogUHJpbmNpcGFsS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzdWJqZWN0SWQhOiBzdHJpbmc7XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZUFzc2lnbm1lbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJvbGVBc3NpZ25tZW50cz86IFJvbGVBc3NpZ25tZW50W10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBSZXNvdXJjZUdyYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByZXNvdXJjZUdyYW50cz86IFJlc291cmNlR3JhbnRbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfTlVMTElGWSwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVZpc2liaWxpdHksIFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnQgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJwcm90ZWN0ZWRfcmVzb3VyY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFByb3RlY3RlZFJlc291cmNlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Byb3RlY3RlZF9yZXNvdXJjZXNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJvdGVjdGVkX3Jlc291cmNlc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSByZXNvdXJjZVR5cGUhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVzb3VyY2VJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oUmVzb3VyY2VWaXNpYmlsaXR5T3B0aW9ucykgQGNvbHVtbigpIHZpc2liaWxpdHkhOiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcm90ZWN0ZWRfcmVzb3VyY2VzX293bmVyXCIpXG4gIG93bmVyPzogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNlbnNpdGl2aXR5Pzogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gUmVzb3VyY2VHcmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgZ3JhbnRzPzogUmVzb3VyY2VHcmFudFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnksIFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX05VTExJRlkgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5cbkB0YWJsZShcImluaGVyaXRhbmNlX2Jsb2Nrc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBJbmhlcml0YW5jZUJsb2NrIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2luaGVyaXRhbmNlX2Jsb2Nrc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19pbmhlcml0YW5jZV9ibG9ja3Nfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfaW5oZXJpdGFuY2VfYmxvY2tzX2Jsb2NrZWRfYW5jZXN0b3JcIilcbiAgYmxvY2tlZEZyb21BbmNlc3Rvcj86IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMpIEBjb2x1bW4oKSBwZXJtaXNzaW9uQ2F0ZWdvcnkhOiBQZXJtaXNzaW9uQ2F0ZWdvcnk7XG4gIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVhc29uPzogc3RyaW5nO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwIH0gZnJvbSBcIi4vb3JnLXVuaXQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmUgfSBmcm9tIFwiLi9vcmctdW5pdC1jbG9zdXJlLm1vZGVsXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbFwiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9jayB9IGZyb20gXCIuL2luaGVyaXRhbmNlLWJsb2NrLm1vZGVsXCI7XG5cbkB0YWJsZShcIm9yZ191bml0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0IGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ191bml0c190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfdW5pdHNfcGFyZW50XCIpXG4gIHBhcmVudD86IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgY2hpbGRyZW4/OiBPcmdVbml0W10gfCBzdHJpbmdbXTtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBhdGghOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0TWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVyc2hpcHM/OiBPcmdVbml0TWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUHJvdGVjdGVkUmVzb3VyY2UsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJlc291cmNlcz86IFByb3RlY3RlZFJlc291cmNlW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBJbmhlcml0YW5jZUJsb2NrLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBpbmhlcml0YW5jZUJsb2Nrcz86IEluaGVyaXRhbmNlQmxvY2tbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXRDbG9zdXJlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBhbmNlc3RvckxpbmtzPzogT3JnVW5pdENsb3N1cmVbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXRDbG9zdXJlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBkZXNjZW5kYW50TGlua3M/OiBPcmdVbml0Q2xvc3VyZVtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZ0tpbmQsIFN0b3JhZ2VCaW5kaW5nS2luZE9wdGlvbnMsIFN0b3JhZ2VLaW5kLCBTdG9yYWdlS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInN0b3JhZ2VfYmluZGluZ3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgU3RvcmFnZUJpbmRpbmcgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfc3RvcmFnZV9iaW5kaW5nc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihTdG9yYWdlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzdG9yYWdlS2luZCE6IFN0b3JhZ2VLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zKSBAY29sdW1uKCkgYmluZGluZ0tpbmQhOiBTdG9yYWdlQmluZGluZ0tpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgYmluZGluZ0tleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSByZWdpb24hOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7XG4gIGNvbHVtbixcbiAgY3JlYXRlZEF0LFxuICBvbmVUb01hbnksXG4gIHBrLFxuICB0YWJsZSxcbiAgdW5pcXVlLFxuICB1cGRhdGVkQXQsXG4gIHV1aWQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgbW9kZWwsXG4gIG9wdGlvbixcbiAgcmVxdWlyZWQsXG4gIHR5cGUgYXMgdHlwZU9mLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBJc29sYXRpb25UaWVyT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXAgfSBmcm9tIFwiLi90ZW5hbnQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZyB9IGZyb20gXCIuL3N0b3JhZ2UtYmluZGluZy5tb2RlbFwiO1xuXG5AdGFibGUoXCJ0ZW5hbnRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFRlbmFudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQHVuaXF1ZSgpIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2x1ZyE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKVxuICBAdHlwZU9mKFN0cmluZylcbiAgQG9wdGlvbihJc29sYXRpb25UaWVyT3B0aW9ucylcbiAgQGNvbHVtbigpXG4gIGlzb2xhdGlvblRpZXIhOiBJc29sYXRpb25UaWVyO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG9yZ1VuaXRzPzpcbiAgICB8IE9yZ1VuaXRbXVxuICAgIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gVGVuYW50TWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVyc2hpcHM/OlxuICAgIHwgVGVuYW50TWVtYmVyc2hpcFtdXG4gICAgfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBQcmluY2lwYWwsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHByaW5jaXBhbHM/OlxuICAgIHwgUHJpbmNpcGFsW11cbiAgICB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFN0b3JhZ2VCaW5kaW5nLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBzdG9yYWdlQmluZGluZ3M/OlxuICAgIHwgU3RvcmFnZUJpbmRpbmdbXVxuICAgIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50X3Byb2ZpbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFRlbmFudFByb2ZpbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfdGVuYW50X3Byb2ZpbGVzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcHJvZmlsZUtleSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5cbkB0YWJsZShcIm9yZ191bml0X3Byb2ZpbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRQcm9maWxlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfdW5pdF9wcm9maWxlc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwcm9maWxlS2V5ITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuL2dyb3VwLm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcblxuQHRhYmxlKFwiZ3JvdXBfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgR3JvdXBNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3VwX21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gR3JvdXAsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc19ncm91cFwiKVxuICBAcmVxdWlyZWQoKVxuICBncm91cCE6IEdyb3VwIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3VwX21lbWJlcnNoaXBzX3ByaW5jaXBhbFwiKVxuICBAcmVxdWlyZWQoKVxuICBwcmluY2lwYWwhOiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX05VTExJRlksIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IEdyb3VwTWVtYmVyc2hpcCB9IGZyb20gXCIuL2dyb3VwLW1lbWJlcnNoaXAubW9kZWxcIjtcblxuQHRhYmxlKFwiZ3JvdXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEdyb3VwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3Vwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3Vwc19vcmdfdW5pdFwiKVxuICBvcmdVbml0PzogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gR3JvdXBNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBtZW1iZXJzPzogR3JvdXBNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTY29wZUtpbmQsIFNjb3BlS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcblxuQHRhYmxlKFwiZWZmZWN0aXZlX3Blcm1pc3Npb25zXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEVmZmVjdGl2ZVBlcm1pc3Npb24gZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZWZmZWN0aXZlX3Blcm1pc3Npb25zX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZWZmZWN0aXZlX3Blcm1pc3Npb25zX3ByaW5jaXBhbFwiKVxuICBAcmVxdWlyZWQoKVxuICBwcmluY2lwYWwhOiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcGVybWlzc2lvbktleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU2NvcGVLaW5kT3B0aW9ucykgQGNvbHVtbigpIHNjb3BlS2luZCE6IFNjb3BlS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzY29wZUlkITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNvdXJjZUtpbmQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc291cmNlSWQhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKSBzdGFydHNBdD86IERhdGU7XG4gIEBjb2x1bW4oKSBleHBpcmVzQXQ/OiBEYXRlO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFRlbmFudFByb2ZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL3RlbmFudC1wcm9maWxlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW5hbnRQcm9maWxlU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8VGVuYW50UHJvZmlsZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihUZW5hbnRQcm9maWxlKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByb2ZpbGUoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcm9maWxlS2V5OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFRlbmFudFByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIHByb2ZpbGVLZXksXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvclRlbmFudChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8VGVuYW50UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocHJvZmlsZSkgPT5cbiAgICAgIHNhbWVUZW5hbnQocHJvZmlsZS50ZW5hbnQsIHRlbmFudElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RGb3JUZW5hbnQodGVuYW50SWQsIC4uLmFyZ3MpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1wcm9maWxlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0UHJvZmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRQcm9maWxlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRQcm9maWxlKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByb2ZpbGUoXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0UHJvZmlsZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgb3JnVW5pdDogb3JnVW5pdElkLFxuICAgICAgICBwcm9maWxlS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JPcmdVbml0KFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFByb2ZpbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByb2ZpbGUpID0+XG4gICAgICByZWxhdGlvbk1hdGNoKHByb2ZpbGUub3JnVW5pdCwgb3JnVW5pdElkKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbFNlcnZpY2UsXG4gIHJlbGF0aW9uSWQsXG4gIHJlbGF0aW9uTWF0Y2gsXG4gIHNhbWVUZW5hbnQsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmUgfSBmcm9tIFwiLi4vbW9kZWxzL29yZy11bml0LWNsb3N1cmUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRDbG9zdXJlU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8T3JnVW5pdENsb3N1cmU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoT3JnVW5pdENsb3N1cmUpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEFuY2VzdG9ycyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdENsb3N1cmVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHJvdykgPT5cbiAgICAgICAgICBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICAgIHJlbGF0aW9uTWF0Y2gocm93LmRlc2NlbmRhbnQsIG9yZ1VuaXRJZClcbiAgICAgIClcbiAgICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5kZXB0aCAtIHJpZ2h0LmRlcHRoKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3REZXNjZW5kYW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdENsb3N1cmVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHJvdykgPT5cbiAgICAgICAgICBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICAgIHJlbGF0aW9uTWF0Y2gocm93LmFuY2VzdG9yLCBvcmdVbml0SWQpXG4gICAgICApXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuZGVwdGggLSByaWdodC5kZXB0aCk7XG4gIH1cblxuICBhc3luYyBpc0FuY2VzdG9yT2YoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBhbmNlc3Rvck9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGRlc2NlbmRhbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgdGhpcy5saXN0QW5jZXN0b3JzKHRlbmFudElkLCBkZXNjZW5kYW50T3JnVW5pdElkLCAuLi5hcmdzKVxuICAgICkuc29tZSgocm93KSA9PiByZWxhdGlvbk1hdGNoKHJvdy5hbmNlc3RvciwgYW5jZXN0b3JPcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlbGZMaW5rKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0Q2xvc3VyZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgYW5jZXN0b3I6IG9yZ1VuaXRJZCxcbiAgICAgICAgZGVzY2VuZGFudDogb3JnVW5pdElkLFxuICAgICAgICBkZXB0aDogMCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFuY2VzdG9yTGlua3NGb3JOZXdDaGlsZChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHBhcmVudE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGNoaWxkT3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYW5jZXN0b3JMaW5rcyA9IGF3YWl0IHRoaXMubGlzdEFuY2VzdG9ycyhcbiAgICAgIHRlbmFudElkLFxuICAgICAgcGFyZW50T3JnVW5pdElkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGFuY2VzdG9yTGlua3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgICBhbmNlc3RvcjogbGluay5hbmNlc3RvcixcbiAgICAgICAgICBkZXNjZW5kYW50OiBjaGlsZE9yZ1VuaXRJZCxcbiAgICAgICAgICBkZXB0aDogbGluay5kZXB0aCArIDEsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlTGlua3NGb3JTdWJ0cmVlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3VidHJlZSA9IGF3YWl0IHRoaXMubGlzdERlc2NlbmRhbnRzKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGRlc2NlbmRhbnRJZHMgPSBuZXcgU2V0KFtcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIC4uLnN1YnRyZWUubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmRlc2NlbmRhbnQpKSxcbiAgICBdKTtcbiAgICBjb25zdCBhbmNlc3RvcklkcyA9IG5ldyBTZXQoW1xuICAgICAgb3JnVW5pdElkLFxuICAgICAgLi4uc3VidHJlZS5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuYW5jZXN0b3IpKSxcbiAgICBdKTtcbiAgICBjb25zdCByb3dzID0gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHJvdykgPT5cbiAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgKGRlc2NlbmRhbnRJZHMuaGFzKHJlbGF0aW9uSWQocm93LmRlc2NlbmRhbnQpKSB8fFxuICAgICAgICAgIGFuY2VzdG9ySWRzLmhhcyhyZWxhdGlvbklkKHJvdy5hbmNlc3RvcikpKVxuICAgICk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEluaGVyaXRhbmNlQmxvY2sgfSBmcm9tIFwiLi4vbW9kZWxzL2luaGVyaXRhbmNlLWJsb2NrLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBJbmhlcml0YW5jZUJsb2NrU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8SW5oZXJpdGFuY2VCbG9jaz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihJbmhlcml0YW5jZUJsb2NrKTtcbiAgfVxuXG4gIGFzeW5jIGJsb2NrQ2F0ZWdvcnkoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uQ2F0ZWdvcnk6IFBlcm1pc3Npb25DYXRlZ29yeSxcbiAgICBibG9ja2VkRnJvbUFuY2VzdG9ySWQ/OiBzdHJpbmcsXG4gICAgcmVhc29uPzogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8SW5oZXJpdGFuY2VCbG9jaz4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgb3JnVW5pdDogb3JnVW5pdElkLFxuICAgICAgICBibG9ja2VkRnJvbUFuY2VzdG9yOiBibG9ja2VkRnJvbUFuY2VzdG9ySWQsXG4gICAgICAgIHBlcm1pc3Npb25DYXRlZ29yeSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdW5ibG9ja0NhdGVnb3J5KGJsb2NrSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQoYmxvY2tJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yT3JnVW5pdChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8SW5oZXJpdGFuY2VCbG9ja1tdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChibG9jaykgPT5cbiAgICAgICAgc2FtZVRlbmFudChibG9jay50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICByZWxhdGlvbk1hdGNoKGJsb2NrLm9yZ1VuaXQsIG9yZ1VuaXRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBhbmNlc3Rvck9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RGb3JPcmdVbml0KHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKGJsb2NrKSA9PlxuICAgICAgICBibG9jay5wZXJtaXNzaW9uQ2F0ZWdvcnkgPT09IGNhdGVnb3J5ICYmXG4gICAgICAgICghYmxvY2suYmxvY2tlZEZyb21BbmNlc3RvciB8fFxuICAgICAgICAgIHJlbGF0aW9uTWF0Y2goYmxvY2suYmxvY2tlZEZyb21BbmNlc3RvciwgYW5jZXN0b3JPcmdVbml0SWQpKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IElzb2xhdGlvblRpZXIsIENyZWF0ZVRlbmFudElucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi4vbW9kZWxzL3RlbmFudC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50U2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8VGVuYW50PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFRlbmFudCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVUZW5hbnQoaW5wdXQ6IENyZWF0ZVRlbmFudElucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBzbHVnOiBpbnB1dC5zbHVnLFxuICAgICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAgICBpc29sYXRpb25UaWVyOiBpbnB1dC5pc29sYXRpb25UaWVyID8/IElzb2xhdGlvblRpZXIuUG9vbGVkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0QnlTbHVnKHNsdWc6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRPbmVCeShcInNsdWdcIiwgc2x1ZyBhcyBuZXZlciwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZW5hbWVUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHRlbmFudElkLCB7IG5hbWUgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBjaGFuZ2VTbHVnKHRlbmFudElkOiBzdHJpbmcsIHNsdWc6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh0ZW5hbnRJZCwgeyBzbHVnIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgc2V0SXNvbGF0aW9uVGllcihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGlzb2xhdGlvblRpZXI6IElzb2xhdGlvblRpZXIsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodGVuYW50SWQsIHsgaXNvbGF0aW9uVGllciB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVRlbmFudENvbnRyb2xsZWQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQodGVuYW50SWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBsb3dlclNsdWcsIHJlbGF0aW9uSWQsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQ3JlYXRlT3JnVW5pdElucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtcHJvZmlsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC1jbG9zdXJlLnNlcnZpY2VcIjtcbmltcG9ydCB7IHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUm93c0J5SWQoXG4gIHNlcnZpY2U6IEJhc2VNb2RlbFNlcnZpY2U8YW55PixcbiAgcm93czogQXJyYXk8eyBpZDogc3RyaW5nIH0+LFxuICAuLi5hcmdzOiBhbnlbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBhd2FpdCBzZXJ2aWNlLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3JnVW5pdFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXQ+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoT3JnVW5pdCk7XG4gIH1cblxuICBwcml2YXRlIG9yZ1VuaXRQYXRoKHBhcmVudFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbG93ZXJTbHVnKG5hbWUpO1xuICAgIHJldHVybiBwYXJlbnRQYXRoID8gYCR7cGFyZW50UGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfS8ke3NlZ21lbnR9YCA6IGAvJHtzZWdtZW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVByb2ZpbGVJZk5lZWRlZChcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBwcm9maWxlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZU1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXByb2ZpbGVLZXkpIHJldHVybjtcbiAgICBhd2FpdCBuZXcgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlKCkuY3JlYXRlUHJvZmlsZShvcmdVbml0SWQsIHByb2ZpbGVLZXksIHByb2ZpbGVNZXRhZGF0YSwgLi4uYXJncyk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIGNyZWF0ZVJvb3QoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwcm9maWxlS2V5Pzogc3RyaW5nLFxuICAgIHByb2ZpbGVNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdD4ge1xuICAgIGNvbnN0IG9yZ1VuaXQgPSBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF0aDogdGhpcy5vcmdVbml0UGF0aCh1bmRlZmluZWQsIG5hbWUpLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb2ZpbGVJZk5lZWRlZChvcmdVbml0LmlkLCBwcm9maWxlS2V5LCBwcm9maWxlTWV0YWRhdGEsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5jcmVhdGVTZWxmTGluayh0ZW5hbnRJZCwgb3JnVW5pdC5pZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIG9yZ1VuaXQ7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIGNyZWF0ZUNoaWxkKGlucHV0OiBDcmVhdGVPcmdVbml0SW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0PiB7XG4gICAgY29uc3QgcGFyZW50ID0gaW5wdXQucGFyZW50T3JnVW5pdElkID8gYXdhaXQgdGhpcy5nZXRCeUlkKGlucHV0LnBhcmVudE9yZ1VuaXRJZCwgLi4uYXJncykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3JnVW5pdCA9IGF3YWl0IHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBwYXJlbnQ6IHBhcmVudD8uaWQgPz8gaW5wdXQucGFyZW50T3JnVW5pdElkLFxuICAgICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAgICBwYXRoOiB0aGlzLm9yZ1VuaXRQYXRoKHBhcmVudD8ucGF0aCwgaW5wdXQubmFtZSksXG4gICAgICAgIG1ldGFkYXRhOiBpbnB1dC5tZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb2ZpbGVJZk5lZWRlZChvcmdVbml0LmlkLCBpbnB1dC5wcm9maWxlS2V5LCBpbnB1dC5wcm9maWxlTWV0YWRhdGEsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGNsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmNyZWF0ZVNlbGZMaW5rKGlucHV0LnRlbmFudElkLCBvcmdVbml0LmlkLCAuLi5hcmdzKTtcbiAgICBpZiAoaW5wdXQucGFyZW50T3JnVW5pdElkKSB7XG4gICAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5pbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICBpbnB1dC5wYXJlbnRPcmdVbml0SWQsXG4gICAgICAgIG9yZ1VuaXQuaWQsXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvcmdVbml0O1xuICB9XG5cbiAgYXN5bmMgbGlzdENoaWxkcmVuKHBhcmVudE9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT4gcmVsYXRpb25NYXRjaChvcmdVbml0LnBhcmVudCwgcGFyZW50T3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50T3JnVW5pdHModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+IHNhbWVUZW5hbnQob3JnVW5pdC50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0RGVzY2VuZGFudE9yZ1VuaXRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgaW5jbHVkZVNlbGYgPSBmYWxzZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gYXdhaXQgbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KGRlc2NlbmRhbnRzLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSkpO1xuICAgIGlmIChpbmNsdWRlU2VsZikgaWRzLmFkZChvcmdVbml0SWQpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0VGVuYW50T3JnVW5pdHModGVuYW50SWQsIC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+IGlkcy5oYXMob3JnVW5pdC5pZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEFuY2VzdG9yT3JnVW5pdHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBpbmNsdWRlU2VsZiA9IGZhbHNlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFtdPiB7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gYXdhaXQgbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpLmxpc3RBbmNlc3RvcnModGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgaWRzID0gbmV3IFNldChhbmNlc3RvcnMubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSkpO1xuICAgIGlmIChpbmNsdWRlU2VsZikgaWRzLmFkZChvcmdVbml0SWQpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0VGVuYW50T3JnVW5pdHModGVuYW50SWQsIC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+IGlkcy5oYXMob3JnVW5pdC5pZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVuYW1lT3JnVW5pdChvcmdVbml0SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5nZXRCeUlkKG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKFxuICAgICAgb3JnVW5pdElkLFxuICAgICAgeyBuYW1lLCBwYXRoOiB0aGlzLm9yZ1VuaXRQYXRoKGV4aXN0aW5nLnBhdGguaW5jbHVkZXMoXCIvXCIpID8gZXhpc3RpbmcucGF0aC5yZXBsYWNlKC9cXC9bXi9dKyQvLCBcIlwiKSA6IHVuZGVmaW5lZCwgbmFtZSkgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBtb3ZlT3JnVW5pdChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIG5ld1BhcmVudE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdD4ge1xuICAgIGNvbnN0IG5ld1BhcmVudCA9IGF3YWl0IHRoaXMuZ2V0QnlJZChuZXdQYXJlbnRPcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5nZXRCeUlkKG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMudXBkYXRlT25lKFxuICAgICAgb3JnVW5pdElkLFxuICAgICAge1xuICAgICAgICBwYXJlbnQ6IG5ld1BhcmVudC5pZCxcbiAgICAgICAgcGF0aDogdGhpcy5vcmdVbml0UGF0aChuZXdQYXJlbnQucGF0aCwgZXhpc3RpbmcubmFtZSksXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yZWJ1aWxkVGVuYW50Q2xvc3VyZSh0ZW5hbnRJZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYnVpbGRUZW5hbnRDbG9zdXJlKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xvc3VyZVNlcnZpY2UgPSBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCk7XG4gICAgY29uc3QgZXhpc3RpbmdMaW5rcyA9IGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmxpc3RBbGwoLi4uYXJncyk7XG4gICAgYXdhaXQgZGVsZXRlUm93c0J5SWQoXG4gICAgICBjbG9zdXJlU2VydmljZSxcbiAgICAgIGV4aXN0aW5nTGlua3MuZmlsdGVyKChyb3cpID0+IHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuXG4gICAgY29uc3Qgb3JnVW5pdHMgPSAoYXdhaXQgdGhpcy5saXN0VGVuYW50T3JnVW5pdHModGVuYW50SWQsIC4uLmFyZ3MpKS5zb3J0KChsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgY29uc3QgbGVmdERlcHRoID0gbGVmdC5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgcmlnaHREZXB0aCA9IHJpZ2h0LnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVmdERlcHRoIC0gcmlnaHREZXB0aDtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgb3JnVW5pdCBvZiBvcmdVbml0cykge1xuICAgICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuY3JlYXRlU2VsZkxpbmsodGVuYW50SWQsIG9yZ1VuaXQuaWQsIC4uLmFyZ3MpO1xuICAgICAgaWYgKG9yZ1VuaXQucGFyZW50KSB7XG4gICAgICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmluc2VydEFuY2VzdG9yTGlua3NGb3JOZXdDaGlsZChcbiAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICByZWxhdGlvbklkKG9yZ1VuaXQucGFyZW50KSxcbiAgICAgICAgICBvcmdVbml0LmlkLFxuICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIGRlbGV0ZU9yZ1VuaXRUcmVlKHRlbmFudElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gYXdhaXQgdGhpcy5saXN0RGVzY2VuZGFudE9yZ1VuaXRzKHRlbmFudElkLCBvcmdVbml0SWQsIHRydWUsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGRlc2NlbmRhbnRJZHMgPSBuZXcgU2V0KGRlc2NlbmRhbnRzLm1hcCgob3JnVW5pdCkgPT4gb3JnVW5pdC5pZCkpO1xuICAgIGNvbnN0IG9yZ1VuaXRzID0gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PlxuICAgICAgZGVzY2VuZGFudElkcy5oYXMob3JnVW5pdC5pZClcbiAgICApO1xuICAgIGF3YWl0IGRlbGV0ZVJvd3NCeUlkKHRoaXMsIG9yZ1VuaXRzLCAuLi5hcmdzKTtcbiAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5kZWxldGVMaW5rc0ZvclN1YnRyZWUodGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENyZWF0ZVVzZXJJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuLi9tb2RlbHMvdXNlci5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVXNlclNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFVzZXI+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVXNlcik7XG4gIH1cblxuICBhc3luYyBjcmVhdGVVc2VyKGlucHV0OiBDcmVhdGVVc2VySW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBlbWFpbDogaW5wdXQuZW1haWwsXG4gICAgICAgIHBob25lOiBpbnB1dC5waG9uZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IGlucHV0LmRpc3BsYXlOYW1lLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0QnlFbWFpbChlbWFpbDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKCh1c2VyKSA9PiB1c2VyLmVtYWlsID09PSBlbWFpbCkgYXMgVXNlcjtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURpc3BsYXlOYW1lKHVzZXJJZDogc3RyaW5nLCBkaXNwbGF5TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh1c2VySWQsIHsgZGlzcGxheU5hbWUgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVFbWFpbCh1c2VySWQ6IHN0cmluZywgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodXNlcklkLCB7IGVtYWlsIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlUGhvbmUodXNlcklkOiBzdHJpbmcsIHBob25lOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHVzZXJJZCwgeyBwaG9uZSB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUHJpbmNpcGFsS2luZCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4uL21vZGVscy9wcmluY2lwYWwubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFByaW5jaXBhbFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFByaW5jaXBhbD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihQcmluY2lwYWwpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJpbmNpcGFsKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAga2luZDogUHJpbmNpcGFsS2luZCxcbiAgICBzdWJqZWN0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAga2luZCxcbiAgICAgICAgc3ViamVjdElkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rm9yU3ViamVjdChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGtpbmQ6IFByaW5jaXBhbEtpbmQsXG4gICAgc3ViamVjdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxQcmluY2lwYWwgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZChcbiAgICAgIChwcmluY2lwYWwpID0+XG4gICAgICAgIHNhbWVUZW5hbnQocHJpbmNpcGFsLnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIHByaW5jaXBhbC5raW5kID09PSBraW5kICYmXG4gICAgICAgIHByaW5jaXBhbC5zdWJqZWN0SWQgPT09IHN1YmplY3RJZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRPckNyZWF0ZUZvclN1YmplY3QoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBraW5kOiBQcmluY2lwYWxLaW5kLFxuICAgIHN1YmplY3RJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UHJpbmNpcGFsPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldEZvclN1YmplY3QodGVuYW50SWQsIGtpbmQsIHN1YmplY3RJZCwgLi4uYXJncykpID8/IChhd2FpdCB0aGlzLmNyZWF0ZVByaW5jaXBhbCh0ZW5hbnRJZCwga2luZCwgc3ViamVjdElkLCAuLi5hcmdzKSk7XG4gIH1cblxuICBhc3luYyBnZXRVc2VyUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJpbmNpcGFsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KHRlbmFudElkLCBQcmluY2lwYWxLaW5kLlVzZXIsIHVzZXJJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBnZXRHcm91cFByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcmluY2lwYWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRPckNyZWF0ZUZvclN1YmplY3QodGVuYW50SWQsIFByaW5jaXBhbEtpbmQuR3JvdXAsIGdyb3VwSWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudE1lbWJlcnNoaXA+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVGVuYW50TWVtYmVyc2hpcCk7XG4gIH1cblxuICBhc3luYyBhZGRVc2VyVG9UZW5hbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMgPSBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFRlbmFudE1lbWJlcnNoaXA+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0U3RhdHVzKG1lbWJlcnNoaXBJZDogc3RyaW5nLCBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKG1lbWJlcnNoaXBJZCwgeyBzdGF0dXMgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0VXNlclRlbmFudHModXNlcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAudXNlciwgdXNlcklkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50VXNlcnModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHNhbWVUZW5hbnQobWVtYmVyc2hpcC50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVVc2VyRnJvbVRlbmFudChtZW1iZXJzaGlwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQobWVtYmVyc2hpcElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgT3JnVW5pdE1lbWJlcnNoaXAgfSBmcm9tIFwiLi4vbW9kZWxzL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8T3JnVW5pdE1lbWJlcnNoaXA+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoT3JnVW5pdE1lbWJlcnNoaXApO1xuICB9XG5cbiAgYXN5bmMgYWRkVXNlclRvT3JnVW5pdChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHN0YXR1czogTWVtYmVyc2hpcFN0YXR1cyA9IE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdE1lbWJlcnNoaXA+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBzZXRTdGF0dXMobWVtYmVyc2hpcElkOiBzdHJpbmcsIHN0YXR1czogTWVtYmVyc2hpcFN0YXR1cywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKG1lbWJlcnNoaXBJZCwgeyBzdGF0dXMgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0VXNlck9yZ1VuaXRzKHVzZXJJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC51c2VyLCB1c2VySWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RPcmdVbml0VXNlcnMob3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0TWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLm9yZ1VuaXQsIG9yZ1VuaXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlVXNlckZyb21PcmdVbml0KG1lbWJlcnNoaXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChtZW1iZXJzaGlwSWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuLi9tb2RlbHMvZ3JvdXAubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIEdyb3VwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8R3JvdXA+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoR3JvdXApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlR3JvdXAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkPzogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxHcm91cD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgb3JnVW5pdDogb3JnVW5pdElkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZUdyb3VwKGdyb3VwSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoZ3JvdXBJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbW92ZUdyb3VwVG9PcmdVbml0KGdyb3VwSWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShncm91cElkLCB7IG9yZ1VuaXQ6IG9yZ1VuaXRJZCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRHcm91cHModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChncm91cCkgPT4gc2FtZVRlbmFudChncm91cC50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uSWQsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdyb3VwTWVtYmVyc2hpcCB9IGZyb20gXCIuLi9tb2RlbHMvZ3JvdXAtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxHcm91cE1lbWJlcnNoaXA+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoR3JvdXBNZW1iZXJzaGlwKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFByaW5jaXBhbFRvR3JvdXAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBncm91cElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8R3JvdXBNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBncm91cDogZ3JvdXBJZCxcbiAgICAgICAgcHJpbmNpcGFsOiBwcmluY2lwYWxJZCxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0R3JvdXBNZW1iZXJzKGdyb3VwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwTWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLmdyb3VwLCBncm91cElkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5wcmluY2lwYWwsIHByaW5jaXBhbElkKSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVQcmluY2lwYWxGcm9tR3JvdXAobWVtYmVyc2hpcElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKG1lbWJlcnNoaXBJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlR3JvdXBQcmluY2lwYWxJZHNGb3JQcmluY2lwYWwocHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCB0aGlzLmxpc3RQcmluY2lwYWxHcm91cHMocHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHByaW5jaXBhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1lbWJlcnNoaXBzLm1hcChhc3luYyAobWVtYmVyc2hpcCkgPT4ge1xuICAgICAgICBjb25zdCB0ZW5hbnRJZCA9IHJlbGF0aW9uSWQobWVtYmVyc2hpcC50ZW5hbnQpO1xuICAgICAgICBjb25zdCBncm91cElkID0gcmVsYXRpb25JZChtZW1iZXJzaGlwLmdyb3VwKTtcbiAgICAgICAgY29uc3QgcHJpbmNpcGFsID0gYXdhaXQgcHJpbmNpcGFsU2VydmljZS5nZXRHcm91cFByaW5jaXBhbCh0ZW5hbnRJZCwgZ3JvdXBJZCwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBwcmluY2lwYWwuaWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHByaW5jaXBhbHM7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSwgQ3JlYXRlUGVybWlzc2lvbklucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL21vZGVscy9wZXJtaXNzaW9uLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8UGVybWlzc2lvbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVBlcm1pc3Npb24oaW5wdXQ6IENyZWF0ZVBlcm1pc3Npb25JbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIGtleTogaW5wdXQua2V5LFxuICAgICAgICBjYXRlZ29yeTogaW5wdXQuY2F0ZWdvcnksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpbnB1dC5kZXNjcmlwdGlvbixcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5S2V5KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UGVybWlzc2lvbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLmtleSA9PT0ga2V5KSBhcyBQZXJtaXNzaW9uO1xuICB9XG5cbiAgYXN5bmMgbGlzdEJ5Q2F0ZWdvcnkoY2F0ZWdvcnk6IFBlcm1pc3Npb25DYXRlZ29yeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24uY2F0ZWdvcnkgPT09IGNhdGVnb3J5KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURlc2NyaXB0aW9uKHBlcm1pc3Npb25JZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UGVybWlzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwZXJtaXNzaW9uSWQsIHsgZGVzY3JpcHRpb24gfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENyZWF0ZVJvbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuLi9tb2RlbHMvcm9sZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUm9sZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJvbGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUm9sZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVSb2xlKGlucHV0OiBDcmVhdGVSb2xlSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBrZXk6IGlucHV0LmtleSxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGlucHV0LmRlc2NyaXB0aW9uLFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRTeXN0ZW1Sb2xlQnlLZXkoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgY29uc3Qgcm9sZSA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoKGNhbmRpZGF0ZSkgPT4gIWNhbmRpZGF0ZS50ZW5hbnQgJiYgY2FuZGlkYXRlLmtleSA9PT0ga2V5KTtcbiAgICBpZiAoIXJvbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm9sZSBcIiR7a2V5fVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIGFzeW5jIGdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZDogc3RyaW5nLCBrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGU+IHtcbiAgICBjb25zdCByb2xlID0gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IHNhbWVUZW5hbnQoY2FuZGlkYXRlLnRlbmFudCwgdGVuYW50SWQpICYmIGNhbmRpZGF0ZS5rZXkgPT09IGtleVxuICAgICk7XG4gICAgaWYgKCFyb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvbGUgXCIke2tleX1cIiBub3QgZm91bmQgZm9yIHRlbmFudCAke3RlbmFudElkfWApO1xuICAgIH1cbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZVJvbGUocm9sZUlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocm9sZUlkLCB7IG5hbWUgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVSb2xlTWV0YWRhdGEoXG4gICAgcm9sZUlkOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShyb2xlSWQsIHsgbWV0YWRhdGEgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50Um9sZXModGVuYW50SWQ6IHN0cmluZywgaW5jbHVkZVN5c3RlbSA9IGZhbHNlLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocm9sZSkgPT5cbiAgICAgIGluY2x1ZGVTeXN0ZW0gPyAhcm9sZS50ZW5hbnQgfHwgc2FtZVRlbmFudChyb2xlLnRlbmFudCwgdGVuYW50SWQpIDogc2FtZVRlbmFudChyb2xlLnRlbmFudCwgdGVuYW50SWQpXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb24gfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUtcGVybWlzc2lvbi5tb2RlbFwiO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS5zZXJ2aWNlXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJvd3NCeUlkKFxuICBzZXJ2aWNlOiBCYXNlTW9kZWxTZXJ2aWNlPGFueT4sXG4gIHJvd3M6IEFycmF5PHsgaWQ6IHN0cmluZyB9PixcbiAgLi4uYXJnczogYW55W11cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgYXdhaXQgc2VydmljZS5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJvbGVQZXJtaXNzaW9uU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUm9sZVBlcm1pc3Npb24pO1xuICB9XG5cbiAgYXN5bmMgYWRkUGVybWlzc2lvblRvUm9sZShyb2xlSWQ6IHN0cmluZywgcGVybWlzc2lvbklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlUGVybWlzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgcm9sZTogcm9sZUlkLFxuICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uSWQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBhZGRQZXJtaXNzaW9uS2V5VG9Sb2xlKHJvbGVJZDogc3RyaW5nLCBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlUGVybWlzc2lvbj4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb24gPSBhd2FpdCBuZXcgUGVybWlzc2lvblNlcnZpY2UoKS5nZXRCeUtleShwZXJtaXNzaW9uS2V5LCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGRQZXJtaXNzaW9uVG9Sb2xlKHJvbGVJZCwgcGVybWlzc2lvbi5pZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZW1vdmVQZXJtaXNzaW9uRnJvbVJvbGUocm9sZVBlcm1pc3Npb25JZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb2xlUGVybWlzc2lvbklkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlUGVybWlzc2lvbltdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocm9sZVBlcm1pc3Npb24pID0+IHJlbGF0aW9uTWF0Y2gocm9sZVBlcm1pc3Npb24ucm9sZSwgcm9sZUlkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UGVybWlzc2lvblJvbGVzKHBlcm1pc3Npb25JZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGVQZXJtaXNzaW9uKSA9PiByZWxhdGlvbk1hdGNoKHJvbGVQZXJtaXNzaW9uLnBlcm1pc3Npb24sIHBlcm1pc3Npb25JZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVwbGFjZVJvbGVQZXJtaXNzaW9ucyhyb2xlSWQ6IHN0cmluZywgcGVybWlzc2lvbklkczogc3RyaW5nW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlUGVybWlzc2lvbltdPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmxpc3RSb2xlUGVybWlzc2lvbnMocm9sZUlkLCAuLi5hcmdzKTtcbiAgICBhd2FpdCBkZWxldGVSb3dzQnlJZCh0aGlzLCBleGlzdGluZywgLi4uYXJncyk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHBlcm1pc3Npb25JZHMubWFwKChwZXJtaXNzaW9uSWQpID0+IHRoaXMuYWRkUGVybWlzc2lvblRvUm9sZShyb2xlSWQsIHBlcm1pc3Npb25JZCwgLi4uYXJncykpKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJvbGVXaXRoUGVybWlzc2lvbnMoXG4gICAgaW5wdXQ6IGltcG9ydChcIi4uL3R5cGVzXCIpLkNyZWF0ZVJvbGVJbnB1dCxcbiAgICBwZXJtaXNzaW9uS2V5czogc3RyaW5nW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxpbXBvcnQoXCIuLi9tb2RlbHMvcm9sZS5tb2RlbFwiKS5Sb2xlPiB7XG4gICAgY29uc3Qgcm9sZSA9IGF3YWl0IG5ldyBSb2xlU2VydmljZSgpLmNyZWF0ZVJvbGUoaW5wdXQsIC4uLmFyZ3MpO1xuICAgIGZvciAoY29uc3QgcGVybWlzc2lvbktleSBvZiBwZXJtaXNzaW9uS2V5cykge1xuICAgICAgYXdhaXQgdGhpcy5hZGRQZXJtaXNzaW9uS2V5VG9Sb2xlKHJvbGUuaWQsIHBlcm1pc3Npb25LZXksIC4uLmFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcm9sZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXNzaWduUm9sZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudCB9IGZyb20gXCIuLi9tb2RlbHMvcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJvbGVBc3NpZ25tZW50PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGVBc3NpZ25tZW50KTtcbiAgfVxuXG4gIGFzeW5jIGFzc2lnblJvbGUoXG4gICAgaW5wdXQ6IEFzc2lnblJvbGVJbnB1dCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGVBc3NpZ25tZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBwcmluY2lwYWw6IGlucHV0LnByaW5jaXBhbElkLFxuICAgICAgICByb2xlOiBpbnB1dC5yb2xlSWQsXG4gICAgICAgIHNjb3BlS2luZDogaW5wdXQuc2NvcGVLaW5kLFxuICAgICAgICBzY29wZUlkOiBpbnB1dC5zY29wZUlkLFxuICAgICAgICBpbmhlcml0RG93bjogaW5wdXQuaW5oZXJpdERvd24gPz8gZmFsc2UsXG4gICAgICAgIHN0YXJ0c0F0OiBpbnB1dC5zdGFydHNBdCxcbiAgICAgICAgZXhwaXJlc0F0OiBpbnB1dC5leHBpcmVzQXQsXG4gICAgICAgIGNvbmRpdGlvbnM6IGlucHV0LmNvbmRpdGlvbnMsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZXZva2VBc3NpZ25tZW50KGFzc2lnbm1lbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChhc3NpZ25tZW50SWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGVBc3NpZ25tZW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKGFzc2lnbm1lbnQpID0+XG4gICAgICAgIHNhbWVUZW5hbnQoYXNzaWdubWVudC50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICByZWxhdGlvbk1hdGNoKGFzc2lnbm1lbnQucHJpbmNpcGFsLCBwcmluY2lwYWxJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJvbGVBc3NpZ25tZW50cyhcbiAgICByb2xlSWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGVBc3NpZ25tZW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChhc3NpZ25tZW50KSA9PlxuICAgICAgcmVsYXRpb25NYXRjaChhc3NpZ25tZW50LnJvbGUsIHJvbGVJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudEFzc2lnbm1lbnRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYXNzaWdubWVudCkgPT5cbiAgICAgIHNhbWVUZW5hbnQoYXNzaWdubWVudC50ZW5hbnQsIHRlbmFudElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBc3NpZ25tZW50V2luZG93KFxuICAgIGFzc2lnbm1lbnRJZDogc3RyaW5nLFxuICAgIHN0YXJ0c0F0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICAgIGV4cGlyZXNBdDogRGF0ZSB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGVBc3NpZ25tZW50PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGFzc2lnbm1lbnRJZCwgeyBzdGFydHNBdCwgZXhwaXJlc0F0IH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50LCB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3QsIFNjb3BlS2luZCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvbiB9IGZyb20gXCIuLi9tb2RlbHMvZWZmZWN0aXZlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50U2VydmljZSB9IGZyb20gXCIuL3JvbGUtYXNzaWdubWVudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEdyb3VwTWVtYmVyc2hpcFNlcnZpY2UgfSBmcm9tIFwiLi9ncm91cC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrU2VydmljZSB9IGZyb20gXCIuL2luaGVyaXRhbmNlLWJsb2NrLnNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxFZmZlY3RpdmVQZXJtaXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVmZmVjdGl2ZVBlcm1pc3Npb24pO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvbltdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkgJiYgcmVsYXRpb25NYXRjaChwZXJtaXNzaW9uLnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JTY29wZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLFxuICAgIHNjb3BlSWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpICYmIHBlcm1pc3Npb24uc2NvcGVLaW5kID09PSBzY29wZUtpbmQgJiYgcGVybWlzc2lvbi5zY29wZUlkID09PSBzY29wZUlkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGhhc1Blcm1pc3Npb24oXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmcsXG4gICAgYXQ/OiBEYXRlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0Rm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpLnNvbWUoXG4gICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgIHBlcm1pc3Npb24uc2NvcGVLaW5kID09PSBzY29wZUtpbmQgJiZcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUlkID09PSBzY29wZUlkICYmXG4gICAgICAgICghcGVybWlzc2lvbi5zdGFydHNBdCB8fCAhYXQgfHwgcGVybWlzc2lvbi5zdGFydHNBdCA8PSBhdCkgJiZcbiAgICAgICAgKCFwZXJtaXNzaW9uLmV4cGlyZXNBdCB8fCAhYXQgfHwgcGVybWlzc2lvbi5leHBpcmVzQXQgPj0gYXQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZvclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGF3YWl0IHRoaXMubGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvbltdPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcblxuICAgIGNvbnN0IHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgICBjb25zdCByb2xlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgUm9sZVBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gICAgY29uc3QgcGVybWlzc2lvblNlcnZpY2UgPSBuZXcgUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgICBjb25zdCBncm91cE1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IEdyb3VwTWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgICBjb25zdCBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgICBjb25zdCBvcmdVbml0Q2xvc3VyZVNlcnZpY2UgPSBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCk7XG4gICAgY29uc3QgaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgPSBuZXcgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UoKTtcblxuICAgIGNvbnN0IG1hdGVyaWFsaXplZDogRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W10gPSBbXTtcbiAgICBjb25zdCBzb3VyY2VBc3NpZ25tZW50cyA9IGF3YWl0IHJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBncm91cE1lbWJlcnNoaXBzID0gYXdhaXQgZ3JvdXBNZW1iZXJzaGlwU2VydmljZS5saXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBncm91cEFzc2lnbm1lbnRzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGdyb3VwTWVtYmVyc2hpcHMubWFwKGFzeW5jIChtZW1iZXJzaGlwKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBQcmluY2lwYWwgPSBhd2FpdCBwcmluY2lwYWxTZXJ2aWNlLmdldEdyb3VwUHJpbmNpcGFsKHJlbGF0aW9uSWQobWVtYmVyc2hpcC50ZW5hbnQpLCByZWxhdGlvbklkKG1lbWJlcnNoaXAuZ3JvdXApLCAuLi5hcmdzKTtcbiAgICAgICAgICByZXR1cm4gcm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyh0ZW5hbnRJZCwgZ3JvdXBQcmluY2lwYWwuaWQsIC4uLmFyZ3MpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICkuZmxhdCgpO1xuXG4gICAgY29uc3QgYXNzaWdubWVudHMgPSBbLi4uc291cmNlQXNzaWdubWVudHMsIC4uLmdyb3VwQXNzaWdubWVudHNdO1xuICAgIGZvciAoY29uc3QgYXNzaWdubWVudCBvZiBhc3NpZ25tZW50cykge1xuICAgICAgY29uc3Qgcm9sZVBlcm1pc3Npb25zID0gYXdhaXQgcm9sZVBlcm1pc3Npb25TZXJ2aWNlLmxpc3RSb2xlUGVybWlzc2lvbnMocmVsYXRpb25JZChhc3NpZ25tZW50LnJvbGUpLCAuLi5hcmdzKTtcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJvbGVQZXJtaXNzaW9ucy5tYXAoYXN5bmMgKHJvbGVQZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb25TZXJ2aWNlLmZpbmRPbmVCeShcImlkXCIsIHJlbGF0aW9uSWQocm9sZVBlcm1pc3Npb24ucGVybWlzc2lvbikgYXMgbmV2ZXIsIC4uLmFyZ3MpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKCFwZXJtaXNzaW9uKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgc2NvcGVLaW5kID0gYXNzaWdubWVudC5zY29wZUtpbmQ7XG4gICAgICAgIGNvbnN0IHNjb3BlSWQgPSBhc3NpZ25tZW50LnNjb3BlSWQ7XG4gICAgICAgIGNvbnN0IHNjb3BlczogQXJyYXk8eyBzY29wZUtpbmQ6IFNjb3BlS2luZDsgc2NvcGVJZDogc3RyaW5nIH0+ID0gW107XG4gICAgICAgIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5UZW5hbnQpIHtcbiAgICAgICAgICBzY29wZXMucHVzaCh7IHNjb3BlS2luZCwgc2NvcGVJZDogdGVuYW50SWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuUmVzb3VyY2UpIHtcbiAgICAgICAgICBzY29wZXMucHVzaCh7IHNjb3BlS2luZCwgc2NvcGVJZCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0ICYmICFhc3NpZ25tZW50LmluaGVyaXREb3duKSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiBhc3NpZ25tZW50LmluaGVyaXREb3duKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSBhd2FpdCBvcmdVbml0Q2xvc3VyZVNlcnZpY2UubGlzdERlc2NlbmRhbnRzKHRlbmFudElkLCBzY29wZUlkLCAuLi5hcmdzKTtcbiAgICAgICAgICBzY29wZXMucHVzaCguLi5kZXNjZW5kYW50cy5tYXAoKHJvdykgPT4gKHsgc2NvcGVLaW5kLCBzY29wZUlkOiByZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSB9KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzY29wZWQgb2Ygc2NvcGVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJlxuICAgICAgICAgICAgYXNzaWdubWVudC5pbmhlcml0RG93biAmJlxuICAgICAgICAgICAgc2NvcGVkLnNjb3BlSWQgIT09IHNjb3BlSWQgJiZcbiAgICAgICAgICAgIChhd2FpdCBpbmhlcml0YW5jZUJsb2NrU2VydmljZS5jYXRlZ29yeUJsb2NrZWRGb3JBbmNlc3RvcihcbiAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgIHNjb3BlZC5zY29wZUlkLFxuICAgICAgICAgICAgICBzY29wZUlkLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uLmNhdGVnb3J5LFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hdGVyaWFsaXplZC5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBcIlwiLFxuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25LZXk6IHBlcm1pc3Npb24ua2V5LFxuICAgICAgICAgICAgc2NvcGVLaW5kOiBzY29wZWQuc2NvcGVLaW5kLFxuICAgICAgICAgICAgc2NvcGVJZDogc2NvcGVkLnNjb3BlSWQsXG4gICAgICAgICAgICBzb3VyY2VLaW5kOiBcInJvbGVfYXNzaWdubWVudFwiLFxuICAgICAgICAgICAgc291cmNlSWQ6IGFzc2lnbm1lbnQuaWQsXG4gICAgICAgICAgICBzdGFydHNBdDogYXNzaWdubWVudC5zdGFydHNBdCxcbiAgICAgICAgICAgIGV4cGlyZXNBdDogYXNzaWdubWVudC5leHBpcmVzQXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYXRlcmlhbGl6ZWQubWFwKChwZXJtaXNzaW9uKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZW5hbnQ6IHBlcm1pc3Npb24udGVuYW50SWQsXG4gICAgICAgICAgICBwcmluY2lwYWw6IHBlcm1pc3Npb24ucHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uS2V5OiBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXksXG4gICAgICAgICAgICBzY29wZUtpbmQ6IHBlcm1pc3Npb24uc2NvcGVLaW5kLFxuICAgICAgICAgICAgc2NvcGVJZDogcGVybWlzc2lvbi5zY29wZUlkLFxuICAgICAgICAgICAgc291cmNlS2luZDogcGVybWlzc2lvbi5zb3VyY2VLaW5kLFxuICAgICAgICAgICAgc291cmNlSWQ6IHBlcm1pc3Npb24uc291cmNlSWQsXG4gICAgICAgICAgICBzdGFydHNBdDogcGVybWlzc2lvbi5zdGFydHNBdCxcbiAgICAgICAgICAgIGV4cGlyZXNBdDogcGVybWlzc2lvbi5leHBpcmVzQXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChhd2FpdCBuZXcgUHJpbmNpcGFsU2VydmljZSgpLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocHJpbmNpcGFsKSA9PiBzYW1lVGVuYW50KHByaW5jaXBhbC50ZW5hbnQsIHRlbmFudElkKSk7XG4gICAgZm9yIChjb25zdCBwcmluY2lwYWwgb2YgcHJpbmNpcGFscykge1xuICAgICAgYXdhaXQgdGhpcy5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWwuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUmVnaXN0ZXJSZXNvdXJjZUlucHV0LCBSZXNvdXJjZVZpc2liaWxpdHkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFByb3RlY3RlZFJlc291cmNlIH0gZnJvbSBcIi4uL21vZGVscy9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFByb3RlY3RlZFJlc291cmNlU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8UHJvdGVjdGVkUmVzb3VyY2U+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJvdGVjdGVkUmVzb3VyY2UpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJSZXNvdXJjZShpbnB1dDogUmVnaXN0ZXJSZXNvdXJjZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2U+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IGlucHV0Lm9yZ1VuaXRJZCxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiBpbnB1dC5yZXNvdXJjZVR5cGUsXG4gICAgICAgIHJlc291cmNlSWQ6IGlucHV0LnJlc291cmNlSWQsXG4gICAgICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHksXG4gICAgICAgIG93bmVyOiBpbnB1dC5vd25lclByaW5jaXBhbElkLFxuICAgICAgICBzZW5zaXRpdml0eTogaW5wdXQuc2Vuc2l0aXZpdHksXG4gICAgICAgIG1ldGFkYXRhOiBpbnB1dC5tZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5RG9tYWluUmVzb3VyY2UodGVuYW50SWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAocmVzb3VyY2UpID0+IHNhbWVUZW5hbnQocmVzb3VyY2UudGVuYW50LCB0ZW5hbnRJZCkgJiYgcmVzb3VyY2UucmVzb3VyY2VUeXBlID09PSByZXNvdXJjZVR5cGUgJiYgcmVzb3VyY2UucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VJZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBtb3ZlUmVzb3VyY2VUb09yZ1VuaXQocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHByb3RlY3RlZFJlc291cmNlSWQsIHsgb3JnVW5pdDogb3JnVW5pdElkIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgc2V0VmlzaWJpbGl0eShwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIHZpc2liaWxpdHk6IFJlc291cmNlVmlzaWJpbGl0eSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHByb3RlY3RlZFJlc291cmNlSWQsIHsgdmlzaWJpbGl0eSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHRyYW5zZmVyT3duZXJzaGlwKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgb3duZXJQcmluY2lwYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2U+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocHJvdGVjdGVkUmVzb3VyY2VJZCwgeyBvd25lcjogb3duZXJQcmluY2lwYWxJZCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RPcmdVbml0UmVzb3VyY2VzKG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2VbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJlc291cmNlKSA9PiByZWxhdGlvbk1hdGNoKHJlc291cmNlLm9yZ1VuaXQsIG9yZ1VuaXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFJlc291cmNlcyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2VbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJlc291cmNlKSA9PiBzYW1lVGVuYW50KHJlc291cmNlLnRlbmFudCwgdGVuYW50SWQpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgR3JhbnRSZXNvdXJjZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50IH0gZnJvbSBcIi4uL21vZGVscy9yZXNvdXJjZS1ncmFudC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VHcmFudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJlc291cmNlR3JhbnQ+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUmVzb3VyY2VHcmFudCk7XG4gIH1cblxuICBhc3luYyBncmFudFJlc291cmNlKGlucHV0OiBHcmFudFJlc291cmNlSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSZXNvdXJjZUdyYW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICByZXNvdXJjZTogaW5wdXQucmVzb3VyY2VJZCxcbiAgICAgICAgcHJpbmNpcGFsOiBpbnB1dC5wcmluY2lwYWxJZCxcbiAgICAgICAgcGVybWlzc2lvbktleTogaW5wdXQucGVybWlzc2lvbktleSxcbiAgICAgICAgc3RhcnRzQXQ6IGlucHV0LnN0YXJ0c0F0LFxuICAgICAgICBleHBpcmVzQXQ6IGlucHV0LmV4cGlyZXNBdCxcbiAgICAgICAgY29uZGl0aW9uczogaW5wdXQuY29uZGl0aW9ucyxcbiAgICAgICAgY3JlYXRlZEJ5OiBpbnB1dC5jcmVhdGVkQnlQcmluY2lwYWxJZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJldm9rZUdyYW50KGdyYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQoZ3JhbnRJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0UmVzb3VyY2VHcmFudHMocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UmVzb3VyY2VHcmFudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoZ3JhbnQpID0+IHJlbGF0aW9uTWF0Y2goZ3JhbnQucmVzb3VyY2UsIHByb3RlY3RlZFJlc291cmNlSWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQcmluY2lwYWxHcmFudHModGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJlc291cmNlR3JhbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAoZ3JhbnQpID0+IHNhbWVUZW5hbnQoZ3JhbnQudGVuYW50LCB0ZW5hbnRJZCkgJiYgcmVsYXRpb25NYXRjaChncmFudC5wcmluY2lwYWwsIHByaW5jaXBhbElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBoYXNHcmFudChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICBhdD86IERhdGUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RQcmluY2lwYWxHcmFudHModGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKSkuc29tZShcbiAgICAgIChncmFudCkgPT5cbiAgICAgICAgcmVsYXRpb25NYXRjaChncmFudC5yZXNvdXJjZSwgcHJvdGVjdGVkUmVzb3VyY2VJZCkgJiZcbiAgICAgICAgZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSAmJlxuICAgICAgICAoIWdyYW50LnN0YXJ0c0F0IHx8ICFhdCB8fCBncmFudC5zdGFydHNBdCA8PSBhdCkgJiZcbiAgICAgICAgKCFncmFudC5leHBpcmVzQXQgfHwgIWF0IHx8IGdyYW50LmV4cGlyZXNBdCA+PSBhdClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsRm9yUmVzb3VyY2UocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGF3YWl0IHRoaXMubGlzdFJlc291cmNlR3JhbnRzKHByb3RlY3RlZFJlc291cmNlSWQsIC4uLmFyZ3MpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb3RlY3RlZFJlc291cmNlU2VydmljZSB9IGZyb20gXCIuL3Byb3RlY3RlZC1yZXNvdXJjZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50U2VydmljZSB9IGZyb20gXCIuL3Jlc291cmNlLWdyYW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IHJlbGF0aW9uSWQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJlc291cmNlVmlzaWJpbGl0eSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgYXN5bmMgdW5yZWdpc3RlclJlc291cmNlKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUmVzb3VyY2VHcmFudFNlcnZpY2UoKS5kZWxldGVBbGxGb3JSZXNvdXJjZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCAuLi5hcmdzKTtcbiAgICBhd2FpdCBuZXcgUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlKCkuZGVsZXRlQnlJZChwcm90ZWN0ZWRSZXNvdXJjZUlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmVSZXNvdXJjZVNjb3BlKFxuICAgIHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHtcbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICAgIG9yZ1VuaXRJZDogc3RyaW5nO1xuICAgIHZpc2liaWxpdHk6IFJlc291cmNlVmlzaWJpbGl0eTtcbiAgICBvd25lclByaW5jaXBhbElkPzogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBuZXcgUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlKCkuZ2V0QnlJZChwcm90ZWN0ZWRSZXNvdXJjZUlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50SWQ6IHJlbGF0aW9uSWQocmVzb3VyY2UudGVuYW50KSxcbiAgICAgIG9yZ1VuaXRJZDogcmVsYXRpb25JZChyZXNvdXJjZS5vcmdVbml0KSxcbiAgICAgIHZpc2liaWxpdHk6IHJlc291cmNlLnZpc2liaWxpdHksXG4gICAgICBvd25lclByaW5jaXBhbElkOiByZXNvdXJjZS5vd25lciA/IHJlbGF0aW9uSWQocmVzb3VyY2Uub3duZXIpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uSWQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENyZWF0ZVN0b3JhZ2VCaW5kaW5nSW5wdXQsIFN0b3JhZ2VCaW5kaW5nS2luZCwgU3RvcmFnZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFN0b3JhZ2VCaW5kaW5nIH0gZnJvbSBcIi4uL21vZGVscy9zdG9yYWdlLWJpbmRpbmcubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VCaW5kaW5nU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoU3RvcmFnZUJpbmRpbmcpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQmluZGluZyhpbnB1dDogQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBzdG9yYWdlS2luZDogaW5wdXQuc3RvcmFnZUtpbmQsXG4gICAgICAgIGJpbmRpbmdLaW5kOiBpbnB1dC5iaW5kaW5nS2luZCxcbiAgICAgICAgYmluZGluZ0tleTogaW5wdXQuYmluZGluZ0tleSxcbiAgICAgICAgcmVnaW9uOiBpbnB1dC5yZWdpb24sXG4gICAgICAgIGNvbmZpZzogaW5wdXQuY29uZmlnLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudEJpbmRpbmdzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZ1tdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYmluZGluZykgPT4gcmVsYXRpb25JZChiaW5kaW5nLnRlbmFudCkgPT09IHRlbmFudElkKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJpbmRpbmcodGVuYW50SWQ6IHN0cmluZywgc3RvcmFnZUtpbmQ6IFN0b3JhZ2VLaW5kLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudEJpbmRpbmdzKHRlbmFudElkLCAuLi5hcmdzKSkuZmluZCgoYmluZGluZykgPT4gYmluZGluZy5zdG9yYWdlS2luZCA9PT0gc3RvcmFnZUtpbmQpO1xuICB9XG5cbiAgYXN5bmMgc2V0QmluZGluZ0NvbmZpZyhcbiAgICBiaW5kaW5nSWQ6IHN0cmluZyxcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYmluZGluZ0lkLCB7IGNvbmZpZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHByb21vdGVUb0RlZGljYXRlZChcbiAgICBiaW5kaW5nSWQ6IHN0cmluZyxcbiAgICBiaW5kaW5nS2V5OiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShiaW5kaW5nSWQsIHsgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZC5EZWRpY2F0ZWQsIGJpbmRpbmdLZXksIHJlZ2lvbiwgY29uZmlnIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgc2V0U2hhcmVkKFxuICAgIGJpbmRpbmdJZDogc3RyaW5nLFxuICAgIGJpbmRpbmdLZXk6IHN0cmluZyxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGJpbmRpbmdJZCwgeyBiaW5kaW5nS2luZDogU3RvcmFnZUJpbmRpbmdLaW5kLlNoYXJlZCwgYmluZGluZ0tleSwgcmVnaW9uLCBjb25maWcgfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQm9vdHN0cmFwT3JnVW5pdCwgQm9vdHN0cmFwVGVtcGxhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMsIFNjb3BlS2luZCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50U2VydmljZSB9IGZyb20gXCIuL3RlbmFudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUZW5hbnRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL3RlbmFudC1wcm9maWxlLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtcHJvZmlsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gXCIuL3VzZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50U2VydmljZSB9IGZyb20gXCIuL3JvbGUtYXNzaWdubWVudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIEJvb3RzdHJhcFNlcnZpY2Uge1xuICBwcml2YXRlIHRlbmFudFNlcnZpY2UgPSBuZXcgVGVuYW50U2VydmljZSgpO1xuICBwcml2YXRlIHRlbmFudFByb2ZpbGVTZXJ2aWNlID0gbmV3IFRlbmFudFByb2ZpbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnVW5pdFNlcnZpY2UgPSBuZXcgT3JnVW5pdFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBvcmdVbml0UHJvZmlsZVNlcnZpY2UgPSBuZXcgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgdXNlclNlcnZpY2UgPSBuZXcgVXNlclNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBtZW1iZXJzaGlwU2VydmljZSA9IG5ldyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSgpO1xuICBwcml2YXRlIHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICBwcml2YXRlIHBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVNlcnZpY2UgPSBuZXcgUm9sZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgUm9sZVBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZUFzc2lnbm1lbnRTZXJ2aWNlID0gbmV3IFJvbGVBc3NpZ25tZW50U2VydmljZSgpO1xuICBwcml2YXRlIGVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlKCk7XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBib290c3RyYXBUZW5hbnRGcm9tVGVtcGxhdGUoXG4gICAgdGVtcGxhdGU6IEJvb3RzdHJhcFRlbXBsYXRlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8e1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gICAgcm9vdE9yZ1VuaXRJZDogc3RyaW5nO1xuICAgIG93bmVyVXNlcklkOiBzdHJpbmc7XG4gICAgb3duZXJQcmluY2lwYWxJZDogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgdGVuYW50ID0gYXdhaXQgdGhpcy50ZW5hbnRTZXJ2aWNlLmNyZWF0ZVRlbmFudChcbiAgICAgIHRlbXBsYXRlLnRlbmFudCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGlmICh0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZUtleSkge1xuICAgICAgYXdhaXQgdGhpcy50ZW5hbnRQcm9maWxlU2VydmljZS5jcmVhdGVQcm9maWxlKFxuICAgICAgICB0ZW5hbnQuaWQsXG4gICAgICAgIHRlbXBsYXRlLnRlbmFudC5wcm9maWxlS2V5LFxuICAgICAgICB0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZU1ldGFkYXRhLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZU9yZ1RyZWUgPSBhc3luYyAoXG4gICAgICBwYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgb3JnVW5pdDogQm9vdHN0cmFwT3JnVW5pdFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgY3JlYXRlZCA9XG4gICAgICAgIHBhcmVudElkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGF3YWl0IHRoaXMub3JnVW5pdFNlcnZpY2UuY3JlYXRlUm9vdChcbiAgICAgICAgICAgICAgdGVuYW50LmlkLFxuICAgICAgICAgICAgICBvcmdVbml0Lm5hbWUsXG4gICAgICAgICAgICAgIG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIG9yZ1VuaXQucHJvZmlsZUtleSxcbiAgICAgICAgICAgICAgb3JnVW5pdC5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5vcmdVbml0U2VydmljZS5jcmVhdGVDaGlsZChcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgICAgICAgICAgcGFyZW50T3JnVW5pdElkOiBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBvcmdVbml0Lm5hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcHJvZmlsZUtleTogb3JnVW5pdC5wcm9maWxlS2V5LFxuICAgICAgICAgICAgICAgIHByb2ZpbGVNZXRhZGF0YTogb3JnVW5pdC5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygb3JnVW5pdC5jaGlsZHJlbiA/PyBbXSkge1xuICAgICAgICBhd2FpdCBjcmVhdGVPcmdUcmVlKGNyZWF0ZWQuaWQsIGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH07XG5cbiAgICBjb25zdCByb290T3JnVW5pdCA9IGF3YWl0IGNyZWF0ZU9yZ1RyZWUodW5kZWZpbmVkLCB0ZW1wbGF0ZS5yb290T3JnVW5pdCk7XG4gICAgY29uc3Qgb3duZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXIoXG4gICAgICB0ZW1wbGF0ZS5vd25lclVzZXIsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLmFkZFVzZXJUb1RlbmFudChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyLmlkLFxuICAgICAgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBjb25zdCBvd25lclByaW5jaXBhbCA9IGF3YWl0IHRoaXMucHJpbmNpcGFsU2VydmljZS5nZXRVc2VyUHJpbmNpcGFsKFxuICAgICAgdGVuYW50LmlkLFxuICAgICAgb3duZXIuaWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiB0ZW1wbGF0ZS5wZXJtaXNzaW9ucykge1xuICAgICAgYXdhaXQgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5jcmVhdGVQZXJtaXNzaW9uKHBlcm1pc3Npb24sIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHJvbGUgb2YgdGVtcGxhdGUucm9sZXMpIHtcbiAgICAgIGNvbnN0IGNyZWF0ZWRSb2xlID0gYXdhaXQgdGhpcy5yb2xlU2VydmljZS5jcmVhdGVSb2xlKFxuICAgICAgICB7XG4gICAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgICBrZXk6IHJvbGUua2V5LFxuICAgICAgICAgIG5hbWU6IHJvbGUubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcm9sZS5kZXNjcmlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbktleSBvZiByb2xlLnBlcm1pc3Npb25LZXlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucm9sZVBlcm1pc3Npb25TZXJ2aWNlLmFkZFBlcm1pc3Npb25LZXlUb1JvbGUoXG4gICAgICAgICAgY3JlYXRlZFJvbGUuaWQsXG4gICAgICAgICAgcGVybWlzc2lvbktleSxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZXJSb2xlID0gYXdhaXQgdGhpcy5yb2xlU2VydmljZS5nZXRUZW5hbnRSb2xlQnlLZXkoXG4gICAgICB0ZW5hbnQuaWQsXG4gICAgICB0ZW1wbGF0ZS5vd25lclJvbGVLZXksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJvbGVBc3NpZ25tZW50U2VydmljZS5hc3NpZ25Sb2xlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICBwcmluY2lwYWxJZDogb3duZXJQcmluY2lwYWwuaWQsXG4gICAgICAgIHJvbGVJZDogb3duZXJSb2xlLmlkLFxuICAgICAgICBzY29wZUtpbmQ6IFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICBzY29wZUlkOiByb290T3JnVW5pdC5pZCxcbiAgICAgICAgaW5oZXJpdERvd246IHRydWUsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKFxuICAgICAgdGVuYW50LmlkLFxuICAgICAgb3duZXJQcmluY2lwYWwuaWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgcm9vdE9yZ1VuaXRJZDogcm9vdE9yZ1VuaXQuaWQsXG4gICAgICBvd25lclVzZXJJZDogb3duZXIuaWQsXG4gICAgICBvd25lclByaW5jaXBhbElkOiBvd25lclByaW5jaXBhbC5pZCxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBTeXN0ZW1NYW5hZ2VtZW50U2VydmljZSB7XG4gIHByaXZhdGUgbWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBvcmdNZW1iZXJzaGlwU2VydmljZSA9IG5ldyBPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlU2VydmljZSA9IG5ldyBSb2xlU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSgpO1xuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgb25ib2FyZFVzZXJUb1RlbmFudEFuZE9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICByb2xlS2V5OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7IHByaW5jaXBhbElkOiBzdHJpbmcgfT4ge1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2UuYWRkVXNlclRvVGVuYW50KHRlbmFudElkLCB1c2VySWQsIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLCAuLi5hcmdzKTtcbiAgICBhd2FpdCB0aGlzLm9yZ01lbWJlcnNoaXBTZXJ2aWNlLmFkZFVzZXJUb09yZ1VuaXQodGVuYW50SWQsIG9yZ1VuaXRJZCwgdXNlcklkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgY29uc3QgcHJpbmNpcGFsID0gYXdhaXQgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLmdldFVzZXJQcmluY2lwYWwodGVuYW50SWQsIHVzZXJJZCwgLi4uYXJncyk7XG4gICAgY29uc3Qgcm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KHRlbmFudElkLCByb2xlS2V5LCAuLi5hcmdzKTtcbiAgICBhd2FpdCB0aGlzLnJvbGVBc3NpZ25tZW50U2VydmljZS5hc3NpZ25Sb2xlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6IHByaW5jaXBhbC5pZCxcbiAgICAgICAgcm9sZUlkOiByb2xlLmlkLFxuICAgICAgICBzY29wZUtpbmQ6IFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICBzY29wZUlkOiBvcmdVbml0SWQsXG4gICAgICAgIGluaGVyaXREb3duOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4geyBwcmluY2lwYWxJZDogcHJpbmNpcGFsLmlkIH07XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIGNoYW5nZVVzZXJPcmdSb2xlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICByb2xlS2V5OiBzdHJpbmcsXG4gICAgaW5oZXJpdERvd246IGJvb2xlYW4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KHRlbmFudElkLCByb2xlS2V5LCAuLi5hcmdzKTtcbiAgICBjb25zdCBjdXJyZW50QXNzaWdubWVudHMgPSBhd2FpdCB0aGlzLnJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IGFzc2lnbm1lbnQgb2YgY3VycmVudEFzc2lnbm1lbnRzLmZpbHRlcigocm93KSA9PiByb3cuc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiByb3cuc2NvcGVJZCA9PT0gb3JnVW5pdElkKSkge1xuICAgICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UucmV2b2tlQXNzaWdubWVudChhc3NpZ25tZW50LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICByb2xlSWQ6IHJvbGUuaWQsXG4gICAgICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLk9yZ1VuaXQsXG4gICAgICAgIHNjb3BlSWQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgaW5oZXJpdERvd24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHN1c3BlbmRVc2VySW5UZW5hbnQodGVuYW50TWVtYmVyc2hpcElkOiBzdHJpbmcsIHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5zZXRTdGF0dXModGVuYW50TWVtYmVyc2hpcElkLCBNZW1iZXJzaGlwU3RhdHVzLlN1c3BlbmRlZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5kZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVhY3RpdmF0ZVVzZXJJblRlbmFudCh0ZW5hbnRNZW1iZXJzaGlwSWQ6IHN0cmluZywgdGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLnNldFN0YXR1cyh0ZW5hbnRNZW1iZXJzaGlwSWQsIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLCAuLi5hcmdzKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBBdXRoekRhdGFTb3VyY2VzLFxuICBDYW5BY2Nlc3NJbnB1dCxcbiAgUmVzb3VyY2VWaXNpYmlsaXR5LFxuICBTY29wZUtpbmQsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgYXNBcnJheSxcbiAgYnVpbGRBY2Nlc3NDb250ZXh0LFxuICBidWlsZEFyYW5nb0NvbnRleHQsXG4gIGJ1aWxkUWRyYW50RmlsdGVyLFxuICBpc1RpbWVWYWxpZCxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlS2luZDogU2NvcGVLaW5kLCBzY29wZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2NvcGVLaW5kfToke3Njb3BlSWR9YDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGh6U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZXM6IEF1dGh6RGF0YVNvdXJjZXM7XG5cbiAgY29uc3RydWN0b3IoZGF0YVNvdXJjZXM6IEF1dGh6RGF0YVNvdXJjZXMgPSB7fSkge1xuICAgIHRoaXMuZGF0YVNvdXJjZXMgPSBkYXRhU291cmNlcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgY2FuQWNjZXNzKGlucHV0OiBDYW5BY2Nlc3NJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdCA9IGlucHV0LmF0ID8/IG5ldyBEYXRlKCk7XG5cbiAgICBpZiAoaW5wdXQuc2NvcGVLaW5kICYmIGlucHV0LnNjb3BlSWQpIHtcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zID1cbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIGlucHV0LnNjb3BlS2luZCxcbiAgICAgICAgICBpbnB1dC5zY29wZUlkXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYXNBcnJheShwZXJtaXNzaW9ucykuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgICAgcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgICAgaXNUaW1lVmFsaWQoYXQsIHBlcm1pc3Npb24uc3RhcnRzQXQsIHBlcm1pc3Npb24uZXhwaXJlc0F0KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlucHV0LnJlc291cmNlUHJvdGVjdGVkSWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlcy5sb2FkUmVzb3VyY2U/LihcbiAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgaW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZFxuICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyZXNvdXJjZS50ZW5hbnRJZCAhPT0gaW5wdXQudGVuYW50SWQpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChyZXNvdXJjZS5vd25lclByaW5jaXBhbElkID09PSBpbnB1dC5wcmluY2lwYWxJZCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBncmFudHMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0UmVzb3VyY2VHcmFudHM/LihcbiAgICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICAgIGlucHV0LnJlc291cmNlUHJvdGVjdGVkSWRcbiAgICAgIClcbiAgICApLmZpbHRlcihcbiAgICAgIChncmFudCkgPT5cbiAgICAgICAgZ3JhbnQucHJpbmNpcGFsSWQgPT09IGlucHV0LnByaW5jaXBhbElkICYmXG4gICAgICAgIGdyYW50LnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgaXNUaW1lVmFsaWQoYXQsIGdyYW50LnN0YXJ0c0F0LCBncmFudC5leHBpcmVzQXQpXG4gICAgKTtcbiAgICBpZiAoZ3JhbnRzLmxlbmd0aCA+IDApIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdmlzaWJpbGl0eSA9IHJlc291cmNlLnZpc2liaWxpdHk7XG4gICAgaWYgKFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5LlByaXZhdGUgfHxcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5SZXNvdXJjZUFjbFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5PcmdVbml0IHx8XG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuT3JnU3VidHJlZVxuICAgICkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlUGVybWlzc2lvbnMgPSBhc0FycmF5KFxuICAgICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RFZmZlY3RpdmVQZXJtaXNzaW9uc0ZvclNjb3BlPy4oXG4gICAgICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICAgICAgU2NvcGVLaW5kLk9yZ1VuaXQsXG4gICAgICAgICAgcmVzb3VyY2Uub3JnVW5pdElkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gZWZmZWN0aXZlUGVybWlzc2lvbnMuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgICAgcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgICAgaXNUaW1lVmFsaWQoYXQsIHBlcm1pc3Npb24uc3RhcnRzQXQsIHBlcm1pc3Npb24uZXhwaXJlc0F0KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5LlRlbmFudCkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlUGVybWlzc2lvbnMgPSBhc0FycmF5KFxuICAgICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RFZmZlY3RpdmVQZXJtaXNzaW9uc0ZvclNjb3BlPy4oXG4gICAgICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICAgICAgU2NvcGVLaW5kLlRlbmFudCxcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcmVxdWlyZUFjY2VzcyhpbnB1dDogQ2FuQWNjZXNzSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5jYW5BY2Nlc3MoaW5wdXQsIC4uLmFyZ3MpKSkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgYEFjY2VzcyBkZW5pZWQgZm9yICR7aW5wdXQucGVybWlzc2lvbktleX0gb24gJHtpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkID8/IHNjb3BlS2V5KGlucHV0LnNjb3BlS2luZCA/PyBTY29wZUtpbmQuUmVzb3VyY2UsIGlucHV0LnNjb3BlSWQgPz8gXCJcIil9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBidWlsZEFjY2Vzc0NvbnRleHQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGltcG9ydChcIi4uL3R5cGVzXCIpLkFjY2Vzc0NvbnRleHQ+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGFzQXJyYXkoXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucz8uKHRlbmFudElkLCBwcmluY2lwYWxJZClcbiAgICApO1xuICAgIGNvbnN0IGdyYW50cyA9IGFzQXJyYXkoXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RQcmluY2lwYWxHcmFudHM/Lih0ZW5hbnRJZCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgICByZXR1cm4gYnVpbGRBY2Nlc3NDb250ZXh0KHtcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICBwZXJtaXNzaW9ucyxcbiAgICAgIGdyYW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQXJhbmdvQ29udGV4dChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGFsbG93ZWRPcmdVbml0SWRzID1cbiAgICAgIGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHNcbiAgICAgIC5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KVxuICAgICAgLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZEFyYW5nb0NvbnRleHQoe1xuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIHBlcm1pc3Npb25LZXksXG4gICAgICBhbGxvd2VkT3JnVW5pdElkcyxcbiAgICAgIGFsbG93ZWRSZXNvdXJjZUlkcyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUWRyYW50RmlsdGVyKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgYWNjZXNzID0gYXdhaXQgdGhpcy5idWlsZEFjY2Vzc0NvbnRleHQoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3QgYWxsb3dlZE9yZ1VuaXRJZHMgPVxuICAgICAgYWNjZXNzLmFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb25LZXldID8/IFtdO1xuICAgIGNvbnN0IGFsbG93ZWRSZXNvdXJjZUlkcyA9IGFjY2Vzcy5yZXNvdXJjZUdyYW50c1xuICAgICAgLmZpbHRlcigoZ3JhbnQpID0+IGdyYW50LnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkpXG4gICAgICAubWFwKChncmFudCkgPT4gZ3JhbnQucmVzb3VyY2VJZCk7XG4gICAgcmV0dXJuIGJ1aWxkUWRyYW50RmlsdGVyKHtcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICBwZXJtaXNzaW9uS2V5LFxuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHMsXG4gICAgICBhbGxvd2VkUmVzb3VyY2VJZHMsXG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnNcbiAqIEBzdW1tYXJ5IFBhY2thZ2UgZW50cnkgcG9pbnQgZm9yIHNoYXJlZCBpbnRlZ3JhdGlvbiBoZWxwZXJzLlxuICogQGRlc2NyaXB0aW9uIEV4cG9zZXMgdGhlIHBhY2thZ2UgdXRpbGl0aWVzIGFuZCBidWlsZC10aW1lIHZlcnNpb24gbWV0YWRhdGEgZm9yIGBAZGVjYWYtdHMvaW50ZWdyYXRpb25zYC5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25hbWVzcGFjZXNcIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT046IHN0cmluZyA9IFwiIyNWRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUU6IHN0cmluZyA9IFwiIyNQQUNLQUdFIyNcIjtcbiJdLCJuYW1lcyI6WyJhc3luYyIsImV4ZWNXaXRoTG9nZ2luZyIsImNvbW1hbmQiLCJvcHRpb25zIiwibG9nIiwibGV2ZWwiLCJMb2dMZXZlbCIsImluZm8iLCJkZWJ1ZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY2hpbGQiLCJleGVjIiwic3Rkb3V0Iiwic3RkZXJyIiwib24iLCJkYXRhIiwicHVzaCIsInRyaW0iLCJjb2RlIiwic2lsbHkiLCJqb2luIiwiY3JpdGljYWwiLCJJbnRlcm5hbEVycm9yIiwiZXJyIiwiSXNvbGF0aW9uVGllciIsIk1lbWJlcnNoaXBTdGF0dXMiLCJQcmluY2lwYWxLaW5kIiwiU2NvcGVLaW5kIiwiUGVybWlzc2lvbkNhdGVnb3J5IiwiUmVzb3VyY2VWaXNpYmlsaXR5IiwiU3RvcmFnZUtpbmQiLCJTdG9yYWdlQmluZGluZ0tpbmQiLCJJc29sYXRpb25UaWVyT3B0aW9ucyIsIk9iamVjdCIsInZhbHVlcyIsIk1lbWJlcnNoaXBTdGF0dXNPcHRpb25zIiwiUHJpbmNpcGFsS2luZE9wdGlvbnMiLCJTY29wZUtpbmRPcHRpb25zIiwiUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyIsIlJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMiLCJTdG9yYWdlS2luZE9wdGlvbnMiLCJTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zIiwiUkVMX1JFU1RSSUNUIiwidXBkYXRlIiwiQ2FzY2FkZSIsIk5PTkUiLCJkZWxldGUiLCJudWxsYWJsZSIsIlJFTF9OVUxMSUZZIiwiUkVMX0NBU0NBREVfREVQRU5ERU5UIiwiQ0FTQ0FERSIsIlJFTF9DQVNDQURFX0lOU0VSVF9VUERBVEUiLCJidWlsZEFyYW5nb0NvbnRleHQiLCJ0ZW5hbnRJZCIsInByaW5jaXBhbElkIiwicGVybWlzc2lvbktleSIsImFsbG93ZWRPcmdVbml0SWRzIiwiYWxsb3dlZFJlc291cmNlSWRzIiwiYnVpbGRRZHJhbnRGaWx0ZXIiLCJtdXN0Iiwia2V5IiwibWF0Y2giLCJ2YWx1ZSIsInNob3VsZCIsImFueSIsInNjb3BlS2V5Iiwic2NvcGVLaW5kIiwic2NvcGVJZCIsIm5vd0lzbyIsIkRhdGUiLCJhc0FycmF5Iiwic2FtZVRlbmFudCIsInJvd1RlbmFudCIsInJlbGF0aW9uSWQiLCJyZWxhdGlvbk1hdGNoIiwidGFyZ2V0IiwibG93ZXJTbHVnIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiaXNUaW1lVmFsaWQiLCJhdCIsInN0YXJ0c0F0IiwiZXhwaXJlc0F0IiwiaW5zdGFudCIsImJ1aWxkQWNjZXNzQ29udGV4dCIsInBlcm1pc3Npb25zQnlTY29wZSIsImFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uIiwicGVybWlzc2lvbiIsInBlcm1pc3Npb25zIiwiT3JnVW5pdCIsInJlc291cmNlR3JhbnRzIiwiZ3JhbnRzIiwibWFwIiwiZ3JhbnQiLCJyZXNvdXJjZUlkIiwiQmFzZU1vZGVsU2VydmljZSIsIk1vZGVsU2VydmljZSIsImNvbnN0cnVjdG9yIiwiY2xhenoiLCJzdXBlciIsIm5ld01vZGVsIiwiYXNzaWduIiwiY3JlYXRlIiwiYXJncyIsInRoaXMiLCJyZXBvIiwiY3JlYXRlT25lIiwiZ2V0QnlJZCIsImlkIiwicmVhZCIsInVwZGF0ZU9uZSIsInBhdGNoIiwiZXhpc3RpbmciLCJkZWxldGVCeUlkIiwiZmluZE9uZUJ5IiwiZmluZE1hbnlCeSIsInNlbGVjdCIsIndoZXJlIiwiZXhlY3V0ZSIsImxpc3RBbGwiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwiQXV0aG9yaXphdGlvbk1vZGVsIiwiTW9kZWwiLCJUZW5hbnRNZW1iZXJzaGlwIiwiX19kZWNvcmF0ZSIsInBrIiwidHlwZSIsIlN0cmluZyIsInV1aWQiLCJwcm90b3R5cGUiLCJtYW55VG9PbmUiLCJUZW5hbnQiLCJ1bmRlZmluZWQiLCJyZXF1aXJlZCIsIlVzZXIiLCJ0eXBlT2YiLCJvcHRpb24iLCJjb2x1bW4iLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ0YWJsZSIsIm1vZGVsIiwidW5pcXVlIiwib25lVG9NYW55IiwiT3JnVW5pdE1lbWJlcnNoaXAiLCJPcmdVbml0Q2xvc3VyZSIsIk51bWJlciIsIlBlcm1pc3Npb24iLCJSb2xlUGVybWlzc2lvbiIsIlJvbGUiLCJSb2xlQXNzaWdubWVudCIsIlByaW5jaXBhbCIsIkJvb2xlYW4iLCJSZXNvdXJjZUdyYW50IiwiUHJvdGVjdGVkUmVzb3VyY2UiLCJJbmhlcml0YW5jZUJsb2NrIiwiU3RvcmFnZUJpbmRpbmciLCJUZW5hbnRQcm9maWxlIiwiT3JnVW5pdFByb2ZpbGUiLCJHcm91cE1lbWJlcnNoaXAiLCJHcm91cCIsIkVmZmVjdGl2ZVBlcm1pc3Npb24iLCJUZW5hbnRQcm9maWxlU2VydmljZSIsImNyZWF0ZVByb2ZpbGUiLCJwcm9maWxlS2V5IiwibWV0YWRhdGEiLCJ0ZW5hbnQiLCJsaXN0Rm9yVGVuYW50IiwiZmlsdGVyIiwicHJvZmlsZSIsImRlbGV0ZUZvclRlbmFudCIsInJvdyIsIk9yZ1VuaXRQcm9maWxlU2VydmljZSIsIm9yZ1VuaXRJZCIsIm9yZ1VuaXQiLCJsaXN0Rm9yT3JnVW5pdCIsIk9yZ1VuaXRDbG9zdXJlU2VydmljZSIsImxpc3RBbmNlc3RvcnMiLCJkZXNjZW5kYW50Iiwic29ydCIsImxlZnQiLCJyaWdodCIsImRlcHRoIiwibGlzdERlc2NlbmRhbnRzIiwiYW5jZXN0b3IiLCJpc0FuY2VzdG9yT2YiLCJhbmNlc3Rvck9yZ1VuaXRJZCIsImRlc2NlbmRhbnRPcmdVbml0SWQiLCJzb21lIiwiY3JlYXRlU2VsZkxpbmsiLCJpbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQiLCJwYXJlbnRPcmdVbml0SWQiLCJjaGlsZE9yZ1VuaXRJZCIsImFuY2VzdG9yTGlua3MiLCJsaW5rIiwiZGVsZXRlTGlua3NGb3JTdWJ0cmVlIiwic3VidHJlZSIsImRlc2NlbmRhbnRJZHMiLCJTZXQiLCJhbmNlc3RvcklkcyIsInJvd3MiLCJoYXMiLCJJbmhlcml0YW5jZUJsb2NrU2VydmljZSIsImJsb2NrQ2F0ZWdvcnkiLCJwZXJtaXNzaW9uQ2F0ZWdvcnkiLCJibG9ja2VkRnJvbUFuY2VzdG9ySWQiLCJyZWFzb24iLCJibG9ja2VkRnJvbUFuY2VzdG9yIiwidW5ibG9ja0NhdGVnb3J5IiwiYmxvY2tJZCIsImJsb2NrIiwiY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IiLCJjYXRlZ29yeSIsIlRlbmFudFNlcnZpY2UiLCJjcmVhdGVUZW5hbnQiLCJpbnB1dCIsInNsdWciLCJuYW1lIiwiaXNvbGF0aW9uVGllciIsIlBvb2xlZCIsImdldEJ5U2x1ZyIsInJlbmFtZVRlbmFudCIsImNoYW5nZVNsdWciLCJzZXRJc29sYXRpb25UaWVyIiwiZGVsZXRlVGVuYW50Q29udHJvbGxlZCIsImRlbGV0ZVJvd3NCeUlkIiwic2VydmljZSIsIk9yZ1VuaXRTZXJ2aWNlIiwib3JnVW5pdFBhdGgiLCJwYXJlbnRQYXRoIiwic2VnbWVudCIsImNyZWF0ZVByb2ZpbGVJZk5lZWRlZCIsInByb2ZpbGVNZXRhZGF0YSIsImNyZWF0ZVJvb3QiLCJwYXRoIiwiY3JlYXRlQ2hpbGQiLCJwYXJlbnQiLCJjbG9zdXJlU2VydmljZSIsImxpc3RDaGlsZHJlbiIsImxpc3RUZW5hbnRPcmdVbml0cyIsImxpc3REZXNjZW5kYW50T3JnVW5pdHMiLCJpbmNsdWRlU2VsZiIsImRlc2NlbmRhbnRzIiwiaWRzIiwiYWRkIiwibGlzdEFuY2VzdG9yT3JnVW5pdHMiLCJhbmNlc3RvcnMiLCJyZW5hbWVPcmdVbml0IiwiaW5jbHVkZXMiLCJtb3ZlT3JnVW5pdCIsIm5ld1BhcmVudE9yZ1VuaXRJZCIsIm5ld1BhcmVudCIsInVwZGF0ZWQiLCJyZWJ1aWxkVGVuYW50Q2xvc3VyZSIsImV4aXN0aW5nTGlua3MiLCJvcmdVbml0cyIsImxlZnREZXB0aCIsInNwbGl0IiwibGVuZ3RoIiwicmlnaHREZXB0aCIsImRlbGV0ZU9yZ1VuaXRUcmVlIiwidHJhbnNhY3Rpb25hbCIsIlVzZXJTZXJ2aWNlIiwiY3JlYXRlVXNlciIsImVtYWlsIiwicGhvbmUiLCJkaXNwbGF5TmFtZSIsImdldEJ5RW1haWwiLCJmaW5kIiwidXNlciIsInVwZGF0ZURpc3BsYXlOYW1lIiwidXNlcklkIiwidXBkYXRlRW1haWwiLCJ1cGRhdGVQaG9uZSIsIlByaW5jaXBhbFNlcnZpY2UiLCJjcmVhdGVQcmluY2lwYWwiLCJraW5kIiwic3ViamVjdElkIiwiZ2V0Rm9yU3ViamVjdCIsInByaW5jaXBhbCIsImdldE9yQ3JlYXRlRm9yU3ViamVjdCIsImdldFVzZXJQcmluY2lwYWwiLCJnZXRHcm91cFByaW5jaXBhbCIsImdyb3VwSWQiLCJUZW5hbnRNZW1iZXJzaGlwU2VydmljZSIsImFkZFVzZXJUb1RlbmFudCIsInN0YXR1cyIsIkFjdGl2ZSIsInNldFN0YXR1cyIsIm1lbWJlcnNoaXBJZCIsImxpc3RVc2VyVGVuYW50cyIsIm1lbWJlcnNoaXAiLCJsaXN0VGVuYW50VXNlcnMiLCJyZW1vdmVVc2VyRnJvbVRlbmFudCIsIk9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSIsImFkZFVzZXJUb09yZ1VuaXQiLCJsaXN0VXNlck9yZ1VuaXRzIiwibGlzdE9yZ1VuaXRVc2VycyIsInJlbW92ZVVzZXJGcm9tT3JnVW5pdCIsIkdyb3VwU2VydmljZSIsImNyZWF0ZUdyb3VwIiwicmVuYW1lR3JvdXAiLCJtb3ZlR3JvdXBUb09yZ1VuaXQiLCJsaXN0VGVuYW50R3JvdXBzIiwiZ3JvdXAiLCJHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIiwiYWRkUHJpbmNpcGFsVG9Hcm91cCIsImxpc3RHcm91cE1lbWJlcnMiLCJsaXN0UHJpbmNpcGFsR3JvdXBzIiwicmVtb3ZlUHJpbmNpcGFsRnJvbUdyb3VwIiwicmVzb2x2ZUdyb3VwUHJpbmNpcGFsSWRzRm9yUHJpbmNpcGFsIiwicHJpbmNpcGFsU2VydmljZSIsIm1lbWJlcnNoaXBzIiwicHJpbmNpcGFscyIsImFsbCIsIlBlcm1pc3Npb25TZXJ2aWNlIiwiY3JlYXRlUGVybWlzc2lvbiIsImRlc2NyaXB0aW9uIiwiZ2V0QnlLZXkiLCJsaXN0QnlDYXRlZ29yeSIsInVwZGF0ZURlc2NyaXB0aW9uIiwicGVybWlzc2lvbklkIiwiUm9sZVNlcnZpY2UiLCJjcmVhdGVSb2xlIiwiZ2V0U3lzdGVtUm9sZUJ5S2V5Iiwicm9sZSIsImNhbmRpZGF0ZSIsIkVycm9yIiwiZ2V0VGVuYW50Um9sZUJ5S2V5IiwicmVuYW1lUm9sZSIsInJvbGVJZCIsInVwZGF0ZVJvbGVNZXRhZGF0YSIsImxpc3RUZW5hbnRSb2xlcyIsImluY2x1ZGVTeXN0ZW0iLCJSb2xlUGVybWlzc2lvblNlcnZpY2UiLCJhZGRQZXJtaXNzaW9uVG9Sb2xlIiwiYWRkUGVybWlzc2lvbktleVRvUm9sZSIsInJlbW92ZVBlcm1pc3Npb25Gcm9tUm9sZSIsInJvbGVQZXJtaXNzaW9uSWQiLCJsaXN0Um9sZVBlcm1pc3Npb25zIiwicm9sZVBlcm1pc3Npb24iLCJsaXN0UGVybWlzc2lvblJvbGVzIiwicmVwbGFjZVJvbGVQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25JZHMiLCJjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zIiwicGVybWlzc2lvbktleXMiLCJSb2xlQXNzaWdubWVudFNlcnZpY2UiLCJhc3NpZ25Sb2xlIiwiaW5oZXJpdERvd24iLCJjb25kaXRpb25zIiwicmV2b2tlQXNzaWdubWVudCIsImFzc2lnbm1lbnRJZCIsImxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyIsImFzc2lnbm1lbnQiLCJsaXN0Um9sZUFzc2lnbm1lbnRzIiwibGlzdFRlbmFudEFzc2lnbm1lbnRzIiwidXBkYXRlQXNzaWdubWVudFdpbmRvdyIsIkVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIiwibGlzdEZvclByaW5jaXBhbCIsImxpc3RGb3JTY29wZSIsImhhc1Blcm1pc3Npb24iLCJkZWxldGVGb3JQcmluY2lwYWwiLCJyZWJ1aWxkRm9yUHJpbmNpcGFsIiwicm9sZUFzc2lnbm1lbnRTZXJ2aWNlIiwicm9sZVBlcm1pc3Npb25TZXJ2aWNlIiwicGVybWlzc2lvblNlcnZpY2UiLCJncm91cE1lbWJlcnNoaXBTZXJ2aWNlIiwib3JnVW5pdENsb3N1cmVTZXJ2aWNlIiwiaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UiLCJtYXRlcmlhbGl6ZWQiLCJzb3VyY2VBc3NpZ25tZW50cyIsImdyb3VwTWVtYmVyc2hpcHMiLCJncm91cEFzc2lnbm1lbnRzIiwiZ3JvdXBQcmluY2lwYWwiLCJmbGF0IiwiYXNzaWdubWVudHMiLCJyb2xlUGVybWlzc2lvbnMiLCJzY29wZXMiLCJSZXNvdXJjZSIsInNjb3BlZCIsInNvdXJjZUtpbmQiLCJzb3VyY2VJZCIsImNyZWF0ZWQiLCJyZWJ1aWxkRm9yVGVuYW50IiwiUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlIiwicmVnaXN0ZXJSZXNvdXJjZSIsInJlc291cmNlVHlwZSIsInZpc2liaWxpdHkiLCJvd25lciIsIm93bmVyUHJpbmNpcGFsSWQiLCJzZW5zaXRpdml0eSIsImdldEJ5RG9tYWluUmVzb3VyY2UiLCJyZXNvdXJjZSIsIm1vdmVSZXNvdXJjZVRvT3JnVW5pdCIsInByb3RlY3RlZFJlc291cmNlSWQiLCJzZXRWaXNpYmlsaXR5IiwidHJhbnNmZXJPd25lcnNoaXAiLCJsaXN0T3JnVW5pdFJlc291cmNlcyIsImxpc3RUZW5hbnRSZXNvdXJjZXMiLCJSZXNvdXJjZUdyYW50U2VydmljZSIsImdyYW50UmVzb3VyY2UiLCJjcmVhdGVkQnkiLCJjcmVhdGVkQnlQcmluY2lwYWxJZCIsInJldm9rZUdyYW50IiwiZ3JhbnRJZCIsImxpc3RSZXNvdXJjZUdyYW50cyIsImxpc3RQcmluY2lwYWxHcmFudHMiLCJoYXNHcmFudCIsImRlbGV0ZUFsbEZvclJlc291cmNlIiwiUmVzb3VyY2VMaWZlY3ljbGVTZXJ2aWNlIiwidW5yZWdpc3RlclJlc291cmNlIiwicmVzb2x2ZVJlc291cmNlU2NvcGUiLCJTdG9yYWdlQmluZGluZ1NlcnZpY2UiLCJjcmVhdGVCaW5kaW5nIiwic3RvcmFnZUtpbmQiLCJiaW5kaW5nS2luZCIsImJpbmRpbmdLZXkiLCJyZWdpb24iLCJjb25maWciLCJsaXN0VGVuYW50QmluZGluZ3MiLCJiaW5kaW5nIiwiZ2V0QmluZGluZyIsInNldEJpbmRpbmdDb25maWciLCJiaW5kaW5nSWQiLCJwcm9tb3RlVG9EZWRpY2F0ZWQiLCJEZWRpY2F0ZWQiLCJzZXRTaGFyZWQiLCJTaGFyZWQiLCJCb290c3RyYXBTZXJ2aWNlIiwidGVuYW50U2VydmljZSIsInRlbmFudFByb2ZpbGVTZXJ2aWNlIiwib3JnVW5pdFNlcnZpY2UiLCJvcmdVbml0UHJvZmlsZVNlcnZpY2UiLCJ1c2VyU2VydmljZSIsIm1lbWJlcnNoaXBTZXJ2aWNlIiwicm9sZVNlcnZpY2UiLCJlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSIsImJvb3RzdHJhcFRlbmFudEZyb21UZW1wbGF0ZSIsInRlbXBsYXRlIiwiY3JlYXRlT3JnVHJlZSIsInBhcmVudElkIiwiY2hpbGRyZW4iLCJyb290T3JnVW5pdCIsIm93bmVyVXNlciIsIm93bmVyUHJpbmNpcGFsIiwicm9sZXMiLCJjcmVhdGVkUm9sZSIsIm93bmVyUm9sZSIsIm93bmVyUm9sZUtleSIsInJvb3RPcmdVbml0SWQiLCJvd25lclVzZXJJZCIsIlN5c3RlbU1hbmFnZW1lbnRTZXJ2aWNlIiwib3JnTWVtYmVyc2hpcFNlcnZpY2UiLCJvbmJvYXJkVXNlclRvVGVuYW50QW5kT3JnVW5pdCIsInJvbGVLZXkiLCJjaGFuZ2VVc2VyT3JnUm9sZSIsImN1cnJlbnRBc3NpZ25tZW50cyIsInN1c3BlbmRVc2VySW5UZW5hbnQiLCJ0ZW5hbnRNZW1iZXJzaGlwSWQiLCJTdXNwZW5kZWQiLCJyZWFjdGl2YXRlVXNlckluVGVuYW50IiwiQXV0aHpTZXJ2aWNlIiwiZGF0YVNvdXJjZXMiLCJjYW5BY2Nlc3MiLCJsaXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZSIsInJlc291cmNlUHJvdGVjdGVkSWQiLCJsb2FkUmVzb3VyY2UiLCJQcml2YXRlIiwiUmVzb3VyY2VBY2wiLCJPcmdTdWJ0cmVlIiwiZWZmZWN0aXZlUGVybWlzc2lvbnMiLCJyZXF1aXJlQWNjZXNzIiwiQXV0aG9yaXphdGlvbkVycm9yIiwibGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zIiwiYWNjZXNzIiwiVkVSU0lPTiIsIkNPTU1JVCIsIkZVTExfVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFTT0EsZUFBZUMsZ0JBQ3BCQyxTQUNBQyxTQUNBQyxLQUNBQyxRQUFrQkMsU0FBU0M7SUFFM0JILElBQUlJLE1BQU0sY0FBY047SUFFeEIsT0FBTyxJQUFJTyxRQUFRLENBQUNDLFNBQVNDO1FBQzNCLE1BQU1DLFFBQVFDLEtBQUtYLFNBQVNDO1FBRTVCLE1BQU1XLFNBQW1CO1FBQ3pCLE1BQU1DLFNBQW1CO1FBRXpCSCxNQUFNRSxRQUFRRSxHQUFHLFFBQVNDO1lBQ3hCSCxPQUFPSSxLQUFLRDtZQUNaYixJQUFJQyxPQUFPWSxLQUFLRTs7UUFHbEJQLE1BQU1HLFFBQVFDLEdBQUcsUUFBU0M7WUFDeEJGLE9BQU9HLEtBQUtEO1lBQ1piLElBQUlJLE1BQU1TLEtBQUtFOztRQUdqQlAsTUFBTUksR0FBRyxTQUFVSTtZQUNqQixJQUFJQSxTQUFTLEdBQUc7Z0JBQ2RoQixJQUFJaUIsTUFBTTtnQkFDVlgsUUFBUTtvQkFBRUksUUFBUUEsT0FBT1EsS0FBSztvQkFBT1AsUUFBUUEsT0FBT08sS0FBSzs7QUFDM0QsbUJBQU87Z0JBQ0xsQixJQUFJbUIsU0FDRiw0QkFBNEJILFdBQVdMLE9BQU9PLEtBQUs7Z0JBRXJEWCxPQUNFLElBQUlhLGNBQ0YsNEJBQTRCSixTQUFTTCxPQUFPTyxLQUFLO0FBR3ZEOztRQUdGVixNQUFNSSxHQUFHLFNBQVVTO1lBQ2pCckIsSUFBSW1CLFNBQVMsMkJBQTJCRTtZQUN4Q2QsT0FBT2M7OztBQUdiOztJQ3REWUM7O0NBQVosU0FBWUE7SUFDVkEsY0FBQSxZQUFBO0lBQ0FBLGNBQUEsWUFBQTtJQUNBQSxjQUFBLFVBQUE7QUFDRCxFQUpELENBQVlBLGtCQUFBQSxnQkFBYSxDQUFBOztJQU1iQzs7Q0FBWixTQUFZQTtJQUNWQSxpQkFBQSxhQUFBO0lBQ0FBLGlCQUFBLFlBQUE7SUFDQUEsaUJBQUEsZUFBQTtJQUNBQSxpQkFBQSxhQUFBO0FBQ0QsRUFMRCxDQUFZQSxxQkFBQUEsbUJBQWdCLENBQUE7O0lBT2hCQzs7Q0FBWixTQUFZQTtJQUNWQSxjQUFBLFVBQUE7SUFDQUEsY0FBQSxXQUFBO0lBQ0FBLGNBQUEsb0JBQUE7SUFDQUEsY0FBQSxXQUFBO0lBQ0FBLGNBQUEsWUFBQTtBQUNELEVBTkQsQ0FBWUEsa0JBQUFBLGdCQUFhLENBQUE7O0lBUWJDOztDQUFaLFNBQVlBO0lBQ1ZBLFVBQUEsWUFBQTtJQUNBQSxVQUFBLGFBQUE7SUFDQUEsVUFBQSxjQUFBO0FBQ0QsRUFKRCxDQUFZQSxjQUFBQSxZQUFTLENBQUE7O0lBTVRDOztDQUFaLFNBQVlBO0lBQ1ZBLG1CQUFBLFdBQUE7SUFDQUEsbUJBQUEsaUJBQUE7SUFDQUEsbUJBQUEsa0JBQUE7SUFDQUEsbUJBQUEsWUFBQTtJQUNBQSxtQkFBQSxXQUFBO0lBQ0FBLG1CQUFBLFlBQUE7SUFDQUEsbUJBQUEsWUFBQTtJQUNBQSxtQkFBQSxhQUFBO0lBQ0FBLG1CQUFBLFdBQUE7SUFDQUEsbUJBQUEsY0FBQTtJQUNBQSxtQkFBQSxVQUFBO0lBQ0FBLG1CQUFBLGdCQUFBO0FBQ0QsRUFiRCxDQUFZQSx1QkFBQUEscUJBQWtCLENBQUE7O0lBZWxCQzs7Q0FBWixTQUFZQTtJQUNWQSxtQkFBQSxhQUFBO0lBQ0FBLG1CQUFBLGlCQUFBO0lBQ0FBLG1CQUFBLGFBQUE7SUFDQUEsbUJBQUEsZ0JBQUE7SUFDQUEsbUJBQUEsWUFBQTtBQUNELEVBTkQsQ0FBWUEsdUJBQUFBLHFCQUFrQixDQUFBOztJQVFsQkM7O0NBQVosU0FBWUE7SUFDVkEsWUFBQSxjQUFBO0lBQ0FBLFlBQUEsWUFBQTtJQUNBQSxZQUFBLFlBQUE7SUFDQUEsWUFBQSxtQkFBQTtBQUNELEVBTEQsQ0FBWUEsZ0JBQUFBLGNBQVcsQ0FBQTs7SUFPWEM7O0NBQVosU0FBWUE7SUFDVkEsbUJBQUEsWUFBQTtJQUNBQSxtQkFBQSxlQUFBO0FBQ0QsRUFIRCxDQUFZQSx1QkFBQUEscUJBQWtCLENBQUE7O0FBS3ZCLE1BQU1DLHVCQUF1QkMsT0FBT0MsT0FBT1Y7O0FBQzNDLE1BQU1XLDBCQUEwQkYsT0FBT0MsT0FBT1Q7O0FBQzlDLE1BQU1XLHVCQUF1QkgsT0FBT0MsT0FBT1I7O0FBQzNDLE1BQU1XLG1CQUFtQkosT0FBT0MsT0FBT1A7O0FBQ3ZDLE1BQU1XLDRCQUE0QkwsT0FBT0MsT0FBT047O0FBQ2hELE1BQU1XLDRCQUE0Qk4sT0FBT0MsT0FBT0w7O0FBQ2hELE1BQU1XLHFCQUFxQlAsT0FBT0MsT0FBT0o7O0FBQ3pDLE1BQU1XLDRCQUE0QlIsT0FBT0MsT0FBT0g7O0FDMURoRCxNQUFNVyxlQUFlO0lBQzFCQyxRQUFRQyxRQUFRQztJQUNoQkMsUUFBUUYsUUFBUUM7SUFDaEJFLFVBQVU7OztBQUdMLE1BQU1DLGNBQWM7SUFDekJMLFFBQVFDLFFBQVFDO0lBQ2hCQyxRQUFRRixRQUFRQztJQUNoQkUsVUFBVTs7O0FBR0wsTUFBTUUsd0JBQXdCO0lBQ25DTixRQUFRQyxRQUFRTTtJQUNoQkosUUFBUUYsUUFBUU07SUFDaEJILFVBQVU7OztBQUdMLE1BQU1JLDRCQUE0QjtJQUN2Q1IsUUFBUUMsUUFBUU07SUFDaEJKLFFBQVFGLFFBQVFDO0lBQ2hCRSxVQUFVOzs7QUFHTixTQUFVSyxtQkFBbUJuRDtJQU9qQyxPQUFPO1FBQ0xvRCxVQUFVcEQsUUFBUW9EO1FBQ2xCQyxhQUFhckQsUUFBUXFEO1FBQ3JCQyxlQUFldEQsUUFBUXNEO1FBQ3ZCQyxtQkFBbUIsS0FBSXZELFFBQVF1RDtRQUMvQkMsb0JBQW9CLEtBQUl4RCxRQUFRd0Q7O0FBRXBDOztBQUVNLFNBQVVDLGtCQUFrQnpEO0lBT2hDLE9BQU87UUFDTDBELE1BQU0sRUFDSjtZQUNFQyxLQUFLO1lBQ0xDLE9BQU87Z0JBQUVDLE9BQU83RCxRQUFRb0Q7O1dBRTFCO1lBQ0VVLFFBQVEsRUFDTjtnQkFBRUgsS0FBSztnQkFBZUMsT0FBTztvQkFBRUcsS0FBSy9ELFFBQVF1RDs7ZUFDNUM7Z0JBQ0VJLEtBQUs7Z0JBQ0xDLE9BQU87b0JBQUVHLEtBQUsvRCxRQUFRd0Q7O2VBRXhCO2dCQUFFRyxLQUFLO2dCQUFzQkMsT0FBTztvQkFBRUMsT0FBTzdELFFBQVFxRDs7Ozs7QUFLL0Q7O0FBRUEsU0FBU1csV0FBU0MsV0FBc0JDO0lBQ3RDLE9BQU8sR0FBR0QsYUFBYUM7QUFDekI7O1NBRWdCQztJQUNkLE9BQU8sSUFBSUM7QUFDYjs7QUFFTSxTQUFVQyxRQUFXUjtJQUN6QixPQUFPQSxTQUFTO0FBQ2xCOztBQUVNLFNBQVVTLFdBQVdDLFdBQW9CbkI7SUFDN0MsT0FBT29CLFdBQVdELGVBQTBDbkI7QUFDOUQ7O0FBRU0sU0FBVXFCLGNBQ2RaLE9BQ0FhO0lBRUEsT0FBT0EsU0FDSEYsV0FBV1gsV0FBc0NhLFNBQ2pEO0FBQ047O0FBRU0sU0FBVUMsVUFBVWQ7SUFDeEIsT0FDRUEsTUFDRzdDLE9BQ0E0RCxjQUNBQyxRQUFRLGVBQWUsS0FDdkJBLFFBQVEsWUFBWSxPQUFPO0FBRWxDOztTQUVnQkMsWUFDZEMsSUFDQUMsVUFDQUM7SUFFQSxNQUFNQyxVQUFVSCxNQUFNLElBQUlYO0lBQzFCLElBQUlZLFlBQVlFLFVBQVVGLFVBQVUsT0FBTztJQUMzQyxJQUFJQyxhQUFhQyxVQUFVRCxXQUFXLE9BQU87SUFDN0MsT0FBTztBQUNUOztBQUVNLFNBQVVFLG1CQUFtQm5GO0lBTWpDLE1BQU1vRixxQkFBK0MsQ0FBQTtJQUNyRCxNQUFNQyxnQ0FBMEQsQ0FBQTtJQUVoRSxLQUFLLE1BQU1DLGNBQWN0RixRQUFRdUYsYUFBYTtRQUM1QyxNQUFNNUIsTUFBTUssV0FBU3NCLFdBQVdyQixXQUFXcUIsV0FBV3BCO1FBQ3REa0IsbUJBQW1CekIsT0FBT3lCLG1CQUFtQnpCLFFBQVE7UUFDckR5QixtQkFBbUJ6QixLQUFLNUMsS0FBS3VFLFdBQVdoQztRQUN4QyxJQUFJZ0MsV0FBV3JCLGNBQWN2QyxVQUFVOEQsU0FBUztZQUM5Q0gsOEJBQThCQyxXQUFXaEMsaUJBQ3ZDK0IsOEJBQThCQyxXQUFXaEMsa0JBQWtCO1lBQzdEK0IsOEJBQThCQyxXQUFXaEMsZUFBZXZDLEtBQ3REdUUsV0FBV3BCO0FBRWY7QUFDRjtJQUVBLE9BQU87UUFDTGQsVUFBVXBELFFBQVFvRDtRQUNsQkMsYUFBYXJELFFBQVFxRDtRQUNyQitCO1FBQ0FDO1FBQ0FJLGdCQUFnQnpGLFFBQVEwRixPQUFPQyxJQUFLQyxVQUFLO1lBQ3ZDQyxZQUFZRCxNQUFNQztZQUNsQnZDLGVBQWVzQyxNQUFNdEM7OztBQUczQjs7QUFFTSxNQUFnQndDLHlCQUVaQztJQUNSLFdBQUFDLENBQXNCQztRQUNwQkMsTUFBTUQ7QUFDUjtJQUVVLFFBQUFFLENBQVlGLE9BQW9CbkY7UUFDeEMsT0FBT2tCLE9BQU9vRSxPQUFPLElBQUlILE9BQW1CbkY7QUFDOUM7SUFFQSxZQUFNdUYsQ0FBT3ZGLFNBQXFCd0Y7UUFDaEMsT0FBT0MsS0FBS0MsS0FBS0gsT0FBT3JFLE9BQU9vRSxPQUFPLElBQVN0RixVQUFvQndGO0FBQ3JFO0lBRUEsZUFBTUcsQ0FBVTNGLFNBQXFCd0Y7UUFDbkMsT0FBT0MsS0FBS0YsT0FBT3ZGLFNBQVN3RjtBQUM5QjtJQUVBLGFBQU1JLENBQVFDLE9BQWVMO1FBQzNCLE9BQU9DLEtBQUtDLEtBQUtJLEtBQUtELE9BQU9MO0FBQy9CO0lBRUEsZUFBTU8sQ0FBVUYsSUFBWUcsVUFBc0JSO1FBQ2hELE1BQU1TLGlCQUFpQlIsS0FBS0MsS0FBS0ksS0FBS0QsT0FBT0w7UUFDN0MsT0FBT0MsS0FBS0MsS0FBSzlELE9BQU9WLE9BQU9vRSxPQUFPVyxVQUFVRCxXQUFXUjtBQUM3RDtJQUVBLGdCQUFNVSxDQUFXTCxPQUFlTDtjQUN4QkMsS0FBS0MsS0FBSzNELE9BQU84RCxPQUFPTDtBQUNoQztJQUVBLGVBQU1XLENBQ0p0RCxLQUNBRSxVQUNHeUM7UUFFSCxPQUFPQyxLQUFLQyxLQUFLUyxVQUFVdEQsS0FBS0UsVUFBVXlDO0FBQzVDO0lBRUEsZ0JBQU1ZLENBQ0p2RCxLQUNBRSxVQUNHeUM7UUFFSCxPQUFPQyxLQUFLQyxLQUNUVyxTQUNBQyxNQUFNO1lBQUV6RCxDQUFDQSxNQUFNRTtXQUNmd0QsV0FBV2Y7QUFDaEI7SUFFQSxhQUFNZ0IsSUFBV2hCO1FBQ2YsT0FBT0MsS0FBS0MsS0FBS1csU0FBU0UsV0FBV2Y7QUFDdkM7OztTQUdjSztJQUNkLE9BQU9ZLE9BQU9DO0FBQ2hCOztBQUVNLFNBQVVoRCxXQUFXWDtJQUN6QixjQUFjQSxVQUFVLFdBQVdBLFFBQVFBLE1BQU04QztBQUNuRDs7QUMxTk0sTUFBZ0JjLDJCQUEyQkM7SUFDL0MsV0FBQTFCLENBQVlsRjtRQUNWb0YsTUFBTXBGO0FBQ1I7OztBQ0tLLElBQU02RyxtQkFBTixNQUFNQSx5QkFBeUJGO0lBQ3BDLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQkwsaUJBQUFNLFdBQUEsV0FBQTs7QUFHMUNMLFdBQUEsRUFGQ00sVUFBVSxNQUFNQyxRQUFRbkYsdUJBQXVCLE9BQU9vRixXQUFXLGlDQUNqRUMsaURBQ3dCVixpQkFBQU0sV0FBQSxlQUFBOztBQUd6QkwsV0FBQSxFQUZDTSxVQUFVLE1BQU1JLE1BQU10Rix1QkFBdUIsT0FBT29GLFdBQVcsK0JBQy9EQyxpREFDb0JWLGlCQUFBTSxXQUFBLGFBQUE7O0FBQ2tETCxXQUFBLEVBQXRFUyxZQUFZRSxLQUFPUixTQUFTUyxPQUFPdEcsMEJBQTBCdUcsK0NBQW1DZCxpQkFBQU0sV0FBQSxlQUFBOztBQUNwRkwsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLdUQsaUJBQUFNLFdBQUEsa0JBQUE7O0FBQ2pCTCxXQUFBLEVBQVplLHVDQUF3QnZFLFNBQUt1RCxpQkFBQU0sV0FBQSxrQkFBQTs7QUFkbkJOLG1CQUFnQkMsV0FBQSxFQUY1QmdCLE1BQU0sdUJBQ05DLHdEQUNZbEI7O0FDUU4sSUFBTVcsT0FBTixNQUFNQSxhQUFhYjtJQWdDeEIsV0FBQXpCLENBQVlsRjtRQUNWb0YsTUFBTXBGO0FBQ1I7OztBQS9CQThHLFdBQUEsRUFGQ0MsR0FBRztJQUFFQyxNQUFNQztJQUNYQyw2Q0FDV00sS0FBQUwsV0FBQSxXQUFBOztBQUtaTCxXQUFBLEVBSENrQixVQUNBaEIsS0FBS0MsU0FDTFUsK0NBQ2NILEtBQUFMLFdBQUEsY0FBQTs7QUFLZkwsV0FBQSxFQUhDa0IsVUFDQWhCLEtBQUtDLFNBQ0xVLCtDQUNjSCxLQUFBTCxXQUFBLGNBQUE7O0FBS2ZMLFdBQUEsRUFIQ1MsWUFDQVAsS0FBS0MsU0FDTFUsK0NBQ29CSCxLQUFBTCxXQUFBLG9CQUFBOztBQUdyQkwsV0FBQSxFQURDbUIsVUFBVSxNQUFNcEIsa0JBQWtCbEYsY0FBYyw0Q0FDQzZGLEtBQUFMLFdBQUEsMEJBQUE7O0FBR2xETCxXQUFBLEVBRENtQixVQUFVLE1BQU1DLG1CQUFtQnZHLGNBQWMsNENBQ0U2RixLQUFBTCxXQUFBLDJCQUFBOztBQUdwREwsV0FBQSxFQURDYyx1Q0FDV3RFLFNBQUtrRSxLQUFBTCxXQUFBLGtCQUFBOztBQUdqQkwsV0FBQSxFQURDZSx1Q0FDV3ZFLFNBQUtrRSxLQUFBTCxXQUFBLGtCQUFBOztBQTlCTkssT0FBSVYsV0FBQSxFQUZoQmdCLE1BQU0sVUFDTkMsd0RBQ1lQOztBQ1BOLElBQU1VLG9CQUFOLE1BQU1BLDBCQUEwQnZCO0lBQ3JDLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQmdCLGtCQUFBZixXQUFBLFdBQUE7O0FBRzFDTCxXQUFBLEVBRkNNLFVBQVUsTUFBTUMsUUFBUW5GLHVCQUF1QixPQUFPb0YsV0FBVyw4QkFDakVDLGlEQUN3Qlcsa0JBQUFmLFdBQUEsZUFBQTs7QUFHekJMLFdBQUEsRUFGQ00sVUFBVSxNQUFNMUMsU0FBU3hDLHVCQUF1QixPQUFPb0YsV0FBVyxnQ0FDbEVDLGlEQUMwQlcsa0JBQUFmLFdBQUEsZ0JBQUE7O0FBRzNCTCxXQUFBLEVBRkNNLFVBQVUsTUFBTUksTUFBTTdGLGNBQWMsT0FBTzJGLFdBQVcsNEJBQ3REQyxpREFDb0JXLGtCQUFBZixXQUFBLGFBQUE7O0FBQ2tETCxXQUFBLEVBQXRFUyxZQUFZRSxLQUFPUixTQUFTUyxPQUFPdEcsMEJBQTBCdUcsK0NBQW1DTyxrQkFBQWYsV0FBQSxlQUFBOztBQUNwRkwsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLNEUsa0JBQUFmLFdBQUEsa0JBQUE7O0FBQ2pCTCxXQUFBLEVBQVplLHVDQUF3QnZFLFNBQUs0RSxrQkFBQWYsV0FBQSxrQkFBQTs7QUFqQm5CZSxvQkFBaUJwQixXQUFBLEVBRjdCZ0IsTUFBTSx5QkFDTkMsd0RBQ1lHOztBQ0ZOLElBQU1DLGlCQUFOLE1BQU1BLHVCQUF1QnhCO0lBQ2xDLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQmlCLGVBQUFoQixXQUFBLFdBQUE7O0FBRzFDTCxXQUFBLEVBRkNNLFVBQVUsTUFBTUMsUUFBUW5GLHVCQUF1QixPQUFPb0YsV0FBVywwQkFDakVDLGlEQUN3QlksZUFBQWhCLFdBQUEsZUFBQTs7QUFHekJMLFdBQUEsRUFGQ00sVUFBVSxNQUFNMUMsU0FBU3hDLHVCQUF1QixPQUFPb0YsV0FBVyw0QkFDbEVDLGlEQUMyQlksZUFBQWhCLFdBQUEsaUJBQUE7O0FBRzVCTCxXQUFBLEVBRkNNLFVBQVUsTUFBTTFDLFNBQVN4Qyx1QkFBdUIsT0FBT29GLFdBQVcsOEJBQ2xFQyxpREFDNkJZLGVBQUFoQixXQUFBLG1CQUFBOztBQUNRTCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPVyxTQUFTVCwrQ0FBd0JRLGVBQUFoQixXQUFBLGNBQUE7O0FBQ3hDTCxXQUFBLEVBQVpjLHVDQUF3QnRFLFNBQUs2RSxlQUFBaEIsV0FBQSxrQkFBQTs7QUFoQm5CZ0IsaUJBQWNyQixXQUFBLEVBRjFCZ0IsTUFBTSxxQkFDTkMsd0RBQ1lJOztBQ0FOLElBQU1FLGFBQU4sTUFBTUEsbUJBQW1CMUI7SUFDOUIsV0FBQXpCLENBQVlsRjtRQUNWb0YsTUFBTXBGO0FBQ1I7OztBQUU4QjhHLFdBQUEsRUFBN0JDLEdBQUc7SUFBRUMsTUFBTUM7SUFBV0MsNkNBQW1CbUIsV0FBQWxCLFdBQUEsV0FBQTs7QUFDTUwsV0FBQSxFQUEvQ2tCLFVBQVVULFlBQVlFLEtBQU9SLFNBQVNVLCtDQUFzQlUsV0FBQWxCLFdBQUEsWUFBQTs7QUFDWUwsV0FBQSxFQUF4RVMsWUFBWUUsS0FBT1IsU0FBU1MsT0FBT25HLDRCQUE0Qm9HLCtDQUF1Q1UsV0FBQWxCLFdBQUEsaUJBQUE7O0FBQzdFTCxXQUFBLEVBQXpCVyxLQUFPUixTQUFTVSwrQ0FBOEJVLFdBQUFsQixXQUFBLG9CQUFBOztBQUNPTCxXQUFBLEVBQXJEbUIsVUFBVSxNQUFNSyxnQkFBZ0IzRyxjQUFjLDRDQUFxRDBHLFdBQUFsQixXQUFBLHdCQUFBOztBQVR6RmtCLGFBQVV2QixXQUFBLEVBRnRCZ0IsTUFBTSxnQkFDTkMsd0RBQ1lNOztBQ0FOLElBQU1DLGlCQUFOLE1BQU1BLHVCQUF1QjNCO0lBQ2xDLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQm9CLGVBQUFuQixXQUFBLFdBQUE7O0FBRzFDTCxXQUFBLEVBRkNNLFVBQVUsTUFBTW1CLE1BQU1yRyx1QkFBdUIsT0FBT29GLFdBQVcsNkJBQy9EQyxpREFDb0JlLGVBQUFuQixXQUFBLGFBQUE7O0FBR3JCTCxXQUFBLEVBRkNNLFVBQVUsTUFBTWlCLFlBQVluRyx1QkFBdUIsT0FBT29GLFdBQVcsbUNBQ3JFQyxpREFDZ0NlLGVBQUFuQixXQUFBLG1CQUFBOztBQUNwQkwsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLZ0YsZUFBQW5CLFdBQUEsa0JBQUE7O0FBWm5CbUIsaUJBQWN4QixXQUFBLEVBRjFCZ0IsTUFBTSxxQkFDTkMsd0RBQ1lPOztBQ0NOLElBQU1DLE9BQU4sTUFBTUEsYUFBYTVCO0lBQ3hCLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQnFCLEtBQUFwQixXQUFBLFdBQUE7O0FBRTFDTCxXQUFBLEVBRENNLFVBQVUsTUFBTUMsUUFBUXBGLGFBQWEsT0FBT3FGLFdBQVcseURBQy9CaUIsS0FBQXBCLFdBQUEsZUFBQTs7QUFDYUwsV0FBQSxFQUFyQ1MsWUFBWUUsS0FBT1IsU0FBU1UsK0NBQXNCWSxLQUFBcEIsV0FBQSxZQUFBOztBQUNiTCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBdUJZLEtBQUFwQixXQUFBLGFBQUE7O0FBQzFCTCxXQUFBLEVBQXpCVyxLQUFPUixTQUFTVSwrQ0FBOEJZLEtBQUFwQixXQUFBLG9CQUFBOztBQUNyQkwsV0FBQSxFQUF6QlcsS0FBT3ZHLFNBQVN5RywrQ0FBNENZLEtBQUFwQixXQUFBLGlCQUFBOztBQUNQTCxXQUFBLEVBQXJEbUIsVUFBVSxNQUFNSyxnQkFBZ0IzRyxjQUFjLDRDQUFxRDRHLEtBQUFwQixXQUFBLHdCQUFBOztBQUM5Q0wsV0FBQSxFQUFyRG1CLFVBQVUsTUFBTU8sZ0JBQWdCN0csY0FBYyw0Q0FBaUQ0RyxLQUFBcEIsV0FBQSxvQkFBQTs7QUFDbkZMLFdBQUEsRUFBWmMsdUNBQXdCdEUsU0FBS2lGLEtBQUFwQixXQUFBLGtCQUFBOztBQUNqQkwsV0FBQSxFQUFaZSx1Q0FBd0J2RSxTQUFLaUYsS0FBQXBCLFdBQUEsa0JBQUE7O0FBZm5Cb0IsT0FBSXpCLFdBQUEsRUFGaEJnQixNQUFNLFVBQ05DLHdEQUNZUTs7QUNDTixJQUFNQyxpQkFBTixNQUFNQSx1QkFBdUI3QjtJQUNsQyxXQUFBekIsQ0FBWWxGO1FBQ1ZvRixNQUFNcEY7QUFDUjs7O0FBRThCOEcsV0FBQSxFQUE3QkMsR0FBRztJQUFFQyxNQUFNQztJQUFXQyw2Q0FBbUJzQixlQUFBckIsV0FBQSxXQUFBOztBQUcxQ0wsV0FBQSxFQUZDTSxVQUFVLE1BQU1DLFFBQVFuRix1QkFBdUIsT0FBT29GLFdBQVcsK0JBQ2pFQyxpREFDd0JpQixlQUFBckIsV0FBQSxlQUFBOztBQUd6QkwsV0FBQSxFQUZDTSxVQUFVLE1BQU1xQixXQUFXdkcsdUJBQXVCLE9BQU9vRixXQUFXLGtDQUNwRUMsaURBQzhCaUIsZUFBQXJCLFdBQUEsa0JBQUE7O0FBRy9CTCxXQUFBLEVBRkNNLFVBQVUsTUFBTW1CLE1BQU01RyxjQUFjLE9BQU8yRixXQUFXLDZCQUN0REMsaURBQ29CaUIsZUFBQXJCLFdBQUEsYUFBQTs7QUFDMkNMLFdBQUEsRUFBL0RTLFlBQVlFLEtBQU9SLFNBQVNTLE9BQU9wRyxtQkFBbUJxRywrQ0FBK0JhLGVBQUFyQixXQUFBLGtCQUFBOztBQUNoREwsV0FBQSxFQUFyQ1MsWUFBWUUsS0FBT1IsU0FBU1UsK0NBQTBCYSxlQUFBckIsV0FBQSxnQkFBQTs7QUFDaEJMLFdBQUEsRUFBdENTLFlBQVlFLEtBQU9pQixVQUFVZixnREFBK0JhLGVBQUFyQixXQUFBLG9CQUFBOztBQUNuREwsV0FBQSxFQUFUYSxvQ0FBb0JyRSxTQUFLa0YsZUFBQXJCLFdBQUEsaUJBQUE7O0FBQ2hCTCxXQUFBLEVBQVRhLG9DQUFxQnJFLFNBQUtrRixlQUFBckIsV0FBQSxrQkFBQTs7QUFDREwsV0FBQSxFQUF6QlcsS0FBT3ZHLFNBQVN5RywrQ0FBOENhLGVBQUFyQixXQUFBLG1CQUFBOztBQUNsREwsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLa0YsZUFBQXJCLFdBQUEsa0JBQUE7O0FBQ2pCTCxXQUFBLEVBQVplLHVDQUF3QnZFLFNBQUtrRixlQUFBckIsV0FBQSxrQkFBQTs7QUF0Qm5CcUIsaUJBQWMxQixXQUFBLEVBRjFCZ0IsTUFBTSxxQkFDTkMsd0RBQ1lTOztBQ0ROLElBQU1HLGdCQUFOLE1BQU1BLHNCQUFzQmhDO0lBQ2pDLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQnlCLGNBQUF4QixXQUFBLFdBQUE7O0FBRzFDTCxXQUFBLEVBRkNNLFVBQVUsTUFBTUMsUUFBUW5GLHVCQUF1QixPQUFPb0YsV0FBVyw4QkFDakVDLGlEQUN3Qm9CLGNBQUF4QixXQUFBLGVBQUE7O0FBR3pCTCxXQUFBLEVBRkNNLFVBQVUsTUFBTXdCLG1CQUFtQjFHLHVCQUF1QixPQUFPb0YsV0FBVyxnQ0FDNUVDLGlEQUNxQ29CLGNBQUF4QixXQUFBLGlCQUFBOztBQUd0Q0wsV0FBQSxFQUZDTSxVQUFVLE1BQU1xQixXQUFXdkcsdUJBQXVCLE9BQU9vRixXQUFXLGlDQUNwRUMsaURBQzhCb0IsY0FBQXhCLFdBQUEsa0JBQUE7O0FBQ09MLFdBQUEsRUFBckNTLFlBQVlFLEtBQU9SLFNBQVNVLCtDQUFnQ2dCLGNBQUF4QixXQUFBLHNCQUFBOztBQUNuREwsV0FBQSxFQUFUYSxvQ0FBb0JyRSxTQUFLcUYsY0FBQXhCLFdBQUEsaUJBQUE7O0FBQ2hCTCxXQUFBLEVBQVRhLG9DQUFxQnJFLFNBQUtxRixjQUFBeEIsV0FBQSxrQkFBQTs7QUFDREwsV0FBQSxFQUF6QlcsS0FBT3ZHLFNBQVN5RywrQ0FBOENnQixjQUFBeEIsV0FBQSxtQkFBQTs7QUFFL0RMLFdBQUEsRUFEQ00sVUFBVSxNQUFNcUIsV0FBVzlHLGNBQWMsT0FBTzJGLFdBQVcsdUVBQzdCcUIsY0FBQXhCLFdBQUEsa0JBQUE7O0FBQ2xCTCxXQUFBLEVBQVpjLHVDQUF3QnRFLFNBQUtxRixjQUFBeEIsV0FBQSxrQkFBQTs7QUFDakJMLFdBQUEsRUFBWmUsdUNBQXdCdkUsU0FBS3FGLGNBQUF4QixXQUFBLGtCQUFBOztBQXRCbkJ3QixnQkFBYTdCLFdBQUEsRUFGekJnQixNQUFNLG9CQUNOQyx3REFDWVk7O0FDQ04sSUFBTUYsWUFBTixNQUFNQSxrQkFBa0I5QjtJQUM3QixXQUFBekIsQ0FBWWxGO1FBQ1ZvRixNQUFNcEY7QUFDUjs7O0FBRThCOEcsV0FBQSxFQUE3QkMsR0FBRztJQUFFQyxNQUFNQztJQUFXQyw2Q0FBbUJ1QixVQUFBdEIsV0FBQSxXQUFBOztBQUcxQ0wsV0FBQSxFQUZDTSxVQUFVLE1BQU1DLFFBQVExRixjQUFjLE9BQU8yRixXQUFXLHlCQUN4REMsaURBQ3dCa0IsVUFBQXRCLFdBQUEsZUFBQTs7QUFDMkNMLFdBQUEsRUFBbkVTLFlBQVlFLEtBQU9SLFNBQVNTLE9BQU9yRyx1QkFBdUJzRywrQ0FBOEJjLFVBQUF0QixXQUFBLGFBQUE7O0FBQ25ETCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBNEJjLFVBQUF0QixXQUFBLGtCQUFBOztBQUNITCxXQUFBLEVBQXJEbUIsVUFBVSxNQUFNTyxnQkFBZ0I3RyxjQUFjLDRDQUFxRDhHLFVBQUF0QixXQUFBLHdCQUFBOztBQUMvQ0wsV0FBQSxFQUFwRG1CLFVBQVUsTUFBTVUsZUFBZWhILGNBQWMsNENBQW1EOEcsVUFBQXRCLFdBQUEsdUJBQUE7O0FBQ3BGTCxXQUFBLEVBQVpjLHVDQUF3QnRFLFNBQUttRixVQUFBdEIsV0FBQSxrQkFBQTs7QUFDakJMLFdBQUEsRUFBWmUsdUNBQXdCdkUsU0FBS21GLFVBQUF0QixXQUFBLGtCQUFBOztBQWRuQnNCLFlBQVMzQixXQUFBLEVBRnJCZ0IsTUFBTSxlQUNOQyx3REFDWVU7O0FDQ04sSUFBTUcsb0JBQU4sTUFBTUEsMEJBQTBCakM7SUFDckMsV0FBQXpCLENBQVlsRjtRQUNWb0YsTUFBTXBGO0FBQ1I7OztBQUU4QjhHLFdBQUEsRUFBN0JDLEdBQUc7SUFBRUMsTUFBTUM7SUFBV0MsNkNBQW1CMEIsa0JBQUF6QixXQUFBLFdBQUE7O0FBRzFDTCxXQUFBLEVBRkNNLFVBQVUsTUFBTUMsUUFBUTFGLGNBQWMsT0FBTzJGLFdBQVcsa0NBQ3hEQyxpREFDd0JxQixrQkFBQXpCLFdBQUEsZUFBQTs7QUFHekJMLFdBQUEsRUFGQ00sVUFBVSxNQUFNMUMsU0FBUy9DLGNBQWMsT0FBTzJGLFdBQVcsb0NBQ3pEQyxpREFDMEJxQixrQkFBQXpCLFdBQUEsZ0JBQUE7O0FBQ1dMLFdBQUEsRUFBckNTLFlBQVlFLEtBQU9SLFNBQVNVLCtDQUErQmlCLGtCQUFBekIsV0FBQSxxQkFBQTs7QUFDdEJMLFdBQUEsRUFBckNTLFlBQVlFLEtBQU9SLFNBQVNVLCtDQUE2QmlCLGtCQUFBekIsV0FBQSxtQkFBQTs7QUFDZUwsV0FBQSxFQUF4RVMsWUFBWUUsS0FBT1IsU0FBU1MsT0FBT2xHLDRCQUE0Qm1HLCtDQUF5Q2lCLGtCQUFBekIsV0FBQSxtQkFBQTs7QUFFekdMLFdBQUEsRUFEQ00sVUFBVSxNQUFNcUIsV0FBV3hHLGFBQWEsT0FBT3FGLFdBQVcsc0VBQ2hDc0Isa0JBQUF6QixXQUFBLGNBQUE7O0FBQ0RMLFdBQUEsRUFBekJXLEtBQU9SLFNBQVNVLCtDQUE4QmlCLGtCQUFBekIsV0FBQSxvQkFBQTs7QUFDckJMLFdBQUEsRUFBekJXLEtBQU92RyxTQUFTeUcsK0NBQTRDaUIsa0JBQUF6QixXQUFBLGlCQUFBOztBQUNSTCxXQUFBLEVBQXBEbUIsVUFBVSxNQUFNVSxlQUFlaEgsY0FBYyw0Q0FBMkNpSCxrQkFBQXpCLFdBQUEsZUFBQTs7QUFDNUVMLFdBQUEsRUFBWmMsdUNBQXdCdEUsU0FBS3NGLGtCQUFBekIsV0FBQSxrQkFBQTs7QUFDakJMLFdBQUEsRUFBWmUsdUNBQXdCdkUsU0FBS3NGLGtCQUFBekIsV0FBQSxrQkFBQTs7QUFyQm5CeUIsb0JBQWlCOUIsV0FBQSxFQUY3QmdCLE1BQU0sd0JBQ05DLHdEQUNZYTs7QUNGTixJQUFNQyxtQkFBTixNQUFNQSx5QkFBeUJsQztJQUNwQyxXQUFBekIsQ0FBWWxGO1FBQ1ZvRixNQUFNcEY7QUFDUjs7O0FBRThCOEcsV0FBQSxFQUE3QkMsR0FBRztJQUFFQyxNQUFNQztJQUFXQyw2Q0FBbUIyQixpQkFBQTFCLFdBQUEsV0FBQTs7QUFHMUNMLFdBQUEsRUFGQ00sVUFBVSxNQUFNQyxRQUFRbkYsdUJBQXVCLE9BQU9vRixXQUFXLGlDQUNqRUMsaURBQ3dCc0IsaUJBQUExQixXQUFBLGVBQUE7O0FBR3pCTCxXQUFBLEVBRkNNLFVBQVUsTUFBTTFDLFNBQVN4Qyx1QkFBdUIsT0FBT29GLFdBQVcsbUNBQ2xFQyxpREFDMEJzQixpQkFBQTFCLFdBQUEsZ0JBQUE7O0FBRTNCTCxXQUFBLEVBRENNLFVBQVUsTUFBTTFDLFNBQVN6QyxhQUFhLE9BQU9xRixXQUFXLGdGQUNsQnVCLGlCQUFBMUIsV0FBQSw0QkFBQTs7QUFDa0NMLFdBQUEsRUFBeEVTLFlBQVlFLEtBQU9SLFNBQVNTLE9BQU9uRyw0QkFBNEJvRywrQ0FBaURrQixpQkFBQTFCLFdBQUEsMkJBQUE7O0FBQ3ZGTCxXQUFBLEVBQXpCVyxLQUFPUixTQUFTVSwrQ0FBeUJrQixpQkFBQTFCLFdBQUEsZUFBQTs7QUFDN0JMLFdBQUEsRUFBWmMsdUNBQXdCdEUsU0FBS3VGLGlCQUFBMUIsV0FBQSxrQkFBQTs7QUFDakJMLFdBQUEsRUFBWmUsdUNBQXdCdkUsU0FBS3VGLGlCQUFBMUIsV0FBQSxrQkFBQTs7QUFqQm5CMEIsbUJBQWdCL0IsV0FBQSxFQUY1QmdCLE1BQU0sdUJBQ05DLHdEQUNZYzs7QUNFTixJQUFNbkUsVUFBTixNQUFNQSxnQkFBZ0JpQztJQUMzQixXQUFBekIsQ0FBWWxGO1FBQ1ZvRixNQUFNcEY7QUFDUjs7O0FBRThCOEcsV0FBQSxFQUE3QkMsR0FBRztJQUFFQyxNQUFNQztJQUFXQyw2Q0FBbUJ4QyxRQUFBeUMsV0FBQSxXQUFBOztBQUcxQ0wsV0FBQSxFQUZDTSxVQUFVLE1BQU1DLFFBQVExRixjQUFjLE9BQU8yRixXQUFXLHdCQUN4REMsaURBQ3dCN0MsUUFBQXlDLFdBQUEsZUFBQTs7QUFFekJMLFdBQUEsRUFEQ00sVUFBVSxNQUFNMUMsU0FBUy9DLGNBQWMsT0FBTzJGLFdBQVcsNkRBQ2hDNUMsUUFBQXlDLFdBQUEsZUFBQTs7QUFDcUJMLFdBQUEsRUFBOUNtQixVQUFVLE1BQU12RCxTQUFTL0MsY0FBYyw0Q0FBdUMrQyxRQUFBeUMsV0FBQSxpQkFBQTs7QUFDekNMLFdBQUEsRUFBckNTLFlBQVlFLEtBQU9SLFNBQVNVLCtDQUF1QmpELFFBQUF5QyxXQUFBLGFBQUE7O0FBQ2RMLFdBQUEsRUFBckNTLFlBQVlFLEtBQU9SLFNBQVNVLCtDQUF1QmpELFFBQUF5QyxXQUFBLGFBQUE7O0FBQzFCTCxXQUFBLEVBQXpCVyxLQUFPdkcsU0FBU3lHLCtDQUE0Q2pELFFBQUF5QyxXQUFBLGlCQUFBOztBQUNKTCxXQUFBLEVBQXhEbUIsVUFBVSxNQUFNQyxtQkFBbUJ2RyxjQUFjLDRDQUFvRCtDLFFBQUF5QyxXQUFBLG9CQUFBOztBQUM3Q0wsV0FBQSxFQUF4RG1CLFVBQVUsTUFBTVcsbUJBQW1CakgsY0FBYyw0Q0FBa0QrQyxRQUFBeUMsV0FBQSxrQkFBQTs7QUFDNUNMLFdBQUEsRUFBdkRtQixVQUFVLE1BQU1ZLGtCQUFrQmxILGNBQWMsNENBQXlEK0MsUUFBQXlDLFdBQUEsMEJBQUE7O0FBQ3BETCxXQUFBLEVBQXJEbUIsVUFBVSxNQUFNRSxnQkFBZ0J4RyxjQUFjLDRDQUFtRCtDLFFBQUF5QyxXQUFBLHNCQUFBOztBQUM1Q0wsV0FBQSxFQUFyRG1CLFVBQVUsTUFBTUUsZ0JBQWdCeEcsY0FBYyw0Q0FBcUQrQyxRQUFBeUMsV0FBQSx3QkFBQTs7QUFDdkZMLFdBQUEsRUFBWmMsdUNBQXdCdEUsU0FBS29CLFFBQUF5QyxXQUFBLGtCQUFBOztBQUNqQkwsV0FBQSxFQUFaZSx1Q0FBd0J2RSxTQUFLb0IsUUFBQXlDLFdBQUEsa0JBQUE7O0FBckJuQnpDLFVBQU9vQyxXQUFBLEVBRm5CZ0IsTUFBTSxjQUNOQyx3REFDWXJEOztBQ0hOLElBQU1vRSxpQkFBTixNQUFNQSx1QkFBdUJuQztJQUNsQyxXQUFBekIsQ0FBWWxGO1FBQ1ZvRixNQUFNcEY7QUFDUjs7O0FBRThCOEcsV0FBQSxFQUE3QkMsR0FBRztJQUFFQyxNQUFNQztJQUFXQyw2Q0FBbUI0QixlQUFBM0IsV0FBQSxXQUFBOztBQUcxQ0wsV0FBQSxFQUZDTSxVQUFVLE1BQU1DLFFBQVFuRix1QkFBdUIsT0FBT29GLFdBQVcsK0JBQ2pFQyxpREFDd0J1QixlQUFBM0IsV0FBQSxlQUFBOztBQUN5Q0wsV0FBQSxFQUFqRVMsWUFBWUUsS0FBT1IsU0FBU1MsT0FBT2pHLHFCQUFxQmtHLCtDQUFtQ21CLGVBQUEzQixXQUFBLG9CQUFBOztBQUNuQkwsV0FBQSxFQUF4RVMsWUFBWUUsS0FBT1IsU0FBU1MsT0FBT2hHLDRCQUE0QmlHLCtDQUEwQ21CLGVBQUEzQixXQUFBLG9CQUFBOztBQUNwRUwsV0FBQSxFQUFyQ1MsWUFBWUUsS0FBT1IsU0FBU1UsK0NBQTZCbUIsZUFBQTNCLFdBQUEsbUJBQUE7O0FBQ3BCTCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBeUJtQixlQUFBM0IsV0FBQSxlQUFBOztBQUM1QkwsV0FBQSxFQUF6QlcsS0FBT3ZHLFNBQVN5RywrQ0FBMENtQixlQUFBM0IsV0FBQSxlQUFBOztBQUM5Q0wsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLd0YsZUFBQTNCLFdBQUEsa0JBQUE7O0FBQ2pCTCxXQUFBLEVBQVplLHVDQUF3QnZFLFNBQUt3RixlQUFBM0IsV0FBQSxrQkFBQTs7QUFmbkIyQixpQkFBY2hDLFdBQUEsRUFGMUJnQixNQUFNLHFCQUNOQyx3REFDWWU7O0FDaUJOLElBQU16QixTQUFOLE1BQU1BLGVBQWVWO0lBQzFCLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQkcsT0FBQUYsV0FBQSxXQUFBOztBQUNNTCxXQUFBLEVBQS9Da0IsVUFBVVQsWUFBWUUsS0FBT1IsU0FBU1UsK0NBQXVCTixPQUFBRixXQUFBLGFBQUE7O0FBQ3hCTCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBdUJOLE9BQUFGLFdBQUEsYUFBQTs7QUFLcERMLFdBQUEsRUFKQ1MsWUFDQUUsS0FBT1IsU0FDUFMsT0FBT3pHLHVCQUNQMEcsK0NBQzZCTixPQUFBRixXQUFBLHNCQUFBOztBQUNpQkwsV0FBQSxFQUE5Q21CLFVBQVUsTUFBTXZELFNBQVMvQyxjQUFjLDRDQUUzQjBGLE9BQUFGLFdBQUEsaUJBQUE7O0FBQzJDTCxXQUFBLEVBQXZEbUIsVUFBVSxNQUFNcEIsa0JBQWtCbEYsY0FBYyw0Q0FFcEMwRixPQUFBRixXQUFBLG9CQUFBOztBQUNvQ0wsV0FBQSxFQUFoRG1CLFVBQVUsTUFBTVEsV0FBVzlHLGNBQWMsNENBRTdCMEYsT0FBQUYsV0FBQSxtQkFBQTs7QUFDeUNMLFdBQUEsRUFBckRtQixVQUFVLE1BQU1hLGdCQUFnQm5ILGNBQWMsNENBRWxDMEYsT0FBQUYsV0FBQSx3QkFBQTs7QUFDQUwsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLK0QsT0FBQUYsV0FBQSxrQkFBQTs7QUFDakJMLFdBQUEsRUFBWmUsdUNBQXdCdkUsU0FBSytELE9BQUFGLFdBQUEsa0JBQUE7O0FBMUJuQkUsU0FBTVAsV0FBQSxFQUZsQmdCLE1BQU0sWUFDTkMsd0RBQ1lWOztBQ2xCTixJQUFNMEIsZ0JBQU4sTUFBTUEsc0JBQXNCcEM7SUFDakMsV0FBQXpCLENBQVlsRjtRQUNWb0YsTUFBTXBGO0FBQ1I7OztBQUU4QjhHLFdBQUEsRUFBN0JDLEdBQUc7SUFBRUMsTUFBTUM7SUFBV0MsNkNBQW1CNkIsY0FBQTVCLFdBQUEsV0FBQTs7QUFHMUNMLFdBQUEsRUFGQ00sVUFBVSxNQUFNQyxRQUFRbkYsdUJBQXVCLE9BQU9vRixXQUFXLDhCQUNqRUMsaURBQ3dCd0IsY0FBQTVCLFdBQUEsZUFBQTs7QUFDYUwsV0FBQSxFQUFyQ1MsWUFBWUUsS0FBT1IsU0FBU1UsK0NBQTZCb0IsY0FBQTVCLFdBQUEsbUJBQUE7O0FBQ2hDTCxXQUFBLEVBQXpCVyxLQUFPdkcsU0FBU3lHLCtDQUE0Q29CLGNBQUE1QixXQUFBLGlCQUFBOztBQUNoREwsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLeUYsY0FBQTVCLFdBQUEsa0JBQUE7O0FBQ2pCTCxXQUFBLEVBQVplLHVDQUF3QnZFLFNBQUt5RixjQUFBNUIsV0FBQSxrQkFBQTs7QUFabkI0QixnQkFBYWpDLFdBQUEsRUFGekJnQixNQUFNLG9CQUNOQyx3REFDWWdCOztBQ0FOLElBQU1DLGlCQUFOLE1BQU1BLHVCQUF1QnJDO0lBQ2xDLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQjhCLGVBQUE3QixXQUFBLFdBQUE7O0FBRzFDTCxXQUFBLEVBRkNNLFVBQVUsTUFBTTFDLFNBQVN4Qyx1QkFBdUIsT0FBT29GLFdBQVcsa0NBQ2xFQyxpREFDMEJ5QixlQUFBN0IsV0FBQSxnQkFBQTs7QUFDV0wsV0FBQSxFQUFyQ1MsWUFBWUUsS0FBT1IsU0FBU1UsK0NBQTZCcUIsZUFBQTdCLFdBQUEsbUJBQUE7O0FBQ2hDTCxXQUFBLEVBQXpCVyxLQUFPdkcsU0FBU3lHLCtDQUE0Q3FCLGVBQUE3QixXQUFBLGlCQUFBOztBQUNoREwsV0FBQSxFQUFaYyx1Q0FBd0J0RSxTQUFLMEYsZUFBQTdCLFdBQUEsa0JBQUE7O0FBQ2pCTCxXQUFBLEVBQVplLHVDQUF3QnZFLFNBQUswRixlQUFBN0IsV0FBQSxrQkFBQTs7QUFabkI2QixpQkFBY2xDLFdBQUEsRUFGMUJnQixNQUFNLHNCQUNOQyx3REFDWWlCOztBQ0VOLElBQU1DLGtCQUFOLE1BQU1BLHdCQUF3QnRDO0lBQ25DLFdBQUF6QixDQUFZbEY7UUFDVm9GLE1BQU1wRjtBQUNSOzs7QUFFOEI4RyxXQUFBLEVBQTdCQyxHQUFHO0lBQUVDLE1BQU1DO0lBQVdDLDZDQUFtQitCLGdCQUFBOUIsV0FBQSxXQUFBOztBQUcxQ0wsV0FBQSxFQUZDTSxVQUFVLE1BQU1DLFFBQVFuRix1QkFBdUIsT0FBT29GLFdBQVcsZ0NBQ2pFQyxpREFDd0IwQixnQkFBQTlCLFdBQUEsZUFBQTs7QUFHekJMLFdBQUEsRUFGQ00sVUFBVSxNQUFNOEIsT0FBT2hILHVCQUF1QixPQUFPb0YsV0FBVywrQkFDaEVDLGlEQUNzQjBCLGdCQUFBOUIsV0FBQSxjQUFBOztBQUd2QkwsV0FBQSxFQUZDTSxVQUFVLE1BQU1xQixXQUFXdkcsdUJBQXVCLE9BQU9vRixXQUFXLG1DQUNwRUMsaURBQzhCMEIsZ0JBQUE5QixXQUFBLGtCQUFBOztBQUNMTCxXQUFBLEVBQXpCVyxLQUFPdkcsU0FBU3lHLCtDQUE0Q3NCLGdCQUFBOUIsV0FBQSxpQkFBQTs7QUFDaERMLFdBQUEsRUFBWmMsdUNBQXdCdEUsU0FBSzJGLGdCQUFBOUIsV0FBQSxrQkFBQTs7QUFoQm5COEIsa0JBQWVuQyxXQUFBLEVBRjNCZ0IsTUFBTSxzQkFDTkMsd0RBQ1lrQjs7QUNBTixJQUFNQyxRQUFOLE1BQU1BLGNBQWN2QztJQUN6QixXQUFBekIsQ0FBWWxGO1FBQ1ZvRixNQUFNcEY7QUFDUjs7O0FBRThCOEcsV0FBQSxFQUE3QkMsR0FBRztJQUFFQyxNQUFNQztJQUFXQyw2Q0FBbUJnQyxNQUFBL0IsV0FBQSxXQUFBOztBQUcxQ0wsV0FBQSxFQUZDTSxVQUFVLE1BQU1DLFFBQVExRixjQUFjLE9BQU8yRixXQUFXLHFCQUN4REMsaURBQ3dCMkIsTUFBQS9CLFdBQUEsZUFBQTs7QUFFekJMLFdBQUEsRUFEQ00sVUFBVSxNQUFNMUMsU0FBU3pDLGFBQWEsT0FBT3FGLFdBQVcsNERBQzlCNEIsTUFBQS9CLFdBQUEsZ0JBQUE7O0FBQ1dMLFdBQUEsRUFBckNTLFlBQVlFLEtBQU9SLFNBQVNVLCtDQUF1QnVCLE1BQUEvQixXQUFBLGFBQUE7O0FBQzFCTCxXQUFBLEVBQXpCVyxLQUFPdkcsU0FBU3lHLCtDQUE0Q3VCLE1BQUEvQixXQUFBLGlCQUFBOztBQUNOTCxXQUFBLEVBQXREbUIsVUFBVSxNQUFNZ0IsaUJBQWlCdEgsY0FBYyw0Q0FBOEN1SCxNQUFBL0IsV0FBQSxnQkFBQTs7QUFDakZMLFdBQUEsRUFBWmMsdUNBQXdCdEUsU0FBSzRGLE1BQUEvQixXQUFBLGtCQUFBOztBQUNqQkwsV0FBQSxFQUFaZSx1Q0FBd0J2RSxTQUFLNEYsTUFBQS9CLFdBQUEsa0JBQUE7O0FBZm5CK0IsUUFBS3BDLFdBQUEsRUFGakJnQixNQUFNLFdBQ05DLHdEQUNZbUI7O0FDQU4sSUFBTUMsc0JBQU4sTUFBTUEsNEJBQTRCeEM7SUFDdkMsV0FBQXpCLENBQVlsRjtRQUNWb0YsTUFBTXBGO0FBQ1I7OztBQUU4QjhHLFdBQUEsRUFBN0JDLEdBQUc7SUFBRUMsTUFBTUM7SUFBV0MsNkNBQW1CaUMsb0JBQUFoQyxXQUFBLFdBQUE7O0FBRzFDTCxXQUFBLEVBRkNNLFVBQVUsTUFBTUMsUUFBUW5GLHVCQUF1QixPQUFPb0YsV0FBVyxvQ0FDakVDLGlEQUN3QjRCLG9CQUFBaEMsV0FBQSxlQUFBOztBQUd6QkwsV0FBQSxFQUZDTSxVQUFVLE1BQU1xQixXQUFXdkcsdUJBQXVCLE9BQU9vRixXQUFXLHVDQUNwRUMsaURBQzhCNEIsb0JBQUFoQyxXQUFBLGtCQUFBOztBQUNPTCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBZ0N3QixvQkFBQWhDLFdBQUEsc0JBQUE7O0FBQ0dMLFdBQUEsRUFBL0RTLFlBQVlFLEtBQU9SLFNBQVNTLE9BQU9wRyxtQkFBbUJxRywrQ0FBK0J3QixvQkFBQWhDLFdBQUEsa0JBQUE7O0FBQ2hETCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBMEJ3QixvQkFBQWhDLFdBQUEsZ0JBQUE7O0FBQ2pCTCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBNkJ3QixvQkFBQWhDLFdBQUEsbUJBQUE7O0FBQ3BCTCxXQUFBLEVBQXJDUyxZQUFZRSxLQUFPUixTQUFTVSwrQ0FBMkJ3QixvQkFBQWhDLFdBQUEsaUJBQUE7O0FBQzlDTCxXQUFBLEVBQVRhLG9DQUFvQnJFLFNBQUs2RixvQkFBQWhDLFdBQUEsaUJBQUE7O0FBQ2hCTCxXQUFBLEVBQVRhLG9DQUFxQnJFLFNBQUs2RixvQkFBQWhDLFdBQUEsa0JBQUE7O0FBQ2RMLFdBQUEsRUFBWmMsdUNBQXdCdEUsU0FBSzZGLG9CQUFBaEMsV0FBQSxrQkFBQTs7QUFuQm5CZ0Msc0JBQW1CckMsV0FBQSxFQUYvQmdCLE1BQU0sMEJBQ05DLHdEQUNZb0I7O0FDUFAsTUFBT0MsNkJBQTZCcEU7SUFDeEMsV0FBQUU7UUFDRUUsTUFBTTJEO0FBQ1I7SUFFQSxtQkFBTU0sQ0FDSi9HLFVBQ0FnSCxZQUNBQyxhQUNHL0Q7UUFFSCxPQUFPQyxLQUFLRixPQUNWO1lBQ0VpRSxRQUFRbEg7WUFDUmdIO1lBQ0FDO2NBRUMvRDtBQUVQO0lBRUEsbUJBQU1pRSxDQUNKbkgsYUFDR2tEO1FBRUgsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUFRQyxXQUMzQ25HLFdBQVdtRyxRQUFRSCxRQUFRbEg7QUFFL0I7SUFFQSxxQkFBTXNILENBQWdCdEgsYUFBcUJrRDtRQUN6QyxLQUFLLE1BQU1xRSxhQUFhcEUsS0FBS2dFLGNBQWNuSCxhQUFha0QsT0FBTztrQkFDdkRDLEtBQUtTLFdBQVcyRCxJQUFJaEUsT0FBT0w7QUFDbkM7QUFDRjs7O0FDbENJLE1BQU9zRSw4QkFBOEI5RTtJQUN6QyxXQUFBRTtRQUNFRSxNQUFNNEQ7QUFDUjtJQUVBLG1CQUFNSyxDQUNKVSxXQUNBVCxZQUNBQyxhQUNHL0Q7UUFFSCxPQUFPQyxLQUFLRixPQUNWO1lBQ0V5RSxTQUFTRDtZQUNUVDtZQUNBQztjQUVDL0Q7QUFFUDtJQUVBLG9CQUFNeUUsQ0FDSkYsY0FDR3ZFO1FBRUgsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUFRQyxXQUMzQ2hHLGNBQWNnRyxRQUFRSyxTQUFTRDtBQUVuQzs7O0FDdkJJLE1BQU9HLDhCQUE4QmxGO0lBQ3pDLFdBQUFFO1FBQ0VFLE1BQU0rQztBQUNSO0lBRUEsbUJBQU1nQyxDQUNKN0gsVUFDQXlILGNBQ0d2RTtRQUVILGNBQWNDLEtBQUtlLFdBQVdoQixPQUMzQmtFLE9BQ0VHLE9BQ0NyRyxXQUFXcUcsSUFBSUwsUUFBUWxILGFBQ3ZCcUIsY0FBY2tHLElBQUlPLFlBQVlMLFlBRWpDTSxLQUFLLENBQUNDLE1BQU1DLFVBQVVELEtBQUtFLFFBQVFELE1BQU1DO0FBQzlDO0lBRUEscUJBQU1DLENBQ0puSSxVQUNBeUgsY0FDR3ZFO1FBRUgsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQzNCa0UsT0FDRUcsT0FDQ3JHLFdBQVdxRyxJQUFJTCxRQUFRbEgsYUFDdkJxQixjQUFja0csSUFBSWEsVUFBVVgsWUFFL0JNLEtBQUssQ0FBQ0MsTUFBTUMsVUFBVUQsS0FBS0UsUUFBUUQsTUFBTUM7QUFDOUM7SUFFQSxrQkFBTUcsQ0FDSnJJLFVBQ0FzSSxtQkFDQUMsd0JBQ0dyRjtRQUVILGNBQ1FDLEtBQUswRSxjQUFjN0gsVUFBVXVJLHdCQUF3QnJGLE9BQzNEc0YsS0FBTWpCLE9BQVFsRyxjQUFja0csSUFBSWEsVUFBVUU7QUFDOUM7SUFFQSxvQkFBTUcsQ0FDSnpJLFVBQ0F5SCxjQUNHdkU7UUFFSCxPQUFPQyxLQUFLRixPQUNWO1lBQ0VpRSxRQUFRbEg7WUFDUm9JLFVBQVVYO1lBQ1ZLLFlBQVlMO1lBQ1pTLE9BQU87Y0FFTmhGO0FBRVA7SUFFQSxvQ0FBTXdGLENBQ0oxSSxVQUNBMkksaUJBQ0FDLG1CQUNHMUY7UUFFSCxNQUFNMkYsc0JBQXNCMUYsS0FBSzBFLGNBQy9CN0gsVUFDQTJJLG9CQUNHekY7UUFFTCxLQUFLLE1BQU00RixRQUFRRCxlQUFlO2tCQUMxQjFGLEtBQUtGLE9BQ1Q7Z0JBQ0VpRSxRQUFRbEg7Z0JBQ1JvSSxVQUFVVSxLQUFLVjtnQkFDZk4sWUFBWWM7Z0JBQ1pWLE9BQU9ZLEtBQUtaLFFBQVE7a0JBRW5CaEY7QUFFUDtBQUNGO0lBRUEsMkJBQU02RixDQUNKL0ksVUFDQXlILGNBQ0d2RTtRQUVILE1BQU04RixnQkFBZ0I3RixLQUFLZ0YsZ0JBQWdCbkksVUFBVXlILGNBQWN2RTtRQUNuRSxNQUFNK0YsZ0JBQWdCLElBQUlDLElBQUksRUFDNUJ6QixjQUNHdUIsUUFBUXpHLElBQUtnRixPQUFRbkcsV0FBV21HLElBQUlPO1FBRXpDLE1BQU1xQixjQUFjLElBQUlELElBQUksRUFDMUJ6QixjQUNHdUIsUUFBUXpHLElBQUtnRixPQUFRbkcsV0FBV21HLElBQUlhO1FBRXpDLE1BQU1nQixjQUFjakcsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUN4Q0csT0FDQ3JHLFdBQVdxRyxJQUFJTCxRQUFRbEgsY0FDdEJpSixjQUFjSSxJQUFJakksV0FBV21HLElBQUlPLGdCQUNoQ3FCLFlBQVlFLElBQUlqSSxXQUFXbUcsSUFBSWE7UUFFckMsS0FBSyxNQUFNYixPQUFPNkIsTUFBTTtrQkFDaEJqRyxLQUFLUyxXQUFXMkQsSUFBSWhFLE9BQU9MO0FBQ25DO0FBQ0Y7OztBQy9HSSxNQUFPb0csZ0NBQWdDNUc7SUFDM0MsV0FBQUU7UUFDRUUsTUFBTXlEO0FBQ1I7SUFFQSxtQkFBTWdELENBQ0p2SixVQUNBeUgsV0FDQStCLG9CQUNBQyx1QkFDQUMsV0FDR3hHO1FBRUgsT0FBT0MsS0FBS0YsT0FDVjtZQUNFaUUsUUFBUWxIO1lBQ1IwSCxTQUFTRDtZQUNUa0MscUJBQXFCRjtZQUNyQkQ7WUFDQUU7Y0FFQ3hHO0FBRVA7SUFFQSxxQkFBTTBHLENBQWdCQyxZQUFvQjNHO2NBQ2xDQyxLQUFLUyxXQUFXaUcsWUFBWTNHO0FBQ3BDO0lBRUEsb0JBQU15RSxDQUNKM0gsVUFDQXlILGNBQ0d2RTtRQUVILGNBQWNDLEtBQUtlLFdBQVdoQixPQUFPa0UsT0FDbEMwQyxTQUNDNUksV0FBVzRJLE1BQU01QyxRQUFRbEgsYUFDekJxQixjQUFjeUksTUFBTXBDLFNBQVNEO0FBRW5DO0lBRUEsZ0NBQU1zQyxDQUNKL0osVUFDQXlILFdBQ0FhLG1CQUNBMEIsYUFDRzlHO1FBRUgsY0FBY0MsS0FBS3dFLGVBQWUzSCxVQUFVeUgsY0FBY3ZFLE9BQU9zRixLQUM5RHNCLFNBQ0NBLE1BQU1OLHVCQUF1QlEsY0FDM0JGLE1BQU1ILHVCQUNOdEksY0FBY3lJLE1BQU1ILHFCQUFxQnJCO0FBRWpEOzs7QUN0REksTUFBTzJCLHNCQUFzQnZIO0lBQ2pDLFdBQUFFO1FBQ0VFLE1BQU1pQztBQUNSO0lBRUEsa0JBQU1tRixDQUFhQyxVQUE2QmpIO1FBQzlDLE9BQU9DLEtBQUtGLE9BQ1Y7WUFDRW1ILE1BQU1ELE1BQU1DO1lBQ1pDLE1BQU1GLE1BQU1FO1lBQ1pDLGVBQWVILE1BQU1HLGlCQUFpQm5NLGNBQWNvTTtjQUVuRHJIO0FBRVA7SUFFQSxlQUFNc0gsQ0FBVUosU0FBaUJsSDtRQUMvQixPQUFPQyxLQUFLVSxVQUFVLFFBQVF1RyxTQUFrQmxIO0FBQ2xEO0lBRUEsa0JBQU11SCxDQUFhekssVUFBa0JxSyxTQUFpQm5IO1FBQ3BELE9BQU9DLEtBQUtNLFVBQVV6RCxVQUFVO1lBQUVxSztjQUFXbkg7QUFDL0M7SUFFQSxnQkFBTXdILENBQVcxSyxVQUFrQm9LLFNBQWlCbEg7UUFDbEQsT0FBT0MsS0FBS00sVUFBVXpELFVBQVU7WUFBRW9LO2NBQVdsSDtBQUMvQztJQUVBLHNCQUFNeUgsQ0FDSjNLLFVBQ0FzSyxrQkFDR3BIO1FBRUgsT0FBT0MsS0FBS00sVUFBVXpELFVBQVU7WUFBRXNLO2NBQW9CcEg7QUFDeEQ7SUFFQSw0QkFBTTBILENBQXVCNUssYUFBcUJrRDtjQUMxQ0MsS0FBS1MsV0FBVzVELGFBQWFrRDtBQUNyQzs7O0FDbkNGekcsZUFBZW9PLGlCQUNiQyxTQUNBMUIsU0FDR2xHO0lBRUgsS0FBSyxNQUFNcUUsT0FBTzZCLE1BQU07Y0FDaEIwQixRQUFRbEgsV0FBVzJELElBQUloRSxPQUFPTDtBQUN0QztBQUNGOztBQUVNLE1BQU82SCx1QkFBdUJySTtJQUNsQyxXQUFBRTtRQUNFRSxNQUFNVjtBQUNSO0lBRVEsV0FBQTRJLENBQVlDLFlBQWdDWjtRQUNsRCxNQUFNYSxVQUFVM0osVUFBVThJO1FBQzFCLE9BQU9ZLGFBQWEsR0FBR0EsV0FBV3hKLFFBQVEsUUFBUSxPQUFPeUosWUFBWSxJQUFJQTtBQUMzRTtJQUVRLDJCQUFNQyxDQUNaMUQsV0FDQVQsWUFDQW9FLG9CQUNHbEk7UUFFSCxLQUFLOEQsWUFBWTtlQUNYLElBQUlRLHVCQUF3QlQsY0FBY1UsV0FBV1QsWUFBWW9FLG9CQUFvQmxJO0FBQzdGO0lBR0EsZ0JBQU1tSSxDQUNKckwsVUFDQXFLLE1BQ0FwRCxVQUNBRCxZQUNBb0Usb0JBQ0dsSTtRQUVILE1BQU13RSxnQkFBZ0J2RSxLQUFLRixPQUN6QjtZQUNFaUUsUUFBUWxIO1lBQ1JxSztZQUNBaUIsTUFBTW5JLEtBQUs2SCxZQUFZaEcsV0FBV3FGO1lBQ2xDcEQ7Y0FFQy9EO2NBRUNDLEtBQUtnSSxzQkFBc0J6RCxRQUFRbkUsSUFBSXlELFlBQVlvRSxvQkFBb0JsSTtlQUN2RSxJQUFJMEUsdUJBQXdCYSxlQUFlekksVUFBVTBILFFBQVFuRSxPQUFPTDtRQUMxRSxPQUFPd0U7QUFDVDtJQUdBLGlCQUFNNkQsQ0FBWXBCLFVBQThCakg7UUFDOUMsTUFBTXNJLFNBQVNyQixNQUFNeEIsd0JBQXdCeEYsS0FBS0csUUFBUTZHLE1BQU14QixvQkFBb0J6RixRQUFROEI7UUFDNUYsTUFBTTBDLGdCQUFnQnZFLEtBQUtGLE9BQ3pCO1lBQ0VpRSxRQUFRaUQsTUFBTW5LO1lBQ2R3TCxRQUFRQSxRQUFRakksTUFBTTRHLE1BQU14QjtZQUM1QjBCLE1BQU1GLE1BQU1FO1lBQ1ppQixNQUFNbkksS0FBSzZILFlBQVlRLFFBQVFGLE1BQU1uQixNQUFNRTtZQUMzQ3BELFVBQVVrRCxNQUFNbEQ7Y0FFZi9EO2NBRUNDLEtBQUtnSSxzQkFBc0J6RCxRQUFRbkUsSUFBSTRHLE1BQU1uRCxZQUFZbUQsTUFBTWlCLG9CQUFvQmxJO1FBQ3pGLE1BQU11SSxpQkFBaUIsSUFBSTdEO2NBQ3JCNkQsZUFBZWhELGVBQWUwQixNQUFNbkssVUFBVTBILFFBQVFuRSxPQUFPTDtRQUNuRSxJQUFJaUgsTUFBTXhCLGlCQUFpQjtrQkFDbkI4QyxlQUFlL0MsK0JBQ25CeUIsTUFBTW5LLFVBQ05tSyxNQUFNeEIsaUJBQ05qQixRQUFRbkUsT0FDTEw7QUFFUDtRQUNBLE9BQU93RTtBQUNUO0lBRUEsa0JBQU1nRSxDQUFhL0Msb0JBQTRCekY7UUFDN0MsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUFRTSxXQUFZckcsY0FBY3FHLFFBQVE4RCxRQUFRN0M7QUFDekY7SUFFQSx3QkFBTWdELENBQW1CM0wsYUFBcUJrRDtRQUM1QyxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVFNLFdBQVl4RyxXQUFXd0csUUFBUVIsUUFBUWxIO0FBQ3RGO0lBRUEsNEJBQU00TCxDQUNKNUwsVUFDQXlILFdBQ0FvRSxjQUFjLFVBQ1gzSTtRQUVILE1BQU00SSxxQkFBb0IsSUFBSWxFLHVCQUF3Qk8sZ0JBQWdCbkksVUFBVXlILGNBQWN2RTtRQUM5RixNQUFNNkksTUFBTSxJQUFJN0MsSUFBSTRDLFlBQVl2SixJQUFLZ0YsT0FBUW5HLFdBQVdtRyxJQUFJTztRQUM1RCxJQUFJK0QsYUFBYUUsSUFBSUMsSUFBSXZFO1FBQ3pCLGNBQWN0RSxLQUFLd0ksbUJBQW1CM0wsYUFBYWtELE9BQU9rRSxPQUFRTSxXQUFZcUUsSUFBSTFDLElBQUkzQixRQUFRbkU7QUFDaEc7SUFFQSwwQkFBTTBJLENBQ0pqTSxVQUNBeUgsV0FDQW9FLGNBQWMsVUFDWDNJO1FBRUgsTUFBTWdKLG1CQUFrQixJQUFJdEUsdUJBQXdCQyxjQUFjN0gsVUFBVXlILGNBQWN2RTtRQUMxRixNQUFNNkksTUFBTSxJQUFJN0MsSUFBSWdELFVBQVUzSixJQUFLZ0YsT0FBUW5HLFdBQVdtRyxJQUFJYTtRQUMxRCxJQUFJeUQsYUFBYUUsSUFBSUMsSUFBSXZFO1FBQ3pCLGNBQWN0RSxLQUFLd0ksbUJBQW1CM0wsYUFBYWtELE9BQU9rRSxPQUFRTSxXQUFZcUUsSUFBSTFDLElBQUkzQixRQUFRbkU7QUFDaEc7SUFFQSxtQkFBTTRJLENBQWMxRSxXQUFtQjRDLFNBQWlCbkg7UUFDdEQsTUFBTVMsaUJBQWlCUixLQUFLRyxRQUFRbUUsY0FBY3ZFO1FBQ2xELE9BQU9DLEtBQUtNLFVBQ1ZnRSxXQUNBO1lBQUU0QztZQUFNaUIsTUFBTW5JLEtBQUs2SCxZQUFZckgsU0FBUzJILEtBQUtjLFNBQVMsT0FBT3pJLFNBQVMySCxLQUFLN0osUUFBUSxZQUFZLE1BQU11RCxXQUFXcUY7Y0FDN0duSDtBQUVQO0lBR00saUJBQUFtSixDQUNKck0sVUFDQXlILFdBQ0E2RSx1QkFDR3BKO1FBRUgsTUFBTXFKLGtCQUFrQnBKLEtBQUtHLFFBQVFnSix1QkFBdUJwSjtRQUM1RCxNQUFNUyxpQkFBaUJSLEtBQUtHLFFBQVFtRSxjQUFjdkU7UUFDbEQsTUFBTXNKLGdCQUFnQnJKLEtBQUtNLFVBQ3pCZ0UsV0FDQTtZQUNFK0QsUUFBUWUsVUFBVWhKO1lBQ2xCK0gsTUFBTW5JLEtBQUs2SCxZQUFZdUIsVUFBVWpCLE1BQU0zSCxTQUFTMEc7Y0FFL0NuSDtjQUVDQyxLQUFLc0oscUJBQXFCek0sYUFBYWtEO1FBQzdDLE9BQU9zSjtBQUNUO0lBR0EsMEJBQU1DLENBQXFCek0sYUFBcUJrRDtRQUM5QyxNQUFNdUksaUJBQWlCLElBQUk3RDtRQUMzQixNQUFNOEUsc0JBQXNCakIsZUFBZXZILFdBQVdoQjtjQUNoRDJILGlCQUNKWSxnQkFDQWlCLGNBQWN0RixPQUFRRyxPQUFRckcsV0FBV3FHLElBQUlMLFFBQVFsSCxlQUNsRGtEO1FBR0wsTUFBTXlKLGtCQUFrQnhKLEtBQUt3SSxtQkFBbUIzTCxhQUFha0QsT0FBTzZFLEtBQUssQ0FBQ0MsTUFBTUM7WUFDOUUsTUFBTTJFLFlBQVk1RSxLQUFLc0QsS0FBS3VCLE1BQU0sS0FBS3pGLE9BQU9oQixTQUFTMEc7WUFDdkQsTUFBTUMsYUFBYTlFLE1BQU1xRCxLQUFLdUIsTUFBTSxLQUFLekYsT0FBT2hCLFNBQVMwRztZQUN6RCxPQUFPRixZQUFZRzs7UUFHckIsS0FBSyxNQUFNckYsV0FBV2lGLFVBQVU7a0JBQ3hCbEIsZUFBZWhELGVBQWV6SSxVQUFVMEgsUUFBUW5FLE9BQU9MO1lBQzdELElBQUl3RSxRQUFROEQsUUFBUTtzQkFDWkMsZUFBZS9DLCtCQUNuQjFJLFVBQ0FvQixXQUFXc0csUUFBUThELFNBQ25COUQsUUFBUW5FLE9BQ0xMO0FBRVA7QUFDRjtBQUNGO0lBR00sdUJBQUE4SixDQUFrQmhOLFVBQWtCeUgsY0FBc0J2RTtRQUM5RCxNQUFNdUksaUJBQWlCLElBQUk3RDtRQUMzQixNQUFNa0Usb0JBQW9CM0ksS0FBS3lJLHVCQUF1QjVMLFVBQVV5SCxXQUFXLFNBQVN2RTtRQUNwRixNQUFNK0YsZ0JBQWdCLElBQUlDLElBQUk0QyxZQUFZdkosSUFBS21GLFdBQVlBLFFBQVFuRTtRQUNuRSxNQUFNb0osa0JBQWtCeEosS0FBS3dJLG1CQUFtQjNMLGFBQWFrRCxPQUFPa0UsT0FBUU0sV0FDMUV1QixjQUFjSSxJQUFJM0IsUUFBUW5FO2NBRXRCc0gsaUJBQWUxSCxNQUFNd0osYUFBYXpKO2NBQ2xDdUksZUFBZTFDLHNCQUFzQi9JLFVBQVV5SCxjQUFjdkU7QUFDckU7OztBQXRKTXNCLFdBQUEsRUFETHlJLHVMQXFCQWxDLGVBQUFsRyxXQUFBLGNBQUE7O0FBR0tMLFdBQUEsRUFETHlJLHVKQXlCQWxDLGVBQUFsRyxXQUFBLGVBQUE7O0FBNENLTCxXQUFBLEVBREx5SSx1S0FtQkFsQyxlQUFBbEcsV0FBQSxlQUFBOztBQUdLTCxXQUFBLEVBREx5SSx1SkEyQkFsQyxlQUFBbEcsV0FBQSx3QkFBQTs7QUFHS0wsV0FBQSxFQURMeUksK0pBVUFsQyxlQUFBbEcsV0FBQSxxQkFBQTs7QUN4TEcsTUFBT3FJLG9CQUFvQnhLO0lBQy9CLFdBQUFFO1FBQ0VFLE1BQU1vQztBQUNSO0lBRUEsZ0JBQU1pSSxDQUFXaEQsVUFBMkJqSDtRQUMxQyxPQUFPQyxLQUFLRixPQUNWO1lBQ0VtSyxPQUFPakQsTUFBTWlEO1lBQ2JDLE9BQU9sRCxNQUFNa0Q7WUFDYkMsYUFBYW5ELE1BQU1tRDtjQUVsQnBLO0FBRVA7SUFFQSxnQkFBTXFLLENBQVdILFVBQWtCbEs7UUFDakMsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9zSyxLQUFNQyxRQUFTQSxLQUFLTCxVQUFVQTtBQUNyRTtJQUVBLHVCQUFNTSxDQUFrQkMsUUFBZ0JMLGdCQUF3QnBLO1FBQzlELE9BQU9DLEtBQUtNLFVBQVVrSyxRQUFRO1lBQUVMO2NBQWtCcEs7QUFDcEQ7SUFFQSxpQkFBTTBLLENBQVlELFFBQWdCUCxVQUE4QmxLO1FBQzlELE9BQU9DLEtBQUtNLFVBQVVrSyxRQUFRO1lBQUVQO2NBQVlsSztBQUM5QztJQUVBLGlCQUFNMkssQ0FBWUYsUUFBZ0JOLFVBQThCbks7UUFDOUQsT0FBT0MsS0FBS00sVUFBVWtLLFFBQVE7WUFBRU47Y0FBWW5LO0FBQzlDOzs7QUM5QkksTUFBTzRLLHlCQUF5QnBMO0lBQ3BDLFdBQUFFO1FBQ0VFLE1BQU1xRDtBQUNSO0lBRUEscUJBQU00SCxDQUNKL04sVUFDQWdPLE1BQ0FDLGNBQ0cvSztRQUVILE9BQU9DLEtBQUtGLE9BQ1Y7WUFDRWlFLFFBQVFsSDtZQUNSZ087WUFDQUM7Y0FFQy9LO0FBRVA7SUFFQSxtQkFBTWdMLENBQ0psTyxVQUNBZ08sTUFDQUMsY0FDRy9LO1FBRUgsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9zSyxLQUNsQ1csYUFDQ2pOLFdBQVdpTixVQUFVakgsUUFBUWxILGFBQzdCbU8sVUFBVUgsU0FBU0EsUUFDbkJHLFVBQVVGLGNBQWNBO0FBRTlCO0lBRUEsMkJBQU1HLENBQ0pwTyxVQUNBZ08sTUFDQUMsY0FDRy9LO1FBRUgsYUFBY0MsS0FBSytLLGNBQWNsTyxVQUFVZ08sTUFBTUMsY0FBYy9LLGVBQWlCQyxLQUFLNEssZ0JBQWdCL04sVUFBVWdPLE1BQU1DLGNBQWMvSztBQUNySTtJQUVBLHNCQUFNbUwsQ0FBaUJyTyxVQUFrQjJOLFdBQW1Ceks7UUFDMUQsT0FBT0MsS0FBS2lMLHNCQUFzQnBPLFVBQVUzQixjQUFjNkcsTUFBTXlJLFdBQVd6SztBQUM3RTtJQUVBLHVCQUFNb0wsQ0FBa0J0TyxVQUFrQnVPLFlBQW9Cckw7UUFDNUQsT0FBT0MsS0FBS2lMLHNCQUFzQnBPLFVBQVUzQixjQUFjdUksT0FBTzJILFlBQVlyTDtBQUMvRTs7O0FDbERJLE1BQU9zTCxnQ0FBZ0M5TDtJQUMzQyxXQUFBRTtRQUNFRSxNQUFNeUI7QUFDUjtJQUVBLHFCQUFNa0ssQ0FDSnpPLFVBQ0EyTixRQUNBZSxTQUEyQnRRLGlCQUFpQnVRLFdBQ3pDekw7UUFFSCxPQUFPQyxLQUFLRixPQUNWO1lBQ0VpRSxRQUFRbEg7WUFDUnlOLE1BQU1FO1lBQ05lO2NBRUN4TDtBQUVQO0lBRUEsZUFBTTBMLENBQVVDLGNBQXNCSCxXQUE2QnhMO1FBQ2pFLE9BQU9DLEtBQUtNLFVBQVVvTCxjQUFjO1lBQUVIO2NBQWF4TDtBQUNyRDtJQUVBLHFCQUFNNEwsQ0FBZ0JuQixXQUFtQnpLO1FBQ3ZDLGNBQWNDLEtBQUtlLFdBQVdoQixPQUFPa0UsT0FBUTJILGNBQWUxTixjQUFjME4sV0FBV3RCLE1BQU1FO0FBQzdGO0lBRUEscUJBQU1xQixDQUFnQmhQLGFBQXFCa0Q7UUFDekMsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUFRMkgsY0FBZTdOLFdBQVc2TixXQUFXN0gsUUFBUWxIO0FBQzVGO0lBRUEsMEJBQU1pUCxDQUFxQkosaUJBQXlCM0w7Y0FDNUNDLEtBQUtTLFdBQVdpTCxpQkFBaUIzTDtBQUN6Qzs7O0FDbkNJLE1BQU9nTSxpQ0FBaUN4TTtJQUM1QyxXQUFBRTtRQUNFRSxNQUFNOEM7QUFDUjtJQUVBLHNCQUFNdUosQ0FDSm5QLFVBQ0F5SCxXQUNBa0csUUFDQWUsU0FBMkJ0USxpQkFBaUJ1USxXQUN6Q3pMO1FBRUgsT0FBT0MsS0FBS0YsT0FDVjtZQUNFaUUsUUFBUWxIO1lBQ1IwSCxTQUFTRDtZQUNUZ0csTUFBTUU7WUFDTmU7Y0FFQ3hMO0FBRVA7SUFFQSxlQUFNMEwsQ0FBVUMsY0FBc0JILFdBQTZCeEw7UUFDakUsT0FBT0MsS0FBS00sVUFBVW9MLGNBQWM7WUFBRUg7Y0FBYXhMO0FBQ3JEO0lBRUEsc0JBQU1rTSxDQUFpQnpCLFdBQW1Ceks7UUFDeEMsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUFRMkgsY0FBZTFOLGNBQWMwTixXQUFXdEIsTUFBTUU7QUFDN0Y7SUFFQSxzQkFBTTBCLENBQWlCNUgsY0FBc0J2RTtRQUMzQyxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVEySCxjQUFlMU4sY0FBYzBOLFdBQVdySCxTQUFTRDtBQUNoRztJQUVBLDJCQUFNNkgsQ0FBc0JULGlCQUF5QjNMO2NBQzdDQyxLQUFLUyxXQUFXaUwsaUJBQWlCM0w7QUFDekM7OztBQ3RDSSxNQUFPcU0scUJBQXFCN007SUFDaEMsV0FBQUU7UUFDRUUsTUFBTThEO0FBQ1I7SUFFQSxpQkFBTTRJLENBQ0p4UCxVQUNBcUssTUFDQTVDLFdBQ0FSLGFBQ0cvRDtRQUVILE9BQU9DLEtBQUtGLE9BQ1Y7WUFDRWlFLFFBQVFsSDtZQUNSMEgsU0FBU0Q7WUFDVDRDO1lBQ0FwRDtjQUVDL0Q7QUFFUDtJQUVBLGlCQUFNdU0sQ0FBWWxCLFNBQWlCbEUsU0FBaUJuSDtRQUNsRCxPQUFPQyxLQUFLTSxVQUFVOEssU0FBUztZQUFFbEU7Y0FBV25IO0FBQzlDO0lBRUEsd0JBQU13TSxDQUFtQm5CLFNBQWlCOUcsY0FBa0N2RTtRQUMxRSxPQUFPQyxLQUFLTSxVQUFVOEssU0FBUztZQUFFN0csU0FBU0Q7Y0FBZ0J2RTtBQUM1RDtJQUVBLHNCQUFNeU0sQ0FBaUIzUCxhQUFxQmtEO1FBQzFDLGNBQWNDLEtBQUtlLFdBQVdoQixPQUFPa0UsT0FBUXdJLFNBQVUxTyxXQUFXME8sTUFBTTFJLFFBQVFsSDtBQUNsRjs7O0FDaENJLE1BQU82UCwrQkFBK0JuTjtJQUMxQyxXQUFBRTtRQUNFRSxNQUFNNkQ7QUFDUjtJQUVBLHlCQUFNbUosQ0FDSjlQLFVBQ0F1TyxTQUNBdE8sYUFDQWdILGFBQ0cvRDtRQUVILE9BQU9DLEtBQUtGLE9BQ1Y7WUFDRWlFLFFBQVFsSDtZQUNSNFAsT0FBT3JCO1lBQ1BKLFdBQVdsTztZQUNYZ0g7Y0FFQy9EO0FBRVA7SUFFQSxzQkFBTTZNLENBQWlCeEIsWUFBb0JyTDtRQUN6QyxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVEySCxjQUFlMU4sY0FBYzBOLFdBQVdhLE9BQU9yQjtBQUM5RjtJQUVBLHlCQUFNeUIsQ0FBb0IvUCxnQkFBd0JpRDtRQUNoRCxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVEySCxjQUFlMU4sY0FBYzBOLFdBQVdaLFdBQVdsTztBQUNsRztJQUVBLDhCQUFNZ1EsQ0FBeUJwQixpQkFBeUIzTDtjQUNoREMsS0FBS1MsV0FBV2lMLGlCQUFpQjNMO0FBQ3pDO0lBRUEsMENBQU1nTixDQUFxQ2pRLGdCQUF3QmlEO1FBQ2pFLE1BQU1pTixtQkFBbUIsSUFBSXJDO1FBQzdCLE1BQU1zQyxvQkFBb0JqTixLQUFLNk0sb0JBQW9CL1AsZ0JBQWdCaUQ7UUFDbkUsTUFBTW1OLG1CQUFtQm5ULFFBQVFvVCxJQUMvQkYsWUFBWTdOLElBQUk5RixNQUFPc1M7WUFDckIsTUFBTS9PLFdBQVdvQixXQUFXMk4sV0FBVzdIO1lBQ3ZDLE1BQU1xSCxVQUFVbk4sV0FBVzJOLFdBQVdhO1lBQ3RDLE1BQU16QixrQkFBa0JnQyxpQkFBaUI3QixrQkFBa0J0TyxVQUFVdU8sWUFBWXJMO1lBQ2pGLE9BQU9pTCxVQUFVNUs7O1FBR3JCLE9BQU84TTtBQUNUOzs7QUMvQ0ksTUFBT0UsMEJBQTBCN047SUFDckMsV0FBQUU7UUFDRUUsTUFBTWlEO0FBQ1I7SUFFQSxzQkFBTXlLLENBQWlCckcsVUFBaUNqSDtRQUN0RCxPQUFPQyxLQUFLRixPQUNWO1lBQ0UxQyxLQUFLNEosTUFBTTVKO1lBQ1h5SixVQUFVRyxNQUFNSDtZQUNoQnlHLGFBQWF0RyxNQUFNc0c7Y0FFbEJ2TjtBQUVQO0lBRUEsY0FBTXdOLENBQVNuUSxRQUFnQjJDO1FBQzdCLGNBQWNDLEtBQUtlLFdBQVdoQixPQUFPc0ssS0FBTXRMLGNBQWVBLFdBQVczQixRQUFRQTtBQUMvRTtJQUVBLG9CQUFNb1EsQ0FBZTNHLGFBQWlDOUc7UUFDcEQsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUFRbEYsY0FBZUEsV0FBVzhILGFBQWFBO0FBQ3RGO0lBRUEsdUJBQU00RyxDQUFrQkMsY0FBc0JKLGdCQUFvQ3ZOO1FBQ2hGLE9BQU9DLEtBQUtNLFVBQVVvTixjQUFjO1lBQUVKO2NBQWtCdk47QUFDMUQ7OztBQzFCSSxNQUFPNE4sb0JBQW9CcE87SUFDL0IsV0FBQUU7UUFDRUUsTUFBTW1EO0FBQ1I7SUFFQSxnQkFBTThLLENBQVc1RyxVQUEyQmpIO1FBQzFDLE9BQU9DLEtBQUtGLE9BQ1Y7WUFDRWlFLFFBQVFpRCxNQUFNbks7WUFDZE8sS0FBSzRKLE1BQU01SjtZQUNYOEosTUFBTUYsTUFBTUU7WUFDWm9HLGFBQWF0RyxNQUFNc0c7WUFDbkJ4SixVQUFVa0QsTUFBTWxEO2NBRWYvRDtBQUVQO0lBRUEsd0JBQU04TixDQUFtQnpRLFFBQWdCMkM7UUFDdkMsTUFBTStOLGNBQWM5TixLQUFLZSxXQUFXaEIsT0FBT3NLLEtBQU0wRCxjQUFlQSxVQUFVaEssVUFBVWdLLFVBQVUzUSxRQUFRQTtRQUN0RyxLQUFLMFEsTUFBTTtZQUNULE1BQU0sSUFBSUUsTUFBTSxTQUFTNVE7QUFDM0I7UUFDQSxPQUFPMFE7QUFDVDtJQUVBLHdCQUFNRyxDQUFtQnBSLFVBQWtCTyxRQUFnQjJDO1FBQ3pELE1BQU0rTixjQUFjOU4sS0FBS2UsV0FBV2hCLE9BQU9zSyxLQUN4QzBELGFBQWNoUSxXQUFXZ1EsVUFBVWhLLFFBQVFsSCxhQUFha1IsVUFBVTNRLFFBQVFBO1FBRTdFLEtBQUswUSxNQUFNO1lBQ1QsTUFBTSxJQUFJRSxNQUFNLFNBQVM1USw2QkFBNkJQO0FBQ3hEO1FBQ0EsT0FBT2lSO0FBQ1Q7SUFFQSxnQkFBTUksQ0FBV0MsUUFBZ0JqSCxTQUFpQm5IO1FBQ2hELE9BQU9DLEtBQUtNLFVBQVU2TixRQUFRO1lBQUVqSDtjQUFXbkg7QUFDN0M7SUFFQSx3QkFBTXFPLENBQ0pELFFBQ0FySyxhQUNHL0Q7UUFFSCxPQUFPQyxLQUFLTSxVQUFVNk4sUUFBUTtZQUFFcks7Y0FBZS9EO0FBQ2pEO0lBRUEscUJBQU1zTyxDQUFnQnhSLFVBQWtCeVIsZ0JBQWdCLFVBQVV2TztRQUNoRSxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVE2SixRQUMzQ1EsaUJBQWlCUixLQUFLL0osVUFBVWhHLFdBQVcrUCxLQUFLL0osUUFBUWxILFlBQVlrQixXQUFXK1AsS0FBSy9KLFFBQVFsSDtBQUVoRzs7O0FDbkRGdkQsZUFBZW9PLGVBQ2JDLFNBQ0ExQixTQUNHbEc7SUFFSCxLQUFLLE1BQU1xRSxPQUFPNkIsTUFBTTtjQUNoQjBCLFFBQVFsSCxXQUFXMkQsSUFBSWhFLE9BQU9MO0FBQ3RDO0FBQ0Y7O0FBRU0sTUFBT3dPLDhCQUE4QmhQO0lBQ3pDLFdBQUFFO1FBQ0VFLE1BQU1rRDtBQUNSO0lBRUEseUJBQU0yTCxDQUFvQkwsUUFBZ0JULGlCQUF5QjNOO1FBQ2pFLE9BQU9DLEtBQUtGLE9BQ1Y7WUFDRWdPLE1BQU1LO1lBQ05wUCxZQUFZMk87Y0FFWDNOO0FBRVA7SUFFQSw0QkFBTTBPLENBQXVCTixRQUFnQnBSLGtCQUEwQmdEO1FBQ3JFLE1BQU1oQixvQkFBbUIsSUFBSXFPLG1CQUFvQkcsU0FBU3hRLGtCQUFrQmdEO1FBQzVFLE9BQU9DLEtBQUt3TyxvQkFBb0JMLFFBQVFwUCxXQUFXcUIsT0FBT0w7QUFDNUQ7SUFFQSw4QkFBTTJPLENBQXlCQyxxQkFBNkI1TztjQUNwREMsS0FBS1MsV0FBV2tPLHFCQUFxQjVPO0FBQzdDO0lBRUEseUJBQU02TyxDQUFvQlQsV0FBbUJwTztRQUMzQyxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVE0SyxrQkFBbUIzUSxjQUFjMlEsZUFBZWYsTUFBTUs7QUFDckc7SUFFQSx5QkFBTVcsQ0FBb0JwQixpQkFBeUIzTjtRQUNqRCxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVE0SyxrQkFBbUIzUSxjQUFjMlEsZUFBZTlQLFlBQVkyTztBQUMzRztJQUVBLDRCQUFNcUIsQ0FBdUJaLFFBQWdCYSxrQkFBNEJqUDtRQUN2RSxNQUFNUyxpQkFBaUJSLEtBQUs0TyxvQkFBb0JULFdBQVdwTztjQUNyRDJILGVBQWUxSCxNQUFNUSxhQUFhVDtRQUN4QyxPQUFPaEcsUUFBUW9ULElBQUk2QixjQUFjNVAsSUFBS3NPLGdCQUFpQjFOLEtBQUt3TyxvQkFBb0JMLFFBQVFULGlCQUFpQjNOO0FBQzNHO0lBRUEsK0JBQU1rUCxDQUNKakksT0FDQWtJLG1CQUNHblA7UUFFSCxNQUFNK04sY0FBYSxJQUFJSCxhQUFjQyxXQUFXNUcsVUFBVWpIO1FBQzFELEtBQUssTUFBTWhELGlCQUFpQm1TLGdCQUFnQjtrQkFDcENsUCxLQUFLeU8sdUJBQXVCWCxLQUFLMU4sSUFBSXJELGtCQUFrQmdEO0FBQy9EO1FBQ0EsT0FBTytOO0FBQ1Q7OztBQzNESSxNQUFPcUIsOEJBQThCNVA7SUFDekMsV0FBQUU7UUFDRUUsTUFBTW9EO0FBQ1I7SUFFQSxnQkFBTXFNLENBQ0pwSSxVQUNHakg7UUFFSCxPQUFPQyxLQUFLRixPQUNWO1lBQ0VpRSxRQUFRaUQsTUFBTW5LO1lBQ2RtTyxXQUFXaEUsTUFBTWxLO1lBQ2pCZ1IsTUFBTTlHLE1BQU1tSDtZQUNaelEsV0FBV3NKLE1BQU10SjtZQUNqQkMsU0FBU3FKLE1BQU1ySjtZQUNmMFIsYUFBYXJJLE1BQU1xSSxlQUFlO1lBQ2xDNVEsVUFBVXVJLE1BQU12STtZQUNoQkMsV0FBV3NJLE1BQU10STtZQUNqQjRRLFlBQVl0SSxNQUFNc0k7Y0FFakJ2UDtBQUVQO0lBRUEsc0JBQU13UCxDQUFpQkMsaUJBQXlCelA7Y0FDeENDLEtBQUtTLFdBQVcrTyxpQkFBaUJ6UDtBQUN6QztJQUVBLDhCQUFNMFAsQ0FDSjVTLFVBQ0FDLGdCQUNHaUQ7UUFFSCxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQ2xDeUwsY0FDQzNSLFdBQVcyUixXQUFXM0wsUUFBUWxILGFBQzlCcUIsY0FBY3dSLFdBQVcxRSxXQUFXbE87QUFFMUM7SUFFQSx5QkFBTTZTLENBQ0p4QixXQUNHcE87UUFFSCxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVF5TCxjQUMzQ3hSLGNBQWN3UixXQUFXNUIsTUFBTUs7QUFFbkM7SUFFQSwyQkFBTXlCLENBQ0ovUyxhQUNHa0Q7UUFFSCxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVF5TCxjQUMzQzNSLFdBQVcyUixXQUFXM0wsUUFBUWxIO0FBRWxDO0lBRUEsNEJBQU1nVCxDQUNKTCxjQUNBL1EsVUFDQUMsY0FDR3FCO1FBRUgsT0FBT0MsS0FBS00sVUFBVWtQLGNBQWM7WUFBRS9RO1lBQVVDO2NBQWdCcUI7QUFDbEU7OztBQzNESSxNQUFPK1AsbUNBQW1DdlE7SUFDOUMsV0FBQUU7UUFDRUUsTUFBTStEO0FBQ1I7SUFFQSxzQkFBTXFNLENBQWlCbFQsVUFBa0JDLGdCQUF3QmlEO1FBQy9ELGNBQWNDLEtBQUtlLFdBQVdoQixPQUFPa0UsT0FDbENsRixjQUFlaEIsV0FBV2dCLFdBQVdnRixRQUFRbEgsYUFBYXFCLGNBQWNhLFdBQVdpTSxXQUFXbE87QUFFbkc7SUFFQSxrQkFBTWtULENBQ0puVCxVQUNBYSxXQUNBQyxZQUNHb0M7UUFFSCxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQ2xDbEYsY0FBZWhCLFdBQVdnQixXQUFXZ0YsUUFBUWxILGFBQWFrQyxXQUFXckIsY0FBY0EsYUFBYXFCLFdBQVdwQixZQUFZQTtBQUU1SDtJQUVBLG1CQUFNc1MsQ0FDSnBULFVBQ0FDLGFBQ0FDLGVBQ0FXLFdBQ0FDLFNBQ0FhLE9BQ0d1QjtRQUVILGNBQWNDLEtBQUsrUCxpQkFBaUJsVCxVQUFVQyxnQkFBZ0JpRCxPQUFPc0YsS0FDbEV0RyxjQUNDQSxXQUFXaEMsa0JBQWtCQSxpQkFDN0JnQyxXQUFXckIsY0FBY0EsYUFDekJxQixXQUFXcEIsWUFBWUEsYUFDckJvQixXQUFXTixhQUFhRCxNQUFNTyxXQUFXTixZQUFZRCxTQUNyRE8sV0FBV0wsY0FBY0YsTUFBTU8sV0FBV0wsYUFBYUY7QUFFL0Q7SUFFQSx3QkFBTTBSLENBQW1CclQsVUFBa0JDLGdCQUF3QmlEO1FBQ2pFLEtBQUssTUFBTXFFLGFBQWFwRSxLQUFLK1AsaUJBQWlCbFQsVUFBVUMsZ0JBQWdCaUQsT0FBTztrQkFDdkVDLEtBQUtTLFdBQVcyRCxJQUFJaEUsT0FBT0w7QUFDbkM7QUFDRjtJQUVBLHFCQUFNb0UsQ0FBZ0J0SCxhQUFxQmtEO1FBQ3pDLEtBQUssTUFBTXFFLGNBQWNwRSxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVFsRixjQUFlaEIsV0FBV2dCLFdBQVdnRixRQUFRbEgsWUFBWTtrQkFDekdtRCxLQUFLUyxXQUFXMkQsSUFBSWhFLE9BQU9MO0FBQ25DO0FBQ0Y7SUFHTSx5QkFBQW9RLENBQW9CdFQsVUFBa0JDLGdCQUF3QmlEO2NBQzVEQyxLQUFLa1EsbUJBQW1CclQsVUFBVUMsZ0JBQWdCaUQ7UUFFeEQsTUFBTXFRLHdCQUF3QixJQUFJakI7UUFDbEMsTUFBTWtCLHdCQUF3QixJQUFJOUI7UUFDbEMsTUFBTStCLG9CQUFvQixJQUFJbEQ7UUFDOUIsTUFBTW1ELHlCQUF5QixJQUFJN0Q7UUFDbkMsTUFBTU0sbUJBQW1CLElBQUlyQztRQUM3QixNQUFNNkYsd0JBQXdCLElBQUkvTDtRQUNsQyxNQUFNZ00sMEJBQTBCLElBQUl0SztRQUVwQyxNQUFNdUssZUFBOEM7UUFDcEQsTUFBTUMsMEJBQTBCUCxzQkFBc0JYLHlCQUF5QjVTLFVBQVVDLGdCQUFnQmlEO1FBQ3pHLE1BQU02USx5QkFBeUJMLHVCQUF1QjFELG9CQUFvQi9QLGdCQUFnQmlEO1FBQzFGLE1BQU04USwwQkFDRTlXLFFBQVFvVCxJQUNaeUQsaUJBQWlCeFIsSUFBSTlGLE1BQU9zUztZQUMxQixNQUFNa0YsdUJBQXVCOUQsaUJBQWlCN0Isa0JBQWtCbE4sV0FBVzJOLFdBQVc3SCxTQUFTOUYsV0FBVzJOLFdBQVdhLFdBQVcxTTtZQUNoSSxPQUFPcVEsc0JBQXNCWCx5QkFBeUI1UyxVQUFVaVUsZUFBZTFRLE9BQU9MO2FBRzFGZ1I7UUFFRixNQUFNQyxjQUFjLEtBQUlMLHNCQUFzQkU7UUFDOUMsS0FBSyxNQUFNbkIsY0FBY3NCLGFBQWE7WUFDcEMsTUFBTUMsd0JBQXdCWixzQkFBc0J6QixvQkFBb0IzUSxXQUFXeVIsV0FBVzVCLFVBQVUvTjtZQUN4RyxNQUFNZixvQkFBb0JqRixRQUFRb1QsSUFDaEM4RCxnQkFBZ0I3UixJQUFJOUYsTUFBT3VWLGtCQUN6QnlCLGtCQUFrQjVQLFVBQVUsTUFBTXpDLFdBQVc0USxlQUFlOVAsZ0JBQXlCZ0I7WUFHekYsS0FBSyxNQUFNaEIsY0FBY0MsYUFBYTtnQkFDcEMsS0FBS0QsWUFBWTtnQkFDakIsTUFBTXJCLFlBQVlnUyxXQUFXaFM7Z0JBQzdCLE1BQU1DLFVBQVUrUixXQUFXL1I7Z0JBQzNCLE1BQU11VCxTQUEyRDtnQkFDakUsSUFBSXhULGNBQWN2QyxVQUFVeUcsUUFBUTtvQkFDbENzUCxPQUFPMVcsS0FBSzt3QkFBRWtEO3dCQUFXQyxTQUFTZDs7QUFDcEMsdUJBQU8sSUFBSWEsY0FBY3ZDLFVBQVVnVyxVQUFVO29CQUMzQ0QsT0FBTzFXLEtBQUs7d0JBQUVrRDt3QkFBV0M7O0FBQzNCLHVCQUFPLElBQUlELGNBQWN2QyxVQUFVOEQsWUFBWXlRLFdBQVdMLGFBQWE7b0JBQ3JFNkIsT0FBTzFXLEtBQUs7d0JBQUVrRDt3QkFBV0M7O0FBQzNCLHVCQUFPLElBQUlELGNBQWN2QyxVQUFVOEQsV0FBV3lRLFdBQVdMLGFBQWE7b0JBQ3BFLE1BQU0xRyxvQkFBb0I2SCxzQkFBc0J4TCxnQkFBZ0JuSSxVQUFVYyxZQUFZb0M7b0JBQ3RGbVIsT0FBTzFXLFFBQVFtTyxZQUFZdkosSUFBS2dGLFFBQUc7d0JBQVExRzt3QkFBV0MsU0FBU00sV0FBV21HLElBQUlPOztBQUNoRjtnQkFFQSxLQUFLLE1BQU15TSxVQUFVRixRQUFRO29CQUMzQixJQUNFeFQsY0FBY3ZDLFVBQVU4RCxXQUN4QnlRLFdBQVdMLGVBQ1grQixPQUFPelQsWUFBWUEsaUJBQ1o4Uyx3QkFBd0I3SiwyQkFDN0IvSixVQUNBdVUsT0FBT3pULFNBQ1BBLFNBQ0FvQixXQUFXOEgsYUFDUjlHLE9BRUw7d0JBQ0E7QUFDRjtvQkFDQTJRLGFBQWFsVyxLQUFLO3dCQUNoQjRGLElBQUk7d0JBQ0p2RDt3QkFDQUM7d0JBQ0FDLGVBQWVnQyxXQUFXM0I7d0JBQzFCTSxXQUFXMFQsT0FBTzFUO3dCQUNsQkMsU0FBU3lULE9BQU96VDt3QkFDaEIwVCxZQUFZO3dCQUNaQyxVQUFVNUIsV0FBV3RQO3dCQUNyQjNCLFVBQVVpUixXQUFXalI7d0JBQ3JCQyxXQUFXZ1IsV0FBV2hSOztBQUUxQjtBQUNGO0FBQ0Y7UUFFQSxNQUFNNlMsZ0JBQWdCeFgsUUFBUW9ULElBQzVCdUQsYUFBYXRSLElBQUtMLGNBQ2hCaUIsS0FBS0YsT0FDSDtZQUNFaUUsUUFBUWhGLFdBQVdsQztZQUNuQm1PLFdBQVdqTSxXQUFXakM7WUFDdEJDLGVBQWVnQyxXQUFXaEM7WUFDMUJXLFdBQVdxQixXQUFXckI7WUFDdEJDLFNBQVNvQixXQUFXcEI7WUFDcEIwVCxZQUFZdFMsV0FBV3NTO1lBQ3ZCQyxVQUFVdlMsV0FBV3VTO1lBQ3JCN1MsVUFBVU0sV0FBV047WUFDckJDLFdBQVdLLFdBQVdMO2NBRXJCcUI7UUFJVCxPQUFPd1I7QUFDVDtJQUdBLHNCQUFNQyxDQUFpQjNVLGFBQXFCa0Q7UUFDMUMsTUFBTW1OLHFCQUFvQixJQUFJdkMsa0JBQW1CNUosV0FBV2hCLE9BQU9rRSxPQUFRK0csYUFBY2pOLFdBQVdpTixVQUFVakgsUUFBUWxIO1FBQ3RILEtBQUssTUFBTW1PLGFBQWFrQyxZQUFZO2tCQUM1QmxOLEtBQUttUSxvQkFBb0J0VCxVQUFVbU8sVUFBVTVLLE9BQU9MO0FBQzVEO0FBQ0Y7OztBQXpHTXNCLFdBQUEsRUFETHlJLCtKQWtHQWdHLDJCQUFBcE8sV0FBQSx1QkFBQTs7QUFHS0wsV0FBQSxFQURMeUksdUpBTUFnRywyQkFBQXBPLFdBQUEsb0JBQUE7O0FDdEtHLE1BQU8rUCxpQ0FBaUNsUztJQUM1QyxXQUFBRTtRQUNFRSxNQUFNd0Q7QUFDUjtJQUVBLHNCQUFNdU8sQ0FBaUIxSyxVQUFpQ2pIO1FBQ3RELE9BQU9DLEtBQUtGLE9BQ1Y7WUFDRWlFLFFBQVFpRCxNQUFNbks7WUFDZDBILFNBQVN5QyxNQUFNMUM7WUFDZnFOLGNBQWMzSyxNQUFNMks7WUFDcEJyUyxZQUFZMEgsTUFBTTFIO1lBQ2xCc1MsWUFBWTVLLE1BQU00SztZQUNsQkMsT0FBTzdLLE1BQU04SztZQUNiQyxhQUFhL0ssTUFBTStLO1lBQ25Cak8sVUFBVWtELE1BQU1sRDtjQUVmL0Q7QUFFUDtJQUVBLHlCQUFNaVMsQ0FBb0JuVixVQUFrQjhVLGNBQXNCclMsZUFBdUJTO1FBQ3ZGLGNBQWNDLEtBQUtlLFdBQVdoQixPQUFPc0ssS0FDbEM0SCxZQUFhbFUsV0FBV2tVLFNBQVNsTyxRQUFRbEgsYUFBYW9WLFNBQVNOLGlCQUFpQkEsZ0JBQWdCTSxTQUFTM1MsZUFBZUE7QUFFN0g7SUFFQSwyQkFBTTRTLENBQXNCQyxxQkFBNkI3TixjQUFzQnZFO1FBQzdFLE9BQU9DLEtBQUtNLFVBQVU2UixxQkFBcUI7WUFBRTVOLFNBQVNEO2NBQWdCdkU7QUFDeEU7SUFFQSxtQkFBTXFTLENBQWNELHFCQUE2QlAsZUFBbUM3UjtRQUNsRixPQUFPQyxLQUFLTSxVQUFVNlIscUJBQXFCO1lBQUVQO2NBQWlCN1I7QUFDaEU7SUFFQSx1QkFBTXNTLENBQWtCRixxQkFBNkJMLHFCQUF5Qy9SO1FBQzVGLE9BQU9DLEtBQUtNLFVBQVU2UixxQkFBcUI7WUFBRU4sT0FBT0M7Y0FBdUIvUjtBQUM3RTtJQUVBLDBCQUFNdVMsQ0FBcUJoTyxjQUFzQnZFO1FBQy9DLGNBQWNDLEtBQUtlLFdBQVdoQixPQUFPa0UsT0FBUWdPLFlBQWEvVCxjQUFjK1QsU0FBUzFOLFNBQVNEO0FBQzVGO0lBRUEseUJBQU1pTyxDQUFvQjFWLGFBQXFCa0Q7UUFDN0MsY0FBY0MsS0FBS2UsV0FBV2hCLE9BQU9rRSxPQUFRZ08sWUFBYWxVLFdBQVdrVSxTQUFTbE8sUUFBUWxIO0FBQ3hGOzs7QUM3Q0ksTUFBTzJWLDZCQUE2QmpUO0lBQ3hDLFdBQUFFO1FBQ0VFLE1BQU11RDtBQUNSO0lBRUEsbUJBQU11UCxDQUFjekwsVUFBOEJqSDtRQUNoRCxPQUFPQyxLQUFLRixPQUNWO1lBQ0VpRSxRQUFRaUQsTUFBTW5LO1lBQ2RvVixVQUFVakwsTUFBTTFIO1lBQ2hCMEwsV0FBV2hFLE1BQU1sSztZQUNqQkMsZUFBZWlLLE1BQU1qSztZQUNyQjBCLFVBQVV1SSxNQUFNdkk7WUFDaEJDLFdBQVdzSSxNQUFNdEk7WUFDakI0USxZQUFZdEksTUFBTXNJO1lBQ2xCb0QsV0FBVzFMLE1BQU0yTDtjQUVoQjVTO0FBRVA7SUFFQSxpQkFBTTZTLENBQVlDLFlBQW9COVM7Y0FDOUJDLEtBQUtTLFdBQVdvUyxZQUFZOVM7QUFDcEM7SUFFQSx3QkFBTStTLENBQW1CWCx3QkFBZ0NwUztRQUN2RCxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVE1RSxTQUFVbkIsY0FBY21CLE1BQU00UyxVQUFVRTtBQUN2RjtJQUVBLHlCQUFNWSxDQUFvQmxXLFVBQWtCQyxnQkFBd0JpRDtRQUNsRSxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQ2xDNUUsU0FBVXRCLFdBQVdzQixNQUFNMEUsUUFBUWxILGFBQWFxQixjQUFjbUIsTUFBTTJMLFdBQVdsTztBQUVwRjtJQUVBLGNBQU1rVyxDQUNKblcsVUFDQUMsYUFDQXFWLHFCQUNBcFYsZUFDQXlCLE9BQ0d1QjtRQUVILGNBQWNDLEtBQUsrUyxvQkFBb0JsVyxVQUFVQyxnQkFBZ0JpRCxPQUFPc0YsS0FDckVoRyxTQUNDbkIsY0FBY21CLE1BQU00UyxVQUFVRSx3QkFDOUI5UyxNQUFNdEMsa0JBQWtCQSxtQkFDdEJzQyxNQUFNWixhQUFhRCxNQUFNYSxNQUFNWixZQUFZRCxTQUMzQ2EsTUFBTVgsY0FBY0YsTUFBTWEsTUFBTVgsYUFBYUY7QUFFckQ7SUFFQSwwQkFBTXlVLENBQXFCZCx3QkFBZ0NwUztRQUN6RCxLQUFLLE1BQU1xRSxhQUFhcEUsS0FBSzhTLG1CQUFtQlgsd0JBQXdCcFMsT0FBTztrQkFDdkVDLEtBQUtTLFdBQVcyRCxJQUFJaEUsT0FBT0w7QUFDbkM7QUFDRjs7O01DdkRXbVQ7SUFDWCx3QkFBTUMsQ0FBbUJoQix3QkFBZ0NwUztlQUNqRCxJQUFJeVMsc0JBQXVCUyxxQkFBcUJkLHdCQUF3QnBTO2VBQ3hFLElBQUkwUiwwQkFBMkJoUixXQUFXMFIsd0JBQXdCcFM7QUFDMUU7SUFFQSwwQkFBTXFULENBQ0pqQix3QkFDR3BTO1FBT0gsTUFBTWtTLGtCQUFpQixJQUFJUiwwQkFBMkJ0UixRQUFRZ1Msd0JBQXdCcFM7UUFDdEYsT0FBTztZQUNMbEQsVUFBVW9CLFdBQVdnVSxTQUFTbE87WUFDOUJPLFdBQVdyRyxXQUFXZ1UsU0FBUzFOO1lBQy9CcU4sWUFBWUssU0FBU0w7WUFDckJFLGtCQUFrQkcsU0FBU0osUUFBUTVULFdBQVdnVSxTQUFTSixTQUFTaFE7O0FBRXBFOzs7QUN2QkksTUFBT3dSLDhCQUE4QjlUO0lBQ3pDLFdBQUFFO1FBQ0VFLE1BQU0wRDtBQUNSO0lBRUEsbUJBQU1pUSxDQUFjdE0sVUFBcUNqSDtRQUN2RCxPQUFPQyxLQUFLRixPQUNWO1lBQ0VpRSxRQUFRaUQsTUFBTW5LO1lBQ2QwVyxhQUFhdk0sTUFBTXVNO1lBQ25CQyxhQUFheE0sTUFBTXdNO1lBQ25CQyxZQUFZek0sTUFBTXlNO1lBQ2xCQyxRQUFRMU0sTUFBTTBNO1lBQ2RDLFFBQVEzTSxNQUFNMk07Y0FFYjVUO0FBRVA7SUFFQSx3QkFBTTZULENBQW1CL1csYUFBcUJrRDtRQUM1QyxjQUFjQyxLQUFLZSxXQUFXaEIsT0FBT2tFLE9BQVE0UCxXQUFZNVYsV0FBVzRWLFFBQVE5UCxZQUFZbEg7QUFDMUY7SUFFQSxnQkFBTWlYLENBQVdqWCxVQUFrQjBXLGdCQUE2QnhUO1FBQzlELGNBQWNDLEtBQUs0VCxtQkFBbUIvVyxhQUFha0QsT0FBT3NLLEtBQU13SixXQUFZQSxRQUFRTixnQkFBZ0JBO0FBQ3RHO0lBRUEsc0JBQU1RLENBQ0pDLFdBQ0FMLFdBQ0c1VDtRQUVILE9BQU9DLEtBQUtNLFVBQVUwVCxXQUFXO1lBQUVMO2NBQWE1VDtBQUNsRDtJQUVBLHdCQUFNa1UsQ0FDSkQsV0FDQVAsWUFDQUMsUUFDQUMsV0FDRzVUO1FBRUgsT0FBT0MsS0FBS00sVUFBVTBULFdBQVc7WUFBRVIsYUFBYWpZLG1CQUFtQjJZO1lBQVdUO1lBQVlDO1lBQVFDO2NBQWE1VDtBQUNqSDtJQUVBLGVBQU1vVSxDQUNKSCxXQUNBUCxZQUNBQyxRQUNBQyxXQUNHNVQ7UUFFSCxPQUFPQyxLQUFLTSxVQUFVMFQsV0FBVztZQUFFUixhQUFhalksbUJBQW1CNlk7WUFBUVg7WUFBWUM7WUFBUUM7Y0FBYTVUO0FBQzlHOzs7TUN6Q1dzVTtJQUFiLFdBQUE1VTtRQUNVTyxLQUFBc1UsZ0JBQWdCLElBQUl4TjtRQUNwQjlHLEtBQUF1VSx1QkFBdUIsSUFBSTVRO1FBQzNCM0QsS0FBQXdVLGlCQUFpQixJQUFJNU07UUFDckI1SCxLQUFBeVUsd0JBQXdCLElBQUlwUTtRQUM1QnJFLEtBQUEwVSxjQUFjLElBQUkzSztRQUNsQi9KLEtBQUEyVSxvQkFBb0IsSUFBSXRKO1FBQ3hCckwsS0FBQWdOLG1CQUFtQixJQUFJckM7UUFDdkIzSyxLQUFBc1Esb0JBQW9CLElBQUlsRDtRQUN4QnBOLEtBQUE0VSxjQUFjLElBQUlqSDtRQUNsQjNOLEtBQUFxUSx3QkFBd0IsSUFBSTlCO1FBQzVCdk8sS0FBQW9RLHdCQUF3QixJQUFJakI7UUFDNUJuUCxLQUFBNlUsNkJBQTZCLElBQUkvRTtBQTRIM0M7SUF6SEUsaUNBQU1nRixDQUNKQyxhQUNHaFY7UUFPSCxNQUFNZ0UsZUFBZS9ELEtBQUtzVSxjQUFjdk4sYUFDdENnTyxTQUFTaFIsV0FDTmhFO1FBRUwsSUFBSWdWLFNBQVNoUixPQUFPRixZQUFZO2tCQUN4QjdELEtBQUt1VSxxQkFBcUIzUSxjQUM5QkcsT0FBTzNELElBQ1AyVSxTQUFTaFIsT0FBT0YsWUFDaEJrUixTQUFTaFIsT0FBT2tFLG9CQUNibEk7QUFFUDtRQUVBLE1BQU1pVixnQkFBZ0IxYixPQUNwQjJiLFVBQ0ExUTtZQUVBLE1BQU1nTixVQUNKMEQsYUFBYXBULGtCQUNIN0IsS0FBS3dVLGVBQWV0TSxXQUN4Qm5FLE9BQU8zRCxJQUNQbUUsUUFBUTJDLE1BQ1IzQyxRQUFRVCxVQUNSUyxRQUFRVixZQUNSVSxRQUFRVCxhQUNML0QsY0FFQ0MsS0FBS3dVLGVBQWVwTSxZQUN4QjtnQkFDRXZMLFVBQVVrSCxPQUFPM0Q7Z0JBQ2pCb0YsaUJBQWlCeVA7Z0JBQ2pCL04sTUFBTTNDLFFBQVEyQztnQkFDZHBELFVBQVVTLFFBQVFUO2dCQUNsQkQsWUFBWVUsUUFBUVY7Z0JBQ3BCb0UsaUJBQWlCMUQsUUFBUVQ7a0JBRXhCL0Q7WUFFWCxLQUFLLE1BQU03RixTQUFTcUssUUFBUTJRLFlBQVksSUFBSTtzQkFDcENGLGNBQWN6RCxRQUFRblIsSUFBSWxHO0FBQ2xDO1lBQ0EsT0FBT3FYOztRQUdULE1BQU00RCxvQkFBb0JILGNBQWNuVCxXQUFXa1QsU0FBU0k7UUFDNUQsTUFBTXRELGNBQWM3UixLQUFLMFUsWUFBWTFLLFdBQ25DK0ssU0FBU0ssY0FDTnJWO2NBRUNDLEtBQUsyVSxrQkFBa0JySixnQkFDM0J2SCxPQUFPM0QsSUFDUHlSLE1BQU16UixJQUNObkYsaUJBQWlCdVEsV0FDZHpMO1FBRUwsTUFBTXNWLHVCQUF1QnJWLEtBQUtnTixpQkFBaUI5QixpQkFDakRuSCxPQUFPM0QsSUFDUHlSLE1BQU16UixPQUNITDtRQUdMLEtBQUssTUFBTWhCLGNBQWNnVyxTQUFTL1YsYUFBYTtrQkFDdkNnQixLQUFLc1Esa0JBQWtCakQsaUJBQWlCdE8sZUFBZWdCO0FBQy9EO1FBQ0EsS0FBSyxNQUFNK04sUUFBUWlILFNBQVNPLE9BQU87WUFDakMsTUFBTUMsb0JBQW9CdlYsS0FBSzRVLFlBQVloSCxXQUN6QztnQkFDRS9RLFVBQVVrSCxPQUFPM0Q7Z0JBQ2pCaEQsS0FBSzBRLEtBQUsxUTtnQkFDVjhKLE1BQU00RyxLQUFLNUc7Z0JBQ1hvRyxhQUFhUSxLQUFLUjtrQkFFakJ2TjtZQUVMLEtBQUssTUFBTWhELGlCQUFpQitRLEtBQUtvQixnQkFBZ0I7c0JBQ3pDbFAsS0FBS3FRLHNCQUFzQjVCLHVCQUMvQjhHLFlBQVluVixJQUNackQsa0JBQ0dnRDtBQUVQO0FBQ0Y7UUFFQSxNQUFNeVYsa0JBQWtCeFYsS0FBSzRVLFlBQVkzRyxtQkFDdkNsSyxPQUFPM0QsSUFDUDJVLFNBQVNVLGlCQUNOMVY7Y0FFQ0MsS0FBS29RLHNCQUFzQmhCLFdBQy9CO1lBQ0V2UyxVQUFVa0gsT0FBTzNEO1lBQ2pCdEQsYUFBYXVZLGVBQWVqVjtZQUM1QitOLFFBQVFxSCxVQUFVcFY7WUFDbEIxQyxXQUFXdkMsVUFBVThEO1lBQ3JCdEIsU0FBU3dYLFlBQVkvVTtZQUNyQmlQLGFBQWE7Y0FFWnRQO2NBRUNDLEtBQUs2VSwyQkFBMkIxRSxvQkFDcENwTSxPQUFPM0QsSUFDUGlWLGVBQWVqVixPQUNaTDtRQUdMLE9BQU87WUFDTGxELFVBQVVrSCxPQUFPM0Q7WUFDakJzVixlQUFlUCxZQUFZL1U7WUFDM0J1VixhQUFhOUQsTUFBTXpSO1lBQ25CMFIsa0JBQWtCdUQsZUFBZWpWOztBQUVyQzs7O0FBeEhNaUIsV0FBQSxFQURMeUksdUpBeUhBdUssaUJBQUEzUyxXQUFBLCtCQUFBOztNQzlJVWtVO0lBQWIsV0FBQW5XO1FBQ1VPLEtBQUEyVSxvQkFBb0IsSUFBSXRKO1FBQ3hCckwsS0FBQTZWLHVCQUF1QixJQUFJOUo7UUFDM0IvTCxLQUFBZ04sbUJBQW1CLElBQUlyQztRQUN2QjNLLEtBQUE0VSxjQUFjLElBQUlqSDtRQUNsQjNOLEtBQUFvUSx3QkFBd0IsSUFBSWpCO1FBQzVCblAsS0FBQTZVLDZCQUE2QixJQUFJL0U7QUFvRTNDO0lBakVFLG1DQUFNZ0csQ0FDSmpaLFVBQ0EyTixRQUNBbEcsV0FDQXlSLFlBQ0doVztjQUVHQyxLQUFLMlUsa0JBQWtCckosZ0JBQWdCek8sVUFBVTJOLFFBQVF2UCxpQkFBaUJ1USxXQUFXekw7Y0FDckZDLEtBQUs2VixxQkFBcUI3SixpQkFBaUJuUCxVQUFVeUgsV0FBV2tHLFFBQVF2UCxpQkFBaUJ1USxXQUFXekw7UUFDMUcsTUFBTWlMLGtCQUFrQmhMLEtBQUtnTixpQkFBaUI5QixpQkFBaUJyTyxVQUFVMk4sV0FBV3pLO1FBQ3BGLE1BQU0rTixhQUFhOU4sS0FBSzRVLFlBQVkzRyxtQkFBbUJwUixVQUFVa1osWUFBWWhXO2NBQ3ZFQyxLQUFLb1Esc0JBQXNCaEIsV0FDL0I7WUFDRXZTO1lBQ0FDLGFBQWFrTyxVQUFVNUs7WUFDdkIrTixRQUFRTCxLQUFLMU47WUFDYjFDLFdBQVd2QyxVQUFVOEQ7WUFDckJ0QixTQUFTMkc7WUFDVCtLLGFBQWE7Y0FFWnRQO2NBRUNDLEtBQUs2VSwyQkFBMkIxRSxvQkFBb0J0VCxVQUFVbU8sVUFBVTVLLE9BQU9MO1FBQ3JGLE9BQU87WUFBRWpELGFBQWFrTyxVQUFVNUs7O0FBQ2xDO0lBR0EsdUJBQU00VixDQUNKblosVUFDQUMsYUFDQXdILFdBQ0F5UixTQUNBMUcsZ0JBQ0d0UDtRQUVILE1BQU0rTixhQUFhOU4sS0FBSzRVLFlBQVkzRyxtQkFBbUJwUixVQUFVa1osWUFBWWhXO1FBQzdFLE1BQU1rVywyQkFBMkJqVyxLQUFLb1Esc0JBQXNCWCx5QkFBeUI1UyxVQUFVQyxnQkFBZ0JpRDtRQUMvRyxLQUFLLE1BQU0yUCxjQUFjdUcsbUJBQW1CaFMsT0FBUUcsT0FBUUEsSUFBSTFHLGNBQWN2QyxVQUFVOEQsV0FBV21GLElBQUl6RyxZQUFZMkcsWUFBWTtrQkFDdkh0RSxLQUFLb1Esc0JBQXNCYixpQkFBaUJHLFdBQVd0UCxPQUFPTDtBQUN0RTtjQUNNQyxLQUFLb1Esc0JBQXNCaEIsV0FDL0I7WUFDRXZTO1lBQ0FDO1lBQ0FxUixRQUFRTCxLQUFLMU47WUFDYjFDLFdBQVd2QyxVQUFVOEQ7WUFDckJ0QixTQUFTMkc7WUFDVCtLO2NBRUN0UDtjQUVDQyxLQUFLNlUsMkJBQTJCMUUsb0JBQW9CdFQsVUFBVUMsZ0JBQWdCaUQ7QUFDdEY7SUFHTSx5QkFBQW1XLENBQW9CQyxvQkFBNEJ0WixVQUFrQkMsZ0JBQXdCaUQ7Y0FDeEZDLEtBQUsyVSxrQkFBa0JsSixVQUFVMEssb0JBQW9CbGIsaUJBQWlCbWIsY0FBY3JXO2NBQ3BGQyxLQUFLNlUsMkJBQTJCM0UsbUJBQW1CclQsVUFBVUMsZ0JBQWdCaUQ7QUFDckY7SUFHTSw0QkFBQXNXLENBQXVCRixvQkFBNEJ0WixVQUFrQkMsZ0JBQXdCaUQ7Y0FDM0ZDLEtBQUsyVSxrQkFBa0JsSixVQUFVMEssb0JBQW9CbGIsaUJBQWlCdVEsV0FBV3pMO2NBQ2pGQyxLQUFLNlUsMkJBQTJCMUUsb0JBQW9CdFQsVUFBVUMsZ0JBQWdCaUQ7QUFDdEY7OztBQWhFTXNCLFdBQUEsRUFETHlJLCtLQXlCQThMLHdCQUFBbFUsV0FBQSxpQ0FBQTs7QUFHS0wsV0FBQSxFQURMeUksd0xBMEJBOEwsd0JBQUFsVSxXQUFBLHFCQUFBOztBQUdLTCxXQUFBLEVBREx5SSx1S0FJQThMLHdCQUFBbFUsV0FBQSx1QkFBQTs7QUFHS0wsV0FBQSxFQURMeUksdUtBSUE4TCx3QkFBQWxVLFdBQUEsMEJBQUE7O0FDbkVILFNBQVNqRSxTQUFTQyxXQUFzQkM7SUFDdEMsT0FBTyxHQUFHRCxhQUFhQztBQUN6Qjs7TUFFYTJZO0lBR1gsV0FBQTdXLENBQVk4VyxjQUFnQztRQUMxQ3ZXLEtBQUt1VyxjQUFjQTtBQUNyQjtJQUdBLGVBQU1DLENBQVV4UCxVQUEwQmpIO1FBQ3hDLE1BQU12QixLQUFLd0ksTUFBTXhJLE1BQU0sSUFBSVg7UUFFM0IsSUFBSW1KLE1BQU10SixhQUFhc0osTUFBTXJKLFNBQVM7WUFDcEMsTUFBTXFCLHFCQUNFZ0IsS0FBS3VXLFlBQVlFLG1DQUNyQnpQLE1BQU1uSyxVQUNObUssTUFBTXRKLFdBQ05zSixNQUFNcko7WUFFVixPQUFPRyxRQUFRa0IsYUFBYXFHLEtBQ3pCdEcsY0FDQ0EsV0FBV2hDLGtCQUFrQmlLLE1BQU1qSyxpQkFDbkN3QixZQUFZQyxJQUFJTyxXQUFXTixVQUFVTSxXQUFXTDtBQUV0RDtRQUVBLEtBQUtzSSxNQUFNMFAscUJBQXFCLE9BQU87UUFFdkMsTUFBTXpFLGtCQUFpQmpTLEtBQUt1VyxZQUFZSSxlQUN0QzNQLE1BQU1uSyxVQUNObUssTUFBTTBQO1FBRVIsS0FBS3pFLFVBQVUsT0FBTztRQUN0QixJQUFJQSxTQUFTcFYsYUFBYW1LLE1BQU1uSyxVQUFVLE9BQU87UUFFakQsSUFBSW9WLFNBQVNILHFCQUFxQjlLLE1BQU1sSyxhQUFhLE9BQU87UUFFNUQsTUFBTXFDLFNBQVNyQixlQUNQa0MsS0FBS3VXLFlBQVl6RCxxQkFDckI5TCxNQUFNbkssVUFDTm1LLE1BQU0wUCx1QkFFUnpTLE9BQ0M1RSxTQUNDQSxNQUFNdkMsZ0JBQWdCa0ssTUFBTWxLLGVBQzVCdUMsTUFBTXRDLGtCQUFrQmlLLE1BQU1qSyxpQkFDOUJ3QixZQUFZQyxJQUFJYSxNQUFNWixVQUFVWSxNQUFNWDtRQUUxQyxJQUFJUyxPQUFPd0ssU0FBUyxHQUFHLE9BQU87UUFFOUIsTUFBTWlJLGFBQWFLLFNBQVNMO1FBQzVCLElBQ0VBLGVBQWV2VyxtQkFBbUJ1YixXQUNsQ2hGLGVBQWV2VyxtQkFBbUJ3YixhQUNsQztZQUNBLE9BQU87QUFDVDtRQUVBLElBQ0VqRixlQUFldlcsbUJBQW1CNEQsV0FDbEMyUyxlQUFldlcsbUJBQW1CeWIsWUFDbEM7WUFDQSxNQUFNQyx1QkFBdUJqWixlQUNyQmtDLEtBQUt1VyxZQUFZRSxtQ0FDckJ6UCxNQUFNbkssVUFDTjFCLFVBQVU4RCxTQUNWZ1QsU0FBUzNOO1lBR2IsT0FBT3lTLHFCQUFxQjFSLEtBQ3pCdEcsY0FDQ0EsV0FBV2hDLGtCQUFrQmlLLE1BQU1qSyxpQkFDbkN3QixZQUFZQyxJQUFJTyxXQUFXTixVQUFVTSxXQUFXTDtBQUV0RDtRQUVBLElBQUlrVCxlQUFldlcsbUJBQW1CdUcsUUFBUTtZQUM1QyxNQUFNbVYsdUJBQXVCalosZUFDckJrQyxLQUFLdVcsWUFBWUUsbUNBQ3JCelAsTUFBTW5LLFVBQ04xQixVQUFVeUcsUUFDVm9GLE1BQU1uSztZQUdWLE9BQU9rYSxxQkFBcUIxUixLQUN6QnRHLGNBQ0NBLFdBQVdoQyxrQkFBa0JpSyxNQUFNakssaUJBQ25Dd0IsWUFBWUMsSUFBSU8sV0FBV04sVUFBVU0sV0FBV0w7QUFFdEQ7UUFFQSxPQUFPO0FBQ1Q7SUFFQSxtQkFBTXNZLENBQWNoUSxVQUEwQmpIO1FBQzVDLFdBQVlDLEtBQUt3VyxVQUFVeFAsVUFBVWpILE9BQVE7WUFDM0MsTUFBTSxJQUFJa1gsbUJBQ1IscUJBQXFCalEsTUFBTWpLLG9CQUFvQmlLLE1BQU0wUCx1QkFBdUJqWixTQUFTdUosTUFBTXRKLGFBQWF2QyxVQUFVZ1csVUFBVW5LLE1BQU1ySixXQUFXO0FBRWpKO0FBQ0Y7SUFFQSx3QkFBTWlCLENBQ0ovQixVQUNBQyxnQkFFR2lEO1FBRUgsTUFBTWYsY0FBY2xCLGVBQ1prQyxLQUFLdVcsWUFBWVcsMkJBQTJCcmEsVUFBVUM7UUFFOUQsTUFBTXFDLFNBQVNyQixlQUNQa0MsS0FBS3VXLFlBQVl4RCxzQkFBc0JsVyxVQUFVQztRQUV6RCxPQUFPOEIsbUJBQW1CO1lBQ3hCL0I7WUFDQUM7WUFDQWtDO1lBQ0FHOztBQUVKO0lBRUEsd0JBQU12QyxDQUNKQyxVQUNBQyxhQUNBQyxrQkFDR2dEO1FBRUgsTUFBTW9YLGVBQWVuWCxLQUFLcEIsbUJBQ3hCL0IsVUFDQUMsZ0JBQ0dpRDtRQUVMLE1BQU0vQyxvQkFDSm1hLE9BQU9yWSw4QkFBOEIvQixrQkFBa0I7UUFDekQsTUFBTUUscUJBQXFCa2EsT0FBT2pZLGVBQy9CK0UsT0FBUTVFLFNBQVVBLE1BQU10QyxrQkFBa0JBLGVBQzFDcUMsSUFBS0MsU0FBVUEsTUFBTUM7UUFDeEIsT0FBTzFDLG1CQUFtQjtZQUN4QkM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7O0FBRUo7SUFFQSx1QkFBTUMsQ0FDSkwsVUFDQUMsYUFDQUMsa0JBQ0dnRDtRQUVILE1BQU1vWCxlQUFlblgsS0FBS3BCLG1CQUN4Qi9CLFVBQ0FDLGdCQUNHaUQ7UUFFTCxNQUFNL0Msb0JBQ0ptYSxPQUFPclksOEJBQThCL0Isa0JBQWtCO1FBQ3pELE1BQU1FLHFCQUFxQmthLE9BQU9qWSxlQUMvQitFLE9BQVE1RSxTQUFVQSxNQUFNdEMsa0JBQWtCQSxlQUMxQ3FDLElBQUtDLFNBQVVBLE1BQU1DO1FBQ3hCLE9BQU9wQyxrQkFBa0I7WUFDdkJMO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDOztBQUVKOzs7QUNwTEssTUFBTW1hLFVBQWtCOztBQUV4QixNQUFNQyxTQUFTOztBQUVmLE1BQU1DLGVBQWU7O0FBRXJCLE1BQU1DLGVBQXVCOzsifQ==
2355
+ export { AuthorizationModel, AuthzService, BaseModelService, BootstrapService, COMMIT, EffectivePermission, EffectivePermissionService, EnvironmeFlagReader, FEATURE_FLAG_AUTH_KEY, FEATURE_FLAG_BLOCK_KEY, FEATURE_FLAG_ENV_PREFIX, FEATURE_FLAG_ENV_ROOT, FEATURE_FLAG_HIDE_KEY, FEATURE_FLAG_MODEL_KEY, FEATURE_FLAG_RENDER_KEY, FULL_VERSION, FeatureFlag, FeatureFlagAccess, FeatureFlagEnvironment, FeatureFlagReader, FeatureFlagService, Group, GroupMembership, GroupMembershipService, GroupService, InheritanceBlock, InheritanceBlockService, IsolationTier, IsolationTierOptions, MembershipStatus, MembershipStatusOptions, OrgUnit, OrgUnitClosure, OrgUnitClosureService, OrgUnitMembership, OrgUnitMembershipService, OrgUnitProfile, OrgUnitProfileService, OrgUnitService, PACKAGE_NAME, Permission, PermissionCategory, PermissionCategoryOptions, PermissionService, Principal, PrincipalKind, PrincipalKindOptions, PrincipalService, ProtectedResource, ProtectedResourceService, REL_CASCADE_DEPENDENT, REL_CASCADE_INSERT_UPDATE, REL_NULLIFY, REL_RESTRICT, ResourceGrant, ResourceGrantService, ResourceLifecycleService, ResourceVisibility, ResourceVisibilityOptions, Role, RoleAssignment, RoleAssignmentService, RolePermission, RolePermissionService, RoleService, ScopeKind, ScopeKindOptions, StorageBinding, StorageBindingKind, StorageBindingKindOptions, StorageBindingService, StorageKind, StorageKindOptions, SystemManagementService, Tenant, TenantMembership, TenantMembershipService, TenantProfile, TenantProfileService, TenantService, User, UserService, VERSION, asArray, blockFeatureOperations, buildAccessContext, buildArangoContext, buildQdrantFilter, execWithLogging, featureAuth, featureFlags, getFeatureGateMetadata, hasFeatureFlagInEnvironment, hideOnFeature, id, isFeatureFlagEnabled, isFeatureFlagEnabledByName, isFeatureRuleBlocked, isFeatureRuleSatisfied, isTimeValid, loadFeatureFlagsFromEnvironment, lowerSlug, normalizeFeatureConfig, normalizeFeatureName, normalizeFeatureRegistry, normalizeFeatureRule, normalizeFeatureSubjectKey, normalizeFeatureSubjectType, nowIso, parseRuntimeValue, readMetadata, relationId, relationMatch, renderIfFeature, resolveFeatureFlagFromEnvironment, sameTenant, shouldExposeForFeatures, shouldHideForFeatures };
2356
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb25zLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy90eXBlcy50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3V0aWxzLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL2F1dGhvcml6YXRpb24tbW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdXNlci5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL29yZy11bml0LWNsb3N1cmUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcGVybWlzc2lvbi5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9yb2xlLXBlcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9yb2xlLWFzc2lnbm1lbnQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcmVzb3VyY2UtZ3JhbnQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcHJpbmNpcGFsLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9pbmhlcml0YW5jZS1ibG9jay5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9zdG9yYWdlLWJpbmRpbmcubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC1wcm9maWxlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL29yZy11bml0LXByb2ZpbGUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZ3JvdXAtbWVtYmVyc2hpcC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9ncm91cC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9lZmZlY3RpdmUtcGVybWlzc2lvbi5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3RlbmFudC1wcm9maWxlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC1wcm9maWxlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC1jbG9zdXJlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdGVuYW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdXNlci5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcHJpbmNpcGFsLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy90ZW5hbnQtbWVtYmVyc2hpcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtbWVtYmVyc2hpcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvZ3JvdXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2dyb3VwLW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Blcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcm9sZS1hc3NpZ25tZW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcHJvdGVjdGVkLXJlc291cmNlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcmVzb3VyY2UtbGlmZWN5Y2xlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9zdG9yYWdlLWJpbmRpbmcuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2Jvb3RzdHJhcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvc3lzdGVtLW1hbmFnZW1lbnQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2F1dGh6LnNlcnZpY2UudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy9jb25zdGFudHMudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy91dGlscy50cyIsIi4uL3NyYy9mZWF0dXJlLWZsYWdzL2Vudmlyb25tZW50LnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvbW9kZWxzL0ZlYXR1cmVGbGFnLm1vZGVsLnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvbW9kZWxzL0ZlYXR1cmVGbGFnQWNjZXNzLm1vZGVsLnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvcmVhZGVycy9GZWF0dXJlRmxhZ1JlYWRlci50cyIsIi4uL3NyYy9mZWF0dXJlLWZsYWdzL3NlcnZpY2VzL0ZlYXR1cmVGbGFnLnNlcnZpY2UudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvdXRpbHNcbiAqIEBzdW1tYXJ5IFNoYXJlZCBpbnRlZ3JhdGlvbiB1dGlsaXRpZXMuXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBoZWxwZXJzIHVzZWQgYWNyb3NzIHRoZSBpbnRlZ3JhdGlvbnMgcGFja2FnZS5cbiAqL1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ0xldmVsIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjV2l0aExvZ2dpbmcoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZyB9LFxuICBsb2c6IExvZ2dlcixcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuaW5mb1xuKTogUHJvbWlzZTx7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9PiB7XG4gIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nOiAke2NvbW1hbmR9YCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGV4ZWMoY29tbWFuZCwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBzdGRvdXQ6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc3RkZXJyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgc3Rkb3V0LnB1c2goZGF0YSk7XG4gICAgICBsb2dbbGV2ZWxdKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgIHN0ZGVyci5wdXNoKGRhdGEpO1xuICAgICAgbG9nLmRlYnVnKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgbG9nLnNpbGx5KGBDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dDogc3Rkb3V0LmpvaW4oXCJcXG5cIiksIHN0ZGVycjogc3RkZXJyLmpvaW4oXCJcXG5cIikgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuY3JpdGljYWwoXG4gICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OlxcbiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBsb2cuY3JpdGljYWwoYENvbW1hbmQgZXhlY3V0aW9uIGVycm9yYCwgZXJyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBlbnVtIElzb2xhdGlvblRpZXIge1xuICBQb29sZWQgPSBcInBvb2xlZFwiLFxuICBCcmlkZ2UgPSBcImJyaWRnZVwiLFxuICBTaWxvID0gXCJzaWxvXCIsXG59XG5cbmV4cG9ydCBlbnVtIE1lbWJlcnNoaXBTdGF0dXMge1xuICBJbnZpdGVkID0gXCJpbnZpdGVkXCIsXG4gIEFjdGl2ZSA9IFwiYWN0aXZlXCIsXG4gIFN1c3BlbmRlZCA9IFwic3VzcGVuZGVkXCIsXG4gIFJlbW92ZWQgPSBcInJlbW92ZWRcIixcbn1cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsS2luZCB7XG4gIFVzZXIgPSBcInVzZXJcIixcbiAgR3JvdXAgPSBcImdyb3VwXCIsXG4gIFNlcnZpY2VBY2NvdW50ID0gXCJzZXJ2aWNlX2FjY291bnRcIixcbiAgQWdlbnQgPSBcImFnZW50XCIsXG4gIEFwaUtleSA9IFwiYXBpX2tleVwiLFxufVxuXG5leHBvcnQgZW51bSBTY29wZUtpbmQge1xuICBUZW5hbnQgPSBcInRlbmFudFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBSZXNvdXJjZSA9IFwicmVzb3VyY2VcIixcbn1cblxuZXhwb3J0IGVudW0gUGVybWlzc2lvbkNhdGVnb3J5IHtcbiAgQWRtaW4gPSBcImFkbWluXCIsXG4gIENvbnRlbnRSZWFkID0gXCJjb250ZW50X3JlYWRcIixcbiAgQ29udGVudFdyaXRlID0gXCJjb250ZW50X3dyaXRlXCIsXG4gIE1lbW9yeSA9IFwibWVtb3J5XCIsXG4gIEdyYXBoID0gXCJncmFwaFwiLFxuICBWZWN0b3IgPSBcInZlY3RvclwiLFxuICBFeHBvcnQgPSBcImV4cG9ydFwiLFxuICBCaWxsaW5nID0gXCJiaWxsaW5nXCIsXG4gIEF1ZGl0ID0gXCJhdWRpdFwiLFxuICBTZWN1cml0eSA9IFwic2VjdXJpdHlcIixcbiAgRGF0YSA9IFwiZGF0YVwiLFxuICBBdXRvbWF0aW9uID0gXCJhdXRvbWF0aW9uXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJlc291cmNlVmlzaWJpbGl0eSB7XG4gIFByaXZhdGUgPSBcInByaXZhdGVcIixcbiAgUmVzb3VyY2VBY2wgPSBcInJlc291cmNlX2FjbFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBPcmdTdWJ0cmVlID0gXCJvcmdfc3VidHJlZVwiLFxuICBUZW5hbnQgPSBcInRlbmFudFwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlS2luZCB7XG4gIFBvc3RncmVzID0gXCJwb3N0Z3Jlc1wiLFxuICBBcmFuZ28gPSBcImFyYW5nb1wiLFxuICBRZHJhbnQgPSBcInFkcmFudFwiLFxuICBPYmplY3RTdG9yYWdlID0gXCJvYmplY3Rfc3RvcmFnZVwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlQmluZGluZ0tpbmQge1xuICBTaGFyZWQgPSBcInNoYXJlZFwiLFxuICBEZWRpY2F0ZWQgPSBcImRlZGljYXRlZFwiLFxufVxuXG5leHBvcnQgY29uc3QgSXNvbGF0aW9uVGllck9wdGlvbnMgPSBPYmplY3QudmFsdWVzKElzb2xhdGlvblRpZXIpO1xuZXhwb3J0IGNvbnN0IE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhNZW1iZXJzaGlwU3RhdHVzKTtcbmV4cG9ydCBjb25zdCBQcmluY2lwYWxLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoUHJpbmNpcGFsS2luZCk7XG5leHBvcnQgY29uc3QgU2NvcGVLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU2NvcGVLaW5kKTtcbmV4cG9ydCBjb25zdCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhQZXJtaXNzaW9uQ2F0ZWdvcnkpO1xuZXhwb3J0IGNvbnN0IFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFJlc291cmNlVmlzaWJpbGl0eSk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdG9yYWdlS2luZCk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU3RvcmFnZUJpbmRpbmdLaW5kKTtcblxuZXhwb3J0IHR5cGUgVHhBcmdzID0gYW55W107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVGVuYW50SW5wdXQge1xuICBzbHVnOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNvbGF0aW9uVGllcj86IElzb2xhdGlvblRpZXI7XG4gIHByb2ZpbGVLZXk/OiBzdHJpbmc7XG4gIHByb2ZpbGVNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVVzZXJJbnB1dCB7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZT86IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcmdVbml0SW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwYXJlbnRPcmdVbml0SWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZUtleT86IHN0cmluZztcbiAgcHJvZmlsZU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUm9sZUlucHV0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NpZ25Sb2xlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICByb2xlSWQ6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgaW5oZXJpdERvd24/OiBib29sZWFuO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBvcmdVbml0SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBvd25lclByaW5jaXBhbElkPzogc3RyaW5nO1xuICBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudFJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbkFjY2Vzc0lucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICByZXNvdXJjZVByb3RlY3RlZElkPzogc3RyaW5nO1xuICBzY29wZUtpbmQ/OiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ/OiBzdHJpbmc7XG4gIGF0PzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbnNCeVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIHJlc291cmNlR3JhbnRzOiBBcnJheTx7IHJlc291cmNlSWQ6IHN0cmluZzsgcGVybWlzc2lvbktleTogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyYW5nb0F1dGhDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUWRyYW50QXV0aEZpbHRlciB7XG4gIG11c3Q6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgbXVzdF9ub3Q/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZDtcbiAgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZDtcbiAgYmluZGluZ0tleTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUGVybWlzc2lvbiB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBSb2xlIHtcbiAga2V5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXlzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBPcmdVbml0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm9maWxlS2V5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjaGlsZHJlbj86IEJvb3RzdHJhcE9yZ1VuaXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBUZW1wbGF0ZSB7XG4gIHRlbmFudDogQ3JlYXRlVGVuYW50SW5wdXQ7XG4gIHJvb3RPcmdVbml0OiBCb290c3RyYXBPcmdVbml0O1xuICBwZXJtaXNzaW9uczogQm9vdHN0cmFwUGVybWlzc2lvbltdO1xuICByb2xlczogQm9vdHN0cmFwUm9sZVtdO1xuICBvd25lclVzZXI6IENyZWF0ZVVzZXJJbnB1dDtcbiAgb3duZXJSb2xlS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIG9yZ1VuaXRJZDogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIHNlbnNpdGl2aXR5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50U25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgc291cmNlS2luZDogc3RyaW5nO1xuICBzb3VyY2VJZDogc3RyaW5nO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aHpEYXRhU291cmNlcyB7XG4gIGxvYWRSZXNvdXJjZT86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8UmVzb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZD47XG4gIGxpc3RSZXNvdXJjZUdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8R3JhbnRTbmFwc2hvdFtdPjtcbiAgbGlzdFByaW5jaXBhbEdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nKSA9PiBQcm9taXNlPEdyYW50U25hcHNob3RbXT47XG4gIGxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucz86IChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbiAgbGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/OiAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbn1cbiIsImltcG9ydCB7IENhc2NhZGUsIE1vZGVsU2VydmljZSwgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250ZXh0LFxuICBBcmFuZ29BdXRoQ29udGV4dCxcbiAgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LFxuICBHcmFudFNuYXBzaG90LFxuICBRZHJhbnRBdXRoRmlsdGVyLFxuICBTY29wZUtpbmQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBSRUxfUkVTVFJJQ1QgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5OT05FLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9OVUxMSUZZID0ge1xuICB1cGRhdGU6IENhc2NhZGUuTk9ORSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiB0cnVlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9DQVNDQURFX0RFUEVOREVOVCA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVMX0NBU0NBREVfSU5TRVJUX1VQREFURSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcmFuZ29Db250ZXh0KG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogQXJhbmdvQXV0aENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgIHByaW5jaXBhbElkOiBvcHRpb25zLnByaW5jaXBhbElkLFxuICAgIHBlcm1pc3Npb25LZXk6IG9wdGlvbnMucGVybWlzc2lvbktleSxcbiAgICBhbGxvd2VkT3JnVW5pdElkczogWy4uLm9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHNdLFxuICAgIGFsbG93ZWRSZXNvdXJjZUlkczogWy4uLm9wdGlvbnMuYWxsb3dlZFJlc291cmNlSWRzXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUWRyYW50RmlsdGVyKG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogUWRyYW50QXV0aEZpbHRlciB7XG4gIHJldHVybiB7XG4gICAgbXVzdDogW1xuICAgICAge1xuICAgICAgICBrZXk6IFwidGVuYW50X2lkXCIsXG4gICAgICAgIG1hdGNoOiB7IHZhbHVlOiBvcHRpb25zLnRlbmFudElkIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICB7IGtleTogXCJvcmdfdW5pdF9pZFwiLCBtYXRjaDogeyBhbnk6IG9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHMgfSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogXCJwcm90ZWN0ZWRfcmVzb3VyY2VfaWRcIixcbiAgICAgICAgICAgIG1hdGNoOiB7IGFueTogb3B0aW9ucy5hbGxvd2VkUmVzb3VyY2VJZHMgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsga2V5OiBcIm93bmVyX3ByaW5jaXBhbF9pZFwiLCBtYXRjaDogeyB2YWx1ZTogb3B0aW9ucy5wcmluY2lwYWxJZCB9IH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlS2luZDogU2NvcGVLaW5kLCBzY29wZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2NvcGVLaW5kfToke3Njb3BlSWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vd0lzbygpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5PFQ+KHZhbHVlOiBUW10gfCB1bmRlZmluZWQpOiBUW10ge1xuICByZXR1cm4gdmFsdWUgPz8gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lVGVuYW50KHJvd1RlbmFudDogdW5rbm93biwgdGVuYW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVsYXRpb25JZChyb3dUZW5hbnQgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0ZW5hbnRJZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uTWF0Y2goXG4gIHZhbHVlOiB1bmtub3duLFxuICB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXRcbiAgICA/IHJlbGF0aW9uSWQodmFsdWUgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0YXJnZXRcbiAgICA6IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG93ZXJTbHVnKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHZhbHVlXG4gICAgICAudHJpbSgpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKSB8fCBcIml0ZW1cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lVmFsaWQoXG4gIGF0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICBzdGFydHNBdD86IERhdGUsXG4gIGV4cGlyZXNBdD86IERhdGVcbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0YW50ID0gYXQgPz8gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0c0F0ICYmIGluc3RhbnQgPCBzdGFydHNBdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZXhwaXJlc0F0ICYmIGluc3RhbnQgPiBleHBpcmVzQXQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFjY2Vzc0NvbnRleHQob3B0aW9uczoge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W107XG4gIGdyYW50czogR3JhbnRTbmFwc2hvdFtdO1xufSk6IEFjY2Vzc0NvbnRleHQge1xuICBjb25zdCBwZXJtaXNzaW9uc0J5U2NvcGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBjb25zdCBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIG9wdGlvbnMucGVybWlzc2lvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBzY29wZUtleShwZXJtaXNzaW9uLnNjb3BlS2luZCwgcGVybWlzc2lvbi5zY29wZUlkKTtcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XSA9IHBlcm1pc3Npb25zQnlTY29wZVtrZXldID8/IFtdO1xuICAgIHBlcm1pc3Npb25zQnlTY29wZVtrZXldLnB1c2gocGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5KTtcbiAgICBpZiAocGVybWlzc2lvbi5zY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0KSB7XG4gICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldID1cbiAgICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0ucHVzaChcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUlkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgcHJpbmNpcGFsSWQ6IG9wdGlvbnMucHJpbmNpcGFsSWQsXG4gICAgcGVybWlzc2lvbnNCeVNjb3BlLFxuICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uLFxuICAgIHJlc291cmNlR3JhbnRzOiBvcHRpb25zLmdyYW50cy5tYXAoKGdyYW50KSA9PiAoe1xuICAgICAgcmVzb3VyY2VJZDogZ3JhbnQucmVzb3VyY2VJZCxcbiAgICAgIHBlcm1pc3Npb25LZXk6IGdyYW50LnBlcm1pc3Npb25LZXksXG4gICAgfSkpLFxuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsU2VydmljZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+ICYgeyBpZDogc3RyaW5nIH0sXG4+IGV4dGVuZHMgTW9kZWxTZXJ2aWNlPE0sIFJlcG9zaXRvcnk8TSwgYW55Pj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xheno6IG5ldyAoKSA9PiBNKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld01vZGVsPFQ+KGNsYXp6OiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBjbGF6eigpIGFzIG9iamVjdCwgZGF0YSBhcyBvYmplY3QpIGFzIFQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9IGFzIE0sIGRhdGEgYXMgb2JqZWN0KSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPbmUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoZGF0YSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBnZXRCeUlkKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU9uZShpZDogc3RyaW5nLCBwYXRjaDogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnVwZGF0ZShPYmplY3QuYXNzaWduKGV4aXN0aW5nLCBwYXRjaCksIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQnlJZChpZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVwby5kZWxldGUoaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5maW5kT25lQnkoa2V5LCB2YWx1ZSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kTWFueUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvXG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZSh7IFtrZXldOiB2YWx1ZSB9IGFzIGFueSlcbiAgICAgIC5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEFsbCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5zZWxlY3QoKS5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZCgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uSWQodmFsdWU6IHN0cmluZyB8IHsgaWQ6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUuaWQ7XG59XG5cbmV4cG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdXRob3JpemF0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSBhcyBuZXZlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9tZW1iZXJzaGlwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFVzZXIsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfbWVtYmVyc2hpcHNfdXNlclwiKVxuICBAcmVxdWlyZWQoKVxuICB1c2VyITogVXNlciB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMpIEBjb2x1bW4oKSBzdGF0dXMhOiBNZW1iZXJzaGlwU3RhdHVzO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuQHRhYmxlKFwidXNlcnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVXNlciBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICBAdXVpZCgpXG4gIGlkITogc3RyaW5nO1xuXG4gIEB1bmlxdWUoKVxuICBAdHlwZShTdHJpbmcpXG4gIEBjb2x1bW4oKVxuICBlbWFpbD86IHN0cmluZztcblxuICBAdW5pcXVlKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgcGhvbmU/OiBzdHJpbmc7XG5cbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgZGlzcGxheU5hbWUhOiBzdHJpbmc7XG5cbiAgQG9uZVRvTWFueSgoKSA9PiBUZW5hbnRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKVxuICB0ZW5hbnRNZW1iZXJzaGlwcz86IFRlbmFudE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuXG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpXG4gIG9yZ1VuaXRNZW1iZXJzaGlwcz86IE9yZ1VuaXRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcblxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuL3VzZXIubW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdE1lbWJlcnNoaXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBVc2VyLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3VzZXJcIilcbiAgQHJlcXVpcmVkKClcbiAgdXNlciE6IFVzZXIgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zKSBAY29sdW1uKCkgc3RhdHVzITogTWVtYmVyc2hpcFN0YXR1cztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9jbG9zdXJlXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRDbG9zdXJlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX2FuY2VzdG9yXCIpXG4gIEByZXF1aXJlZCgpXG4gIGFuY2VzdG9yITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX2Nsb3N1cmVfZGVzY2VuZGFudFwiKVxuICBAcmVxdWlyZWQoKVxuICBkZXNjZW5kYW50ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihOdW1iZXIpIEBjb2x1bW4oKSBkZXB0aCE6IG51bWJlcjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1bmlxdWUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSwgUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvbiB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5AdGFibGUoXCJwZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAdW5pcXVlKCkgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBrZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMpIEBjb2x1bW4oKSBjYXRlZ29yeSE6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlUGVybWlzc2lvbiwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcm9sZVBlcm1pc3Npb25zPzogUm9sZVBlcm1pc3Npb25bXSB8IHN0cmluZ1tdO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4vcm9sZS5tb2RlbFwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuL3Blcm1pc3Npb24ubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvbiBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBSb2xlLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9wZXJtaXNzaW9uc19yb2xlXCIpXG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBSb2xlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFBlcm1pc3Npb24sIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX3Blcm1pc3Npb25zX3Blcm1pc3Npb25cIilcbiAgQHJlcXVpcmVkKClcbiAgcGVybWlzc2lvbiE6IFBlcm1pc3Npb24gfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb24gfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50IH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJvbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlc190ZW5hbnRcIilcbiAgdGVuYW50PzogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGtleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZVBlcm1pc3Npb24sIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJvbGVQZXJtaXNzaW9ucz86IFJvbGVQZXJtaXNzaW9uW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlQXNzaWdubWVudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTY29wZUtpbmQsIFNjb3BlS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGUubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9hc3NpZ25tZW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFJvbGUsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3JvbGVcIilcbiAgQHJlcXVpcmVkKClcbiAgcm9sZSE6IFJvbGUgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihCb29sZWFuKSBAY29sdW1uKCkgaW5oZXJpdERvd24hOiBib29sZWFuO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbFwiO1xuXG5AdGFibGUoXCJyZXNvdXJjZV9ncmFudHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VHcmFudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcm90ZWN0ZWRSZXNvdXJjZSwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19yZXNvdXJjZVwiKVxuICBAcmVxdWlyZWQoKVxuICByZXNvdXJjZSE6IFByb3RlY3RlZFJlc291cmNlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKSBzdGFydHNBdD86IERhdGU7XG4gIEBjb2x1bW4oKSBleHBpcmVzQXQ/OiBEYXRlO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfY3JlYXRlZF9ieVwiKVxuICBjcmVhdGVkQnk/OiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQsIFByaW5jaXBhbEtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQubW9kZWxcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnQgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJwcmluY2lwYWxzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFByaW5jaXBhbCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcmluY2lwYWxzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFByaW5jaXBhbEtpbmRPcHRpb25zKSBAY29sdW1uKCkga2luZCE6IFByaW5jaXBhbEtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc3ViamVjdElkITogc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVBc3NpZ25tZW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByb2xlQXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUmVzb3VyY2VHcmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcmVzb3VyY2VHcmFudHM/OiBSZXNvdXJjZUdyYW50W10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX05VTExJRlksIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VWaXNpYmlsaXR5LCBSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50IH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuQHRhYmxlKFwicHJvdGVjdGVkX3Jlc291cmNlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcm90ZWN0ZWRfcmVzb3VyY2VzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Byb3RlY3RlZF9yZXNvdXJjZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVzb3VyY2VUeXBlITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlc291cmNlSWQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMpIEBjb2x1bW4oKSB2aXNpYmlsaXR5ITogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJvdGVjdGVkX3Jlc291cmNlc19vd25lclwiKVxuICBvd25lcj86IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IFJlc291cmNlR3JhbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGdyYW50cz86IFJlc291cmNlR3JhbnRbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5LCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9OVUxMSUZZIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJpbmhlcml0YW5jZV9ibG9ja3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9jayBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19pbmhlcml0YW5jZV9ibG9ja3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfaW5oZXJpdGFuY2VfYmxvY2tzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2luaGVyaXRhbmNlX2Jsb2Nrc19ibG9ja2VkX2FuY2VzdG9yXCIpXG4gIGJsb2NrZWRGcm9tQW5jZXN0b3I/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zKSBAY29sdW1uKCkgcGVybWlzc2lvbkNhdGVnb3J5ITogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlYXNvbj86IHN0cmluZztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5tb2RlbFwiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWxcIjtcbmltcG9ydCB7IEluaGVyaXRhbmNlQmxvY2sgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfdW5pdHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRzX3BhcmVudFwiKVxuICBwYXJlbnQ/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGNoaWxkcmVuPzogT3JnVW5pdFtdIHwgc3RyaW5nW107XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwYXRoITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzogT3JnVW5pdE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFByb3RlY3RlZFJlc291cmNlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByZXNvdXJjZXM/OiBQcm90ZWN0ZWRSZXNvdXJjZVtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gSW5oZXJpdGFuY2VCbG9jaywgUkVMX1JFU1RSSUNULCBmYWxzZSkgaW5oZXJpdGFuY2VCbG9ja3M/OiBJbmhlcml0YW5jZUJsb2NrW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYW5jZXN0b3JMaW5rcz86IE9yZ1VuaXRDbG9zdXJlW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgZGVzY2VuZGFudExpbmtzPzogT3JnVW5pdENsb3N1cmVbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmdLaW5kLCBTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zLCBTdG9yYWdlS2luZCwgU3RvcmFnZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJzdG9yYWdlX2JpbmRpbmdzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VCaW5kaW5nIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3N0b3JhZ2VfYmluZGluZ3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUtpbmRPcHRpb25zKSBAY29sdW1uKCkgc3RvcmFnZUtpbmQhOiBTdG9yYWdlS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucykgQGNvbHVtbigpIGJpbmRpbmdLaW5kITogU3RvcmFnZUJpbmRpbmdLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGJpbmRpbmdLZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVnaW9uITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIG1vZGVsLFxuICBvcHRpb24sXG4gIHJlcXVpcmVkLFxuICB0eXBlIGFzIHR5cGVPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSXNvbGF0aW9uVGllciwgSXNvbGF0aW9uVGllck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmcgfSBmcm9tIFwiLi9zdG9yYWdlLWJpbmRpbmcubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEB1bmlxdWUoKSBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNsdWchOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGVPZihTdHJpbmcpXG4gIEBvcHRpb24oSXNvbGF0aW9uVGllck9wdGlvbnMpXG4gIEBjb2x1bW4oKVxuICBpc29sYXRpb25UaWVyITogSXNvbGF0aW9uVGllcjtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBvcmdVbml0cz86XG4gICAgfCBPcmdVbml0W11cbiAgICB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFRlbmFudE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzpcbiAgICB8IFRlbmFudE1lbWJlcnNoaXBbXVxuICAgIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUHJpbmNpcGFsLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBwcmluY2lwYWxzPzpcbiAgICB8IFByaW5jaXBhbFtdXG4gICAgfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBTdG9yYWdlQmluZGluZywgUkVMX1JFU1RSSUNULCBmYWxzZSkgc3RvcmFnZUJpbmRpbmdzPzpcbiAgICB8IFN0b3JhZ2VCaW5kaW5nW11cbiAgICB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRQcm9maWxlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9wcm9maWxlc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHByb2ZpbGVLZXkhOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0UHJvZmlsZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRfcHJvZmlsZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcHJvZmlsZUtleSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi9ncm91cC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3VwX21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEdyb3VwTWVtYmVyc2hpcCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IEdyb3VwLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBfbWVtYmVyc2hpcHNfZ3JvdXBcIilcbiAgQHJlcXVpcmVkKClcbiAgZ3JvdXAhOiBHcm91cCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9ncm91cC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3Vwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBHcm91cCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfb3JnX3VuaXRcIilcbiAgb3JnVW5pdD86IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IEdyb3VwTWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVycz86IEdyb3VwTWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2NvcGVLaW5kLCBTY29wZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImVmZmVjdGl2ZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzb3VyY2VLaW5kITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNvdXJjZUlkITogc3RyaW5nO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW5hbnRQcm9maWxlIH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50UHJvZmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudFByb2ZpbGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVGVuYW50UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRQcm9maWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBwcm9maWxlS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JUZW5hbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFRlbmFudFByb2ZpbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByb2ZpbGUpID0+XG4gICAgICBzYW1lVGVuYW50KHByb2ZpbGUudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0Rm9yVGVuYW50KHRlbmFudElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0UHJvZmlsZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHByb2ZpbGVLZXk6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgcHJvZmlsZUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yT3JnVW5pdChcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRQcm9maWxlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcm9maWxlKSA9PlxuICAgICAgcmVsYXRpb25NYXRjaChwcm9maWxlLm9yZ1VuaXQsIG9yZ1VuaXRJZClcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCYXNlTW9kZWxTZXJ2aWNlLFxuICByZWxhdGlvbklkLFxuICByZWxhdGlvbk1hdGNoLFxuICBzYW1lVGVuYW50LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1jbG9zdXJlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRDbG9zdXJlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRDbG9zdXJlKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3RvcnMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5kZXNjZW5kYW50LCBvcmdVbml0SWQpXG4gICAgICApXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuZGVwdGggLSByaWdodC5kZXB0aCk7XG4gIH1cblxuICBhc3luYyBsaXN0RGVzY2VuZGFudHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5hbmNlc3Rvciwgb3JnVW5pdElkKVxuICAgICAgKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmRlcHRoIC0gcmlnaHQuZGVwdGgpO1xuICB9XG5cbiAgYXN5bmMgaXNBbmNlc3Rvck9mKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBkZXNjZW5kYW50T3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMubGlzdEFuY2VzdG9ycyh0ZW5hbnRJZCwgZGVzY2VuZGFudE9yZ1VuaXRJZCwgLi4uYXJncylcbiAgICApLnNvbWUoKHJvdykgPT4gcmVsYXRpb25NYXRjaChyb3cuYW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZWxmTGluayhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdENsb3N1cmU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGFuY2VzdG9yOiBvcmdVbml0SWQsXG4gICAgICAgIGRlc2NlbmRhbnQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgZGVwdGg6IDAsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjaGlsZE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuY2VzdG9yTGlua3MgPSBhd2FpdCB0aGlzLmxpc3RBbmNlc3RvcnMoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHBhcmVudE9yZ1VuaXRJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBhbmNlc3RvckxpbmtzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgICAgYW5jZXN0b3I6IGxpbmsuYW5jZXN0b3IsXG4gICAgICAgICAgZGVzY2VuZGFudDogY2hpbGRPcmdVbml0SWQsXG4gICAgICAgICAgZGVwdGg6IGxpbmsuZGVwdGggKyAxLFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUxpbmtzRm9yU3VidHJlZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN1YnRyZWUgPSBhd2FpdCB0aGlzLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChbXG4gICAgICBvcmdVbml0SWQsXG4gICAgICAuLi5zdWJ0cmVlLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSksXG4gICAgXSk7XG4gICAgY29uc3QgYW5jZXN0b3JJZHMgPSBuZXcgU2V0KFtcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIC4uLnN1YnRyZWUubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSksXG4gICAgXSk7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIChkZXNjZW5kYW50SWRzLmhhcyhyZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSkgfHxcbiAgICAgICAgICBhbmNlc3Rvcklkcy5oYXMocmVsYXRpb25JZChyb3cuYW5jZXN0b3IpKSlcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrIH0gZnJvbSBcIi4uL21vZGVscy9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoSW5oZXJpdGFuY2VCbG9jayk7XG4gIH1cblxuICBhc3luYyBibG9ja0NhdGVnb3J5KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbkNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgYmxvY2tlZEZyb21BbmNlc3RvcklkPzogc3RyaW5nLFxuICAgIHJlYXNvbj86IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgYmxvY2tlZEZyb21BbmNlc3RvcjogYmxvY2tlZEZyb21BbmNlc3RvcklkLFxuICAgICAgICBwZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVuYmxvY2tDYXRlZ29yeShibG9ja0lkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGJsb2NrSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvck9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2tbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAoYmxvY2spID0+XG4gICAgICAgIHNhbWVUZW5hbnQoYmxvY2sudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChibG9jay5vcmdVbml0LCBvcmdVbml0SWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0Rm9yT3JnVW5pdCh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKSkuc29tZShcbiAgICAgIChibG9jaykgPT5cbiAgICAgICAgYmxvY2sucGVybWlzc2lvbkNhdGVnb3J5ID09PSBjYXRlZ29yeSAmJlxuICAgICAgICAoIWJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IgfHxcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKGJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBDcmVhdGVUZW5hbnRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihUZW5hbnQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGVuYW50KGlucHV0OiBDcmVhdGVUZW5hbnRJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2x1ZzogaW5wdXQuc2x1ZyxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgaXNvbGF0aW9uVGllcjogaW5wdXQuaXNvbGF0aW9uVGllciA/PyBJc29sYXRpb25UaWVyLlBvb2xlZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5U2x1ZyhzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kT25lQnkoXCJzbHVnXCIsIHNsdWcgYXMgbmV2ZXIsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVuYW1lVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh0ZW5hbnRJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgY2hhbmdlU2x1Zyh0ZW5hbnRJZDogc3RyaW5nLCBzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodGVuYW50SWQsIHsgc2x1ZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldElzb2xhdGlvblRpZXIoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBpc29sYXRpb25UaWVyOiBJc29sYXRpb25UaWVyLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHRlbmFudElkLCB7IGlzb2xhdGlvblRpZXIgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVUZW5hbnRDb250cm9sbGVkKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHRlbmFudElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgbG93ZXJTbHVnLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZU9yZ1VuaXRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJvd3NCeUlkKFxuICBzZXJ2aWNlOiBCYXNlTW9kZWxTZXJ2aWNlPGFueT4sXG4gIHJvd3M6IEFycmF5PHsgaWQ6IHN0cmluZyB9PixcbiAgLi4uYXJnczogYW55W11cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgYXdhaXQgc2VydmljZS5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcmdVbml0UGF0aChwYXJlbnRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IGxvd2VyU2x1ZyhuYW1lKTtcbiAgICByZXR1cm4gcGFyZW50UGF0aCA/IGAke3BhcmVudFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0vJHtzZWdtZW50fWAgOiBgLyR7c2VnbWVudH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9maWxlSWZOZWVkZWQoXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGVNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwcm9maWxlS2V5KSByZXR1cm47XG4gICAgYXdhaXQgbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpLmNyZWF0ZVByb2ZpbGUob3JnVW5pdElkLCBwcm9maWxlS2V5LCBwcm9maWxlTWV0YWRhdGEsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVSb290KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJvZmlsZUtleT86IHN0cmluZyxcbiAgICBwcm9maWxlTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBvcmdVbml0ID0gYXdhaXQgdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgodW5kZWZpbmVkLCBuYW1lKSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgcHJvZmlsZUtleSwgcHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBhd2FpdCBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCkuY3JlYXRlU2VsZkxpbmsodGVuYW50SWQsIG9yZ1VuaXQuaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBvcmdVbml0O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVDaGlsZChpbnB1dDogQ3JlYXRlT3JnVW5pdElucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdD4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGlucHV0LnBhcmVudE9yZ1VuaXRJZCA/IGF3YWl0IHRoaXMuZ2V0QnlJZChpbnB1dC5wYXJlbnRPcmdVbml0SWQsIC4uLmFyZ3MpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9yZ1VuaXQgPSBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQ/LmlkID8/IGlucHV0LnBhcmVudE9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgcGF0aDogdGhpcy5vcmdVbml0UGF0aChwYXJlbnQ/LnBhdGgsIGlucHV0Lm5hbWUpLFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgaW5wdXQucHJvZmlsZUtleSwgaW5wdXQucHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5jcmVhdGVTZWxmTGluayhpbnB1dC50ZW5hbnRJZCwgb3JnVW5pdC5pZCwgLi4uYXJncyk7XG4gICAgaWYgKGlucHV0LnBhcmVudE9yZ1VuaXRJZCkge1xuICAgICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkKFxuICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgaW5wdXQucGFyZW50T3JnVW5pdElkLFxuICAgICAgICBvcmdVbml0LmlkLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3JnVW5pdDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RDaGlsZHJlbihwYXJlbnRPcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+IHJlbGF0aW9uTWF0Y2gob3JnVW5pdC5wYXJlbnQsIHBhcmVudE9yZ1VuaXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBzYW1lVGVuYW50KG9yZ1VuaXQudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlc2NlbmRhbnRPcmdVbml0cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGluY2x1ZGVTZWxmID0gZmFsc2UsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgaWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3Rvck9yZ1VuaXRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgaW5jbHVkZVNlbGYgPSBmYWxzZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0QW5jZXN0b3JzKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoYW5jZXN0b3JzLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5hbmNlc3RvcikpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZU9yZ1VuaXQob3JnVW5pdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHsgbmFtZSwgcGF0aDogdGhpcy5vcmdVbml0UGF0aChleGlzdGluZy5wYXRoLmluY2x1ZGVzKFwiL1wiKSA/IGV4aXN0aW5nLnBhdGgucmVwbGFjZSgvXFwvW14vXSskLywgXCJcIikgOiB1bmRlZmluZWQsIG5hbWUpIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgbW92ZU9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBuZXdQYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBuZXdQYXJlbnQgPSBhd2FpdCB0aGlzLmdldEJ5SWQobmV3UGFyZW50T3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHtcbiAgICAgICAgcGFyZW50OiBuZXdQYXJlbnQuaWQsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgobmV3UGFyZW50LnBhdGgsIGV4aXN0aW5nLm5hbWUpLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucmVidWlsZFRlbmFudENsb3N1cmUodGVuYW50SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkVGVuYW50Q2xvc3VyZSh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGV4aXN0aW5nTGlua3MgPSBhd2FpdCBjbG9zdXJlU2VydmljZS5saXN0QWxsKC4uLmFyZ3MpO1xuICAgIGF3YWl0IGRlbGV0ZVJvd3NCeUlkKFxuICAgICAgY2xvc3VyZVNlcnZpY2UsXG4gICAgICBleGlzdGluZ0xpbmtzLmZpbHRlcigocm93KSA9PiBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcblxuICAgIGNvbnN0IG9yZ1VuaXRzID0gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICAgIGNvbnN0IGxlZnREZXB0aCA9IGxlZnQucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJpZ2h0RGVwdGggPSByaWdodC5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlZnREZXB0aCAtIHJpZ2h0RGVwdGg7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG9yZ1VuaXQgb2Ygb3JnVW5pdHMpIHtcbiAgICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmNyZWF0ZVNlbGZMaW5rKHRlbmFudElkLCBvcmdVbml0LmlkLCAuLi5hcmdzKTtcbiAgICAgIGlmIChvcmdVbml0LnBhcmVudCkge1xuICAgICAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5pbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgcmVsYXRpb25JZChvcmdVbml0LnBhcmVudCksXG4gICAgICAgICAgb3JnVW5pdC5pZCxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBkZWxldGVPcmdVbml0VHJlZSh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IHRoaXMubGlzdERlc2NlbmRhbnRPcmdVbml0cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCB0cnVlLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKG9yZ1VuaXQpID0+IG9yZ1VuaXQuaWQpKTtcbiAgICBjb25zdCBvcmdVbml0cyA9IChhd2FpdCB0aGlzLmxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT5cbiAgICAgIGRlc2NlbmRhbnRJZHMuaGFzKG9yZ1VuaXQuaWQpXG4gICAgKTtcbiAgICBhd2FpdCBkZWxldGVSb3dzQnlJZCh0aGlzLCBvcmdVbml0cywgLi4uYXJncyk7XG4gICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuZGVsZXRlTGlua3NGb3JTdWJ0cmVlKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVVc2VySW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi4vbW9kZWxzL3VzZXIubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxVc2VyPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFVzZXIpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVXNlcihpbnB1dDogQ3JlYXRlVXNlcklucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IGlucHV0LmVtYWlsLFxuICAgICAgICBwaG9uZTogaW5wdXQucGhvbmUsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5RW1haWwoZW1haWw6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgodXNlcikgPT4gdXNlci5lbWFpbCA9PT0gZW1haWwpIGFzIFVzZXI7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEaXNwbGF5TmFtZSh1c2VySWQ6IHN0cmluZywgZGlzcGxheU5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodXNlcklkLCB7IGRpc3BsYXlOYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRW1haWwodXNlcklkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHVzZXJJZCwgeyBlbWFpbCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVBob25lKHVzZXJJZDogc3RyaW5nLCBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh1c2VySWQsIHsgcGhvbmUgfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuLi9tb2RlbHMvcHJpbmNpcGFsLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxQcmluY2lwYWw+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJpbmNpcGFsKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByaW5jaXBhbChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGtpbmQ6IFByaW5jaXBhbEtpbmQsXG4gICAgc3ViamVjdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxQcmluY2lwYWw+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIHN1YmplY3RJZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZvclN1YmplY3QoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBraW5kOiBQcmluY2lwYWxLaW5kLFxuICAgIHN1YmplY3RJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UHJpbmNpcGFsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAocHJpbmNpcGFsKSA9PlxuICAgICAgICBzYW1lVGVuYW50KHByaW5jaXBhbC50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICBwcmluY2lwYWwua2luZCA9PT0ga2luZCAmJlxuICAgICAgICBwcmluY2lwYWwuc3ViamVjdElkID09PSBzdWJqZWN0SWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAga2luZDogUHJpbmNpcGFsS2luZCxcbiAgICBzdWJqZWN0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRGb3JTdWJqZWN0KHRlbmFudElkLCBraW5kLCBzdWJqZWN0SWQsIC4uLmFyZ3MpKSA/PyAoYXdhaXQgdGhpcy5jcmVhdGVQcmluY2lwYWwodGVuYW50SWQsIGtpbmQsIHN1YmplY3RJZCwgLi4uYXJncykpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlRm9yU3ViamVjdCh0ZW5hbnRJZCwgUHJpbmNpcGFsS2luZC5Vc2VyLCB1c2VySWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJpbmNpcGFsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KHRlbmFudElkLCBQcmluY2lwYWxLaW5kLkdyb3VwLCBncm91cElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuLi9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFRlbmFudE1lbWJlcnNoaXApO1xuICB9XG5cbiAgYXN5bmMgYWRkVXNlclRvVGVuYW50KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzID0gTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNldFN0YXR1cyhtZW1iZXJzaGlwSWQ6IHN0cmluZywgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJUZW5hbnRzKHVzZXJJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLnVzZXIsIHVzZXJJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFVzZXJzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiBzYW1lVGVuYW50KG1lbWJlcnNoaXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlVXNlckZyb21UZW5hbnQobWVtYmVyc2hpcElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKG1lbWJlcnNoaXBJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRNZW1iZXJzaGlwKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFVzZXJUb09yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMgPSBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0U3RhdHVzKG1lbWJlcnNoaXBJZDogc3RyaW5nLCBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJPcmdVbml0cyh1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAudXNlciwgdXNlcklkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFVzZXJzKG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVVzZXJGcm9tT3JnVW5pdChtZW1iZXJzaGlwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQobWVtYmVyc2hpcElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBHcm91cFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEdyb3VwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZD86IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZW5hbWVHcm91cChncm91cElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGdyb3VwSWQsIHsgbmFtZSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVHcm91cFRvT3JnVW5pdChncm91cElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoZ3JvdXBJZCwgeyBvcmdVbml0OiBvcmdVbml0SWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50R3JvdXBzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoZ3JvdXApID0+IHNhbWVUZW5hbnQoZ3JvdXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXBNZW1iZXJzaGlwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8R3JvdXBNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwTWVtYmVyc2hpcCk7XG4gIH1cblxuICBhc3luYyBhZGRQcmluY2lwYWxUb0dyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgZ3JvdXBJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEdyb3VwTWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgZ3JvdXA6IGdyb3VwSWQsXG4gICAgICAgIHByaW5jaXBhbDogcHJpbmNpcGFsSWQsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEdyb3VwTWVtYmVycyhncm91cElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5ncm91cCwgZ3JvdXBJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXBNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAucHJpbmNpcGFsLCBwcmluY2lwYWxJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUHJpbmNpcGFsRnJvbUdyb3VwKG1lbWJlcnNoaXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChtZW1iZXJzaGlwSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZUdyb3VwUHJpbmNpcGFsSWRzRm9yUHJpbmNpcGFsKHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBwcmluY2lwYWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZW1iZXJzaGlwcy5tYXAoYXN5bmMgKG1lbWJlcnNoaXApID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSByZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KTtcbiAgICAgICAgY29uc3QgZ3JvdXBJZCA9IHJlbGF0aW9uSWQobWVtYmVyc2hpcC5ncm91cCk7XG4gICAgICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHByaW5jaXBhbFNlcnZpY2UuZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQsIGdyb3VwSWQsIC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gcHJpbmNpcGFsLmlkO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBwcmluY2lwYWxzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnksIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuLi9tb2RlbHMvcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFBlcm1pc3Npb24+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUGVybWlzc2lvbik7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQZXJtaXNzaW9uKGlucHV0OiBDcmVhdGVQZXJtaXNzaW9uSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBrZXk6IGlucHV0LmtleSxcbiAgICAgICAgY2F0ZWdvcnk6IGlucHV0LmNhdGVnb3J5LFxuICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQuZGVzY3JpcHRpb24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeUtleShrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5rZXkgPT09IGtleSkgYXMgUGVybWlzc2lvbjtcbiAgfVxuXG4gIGFzeW5jIGxpc3RCeUNhdGVnb3J5KGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLmNhdGVnb3J5ID09PSBjYXRlZ29yeSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXNjcmlwdGlvbihwZXJtaXNzaW9uSWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocGVybWlzc2lvbklkLCB7IGRlc2NyaXB0aW9uIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVSb2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJvbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGUpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUm9sZShpbnB1dDogQ3JlYXRlUm9sZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAga2V5OiBpbnB1dC5rZXksXG4gICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpbnB1dC5kZXNjcmlwdGlvbixcbiAgICAgICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3lzdGVtUm9sZUJ5S2V5KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKChjYW5kaWRhdGUpID0+ICFjYW5kaWRhdGUudGVuYW50ICYmIGNhbmRpZGF0ZS5rZXkgPT09IGtleSk7XG4gICAgaWYgKCFyb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvbGUgXCIke2tleX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyBnZXRUZW5hbnRSb2xlQnlLZXkodGVuYW50SWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgY29uc3Qgcm9sZSA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBzYW1lVGVuYW50KGNhbmRpZGF0ZS50ZW5hbnQsIHRlbmFudElkKSAmJiBjYW5kaWRhdGUua2V5ID09PSBrZXlcbiAgICApO1xuICAgIGlmICghcm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb2xlIFwiJHtrZXl9XCIgbm90IGZvdW5kIGZvciB0ZW5hbnQgJHt0ZW5hbnRJZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyByZW5hbWVSb2xlKHJvbGVJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHJvbGVJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlUm9sZU1ldGFkYXRhKFxuICAgIHJvbGVJZDogc3RyaW5nLFxuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocm9sZUlkLCB7IG1ldGFkYXRhIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFJvbGVzKHRlbmFudElkOiBzdHJpbmcsIGluY2x1ZGVTeXN0ZW0gPSBmYWxzZSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGUpID0+XG4gICAgICBpbmNsdWRlU3lzdGVtID8gIXJvbGUudGVuYW50IHx8IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKSA6IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL21vZGVscy9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVSb3dzQnlJZChcbiAgc2VydmljZTogQmFzZU1vZGVsU2VydmljZTxhbnk+LFxuICByb3dzOiBBcnJheTx7IGlkOiBzdHJpbmcgfT4sXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGF3YWl0IHNlcnZpY2UuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJvbGVQZXJtaXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHJvbGU6IHJvbGVJZCxcbiAgICAgICAgcGVybWlzc2lvbjogcGVybWlzc2lvbklkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlSWQ6IHN0cmluZywgcGVybWlzc2lvbktleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9uID0gYXdhaXQgbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCkuZ2V0QnlLZXkocGVybWlzc2lvbktleSwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRkUGVybWlzc2lvblRvUm9sZShyb2xlSWQsIHBlcm1pc3Npb24uaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUGVybWlzc2lvbkZyb21Sb2xlKHJvbGVQZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm9sZVBlcm1pc3Npb25JZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGVQZXJtaXNzaW9uKSA9PiByZWxhdGlvbk1hdGNoKHJvbGVQZXJtaXNzaW9uLnJvbGUsIHJvbGVJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFBlcm1pc3Npb25Sb2xlcyhwZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyb2xlUGVybWlzc2lvbikgPT4gcmVsYXRpb25NYXRjaChyb2xlUGVybWlzc2lvbi5wZXJtaXNzaW9uLCBwZXJtaXNzaW9uSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZHM6IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5saXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgZGVsZXRlUm93c0J5SWQodGhpcywgZXhpc3RpbmcsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwZXJtaXNzaW9uSWRzLm1hcCgocGVybWlzc2lvbklkKSA9PiB0aGlzLmFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkLCBwZXJtaXNzaW9uSWQsIC4uLmFyZ3MpKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zKFxuICAgIGlucHV0OiBpbXBvcnQoXCIuLi90eXBlc1wiKS5DcmVhdGVSb2xlSW5wdXQsXG4gICAgcGVybWlzc2lvbktleXM6IHN0cmluZ1tdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8aW1wb3J0KFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIikuUm9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCBuZXcgUm9sZVNlcnZpY2UoKS5jcmVhdGVSb2xlKGlucHV0LCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2YgcGVybWlzc2lvbktleXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlLmlkLCBwZXJtaXNzaW9uS2V5LCAuLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFzc2lnblJvbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUtYXNzaWdubWVudC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlQXNzaWdubWVudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSb2xlQXNzaWdubWVudCk7XG4gIH1cblxuICBhc3luYyBhc3NpZ25Sb2xlKFxuICAgIGlucHV0OiBBc3NpZ25Sb2xlSW5wdXQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcHJpbmNpcGFsOiBpbnB1dC5wcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZTogaW5wdXQucm9sZUlkLFxuICAgICAgICBzY29wZUtpbmQ6IGlucHV0LnNjb3BlS2luZCxcbiAgICAgICAgc2NvcGVJZDogaW5wdXQuc2NvcGVJZCxcbiAgICAgICAgaW5oZXJpdERvd246IGlucHV0LmluaGVyaXREb3duID8/IGZhbHNlLFxuICAgICAgICBzdGFydHNBdDogaW5wdXQuc3RhcnRzQXQsXG4gICAgICAgIGV4cGlyZXNBdDogaW5wdXQuZXhwaXJlc0F0LFxuICAgICAgICBjb25kaXRpb25zOiBpbnB1dC5jb25kaXRpb25zLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlQXNzaWdubWVudChhc3NpZ25tZW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQoYXNzaWdubWVudElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChhc3NpZ25tZW50KSA9PlxuICAgICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChhc3NpZ25tZW50LnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSb2xlQXNzaWdubWVudHMoXG4gICAgcm9sZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYXNzaWdubWVudCkgPT5cbiAgICAgIHJlbGF0aW9uTWF0Y2goYXNzaWdubWVudC5yb2xlLCByb2xlSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGFzc2lnbm1lbnQpID0+XG4gICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQXNzaWdubWVudFdpbmRvdyhcbiAgICBhc3NpZ25tZW50SWQ6IHN0cmluZyxcbiAgICBzdGFydHNBdDogRGF0ZSB8IHVuZGVmaW5lZCxcbiAgICBleHBpcmVzQXQ6IERhdGUgfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShhc3NpZ25tZW50SWQsIHsgc3RhcnRzQXQsIGV4cGlyZXNBdCB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25JZCwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb24gfSBmcm9tIFwiLi4vbW9kZWxzL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vZ3JvdXAtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LWNsb3N1cmUuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8RWZmZWN0aXZlUGVybWlzc2lvbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFZmZlY3RpdmVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2gocGVybWlzc2lvbi5wcmluY2lwYWwsIHByaW5jaXBhbElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yU2NvcGUoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSAmJiBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBoYXNQZXJtaXNzaW9uKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgc2NvcGVLaW5kOiBTY29wZUtpbmQsXG4gICAgc2NvcGVJZDogc3RyaW5nLFxuICAgIGF0PzogRGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSAmJlxuICAgICAgICBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmXG4gICAgICAgIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZCAmJlxuICAgICAgICAoIXBlcm1pc3Npb24uc3RhcnRzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghcGVybWlzc2lvbi5leHBpcmVzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uZXhwaXJlc0F0ID49IGF0KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG5cbiAgICBjb25zdCByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gICAgY29uc3Qgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwU2VydmljZSA9IG5ldyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gICAgY29uc3QgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gICAgY29uc3Qgb3JnVW5pdENsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlID0gbmV3IEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlKCk7XG5cbiAgICBjb25zdCBtYXRlcmlhbGl6ZWQ6IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdID0gW107XG4gICAgY29uc3Qgc291cmNlQXNzaWdubWVudHMgPSBhd2FpdCByb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwcyA9IGF3YWl0IGdyb3VwTWVtYmVyc2hpcFNlcnZpY2UubGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBBc3NpZ25tZW50cyA9IChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBncm91cE1lbWJlcnNoaXBzLm1hcChhc3luYyAobWVtYmVyc2hpcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdyb3VwUHJpbmNpcGFsID0gYXdhaXQgcHJpbmNpcGFsU2VydmljZS5nZXRHcm91cFByaW5jaXBhbChyZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KSwgcmVsYXRpb25JZChtZW1iZXJzaGlwLmdyb3VwKSwgLi4uYXJncyk7XG4gICAgICAgICAgcmV0dXJuIHJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIGdyb3VwUHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLmZsYXQoKTtcblxuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gWy4uLnNvdXJjZUFzc2lnbm1lbnRzLCAuLi5ncm91cEFzc2lnbm1lbnRzXTtcbiAgICBmb3IgKGNvbnN0IGFzc2lnbm1lbnQgb2YgYXNzaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IHJvbGVQZXJtaXNzaW9ucyA9IGF3YWl0IHJvbGVQZXJtaXNzaW9uU2VydmljZS5saXN0Um9sZVBlcm1pc3Npb25zKHJlbGF0aW9uSWQoYXNzaWdubWVudC5yb2xlKSwgLi4uYXJncyk7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByb2xlUGVybWlzc2lvbnMubWFwKGFzeW5jIChyb2xlUGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uU2VydmljZS5maW5kT25lQnkoXCJpZFwiLCByZWxhdGlvbklkKHJvbGVQZXJtaXNzaW9uLnBlcm1pc3Npb24pIGFzIG5ldmVyLCAuLi5hcmdzKVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikgY29udGludWU7XG4gICAgICAgIGNvbnN0IHNjb3BlS2luZCA9IGFzc2lnbm1lbnQuc2NvcGVLaW5kO1xuICAgICAgICBjb25zdCBzY29wZUlkID0gYXNzaWdubWVudC5zY29wZUlkO1xuICAgICAgICBjb25zdCBzY29wZXM6IEFycmF5PHsgc2NvcGVLaW5kOiBTY29wZUtpbmQ7IHNjb3BlSWQ6IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuVGVuYW50KSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQ6IHRlbmFudElkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLlJlc291cmNlKSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiAhYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gYXdhaXQgb3JnVW5pdENsb3N1cmVTZXJ2aWNlLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgc2NvcGVJZCwgLi4uYXJncyk7XG4gICAgICAgICAgc2NvcGVzLnB1c2goLi4uZGVzY2VuZGFudHMubWFwKChyb3cpID0+ICh7IHNjb3BlS2luZCwgc2NvcGVJZDogcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkgfSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGVkIG9mIHNjb3Blcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiZcbiAgICAgICAgICAgIGFzc2lnbm1lbnQuaW5oZXJpdERvd24gJiZcbiAgICAgICAgICAgIHNjb3BlZC5zY29wZUlkICE9PSBzY29wZUlkICYmXG4gICAgICAgICAgICAoYXdhaXQgaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UuY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IoXG4gICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICBzY29wZWQuc2NvcGVJZCxcbiAgICAgICAgICAgICAgc2NvcGVJZCxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5jYXRlZ29yeSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRlcmlhbGl6ZWQucHVzaCh7XG4gICAgICAgICAgICBpZDogXCJcIixcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uS2V5OiBwZXJtaXNzaW9uLmtleSxcbiAgICAgICAgICAgIHNjb3BlS2luZDogc2NvcGVkLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHNjb3BlZC5zY29wZUlkLFxuICAgICAgICAgICAgc291cmNlS2luZDogXCJyb2xlX2Fzc2lnbm1lbnRcIixcbiAgICAgICAgICAgIHNvdXJjZUlkOiBhc3NpZ25tZW50LmlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IGFzc2lnbm1lbnQuc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IGFzc2lnbm1lbnQuZXhwaXJlc0F0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWF0ZXJpYWxpemVkLm1hcCgocGVybWlzc2lvbikgPT5cbiAgICAgICAgdGhpcy5jcmVhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGVuYW50OiBwZXJtaXNzaW9uLnRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsOiBwZXJtaXNzaW9uLnByaW5jaXBhbElkLFxuICAgICAgICAgICAgcGVybWlzc2lvbktleTogcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5LFxuICAgICAgICAgICAgc2NvcGVLaW5kOiBwZXJtaXNzaW9uLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHBlcm1pc3Npb24uc2NvcGVJZCxcbiAgICAgICAgICAgIHNvdXJjZUtpbmQ6IHBlcm1pc3Npb24uc291cmNlS2luZCxcbiAgICAgICAgICAgIHNvdXJjZUlkOiBwZXJtaXNzaW9uLnNvdXJjZUlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IHBlcm1pc3Npb24uc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHBlcm1pc3Npb24uZXhwaXJlc0F0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVidWlsZEZvclRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByaW5jaXBhbHMgPSAoYXdhaXQgbmV3IFByaW5jaXBhbFNlcnZpY2UoKS5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByaW5jaXBhbCkgPT4gc2FtZVRlbmFudChwcmluY2lwYWwudGVuYW50LCB0ZW5hbnRJZCkpO1xuICAgIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIHByaW5jaXBhbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgUmVzb3VyY2VWaXNpYmlsaXR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuLi9tb2RlbHMvcHJvdGVjdGVkLXJlc291cmNlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3RlY3RlZFJlc291cmNlKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyUmVzb3VyY2UoaW5wdXQ6IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBpbnB1dC5vcmdVbml0SWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogaW5wdXQucmVzb3VyY2VUeXBlLFxuICAgICAgICByZXNvdXJjZUlkOiBpbnB1dC5yZXNvdXJjZUlkLFxuICAgICAgICB2aXNpYmlsaXR5OiBpbnB1dC52aXNpYmlsaXR5LFxuICAgICAgICBvd25lcjogaW5wdXQub3duZXJQcmluY2lwYWxJZCxcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGlucHV0LnNlbnNpdGl2aXR5LFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeURvbWFpblJlc291cmNlKHRlbmFudElkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKFxuICAgICAgKHJlc291cmNlKSA9PiBzYW1lVGVuYW50KHJlc291cmNlLnRlbmFudCwgdGVuYW50SWQpICYmIHJlc291cmNlLnJlc291cmNlVHlwZSA9PT0gcmVzb3VyY2VUeXBlICYmIHJlc291cmNlLnJlc291cmNlSWQgPT09IHJlc291cmNlSWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbW92ZVJlc291cmNlVG9PcmdVbml0KHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IG9yZ1VuaXQ6IG9yZ1VuaXRJZCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFZpc2liaWxpdHkocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IHZpc2liaWxpdHkgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB0cmFuc2Zlck93bmVyc2hpcChwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHByb3RlY3RlZFJlc291cmNlSWQsIHsgb3duZXI6IG93bmVyUHJpbmNpcGFsSWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFJlc291cmNlcyhvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gcmVsYXRpb25NYXRjaChyZXNvdXJjZS5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRSZXNvdXJjZXModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gc2FtZVRlbmFudChyZXNvdXJjZS50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdyYW50UmVzb3VyY2VJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudCB9IGZyb20gXCIuLi9tb2RlbHMvcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlR3JhbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSZXNvdXJjZUdyYW50PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJlc291cmNlR3JhbnQpO1xuICB9XG5cbiAgYXN5bmMgZ3JhbnRSZXNvdXJjZShpbnB1dDogR3JhbnRSZXNvdXJjZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UmVzb3VyY2VHcmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcmVzb3VyY2U6IGlucHV0LnJlc291cmNlSWQsXG4gICAgICAgIHByaW5jaXBhbDogaW5wdXQucHJpbmNpcGFsSWQsXG4gICAgICAgIHBlcm1pc3Npb25LZXk6IGlucHV0LnBlcm1pc3Npb25LZXksXG4gICAgICAgIHN0YXJ0c0F0OiBpbnB1dC5zdGFydHNBdCxcbiAgICAgICAgZXhwaXJlc0F0OiBpbnB1dC5leHBpcmVzQXQsXG4gICAgICAgIGNvbmRpdGlvbnM6IGlucHV0LmNvbmRpdGlvbnMsXG4gICAgICAgIGNyZWF0ZWRCeTogaW5wdXQuY3JlYXRlZEJ5UHJpbmNpcGFsSWQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZXZva2VHcmFudChncmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGdyYW50SWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJlc291cmNlR3JhbnRzKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJlc291cmNlR3JhbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGdyYW50KSA9PiByZWxhdGlvbk1hdGNoKGdyYW50LnJlc291cmNlLCBwcm90ZWN0ZWRSZXNvdXJjZUlkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSZXNvdXJjZUdyYW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKGdyYW50KSA9PiBzYW1lVGVuYW50KGdyYW50LnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2goZ3JhbnQucHJpbmNpcGFsLCBwcmluY2lwYWxJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFzR3JhbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgYXQ/OiBEYXRlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpLnNvbWUoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIHJlbGF0aW9uTWF0Y2goZ3JhbnQucmVzb3VyY2UsIHByb3RlY3RlZFJlc291cmNlSWQpICYmXG4gICAgICAgIGdyYW50LnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgKCFncmFudC5zdGFydHNBdCB8fCAhYXQgfHwgZ3JhbnQuc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghZ3JhbnQuZXhwaXJlc0F0IHx8ICFhdCB8fCBncmFudC5leHBpcmVzQXQgPj0gYXQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbEZvclJlc291cmNlKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RSZXNvdXJjZUdyYW50cyhwcm90ZWN0ZWRSZXNvdXJjZUlkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudFNlcnZpY2UgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVZpc2liaWxpdHkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTGlmZWN5Y2xlU2VydmljZSB7XG4gIGFzeW5jIHVucmVnaXN0ZXJSZXNvdXJjZShwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFJlc291cmNlR3JhbnRTZXJ2aWNlKCkuZGVsZXRlQWxsRm9yUmVzb3VyY2UocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmRlbGV0ZUJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlUmVzb3VyY2VTY29wZShcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICBvcmdVbml0SWQ6IHN0cmluZztcbiAgICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gICAgb3duZXJQcmluY2lwYWxJZD86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmdldEJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudElkOiByZWxhdGlvbklkKHJlc291cmNlLnRlbmFudCksXG4gICAgICBvcmdVbml0SWQ6IHJlbGF0aW9uSWQocmVzb3VyY2Uub3JnVW5pdCksXG4gICAgICB2aXNpYmlsaXR5OiByZXNvdXJjZS52aXNpYmlsaXR5LFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogcmVzb3VyY2Uub3duZXIgPyByZWxhdGlvbklkKHJlc291cmNlLm93bmVyKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVTdG9yYWdlQmluZGluZ0lucHV0LCBTdG9yYWdlQmluZGluZ0tpbmQsIFN0b3JhZ2VLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZyB9IGZyb20gXCIuLi9tb2RlbHMvc3RvcmFnZS1iaW5kaW5nLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlQmluZGluZ1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFN0b3JhZ2VCaW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJpbmRpbmcoaW5wdXQ6IENyZWF0ZVN0b3JhZ2VCaW5kaW5nSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgc3RvcmFnZUtpbmQ6IGlucHV0LnN0b3JhZ2VLaW5kLFxuICAgICAgICBiaW5kaW5nS2luZDogaW5wdXQuYmluZGluZ0tpbmQsXG4gICAgICAgIGJpbmRpbmdLZXk6IGlucHV0LmJpbmRpbmdLZXksXG4gICAgICAgIHJlZ2lvbjogaW5wdXQucmVnaW9uLFxuICAgICAgICBjb25maWc6IGlucHV0LmNvbmZpZyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmdbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGJpbmRpbmcpID0+IHJlbGF0aW9uSWQoYmluZGluZy50ZW5hbnQpID09PSB0ZW5hbnRJZCk7XG4gIH1cblxuICBhc3luYyBnZXRCaW5kaW5nKHRlbmFudElkOiBzdHJpbmcsIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbmQoKGJpbmRpbmcpID0+IGJpbmRpbmcuc3RvcmFnZUtpbmQgPT09IHN0b3JhZ2VLaW5kKTtcbiAgfVxuXG4gIGFzeW5jIHNldEJpbmRpbmdDb25maWcoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGJpbmRpbmdJZCwgeyBjb25maWcgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBwcm9tb3RlVG9EZWRpY2F0ZWQoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgYmluZGluZ0tleTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYmluZGluZ0lkLCB7IGJpbmRpbmdLaW5kOiBTdG9yYWdlQmluZGluZ0tpbmQuRGVkaWNhdGVkLCBiaW5kaW5nS2V5LCByZWdpb24sIGNvbmZpZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFNoYXJlZChcbiAgICBiaW5kaW5nSWQ6IHN0cmluZyxcbiAgICBiaW5kaW5nS2V5OiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShiaW5kaW5nSWQsIHsgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZC5TaGFyZWQsIGJpbmRpbmdLZXksIHJlZ2lvbiwgY29uZmlnIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEJvb3RzdHJhcE9yZ1VuaXQsIEJvb3RzdHJhcFRlbXBsYXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudFNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgVGVuYW50UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0U2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi91c2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB0ZW5hbnRTZXJ2aWNlID0gbmV3IFRlbmFudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSB0ZW5hbnRQcm9maWxlU2VydmljZSA9IG5ldyBUZW5hbnRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIG9yZ1VuaXRTZXJ2aWNlID0gbmV3IE9yZ1VuaXRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnVW5pdFByb2ZpbGVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gbmV3IFVzZXJTZXJ2aWNlKCk7XG4gIHByaXZhdGUgbWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uU2VydmljZSA9IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVTZXJ2aWNlID0gbmV3IFJvbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSgpO1xuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgYm9vdHN0cmFwVGVuYW50RnJvbVRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBCb290c3RyYXBUZW1wbGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHtcbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICAgIHJvb3RPcmdVbml0SWQ6IHN0cmluZztcbiAgICBvd25lclVzZXJJZDogc3RyaW5nO1xuICAgIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5jcmVhdGVUZW5hbnQoXG4gICAgICB0ZW1wbGF0ZS50ZW5hbnQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAodGVtcGxhdGUudGVuYW50LnByb2ZpbGVLZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMudGVuYW50UHJvZmlsZVNlcnZpY2UuY3JlYXRlUHJvZmlsZShcbiAgICAgICAgdGVuYW50LmlkLFxuICAgICAgICB0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZUtleSxcbiAgICAgICAgdGVtcGxhdGUudGVuYW50LnByb2ZpbGVNZXRhZGF0YSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVPcmdUcmVlID0gYXN5bmMgKFxuICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIG9yZ1VuaXQ6IEJvb3RzdHJhcE9yZ1VuaXRcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPVxuICAgICAgICBwYXJlbnRJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLm9yZ1VuaXRTZXJ2aWNlLmNyZWF0ZVJvb3QoXG4gICAgICAgICAgICAgIHRlbmFudC5pZCxcbiAgICAgICAgICAgICAgb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICBvcmdVbml0LnByb2ZpbGVLZXksXG4gICAgICAgICAgICAgIG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMub3JnVW5pdFNlcnZpY2UuY3JlYXRlQ2hpbGQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudE9yZ1VuaXRJZDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgbmFtZTogb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHByb2ZpbGVLZXk6IG9yZ1VuaXQucHJvZmlsZUtleSxcbiAgICAgICAgICAgICAgICBwcm9maWxlTWV0YWRhdGE6IG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG9yZ1VuaXQuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlT3JnVHJlZShjcmVhdGVkLmlkLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm9vdE9yZ1VuaXQgPSBhd2FpdCBjcmVhdGVPcmdUcmVlKHVuZGVmaW5lZCwgdGVtcGxhdGUucm9vdE9yZ1VuaXQpO1xuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyKFxuICAgICAgdGVtcGxhdGUub3duZXJVc2VyLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9UZW5hbnQoXG4gICAgICB0ZW5hbnQuaWQsXG4gICAgICBvd25lci5pZCxcbiAgICAgIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3Qgb3duZXJQcmluY2lwYWwgPSBhd2FpdCB0aGlzLnByaW5jaXBhbFNlcnZpY2UuZ2V0VXNlclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgdGVtcGxhdGUucGVybWlzc2lvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucGVybWlzc2lvblNlcnZpY2UuY3JlYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHRlbXBsYXRlLnJvbGVzKSB7XG4gICAgICBjb25zdCBjcmVhdGVkUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuY3JlYXRlUm9sZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgICAga2V5OiByb2xlLmtleSxcbiAgICAgICAgICBuYW1lOiByb2xlLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHJvbGUuZGVzY3JpcHRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2Ygcm9sZS5wZXJtaXNzaW9uS2V5cykge1xuICAgICAgICBhd2FpdCB0aGlzLnJvbGVQZXJtaXNzaW9uU2VydmljZS5hZGRQZXJtaXNzaW9uS2V5VG9Sb2xlKFxuICAgICAgICAgIGNyZWF0ZWRSb2xlLmlkLFxuICAgICAgICAgIHBlcm1pc3Npb25LZXksXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG93bmVyUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KFxuICAgICAgdGVuYW50LmlkLFxuICAgICAgdGVtcGxhdGUub3duZXJSb2xlS2V5LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6IG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgICByb2xlSWQ6IG93bmVyUm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogcm9vdE9yZ1VuaXQuaWQsXG4gICAgICAgIGluaGVyaXREb3duOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgIHJvb3RPcmdVbml0SWQ6IHJvb3RPcmdVbml0LmlkLFxuICAgICAgb3duZXJVc2VySWQ6IG93bmVyLmlkLFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogb3duZXJQcmluY2lwYWwuaWQsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgU3lzdGVtTWFuYWdlbWVudFNlcnZpY2Uge1xuICBwcml2YXRlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnTWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVNlcnZpY2UgPSBuZXcgUm9sZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UoKTtcblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIG9uYm9hcmRVc2VyVG9UZW5hbnRBbmRPcmdVbml0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8eyBwcmluY2lwYWxJZDogc3RyaW5nIH0+IHtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLmFkZFVzZXJUb1RlbmFudCh0ZW5hbnRJZCwgdXNlcklkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5vcmdNZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9PcmdVbml0KHRlbmFudElkLCBvcmdVbml0SWQsIHVzZXJJZCwgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHRoaXMucHJpbmNpcGFsU2VydmljZS5nZXRVc2VyUHJpbmNpcGFsKHRlbmFudElkLCB1c2VySWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIHByaW5jaXBhbElkOiBwcmluY2lwYWwuaWQsXG4gICAgICAgIHJvbGVJZDogcm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogb3JnVW5pdElkLFxuICAgICAgICBpbmhlcml0RG93bjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHsgcHJpbmNpcGFsSWQ6IHByaW5jaXBhbC5pZCB9O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjaGFuZ2VVc2VyT3JnUm9sZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIGluaGVyaXREb3duOiBib29sZWFuLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgY29uc3QgY3VycmVudEFzc2lnbm1lbnRzID0gYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgZm9yIChjb25zdCBhc3NpZ25tZW50IG9mIGN1cnJlbnRBc3NpZ25tZW50cy5maWx0ZXIoKHJvdykgPT4gcm93LnNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgcm93LnNjb3BlSWQgPT09IG9yZ1VuaXRJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLnJldm9rZUFzc2lnbm1lbnQoYXNzaWdubWVudC5pZCwgLi4uYXJncyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmFzc2lnblJvbGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudElkLFxuICAgICAgICBwcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZUlkOiByb2xlLmlkLFxuICAgICAgICBzY29wZUtpbmQ6IFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICBzY29wZUlkOiBvcmdVbml0SWQsXG4gICAgICAgIGluaGVyaXREb3duLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBzdXNwZW5kVXNlckluVGVuYW50KHRlbmFudE1lbWJlcnNoaXBJZDogc3RyaW5nLCB0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2Uuc2V0U3RhdHVzKHRlbmFudE1lbWJlcnNoaXBJZCwgTWVtYmVyc2hpcFN0YXR1cy5TdXNwZW5kZWQsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYWN0aXZhdGVVc2VySW5UZW5hbnQodGVuYW50TWVtYmVyc2hpcElkOiBzdHJpbmcsIHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5zZXRTdGF0dXModGVuYW50TWVtYmVyc2hpcElkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQXV0aHpEYXRhU291cmNlcyxcbiAgQ2FuQWNjZXNzSW5wdXQsXG4gIFJlc291cmNlVmlzaWJpbGl0eSxcbiAgU2NvcGVLaW5kLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGFzQXJyYXksXG4gIGJ1aWxkQWNjZXNzQ29udGV4dCxcbiAgYnVpbGRBcmFuZ29Db250ZXh0LFxuICBidWlsZFFkcmFudEZpbHRlcixcbiAgaXNUaW1lVmFsaWQsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBzY29wZUtleShzY29wZUtpbmQ6IFNjb3BlS2luZCwgc2NvcGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3Njb3BlS2luZH06JHtzY29wZUlkfWA7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoelNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzID0ge30pIHtcbiAgICB0aGlzLmRhdGFTb3VyY2VzID0gZGF0YVNvdXJjZXM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGNhbkFjY2VzcyhpbnB1dDogQ2FuQWNjZXNzSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXQgPSBpbnB1dC5hdCA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKGlucHV0LnNjb3BlS2luZCAmJiBpbnB1dC5zY29wZUlkKSB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBpbnB1dC5zY29wZUtpbmQsXG4gICAgICAgICAgaW5wdXQuc2NvcGVJZFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFzQXJyYXkocGVybWlzc2lvbnMpLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubG9hZFJlc291cmNlPy4oXG4gICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgIGlucHV0LnJlc291cmNlUHJvdGVjdGVkSWRcbiAgICApO1xuICAgIGlmICghcmVzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocmVzb3VyY2UudGVuYW50SWQgIT09IGlucHV0LnRlbmFudElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocmVzb3VyY2Uub3duZXJQcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgZ3JhbnRzID0gYXNBcnJheShcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdFJlc291cmNlR3JhbnRzPy4oXG4gICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICBpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkXG4gICAgICApXG4gICAgKS5maWx0ZXIoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIGdyYW50LnByaW5jaXBhbElkID09PSBpbnB1dC5wcmluY2lwYWxJZCAmJlxuICAgICAgICBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgIGlzVGltZVZhbGlkKGF0LCBncmFudC5zdGFydHNBdCwgZ3JhbnQuZXhwaXJlc0F0KVxuICAgICk7XG4gICAgaWYgKGdyYW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHkgPSByZXNvdXJjZS52aXNpYmlsaXR5O1xuICAgIGlmIChcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5Qcml2YXRlIHx8XG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUmVzb3VyY2VBY2xcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuT3JnVW5pdCB8fFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1N1YnRyZWVcbiAgICApIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICAgIHJlc291cmNlLm9yZ1VuaXRJZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5UZW5hbnQpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5UZW5hbnQsXG4gICAgICAgICAgaW5wdXQudGVuYW50SWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVQZXJtaXNzaW9ucy5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVpcmVBY2Nlc3MoaW5wdXQ6IENhbkFjY2Vzc0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY2FuQWNjZXNzKGlucHV0LCAuLi5hcmdzKSkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIGBBY2Nlc3MgZGVuaWVkIGZvciAke2lucHV0LnBlcm1pc3Npb25LZXl9IG9uICR7aW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCA/PyBzY29wZUtleShpbnB1dC5zY29wZUtpbmQgPz8gU2NvcGVLaW5kLlJlc291cmNlLCBpbnB1dC5zY29wZUlkID8/IFwiXCIpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxpbXBvcnQoXCIuLi90eXBlc1wiKS5BY2Nlc3NDb250ZXh0PiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnM/Lih0ZW5hbnRJZCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgICBjb25zdCBncmFudHMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0UHJpbmNpcGFsR3JhbnRzPy4odGVuYW50SWQsIHByaW5jaXBhbElkKVxuICAgICk7XG4gICAgcmV0dXJuIGJ1aWxkQWNjZXNzQ29udGV4dCh7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbnMsXG4gICAgICBncmFudHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZEFyYW5nb0NvbnRleHQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjZXNzQ29udGV4dChcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9XG4gICAgICBhY2Nlc3MuYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbktleV0gPz8gW107XG4gICAgY29uc3QgYWxsb3dlZFJlc291cmNlSWRzID0gYWNjZXNzLnJlc291cmNlR3JhbnRzXG4gICAgICAuZmlsdGVyKChncmFudCkgPT4gZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSlcbiAgICAgIC5tYXAoKGdyYW50KSA9PiBncmFudC5yZXNvdXJjZUlkKTtcbiAgICByZXR1cm4gYnVpbGRBcmFuZ29Db250ZXh0KHtcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICBwZXJtaXNzaW9uS2V5LFxuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHMsXG4gICAgICBhbGxvd2VkUmVzb3VyY2VJZHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZFFkcmFudEZpbHRlcihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGFsbG93ZWRPcmdVbml0SWRzID1cbiAgICAgIGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHNcbiAgICAgIC5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KVxuICAgICAgLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZFFkcmFudEZpbHRlcih7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbktleSxcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzLFxuICAgICAgYWxsb3dlZFJlc291cmNlSWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2ZlYXR1cmUtZmxhZ3NcbiAqIEBzdW1tYXJ5IEZlYXR1cmUgZmxhZyBjb25zdGFudHMgYW5kIG1ldGFkYXRhIGtleXMuXG4gKi9cblxuZXhwb3J0IGNvbnN0IEZFQVRVUkVfRkxBR19FTlZfUk9PVCA9IFwiZmVhdHVyZUZsYWdcIjtcbmV4cG9ydCBjb25zdCBGRUFUVVJFX0ZMQUdfRU5WX1BSRUZJWCA9IFwiRkVBVFVSRV9GTEFHXCI7XG5cbmV4cG9ydCBjb25zdCBGRUFUVVJFX0ZMQUdfTU9ERUxfS0VZID0gXCJmZWF0dXJlLWZsYWdzOm1vZGVsXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX0FVVEhfS0VZID0gXCJmZWF0dXJlLWZsYWdzOmF1dGhcIjtcbmV4cG9ydCBjb25zdCBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZID0gXCJmZWF0dXJlLWZsYWdzOmJsb2NrXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVkgPSBcImZlYXR1cmUtZmxhZ3M6cmVuZGVyLWlmXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX0hJREVfS0VZID0gXCJmZWF0dXJlLWZsYWdzOmhpZGUtb25cIjtcblxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEZlYXR1cmVGbGFnQ29uZmlnLFxuICBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3RUeXBlLFxuICBGZWF0dXJlRmxhZ01hdGNoTW9kZSxcbiAgRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgRmVhdHVyZUZsYWdSdWxlLFxuICBGZWF0dXJlRmxhZ1ZhbHVlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmVhdHVyZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IG5hbWUudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiB0cmltbWVkO1xuICBpZiAoL15bYS16XVthLXpBLVowLTldKiQvLnRlc3QodHJpbW1lZCkpIHJldHVybiB0cmltbWVkO1xuICBjb25zdCBjYW1lbGl6ZWQgPSB0cmltbWVkXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW19cXC1cXHNdKy9nLCBcIiBcIilcbiAgICAuc3BsaXQoXCIgXCIpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKGNhbWVsaXplZC5sZW5ndGggPT09IDApIHJldHVybiB0cmltbWVkO1xuICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBjYW1lbGl6ZWQ7XG4gIHJldHVybiBbXG4gICAgaGVhZCxcbiAgICAuLi50YWlsLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnQgPyBzZWdtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2VnbWVudC5zbGljZSgxKSA6IHNlZ21lbnRcbiAgICApLFxuICBdXG4gICAgLmpvaW4oXCJcIilcbiAgICAucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSdW50aW1lVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICBpZiAodHJpbW1lZCA9PT0gXCJ0cnVlXCIpIHJldHVybiB0cnVlO1xuICBpZiAodHJpbW1lZCA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XG4gIGlmICgvXi0/XFxkKyhcXC5cXGQrKT8kLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gTnVtYmVyKHRyaW1tZWQpO1xuICBpZiAoXG4gICAgKHRyaW1tZWQuc3RhcnRzV2l0aChcIntcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIn1cIikpIHx8XG4gICAgKHRyaW1tZWQuc3RhcnRzV2l0aChcIltcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIl1cIikpXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPYmplY3RLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWtleSkgcmV0dXJuIGtleTtcbiAgaWYgKC9eW2Etel1bYS16QS1aMC05XSokLy50ZXN0KGtleSkpIHJldHVybiBrZXk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBrZXlcbiAgICAucmVwbGFjZSgvW1xccy1dKy9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCJfXCIpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSByZXR1cm4ga2V5O1xuICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBub3JtYWxpemVkO1xuICByZXR1cm4gW1xuICAgIGhlYWQudG9Mb3dlckNhc2UoKSxcbiAgICAuLi50YWlsLm1hcChcbiAgICAgIChzZWdtZW50KSA9PlxuICAgICAgICBzZWdtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2VnbWVudC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpXG4gICAgKSxcbiAgXS5qb2luKFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmVhdHVyZUNvbmZpZyhcbiAgdmFsdWU6IHVua25vd25cbik6IEZlYXR1cmVGbGFnVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBwYXJzZVJ1bnRpbWVWYWx1ZSh2YWx1ZSkgYXMgRmVhdHVyZUZsYWdWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogRmVhdHVyZUZsYWdDb25maWcgPSB7fTtcbiAgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmZvckVhY2goKFtrZXksIHJhd10pID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gbm9ybWFsaXplT2JqZWN0S2V5KGtleSk7XG4gICAgaWYgKHR5cGVvZiByYXcgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJlc3VsdFtub3JtYWxpemVkS2V5XSA9IG5vcm1hbGl6ZUZlYXR1cmVDb25maWcocmF3KSA/PyByYXc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVSZWdpc3RyeShcbiAgdmFsdWU6IHVua25vd25cbik6IEZlYXR1cmVGbGFnUmVnaXN0cnkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHt9O1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJlZHVjZShcbiAgICAoYWNjLCBba2V5LCByYXddKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gbm9ybWFsaXplRmVhdHVyZU5hbWUoa2V5KTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZUZlYXR1cmVDb25maWcocmF3KTtcbiAgICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGFjY1tub3JtYWxpemVkS2V5XSA9IG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZTogRmVhdHVyZUZsYWdWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVGbGFnRW5hYmxlZEJ5TmFtZShcbiAgcmVnaXN0cnk6IEZlYXR1cmVGbGFnUmVnaXN0cnkgfCB1bmRlZmluZWQsXG4gIGZlYXR1cmVOYW1lOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGZWF0dXJlRmxhZ0VuYWJsZWQocmVnaXN0cnk/Lltub3JtYWxpemVGZWF0dXJlTmFtZShmZWF0dXJlTmFtZSldKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVSdWxlKFxuICBmZWF0dXJlczogc3RyaW5nW10sXG4gIG1hdGNoOiBGZWF0dXJlRmxhZ01hdGNoTW9kZSA9IFwiYW55XCJcbik6IEZlYXR1cmVGbGFnUnVsZSB7XG4gIHJldHVybiB7XG4gICAgZmVhdHVyZXM6IFsuLi5uZXcgU2V0KGZlYXR1cmVzLm1hcChub3JtYWxpemVGZWF0dXJlTmFtZSkuZmlsdGVyKEJvb2xlYW4pKV0sXG4gICAgbWF0Y2gsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVSdWxlU2F0aXNmaWVkKFxuICBydWxlOiBGZWF0dXJlRmxhZ1J1bGUgfCB1bmRlZmluZWQsXG4gIHJlZ2lzdHJ5OiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFydWxlIHx8IHJ1bGUuZmVhdHVyZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgZW5hYmxlZCA9IHJ1bGUuZmVhdHVyZXMuZmlsdGVyKChmZWF0dXJlKSA9PlxuICAgIGlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lKHJlZ2lzdHJ5LCBmZWF0dXJlKVxuICApO1xuICBpZiAocnVsZS5tYXRjaCA9PT0gXCJhbGxcIikgcmV0dXJuIGVuYWJsZWQubGVuZ3RoID09PSBydWxlLmZlYXR1cmVzLmxlbmd0aDtcbiAgcmV0dXJuIGVuYWJsZWQubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmVhdHVyZVJ1bGVCbG9ja2VkKFxuICBydWxlOiBGZWF0dXJlRmxhZ1J1bGUgfCB1bmRlZmluZWQsXG4gIHJlZ2lzdHJ5OiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFydWxlIHx8IHJ1bGUuZmVhdHVyZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBydWxlLmZlYXR1cmVzLnNvbWUoKGZlYXR1cmUpID0+IGlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lKHJlZ2lzdHJ5LCBmZWF0dXJlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkTWV0YWRhdGE8VCA9IHVua25vd24+KFxuICB0YXJnZXQ6IG9iamVjdCxcbiAga2V5OiBzdHJpbmdcbik6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KHRhcmdldCBhcyBhbnksIGtleSkgYXMgVCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0VHlwZShcbiAgc3ViamVjdFR5cGU6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdFR5cGUgfCBzdHJpbmdcbik6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdFR5cGUge1xuICByZXR1cm4gc3ViamVjdFR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgYXMgRmVhdHVyZUZsYWdBY2Nlc3NTdWJqZWN0VHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5KHN1YmplY3RLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdWJqZWN0S2V5LnRyaW0oKTtcbn1cbiIsImltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50IH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBGRUFUVVJFX0ZMQUdfRU5WX1JPT1QsXG4gIEZFQVRVUkVfRkxBR19FTlZfUFJFRklYLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZlYXR1cmVOYW1lLCBub3JtYWxpemVGZWF0dXJlUmVnaXN0cnkgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUsXG4gIEZlYXR1cmVGbGFnUmVnaXN0cnksXG4gIEZlYXR1cmVGbGFnVmFsdWUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBGZWF0dXJlRmxhZ0Vudmlyb25tZW50ID0gTG9nZ2VkRW52aXJvbm1lbnQuYWNjdW11bGF0ZSh7XG4gIFtGRUFUVVJFX0ZMQUdfRU5WX1JPT1RdOiB7fSxcbn0gYXMgRmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGZWF0dXJlRmxhZ3NGcm9tRW52aXJvbm1lbnQoXG4gIHNvdXJjZTogUGljazxGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUsIFwiZmVhdHVyZUZsYWdcIj4gPSBGZWF0dXJlRmxhZ0Vudmlyb25tZW50XG4pOiBQcm9taXNlPEZlYXR1cmVGbGFnUmVnaXN0cnk+IHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUZlYXR1cmVSZWdpc3RyeShzb3VyY2UuZmVhdHVyZUZsYWcpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZlYXR1cmVGbGFnRnJvbUVudmlyb25tZW50KFxuICBmZWF0dXJlTmFtZTogc3RyaW5nLFxuICBzb3VyY2U6IFBpY2s8RmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlLCBcImZlYXR1cmVGbGFnXCI+ID0gRmVhdHVyZUZsYWdFbnZpcm9ubWVudFxuKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1ZhbHVlIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gYXdhaXQgbG9hZEZlYXR1cmVGbGFnc0Zyb21FbnZpcm9ubWVudChzb3VyY2UpO1xuICByZXR1cm4gcmVnaXN0cnlbbm9ybWFsaXplRmVhdHVyZU5hbWUoZmVhdHVyZU5hbWUpXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc0ZlYXR1cmVGbGFnSW5FbnZpcm9ubWVudChcbiAgZmVhdHVyZU5hbWU6IHN0cmluZyxcbiAgc291cmNlOiBQaWNrPEZlYXR1cmVGbGFnRW52aXJvbm1lbnRTaGFwZSwgXCJmZWF0dXJlRmxhZ1wiPiA9IEZlYXR1cmVGbGFnRW52aXJvbm1lbnRcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gISEoYXdhaXQgcmVzb2x2ZUZlYXR1cmVGbGFnRnJvbUVudmlyb25tZW50KGZlYXR1cmVOYW1lLCBzb3VyY2UpKTtcbn1cblxuZXhwb3J0IHsgRkVBVFVSRV9GTEFHX0VOVl9QUkVGSVgsIEZFQVRVUkVfRkxBR19FTlZfUk9PVCB9O1xuIiwiaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgcGssXG4gIHRhYmxlLFxuICB1cGRhdGVkQXQsXG4gIHV1aWQsXG4gIHVuaXF1ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbkB0YWJsZShcImZlYXR1cmVfZmxhZ3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRmVhdHVyZUZsYWcgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogUGFydGlhbDxGZWF0dXJlRmxhZz4pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwaygpXG4gIEB1dWlkKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQHVuaXF1ZSgpXG4gIEByZXF1aXJlZCgpXG4gIEBjb2x1bW4oKVxuICBrZXkhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIGVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBjb2x1bW4oKVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgc2NvcGU/OiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQGNvbHVtbigpXG4gIGNvbmZpZz86IEZlYXR1cmVGbGFnQ29uZmlnO1xuXG4gIEBjb2x1bW4oKVxuICBjcmVhdGVkQnk/OiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIHVwZGF0ZWRCeT86IHN0cmluZztcblxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdFR5cGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuQHRhYmxlKFwiZmVhdHVyZV9mbGFnX2FjY2Vzc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBGZWF0dXJlRmxhZ0FjY2VzcyBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBQYXJ0aWFsPEZlYXR1cmVGbGFnQWNjZXNzPikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKClcbiAgQHV1aWQoKVxuICBpZCE6IHN0cmluZztcblxuICBAcmVxdWlyZWQoKVxuICBAY29sdW1uKClcbiAgZmVhdHVyZUtleSE6IHN0cmluZztcblxuICBAcmVxdWlyZWQoKVxuICBAY29sdW1uKClcbiAgc3ViamVjdFR5cGUhOiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3RUeXBlIHwgc3RyaW5nO1xuXG4gIEByZXF1aXJlZCgpXG4gIEBjb2x1bW4oKVxuICBzdWJqZWN0S2V5ITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBlbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBAY29sdW1uKClcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBAY29sdW1uKClcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICB1cGRhdGVkQnk/OiBzdHJpbmc7XG5cbiAgQGNyZWF0ZWRBdCgpXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBGRUFUVVJFX0ZMQUdfRU5WX1JPT1QsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGxvYWRGZWF0dXJlRmxhZ3NGcm9tRW52aXJvbm1lbnQsXG59IGZyb20gXCIuLi9lbnZpcm9ubWVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUsXG4gIEZlYXR1cmVGbGFnUmVhZGVySW5wdXQsXG4gIEZlYXR1cmVGbGFnUmVnaXN0cnksXG4gIEZlYXR1cmVGbGFnVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRmVhdHVyZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZlYXR1cmVGbGFnUmVhZGVyIHtcbiAgYWJzdHJhY3QgcmVhZChcbiAgICBpbnB1dD86IEZlYXR1cmVGbGFnUmVhZGVySW5wdXRcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PjtcblxuICBhc3luYyByZWFkT25lKFxuICAgIGZlYXR1cmVOYW1lOiBzdHJpbmcsXG4gICAgaW5wdXQ/OiBGZWF0dXJlRmxhZ1JlYWRlcklucHV0XG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdWYWx1ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gYXdhaXQgdGhpcy5yZWFkKGlucHV0KTtcbiAgICByZXR1cm4gcmVnaXN0cnlbbm9ybWFsaXplRmVhdHVyZU5hbWUoZmVhdHVyZU5hbWUpXTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lRmxhZ1JlYWRlciBleHRlbmRzIEZlYXR1cmVGbGFnUmVhZGVyIHtcbiAgYXN5bmMgcmVhZChcbiAgICBpbnB1dDogRmVhdHVyZUZsYWdSZWFkZXJJbnB1dCA9IHt9XG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZWdpc3RyeT4ge1xuICAgIGNvbnN0IGVudmlyb25tZW50ID1cbiAgICAgIChpbnB1dC5zb3VyY2UgYXMgRmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlIHwgdW5kZWZpbmVkKSA/P1xuICAgICAgKHtcbiAgICAgICAgW0ZFQVRVUkVfRkxBR19FTlZfUk9PVF06IHt9LFxuICAgICAgfSBhcyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUpO1xuICAgIHJldHVybiBsb2FkRmVhdHVyZUZsYWdzRnJvbUVudmlyb25tZW50KGVudmlyb25tZW50KTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlRmxhZ1JlYWRlckNvbnN0cnVjdG9yID0gbmV3ICgpID0+IEZlYXR1cmVGbGFnUmVhZGVyO1xuZXhwb3J0IHR5cGUgRmVhdHVyZUZsYWdSZWFkZXJMaWtlID1cbiAgfCBGZWF0dXJlRmxhZ1JlYWRlclxuICB8IEZlYXR1cmVGbGFnUmVhZGVyQ29uc3RydWN0b3I7XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwb3NpdG9yeSxcbiAgcmVwb3NpdG9yeSxcbiAgc2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFJlcG8gfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52aXJvbm1lbnRcIjtcbmltcG9ydCB7IEZlYXR1cmVGbGFnQWNjZXNzIH0gZnJvbSBcIi4uL21vZGVscy9GZWF0dXJlRmxhZ0FjY2Vzcy5tb2RlbFwiO1xuaW1wb3J0IHsgRmVhdHVyZUZsYWcgfSBmcm9tIFwiLi4vbW9kZWxzL0ZlYXR1cmVGbGFnLm1vZGVsXCI7XG5pbXBvcnQge1xuICBFbnZpcm9ubWVGbGFnUmVhZGVyLFxuICBGZWF0dXJlRmxhZ1JlYWRlcixcbiAgRmVhdHVyZUZsYWdSZWFkZXJMaWtlLFxufSBmcm9tIFwiLi4vcmVhZGVyc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlRmxhZ0FjY2Vzc0lucHV0LFxuICBGZWF0dXJlRmxhZ0FjY2Vzc1F1ZXJ5LFxuICBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3QsXG4gIEZlYXR1cmVGbGFnQ29uZmlnLFxuICBGZWF0dXJlRmxhZ1JlYWRlckNvbmZpZyxcbiAgRmVhdHVyZUZsYWdSZWFkZXJJbnB1dCxcbiAgRmVhdHVyZUZsYWdSZWdpc3RyeSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBpc0ZlYXR1cmVGbGFnRW5hYmxlZCxcbiAgaXNGZWF0dXJlRmxhZ0VuYWJsZWRCeU5hbWUsXG4gIG5vcm1hbGl6ZUZlYXR1cmVOYW1lLFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5LCBub3JtYWxpemVGZWF0dXJlU3ViamVjdFR5cGUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlRmxhZ1NlcnZpY2VDb25maWcgZXh0ZW5kcyBGZWF0dXJlRmxhZ1JlYWRlckNvbmZpZyB7XG4gIHJlYWRlcj86IEZlYXR1cmVGbGFnUmVhZGVyTGlrZTtcbiAgcmVwb3NpdG9yeT86IFJlcG9zaXRvcnk8RmVhdHVyZUZsYWcsIGFueT47XG59XG5cbkBzZXJ2aWNlKEZlYXR1cmVGbGFnKVxuZXhwb3J0IGNsYXNzIEZlYXR1cmVGbGFnU2VydmljZSBleHRlbmRzIE1vZGVsU2VydmljZTxGZWF0dXJlRmxhZz4ge1xuICBwcml2YXRlIHJlYWRlcjogRmVhdHVyZUZsYWdSZWFkZXIgPSBuZXcgRW52aXJvbm1lRmxhZ1JlYWRlcigpO1xuICBwcml2YXRlIGNhY2hlZFJlZ2lzdHJ5OiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5ID0ge307XG4gIEByZXBvc2l0b3J5KEZlYXR1cmVGbGFnQWNjZXNzKVxuICBwcm90ZWN0ZWQgYWNjZXNzUmVwb3NpdG9yeSE6IFJlcG88RmVhdHVyZUZsYWdBY2Nlc3M+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEZlYXR1cmVGbGFnKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogRmVhdHVyZUZsYWdTZXJ2aWNlQ29uZmlnOyBjbGllbnQ6IEZlYXR1cmVGbGFnUmVhZGVyIH0+IHtcbiAgICBjb25zdCBjb25maWcgPSAoYXJnc1swXSBhcyBGZWF0dXJlRmxhZ1NlcnZpY2VDb25maWcgfCB1bmRlZmluZWQpID8/IHt9O1xuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5IGFzIGFueTtcbiAgICB9XG4gICAgdGhpcy5yZWFkZXIgPSAhY29uZmlnLnJlYWRlclxuICAgICAgPyBuZXcgRW52aXJvbm1lRmxhZ1JlYWRlcigpXG4gICAgICA6IHR5cGVvZiBjb25maWcucmVhZGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBuZXcgY29uZmlnLnJlYWRlcigpXG4gICAgICAgIDogY29uZmlnLnJlYWRlcjtcbiAgICBjb25zdCByZWFkZXJDb25maWcgPSB7XG4gICAgICAuLi4oY29uZmlnLnJlYWRlckNvbmZpZyA/PyB7fSksXG4gICAgICBzb3VyY2U6IGNvbmZpZy5yZWFkZXJDb25maWc/LnNvdXJjZSA/PyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50LFxuICAgIH07XG4gICAgdGhpcy5jYWNoZWRSZWdpc3RyeSA9IGF3YWl0IHRoaXMucmVmcmVzaENhY2hlZFJlZ2lzdHJ5KHJlYWRlckNvbmZpZywgLi4uYXJncyk7XG4gICAgY29uc3QgZWZmZWN0aXZlQ29uZmlnOiBGZWF0dXJlRmxhZ1NlcnZpY2VDb25maWcgPSB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICByZWFkZXI6IHRoaXMucmVhZGVyLFxuICAgICAgcmVhZGVyQ29uZmlnLFxuICAgIH07XG4gICAgcmV0dXJuIHsgY29uZmlnOiBlZmZlY3RpdmVDb25maWcsIGNsaWVudDogdGhpcy5yZWFkZXIgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVSZWdpc3RyeShyZWdpc3RyeTogRmVhdHVyZUZsYWdSZWdpc3RyeSk6IEZlYXR1cmVGbGFnUmVnaXN0cnkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZWdpc3RyeSkucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjW2tleV0gPVxuICAgICAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyAoeyAuLi4odmFsdWUgYXMgRmVhdHVyZUZsYWdDb25maWcpIH0gYXMgRmVhdHVyZUZsYWdDb25maWcpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgRmVhdHVyZUZsYWdSZWdpc3RyeSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hDYWNoZWRSZWdpc3RyeShcbiAgICBvcHRpb25zOiBGZWF0dXJlRmxhZ1JlYWRlcklucHV0ID0ge30sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PiB7XG4gICAgY29uc3QgZW52UmVnaXN0cnkgPSBhd2FpdCB0aGlzLnJlYWRlci5yZWFkKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzb3VyY2U6IG9wdGlvbnMuc291cmNlID8/IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQsXG4gICAgfSk7XG4gICAgbGV0IHBlcnNpc3RlZDogRmVhdHVyZUZsYWdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBwZXJzaXN0ZWQgPSBhd2FpdCB0aGlzLnJlcG8uc2VsZWN0KCkuZXhlY3V0ZSguLi5hcmdzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHBlcnNpc3RlZCA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5jbG9uZVJlZ2lzdHJ5KGVudlJlZ2lzdHJ5KTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgcGVyc2lzdGVkKSB7XG4gICAgICByZWdpc3RyeVtmbGFnLmtleV0gPSBmbGFnLmVuYWJsZWQgPyAoZmxhZy5jb25maWcgPz8gdHJ1ZSkgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDYWNoZWRGbGFnKGZsYWc6IEZlYXR1cmVGbGFnKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZWRSZWdpc3RyeVtmbGFnLmtleV0gPSBmbGFnLmVuYWJsZWRcbiAgICAgID8gKGZsYWcuY29uZmlnID8/IHRydWUpXG4gICAgICA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY2Nlc3NSZXBvc2l0b3J5KCk6IFJlcG88RmVhdHVyZUZsYWdBY2Nlc3M+IHtcbiAgICByZXR1cm4gdGhpcy5hY2Nlc3NSZXBvc2l0b3J5ID8/IFJlcG9zaXRvcnkuZm9yTW9kZWwoRmVhdHVyZUZsYWdBY2Nlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRJbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMucmVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVGZWF0dXJlQWNjZXNzSW5wdXQoXG4gICAgaW5wdXQ6IEZlYXR1cmVGbGFnQWNjZXNzSW5wdXRcbiAgKTogRmVhdHVyZUZsYWdBY2Nlc3NJbnB1dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmlucHV0LFxuICAgICAgZmVhdHVyZUtleTogbm9ybWFsaXplRmVhdHVyZU5hbWUoaW5wdXQuZmVhdHVyZUtleSksXG4gICAgICBzdWJqZWN0VHlwZTogbm9ybWFsaXplRmVhdHVyZVN1YmplY3RUeXBlKGlucHV0LnN1YmplY3RUeXBlKSxcbiAgICAgIHN1YmplY3RLZXk6IG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5KGlucHV0LnN1YmplY3RLZXkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQWNjZXNzQ29uZGl0aW9uKFxuICAgIHF1ZXJ5OiBGZWF0dXJlRmxhZ0FjY2Vzc1F1ZXJ5XG4gICk6IENvbmRpdGlvbjxGZWF0dXJlRmxhZ0FjY2Vzcz4ge1xuICAgIGxldCBjb25kaXRpb24gPSBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZ0FjY2Vzcz4oXCJzdWJqZWN0VHlwZVwiKS5lcShcbiAgICAgIG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0VHlwZShxdWVyeS5zdWJqZWN0VHlwZSlcbiAgICApO1xuICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hbmQoXG4gICAgICBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZ0FjY2Vzcz4oXCJzdWJqZWN0S2V5XCIpLmVxKFxuICAgICAgICBub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleShxdWVyeS5zdWJqZWN0S2V5KVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKHR5cGVvZiBxdWVyeS5lbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYW5kKFxuICAgICAgICBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZ0FjY2Vzcz4oXCJlbmFibGVkXCIpLmVxKHF1ZXJ5LmVuYWJsZWQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocXVlcnkuZmVhdHVyZUtleXMgJiYgcXVlcnkuZmVhdHVyZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFuZChcbiAgICAgICAgQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWdBY2Nlc3M+KFwiZmVhdHVyZUtleVwiKS5pbihcbiAgICAgICAgICBxdWVyeS5mZWF0dXJlS2V5cy5tYXAobm9ybWFsaXplRmVhdHVyZU5hbWUpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjb25kaXRpb247XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGUoXG4gICAgbW9kZWw6IEZlYXR1cmVGbGFnLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWc+IHtcbiAgICBtb2RlbC5rZXkgPSBub3JtYWxpemVGZWF0dXJlTmFtZShtb2RlbC5rZXkpO1xuICAgIG1vZGVsLmVuYWJsZWQgPz89IHRydWU7XG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHN1cGVyLmNyZWF0ZShtb2RlbCwgLi4uYXJncyk7XG4gICAgdGhpcy5zZXRDYWNoZWRGbGFnKGNyZWF0ZWQpO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIG1vZGVsOiBGZWF0dXJlRmxhZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnPiB7XG4gICAgbW9kZWwua2V5ID0gbm9ybWFsaXplRmVhdHVyZU5hbWUobW9kZWwua2V5KTtcbiAgICBtb2RlbC5lbmFibGVkID8/PSB0cnVlO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBzdXBlci51cGRhdGUobW9kZWwsIC4uLmFyZ3MpO1xuICAgIHRoaXMuc2V0Q2FjaGVkRmxhZyh1cGRhdGVkKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIEZlYXR1cmVGbGFnLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZz4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9XG4gICAgICBrZXkgPT09IFwia2V5XCIgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbm9ybWFsaXplRmVhdHVyZU5hbWUodmFsdWUpXG4gICAgICAgIDogdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMucmVwby5maW5kT25lQnkoa2V5LCBub3JtYWxpemVkVmFsdWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBhbnlbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZEFsbChrZXlzLCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgcmVzdWx0KSB0aGlzLnNldENhY2hlZEZsYWcoZmxhZyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RFbmFibGVkKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwb1xuICAgICAgLnNlbGVjdCgpXG4gICAgICAud2hlcmUoQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWc+KFwiZW5hYmxlZFwiKS5lcSh0cnVlKSlcbiAgICAgIC5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZ3JhbnRGZWF0dXJlQWNjZXNzKFxuICAgIGlucHV0OiBGZWF0dXJlRmxhZ0FjY2Vzc0lucHV0LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdBY2Nlc3M+IHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVGZWF0dXJlQWNjZXNzSW5wdXQoaW5wdXQpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kRmVhdHVyZUFjY2Vzcyhub3JtYWxpemVkLCAuLi5hcmdzKS5jYXRjaChcbiAgICAgICgpID0+IHVuZGVmaW5lZFxuICAgICk7XG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpLmNyZWF0ZShcbiAgICAgICAgbmV3IEZlYXR1cmVGbGFnQWNjZXNzKG5vcm1hbGl6ZWQpLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBY2Nlc3NSZXBvc2l0b3J5KCkudXBkYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihleGlzdGluZywgbm9ybWFsaXplZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJldm9rZUZlYXR1cmVBY2Nlc3MoXG4gICAgaW5wdXQ6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdCAmIHsgZmVhdHVyZUtleTogc3RyaW5nIH0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ0FjY2VzcyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kRmVhdHVyZUFjY2VzcyhpbnB1dCwgLi4uYXJncykuY2F0Y2goXG4gICAgICAoKSA9PiB1bmRlZmluZWRcbiAgICApO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpLmRlbGV0ZShleGlzdGluZy5pZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kRmVhdHVyZUFjY2VzcyhcbiAgICBxdWVyeTogRmVhdHVyZUZsYWdBY2Nlc3NRdWVyeSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnQWNjZXNzPiB7XG4gICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5idWlsZEFjY2Vzc0NvbmRpdGlvbihxdWVyeSk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpXG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZShjb25kaXRpb24pXG4gICAgICAuZXhlY3V0ZSguLi5hcmdzKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHJlc3VsdHNbMF07XG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBGZWF0dXJlIGFjY2VzcyBmb3IgJHtub3JtYWxpemVGZWF0dXJlU3ViamVjdFR5cGUocXVlcnkuc3ViamVjdFR5cGUpfToke25vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5KHF1ZXJ5LnN1YmplY3RLZXkpfSBub3QgZm91bmRgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBhc3luYyBsaXN0RmVhdHVyZUFjY2VzcyhcbiAgICBxdWVyeTogRmVhdHVyZUZsYWdBY2Nlc3NRdWVyeSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnQWNjZXNzW10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY2Nlc3NSZXBvc2l0b3J5KClcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLndoZXJlKHRoaXMuYnVpbGRBY2Nlc3NDb25kaXRpb24ocXVlcnkpKVxuICAgICAgLmV4ZWN1dGUoLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlRmVhdHVyZUZsYWdzRm9yU3ViamVjdChcbiAgICBzdWJqZWN0OiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3QsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PiB7XG4gICAgdGhpcy5hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMubGlzdEZlYXR1cmVBY2Nlc3MoXG4gICAgICB7XG4gICAgICAgIC4uLnN1YmplY3QsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3QgZmVhdHVyZUtleXMgPSBbLi4ubmV3IFNldChhY2Nlc3MubWFwKChpdGVtKSA9PiBpdGVtLmZlYXR1cmVLZXkpKV07XG4gICAgaWYgKGZlYXR1cmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuXG4gICAgY29uc3QgY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWc+KFwiZW5hYmxlZFwiKS5lcSh0cnVlKS5hbmQoXG4gICAgICBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZz4oXCJrZXlcIikuaW4oXG4gICAgICAgIGZlYXR1cmVLZXlzLm1hcChub3JtYWxpemVGZWF0dXJlTmFtZSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgZW5hYmxlZEZsYWdzID0gYXdhaXQgdGhpcy5yZXBvLnNlbGVjdCgpLndoZXJlKGNvbmRpdGlvbikuZXhlY3V0ZSguLi5hcmdzKTtcbiAgICByZXR1cm4gZW5hYmxlZEZsYWdzLnJlZHVjZSgocmVnaXN0cnksIGZsYWcpID0+IHtcbiAgICAgIHJlZ2lzdHJ5W2ZsYWcua2V5XSA9IGZsYWcuY29uZmlnID8/IHRydWU7XG4gICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgfSwge30gYXMgRmVhdHVyZUZsYWdSZWdpc3RyeSk7XG4gIH1cblxuICBhc3luYyBpc0VuYWJsZWRGb3JTdWJqZWN0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHN1YmplY3Q6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMucmVzb2x2ZUZlYXR1cmVGbGFnc0ZvclN1YmplY3Qoc3ViamVjdCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIGlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lKHJlZ2lzdHJ5LCBrZXkpO1xuICB9XG5cbiAgaXNFbmFibGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVGZWF0dXJlTmFtZShrZXkpO1xuICAgIHJldHVybiBpc0ZlYXR1cmVGbGFnRW5hYmxlZEJ5TmFtZSh0aGlzLmNhY2hlZFJlZ2lzdHJ5LCBub3JtYWxpemVkS2V5KTtcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmVGZWF0dXJlRmxhZ3MoKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PiB7XG4gICAgdGhpcy5hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNsb25lUmVnaXN0cnkodGhpcy5jYWNoZWRSZWdpc3RyeSk7XG4gIH1cblxuICBhc3luYyBzeW5jRnJvbUVudmlyb25tZW50KFxuICAgIG9wdGlvbnM6IEZlYXR1cmVGbGFnUmVhZGVySW5wdXQgPSB7fSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICB0aGlzLmFzc2VydEluaXRpYWxpemVkKCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSBhd2FpdCB0aGlzLnJlYWRlci5yZWFkKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzb3VyY2U6IG9wdGlvbnMuc291cmNlID8/IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQsXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0czogRmVhdHVyZUZsYWdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlZ2lzdHJ5KSkge1xuICAgICAgY29uc3QgY29uZmlnID1cbiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gKHZhbHVlIGFzIEZlYXR1cmVGbGFnQ29uZmlnKVxuICAgICAgICAgIDogeyBlbmFibGVkOiBCb29sZWFuKHZhbHVlKSB9O1xuICAgICAgY29uc3QgeyBlbmFibGVkOiBfaWdub3JlZEVuYWJsZWQsIC4uLnJlc3RDb25maWcgfSA9IGNvbmZpZztcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVGZWF0dXJlTmFtZShrZXkpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmZpbmRPbmVCeShcbiAgICAgICAgXCJrZXlcIixcbiAgICAgICAgbm9ybWFsaXplZEtleSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgbW9kZWwgPSBleGlzdGluZ1xuICAgICAgICA/IE9iamVjdC5hc3NpZ24oZXhpc3RpbmcsIHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGlzRmVhdHVyZUZsYWdFbmFibGVkKHZhbHVlKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXN0Q29uZmlnLmRlc2NyaXB0aW9uID8/IGV4aXN0aW5nLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc2NvcGU6IHJlc3RDb25maWcuc2NvcGUgPz8gZXhpc3Rpbmcuc2NvcGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmVzdENvbmZpZy5tZXRhZGF0YSA/PyBleGlzdGluZy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAuLi5yZXN0Q29uZmlnLFxuICAgICAgICAgICAgICBlbmFibGVkOiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIDogbmV3IEZlYXR1cmVGbGFnKHtcbiAgICAgICAgICAgIGtleTogbm9ybWFsaXplZEtleSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IGlzRmVhdHVyZUZsYWdFbmFibGVkKHZhbHVlKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXN0Q29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc2NvcGU6IHJlc3RDb25maWcuc2NvcGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmVzdENvbmZpZy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAuLi5yZXN0Q29uZmlnLFxuICAgICAgICAgICAgICBlbmFibGVkOiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgcmVzdWx0cy5wdXNoKGV4aXN0aW5nID8gYXdhaXQgdGhpcy51cGRhdGUobW9kZWwsIC4uLmFyZ3MpIDogYXdhaXQgdGhpcy5jcmVhdGUobW9kZWwsIC4uLmFyZ3MpKTtcbiAgICB9XG4gICAgdGhpcy5jYWNoZWRSZWdpc3RyeSA9IGF3YWl0IHRoaXMucmVmcmVzaENhY2hlZFJlZ2lzdHJ5KFxuICAgICAge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBzb3VyY2U6IG9wdGlvbnMuc291cmNlID8/IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIE1ldGFkYXRhLFxuICBtZXRhZGF0YSxcbiAgbWV0aG9kTWV0YWRhdGEsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBGRUFUVVJFX0ZMQUdfQVVUSF9LRVksXG4gIEZFQVRVUkVfRkxBR19CTE9DS19LRVksXG4gIEZFQVRVUkVfRkxBR19ISURFX0tFWSxcbiAgRkVBVFVSRV9GTEFHX01PREVMX0tFWSxcbiAgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVksXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZ1J1bGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplRmVhdHVyZVJ1bGUsXG4gIGlzRmVhdHVyZVJ1bGVCbG9ja2VkLFxuICBpc0ZlYXR1cmVSdWxlU2F0aXNmaWVkLFxuICByZWFkTWV0YWRhdGEsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbnR5cGUgRmVhdHVyZURlY29yYXRvcktleSA9XG4gIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19NT0RFTF9LRVlcbiAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0FVVEhfS0VZXG4gIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19CTE9DS19LRVlcbiAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVlcbiAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0hJREVfS0VZO1xuXG5mdW5jdGlvbiBmZWF0dXJlTWV0YWRhdGFLZXkoXG4gIGtleTogRmVhdHVyZURlY29yYXRvcktleSxcbiAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2xcbik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcHJvcGVydHlLZXkgPT09IFwidW5kZWZpbmVkXCJcbiAgICA/IGtleVxuICAgIDogTWV0YWRhdGEua2V5KGtleSwgcHJvcGVydHlLZXkudG9TdHJpbmcoKSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RmVhdHVyZURlY29yYXRvcihcbiAga2V5OiBGZWF0dXJlRGVjb3JhdG9yS2V5LFxuICBmZWF0dXJlczogc3RyaW5nW10sXG4gIG1hdGNoOiBGZWF0dXJlRmxhZ1J1bGVbXCJtYXRjaFwiXSA9IFwiYW55XCJcbikge1xuICBjb25zdCBydWxlID0gbm9ybWFsaXplRmVhdHVyZVJ1bGUoZmVhdHVyZXMsIG1hdGNoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZlYXR1cmVEZWNvcmF0b3IoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBpZiAodHlwZW9mIHByb3BlcnR5S2V5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbWV0YWRhdGEoa2V5LCBydWxlKSh0YXJnZXQpO1xuICAgIH1cbiAgICBjb25zdCBzY29wZWRLZXkgPSBmZWF0dXJlTWV0YWRhdGFLZXkoa2V5LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIHJldHVybiBtZXRob2RNZXRhZGF0YShzY29wZWRLZXksIHJ1bGUpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKHNjb3BlZEtleSwgcnVsZSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlRmxhZ3MoLi4uZmVhdHVyZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseUZlYXR1cmVEZWNvcmF0b3IoRkVBVFVSRV9GTEFHX01PREVMX0tFWSwgZmVhdHVyZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUF1dGgoLi4uZmVhdHVyZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseUZlYXR1cmVEZWNvcmF0b3IoRkVBVFVSRV9GTEFHX0FVVEhfS0VZLCBmZWF0dXJlcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibG9ja0ZlYXR1cmVPcGVyYXRpb25zKC4uLmZlYXR1cmVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlGZWF0dXJlRGVjb3JhdG9yKEZFQVRVUkVfRkxBR19CTE9DS19LRVksIGZlYXR1cmVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcklmRmVhdHVyZSguLi5mZWF0dXJlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RmVhdHVyZURlY29yYXRvcihGRUFUVVJFX0ZMQUdfUkVOREVSX0tFWSwgZmVhdHVyZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZU9uRmVhdHVyZSguLi5mZWF0dXJlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RmVhdHVyZURlY29yYXRvcihGRUFUVVJFX0ZMQUdfSElERV9LRVksIGZlYXR1cmVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVHYXRlTWV0YWRhdGEoXG4gIHRhcmdldDogb2JqZWN0LFxuICBrZXk6XG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX01PREVMX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19BVVRIX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19CTE9DS19LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfUkVOREVSX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19ISURFX0tFWSxcbiAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2xcbik6IEZlYXR1cmVGbGFnUnVsZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZWFkTWV0YWRhdGE8RmVhdHVyZUZsYWdSdWxlPihcbiAgICB0YXJnZXQsXG4gICAgZmVhdHVyZU1ldGFkYXRhS2V5KGtleSwgcHJvcGVydHlLZXkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRFeHBvc2VGb3JGZWF0dXJlcyhcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIGVuYWJsZWRGZWF0dXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGtleTpcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfTU9ERUxfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0FVVEhfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0JMT0NLX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19SRU5ERVJfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0hJREVfS0VZLFxuICBwcm9wZXJ0eUtleT86IHN0cmluZyB8IHN5bWJvbFxuKSB7XG4gIGNvbnN0IHJ1bGUgPSBnZXRGZWF0dXJlR2F0ZU1ldGFkYXRhKHRhcmdldCwga2V5LCBwcm9wZXJ0eUtleSk7XG4gIHJldHVybiBpc0ZlYXR1cmVSdWxlU2F0aXNmaWVkKHJ1bGUsIGVuYWJsZWRGZWF0dXJlcyBhcyBhbnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkSGlkZUZvckZlYXR1cmVzKFxuICB0YXJnZXQ6IG9iamVjdCxcbiAgZW5hYmxlZEZlYXR1cmVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OlxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19NT0RFTF9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfQVVUSF9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfSElERV9LRVksXG4gIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sXG4pIHtcbiAgY29uc3QgcnVsZSA9IGdldEZlYXR1cmVHYXRlTWV0YWRhdGEodGFyZ2V0LCBrZXksIHByb3BlcnR5S2V5KTtcbiAgcmV0dXJuIGlzRmVhdHVyZVJ1bGVCbG9ja2VkKHJ1bGUsIGVuYWJsZWRGZWF0dXJlcyBhcyBhbnkpO1xufVxuXG5leHBvcnQge1xuICBGRUFUVVJFX0ZMQUdfQVVUSF9LRVksXG4gIEZFQVRVUkVfRkxBR19CTE9DS19LRVksXG4gIEZFQVRVUkVfRkxBR19ISURFX0tFWSxcbiAgRkVBVFVSRV9GTEFHX01PREVMX0tFWSxcbiAgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVksXG59O1xuIiwiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9uc1xuICogQHN1bW1hcnkgUGFja2FnZSBlbnRyeSBwb2ludCBmb3Igc2hhcmVkIGludGVncmF0aW9uIGhlbHBlcnMuXG4gKiBAZGVzY3JpcHRpb24gRXhwb3NlcyB0aGUgcGFja2FnZSB1dGlsaXRpZXMgYW5kIGJ1aWxkLXRpbWUgdmVyc2lvbiBtZXRhZGF0YSBmb3IgYEBkZWNhZi10cy9pbnRlZ3JhdGlvbnNgLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFtZXNwYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmVhdHVyZS1mbGFnc1wiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTjogc3RyaW5nID0gXCIjI1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRTogc3RyaW5nID0gXCIjI1BBQ0tBR0UjI1wiO1xuIl0sIm5hbWVzIjpbImFzeW5jIiwiZXhlY1dpdGhMb2dnaW5nIiwiY29tbWFuZCIsIm9wdGlvbnMiLCJsb2ciLCJsZXZlbCIsIkxvZ0xldmVsIiwiaW5mbyIsImRlYnVnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjaGlsZCIsImV4ZWMiLCJzdGRvdXQiLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJwdXNoIiwidHJpbSIsImNvZGUiLCJzaWxseSIsImpvaW4iLCJjcml0aWNhbCIsIkludGVybmFsRXJyb3IiLCJlcnIiLCJJc29sYXRpb25UaWVyIiwiTWVtYmVyc2hpcFN0YXR1cyIsIlByaW5jaXBhbEtpbmQiLCJTY29wZUtpbmQiLCJQZXJtaXNzaW9uQ2F0ZWdvcnkiLCJSZXNvdXJjZVZpc2liaWxpdHkiLCJTdG9yYWdlS2luZCIsIlN0b3JhZ2VCaW5kaW5nS2luZCIsIklzb2xhdGlvblRpZXJPcHRpb25zIiwiT2JqZWN0IiwidmFsdWVzIiwiTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMiLCJQcmluY2lwYWxLaW5kT3B0aW9ucyIsIlNjb3BlS2luZE9wdGlvbnMiLCJQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zIiwiUmVzb3VyY2VWaXNpYmlsaXR5T3B0aW9ucyIsIlN0b3JhZ2VLaW5kT3B0aW9ucyIsIlN0b3JhZ2VCaW5kaW5nS2luZE9wdGlvbnMiLCJSRUxfUkVTVFJJQ1QiLCJ1cGRhdGUiLCJDYXNjYWRlIiwiTk9ORSIsImRlbGV0ZSIsIm51bGxhYmxlIiwiUkVMX05VTExJRlkiLCJSRUxfQ0FTQ0FERV9ERVBFTkRFTlQiLCJDQVNDQURFIiwiUkVMX0NBU0NBREVfSU5TRVJUX1VQREFURSIsImJ1aWxkQXJhbmdvQ29udGV4dCIsInRlbmFudElkIiwicHJpbmNpcGFsSWQiLCJwZXJtaXNzaW9uS2V5IiwiYWxsb3dlZE9yZ1VuaXRJZHMiLCJhbGxvd2VkUmVzb3VyY2VJZHMiLCJidWlsZFFkcmFudEZpbHRlciIsIm11c3QiLCJrZXkiLCJtYXRjaCIsInZhbHVlIiwic2hvdWxkIiwiYW55Iiwic2NvcGVLZXkiLCJzY29wZUtpbmQiLCJzY29wZUlkIiwibm93SXNvIiwiRGF0ZSIsImFzQXJyYXkiLCJzYW1lVGVuYW50Iiwicm93VGVuYW50IiwicmVsYXRpb25JZCIsInJlbGF0aW9uTWF0Y2giLCJ0YXJnZXQiLCJsb3dlclNsdWciLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJpc1RpbWVWYWxpZCIsImF0Iiwic3RhcnRzQXQiLCJleHBpcmVzQXQiLCJpbnN0YW50IiwiYnVpbGRBY2Nlc3NDb250ZXh0IiwicGVybWlzc2lvbnNCeVNjb3BlIiwiYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb24iLCJwZXJtaXNzaW9uIiwicGVybWlzc2lvbnMiLCJPcmdVbml0IiwicmVzb3VyY2VHcmFudHMiLCJncmFudHMiLCJtYXAiLCJncmFudCIsInJlc291cmNlSWQiLCJCYXNlTW9kZWxTZXJ2aWNlIiwiTW9kZWxTZXJ2aWNlIiwiY29uc3RydWN0b3IiLCJjbGF6eiIsInN1cGVyIiwibmV3TW9kZWwiLCJhc3NpZ24iLCJjcmVhdGUiLCJhcmdzIiwidGhpcyIsInJlcG8iLCJjcmVhdGVPbmUiLCJnZXRCeUlkIiwiaWQiLCJyZWFkIiwidXBkYXRlT25lIiwicGF0Y2giLCJleGlzdGluZyIsImRlbGV0ZUJ5SWQiLCJmaW5kT25lQnkiLCJmaW5kTWFueUJ5Iiwic2VsZWN0Iiwid2hlcmUiLCJleGVjdXRlIiwibGlzdEFsbCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJBdXRob3JpemF0aW9uTW9kZWwiLCJNb2RlbCIsIlRlbmFudE1lbWJlcnNoaXAiLCJfX2RlY29yYXRlIiwicGsiLCJ0eXBlIiwiU3RyaW5nIiwidXVpZCIsInByb3RvdHlwZSIsIm1hbnlUb09uZSIsIlRlbmFudCIsInVuZGVmaW5lZCIsInJlcXVpcmVkIiwiVXNlciIsInR5cGVPZiIsIm9wdGlvbiIsImNvbHVtbiIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsInRhYmxlIiwibW9kZWwiLCJ1bmlxdWUiLCJvbmVUb01hbnkiLCJPcmdVbml0TWVtYmVyc2hpcCIsIk9yZ1VuaXRDbG9zdXJlIiwiTnVtYmVyIiwiUGVybWlzc2lvbiIsIlJvbGVQZXJtaXNzaW9uIiwiUm9sZSIsIlJvbGVBc3NpZ25tZW50IiwiUHJpbmNpcGFsIiwiQm9vbGVhbiIsIlJlc291cmNlR3JhbnQiLCJQcm90ZWN0ZWRSZXNvdXJjZSIsIkluaGVyaXRhbmNlQmxvY2siLCJTdG9yYWdlQmluZGluZyIsIlRlbmFudFByb2ZpbGUiLCJPcmdVbml0UHJvZmlsZSIsIkdyb3VwTWVtYmVyc2hpcCIsIkdyb3VwIiwiRWZmZWN0aXZlUGVybWlzc2lvbiIsIlRlbmFudFByb2ZpbGVTZXJ2aWNlIiwiY3JlYXRlUHJvZmlsZSIsInByb2ZpbGVLZXkiLCJtZXRhZGF0YSIsInRlbmFudCIsImxpc3RGb3JUZW5hbnQiLCJmaWx0ZXIiLCJwcm9maWxlIiwiZGVsZXRlRm9yVGVuYW50Iiwicm93IiwiT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIiwib3JnVW5pdElkIiwib3JnVW5pdCIsImxpc3RGb3JPcmdVbml0IiwiT3JnVW5pdENsb3N1cmVTZXJ2aWNlIiwibGlzdEFuY2VzdG9ycyIsImRlc2NlbmRhbnQiLCJzb3J0IiwibGVmdCIsInJpZ2h0IiwiZGVwdGgiLCJsaXN0RGVzY2VuZGFudHMiLCJhbmNlc3RvciIsImlzQW5jZXN0b3JPZiIsImFuY2VzdG9yT3JnVW5pdElkIiwiZGVzY2VuZGFudE9yZ1VuaXRJZCIsInNvbWUiLCJjcmVhdGVTZWxmTGluayIsImluc2VydEFuY2VzdG9yTGlua3NGb3JOZXdDaGlsZCIsInBhcmVudE9yZ1VuaXRJZCIsImNoaWxkT3JnVW5pdElkIiwiYW5jZXN0b3JMaW5rcyIsImxpbmsiLCJkZWxldGVMaW5rc0ZvclN1YnRyZWUiLCJzdWJ0cmVlIiwiZGVzY2VuZGFudElkcyIsIlNldCIsImFuY2VzdG9ySWRzIiwicm93cyIsImhhcyIsIkluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIiwiYmxvY2tDYXRlZ29yeSIsInBlcm1pc3Npb25DYXRlZ29yeSIsImJsb2NrZWRGcm9tQW5jZXN0b3JJZCIsInJlYXNvbiIsImJsb2NrZWRGcm9tQW5jZXN0b3IiLCJ1bmJsb2NrQ2F0ZWdvcnkiLCJibG9ja0lkIiwiYmxvY2siLCJjYXRlZ29yeUJsb2NrZWRGb3JBbmNlc3RvciIsImNhdGVnb3J5IiwiVGVuYW50U2VydmljZSIsImNyZWF0ZVRlbmFudCIsImlucHV0Iiwic2x1ZyIsIm5hbWUiLCJpc29sYXRpb25UaWVyIiwiUG9vbGVkIiwiZ2V0QnlTbHVnIiwicmVuYW1lVGVuYW50IiwiY2hhbmdlU2x1ZyIsInNldElzb2xhdGlvblRpZXIiLCJkZWxldGVUZW5hbnRDb250cm9sbGVkIiwiZGVsZXRlUm93c0J5SWQiLCJzZXJ2aWNlIiwiT3JnVW5pdFNlcnZpY2UiLCJvcmdVbml0UGF0aCIsInBhcmVudFBhdGgiLCJzZWdtZW50IiwiY3JlYXRlUHJvZmlsZUlmTmVlZGVkIiwicHJvZmlsZU1ldGFkYXRhIiwiY3JlYXRlUm9vdCIsInBhdGgiLCJjcmVhdGVDaGlsZCIsInBhcmVudCIsImNsb3N1cmVTZXJ2aWNlIiwibGlzdENoaWxkcmVuIiwibGlzdFRlbmFudE9yZ1VuaXRzIiwibGlzdERlc2NlbmRhbnRPcmdVbml0cyIsImluY2x1ZGVTZWxmIiwiZGVzY2VuZGFudHMiLCJpZHMiLCJhZGQiLCJsaXN0QW5jZXN0b3JPcmdVbml0cyIsImFuY2VzdG9ycyIsInJlbmFtZU9yZ1VuaXQiLCJpbmNsdWRlcyIsIm1vdmVPcmdVbml0IiwibmV3UGFyZW50T3JnVW5pdElkIiwibmV3UGFyZW50IiwidXBkYXRlZCIsInJlYnVpbGRUZW5hbnRDbG9zdXJlIiwiZXhpc3RpbmdMaW5rcyIsIm9yZ1VuaXRzIiwibGVmdERlcHRoIiwic3BsaXQiLCJsZW5ndGgiLCJyaWdodERlcHRoIiwiZGVsZXRlT3JnVW5pdFRyZWUiLCJ0cmFuc2FjdGlvbmFsIiwiVXNlclNlcnZpY2UiLCJjcmVhdGVVc2VyIiwiZW1haWwiLCJwaG9uZSIsImRpc3BsYXlOYW1lIiwiZ2V0QnlFbWFpbCIsImZpbmQiLCJ1c2VyIiwidXBkYXRlRGlzcGxheU5hbWUiLCJ1c2VySWQiLCJ1cGRhdGVFbWFpbCIsInVwZGF0ZVBob25lIiwiUHJpbmNpcGFsU2VydmljZSIsImNyZWF0ZVByaW5jaXBhbCIsImtpbmQiLCJzdWJqZWN0SWQiLCJnZXRGb3JTdWJqZWN0IiwicHJpbmNpcGFsIiwiZ2V0T3JDcmVhdGVGb3JTdWJqZWN0IiwiZ2V0VXNlclByaW5jaXBhbCIsImdldEdyb3VwUHJpbmNpcGFsIiwiZ3JvdXBJZCIsIlRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIiwiYWRkVXNlclRvVGVuYW50Iiwic3RhdHVzIiwiQWN0aXZlIiwic2V0U3RhdHVzIiwibWVtYmVyc2hpcElkIiwibGlzdFVzZXJUZW5hbnRzIiwibWVtYmVyc2hpcCIsImxpc3RUZW5hbnRVc2VycyIsInJlbW92ZVVzZXJGcm9tVGVuYW50IiwiT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlIiwiYWRkVXNlclRvT3JnVW5pdCIsImxpc3RVc2VyT3JnVW5pdHMiLCJsaXN0T3JnVW5pdFVzZXJzIiwicmVtb3ZlVXNlckZyb21PcmdVbml0IiwiR3JvdXBTZXJ2aWNlIiwiY3JlYXRlR3JvdXAiLCJyZW5hbWVHcm91cCIsIm1vdmVHcm91cFRvT3JnVW5pdCIsImxpc3RUZW5hbnRHcm91cHMiLCJncm91cCIsIkdyb3VwTWVtYmVyc2hpcFNlcnZpY2UiLCJhZGRQcmluY2lwYWxUb0dyb3VwIiwibGlzdEdyb3VwTWVtYmVycyIsImxpc3RQcmluY2lwYWxHcm91cHMiLCJyZW1vdmVQcmluY2lwYWxGcm9tR3JvdXAiLCJyZXNvbHZlR3JvdXBQcmluY2lwYWxJZHNGb3JQcmluY2lwYWwiLCJwcmluY2lwYWxTZXJ2aWNlIiwibWVtYmVyc2hpcHMiLCJwcmluY2lwYWxzIiwiYWxsIiwiUGVybWlzc2lvblNlcnZpY2UiLCJjcmVhdGVQZXJtaXNzaW9uIiwiZGVzY3JpcHRpb24iLCJnZXRCeUtleSIsImxpc3RCeUNhdGVnb3J5IiwidXBkYXRlRGVzY3JpcHRpb24iLCJwZXJtaXNzaW9uSWQiLCJSb2xlU2VydmljZSIsImNyZWF0ZVJvbGUiLCJnZXRTeXN0ZW1Sb2xlQnlLZXkiLCJyb2xlIiwiY2FuZGlkYXRlIiwiRXJyb3IiLCJnZXRUZW5hbnRSb2xlQnlLZXkiLCJyZW5hbWVSb2xlIiwicm9sZUlkIiwidXBkYXRlUm9sZU1ldGFkYXRhIiwibGlzdFRlbmFudFJvbGVzIiwiaW5jbHVkZVN5c3RlbSIsIlJvbGVQZXJtaXNzaW9uU2VydmljZSIsImFkZFBlcm1pc3Npb25Ub1JvbGUiLCJhZGRQZXJtaXNzaW9uS2V5VG9Sb2xlIiwicmVtb3ZlUGVybWlzc2lvbkZyb21Sb2xlIiwicm9sZVBlcm1pc3Npb25JZCIsImxpc3RSb2xlUGVybWlzc2lvbnMiLCJyb2xlUGVybWlzc2lvbiIsImxpc3RQZXJtaXNzaW9uUm9sZXMiLCJyZXBsYWNlUm9sZVBlcm1pc3Npb25zIiwicGVybWlzc2lvbklkcyIsImNyZWF0ZVJvbGVXaXRoUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uS2V5cyIsIlJvbGVBc3NpZ25tZW50U2VydmljZSIsImFzc2lnblJvbGUiLCJpbmhlcml0RG93biIsImNvbmRpdGlvbnMiLCJyZXZva2VBc3NpZ25tZW50IiwiYXNzaWdubWVudElkIiwibGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzIiwiYXNzaWdubWVudCIsImxpc3RSb2xlQXNzaWdubWVudHMiLCJsaXN0VGVuYW50QXNzaWdubWVudHMiLCJ1cGRhdGVBc3NpZ25tZW50V2luZG93IiwiRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UiLCJsaXN0Rm9yUHJpbmNpcGFsIiwibGlzdEZvclNjb3BlIiwiaGFzUGVybWlzc2lvbiIsImRlbGV0ZUZvclByaW5jaXBhbCIsInJlYnVpbGRGb3JQcmluY2lwYWwiLCJyb2xlQXNzaWdubWVudFNlcnZpY2UiLCJyb2xlUGVybWlzc2lvblNlcnZpY2UiLCJwZXJtaXNzaW9uU2VydmljZSIsImdyb3VwTWVtYmVyc2hpcFNlcnZpY2UiLCJvcmdVbml0Q2xvc3VyZVNlcnZpY2UiLCJpbmhlcml0YW5jZUJsb2NrU2VydmljZSIsIm1hdGVyaWFsaXplZCIsInNvdXJjZUFzc2lnbm1lbnRzIiwiZ3JvdXBNZW1iZXJzaGlwcyIsImdyb3VwQXNzaWdubWVudHMiLCJncm91cFByaW5jaXBhbCIsImZsYXQiLCJhc3NpZ25tZW50cyIsInJvbGVQZXJtaXNzaW9ucyIsInNjb3BlcyIsIlJlc291cmNlIiwic2NvcGVkIiwic291cmNlS2luZCIsInNvdXJjZUlkIiwiY3JlYXRlZCIsInJlYnVpbGRGb3JUZW5hbnQiLCJQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UiLCJyZWdpc3RlclJlc291cmNlIiwicmVzb3VyY2VUeXBlIiwidmlzaWJpbGl0eSIsIm93bmVyIiwib3duZXJQcmluY2lwYWxJZCIsInNlbnNpdGl2aXR5IiwiZ2V0QnlEb21haW5SZXNvdXJjZSIsInJlc291cmNlIiwibW92ZVJlc291cmNlVG9PcmdVbml0IiwicHJvdGVjdGVkUmVzb3VyY2VJZCIsInNldFZpc2liaWxpdHkiLCJ0cmFuc2Zlck93bmVyc2hpcCIsImxpc3RPcmdVbml0UmVzb3VyY2VzIiwibGlzdFRlbmFudFJlc291cmNlcyIsIlJlc291cmNlR3JhbnRTZXJ2aWNlIiwiZ3JhbnRSZXNvdXJjZSIsImNyZWF0ZWRCeSIsImNyZWF0ZWRCeVByaW5jaXBhbElkIiwicmV2b2tlR3JhbnQiLCJncmFudElkIiwibGlzdFJlc291cmNlR3JhbnRzIiwibGlzdFByaW5jaXBhbEdyYW50cyIsImhhc0dyYW50IiwiZGVsZXRlQWxsRm9yUmVzb3VyY2UiLCJSZXNvdXJjZUxpZmVjeWNsZVNlcnZpY2UiLCJ1bnJlZ2lzdGVyUmVzb3VyY2UiLCJyZXNvbHZlUmVzb3VyY2VTY29wZSIsIlN0b3JhZ2VCaW5kaW5nU2VydmljZSIsImNyZWF0ZUJpbmRpbmciLCJzdG9yYWdlS2luZCIsImJpbmRpbmdLaW5kIiwiYmluZGluZ0tleSIsInJlZ2lvbiIsImNvbmZpZyIsImxpc3RUZW5hbnRCaW5kaW5ncyIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwic2V0QmluZGluZ0NvbmZpZyIsImJpbmRpbmdJZCIsInByb21vdGVUb0RlZGljYXRlZCIsIkRlZGljYXRlZCIsInNldFNoYXJlZCIsIlNoYXJlZCIsIkJvb3RzdHJhcFNlcnZpY2UiLCJ0ZW5hbnRTZXJ2aWNlIiwidGVuYW50UHJvZmlsZVNlcnZpY2UiLCJvcmdVbml0U2VydmljZSIsIm9yZ1VuaXRQcm9maWxlU2VydmljZSIsInVzZXJTZXJ2aWNlIiwibWVtYmVyc2hpcFNlcnZpY2UiLCJyb2xlU2VydmljZSIsImVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIiwiYm9vdHN0cmFwVGVuYW50RnJvbVRlbXBsYXRlIiwidGVtcGxhdGUiLCJjcmVhdGVPcmdUcmVlIiwicGFyZW50SWQiLCJjaGlsZHJlbiIsInJvb3RPcmdVbml0Iiwib3duZXJVc2VyIiwib3duZXJQcmluY2lwYWwiLCJyb2xlcyIsImNyZWF0ZWRSb2xlIiwib3duZXJSb2xlIiwib3duZXJSb2xlS2V5Iiwicm9vdE9yZ1VuaXRJZCIsIm93bmVyVXNlcklkIiwiU3lzdGVtTWFuYWdlbWVudFNlcnZpY2UiLCJvcmdNZW1iZXJzaGlwU2VydmljZSIsIm9uYm9hcmRVc2VyVG9UZW5hbnRBbmRPcmdVbml0Iiwicm9sZUtleSIsImNoYW5nZVVzZXJPcmdSb2xlIiwiY3VycmVudEFzc2lnbm1lbnRzIiwic3VzcGVuZFVzZXJJblRlbmFudCIsInRlbmFudE1lbWJlcnNoaXBJZCIsIlN1c3BlbmRlZCIsInJlYWN0aXZhdGVVc2VySW5UZW5hbnQiLCJBdXRoelNlcnZpY2UiLCJkYXRhU291cmNlcyIsImNhbkFjY2VzcyIsImxpc3RFZmZlY3RpdmVQZXJtaXNzaW9uc0ZvclNjb3BlIiwicmVzb3VyY2VQcm90ZWN0ZWRJZCIsImxvYWRSZXNvdXJjZSIsIlByaXZhdGUiLCJSZXNvdXJjZUFjbCIsIk9yZ1N1YnRyZWUiLCJlZmZlY3RpdmVQZXJtaXNzaW9ucyIsInJlcXVpcmVBY2Nlc3MiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJsaXN0RWZmZWN0aXZlUGVybWlzc2lvbnMiLCJhY2Nlc3MiLCJGRUFUVVJFX0ZMQUdfRU5WX1JPT1QiLCJGRUFUVVJFX0ZMQUdfRU5WX1BSRUZJWCIsIkZFQVRVUkVfRkxBR19NT0RFTF9LRVkiLCJGRUFUVVJFX0ZMQUdfQVVUSF9LRVkiLCJGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZIiwiRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVkiLCJGRUFUVVJFX0ZMQUdfSElERV9LRVkiLCJub3JtYWxpemVGZWF0dXJlTmFtZSIsInRyaW1tZWQiLCJ0ZXN0IiwiY2FtZWxpemVkIiwiaGVhZCIsInRhaWwiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwicGFyc2VSdW50aW1lVmFsdWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJKU09OIiwicGFyc2UiLCJub3JtYWxpemVPYmplY3RLZXkiLCJub3JtYWxpemVkIiwibm9ybWFsaXplRmVhdHVyZUNvbmZpZyIsIkFycmF5IiwiaXNBcnJheSIsInJlc3VsdCIsImVudHJpZXMiLCJmb3JFYWNoIiwicmF3Iiwibm9ybWFsaXplZEtleSIsIm5vcm1hbGl6ZUZlYXR1cmVSZWdpc3RyeSIsInJlZHVjZSIsImFjYyIsIm5vcm1hbGl6ZWRWYWx1ZSIsImlzRmVhdHVyZUZsYWdFbmFibGVkIiwiaXNGZWF0dXJlRmxhZ0VuYWJsZWRCeU5hbWUiLCJyZWdpc3RyeSIsImZlYXR1cmVOYW1lIiwibm9ybWFsaXplRmVhdHVyZVJ1bGUiLCJmZWF0dXJlcyIsImlzRmVhdHVyZVJ1bGVTYXRpc2ZpZWQiLCJydWxlIiwiZW5hYmxlZCIsImZlYXR1cmUiLCJpc0ZlYXR1cmVSdWxlQmxvY2tlZCIsInJlYWRNZXRhZGF0YSIsIk1ldGFkYXRhIiwiZ2V0Iiwibm9ybWFsaXplRmVhdHVyZVN1YmplY3RUeXBlIiwic3ViamVjdFR5cGUiLCJub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleSIsInN1YmplY3RLZXkiLCJGZWF0dXJlRmxhZ0Vudmlyb25tZW50IiwiTG9nZ2VkRW52aXJvbm1lbnQiLCJhY2N1bXVsYXRlIiwibG9hZEZlYXR1cmVGbGFnc0Zyb21FbnZpcm9ubWVudCIsInNvdXJjZSIsImZlYXR1cmVGbGFnIiwicmVzb2x2ZUZlYXR1cmVGbGFnRnJvbUVudmlyb25tZW50IiwiaGFzRmVhdHVyZUZsYWdJbkVudmlyb25tZW50IiwiRmVhdHVyZUZsYWciLCJCYXNlTW9kZWwiLCJGZWF0dXJlRmxhZ0FjY2VzcyIsIkZlYXR1cmVGbGFnUmVhZGVyIiwicmVhZE9uZSIsIkVudmlyb25tZUZsYWdSZWFkZXIiLCJlbnZpcm9ubWVudCIsIkZlYXR1cmVGbGFnU2VydmljZSIsInJlYWRlciIsImNhY2hlZFJlZ2lzdHJ5IiwiaW5pdGlhbGl6ZSIsInJlcG9zaXRvcnkiLCJfcmVwb3NpdG9yeSIsInJlYWRlckNvbmZpZyIsInJlZnJlc2hDYWNoZWRSZWdpc3RyeSIsImVmZmVjdGl2ZUNvbmZpZyIsImNsaWVudCIsImNsb25lUmVnaXN0cnkiLCJlbnZSZWdpc3RyeSIsInBlcnNpc3RlZCIsImZsYWciLCJzZXRDYWNoZWRGbGFnIiwiZ2V0QWNjZXNzUmVwb3NpdG9yeSIsImFjY2Vzc1JlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJhc3NlcnRJbml0aWFsaXplZCIsIm5vcm1hbGl6ZUZlYXR1cmVBY2Nlc3NJbnB1dCIsImZlYXR1cmVLZXkiLCJidWlsZEFjY2Vzc0NvbmRpdGlvbiIsInF1ZXJ5IiwiY29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYXR0ciIsImVxIiwiYW5kIiwiZmVhdHVyZUtleXMiLCJpbiIsInJlYWRBbGwiLCJrZXlzIiwibGlzdEVuYWJsZWQiLCJncmFudEZlYXR1cmVBY2Nlc3MiLCJmaW5kRmVhdHVyZUFjY2VzcyIsImNhdGNoIiwicmV2b2tlRmVhdHVyZUFjY2VzcyIsInJlc3VsdHMiLCJOb3RGb3VuZEVycm9yIiwibGlzdEZlYXR1cmVBY2Nlc3MiLCJyZXNvbHZlRmVhdHVyZUZsYWdzRm9yU3ViamVjdCIsInN1YmplY3QiLCJpdGVtIiwiZW5hYmxlZEZsYWdzIiwiaXNFbmFibGVkRm9yU3ViamVjdCIsImlzRW5hYmxlZCIsInJlc29sdmVGZWF0dXJlRmxhZ3MiLCJzeW5jRnJvbUVudmlyb25tZW50IiwiX2lnbm9yZWRFbmFibGVkIiwicmVzdENvbmZpZyIsInNjb3BlIiwiZmVhdHVyZU1ldGFkYXRhS2V5IiwicHJvcGVydHlLZXkiLCJ0b1N0cmluZyIsImFwcGx5RmVhdHVyZURlY29yYXRvciIsImZlYXR1cmVEZWNvcmF0b3IiLCJkZXNjcmlwdG9yIiwic2NvcGVkS2V5IiwibWV0aG9kTWV0YWRhdGEiLCJwcm9wTWV0YWRhdGEiLCJmZWF0dXJlRmxhZ3MiLCJmZWF0dXJlQXV0aCIsImJsb2NrRmVhdHVyZU9wZXJhdGlvbnMiLCJyZW5kZXJJZkZlYXR1cmUiLCJoaWRlT25GZWF0dXJlIiwiZ2V0RmVhdHVyZUdhdGVNZXRhZGF0YSIsInNob3VsZEV4cG9zZUZvckZlYXR1cmVzIiwiZW5hYmxlZEZlYXR1cmVzIiwic2hvdWxkSGlkZUZvckZlYXR1cmVzIiwiVkVSU0lPTiIsIkNPTU1JVCIsIkZVTExfVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVNPQSxlQUFlQyxnQkFDcEJDLFNBQ0FDLFNBQ0FDLEtBQ0FDLFFBQWtCQyxTQUFTQztJQUUzQkgsSUFBSUksTUFBTSxjQUFjTjtJQUV4QixPQUFPLElBQUlPLFFBQVEsQ0FBQ0MsU0FBU0M7UUFDM0IsTUFBTUMsUUFBUUMsS0FBS1gsU0FBU0M7UUFFNUIsTUFBTVcsU0FBbUI7UUFDekIsTUFBTUMsU0FBbUI7UUFFekJILE1BQU1FLFFBQVFFLEdBQUcsUUFBU0M7WUFDeEJILE9BQU9JLEtBQUtEO1lBQ1piLElBQUlDLE9BQU9ZLEtBQUtFOztRQUdsQlAsTUFBTUcsUUFBUUMsR0FBRyxRQUFTQztZQUN4QkYsT0FBT0csS0FBS0Q7WUFDWmIsSUFBSUksTUFBTVMsS0FBS0U7O1FBR2pCUCxNQUFNSSxHQUFHLFNBQVVJO1lBQ2pCLElBQUlBLFNBQVMsR0FBRztnQkFDZGhCLElBQUlpQixNQUFNO2dCQUNWWCxRQUFRO29CQUFFSSxRQUFRQSxPQUFPUSxLQUFLO29CQUFPUCxRQUFRQSxPQUFPTyxLQUFLOztBQUMzRCxtQkFBTztnQkFDTGxCLElBQUltQixTQUNGLDRCQUE0QkgsV0FBV0wsT0FBT08sS0FBSztnQkFFckRYLE9BQ0UsSUFBSWEsY0FDRiw0QkFBNEJKLFNBQVNMLE9BQU9PLEtBQUs7QUFHdkQ7O1FBR0ZWLE1BQU1JLEdBQUcsU0FBVVM7WUFD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